@pure-ds/storybook 0.4.15 → 0.4.17

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 (59) hide show
  1. package/.storybook/addons/html-preview/Panel.jsx +75 -23
  2. package/.storybook/addons/html-preview/preview.js +27 -1
  3. package/.storybook/docs.css +7 -0
  4. package/.storybook/htmlPreview.css +6 -6
  5. package/.storybook/htmlPreview.js +27 -1
  6. package/.storybook/manager-head.html +13 -0
  7. package/.storybook/preview-head.html +5 -0
  8. package/.storybook/preview.js +1 -1
  9. package/dist/pds-reference.json +2 -7
  10. package/package.json +2 -2
  11. package/public/assets/js/app.js +617 -10565
  12. package/public/assets/js/lit.js +3 -1048
  13. package/public/assets/js/pds.js +396 -7354
  14. package/public/assets/pds/components/pds-calendar.js +1 -1
  15. package/public/assets/pds/custom-elements.json +263 -18
  16. package/public/assets/pds/pds-runtime-config.json +1 -1
  17. package/public/assets/pds/styles/pds-components.css +83 -221
  18. package/public/assets/pds/styles/pds-components.css.js +166 -442
  19. package/public/assets/pds/styles/pds-styles.css +240 -437
  20. package/public/assets/pds/styles/pds-styles.css.js +479 -881
  21. package/public/assets/pds/styles/pds-utilities.css +151 -214
  22. package/public/assets/pds/styles/pds-utilities.css.js +302 -428
  23. package/src/js/pds-configurator/pds-demo.js +11 -1
  24. package/src/js/pds-core/pds-generator.js +88 -38
  25. package/src/js/pds-core/pds-ontology.js +1 -1
  26. package/stories/components/PdsCalendar.stories.js +2 -2
  27. package/stories/components/PdsDrawer.stories.js +15 -15
  28. package/stories/components/PdsJsonform.stories.js +78 -0
  29. package/stories/components/PdsRichtext.stories.js +4 -17
  30. package/stories/components/PdsScrollrow.stories.js +224 -72
  31. package/stories/components/PdsSplitpanel.stories.js +63 -28
  32. package/stories/components/PdsTabstrip.stories.js +7 -7
  33. package/stories/enhancements/Accordion.stories.js +2 -2
  34. package/stories/enhancements/Dropdowns.stories.js +13 -10
  35. package/stories/enhancements/RangeSliders.stories.js +9 -9
  36. package/stories/enhancements/RequiredFields.stories.js +8 -8
  37. package/stories/enhancements/Toggles.stories.js +45 -36
  38. package/stories/enhancements/_enhancement-header.js +2 -2
  39. package/stories/foundations/Colors.stories.js +13 -13
  40. package/stories/foundations/HTMLDefaults.stories.js +4 -4
  41. package/stories/foundations/Icons.stories.js +123 -288
  42. package/stories/foundations/MeshGradients.stories.js +161 -250
  43. package/stories/foundations/SmartSurfaces.stories.js +147 -64
  44. package/stories/foundations/Spacing.stories.js +30 -30
  45. package/stories/foundations/Typography.stories.js +352 -723
  46. package/stories/foundations/ZIndex.stories.js +124 -141
  47. package/stories/layout/LayoutOverview.stories.js +343 -250
  48. package/stories/layout/LayoutSystem.stories.js +60 -76
  49. package/stories/patterns/InteractiveStates.stories.js +29 -29
  50. package/stories/patterns/Utilities.stories.js +17 -5
  51. package/stories/primitives/Alerts.stories.js +6 -6
  52. package/stories/primitives/Cards.stories.js +22 -11
  53. package/stories/primitives/Forms.stories.js +17 -8
  54. package/stories/primitives/Media.stories.js +23 -20
  55. package/stories/utilities/Backdrop.stories.js +68 -27
  56. package/stories/utils/PdsAsk.stories.js +1 -1
  57. package/public/assets/js/app.js.map +0 -7
  58. package/public/assets/js/lit.js.map +0 -7
  59. package/public/assets/js/pds.js.map +0 -7
