Skip to content

refactor(dashboard): lote 8 — cache, media-providers, webhooks, log-export, conversations, discovery, runtime, profile, relay, chaos, orchestration, conductor, search-tools on the CI UI Kit (KEA-7886) - #17863

Merged
diegosouzapw merged 21 commits into
feat/new-uikitfrom
feat/new-uikit-lote8
Oct 22, 2026

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

⚠️ base-red inherited: #17219

Lote 8 — cache, media-providers, webhooks, log-export, conversations, discovery, runtime, profile, relay, chaos, orchestration, conductor, search-tools on the CI UI Kit (KEA-7886, Task 38)

One commit per screen, plus 4 fix(dashboard) commits:

  • the kit Alert dismiss label is translated and clears its message;
  • the media.serviceKindsAria key was missing;
  • the Compare picker imports the kit Checkbox so its card prop is typed;
  • fix round 1: the integration card check glyph ink, the media endpoint wrap, and the webhook toggle's accessible name;
  • after the smoke: profile badge icons mapped to Lucide (all_inclusive, military_tech, swords, water, widgets, which were still rendering Material), the Faro chat row wraps at 390, and each Lucide name in iconMap.ts is imported once.

Merges feat/new-uikit up to 74636c4 (lote 3, lote 7, lote 5a and the wave-1 checkpoint). Both iconMap.ts conflicts were resolved as the union, with each Lucide name imported once; where both sides mapped a name, the base's choice was kept.

