@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
@@ -16,102 +16,28 @@ pds-icon {
16
16
  }
17
17
 
18
18
  /* Icon size utilities */
19
- .icon-xs,
20
- pds-icon[size="xs"] {
21
- width: var(--icon-size-xs);
22
- height: var(--icon-size-xs);
23
- }
24
-
25
- .icon-sm,
26
- pds-icon[size="sm"] {
27
- width: var(--icon-size-sm);
28
- height: var(--icon-size-sm);
29
- }
30
-
31
- .icon-md,
32
- pds-icon[size="md"] {
33
- width: var(--icon-size-md);
34
- height: var(--icon-size-md);
35
- }
36
-
37
- .icon-lg,
38
- pds-icon[size="lg"] {
39
- width: var(--icon-size-lg);
40
- height: var(--icon-size-lg);
41
- }
42
-
43
- .icon-xl,
44
- pds-icon[size="xl"] {
45
- width: var(--icon-size-xl);
46
- height: var(--icon-size-xl);
47
- }
48
-
49
- .icon-2xl,
50
- pds-icon[size="2xl"] {
51
- width: var(--icon-size-2xl);
52
- height: var(--icon-size-2xl);
53
- }
19
+ .icon-xs, pds-icon[size="xs"] { width: var(--icon-size-xs); height: var(--icon-size-xs); }
20
+ .icon-sm, pds-icon[size="sm"] { width: var(--icon-size-sm); height: var(--icon-size-sm); }
21
+ .icon-md, pds-icon[size="md"] { width: var(--icon-size-md); height: var(--icon-size-md); }
22
+ .icon-lg, pds-icon[size="lg"] { width: var(--icon-size-lg); height: var(--icon-size-lg); }
23
+ .icon-xl, pds-icon[size="xl"] { width: var(--icon-size-xl); height: var(--icon-size-xl); }
24
+ .icon-2xl, pds-icon[size="2xl"] { width: var(--icon-size-2xl); height: var(--icon-size-2xl); }
54
25
 
55
26
  /* Icon color utilities */
56
- .icon-primary,
57
- pds-icon.primary {
58
- color: var(--color-primary-600);
59
- }
60
-
61
- .icon-secondary,
62
- pds-icon.secondary {
63
- color: var(--color-secondary-600);
64
- }
65
-
66
- .icon-accent,
67
- pds-icon.accent {
68
- color: var(--color-accent-600);
69
- }
70
-
71
- .icon-success,
72
- pds-icon.success {
73
- color: var(--color-success-600);
74
- }
75
-
76
- .icon-warning,
77
- pds-icon.warning {
78
- color: var(--color-warning-600);
79
- }
80
-
81
- .icon-danger,
82
- pds-icon.danger {
83
- color: var(--color-danger-600);
84
- }
85
-
86
- .icon-info,
87
- pds-icon.info {
88
- color: var(--color-info-600);
89
- }
90
-
91
- .icon-muted,
92
- pds-icon.muted {
93
- color: var(--color-text-muted);
94
- }
95
-
96
- .icon-subtle,
97
- pds-icon.subtle {
98
- color: var(--color-text-subtle);
99
- }
27
+ .icon-primary, pds-icon.primary { color: var(--color-primary-600); }
28
+ .icon-secondary, pds-icon.secondary { color: var(--color-secondary-600); }
29
+ .icon-accent, pds-icon.accent { color: var(--color-accent-600); }
30
+ .icon-success, pds-icon.success { color: var(--color-success-600); }
31
+ .icon-warning, pds-icon.warning { color: var(--color-warning-600); }
32
+ .icon-danger, pds-icon.danger { color: var(--color-danger-600); }
33
+ .icon-info, pds-icon.info { color: var(--color-info-600); }
34
+ .icon-muted, pds-icon.muted { color: var(--color-text-muted); }
35
+ .icon-subtle, pds-icon.subtle { color: var(--color-text-subtle); }
100
36
 
101
37
  /* Icon with text combinations */
102
- .icon-text {
103
- display: inline-flex;
104
- align-items: center;
105
- gap: var(--spacing-2);
106
- }
107
-
108
- .icon-text-start {
109
- flex-direction: row;
110
- }
111
-
112
- .icon-text-end {
113
- flex-direction: row-reverse;
114
- }
38
+ .icon-text { display: inline-flex; align-items: center; gap: var(--spacing-2); }
39
+ .icon-text-start { flex-direction: row; }
40
+ .icon-text-end { flex-direction: row-reverse; }
115
41
 
116
42
  /* Button icon utilities */