@@ -1,5 +1,19 @@
1
1
  import { html } from "lit";
2
2
 
3
+ const layoutSystemStyles = html`
4
+ <style>
5
+ .story-demo-area { padding: var(--spacing-4); border-radius: var(--radius-md); }
6
+ .story-demo-area-sm { padding: var(--spacing-2); border-radius: var(--radius-md); }
7
+ .story-demo-area-md { padding: var(--spacing-3); border-radius: var(--radius-md); }
8
+ .story-demo-item { padding: var(--spacing-2); }
9
+ .story-demo-item-lg { padding: var(--spacing-4); }
10
+ .story-demo-height { height: 100px; }
11
+ .story-fixed-width { width: 100px; }
12
+ .story-min-width { min-width: 120px; }
13
+ .story-margin-top { margin-block-start: var(--spacing-2); }
14
+ </style>
15
+ `;
16
+
3
17
  export default {
4
18
  title: "Foundations/Layout",
5
19
  tags: ["layout", "flex", "grid", "container", "utilities", "text", "truncate", "spacing", "gap", "alignment"],
@@ -18,16 +32,14 @@ export default {
18
32
  // ─────────────────────────────────────────────────────────────
19
33
 
20
34
  export const Container = () => html`
21
- <div class="card surface-subtle" style="padding: var(--spacing-2);">
35
+ ${layoutSystemStyles}
36
+ <div class="card surface-subtle story-demo-area-sm">
22
37
  <p class="text-muted text-center">
23
38
  Gray background shows viewport width. Container centers content with
24
39
  max-width.
25
40
  </p>
26
41
 
27
- <div
28
- class="container surface-base"
29
- style="border-radius: var(--radius-md);"
30
- >
42
+ <div class="container surface-base story-demo-area">
31
43
  <h2>Container</h2>
32
44
  <p>
33
45
  <code>.container</code> centers content with a max-width (default
@@ -66,6 +78,7 @@ Container.storyName = "Container";
66
78
  // ─────────────────────────────────────────────────────────────
67
79
 
68
80
  export const GridFixed = () => html`
81
+ ${layoutSystemStyles}
69
82
  <header>
70
83
  <h2>Fixed Column Grids</h2>
71
84
  <p class="text-muted">Explicit column counts for predictable layouts.</p>
@@ -122,6 +135,7 @@ export const GridFixed = () => html`
122
135
  GridFixed.storyName = "Grid: Fixed Columns";
123
136
 
124
137
  export const GridAuto = () => html`
138
+ ${layoutSystemStyles}
125
139
  <header class="card">
126
140
  <h2>Auto-Fit Responsive Grids</h2>
127
141
  <p class="text-muted">
@@ -185,6 +199,7 @@ GridAuto.storyName = "Grid: Auto-Fit";
185
199
  // ─────────────────────────────────────────────────────────────
186
200
 
187
201
  export const FlexBasics = () => html`
202
+ ${layoutSystemStyles}
188
203
  <header class="card">
189
204
  <h2>Flexbox Utilities</h2>
190
205
  <p class="text-muted">
@@ -194,10 +209,7 @@ export const FlexBasics = () => html`
194
209
 
195
210
  <div class="card">
196
211
  <h3>.flex (row by default)</h3>
197
- <div
198
- class="flex gap-md surface-subtle"
199
- style="padding: var(--spacing-4); border-radius: var(--radius-md);"
200
- >
212
+ <div class="flex gap-md surface-subtle story-demo-area">
201
213
  <div class="card">Item 1</div>
202
214
  <div class="card">Item 2</div>
203
215
  <div class="card">Item 3</div>
@@ -205,11 +217,8 @@ export const FlexBasics = () => html`
205
217
  </div>
206
218
 
207
219
  <div class="card">
208
- <h3>.flex .flex-col</h3>
209
- <div
210
- class="flex flex-col gap-sm surface-subtle"
211
- style="padding: var(--spacing-4); border-radius: var(--radius-md);"
212
- >
220
+ <h3>.stack-sm (vertical)</h3>
221
+ <div class="stack-sm surface-subtle story-demo-area">
213
222
  <div class="card">Item 1</div>
214
223
  <div class="card">Item 2</div>
215
224
  <div class="card">Item 3</div>
@@ -218,14 +227,11 @@ export const FlexBasics = () => html`
218
227
 
219
228
  <div class="card">
220
229
  <h3>.flex .flex-wrap</h3>
221
- <div
222
- class="flex flex-wrap gap-sm surface-subtle"
223
- style="padding: var(--spacing-4); border-radius: var(--radius-md);"
224
- >
230
+ <div class="flex flex-wrap gap-sm surface-subtle story-demo-area">
225
231
  ${Array.from(
226
232
  { length: 8 },
227
233
  (_, i) => html`
228
- <div class="card" style="min-width: 120px;">Item ${i + 1}</div>
234
+ <div class="card story-min-width">Item ${i + 1}</div>
229
235
  `
230
236
  )}
231
237
  </div>
@@ -233,13 +239,10 @@ export const FlexBasics = () => html`
233
239
 
234
240
  <div class="card">
235
241
  <h3>.grow (fill remaining space)</h3>
236
- <div
237
- class="flex gap-md surface-subtle"
238
- style="padding: var(--spacing-4); border-radius: var(--radius-md);"
239
- >
240
- <div class="card" style="width: 100px;">Fixed</div>
242
+ <div class="flex gap-md surface-subtle story-demo-area">
243
+ <div class="card story-fixed-width">Fixed</div>
241
244
  <div class="card grow">This item grows to fill available space</div>
242
- <div class="card" style="width: 100px;">Fixed</div>
245
+ <div class="card story-fixed-width">Fixed</div>
243
246
  </div>
244
247
  </div>
245
248
  `;
@@ -247,6 +250,7 @@ export const FlexBasics = () => html`
247
250
  FlexBasics.storyName = "Flex: Basics";
248
251
 
249
252
  export const FlexAlignment = () => html`
253
+ ${layoutSystemStyles}
250
254
  <header class="card">
251
255
  <h2>Alignment Utilities</h2>
252
256
  <p class="text-muted">
@@ -259,32 +263,23 @@ export const FlexAlignment = () => html`
259
263
  <div class="grid grid-cols-3 gap-md">
260
264
  <div>
261
265
  <code>.items-start</code>
262
- <div
263
- class="flex items-start gap-sm surface-subtle"
264
- style="height: 100px; padding: var(--spacing-2); border-radius: var(--radius-md);"
265
- >
266
- <div class="card" style="padding: var(--spacing-2);">A</div>
267
- <div class="card" style="padding: var(--spacing-4);">B</div>
266
+ <div class="flex items-start gap-sm surface-subtle story-demo-area-sm story-demo-height">
267
+ <div class="card story-demo-item">A</div>
268
+ <div class="card story-demo-item-lg">B</div>
268
269
  </div>
269
270
  </div>
270
271
  <div>
271
272
  <code>.items-center</code>
272
- <div
273
- class="flex items-center gap-sm surface-subtle"
274
- style="height: 100px; padding: var(--spacing-2); border-radius: var(--radius-md);"
275
- >
276
- <div class="card" style="padding: var(--spacing-2);">A</div>
277
- <div class="card" style="padding: var(--spacing-4);">B</div>
273
+ <div class="flex items-center gap-sm surface-subtle story-demo-area-sm story-demo-height">
274
+ <div class="card story-demo-item">A</div>
275
+ <div class="card story-demo-item-lg">B</div>
278
276
  </div>
279
277
  </div>
280
278
  <div>
281
279
  <code>.items-end</code>
282
- <div
283
- class="flex items-end gap-sm surface-subtle"
284
- style="height: 100px; padding: var(--spacing-2); border-radius: var(--radius-md);"
285
- >
286
- <div class="card" style="padding: var(--spacing-2);">A</div>
287
- <div class="card" style="padding: var(--spacing-4);">B</div>
280
+ <div class="flex items-end gap-sm surface-subtle story-demo-area-sm story-demo-height">
281
+ <div class="card story-demo-item">A</div>
282
+ <div class="card story-demo-item-lg">B</div>
288
283
  </div>
289
284
  </div>
290
285
  </div>
@@ -297,13 +292,10 @@ export const FlexAlignment = () => html`
297
292
  (justify) => html`
298
293
  <div>
299
294
  <code>.justify-${justify}</code>
300
- <div
301
- class="flex justify-${justify} gap-sm surface-subtle"
302
- style="padding: var(--spacing-2); border-radius: var(--radius-md);"
303
- >
304
- <div class="card" style="padding: var(--spacing-2);">A</div>
305
- <div class="card" style="padding: var(--spacing-2);">B</div>
306
- <div class="card" style="padding: var(--spacing-2);">C</div>
295
+ <div class="flex justify-${justify} gap-sm surface-subtle story-demo-area-sm">
296
+ <div class="card story-demo-item">A</div>
297
+ <div class="card story-demo-item">B</div>
298
+ <div class="card story-demo-item">C</div>
307
299
  </div>
308
300
  </div>
309
301
  `
@@ -319,6 +311,7 @@ FlexAlignment.storyName = "Flex: Alignment";
319
311
  // ─────────────────────────────────────────────────────────────
320
312
 
321
313
  export const Stack = () => html`
314
+ ${layoutSystemStyles}
322
315
  <header>
323
316
  <h2>Stack Utilities</h2>
324
317
  <p class="text-muted">
@@ -333,13 +326,10 @@ export const Stack = () => html`
333
326
  (size) => html`
334
327
  <div class="card">
335
328
  <h3>.stack-${size}</h3>
336
- <div
337
- class="stack-${size} surface-subtle"
338
- style="padding: var(--spacing-3); border-radius: var(--radius-md);"
339
- >
340
- <div class="card" style="padding: var(--spacing-2);">Item 1</div>
341
- <div class="card" style="padding: var(--spacing-2);">Item 2</div>
342
- <div class="card" style="padding: var(--spacing-2);">Item 3</div>
329
+ <div class="stack-${size} surface-subtle story-demo-area-md">
330
+ <div class="card story-demo-item">Item 1</div>
331
+ <div class="card story-demo-item">Item 2</div>
332
+ <div class="card story-demo-item">Item 3</div>
343
333
  </div>
344
334
  </div>
345
335
  `
@@ -350,15 +340,15 @@ export const Stack = () => html`
350
340
  <h3>Practical: Form Layout</h3>
351
341
  <form class="stack-md max-w-md">
352
342
  <label>
353
- <span>Name</span>
343
+ <span data-label>Name</span>
354
344
  <input type="text" placeholder="John Doe" />
355
345
  </label>
356
346
  <label>
357
- <span>Email</span>
347
+ <span data-label>Email</span>
358
348
  <input type="email" placeholder="john@example.com" />
359
349
  </label>
360
350
  <label>
361
- <span>Message</span>
351
+ <span data-label>Message</span>
362
352
  <textarea rows="3" placeholder="Your message..."></textarea>
363
353
  </label>
364
354
  <div class="flex gap-sm justify-end">
@@ -377,6 +367,7 @@ Stack.storyName = "Stack";
377
367
  // ─────────────────────────────────────────────────────────────
378
368
 
379
369
  export const Gap = () => html`
370
+ ${layoutSystemStyles}
380
371
  <header>
381
372
  <h2>Gap Utilities</h2>
382
373
  <p class="text-muted">Control spacing between flex/grid children.</p>
@@ -394,17 +385,11 @@ export const Gap = () => html`
394
385
  ({ cls, label }) => html`
395
386
  <div class="card">
396
387
  <code>.${cls}</code> <span class="text-muted">(${label})</span>
397
- <div
398
- class="grid grid-cols-4 ${cls}"
399
- style="margin-top: var(--spacing-2);"
400
- >
388
+ <div class="grid grid-cols-4 ${cls} story-margin-top">
401
389
  ${Array.from(
402
390
  { length: 4 },
403
391
  (_, i) => html`
404
- <div
405
- class="card surface-elevated text-center"
406
- style="padding: var(--spacing-2);"
407
- >
392
+ <div class="card surface-elevated text-center story-demo-item">
408
393
  ${i + 1}
409
394
  </div>
410
395
  `
@@ -423,6 +408,7 @@ Gap.storyName = "Gap";
423
408
  // ─────────────────────────────────────────────────────────────
424
409
 
425
410
  export const MaxWidth = () => html`
411
+ ${layoutSystemStyles}
426
412
  <header class="card">
427
413
  <h2>Max-Width Utilities</h2>
428
414
  <p class="text-muted">Constrain content width for readability.</p>
@@ -438,10 +424,7 @@ export const MaxWidth = () => html`
438
424
  ({ cls, px, use }) => html`
439
425
  <div>
440
426
  <code>.${cls}</code> <span class="text-muted">(${px}) — ${use}</span>
441
- <div
442
- class="${cls} surface-subtle"
443
- style="padding: var(--spacing-4); border-radius: var(--radius-md); margin-top: var(--spacing-2);"
444
- >
427
+ <div class="${cls} surface-subtle story-demo-area story-margin-top">
445
428
  Content constrained to ${px}
446
429
  </div>
447
430
  </div>
@@ -457,6 +440,7 @@ MaxWidth.storyName = "Max-Width";
457
440
  // ─────────────────────────────────────────────────────────────
458
441
 
459
442
  export const Section = () => html`
443
+ ${layoutSystemStyles}
460
444
  <header>
461
445
  <h2>Section Spacing</h2>
462
446
  <p class="text-muted">Vertical padding for major content blocks.</p>
@@ -484,6 +468,7 @@ Section.storyName = "Section";
484
468
  // ─────────────────────────────────────────────────────────────
485
469
 
486
470
  export const Responsive = () => html`
471
+ ${layoutSystemStyles}
487
472
  <div class="card">
488
473
  <h2>Responsive Utilities</h2>
489
474
  </div>
@@ -529,6 +514,7 @@ Responsive.storyName = "Responsive";
529
514
  // ─────────────────────────────────────────────────────────────
530
515
 
531
516
  export const TextUtilities = () => html`
517
+ ${layoutSystemStyles}
532
518
  <div class="card">
533
519
  <h2>Text Utilities</h2>
534
520
  </div>
@@ -554,10 +540,7 @@ export const TextUtilities = () => html`
554
540
  <div class="card">
555
541
  <h3>.truncate</h3>
556
542
  <p class="text-muted">Truncates text with ellipsis when overflowing.</p>
557
- <div
558
- class="max-w-sm surface-subtle"
559
- style="padding: var(--spacing-3); border-radius: var(--radius-md);"
560
- >
543
+ <div class="max-w-sm surface-subtle story-demo-area-md">
561
544
  <p class="truncate">
562
545
  This is a very long piece of text that will be truncated with an
563
546
  ellipsis when it overflows its container because it has the .truncate
@@ -574,6 +557,7 @@ TextUtilities.storyName = "Text";
574
557
  // ─────────────────────────────────────────────────────────────
575
558
 
576
559
  export const Reference = () => html`
560
+ ${layoutSystemStyles}
577
561
  <div class="card">
578
562
  <h2>Complete Layout Reference</h2>
579
563
  <p class="text-muted">All layout utilities in PDS.</p>
@@ -2,74 +2,74 @@ import { html } from "lit";
2
2
 
3
3
  const interactiveSkeletonStoryStyles = html`
4
4
  <style>
5
- .interactive-skeleton-card {
5
+ .story-interactive-skeleton-card {
6
6
  display: grid;
7
7
  gap: var(--spacing-3);
8
8
  }
9
9
 
10
- .interactive-skeleton-block {
10
+ .story-interactive-skeleton-block {
11
11
  display: block;
12
12
  }
13
13
 
14
- .interactive-skeleton-height-24 {
14
+ .story-interactive-skeleton-height-24 {
15
15
  height: 1.5rem;
16
16
  }
17
17
 
18
- .interactive-skeleton-height-20 {
18
+ .story-interactive-skeleton-height-20 {
19
19
  height: 1.25rem;
20
20
  }
21
21
 
22
- .interactive-skeleton-height-16 {
22
+ .story-interactive-skeleton-height-16 {
23
23
  height: 1rem;
24
24
  }
25
25
 
26
- .interactive-skeleton-height-14 {
26
+ .story-interactive-skeleton-height-14 {
27
27
  height: 0.875rem;
28
28
  }
29
29
 
30
- .interactive-skeleton-width-60 {
30
+ .story-interactive-skeleton-width-60 {
31
31
  width: 60%;
32
32
  }
33
33
 
34
- .interactive-skeleton-width-80 {
34
+ .story-interactive-skeleton-width-80 {
35
35
  width: 80%;
36
36
  }
37
37
 
38
- .interactive-skeleton-width-70 {
38
+ .story-interactive-skeleton-width-70 {
39
39
  width: 70%;
40
40
  }
41
41
 
42
- .interactive-skeleton-width-50 {
42
+ .story-interactive-skeleton-width-50 {
43
43
  width: 50%;
44
44
  }
45
45
 
46
- .interactive-skeleton-width-40 {
46
+ .story-interactive-skeleton-width-40 {
47
47
  width: 40%;
48
48
  }
49
49
 
50
- .interactive-skeleton-width-85 {
50
+ .story-interactive-skeleton-width-85 {
51
51
  width: 85%;
52
52
  }
53
53
 
54
- .interactive-skeleton-margin-lg {
54
+ .story-interactive-skeleton-margin-lg {
55
55
  margin-bottom: var(--spacing-3);
56
56
  }
57
57
 
58
- .interactive-skeleton-margin-md {
58
+ .story-interactive-skeleton-margin-md {
59
59
  margin-bottom: var(--spacing-2);
60
60
  }
61
61
 
62
- .interactive-skeleton-avatar {
62
+ .story-interactive-skeleton-avatar {
63
63
  width: 2.5rem;
64
64
  height: 2.5rem;
65
65
  border-radius: 50%;
66
66
  }
67
67
 
68
- .interactive-skeleton-list-item {
68
+ .story-interactive-skeleton-list-item {
69
69
  padding: var(--spacing-3);
70
70
  }
71
71
 
72
- .interactive-skeleton-details {
72
+ .story-interactive-skeleton-details {
73
73
  flex: 1;
74
74
  }
75
75
  </style>
@@ -128,12 +128,12 @@ export const FocusStates = () => html`
128
128
  <h3>Form Controls</h3>
129
129
  <div class="max-w-md">
130
130
  <label>
131
- <span>Text Input</span>
131
+ <span data-label>Text Input</span>
132
132
  <input type="text" placeholder="Tab to focus" />
133
133
  </label>
134
134
 
135
135
  <label>
136
- <span>Textarea</span>
136
+ <span data-label>Textarea</span>
137
137
  <textarea rows="3" placeholder="Tab to focus"></textarea>
138
138
  </label>
139
139
 
@@ -317,7 +317,7 @@ export const TransitionSpeeds = () => {
317
317
  <pre
318
318
  class="surface-subtle radius-md overflow-auto"
319
319
  ><code>/* Use transition tokens in your CSS */
320
- .button {
320
+ .story-button {
321
321
  transition: background-color var(--transition-fast);
322
322
  }
323
323
 
@@ -327,7 +327,7 @@ export const TransitionSpeeds = () => {
327
327
  box-shadow var(--transition-normal);
328
328
  }
329
329
 
330
- .modal {
330
+ .story-modal {
331
331
  transition: opacity var(--transition-slow);
332
332
  }</code></pre>
333
333
  </div>
@@ -437,7 +437,7 @@ export const WorkingStates = () => {
437
437
  <div class="stack-md">
438
438
  <header>
439
439
  <h3>Different Sizes</h3>
440
- <small class="text-muted text-sm">Spinner size adapts to button size</small>
440
+ <small class="text-muted">Spinner size adapts to button size</small>
441
441
  </header>
442
442
  <div class="flex flex-wrap gap-sm align-center">
443
443
  <button
@@ -538,7 +538,7 @@ export const SkeletonLoading = () => html`
538
538
  class="flex gap-sm align-center border-bottom interactive-skeleton-list-item"
539
539
  >
540
540
  <div class="skeleton interactive-skeleton-avatar"></div>
541
- <div class="interactive-skeleton-details">
541
+ <div class="story-interactive-skeleton-details">
542
542
  <div
543
543
  class="skeleton interactive-skeleton-block interactive-skeleton-height-16 interactive-skeleton-width-70 interactive-skeleton-margin-md"
544
544
  ></div>
@@ -622,19 +622,19 @@ export const DisabledStates = () => html`
622
622
  <h3>Form Controls</h3>
623
623
  <div class="max-w-md">
624
624
  <label>
625
- <span>Disabled Input</span>
625
+ <span data-label>Disabled Input</span>
626
626
  <input type="text" disabled value="Cannot edit" />
627
627
  </label>
628
628
 
629
629
  <label>
630
- <span>Disabled Select</span>
630
+ <span data-label>Disabled Select</span>
631
631
  <select disabled>
632
632
  <option>Cannot select</option>
633
633
  </select>
634
634
  </label>
635
635
 
636
636
  <label>
637
- <span>Disabled Textarea</span>
637
+ <span data-label>Disabled Textarea</span>
638
638
  <textarea disabled rows="3">Cannot edit this text</textarea>
639
639
  </label>
640
640
 
@@ -676,7 +676,7 @@ export const CombinedStates = () => html`
676
676
  <div>
677
677
  <header>
678
678
  <h3>Hover State</h3>
679
- <p class="text-muted text-sm">Hover over buttons to see effect</p>
679
+ <p class="text-muted"><small>Hover over buttons to see effect</small></p>
680
680
  </header>
681
681
  <div class="flex flex-wrap gap-sm">
682
682
  <button class="btn-primary">Primary</button>
@@ -688,7 +688,7 @@ export const CombinedStates = () => html`
688
688
  <div>
689
689
  <header>
690
690
  <h3>Active State</h3>
691
- <p class="text-muted text-sm">Click and hold to see effect</p>
691
+ <p class="text-muted"><small>Click and hold to see effect</small></p>
692
692
  </header>
693
693
  <div class="flex flex-wrap gap-sm">
694
694
  <button class="btn-primary">Primary</button>
@@ -700,7 +700,7 @@ export const CombinedStates = () => html`
700
700
  <div>
701
701
  <header>
702
702
  <h3>Focus State</h3>
703
- <p class="text-muted text-sm">Tab to focus on buttons</p>
703
+ <p class="text-muted"><small>Tab to focus on buttons</small></p>
704
704
  </header>
705
705
  <div class="flex flex-wrap gap-sm">
706
706
  <button class="btn-primary">Primary</button>
@@ -1,5 +1,16 @@
1
1
  import { html } from "lit";
2
2
 
3
+ // Story-specific styles (not PDS classes - demo only)
4
+ const utilitiesStoryStyles = html`
5
+ <style>
6
+ /* Radius demo */
7
+ .story-radius-sm { border-radius: var(--radius-sm); }
8
+ .story-radius-md { border-radius: var(--radius-md); }
9
+ .story-radius-lg { border-radius: var(--radius-lg); }
10
+ .story-radius-full { border-radius: var(--radius-full); }
11
+ </style>
12
+ `;
13
+
3
14
  export default {
4
15
  title: "Patterns/Utilities",
5
16
  tags: ["utilities", "spacing", "layout", "gap"],
@@ -16,7 +27,7 @@ export default {
16
27
  };
17
28
 
18
29
  export const SpacingUtilities = () => html`
19
- <div class="flex flex-col gap-md">
30
+ <div class="stack-md">
20
31
  <div class="gap-xs flex">
21
32
  <div class="badge">Gap 1</div>
22
33
  <div class="badge">Between</div>
@@ -64,10 +75,11 @@ export const BorderUtilities = () => html`
64
75
  `;
65
76
 
66
77
  export const RoundedUtilities = () => html`
78
+ ${utilitiesStoryStyles}
67
79
  <div class="flex gap-md flex-wrap">
68
- <div class="card surface-inverse" style="border-radius: var(--radius-sm);">--radius-sm</div>
69
- <div class="card surface-inverse" style="border-radius: var(--radius-md);">--radius-md</div>
70
- <div class="card surface-inverse" style="border-radius: var(--radius-lg);">--radius-lg</div>
71
- <div class="card surface-inverse" style="border-radius: var(--radius-full);">--radius-full</div>
80
+ <div class="card surface-inverse story-radius-sm">--radius-sm</div>
81
+ <div class="card surface-inverse story-radius-md">--radius-md</div>
82
+ <div class="card surface-inverse story-radius-lg">--radius-lg</div>
83
+ <div class="card surface-inverse story-radius-full">--radius-full</div>
72
84
  </div>
73
85
  `;
@@ -21,7 +21,7 @@ export const Default = () => html`
21
21
  <p class="text-muted">Simple alert messages with semantic color variants.</p>
22
22
  </header>
23
23
 
24
- <div class="flex flex-col gap-md">
24
+ <div class="stack-md">
25
25
  <div class="alert alert-info">This is an info alert — check it out!</div>
26
26
  <div class="alert alert-success">This is a success alert — great job!</div>
27
27
  <div class="alert alert-warning">This is a warning alert — be careful!</div>
@@ -37,7 +37,7 @@ export const AlertsWithIcons = () => html`
37
37
  <p class="text-muted">Use <code>.alert-icon</code> to add visual context with icons.</p>
38
38
  </header>
39
39
 
40
- <div class="flex flex-col gap-md">
40
+ <div class="stack-md">
41
41
  <div class="alert alert-info">
42
42
  <span class="alert-icon">
43
43
  <pds-icon icon="info" size="md"></pds-icon>
@@ -84,7 +84,7 @@ export const AlertsWithTitles = () => html`
84
84
  <p class="text-muted">Use <code>.alert-title</code> for prominent headings within alerts.</p>
85
85
  </header>
86
86
 
87
- <div class="flex flex-col gap-md">
87
+ <div class="stack-md">
88
88
  <div class="alert alert-info">
89
89
  <span class="alert-icon">
90
90
  <pds-icon icon="info" size="md"></pds-icon>
@@ -138,7 +138,7 @@ export const DismissibleAlerts = () => html`
138
138
  </p>
139
139
  </header>
140
140
 
141
- <div class="flex flex-col gap-md">
141
+ <div class="stack-md">
142
142
  <div class="alert alert-info alert-dismissible">
143
143
  <span class="alert-icon">
144
144
  <pds-icon icon="info" size="md"></pds-icon>
@@ -179,7 +179,7 @@ export const SemanticMessages = () => html`
179
179
  </p>
180
180
  </header>
181
181
 
182
- <div class="flex flex-col gap-md">
182
+ <div class="stack-md">
183
183
  <div class="semantic-message info">
184
184
  <strong>Tip:</strong>
185
185
  <p>Use semantic messages for inline feedback within forms or content areas.</p>
@@ -205,7 +205,7 @@ export const SemanticMessages = () => html`
205
205
  <h3>In a Form Context</h3>
206
206
  <form class="max-w-md stack-sm">
207
207
  <label>
208
- <span>Email Address</span>
208
+ <span data-label>Email Address</span>
209
209
  <input type="email" value="invalid-email" />
210
210
  </label>
211
211
  <div class="semantic-message danger">