@neuravision/construct 2.0.3 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +318 -0
  2. package/README.md +158 -149
  3. package/behaviors/combobox.js +486 -0
  4. package/behaviors/drawer.js +18 -0
  5. package/behaviors/dropdown.js +310 -0
  6. package/behaviors/index.d.ts +335 -0
  7. package/behaviors/index.js +9 -0
  8. package/behaviors/internal/dialog-controller.js +421 -0
  9. package/behaviors/internal/dom.js +408 -0
  10. package/behaviors/internal/overlay.js +241 -0
  11. package/behaviors/internal/popup-layer.js +190 -0
  12. package/behaviors/modal.js +17 -0
  13. package/behaviors/popover.js +278 -0
  14. package/behaviors/select-menu.js +344 -0
  15. package/behaviors/tabs.js +241 -0
  16. package/behaviors/toggle-group.js +266 -0
  17. package/behaviors/tooltip.js +257 -0
  18. package/components/README.md +319 -83
  19. package/components/_shared.css +22 -10
  20. package/components/_shell-shared.css +20 -4
  21. package/components/accordion.css +8 -0
  22. package/components/app-shell-v2.css +28 -14
  23. package/components/app-shell.css +30 -14
  24. package/components/badge.css +15 -0
  25. package/components/banner.css +32 -1
  26. package/components/button.css +103 -15
  27. package/components/card.css +67 -8
  28. package/components/chart.css +26 -0
  29. package/components/checkbox.css +35 -2
  30. package/components/chip.css +30 -2
  31. package/components/combobox.css +21 -0
  32. package/components/datepicker.css +58 -9
  33. package/components/datum.css +277 -0
  34. package/components/dropdown.css +23 -3
  35. package/components/field.css +6 -4
  36. package/components/file-upload.css +1 -1
  37. package/components/index.css +5 -0
  38. package/components/list.css +28 -2
  39. package/components/meter.css +182 -0
  40. package/components/navbar.css +102 -4
  41. package/components/pagination.css +18 -0
  42. package/components/progress-bar.css +22 -1
  43. package/components/select-menu.css +8 -0
  44. package/components/select.css +8 -0
  45. package/components/sidebar.css +15 -2
  46. package/components/skip-link.css +6 -2
  47. package/components/slider.css +7 -1
  48. package/components/status.css +107 -0
  49. package/components/switch.css +66 -5
  50. package/components/table.css +53 -4
  51. package/components/tabs.css +55 -3
  52. package/components/toast.css +10 -1
  53. package/components/toggle-group.css +16 -5
  54. package/components/toolbar.css +17 -1
  55. package/components/tooltip.css +4 -0
  56. package/components/tree.css +30 -0
  57. package/docs/architecture.md +79 -0
  58. package/docs/behaviors.md +122 -0
  59. package/docs/fonts.md +70 -0
  60. package/docs/governance.md +85 -0
  61. package/docs/guidelines.md +72 -25
  62. package/examples/react/README.md +20 -0
  63. package/examples/react/SettingsModal.jsx +66 -0
  64. package/examples/react/construct.css +5 -0
  65. package/fonts.css +10 -0
  66. package/foundations.css +14 -1
  67. package/package.json +76 -21
  68. package/schemas/components.schema.json +122 -0
  69. package/schemas/examples/theme.example.json +27 -0
  70. package/schemas/primitives.schema.json +135 -0
  71. package/schemas/semantic.schema.json +224 -0
  72. package/schemas/theme.schema.json +63 -0
  73. package/scripts/build-tokens.mjs +1499 -0
  74. package/scripts/construct-theme.mjs +43 -0
  75. package/scripts/validate-tokens.mjs +25 -0
  76. package/standalone/accordion.css +3 -0
  77. package/standalone/alert.css +3 -0
  78. package/standalone/app-shell-v2.css +4 -0
  79. package/standalone/app-shell.css +4 -0
  80. package/standalone/avatar.css +3 -0
  81. package/standalone/badge.css +3 -0
  82. package/standalone/banner.css +3 -0
  83. package/standalone/breadcrumbs.css +3 -0
  84. package/standalone/button.css +3 -0
  85. package/standalone/card.css +3 -0
  86. package/standalone/chart.css +3 -0
  87. package/standalone/checkbox.css +3 -0
  88. package/standalone/chip.css +3 -0
  89. package/standalone/combobox.css +3 -0
  90. package/standalone/core.css +4 -0
  91. package/standalone/data-table.css +3 -0
  92. package/standalone/datepicker.css +3 -0
  93. package/standalone/datum.css +3 -0
  94. package/standalone/divider.css +3 -0
  95. package/standalone/drawer.css +3 -0
  96. package/standalone/dropdown.css +3 -0
  97. package/standalone/empty-state.css +3 -0
  98. package/standalone/field.css +3 -0
  99. package/standalone/file-upload.css +3 -0
  100. package/standalone/icon.css +3 -0
  101. package/standalone/input.css +3 -0
  102. package/standalone/list.css +3 -0
  103. package/standalone/meter.css +3 -0
  104. package/standalone/modal.css +3 -0
  105. package/standalone/navbar.css +3 -0
  106. package/standalone/pagination.css +3 -0
  107. package/standalone/popover.css +3 -0
  108. package/standalone/progress-bar.css +3 -0
  109. package/standalone/select-menu.css +3 -0
  110. package/standalone/select.css +3 -0
  111. package/standalone/sidebar.css +3 -0
  112. package/standalone/skeleton.css +3 -0
  113. package/standalone/skip-link.css +3 -0
  114. package/standalone/slider.css +3 -0
  115. package/standalone/spinner.css +3 -0
  116. package/standalone/status.css +3 -0
  117. package/standalone/switch.css +3 -0
  118. package/standalone/table.css +3 -0
  119. package/standalone/tabs.css +3 -0
  120. package/standalone/textarea.css +3 -0
  121. package/standalone/toast.css +3 -0
  122. package/standalone/toggle-group.css +3 -0
  123. package/standalone/toolbar.css +3 -0
  124. package/standalone/tooltip.css +3 -0
  125. package/standalone/tree.css +3 -0
  126. package/themes/README.md +37 -0
  127. package/themes/walnut.theme.json +106 -0
  128. package/tokens/README.md +135 -123
  129. package/tokens/components.json +64 -0
  130. package/tokens/primitives.json +268 -0
  131. package/tokens/semantic.dark.json +94 -0
  132. package/tokens/semantic.high-contrast-dark.json +94 -0
  133. package/tokens/semantic.high-contrast.json +94 -0
  134. package/tokens/semantic.light.json +179 -0
  135. package/tokens/tokens.css +960 -58
  136. package/tokens/tokens.js +729 -120
  137. package/tokens/tokens.json +1158 -116
  138. package/tokens/tokens.ts +729 -120
