@pure-ds/storybook 0.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.
Files changed (129) hide show
  1. package/.storybook/addons/description/preview.js +15 -0
  2. package/.storybook/addons/description/register.js +60 -0
  3. package/.storybook/addons/html-preview/Panel.jsx +327 -0
  4. package/.storybook/addons/html-preview/constants.js +6 -0
  5. package/.storybook/addons/html-preview/preview.js +178 -0
  6. package/.storybook/addons/html-preview/register.js +16 -0
  7. package/.storybook/addons/pds-configurator/SearchTool.js +44 -0
  8. package/.storybook/addons/pds-configurator/Tool.js +30 -0
  9. package/.storybook/addons/pds-configurator/constants.js +9 -0
  10. package/.storybook/addons/pds-configurator/preview.js +159 -0
  11. package/.storybook/addons/pds-configurator/register.js +24 -0
  12. package/.storybook/docs.css +35 -0
  13. package/.storybook/htmlPreview.css +103 -0
  14. package/.storybook/htmlPreview.js +271 -0
  15. package/.storybook/main.js +160 -0
  16. package/.storybook/preview-body.html +48 -0
  17. package/.storybook/preview-head.html +11 -0
  18. package/.storybook/preview.js +1563 -0
  19. package/README.md +266 -0
  20. package/bin/index.js +40 -0
  21. package/dist/pds-reference.json +2101 -0
  22. package/package.json +45 -0
  23. package/pds.config.js +6 -0
  24. package/public/assets/css/app.css +1216 -0
  25. package/public/assets/data/auto-design-advanced.json +704 -0
  26. package/public/assets/data/auto-design-simple.json +123 -0
  27. package/public/assets/img/icon-512x512.png +0 -0
  28. package/public/assets/img/logo-trans.png +0 -0
  29. package/public/assets/img/logo.png +0 -0
  30. package/public/assets/js/app.js +15088 -0
  31. package/public/assets/js/app.js.map +7 -0
  32. package/public/assets/js/lit.js +1176 -0
  33. package/public/assets/js/lit.js.map +7 -0
  34. package/public/assets/js/pds.js +9801 -0
  35. package/public/assets/js/pds.js.map +7 -0
  36. package/public/assets/pds/components/pds-calendar.js +837 -0
  37. package/public/assets/pds/components/pds-drawer.js +857 -0
  38. package/public/assets/pds/components/pds-icon.js +338 -0
  39. package/public/assets/pds/components/pds-jsonform.js +1775 -0
  40. package/public/assets/pds/components/pds-richtext.js +1035 -0
  41. package/public/assets/pds/components/pds-scrollrow.js +331 -0
  42. package/public/assets/pds/components/pds-splitpanel.js +401 -0
  43. package/public/assets/pds/components/pds-tabstrip.js +251 -0
  44. package/public/assets/pds/components/pds-toaster.js +446 -0
  45. package/public/assets/pds/components/pds-upload.js +657 -0
  46. package/public/assets/pds/custom-elements.json +2003 -0
  47. package/public/assets/pds/icons/pds-icons.svg +498 -0
  48. package/public/assets/pds/pds-css-complete.json +1861 -0
  49. package/public/assets/pds/pds-runtime-config.json +11 -0
  50. package/public/assets/pds/pds.css-data.json +2152 -0
  51. package/public/assets/pds/styles/pds-components.css +1944 -0
  52. package/public/assets/pds/styles/pds-components.css.js +3895 -0
  53. package/public/assets/pds/styles/pds-primitives.css +352 -0
  54. package/public/assets/pds/styles/pds-primitives.css.js +711 -0
  55. package/public/assets/pds/styles/pds-styles.css +3761 -0
  56. package/public/assets/pds/styles/pds-styles.css.js +7529 -0
  57. package/public/assets/pds/styles/pds-tokens.css +699 -0
  58. package/public/assets/pds/styles/pds-tokens.css.js +1405 -0
  59. package/public/assets/pds/styles/pds-utilities.css +763 -0
  60. package/public/assets/pds/styles/pds-utilities.css.js +1533 -0
  61. package/public/assets/pds/vscode-custom-data.json +824 -0
  62. package/scripts/build-pds-reference.mjs +807 -0
  63. package/scripts/generate-stories.js +542 -0
  64. package/scripts/package-build.js +86 -0
  65. package/src/js/app.js +17 -0
  66. package/src/js/common/ask.js +208 -0
  67. package/src/js/common/common.js +20 -0
  68. package/src/js/common/font-loader.js +200 -0
  69. package/src/js/common/msg.js +90 -0
  70. package/src/js/lit.js +40 -0
  71. package/src/js/pds-core/pds-config.js +1162 -0
  72. package/src/js/pds-core/pds-enhancer-metadata.js +75 -0
  73. package/src/js/pds-core/pds-enhancers.js +357 -0
  74. package/src/js/pds-core/pds-enums.js +86 -0
  75. package/src/js/pds-core/pds-generator.js +5317 -0
  76. package/src/js/pds-core/pds-ontology.js +256 -0
  77. package/src/js/pds-core/pds-paths.js +109 -0
  78. package/src/js/pds-core/pds-query.js +571 -0
  79. package/src/js/pds-core/pds-registry.js +129 -0
  80. package/src/js/pds-core/pds.d.ts +129 -0
  81. package/src/js/pds.d.ts +408 -0
  82. package/src/js/pds.js +1579 -0
  83. package/src/pds-core/pds-api.js +105 -0
  84. package/stories/GettingStarted.md +96 -0
  85. package/stories/GettingStarted.stories.js +144 -0
  86. package/stories/WhatIsPDS.md +194 -0
  87. package/stories/WhatIsPDS.stories.js +144 -0
  88. package/stories/components/PdsCalendar.stories.js +263 -0
  89. package/stories/components/PdsDrawer.stories.js +623 -0
  90. package/stories/components/PdsIcon.stories.js +78 -0
  91. package/stories/components/PdsJsonform.stories.js +1444 -0
  92. package/stories/components/PdsRichtext.stories.js +367 -0
  93. package/stories/components/PdsScrollrow.stories.js +140 -0
  94. package/stories/components/PdsSplitpanel.stories.js +502 -0
  95. package/stories/components/PdsTabstrip.stories.js +442 -0
  96. package/stories/components/PdsToaster.stories.js +186 -0
  97. package/stories/components/PdsUpload.stories.js +66 -0
  98. package/stories/enhancements/Dropdowns.stories.js +185 -0
  99. package/stories/enhancements/InteractiveStates.stories.js +625 -0
  100. package/stories/enhancements/MeshGradients.stories.js +320 -0
  101. package/stories/enhancements/OpenGroups.stories.js +227 -0
  102. package/stories/enhancements/RangeSliders.stories.js +232 -0
  103. package/stories/enhancements/RequiredFields.stories.js +189 -0
  104. package/stories/enhancements/Toggles.stories.js +167 -0
  105. package/stories/foundations/Colors.stories.js +283 -0
  106. package/stories/foundations/Icons.stories.js +305 -0
  107. package/stories/foundations/SmartSurfaces.stories.js +367 -0
  108. package/stories/foundations/Spacing.stories.js +175 -0
  109. package/stories/foundations/Typography.stories.js +960 -0
  110. package/stories/foundations/ZIndex.stories.js +325 -0
  111. package/stories/patterns/BorderEffects.stories.js +72 -0
  112. package/stories/patterns/Layout.stories.js +99 -0
  113. package/stories/patterns/Utilities.stories.js +107 -0
  114. package/stories/primitives/Accordion.stories.js +359 -0
  115. package/stories/primitives/Alerts.stories.js +64 -0
  116. package/stories/primitives/Badges.stories.js +183 -0
  117. package/stories/primitives/Buttons.stories.js +229 -0
  118. package/stories/primitives/Cards.stories.js +353 -0
  119. package/stories/primitives/FormGroups.stories.js +569 -0
  120. package/stories/primitives/Forms.stories.js +131 -0
  121. package/stories/primitives/Media.stories.js +203 -0
  122. package/stories/primitives/Tables.stories.js +232 -0
  123. package/stories/reference/ReferenceCatalog.stories.js +28 -0
  124. package/stories/reference/reference-catalog.js +413 -0
  125. package/stories/reference/reference-docs.js +302 -0
  126. package/stories/reference/reference-helpers.js +310 -0
  127. package/stories/utilities/GridSystem.stories.js +208 -0
  128. package/stories/utils/PdsAsk.stories.js +420 -0
  129. package/stories/utils/toast-utils.js +148 -0
