@pure-ds/storybook 0.4.16 → 0.4.19

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 (73) hide show
  1. package/.storybook/addons/html-preview/Panel.jsx +80 -29
  2. package/.storybook/addons/html-preview/preview.js +4 -5
  3. package/.storybook/manager.js +337 -49
  4. package/.storybook/preview-head.html +2 -2
  5. package/.storybook/preview.js +2 -2
  6. package/README.md +2 -2
  7. package/dist/pds-reference.json +1916 -267
  8. package/package.json +2 -2
  9. package/public/assets/css/app.css +2 -2
  10. package/public/assets/js/app.js +645 -10574
  11. package/public/assets/js/lit.js +3 -1048
  12. package/public/assets/js/pds.js +429 -7368
  13. package/public/assets/pds/components/pds-calendar.js +1 -1
  14. package/public/assets/pds/components/{pds-jsonform.js → pds-form.js} +536 -45
  15. package/public/assets/pds/custom-elements.json +271 -26
  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/public/assets/pds/vscode-custom-data.json +63 -63
  24. package/scripts/build-pds-reference.mjs +112 -38
  25. package/scripts/generate-stories.js +2 -2
  26. package/src/js/common/ask.js +48 -21
  27. package/src/js/pds-configurator/pds-config-form.js +9 -9
  28. package/src/js/pds-configurator/pds-demo.js +2 -2
  29. package/src/js/pds-core/pds-config.js +14 -14
  30. package/src/js/pds-core/pds-generator.js +113 -50
  31. package/src/js/pds-core/pds-ontology.js +6 -6
  32. package/src/js/pds.d.ts +2 -2
  33. package/stories/GettingStarted.stories.js +3 -0
  34. package/stories/WhatIsPDS.stories.js +3 -0
  35. package/stories/components/PdsCalendar.stories.js +2 -2
  36. package/stories/components/PdsDrawer.stories.js +15 -15
  37. package/stories/components/PdsForm.stories.js +4356 -0
  38. package/stories/components/{PdsJsonformUiSchema.md → PdsFormUiSchema.md} +2 -2
  39. package/stories/components/PdsRichtext.stories.js +4 -17
  40. package/stories/components/PdsScrollrow.stories.js +224 -72
  41. package/stories/components/PdsSplitpanel.stories.js +63 -28
  42. package/stories/components/PdsTabstrip.stories.js +7 -7
  43. package/stories/enhancements/Accordion.stories.js +2 -2
  44. package/stories/enhancements/Dropdowns.stories.js +13 -10
  45. package/stories/enhancements/RangeSliders.stories.js +9 -9
  46. package/stories/enhancements/RequiredFields.stories.js +8 -8
  47. package/stories/enhancements/Toggles.stories.js +45 -36
  48. package/stories/enhancements/_enhancement-header.js +2 -2
  49. package/stories/foundations/Colors.stories.js +13 -13
  50. package/stories/foundations/HTMLDefaults.stories.js +4 -4
  51. package/stories/foundations/Icons.stories.js +123 -288
  52. package/stories/foundations/MeshGradients.stories.js +161 -250
  53. package/stories/foundations/SmartSurfaces.stories.js +147 -64
  54. package/stories/foundations/Spacing.stories.js +30 -30
  55. package/stories/foundations/Typography.stories.js +352 -723
  56. package/stories/foundations/ZIndex.stories.js +124 -141
  57. package/stories/layout/LayoutOverview.stories.js +345 -250
  58. package/stories/layout/LayoutSystem.stories.js +60 -76
  59. package/stories/patterns/InteractiveStates.stories.js +29 -29
  60. package/stories/patterns/Utilities.stories.js +17 -5
  61. package/stories/primitives/Alerts.stories.js +6 -6
  62. package/stories/primitives/Cards.stories.js +22 -11
  63. package/stories/primitives/{Forms.stories.js → FormElements.stories.js} +20 -11
  64. package/stories/primitives/HtmlFormElements.stories.js +128 -0
  65. package/stories/primitives/{FormGroups.stories.js → HtmlFormGroups.stories.js} +70 -21
  66. package/stories/primitives/Media.stories.js +23 -20
  67. package/stories/utilities/Backdrop.stories.js +68 -27
  68. package/stories/utils/PdsAsk.stories.js +15 -14
  69. package/public/assets/js/app.js.map +0 -7
  70. package/public/assets/js/lit.js.map +0 -7
  71. package/public/assets/js/pds.js.map +0 -7
  72. package/stories/components/PdsJsonform.stories.js +0 -1929
  73. /package/src/{pds-core → node-api}/pds-api.js +0 -0
