@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
@@ -733,7 +733,12 @@ html[data-theme="dark"] {
733
733
  overflow-x: hidden;
734
734
  -webkit-overflow-scrolling: touch;
735
735
  }
736
-
736
+
737
+ :where(body.drawer-open) {
738
+ /* overflow: hidden; */
739
+ /* scrollbar-gutter: stable; */
740
+ }
741
+
737
742
  /* Button primitives */
738
743
  :where(button) {
739
744
  all: unset;
@@ -1083,6 +1088,36 @@ html[data-theme="dark"] {
1083
1088
  height: 0;
1084
1089
  }
1085
1090
 
1091
+ /* Labeled horizontal rule: <hr data-content="OR"> */
1092
+ :where(hr[data-content]) {
1093
+ position: relative;
1094
+ border: none;
1095
+ text-align: center;
1096
+ height: auto;
1097
+ overflow: visible;
1098
+
1099
+ &::before {
1100
+ content: "";
1101
+ position: absolute;
1102
+ left: 0;
1103
+ top: 50%;
1104
+ width: 100%;
1105
+ height: 1px;
1106
+ background: linear-gradient(to right, transparent, var(--color-border), transparent);
1107
+ }
1108
+
1109
+ &::after {
1110
+ content: attr(data-content);
1111
+ position: relative;
1112
+ display: inline-block;
1113
+ padding: 0 var(--spacing-3);
1114
+ background-color: var(--color-surface-base);
1115
+ color: var(--color-text-muted);
1116
+ font-size: var(--font-size-sm);
1117
+ line-height: var(--font-line-height-normal);
1118
+ }
1119
+ }
1120
+
1086
1121
  :where(dl) {
1087
1122
  margin: 0 0 var(--spacing-4) 0;
1088
1123
  }
@@ -1110,6 +1145,11 @@ html[data-theme="dark"] {
1110
1145
  width: 100%;
1111
1146
  }
1112
1147
 
1148
+ /* Headings within header elements have tight spacing for intro content */
1149
+ :where(header) > :where(h1, h2, h3, h4, h5, h6) {
1150
+ margin: 0;
1151
+ }
1152
+
1113
1153
  :where(article), :where(section), :where(aside) {
1114
1154
  display: block;
1115
1155
  margin-bottom: var(--spacing-6);
@@ -1216,7 +1256,7 @@ form {
1216
1256
  }
1217
1257
 
1218
1258
  fieldset {
1219
- margin: 0 0 var(--spacing-2) 0;
1259
+ margin: 0;
1220
1260
  padding: var(--spacing-5);
1221
1261
  width: 100%;
1222
1262
  background-color: color-mix(in oklab, var(--color-surface-subtle) 50%, transparent 50%);
@@ -1291,7 +1331,6 @@ fieldset fieldset fieldset > legend { font-size: var(--font-size-sm); }
1291
1331
 
1292
1332
  label {
1293
1333
  display: block;
1294
- margin-bottom: var(--spacing-3);
1295
1334
  font-weight: var(--font-weight-medium);
1296
1335
  color: var(--color-text-primary);
1297
1336
  font-size: var(--font-size-sm);
@@ -1454,7 +1493,6 @@ input[type="range"]:active::-moz-range-thumb {
1454
1493
  }
1455
1494
 
1456
1495
  input[type="color"] {
1457
- appearance: none;
1458
1496
  -webkit-appearance: none;
1459
1497
  padding: 0;
1460
1498
  width: 3rem;
@@ -1996,16 +2034,7 @@ a.btn-working {
1996
2034
  border: 1px solid var(--color-border);
1997
2035
  border-radius: var(--radius-md);
1998
2036
  background-color: var(--color-surface-base);
1999
-
2000
- fieldset {
2001
- background-color: transparent;
2002
- margin-bottom: var(--spacing-3);
2003
-
2004
- &:last-of-type {
2005
- margin-bottom: 0;
2006
- }
2007
- }
2008
-
2037
+
2009
2038
  .array-controls {
2010
2039
  padding-top: var(--spacing-3);
2011
2040
  border-top: 1px solid var(--color-border);
@@ -2153,82 +2182,30 @@ a.btn-working {
2153
2182
  vertical-align: middle;
2154
2183
  background-color: var(--color-gray-200);
2155
2184
  color: var(--color-gray-800);
2156
- border-radius: var(--radius-full);
2157
- }
2158
-
2159
- .badge-primary {
2160
- background-color: var(--color-primary-600);
2161
- color: white;
2162
- }
2163
-
2164
- .badge-secondary {
2165
- background-color: var(--color-secondary-600);
2166
- color: white;
2167
- }
2168
-
2169
- .badge-success {
2170
- background-color: var(--color-success-600);
2171
- color: white;
2172
- }
2173
-
2174
- .badge-info {
2175
- background-color: var(--color-info-600);
2176
- color: white;
2177
2185
  }
2178
2186
 
2179
- .badge-warning {
2180
- background-color: var(--color-warning-600);
2181
- color: white;
2182
- }
2183
-
2184
- .badge-danger {
2185
- background-color: var(--color-danger-600);
2186
- color: white;
2187
- }
2187
+ .badge-primary, .badge-secondary, .badge-success, .badge-info, .badge-warning, .badge-danger { color: white; }
2188
+ .badge-primary { background-color: var(--color-primary-600); }
2189
+ .badge-secondary { background-color: var(--color-secondary-600); }
2190
+ .badge-success { background-color: var(--color-success-600); }
2191
+ .badge-info { background-color: var(--color-info-600); }
2192
+ .badge-warning { background-color: var(--color-warning-600); }
2193
+ .badge-danger { background-color: var(--color-danger-600); }
2188
2194
 
2189
2195
  .badge-outline {
2190
2196
  background-color: transparent;
2191
2197
  border: 1px solid currentColor;
2192
-
2193
- &.badge-primary {
2194
- color: var(--color-text-primary);
2195
- }
2196
-
2197
- &.badge-secondary {
2198
- color: var(--color-secondary-600);
2199
- }
2200
-
2201
- &.badge-success {
2202
- color: var(--color-success-600);
2203
- }
2204
-
2205
- &.badge-info {
2206
- color: var(--color-info-600);
2207
- }
2208
-
2209
- &.badge-warning {
2210
- color: var(--color-warning-600);
2211
- }
2212
-
2213
- &.badge-danger {
2214
- color: var(--color-danger-600);
2215
- }
2198
+ &.badge-primary { color: var(--color-text-primary); }
2199
+ &.badge-secondary { color: var(--color-secondary-600); }
2200
+ &.badge-success { color: var(--color-success-600); }
2201
+ &.badge-info { color: var(--color-info-600); }
2202
+ &.badge-warning { color: var(--color-warning-600); }
2203
+ &.badge-danger { color: var(--color-danger-600); }
2216
2204
  }
2217
2205
 
2218
- .badge-sm {
2219
- padding: 2px var(--spacing-1);
2220
- font-size: 10px;
2221
- }
2222
-
2223
- .badge-lg {
2224
- padding: var(--spacing-2) var(--spacing-3);
2225
- font-size: var(--font-size-sm);
2226
- }
2227
-
2228
- .pill {
2229
- padding: var(--spacing-1) var(--spacing-3);
2230
- border-radius: var(--radius-full);
2231
- }
2206
+ .badge-sm { padding: 2px var(--spacing-1); font-size: 10px; }
2207
+ .badge-lg { padding: var(--spacing-2) var(--spacing-3); font-size: var(--font-size-sm); }
2208
+ .pill { padding: var(--spacing-1) var(--spacing-3); border-radius: var(--radius-full); }
2232
2209
 
2233
2210
 
2234
2211
 
@@ -2262,8 +2239,7 @@ dialog {
2262
2239
  overlay 0.2s ease allow-discrete,
2263
2240
  display 0.2s ease allow-discrete;
2264
2241
 
2265
- /* Overflow handling */
2266
- overflow: hidden;
2242
+
2267
2243
  }
2268
2244
 
2269
2245
  /* Open state */
@@ -2365,7 +2341,7 @@ dialog {
2365
2341
  form > article,
2366
2342
  .dialog-body {
2367
2343
  flex: 1;
2368
- padding: var(--spacing-6);
2344
+ padding: var(--spacing-3) var(--spacing-6);
2369
2345
  overflow-y: auto;
2370
2346
  overflow-x: hidden;
2371
2347
  }
@@ -2385,50 +2361,20 @@ dialog {
2385
2361
  }
2386
2362
 
2387
2363
  /* Dialog size modifiers */
2388
- dialog.dialog-sm {
2389
- max-width: min(400px, calc(100vw - var(--spacing-8)));
2390
- }
2391
-
2392
- dialog.dialog-lg {
2393
- max-width: min(800px, calc(100vw - var(--spacing-8)));
2394
- }
2395
-
2396
- dialog.dialog-xl {
2397
- max-width: min(1200px, calc(100vw - var(--spacing-8)));
2398
- }
2399
-
2400
- dialog.dialog-full {
2401
- max-width: calc(100vw - var(--spacing-8));
2402
- max-height: calc(100vh - var(--spacing-8));
2403
- }
2364
+ dialog.dialog-sm { max-width: min(400px, calc(100vw - var(--spacing-8))); }
2365
+ dialog.dialog-lg { max-width: min(800px, calc(100vw - var(--spacing-8))); }
2366
+ dialog.dialog-xl { max-width: min(1200px, calc(100vw - var(--spacing-8))); }
2367
+ dialog.dialog-full { max-width: calc(100vw - var(--spacing-8)); max-height: calc(100vh - var(--spacing-8)); }
2404
2368
 
2405
2369
  /* Mobile responsiveness */
2406
2370
  @media (max-width: 639px) {
2407
- dialog {
2408
- max-width: 100vw;
2409
- max-height: 100vh;
2410
- border-radius: 0;
2411
- top: 50%;
2412
- transform: translateY(-50%);
2413
- margin: 0;
2414
- }
2415
-
2416
- dialog header,
2417
- dialog form > header,
2418
- dialog article,
2419
- dialog form > article,
2420
- dialog footer,
2421
- dialog form > footer {
2422
- padding: var(--spacing-4);
2423
- }
2371
+ dialog { max-width: 100vw; max-height: 100vh; border-radius: 0; top: 50%; transform: translateY(-50%); margin: 0; }
2372
+ dialog header, dialog form > header, dialog article, dialog form > article, dialog footer, dialog form > footer { padding: var(--spacing-4); }
2424
2373
  }
2425
2374
 
2426
2375
  /* Reduced motion support */
2427
2376
  @media (prefers-reduced-motion: reduce) {
2428
- dialog,
2429
- dialog::backdrop {
2430
- transition-duration: 0.01s !important;
2431
- }
2377
+ dialog, dialog::backdrop { transition-duration: 0.01s !important; }
2432
2378
  }
2433
2379
 
2434
2380
 
@@ -2751,30 +2697,15 @@ pds-tabstrip {
2751
2697
  }
2752
2698
 
2753
2699
  @keyframes tabFadeIn {
2754
- from {
2755
- opacity: 0;
2756
- transform: translateY(8px);
2757
- }
2758
- to {
2759
- opacity: 1;
2760
- transform: translateY(0);
2761
- }
2700
+ from { opacity: 0; transform: translateY(8px); }
2701
+ to { opacity: 1; transform: translateY(0); }
2762
2702
  }
2763
2703
 
2764
2704
  /* Mobile responsive */
2765
2705
  @media (max-width: 639px) {
2766
- pds-tabstrip > nav {
2767
- gap: var(--spacing-1);
2768
- }
2769
-
2770
- pds-tabstrip > nav > a {
2771
- padding: var(--spacing-2) var(--spacing-3);
2772
- font-size: var(--font-size-sm);
2773
- }
2774
-
2775
- pds-tabstrip > pds-tabpanel[data-tabpanel] {
2776
- padding: var(--spacing-3) 0;
2777
- }
2706
+ pds-tabstrip > nav { gap: var(--spacing-1); }
2707
+ pds-tabstrip > nav > a { padding: var(--spacing-2) var(--spacing-3); font-size: var(--font-size-sm); }
2708
+ pds-tabstrip > pds-tabpanel[data-tabpanel] { padding: var(--spacing-3) 0; }
2778
2709
  }
2779
2710
 
2780
2711
 
@@ -2888,106 +2819,41 @@ tbody {
2888
2819
  }
2889
2820
 
2890
2821
  /* Custom Scrollbars */
2891
-
2892
- ::-webkit-scrollbar {
2893
- width: 12px;
2894
- height: 12px;
2895
- }
2896
-
2897
- ::-webkit-scrollbar-track {
2898
- background: transparent;
2899
- }
2900
-
2822
+ ::-webkit-scrollbar { width: 12px; height: 12px; }
2823
+ ::-webkit-scrollbar-track { background: transparent; }
2901
2824
  ::-webkit-scrollbar-thumb {
2902
2825
  background: var(--color-secondary-300);
2903
2826
  border-radius: var(--radius-full);
2904
2827
  border: 3px solid transparent;
2905
2828
  background-clip: padding-box;
2906
2829
  transition: background-color var(--transition-fast);
2907
-
2908
- &:hover {
2909
- background: var(--color-secondary-400);
2910
- border: 2px solid transparent;
2911
- background-clip: padding-box;
2912
- }
2913
-
2914
- &:active {
2915
- background: var(--color-secondary-500);
2916
- border: 2px solid transparent;
2917
- background-clip: padding-box;
2918
- }
2919
-
2830
+ &:hover { background: var(--color-secondary-400); border: 2px solid transparent; background-clip: padding-box; }
2831
+ &:active { background: var(--color-secondary-500); border: 2px solid transparent; background-clip: padding-box; }
2920
2832
  @media (prefers-color-scheme: dark) {
2921
2833
  background: var(--color-secondary-600);
2922
-
2923
- &:hover {
2924
- background: var(--color-secondary-500);
2925
- }
2926
-
2927
- &:active {
2928
- background: var(--color-secondary-400);
2929
- }
2834
+ &:hover { background: var(--color-secondary-500); }
2835
+ &:active { background: var(--color-secondary-400); }
2930
2836
  }
2931
2837
  }
2932
2838
 
2933
2839
  * {
2934
2840
  scrollbar-width: thin;
2935
2841
  scrollbar-color: var(--color-secondary-300) transparent;
2936
-
2937
- @media (prefers-color-scheme: dark) {
2938
- scrollbar-color: var(--color-secondary-600) transparent;
2939
- }
2940
- }
2941
-
2942
- /* Hover effect for scrollable containers */
2943
- *:hover {
2944
- scrollbar-color: var(--color-secondary-400) transparent;
2945
- }
2946
-
2947
- @media (prefers-color-scheme: dark) {
2948
- *:hover {
2949
- scrollbar-color: var(--color-secondary-500) transparent;
2950
- }
2842
+ @media (prefers-color-scheme: dark) { scrollbar-color: var(--color-secondary-600) transparent; }
2951
2843
  }
2844
+ *:hover { scrollbar-color: var(--color-secondary-400) transparent; }
2845
+ @media (prefers-color-scheme: dark) { *:hover { scrollbar-color: var(--color-secondary-500) transparent; } }
2952
2846
 
2953
2847
 
2954
2848
 
2955
2849
  /* Alert dark mode adjustments */
2956
- html[data-theme="dark"] .alert-success {
2957
- background-color: var(--color-success-50);
2958
- border-color: var(--color-success-500);
2959
- color: var(--color-success-900);
2960
- }
2961
-
2962
- html[data-theme="dark"] .alert-info {
2963
- background-color: var(--color-info-50);
2964
- border-color: var(--color-info-500);
2965
- color: var(--color-info-900);
2966
- }
2967
-
2968
- html[data-theme="dark"] .alert-warning {
2969
- background-color: var(--color-warning-50);
2970
- border-color: var(--color-warning-500);
2971
- color: var(--color-warning-900);
2972
- }
2973
-
2974
- html[data-theme="dark"] .alert-danger,
2975
- html[data-theme="dark"] .alert-error {
2976
- background-color: var(--color-danger-50);
2977
- border-color: var(--color-danger-500);
2978
- color: var(--color-danger-900);
2979
- }
2980
-
2981
- /* Dim images in dark mode */
2982
- html[data-theme="dark"] img,
2983
- html[data-theme="dark"] video {
2984
- opacity: 0.8;
2985
- transition: opacity var(--transition-normal);
2986
- }
2987
-
2988
- html[data-theme="dark"] img:hover,
2989
- html[data-theme="dark"] video:hover {
2990
- opacity: 1;
2850
+ html[data-theme="dark"] {
2851
+ .alert-success { background-color: var(--color-success-50); border-color: var(--color-success-500); color: var(--color-success-900); }
2852
+ .alert-info { background-color: var(--color-info-50); border-color: var(--color-info-500); color: var(--color-info-900); }
2853
+ .alert-warning { background-color: var(--color-warning-50); border-color: var(--color-warning-500); color: var(--color-warning-900); }
2854
+ .alert-danger, .alert-error { background-color: var(--color-danger-50); border-color: var(--color-danger-500); color: var(--color-danger-900); }
2855
+ img, video { opacity: 0.8; transition: opacity var(--transition-normal); }
2856
+ img:hover, video:hover { opacity: 1; }
2991
2857
  }
2992
2858
 
2993
2859
  }
@@ -3006,102 +2872,28 @@ pds-icon {
3006
2872
  }
3007
2873
 
3008
2874
  /* Icon size utilities */
3009
- .icon-xs,
3010
- pds-icon[size="xs"] {
3011
- width: var(--icon-size-xs);
3012
- height: var(--icon-size-xs);
3013
- }
3014
-
3015
- .icon-sm,
3016
- pds-icon[size="sm"] {
3017
- width: var(--icon-size-sm);
3018
- height: var(--icon-size-sm);
3019
- }
3020
-
3021
- .icon-md,
3022
- pds-icon[size="md"] {
3023
- width: var(--icon-size-md);
3024
- height: var(--icon-size-md);
3025
- }
3026
-
3027
- .icon-lg,
3028
- pds-icon[size="lg"] {
3029
- width: var(--icon-size-lg);
3030
- height: var(--icon-size-lg);
3031
- }
3032
-
3033
- .icon-xl,
3034
- pds-icon[size="xl"] {
3035
- width: var(--icon-size-xl);
3036
- height: var(--icon-size-xl);
3037
- }
3038
-
3039
- .icon-2xl,
3040
- pds-icon[size="2xl"] {
3041
- width: var(--icon-size-2xl);
3042
- height: var(--icon-size-2xl);
3043
- }
2875
+ .icon-xs, pds-icon[size="xs"] { width: var(--icon-size-xs); height: var(--icon-size-xs); }
2876
+ .icon-sm, pds-icon[size="sm"] { width: var(--icon-size-sm); height: var(--icon-size-sm); }
2877
+ .icon-md, pds-icon[size="md"] { width: var(--icon-size-md); height: var(--icon-size-md); }
2878
+ .icon-lg, pds-icon[size="lg"] { width: var(--icon-size-lg); height: var(--icon-size-lg); }
2879
+ .icon-xl, pds-icon[size="xl"] { width: var(--icon-size-xl); height: var(--icon-size-xl); }
2880
+ .icon-2xl, pds-icon[size="2xl"] { width: var(--icon-size-2xl); height: var(--icon-size-2xl); }
3044
2881
 
3045
2882
  /* Icon color utilities */
3046
- .icon-primary,
3047
- pds-icon.primary {
3048
- color: var(--color-primary-600);
3049
- }
3050
-
3051
- .icon-secondary,
3052
- pds-icon.secondary {
3053
- color: var(--color-secondary-600);
3054
- }
3055
-
3056
- .icon-accent,
3057
- pds-icon.accent {
3058
- color: var(--color-accent-600);
3059
- }
3060
-
3061
- .icon-success,
3062
- pds-icon.success {
3063
- color: var(--color-success-600);
3064
- }
3065
-
3066
- .icon-warning,
3067
- pds-icon.warning {
3068
- color: var(--color-warning-600);
3069
- }
3070
-
3071
- .icon-danger,
3072
- pds-icon.danger {
3073
- color: var(--color-danger-600);
3074
- }
3075
-
3076
- .icon-info,
3077
- pds-icon.info {
3078
- color: var(--color-info-600);
3079
- }
3080
-
3081
- .icon-muted,
3082
- pds-icon.muted {
3083
- color: var(--color-text-muted);
3084
- }
3085
-
3086
- .icon-subtle,
3087
- pds-icon.subtle {
3088
- color: var(--color-text-subtle);
3089
- }
2883
+ .icon-primary, pds-icon.primary { color: var(--color-primary-600); }
2884
+ .icon-secondary, pds-icon.secondary { color: var(--color-secondary-600); }
2885
+ .icon-accent, pds-icon.accent { color: var(--color-accent-600); }
2886
+ .icon-success, pds-icon.success { color: var(--color-success-600); }
2887
+ .icon-warning, pds-icon.warning { color: var(--color-warning-600); }
2888
+ .icon-danger, pds-icon.danger { color: var(--color-danger-600); }
2889
+ .icon-info, pds-icon.info { color: var(--color-info-600); }
2890
+ .icon-muted, pds-icon.muted { color: var(--color-text-muted); }
2891
+ .icon-subtle, pds-icon.subtle { color: var(--color-text-subtle); }
3090
2892
 
3091
2893
  /* Icon with text combinations */
3092
- .icon-text {
3093
- display: inline-flex;
3094
- align-items: center;
3095
- gap: var(--spacing-2);
3096
- }
3097
-
3098
- .icon-text-start {
3099
- flex-direction: row;
3100
- }
3101
-
3102
- .icon-text-end {
3103
- flex-direction: row-reverse;
3104
- }
2894
+ .icon-text { display: inline-flex; align-items: center; gap: var(--spacing-2); }
2895
+ .icon-text-start { flex-direction: row; }
2896
+ .icon-text-end { flex-direction: row-reverse; }
3105
2897
 
3106
2898
  /* Button icon utilities */
3107
2899
  button, a {
@@ -3121,46 +2913,19 @@ button, a {
3121
2913
  }
3122
2914
 
3123
2915
  /* Icon in inputs */
3124
- .input-icon {
2916
+ .input-icon, .input-icon-end {
3125
2917
  position: relative;
3126
2918
  display: flex;
3127
2919
  align-items: center;
3128
-
3129
- pds-icon {
3130
- position: absolute;
3131
- left: var(--spacing-3);
3132
- color: var(--color-text-muted);
3133
- pointer-events: none;
3134
- width: var(--icon-size-md);
3135
- height: var(--icon-size-md);
3136
- }
3137
-
3138
- input {
3139
- padding-left: calc(var(--icon-size-md) + var(--spacing-6));
3140
- width: 100%;
3141
- }
2920
+ pds-icon { position: absolute; color: var(--color-text-muted); pointer-events: none; width: var(--icon-size-md); height: var(--icon-size-md); }
2921
+ }
2922
+ .input-icon {
2923
+ pds-icon { left: var(--spacing-3); }
2924
+ input { padding-left: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
3142
2925
  }
3143
-
3144
2926
  .input-icon-end {
3145
- position: relative;
3146
- display: flex;
3147
- align-items: center;
3148
-
3149
- pds-icon {
3150
- position: absolute;
3151
- left: unset;
3152
- right: var(--spacing-3);
3153
- color: var(--color-text-muted);
3154
- pointer-events: none;
3155
- width: var(--icon-size-md);
3156
- height: var(--icon-size-md);
3157
- }
3158
-
3159
- input {
3160
- padding-left: var(--spacing-4);
3161
- padding-right: calc(var(--icon-size-md) + var(--spacing-6));
3162
- width: 100%;
3163
- }
2927
+ pds-icon { left: unset; right: var(--spacing-3); }
2928
+ input { padding-left: var(--spacing-4); padding-right: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
3164
2929
  }
3165
2930
 
3166
2931
 
@@ -3199,44 +2964,45 @@ button, a {
3199
2964
  .grid-auto-xl { grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); }
3200
2965
 
3201
2966
  /* Gap utilities */
3202
- .gap-0 { gap: 0; }
3203
- .gap-xs { gap: var(--spacing-1); }
3204
- .gap-sm { gap: var(--spacing-2); }
3205
- .gap-md { gap: var(--spacing-4); }
3206
- .gap-lg { gap: var(--spacing-6); }
3207
- .gap-xl { gap: var(--spacing-8); }
2967
+ .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); }
3208
2968
 
3209
2969
 
3210
2970
  /* Flexbox System */
3211
- .flex {
3212
- display: flex;
2971
+ .flex { display: flex; }
2972
+ .flex-wrap { flex-wrap: wrap; }
2973
+ .flex-col { flex-direction: column; }
2974
+ .flex-row { flex-direction: row; }
2975
+ .grow { flex: 1 1 0%; }
2976
+
2977
+ /* Alignment utilities */
2978
+ .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; }
2979
+ .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; }
2980
+ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; }
2981
+
2982
+ /* Text overflow utility */
2983
+ .truncate {
2984
+ overflow: hidden;
2985
+ text-overflow: ellipsis;
2986
+ white-space: nowrap;
3213
2987
  }
3214
2988
 
3215
- .flex-wrap {
3216
- flex-wrap: wrap;
3217
- }
2989
+ /* Max-width utilities */
2990
+ .max-w-sm { max-width: 400px; } .max-w-md { max-width: 600px; } .max-w-lg { max-width: 800px; } .max-w-xl { max-width: 1200px; }
3218
2991
 
3219
- .flex-col {
2992
+ /* Stack utilities - vertical rhythm for stacked elements */
2993
+ [class^="stack-"], [class*=" stack-"] {
2994
+ display: flex;
3220
2995
  flex-direction: column;
3221
2996
  }
2997
+ .stack-xs { gap: var(--spacing-1); }
2998
+ .stack-sm { gap: var(--spacing-2); }
2999
+ .stack-md { gap: var(--spacing-4); }
3000
+ .stack-lg { gap: var(--spacing-6); }
3001
+ .stack-xl { gap: var(--spacing-8); }
3222
3002
 
3223
- .flex-row {
3224
- flex-direction: row;
3225
- }
3226
-
3227
- /* Flex alignment */
3228
- .items-start { align-items: flex-start; }
3229
- .items-center { align-items: center; }
3230
- .items-end { align-items: flex-end; }
3231
- .items-stretch { align-items: stretch; }
3232
- .items-baseline { align-items: baseline; }
3233
-
3234
- .justify-start { justify-content: flex-start; }
3235
- .justify-center { justify-content: center; }
3236
- .justify-end { justify-content: flex-end; }
3237
- .justify-between { justify-content: space-between; }
3238
- .justify-around { justify-content: space-around; }
3239
- .justify-evenly { justify-content: space-evenly; }
3003
+ /* Section spacing - for major content blocks */
3004
+ .section { padding-block: var(--spacing-8); }
3005
+ .section-lg { padding-block: var(--spacing-12); }
3240
3006
 
3241
3007
  /* Responsive helpers */
3242
3008
  @media (max-width: 767px) {
@@ -3267,27 +3033,9 @@ button, a {
3267
3033
  }
3268
3034
 
3269
3035
  /* Backdrop variants */
3270
- .backdrop-light {
3271
- --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
3272
- --backdrop-brightness: 1.1;
3273
- }
3274
-
3275
- .backdrop-dark {
3276
- --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
3277
- --backdrop-brightness: 0.6;
3278
- }
3279
-
3280
- .backdrop-blur-sm {
3281
- --backdrop-blur: 5px;
3282
- }
3283
-
3284
- .backdrop-blur-md {
3285
- --backdrop-blur: 10px;
3286
- }
3287
-
3288
- .backdrop-blur-lg {
3289
- --backdrop-blur: 20px;
3290
- }
3036
+ .backdrop-light { --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2)); --backdrop-brightness: 1.1; }
3037
+ .backdrop-dark { --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5)); --backdrop-brightness: 0.6; }
3038
+ .backdrop-blur-sm { --backdrop-blur: 5px; } .backdrop-blur-md { --backdrop-blur: 10px; } .backdrop-blur-lg { --backdrop-blur: 20px; }
3291
3039
 
3292
3040
 
3293
3041
  /* Optional utilities/features controlled by config options */
@@ -3532,22 +3280,101 @@ html[data-theme="dark"] .liquid-glass {
3532
3280
  }
3533
3281
 
3534
3282
 
3535
- /* Inverse surface (dark) using PDS tokens; text/icons inherit currentColor */
3283
+ /*
3284
+ * SURFACE-INVERSE: Local Theme Context Flip
3285
+ *
3286
+ * We can't simply add .surface-inverse to the dark mode selector because that would
3287
+ * also apply the dark color PALETTE (grays, surfaces, etc.), which would override
3288
+ * --color-surface-inverse itself. Instead, we duplicate only the SEMANTIC tokens.
3289
+ *
3290
+ * Light theme .surface-inverse → dark semantic tokens
3291
+ * Dark theme .surface-inverse → light semantic tokens (flip back)
3292
+ */
3293
+
3294
+ /* Surface-inverse visual properties (shared, uses smart surface tokens) */
3536
3295
  .surface-inverse {
3537
3296
  background-color: var(--color-surface-inverse);
3538
- /* Ensure foregrounds inside use the correct smart-surface tokens */
3539
3297
  color: var(--surface-inverse-text);
3540
- --color-text-primary: var(--surface-inverse-text);
3541
- --color-text-secondary: var(--surface-inverse-text-secondary);
3542
- --color-text-muted: var(--surface-inverse-text-muted);
3543
- /* Ensure code/pre and other muted surfaces have contrast on inverse */
3544
- --color-surface-muted: rgba(255, 255, 255, 0.08);
3545
- /* Optional: adjust borders/shadows if utilities/components read these */
3546
- --color-border: var(--surface-inverse-border);
3547
3298
 
3548
3299
  pds-icon {
3549
3300
  color: var(--surface-inverse-icon);
3550
3301
  }
3302
+
3303
+ /* btn-primary stays vibrant in any context */
3304
+ & .btn-primary {
3305
+ background-color: var(--color-primary-500);
3306
+ border-color: var(--color-primary-500);
3307
+ color: var(--color-primary-contrast, #ffffff);
3308
+
3309
+ &:hover {
3310
+ background-color: var(--color-primary-400);
3311
+ border-color: var(--color-primary-400);
3312
+ }
3313
+ }
3314
+ }
3315
+
3316
+ /* Light-mode inverse: apply dark semantic tokens */
3317
+ html:not([data-theme="dark"]) .surface-inverse {
3318
+ --color-text-primary: var(--color-gray-100);
3319
+ --color-text-secondary: var(--color-gray-300);
3320
+ --color-text-muted: var(--color-gray-400);
3321
+ --color-border: var(--color-gray-700);
3322
+ --color-input-bg: var(--color-gray-800);
3323
+ --color-input-disabled-bg: var(--color-gray-900);
3324
+ --color-input-disabled-text: var(--color-gray-600);
3325
+ --color-code-bg: var(--color-gray-800);
3326
+ --color-surface-muted: rgba(255, 255, 255, 0.08);
3327
+
3328
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
3329
+ & .btn-secondary {
3330
+ background-color: rgba(255, 255, 255, 0.12);
3331
+ color: var(--surface-inverse-text);
3332
+ border-color: rgba(255, 255, 255, 0.25);
3333
+
3334
+ &:hover { background-color: rgba(255, 255, 255, 0.2); }
3335
+ &:active { background-color: rgba(255, 255, 255, 0.28); }
3336
+ }
3337
+
3338
+ & select {
3339
+ background-color: rgba(255, 255, 255, 0.1);
3340
+ color: var(--surface-inverse-text);
3341
+ }
3342
+
3343
+ & a:not([class*="btn"]) {
3344
+ color: var(--color-primary-300, #7dd3fc);
3345
+ }
3346
+ }
3347
+
3348
+ /* Dark-mode inverse: flip back to light semantic tokens */
3349
+ html[data-theme="dark"] .surface-inverse {
3350
+ --color-text-primary: var(--color-gray-900);
3351
+ --color-text-secondary: var(--color-gray-600);
3352
+ --color-text-muted: var(--color-gray-600);
3353
+ --color-border: var(--color-gray-300);
3354
+ --color-input-bg: var(--color-surface-base);
3355
+ --color-input-disabled-bg: var(--color-gray-50);
3356
+ --color-input-disabled-text: var(--color-gray-500);
3357
+ --color-code-bg: var(--color-gray-100);
3358
+ --color-surface-muted: var(--color-gray-100);
3359
+
3360
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
3361
+ & .btn-secondary {
3362
+ background-color: rgba(0, 0, 0, 0.06);
3363
+ color: var(--surface-inverse-text);
3364
+ border-color: rgba(0, 0, 0, 0.15);
3365
+
3366
+ &:hover { background-color: rgba(0, 0, 0, 0.1); }
3367
+ &:active { background-color: rgba(0, 0, 0, 0.15); }
3368
+ }
3369
+
3370
+ & select {
3371
+ background-color: #ffffff;
3372
+ color: var(--surface-inverse-text);
3373
+ }
3374
+
3375
+ & a:not([class*="btn"]) {
3376
+ color: var(--color-primary-600, #0284c7);
3377
+ }
3551
3378
  }
3552
3379
 
3553
3380
  /* Shadow utilities */
@@ -3596,11 +3423,7 @@ html[data-theme="dark"] .liquid-glass {
3596
3423
  }
3597
3424
 
3598
3425
  /* Responsive images with different radius sizes */
3599
- .img-rounded-sm { border-radius: var(--radius-sm); }
3600
- .img-rounded-md { border-radius: var(--radius-md); }
3601
- .img-rounded-lg { border-radius: var(--radius-lg); }
3602
- .img-rounded-xl { border-radius: var(--radius-xl); }
3603
- .img-rounded-full { border-radius: var(--radius-full); }
3426
+ .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); }
3604
3427
 
3605
3428
  /* Inline images */
3606
3429
  .img-inline {
@@ -3632,37 +3455,17 @@ html[data-theme="dark"] .liquid-glass {
3632
3455
 
3633
3456
  /* Small devices (640px and up) */
3634
3457
  @media (min-width: 640px) {
3635
- .sm\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
3636
- .sm\:flex-row { flex-direction: row; }
3637
- .sm\:text-sm { font-size: var(--font-size-sm); }
3638
- .sm\:p-6 { padding: var(--spacing-6); }
3639
- .sm\:gap-6 { gap: var(--spacing-6); }
3640
- .sm\:hidden { display: none; }
3641
- .sm\:block { display: block; }
3458
+ .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; }
3642
3459
  }
3643
3460
 
3644
3461
  /* Medium devices (768px and up) */
3645
3462
  @media (min-width: 768px) {
3646
- .md\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
3647
- .md\:text-lg { font-size: var(--font-size-lg); }
3648
- .md\:p-8 { padding: var(--spacing-8); }
3649
- .md\:gap-8 { gap: var(--spacing-8); }
3650
- .md\:flex-row { flex-direction: row; }
3651
- .md\:w-1\/2 { width: 50%; }
3652
- .md\:w-1\/3 { width: 33.333333%; }
3653
- .md\:hidden { display: none; }
3654
- .md\:block { display: block; }
3463
+ .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; }
3655
3464
  }
3656
3465
 
3657
3466
  /* Large devices (1024px and up) */
3658
3467
  @media (min-width: 1024px) {
3659
- .lg\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
3660
- .lg\:text-xl { font-size: var(--font-size-xl); }
3661
- .lg\:p-12 { padding: var(--spacing-12); }
3662
- .lg\:gap-12 { gap: var(--spacing-12); }
3663
- .lg\:w-1\/4 { width: 25%; }
3664
- .lg\:hidden { display: none; }
3665
- .lg\:block { display: block; }
3468
+ .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; }
3666
3469
  }
3667
3470
 
3668
3471
  /* Touch device optimizations */