@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.
- package/CHANGELOG.md +318 -0
- package/README.md +158 -149
- package/behaviors/combobox.js +486 -0
- package/behaviors/drawer.js +18 -0
- package/behaviors/dropdown.js +310 -0
- package/behaviors/index.d.ts +335 -0
- package/behaviors/index.js +9 -0
- package/behaviors/internal/dialog-controller.js +421 -0
- package/behaviors/internal/dom.js +408 -0
- package/behaviors/internal/overlay.js +241 -0
- package/behaviors/internal/popup-layer.js +190 -0
- package/behaviors/modal.js +17 -0
- package/behaviors/popover.js +278 -0
- package/behaviors/select-menu.js +344 -0
- package/behaviors/tabs.js +241 -0
- package/behaviors/toggle-group.js +266 -0
- package/behaviors/tooltip.js +257 -0
- package/components/README.md +319 -83
- package/components/_shared.css +22 -10
- package/components/_shell-shared.css +20 -4
- package/components/accordion.css +8 -0
- package/components/app-shell-v2.css +28 -14
- package/components/app-shell.css +30 -14
- package/components/badge.css +15 -0
- package/components/banner.css +32 -1
- package/components/button.css +103 -15
- package/components/card.css +67 -8
- package/components/chart.css +26 -0
- package/components/checkbox.css +35 -2
- package/components/chip.css +30 -2
- package/components/combobox.css +21 -0
- package/components/datepicker.css +58 -9
- package/components/datum.css +277 -0
- package/components/dropdown.css +23 -3
- package/components/field.css +6 -4
- package/components/file-upload.css +1 -1
- package/components/index.css +5 -0
- package/components/list.css +28 -2
- package/components/meter.css +182 -0
- package/components/navbar.css +102 -4
- package/components/pagination.css +18 -0
- package/components/progress-bar.css +22 -1
- package/components/select-menu.css +8 -0
- package/components/select.css +8 -0
- package/components/sidebar.css +15 -2
- package/components/skip-link.css +6 -2
- package/components/slider.css +7 -1
- package/components/status.css +107 -0
- package/components/switch.css +66 -5
- package/components/table.css +53 -4
- package/components/tabs.css +55 -3
- package/components/toast.css +10 -1
- package/components/toggle-group.css +16 -5
- package/components/toolbar.css +17 -1
- package/components/tooltip.css +4 -0
- package/components/tree.css +30 -0
- package/docs/architecture.md +79 -0
- package/docs/behaviors.md +122 -0
- package/docs/fonts.md +70 -0
- package/docs/governance.md +85 -0
- package/docs/guidelines.md +72 -25
- package/examples/react/README.md +20 -0
- package/examples/react/SettingsModal.jsx +66 -0
- package/examples/react/construct.css +5 -0
- package/fonts.css +10 -0
- package/foundations.css +14 -1
- package/package.json +76 -21
- package/schemas/components.schema.json +122 -0
- package/schemas/examples/theme.example.json +27 -0
- package/schemas/primitives.schema.json +135 -0
- package/schemas/semantic.schema.json +224 -0
- package/schemas/theme.schema.json +63 -0
- package/scripts/build-tokens.mjs +1499 -0
- package/scripts/construct-theme.mjs +43 -0
- package/scripts/validate-tokens.mjs +25 -0
- package/standalone/accordion.css +3 -0
- package/standalone/alert.css +3 -0
- package/standalone/app-shell-v2.css +4 -0
- package/standalone/app-shell.css +4 -0
- package/standalone/avatar.css +3 -0
- package/standalone/badge.css +3 -0
- package/standalone/banner.css +3 -0
- package/standalone/breadcrumbs.css +3 -0
- package/standalone/button.css +3 -0
- package/standalone/card.css +3 -0
- package/standalone/chart.css +3 -0
- package/standalone/checkbox.css +3 -0
- package/standalone/chip.css +3 -0
- package/standalone/combobox.css +3 -0
- package/standalone/core.css +4 -0
- package/standalone/data-table.css +3 -0
- package/standalone/datepicker.css +3 -0
- package/standalone/datum.css +3 -0
- package/standalone/divider.css +3 -0
- package/standalone/drawer.css +3 -0
- package/standalone/dropdown.css +3 -0
- package/standalone/empty-state.css +3 -0
- package/standalone/field.css +3 -0
- package/standalone/file-upload.css +3 -0
- package/standalone/icon.css +3 -0
- package/standalone/input.css +3 -0
- package/standalone/list.css +3 -0
- package/standalone/meter.css +3 -0
- package/standalone/modal.css +3 -0
- package/standalone/navbar.css +3 -0
- package/standalone/pagination.css +3 -0
- package/standalone/popover.css +3 -0
- package/standalone/progress-bar.css +3 -0
- package/standalone/select-menu.css +3 -0
- package/standalone/select.css +3 -0
- package/standalone/sidebar.css +3 -0
- package/standalone/skeleton.css +3 -0
- package/standalone/skip-link.css +3 -0
- package/standalone/slider.css +3 -0
- package/standalone/spinner.css +3 -0
- package/standalone/status.css +3 -0
- package/standalone/switch.css +3 -0
- package/standalone/table.css +3 -0
- package/standalone/tabs.css +3 -0
- package/standalone/textarea.css +3 -0
- package/standalone/toast.css +3 -0
- package/standalone/toggle-group.css +3 -0
- package/standalone/toolbar.css +3 -0
- package/standalone/tooltip.css +3 -0
- package/standalone/tree.css +3 -0
- package/themes/README.md +37 -0
- package/themes/walnut.theme.json +106 -0
- package/tokens/README.md +135 -123
- package/tokens/components.json +64 -0
- package/tokens/primitives.json +268 -0
- package/tokens/semantic.dark.json +94 -0
- package/tokens/semantic.high-contrast-dark.json +94 -0
- package/tokens/semantic.high-contrast.json +94 -0
- package/tokens/semantic.light.json +179 -0
- package/tokens/tokens.css +960 -58
- package/tokens/tokens.js +729 -120
- package/tokens/tokens.json +1158 -116
- package/tokens/tokens.ts +729 -120
package/README.md
CHANGED
|
@@ -1,230 +1,239 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://samyssmile.github.io/construct/)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
# Construct
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**A token-based, framework-agnostic design system for accessible, modern web UI.**
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- **TypeScript Support** - Full type definitions for tokens
|
|
9
|
+
[](https://www.npmjs.com/package/@neuravision/construct)
|
|
10
|
+
[](https://www.npmjs.com/package/@neuravision/construct)
|
|
11
|
+
[](https://samyssmile.github.io/construct/)
|
|
12
|
+
[](https://github.com/Samyssmile/construct/actions/workflows/deploy-storybook.yml)
|
|
13
|
+
[](docs/guidelines.md)
|
|
14
|
+
[](LICENSE)
|
|
15
|
+
[](CONTRIBUTING.md)
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
[**Live Storybook**](https://samyssmile.github.io/construct/) · [Components](#-components) · [Design Tokens](#-design-tokens) · [Accessibility](#-accessibility) · [Contributing](CONTRIBUTING.md)
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Why Construct?
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
Construct is a **single source of design truth** that ships portable CSS, validated design tokens, and opt-in headless behaviors — without framework lock-in. Style values live once as JSON tokens and compile to CSS custom properties, JSON, and typed TypeScript exports. Components use `ct-` classes and ARIA/data state, so they work anywhere that renders DOM.
|
|
26
|
+
|
|
27
|
+
- 🎯 **Three token layers** — primitive, semantic, and component contracts with schema and contrast validation
|
|
28
|
+
- 🧩 **Framework-agnostic** — 49 standalone component style entries and a full CSS bundle
|
|
29
|
+
- ♿ **Accessibility first** — WCAG 2.2 AA targets, tested ARIA/keyboard controllers, focus and forced-colors contracts
|
|
30
|
+
- ⚙️ **Optional behavior** — nine typed, dependency-free ESM controllers; importing CSS never starts JavaScript
|
|
31
|
+
- 🎨 **Three themes** — `light`, `dark`, `high-contrast`, with system-preference fallback
|
|
32
|
+
- 📐 **The "datum" grammar** — a signature orange reference line for focus / active / current state
|
|
33
|
+
- 🛠️ **Typed tokens** — autocomplete-friendly TypeScript exports
|
|
34
|
+
- 📖 **Interactive docs** — every component documented & a11y-tested in [Storybook](https://samyssmile.github.io/construct/)
|
|
35
|
+
|
|
36
|
+
## 📦 Installation
|
|
21
37
|
|
|
22
38
|
```bash
|
|
23
39
|
npm install @neuravision/construct
|
|
24
40
|
```
|
|
25
41
|
|
|
26
|
-
|
|
42
|
+
Using Angular? Reach for the official wrapper [**@neuravision/ng-construct**](https://github.com/Samyssmile/ng-construct) — typed, signal-based components built on top of these styles.
|
|
27
43
|
|
|
28
|
-
|
|
44
|
+
## 🚀 Quick Start
|
|
45
|
+
|
|
46
|
+
Import the foundation styles and the component bundle once (e.g. in your global stylesheet):
|
|
29
47
|
|
|
30
48
|
```css
|
|
31
49
|
@import "@neuravision/construct/foundations.css";
|
|
32
50
|
@import "@neuravision/construct/components/components.css";
|
|
33
51
|
```
|
|
34
52
|
|
|
35
|
-
|
|
53
|
+
Then use the classes in your markup:
|
|
36
54
|
|
|
37
55
|
```html
|
|
38
|
-
<button class="ct-button">Primary
|
|
39
|
-
<button class="ct-button ct-button--secondary">Secondary</button>
|
|
56
|
+
<button class="ct-button" type="button">Primary</button>
|
|
57
|
+
<button class="ct-button ct-button--secondary" type="button">Secondary</button>
|
|
58
|
+
|
|
59
|
+
<div class="ct-field">
|
|
60
|
+
<label class="ct-field__label" for="email">Email</label>
|
|
61
|
+
<input class="ct-input" id="email" type="email" placeholder="name@company.com" />
|
|
62
|
+
</div>
|
|
40
63
|
```
|
|
41
64
|
|
|
42
|
-
Or
|
|
65
|
+
Or build custom UI directly on the tokens:
|
|
43
66
|
|
|
44
67
|
```css
|
|
45
|
-
.custom-
|
|
46
|
-
background: var(--color-
|
|
68
|
+
.custom-card {
|
|
69
|
+
background: var(--color-bg-surface);
|
|
70
|
+
color: var(--color-text-primary);
|
|
47
71
|
padding: var(--space-4);
|
|
48
72
|
border-radius: var(--radius-control);
|
|
49
73
|
}
|
|
50
74
|
```
|
|
51
75
|
|
|
52
|
-
|
|
76
|
+
> 💡 Need a smaller bundle? Import a generated standalone style entry such as
|
|
77
|
+
> `@import "@neuravision/construct/components/button.css";`. Related public patterns can share an
|
|
78
|
+
> entry: Radio is included in `checkbox.css`, and Metric is included in `datum.css`.
|
|
53
79
|
|
|
54
|
-
|
|
80
|
+
Composite widgets can use the optional behavior entry instead of reimplementing keyboard and focus state machines:
|
|
55
81
|
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
...
|
|
59
|
-
</html>
|
|
82
|
+
```js
|
|
83
|
+
import { createModalController } from '@neuravision/construct/behaviors';
|
|
60
84
|
```
|
|
61
85
|
|
|
62
|
-
|
|
63
|
-
- `light` (default)
|
|
64
|
-
- `dark`
|
|
65
|
-
- `high-contrast`
|
|
86
|
+
Foundations make no network request. Import `@neuravision/construct/fonts.css` before foundations only when the product explicitly accepts the hosted-font privacy and CSP tradeoff; self-hosting is documented in [docs/fonts.md](docs/fonts.md).
|
|
66
87
|
|
|
67
|
-
|
|
68
|
-
- `prefers-color-scheme: dark` → dark theme
|
|
69
|
-
- `prefers-contrast: more` → high-contrast theme
|
|
88
|
+
## 🎨 Theming
|
|
70
89
|
|
|
71
|
-
|
|
90
|
+
Set `data-theme` on the root element (or any container) to switch modes:
|
|
72
91
|
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
├── tokens/ # Design tokens (JSON, CSS, JS, TS)
|
|
76
|
-
│ ├── primitives.json # Base values (colors, sizes)
|
|
77
|
-
│ ├── semantic.light.json # Semantic mappings
|
|
78
|
-
│ ├── semantic.dark.json # Dark theme overrides
|
|
79
|
-
│ ├── semantic.high-contrast.json # High-contrast theme overrides
|
|
80
|
-
│ ├── tokens.css # CSS Custom Properties
|
|
81
|
-
│ ├── tokens.json # Resolved JSON output
|
|
82
|
-
│ ├── tokens.js # JavaScript exports
|
|
83
|
-
│ └── tokens.ts # TypeScript exports
|
|
84
|
-
├── components/ # Framework-agnostic styles
|
|
85
|
-
│ ├── components.css # All component styles
|
|
86
|
-
│ └── README.md # Component documentation
|
|
87
|
-
├── foundations.css # Reset, typography, layout utilities
|
|
88
|
-
└── docs/ # Guidelines & best practices
|
|
89
|
-
└── guidelines.md
|
|
92
|
+
```html
|
|
93
|
+
<html data-theme="dark"> … </html>
|
|
90
94
|
```
|
|
91
95
|
|
|
92
|
-
|
|
96
|
+
| Value | Description |
|
|
97
|
+
|-------|-------------|
|
|
98
|
+
| `light` | Default theme |
|
|
99
|
+
| `dark` | Dark theme |
|
|
100
|
+
| `high-contrast` | Maximum-contrast theme |
|
|
93
101
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
"color": {
|
|
102
|
-
"stone": {
|
|
103
|
-
"950": "#16130F"
|
|
104
|
-
},
|
|
105
|
-
"orange": {
|
|
106
|
-
"500": "#F4581C"
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
"space": {
|
|
110
|
-
"4": 8
|
|
111
|
-
}
|
|
112
|
-
}
|
|
102
|
+
With **no** `data-theme` set, Construct respects system preferences automatically:
|
|
103
|
+
`prefers-color-scheme: dark` → dark, `prefers-contrast: more` → high-contrast.
|
|
104
|
+
|
|
105
|
+
Validated product themes can extend a built-in theme without copying generated CSS:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx construct-theme --theme ./brand.theme.json --out-dir ./src/generated/construct
|
|
113
109
|
```
|
|
114
110
|
|
|
115
|
-
|
|
116
|
-
Contextual aliases that reference primitives
|
|
111
|
+
Load the generated token stylesheet after all Construct style entries, because foundations and component entries include the built-in token sheet themselves:
|
|
117
112
|
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
"primary": "{color.stone.950}"
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
113
|
+
```css
|
|
114
|
+
@import '@neuravision/construct/foundations.css';
|
|
115
|
+
@import '@neuravision/construct/components/components.css';
|
|
116
|
+
@import './generated/construct/tokens.css';
|
|
126
117
|
```
|
|
127
118
|
|
|
128
|
-
|
|
119
|
+
Application-specific overrides may follow it. Keeping the generated theme last among Construct imports ensures its root and scoped values win deterministically.
|
|
129
120
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
121
|
+
### Preset themes
|
|
122
|
+
|
|
123
|
+
The package ships validated preset themes in [`themes/`](themes/README.md) — brand skins that
|
|
124
|
+
compile through the same CLI instead of being baked into `tokens.css`:
|
|
134
125
|
|
|
135
126
|
```bash
|
|
136
|
-
|
|
127
|
+
npx construct-theme --theme node_modules/@neuravision/construct/themes/walnut.theme.json --out-dir ./src/generated/construct
|
|
137
128
|
```
|
|
138
129
|
|
|
130
|
+
| Preset | Character |
|
|
131
|
+
|--------|-----------|
|
|
132
|
+
| `walnut` | Warm ivory light theme with walnut-brown brand color; AAA body-text contrast enforced by built-in gates |
|
|
133
|
+
|
|
139
134
|
## 🧩 Components
|
|
140
135
|
|
|
141
|
-
|
|
142
|
-
- Button (6 variants, 3 sizes)
|
|
143
|
-
- Input (text, email, password, search)
|
|
144
|
-
- Select (native dropdown)
|
|
145
|
-
- Textarea
|
|
146
|
-
- Checkbox
|
|
147
|
-
- Radio
|
|
148
|
-
- Switch
|
|
149
|
-
|
|
150
|
-
### Complex Components
|
|
151
|
-
- Card
|
|
152
|
-
- Table / Data Table
|
|
153
|
-
- Modal
|
|
154
|
-
- Toast (notifications)
|
|
155
|
-
- Tabs
|
|
156
|
-
- Dropdown
|
|
157
|
-
- Pagination
|
|
158
|
-
- Breadcrumbs
|
|
159
|
-
- Datepicker
|
|
160
|
-
|
|
161
|
-
[View all components in Storybook](https://samyssmile.github.io/construct/)
|
|
136
|
+
49 standalone component style entries, documented and accessibility-tested in [Storybook](https://samyssmile.github.io/construct/).
|
|
162
137
|
|
|
163
|
-
|
|
138
|
+
| Category | Components |
|
|
139
|
+
|----------|-----------|
|
|
140
|
+
| **Actions** | Button · Toggle Group · Toolbar |
|
|
141
|
+
| **Forms & Inputs** | Field · Input · Textarea · Select · Select Menu · Checkbox · Radio · Switch · Slider · Combobox · Chip · File Upload · Datepicker |
|
|
142
|
+
| **Data Display** | Table · Data Table · List · Tree · Avatar · Badge · Icon · Tooltip · Chart · Metric · Meter |
|
|
143
|
+
| **Feedback** | Alert · Banner · Toast · Spinner · Skeleton · Progress Bar · Status · Empty State |
|
|
144
|
+
| **Navigation** | Navbar · Breadcrumbs · Tabs · Pagination · Sidebar · Skip Link |
|
|
145
|
+
| **Overlays** | Modal · Drawer · Popover · Dropdown |
|
|
146
|
+
| **Layout** | Card · Divider · Accordion · App Shell (V1 compatibility + V2 recommended) |
|
|
164
147
|
|
|
165
|
-
|
|
148
|
+
→ [**Explore every component in the live Storybook**](https://samyssmile.github.io/construct/)
|
|
166
149
|
|
|
167
|
-
|
|
168
|
-
- ✅ ARIA attributes where needed
|
|
169
|
-
- ✅ Full keyboard navigation
|
|
170
|
-
- ✅ Focus management
|
|
171
|
-
- ✅ WCAG 2.1 AA contrast standards
|
|
172
|
-
- ✅ Screen reader support
|
|
173
|
-
- ✅ Respects `prefers-reduced-motion`
|
|
174
|
-
- ✅ Live regions for dynamic content
|
|
150
|
+
## 🎨 Design Tokens
|
|
175
151
|
|
|
176
|
-
|
|
152
|
+
Construct uses a **three-layer token system**: raw *primitives*, theme-aware *semantic* aliases, and stable *component* decisions.
|
|
177
153
|
|
|
178
|
-
|
|
154
|
+
```jsonc
|
|
155
|
+
// primitives — raw values
|
|
156
|
+
{ "color": { "orange": { "500": "#F4581C" }, "stone": { "950": "#16130F" } }, "space": { "4": 8 } }
|
|
179
157
|
|
|
180
|
-
|
|
158
|
+
// semantic — contextual aliases that reference primitives
|
|
159
|
+
{ "color": { "brand": { "primary": "{color.stone.950}", "accent": "{color.orange.500}" } } }
|
|
181
160
|
|
|
182
|
-
|
|
183
|
-
|
|
161
|
+
// component — reusable component decisions
|
|
162
|
+
{ "button": { "height": "{size.controlHeight.md}", "radius": "{radius.control}" } }
|
|
184
163
|
```
|
|
185
164
|
|
|
186
|
-
|
|
165
|
+
The build pipeline (`npm run build`) compiles `tokens/*.json` into:
|
|
187
166
|
|
|
188
|
-
|
|
167
|
+
- **`tokens.css`** — CSS custom properties (`--color-brand-accent`)
|
|
168
|
+
- **`tokens.json`** — resolved values for tooling
|
|
169
|
+
- **`tokens.ts` / `tokens.js`** — typed exports
|
|
189
170
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
171
|
+
> ⚠️ Never hand-edit generated files (`tokens/tokens.*`). Edit the source JSON and run `npm run build`.
|
|
172
|
+
|
|
173
|
+
## ♿ Accessibility
|
|
193
174
|
|
|
194
|
-
|
|
175
|
+
Accessibility is a first-class requirement, not an afterthought:
|
|
176
|
+
|
|
177
|
+
- ✅ Semantic HTML and explicit ARIA/data-state markup contracts
|
|
178
|
+
- ✅ Optional tested keyboard behavior (roving tabindex, focus traps, arrows, typeahead, focus return)
|
|
179
|
+
- ✅ Visible focus indicators (the orange "datum")
|
|
180
|
+
- ✅ Automated WCAG contrast pairs across built-in and custom themes
|
|
181
|
+
- ✅ Screen-reader semantics and documented live-region patterns for dynamic content
|
|
182
|
+
- ✅ Respects `prefers-reduced-motion`
|
|
183
|
+
|
|
184
|
+
The Storybook a11y addon is configured to **fail the build on violations**. See [docs/guidelines.md](docs/guidelines.md) for the detailed patterns.
|
|
185
|
+
|
|
186
|
+
## 🧰 Tech & Tooling
|
|
187
|
+
|
|
188
|
+
| | |
|
|
189
|
+
|---|---|
|
|
190
|
+
| **Distribution** | Plain CSS + design tokens + optional dependency-free ESM behaviors |
|
|
191
|
+
| **Docs & tests** | Storybook 10 · Vitest 4 · Playwright (story-driven) |
|
|
192
|
+
| **a11y testing** | `@storybook/addon-a11y` (fails on violations) |
|
|
193
|
+
| **Token build** | Custom pipeline (`scripts/build-tokens.mjs`) |
|
|
194
|
+
|
|
195
|
+
## 🛠️ Local Development
|
|
195
196
|
|
|
196
197
|
```bash
|
|
197
|
-
npm
|
|
198
|
+
npm install # install dependencies
|
|
199
|
+
npm run storybook # dev server → http://localhost:6006
|
|
200
|
+
npm run audit # reject high/critical dependency advisories
|
|
201
|
+
npm run build # build token and standalone CSS outputs
|
|
202
|
+
npm run check # verify generated, schema, contrast, CSS, export & version contracts
|
|
203
|
+
npm test # run behavior, Storybook, touch & forced-colors browser tests
|
|
198
204
|
```
|
|
199
205
|
|
|
200
206
|
## 🎯 Framework Support
|
|
201
207
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
- Svelte (Svelte 4+)
|
|
208
|
+
| Framework | Status |
|
|
209
|
+
|-----------|--------|
|
|
210
|
+
| **Vanilla HTML / CSS** | ✅ Available — use the `ct-` classes directly |
|
|
211
|
+
| **Angular** | ✅ Available — [`@neuravision/ng-construct`](https://github.com/Samyssmile/ng-construct) |
|
|
212
|
+
| **React** | ✅ CSS + headless controllers; [lifecycle example](examples/react/README.md) |
|
|
213
|
+
| **Svelte** | ✅ CSS + headless controllers |
|
|
209
214
|
|
|
210
215
|
## 📖 Documentation
|
|
211
216
|
|
|
212
|
-
- [Design Guidelines](docs/guidelines.md)
|
|
213
|
-
- [Component Usage](components/README.md)
|
|
214
|
-
- [Token
|
|
217
|
+
- [Design Guidelines](docs/guidelines.md) — do's, don'ts & accessibility patterns
|
|
218
|
+
- [Component Usage](components/README.md) — HTML patterns and examples
|
|
219
|
+
- [Token Reference](tokens/README.md) — token structure & naming
|
|
220
|
+
- [Architecture](docs/architecture.md) — package layers and ownership boundaries
|
|
221
|
+
- [Headless Behaviors](docs/behaviors.md) — typed controllers and lifecycle
|
|
222
|
+
- [Fonts](docs/fonts.md) — network-free defaults, hosted opt-in, self-hosting
|
|
223
|
+
- [Governance](docs/governance.md) — Definition of Done and release gates
|
|
224
|
+
- [Changelog](CHANGELOG.md) — release history
|
|
215
225
|
|
|
216
226
|
## 🤝 Contributing
|
|
217
227
|
|
|
218
|
-
Contributions are welcome! Please read
|
|
228
|
+
Contributions are welcome! Please read the [Contributing Guide](CONTRIBUTING.md) and our
|
|
229
|
+
[Code of Conduct](CODE_OF_CONDUCT.md) before opening a PR. Found a security issue? See [SECURITY.md](SECURITY.md).
|
|
219
230
|
|
|
220
231
|
## 📄 License
|
|
221
232
|
|
|
222
|
-
MIT
|
|
223
|
-
|
|
224
|
-
## 🙏 Credits
|
|
225
|
-
|
|
226
|
-
Built with accessibility and modern design principles in mind.
|
|
233
|
+
[MIT](LICENSE) © Construct contributors
|
|
227
234
|
|
|
228
235
|
---
|
|
229
236
|
|
|
230
|
-
|
|
237
|
+
<div align="center">
|
|
238
|
+
<sub>Built with accessibility and modern design principles in mind · <a href="https://samyssmile.github.io/construct/">Live Storybook</a></sub>
|
|
239
|
+
</div>
|