Repository navigation
feat(dashboard): Keak brand lockup, standalone pages and design-system docs (KEA-7886, trilha E) - #17302
Merged
Conversation
…product switcher links (KEA-7886, trilha E)
… offline pages (KEA-7886, trilha E)
…ndation (KEA-7886, trilha E)
…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.
…dark, no accent presets (KEA-7886, trilha E)
…, 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.
…iterals (KEA-7886, trilha E)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 (theOmniRouteLogorow: inline kit vectors, no/brand/*.svg, so it works underbasePath). 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-uikitnow holds only trilha E's 14 files.)Changes
src/shared/components/OmniRouteLogo.tsx: the default exportOmniRouteLogo({ size, className })keeps its signature and now renders the kitProductIcon product="omniroute" variant="glyph"(inline SVG,aria-hidden). Its importers (Sidebar.tsx, landingNavigation/Footer) are untouched. New named exportOmniRouteLockup({ name, logoSrc, className })rendersProductLockup 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.tsholdsKEAK_PRODUCT_LINKS(https://www.keak.ai,https://cheaperinference.com,https://omniroute.online) andKEAK_ACTIVE_PRODUCT = "omniroute".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.tsxandsrc/app/not-found.tsx.<Icon>withscripts/dev/codemod-material-icons.mjs. The names these pages use are mapped to Lucide insrc/shared/constants/iconMap.ts:build_circle,construction,gpp_bad,hourglass_top,login,rocket_launch,rule,shield_person,swap_horiz,wifi,wifi_off.ci-heading, and the error code usesci-dashboard-display(Instrument Serif). Accent CTAs usebg-primary text-accent-foreground, nevertext-white.docs/architecture/DESIGN_SYSTEM.mdis 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: theModal → Dialogadapters and theUI_KIT_SHELLlegacy 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's2emrule. 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 isomniroute.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 withOMNIROUTE_BASE_PATH=/omni. The output dir comes fromNEXT_DIST_DIR || .build/next. As a positive control, it asserts thatroutes-manifest.jsonhasbasePath === "/omni". It then scansstatic/andserver/for root-absolute/brand/references (double-quoted, single-quoted, template literal orurl() and asserts that Inter, Instrument Serif and IBM Plex Mono are bundled.RUN_BUILD_TESTS_REUSE=1checks an existing output without rebuilding. The scan runs in Node becausegrep -rlexits 1 when nothing matches, which madeexecFileSyncthrow 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.npm run lintnpm run typecheck:corenpm run check:dashboard-typechecknpm run check:cyclesnpm run check:ui-icunpm run check:tracked-artifactsnpm run check:docs-allREADME.mdstill says 3.8.52 whilepackage.jsonis 3.8.53. The same text is on thefeat/new-uikittip; this PR does not touch README.node --import tsx/esm --testkeak-products, brand-pages-static, icon-map-coverage, design-kit-bridge, build-basepath-brandnpx vitest run tests/unit/ui/adapters/brand.test.tsxnpm run test:vitest:uiapi-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.tests/e2e/error-pages.spec.ts,smoke.spec.tsplaywright.config.tsdefaults tostartmode, which runs a production buildRUN_BUILD_TESTS=1, local devbox, under the gate lock, headbb6ac06b)RUN_BUILD_TESTS_REUSE=1) passes:routes-manifestbasePath=/omni, no"/brand//url(/brand/reference instatic/orserver/, and the three font families are bundled. Prerendered HTML had not been flushed yet, soserver/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-outlinedelements).Notes
Review fix round 1 (
b3716ae7,bb6ac06b).OmniRouteLogonow also passessizeas inline style. The kit rule.ci-keak-product-icon { width: 2em }outranks the SVG attributes, so before this fixsize={22}rendered at 28 px. The decorative lime icons on light surfaces now usetext-text-muted. An empty white-label name falls back to the accessible name "OmniRoute". The basePath test now assertsroutes-manifest.jsonbasePath === "/omni", scansserver/as well asstatic/for quoted andurl(...)/brand/references, and honoursNEXT_DIST_DIR.brand-pages-staticpins exactly one<OmniRouteLockupper page. Focused checks for this round ran locally: vitestbrand.test.tsx4/4, node 18 pass / 1 skip, eslint 0,typecheck:core0.Kit barrel import.
OmniRouteLogowas the only module insrc/importing@omniroute/ui-kitat 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 outsidebar-pinned-items,sidebar-accordion-header-clickandradar-admin-sidebar.Login
require-login404 underbasePath.GET /omni/api/settings/require-loginreturns 404 on the login page underbasePath. This bug predates this branch (the spike traced it tosrc/app/login/page.tsxbuilding the URL fromwindow.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 examplefocus:outline-primary) is left for the token sweep.