@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.
@@ -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.99",
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": "1.3.2",
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.0",
17
- "@spark-web/box": "6.0.0",
18
- "@spark-web/button": "5.6.0",
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.0",
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.0",
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.0",
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.0",
45
- "@spark-web/select": "6.0.0",
46
- "@spark-web/spinner": "5.1.0",
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.0",
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.0",
62
+ "@spark-web/text": "5.3.1",
52
63
  "@spark-web/text-area": "6.0.0",
53
- "@spark-web/text-input": "6.0.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",