@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/README.md CHANGED
@@ -1,230 +1,239 @@
1
- # Construct - Design System
1
+ <div align="center">
2
2
 
3
- > Build accessible design constructs for modern web applications
3
+ [![Construct — token-based, framework-agnostic, accessible UI](.github/assets/banner.png)](https://samyssmile.github.io/construct/)
4
4
 
5
- **Construct** is an open-source, token-based design system foundation that provides a consistent, accessible UI across Angular, React, Svelte, and vanilla HTML/CSS.
5
+ # Construct
6
6
 
7
- ## ✨ Features
7
+ **A token-based, framework-agnostic design system for accessible, modern web UI.**
8
8
 
9
- - **Design Tokens** - Single source of truth for colors, typography, spacing, and more
10
- - **Framework-Agnostic CSS** - Works with any framework or vanilla HTML
11
- - **Accessibility First** - WCAG 2.1 AA compliant, keyboard navigation, ARIA support
12
- - **Themes** - Light, dark, and high-contrast modes with system preference support
13
- - **Token Pipeline** - Automated build system (JSON → CSS Variables + TypeScript)
14
- - **Comprehensive Components** - 16+ production-ready components
15
- - **Storybook Documentation** - Interactive component explorer with a11y testing
16
- - **TypeScript Support** - Full type definitions for tokens
9
+ [![npm version](https://img.shields.io/npm/v/@neuravision/construct?color=F4581C&label=npm&logo=npm)](https://www.npmjs.com/package/@neuravision/construct)
10
+ [![npm downloads](https://img.shields.io/npm/dm/@neuravision/construct?color=F4581C)](https://www.npmjs.com/package/@neuravision/construct)
11
+ [![Storybook](https://img.shields.io/badge/Storybook-live-FF4785?logo=storybook&logoColor=white)](https://samyssmile.github.io/construct/)
12
+ [![Deploy](https://img.shields.io/github/actions/workflow/status/Samyssmile/construct/deploy-storybook.yml?branch=main&label=storybook%20build)](https://github.com/Samyssmile/construct/actions/workflows/deploy-storybook.yml)
13
+ [![WCAG 2.2 AA target](https://img.shields.io/badge/WCAG_2.2-AA_target-2ea44f)](docs/guidelines.md)
14
+ [![License: MIT](https://img.shields.io/npm/l/@neuravision/construct?color=2ea44f)](LICENSE)
15
+ [![PRs welcome](https://img.shields.io/badge/PRs-welcome-2ea44f)](CONTRIBUTING.md)
17
16
 
18
- ## 🚀 Quick Start
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
- ### Installation
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
- ### Usage
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
- Import the foundation styles and components:
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
- Use the components in your HTML:
53
+ Then use the classes in your markup:
36
54
 
37
55
  ```html
38
- <button class="ct-button">Primary Button</button>
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 use design tokens directly:
65
+ Or build custom UI directly on the tokens:
43
66
 
44
67
  ```css
45
- .custom-component {
46
- background: var(--color-brand-primary);
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
- ### Themes
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
- Set a theme on the root element (or any container) to switch modes:
80
+ Composite widgets can use the optional behavior entry instead of reimplementing keyboard and focus state machines:
55
81
 
56
- ```html
57
- <html data-theme="dark">
58
- ...
59
- </html>
82
+ ```js
83
+ import { createModalController } from '@neuravision/construct/behaviors';
60
84
  ```
61
85
 
62
- Available values:
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
- If no `data-theme` is set, system preferences are respected:
68
- - `prefers-color-scheme: dark` → dark theme
69
- - `prefers-contrast: more` → high-contrast theme
88
+ ## 🎨 Theming
70
89
 
71
- ## 📦 What's Included
90
+ Set `data-theme` on the root element (or any container) to switch modes:
72
91
 
73
- ```
74
- @neuravision/construct/
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
- ## 🎨 Design Tokens
96
+ | Value | Description |
97
+ |-------|-------------|
98
+ | `light` | Default theme |
99
+ | `dark` | Dark theme |
100
+ | `high-contrast` | Maximum-contrast theme |
93
101
 
94
- Construct uses a two-tier token system:
95
-
96
- ### Primitives
97
- Raw design values (colors, spacing, typography)
98
-
99
- ```json
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
- ### Semantic
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
- ```json
119
- {
120
- "color": {
121
- "brand": {
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
- ### Build Pipeline
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
- The token build system automatically generates:
131
- - **CSS Variables** (`--color-brand-primary`)
132
- - **TypeScript exports** with type definitions
133
- - **Resolved JSON** for tooling
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
- npm run build
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
- ### Base Components
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
- ## ♿ Accessibility
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
- Accessibility is a core principle of Construct:
148
+ → [**Explore every component in the live Storybook**](https://samyssmile.github.io/construct/)
166
149
 
167
- - ✅ Semantic HTML
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
- See [Guidelines](docs/guidelines.md) for detailed accessibility rules.
152
+ Construct uses a **three-layer token system**: raw *primitives*, theme-aware *semantic* aliases, and stable *component* decisions.
177
153
 
178
- ## 🛠️ Development
154
+ ```jsonc
155
+ // primitives — raw values
156
+ { "color": { "orange": { "500": "#F4581C" }, "stone": { "950": "#16130F" } }, "space": { "4": 8 } }
179
157
 
180
- ### Run Storybook
158
+ // semantic — contextual aliases that reference primitives
159
+ { "color": { "brand": { "primary": "{color.stone.950}", "accent": "{color.orange.500}" } } }
181
160
 
182
- ```bash
183
- npm run storybook
161
+ // component — reusable component decisions
162
+ { "button": { "height": "{size.controlHeight.md}", "radius": "{radius.control}" } }
184
163
  ```
185
164
 
186
- Open http://localhost:6006
165
+ The build pipeline (`npm run build`) compiles `tokens/*.json` into:
187
166
 
188
- ### Build Tokens
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
- ```bash
191
- npm run build
192
- ```
171
+ > ⚠️ Never hand-edit generated files (`tokens/tokens.*`). Edit the source JSON and run `npm run build`.
172
+
173
+ ## ♿ Accessibility
193
174
 
194
- ### Check Token Outputs
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 run check
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
- ### Current: CSS/HTML
203
- All components work with vanilla HTML and can be used with any framework.
204
-
205
- ### Planned: Framework Libraries
206
- - Angular (standalone components)
207
- - React (React 18+)
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) - Do/Don'ts, accessibility rules
213
- - [Component Usage](components/README.md) - HTML patterns and examples
214
- - [Token Details](tokens/README.md) - Token structure and naming
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 our contributing guidelines (coming soon).
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 License - see LICENSE file for details
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
- **Construct** - Build accessible design constructs
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>