Skip to content

feat: visual redesign, theme playground, and Constructive brand blue - #39

Merged
yyyyaaa merged 9 commits into
mainfrom
phat/visual-redesign
Sep 22, 2026
Merged

yyyyaaa merged 9 commits into
mainfrom
phat/visual-redesign

Conversation

@yyyyaaa

@yyyyaaa yyyyaaa commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Summary

A visual redesign of every component and block surface, plus a shadcn-style theme playground for the docs.

  • Design system — pure-neutral hsl() surface/text ramp (strong / default / subtle text, selected surfaces, hairline borders) with a mirrored dark ramp; Constructive brand blue #00A2FF as the accent with a derived --link token for blue-as-text; blue-led chart palette; Inter; one radius / shadow / duration ladder; spring motion tiers and a FluidHighlight pill on tabs, menus and toggle groups; html paints the canvas and theme-color follows the mode.
  • New primitives — slider, toggle, toggle-group, accordion, kbd, spinner, item, button-group, each with a story, registry item, docs page and package export. Subpath exports for the theme modules (/theme, /theme-tuning, /theme-presets, /theme-dials-config).
  • Theme playground at /blocks/create — DialKit customizer beside a live iframe preview with three switchable walls (86 cards built from the real primitives and blocks); neutral / accent / radius / elevation / motion presets and ten Ghostty-derived theme presets that pin exact tokens and release per dial family; URL + localStorage drafts; Get code offers the CSS overrides, a one-paste shadcn add install (registry:theme item) and an agent prompt. Walls and the dialog load on demand.
  • Registry — ten @constructive/theme-<id> items generated from the preset source; lib/motion aliases resolved in the compiler.
  • Polish passes — hover fills switch instantly, tooltips wait 600ms once, tabular numerals on changing digits, image outlines, concentric radii, grain texture on the hero, CardFooter gap, flush checkbox/radio rows via pseudo-element hit areas, chart labels contained, Alert corner fringe removed.
flowchart LR
  P[Create panel<br/>DialKit + presets] -- postMessage draft + wall --> F[Preview iframe<br/>3 walls · 86 cards]
  P -- Get code --> C[CSS overrides]
  P -- Get code --> I["shadcn add ./theme.json<br/>or @constructive/theme-&lt;id&gt;"]
  T[theme.ts + theme-presets.ts] -- generate --> G[globals.css · registry.json · /r/theme-*.json]
  T --> P
Loading

Visual

Surface Before After
Accent #076df1 royal blue, white text brand #00A2FF (as constructive.io renders it), --link for blue text at ≥ 4.5:1
Neutrals cool-tinted OKLCH grays pure-neutral hsl() ramp: strong 16% · default 36% · subtle 50% · selected 96% · border 95%, mirrored dark
Cards (dark) external ring + inset highlight drew two edges single inset hairline with a lit top edge
/blocks/create one 25-card wall 01 Platform (33) · 02 Workspace (48) · 03 Assistant (5), preset tiles, Reset, Get code → CSS / CLI install / agent prompt
Forms 40px checkbox/radio boxes indented rows by ~11px 18px controls flush with inputs, 34px pseudo hit area

Notes for review

  • primary with white text is 2.6:1 — the brand's own pairing, fine for short bold button labels. Body-text uses of the accent were moved to text-link; the Create panel's contrast badge reports WCAG tiers (AA / AA large / Below AA) honestly.
  • Alert default radius is now rounded-md and its tints are opaque color-mix over the card.
  • Preview routes are noindex; the docs site stays a static export (the CLI install path needs no server).

Generated with Devin

yyyyaaa and others added 9 commits September 22, 2026 11:23
… primitives