117
43
  button, a {
@@ -131,46 +57,19 @@ button, a {
131
57
  }
132
58
 
133
59
  /* Icon in inputs */
134
- .input-icon {
60
+ .input-icon, .input-icon-end {
135
61
  position: relative;
136
62
  display: flex;
137
63
  align-items: center;
138
-
139
- pds-icon {
140
- position: absolute;
141
- left: var(--spacing-3);
142
- color: var(--color-text-muted);
143
- pointer-events: none;
144
- width: var(--icon-size-md);
145
- height: var(--icon-size-md);
146
- }
147
-
148
- input {
149
- padding-left: calc(var(--icon-size-md) + var(--spacing-6));
150
- width: 100%;
151
- }
64
+ pds-icon { position: absolute; color: var(--color-text-muted); pointer-events: none; width: var(--icon-size-md); height: var(--icon-size-md); }
65
+ }
66
+ .input-icon {
67
+ pds-icon { left: var(--spacing-3); }
68
+ input { padding-left: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
152
69
  }
153
-
154
70
  .input-icon-end {
155
- position: relative;
156
- display: flex;
157
- align-items: center;
158
-
159
- pds-icon {
160
- position: absolute;
161
- left: unset;
162
- right: var(--spacing-3);
163
- color: var(--color-text-muted);
164
- pointer-events: none;
165
- width: var(--icon-size-md);
166
- height: var(--icon-size-md);
167
- }
168
-
169
- input {
170
- padding-left: var(--spacing-4);
171
- padding-right: calc(var(--icon-size-md) + var(--spacing-6));
172
- width: 100%;
173
- }
71
+ pds-icon { left: unset; right: var(--spacing-3); }
72
+ input { padding-left: var(--spacing-4); padding-right: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
174
73
  }
175
74
 
176
75
 
@@ -209,44 +108,45 @@ button, a {
209
108
  .grid-auto-xl { grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); }
210
109
 
211
110
  /* Gap utilities */
212
- .gap-0 { gap: 0; }
213
- .gap-xs { gap: var(--spacing-1); }
214
- .gap-sm { gap: var(--spacing-2); }
215
- .gap-md { gap: var(--spacing-4); }
216
- .gap-lg { gap: var(--spacing-6); }
217
- .gap-xl { gap: var(--spacing-8); }
111
+ .gap-0 { gap: 0; } .gap-xs { gap: var(--spacing-1); } .gap-sm { gap: var(--spacing-2); } .gap-md { gap: var(--spacing-4); } .gap-lg { gap: var(--spacing-6); } .gap-xl { gap: var(--spacing-8); }
218
112
 
219
113
 
220
114
  /* Flexbox System */
221
- .flex {
222
- display: flex;
223
- }
115
+ .flex { display: flex; }
116
+ .flex-wrap { flex-wrap: wrap; }
117
+ .flex-col { flex-direction: column; }
118
+ .flex-row { flex-direction: row; }
119
+ .grow { flex: 1 1 0%; }
224
120
 
225
- .flex-wrap {
226
- flex-wrap: wrap;
227
- }
121
+ /* Alignment utilities */
122
+ .items-start { align-items: flex-start; } .items-center { align-items: center; } .items-end { align-items: flex-end; } .items-stretch { align-items: stretch; } .items-baseline { align-items: baseline; }
123
+ .justify-start { justify-content: flex-start; } .justify-center { justify-content: center; } .justify-end { justify-content: flex-end; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-evenly { justify-content: space-evenly; }
124
+ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; }
228
125
 
229
- .flex-col {
230
- flex-direction: column;
126
+ /* Text overflow utility */
127
+ .truncate {
128
+ overflow: hidden;
129
+ text-overflow: ellipsis;
130
+ white-space: nowrap;
231
131
  }
232
132
 
233
- .flex-row {
234
- flex-direction: row;
235
- }
133
+ /* Max-width utilities */
134
+ .max-w-sm { max-width: 400px; } .max-w-md { max-width: 600px; } .max-w-lg { max-width: 800px; } .max-w-xl { max-width: 1200px; }
236
135
 
237
- /* Flex alignment */
238
- .items-start { align-items: flex-start; }
239
- .items-center { align-items: center; }
240
- .items-end { align-items: flex-end; }
241
- .items-stretch { align-items: stretch; }
242
- .items-baseline { align-items: baseline; }
136
+ /* Stack utilities - vertical rhythm for stacked elements */
137
+ [class^="stack-"], [class*=" stack-"] {
138
+ display: flex;
139
+ flex-direction: column;
140
+ }
141
+ .stack-xs { gap: var(--spacing-1); }
142
+ .stack-sm { gap: var(--spacing-2); }
143
+ .stack-md { gap: var(--spacing-4); }
144
+ .stack-lg { gap: var(--spacing-6); }
145
+ .stack-xl { gap: var(--spacing-8); }
243
146
 
244
- .justify-start { justify-content: flex-start; }
245
- .justify-center { justify-content: center; }
246
- .justify-end { justify-content: flex-end; }
247
- .justify-between { justify-content: space-between; }
248
- .justify-around { justify-content: space-around; }
249
- .justify-evenly { justify-content: space-evenly; }
147
+ /* Section spacing - for major content blocks */
148
+ .section { padding-block: var(--spacing-8); }
149
+ .section-lg { padding-block: var(--spacing-12); }
250
150
 
251
151
  /* Responsive helpers */
252
152
  @media (max-width: 767px) {
@@ -277,27 +177,9 @@ button, a {
277
177
  }
278
178
 
279
179
  /* Backdrop variants */
280
- .backdrop-light {
281
- --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
282
- --backdrop-brightness: 1.1;
283
- }
284
-
285
- .backdrop-dark {
286
- --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
287
- --backdrop-brightness: 0.6;
288
- }
289
-
290
- .backdrop-blur-sm {
291
- --backdrop-blur: 5px;
292
- }
293
-
294
- .backdrop-blur-md {
295
- --backdrop-blur: 10px;
296
- }
297
-
298
- .backdrop-blur-lg {
299
- --backdrop-blur: 20px;
300
- }
180
+ .backdrop-light { --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2)); --backdrop-brightness: 1.1; }
181
+ .backdrop-dark { --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5)); --backdrop-brightness: 0.6; }
182
+ .backdrop-blur-sm { --backdrop-blur: 5px; } .backdrop-blur-md { --backdrop-blur: 10px; } .backdrop-blur-lg { --backdrop-blur: 20px; }
301
183
 
302
184
 
303
185
  /* Optional utilities/features controlled by config options */
@@ -542,22 +424,101 @@ html[data-theme="dark"] .liquid-glass {
542
424
  }
543
425
 
544
426
 
545
- /* Inverse surface (dark) using PDS tokens; text/icons inherit currentColor */
427
+ /*
428
+ * SURFACE-INVERSE: Local Theme Context Flip
429
+ *
430
+ * We can't simply add .surface-inverse to the dark mode selector because that would
431
+ * also apply the dark color PALETTE (grays, surfaces, etc.), which would override
432
+ * --color-surface-inverse itself. Instead, we duplicate only the SEMANTIC tokens.
433
+ *
434
+ * Light theme .surface-inverse → dark semantic tokens
435
+ * Dark theme .surface-inverse → light semantic tokens (flip back)
436
+ */
437
+
438
+ /* Surface-inverse visual properties (shared, uses smart surface tokens) */
546
439
  .surface-inverse {
547
440
  background-color: var(--color-surface-inverse);
548
- /* Ensure foregrounds inside use the correct smart-surface tokens */
549
441
  color: var(--surface-inverse-text);
550
- --color-text-primary: var(--surface-inverse-text);
551
- --color-text-secondary: var(--surface-inverse-text-secondary);
552
- --color-text-muted: var(--surface-inverse-text-muted);
553
- /* Ensure code/pre and other muted surfaces have contrast on inverse */
554
- --color-surface-muted: rgba(255, 255, 255, 0.08);
555
- /* Optional: adjust borders/shadows if utilities/components read these */
556
- --color-border: var(--surface-inverse-border);
557
442
 
558
443
  pds-icon {
559
444
  color: var(--surface-inverse-icon);
560
445
  }
446
+
447
+ /* btn-primary stays vibrant in any context */
448
+ & .btn-primary {
449
+ background-color: var(--color-primary-500);
450
+ border-color: var(--color-primary-500);
451
+ color: var(--color-primary-contrast, #ffffff);
452
+
453
+ &:hover {
454
+ background-color: var(--color-primary-400);
455
+ border-color: var(--color-primary-400);
456
+ }
457
+ }
458
+ }
459
+
460
+ /* Light-mode inverse: apply dark semantic tokens */
461
+ html:not([data-theme="dark"]) .surface-inverse {
462
+ --color-text-primary: var(--color-gray-100);
463
+ --color-text-secondary: var(--color-gray-300);
464
+ --color-text-muted: var(--color-gray-400);
465
+ --color-border: var(--color-gray-700);
466
+ --color-input-bg: var(--color-gray-800);
467
+ --color-input-disabled-bg: var(--color-gray-900);
468
+ --color-input-disabled-text: var(--color-gray-600);
469
+ --color-code-bg: var(--color-gray-800);
470
+ --color-surface-muted: rgba(255, 255, 255, 0.08);
471
+
472
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
473
+ & .btn-secondary {
474
+ background-color: rgba(255, 255, 255, 0.12);
475
+ color: var(--surface-inverse-text);
476
+ border-color: rgba(255, 255, 255, 0.25);
477
+
478
+ &:hover { background-color: rgba(255, 255, 255, 0.2); }
479
+ &:active { background-color: rgba(255, 255, 255, 0.28); }
480
+ }
481
+
482
+ & select {
483
+ background-color: rgba(255, 255, 255, 0.1);
484
+ color: var(--surface-inverse-text);
485
+ }
486
+
487
+ & a:not([class*="btn"]) {
488
+ color: var(--color-primary-300, #7dd3fc);
489
+ }
490
+ }
491
+
492
+ /* Dark-mode inverse: flip back to light semantic tokens */
493
+ html[data-theme="dark"] .surface-inverse {
494
+ --color-text-primary: var(--color-gray-900);
495
+ --color-text-secondary: var(--color-gray-600);
496
+ --color-text-muted: var(--color-gray-600);
497
+ --color-border: var(--color-gray-300);
498
+ --color-input-bg: var(--color-surface-base);
499
+ --color-input-disabled-bg: var(--color-gray-50);
500
+ --color-input-disabled-text: var(--color-gray-500);
501
+ --color-code-bg: var(--color-gray-100);
502
+ --color-surface-muted: var(--color-gray-100);
503
+
504
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
505
+ & .btn-secondary {
506
+ background-color: rgba(0, 0, 0, 0.06);
507
+ color: var(--surface-inverse-text);
508
+ border-color: rgba(0, 0, 0, 0.15);
509
+
510
+ &:hover { background-color: rgba(0, 0, 0, 0.1); }
511
+ &:active { background-color: rgba(0, 0, 0, 0.15); }
512
+ }
513
+
514
+ & select {
515
+ background-color: #ffffff;
516
+ color: var(--surface-inverse-text);
517
+ }
518
+
519
+ & a:not([class*="btn"]) {
520
+ color: var(--color-primary-600, #0284c7);
521
+ }
561
522
  }
562
523
 
563
524
  /* Shadow utilities */
@@ -606,11 +567,7 @@ html[data-theme="dark"] .liquid-glass {
606
567
  }
607
568
 
608
569
  /* Responsive images with different radius sizes */
609
- .img-rounded-sm { border-radius: var(--radius-sm); }
610
- .img-rounded-md { border-radius: var(--radius-md); }
611
- .img-rounded-lg { border-radius: var(--radius-lg); }
612
- .img-rounded-xl { border-radius: var(--radius-xl); }
613
- .img-rounded-full { border-radius: var(--radius-full); }
570
+ .img-rounded-sm { border-radius: var(--radius-sm); } .img-rounded-md { border-radius: var(--radius-md); } .img-rounded-lg { border-radius: var(--radius-lg); } .img-rounded-xl { border-radius: var(--radius-xl); } .img-rounded-full { border-radius: var(--radius-full); }
614
571
 
615
572
  /* Inline images */
616
573
  .img-inline {
@@ -642,37 +599,17 @@ html[data-theme="dark"] .liquid-glass {
642
599
 
643
600
  /* Small devices (640px and up) */
644
601
  @media (min-width: 640px) {
645
- .sm\\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
646
- .sm\\:flex-row { flex-direction: row; }
647
- .sm\\:text-sm { font-size: var(--font-size-sm); }
648
- .sm\\:p-6 { padding: var(--spacing-6); }
649
- .sm\\:gap-6 { gap: var(--spacing-6); }
650
- .sm\\:hidden { display: none; }
651
- .sm\\:block { display: block; }
602
+ .sm\\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); } .sm\\:flex-row { flex-direction: row; } .sm\\:text-sm { font-size: var(--font-size-sm); } .sm\\:p-6 { padding: var(--spacing-6); } .sm\\:gap-6 { gap: var(--spacing-6); } .sm\\:hidden { display: none; } .sm\\:block { display: block; }
652
603
  }
653
604
 
654
605
  /* Medium devices (768px and up) */
655
606
  @media (min-width: 768px) {
656
- .md\\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
657
- .md\\:text-lg { font-size: var(--font-size-lg); }
658
- .md\\:p-8 { padding: var(--spacing-8); }
659
- .md\\:gap-8 { gap: var(--spacing-8); }
660
- .md\\:flex-row { flex-direction: row; }
661
- .md\\:w-1\\/2 { width: 50%; }
662
- .md\\:w-1\\/3 { width: 33.333333%; }
663
- .md\\:hidden { display: none; }
664
- .md\\:block { display: block; }
607
+ .md\\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); } .md\\:text-lg { font-size: var(--font-size-lg); } .md\\:p-8 { padding: var(--spacing-8); } .md\\:gap-8 { gap: var(--spacing-8); } .md\\:flex-row { flex-direction: row; } .md\\:w-1\\/2 { width: 50%; } .md\\:w-1\\/3 { width: 33.333333%; } .md\\:hidden { display: none; } .md\\:block { display: block; }
665
608
  }
666
609
 
667
610
  /* Large devices (1024px and up) */
668
611
  @media (min-width: 1024px) {
669
- .lg\\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
670
- .lg\\:text-xl { font-size: var(--font-size-xl); }
671
- .lg\\:p-12 { padding: var(--spacing-12); }
672
- .lg\\:gap-12 { gap: var(--spacing-12); }
673
- .lg\\:w-1\\/4 { width: 25%; }
674
- .lg\\:hidden { display: none; }
675
- .lg\\:block { display: block; }
612
+ .lg\\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); } .lg\\:text-xl { font-size: var(--font-size-xl); } .lg\\:p-12 { padding: var(--spacing-12); } .lg\\:gap-12 { gap: var(--spacing-12); } .lg\\:w-1\\/4 { width: 25%; } .lg\\:hidden { display: none; } .lg\\:block { display: block; }
676
613
  }
677
614
 
678
615
  /* Touch device optimizations */
@@ -781,102 +718,28 @@ pds-icon {
781
718
  }
782
719
 
783
720
  /* Icon size utilities */
784
- .icon-xs,
785
- pds-icon[size="xs"] {
786
- width: var(--icon-size-xs);
787
- height: var(--icon-size-xs);
788
- }
789
-
790
- .icon-sm,
791
- pds-icon[size="sm"] {
792
- width: var(--icon-size-sm);
793
- height: var(--icon-size-sm);
794
- }
795
-
796
- .icon-md,
797
- pds-icon[size="md"] {
798
- width: var(--icon-size-md);
799
- height: var(--icon-size-md);
800
- }
801
-
802
- .icon-lg,
803
- pds-icon[size="lg"] {
804
- width: var(--icon-size-lg);
805
- height: var(--icon-size-lg);
806
- }
807
-
808
- .icon-xl,
809
- pds-icon[size="xl"] {
810
- width: var(--icon-size-xl);
811
- height: var(--icon-size-xl);
812
- }
813
-
814
- .icon-2xl,
815
- pds-icon[size="2xl"] {
816
- width: var(--icon-size-2xl);
817
- height: var(--icon-size-2xl);
818
- }
721
+ .icon-xs, pds-icon[size="xs"] { width: var(--icon-size-xs); height: var(--icon-size-xs); }
722
+ .icon-sm, pds-icon[size="sm"] { width: var(--icon-size-sm); height: var(--icon-size-sm); }
723
+ .icon-md, pds-icon[size="md"] { width: var(--icon-size-md); height: var(--icon-size-md); }
724
+ .icon-lg, pds-icon[size="lg"] { width: var(--icon-size-lg); height: var(--icon-size-lg); }
725
+ .icon-xl, pds-icon[size="xl"] { width: var(--icon-size-xl); height: var(--icon-size-xl); }
726
+ .icon-2xl, pds-icon[size="2xl"] { width: var(--icon-size-2xl); height: var(--icon-size-2xl); }
819
727
 
820
728
  /* Icon color utilities */
821
- .icon-primary,
822
- pds-icon.primary {
823
- color: var(--color-primary-600);
824
- }
825
-
826
- .icon-secondary,
827
- pds-icon.secondary {
828
- color: var(--color-secondary-600);
829
- }
830
-
831
- .icon-accent,
832
- pds-icon.accent {
833
- color: var(--color-accent-600);
834
- }
835
-
836
- .icon-success,
837
- pds-icon.success {
838
- color: var(--color-success-600);
839
- }
840
-
841
- .icon-warning,
842
- pds-icon.warning {
843
- color: var(--color-warning-600);
844
- }
845
-
846
- .icon-danger,
847
- pds-icon.danger {
848
- color: var(--color-danger-600);
849
- }
850
-
851
- .icon-info,
852
- pds-icon.info {
853
- color: var(--color-info-600);
854
- }
855
-
856
- .icon-muted,
857
- pds-icon.muted {
858
- color: var(--color-text-muted);
859
- }
860
-
861
- .icon-subtle,
862
- pds-icon.subtle {
863
- color: var(--color-text-subtle);
864
- }
729
+ .icon-primary, pds-icon.primary { color: var(--color-primary-600); }
730
+ .icon-secondary, pds-icon.secondary { color: var(--color-secondary-600); }
731
+ .icon-accent, pds-icon.accent { color: var(--color-accent-600); }
732
+ .icon-success, pds-icon.success { color: var(--color-success-600); }
733
+ .icon-warning, pds-icon.warning { color: var(--color-warning-600); }
734
+ .icon-danger, pds-icon.danger { color: var(--color-danger-600); }
735
+ .icon-info, pds-icon.info { color: var(--color-info-600); }
736
+ .icon-muted, pds-icon.muted { color: var(--color-text-muted); }
737
+ .icon-subtle, pds-icon.subtle { color: var(--color-text-subtle); }
865
738
 
866
739
  /* Icon with text combinations */
867
- .icon-text {
868
- display: inline-flex;
869
- align-items: center;
870
- gap: var(--spacing-2);
871
- }
872
-
873
- .icon-text-start {
874
- flex-direction: row;
875
- }
876
-
877
- .icon-text-end {
878
- flex-direction: row-reverse;
879
- }
740
+ .icon-text { display: inline-flex; align-items: center; gap: var(--spacing-2); }
741
+ .icon-text-start { flex-direction: row; }
742
+ .icon-text-end { flex-direction: row-reverse; }
880
743
 
881
744
  /* Button icon utilities */
882
745
  button, a {
@@ -896,46 +759,19 @@ button, a {
896
759
  }
897
760
 
898
761
  /* Icon in inputs */
899
- .input-icon {
762
+ .input-icon, .input-icon-end {
900
763
  position: relative;
901
764
  display: flex;
902
765
  align-items: center;
903
-
904
- pds-icon {
905
- position: absolute;
906
- left: var(--spacing-3);
907
- color: var(--color-text-muted);
908
- pointer-events: none;
909
- width: var(--icon-size-md);
910
- height: var(--icon-size-md);
911
- }
912
-
913
- input {
914
- padding-left: calc(var(--icon-size-md) + var(--spacing-6));
915
- width: 100%;
916
- }
766
+ pds-icon { position: absolute; color: var(--color-text-muted); pointer-events: none; width: var(--icon-size-md); height: var(--icon-size-md); }
767
+ }
768
+ .input-icon {
769
+ pds-icon { left: var(--spacing-3); }
770
+ input { padding-left: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
917
771
  }
918
-
919
772
  .input-icon-end {
920
- position: relative;
921
- display: flex;
922
- align-items: center;
923
-
924
- pds-icon {
925
- position: absolute;
926
- left: unset;
927
- right: var(--spacing-3);
928
- color: var(--color-text-muted);
929
- pointer-events: none;
930
- width: var(--icon-size-md);
931
- height: var(--icon-size-md);
932
- }
933
-
934
- input {
935
- padding-left: var(--spacing-4);
936
- padding-right: calc(var(--icon-size-md) + var(--spacing-6));
937
- width: 100%;
938
- }
773
+ pds-icon { left: unset; right: var(--spacing-3); }
774
+ input { padding-left: var(--spacing-4); padding-right: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
939
775
  }
940
776
 
941
777
 
@@ -974,44 +810,45 @@ button, a {
974
810
  .grid-auto-xl { grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); }
975
811
 
976
812
  /* Gap utilities */
977
- .gap-0 { gap: 0; }
978
- .gap-xs { gap: var(--spacing-1); }
979
- .gap-sm { gap: var(--spacing-2); }
980
- .gap-md { gap: var(--spacing-4); }
981
- .gap-lg { gap: var(--spacing-6); }
982
- .gap-xl { gap: var(--spacing-8); }
813
+ .gap-0 { gap: 0; } .gap-xs { gap: var(--spacing-1); } .gap-sm { gap: var(--spacing-2); } .gap-md { gap: var(--spacing-4); } .gap-lg { gap: var(--spacing-6); } .gap-xl { gap: var(--spacing-8); }
983
814
 
984
815
 
985
816
  /* Flexbox System */
986
- .flex {
987
- display: flex;
988
- }
817
+ .flex { display: flex; }
818
+ .flex-wrap { flex-wrap: wrap; }
819
+ .flex-col { flex-direction: column; }
820
+ .flex-row { flex-direction: row; }
821
+ .grow { flex: 1 1 0%; }
989
822
 
990
- .flex-wrap {
991
- flex-wrap: wrap;
992
- }
823
+ /* Alignment utilities */
824
+ .items-start { align-items: flex-start; } .items-center { align-items: center; } .items-end { align-items: flex-end; } .items-stretch { align-items: stretch; } .items-baseline { align-items: baseline; }
825
+ .justify-start { justify-content: flex-start; } .justify-center { justify-content: center; } .justify-end { justify-content: flex-end; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-evenly { justify-content: space-evenly; }
826
+ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; }
993
827
 
994
- .flex-col {
995
- flex-direction: column;
828
+ /* Text overflow utility */
829
+ .truncate {
830
+ overflow: hidden;
831
+ text-overflow: ellipsis;
832
+ white-space: nowrap;
996
833
  }
997
834
 
998
- .flex-row {
999
- flex-direction: row;
1000
- }
835
+ /* Max-width utilities */
836
+ .max-w-sm { max-width: 400px; } .max-w-md { max-width: 600px; } .max-w-lg { max-width: 800px; } .max-w-xl { max-width: 1200px; }
1001
837
 
1002
- /* Flex alignment */
1003
- .items-start { align-items: flex-start; }
1004
- .items-center { align-items: center; }
1005
- .items-end { align-items: flex-end; }
1006
- .items-stretch { align-items: stretch; }
1007
- .items-baseline { align-items: baseline; }
838
+ /* Stack utilities - vertical rhythm for stacked elements */
839
+ [class^="stack-"], [class*=" stack-"] {
840
+ display: flex;
841
+ flex-direction: column;
842
+ }
843
+ .stack-xs { gap: var(--spacing-1); }
844
+ .stack-sm { gap: var(--spacing-2); }
845
+ .stack-md { gap: var(--spacing-4); }
846
+ .stack-lg { gap: var(--spacing-6); }
847
+ .stack-xl { gap: var(--spacing-8); }
1008
848
 
1009
- .justify-start { justify-content: flex-start; }
1010
- .justify-center { justify-content: center; }
1011
- .justify-end { justify-content: flex-end; }
1012
- .justify-between { justify-content: space-between; }
1013
- .justify-around { justify-content: space-around; }
1014
- .justify-evenly { justify-content: space-evenly; }
849
+ /* Section spacing - for major content blocks */
850
+ .section { padding-block: var(--spacing-8); }
851
+ .section-lg { padding-block: var(--spacing-12); }
1015
852
 
1016
853
  /* Responsive helpers */
1017
854
  @media (max-width: 767px) {
@@ -1042,27 +879,9 @@ button, a {
1042
879
  }
1043
880
 
1044
881
  /* Backdrop variants */
1045
- .backdrop-light {
1046
- --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
1047
- --backdrop-brightness: 1.1;
1048
- }
1049
-
1050
- .backdrop-dark {
1051
- --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
1052
- --backdrop-brightness: 0.6;
1053
- }
1054
-
1055
- .backdrop-blur-sm {
1056
- --backdrop-blur: 5px;
1057
- }
1058
-
1059
- .backdrop-blur-md {
1060
- --backdrop-blur: 10px;
1061
- }
1062
-
1063
- .backdrop-blur-lg {
1064
- --backdrop-blur: 20px;
1065
- }
882
+ .backdrop-light { --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2)); --backdrop-brightness: 1.1; }
883
+ .backdrop-dark { --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5)); --backdrop-brightness: 0.6; }
884
+ .backdrop-blur-sm { --backdrop-blur: 5px; } .backdrop-blur-md { --backdrop-blur: 10px; } .backdrop-blur-lg { --backdrop-blur: 20px; }
1066
885
 
1067
886
 
1068
887
  /* Optional utilities/features controlled by config options */
@@ -1307,22 +1126,101 @@ html[data-theme="dark"] .liquid-glass {
1307
1126
  }
1308
1127
 
1309
1128
 
1310
- /* Inverse surface (dark) using PDS tokens; text/icons inherit currentColor */
1129
+ /*
1130
+ * SURFACE-INVERSE: Local Theme Context Flip
1131
+ *
1132
+ * We can't simply add .surface-inverse to the dark mode selector because that would
1133
+ * also apply the dark color PALETTE (grays, surfaces, etc.), which would override
1134
+ * --color-surface-inverse itself. Instead, we duplicate only the SEMANTIC tokens.
1135
+ *
1136
+ * Light theme .surface-inverse → dark semantic tokens
1137
+ * Dark theme .surface-inverse → light semantic tokens (flip back)
1138
+ */
1139
+
1140
+ /* Surface-inverse visual properties (shared, uses smart surface tokens) */
1311
1141
  .surface-inverse {
1312
1142
  background-color: var(--color-surface-inverse);
1313
- /* Ensure foregrounds inside use the correct smart-surface tokens */
1314
1143
  color: var(--surface-inverse-text);
1315
- --color-text-primary: var(--surface-inverse-text);
1316
- --color-text-secondary: var(--surface-inverse-text-secondary);
1317
- --color-text-muted: var(--surface-inverse-text-muted);
1318
- /* Ensure code/pre and other muted surfaces have contrast on inverse */
1319
- --color-surface-muted: rgba(255, 255, 255, 0.08);
1320
- /* Optional: adjust borders/shadows if utilities/components read these */
1321
- --color-border: var(--surface-inverse-border);
1322
1144
 
1323
1145
  pds-icon {
1324
1146
  color: var(--surface-inverse-icon);
1325
1147
  }
1148
+
1149
+ /* btn-primary stays vibrant in any context */
1150
+ & .btn-primary {
1151
+ background-color: var(--color-primary-500);
1152
+ border-color: var(--color-primary-500);
1153
+ color: var(--color-primary-contrast, #ffffff);
1154
+
1155
+ &:hover {
1156
+ background-color: var(--color-primary-400);
1157
+ border-color: var(--color-primary-400);
1158
+ }
1159
+ }
1160
+ }
1161
+
1162
+ /* Light-mode inverse: apply dark semantic tokens */
1163
+ html:not([data-theme="dark"]) .surface-inverse {
1164
+ --color-text-primary: var(--color-gray-100);
1165
+ --color-text-secondary: var(--color-gray-300);
1166
+ --color-text-muted: var(--color-gray-400);
1167
+ --color-border: var(--color-gray-700);
1168
+ --color-input-bg: var(--color-gray-800);
1169
+ --color-input-disabled-bg: var(--color-gray-900);
1170
+ --color-input-disabled-text: var(--color-gray-600);
1171
+ --color-code-bg: var(--color-gray-800);
1172
+ --color-surface-muted: rgba(255, 255, 255, 0.08);
1173
+
1174
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
1175
+ & .btn-secondary {
1176
+ background-color: rgba(255, 255, 255, 0.12);
1177
+ color: var(--surface-inverse-text);
1178
+ border-color: rgba(255, 255, 255, 0.25);
1179
+
1180
+ &:hover { background-color: rgba(255, 255, 255, 0.2); }
1181
+ &:active { background-color: rgba(255, 255, 255, 0.28); }
1182
+ }
1183
+
1184
+ & select {
1185
+ background-color: rgba(255, 255, 255, 0.1);
1186
+ color: var(--surface-inverse-text);
1187
+ }
1188
+
1189
+ & a:not([class*="btn"]) {
1190
+ color: var(--color-primary-300, #7dd3fc);
1191
+ }
1192
+ }
1193
+
1194
+ /* Dark-mode inverse: flip back to light semantic tokens */
1195
+ html[data-theme="dark"] .surface-inverse {
1196
+ --color-text-primary: var(--color-gray-900);
1197
+ --color-text-secondary: var(--color-gray-600);
1198
+ --color-text-muted: var(--color-gray-600);
1199
+ --color-border: var(--color-gray-300);
1200
+ --color-input-bg: var(--color-surface-base);
1201
+ --color-input-disabled-bg: var(--color-gray-50);
1202
+ --color-input-disabled-text: var(--color-gray-500);
1203
+ --color-code-bg: var(--color-gray-100);
1204
+ --color-surface-muted: var(--color-gray-100);
1205
+
1206
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
1207
+ & .btn-secondary {
1208
+ background-color: rgba(0, 0, 0, 0.06);
1209
+ color: var(--surface-inverse-text);
1210
+ border-color: rgba(0, 0, 0, 0.15);
1211
+
1212
+ &:hover { background-color: rgba(0, 0, 0, 0.1); }
1213
+ &:active { background-color: rgba(0, 0, 0, 0.15); }
1214
+ }
1215
+
1216
+ & select {
1217
+ background-color: #ffffff;
1218
+ color: var(--surface-inverse-text);
1219
+ }
1220
+
1221
+ & a:not([class*="btn"]) {
1222
+ color: var(--color-primary-600, #0284c7);
1223
+ }
1326
1224
  }
1327
1225
 
1328
1226
  /* Shadow utilities */
@@ -1371,11 +1269,7 @@ html[data-theme="dark"] .liquid-glass {
1371
1269
  }
1372
1270
 
1373
1271
  /* Responsive images with different radius sizes */
1374
- .img-rounded-sm { border-radius: var(--radius-sm); }
1375
- .img-rounded-md { border-radius: var(--radius-md); }
1376
- .img-rounded-lg { border-radius: var(--radius-lg); }
1377
- .img-rounded-xl { border-radius: var(--radius-xl); }
1378
- .img-rounded-full { border-radius: var(--radius-full); }
1272
+ .img-rounded-sm { border-radius: var(--radius-sm); } .img-rounded-md { border-radius: var(--radius-md); } .img-rounded-lg { border-radius: var(--radius-lg); } .img-rounded-xl { border-radius: var(--radius-xl); } .img-rounded-full { border-radius: var(--radius-full); }
1379
1273
 
1380
1274
  /* Inline images */
1381
1275
  .img-inline {
@@ -1407,37 +1301,17 @@ html[data-theme="dark"] .liquid-glass {
1407
1301
 
1408
1302
  /* Small devices (640px and up) */
1409
1303
  @media (min-width: 640px) {
1410
- .sm\\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
1411
- .sm\\:flex-row { flex-direction: row; }
1412
- .sm\\:text-sm { font-size: var(--font-size-sm); }
1413
- .sm\\:p-6 { padding: var(--spacing-6); }
1414
- .sm\\:gap-6 { gap: var(--spacing-6); }
1415
- .sm\\:hidden { display: none; }
1416
- .sm\\:block { display: block; }
1304
+ .sm\\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); } .sm\\:flex-row { flex-direction: row; } .sm\\:text-sm { font-size: var(--font-size-sm); } .sm\\:p-6 { padding: var(--spacing-6); } .sm\\:gap-6 { gap: var(--spacing-6); } .sm\\:hidden { display: none; } .sm\\:block { display: block; }
1417
1305
  }
1418
1306
 
1419
1307
  /* Medium devices (768px and up) */
1420
1308
  @media (min-width: 768px) {
1421
- .md\\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
1422
- .md\\:text-lg { font-size: var(--font-size-lg); }
1423
- .md\\:p-8 { padding: var(--spacing-8); }
1424
- .md\\:gap-8 { gap: var(--spacing-8); }
1425
- .md\\:flex-row { flex-direction: row; }
1426
- .md\\:w-1\\/2 { width: 50%; }
1427
- .md\\:w-1\\/3 { width: 33.333333%; }
1428
- .md\\:hidden { display: none; }
1429
- .md\\:block { display: block; }
1309
+ .md\\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); } .md\\:text-lg { font-size: var(--font-size-lg); } .md\\:p-8 { padding: var(--spacing-8); } .md\\:gap-8 { gap: var(--spacing-8); } .md\\:flex-row { flex-direction: row; } .md\\:w-1\\/2 { width: 50%; } .md\\:w-1\\/3 { width: 33.333333%; } .md\\:hidden { display: none; } .md\\:block { display: block; }
1430
1310
  }
1431
1311
 
1432
1312
  /* Large devices (1024px and up) */
1433
1313
  @media (min-width: 1024px) {
1434
- .lg\\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
1435
- .lg\\:text-xl { font-size: var(--font-size-xl); }
1436
- .lg\\:p-12 { padding: var(--spacing-12); }
1437
- .lg\\:gap-12 { gap: var(--spacing-12); }
1438
- .lg\\:w-1\\/4 { width: 25%; }
1439
- .lg\\:hidden { display: none; }
1440
- .lg\\:block { display: block; }
1314
+ .lg\\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); } .lg\\:text-xl { font-size: var(--font-size-xl); } .lg\\:p-12 { padding: var(--spacing-12); } .lg\\:gap-12 { gap: var(--spacing-12); } .lg\\:w-1\\/4 { width: 25%; } .lg\\:hidden { display: none; } .lg\\:block { display: block; }
1441
1315
  }
1442
1316
 
1443
1317
  /* Touch device optimizations */