Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
1430ac5
feat(site): add brand CTA variants to Button
MaanilVerma Jun 18, 2026
e899797
feat(site): add marketing navbar tokens and icon assets
MaanilVerma Jun 18, 2026
e4be6db
feat(site): add marketing navbar components
MaanilVerma Jun 18, 2026
4dc3e69
feat(site): add navbar i18n strings for all locales
MaanilVerma Jun 18, 2026
75b1d90
feat(site): mount marketing navbar in the hub header
MaanilVerma Jun 18, 2026
dd7e1ed
fix(site): restyle hub search bar to match Figma
MaanilVerma Jun 18, 2026
a1d89f4
fix(site): improve hub search relevance and typo tolerance
MaanilVerma Jun 18, 2026
4da492f
fix(site): use real usage from hub API in search index
MaanilVerma Jun 18, 2026
85b9a82
fix(site): improve header and search bar semantics and a11y
MaanilVerma Jun 18, 2026
b1449ff
refactor(site): add locale-aware tagPath/creatorPath route helpers
MaanilVerma Jun 18, 2026
7cb6c10
refactor(site): extract shared provider-logo and thumbnail-url helpers
MaanilVerma Jun 18, 2026
0121ef6
feat(site): add border-strong semantic color token
MaanilVerma Jun 18, 2026
7ab2834
feat(site): add featured-carousel i18n strings for all locales
MaanilVerma Jun 18, 2026
ea8a9f5
feat(site): add featured-templates selection by usage
MaanilVerma Jun 18, 2026
d807bac
feat(site): add featured-templates hero carousel to hub landing
MaanilVerma Jun 18, 2026
9b7851d
refactor(site): add facet + toolbar state and shared label builders
MaanilVerma Jun 18, 2026
503c952
feat(site): replace sidebar/drawer filters with browse toolbar
MaanilVerma Jun 18, 2026
6e0bad3
feat(site): rework hub hero copy and add browse i18n strings
MaanilVerma Jun 18, 2026
fa30a7d
test(site): add useFacets unit tests and vitest path alias
MaanilVerma Jun 18, 2026
4f6fa09
feat(site): add ItemList count to workflows CollectionPage JSON-LD
MaanilVerma Jun 18, 2026
a64d4f2
feat(site): add warm-white content-bright color token
MaanilVerma Jun 18, 2026
d4eb1ab
feat(site): add related-workflows + FAQ JSON-LD helpers and detail i1…
MaanilVerma Jun 18, 2026
3ecb213
feat(site): redesign hub card with overlaid title and CTA on landscap…
MaanilVerma Jun 18, 2026
8be464e
feat(site): rework workflow detail page with breadcrumbs, expandable …
MaanilVerma Jun 18, 2026
ceae6a4
fix(site): escape JSON-LD before set:html to prevent script-breakout XSS
MaanilVerma Jun 18, 2026
f7a24a5
fix(site): correct nav active-state matching, focus handling, and ref…
MaanilVerma Jun 18, 2026
2436026
fix(site): drop settled inflight cache entries, word-boundary logo ma…
MaanilVerma Jun 18, 2026
1da5a64
style(site): add whitespace before comment close to satisfy stylelint
MaanilVerma Jun 18, 2026
bcfac6d
fix(site): guard JSON-LD serializer against undefined stringify result
MaanilVerma Jun 18, 2026
318d35b
style(site): toolbar bg-inherit, brand font tokens, breadcrumb + expa…
MaanilVerma Jun 23, 2026
3b361dc
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 23, 2026
dea0630
refactor(site): share JSON-LD breadcrumb + social-link helpers, escap…
MaanilVerma Jun 23, 2026
29276b3
refactor(site): reuse ExpandableText for the sidebar description
MaanilVerma Jun 23, 2026
b8a1392
perf(site): precompile provider-logo matchers once at module load
MaanilVerma Jun 23, 2026
d48edd7
fix(site): add timeouts to search-index and hub-API fetches
MaanilVerma Jun 23, 2026
accfef9
test(site): assert title-over-description ranking by relative order
MaanilVerma Jun 23, 2026
d76e3b5
style(site): prune redundant comments and tidy hub component classes
MaanilVerma Jun 23, 2026
76a7c14
fix(site): recover search when the index fetch fails
MaanilVerma Jun 23, 2026
54a3d3f
feat(site): scrollable tag row + fix author name clipping on cards
MaanilVerma Jun 23, 2026
1b8c69b
style(site): widen hub cards by capping the grid at 3 columns
MaanilVerma Jun 23, 2026
c035242
style(site): match Load more button to Figma (brand-outline)
MaanilVerma Jun 23, 2026
651edda
style(site): round hero carousel and card corners to 2.5rem
MaanilVerma Jun 23, 2026
82deb7b
feat(site): expose brand palette as Tailwind utilities + add nav CVA …
MaanilVerma Jun 23, 2026
2e6a179
feat(site): add navigation-menu, sheet and button-pill ui primitives
MaanilVerma Jun 23, 2026
9da0f95
feat(site): add main-navigation data + nav i18n keys
MaanilVerma Jun 23, 2026
1a911ed
feat(site): replace hub navbar with the shadcn-vue mega-menu + mobile…
MaanilVerma Jun 23, 2026
8a738e6
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 23, 2026
e2682e1
fix(site): address review feedback on nav a11y, social labels, and br…
MaanilVerma Jun 23, 2026
2e33bc2
Merge branch 'feat/comfyhub-redesign' of https://github.com/MaanilVer…
MaanilVerma Jun 23, 2026
a888bbf
fix(site): hydrate detail-page description and FAQ islands on load
MaanilVerma Jun 23, 2026
90d6076
fix(site): restore ComfyHub wordmark in the navbar logo
MaanilVerma Jun 23, 2026
37f0634
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 23, 2026
a70696d
fix(site): keep literal-abbreviation search matches via raw-query fal…
MaanilVerma Jun 24, 2026
daea94a
fix(site): degrade gracefully on invalid GitHub stars override instea…
MaanilVerma Jun 24, 2026
3cef537
fix(site): restore Models breadcrumb crumb on model pages
MaanilVerma Jun 24, 2026
5e9f41e
refactor(site): drop inert nav active-state machinery for off-site ro…
MaanilVerma Jun 24, 2026
87b9e1d
fix(site): give icon-only mobile toolbar tabs an accessible name
MaanilVerma Jun 24, 2026
4150bba
fix(site): index workflow name and augment search synonyms symmetrically
MaanilVerma Jun 24, 2026
a9941ab
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 24, 2026
39a60ee
Merge branch 'feat/comfyhub-redesign' of https://github.com/MaanilVer…
MaanilVerma Jun 24, 2026
08f5617
fix(site): rank literal matches first, resolve shorthand and version …
MaanilVerma Jun 24, 2026
38651a4
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 24, 2026
13fba4f
refactor(site): align design tokens with comfy.org website for hub mi…
MaanilVerma Jun 24, 2026
a5cc762
fix(site): restore field boost in search options, clean version token…
MaanilVerma Jun 24, 2026
2fcc956
fix(site): make hub carousel and tag scroller RTL- and reduced-motion…
MaanilVerma Jun 24, 2026
c679873
fix(site): remove white focus background on navbar items
MaanilVerma Jun 25, 2026
5612181
fix(site): show whole card tags with +N overflow instead of clipped p…
MaanilVerma Jun 25, 2026
dba3b94
feat(site): card hover try-now reveal, author alignment, stacked mode…
MaanilVerma Jun 25, 2026
6340cdc
fix(site): make featured card fully clickable and tags title-case
MaanilVerma Jun 25, 2026
40e53bd
feat(site): move hub search into a sticky in-body bar above the filters
MaanilVerma Jun 25, 2026
2f9874f
fix(site): align search dropdown badge labels and dedupe CreatorEntry…
MaanilVerma Jun 25, 2026
bad0d7e
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 25, 2026
3b6cd78
fix(site): make +N tag chip keyboard-accessible, drop forced clipped …
MaanilVerma Jun 25, 2026
0d6ec85
Merge branch 'feat/comfyhub-redesign' of https://github.com/MaanilVer…
MaanilVerma Jun 25, 2026
521d4f9
refactor(site): inline dead button-pill reveal variant, use waitForUR…
MaanilVerma Jun 25, 2026
8ddb65d
fix(site): rebuild ComfyHub wordmark with canonical Comfy letterforms
MaanilVerma Jun 25, 2026
727d5c6
fix(site): let navbar wordmark size to its natural width so it isn't …
MaanilVerma Jun 25, 2026
59b989b
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 25, 2026
a979429
fix(site): sticky detail sidebar with description below media, design…
MaanilVerma Jun 26, 2026
ea0818b
fix(site): neutral-at-rest hover-yellow carousel arrows and card pill…
MaanilVerma Jun 26, 2026
eadbdf0
fix(site): capitalize "Node Graphs" hub tab label
MaanilVerma Jun 26, 2026
e5400da
fix(site): add bottom padding under hub search bar to match top spacing
MaanilVerma Jun 26, 2026
ea34111
fix(site): optically center "Load more" label with ppformula nudge
MaanilVerma Jun 26, 2026
d69ef54
fix:remove horizontal padding from HubSearchBar
MaanilVerma Jun 26, 2026
be4ed1f
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 26, 2026
840e331
feat(site): dock inline hub search flush beneath the sticky navbar
MaanilVerma Jun 26, 2026
cf7a1a4
Merge branch 'main' into feat/comfyhub-redesign
MaanilVerma Jun 26, 2026
67e7df0
fix(site): let cloud CTA grow to fit the free-tier subline
MaanilVerma Jun 26, 2026
45dbd2b
Merge branch 'feat/comfyhub-redesign' of https://github.com/MaanilVer…
MaanilVerma Jun 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions site/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
"cheerio": "1.0.0-rc.12",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"embla-carousel-autoplay": "^8.6.0",
"embla-carousel-vue": "^8.6.0",
"lucide-vue-next": "^0.575.0",
"minisearch": "^7.2.0",
"openai": "^4.0.0",
Expand Down
40 changes: 40 additions & 0 deletions site/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 7 additions & 5 deletions site/public/brand/comfy-hub-logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions site/public/icons/arrow-right.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions site/public/icons/arrow-up-right.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions site/public/icons/breadthumb.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions site/public/icons/close.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions site/public/icons/logomark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions site/public/icons/node-left.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions site/public/icons/node-right.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions site/public/icons/node-union.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions site/public/icons/social/github.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
60 changes: 21 additions & 39 deletions site/scripts/lib/search/build-index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ import MiniSearch from 'minisearch';
import { CONTENT_DIR, SITE_DIR } from '../paths';
import { logger } from '../logger';
import { tagDisplayName, tagSearchText } from '../../../src/lib/tag-aliases';
import {
SEARCH_FIELDS,
STORE_FIELDS,
tokenize,
searchOptions,
} from '../../../src/lib/search-config';