@@ -1,6 +1,6 @@
1
- # pds-jsonform uiSchema Reference
1
+ # pds-form uiSchema Reference
2
2
 
3
- The **uiSchema** is the configuration object that controls how `pds-jsonform` renders and behaves. While JSON Schema defines *what* data to collect, uiSchema defines *how* to collect it.
3
+ The **uiSchema** is the configuration object that controls how `pds-form` renders and behaves. While JSON Schema defines *what* data to collect, uiSchema defines *how* to collect it.
4
4
 
5
5
  ## Path Notation
6
6
 
@@ -18,20 +18,7 @@ if (typeof window !== 'undefined') {
18
18
 
19
19
  // Minimal story-specific styles - only for demo-specific visuals not covered by PDS
20
20
  const richtextStoryStyles = html`
21
- <style>
22
- /* Avatar circle - demo-specific */
23
- .richtext-avatar {
24
- width: 3rem;
25
- height: 3rem;
26
- background: var(--color-primary);
27
- border-radius: var(--radius-full);
28
- display: flex;
29
- align-items: center;
30
- justify-content: center;
31
- color: var(--color-primary-contrast, #fff);
32
- flex-shrink: 0;
33
- }
34
- </style>
21
+
35
22
  `;
36
23
 
37
24
  const bindToastForms = (selector) => {
@@ -125,7 +112,7 @@ export const InForm = () => {
125
112
  ${richtextStoryStyles}
126
113
  <form class="richtext-form max-w-md stack-md">
127
114
  <label>
128
- <span>Blog Post Content</span>
115
+ <span data-label>Blog Post Content</span>
129
116
  <pds-richtext
130
117
  name="blog-content"
131
118
  value="<h3>My Blog Post</h3><p>Write your content here...</p>"
@@ -214,7 +201,7 @@ export const CommentEditor = () => {
214
201
  <div class="max-w-md stack-md">
215
202
  <article class="card surface-elevated">
216
203
  <div class="flex gap-sm">
217
- <div class="richtext-avatar">
204
+ <div class="story-richtext-avatar">
218
205
  <pds-icon icon="user"></pds-icon>
219
206
  </div>
220
207
  <div class="grow stack-sm">
@@ -259,7 +246,7 @@ export const MarkdownForm = () => {
259
246
  ${richtextStoryStyles}
260
247
  <form class="richtext-markdown-form max-w-md stack-md">
261
248
  <label>
262
- <span>Release Notes (Markdown)</span>
249
+ <span data-label>Release Notes (Markdown)</span>
263
250
  <pds-richtext
264
251
  name="release-notes"
265
252
  format="markdown"
@@ -1,86 +1,128 @@
1
- import { html } from 'lit';
1
+ import { html } from "lit";
2
2
 
3
3
  const docsParameters = {
4
4
  description: {
5
- component: 'Horizontal scrolling container with navigation buttons'
6
- }
5
+ component: "Horizontal scrolling container with navigation buttons",
6
+ },
7
7
  };
8
8
 
9
- if (typeof window !== 'undefined') {
10
- import('../reference/reference-docs.js')
9
+ if (typeof window !== "undefined") {
10
+ import("../reference/reference-docs.js")
11
11
  .then(({ createComponentDocsPage }) => {
12
- docsParameters.page = createComponentDocsPage('pds-scrollrow');
12
+ docsParameters.page = createComponentDocsPage("pds-scrollrow");
13
13
  })
14
14
  .catch((error) => {
15
- console.warn('storybook: docs page failed to load for pds-scrollrow', error);
15
+ console.warn(
16
+ "storybook: docs page failed to load for pds-scrollrow",
17
+ error
18
+ );
16
19
  });
17
20
  }
18
21
 
19
22
  // Demo-specific styles for scrollrow cards (min-width required for scroll behavior)
20
23
  const scrollrowStoryStyles = html`
21
24
  <style>
22
- .scrollrow-card { min-width: 18.75rem; }
23
- .scrollrow-card--sm { min-width: 12.5rem; }
24
- .scrollrow-card--product { min-width: 17.5rem; }
25
- .scrollrow-image {
26
- min-width: 18.75rem;
27
- height: 12.5rem;
28
- object-fit: cover;
29
- border-radius: var(--radius-md);
25
+ .story-scrollrow-card {
26
+ min-width: 18.75rem;
30
27
  }
31
- .scrollrow-avatar {
28
+ .story-scrollrow-card--sm {
29
+ min-width: 12.5rem;
30
+ }
31
+ .story-scrollrow-image {
32
+ min-width: 18.75rem;
33
+ height: 12.5rem;
34
+ object-fit: cover;
35
+ border-radius: var(--radius-md);
36
+ }
37
+ .story-scrollrow-avatar {
32
38
  width: 100px;
33
39
  height: 100px;
34
40
  border-radius: var(--radius-full);
35
41
  margin: 0 auto;
36
42
  }
37
- .scrollrow-product-image {
43
+ .story-product-gallery {
44
+ article.card {
45
+ min-width: 250px;
46
+ display: flex;
47
+ flex-direction: column;
48
+ }
49
+ .story-product-content {
50
+ flex: 1;
51
+ }
52
+ .story-product-footer {
53
+ margin-top: auto;
54
+ padding-top: var(--spacing-3);
55
+ }
56
+ }
57
+ .story-product-image {
38
58
  width: 100%;
39
- height: 200px;
59
+ aspect-ratio: 4/3;
40
60
  object-fit: cover;
41
61
  border-radius: var(--radius-md);
42
62
  }
43
- .scrollrow-price {
63
+ .story-product-price {
44
64
  font-size: var(--font-size-xl);
45
65
  font-weight: var(--font-weight-bold);
46
- color: var(--color-primary);
66
+ color: var(--color-primary-600);
47
67
  }
48
68
  </style>
49
69
  `;
50
70
 
51
71
  export default {
52
- title: 'Components/Pds Scrollrow',
53
- tags: ['autodocs', 'scrollrow', 'scroll', 'carousel', 'horizontal', 'overflow'],
72
+ title: "Components/Pds Scrollrow",
73
+ tags: [
74
+ "autodocs",
75
+ "scrollrow",
76
+ "scroll",
77
+ "carousel",
78
+ "horizontal",
79
+ "overflow",
80
+ ],
54
81
  parameters: {
55
82
  pds: {
56
- tags: ['scrollrow', 'scroll', 'carousel', 'horizontal', 'overflow', 'pds-scrollrow', 'layout']
83
+ tags: [
84
+ "scrollrow",
85
+ "scroll",
86
+ "carousel",
87
+ "horizontal",
88
+ "overflow",
89
+ "pds-scrollrow",
90
+ "layout",
91
+ ],
57
92
  },
58
- docs: docsParameters
59
- }
93
+ docs: docsParameters,
94
+ },
60
95
  };
61
96
 
62
97
  export const Default = () => html`
63
98
  ${scrollrowStoryStyles}
64
99
  <pds-scrollrow>
65
- ${Array.from({ length: 10 }, (_, i) => html`
66
- <article class="card scrollrow-card stack-sm">
67
- <h4>Card ${i + 1}</h4>
68
- <p>This is card content that scrolls horizontally.</p>
69
- <button class="btn-primary">Action</button>
70
- </article>
71
- `)}
100
+ ${Array.from(
101
+ { length: 10 },
102
+ (_, i) => html`
103
+ <article class="card story-scrollrow-card stack-sm">
104
+ <h4>Card ${i + 1}</h4>
105
+ <p>This is card content that scrolls horizontally.</p>
106
+ <button class="btn-primary">Action</button>
107
+ </article>
108
+ `
109
+ )}
72
110
  </pds-scrollrow>
73
111
  `;
74
112
 
75
113
  export const WithImages = () => html`
76
114
  ${scrollrowStoryStyles}
77
115
  <pds-scrollrow>
78
- ${Array.from({ length: 10 }, (_, i) => html`
79
- <img
80
- src="https://picsum.photos/300/200?random=${i}"
81
- alt="Gallery image ${i + 1}"
82
- class="scrollrow-image">
83
- `)}
116
+ ${Array.from(
117
+ { length: 10 },
118
+ (_, i) => html`
119
+ <img
120
+ src="https://picsum.photos/300/200?random=${i}"
121
+ alt="Gallery image ${i + 1}"
122
+ class="story-scrollrow-image"
123
+ />
124
+ `
125
+ )}
84
126
  </pds-scrollrow>
85
127
  `;
86
128
 
@@ -88,51 +130,161 @@ export const ProductGallery = () => html`
88
130
  ${scrollrowStoryStyles}
89
131
  <div class="stack-md">
90
132
  <h3>Featured Products</h3>
91
- <pds-scrollrow snap="start">
92
- ${Array.from({ length: 8 }, (_, i) => html`
93
- <article class="card scrollrow-card--product stack-sm">
94
- <img
95
- src="https://picsum.photos/280/200?random=${100 + i}"
96
- alt="Product ${i + 1}"
97
- class="scrollrow-product-image">
98
- <h4>Product ${i + 1}</h4>
99
- <small class="text-muted">Premium quality product with amazing features.</small>
100
- <div class="flex justify-between items-center">
101
- <span class="scrollrow-price">$${(i + 1) * 10 + 29}</span>
102
- <button class="btn-primary btn-sm">
103
- <pds-icon icon="shopping-cart" size="sm"></pds-icon>
104
- Add
105
- </button>
106
- </div>
107
- </article>
108
- `)}
133
+ <pds-scrollrow snap="start" class="story-product-gallery">
134
+ ${Array.from(
135
+ { length: 8 },
136
+ (_, i) => html`
137
+ <article class="card stack-sm">
138
+ <img
139
+ src="https://picsum.photos/280/200?random=${100 + i}"
140
+ alt="Product ${i + 1}"
141
+ class="story-product-image"
142
+ />
143
+ <div class="story-product-content">
144
+ <h4>Product ${i + 1}</h4>
145
+ <small class="text-muted"
146
+ >Premium quality product with amazing features.</small
147
+ >
148
+ </div>
149
+ <div class="story-product-footer flex justify-between items-center">
150
+ <span class="story-product-price">$${(i + 1) * 10 + 29}</span>
151
+ <button class="btn-primary btn-sm">
152
+ <pds-icon icon="shopping-cart" size="sm"></pds-icon>
153
+ Add
154
+ </button>
155
+ </div>
156
+ </article>
157
+ `
158
+ )}
109
159
  </pds-scrollrow>
110
160
  </div>
111
161
  `;
112
162
 
113
- ProductGallery.storyName = 'Product Gallery';
163
+ ProductGallery.storyName = "Product Gallery";
114
164
 
115
165
  export const UserProfiles = () => html`
116
166
  ${scrollrowStoryStyles}
117
167
  <div class="stack-md">
118
168
  <h3>Team Members</h3>
119
169
  <pds-scrollrow>
120
- ${Array.from({ length: 12 }, (_, i) => html`
121
- <article class="card surface-elevated scrollrow-card--sm stack-sm text-center">
122
- <img
123
- src="https://i.pravatar.cc/150?img=${i + 1}"
124
- alt="Team member ${i + 1}"
125
- class="scrollrow-avatar">
126
- <h4>Team Member ${i + 1}</h4>
127
- <p><small class="text-muted">Role Title</small></p>
128
- <button class="btn-outline btn-sm">
129
- <pds-icon icon="chat-circle" size="sm"></pds-icon>
130
- Message
131
- </button>
132
- </article>
133
- `)}
170
+ ${Array.from(
171
+ { length: 12 },
172
+ (_, i) => html`
173
+ <article
174
+ class="card surface-elevated story-scrollrow-card--sm stack-sm text-center"
175
+ >
176
+ <img
177
+ src="https://i.pravatar.cc/150?img=${i + 1}"
178
+ alt="Team member ${i + 1}"
179
+ class="story-scrollrow-avatar"
180
+ />
181
+ <h4>Team Member ${i + 1}</h4>
182
+ <p><small class="text-muted">Role Title</small></p>
183
+ <button class="btn-outline btn-sm">
184
+ <pds-icon icon="chat-circle" size="sm"></pds-icon>
185
+ Message
186
+ </button>
187
+ </article>
188
+ `
189
+ )}
190
+ </pds-scrollrow>
191
+ </div>
192
+ `;
193
+
194
+ UserProfiles.storyName = "User Profiles";
195
+
196
+ export const CustomStyledButtons = () => html`
197
+ ${scrollrowStoryStyles}
198
+ <style>
199
+ .story-scrollrow-custom-buttons::part(prev),
200
+ .story-scrollrow-custom-buttons::part(next) {
201
+ background: rgba(var(--color-primary-rgb), 0.15);
202
+ border: 2px solid var(--color-primary);
203
+ color: var(--color-primary);
204
+ border-radius: var(--radius-full);
205
+ backdrop-filter: blur(4px);
206
+ }
207
+ .story-scrollrow-custom-buttons::part(prev):hover,
208
+ .story-scrollrow-custom-buttons::part(next):hover {
209
+ background: rgba(var(--color-primary-rgb), 0.3);
210
+ }
211
+ </style>
212
+ <div class="stack-md">
213
+ <h3>Outlined Semitransparent Buttons</h3>
214
+ <pds-scrollrow class="story-scrollrow-custom-buttons">
215
+ ${Array.from(
216
+ { length: 10 },
217
+ (_, i) => html`
218
+ <article class="card story-scrollrow-card stack-sm">
219
+ <h4>Card ${i + 1}</h4>
220
+ <p>
221
+ Custom styled navigation buttons with outline and transparency.
222
+ </p>
223
+ <button class="btn-primary">Action</button>
224
+ </article>
225
+ `
226
+ )}
227
+ </pds-scrollrow>
228
+ </div>
229
+ `;
230
+
231
+ CustomStyledButtons.storyName = "Custom Styled Buttons";
232
+
233
+ export const ExternalButtons = () => html`
234
+ ${scrollrowStoryStyles}
235
+ <style>
236
+ .story-scrollrow-external::part(prev),
237
+ .story-scrollrow-external::part(next) {
238
+ display: none;
239
+ }
240
+ .story-external-nav-btn {
241
+ background: rgba(var(--color-surface-rgb), 0.8);
242
+ border: 2px solid var(--color-border);
243
+ color: var(--color-text);
244
+ width: 3rem;
245
+ height: 3rem;
246
+ border-radius: var(--radius-full);
247
+ backdrop-filter: blur(4px);
248
+ cursor: pointer;
249
+ transition: all 0.2s ease;
250
+ }
251
+ .story-external-nav-btn:hover {
252
+ background: var(--color-primary);
253
+ border-color: var(--color-primary);
254
+ color: var(--color-on-primary);
255
+ }
256
+ </style>
257
+ <div class="stack-sm">
258
+ <h3>External Navigation Buttons</h3>
259
+ <pds-scrollrow class="story-scrollrow-external">
260
+ ${Array.from(
261
+ { length: 10 },
262
+ (_, i) => html`
263
+ <article class="card story-scrollrow-card stack-sm">
264
+ <h4>Card ${i + 1}</h4>
265
+ <p>Navigation buttons are below the scroll area.</p>
266
+ <button class="btn-secondary">Details</button>
267
+ </article>
268
+ `
269
+ )}
134
270
  </pds-scrollrow>
271
+ <div class="flex justify-center gap-md">
272
+ <button
273
+ class="story-external-nav-btn"
274
+ part="prev"
275
+ onclick="this.closest('.stack-sm').querySelector('pds-scrollrow').doPage({currentTarget: this})"
276
+ >
277
+ <pds-icon icon="caret-left"></pds-icon>
278
+ </button>
279
+ <button
280
+ class="story-external-nav-btn"
281
+ part="next"
282
+ onclick="this.closest('.stack-sm').querySelector('pds-scrollrow').doPage({currentTarget: this})"
283
+ >
284
+ <pds-icon icon="caret-right"></pds-icon>
285
+ </button>
286
+ </div>
135
287
  </div>
136
288
  `;
137
289
 
138
- UserProfiles.storyName = 'User Profiles';
290
+ ExternalButtons.storyName = "External Buttons";
@@ -16,24 +16,59 @@ if (typeof window !== 'undefined') {
16
16
  });
17
17
  }
18
18
 
19
- // Minimal styles for split panel demos
19
+ // Story-specific styles for split panel demos
20
20
  const splitpanelStoryStyles = html`
21
21
  <style>
22
22
  pds-splitpanel.card {
23
23
  padding: 0;
24
24
  }
25
25
  [slot="left"], [slot="right"] { padding: var(--spacing-2); }
26
- .splitpanel-console {
26
+ .story-splitpanel-console {
27
27
  background: #1e1e1e;
28
28
  color: #d4d4d4;
29
- & .cmd { color: #4ec9b0; }
30
- & .meta { color: #6a9955; }
29
+ & .story-cmd { color: #4ec9b0; }
30
+ & .story-meta { color: #6a9955; }
31
31
  }
32
- .splitpanel-stat {
32
+ .story-splitpanel-stat {
33
33
  font-size: 2.5rem;
34
34
  font-weight: 700;
35
35
  margin: var(--spacing-2) 0;
36
36
  }
37
+ /* Violations fixed */
38
+ .story-label-uppercase {
39
+ font-size: var(--font-size-xs);
40
+ text-transform: uppercase;
41
+ letter-spacing: 0.08em;
42
+ }
43
+ .story-label-sm {
44
+ font-size: var(--font-size-sm);
45
+ }
46
+ .story-code-block {
47
+ padding: var(--spacing-3);
48
+ border-radius: var(--radius-md);
49
+ font-family: var(--font-family-mono);
50
+ font-size: 0.875rem;
51
+ overflow: auto;
52
+ background: var(--surface-bg-secondary);
53
+ }
54
+ .story-console {
55
+ padding: var(--spacing-3);
56
+ border-radius: var(--radius-md);
57
+ font-family: var(--font-family-mono);
58
+ }
59
+ .story-nav-btn {
60
+ justify-content: flex-start;
61
+ }
62
+ .story-activity-item {
63
+ padding: var(--spacing-2);
64
+ border-radius: var(--radius-sm);
65
+ }
66
+ .story-alert-list {
67
+ margin-top: var(--spacing-2);
68
+ }
69
+ .story-alert-margin {
70
+ margin-bottom: var(--spacing-4);
71
+ }
37
72
  </style>
38
73
  `;
39
74
 
@@ -54,7 +89,7 @@ export const Default = () => html`
54
89
  <div slot="left" class="stack-md">
55
90
  <div class="stack-sm">
56
91
  <div>
57
- <p class="text-muted text-xs" style="text-transform: uppercase; letter-spacing: 0.08em;">Leadership Sync</p>
92
+ <p class="text-muted story-label-uppercase">Leadership Sync</p>
58
93
  <h3>Q4 Roadmap Planning</h3>
59
94
  <p class="text-muted">Monday, 2:00 PM • Conference Room Aurora</p>
60
95
  </div>
@@ -137,7 +172,7 @@ export const CodeEditorLayout = () => html`
137
172
  <div slot="left" class="stack-md">
138
173
  <h3>Code Editor</h3>
139
174
 
140
- <pre style="padding: var(--spacing-3); border-radius: var(--radius-md); font-family: var(--font-family-mono); font-size: 0.875rem; overflow: auto; background: var(--surface-bg-secondary);"><code>function greet(name) {
175
+ <pre class="story-code-block"><code>function greet(name) {
141
176
  console.log('Hello, ' + name + '!');
142
177
  }
143
178
 
@@ -158,10 +193,10 @@ greet('World');</code></pre>
158
193
  <div slot="right" class="stack-md">
159
194
  <h3>Output Console</h3>
160
195
 
161
- <div class="splitpanel-console stack-xs" style="padding: var(--spacing-3); border-radius: var(--radius-md); font-family: var(--font-family-mono);">
162
- <div class="cmd">$ node script.js</div>
196
+ <div class="story-splitpanel-console stack-xs story-console">
197
+ <div class="story-cmd">$ node script.js</div>
163
198
  <div>Hello, World!</div>
164
- <div class="meta">// Execution completed in 0.23s</div>
199
+ <div class="story-meta">// Execution completed in 0.23s</div>
165
200
  </div>
166
201
  </div>
167
202
  </pds-splitpanel>
@@ -176,19 +211,19 @@ export const DashboardLayout = () => html`
176
211
  <h3>Navigation</h3>
177
212
 
178
213
  <nav class="stack-sm">
179
- <button class="btn-outline" style="justify-content: flex-start;">
214
+ <button class="btn-outline story-nav-btn">
180
215
  <pds-icon icon="house"></pds-icon>
181
216
  Dashboard
182
217
  </button>
183
- <button class="btn-outline" style="justify-content: flex-start;">
218
+ <button class="btn-outline story-nav-btn">
184
219
  <pds-icon icon="bar-chart"></pds-icon>
185
220
  Analytics
186
221
  </button>
187
- <button class="btn-outline" style="justify-content: flex-start;">
222
+ <button class="btn-outline story-nav-btn">
188
223
  <pds-icon icon="users"></pds-icon>
189
224
  Users
190
225
  </button>
191
- <button class="btn-outline" style="justify-content: flex-start;">
226
+ <button class="btn-outline story-nav-btn">
192
227
  <pds-icon icon="gear"></pds-icon>
193
228
  Settings
194
229
  </button>
@@ -201,20 +236,20 @@ export const DashboardLayout = () => html`
201
236
  <div class="grid grid-auto-sm gap-md">
202
237
  <div>
203
238
  <h4>Total Users</h4>
204
- <div class="splitpanel-stat text-primary">1,284</div>
205
- <p class="text-muted text-sm">↑ 12% from last month</p>
239
+ <div class="story-splitpanel-stat text-primary">1,284</div>
240
+ <p class="text-muted story-label-sm">↑ 12% from last month</p>
206
241
  </div>
207
242
 
208
243
  <div>
209
244
  <h4>Revenue</h4>
210
- <div class="splitpanel-stat text-secondary">$42.5K</div>
211
- <p class="text-muted text-sm">↑ 8% from last month</p>
245
+ <div class="story-splitpanel-stat text-secondary">$42.5K</div>
246
+ <p class="text-muted story-label-sm">↑ 8% from last month</p>
212
247
  </div>
213
248
 
214
249
  <div>
215
250
  <h4>Active Now</h4>
216
- <div class="splitpanel-stat text-accent">127</div>
217
- <p class="text-muted text-sm">Current active users</p>
251
+ <div class="story-splitpanel-stat text-accent">127</div>
252
+ <p class="text-muted story-label-sm">Current active users</p>
218
253
  </div>
219
254
  </div>
220
255
 
@@ -222,13 +257,13 @@ export const DashboardLayout = () => html`
222
257
  <h3>Recent Activity</h3>
223
258
  <div class="stack-sm">
224
259
  ${Array.from({ length: 5 }, (_, i) => html`
225
- <div class="flex items-center gap-md" style="padding: var(--spacing-2); border-radius: var(--radius-sm);">
260
+ <div class="flex items-center gap-md story-activity-item">
226
261
  <pds-icon icon="user"></pds-icon>
227
262
  <div class="grow stack-xs">
228
263
  <strong>User ${i + 1}</strong>
229
- <span class="text-muted text-sm">Completed an action</span>
264
+ <span class="text-muted story-label-sm">Completed an action</span>
230
265
  </div>
231
- <span class="text-muted text-sm">${i + 1}h ago</span>
266
+ <span class="text-muted story-label-sm">${i + 1}h ago</span>
232
267
  </div>
233
268
  `)}
234
269
  </div>
@@ -249,7 +284,7 @@ export const StyledToggle = () => html`
249
284
  }
250
285
  </style>
251
286
 
252
- <div class="alert alert-info" style="margin-bottom: var(--spacing-4);">
287
+ <div class="alert alert-info story-alert-margin">
253
288
  <div class="alert-icon">
254
289
  <pds-icon icon="info" class="icon-info" size="lg"></pds-icon>
255
290
  </div>
@@ -263,15 +298,15 @@ export const StyledToggle = () => html`
263
298
  <div slot="left" class="stack-md">
264
299
  <h3>Mobile Menu</h3>
265
300
  <nav class="stack-sm">
266
- <button class="btn-outline" style="justify-content: flex-start;">
301
+ <button class="btn-outline story-nav-btn">
267
302
  <pds-icon icon="house"></pds-icon>
268
303
  Home
269
304
  </button>
270
- <button class="btn-outline" style="justify-content: flex-start;">
305
+ <button class="btn-outline story-nav-btn">
271
306
  <pds-icon icon="user"></pds-icon>
272
307
  Profile
273
308
  </button>
274
- <button class="btn-outline" style="justify-content: flex-start;">
309
+ <button class="btn-outline story-nav-btn">
275
310
  <pds-icon icon="gear"></pds-icon>
276
311
  Settings
277
312
  </button>
@@ -329,7 +364,7 @@ export const StyledSplitter = () => html`
329
364
  <div>
330
365
  <div class="alert-title">Styling the Splitter with ::part()</div>
331
366
  <p>The splitter bar can be fully customized using the <code>::part(splitter)</code> CSS selector. This allows you to style:</p>
332
- <ul class="stack-xs" style="margin-top: var(--spacing-2);">
367
+ <ul class="stack-xs story-alert-list">
333
368
  <li><code>background-color</code> or <code>background</code> (for gradients)</li>
334
369
  <li><code>width</code> (horizontal) or <code>height</code> (vertical)</li>
335
370
  <li><code>:hover</code> state styling</li>
@@ -20,18 +20,18 @@ if (typeof window !== 'undefined') {
20
20
  const tabstripStoryStyles = html`
21
21
  <style>
22
22
  /* Progress bar visualization - demo-specific */
23
- .tabstrip-bar-track {
23
+ .story-tabstrip-bar-track {
24
24
  height: 8px;
25
25
  background: var(--surface-elevated);
26
26
  border-radius: var(--radius-full);
27
27
  overflow: hidden;
28
28
  }
29
- .tabstrip-bar-fill {
29
+ .story-tabstrip-bar-fill {
30
30
  height: 100%;
31
31
  border-radius: inherit;
32
32
  }
33
33
  /* Large stat values - demo-specific typography */
34
- .tabstrip-stat-value {
34
+ .story-tabstrip-stat-value {
35
35
  font-size: var(--font-size-4xl);
36
36
  font-weight: var(--font-weight-bold);
37
37
  }
@@ -185,8 +185,8 @@ export const Default = () => html`
185
185
  <span>${source.label}</span>
186
186
  <strong>${source.value}</strong>
187
187
  </div>
188
- <div class="tabstrip-bar-track">
189
- <div class="tabstrip-bar-fill" style="width: ${source.width}; background: ${source.colorVar}"></div>
188
+ <div class="story-tabstrip-bar-track">
189
+ <div class="story-tabstrip-bar-fill" style="width: ${source.width}; background: ${source.colorVar}"></div>
190
190
  </div>
191
191
  </div>
192
192
  `
@@ -216,7 +216,7 @@ export const Default = () => html`
216
216
  <h4>General Settings</h4>
217
217
  <div class="stack-sm">
218
218
  <label>
219
- <span>Product Name</span>
219
+ <span data-label>Product Name</span>
220
220
  <input
221
221
  type="text"
222
222
  value="My Awesome Product"
@@ -225,7 +225,7 @@ export const Default = () => html`
225
225
  </label>
226
226
 
227
227
  <label>
228
- <span>Product Category</span>
228
+ <span data-label>Product Category</span>
229
229
  <select>
230
230
  ${tabstripCategories.map(
231
231
  (category) => html`<option>${category}</option>`