@@ -0,0 +1,367 @@
1
+ import { html } from 'lit';
2
+
3
+ export default {
4
+ title: 'Foundations/Smart Surfaces',
5
+ parameters: {
6
+ pds: {
7
+ tags: ['surface', 'colors', 'layout']
8
+ },
9
+ docs: {
10
+ description: {
11
+ component: 'Smart surface system that automatically adapts text, icons, shadows, and borders based on backgrounds. Maintains WCAG AA contrast ratios automatically.'
12
+ }
13
+ }
14
+ }
15
+ };
16
+
17
+ const smartSurfacesStoryStyles = html`
18
+ <style>
19
+ .smart-surfaces-section {
20
+ padding: var(--spacing-4);
21
+ }
22
+ .smart-surfaces-subtitle {
23
+ margin-bottom: var(--spacing-6);
24
+ }
25
+ .smart-surfaces-grid--variants {
26
+ display: grid;
27
+ grid-template-columns: repeat(auto-fit, minmax(15.625rem, 1fr));
28
+ gap: var(--spacing-4);
29
+ }
30
+ .smart-surfaces-grid--shadows {
31
+ display: grid;
32
+ grid-template-columns: repeat(auto-fit, minmax(12.5rem, 1fr));
33
+ gap: var(--spacing-6);
34
+ }
35
+ .smart-surfaces-grid--inversion {
36
+ display: grid;
37
+ grid-template-columns: repeat(auto-fit, minmax(18.75rem, 1fr));
38
+ gap: var(--spacing-4);
39
+ }
40
+ .smart-surfaces-grid--borders {
41
+ display: grid;
42
+ grid-template-columns: repeat(auto-fit, minmax(18.75rem, 1fr));
43
+ gap: var(--spacing-6);
44
+ }
45
+ .smart-surfaces-surface {
46
+ padding: var(--spacing-6);
47
+ border-radius: var(--radius-md);
48
+ }
49
+ .smart-surfaces-title {
50
+ display: flex;
51
+ align-items: center;
52
+ gap: var(--spacing-2);
53
+ }
54
+ .smart-surfaces-description {
55
+ margin-top: var(--spacing-2);
56
+ }
57
+ .smart-surfaces-button-spacing {
58
+ margin-top: var(--spacing-3);
59
+ }
60
+ .smart-surfaces-button-spacing-sm {
61
+ margin-top: var(--spacing-2);
62
+ }
63
+ .smart-surfaces-shadow-card {
64
+ padding: var(--spacing-6);
65
+ border-radius: var(--radius-md);
66
+ text-align: center;
67
+ }
68
+ .smart-surfaces-shadow-label {
69
+ display: block;
70
+ margin-top: var(--spacing-2);
71
+ }
72
+ .smart-surfaces-shadow-token {
73
+ margin: var(--spacing-1) 0 0 0;
74
+ opacity: 0.7;
75
+ }
76
+ .smart-surfaces-nested {
77
+ padding: var(--spacing-6);
78
+ border-radius: var(--radius-md);
79
+ }
80
+ .smart-surfaces-nested-inner {
81
+ padding: var(--spacing-6);
82
+ margin-top: var(--spacing-4);
83
+ border-radius: var(--radius-md);
84
+ }
85
+ .smart-surfaces-nested-grid {
86
+ display: grid;
87
+ grid-template-columns: repeat(2, 1fr);
88
+ gap: var(--spacing-4);
89
+ margin-top: var(--spacing-4);
90
+ }
91
+ .smart-surfaces-card {
92
+ padding: var(--spacing-4);
93
+ }
94
+ .smart-surfaces-sunken {
95
+ padding: var(--spacing-4);
96
+ margin-top: var(--spacing-3);
97
+ border-radius: var(--radius-sm);
98
+ }
99
+ .smart-surfaces-inline {
100
+ display: flex;
101
+ align-items: center;
102
+ gap: var(--spacing-2);
103
+ }
104
+ .smart-surfaces-border-card {
105
+ padding: var(--spacing-6);
106
+ }
107
+ .smart-surfaces-border-code {
108
+ font-size: var(--font-size-sm);
109
+ opacity: 0.7;
110
+ }
111
+ </style>
112
+ `;
113
+
114
+ export const SurfaceVariants = () => html`
115
+ ${smartSurfacesStoryStyles}
116
+ <div class="smart-surfaces-section">
117
+ <h2>Surface Variants</h2>
118
+ <p class="smart-surfaces-subtitle">
119
+ All surfaces automatically adjust text, icon, shadow, and border colors to maintain proper contrast.
120
+ </p>
121
+
122
+ <div class="smart-surfaces-grid--variants">
123
+ <div class="surface-base smart-surfaces-surface">
124
+ <strong class="surface-title smart-surfaces-title">
125
+ <pds-icon icon="square"></pds-icon>
126
+ Base Surface
127
+ </strong>
128
+ <p class="surface-description smart-surfaces-description">
129
+ Default background with auto-adjusted text and icons
130
+ </p>
131
+ <button class="btn-primary smart-surfaces-button-spacing">
132
+ Button
133
+ </button>
134
+ </div>
135
+
136
+ <div class="surface-subtle smart-surfaces-surface">
137
+ <strong class="surface-title smart-surfaces-title">
138
+ <pds-icon icon="square"></pds-icon>
139
+ Subtle Surface
140
+ </strong>
141
+ <p class="surface-description smart-surfaces-description">
142
+ Slightly different tone for visual hierarchy
143
+ </p>
144
+ <button class="btn-secondary smart-surfaces-button-spacing">
145
+ Button
146
+ </button>
147
+ </div>
148
+
149
+ <div class="surface-elevated smart-surfaces-surface">
150
+ <strong class="surface-title smart-surfaces-title">
151
+ <pds-icon icon="arrow-up"></pds-icon>
152
+ Elevated Surface
153
+ </strong>
154
+ <p class="surface-description smart-surfaces-description">
155
+ Raised with smart shadows that adapt in dark mode
156
+ </p>
157
+ <button class="btn-primary smart-surfaces-button-spacing">
158
+ Button
159
+ </button>
160
+ </div>
161
+
162
+ <div class="surface-overlay smart-surfaces-surface">
163
+ <strong class="surface-title smart-surfaces-title">
164
+ <pds-icon icon="desktop"></pds-icon>
165
+ Overlay Surface
166
+ </strong>
167
+ <p class="surface-description smart-surfaces-description">
168
+ Modal/dropdown backgrounds with stronger shadows
169
+ </p>
170
+ <button class="btn-outline smart-surfaces-button-spacing">
171
+ Button
172
+ </button>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ `;
177
+
178
+ SurfaceVariants.storyName = 'Surface Variants';
179
+
180
+ export const ContextAwareShadows = () => html`
181
+ ${smartSurfacesStoryStyles}
182
+ <div class="smart-surfaces-section">
183
+ <h2>Context-Aware Shadows</h2>
184
+ <p class="smart-surfaces-subtitle">
185
+ Shadows automatically invert in dark mode: dark shadows on light surfaces, light shadows on dark surfaces.
186
+ </p>
187
+
188
+ <div class="smart-surfaces-grid--shadows">
189
+ <div class="shadow-sm surface-elevated smart-surfaces-shadow-card">
190
+ <pds-icon icon="feather" size="lg"></pds-icon>
191
+ <strong class="smart-surfaces-shadow-label">Small</strong>
192
+ <p class="smart-surfaces-shadow-token">--shadow-sm</p>
193
+ </div>
194
+
195
+ <div class="shadow-md surface-elevated smart-surfaces-shadow-card">
196
+ <pds-icon icon="grid-four" size="lg"></pds-icon>
197
+ <strong class="smart-surfaces-shadow-label">Medium</strong>
198
+ <p class="smart-surfaces-shadow-token">--shadow-md</p>
199
+ </div>
200
+
201
+ <div class="shadow-lg surface-elevated smart-surfaces-shadow-card">
202
+ <pds-icon icon="rocket" size="lg"></pds-icon>
203
+ <strong class="smart-surfaces-shadow-label">Large</strong>
204
+ <p class="smart-surfaces-shadow-token">--shadow-lg</p>
205
+ </div>
206
+ </div>
207
+ </div>
208
+ `;
209
+
210
+ ContextAwareShadows.storyName = 'Context-Aware Shadows';
211
+
212
+ export const NestedSurfaces = () => html`
213
+ ${smartSurfacesStoryStyles}
214
+ <div class="smart-surfaces-section">
215
+ <h2>Nested Surfaces</h2>
216
+ <p class="smart-surfaces-subtitle">
217
+ Surfaces can be nested infinitely. Each level maintains proper contrast and visual hierarchy automatically.
218
+ </p>
219
+
220
+ <div class="surface-base smart-surfaces-nested">
221
+ <h4 class="smart-surfaces-title">
222
+ <pds-icon icon="circle"></pds-icon>
223
+ Level 1: Base Surface
224
+ </h4>
225
+ <p>Notice how icons and text adapt at each nesting level to maintain readability.</p>
226
+
227
+ <div class="surface-elevated smart-surfaces-nested-inner">
228
+ <h5 class="smart-surfaces-title">
229
+ <pds-icon icon="arrow-right"></pds-icon>
230
+ Level 2: Elevated Surface
231
+ </h5>
232
+ <p>Shadows and text colors automatically adjust</p>
233
+
234
+ <div class="smart-surfaces-nested-grid">
235
+ <div class="card smart-surfaces-card">
236
+ <h6 class="smart-surfaces-title">
237
+ <pds-icon icon="check"></pds-icon>
238
+ Level 3: Card
239
+ </h6>
240
+ <p>Perfect contrast maintained</p>
241
+
242
+ <div class="surface-sunken smart-surfaces-sunken">
243
+ <small class="smart-surfaces-inline">
244
+ <pds-icon icon="info" size="sm"></pds-icon>
245
+ Level 4: Sunken surface inside card
246
+ </small>
247
+ </div>
248
+ </div>
249
+
250
+ <div class="card smart-surfaces-card">
251
+ <h6 class="smart-surfaces-title">
252
+ <pds-icon icon="star"></pds-icon>
253
+ Another Card
254
+ </h6>
255
+ <p>All elements adapt automatically</p>
256
+ <button class="btn-primary btn-sm smart-surfaces-button-spacing-sm">
257
+ <pds-icon icon="heart" size="sm"></pds-icon>
258
+ Action
259
+ </button>
260
+ </div>
261
+ </div>
262
+ </div>
263
+ </div>
264
+ </div>
265
+ `;
266
+
267
+ NestedSurfaces.storyName = 'Nested Surfaces';
268
+
269
+ export const SurfaceInversion = () => html`
270
+ ${smartSurfacesStoryStyles}
271
+ <div class="smart-surfaces-section">
272
+ <h2>Surface Inversion</h2>
273
+ <p class="smart-surfaces-subtitle">
274
+ The smart surface system automatically inverts text and icon colors on contrasting backgrounds. Toggle dark mode to see the magic!
275
+ </p>
276
+
277
+ <div class="smart-surfaces-grid--inversion">
278
+ <div class="surface-inverse smart-surfaces-surface">
279
+ <h4 class="smart-surfaces-title">
280
+ <pds-icon icon="moon"></pds-icon>
281
+ Automatic Inversion
282
+ </h4>
283
+ <p>
284
+ This inverted surface automatically uses contrasting text and icons for perfect readability
285
+ </p>
286
+ <button class="btn-primary smart-surfaces-button-spacing">
287
+ Primary Button
288
+ </button>
289
+ </div>
290
+
291
+ <div class="surface-overlay smart-surfaces-surface">
292
+ <h4 class="smart-surfaces-title">
293
+ <pds-icon icon="palette"></pds-icon>
294
+ Overlay Surface
295
+ </h4>
296
+ <p>Text and icons auto-adapt to maintain WCAG AA contrast</p>
297
+ <button class="btn-secondary smart-surfaces-button-spacing">
298
+ Secondary Button
299
+ </button>
300
+ </div>
301
+ </div>
302
+ </div>
303
+ `;
304
+
305
+ SurfaceInversion.storyName = 'Surface Inversion';
306
+
307
+ export const BorderGradients = () => html`
308
+ ${smartSurfacesStoryStyles}
309
+ <div class="smart-surfaces-section">
310
+ <h2>Surface Border Effects</h2>
311
+ <p class="smart-surfaces-subtitle">
312
+ Advanced border gradient effects for standout surfaces. All gradients are animated and adapt to your theme.
313
+ </p>
314
+
315
+ <div class="smart-surfaces-grid--borders">
316
+ <article class="card border-gradient smart-surfaces-border-card">
317
+ <h3>Default Gradient</h3>
318
+ <p>A card with a subtle animated border gradient that follows your color palette.</p>
319
+ <code class="smart-surfaces-border-code">.border-gradient</code>
320
+ </article>
321
+
322
+ <article class="card border-gradient-primary smart-surfaces-border-card">
323
+ <h3>Primary Gradient</h3>
324
+ <p>Border gradient using the primary color scheme for brand emphasis.</p>
325
+ <code class="smart-surfaces-border-code">.border-gradient-primary</code>
326
+ </article>
327
+
328
+ <article class="card border-gradient-accent smart-surfaces-border-card">
329
+ <h3>Accent Gradient</h3>
330
+ <p>Border gradient using the accent color for highlights and attention.</p>
331
+ <code class="smart-surfaces-border-code">.border-gradient-accent</code>
332
+ </article>
333
+
334
+ <article class="card border-gradient-secondary smart-surfaces-border-card">
335
+ <h3>Secondary Gradient</h3>
336
+ <p>Border gradient using the secondary color palette for variety.</p>
337
+ <code class="smart-surfaces-border-code">.border-gradient-secondary</code>
338
+ </article>
339
+
340
+ <article class="card border-gradient-soft smart-surfaces-border-card">
341
+ <h3>Soft Gradient</h3>
342
+ <p>A gentle, subdued border gradient for subtle visual interest.</p>
343
+ <code class="smart-surfaces-border-code">.border-gradient-soft</code>
344
+ </article>
345
+
346
+ <article class="card border-gradient-medium smart-surfaces-border-card">
347
+ <h3>Medium Gradient</h3>
348
+ <p>A balanced border gradient with moderate intensity and presence.</p>
349
+ <code class="smart-surfaces-border-code">.border-gradient-medium</code>
350
+ </article>
351
+
352
+ <article class="card border-gradient-strong smart-surfaces-border-card">
353
+ <h3>Strong Gradient</h3>
354
+ <p>A bold, vibrant border gradient for maximum visual impact.</p>
355
+ <code class="smart-surfaces-border-code">.border-gradient-strong</code>
356
+ </article>
357
+
358
+ <article class="card border-gradient-glow smart-surfaces-border-card">
359
+ <h3>Glowing Border</h3>
360
+ <p>A card with a glowing border gradient effect for emphasis and visual interest.</p>
361
+ <code class="smart-surfaces-border-code">.border-gradient-glow</code>
362
+ </article>
363
+ </div>
364
+ </div>
365
+ `;
366
+
367
+ BorderGradients.storyName = 'Border Gradients';
@@ -0,0 +1,175 @@
1
+ import { html } from 'lit';
2
+
3
+ const spacingStoryStyles = html`
4
+ <style>
5
+ .spacing-story-container {
6
+ padding: var(--spacing-8);
7
+ display: grid;
8
+ gap: var(--spacing-6);
9
+ }
10
+
11
+ .spacing-story-description {
12
+ max-width: 64ch;
13
+ color: var(--surface-text-secondary);
14
+ }
15
+
16
+ .spacing-token-grid {
17
+ display: grid;
18
+ gap: var(--spacing-4);
19
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
20
+ }
21
+
22
+ .spacing-token-card {
23
+ display: flex;
24
+ flex-direction: column;
25
+ gap: var(--spacing-2);
26
+ }
27
+
28
+ .spacing-token-swatch {
29
+ border: 1px solid var(--color-border-subtle);
30
+ border-radius: var(--radius-md);
31
+ background: var(--color-surface);
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ font-weight: 600;
36
+ }
37
+
38
+ .spacing-usage-examples {
39
+ display: grid;
40
+ gap: var(--spacing-4);
41
+ }
42
+
43
+ .spacing-stack-example {
44
+ display: grid;
45
+ gap: var(--spacing-3);
46
+ }
47
+
48
+ .spacing-inline-example {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ gap: var(--spacing-3);
52
+ align-items: flex-start;
53
+ }
54
+
55
+ .spacing-inline-chip {
56
+ padding: var(--spacing-2) var(--spacing-3);
57
+ border-radius: var(--radius-full);
58
+ background: var(--surface-bg);
59
+ border: 1px solid var(--color-border-subtle);
60
+ font-size: 0.875rem;
61
+ }
62
+
63
+ .spacing-demo-card {
64
+ border: 1px dashed var(--color-border-subtle);
65
+ border-radius: var(--radius-md);
66
+ background: var(--surface-bg);
67
+ padding: var(--spacing-4);
68
+ }
69
+
70
+ .spacing-demo-card__stack {
71
+ display: grid;
72
+ gap: var(--spacing-2);
73
+ }
74
+
75
+ .spacing-demo-card__bar {
76
+ height: 8px;
77
+ border-radius: var(--radius-full);
78
+ background: var(--color-primary-quiet);
79
+ }
80
+
81
+ .spacing-card-spacing-1 {
82
+ padding: var(--spacing-1);
83
+ }
84
+
85
+ .spacing-card-spacing-2 {
86
+ padding: var(--spacing-2);
87
+ }
88
+
89
+ .spacing-card-spacing-3 {
90
+ padding: var(--spacing-3);
91
+ }
92
+
93
+ .spacing-card-spacing-4 {
94
+ padding: var(--spacing-4);
95
+ }
96
+
97
+ .spacing-card-spacing-5 {
98
+ padding: var(--spacing-5);
99
+ }
100
+ </style>
101
+ `;
102
+
103
+ const spacingTokens = [
104
+ { token: '--spacing-1', description: 'Tight spacing for badges, chips, dense UI', className: 'spacing-card-spacing-1' },
105
+ { token: '--spacing-2', description: 'Compact spacing for form controls and lists', className: 'spacing-card-spacing-2' },
106
+ { token: '--spacing-3', description: 'Standard spacing for cards and content blocks', className: 'spacing-card-spacing-3' },
107
+ { token: '--spacing-4', description: 'Generous spacing for sections and panels', className: 'spacing-card-spacing-4' },
108
+ { token: '--spacing-5', description: 'Hero spacing for feature areas and layouts', className: 'spacing-card-spacing-5' }
109
+ ];
110
+
111
+ export default {
112
+ title: 'Foundations/Spacing',
113
+ parameters: {
114
+ docs: {
115
+ description: {
116
+ component: 'Spacing tokens ensure consistent rhythm, balance, and hierarchy across layouts.'
117
+ }
118
+ }
119
+ }
120
+ };
121
+
122
+ export const SpacingScale = {
123
+ name: 'Spacing Scale',
124
+ render: () => html`
125
+ ${spacingStoryStyles}
126
+ <div class="story-container spacing-story-container">
127
+ <div class="spacing-story-description">
128
+ Spacing tokens provide a consistent, modular scale for layout, component padding, and visual rhythm.
129
+ Each increment scales proportionally so vertical and horizontal spacing feels balanced throughout the UI.
130
+ </div>
131
+
132
+ <section class="spacing-token-grid">
133
+ ${spacingTokens.map(
134
+ (token) => html`
135
+ <article class="card spacing-token-card">
136
+ <div class="spacing-token-swatch ${token.className}">
137
+ ${token.token}
138
+ </div>
139
+ <div>
140
+ <strong>${token.token.replace('--', '')}</strong>
141
+ <p class="text-muted">${token.description}</p>
142
+ </div>
143
+ </article>
144
+ `
145
+ )}
146
+ </section>
147
+
148
+ <section class="spacing-usage-examples">
149
+ <div class="spacing-stack-example">
150
+ <h3>Vertical Stacks</h3>
151
+ <article class="card spacing-demo-card">
152
+ <div class="spacing-demo-card__stack">
153
+ <div class="spacing-demo-card__bar spacing-card-spacing-1"></div>
154
+ <div class="spacing-demo-card__bar spacing-card-spacing-2"></div>
155
+ <div class="spacing-demo-card__bar spacing-card-spacing-3"></div>
156
+ <div class="spacing-demo-card__bar spacing-card-spacing-4"></div>
157
+ <div class="spacing-demo-card__bar spacing-card-spacing-5"></div>
158
+ </div>
159
+ </article>
160
+ </div>
161
+
162
+ <div>
163
+ <h3>Inline Layout</h3>
164
+ <div class="spacing-inline-example">
165
+ ${spacingTokens.map(
166
+ (token) => html`
167
+ <span class="spacing-inline-chip">${token.token}</span>
168
+ `
169
+ )}
170
+ </div>
171
+ </div>
172
+ </section>
173
+ </div>
174
+ `
175
+ };