interface SearchDocument {
id: string;
Expand Down Expand Up @@ -38,6 +44,7 @@ interface IndexEntry {
username?: string;
thumbnailUrl?: string;
shareId?: string;
usage?: number;
}

const MEDIA_TYPE_LABELS: Record<string, string> = {
Expand All @@ -58,7 +65,9 @@ async function fetchIndexEntries(): Promise<IndexEntry[] | null> {

const approvedOnly = process.env.PUBLIC_APPROVED_ONLY === 'true';
const statuses = approvedOnly ? 'approved' : 'pending,approved,rejected,deprecated';
const res = await fetch(`${apiUrl}/api/hub/workflows/index?status=${statuses}`);
const res = await fetch(`${apiUrl}/api/hub/workflows/index?status=${statuses}`, {
signal: AbortSignal.timeout(10000),
});

if (!res.ok) {
throw new Error(`Hub API returned ${res.status}: ${res.statusText}`);
Expand All @@ -74,7 +83,9 @@ async function fetchProfileDisplayName(username: string): Promise<string> {
const apiUrl = (process.env.PUBLIC_HUB_API_URL || '').replace(/\/$/, '');
if (!apiUrl) return username;
try {
const res = await fetch(`${apiUrl}/api/hub/profiles/${encodeURIComponent(username)}`);
const res = await fetch(`${apiUrl}/api/hub/profiles/${encodeURIComponent(username)}`, {
signal: AbortSignal.timeout(10000),
});
if (!res.ok) return username;
const profile = (await res.json()) as { display_name?: string };
return profile.display_name || username;
Expand Down Expand Up @@ -130,7 +141,7 @@ export async function buildSearchIndex(): Promise<void> {
name,
slug,
thumbnail: data.thumbnailUrl || '',
usage: 0,
usage: data.usage || 0,
tagsArray: tags.map(tagDisplayName),
});
}
Expand Down Expand Up @@ -178,44 +189,15 @@ export async function buildSearchIndex(): Promise<void> {

logger.info(`Indexing ${documents.length} templates...`);

// Custom tokenizer: keep hyphenated terms as single tokens AND emit sub-parts.
// e.g. "flux-image-to-video" → ["flux-image-to-video", "flux", "image", "to", "video"]
// This lets "z-image" match as a prefix against "z-image-to-video" style titles.
const tokenize = (text: string): string[] => {
const tokens: string[] = [];
const words = text.toLowerCase().split(/\s+/).filter(Boolean);
for (const word of words) {
tokens.push(word);
if (word.includes('-')) {
for (const part of word.split('-')) {
if (part) tokens.push(part);
}
}
}
return tokens;
};

// Field config + tokenizer come from the SHARED search-config so the index and
// the client query layer never drift. (searchOptions is NOT serialized by
// MiniSearch — the client re-specifies it at query time; we set sensible
// defaults here only for any in-process searches.)
const miniSearch = new MiniSearch<SearchDocument>({
fields: ['title', 'description', 'tags', 'models', 'mediaType', 'creatorName'],
storeFields: [
'title',
'mediaType',
'mediaTypeLabel',
'name',
'slug',
'thumbnail',
'username',
'creatorName',
'usage',
'tagsArray',
],
fields: [...SEARCH_FIELDS],
storeFields: [...STORE_FIELDS],
tokenize,
searchOptions: {
boost: { title: 3, models: 2, tags: 2, creatorName: 1.5, mediaType: 1, description: 0.5 },
prefix: true,
fuzzy: 0.2,
tokenize,
},
searchOptions: searchOptions() as Record<string, unknown>,
});

miniSearch.addAll(documents);
Expand Down
13 changes: 7 additions & 6 deletions site/src/components/ThumbnailDisplay.astro
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ function thumbUrl(thumb: string): string {
return `/workflows/thumbnails/${thumb}`;
}

const imgClass = naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover';
const mediaClass = naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover';
const imgClass = mediaClass;

const primaryThumb = thumbnails[0];
const secondaryThumb = thumbnails[1];
Expand Down Expand Up @@ -116,7 +117,7 @@ const secondaryVideoPosterUrl = isSecondaryVideo ? getVideoFrameUrl(secondarySrc
<video
src={primarySrc}
poster={videoPosterUrl || undefined}
class={naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover'}
class={mediaClass}
autoplay
controls
loop
Expand All @@ -129,7 +130,7 @@ const secondaryVideoPosterUrl = isSecondaryVideo ? getVideoFrameUrl(secondarySrc
<img
src={videoPosterUrl}
alt={title}
class={`${naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover'} hidden`}
class={`${mediaClass} hidden`}
data-video-fallback-img
loading="lazy"
decoding="async"
Expand All @@ -141,7 +142,7 @@ const secondaryVideoPosterUrl = isSecondaryVideo ? getVideoFrameUrl(secondarySrc
<video
src={secondarySrc}
poster={secondaryVideoPosterUrl || undefined}
class={naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover'}
class={mediaClass}
controls
loop
muted
Expand All @@ -153,7 +154,7 @@ const secondaryVideoPosterUrl = isSecondaryVideo ? getVideoFrameUrl(secondarySrc
<img
src={secondaryVideoPosterUrl}
alt={`${title} - secondary`}
class={`${naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover'} hidden`}
class={`${mediaClass} hidden`}
data-video-fallback-img
loading="lazy"
decoding="async"
Expand All @@ -165,7 +166,7 @@ const secondaryVideoPosterUrl = isSecondaryVideo ? getVideoFrameUrl(secondarySrc
<img
src={secondarySrc}
alt={`${title} - secondary`}
class={naturalAspect ? 'w-full h-auto' : 'w-full h-full object-cover'}
class={mediaClass}
loading="lazy"
decoding="async"
data-hide-on-error
Expand Down
Loading
Loading