← Jeen.work / Design System
Foundations Components Dashboard

jeen design system — v0.6.13

Dashboard

A living, AI-queryable design system that is also the portfolio. Design decisions exist as structured data — visible through a dashboard, queryable through an agent.

Last updated 2026-05-15 Owner Jeen (wishayajeen) Stack Astro 6 + React 19 Deploy Vercel
01

System overview

Registry snapshot at v0.6.13. All values sourced from system.json → stats.

102 Tokens 7 categories
9 Components 15 variants total
2 Diary entries published articles
6 Routes including DS sub-routes
5 Open issues 11 resolved
1 Critical open critical issues
1 A11y status 1 WCAG issues open
02

Code observability

Observed usage from static analysis of src/. Source: system.generated.json (2026-05-15). Independent of system.json registry declarations.

13 Direct adoption import-based · ~27 runtime
6 Raw (product) CSS-only, no component import
13 Raw (DS pages) link classes in /design-system/* routes
5 Migrated raw patterns converted this phase
2 Adopted of 5 UI components
2 Partial imports + raw patterns coexist
1 Raw only CSS class, no imports
4 Blocked 2 permanent · React island constraint
Component adoption

UI components only. Adoption status reflects direct import usage in product files, not DS showcase.

Component Status Imports Runtime Raw patterns Variants
Badge
Badge.astro
Partially adopted 4 ~14 2
import: skill, tag, coming-soon, diary-tag raw: work-tag, coming-soon
Button
Button.astro
Adopted 2 ~2 0
import: primary, secondary
Card
Card.astro
Adopted 2 ~6 0
import: accent, default, diary
Link
Link.astro
Partially adopted 5 ~5 5
import: on-dark, back raw: nav, footer-nav, back unused: default
Icon Button
IconButton.astro
Raw pattern only 0 0 1
raw: default
Migration opportunities
Migrated
Hero.astro — Button primary → <Button variant='primary'>Hero.astro — Button secondary → <Button variant='secondary'>Hero.astro — Link on-dark ×2 → <Link variant='on-dark' external>AboutSection.astro — Badge skill ×6 → <Badge variant='skill'>diary/[slug].astro — Link back ×3 → <Link variant='back'> (including scroll-to-top via onclick rest prop)
Feasible
design-system/index.astro — Link back (line 23)design-system/dashboard.astro — Link back + footer-nav ×4design-system/components.astro — Link back + footer-nav ×4design-system/foundations.astro — Link back + footer-nav ×4
Blocked
WorkSection.jsx work-tag — React islandWorkSection.jsx work-coming-soon-badge — React islandFooter.jsx footer-nav-link as a — React islandFooter.jsx icon-btn — React island
Permanently blocked
Header.jsx nav-link — React island + scroll-to-section button behaviorFooter.jsx footer-nav-link as button — React island + scroll-to-section button behavior
Raw CSS patterns — product code

These CSS classes are applied directly in source files instead of using the corresponding system component. Does not include DS showcase (components.astro).

Component Class Variant Element Instances Migration
Badge .work-tag work-tag <span> 3 (one per project, static data) blocked
Badge .work-coming-soon-badge coming-soon <span> 2 (conditional on comingSoon: true, 2 of 3 projects) blocked
Link .nav-link nav <button> N (one per nav item, dynamic) permanently blocked
Link .footer-nav-link footer-nav <button> N (scroll-to-section items, dynamic) permanently blocked
Link .footer-nav-link footer-nav <a> N (external social/nav links, dynamic) blocked
Icon Button .icon-btn default <button> 1 (copy email button, static) blocked
Raw CSS patterns — design system pages

Raw link classes used in DS route navigation. Ironic: components.astro imports Link for demos but still uses raw classes in its own nav.

Component Class Variant Files Instances Migration
Link .back-link back 4 files 4 (one per DS route, static) feasible
Link .footer-nav-link footer-nav 9 files 9 (3 per DS route × 3 DS pages, static) feasible
03

System health

All issues tracked in system.json → discrepancies, updated by /review-ds.

11 Resolved Fixed and shipped
5 Open Known, needs action
3 Decision Intentional deviation
1 Critical Open critical
1 Moderate Open moderate
3 Low Open low / no severity
Spotlight
Latest critical
Critical a11y

.article-meta uses --color-gray-500 on dark article header — WCAG AA fail

homepage.css line ~1551: .article-meta has color:var(--color-gray-500) (#6A6A60). Article header background is --color-black (#0A0A0A). Contrast ratio ~1.6:1 — fails WCAG AA. Should use --fg-on-dark-label (~5:1) or --fg-on-dark-secondary (~9:1).

Logged 2026-05-04
Latest resolved
Resolved

dashboard.astro used --color-warning and --color-success as inline text colors on light surface

Phase 3 dashboard rewrite introduced three inline contrast violations: (1) color:var(--color-warning) = #F3FE52 (yellow) as text on ds-table light surface (~1:1 contrast); (2) color:var(--color-success) = #3DFE87 (neon green) as text on ds-table light surface (~1.3:1); (3) color:var(--fg-tertiary) at 11px on light surface (2.6:1, fails AA). Fixed: replaced with --fg-primary (bold emphasis) and --fg-secondary (secondary text) respectively. --color-warning and --color-success are safe as backgrounds or on --bg-dark; never use as text on light surfaces.

Resolved in 5efb7e8 · 2026-05-14
Latest decision
Decision

rgba() tints used in dash-stat state modifiers — intentional, no token equivalent

dashboard v1 stat cards use rgba() tints derived from --color-warning (yellow 6%), --color-error (red 6%), and --color-success (green 6%) for subtle state backgrounds (.dash-stat--warn, --critical, --ok). CLAUDE.md permits rgba tints for subtle overlays when documented. No token for semi-transparent status surfaces exists. Annotated with inline comments in design-system.css.

Logged 2026-05-13
All open issues (5)
low tokens

Diary page styles not formally in DS: code blocks, HR

The diary page uses inverted code blocks (--bg-dark bg, --fg-on-dark-primary text) and styled HRs (gray-300 border) not defined in the DS token set. Consider formalising these as article-specific token aliases.

2026-05-01
low component

Ghost + coming-soon Badge variants not in DS spec

Playground section uses ghost-style category labels and coming-soon badges not defined in the DS badge spec. Currently implemented as one-off CSS in homepage.css. Consider adding ghost and coming-soon as official Badge variants with tokens.

2026-05-01
critical a11y

.article-meta uses --color-gray-500 on dark article header — WCAG AA fail

homepage.css line ~1551: .article-meta has color:var(--color-gray-500) (#6A6A60). Article header background is --color-black (#0A0A0A). Contrast ratio ~1.6:1 — fails WCAG AA. Should use --fg-on-dark-label (~5:1) or --fg-on-dark-secondary (~9:1).

2026-05-04
low content

Doodle illustration set incomplete

DS spec calls for hand-drawn SVG doodles as a decorative layer (1–3 per section, black line art). Both feather_copy.svg and feather_check.svg have been removed (replaced by Lucide icons). Full doodle set to be provided by Jeen.

2026-05-01
moderate tokens

Several decorative border-radius values have no exact token (2px, 3px, 8px)

Audit found border-radius: 2px (.hero-scroll-dot, .mobile-menu-btn span, article hr divider), 3px (scrollbar thumb, .footer-brand-logo), and 8px (.mobile-menu-btn, hidden .footer-email-row button) in homepage.css with no corresponding token. The token scale goes --radius-xs (4px), --radius-sm (6px), --radius-md (12px). These are all decorative micro-chrome elements. Decision: either add --radius-2xs: 2px and --radius-2sm: 3px / 8px tokens, or accept raw values for sub-4px decorative radii. Currently left as-is pending token scale decision.

2026-05-05
04

Token overview

102 tokens across 7 categories. Source of truth: src/styles/tokens.css. Values: system.json → tokens.categories.

Color

6 sub-groups — primitive, semantic, on-dark, interactive

37

Spacing

Scale (13) + layout (4) · base 8px

17
T

Typography

3 families, 12-step scale, leading, tracking

23

Shadow

6 hard-offset + 2 soft

8

Radius

7-step scale — none → full

7

Border

Pick by surface: border-primary/subtle on light, border-on-dark on --bg-dark, border-accent for highlights

4

Animation

3 easings + 3 durations

6
Color semantic model

Primitive (18)

Raw values — use in DS documentation only, never in product code

--color-black--color-white--color-pure-white--color-yellow--color-yellow-dim--color-yellow-pale--color-gray-50--color-gray-100--color-gray-200--color-gray-300--color-gray-400--color-gray-500--color-gray-700--color-gray-900--color-success--color-warning--color-error--color-info

Semantic (19)

Intent-named — use in all product code; describes purpose not value

--bg-primary--bg-dark--bg-accent--bg-accent-dim--bg-surface--bg-surface-raised--bg-inverse--fg-primary--fg-secondary--fg-tertiary--fg-inverse--fg-accent--fg-on-dark-primary--fg-on-dark-secondary--fg-on-dark-label--fg-on-dark-accent--color-focus--color-cta--color-cta-hover
Token rules
useSemanticFirst Always prefer semantic tokens (--fg-primary) over primitives (--color-black) in product code
noHardcodedValues Never hardcode hex colors, font names, spacing, shadows, or border radii if a token exists
noNewTokens Do not add CSS variables outside of tokens.css
a11yLightSurface --fg-tertiary fails WCAG AA at small sizes on light bg — use --fg-secondary minimum
a11yDarkSurface Only --fg-on-dark-* tokens on --bg-dark. Never gray-500/700/900 on dark.
a11yYellowSurface Only --color-black on yellow — all other values fail contrast
05

Component registry

9 components from system.json → components. Adoption status is code-observed (system.generated.json), not registry-declared.

layout 3 components

Global page infrastructure — shell, header, footer. Required on every page. Not subject to variant expansion.

Header Header.jsx
stable
Footer Footer.jsx
stable
Layout Layout.astro
stable
ui 5 components · 15 variants

Reusable design system primitives — Badge, Button, Card, Link, IconButton. These carry variants and are the building blocks of product pages.

Badge Badge.astro
5v Partially adopted stable
Button Button.astro
2v Adopted stable
Card Card.astro
3v Adopted stable
Link Link.astro
5v Partially adopted stable
Icon Button IconButton.astro
Raw pattern only stable
system 1 component

Internal tooling — TweaksPanel and future edit-mode overlays. Not for product use; may use window APIs.

TweaksPanel TweaksPanel.jsx
experimental
06

Registry relationships

Declared relationships from system.json → relationships. These are registry-declared intent, not code-observed adoption counts. For actual usage data, see section 02 Code Observability.

Routes → Sections
/
heroplaygroundaboutwork
/design-system
no sections
/design-system-foundations
no sections
/design-system-components
no sections
/design-system-dashboard
no sections
/diary-slug
no sections
Routes → Components
/
layoutheaderfootertweaks-panel
/design-system
layout
/design-system-foundations
layout
/design-system-components
layout
/design-system-dashboard
layout
/diary-slug
layoutlink
Sections → Components (declared imports)
hero
buttonlink
playground
cardbadge
about
badge
work
no system component imports declared
07

Recent activity

Merged timeline of discrepancies, diary entries, and releases. Latest first.

2026-05-15 Release

v0.6.13 released

Add roadmap[] to system.json with 5 items (next/planned/later). Render as section 08 on dashboard. Phase 6 observability automation also ships in this version.

2026-05-14 Resolved

.footer-copy-btn contrast — resolved: class renamed, surface changed

Originally tracked as .footer-copy-btn with --color-gray-500 on dark surface. Audit 2026-05-14: class .footer-copy-btn n…

2026-05-14 Resolved low

Hero.astro SVG squiggle used hardcoded #F3FE52 instead of --color-yellow token

The decorative squiggle SVG in Hero.astro used stroke='#F3FE52' as a presentation attribute — a hardcoded hex where --co…

2026-05-14 Resolved moderate

dashboard.astro used --color-warning and --color-success as inline text colors on light surface

Phase 3 dashboard rewrite introduced three inline contrast violations: (1) color:var(--color-warning) = #F3FE52 (yellow)…

2026-05-13 Decision

rgba() tints used in dash-stat state modifiers — intentional, no token equivalent

dashboard v1 stat cards use rgba() tints derived from --color-warning (yellow 6%), --color-error (red 6%), and --color-s…

2026-05-08 Diary

Dogfooding My Design System: Building Something That Watches Itself

Workflow · 5 min read → /diary/dogfooding-my-design-system

2026-05-05 Resolved

Link variant='subtle' removed from system

variant='subtle' (.link-subtle) was deprecated in 0.5.1 and never used in any product page. Fully removed in 0.6.1: CSS …

2026-05-05 Resolved

2× hardcoded border-radius: 12px in homepage.css

Audit found .hero-scroll-mouse (line 343) and .footer-email-row responsive override (line 1457) using border-radius: 12p…

2026-05-05 Resolved

IconButton missing from component-inventory.md

IconButton was created and added to system.json in v0.5.7 but omitted from component-inventory.md. Full section added: p…

2026-05-05 Resolved

Header.jsx uses hardcoded hex, font-family strings, and raw box-shadow values

Refactored Header.jsx to remove all inline style objects. Added CSS classes nav, nav.nav--active, .nav-inner, .nav-logo-…

2026-05-05 Open moderate

Several decorative border-radius values have no exact token (2px, 3px, 8px)

Audit found border-radius: 2px (.hero-scroll-dot, .mobile-menu-btn span, article hr divider), 3px (scrollbar thumb, .foo…

2026-05-04 Open critical

.article-meta uses --color-gray-500 on dark article header — WCAG AA fail

homepage.css line ~1551: .article-meta has color:var(--color-gray-500) (#6A6A60). Article header background is --color-b…

2026-05-04 Decision

/design-system split into 4 routes instead of tab-based single page

The single design-system.astro monolith (1270 lines, JS tab switching) was refactored into /design-system (hub), /design…

2026-05-02 Resolved

Ad-hoc link styles unified into Link component + global pattern

6 ad-hoc link styles (nav-link, hero-social-link, footer-link, footer-contact-link, social-pill, article-back-link) were…

08

Roadmap

Upcoming system work. Source: system.json → roadmap.

Next
Next high

Improve dashboard communication layer

Refactor how system data is surfaced on the dashboard — clearer data provenance, better separation between registry-declared intent and code-observed adoption, and tighter section descriptions.

→ Dashboard becomes self-explanatory to a first-time visitor without needing external context.

Next high

Add regression tracking

Extend the observability script to detect regressions: raw CSS mimics appearing in files that previously used direct imports, or variant usage dropping out of variantsUsedDirectly.

→ Migrations cannot silently regress. The script flags regressions on every run.

Planned
Planned high

Integrate analyze-system into /review-ds

Make /review-ds automatically run npm run analyze-system before auditing, so system.generated.json is always fresh and adoption data in the audit report reflects the current diff.

→ Single command produces both fresh observability data and a complete audit report. No manual regeneration step.

Planned medium

Ask Pocky v0

First version of the AI agent interface — allow visitors to query the design system through Pocky. Backed by system.json and system.generated.json as structured context.

→ Visitors can ask questions like 'which components are partially adopted?' and get accurate, data-driven answers directly from the system.

Later
Later medium

Component sandbox

An interactive playground where visitors can configure component props and see live rendered output. Each system component (Badge, Button, Card, Link, IconButton) would have a sandbox pane on the components page.

→ The components page becomes a hands-on reference, not just documentation.