package/CHANGELOG.md ADDED
@@ -0,0 +1,318 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@neuravision/construct` will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [2.1.2] - 2026-07-16
9
+
10
+ ### Added
11
+
12
+ - Datum grammar, extended from signature to system-wide vocabulary:
13
+ - `component.datum.*` tokens (edge width, tick, origin, mark, scale steps) — the grammar's
14
+ dimensions are now part of the published token contract and themable per product.
15
+ - `ct-eyebrow--numbered` (+ `ct-eyebrow-set` scope): auto-incremented, zero-padded sheet
16
+ numbers in the eyebrow, like an engineering drawing set.
17
+ - `ct-datum-scale--progress`: the scale's origin segment becomes meaning-bearing and reports
18
+ progress via `--ct-datum-scale-progress`; fill uses `brand-accent-strong` (≥3:1 per theme).
19
+ - `ct-datum-frame`: the corner registration mark generalised beyond cards for figures, code
20
+ samples, and media exhibits.
21
+ - Chart datum reference line (`ct-chart__datum-line` + `ct-chart__datum-label`) for threshold,
22
+ target, and "today" markers — dashed so the reference is shape-encoded, with a forced-colors
23
+ `CanvasText` fallback.
24
+ - Tables speak the grammar: `tr[aria-current]`/`[aria-selected]`/`[data-state="selected"]` rows
25
+ carry the orange leading edge (with forced-colors border fallback), and the actively sorted
26
+ column header (`aria-sort`) carries the datum underline.
27
+ - A "The Datum" section in `docs/guidelines.md` documenting the dosage rule (one datum per
28
+ surface), the text/edge/fill color contract, and the motion rule.
29
+
30
+ ### Changed
31
+
32
+ - The datum now enters instead of popping: tab indicators draw in from their origin
33
+ (`transform`-based), and active leading edges on list items, sidebar nav items, and cards
34
+ slide in via a `box-shadow` transition (`--duration-fast`, disabled by
35
+ `prefers-reduced-motion`). The active card's shadow list is reordered
36
+ (`ambient, inset edge`) so it interpolates; consumers overriding `box-shadow` on active
37
+ states should re-check their overrides.
38
+ - The datum scale's origin now anchors to the inline start in RTL writing modes.
39
+ - Table rows using `aria-selected`/`aria-current` markup, previously unstyled, now receive the
40
+ selected-row treatment (muted background + leading edge).
41
+
42
+ - Preset themes: a new `themes/` package entry for validated, opt-in brand skins that compile
43
+ through the `construct-theme` CLI instead of being baked into `tokens.css`. First preset:
44
+ `walnut` — a warm ivory light theme with walnut-brown brand color, AAA body-text contrast
45
+ (≥ 7:1) enforced by `contrast` gates, validated in `npm run check` via `themes:validate`.
46
+
47
+ ### Fixed
48
+
49
+ - Tabs: anchor-based triggers (router-driven tabs rendering `<a class="ct-tabs__trigger">`)
50
+ no longer inherit the global link underline and link `:active` color from `foundations.css`.
51
+ The trigger label showed a text underline stacked above the orange active indicator; the
52
+ indicator is the only active-tab signal now.
53
+
54
+ ## [2.1.1] - 2026-07-16
55
+
56
+ ### Changed
57
+
58
+ ## [2.1.0] - 2026-07-15
59
+
60
+ ### Added
61
+
62
+ - A validated three-layer token contract (primitive → semantic → component) with 40 component tokens, published JSON Schemas, typed JS/TS exports, and complete nested theme scopes.
63
+ - The `construct-theme` CLI for external theme inputs, including unknown-path, reference, shape, selector, and contrast validation. Built-in themes now verify 57 contrast pairs each.
64
+ - Optional, dependency-free, typed headless controllers for modal, drawer, tabs, toggle group, dropdown, select menu, combobox, tooltip, and popover.
65
+ - Generic live/connection status, metric, and segmented meter contracts; loading-button behavior; a compact responsive navbar; and shared App Shell sizing/motion hooks.
66
+ - Generated standalone package entry points for all 49 component styles plus a public component core entry.
67
+ - Automated CSS-variable closure, package-export, version, token negative-case, real coarse-pointer, and forced-colors contracts.
68
+ - Architecture, behavior, font/self-hosting, governance/Definition-of-Done documentation and a React lifecycle example.
69
+
70
+ ### Changed
71
+
72
+ - `foundations.css` is network-free. Hosted Lato and JetBrains Mono loading moved to the explicit opt-in `fonts.css` entry.
73
+ - Explicit light, dark, high-contrast, and custom theme scopes emit complete semantic and component contracts, making arbitrary nested container themes deterministic.
74
+ - Light accent interaction colors, light solid success/warning colors, dark muted text, and high-contrast active accent were adjusted to satisfy the expanded contrast matrix.
75
+ - App Shell V2 is the recommended shell; V1 remains supported through compatibility aliases instead of a divergent public token vocabulary.
76
+ - The verified development baseline is Node.js 22.12+ (or 24+) with Storybook 10.5, Vitest 4.1, and Playwright 1.61; the unused coverage package and vulnerable legacy test-tool chain were removed, and CI/publish preflights now reject high or critical dependency advisories.
77
+
78
+ ### Fixed
79
+
80
+ - Added the missing `--font-size-2xs`, `--color-bg-subtle`, and `--color-border-muted` contracts and removed the Datepicker's undeclared global pseudo-token.
81
+ - Prevented light component aliases and inherited semantic values from leaking into nested dark, high-contrast, light, or custom theme containers.
82
+ - Expanded the small Switch coarse-pointer hit area on both axes and enforced the 44×44 Construct target policy for default/small actions and compact controls.
83
+ - Preserved meaningful borders, state indicators, and focus visibility in forced-colors mode.
84
+ - Raised the default light/dark boundary colors and added compiler gates for control borders against canvas, surface, elevated, and control backgrounds.
85
+ - Rejected negative component dimensions, radii, font metrics, and shadow blur radii while preserving valid negative letter spacing, shadow offsets, and spread values.
86
+ - Preserved the existing `_keyframes.css`, `_shared.css`, and `_shell-shared.css` package subpaths while public component imports move to generated standalone adapters.
87
+
88
+ ### Accessibility
89
+
90
+ - Composite-widget behavior now has tested keyboard, focus, dismissal, typeahead, nested-overlay, cleanup, and ARIA synchronization contracts instead of relying on CSS documentation alone.
91
+ - Status meaning is conveyed with visible text plus a non-text indicator; semantic state color is no longer used as small text on an unrelated surface.
92
+
93
+
94
+ ## [2.0.4] - 2026-06-28
95
+
96
+ ### Added
97
+
98
+ - **Datum grammar — the signature, now spoken by components.** The orange "datum"
99
+ (Construct's reference line for focus / active / current state) was promoted from focus
100
+ rings and bespoke docs CSS into reusable, opt-in component vocabulary in a new
101
+ `components/datum.css`:
102
+ - `.ct-eyebrow` — a mono kicker with a leading datum tick, for labelling sections.
103
+ - `.ct-datum-scale` — a measured reference line (a ruler with minor/major ticks and an
104
+ orange "origin" segment) for section headers.
105
+ - `.ct-specs` / `.ct-spec` (+ `.ct-spec--origin`) — an engineering datasheet for key figures.
106
+ - Card modifiers in `card.css`: `.ct-card--datum` (a corner registration mark) and an
107
+ active state (`.ct-card--active` / `[data-state="active"]`) that carries the same orange
108
+ leading edge as `.ct-list__item` and `.ct-sidebar`, so every active surface reads as one system.
109
+
110
+ ### Accessibility
111
+
112
+ - Eyebrow and spec labels use `--color-text-secondary` (≥7:1 on every surface across light,
113
+ dark and high-contrast); orange is reserved for non-text edges/ticks (`--color-brand-accent`,
114
+ ≥3:1 as a graphic object). Default cards and existing `aria-selected` card behaviour are unchanged.
115
+
116
+ ## [2.0.3] - 2026-06-28
117
+
118
+ ### Fixed
119
+
120
+ - **Lato typeface was declared but never loaded.** The 2.0.2 switch updated the font-family
121
+ tokens to Lato but left the Google Fonts `@import` in `foundations.css` pointing at Manrope,
122
+ so consumers loaded Manrope (unused) while Lato fell back to a system sans-serif. The
123
+ `@import` now loads `Lato:wght@400;700;900` (JetBrains Mono unchanged). Documentation
124
+ (`DesignTokens`, `Accessibility`, `Introduction`) updated from Manrope to Lato.
125
+
126
+ ### Notes
127
+
128
+ - Lato ships only in 400/700/900 — it has no 500/600/800. The `medium` (500) and `semibold`
129
+ (600) weight tokens therefore resolve to the nearest available face (400 and 700), and
130
+ `extrabold` (800) to 900. This is inherent to Lato; `font-synthesis: none` keeps these as
131
+ real faces (no faux weights).
132
+
133
+ ## [2.0.2] - 2026-06-28
134
+
135
+ ### Changed
136
+
137
+ - Switch primary typeface from Manrope to Lato (400/700/900)
138
+
139
+ ## [2.0.1] - 2026-06-27
140
+
141
+ ### Fixed
142
+
143
+ - **Navbar height token.** The navbar referenced a non-existent `--control-height-xl` primitive (the control-height scale ends at `lg`), so the navbar fell back to an undefined height. Introduced a dedicated `layout.navbar.height` primitive (`--navbar-height`, 56px) and pointed `.ct-navbar` at it. The control-height scale stays reserved for form controls.
144
+
145
+
146
+ ## [2.0.0] - 2026-06-27
147
+
148
+ A new visual identity — *"engineered for everyone."* Construct moves from a generic tech-blue/slate look to a distinctive system: warm concrete neutrals, an ink-steel primary, and a safety-orange accent that acts as a single recurring **"datum"** marking what is focused / active / selected / current. Verified WCAG AA across light, dark, and high-contrast themes.
149
+
150
+ **BREAKING CHANGES:**
151
+
152
+ - **Neutral primitive ramp renamed `slate` → `stone`.** Consumers referencing `color.slate.*` or `--color-slate-*` must migrate to `stone.*`. The neutral palette is now warm concrete/graphite instead of cool blue-grey.
153
+ - **Default typefaces changed** from Sora + Source Sans 3 to **Manrope** (display + body). The Google Fonts import in `foundations.css` was updated accordingly; self-hosting consumers must update their font files.
154
+
155
+ ### Added
156
+
157
+ - **The "datum" signature** — the orange accent now marks focus rings, active tab underlines, checked selection controls, slider fills, selected chips, the current pagination page, and active navigation (leading edge) across all components.
158
+ - New semantic tokens: `color.brand.onAccent`, `color.text.onPrimary`, `color.state.onSolid` (theme-aware foregrounds for solid fills), and the `font.weight.extrabold` (800) display weight.
159
+ - New `orange` primitive ramp (structural safety orange).
160
+
161
+ ### Changed
162
+
163
+ - State ramps retuned to widen hue separation from the brand orange: `ocean` → blueprint blue (info), `amber` → gold (warning), `red` → crimson (danger).
164
+ - Shadows warmed (warm-ink instead of cool blue); display headings now use weight 800.
165
+ - Solid chips and solid banners now use a theme-aware foreground (`state.onSolid`) so their labels meet AA contrast in dark and high-contrast themes.
166
+
167
+
168
+ ## [1.4.0] - 2026-06-27
169
+
170
+ ### Added
171
+
172
+ - **Tooling — design-sync for [claude.ai/design](https://claude.ai/design):** Construct can now be synced to a Claude Design project so Claude's design agent builds with the real Construct components. Because Construct is a pure CSS/token system, an off-script generator (`.design-sync/build.mjs`) flattens the authored CSS into one bundle and builds one preview card per component from the true Storybook-rendered HTML, plus per-component usage docs and a class-vocabulary README header. Sync state lives under `.design-sync/`; no change to the published package surface.
173
+
174
+
175
+ ## [1.3.1] - 2026-06-17
176
+
177
+ ### Fixed
178
+
179
+ - **a11y / focus:** Raised the `--color-focus-ring` contrast so the focus indicator meets the WCAG 2.2 ≥ 3:1 non-text-contrast minimum against the canvas and surface backgrounds. The `light` ring (`teal.400`, 2.59:1 on canvas) → `teal.600` (5.09:1) and the `high-contrast` ring (`amber.400`, 2.07:1) → `amber.700` (6.68:1); the `dark` ring already passed and is unchanged. Affects every component that uses the shared focus token (24 files).
180
+
181
+
182
+ ## [1.3.0] - 2026-06-17
183
+
184
+ ### Added
185
+
186
+ - Chart styling skin (`ct-chart`) — a framework-agnostic theme layer for SVG data-visualisation primitives (line/area, bar, donut, sparkline, gauge). Provides series colour mapping (`.ct-chart__series--{1..8}` via `currentColor`), grid/axis, legend, donut/gauge text, and a visually-hidden **accessible data-table fallback** (`.ct-chart__table`, revealed with `.ct-chart--show-table`). Geometry is supplied by the consuming layer; this file only themes the result. `prefers-reduced-motion` and `forced-colors` supported.
187
+ - New categorical chart palette tokens `--color-chart-series-{1..8}`, defined for `light`, `dark`, and `high-contrast` themes. Every series colour meets the WCAG 1.4.11 non-text contrast minimum (≥ 3:1) against both the canvas and surface backgrounds.
188
+ - Storybook coverage for `ct-chart` (`Chart.stories.js`): line/area, bar, donut, gauge, sparkline, empty state, the interactive data-table toggle (documenting the `aria-expanded`/`aria-controls` contract), and an optional keyboard-focusable-marks example. All stories pass the a11y addon in `error` mode.
189
+
190
+ ### Fixed
191
+
192
+ - `ct-chart`: interactive marks (`.ct-chart__bar`, `.ct-chart__slice`, `.ct-chart__dot`) now have `:focus-visible` parity with their `:hover` affordance, so consumer-focusable data points show a visible focus ring.
193
+ - `ct-chart`: hoisted `--ct-chart-gauge-width` into the `.ct-chart` config block (was an inline `var()` fallback duplicated across two rules), making it discoverable and overridable like the other `--ct-chart-*` properties.
194
+ - `ct-chart`: consistent `forced-colors` behaviour — data marks (line, area, dots, bars, slices, legend marker, gauge) now uniformly preserve their series/state colour via `forced-color-adjust: none`, so a coloured legend no longer describes monochrome lines in Windows High Contrast. Grid and axes still follow the user's forced palette, and the data-table fallback remains the fully compliant path.
195
+
196
+ ## [1.2.0] - 2026-05-07
197
+
198
+ ### Added
199
+
200
+ - Tree component (`ct-tree`) implementing the WAI-ARIA Tree View pattern: n-level nesting, roving tabindex, full keyboard navigation (↑/↓/→/←/Home/End/`*`/type-ahead), single & multi selection, async loading state (`aria-busy`), and an orphan-node modifier (`.ct-tree__node--orphan`) for hierarchies with missing parents. Modifiers: `--guides`, `--dense`, `--bordered`. Forced-colors and `prefers-reduced-motion` supported. (#86)
201
+
202
+ ## [1.1.6] - 2026-04-09
203
+
204
+ ### Changed
205
+
206
+ ### Added
207
+
208
+ - Avatar seeded color palette: `.ct-avatar[data-seed-color="N"]` (N = 1–8) selects a deterministic background/foreground pair from the palette, letting consumers give each user a stable color. Avatars without the attribute keep the existing default — fully backwards compatible. (#85)
209
+ - New semantic tokens `--color-avatar-seed-{1..8}-{bg,fg}` and component-level `--ct-avatar-seed-{1..8}-{bg,fg}` aliases, defined for `light`, `dark`, and `high-contrast` themes. Every pair meets WCAG AA (≥ 4.5:1, lowest measured 6.48:1).
210
+ - New color primitives `purple` and `pink` (50–900 scales) feeding the seed palette.
211
+ - Storybook story `Data Display/Avatar/Seeded Colors` showcasing the palette and confirming the unseeded fallback.
212
+
213
+ ## [1.1.5] - 2026-04-03
214
+
215
+ ### Changed
216
+
217
+ ## [1.1.4] - 2026-03-27
218
+
219
+ ### Changed
220
+
221
+ ## [1.1.3] - 2026-03-27
222
+
223
+ ### Changed
224
+
225
+ ## [1.1.2] - 2026-03-21
226
+
227
+ ### Changed
228
+
229
+ ## [1.1.1] - 2026-03-21
230
+
231
+ ### Changed
232
+
233
+ ## [1.1.0] - 2026-03-21
234
+
235
+ ### Added
236
+
237
+ -
238
+
239
+ ## [0.2.0] - 2026-03-12
240
+
241
+ ### Added
242
+
243
+ - Toolbar component (`ct-toolbar`) with brand, navigation, and action slots
244
+ - Sidebar component (`ct-sidebar`) with side, over, and push modes
245
+ - Progress bar component (`ct-progress-bar`) with determinate, indeterminate, and size/variant modifiers
246
+ - Toggle group component (`ct-toggle-group`) with single/multiple selection and size variants
247
+ - Nav list component (`ct-nav-list`, `ct-nav-item`) for sidebar navigation
248
+ - Icon component (`ct-icon`) with sm, md, lg, xl sizes
249
+ - `prefers-reduced-motion` support in components layer for self-contained usage
250
+ - Explicit `:focus-visible` styles for all interactive components (button, form controls, checkbox, radio, switch, tabs, dropdown items, pagination, datepicker, table sort, nav items, toolbar links)
251
+
252
+ ### Fixed
253
+
254
+ - Inconsistent focus indicators across components (standardized to `outline: 2px solid` with appropriate offsets)
255
+ - Missing focus styles on `.ct-button`, `.ct-check__input`, `.ct-radio__input`, `.ct-switch__input`, `.ct-tabs__trigger`
256
+ - Form controls now show both border-color change and outline ring on focus for WCAG 2.1 AA compliance
257
+
258
+ ## [0.1.1] - 2026-03-12
259
+
260
+ ### Changed
261
+
262
+ - Updated `.gitignore` to exclude internal documentation and mock data
263
+ - Project configuration and metadata cleanup
264
+
265
+ ## [0.1.0] - 2026-01-31
266
+
267
+ ### Added
268
+
269
+ - Initial release of the Construct Design System
270
+ - Two-tier token pipeline (primitives + semantic) with CSS, JSON, and TypeScript outputs
271
+ - Three theme modes: light (default), dark, high-contrast
272
+ - System preference fallback via `prefers-color-scheme` and `prefers-contrast`
273
+ - Foundation styles: CSS reset, typography scale, layout utilities
274
+ - Component library with `ct-` prefix and BEM naming:
275
+ - Button (primary, secondary, outline, ghost, accent, danger, link variants; sm/md/lg sizes)
276
+ - Form controls: input, select, textarea with field wrapper, hints, and error states
277
+ - Selection controls: checkbox, radio, switch
278
+ - Card with header, body, footer, and interactive variant
279
+ - Table with striped, compact, sortable, and numeric cell variants
280
+ - Data table with header, toolbar, filters, search, pagination, and footer
281
+ - Modal and confirmation dialog
282
+ - Toast notifications with info, success, warning, danger variants
283
+ - Tooltip with top, bottom, left, right positioning
284
+ - Tabs with trigger and panel
285
+ - Dropdown menu with items, labels, separators
286
+ - Pagination with navigation links
287
+ - Breadcrumbs
288
+ - Datepicker with calendar grid
289
+ - Badge and chip with variant and interactive modifiers
290
+ - File upload with drag-and-drop dropzone and file list
291
+ - Spinner, skeleton loader, and loading overlay
292
+ - Accessibility: ARIA attribute-driven states, semantic HTML patterns
293
+ - Storybook with HTML Vite, a11y addon (error-level), theme switching, autodocs
294
+ - Story-driven testing via Vitest + Playwright
295
+ - GitHub Actions workflow for Storybook deployment to GitHub Pages
296
+ - Token build script with `--check` mode for CI validation
297
+
298
+ [2.1.1]: https://github.com/Samyssmile/construct/compare/v2.1.0...v2.1.1
299
+ [2.1.0]: https://github.com/Samyssmile/construct/compare/v2.0.4...v2.1.0
300
+ [2.0.4]: https://github.com/Samyssmile/construct/compare/v2.0.3...v2.0.4
301
+ [2.0.3]: https://github.com/Samyssmile/construct/compare/v2.0.2...v2.0.3
302
+ [2.0.2]: https://github.com/Samyssmile/construct/compare/v2.0.1...v2.0.2
303
+ [2.0.1]: https://github.com/Samyssmile/construct/compare/v2.0.0...v2.0.1
304
+ [2.0.0]: https://github.com/Samyssmile/construct/compare/v1.4.0...v2.0.0
305
+ [1.4.0]: https://github.com/Samyssmile/construct/compare/v1.3.1...v1.4.0
306
+ [1.3.1]: https://github.com/Samyssmile/construct/compare/v1.3.0...v1.3.1
307
+ [1.3.0]: https://github.com/Samyssmile/construct/compare/v1.2.0...v1.3.0
308
+ [1.2.0]: https://github.com/Samyssmile/construct/compare/v1.1.6...v1.2.0
309
+ [1.1.6]: https://github.com/Samyssmile/construct/compare/v1.1.5...v1.1.6
310
+ [1.1.5]: https://github.com/Samyssmile/construct/compare/v1.1.4...v1.1.5
311
+ [1.1.4]: https://github.com/Samyssmile/construct/compare/v1.1.3...v1.1.4
312
+ [1.1.3]: https://github.com/Samyssmile/construct/compare/v1.1.2...v1.1.3
313
+ [1.1.2]: https://github.com/Samyssmile/construct/compare/v1.1.1...v1.1.2
314
+ [1.1.1]: https://github.com/Samyssmile/construct/compare/v1.1.0...v1.1.1
315
+ [1.1.0]: https://github.com/Samyssmile/construct/compare/v1.0.0...v1.1.0
316
+ [0.2.0]: https://github.com/Samyssmile/construct/compare/v0.1.1...v0.2.0
317
+ [0.1.1]: https://github.com/Samyssmile/construct/compare/v0.1.0...v0.1.1
318
+ [0.1.0]: https://github.com/Samyssmile/construct/releases/tag/v0.1.0