Adapters, globals.css, layout.tsx and packages/ui-kit/** are untouched. The only files that change are:

  • the 13 lote directories;
  • src/shared/constants/iconMap.ts (20 names mapped to Lucide);
  • en.json, pt-BR.json and vi.json (13 new keys each; vi is included because its parity test pins every en key);
  • 9 realigned tests.
Screen Spec Main changes Tests realigned Screenshots (_artifacts/)
/dashboard/cache dashboard-cache.md SegmentedControl view switch; 4 tables → kit Table; entries → DataTableShell; Badge, Progress, Skeleton cache/__tests__/CachePage.test.tsx lote8-cache-{light,dark,390}.png
/dashboard/cache/media dashboard-cache-media.md SegmentedControl, Select, Input, Field+Textarea, Alert, Card; endpoint code wraps (break-all) — lote8-cache-media-{light,dark,390}.png
/dashboard/media-providers dashboard-media-providers.md Select/Input/Textarea/kit Slider in 9 example cards; ServiceKindTabs → SegmentedControl — redirects to /embedding (captured as the [kind] row)
/dashboard/media-providers/[kind] dashboard-media-providers-kind.md PageHeader compact (badges in eyebrow), EmptyState, Badge — lote8-media-providers-kind-{light,dark,390}.png
/dashboard/media-providers/[kind]/[id] dashboard-media-providers-kind-id.md SectionHeader, EmptyState — lote8-media-providers-kind-id-{light,dark,390}.png
/dashboard/webhooks dashboard-webhooks.md PageHeader; labelled icon Buttons (toggle: stable name "Enabled" + aria-pressed); deliveries → kit Table; wizard Input/CheckboxGroup/Toggle; Alert — lote8-webhooks-{light,dark,390}.png
/dashboard/log-export dashboard-log-export.md Field+Textarea, Select, PageHeader, Alert — lote8-log-export-{light,dark,390}.png
/dashboard/conversations dashboard-conversations.md own dialog → Modal; list → kit Table; Badge — lote8-conversations-{light,dark,390}.png
/dashboard/discovery dashboard-discovery.md results → kit Table + Badge; PageHeader; Alert discovery/__tests__/DiscoveryPageClient.test.tsx lote8-discovery-{light,dark,390}.png
/dashboard/runtime dashboard-runtime.md hex/rgba → status/chart tokens; Select, Button, kit Table, SectionHeader — lote8-runtime-{light,dark,390}.png
/dashboard/profile dashboard-profile.md badge dialog → Modal; tier/rarity → tokens profile-badge-dialog, profile-hidden-badge-confidentiality lote8-profile-{light,dark,390}.png
/dashboard/relay dashboard-relay.md PageHeader, Input, Button, EmptyState — lote8-relay-{light,dark,390}.png
/dashboard/chaos dashboard-chaos.md Toggle, Input, Textarea, kit RadioGroup, Button — lote8-chaos-{light,dark,390}.png
/dashboard/orchestration dashboard-orchestration.md kit Tabs; history → kit Table; drawer → kit Sheet; Checkbox orchestrationDrawer, orchestrationDrawerRepeat, orchestrationHistoryTab lote8-orchestration-{light,dark,390}.png, lote8-orchestration-history-{light,dark,390}.png
/dashboard/conductor dashboard-conductor.md PageHeader; Input/Button/Checkbox — lote8-conductor-{light,dark,390}.png
/dashboard/search-tools dashboard-search-tools.md kit Tabs (ids/testids kept); aria-pressed toggles; raw overlay → Modal; Compare → kit CheckboxGroup search-tools-scrape-result, search-tools-compare-tab lote8-search-tools-{light,dark,390}.png

The realigned tests keep the same assertion on the new DOM: portal queries, the kit tablist role, a ResizeObserver stub for kit Table, Lucide data-icon, aria-pressed/checked, and a 1 ms tick for Radix's focus restore. Nothing is skipped and no assertion is dropped.

P6 greps (lote directories, non-test .tsx)

material-symbols-outlined: 99 -> 0
raw <table|button|input|select|textarea>: 188 -> 10, each commented
  (HistoryTab heatmap cell, OverviewTab count tile, IntegrationCard, Runtime KPI tile, SttExampleCard
   hidden file input, SearchToolsConfigPane/SearchForm disclosure headers, SearchConceptCard header,
   SearchHistory entry, profile badge tile)
dark: variants: 0
hardcoded Tailwind palette (*-red|green|blue|amber...-NNN, black/, white/): 0
"use client" not first statement: 0

Validation

Check Host / head Result
npm run lint -- --concurrency=6 .113 / 1fc16e7 rc 0
npm run check:dashboard-typecheck .113 / 1fc16e7 (also local) rc 0 (194 pre-existing errors, all within the baseline)
npm run typecheck:core .113 / 1fc16e7 (also local / aed3a30) rc 0
npm run build .113 / 1fc16e7 rc 0
e2e tests/e2e/search-tools-studio.spec.ts (spec §6) .113 / 1fc16e7, production build 4 passed
icon-map-coverage + i18n-vi-completeness local / 1fc16e7 8/8
section vitest (31 files) local / aa1657a 295/295 (baseline 295/295)
section node tests (30 files) local / aa1657a 291 pass, 4 skipped, 0 fail (baseline identical)
webhooks + cache + orchestration drawer vitest local / aed3a30 70/70
check:ui-icu .113 / 70729b6 PASS (67 catalogs)
visual smoke + axe, 17 captures × light/dark/390 (route asserted per capture) .113 / 1fc16e7, production build 16/16 reachable routes captured (/dashboard/media-providers is a server redirect to /embedding); 0 page overflow, 0 code overflow, 0 Material, 0 error boundaries except as noted below
re-smoke profile + conductor after 3ff76ed .113 / 3ff76ed, production build profile Material 5 → 0; conductor 390 row wraps (see note)
check:dashboard-typecheck + typecheck:core local / 3ff76ed rc 0 / rc 0

tests/e2e/a11y.spec.ts does not cover any lote-8 route (it only checks providers and settings), so the smoke runs axe (wcag2a/2aa/21a/21aa) on every lote route instead.

Smoke findings:

  • axe: 0 violations on 15 of 16 routes. /dashboard/profile has color-contrast (serious) on 36 nodes. These are the locked badge tiles, which use opacity-50 grayscale; that styling is identical in the base (profile/page.tsx) and is a design decision about how locked badges look. It is listed under pendência 11, not changed here.
  • Raw buttons found by the probe: runtime 4 (KPI filter tiles), search-tools 3 (disclosure headers), profile 23 (badge tiles). All of them are among the commented native elements.
  • Conductor at 390: the element probe still flags the Faro input field, but the document has 0 horizontal overflow and the capture shows the row wrapping inside the card. This looks like a probe timing artefact.
  • One React fix(sse): add Claude-to-Claude passthrough for anthropic-compatible providers #418 (hydration text mismatch) was logged in the production build during the 17-route run. The handler does not record which route; it is not attributed to a lote-8 change and is listed as pendência 12.

Declared deviations

  • Cache ReasoningCacheTab stays on plain kit Table, not DataTableShell. Its tables have no filter, search or pagination, so the shell would add an empty toolbar.
  • Cache "clear all" (and the reasoning-cache clear) does not use GuardedAction + Dialog (cache spec §4). It was a one-click action before and is now a one-click danger Button (loading state, disabled while busy). Adding a confirmation step changes behaviour, which is outside this restyle, so it is left for a follow-up.
  • RuntimePageClient has 53 var(--color-*) / color-mix(var(--color-*)) values. They are JS inline-style values (chart and status tones) with no utility alternative, which is the pattern accepted in lote 1. They are not --ci-*.

Pendências

  1. The kit Progress has no tone and does not pass aria-label through. The cache hit-rate bar stays hand-rolled on tokens; LinearMeter wraps the kit Progress in aria-hidden and shows the value as text.
  2. The kit Alert with persistent always renders a dismiss button whose default label is English. Every lote-8 Alert passes dismissLabel + onDismiss. Missing: dismissible={false}.
  3. The kit DataTableShell has an English aria-label on the toolbar and an English default result label; lote 8 avoids both props.
  4. The kit Sheet close button is English. The orchestration drawer uses showClose={false} and its own translated close button.
  5. 10 native elements are kept, each commented (list above). The kit has no multi-line tile button or disclosure primitive.
  6. Pre-existing English literals are left for the i18n wave: log-export, conversations (including the new scrollbarLabel="Conversations"), chaos fallbacks, cache trends and reasoning stats, runtime "Layer N", search-tools provider status, relay "/min" and "/day".
  7. Spec §4 suggestions not done: webhooks list → DataTableShell (it is a card stack with expandable delivery logs); log-export destinations → Switch; profile → Avatar/SaveChangesBar (the page has no form); runtime → StatRow (no such primitive); relay → Stat.
  8. cache, cache/media and conversations have no own PageHeader, because the shell header already renders the route h1 (lote-1 ruling).
  9. Chaos and runtime "orange" (degraded/lockout) has no kit token and maps to warning; the label text still tells them apart.
  10. text-primary on bg-primary/10 chips (webhooks step numbers, tutorial numbers) is left as is, per controller ruling 1.
  11. Profile locked-badge contrast (axe color-contrast × 36): the opacity-50 grayscale on locked tiles comes from the base and needs a design decision.
  12. One React fix(sse): add Claude-to-Claude passthrough for anthropic-compatible providers #418 hydration warning in the production smoke, route not identified.

…kit-lote8

# Conflicts:
#	src/shared/constants/iconMap.ts
…kit-lote8

# Conflicts:
#	src/shared/constants/iconMap.ts
… wraps at 390, iconMap imports once (KEA-7886, lote 8)
@diegosouzapw
diegosouzapw merged commit 45497c9 into feat/new-uikit Oct 22, 2026
@diegosouzapw
diegosouzapw deleted the feat/new-uikit-lote8 branch October 22, 2026 04:30
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