Skip to content

feat(frontend): redesign token aliases + brand decision - #763

Merged
LucasSantana-Dev merged 2 commits into
mainfrom
feature/redesign-token-aliases
Apr 22, 2026
Merged

LucasSantana-Dev merged 2 commits into
mainfrom
feature/redesign-token-aliases

Conversation

@LucasSantana-Dev

Copy link
Copy Markdown
Owner

Summary

PR 1 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10). Pure CSS-additive change — zero JSX touched, no tests changed.

  • Adds short-form token aliases (--color-canvas, --color-sidebar, --color-panel, --color-brand-discord, --color-brand-accent, --color-text-strong/body/muted/subtle, --shadow-soft/panel) to the @theme block alongside existing --color-lucky-* tokens. Same hex values — both naming systems coexist during the port; legacy aliases get dropped in a later cleanup PR.
  • Adds @utility discord-gradient (landing hero text) and @utility lucky-focus-ring (3px blurple focus). Existing surface-panel/card/elevated/glass kept as-is.
  • Updates branding/BRANDING_GUIDE.md to match the resolved brand decision: dual accent (blurple primary + neon pink secondary) + Sora display + Manrope body + JetBrains Mono. Drops the stale "single accent, Inter only" language. Anchored against docs/decisions/2026-04-21-redesign-port-target.md.

Why this first

Lands the vocabulary needed for subsequent page-port PRs (§5 of LOVABLE_PROMPT.md: DashboardOverview → Moderation → Music → AutoMod → ServerLogs → CustomCommands → AutoMessages → EmbedBuilder → ReactionRoles → Levels → Starboard → Settings → Integrations). Once tokens exist, redesign JSX copies in verbatim.

Test plan

  • npm run type:check → clean
  • npm run lint → clean, 0 warnings
  • npm run build → 732ms, main bundle 50.97 KB gzipped (+0.29 KB vs pre-i18n baseline, well within +5 KB budget)
  • CI: required checks (SonarCloud Code Analysis, Quality Gates, Security)

Not in this PR

  • SectionHeader status band (PR 2). Per-page ports (PRs 4–13). --lucky-* alias removal (PR 14, after ports complete).

🤖 Generated with Claude Code

Lands PR 1 of the 8-PR Lucky redesign port plan
(docs/LOVABLE_PROMPT.md §10) — pure CSS-additive change, zero JSX touched.

Tokens (packages/frontend/src/index.css @theme)
Short-form aliases added alongside existing --color-lucky-* tokens so
redesign JSX classes (bg-sidebar, text-text-strong, border-panel, etc.)
work verbatim against the Vite SPA. Same hex values as the existing
--lucky-* tokens. Both naming systems coexist during the migration;
--lucky-* aliases get dropped in a later cleanup PR after every page
has been ported.

Added: --color-canvas/sidebar/panel/elevated/highlight,
       --color-brand-discord/brand-accent,
       --color-text-strong/body/muted/subtle,
       --shadow-soft/panel.

Utilities
Net-new @Utility blocks: discord-gradient (landing hero text), lucky-focus-ring
(3px blurple focus). Existing surface-panel/card/elevated/glass kept as-is;
same values.

Brand guide (packages/frontend/branding/BRANDING_GUIDE.md)
Adopts the redesign's resolved decision: dual accent (Discord blurple
primary + neon pink secondary) and Sora display + Manrope body + JetBrains
Mono — matching what the live CSS has been shipping. Drops the stale
"single accent, Inter only" language. See
docs/decisions/2026-04-21-redesign-port-target.md.

Validation
- npm run type:check: clean
- npm run lint: clean (0 warnings)
- npm run build: 732ms, main bundle 50.97 KB gzipped (+0.29 KB vs pre-i18n baseline)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Apr 22, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lucky Ready Ready Preview, Comment Apr 22, 2026 5:22am

Request Review

@LucasSantana-Dev
LucasSantana-Dev enabled auto-merge (squash) April 22, 2026 05:20
@coderabbitai

coderabbitai Bot commented Apr 22, 2026 •

Copy link
Copy Markdown

Warning

Rate limit exceeded

