Skip to content

feat(dashboard): Keak brand lockup, standalone pages and design-system docs (KEA-7886, trilha E) - #17302

Merged
diegosouzapw merged 12 commits into
feat/new-uikitfrom
feat/new-uikit-E
Oct 20, 2026
Merged

diegosouzapw merged 12 commits into
feat/new-uikitfrom
feat/new-uikit-E

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Trilha E of the OmniRoute → Keak CI UI Kit migration (Linear KEA-7886): the Keak brand lockup on the dashboard's standalone pages, the brand wrappers over the kit, the product-switcher links, and a rewritten DESIGN_SYSTEM.md.

Spec followed: _tasks/superpowers/specs/2026-10-19-uikit-migration-design.md §3.8 "Marca" and decision D2 (Keak identity on the standalone screens), plus §3.6 (the OmniRouteLogo row: inline kit vectors, no /brand/*.svg, so it works under basePath). Plan: _tasks/superpowers/plans/2026-10-19-uikit-migration.md, Tasks 23–25.

merge only after PR A (trilha A) — this branch contains A's commits. (Update: PR A landed as #17279 and has been back-merged here, so the diff against feat/new-uikit now holds only trilha E's 14 files.)

⚠️ base-red inherited: #17219

Changes

  • Brand wrappers (Task 23). src/shared/components/OmniRouteLogo.tsx: the default export OmniRouteLogo({ size, className }) keeps its signature and now renders the kit ProductIcon product="omniroute" variant="glyph" (inline SVG, aria-hidden). Its importers (Sidebar.tsx, landing Navigation/Footer) are untouched. New named export OmniRouteLockup({ name, logoSrc, className }) renders ProductLockup product="omniroute" (accessible name "Keak OmniRoute"). When an operator has set a white-label name or logo (customAppName/customLogo), it renders their name and logo instead. The wrappers import @omniroute/ui-kit/keak-brand, not the package barrel (see Notes). src/shared/constants/keakProducts.ts holds KEAK_PRODUCT_LINKS (https://www.keak.ai, https://cheaperinference.com, https://omniroute.online) and KEAK_ACTIVE_PRODUCT = "omniroute".
  • Standalone pages (Task 24). These pages now show the lockup: src/app/login/page.tsx, src/shared/components/ErrorPageScaffold.tsx (the 400/401/403/408/429/500/502/503 pages), src/app/status/page.tsx, src/app/maintenance/page.tsx, src/app/offline/page.tsx and src/app/not-found.tsx.
    • Material spans were converted to <Icon> with scripts/dev/codemod-material-icons.mjs. The names these pages use are mapped to Lucide in src/shared/constants/iconMap.ts: build_circle, construction, gpp_bad, hourglass_top, login, rocket_launch, rule, shield_person, swap_horiz, wifi, wifi_off.
    • The coral gradient is gone. Headings use ci-heading, and the error code uses ci-dashboard-display (Instrument Serif). Accent CTAs use bg-primary text-accent-foreground, never text-white.
  • Docs (Task 25). docs/architecture/DESIGN_SYSTEM.md is rewritten for the kit. Every path, script and symbol it names was checked against the tree. Two claims from the brief were left out because they are not true in this tree: the Modal → Dialog adapters and the UI_KIT_SHELL legacy layouts.

Tests

Added:

  • tests/unit/ui/adapters/brand.test.tsx (vitest). Checks that the glyph keeps the size/className API, including the inline width/height style that beats the kit's 2em rule. It also checks that the glyph does not reference /brand/ assets, that the lockup has a single accessible name, that white-label is honoured, and that an empty white-label name falls back to the accessible name "OmniRoute".
  • tests/unit/keak-products.test.ts. Checks that the three products are present, that every link is https, and that the active product is omniroute.
  • tests/unit/brand-pages-static.test.ts. Checks that each of the six standalone sources renders exactly one <OmniRouteLockup (an unused import fails) and contains no Material span and no coral gradient. A second case checks that the logo wrappers import the kit brand module, not the barrel.
  • tests/unit/build-basepath-brand.test.ts (opt-in, RUN_BUILD_TESTS=1). It builds with OMNIROUTE_BASE_PATH=/omni. The output dir comes from NEXT_DIST_DIR || .build/next. As a positive control, it asserts that routes-manifest.json has basePath === "/omni". It then scans static/ and server/ for root-absolute /brand/ references (double-quoted, single-quoted, template literal or url() and asserts that Inter, Instrument Serif and IBM Plex Mono are bundled. RUN_BUILD_TESTS_REUSE=1 checks an existing output without rebuilding. The scan runs in Node because grep -rl exits 1 when nothing matches, which made execFileSync throw on exactly the passing case. The build timeout is 40 min.

Realigned: none. These pinned tests were run unchanged and pass: tests/unit/auth-redirect-login.test.ts, tests/unit/login-11143.test.ts, tests/unit/i18n-route-namespaces.test.ts, tests/unit/classify-pr-changes.test.ts.

Validation

All on the merged tree (a35c328a + docs/404 commits). Every check in this table ran locally on the devbox, except the basePath build row, whose host is stated in that row.

Command Result
npm run lint exit 0
npm run typecheck:core exit 0
npm run check:dashboard-typecheck OK, 196 pre-existing errors, all within the frozen baseline
npm run check:cycles cycles=14 (advisory; matches the baseline)
npm run check:ui-icu PASS, 67 catalogs
npm run check:tracked-artifacts OK
npm run check:docs-all 1 STRICT drift, inherited: README.md still says 3.8.52 while package.json is 3.8.53. The same text is on the feat/new-uikit tip; this PR does not touch README.
node --import tsx/esm --test keak-products, brand-pages-static, icon-map-coverage, design-kit-bridge, build-basepath-brand 21 pass, 1 skipped (the basePath build: "set RUN_BUILD_TESTS=1")
npx vitest run tests/unit/ui/adapters/brand.test.tsx 4/4 pass
pinned login/scaffold tests (node runner) 58/58 pass
npm run test:vitest:ui 452/499 files passed under heavy machine load (other tracks' builds and suites were running). The 47 failing files were re-run in isolation: 40 passed and 7 still time out (api-key-redis-auth-cache, modelsCombosCatalog, api-key-access-editor, api-key-routing-editor, compressionPanel, rtk-context-page-load-failure, settings-cache-i18n). All 7 are timeouts, none imports a trilha E file, and 6 of them also fail on trilha A's tree.
E2E tests/e2e/error-pages.spec.ts, smoke.spec.ts skipped: playwright.config.ts defaults to start mode, which runs a production build
basePath production build (RUN_BUILD_TESTS=1, local devbox, under the gate lock, head bb6ac06b) Compiled successfully in 41.2 min, with 232 Turbopack warnings (= base). The test's 40-min timeout then stopped it during static generation (318/637). The scan of the written output (RUN_BUILD_TESTS_REUSE=1) passes: routes-manifest basePath=/omni, no "/brand/ / url(/brand/ reference in static/ or server/, and the three font families are bundled. Prerendered HTML had not been flushed yet, so server/ was scanned as compiled chunks only.

Screenshots (local, not uploaded): _artifacts/E-{login,status,404,503,maintenance,offline}-{light,dark}-{1440,390}.png. Every page shows the Keak OmniRoute lockup, Inter for UI text, Instrument Serif for the error codes, lime accent CTAs with dark ink, and no visible Material ligature text (0 .material-symbols-outlined elements).

Notes

  • Review fix round 1 (b3716ae7, bb6ac06b). OmniRouteLogo now also passes size as inline style. The kit rule .ci-keak-product-icon { width: 2em } outranks the SVG attributes, so before this fix size={22} rendered at 28 px. The decorative lime icons on light surfaces now use text-text-muted. An empty white-label name falls back to the accessible name "OmniRoute". The basePath test now asserts routes-manifest.json basePath === "/omni", scans server/ as well as static/ for quoted and url(...) /brand/ references, and honours NEXT_DIST_DIR. brand-pages-static pins exactly one <OmniRouteLockup per page. Focused checks for this round ran locally: vitest brand.test.tsx 4/4, node 18 pass / 1 skip, eslint 0, typecheck:core 0.

  • Kit barrel import. OmniRouteLogo was the only module in src/ importing @omniroute/ui-kit at runtime, so every logo importer evaluated the whole 73-file kit barrel. At the same machine load, the first Sidebar render in vitest took ~43 s with the barrel import and ~3.5 s with @omniroute/ui-kit/keak-brand; that slowdown was timing out sidebar-pinned-items, sidebar-accordion-header-click and radar-admin-sidebar.

  • Login require-login 404 under basePath. GET /omni/api/settings/require-login returns 404 on the login page under basePath. This bug predates this branch (the spike traced it to src/app/login/page.tsx building the URL from window.location.origin), is not caused by the kit, and is not fixed here.

  • Lime on light surfaces. On the pages this PR owns, the decorative icons that were lime on light surfaces (login feature tiles and first-run tile, scaffold and maintenance bullets) now use text-text-muted. The same lime-foreground case elsewhere in the app (for example focus:outline-primary) is left for the token sweep.

…t grep (KEA-7886, trilha E)

grep -rl exits 1 when nothing matches, so execFileSync threw on exactly the
passing case. Scan the static output in Node and widen the build timeout to
40 min (the full standalone build does not fit in 15 min on the devbox).
… CI job (KEA-7886, trilha E)

No workflow under .github/ runs it; only .husky/pre-commit does.
…arrel (KEA-7886, trilha E)

OmniRouteLogo was the only src/ module importing @omniroute/ui-kit at runtime,
so every importer (Sidebar, landing, login, error pages) evaluated the whole
kit barrel. In vitest that pushed the first Sidebar render from ~3.5 s to
~43 s at the same machine load and timed out the sidebar suites. Import
@omniroute/ui-kit/keak-brand (resolved by the existing tsconfig/vitest
@omniroute/ui-kit/* mapping) and guard it in brand-pages-static.
…, trilha E)

src/app/not-found.tsx is a standalone page outside ErrorPageScaffold, so it
kept the old gradient code and white text on the now-lime accent (low
contrast, screenshot E-404-light-390). Same treatment as the scaffold:
lockup, Instrument Serif display code, ci-heading, bg-primary with
text-accent-foreground. brand-pages-static now covers it.
…muted decorative icons (KEA-7886, trilha E)

The kit rule .ci-keak-product-icon { width: 2em; height: 2em } outranks SVG
presentation attributes, so size={22} rendered at 28x28 and the Footer's 16
overflowed its 24 px tile. Pass the size as inline style too (attributes kept).
An empty white-label name now falls back to "OmniRoute" as accessible name.

Decorative lime icons on light surfaces (login feature tiles, scaffold and
maintenance bullets) were about 1.15:1; they use text-text-muted now.
keakProducts type-imports the brand subpath; DESIGN_SYSTEM.md notes the
snapshot gate skips without the upstream clone.
… output; brand pages pinned to one lockup (KEA-7886, trilha E)

The basePath test could pass vacuously: it now asserts routes-manifest.json
basePath === "/omni", scans server/ as well as static/, matches quoted and
url(...) /brand/ references, and resolves NEXT_DIST_DIR like the build does.
RUN_BUILD_TESTS_REUSE=1 checks an existing output without rebuilding.
brand-pages-static requires exactly one <OmniRouteLockup per page, so an
unused import fails.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant