diff --git a/.github/workflows/landing-page-ci.yml b/.github/workflows/landing-page-ci.yml index 17910f7c3..20bd128b0 100644 --- a/.github/workflows/landing-page-ci.yml +++ b/.github/workflows/landing-page-ci.yml @@ -20,10 +20,22 @@ on: - design-systems/** - craft/** - templates/** + # Plugin manifests power the bundled-plugin catalog and the new + # `_lib/bundled-plugins.ts` reader; CI must rerun when their + # `title_i18n` / `description_i18n` maps or other fields change. + - plugins/** # Workspace plumbing - package.json - pnpm-lock.yaml - pnpm-workspace.yaml + # Merge queue trigger so PRs that touch the same paths can clear + # `Validate landing page` / `Strict PR visual tests` while queued. + # Without this branch ruleset blocks merges (the queue waits forever + # for a check name that never gets dispatched against the merge_group + # ref), which is the exact deadlock observed during the 5/26 release + # window. + merge_group: + types: [checks_requested] push: branches: - main diff --git a/apps/landing-page/app/_components/header.tsx b/apps/landing-page/app/_components/header.tsx index ba7bf2150..f2fa3e5f6 100644 --- a/apps/landing-page/app/_components/header.tsx +++ b/apps/landing-page/app/_components/header.tsx @@ -173,13 +173,11 @@ export function Header({ {/* - Library — catalog facets (Skills / Systems / Templates / Craft) + Plugins — catalog facets (Templates / Skills / Systems / Craft) collapsed under one parent. Each row keeps its count badge inside the panel and the trigger highlights when any of the four facet pages is active. Same CSS-only :hover / - :focus-within mechanic from Product. Hardcoded "Library" / - "Learn" labels until per-locale translations land — the - brand-name pattern. + :focus-within mechanic from Product. */}
  • diff --git a/apps/landing-page/app/_components/plugin-row.astro b/apps/landing-page/app/_components/plugin-row.astro index e1dac00ed..48e9ea06c 100644 --- a/apps/landing-page/app/_components/plugin-row.astro +++ b/apps/landing-page/app/_components/plugin-row.astro @@ -9,8 +9,13 @@ * forcing every callsite to write the same five-column markup twice. */ import type { SkillRecord, TemplateRecord } from '../_lib/catalog'; -import type { BundledPluginRecord } from '../_lib/bundled-plugins'; +import { + resolveBundledDescription, + resolveBundledTitle, + type BundledPluginRecord, +} from '../_lib/bundled-plugins'; import { localeFromPath, localizedHref } from '../i18n'; +import { localizeTaxonomyValue } from '../content-i18n'; interface SkillItem { kind: 'skill'; @@ -73,11 +78,18 @@ if (item.kind === 'skill') { // the row gets the diagonal-stripe placeholder and styling stays // consistent with the rest of the catalog. detailHref = item.record.detailHref; - name = item.record.title; - description = item.record.description; + name = resolveBundledTitle(item.record, locale); + description = resolveBundledDescription(item.record, locale); previewUrl = item.record.previewPoster ?? null; - modeLabel = item.record.mode; - scenarioLabel = item.record.scenario; + // Bundled-plugin records ship raw taxonomy slugs (e.g. `video`, `image`). + // Run them through the shared TAXONOMY_TERMS map so the chip rail localizes + // alongside skill/template rows instead of leaking English on every locale. + // No raw-slug fallback here: when localizeTaxonomyValue returns undefined + // (slug isn't in any translation map), we'd rather drop the chip entirely + // than surface a kebab slug like `code-migration` or `plugin-sharing` that + // reads like a debug artifact next to the localized name. + modeLabel = localizeTaxonomyValue(item.record.mode, locale); + scenarioLabel = localizeTaxonomyValue(item.record.scenario, locale); } --- diff --git a/apps/landing-page/app/_components/site-footer.astro b/apps/landing-page/app/_components/site-footer.astro index 914141b03..27ce04266 100644 --- a/apps/landing-page/app/_components/site-footer.astro +++ b/apps/landing-page/app/_components/site-footer.astro @@ -37,12 +37,12 @@ const DISCORD = 'https://discord.gg/9ptkbbqRu';