@LucasSantana-Dev has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 1 minutes and 23 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 1 minutes and 23 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8168035f-67ba-4921-aeeb-dbfa839cbc79

📥 Commits

Reviewing files that changed from the base of the PR and between a03dfc5 and dd37638.

📒 Files selected for processing (2)
  • packages/frontend/branding/BRANDING_GUIDE.md
  • packages/frontend/src/index.css
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/redesign-token-aliases

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

Copy link
Copy Markdown

Size Change: 0 B

Total Size: 362 kB

ℹ️ View Unchanged
Filename Size
packages/frontend/dist/assets/ActionPanel-BZfj_oAQ.js 399 B
packages/frontend/dist/assets/api-BL_bTfJV.js 3.36 kB
packages/frontend/dist/assets/authStore-Bz4Vbn2f.js 558 B
packages/frontend/dist/assets/AutoMessages-CWvkqAq4.js 2.68 kB
packages/frontend/dist/assets/AutoMod-BE8WgsHd.js 4.09 kB
packages/frontend/dist/assets/badge-CAg46NEB.js 501 B
packages/frontend/dist/assets/Card-ChnzDUrq.js 455 B
packages/frontend/dist/assets/CommandsConfig-DfIMneCQ.js 1.47 kB
packages/frontend/dist/assets/Config-TJgR1hIb.js 1.7 kB
packages/frontend/dist/assets/CustomCommands-DOjg1Osw.js 2.16 kB
packages/frontend/dist/assets/DashboardOverview-DGt1Vf_R.js 3.39 kB
packages/frontend/dist/assets/dialog-BFdvqzhi.js 948 B
packages/frontend/dist/assets/EmbedBuilder-ysYZqGKI.js 3.34 kB
packages/frontend/dist/assets/Features-BOC8ufkg.js 2.86 kB
packages/frontend/dist/assets/GuildAutomation-DCQmTonN.js 2.92 kB
packages/frontend/dist/assets/guildStore-CUprTwyc.js 795 B
packages/frontend/dist/assets/index--FqApWCS.css 16.2 kB
packages/frontend/dist/assets/index-DRVzQSiM.js 50.5 kB
packages/frontend/dist/assets/input-B2B70Afe.js 463 B
packages/frontend/dist/assets/label-BW-xnETp.js 489 B
packages/frontend/dist/assets/Landing-CWKi7Lre.js 3.59 kB
packages/frontend/dist/assets/LastFm-CXiIfTTw.js 1.74 kB
packages/frontend/dist/assets/Levels-CFAGWRVn.js 2.63 kB
packages/frontend/dist/assets/Login-nMB1jCcr.js 2.5 kB
packages/frontend/dist/assets/Lyrics-BQtk2X5R.js 1.34 kB
packages/frontend/dist/assets/Moderation-Bn2TkAzP.js 3.85 kB
packages/frontend/dist/assets/Music-DMZOI89T.js 7.1 kB
packages/frontend/dist/assets/MusicConfig-CZt1HFLh.js 1.61 kB
packages/frontend/dist/assets/PreferredArtists-CmbDQpBG.js 3.7 kB
packages/frontend/dist/assets/PrivacyPolicy-FGxBiThm.js 1.38 kB
packages/frontend/dist/assets/ReactionRoles-Bq8IoMax.js 1.89 kB
packages/frontend/dist/assets/rolldown-runtime-BYbx6iT9.js 471 B
packages/frontend/dist/assets/SectionHeader-DFaPE-Wz.js 383 B
packages/frontend/dist/assets/select-RXSUpVQr.js 1.23 kB
packages/frontend/dist/assets/ServerLogs-CSAwFJKg.js 2.91 kB
packages/frontend/dist/assets/ServerSettings-CEMy6Cup.js 4.22 kB
packages/frontend/dist/assets/ServersPage-DeCWYllt.js 2.92 kB
packages/frontend/dist/assets/shim-lekosUrx.js 509 B
packages/frontend/dist/assets/Skeleton-BXVdRWw_.js 234 B
packages/frontend/dist/assets/Spotify-9sjjPDED.js 1.75 kB
packages/frontend/dist/assets/Starboard-DAY3JUsp.js 2.08 kB
packages/frontend/dist/assets/StatTile--JKqTr_E.js 603 B
packages/frontend/dist/assets/switch-BrSUprod.js 541 B
packages/frontend/dist/assets/TermsOfService-l_BYCXiO.js 1.37 kB
packages/frontend/dist/assets/TrackHistory-CHc1y_3X.js 2.17 kB
packages/frontend/dist/assets/TwitchNotifications-DJJWwcLK.js 2.45 kB
packages/frontend/dist/assets/usePageMetadata-DSy5BFWn.js 330 B
packages/frontend/dist/assets/utils-C1a-f-au.js 145 B
packages/frontend/dist/assets/vendor-forms-CdqfM_vI.js 25.4 kB
packages/frontend/dist/assets/vendor-radix-BLJl2XeP.js 38.9 kB
packages/frontend/dist/assets/vendor-react-CM1lAMeX.js 55.6 kB
packages/frontend/dist/assets/vendor-state-YvEV5drJ.js 22.2 kB
packages/frontend/dist/assets/vendor-ui-wEQnZZ2i.js 64.6 kB

