@spark-web/design-system 5.0.99 → 5.1.0
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/CLAUDE.md +274 -0
- package/ai-context/layer-1-root.md +158 -0
- package/ai-context/layer-2-surface-pattern.md +236 -0
- package/ai-context/layer-3-component.md +271 -0
- package/dist/declarations/src/index.d.ts +8 -0
- package/dist/spark-web-design-system.cjs.dev.js +56 -0
- package/dist/spark-web-design-system.cjs.prod.js +56 -0
- package/dist/spark-web-design-system.esm.js +8 -0
- package/package.json +25 -14
- package/patterns/CLAUDE.md +67 -0
- package/patterns/internal-admin/CLAUDE.md +126 -0
- package/patterns/internal-admin/list-page.md +558 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Layer 3 — Component CLAUDE.md files
|
|
2
|
+
|
|
3
|
+
## What this layer is
|
|
4
|
+
|
|
5
|
+
Every component package that an agent is expected to use gets its own
|
|
6
|
+
`CLAUDE.md` inside `packages/[component]/`. This file is the agent's contract
|
|
7
|
+
for that component: what it does, how its pieces fit together, what tokens to
|
|
8
|
+
use, and what it must never do.
|
|
9
|
+
|
|
10
|
+
This is the most granular layer. It is read last — only after the surface
|
|
11
|
+
classifier, surface rules, and feature pattern have already been read. By the
|
|
12
|
+
time the agent reaches this file it already knows _which_ components to use and
|
|
13
|
+
_why_. This file tells it _how_.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Where these files live
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
packages/
|
|
21
|
+
table/
|
|
22
|
+
CLAUDE.md ← component rules for @spark-web/table
|
|
23
|
+
src/
|
|
24
|
+
Table.tsx
|
|
25
|
+
table.stories.tsx
|
|
26
|
+
table.test.tsx
|
|
27
|
+
status-badge/
|
|
28
|
+
CLAUDE.md
|
|
29
|
+
meatball/
|
|
30
|
+
CLAUDE.md
|
|
31
|
+
header/
|
|
32
|
+
CLAUDE.md
|
|
33
|
+
...
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
One `CLAUDE.md` per package. Not one per sub-component — one per package.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Anatomy of a component CLAUDE.md
|
|
41
|
+
|
|
42
|
+
The sections below are the standard structure. Every component file should
|
|
43
|
+
follow this shape. Use `@spark-web/table` as the reference example.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### Section 1 — What this package is
|
|
48
|
+
|
|
49
|
+
One short paragraph. Plain language. States the component's purpose and its
|
|
50
|
+
compositional structure (sub-components, if any).
|
|
51
|
+
|
|
52
|
+
```markdown
|
|
53
|
+
## What this package is
|
|
54
|
+
|
|
55
|
+
A composable table component for displaying tabular data. Five sub-components
|
|
56
|
+
used together: Table, TableHeaderRow, TableHeaderCell, TableRow, TableCell.
|
|
57
|
+
Optional TablePagination is a separate compositional layer used OUTSIDE Table.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
### Section 2 — What this package is NOT
|
|
63
|
+
|
|
64
|
+
Equally important. Explicitly rules out common misuses. This prevents the agent
|
|
65
|
+
from reaching for this component when a different one is needed, and prevents it
|
|
66
|
+
from adding features the component was never designed to have.
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
## What this package is NOT
|
|
70
|
+
|
|
71
|
+
- Not a data-grid. No virtual scrolling, column reordering, or column resizing.
|
|
72
|
+
- Not a standalone component. TableRow and TableCell are meaningless outside
|
|
73
|
+
Table.
|
|
74
|
+
- Not responsible for data fetching, sorting, or filtering.
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### Section 3 — Component hierarchy
|
|
80
|
+
|
|
81
|
+
Shows the parent/child relationship between sub-components. For simple single-
|
|
82
|
+
component packages this can be omitted. For composable packages it is essential.
|
|
83
|
+
|
|
84
|
+
```markdown
|
|
85
|
+
## Component hierarchy
|
|
86
|
+
|
|
87
|
+
Table ← scroll container, layout owner TableHeaderRow ← always first child of
|
|
88
|
+
Table TableHeaderCell ← one per column, owns sort state TableRow (× n) ← one per
|
|
89
|
+
data row, owns row state TableCell (× n) ← one per column per row
|
|
90
|
+
TableRow[state=loading] ← replaces data rows during fetch, no children
|
|
91
|
+
|
|
92
|
+
TablePagination is always OUTSIDE and BELOW Table — never inside it.
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### Section 4 — Token usage
|
|
98
|
+
|
|
99
|
+
All design token values the component uses, grouped by category. This is the
|
|
100
|
+
most mechanical section and must be exhaustive — if a token is omitted the agent
|
|
101
|
+
will either guess or use a raw value.
|
|
102
|
+
|
|
103
|
+
Every token must reference `useTheme()` from `@spark-web/theme`. Raw hex values,
|
|
104
|
+
pixel values, and Tailwind classes are never acceptable.
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
## Token usage
|
|
108
|
+
|
|
109
|
+
All values from useTheme() from @spark-web/theme.
|
|
110
|
+
|
|
111
|
+
### Spacing tokens
|
|
112
|
+
|
|
113
|
+
Cell padding all sides: theme.spacing.large Header cell padding horizontal:
|
|
114
|
+
theme.spacing.large Pagination gap between buttons: theme.spacing.small
|
|
115
|
+
|
|
116
|
+
### Color tokens
|
|
117
|
+
|
|
118
|
+
Cell background default: theme.color.background.surface Cell background hover:
|
|
119
|
+
theme.color.background.inputPressed Cell text default:
|
|
120
|
+
theme.color.foreground.neutral Header cell background:
|
|
121
|
+
theme.color.background.surface
|
|
122
|
+
|
|
123
|
+
### Typography
|
|
124
|
+
|
|
125
|
+
Use @spark-web/text for all text. Never raw <p> or <span>. Cell content:
|
|
126
|
+
<Text tone="neutral"> using Body/Small scale Header cell label:
|
|
127
|
+
<Text weight="semibold"> using xSmall scale
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### Section 5 — States (if applicable)
|
|
133
|
+
|
|
134
|
+
For components with visual states, list every valid state, the prop that
|
|
135
|
+
controls it, and the tokens that apply. Be specific about which states interact
|
|
136
|
+
(e.g. hover must not apply when state is disabled).
|
|
137
|
+
|
|
138
|
+
```markdown
|
|
139
|
+
## Row states
|
|
140
|
+
|
|
141
|
+
state prop on TableRow: 'default' | 'selected' | 'disabled' | 'loading' Hover is
|
|
142
|
+
CSS :hover only — not a state prop.
|
|
143
|
+
|
|
144
|
+
default: theme.color.background.surface, text theme.color.foreground.neutral
|
|
145
|
+
hover: theme.color.background.inputPressed, text theme.color.foreground.neutral
|
|
146
|
+
selected: theme.color.background.primarySoft, text
|
|
147
|
+
theme.color.foreground.neutral disabled: theme.color.background.inputDisabled,
|
|
148
|
+
text theme.color.foreground.disabled, pointer-events none loading:
|
|
149
|
+
theme.color.background.surface, renders "Loading" + spinner, ignores children
|
|
150
|
+
|
|
151
|
+
Hover must NOT apply when state is disabled or loading.
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
### Section 6 — Composition rules
|
|
157
|
+
|
|
158
|
+
Numbered constraints on how sub-components must be assembled. These prevent
|
|
159
|
+
structural errors that would silently render incorrectly or break at runtime.
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
## Composition rules
|
|
163
|
+
|
|
164
|
+
1. Table must always contain exactly one TableHeaderRow as its first child.
|
|
165
|
+
2. TableHeaderRow must contain one TableHeaderCell per column.
|
|
166
|
+
3. TableRow must contain the same number of TableCell children as header
|
|
167
|
+
columns.
|
|
168
|
+
4. A loading TableRow ignores all children.
|
|
169
|
+
5. TablePagination is always a sibling of Table, never a child.
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
### Section 7 — Do NOTs
|
|
175
|
+
|
|
176
|
+
A bulleted list of the most common agent mistakes for this component, stated as
|
|
177
|
+
explicit prohibitions. These should cover the things an agent would most likely
|
|
178
|
+
get wrong if it had only read the component source code without this file.
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
## Do NOTs
|
|
182
|
+
|
|
183
|
+
- NEVER raw hex values e.g. #1a2a3a — always use theme color tokens
|
|
184
|
+
- NEVER raw pixel values e.g. 16px — always use theme spacing/sizing tokens
|
|
185
|
+
- NEVER Tailwind classes — use Emotion CSS-in-JS via useTheme()
|
|
186
|
+
- NEVER TableCell state prop — state on TableRow only
|
|
187
|
+
- NEVER TablePagination inside Table
|
|
188
|
+
- NEVER raw <table> <tr> <th> <td> HTML elements
|
|
189
|
+
- NEVER omit forwardRef
|
|
190
|
+
- NEVER re-implement the status dot/pill inline — use StatusBadge
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## How this layer defers to surface rules
|
|
196
|
+
|
|
197
|
+
A component CLAUDE.md defines _default_ behaviour. Surface rules override those
|
|
198
|
+
defaults for a specific product context.
|
|
199
|
+
|
|
200
|
+
Example: the table component has a hover state. The component CLAUDE.md defines
|
|
201
|
+
the token to use for that hover state. The internal admin surface rules define
|
|
202
|
+
_when_ hover is applied at all (only on clickable rows). The component file does
|
|
203
|
+
not repeat the surface rule — it only documents what the hover state looks like
|
|
204
|
+
when it is applied.
|
|
205
|
+
|
|
206
|
+
If you find yourself writing a rule in a component CLAUDE.md that says "on admin
|
|
207
|
+
pages, do X" — stop. That rule belongs in the surface rules file, not here.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## When to create a component CLAUDE.md
|
|
212
|
+
|
|
213
|
+
Create one when any of the following are true:
|
|
214
|
+
|
|
215
|
+
- The component has sub-components that must be assembled in a specific order
|
|
216
|
+
- The component uses design tokens that an agent would otherwise guess at
|
|
217
|
+
- There are common misuses that would be hard to catch from the component's
|
|
218
|
+
TypeScript types alone
|
|
219
|
+
- The component has states or variants with non-obvious visual behaviour
|
|
220
|
+
- The component depends on another package that must always be used alongside it
|
|
221
|
+
|
|
222
|
+
Do NOT create one for simple, single-element components with no configuration
|
|
223
|
+
surface. If the TypeScript types and stories are sufficient, a CLAUDE.md adds no
|
|
224
|
+
value.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Relationship to Storybook stories
|
|
229
|
+
|
|
230
|
+
The component CLAUDE.md defines rules. The `.stories.tsx` file shows correct
|
|
231
|
+
usage in real-world context. Both are required reading for the agent — the
|
|
232
|
+
CLAUDE.md alone may not cover every prop combination, and stories alone do not
|
|
233
|
+
explain why constraints exist.
|
|
234
|
+
|
|
235
|
+
The reading order from the root file enforces this:
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
4. packages/[component]/CLAUDE.md ← rules
|
|
239
|
+
5. packages/[component]/src/[component].stories.tsx ← usage examples
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Never reference a story in the CLAUDE.md and say "see stories for examples" as a
|
|
243
|
+
substitute for writing out the composition rules. The rules must be explicit in
|
|
244
|
+
this file.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## What happens if this layer is missing or incomplete
|
|
249
|
+
|
|
250
|
+
- The agent uses raw values (`#1a2a3a`, `16px`) instead of theme tokens,
|
|
251
|
+
breaking dark mode support and responsive scaling.
|
|
252
|
+
- Sub-components are assembled in the wrong order or at the wrong nesting level
|
|
253
|
+
(e.g. `TablePagination` inside `Table`).
|
|
254
|
+
- State props are applied to the wrong sub-component.
|
|
255
|
+
- The agent re-implements functionality that already exists in a dependency
|
|
256
|
+
(e.g. builds a custom status pill instead of using `@spark-web/status-badge`).
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Installed component context
|
|
261
|
+
|
|
262
|
+
When `@spark-web/design-system` is installed, component-level CLAUDE.md files
|
|
263
|
+
are available at `node_modules/@spark-web/{name}/CLAUDE.md`. Read the relevant
|
|
264
|
+
file before working with any of the following components:
|
|
265
|
+
|
|
266
|
+
- `node_modules/@spark-web/description-list/CLAUDE.md`
|
|
267
|
+
- `node_modules/@spark-web/highlight-card/CLAUDE.md`
|
|
268
|
+
- `node_modules/@spark-web/overflow-menu/CLAUDE.md`
|
|
269
|
+
- `node_modules/@spark-web/section-card/CLAUDE.md`
|
|
270
|
+
- `node_modules/@spark-web/section-header/CLAUDE.md`
|
|
271
|
+
- `node_modules/@spark-web/tag/CLAUDE.md`
|
|
@@ -15,6 +15,7 @@ export * from '@spark-web/core';
|
|
|
15
15
|
export * from '@spark-web/currency-input';
|
|
16
16
|
export * from '@spark-web/data-table';
|
|
17
17
|
export * from '@spark-web/date-picker';
|
|
18
|
+
export * from '@spark-web/description-list';
|
|
18
19
|
export * from '@spark-web/divider';
|
|
19
20
|
export * from '@spark-web/dropzone';
|
|
20
21
|
export * from '@spark-web/field';
|
|
@@ -22,19 +23,26 @@ export * from '@spark-web/fieldset';
|
|
|
22
23
|
export * from '@spark-web/float-input';
|
|
23
24
|
export * from '@spark-web/heading';
|
|
24
25
|
export * from '@spark-web/hidden';
|
|
26
|
+
export * from '@spark-web/highlight-card';
|
|
25
27
|
export * from '@spark-web/icon';
|
|
26
28
|
export * from '@spark-web/inline';
|
|
27
29
|
export * from '@spark-web/link';
|
|
30
|
+
export * from '@spark-web/meatball-menu';
|
|
28
31
|
export * from '@spark-web/modal-dialog';
|
|
29
32
|
export * from '@spark-web/multi-select';
|
|
30
33
|
export * from '@spark-web/nav-link';
|
|
31
34
|
export * from '@spark-web/toggle-group';
|
|
35
|
+
export * from '@spark-web/page-header';
|
|
32
36
|
export * from '@spark-web/password-input';
|
|
37
|
+
export * from '@spark-web/portal-table';
|
|
33
38
|
export * from '@spark-web/radio';
|
|
34
39
|
export * from '@spark-web/row';
|
|
40
|
+
export * from '@spark-web/section-card';
|
|
41
|
+
export * from '@spark-web/section-header';
|
|
35
42
|
export * from '@spark-web/select';
|
|
36
43
|
export * from '@spark-web/spinner';
|
|
37
44
|
export * from '@spark-web/stack';
|
|
45
|
+
export * from '@spark-web/status-badge';
|
|
38
46
|
export * from '@spark-web/switch';
|
|
39
47
|
export * from '@spark-web/tabs';
|
|
40
48
|
export * from '@spark-web/text';
|
|
@@ -19,6 +19,7 @@ var core = require('@spark-web/core');
|
|
|
19
19
|
var currencyInput = require('@spark-web/currency-input');
|
|
20
20
|
var dataTable = require('@spark-web/data-table');
|
|
21
21
|
var datePicker = require('@spark-web/date-picker');
|
|
22
|
+
var descriptionList = require('@spark-web/description-list');
|
|
22
23
|
var divider = require('@spark-web/divider');
|
|
23
24
|
var dropzone = require('@spark-web/dropzone');
|
|
24
25
|
var field = require('@spark-web/field');
|
|
@@ -26,19 +27,26 @@ var fieldset = require('@spark-web/fieldset');
|
|
|
26
27
|
var floatInput = require('@spark-web/float-input');
|
|
27
28
|
var heading = require('@spark-web/heading');
|
|
28
29
|
var hidden = require('@spark-web/hidden');
|
|
30
|
+
var highlightCard = require('@spark-web/highlight-card');
|
|
29
31
|
var icon = require('@spark-web/icon');
|
|
30
32
|
var inline = require('@spark-web/inline');
|
|
31
33
|
var link = require('@spark-web/link');
|
|
34
|
+
var meatballMenu = require('@spark-web/meatball-menu');
|
|
32
35
|
var modalDialog = require('@spark-web/modal-dialog');
|
|
33
36
|
var multiSelect = require('@spark-web/multi-select');
|
|
34
37
|
var navLink = require('@spark-web/nav-link');
|
|
35
38
|
var toggleGroup = require('@spark-web/toggle-group');
|
|
39
|
+
var pageHeader = require('@spark-web/page-header');
|
|
36
40
|
var passwordInput = require('@spark-web/password-input');
|
|
41
|
+
var portalTable = require('@spark-web/portal-table');
|
|
37
42
|
var radio = require('@spark-web/radio');
|
|
38
43
|
var row = require('@spark-web/row');
|
|
44
|
+
var sectionCard = require('@spark-web/section-card');
|
|
45
|
+
var sectionHeader = require('@spark-web/section-header');
|
|
39
46
|
var select = require('@spark-web/select');
|
|
40
47
|
var spinner = require('@spark-web/spinner');
|
|
41
48
|
var stack = require('@spark-web/stack');
|
|
49
|
+
var statusBadge = require('@spark-web/status-badge');
|
|
42
50
|
var _switch = require('@spark-web/switch');
|
|
43
51
|
var tabs = require('@spark-web/tabs');
|
|
44
52
|
var text = require('@spark-web/text');
|
|
@@ -155,6 +163,12 @@ Object.keys(datePicker).forEach(function (k) {
|
|
|
155
163
|
get: function () { return datePicker[k]; }
|
|
156
164
|
});
|
|
157
165
|
});
|
|
166
|
+
Object.keys(descriptionList).forEach(function (k) {
|
|
167
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
168
|
+
enumerable: true,
|
|
169
|
+
get: function () { return descriptionList[k]; }
|
|
170
|
+
});
|
|
171
|
+
});
|
|
158
172
|
Object.keys(divider).forEach(function (k) {
|
|
159
173
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
160
174
|
enumerable: true,
|
|
@@ -197,6 +211,12 @@ Object.keys(hidden).forEach(function (k) {
|
|
|
197
211
|
get: function () { return hidden[k]; }
|
|
198
212
|
});
|
|
199
213
|
});
|
|
214
|
+
Object.keys(highlightCard).forEach(function (k) {
|
|
215
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
216
|
+
enumerable: true,
|
|
217
|
+
get: function () { return highlightCard[k]; }
|
|
218
|
+
});
|
|
219
|
+
});
|
|
200
220
|
Object.keys(icon).forEach(function (k) {
|
|
201
221
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
202
222
|
enumerable: true,
|
|
@@ -215,6 +235,12 @@ Object.keys(link).forEach(function (k) {
|
|
|
215
235
|
get: function () { return link[k]; }
|
|
216
236
|
});
|
|
217
237
|
});
|
|
238
|
+
Object.keys(meatballMenu).forEach(function (k) {
|
|
239
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
240
|
+
enumerable: true,
|
|
241
|
+
get: function () { return meatballMenu[k]; }
|
|
242
|
+
});
|
|
243
|
+
});
|
|
218
244
|
Object.keys(modalDialog).forEach(function (k) {
|
|
219
245
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
220
246
|
enumerable: true,
|
|
@@ -239,12 +265,24 @@ Object.keys(toggleGroup).forEach(function (k) {
|
|
|
239
265
|
get: function () { return toggleGroup[k]; }
|
|
240
266
|
});
|
|
241
267
|
});
|
|
268
|
+
Object.keys(pageHeader).forEach(function (k) {
|
|
269
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
270
|
+
enumerable: true,
|
|
271
|
+
get: function () { return pageHeader[k]; }
|
|
272
|
+
});
|
|
273
|
+
});
|
|
242
274
|
Object.keys(passwordInput).forEach(function (k) {
|
|
243
275
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
244
276
|
enumerable: true,
|
|
245
277
|
get: function () { return passwordInput[k]; }
|
|
246
278
|
});
|
|
247
279
|
});
|
|
280
|
+
Object.keys(portalTable).forEach(function (k) {
|
|
281
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
282
|
+
enumerable: true,
|
|
283
|
+
get: function () { return portalTable[k]; }
|
|
284
|
+
});
|
|
285
|
+
});
|
|
248
286
|
Object.keys(radio).forEach(function (k) {
|
|
249
287
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
250
288
|
enumerable: true,
|
|
@@ -257,6 +295,18 @@ Object.keys(row).forEach(function (k) {
|
|
|
257
295
|
get: function () { return row[k]; }
|
|
258
296
|
});
|
|
259
297
|
});
|
|
298
|
+
Object.keys(sectionCard).forEach(function (k) {
|
|
299
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
300
|
+
enumerable: true,
|
|
301
|
+
get: function () { return sectionCard[k]; }
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
Object.keys(sectionHeader).forEach(function (k) {
|
|
305
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
306
|
+
enumerable: true,
|
|
307
|
+
get: function () { return sectionHeader[k]; }
|
|
308
|
+
});
|
|
309
|
+
});
|
|
260
310
|
Object.keys(select).forEach(function (k) {
|
|
261
311
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
262
312
|
enumerable: true,
|
|
@@ -275,6 +325,12 @@ Object.keys(stack).forEach(function (k) {
|
|
|
275
325
|
get: function () { return stack[k]; }
|
|
276
326
|
});
|
|
277
327
|
});
|
|
328
|
+
Object.keys(statusBadge).forEach(function (k) {
|
|
329
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
330
|
+
enumerable: true,
|
|
331
|
+
get: function () { return statusBadge[k]; }
|
|
332
|
+
});
|
|
333
|
+
});
|
|
278
334
|
Object.keys(_switch).forEach(function (k) {
|
|
279
335
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
280
336
|
enumerable: true,
|
|
@@ -19,6 +19,7 @@ var core = require('@spark-web/core');
|
|
|
19
19
|
var currencyInput = require('@spark-web/currency-input');
|
|
20
20
|
var dataTable = require('@spark-web/data-table');
|
|
21
21
|
var datePicker = require('@spark-web/date-picker');
|
|
22
|
+
var descriptionList = require('@spark-web/description-list');
|
|
22
23
|
var divider = require('@spark-web/divider');
|
|
23
24
|
var dropzone = require('@spark-web/dropzone');
|
|
24
25
|
var field = require('@spark-web/field');
|
|
@@ -26,19 +27,26 @@ var fieldset = require('@spark-web/fieldset');
|
|
|
26
27
|
var floatInput = require('@spark-web/float-input');
|
|
27
28
|
var heading = require('@spark-web/heading');
|
|
28
29
|
var hidden = require('@spark-web/hidden');
|
|
30
|
+
var highlightCard = require('@spark-web/highlight-card');
|
|
29
31
|
var icon = require('@spark-web/icon');
|
|
30
32
|
var inline = require('@spark-web/inline');
|
|
31
33
|
var link = require('@spark-web/link');
|
|
34
|
+
var meatballMenu = require('@spark-web/meatball-menu');
|
|
32
35
|
var modalDialog = require('@spark-web/modal-dialog');
|
|
33
36
|
var multiSelect = require('@spark-web/multi-select');
|
|
34
37
|
var navLink = require('@spark-web/nav-link');
|
|
35
38
|
var toggleGroup = require('@spark-web/toggle-group');
|
|
39
|
+
var pageHeader = require('@spark-web/page-header');
|
|
36
40
|
var passwordInput = require('@spark-web/password-input');
|
|
41
|
+
var portalTable = require('@spark-web/portal-table');
|
|
37
42
|
var radio = require('@spark-web/radio');
|
|
38
43
|
var row = require('@spark-web/row');
|
|
44
|
+
var sectionCard = require('@spark-web/section-card');
|
|
45
|
+
var sectionHeader = require('@spark-web/section-header');
|
|
39
46
|
var select = require('@spark-web/select');
|
|
40
47
|
var spinner = require('@spark-web/spinner');
|
|
41
48
|
var stack = require('@spark-web/stack');
|
|
49
|
+
var statusBadge = require('@spark-web/status-badge');
|
|
42
50
|
var _switch = require('@spark-web/switch');
|
|
43
51
|
var tabs = require('@spark-web/tabs');
|
|
44
52
|
var text = require('@spark-web/text');
|
|
@@ -155,6 +163,12 @@ Object.keys(datePicker).forEach(function (k) {
|
|
|
155
163
|
get: function () { return datePicker[k]; }
|
|
156
164
|
});
|
|
157
165
|
});
|
|
166
|
+
Object.keys(descriptionList).forEach(function (k) {
|
|
167
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
168
|
+
enumerable: true,
|
|
169
|
+
get: function () { return descriptionList[k]; }
|
|
170
|
+
});
|
|
171
|
+
});
|
|
158
172
|
Object.keys(divider).forEach(function (k) {
|
|
159
173
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
160
174
|
enumerable: true,
|
|
@@ -197,6 +211,12 @@ Object.keys(hidden).forEach(function (k) {
|
|
|
197
211
|
get: function () { return hidden[k]; }
|
|
198
212
|
});
|
|
199
213
|
});
|
|
214
|
+
Object.keys(highlightCard).forEach(function (k) {
|
|
215
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
216
|
+
enumerable: true,
|
|
217
|
+
get: function () { return highlightCard[k]; }
|
|
218
|
+
});
|
|
219
|
+
});
|
|
200
220
|
Object.keys(icon).forEach(function (k) {
|
|
201
221
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
202
222
|
enumerable: true,
|
|
@@ -215,6 +235,12 @@ Object.keys(link).forEach(function (k) {
|
|
|
215
235
|
get: function () { return link[k]; }
|
|
216
236
|
});
|
|
217
237
|
});
|
|
238
|
+
Object.keys(meatballMenu).forEach(function (k) {
|
|
239
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
240
|
+
enumerable: true,
|
|
241
|
+
get: function () { return meatballMenu[k]; }
|
|
242
|
+
});
|
|
243
|
+
});
|
|
218
244
|
Object.keys(modalDialog).forEach(function (k) {
|
|
219
245
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
220
246
|
enumerable: true,
|
|
@@ -239,12 +265,24 @@ Object.keys(toggleGroup).forEach(function (k) {
|
|
|
239
265
|
get: function () { return toggleGroup[k]; }
|
|
240
266
|
});
|
|
241
267
|
});
|
|
268
|
+
Object.keys(pageHeader).forEach(function (k) {
|
|
269
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
270
|
+
enumerable: true,
|
|
271
|
+
get: function () { return pageHeader[k]; }
|
|
272
|
+
});
|
|
273
|
+
});
|
|
242
274
|
Object.keys(passwordInput).forEach(function (k) {
|
|
243
275
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
244
276
|
enumerable: true,
|
|
245
277
|
get: function () { return passwordInput[k]; }
|
|
246
278
|
});
|
|
247
279
|
});
|
|
280
|
+
Object.keys(portalTable).forEach(function (k) {
|
|
281
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
282
|
+
enumerable: true,
|
|
283
|
+
get: function () { return portalTable[k]; }
|
|
284
|
+
});
|
|
285
|
+
});
|
|
248
286
|
Object.keys(radio).forEach(function (k) {
|
|
249
287
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
250
288
|
enumerable: true,
|
|
@@ -257,6 +295,18 @@ Object.keys(row).forEach(function (k) {
|
|
|
257
295
|
get: function () { return row[k]; }
|
|
258
296
|
});
|
|
259
297
|
});
|
|
298
|
+
Object.keys(sectionCard).forEach(function (k) {
|
|
299
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
300
|
+
enumerable: true,
|
|
301
|
+
get: function () { return sectionCard[k]; }
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
Object.keys(sectionHeader).forEach(function (k) {
|
|
305
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
306
|
+
enumerable: true,
|
|
307
|
+
get: function () { return sectionHeader[k]; }
|
|
308
|
+
});
|
|
309
|
+
});
|
|
260
310
|
Object.keys(select).forEach(function (k) {
|
|
261
311
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
262
312
|
enumerable: true,
|
|
@@ -275,6 +325,12 @@ Object.keys(stack).forEach(function (k) {
|
|
|
275
325
|
get: function () { return stack[k]; }
|
|
276
326
|
});
|
|
277
327
|
});
|
|
328
|
+
Object.keys(statusBadge).forEach(function (k) {
|
|
329
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
330
|
+
enumerable: true,
|
|
331
|
+
get: function () { return statusBadge[k]; }
|
|
332
|
+
});
|
|
333
|
+
});
|
|
278
334
|
Object.keys(_switch).forEach(function (k) {
|
|
279
335
|
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
280
336
|
enumerable: true,
|
|
@@ -15,6 +15,7 @@ export * from '@spark-web/core';
|
|
|
15
15
|
export * from '@spark-web/currency-input';
|
|
16
16
|
export * from '@spark-web/data-table';
|
|
17
17
|
export * from '@spark-web/date-picker';
|
|
18
|
+
export * from '@spark-web/description-list';
|
|
18
19
|
export * from '@spark-web/divider';
|
|
19
20
|
export * from '@spark-web/dropzone';
|
|
20
21
|
export * from '@spark-web/field';
|
|
@@ -22,19 +23,26 @@ export * from '@spark-web/fieldset';
|
|
|
22
23
|
export * from '@spark-web/float-input';
|
|
23
24
|
export * from '@spark-web/heading';
|
|
24
25
|
export * from '@spark-web/hidden';
|
|
26
|
+
export * from '@spark-web/highlight-card';
|
|
25
27
|
export * from '@spark-web/icon';
|
|
26
28
|
export * from '@spark-web/inline';
|
|
27
29
|
export * from '@spark-web/link';
|
|
30
|
+
export * from '@spark-web/meatball-menu';
|
|
28
31
|
export * from '@spark-web/modal-dialog';
|
|
29
32
|
export * from '@spark-web/multi-select';
|
|
30
33
|
export * from '@spark-web/nav-link';
|
|
31
34
|
export * from '@spark-web/toggle-group';
|
|
35
|
+
export * from '@spark-web/page-header';
|
|
32
36
|
export * from '@spark-web/password-input';
|
|
37
|
+
export * from '@spark-web/portal-table';
|
|
33
38
|
export * from '@spark-web/radio';
|
|
34
39
|
export * from '@spark-web/row';
|
|
40
|
+
export * from '@spark-web/section-card';
|
|
41
|
+
export * from '@spark-web/section-header';
|
|
35
42
|
export * from '@spark-web/select';
|
|
36
43
|
export * from '@spark-web/spinner';
|
|
37
44
|
export * from '@spark-web/stack';
|
|
45
|
+
export * from '@spark-web/status-badge';
|
|
38
46
|
export * from '@spark-web/switch';
|
|
39
47
|
export * from '@spark-web/tabs';
|
|
40
48
|
export * from '@spark-web/text';
|
package/package.json
CHANGED
|
@@ -1,56 +1,67 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spark-web/design-system",
|
|
3
|
-
"version": "5.0
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/spark-web-design-system.cjs.js",
|
|
6
6
|
"module": "dist/spark-web-design-system.esm.js",
|
|
7
7
|
"files": [
|
|
8
|
+
"CLAUDE.md",
|
|
9
|
+
"ai-context",
|
|
10
|
+
"patterns",
|
|
8
11
|
"dist"
|
|
9
12
|
],
|
|
10
13
|
"dependencies": {
|
|
11
14
|
"@spark-web/a11y": "5.3.0",
|
|
12
15
|
"@spark-web/accordion": "5.2.0",
|
|
13
|
-
"@spark-web/action-dropdown": "
|
|
16
|
+
"@spark-web/action-dropdown": "2.0.0",
|
|
14
17
|
"@spark-web/alert": "5.2.0",
|
|
15
18
|
"@spark-web/analytics": "5.1.0",
|
|
16
|
-
"@spark-web/badge": "^5.1.
|
|
17
|
-
"@spark-web/box": "6.0.
|
|
18
|
-
"@spark-web/button": "5.6.
|
|
19
|
+
"@spark-web/badge": "^5.1.1",
|
|
20
|
+
"@spark-web/box": "6.0.1",
|
|
21
|
+
"@spark-web/button": "5.6.1",
|
|
19
22
|
"@spark-web/checkbox": "5.1.0",
|
|
20
|
-
"@spark-web/columns": "5.1.
|
|
23
|
+
"@spark-web/columns": "5.1.1",
|
|
21
24
|
"@spark-web/combobox": "6.0.0",
|
|
22
25
|
"@spark-web/container": "5.1.0",
|
|
23
26
|
"@spark-web/control-label": "5.1.0",
|
|
24
27
|
"@spark-web/core": "5.2.0",
|
|
25
28
|
"@spark-web/currency-input": "6.0.0",
|
|
26
|
-
"@spark-web/data-table": "5.2.
|
|
29
|
+
"@spark-web/data-table": "5.2.1",
|
|
27
30
|
"@spark-web/date-picker": "5.2.0",
|
|
31
|
+
"@spark-web/description-list": "0.1.0",
|
|
28
32
|
"@spark-web/divider": "5.1.0",
|
|
29
33
|
"@spark-web/dropzone": "6.0.0",
|
|
30
|
-
"@spark-web/field": "5.3.
|
|
34
|
+
"@spark-web/field": "5.3.1",
|
|
31
35
|
"@spark-web/fieldset": "5.1.0",
|
|
32
36
|
"@spark-web/float-input": "6.0.0",
|
|
33
37
|
"@spark-web/heading": "5.2.0",
|
|
34
38
|
"@spark-web/hidden": "5.1.0",
|
|
39
|
+
"@spark-web/highlight-card": "0.1.0",
|
|
35
40
|
"@spark-web/icon": "5.1.0",
|
|
36
41
|
"@spark-web/inline": "5.1.0",
|
|
37
42
|
"@spark-web/link": "5.1.0",
|
|
43
|
+
"@spark-web/meatball-menu": "0.1.0",
|
|
38
44
|
"@spark-web/modal-dialog": "6.0.2",
|
|
39
45
|
"@spark-web/multi-select": "6.0.1",
|
|
40
46
|
"@spark-web/nav-link": "5.1.0",
|
|
41
47
|
"@spark-web/next-utils": "5.1.0",
|
|
48
|
+
"@spark-web/page-header": "1.0.0",
|
|
42
49
|
"@spark-web/password-input": "6.0.0",
|
|
50
|
+
"@spark-web/portal-table": "^1.0.0",
|
|
43
51
|
"@spark-web/radio": "5.3.0",
|
|
44
|
-
"@spark-web/row": "5.1.
|
|
45
|
-
"@spark-web/
|
|
46
|
-
"@spark-web/
|
|
52
|
+
"@spark-web/row": "5.1.1",
|
|
53
|
+
"@spark-web/section-card": "0.1.0",
|
|
54
|
+
"@spark-web/section-header": "0.1.0",
|
|
55
|
+
"@spark-web/select": "6.0.1",
|
|
56
|
+
"@spark-web/spinner": "5.1.1",
|
|
47
57
|
"@spark-web/ssr": "5.0.0",
|
|
48
|
-
"@spark-web/stack": "5.1.
|
|
58
|
+
"@spark-web/stack": "5.1.1",
|
|
59
|
+
"@spark-web/status-badge": "0.1.0",
|
|
49
60
|
"@spark-web/switch": "5.0.3",
|
|
50
61
|
"@spark-web/tabs": "5.2.1",
|
|
51
|
-
"@spark-web/text": "5.3.
|
|
62
|
+
"@spark-web/text": "5.3.1",
|
|
52
63
|
"@spark-web/text-area": "6.0.0",
|
|
53
|
-
"@spark-web/text-input": "6.0.
|
|
64
|
+
"@spark-web/text-input": "6.0.1",
|
|
54
65
|
"@spark-web/text-link": "5.4.0",
|
|
55
66
|
"@spark-web/text-list": "5.1.0",
|
|
56
67
|
"@spark-web/theme": "5.13.1",
|