Rework the theme around a pure-neutral hsl() surface ramp (strong/default/
subtle text, selected surfaces, hairline borders) with a mirrored dark ramp,
a blue-led chart palette, inset dark hairlines, Inter as the default face, and
a shared radius/shadow/duration ladder. Motion gets dial-tunable spring tiers,
a FluidHighlight pill for tabs, menus, and toggle groups, and reduced-motion
guards. Adds slider, toggle, toggle-group, accordion, kbd, spinner, item, and
button-group primitives with stories, registry items, and package exports,
plus theme-tuning math, ten Ghostty-derived theme presets shipped as
registry:theme items, and subpath exports for the theme modules.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
The compiler's alias map is hardcoded, so the new motion-tuning and
fluid-highlight lib items failed canonicalisation for every component that
imports them.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
… motion tokens

Normalise focus halos to the ring-[3px] convention, disabled states to
opacity-64, hard-coded radii and easings to the theme ladder, and backdrops to
the shared recipe so both packages match the redesigned ui primitives.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Bring the documentation app onto the redesigned token system: stage rhythm
and numbered eyebrows on docs pages, catalog tiles and showcase canvases on
the shadow-card hairline, Tabs-based example switcher, shared backdrop and
focus conventions, and Inter loaded through next/font. Adds docs pages,
demos, and landing showcase entries for the eight new primitives, a theme
presets section on the Styling page, and regenerates the embedded demo
source.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…presets, and CLI install

A theme playground for the docs: an embedded DialKit customizer beside a
live iframe preview that switches between three kitchen-sink walls (86 cards
built from the real primitives and blocks), neutral/accent/radius/elevation/
motion presets plus ten Ghostty-derived theme presets that pin exact tokens
over the tuned draft and release per dial family, URL and localStorage draft
persistence with canonical encoding, and a Get code dialog that offers the CSS
overrides, a one-paste shadcn CLI install script (registry:theme item), and an
agent prompt. Walls and the dialog load on demand; Create joins the docs nav.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…sign

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…e reset button

Hover fills on rows, tabs, links, chips, and tiles switch instantly while
spatial motion keeps animating; tooltips wait 600ms once and then open
instantly across a group; changing digits and numeric columns use tabular
figures; avatars and images carry an inset hairline; nested radii follow
outer minus inset in dialogs, input groups, and command sheens; the root
element paints the canvas and theme-color follows the active mode; the hero
and art tiles get a tiled grain texture. The Create panel gains a Reset
button that is disabled on the shipped theme, and internal comments describe
mechanisms rather than origins.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
… link token

The accent, ring, chart-1 and sidebar accent now use the brand blue exactly
as constructive.io renders its primary button (#00A2FF with white text) in
both modes. Because that pairing sits below the body-text contrast bar, a
new `--link` token carries the same blue stepped down until it clears 4.5:1
on the page surface (the accent itself on dark), derived by the tuning model
and pinned per theme preset; markdown links, link hovers, focused labels and
the other body-text uses of the accent move onto it. The Create panel's
contrast badge reports WCAG tiers honestly and the accent preset test holds
the shipped blue to brand fidelity while every authored preset keeps 4.5:1.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Card footers gain a gap so paired actions never touch; Checkbox and Radio
become their visible 18px box with a pseudo-element hit area, so form rows
align flush with inputs instead of indenting; the bar charts fit their label
row inside the height a card passes and stacked bars only round the top
segment; Alert tints are opaque mixes over the card surface, removing the
corner fringe Chrome drew for translucent-on-translucent edges; title-only
card headers centre their action on the title's axis. Each of the 84 wall
cards was reviewed individually — wrapped and clipped labels, indented rows,
overlapping avatar initials, a squeezed stepper, redundant fields, dead
space and mismatched legend colours are corrected in place.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@tenki-reviewer

tenki-reviewer Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Review complete. No issues found — approved ✅.


The staged diff for PR #39 is empty: the pre-staged patch file is 0 bytes and the change summary reports zero files. There are no changed lines to review, so no findings were produced.

Reviewed commit: d479ddc

@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addeddialkit@​2.0.210010010095100

View full report

@yyyyaaa
yyyyaaa merged commit be1af57 into main Sep 22, 2026
7 checks passed
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