compressed-size-action

@sonarqubecloud

Copy link
Copy Markdown

@LucasSantana-Dev
LucasSantana-Dev merged commit f531df6 into main Apr 22, 2026
13 checks passed
LucasSantana-Dev added a commit that referenced this pull request Apr 22, 2026
* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request Apr 22, 2026
… docs (#772)

Adds the load-bearing redesign-migration documents that were sitting
untracked in the working tree:

- docs/decisions/2026-04-21-redesign-port-target.md — accepted ADR
  (Vite-port + dual accent + Sora/Manrope). Already marked [x] in
  docs/specs/2026-04-21-backlog-map/tasks.md; already driving the
  landed #763 (token aliases) and #765 (SectionHeader) PRs.
- docs/specs/2026-04-21-backlog-map/{spec,tasks}.md — structured
  backlog spec tracking the 2026-04-21 map + redesign migration work.
- docs/FRONTEND_AI_STUDIO_CONTEXT.md, docs/LOVABLE_PROMPT.md —
  referenced from the ADR's "Related" section and "Execution plan"
  section; preserving them alongside their index.

Also gitignores packages/*/*.zip — packages/frontend.zip is a 25 MB
AI-Studio export, not source, and shouldn't be tracked.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request Apr 22, 2026
…ce (#775)

* docs(backlog): mark completed 2026-04-21 backlog items with PR evidence

10 of the 16 tasks in docs/specs/2026-04-21-backlog-map/tasks.md
already shipped — the unchecked state was sending future agents
down dead ends. Splits the list into Open / Completed, cites the
landing PR for each done item, and promotes the truly-remaining
work to the top.

Completed:
- A-R2 token aliases (#763)
- A-R3 SectionHeader eyebrowIcon + statusBand (#765)
- PR #729 webhook coverage (ef06904)
- tar Dependabot alerts (#766, replacing #755 which was closed)
- PR queue rebase sweep — 14 PRs landed 2026-04-22
- Shared Top.gg constants (already in packages/shared/src/constants/topgg.ts)
- validateBody + unskipped tests (#769)
- Frontend token/font decision (#763)
- Sonar coverage on #737 and #740 (both merged)

Still open: follow-redirects/hono lock refresh, release/tag drift
(production-visible), autoplay diversity dedup, queueManipulation
refactor, /integrations page collapse (B-R4), BRANDING_GUIDE update
(D-R2), per-page ports (13 pages).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(backlog): normalize version prefix (v2.6.148) per CodeRabbit

Use `v` prefix consistently alongside `v2.6.132`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request Apr 22, 2026
* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request Apr 22, 2026
* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request Apr 24, 2026
…#781)

* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(frontend): improve accessibility polish and test stability

Promotes semantic navigation and interaction patterns across shell, config, and landing for a safer keyboard-first UX while preserving visual intent. Updates frontend tests and isolates Music page async side effects so Vitest exits cleanly in CI.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request Apr 25, 2026
`packages/frontend/branding/BRANDING_GUIDE.md` was updated for the
2026-04-21 redesign port-target decision (#763) but the parallel
`DESIGN_SYSTEM.md` was missed:

- "Single accent — Discord Blurple" + "single accent" principle still
  read as Inter-only, blurple-only.
- Typography section still listed Inter as the only font.

`packages/frontend/src/index.css` already loads Sora + Manrope +
JetBrains Mono at line 1 and ships both `--color-brand-discord`
(`#5865f2`) and `--color-brand-accent` (`#ec4899`); the doc now
matches what's actually live.

Adds a brief note that the short-form `--color-*` aliases coexist with
the long-form `--lucky-*` tokens during the page-port migration, with a
cleanup PR queued for after the ports land — same scope as the ADR.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
)

Lands PR 1 of the 8-PR Lucky redesign port plan
(docs/LOVABLE_PROMPT.md §10) — pure CSS-additive change, zero JSX touched.

Tokens (packages/frontend/src/index.css @theme)
Short-form aliases added alongside existing --color-lucky-* tokens so
redesign JSX classes (bg-sidebar, text-text-strong, border-panel, etc.)
work verbatim against the Vite SPA. Same hex values as the existing
--lucky-* tokens. Both naming systems coexist during the migration;
--lucky-* aliases get dropped in a later cleanup PR after every page
has been ported.

Added: --color-canvas/sidebar/panel/elevated/highlight,
       --color-brand-discord/brand-accent,
       --color-text-strong/body/muted/subtle,
       --shadow-soft/panel.

Utilities
Net-new @Utility blocks: discord-gradient (landing hero text), lucky-focus-ring
(3px blurple focus). Existing surface-panel/card/elevated/glass kept as-is;
same values.

Brand guide (packages/frontend/branding/BRANDING_GUIDE.md)
Adopts the redesign's resolved decision: dual accent (Discord blurple
primary + neon pink secondary) and Sora display + Manrope body + JetBrains
Mono — matching what the live CSS has been shipping. Drops the stale
"single accent, Inter only" language. See
docs/decisions/2026-04-21-redesign-port-target.md.

Validation
- npm run type:check: clean
- npm run lint: clean (0 warnings)
- npm run build: 732ms, main bundle 50.97 KB gzipped (+0.29 KB vs pre-i18n baseline)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
… docs (#772)

Adds the load-bearing redesign-migration documents that were sitting
untracked in the working tree:

- docs/decisions/2026-04-21-redesign-port-target.md — accepted ADR
  (Vite-port + dual accent + Sora/Manrope). Already marked [x] in
  docs/specs/2026-04-21-backlog-map/tasks.md; already driving the
  landed #763 (token aliases) and #765 (SectionHeader) PRs.
- docs/specs/2026-04-21-backlog-map/{spec,tasks}.md — structured
  backlog spec tracking the 2026-04-21 map + redesign migration work.
- docs/FRONTEND_AI_STUDIO_CONTEXT.md, docs/LOVABLE_PROMPT.md —
  referenced from the ADR's "Related" section and "Execution plan"
  section; preserving them alongside their index.

Also gitignores packages/*/*.zip — packages/frontend.zip is a 25 MB
AI-Studio export, not source, and shouldn't be tracked.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
…ce (#775)

* docs(backlog): mark completed 2026-04-21 backlog items with PR evidence

10 of the 16 tasks in docs/specs/2026-04-21-backlog-map/tasks.md
already shipped — the unchecked state was sending future agents
down dead ends. Splits the list into Open / Completed, cites the
landing PR for each done item, and promotes the truly-remaining
work to the top.

Completed:
- A-R2 token aliases (#763)
- A-R3 SectionHeader eyebrowIcon + statusBand (#765)
- PR #729 webhook coverage (a8edbe8)
- tar Dependabot alerts (#766, replacing #755 which was closed)
- PR queue rebase sweep — 14 PRs landed 2026-04-22
- Shared Top.gg constants (already in packages/shared/src/constants/topgg.ts)
- validateBody + unskipped tests (#769)
- Frontend token/font decision (#763)
- Sonar coverage on #737 and #740 (both merged)

Still open: follow-redirects/hono lock refresh, release/tag drift
(production-visible), autoplay diversity dedup, queueManipulation
refactor, /integrations page collapse (B-R4), BRANDING_GUIDE update
(D-R2), per-page ports (13 pages).

* docs(backlog): normalize version prefix (v2.6.148) per CodeRabbit

Use `v` prefix consistently alongside `v2.6.132`.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
…#781)

* feat(frontend): SectionHeader eyebrowIcon + statusBand

PR 2 of the 8-PR Lucky redesign port plan (docs/LOVABLE_PROMPT.md §10,
infrastructure phase). Pure additive extension to packages/frontend/src/
components/ui/SectionHeader.tsx — no existing props changed, no existing
usages broken.

New props
- eyebrowIcon?: ReactNode — renders before the eyebrow text at 16×16 in the
  lucky-text-tertiary tone. The canonical redesign pattern (mono uppercase
  eyebrow + lucide icon — e.g. ShieldAlert + "Moderation Security").
- statusBand?: StatusBandTile[] — renders a responsive 2-up-md-4-up grid
  below the header with each tile showing uppercase mono label + colored
  status. Uses the new short-form tokens landed in PR #763
  (bg-sidebar, border-panel, bg-canvas, bg-elevated, bg-highlight) so no
  further token work needed.

StatusBandTone
New exported type: 'success' | 'brand' | 'accent' | 'warning' | 'error'
| 'muted'. Mapped to lucky-success/brand/brand-strong/warning/error/
text-tertiary respectively. Page ports pass one tone per tile based on
real data (moderation health, automation count, music connection, etc.) —
no mocked status strings, per LOVABLE_PROMPT.md §4.2.

Tests (src/components/ui/DesignPrimitives.test.tsx)
New test: "renders section header with eyebrow icon + status band".
Covers eyebrowIcon render, band role=list with aria-label=Module status,
per-tile label + status text, and per-tile icon slot.

Existing test "renders section header with actions" kept as-is — all
original props still work.

Accessibility
- Eyebrow icon: aria-hidden=true (decorative; the eyebrow text carries the semantics).
- Status band: role=list + listitems, aria-label="Module status" for screen readers.
- Tile icons: aria-hidden=true.

Bundle impact: 4 new SVG icons pulled in via lucide-react in tests only;
zero net bundle growth at runtime (the component imports no icons itself).

Validation
- npm run type:check: clean
- npm run lint: clean, 0 warnings
- npx vitest run src/components/ui/DesignPrimitives.test.tsx: 6/6 passing
- npm run build: clean, 4.42s

* fix(frontend): stable React keys for SectionHeader statusBand tiles

Addresses CodeRabbit minor: key={tile.label} could collide if two tiles
share a label. Adds optional id?: string to StatusBandTile interface and
falls back to a deterministic ${label}:${status}:${index} composite key.

packages/frontend/src/components/ui/SectionHeader.tsx
- StatusBandTile gains optional id field
- map callback receives (tile, index); key uses tile.id ?? composite

* feat(frontend): improve accessibility polish and test stability

Promotes semantic navigation and interaction patterns across shell, config, and landing for a safer keyboard-first UX while preserving visual intent. Updates frontend tests and isolates Music page async side effects so Vitest exits cleanly in CI.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LucasSantana-Dev added a commit that referenced this pull request May 13, 2026
`packages/frontend/branding/BRANDING_GUIDE.md` was updated for the
2026-04-21 redesign port-target decision (#763) but the parallel
`DESIGN_SYSTEM.md` was missed:

- "Single accent — Discord Blurple" + "single accent" principle still
  read as Inter-only, blurple-only.
- Typography section still listed Inter as the only font.

`packages/frontend/src/index.css` already loads Sora + Manrope +
JetBrains Mono at line 1 and ships both `--color-brand-discord`
(`#5865f2`) and `--color-brand-accent` (`#ec4899`); the doc now
matches what's actually live.

Adds a brief note that the short-form `--color-*` aliases coexist with
the long-form `--lucky-*` tokens during the page-port migration, with a
cleanup PR queued for after the ports land — same scope as the ADR.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@LucasSantana-Dev
LucasSantana-Dev deleted the feature/redesign-token-aliases branch May 14, 2026 02:02

This branch was successfully deployed

1 active deployment
Preview — dd376382 Deployed Apr 22, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant