mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-03 22:59:14 +00:00
216 lines
6.8 KiB
HTML
216 lines
6.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>ComfyUI Frontend - Development Tools</title>
|
|
<style>
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
|
|
min-height: 100vh;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 2rem;
|
|
/* bg: gray + white lines net */
|
|
background: #909090;
|
|
background-image: radial-gradient(circle, rgba(255, 255, 255, 0.05) 2px, transparent 2px), radial-gradient(circle, rgba(255, 255, 255, 0.05) 2px, transparent 2px);
|
|
background-position: 0 0, 25px 25px;
|
|
background-size: 50px 50px;
|
|
}
|
|
.container {
|
|
max-width: 1200px;
|
|
width: 100%;
|
|
}
|
|
.header {
|
|
text-align: center;
|
|
color: white;
|
|
margin-bottom: 3rem;
|
|
}
|
|
.header h1 {
|
|
font-size: 2.5rem;
|
|
margin-bottom: 0.5rem;
|
|
font-weight: 700;
|
|
}
|
|
.header p {
|
|
font-size: 1.125rem;
|
|
opacity: 0.9;
|
|
}
|
|
.grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
gap: 1.5rem;
|
|
}
|
|
p,h1,h2,h3,h4,h5,h6 {
|
|
transform: matrix(1, 0, -0.25, 1, 0, 0);
|
|
}
|
|
.card {
|
|
background: white;
|
|
border-radius: 12px;
|
|
padding: 2rem;
|
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
|
|
transition: transform 0.2s, box-shadow 0.2s;
|
|
text-decoration: none;
|
|
color: inherit;
|
|
display: block;
|
|
}
|
|
.card:hover {
|
|
transform: translateY(-4px);
|
|
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15);
|
|
}
|
|
.card-icon {
|
|
font-size: 2.5rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
.card-title {
|
|
font-size: 1.5rem;
|
|
font-weight: 600;
|
|
margin-bottom: 0.5rem;
|
|
color: #1a202c;
|
|
}
|
|
.card-description {
|
|
color: #718096;
|
|
line-height: 1.6;
|
|
}
|
|
.card-status {
|
|
display: inline-block;
|
|
margin-top: 1rem;
|
|
padding: 0.25rem 0.75rem;
|
|
border-radius: 20px;
|
|
font-size: 0.875rem;
|
|
font-weight: 500;
|
|
}
|
|
.status-available {
|
|
background: #c6f6d5;
|
|
color: #22543d;
|
|
}
|
|
.status-loading {
|
|
background: #e9d8fd;
|
|
color: #44337a;
|
|
}
|
|
.status-unavailable {
|
|
background: #fed7d7;
|
|
color: #742a2a;
|
|
}
|
|
.footer {
|
|
text-align: center;
|
|
color: white;
|
|
margin-top: 3rem;
|
|
opacity: 0.8;
|
|
}
|
|
.footer a {
|
|
color: white;
|
|
text-decoration: underline;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="header">
|
|
<h1>🎨 ComfyUI Frontend</h1>
|
|
<p>Development Tools & Documentation</p>
|
|
</div>
|
|
|
|
<div class="grid">
|
|
<a href="./storybook/index.html" class="card" data-status="storybook" data-fetch="./storybook/index.html">
|
|
<div class="card-icon">📚</div>
|
|
<h2 class="card-title">Storybook</h2>
|
|
<p class="card-description">Interactive component library and design system documentation</p>
|
|
<span class="card-status status-loading" data-status-indicator>Checking…</span>
|
|
</a>
|
|
|
|
<a href="./nx-graph/index.html" class="card" data-status="nx-graph" data-fetch="./nx-graph/index.html">
|
|
<div class="card-icon">🔗</div>
|
|
<h2 class="card-title">Nx Dependency Graph</h2>
|
|
<p class="card-description">Visual representation of project dependencies and build structure</p>
|
|
<span class="card-status status-loading" data-status-indicator>Checking…</span>
|
|
</a>
|
|
|
|
<a href="./coverage/index.html" class="card" data-status="coverage" data-fetch="./coverage/index.html">
|
|
<div class="card-icon">📊</div>
|
|
<h2 class="card-title">Test Coverage</h2>
|
|
<p class="card-description">Code coverage reports from Vitest unit tests</p>
|
|
<span class="card-status status-loading" data-status-indicator>Checking…</span>
|
|
</a>
|
|
|
|
<a href="./playwright-reports/index.html" class="card" data-status="playwright" data-fetch="./playwright-reports/index.html">
|
|
<div class="card-icon">🎭</div>
|
|
<h2 class="card-title">Playwright E2E</h2>
|
|
<p class="card-description">Browser end-to-end test reports generated by Playwright</p>
|
|
<span class="card-status status-loading" data-status-indicator>Checking…</span>
|
|
</a>
|
|
|
|
<a href="./vitest-ui/index.html" class="card" data-status="vitest-ui" data-fetch="./vitest-ui/index.html">
|
|
<div class="card-icon">🧪</div>
|
|
<h2 class="card-title">Vitest Results</h2>
|
|
<p class="card-description">Interactive test results and reports</p>
|
|
<span class="card-status status-loading" data-status-indicator>Checking…</span>
|
|
</a>
|
|
|
|
<a href="./knip/index.html" class="card" data-status="knip" data-fetch="./knip/report.md">
|
|
<div class="card-icon">🔍</div>
|
|
<h2 class="card-title">Knip Report</h2>
|
|
<p class="card-description">Unused code and dependency analysis</p>
|
|
<span class="card-status status-loading" data-status-indicator>Checking…</span>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="footer">
|
|
<p>
|
|
Built from the <strong>main</strong> branch •
|
|
<a href="https://github.com/Comfy-Org/ComfyUI_frontend" target="_blank">GitHub Repository</a> •
|
|
<a href="https://docs.comfy.org" target="_blank">Official Documentation</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
const cards = Array.from(document.querySelectorAll('.card[data-status]'))
|
|
|
|
const setStatus = (card, variant, text) => {
|
|
const indicator = card.querySelector('[data-status-indicator]')
|
|
if (!indicator) return
|
|
indicator.classList.remove('status-loading', 'status-available', 'status-unavailable')
|
|
indicator.classList.add(`status-${variant}`)
|
|
indicator.textContent = text
|
|
}
|
|
|
|
const absoluteUrl = (href) => new URL(href, window.location.href).toString()
|
|
|
|
const controller = new AbortController()
|
|
const timeout = setTimeout(() => controller.abort(), 10000)
|
|
|
|
cards.forEach((card) => {
|
|
const href = card.dataset.fetch || card.getAttribute('href')
|
|
if (!href) {
|
|
setStatus(card, 'unavailable', 'No link configured')
|
|
return
|
|
}
|
|
|
|
fetch(absoluteUrl(href), { cache: 'no-store', signal: controller.signal })
|
|
.then((response) => {
|
|
if (response.ok) {
|
|
setStatus(card, 'available', 'Available')
|
|
} else {
|
|
setStatus(card, 'unavailable', `Unavailable (${response.status})`)
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
const reason = error.name === 'AbortError' ? 'Timed out' : 'Unavailable'
|
|
setStatus(card, 'unavailable', reason)
|
|
})
|
|
})
|
|
|
|
window.addEventListener('beforeunload', () => {
|
|
clearTimeout(timeout)
|
|
controller.abort()
|
|
})
|
|
</script>
|
|
</body>
|
|
</html>
|