@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,3761 @@
1
+ @layer tokens {
2
+ :root {
3
+ /* Colors */
4
+ --color-primary-50: #95dbee;
5
+ --color-primary-100: #65ceeb;
6
+ --color-primary-200: #32c3eb;
7
+ --color-primary-300: #15acd6;
8
+ --color-primary-400: #1087a7;
9
+ --color-primary-500: #0e7490;
10
+ --color-primary-600: #0b5e74;
11
+ --color-primary-700: #094b5d;
12
+ --color-primary-800: #073846;
13
+ --color-primary-900: #05252e;
14
+ --color-secondary-50: #f4f2f1;
15
+ --color-secondary-100: #e9e4e2;
16
+ --color-secondary-200: #ddd7d5;
17
+ --color-secondary-300: #c6bdb9;
18
+ --color-secondary-400: #afa29c;
19
+ --color-secondary-500: #a99b95;
20
+ --color-secondary-600: #928079;
21
+ --color-secondary-700: #776761;
22
+ --color-secondary-800: #5b4f4a;
23
+ --color-secondary-900: #3f3733;
24
+ --color-accent-50: #fbeaef;
25
+ --color-accent-100: #f8d3de;
26
+ --color-accent-200: #f4b2c5;
27
+ --color-accent-300: #ee85a4;
28
+ --color-accent-400: #e85882;
29
+ --color-accent-500: #e54271;
30
+ --color-accent-600: #d61e53;
31
+ --color-accent-700: #aa1742;
32
+ --color-accent-800: #7d1130;
33
+ --color-accent-900: #500b1f;
34
+ --color-success-50: #d3f8d3;
35
+ --color-success-100: #a4f3a4;
36
+ --color-success-200: #73f273;
37
+ --color-success-300: #44ed44;
38
+ --color-success-400: #16e816;
39
+ --color-success-500: #14d114;
40
+ --color-success-600: #10a210;
41
+ --color-success-700: #0b740b;
42
+ --color-success-800: #074607;
43
+ --color-success-900: #042f04;
44
+ --color-warning-50: #fae39f;
45
+ --color-warning-100: #fbd76a;
46
+ --color-warning-200: #ffcc33;
47
+ --color-warning-300: #ffbf00;
48
+ --color-warning-400: #cc9900;
49
+ --color-warning-500: #B38600;
50
+ --color-warning-600: #806000;
51
+ --color-warning-700: #664c00;
52
+ --color-warning-800: #4d3900;
53
+ --color-warning-900: #332600;
54
+ --color-danger-50: #fbe9e9;
55
+ --color-danger-100: #f6bbbb;
56
+ --color-danger-200: #f38b8b;
57
+ --color-danger-300: #ef5d5d;
58
+ --color-danger-400: #ea2e2e;
59
+ --color-danger-500: #e81717;
60
+ --color-danger-600: #ba1212;
61
+ --color-danger-700: #8b0e0e;
62
+ --color-danger-800: #5d0909;
63
+ --color-danger-900: #2e0505;
64
+ --color-info-50: #95dbee;
65
+ --color-info-100: #65ceeb;
66
+ --color-info-200: #32c3eb;
67
+ --color-info-300: #15acd6;
68
+ --color-info-400: #1087a7;
69
+ --color-info-500: #0e7490;
70
+ --color-info-600: #0b5e74;
71
+ --color-info-700: #094b5d;
72
+ --color-info-800: #073846;
73
+ --color-info-900: #05252e;
74
+ --color-gray-50: #fafaf9;
75
+ --color-gray-100: #f4f2f1;
76
+ --color-gray-200: #e3dfdd;
77
+ --color-gray-300: #cdc5c1;
78
+ --color-gray-400: #a3958f;
79
+ --color-gray-500: #a99b95;
80
+ --color-gray-600: #846c62;
81
+ --color-gray-700: #695349;
82
+ --color-gray-800: #3d2f29;
83
+ --color-gray-900: #1f1714;
84
+ --color-surface-base: #e7e6de;
85
+ --color-surface-subtle: #e3e2d8;
86
+ --color-surface-elevated: #deddd2;
87
+ --color-surface-sunken: #dad9cc;
88
+ --color-surface-overlay: #ebeae4;
89
+ --color-surface-inverse: #191810;
90
+ --color-surface-hover: color-mix(in oklab, var(--color-surface-base) 92%, var(--color-text-primary) 8%);;
91
+ --color-surface-fieldset-base: #e3e2d8;
92
+ --color-surface-fieldset-subtle: #deddd2;
93
+ --color-surface-fieldset-elevated: #dad9cc;
94
+ --color-surface-fieldset-sunken: #d1d0c0;
95
+ --color-surface-fieldset-overlay: #deddd2;
96
+ /* Smart Surface Tokens (context-aware) */
97
+ --surface-base-bg: #e7e6de;
98
+ --surface-base-text: #000000;
99
+ --surface-base-text-secondary: #000000;
100
+ --surface-base-text-muted: #5c5c59;
101
+ --surface-base-icon: #000000;
102
+ --surface-base-icon-subtle: #5c5c59;
103
+ --surface-base-shadow: rgba(0, 0, 0, 0.1);
104
+ --surface-base-border: rgba(0, 0, 0, 0.1);
105
+ --surface-subtle-bg: #e3e2d8;
106
+ --surface-subtle-text: #000000;
107
+ --surface-subtle-text-secondary: #000000;
108
+ --surface-subtle-text-muted: #5b5a56;
109
+ --surface-subtle-icon: #000000;
110
+ --surface-subtle-icon-subtle: #5b5a56;
111
+ --surface-subtle-shadow: rgba(0, 0, 0, 0.1);
112
+ --surface-subtle-border: rgba(0, 0, 0, 0.1);
113
+ --surface-elevated-bg: #deddd2;
114
+ --surface-elevated-text: #000000;
115
+ --surface-elevated-text-secondary: #000000;
116
+ --surface-elevated-text-muted: #595854;
117
+ --surface-elevated-icon: #000000;
118
+ --surface-elevated-icon-subtle: #595854;
119
+ --surface-elevated-shadow: rgba(0, 0, 0, 0.1);
120
+ --surface-elevated-border: rgba(0, 0, 0, 0.1);
121
+ --surface-sunken-bg: #dad9cc;
122
+ --surface-sunken-text: #000000;
123
+ --surface-sunken-text-secondary: #000000;
124
+ --surface-sunken-text-muted: #575752;
125
+ --surface-sunken-icon: #000000;
126
+ --surface-sunken-icon-subtle: #575752;
127
+ --surface-sunken-shadow: rgba(0, 0, 0, 0.1);
128
+ --surface-sunken-border: rgba(0, 0, 0, 0.1);
129
+ --surface-overlay-bg: #ebeae4;
130
+ --surface-overlay-text: #000000;
131
+ --surface-overlay-text-secondary: #000000;
132
+ --surface-overlay-text-muted: #5e5e5b;
133
+ --surface-overlay-icon: #000000;
134
+ --surface-overlay-icon-subtle: #5e5e5b;
135
+ --surface-overlay-shadow: rgba(0, 0, 0, 0.1);
136
+ --surface-overlay-border: rgba(0, 0, 0, 0.1);
137
+ --surface-inverse-bg: #191810;
138
+ --surface-inverse-text: #ffffff;
139
+ --surface-inverse-text-secondary: #ffffff;
140
+ --surface-inverse-text-muted: #a3a39f;
141
+ --surface-inverse-icon: #ffffff;
142
+ --surface-inverse-icon-subtle: #a3a39f;
143
+ --surface-inverse-shadow: rgba(255, 255, 255, 0.25);
144
+ --surface-inverse-border: rgba(255, 255, 255, 0.15);
145
+
146
+ /* Semantic Text Colors */
147
+ --color-text-primary: var(--color-gray-900);
148
+ --color-text-secondary: var(--color-gray-600);
149
+ --color-text-muted: var(--color-gray-600);
150
+ --color-border: var(--color-gray-300);
151
+ --color-input-bg: var(--color-surface-base);
152
+ --color-input-disabled-bg: var(--color-gray-50);
153
+ --color-input-disabled-text: var(--color-gray-500);
154
+ --color-code-bg: var(--color-gray-100);
155
+ /* Interactive Colors - optimized for specific use cases */
156
+ --color-primary-fill: #0b5e74; /* For button backgrounds with white text */
157
+ --color-primary-text: #0b5e74; /* For links and outline buttons on light surfaces */
158
+ /* Translucent Surface Tokens */
159
+ --color-surface-translucent-25: color-mix(in oklab, var(--color-surface-subtle) 25%, transparent 75%);
160
+ --color-surface-translucent-50: color-mix(in oklab, var(--color-surface-subtle) 50%, transparent 50%);
161
+ --color-surface-translucent-75: color-mix(in oklab, var(--color-surface-subtle) 75%, transparent 25%);
162
+ /* Backdrop tokens - used for modal dialogs, drawers, overlays */
163
+
164
+ --backdrop-bg: linear-gradient(
165
+ 135deg,
166
+ rgba(255, 255, 255, 0.2),
167
+ rgba(255, 255, 255, 0.1)
168
+ );
169
+ --backdrop-blur: 10px;
170
+ --backdrop-saturate: 150%;
171
+ --backdrop-brightness: 0.9;
172
+ --backdrop-filter: blur(var(--backdrop-blur)) saturate(var(--backdrop-saturate)) brightness(var(--backdrop-brightness));
173
+ --backdrop-opacity: 1;
174
+
175
+ /* Legacy alias for backwards compatibility */
176
+ --backdrop-background: var(--backdrop-bg);
177
+
178
+ /* Mesh Gradient Backgrounds */
179
+ --background-mesh-01: radial-gradient(at 27% 37%, color-mix(in oklab, #0e7490 25%, transparent) 0px, transparent 50%),
180
+ radial-gradient(at 97% 21%, color-mix(in oklab, #a99b95 22%, transparent) 0px, transparent 50%),
181
+ radial-gradient(at 52% 99%, color-mix(in oklab, #e54271 18%, transparent) 0px, transparent 50%),
182
+ radial-gradient(at 10% 29%, color-mix(in oklab, #0e7490 15%, transparent) 0px, transparent 50%);
183
+
184
+ --background-mesh-02: radial-gradient(at 40% 20%, color-mix(in oklab, #a99b95 24%, transparent) 0px, transparent 50%),
185
+ radial-gradient(at 80% 0%, color-mix(in oklab, #0e7490 20%, transparent) 0px, transparent 50%),
186
+ radial-gradient(at 0% 50%, color-mix(in oklab, #e54271 17%, transparent) 0px, transparent 50%),
187
+ radial-gradient(at 80% 100%, color-mix(in oklab, #a99b95 15%, transparent) 0px, transparent 50%);
188
+
189
+ --background-mesh-03: radial-gradient(at 15% 50%, color-mix(in oklab, #e54271 21%, transparent) 0px, transparent 50%),
190
+ radial-gradient(at 85% 30%, color-mix(in oklab, #0e7490 23%, transparent) 0px, transparent 50%),
191
+ radial-gradient(at 50% 80%, color-mix(in oklab, #a99b95 18%, transparent) 0px, transparent 50%),
192
+ radial-gradient(at 90% 90%, color-mix(in oklab, #e54271 16%, transparent) 0px, transparent 50%);
193
+
194
+ --background-mesh-04: radial-gradient(at 70% 15%, color-mix(in oklab, #0e7490 19%, transparent) 0px, transparent 50%),
195
+ radial-gradient(at 20% 80%, color-mix(in oklab, #a99b95 22%, transparent) 0px, transparent 50%),
196
+ radial-gradient(at 90% 60%, color-mix(in oklab, #e54271 17%, transparent) 0px, transparent 50%),
197
+ radial-gradient(at 30% 40%, color-mix(in oklab, #0e7490 16%, transparent) 0px, transparent 50%);
198
+
199
+ --background-mesh-05: radial-gradient(at 50% 50%, color-mix(in oklab, #0e7490 23%, transparent) 0px, transparent 50%),
200
+ radial-gradient(at 10% 10%, color-mix(in oklab, #e54271 20%, transparent) 0px, transparent 50%),
201
+ radial-gradient(at 90% 10%, color-mix(in oklab, #a99b95 18%, transparent) 0px, transparent 50%),
202
+ radial-gradient(at 50% 90%, color-mix(in oklab, #e54271 15%, transparent) 0px, transparent 50%);
203
+
204
+
205
+ /* Spacing */
206
+ --spacing-0: 0;
207
+ --spacing-1: 4px;
208
+ --spacing-2: 8px;
209
+ --spacing-3: 12px;
210
+ --spacing-4: 16px;
211
+ --spacing-5: 20px;
212
+ --spacing-6: 24px;
213
+ --spacing-7: 28px;
214
+ --spacing-8: 32px;
215
+ --spacing-9: 36px;
216
+ --spacing-10: 40px;
217
+ --spacing-11: 44px;
218
+ --spacing-12: 48px;
219
+
220
+
221
+ /* Border Radius */
222
+ --radius-none: 0;
223
+ --radius-xs: 4px;
224
+ --radius-sm: 8px;
225
+ --radius-md: 16px;
226
+ --radius-lg: 24px;
227
+ --radius-xl: 32px;
228
+ --radius-full: 9999px;
229
+
230
+
231
+ /* Border Widths */
232
+ --border-width-hairline: 0.5px;
233
+ --border-width-thin: 1px;
234
+ --border-width-medium: 2px;
235
+ --border-width-thick: 3px;
236
+
237
+
238
+ /* Typography */
239
+ --font-family-headings: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
240
+ --font-family-body: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
241
+ --font-family-mono: ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, Consolas, monospace;
242
+ --font-size-xs: 11px;
243
+ --font-size-sm: 13px;
244
+ --font-size-base: 16px;
245
+ --font-size-lg: 19px;
246
+ --font-size-xl: 23px;
247
+ --font-size-2xl: 28px;
248
+ --font-size-3xl: 33px;
249
+ --font-size-4xl: 40px;
250
+ --font-weight-light: 300;
251
+ --font-weight-normal: 400;
252
+ --font-weight-medium: 500;
253
+ --font-weight-semibold: 600;
254
+ --font-weight-bold: 700;
255
+ --font-line-height-tight: 1.25;
256
+ --font-line-height-normal: 1.5;
257
+ --font-line-height-relaxed: 1.75;
258
+
259
+
260
+ /* Shadows */
261
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
262
+ --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.05);
263
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.05);
264
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
265
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.05);
266
+ --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
267
+
268
+
269
+ /* Layout */
270
+ --layout-max-width: 1200px;
271
+ --layout-min-height: 100vh;
272
+ --layout-container-padding: var(--spacing-6)px;
273
+ --layout-page-margin: 120px;
274
+ --layout-section-gap: 160px;
275
+ --layout-container-gap: 200px;
276
+ --layout-hero-spacing: 240px;
277
+ --layout-footer-spacing: 160px;
278
+
279
+
280
+ /* Transitions */
281
+ --transition-fast: 150ms;
282
+ --transition-normal: 250ms;
283
+ --transition-slow: 350ms;
284
+
285
+
286
+ /* Z-Index */
287
+ --z-dropdown: 1000;
288
+ --z-sticky: 1020;
289
+ --z-fixed: 1030;
290
+ --z-modal: 1040;
291
+ --z-drawer: 1050;
292
+ --z-popover: 1060;
293
+ --z-tooltip: 1070;
294
+ --z-notification: 1080;
295
+
296
+
297
+ /* Icon System */
298
+ --icon-set: phosphor;
299
+ --icon-weight: regular;
300
+ --icon-size: 24px;
301
+ --icon-size-xs: 16px;
302
+ --icon-size-sm: 20px;
303
+ --icon-size-md: 24px;
304
+ --icon-size-lg: 32px;
305
+ --icon-size-xl: 48px;
306
+ --icon-size-2xl: 64px;
307
+
308
+
309
+ }
310
+
311
+ html[data-theme="dark"] {
312
+ --color-surface-base: #16171a;
313
+ --color-surface-subtle: #111214;
314
+ --color-surface-elevated: #0d0d0f;
315
+ --color-surface-sunken: #131416;
316
+ --color-surface-overlay: #1b1c20;
317
+ --color-surface-inverse: #f2f2f3;
318
+ --color-surface-hover: color-mix(in oklab, var(--color-surface-base) 92%, var(--color-text-primary) 8%);;
319
+ --color-surface-fieldset-base: #0d0d0f;
320
+ --color-surface-fieldset-subtle: #1b1c20;
321
+ --color-surface-fieldset-elevated: #1f1f24;
322
+ --color-surface-fieldset-sunken: #0d0d0f;
323
+ --color-surface-fieldset-overlay: #25272c;
324
+ --color-primary-50: #c5f2fa;
325
+ --color-primary-100: #93eaf9;
326
+ --color-primary-200: #5fe4fa;
327
+ --color-primary-300: #2ddbf9;
328
+ --color-primary-400: #07cbed;
329
+ --color-primary-500: #06b6d4;
330
+ --color-primary-600: #058ba2;
331
+ --color-primary-700: #036171;
332
+ --color-primary-800: #02404a;
333
+ --color-primary-900: #012b32;
334
+ --color-secondary-50: #f1f2f4;
335
+ --color-secondary-100: #e2e5e9;
336
+ --color-secondary-200: #cfd1d5;
337
+ --color-secondary-300: #b4b8bd;
338
+ --color-secondary-400: #999ea5;
339
+ --color-secondary-500: #8b9199;
340
+ --color-secondary-600: #717780;
341
+ --color-secondary-700: #595e65;
342
+ --color-secondary-800: #41454a;
343
+ --color-secondary-900: #292c2f;
344
+ --color-accent-50: #3a0e1b;
345
+ --color-accent-100: #5b162a;
346
+ --color-accent-200: #7c1e3a;
347
+ --color-accent-300: #9c2749;
348
+ --color-accent-400: #ce2d5b;
349
+ --color-accent-500: #d53b68;
350
+ --color-accent-600: #dc5f84;
351
+ --color-accent-700: #e4839f;
352
+ --color-accent-800: #f4c1d0;
353
+ --color-accent-900: #f6d6e0;
354
+ --color-gray-50: #fafafa;
355
+ --color-gray-100: #f1f2f3;
356
+ --color-gray-200: #dee0e2;
357
+ --color-gray-300: #c3c6cb;
358
+ --color-gray-400: #9298a0;
359
+ --color-gray-500: #8b9199;
360
+ --color-gray-600: #667180;
361
+ --color-gray-700: #4c5766;
362
+ --color-gray-800: #2b323b;
363
+ --color-gray-900: #15191e;
364
+ --color-success-50: #072207;
365
+ --color-success-100: #0b330b;
366
+ --color-success-200: #115411;
367
+ --color-success-300: #187618;
368
+ --color-success-400: #1da61d;
369
+ --color-success-500: #20b820;
370
+ --color-success-600: #2ad92a;
371
+ --color-success-700: #4fe14f;
372
+ --color-success-800: #94ee94;
373
+ --color-success-900: #c1f4c1;
374
+ --color-info-50: #071c22;
375
+ --color-info-100: #0b2a33;
376
+ --color-info-200: #0e3844;
377
+ --color-info-300: #114654;
378
+ --color-info-400: #145e72;
379
+ --color-info-500: #176d84;
380
+ --color-info-600: #1e8baa;
381
+ --color-info-700: #24a9ce;
382
+ --color-info-800: #5ac7e5;
383
+ --color-info-900: #87d4e9;
384
+ --color-warning-50: #251c04;
385
+ --color-warning-100: #372b06;
386
+ --color-warning-200: #493908;
387
+ --color-warning-300: #5c480a;
388
+ --color-warning-400: #8d6c0b;
389
+ --color-warning-500: #a07c0d;
390
+ --color-warning-600: #c89a10;
391
+ --color-warning-700: #ecb718;
392
+ --color-warning-800: #f6d05d;
393
+ --color-warning-900: #f6dc8e;
394
+ --color-danger-50: #220707;
395
+ --color-danger-100: #440e0e;
396
+ --color-danger-200: #651515;
397
+ --color-danger-300: #871c1c;
398
+ --color-danger-400: #b82121;
399
+ --color-danger-500: #ca2424;
400
+ --color-danger-600: #dd3e3e;
401
+ --color-danger-700: #e26262;
402
+ --color-danger-800: #f2aaaa;
403
+ --color-danger-900: #f6d5d5;
404
+ /* Smart Surface Tokens (dark mode, context-aware) */
405
+ --surface-base-bg: #16171a;
406
+ --surface-base-text: #ffffff;
407
+ --surface-base-text-secondary: #ffffff;
408
+ --surface-base-text-muted: #a2a2a3;
409
+ --surface-base-icon: #ffffff;
410
+ --surface-base-icon-subtle: #a2a2a3;
411
+ --surface-base-shadow: rgba(255, 255, 255, 0.25);
412
+ --surface-base-border: rgba(255, 255, 255, 0.15);
413
+ --surface-subtle-bg: #111214;
414
+ --surface-subtle-text: #ffffff;
415
+ --surface-subtle-text-secondary: #ffffff;
416
+ --surface-subtle-text-muted: #a0a0a1;
417
+ --surface-subtle-icon: #ffffff;
418
+ --surface-subtle-icon-subtle: #a0a0a1;
419
+ --surface-subtle-shadow: rgba(255, 255, 255, 0.25);
420
+ --surface-subtle-border: rgba(255, 255, 255, 0.15);
421
+ --surface-elevated-bg: #0d0d0f;
422
+ --surface-elevated-text: #ffffff;
423
+ --surface-elevated-text-secondary: #ffffff;
424
+ --surface-elevated-text-muted: #9e9e9f;
425
+ --surface-elevated-icon: #ffffff;
426
+ --surface-elevated-icon-subtle: #9e9e9f;
427
+ --surface-elevated-shadow: rgba(255, 255, 255, 0.25);
428
+ --surface-elevated-border: rgba(255, 255, 255, 0.15);
429
+ --surface-sunken-bg: #131416;
430
+ --surface-sunken-text: #ffffff;
431
+ --surface-sunken-text-secondary: #ffffff;
432
+ --surface-sunken-text-muted: #a1a1a2;
433
+ --surface-sunken-icon: #ffffff;
434
+ --surface-sunken-icon-subtle: #a1a1a2;
435
+ --surface-sunken-shadow: rgba(255, 255, 255, 0.25);
436
+ --surface-sunken-border: rgba(255, 255, 255, 0.15);
437
+ --surface-overlay-bg: #1b1c20;
438
+ --surface-overlay-text: #ffffff;
439
+ --surface-overlay-text-secondary: #ffffff;
440
+ --surface-overlay-text-muted: #a4a4a6;
441
+ --surface-overlay-icon: #ffffff;
442
+ --surface-overlay-icon-subtle: #a4a4a6;
443
+ --surface-overlay-shadow: rgba(255, 255, 255, 0.25);
444
+ --surface-overlay-border: rgba(255, 255, 255, 0.15);
445
+ --surface-inverse-bg: #f2f2f3;
446
+ --surface-inverse-text: #000000;
447
+ --surface-inverse-text-secondary: #000000;
448
+ --surface-inverse-text-muted: #616161;
449
+ --surface-inverse-icon: #000000;
450
+ --surface-inverse-icon-subtle: #616161;
451
+ --surface-inverse-shadow: rgba(0, 0, 0, 0.1);
452
+ --surface-inverse-border: rgba(0, 0, 0, 0.1);
453
+
454
+ --color-text-primary: var(--color-gray-100);
455
+ --color-text-secondary: var(--color-gray-300);
456
+ --color-text-muted: var(--color-gray-400);
457
+ --color-border: var(--color-gray-700);
458
+ --color-input-bg: var(--color-gray-800);
459
+ --color-input-disabled-bg: var(--color-gray-900);
460
+ --color-input-disabled-text: var(--color-gray-600);
461
+ --color-code-bg: var(--color-gray-800);
462
+ /* Interactive Colors - optimized for specific use cases (dark mode) */
463
+ --color-primary-fill: #036171; /* For button backgrounds with white text */
464
+ --color-primary-text: #06b6d4; /* For links and outline buttons on dark surfaces */
465
+ /* Backdrop tokens - dark mode */
466
+ --backdrop-bg: linear-gradient(
467
+ 135deg,
468
+ rgba(0, 0, 0, 0.6),
469
+ rgba(0, 0, 0, 0.4)
470
+ );
471
+ --backdrop-blur: 10px;
472
+ --backdrop-saturate: 120%;
473
+ --backdrop-brightness: 0.7;
474
+ --backdrop-filter: blur(var(--backdrop-blur)) saturate(var(--backdrop-saturate)) brightness(var(--backdrop-brightness));
475
+ --backdrop-opacity: 1;
476
+
477
+ /* Legacy alias for backwards compatibility */
478
+ --backdrop-background: var(--backdrop-bg);
479
+ /* Mesh Gradient Variables (Dark Mode) */
480
+ --background-mesh-01: radial-gradient(at 27% 37%, color-mix(in oklab, #07cbed 20%, transparent) 0px, transparent 50%),
481
+ radial-gradient(at 97% 21%, color-mix(in oklab, #999ea5 16%, transparent) 0px, transparent 50%),
482
+ radial-gradient(at 52% 99%, color-mix(in oklab, #ce2d5b 13%, transparent) 0px, transparent 50%),
483
+ radial-gradient(at 10% 29%, color-mix(in oklab, #07cbed 10%, transparent) 0px, transparent 50%);
484
+
485
+ --background-mesh-02: radial-gradient(at 40% 20%, color-mix(in oklab, #999ea5 18%, transparent) 0px, transparent 50%),
486
+ radial-gradient(at 80% 0%, color-mix(in oklab, #07cbed 14%, transparent) 0px, transparent 50%),
487
+ radial-gradient(at 0% 50%, color-mix(in oklab, #ce2d5b 12%, transparent) 0px, transparent 50%),
488
+ radial-gradient(at 80% 100%, color-mix(in oklab, #999ea5 10%, transparent) 0px, transparent 50%);
489
+
490
+ --background-mesh-03: radial-gradient(at 15% 50%, color-mix(in oklab, #ce2d5b 15%, transparent) 0px, transparent 50%),
491
+ radial-gradient(at 85% 30%, color-mix(in oklab, #07cbed 17%, transparent) 0px, transparent 50%),
492
+ radial-gradient(at 50% 80%, color-mix(in oklab, #999ea5 13%, transparent) 0px, transparent 50%),
493
+ radial-gradient(at 90% 90%, color-mix(in oklab, #ce2d5b 11%, transparent) 0px, transparent 50%);
494
+
495
+ --background-mesh-04: radial-gradient(at 70% 15%, color-mix(in oklab, #07cbed 14%, transparent) 0px, transparent 50%),
496
+ radial-gradient(at 20% 80%, color-mix(in oklab, #999ea5 16%, transparent) 0px, transparent 50%),
497
+ radial-gradient(at 90% 60%, color-mix(in oklab, #ce2d5b 12%, transparent) 0px, transparent 50%),
498
+ radial-gradient(at 30% 40%, color-mix(in oklab, #07cbed 11%, transparent) 0px, transparent 50%);
499
+
500
+ --background-mesh-05: radial-gradient(at 50% 50%, color-mix(in oklab, #07cbed 17%, transparent) 0px, transparent 50%),
501
+ radial-gradient(at 10% 10%, color-mix(in oklab, #ce2d5b 14%, transparent) 0px, transparent 50%),
502
+ radial-gradient(at 90% 10%, color-mix(in oklab, #999ea5 13%, transparent) 0px, transparent 50%),
503
+ radial-gradient(at 50% 90%, color-mix(in oklab, #ce2d5b 10%, transparent) 0px, transparent 50%);
504
+ }
505
+
506
+ }
507
+ /* Non-layered dark variables fallback (ensures attribute wins) */
508
+ html[data-theme="dark"] {
509
+ --color-surface-base: #16171a;
510
+ --color-surface-subtle: #111214;
511
+ --color-surface-elevated: #0d0d0f;
512
+ --color-surface-sunken: #131416;
513
+ --color-surface-overlay: #1b1c20;
514
+ --color-surface-inverse: #f2f2f3;
515
+ --color-surface-hover: color-mix(in oklab, var(--color-surface-base) 92%, var(--color-text-primary) 8%);;
516
+ --color-surface-fieldset-base: #0d0d0f;
517
+ --color-surface-fieldset-subtle: #1b1c20;
518
+ --color-surface-fieldset-elevated: #1f1f24;
519
+ --color-surface-fieldset-sunken: #0d0d0f;
520
+ --color-surface-fieldset-overlay: #25272c;
521
+ --color-primary-50: #c5f2fa;
522
+ --color-primary-100: #93eaf9;
523
+ --color-primary-200: #5fe4fa;
524
+ --color-primary-300: #2ddbf9;
525
+ --color-primary-400: #07cbed;
526
+ --color-primary-500: #06b6d4;
527
+ --color-primary-600: #058ba2;
528
+ --color-primary-700: #036171;
529
+ --color-primary-800: #02404a;
530
+ --color-primary-900: #012b32;
531
+ --color-secondary-50: #f1f2f4;
532
+ --color-secondary-100: #e2e5e9;
533
+ --color-secondary-200: #cfd1d5;
534
+ --color-secondary-300: #b4b8bd;
535
+ --color-secondary-400: #999ea5;
536
+ --color-secondary-500: #8b9199;
537
+ --color-secondary-600: #717780;
538
+ --color-secondary-700: #595e65;
539
+ --color-secondary-800: #41454a;
540
+ --color-secondary-900: #292c2f;
541
+ --color-accent-50: #3a0e1b;
542
+ --color-accent-100: #5b162a;
543
+ --color-accent-200: #7c1e3a;
544
+ --color-accent-300: #9c2749;
545
+ --color-accent-400: #ce2d5b;
546
+ --color-accent-500: #d53b68;
547
+ --color-accent-600: #dc5f84;
548
+ --color-accent-700: #e4839f;
549
+ --color-accent-800: #f4c1d0;
550
+ --color-accent-900: #f6d6e0;
551
+ --color-gray-50: #fafafa;
552
+ --color-gray-100: #f1f2f3;
553
+ --color-gray-200: #dee0e2;
554
+ --color-gray-300: #c3c6cb;
555
+ --color-gray-400: #9298a0;
556
+ --color-gray-500: #8b9199;
557
+ --color-gray-600: #667180;
558
+ --color-gray-700: #4c5766;
559
+ --color-gray-800: #2b323b;
560
+ --color-gray-900: #15191e;
561
+ --color-success-50: #072207;
562
+ --color-success-100: #0b330b;
563
+ --color-success-200: #115411;
564
+ --color-success-300: #187618;
565
+ --color-success-400: #1da61d;
566
+ --color-success-500: #20b820;
567
+ --color-success-600: #2ad92a;
568
+ --color-success-700: #4fe14f;
569
+ --color-success-800: #94ee94;
570
+ --color-success-900: #c1f4c1;
571
+ --color-info-50: #071c22;
572
+ --color-info-100: #0b2a33;
573
+ --color-info-200: #0e3844;
574
+ --color-info-300: #114654;
575
+ --color-info-400: #145e72;
576
+ --color-info-500: #176d84;
577
+ --color-info-600: #1e8baa;
578
+ --color-info-700: #24a9ce;
579
+ --color-info-800: #5ac7e5;
580
+ --color-info-900: #87d4e9;
581
+ --color-warning-50: #251c04;
582
+ --color-warning-100: #372b06;
583
+ --color-warning-200: #493908;
584
+ --color-warning-300: #5c480a;
585
+ --color-warning-400: #8d6c0b;
586
+ --color-warning-500: #a07c0d;
587
+ --color-warning-600: #c89a10;
588
+ --color-warning-700: #ecb718;
589
+ --color-warning-800: #f6d05d;
590
+ --color-warning-900: #f6dc8e;
591
+ --color-danger-50: #220707;
592
+ --color-danger-100: #440e0e;
593
+ --color-danger-200: #651515;
594
+ --color-danger-300: #871c1c;
595
+ --color-danger-400: #b82121;
596
+ --color-danger-500: #ca2424;
597
+ --color-danger-600: #dd3e3e;
598
+ --color-danger-700: #e26262;
599
+ --color-danger-800: #f2aaaa;
600
+ --color-danger-900: #f6d5d5;
601
+ /* Smart Surface Tokens (dark mode, context-aware) */
602
+ --surface-base-bg: #16171a;
603
+ --surface-base-text: #ffffff;
604
+ --surface-base-text-secondary: #ffffff;
605
+ --surface-base-text-muted: #a2a2a3;
606
+ --surface-base-icon: #ffffff;
607
+ --surface-base-icon-subtle: #a2a2a3;
608
+ --surface-base-shadow: rgba(255, 255, 255, 0.25);
609
+ --surface-base-border: rgba(255, 255, 255, 0.15);
610
+ --surface-subtle-bg: #111214;
611
+ --surface-subtle-text: #ffffff;
612
+ --surface-subtle-text-secondary: #ffffff;
613
+ --surface-subtle-text-muted: #a0a0a1;
614
+ --surface-subtle-icon: #ffffff;
615
+ --surface-subtle-icon-subtle: #a0a0a1;
616
+ --surface-subtle-shadow: rgba(255, 255, 255, 0.25);
617
+ --surface-subtle-border: rgba(255, 255, 255, 0.15);
618
+ --surface-elevated-bg: #0d0d0f;
619
+ --surface-elevated-text: #ffffff;
620
+ --surface-elevated-text-secondary: #ffffff;
621
+ --surface-elevated-text-muted: #9e9e9f;
622
+ --surface-elevated-icon: #ffffff;
623
+ --surface-elevated-icon-subtle: #9e9e9f;
624
+ --surface-elevated-shadow: rgba(255, 255, 255, 0.25);
625
+ --surface-elevated-border: rgba(255, 255, 255, 0.15);
626
+ --surface-sunken-bg: #131416;
627
+ --surface-sunken-text: #ffffff;
628
+ --surface-sunken-text-secondary: #ffffff;
629
+ --surface-sunken-text-muted: #a1a1a2;
630
+ --surface-sunken-icon: #ffffff;
631
+ --surface-sunken-icon-subtle: #a1a1a2;
632
+ --surface-sunken-shadow: rgba(255, 255, 255, 0.25);
633
+ --surface-sunken-border: rgba(255, 255, 255, 0.15);
634
+ --surface-overlay-bg: #1b1c20;
635
+ --surface-overlay-text: #ffffff;
636
+ --surface-overlay-text-secondary: #ffffff;
637
+ --surface-overlay-text-muted: #a4a4a6;
638
+ --surface-overlay-icon: #ffffff;
639
+ --surface-overlay-icon-subtle: #a4a4a6;
640
+ --surface-overlay-shadow: rgba(255, 255, 255, 0.25);
641
+ --surface-overlay-border: rgba(255, 255, 255, 0.15);
642
+ --surface-inverse-bg: #f2f2f3;
643
+ --surface-inverse-text: #000000;
644
+ --surface-inverse-text-secondary: #000000;
645
+ --surface-inverse-text-muted: #616161;
646
+ --surface-inverse-icon: #000000;
647
+ --surface-inverse-icon-subtle: #616161;
648
+ --surface-inverse-shadow: rgba(0, 0, 0, 0.1);
649
+ --surface-inverse-border: rgba(0, 0, 0, 0.1);
650
+
651
+ --color-text-primary: var(--color-gray-100);
652
+ --color-text-secondary: var(--color-gray-300);
653
+ --color-text-muted: var(--color-gray-400);
654
+ --color-border: var(--color-gray-700);
655
+ --color-input-bg: var(--color-gray-800);
656
+ --color-input-disabled-bg: var(--color-gray-900);
657
+ --color-input-disabled-text: var(--color-gray-600);
658
+ --color-code-bg: var(--color-gray-800);
659
+ /* Backdrop tokens - dark mode */
660
+ --backdrop-bg: linear-gradient(
661
+ 135deg,
662
+ rgba(0, 0, 0, 0.6),
663
+ rgba(0, 0, 0, 0.4)
664
+ );
665
+ --backdrop-blur: 10px;
666
+ --backdrop-saturate: 120%;
667
+ --backdrop-brightness: 0.7;
668
+ --backdrop-filter: blur(var(--backdrop-blur)) saturate(var(--backdrop-saturate)) brightness(var(--backdrop-brightness));
669
+ --backdrop-opacity: 1;
670
+
671
+ /* Legacy alias for backwards compatibility */
672
+ --backdrop-background: var(--backdrop-bg);
673
+
674
+ /* Mesh Gradient Backgrounds (Dark Mode) */
675
+ --background-mesh-01: radial-gradient(at 27% 37%, color-mix(in oklab, #07cbed 20%, transparent) 0px, transparent 50%),
676
+ radial-gradient(at 97% 21%, color-mix(in oklab, #999ea5 16%, transparent) 0px, transparent 50%),
677
+ radial-gradient(at 52% 99%, color-mix(in oklab, #ce2d5b 13%, transparent) 0px, transparent 50%),
678
+ radial-gradient(at 10% 29%, color-mix(in oklab, #07cbed 10%, transparent) 0px, transparent 50%);
679
+
680
+ --background-mesh-02: radial-gradient(at 40% 20%, color-mix(in oklab, #999ea5 18%, transparent) 0px, transparent 50%),
681
+ radial-gradient(at 80% 0%, color-mix(in oklab, #07cbed 14%, transparent) 0px, transparent 50%),
682
+ radial-gradient(at 0% 50%, color-mix(in oklab, #ce2d5b 12%, transparent) 0px, transparent 50%),
683
+ radial-gradient(at 80% 100%, color-mix(in oklab, #999ea5 10%, transparent) 0px, transparent 50%);
684
+
685
+ --background-mesh-03: radial-gradient(at 15% 50%, color-mix(in oklab, #ce2d5b 15%, transparent) 0px, transparent 50%),
686
+ radial-gradient(at 85% 30%, color-mix(in oklab, #07cbed 17%, transparent) 0px, transparent 50%),
687
+ radial-gradient(at 50% 80%, color-mix(in oklab, #999ea5 13%, transparent) 0px, transparent 50%),
688
+ radial-gradient(at 90% 90%, color-mix(in oklab, #ce2d5b 11%, transparent) 0px, transparent 50%);
689
+
690
+ --background-mesh-04: radial-gradient(at 70% 15%, color-mix(in oklab, #07cbed 14%, transparent) 0px, transparent 50%),
691
+ radial-gradient(at 20% 80%, color-mix(in oklab, #999ea5 16%, transparent) 0px, transparent 50%),
692
+ radial-gradient(at 90% 60%, color-mix(in oklab, #ce2d5b 12%, transparent) 0px, transparent 50%),
693
+ radial-gradient(at 30% 40%, color-mix(in oklab, #07cbed 11%, transparent) 0px, transparent 50%);
694
+
695
+ --background-mesh-05: radial-gradient(at 50% 50%, color-mix(in oklab, #07cbed 17%, transparent) 0px, transparent 50%),
696
+ radial-gradient(at 10% 10%, color-mix(in oklab, #ce2d5b 14%, transparent) 0px, transparent 50%),
697
+ radial-gradient(at 90% 10%, color-mix(in oklab, #999ea5 13%, transparent) 0px, transparent 50%),
698
+ radial-gradient(at 50% 90%, color-mix(in oklab, #ce2d5b 10%, transparent) 0px, transparent 50%);
699
+ }
700
+
701
+ @layer primitives {
702
+ /* Base HTML reset */
703
+ *, *::before, *::after {
704
+ box-sizing: border-box;
705
+ }
706
+
707
+ :where(html) {
708
+ interpolate-size: allow-keywords;
709
+ font-family: var(--font-family-body);
710
+ font-size: var(--font-size-base);
711
+ line-height: var(--font-line-height-normal);
712
+ color: var(--color-text-primary);
713
+ background-color: var(--color-surface-base);
714
+ -webkit-text-size-adjust: 100%;
715
+ -webkit-font-smoothing: antialiased;
716
+ -moz-osx-font-smoothing: grayscale;
717
+ tab-size: 4;
718
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);
719
+ }
720
+
721
+ :where(dialog){
722
+ background-color: transparent;
723
+ min-width: 320px;
724
+ border: none;
725
+ }
726
+
727
+ :where(body) {
728
+ margin: 0;
729
+ padding: 0;
730
+ scroll-behavior: smooth;
731
+ min-height: 100vh;
732
+ min-height: var(--layout-min-height, 100vh);
733
+ overflow-x: hidden;
734
+ -webkit-overflow-scrolling: touch;
735
+ }
736
+
737
+ :where(body.drawer-open) {
738
+ /* overflow: hidden; */
739
+ /* scrollbar-gutter: stable; */
740
+ }
741
+
742
+ /* Button primitives */
743
+ :where(button) {
744
+ all: unset;
745
+ box-sizing: border-box;
746
+ font: inherit;
747
+ color: var(--color-primary-contrast, white);
748
+ background: var(--color-primary-600);
749
+ padding: var(--spacing-2) var(--spacing-4);
750
+ border: 0;
751
+ border-radius: var(--radius-md);
752
+ cursor: pointer;
753
+ transition: opacity var(--transition-fast), background-color var(--transition-fast);
754
+ display: inline-flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ gap: var(--spacing-2);
758
+ font-weight: var(--font-weight-medium);
759
+ line-height: 1.5;
760
+ min-height: 44px;
761
+ touch-action: manipulation;
762
+ user-select: none;
763
+ }
764
+
765
+ :where(button):hover:not(:disabled) {
766
+ opacity: 0.9;
767
+ background-color: var(--color-primary-700);
768
+ }
769
+
770
+ :where(button):focus-visible {
771
+ outline: 2px solid var(--color-primary-500);
772
+ outline-offset: 2px;
773
+ }
774
+
775
+ :where(button):disabled {
776
+ opacity: 0.5;
777
+ cursor: not-allowed;
778
+ }
779
+
780
+ :where(button):active:not(:disabled) {
781
+ transform: scale(0.98);
782
+ }
783
+
784
+ /* Input primitives */
785
+ :where(input:not([type="radio"]):not([type="checkbox"]):not([type="range"]):not([type="color"])),
786
+ :where(select),
787
+ :where(textarea) {
788
+ font: inherit;
789
+ color: var(--color-text-primary);
790
+ background: var(--color-input-bg);
791
+ border: 1px solid var(--color-border);
792
+ border-radius: var(--radius-md);
793
+ padding: var(--spacing-2) var(--spacing-3);
794
+ min-height: 40px;
795
+ width: 100%;
796
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
797
+ appearance: none;
798
+ }
799
+
800
+ :where(input):focus-visible,
801
+ :where(select):focus-visible,
802
+ :where(textarea):focus-visible {
803
+ outline: none;
804
+ border-color: var(--color-primary-500);
805
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary-500) 30%, transparent);
806
+ }
807
+
808
+ :where(input):disabled,
809
+ :where(select):disabled,
810
+ :where(textarea):disabled {
811
+ opacity: 0.6;
812
+ cursor: not-allowed;
813
+ background-color: var(--color-input-disabled-bg);
814
+ }
815
+
816
+ /* Harmonized placeholder styling */
817
+ :where(input)::placeholder,
818
+ :where(textarea)::placeholder,
819
+ :where(pds-richtext)::placeholder {
820
+ color: var(--color-text-muted);
821
+ opacity: 1;
822
+ font-weight: var(--font-weight-normal);
823
+ }
824
+
825
+ :where(textarea) {
826
+ min-height: 80px;
827
+ resize: vertical;
828
+ }
829
+
830
+ /* Link primitives */
831
+ :where(a) {
832
+ color: var(--color-primary-600);
833
+ text-decoration: underline;
834
+ text-underline-offset: 0.2em;
835
+ transition: opacity var(--transition-fast);
836
+ }
837
+
838
+ :where(a):hover {
839
+ opacity: 0.8;
840
+ }
841
+
842
+ :where(a):focus-visible {
843
+ outline: 2px solid var(--color-primary-500);
844
+ outline-offset: 2px;
845
+ border-radius: var(--radius-sm);
846
+ }
847
+
848
+ /* Form primitives */
849
+ :where(label) {
850
+ display: block;
851
+ font-weight: var(--font-weight-medium);
852
+ margin-bottom: var(--spacing-2);
853
+ color: var(--color-text-primary);
854
+ font-size: var(--font-size-sm);
855
+ }
856
+
857
+ /* Checkbox enhancement - visually hide native input but keep accessible
858
+ Excludes button-style checkboxes in fieldsets and special containers */
859
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]) input[type="checkbox"]) {
860
+ position: absolute;
861
+ opacity: 0;
862
+ width: 1px;
863
+ height: 1px;
864
+ }
865
+
866
+ /* Style label container for checkbox */
867
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"])) {
868
+ display: inline-flex;
869
+ align-items: center;
870
+ gap: var(--spacing-2);
871
+ cursor: pointer;
872
+ user-select: none;
873
+ position: relative;
874
+ padding-left: calc(var(--spacing-5) + var(--spacing-3));
875
+ }
876
+
877
+ /* Custom checkbox box using PDS tokens - works with or without span wrapper */
878
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"])::before) {
879
+ content: "";
880
+ position: absolute;
881
+ left: 0;
882
+ top: 50%;
883
+ transform: translateY(-50%);
884
+ width: var(--spacing-5);
885
+ height: var(--spacing-5);
886
+ border: var(--border-width-md) solid var(--color-border);
887
+ border-radius: var(--radius-sm);
888
+ background: var(--color-surface-base);
889
+ transition: all var(--transition-fast);
890
+ flex-shrink: 0;
891
+ }
892
+
893
+ /* Checkmark */
894
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]:checked)::after) {
895
+ content: "";
896
+ position: absolute;
897
+ left: var(--spacing-2);
898
+ top: 50%;
899
+ transform: translateY(-60%) rotate(45deg);
900
+ width: var(--spacing-1-5);
901
+ height: var(--spacing-3);
902
+ border: solid var(--color-primary-contrast, white);
903
+ border-width: 0 2px 2px 0;
904
+ }
905
+
906
+ /* Checked state */
907
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]:checked)::before) {
908
+ background: var(--color-primary-600);
909
+ border-color: var(--color-primary-600);
910
+ }
911
+
912
+ /* Focus styles for accessibility */
913
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]:focus)::before) {
914
+ outline: 2px solid var(--color-primary-500);
915
+ outline-offset: 2px;
916
+ }
917
+
918
+ /* Hover effects */
919
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]:not(:disabled)):hover::before) {
920
+ border-color: var(--color-primary-600);
921
+ background: var(--color-surface-subtle);
922
+ }
923
+
924
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]:checked:not(:disabled)):hover::before) {
925
+ background: var(--color-primary-700);
926
+ border-color: var(--color-primary-700);
927
+ }
928
+
929
+ /* Disabled state */
930
+ :where(label:not(fieldset label, .checkbox-container label, [data-toggle]):has(input[type="checkbox"]:disabled)) {
931
+ opacity: 0.5;
932
+ cursor: not-allowed;
933
+ }
934
+
935
+ :where(fieldset) {
936
+ border: none;
937
+ padding: var(--spacing-4);
938
+ margin: 0 0 var(--spacing-4) 0;
939
+ background-color: var(--color-surface-subtle);
940
+ }
941
+
942
+ :where(legend) {
943
+ display: block;
944
+ font-weight: var(--font-weight-semibold);
945
+ padding: 0;
946
+ color: var(--color-text-primary);
947
+ font-weight: var(--font-weight-semibold);
948
+ color: var(--color-text-primary);
949
+ margin: 0 0 var(--spacing-3) 0;
950
+ border: none;
951
+ line-height: var(--font-line-height-tight);
952
+ font-size: var(--font-size-lg);
953
+ background: transparent; /* avoid browser default notch behavior */
954
+ width: auto;
955
+ box-sizing: border-box;
956
+ }
957
+
958
+
959
+ /* List primitives */
960
+ :where(ul, ol) {
961
+ padding-left: var(--spacing-6);
962
+ margin: var(--spacing-3) 0;
963
+ }
964
+
965
+ :where(li) {
966
+ margin: var(--spacing-1) 0;
967
+ }
968
+
969
+ /* Typography primitives */
970
+ :where(h1, h2, h3, h4, h5, h6) {
971
+ font-family: var(--font-family-headings);
972
+ font-weight: var(--font-weight-bold);
973
+ line-height: var(--font-line-height-tight);
974
+ margin: var(--spacing-4) 0 var(--spacing-3) 0;
975
+ color: var(--color-text-primary);
976
+ word-wrap: break-word;
977
+ hyphens: auto;
978
+ overflow-wrap: break-word;
979
+ }
980
+
981
+ /* Mobile-first heading sizes */
982
+ :where(h1) { font-size: var(--font-size-2xl); }
983
+ :where(h2) { font-size: var(--font-size-xl); }
984
+ :where(h3) { font-size: var(--font-size-lg); }
985
+ :where(h4) { font-size: var(--font-size-base); }
986
+ :where(h5) { font-size: var(--font-size-sm); }
987
+ :where(h6) { font-size: var(--font-size-xs); }
988
+
989
+ /* Scale up on larger screens */
990
+ @media (min-width: 640px) {
991
+ :where(h1) { font-size: var(--font-size-3xl); }
992
+ :where(h2) { font-size: var(--font-size-2xl); }
993
+ :where(h3) { font-size: var(--font-size-xl); }
994
+ :where(h4) { font-size: var(--font-size-lg); }
995
+ :where(h5) { font-size: var(--font-size-base); }
996
+ :where(h6) { font-size: var(--font-size-sm); }
997
+ }
998
+
999
+ :where(p) {
1000
+ margin: var(--spacing-3) 0;
1001
+ line-height: var(--font-line-height-relaxed);
1002
+ color: var(--color-text-primary);
1003
+ }
1004
+
1005
+ /* Code primitives */
1006
+ :where(code) {
1007
+ font-family: var(--font-family-mono, monospace);
1008
+ font-size: 0.9em;
1009
+ background: var(--color-surface-muted);
1010
+ padding: 0.2em 0.4em;
1011
+ border-radius: var(--radius-sm);
1012
+ color: var(--color-text-primary);
1013
+ }
1014
+
1015
+ :where(pre) {
1016
+ font-family: var(--font-family-mono, monospace);
1017
+ background: var(--color-surface-muted);
1018
+ padding: var(--spacing-4);
1019
+ border-radius: var(--radius-md);
1020
+ overflow-x: auto;
1021
+ margin: var(--spacing-4) 0;
1022
+ }
1023
+
1024
+ :where(pre code) {
1025
+ background: none;
1026
+ padding: 0;
1027
+ }
1028
+
1029
+ /* Media primitives */
1030
+ :where(img, video) {
1031
+ max-width: 100%;
1032
+ height: auto;
1033
+ border-radius: var(--radius-sm);
1034
+ }
1035
+
1036
+ :where(figure) {
1037
+ margin: 0 0 var(--spacing-6) 0;
1038
+ }
1039
+
1040
+ :where(figcaption) {
1041
+ margin-top: var(--spacing-3);
1042
+ font-size: var(--font-size-sm);
1043
+ color: var(--color-text-secondary);
1044
+ line-height: var(--font-line-height-relaxed);
1045
+ }
1046
+
1047
+
1048
+ :where([hidden]) {
1049
+ display: none !important;
1050
+ }
1051
+ }
1052
+
1053
+
1054
+ @layer components {
1055
+
1056
+ /* Semantic HTML Elements (low-specificity via :where()) */
1057
+
1058
+ :where(blockquote) {
1059
+ margin: 0 0 var(--spacing-4) 0;
1060
+ padding: var(--spacing-4) var(--spacing-6);
1061
+ border-left: 4px solid var(--color-primary-500);
1062
+ background-color: var(--color-surface-subtle);
1063
+ border-radius: var(--radius-md);
1064
+ font-style: italic;
1065
+ color: var(--color-text-secondary);
1066
+
1067
+ :where(p):last-child {
1068
+ margin-bottom: 0;
1069
+ }
1070
+
1071
+ :where(cite) {
1072
+ display: block;
1073
+ margin-top: var(--spacing-2);
1074
+ font-size: var(--font-size-sm);
1075
+ font-style: normal;
1076
+ color: var(--color-text-tertiary);
1077
+
1078
+ &::before {
1079
+ content: "— ";
1080
+ }
1081
+ }
1082
+ }
1083
+
1084
+ :where(hr) {
1085
+ margin: var(--spacing-8) 0;
1086
+ border: none;
1087
+ border-top: 1px solid var(--color-border);
1088
+ height: 0;
1089
+ }
1090
+
1091
+ :where(dl) {
1092
+ margin: 0 0 var(--spacing-4) 0;
1093
+ }
1094
+
1095
+ :where(dt) {
1096
+ font-weight: var(--font-weight-semibold);
1097
+ color: var(--color-text-primary);
1098
+ margin-top: var(--spacing-3);
1099
+
1100
+ &:first-child {
1101
+ margin-top: 0;
1102
+ }
1103
+ }
1104
+
1105
+ :where(dd) {
1106
+ margin: var(--spacing-1) 0 var(--spacing-3) var(--spacing-6);
1107
+ color: var(--color-text-secondary);
1108
+ }
1109
+
1110
+ :where(nav), :where(header), :where(footer) {
1111
+ display: block;
1112
+ }
1113
+
1114
+ :where(header), :where(footer) {
1115
+ width: 100%;
1116
+ }
1117
+
1118
+ :where(article), :where(section), :where(aside) {
1119
+ display: block;
1120
+ margin-bottom: var(--spacing-6);
1121
+
1122
+ & > *:last-child {
1123
+ margin-bottom: 0;
1124
+ }
1125
+ }
1126
+
1127
+ :where(mark) {
1128
+ background-color: var(--color-warning-200);
1129
+ color: var(--color-warning-900);
1130
+ padding: 0 var(--spacing-1);
1131
+ border-radius: var(--radius-sm);
1132
+ }
1133
+
1134
+ :where(kbd) {
1135
+ display: inline-block;
1136
+ padding: var(--spacing-1) var(--spacing-2);
1137
+ font-family: var(--font-family-mono);
1138
+ font-size: var(--font-size-sm);
1139
+ color: var(--color-text-primary);
1140
+ background-color: var(--color-surface-elevated);
1141
+ border: 1px solid var(--color-border);
1142
+ border-radius: var(--radius-sm);
1143
+ box-shadow: 0 2px 0 0 var(--color-border);
1144
+ }
1145
+
1146
+ :where(abbr[title]) {
1147
+ text-decoration: underline dotted;
1148
+ cursor: help;
1149
+ text-decoration-thickness: 1px;
1150
+ }
1151
+
1152
+ :where(time) {
1153
+ font-variant-numeric: tabular-nums;
1154
+ }
1155
+
1156
+ :where(address) {
1157
+ font-style: normal;
1158
+ line-height: var(--font-line-height-relaxed);
1159
+ margin: 0 0 var(--spacing-4) 0;
1160
+ }
1161
+
1162
+ :where(details):not(.accordion *) {
1163
+ margin: 0 0 var(--spacing-2) 0;
1164
+ border: 1px solid var(--color-border);
1165
+ border-radius: var(--radius-md);
1166
+ background-color: var(--color-surface-base);
1167
+
1168
+ &[open] :where(summary) {
1169
+ border-bottom: 1px solid var(--color-border);
1170
+ background-color: var(--color-surface-subtle);
1171
+
1172
+ &::after {
1173
+ transform: rotate(270deg);
1174
+ }
1175
+ }
1176
+
1177
+ & > *:not(:where(summary)) {
1178
+ padding: var(--spacing-4);
1179
+ }
1180
+ }
1181
+
1182
+ :where(summary) {
1183
+ padding: var(--spacing-3) var(--spacing-4);
1184
+ cursor: pointer;
1185
+ border-radius: var(--radius-md);
1186
+ font-weight: var(--font-weight-medium);
1187
+ user-select: none;
1188
+ list-style: none;
1189
+ display: flex;
1190
+ align-items: center;
1191
+ justify-content: space-between;
1192
+ transition: background-color var(--transition-fast);
1193
+
1194
+ &::-webkit-details-marker {
1195
+ display: none;
1196
+ }
1197
+
1198
+ &::after {
1199
+ content: "›";
1200
+ display: inline-block;
1201
+ transform: rotate(90deg);
1202
+ transition: transform var(--transition-fast);
1203
+ font-size: var(--font-size-xl);
1204
+ font-weight: var(--font-weight-bold);
1205
+ color: var(--color-text-secondary);
1206
+ }
1207
+
1208
+ &:hover {
1209
+ background-color: var(--color-surface-subtle);
1210
+ }
1211
+ }
1212
+
1213
+ /* Dialog styles moved to #generateDialogStyles() */
1214
+
1215
+
1216
+
1217
+ /* Mobile-First Form Styles - Generated from Design Config */
1218
+ form {
1219
+ margin: 0;
1220
+ width: 100%;
1221
+ }
1222
+
1223
+ fieldset {
1224
+ margin: 0 0 var(--spacing-2) 0;
1225
+ padding: var(--spacing-5);
1226
+ width: 100%;
1227
+ background-color: color-mix(in oklab, var(--color-surface-subtle) 50%, transparent 50%);
1228
+
1229
+ /* Unified styling for radio groups and checkbox groups */
1230
+ &[role="radiogroup"],
1231
+ &[role="group"] {
1232
+ display: flex;
1233
+ flex-direction: column;
1234
+ gap: var(--spacing-2);
1235
+ padding: 0;
1236
+ background-color: transparent;
1237
+
1238
+ label {
1239
+ display: flex;
1240
+ align-items: center;
1241
+ gap: var(--spacing-3);
1242
+ padding: var(--spacing-1) 0;
1243
+ cursor: pointer;
1244
+ min-height: auto;
1245
+ border: none;
1246
+ background: none;
1247
+ font-weight: var(--font-weight-normal);
1248
+ margin-bottom: 0;
1249
+
1250
+ &:hover {
1251
+ color: var(--color-primary-700);
1252
+ }
1253
+ }
1254
+
1255
+ input[type="radio"],
1256
+ input[type="checkbox"] {
1257
+ position: static;
1258
+ opacity: 1;
1259
+ width: var(--spacing-5);
1260
+ height: var(--spacing-5);
1261
+ min-height: var(--spacing-5);
1262
+ margin: 0;
1263
+ cursor: pointer;
1264
+ flex-shrink: 0;
1265
+ accent-color: var(--color-primary-600);
1266
+ appearance: auto;
1267
+ -webkit-appearance: auto;
1268
+ -moz-appearance: auto;
1269
+
1270
+ &:focus {
1271
+ outline: 2px solid var(--color-primary-500);
1272
+ outline-offset: 2px;
1273
+ }
1274
+ }
1275
+ }
1276
+
1277
+ }
1278
+
1279
+
1280
+
1281
+ /* Nested legend scaling: reduce font-size for deeper sub-forms */
1282
+ fieldset > legend { font-size: var(--font-size-lg); }
1283
+ fieldset fieldset > legend { font-size: var(--font-size-base); }
1284
+ fieldset fieldset fieldset > legend { font-size: var(--font-size-sm); }
1285
+
1286
+ .form-container {
1287
+ display: grid;
1288
+ gap: var(--spacing-6);
1289
+ width: 100%;
1290
+ }
1291
+
1292
+ .fields {
1293
+ display: grid;
1294
+ gap: var(--spacing-4);
1295
+ }
1296
+
1297
+ label {
1298
+ display: block;
1299
+ margin-bottom: var(--spacing-3);
1300
+ font-weight: var(--font-weight-medium);
1301
+ color: var(--color-text-primary);
1302
+ font-size: var(--font-size-sm);
1303
+ line-height: var(--font-line-height-normal);
1304
+ }
1305
+
1306
+ [data-label] {
1307
+ display: block;
1308
+ font-weight: var(--font-weight-medium);
1309
+ color: var(--color-text-primary);
1310
+ font-size: var(--font-size-sm);
1311
+ margin-bottom: var(--spacing-2);
1312
+ }
1313
+
1314
+ [data-open]{
1315
+ [data-label]{
1316
+ margin-bottom: 0;
1317
+ }
1318
+ }
1319
+
1320
+ .field-description {
1321
+ font-size: var(--font-size-xs);
1322
+ color: var(--color-text-secondary);
1323
+ margin-top: var(--spacing-1);
1324
+ line-height: var(--font-line-height-relaxed);
1325
+ }
1326
+
1327
+ input, textarea, select {
1328
+ width: 100%;
1329
+ min-height: 40px;
1330
+ padding: calc(var(--spacing-1) * 0.75) var(--spacing-4);
1331
+ border: 1px solid var(--color-border);
1332
+ border-radius: var(--radius-md);
1333
+ font-family: var(--font-family-body);
1334
+ font-size: var(--font-size-base);
1335
+ line-height: var(--font-line-height-normal);
1336
+ background-color: var(--color-input-bg);
1337
+ color: var(--color-text-primary);
1338
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background-color var(--transition-fast);
1339
+ touch-action: manipulation;
1340
+ appearance: none;
1341
+ -webkit-appearance: none;
1342
+
1343
+ &:focus {
1344
+ outline: none;
1345
+ border-color: var(--color-primary-500);
1346
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-primary-500) 30%, transparent);
1347
+ background-color: var(--color-surface-base);
1348
+ }
1349
+
1350
+ &:disabled {
1351
+ background-color: var(--color-input-disabled-bg);
1352
+ color: var(--color-input-disabled-text);
1353
+ border-color: var(--color-border);
1354
+ cursor: not-allowed;
1355
+ opacity: 0.6;
1356
+ }
1357
+
1358
+ &:invalid {
1359
+ border-color: var(--color-danger-500);
1360
+
1361
+ &:focus {
1362
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-danger-500) 30%, transparent);
1363
+ }
1364
+ }
1365
+ }
1366
+
1367
+ input[type="range"] {
1368
+ padding: 0;
1369
+ background: transparent;
1370
+ min-height: auto;
1371
+ }
1372
+
1373
+ /* Make range visually match other inputs */
1374
+ input[type="range"] {
1375
+ -webkit-appearance: none;
1376
+ appearance: none;
1377
+ height: var(--input-min-height, 40px); /* align control height with inputs */
1378
+ width: 100%;
1379
+ }
1380
+
1381
+ /* Track and thumb styling - using CSS nesting to reduce repetition */
1382
+ input[type="range"] {
1383
+ /* WebKit track */
1384
+ &::-webkit-slider-runnable-track {
1385
+ height: var(--range-track-height, 8px);
1386
+ background: var(--color-input-bg);
1387
+ border-radius: var(--radius-full);
1388
+ }
1389
+
1390
+ /* WebKit thumb */
1391
+ &::-webkit-slider-thumb {
1392
+ -webkit-appearance: none;
1393
+ appearance: none;
1394
+ width: var(--range-thumb-size, 28px);
1395
+ height: var(--range-thumb-size, 28px);
1396
+ margin-top: calc((var(--range-track-height, 8px) - var(--range-thumb-size, 28px)) / 2);
1397
+ background: color-mix(in srgb, var(--color-primary-500) 15%, var(--color-surface-base));
1398
+ border-radius: 50%;
1399
+ box-shadow: var(--shadow-sm);
1400
+ cursor: grab;
1401
+ border: 1px solid color-mix(in srgb, var(--color-primary-500) 30%, var(--color-border));
1402
+ }
1403
+
1404
+ /* Mozilla track */
1405
+ &::-moz-range-track {
1406
+ height: var(--range-track-height, 8px);
1407
+ background: var(--color-input-bg);
1408
+ border-radius: var(--radius-full);
1409
+ }
1410
+
1411
+ /* Mozilla thumb */
1412
+ &::-moz-range-thumb {
1413
+ width: var(--range-thumb-size, 28px);
1414
+ height: var(--range-thumb-size, 28px);
1415
+ background: color-mix(in srgb, var(--color-primary-500) 15%, var(--color-surface-base));
1416
+ border-radius: 50%;
1417
+ box-shadow: var(--shadow-sm);
1418
+ border: 1px solid color-mix(in srgb, var(--color-primary-500) 30%, var(--color-border));
1419
+ transform: translateY(calc((var(--range-track-height, 8px) - var(--range-thumb-size, 28px)) / 2));
1420
+ }
1421
+
1422
+ /* Hover and focus states for WebKit */
1423
+ &:hover::-webkit-slider-thumb,
1424
+ &:focus-visible::-webkit-slider-thumb {
1425
+ cursor: grabbing;
1426
+ background: var(--color-primary-500);
1427
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
1428
+ border-color: var(--color-primary-600);
1429
+ }
1430
+
1431
+ /* Active state for WebKit */
1432
+ &:active::-webkit-slider-thumb {
1433
+ background: var(--color-primary-600);
1434
+ }
1435
+
1436
+ /* Hover and focus states for Mozilla */
1437
+ &:hover::-moz-range-thumb,
1438
+ &:focus-visible::-moz-range-thumb {
1439
+ background: var(--color-primary-500);
1440
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
1441
+ border-color: var(--color-primary-600);
1442
+ cursor: grabbing;
1443
+ }
1444
+
1445
+ /* Active state for Mozilla */
1446
+ &:active::-moz-range-thumb {
1447
+ background: var(--color-primary-600);
1448
+ }
1449
+ }
1450
+
1451
+ /* Focus style for container to match input focus */
1452
+ .range-container:focus-within {
1453
+ border-color: var(--color-primary-500);
1454
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary-500) 30%, transparent);
1455
+ }
1456
+
1457
+ input[type="range"]:active::-moz-range-thumb {
1458
+ background: var(--color-primary-600);
1459
+ }
1460
+
1461
+ input[type="color"] {
1462
+ -webkit-appearance: none;
1463
+ padding: 0;
1464
+ width: 3rem;
1465
+ height: 3rem;
1466
+ border-radius: 0.75rem; /* your radius */
1467
+ overflow: hidden; /* important */
1468
+ cursor: pointer;
1469
+
1470
+ /* The wrapper */
1471
+ &::-webkit-color-swatch-wrapper {
1472
+ padding: 0;
1473
+ border-radius: inherit;
1474
+ }
1475
+
1476
+ /* The swatch (the actual color box) */
1477
+ &::-webkit-color-swatch {
1478
+ border: none;
1479
+ border-radius: inherit;
1480
+ }
1481
+ }
1482
+
1483
+ /* Button-style checkbox inputs outside of fieldsets */
1484
+ .checkbox-container input[type="checkbox"] {
1485
+ appearance: none;
1486
+ -webkit-appearance: none;
1487
+ -moz-appearance: none;
1488
+ position: absolute;
1489
+ opacity: 0;
1490
+ width: 0;
1491
+ height: 0;
1492
+ margin: 0;
1493
+ padding: 0;
1494
+ pointer-events: none;
1495
+ }
1496
+
1497
+ label:has(input[type="checkbox"]):not(fieldset label):not(label[data-toggle]),
1498
+ input[type="checkbox"] + label:not(fieldset label):not(label[data-toggle]) {
1499
+ display: inline-flex;
1500
+ align-items: center;
1501
+ justify-content: center;
1502
+ min-height: calc(44px * 0.75);
1503
+ padding: calc(var(--spacing-1) * 0.6) calc(var(--spacing-4) * 0.85);
1504
+ border: 1px solid var(--color-border);
1505
+ border-radius: var(--radius-md);
1506
+ font-family: var(--font-family-body);
1507
+ font-size: var(--font-size-sm);
1508
+ font-weight: var(--font-weight-medium);
1509
+ line-height: 1.2;
1510
+ cursor: pointer;
1511
+ transition: all var(--transition-fast);
1512
+ text-decoration: none;
1513
+ touch-action: manipulation;
1514
+ user-select: none;
1515
+ background-color: transparent;
1516
+ color: var(--color-text-primary);
1517
+ margin: 0;
1518
+ flex: 0 1 auto;
1519
+ white-space: nowrap;
1520
+
1521
+ &:hover {
1522
+ background-color: var(--color-surface-subtle);
1523
+ border-color: var(--color-primary-500);
1524
+ }
1525
+ }
1526
+
1527
+ label:has(input[type="checkbox"]:checked):not(fieldset label):not(label[data-toggle]),
1528
+ input[type="checkbox"]:checked + label:not(fieldset label):not(label[data-toggle]) {
1529
+ background-color: color-mix(in oklab, var(--color-primary-500) 8%, transparent);
1530
+ color: var(--color-primary-700);
1531
+ border-color: var(--color-primary-500);
1532
+ border-width: 2px;
1533
+ font-weight: var(--font-weight-semibold);
1534
+
1535
+ &:hover {
1536
+ background-color: color-mix(in oklab, var(--color-primary-500) 15%, transparent);
1537
+ border-color: var(--color-primary-600);
1538
+ }
1539
+ }
1540
+
1541
+ label:has(input[type="checkbox"]:focus):not(fieldset label):not(label[data-toggle]),
1542
+ input[type="checkbox"]:focus + label:not(fieldset label):not(label[data-toggle]) {
1543
+ outline: none;
1544
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-primary-500) 30%, transparent);
1545
+ }
1546
+
1547
+ label:has(input[type="checkbox"]:disabled):not(fieldset label):not(label[data-toggle]),
1548
+ input[type="checkbox"]:disabled + label:not(fieldset label):not(label[data-toggle]) {
1549
+ background-color: var(--color-input-disabled-bg);
1550
+ color: var(--color-input-disabled-text);
1551
+ border-color: var(--color-border);
1552
+ cursor: not-allowed;
1553
+ opacity: 0.6;
1554
+ }
1555
+
1556
+ label:has(input[type="checkbox"]:checked:disabled):not(fieldset label):not(label[data-toggle]),
1557
+ input[type="checkbox"]:checked:disabled + label:not(fieldset label):not(label[data-toggle]) {
1558
+ background-color: var(--color-input-disabled-bg);
1559
+ color: var(--color-input-disabled-text);
1560
+ border-color: var(--color-border);
1561
+ }
1562
+
1563
+ /* Keep default checkbox/radio for inputs NOT in special containers */
1564
+ input[type="checkbox"]:not(fieldset input[type="checkbox"]):not(.checkbox-container input[type="checkbox"]),
1565
+ input[type="radio"]:not(fieldset input[type="radio"]) {
1566
+ width: var(--spacing-5);
1567
+ height: var(--spacing-5);
1568
+ min-height: var(--spacing-5);
1569
+ margin-right: var(--spacing-2);
1570
+ cursor: pointer;
1571
+ position: static;
1572
+ opacity: 1;
1573
+ appearance: auto;
1574
+ -webkit-appearance: auto;
1575
+
1576
+ &:disabled {
1577
+ cursor: not-allowed;
1578
+ }
1579
+ }
1580
+
1581
+ /* Button-style radio and checkbox groups with .buttons class */
1582
+ fieldset[role="radiogroup"].buttons,
1583
+ fieldset[role="group"].buttons {
1584
+ flex-direction: row;
1585
+ flex-wrap: wrap;
1586
+ gap: var(--spacing-3);
1587
+
1588
+ input[type="radio"],
1589
+ input[type="checkbox"] {
1590
+ appearance: none;
1591
+ -webkit-appearance: none;
1592
+ -moz-appearance: none;
1593
+ position: absolute;
1594
+ opacity: 0;
1595
+ width: 0;
1596
+ height: 0;
1597
+ margin: 0;
1598
+ padding: 0;
1599
+ pointer-events: none;
1600
+ }
1601
+
1602
+ label {
1603
+ display: inline-flex;
1604
+ align-items: center;
1605
+ justify-content: center;
1606
+ min-height: calc(44px * 0.75);
1607
+ padding: calc(var(--spacing-1) * 0.6) calc(var(--spacing-4) * 0.85);
1608
+ border: 1px solid var(--color-border);
1609
+ border-radius: var(--radius-md);
1610
+ font-family: var(--font-family-body);
1611
+ font-size: var(--font-size-sm);
1612
+ font-weight: var(--font-weight-medium);
1613
+ line-height: 1.2;
1614
+ cursor: pointer;
1615
+ transition: all var(--transition-fast);
1616
+ text-decoration: none;
1617
+ touch-action: manipulation;
1618
+ user-select: none;
1619
+ background-color: transparent;
1620
+ color: var(--color-text-primary);
1621
+ margin: 0;
1622
+ flex: 0 1 auto;
1623
+ white-space: nowrap;
1624
+
1625
+ &:hover {
1626
+ background-color: var(--color-surface-subtle);
1627
+ border-color: var(--color-primary-500);
1628
+ color: var(--color-text-primary);
1629
+ }
1630
+
1631
+ &:has([disabled]){
1632
+ pointer-events: none;
1633
+ }
1634
+ }
1635
+
1636
+ label:has(input[type="radio"]:checked),
1637
+ label:has(input[type="checkbox"]:checked) {
1638
+ background-color: color-mix(in oklab, var(--color-primary-500) 8%, transparent);
1639
+ border-color: var(--color-primary-500);
1640
+ border-width: 2px;
1641
+ font-weight: var(--font-weight-semibold);
1642
+
1643
+ &:hover {
1644
+ background-color: color-mix(in oklab, var(--color-primary-500) 15%, transparent);
1645
+ border-color: var(--color-primary-600);
1646
+ }
1647
+ }
1648
+
1649
+ label:has(input[type="radio"]:focus),
1650
+ label:has(input[type="checkbox"]:focus) {
1651
+ outline: none;
1652
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-primary-500) 30%, transparent);
1653
+ }
1654
+
1655
+ label:has(input[type="radio"]:disabled),
1656
+ label:has(input[type="checkbox"]:disabled) {
1657
+ background-color: var(--color-input-disabled-bg);
1658
+ color: var(--color-input-disabled-text);
1659
+ border-color: var(--color-border);
1660
+ cursor: not-allowed;
1661
+ opacity: 0.6;
1662
+ }
1663
+
1664
+ label:has(input[type="radio"]:checked:disabled),
1665
+ label:has(input[type="checkbox"]:checked:disabled) {
1666
+ background-color: var(--color-input-disabled-bg);
1667
+ color: var(--color-input-disabled-text);
1668
+ border-color: var(--color-border);
1669
+ }
1670
+ }
1671
+
1672
+ /* Toggle switches - enhanced checkboxes with data-toggle attribute */
1673
+ label[data-toggle] {
1674
+ display: inline-flex;
1675
+ align-items: normal;
1676
+ gap: var(--spacing-3);
1677
+ cursor: pointer;
1678
+ user-select: none;
1679
+ padding: 0;
1680
+ background: transparent;
1681
+ border: none;
1682
+ min-height: auto;
1683
+ font-weight: var(--font-weight-normal);
1684
+
1685
+ /* Hide the original checkbox in toggle switches */
1686
+ input[type="checkbox"] {
1687
+ display: none;
1688
+ }
1689
+
1690
+ /* Toggle switch container */
1691
+ .toggle-switch {
1692
+ position: relative;
1693
+ display: inline-block;
1694
+ width: 44px;
1695
+ height: 24px;
1696
+ background-color: var(--color-gray-300);
1697
+ border-radius: var(--radius-full);
1698
+ transition: background-color 200ms ease;
1699
+ cursor: pointer;
1700
+ flex-shrink: 0;
1701
+ }
1702
+
1703
+ /* Toggle switch knob */
1704
+ .toggle-knob {
1705
+ position: absolute;
1706
+ top: 2px;
1707
+ left: 2px;
1708
+ width: 20px;
1709
+ height: 20px;
1710
+ background-color: #ffffff;
1711
+ border-radius: 50%;
1712
+ transition: left 200ms ease;
1713
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
1714
+ }
1715
+
1716
+ /* Toggle switch when checked - using :has() selector */
1717
+ &:has(input[type="checkbox"]:checked) .toggle-switch {
1718
+ background-color: var(--color-primary-fill);
1719
+ }
1720
+
1721
+
1722
+ /* Toggle knob when checked - always moves to the right */
1723
+ &:has(input[type="checkbox"]:checked) .toggle-knob {
1724
+ left: 22px;
1725
+ }
1726
+
1727
+ /* Focus state for toggle switch */
1728
+ &:has(input[type="checkbox"]:focus) .toggle-switch {
1729
+ outline: 2px solid var(--color-primary-500);
1730
+ outline-offset: 2px;
1731
+ }
1732
+
1733
+ /* Focus visible state when label is focused via keyboard */
1734
+ &:focus-visible .toggle-switch {
1735
+ outline: 2px solid var(--color-primary-500);
1736
+ outline-offset: 2px;
1737
+ }
1738
+
1739
+ /* Remove default outline on label itself */
1740
+ &:focus {
1741
+ outline: none;
1742
+ }
1743
+
1744
+ /* Disabled state */
1745
+ &:has(input[type="checkbox"]:disabled) {
1746
+ cursor: not-allowed;
1747
+ opacity: 0.6;
1748
+
1749
+ .toggle-switch {
1750
+ opacity: 0.5;
1751
+ cursor: not-allowed;
1752
+ }
1753
+ }
1754
+ }
1755
+
1756
+ input[type="file"] {
1757
+ padding: var(--spacing-2) var(--spacing-4);
1758
+ cursor: pointer;
1759
+ }
1760
+
1761
+ /* Textareas */
1762
+ textarea {
1763
+ min-height: calc(var(--spacing-4) * 5);
1764
+ padding: var(--spacing-3) var(--spacing-4);
1765
+ resize: vertical;
1766
+ line-height: var(--font-line-height-relaxed);
1767
+ }
1768
+
1769
+ /* Select dropdowns */
1770
+ select {
1771
+ cursor: pointer;
1772
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
1773
+ background-position: right var(--spacing-2) center;
1774
+ background-repeat: no-repeat;
1775
+ background-size: 1.5em 1.5em;
1776
+ padding-right: var(--spacing-8);
1777
+ }
1778
+
1779
+ /* Button styling */
1780
+ button, .btn, input[type="submit"], input[type="button"], input[type="reset"] {
1781
+ display: inline-flex;
1782
+ gap: var(--spacing-1);
1783
+ align-items: center;
1784
+ justify-content: center;
1785
+ min-height: 44px;
1786
+ padding: calc(var(--spacing-1) * 1) var(--spacing-6);
1787
+ border: 1px solid transparent;
1788
+ border-radius: var(--radius-md);
1789
+ font-family: var(--font-family-body);
1790
+ font-size: var(--font-size-base);
1791
+ font-weight: var(--font-weight-medium);
1792
+ line-height: 1;
1793
+ cursor: pointer;
1794
+ transition: all var(--transition-fast);
1795
+ text-decoration: none;
1796
+ touch-action: manipulation;
1797
+ user-select: none;
1798
+ background-color: var(--color-surface-base);
1799
+ color: var(--color-text-primary);
1800
+ border-color: var(--color-border);
1801
+
1802
+ /* Only apply generic hover to non-variant buttons */
1803
+ &:hover:not(.btn-primary):not(.btn-secondary):not(.btn-outline) {
1804
+ background-color: var(--color-surface-elevated);
1805
+ }
1806
+
1807
+ &:focus {
1808
+ outline: none;
1809
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-primary-500) 30%, transparent);
1810
+ }
1811
+
1812
+ &:disabled {
1813
+ background-color: var(--color-input-disabled-bg);
1814
+ color: var(--color-input-disabled-text);
1815
+ border-color: var(--color-input-disabled-bg);
1816
+ cursor: not-allowed;
1817
+ opacity: 0.6;
1818
+ }
1819
+ }
1820
+
1821
+ .btn-primary {
1822
+ background-color: var(--color-primary-fill);
1823
+ color: white;
1824
+ border-color: var(--color-primary-fill);
1825
+
1826
+ &:hover {
1827
+ background-color: color-mix(in oklab, var(--color-primary-fill) 90%, black 10%);
1828
+ border-color: color-mix(in oklab, var(--color-primary-fill) 90%, black 10%);
1829
+ color: white;
1830
+ }
1831
+
1832
+ &:active {
1833
+ background-color: color-mix(in oklab, var(--color-primary-fill) 80%, black 20%);
1834
+ border-color: color-mix(in oklab, var(--color-primary-fill) 80%, black 20%);
1835
+ color: white;
1836
+ }
1837
+
1838
+ &:focus {
1839
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-primary-500) 30%, transparent);
1840
+ }
1841
+
1842
+ &:disabled {
1843
+ background-color: var(--color-input-disabled-bg);
1844
+ color: var(--color-input-disabled-text);
1845
+ border-color: var(--color-input-disabled-bg);
1846
+ }
1847
+ }
1848
+
1849
+ .btn-secondary {
1850
+ background-color: var(--color-surface-base);
1851
+ color: var(--color-text-primary);
1852
+ border-color: var(--color-border);
1853
+
1854
+ &:hover {
1855
+ background-color: var(--color-surface-elevated);
1856
+ }
1857
+ }
1858
+
1859
+ .btn-outline {
1860
+ background-color: transparent;
1861
+ color: var(--color-primary-500);
1862
+ border-color: var(--color-primary-500);
1863
+
1864
+ &:hover {
1865
+ background-color: var(--color-primary-500);
1866
+ color: var(--color-primary-contrast, #ffffff);
1867
+ border-color: var(--color-primary-500);
1868
+
1869
+ pds-icon {
1870
+ color: var(--color-primary-contrast, #ffffff);
1871
+ }
1872
+ }
1873
+
1874
+ &:active {
1875
+ background-color: color-mix(in oklab, var(--color-primary-500) 80%, black 20%);
1876
+ border-color: color-mix(in oklab, var(--color-primary-500) 80%, black 20%);
1877
+ color: var(--color-primary-contrast, #ffffff);
1878
+
1879
+ pds-icon {
1880
+ color: var(--color-primary-contrast, #ffffff);
1881
+ }
1882
+ }
1883
+
1884
+ &:disabled {
1885
+ background-color: transparent;
1886
+ color: var(--color-input-disabled-text);
1887
+ border-color: var(--color-input-disabled-bg);
1888
+ }
1889
+ }
1890
+
1891
+ .btn-sm {
1892
+ padding: var(--spacing-2) var(--spacing-4);
1893
+ font-size: var(--font-size-sm);
1894
+ min-height: calc(44px * 0.8);
1895
+ }
1896
+
1897
+ .btn-xs {
1898
+ padding: var(--spacing-1) var(--spacing-2);
1899
+ font-size: var(--font-size-xs);
1900
+ min-height: calc(44px * 0.6);
1901
+ }
1902
+
1903
+
1904
+ .btn-lg {
1905
+ padding: var(--spacing-4) var(--spacing-8);
1906
+ font-size: var(--font-size-lg);
1907
+ min-height: calc(44px * 1.2);
1908
+ }
1909
+
1910
+ /* Working/loading state for buttons */
1911
+ button.btn-working,
1912
+ a.btn-working {
1913
+ cursor: wait;
1914
+ pointer-events: none;
1915
+ opacity: 0.6;
1916
+
1917
+ pds-icon:first-child {
1918
+ animation: pds-spin 0.8s linear infinite;
1919
+ }
1920
+ }
1921
+
1922
+ @keyframes pds-spin {
1923
+ to { transform: rotate(360deg); }
1924
+ }
1925
+
1926
+ /* Skeleton loading animation */
1927
+ .skeleton {
1928
+ background: linear-gradient(
1929
+ 90deg,
1930
+ color-mix(in oklab, var(--color-surface-base) 92%, var(--color-text-primary) 8%) 0%,
1931
+ color-mix(in oklab, var(--color-surface-base) 85%, var(--color-text-primary) 15%) 50%,
1932
+ color-mix(in oklab, var(--color-surface-base) 92%, var(--color-text-primary) 8%) 100%
1933
+ );
1934
+ background-size: 200% 100%;
1935
+ animation: pds-skeleton 1.5s ease-in-out infinite;
1936
+ border-radius: var(--radius-sm);
1937
+
1938
+ &::before {
1939
+ content: '\00a0';
1940
+ }
1941
+ }
1942
+
1943
+ @keyframes pds-skeleton {
1944
+ 0% { background-position: 200% 0; }
1945
+ 100% { background-position: -200% 0; }
1946
+ }
1947
+
1948
+ /* Form utility classes */
1949
+ .range-container {
1950
+ display: flex;
1951
+ align-items: center;
1952
+ gap: var(--spacing-3);
1953
+ width: 100%;
1954
+ background: var(--color-input-bg);
1955
+ border: 1px solid var(--color-border);
1956
+ border-radius: var(--radius-md);
1957
+ min-height: var(--input-min-height, 40px);
1958
+ position: relative;
1959
+
1960
+ input[type="range"] {
1961
+ border: none;
1962
+ }
1963
+ }
1964
+
1965
+ .range-bubble {
1966
+ position: absolute;
1967
+ top: calc(-1 * (var(--range-thumb-size, 28px) + var(--spacing-2)));
1968
+ transform: translateX(-50%);
1969
+ min-width: calc(var(--range-thumb-size, 28px) * 0.8);
1970
+ padding: var(--spacing-1) var(--spacing-2);
1971
+ border-radius: var(--radius-md);
1972
+ background: var(--color-surface-base);
1973
+ color: var(--color-text-primary);
1974
+ text-align: center;
1975
+ font-size: var(--font-size-sm);
1976
+ box-shadow: var(--shadow-md);
1977
+ opacity: 0;
1978
+ pointer-events: none;
1979
+ transition: opacity 150ms ease, transform 150ms ease;
1980
+
1981
+ &.visible {
1982
+ opacity: 1;
1983
+ }
1984
+ }
1985
+
1986
+ /* Anchor bubble to the thumb position using left (set by enhancer)
1987
+ and center with translateX(-50%). */
1988
+
1989
+ /* Array field styling */
1990
+ .array-list {
1991
+ display: flex;
1992
+ flex-direction: column;
1993
+ gap: var(--spacing-4);
1994
+ margin-bottom: var(--spacing-4);
1995
+ }
1996
+
1997
+ .array-item {
1998
+ position: relative;
1999
+ padding: var(--spacing-4);
2000
+ border: 1px solid var(--color-border);
2001
+ border-radius: var(--radius-md);
2002
+ background-color: var(--color-surface-base);
2003
+
2004
+ fieldset {
2005
+ background-color: transparent;
2006
+ margin-bottom: var(--spacing-3);
2007
+
2008
+ &:last-of-type {
2009
+ margin-bottom: 0;
2010
+ }
2011
+ }
2012
+
2013
+ .array-controls {
2014
+ padding-top: var(--spacing-3);
2015
+ border-top: 1px solid var(--color-border);
2016
+ margin-top: var(--spacing-4);
2017
+ }
2018
+ }
2019
+
2020
+ .array-controls {
2021
+ display: flex;
2022
+ gap: var(--spacing-2);
2023
+ margin-top: var(--spacing-3);
2024
+ flex-wrap: wrap;
2025
+
2026
+ button {
2027
+ padding: var(--spacing-2) var(--spacing-3);
2028
+ font-size: var(--font-size-sm);
2029
+ min-height: auto;
2030
+ }
2031
+ }
2032
+
2033
+ .range-value {
2034
+ min-width: var(--spacing-16);
2035
+ text-align: right;
2036
+ font-weight: var(--font-weight-medium);
2037
+ font-size: var(--font-size-sm);
2038
+ color: var(--color-text-primary);
2039
+ }
2040
+
2041
+ .checkbox-container {
2042
+ display: flex;
2043
+ flex-direction: row;
2044
+ align-items: center;
2045
+ gap: var(--spacing-2);
2046
+ flex-wrap: wrap;
2047
+
2048
+ input[type="checkbox"],
2049
+ input[type="radio"] {
2050
+ position: absolute;
2051
+ opacity: 0;
2052
+ }
2053
+ }
2054
+
2055
+
2056
+
2057
+ /* Alert/Notification Styles */
2058
+
2059
+ /* Alias: .semantic-message shares alert base styles */
2060
+ .alert, .semantic-message {
2061
+ padding: var(--spacing-4);
2062
+ border-radius: var(--radius-md);
2063
+ margin: 0 0 var(--spacing-4) 0;
2064
+ border-left: 4px solid;
2065
+ display: flex;
2066
+ align-items: flex-start;
2067
+ gap: var(--spacing-3);
2068
+ font-size: var(--font-size-sm);
2069
+ line-height: var(--font-line-height-relaxed);
2070
+
2071
+ & > *:last-child {
2072
+ margin-bottom: 0;
2073
+ }
2074
+ }
2075
+ /* Variants: success/info/warning/danger mapped to tokens */
2076
+ .alert-success, .semantic-message.success {
2077
+ background-color: var(--color-success-50);
2078
+ border-color: var(--color-success-600);
2079
+ color: var(--color-success-900);
2080
+ }
2081
+ .alert-info, .semantic-message.info {
2082
+ background-color: var(--color-info-50);
2083
+ border-color: var(--color-info-600);
2084
+ color: var(--color-info-900);
2085
+ }
2086
+ .alert-warning, .semantic-message.warning {
2087
+ background-color: var(--color-warning-50);
2088
+ border-color: var(--color-warning-600);
2089
+ color: var(--color-warning-900);
2090
+ }
2091
+ .alert-danger,
2092
+ .alert-error,
2093
+ .semantic-message.danger {
2094
+ background-color: var(--color-danger-50);
2095
+ border-color: var(--color-danger-600);
2096
+ color: var(--color-danger-900);
2097
+ }
2098
+
2099
+ /* Semantic-message content defaults */
2100
+ .semantic-message strong { display: block; }
2101
+ .semantic-message p { margin: 0; font-size: var(--font-size-sm); }
2102
+
2103
+ .alert-title {
2104
+ font-weight: var(--font-weight-semibold);
2105
+ margin: 0 0 var(--spacing-2) 0;
2106
+ font-size: var(--font-size-base);
2107
+ }
2108
+
2109
+ .alert-icon {
2110
+ flex-shrink: 0;
2111
+ display: flex;
2112
+ align-items: center;
2113
+ justify-content: center;
2114
+
2115
+ pds-icon {
2116
+ flex-shrink: 0;
2117
+ }
2118
+ }
2119
+
2120
+ .alert-dismissible {
2121
+ padding-right: var(--spacing-12);
2122
+ position: relative;
2123
+ }
2124
+
2125
+ .alert-close {
2126
+ position: absolute;
2127
+ top: var(--spacing-3);
2128
+ right: var(--spacing-3);
2129
+ background: none;
2130
+ border: none;
2131
+ font-size: var(--font-size-xl);
2132
+ line-height: 1;
2133
+ opacity: 0.6;
2134
+ cursor: pointer;
2135
+ padding: var(--spacing-1);
2136
+ transition: opacity var(--transition-fast);
2137
+
2138
+ &:hover {
2139
+ opacity: 1;
2140
+ }
2141
+ }
2142
+
2143
+
2144
+
2145
+ /* Badge/Pill Styles */
2146
+
2147
+ .badge {
2148
+ display: inline-flex;
2149
+ align-items: center;
2150
+ justify-content: center;
2151
+ padding: var(--spacing-1) var(--spacing-2);
2152
+ font-size: var(--font-size-xs);
2153
+ font-weight: var(--font-weight-semibold);
2154
+ line-height: 1;
2155
+ border-radius: var(--radius-full);
2156
+ white-space: nowrap;
2157
+ vertical-align: middle;
2158
+ background-color: var(--color-gray-200);
2159
+ color: var(--color-gray-800);
2160
+ border-radius: var(--radius-full);
2161
+ }
2162
+
2163
+ .badge-primary {
2164
+ background-color: var(--color-primary-600);
2165
+ color: white;
2166
+ }
2167
+
2168
+ .badge-secondary {
2169
+ background-color: var(--color-secondary-600);
2170
+ color: white;
2171
+ }
2172
+
2173
+ .badge-success {
2174
+ background-color: var(--color-success-600);
2175
+ color: white;
2176
+ }
2177
+
2178
+ .badge-info {
2179
+ background-color: var(--color-info-600);
2180
+ color: white;
2181
+ }
2182
+
2183
+ .badge-warning {
2184
+ background-color: var(--color-warning-600);
2185
+ color: white;
2186
+ }
2187
+
2188
+ .badge-danger {
2189
+ background-color: var(--color-danger-600);
2190
+ color: white;
2191
+ }
2192
+
2193
+ .badge-outline {
2194
+ background-color: transparent;
2195
+ border: 1px solid currentColor;
2196
+
2197
+ &.badge-primary {
2198
+ color: var(--color-text-primary);
2199
+ }
2200
+
2201
+ &.badge-secondary {
2202
+ color: var(--color-secondary-600);
2203
+ }
2204
+
2205
+ &.badge-success {
2206
+ color: var(--color-success-600);
2207
+ }
2208
+
2209
+ &.badge-info {
2210
+ color: var(--color-info-600);
2211
+ }
2212
+
2213
+ &.badge-warning {
2214
+ color: var(--color-warning-600);
2215
+ }
2216
+
2217
+ &.badge-danger {
2218
+ color: var(--color-danger-600);
2219
+ }
2220
+ }
2221
+
2222
+ .badge-sm {
2223
+ padding: 2px var(--spacing-1);
2224
+ font-size: 10px;
2225
+ }
2226
+
2227
+ .badge-lg {
2228
+ padding: var(--spacing-2) var(--spacing-3);
2229
+ font-size: var(--font-size-sm);
2230
+ }
2231
+
2232
+ .pill {
2233
+ padding: var(--spacing-1) var(--spacing-3);
2234
+ border-radius: var(--radius-full);
2235
+ }
2236
+
2237
+
2238
+
2239
+ /* ============================================================================
2240
+ Dialog Primitive
2241
+ Native <dialog> element with PDS integration
2242
+ ============================================================================ */
2243
+
2244
+ /* Dialog base styles */
2245
+ dialog {
2246
+ position: fixed;
2247
+ inset: 0;
2248
+ max-width: min(600px, calc(100vw - var(--spacing-8)));
2249
+ max-height: calc(100vh - var(--spacing-8));
2250
+ margin: auto;
2251
+ padding: 0;
2252
+ border: none;
2253
+ border-radius: var(--radius-lg);
2254
+
2255
+ /* Surface styling - elevated overlay */
2256
+ background-color: var(--surface-overlay-bg);
2257
+ color: var(--surface-overlay-text);
2258
+ box-shadow: 0 8px 32px var(--surface-overlay-shadow);
2259
+
2260
+ /* Smooth transitions */
2261
+ opacity: 0;
2262
+ scale: 0.95;
2263
+ transition:
2264
+ opacity 0.2s ease,
2265
+ scale 0.2s ease,
2266
+ overlay 0.2s ease allow-discrete,
2267
+ display 0.2s ease allow-discrete;
2268
+
2269
+ /* Overflow handling */
2270
+ overflow: hidden;
2271
+ }
2272
+
2273
+ /* Open state */
2274
+ dialog[open] {
2275
+ opacity: 1;
2276
+ scale: 1;
2277
+ }
2278
+
2279
+ /* Starting style for smooth open animation */
2280
+ @starting-style {
2281
+ dialog[open] {
2282
+ opacity: 0;
2283
+ scale: 0.95;
2284
+ }
2285
+ }
2286
+
2287
+ /* Backdrop styling */
2288
+ dialog::backdrop {
2289
+ background: var(--backdrop-bg);
2290
+ backdrop-filter: var(--backdrop-filter);
2291
+ opacity: 0;
2292
+ transition:
2293
+ opacity 0.2s ease,
2294
+ overlay 0.2s ease allow-discrete,
2295
+ display 0.2s ease allow-discrete;
2296
+ }
2297
+
2298
+ dialog[open]::backdrop {
2299
+ opacity: var(--backdrop-opacity, 1);
2300
+ }
2301
+
2302
+ @starting-style {
2303
+ dialog[open]::backdrop {
2304
+ opacity: 0;
2305
+ }
2306
+ }
2307
+
2308
+ /* Form structure - use flexbox instead of contents */
2309
+ dialog form {
2310
+ display: flex;
2311
+ flex-direction: column;
2312
+ height: 100%;
2313
+ margin: 0;
2314
+ }
2315
+
2316
+ /* Dialog fields - to open pds-jsonform subforms */
2317
+ .dialog-field {
2318
+ margin-top: var(--spacing-3);
2319
+ }
2320
+
2321
+ /* Dialog header */
2322
+ dialog {
2323
+ header,
2324
+ form > header {
2325
+ display: flex;
2326
+ align-items: center;
2327
+ justify-content: space-between;
2328
+ gap: var(--spacing-4);
2329
+ padding: var(--spacing-6);
2330
+ border-bottom: 1px solid var(--surface-overlay-border);
2331
+ flex-shrink: 0;
2332
+
2333
+ h2,
2334
+ h3 {
2335
+ margin: 0;
2336
+ font-size: var(--font-size-lg);
2337
+ font-weight: var(--font-weight-semibold);
2338
+ color: var(--surface-overlay-text);
2339
+ flex: 1;
2340
+ }
2341
+
2342
+ /* Close button in header */
2343
+ button[value="cancel"],
2344
+ .dialog-close {
2345
+ background: none;
2346
+ border: none;
2347
+ padding: var(--spacing-2);
2348
+ border-radius: var(--radius-sm);
2349
+ cursor: pointer;
2350
+ color: var(--surface-overlay-icon);
2351
+ transition: background-color var(--transition-fast);
2352
+ display: inline-flex;
2353
+ align-items: center;
2354
+ justify-content: center;
2355
+
2356
+ &:hover {
2357
+ background-color: var(--color-surface-subtle);
2358
+ }
2359
+
2360
+ &:focus-visible {
2361
+ outline: 2px solid var(--color-focus-ring);
2362
+ outline-offset: 2px;
2363
+ }
2364
+ }
2365
+ }
2366
+
2367
+ /* Dialog body - scrollable content */
2368
+ article,
2369
+ form > article,
2370
+ .dialog-body {
2371
+ flex: 1;
2372
+ padding: var(--spacing-6);
2373
+ overflow-y: auto;
2374
+ overflow-x: hidden;
2375
+ }
2376
+
2377
+ /* Dialog footer - actions */
2378
+ footer,
2379
+ form > footer {
2380
+ display: flex;
2381
+ flex-direction: row;
2382
+ gap: var(--spacing-3);
2383
+ justify-content: flex-end;
2384
+ align-items: center;
2385
+ padding: var(--spacing-6);
2386
+ border-top: 1px solid var(--surface-overlay-border);
2387
+ flex-shrink: 0;
2388
+ }
2389
+ }
2390
+
2391
+ /* Dialog size modifiers */
2392
+ dialog.dialog-sm {
2393
+ max-width: min(400px, calc(100vw - var(--spacing-8)));
2394
+ }
2395
+
2396
+ dialog.dialog-lg {
2397
+ max-width: min(800px, calc(100vw - var(--spacing-8)));
2398
+ }
2399
+
2400
+ dialog.dialog-xl {
2401
+ max-width: min(1200px, calc(100vw - var(--spacing-8)));
2402
+ }
2403
+
2404
+ dialog.dialog-full {
2405
+ max-width: calc(100vw - var(--spacing-8));
2406
+ max-height: calc(100vh - var(--spacing-8));
2407
+ }
2408
+
2409
+ /* Mobile responsiveness */
2410
+ @media (max-width: 639px) {
2411
+ dialog {
2412
+ max-width: 100vw;
2413
+ max-height: 100vh;
2414
+ border-radius: 0;
2415
+ top: 50%;
2416
+ transform: translateY(-50%);
2417
+ margin: 0;
2418
+ }
2419
+
2420
+ dialog header,
2421
+ dialog form > header,
2422
+ dialog article,
2423
+ dialog form > article,
2424
+ dialog footer,
2425
+ dialog form > footer {
2426
+ padding: var(--spacing-4);
2427
+ }
2428
+ }
2429
+
2430
+ /* Reduced motion support */
2431
+ @media (prefers-reduced-motion: reduce) {
2432
+ dialog,
2433
+ dialog::backdrop {
2434
+ transition-duration: 0.01s !important;
2435
+ }
2436
+ }
2437
+
2438
+
2439
+
2440
+ /* Accordion (details/summary) */
2441
+
2442
+ .accordion {
2443
+ --_acc-radius: var(--radius-md);
2444
+ --_acc-border: 1px solid var(--color-border);
2445
+ --_acc-bg: var(--color-surface-base);
2446
+
2447
+ details {
2448
+ border: var(--_acc-border);
2449
+ border-radius: var(--_acc-radius);
2450
+ background: var(--_acc-bg);
2451
+ margin: 0 0 var(--spacing-3) 0;
2452
+
2453
+ &[open] {
2454
+ & > summary::after {
2455
+ transform: rotate(45deg);
2456
+ }
2457
+
2458
+ &::details-content {
2459
+ block-size: auto;
2460
+ }
2461
+ }
2462
+
2463
+ /* Modern approach: animate block-size with ::details-content */
2464
+ &::details-content {
2465
+ block-size: 0;
2466
+ overflow: hidden;
2467
+ transition: block-size var(--transition-normal) ease, content-visibility var(--transition-normal);
2468
+ transition-behavior: allow-discrete;
2469
+ }
2470
+
2471
+ /* Content padding (works for both approaches) */
2472
+ & > :not(summary) > * {
2473
+ padding-inline: var(--spacing-4);
2474
+ padding-block: var(--spacing-3);
2475
+ }
2476
+ }
2477
+
2478
+ summary {
2479
+ cursor: pointer;
2480
+ padding: var(--spacing-3) var(--spacing-4);
2481
+ list-style: none;
2482
+ outline: none;
2483
+ display: flex;
2484
+ align-items: center;
2485
+ gap: var(--spacing-2);
2486
+
2487
+ &::-webkit-details-marker {
2488
+ display: none;
2489
+ }
2490
+
2491
+ /* Chevron indicator */
2492
+ &::after {
2493
+ content: "";
2494
+ margin-inline-start: auto;
2495
+ inline-size: 0.7em;
2496
+ block-size: 0.7em;
2497
+ border-inline-end: 2px solid currentColor;
2498
+ border-block-end: 2px solid currentColor;
2499
+ transform: rotate(-45deg);
2500
+ transition: transform var(--transition-normal);
2501
+ }
2502
+ }
2503
+ }
2504
+
2505
+ /* Fallback: grid trick for browsers without ::details-content support */
2506
+ @supports not selector(::details-content) {
2507
+ .accordion details {
2508
+ & > :not(summary) {
2509
+ display: grid;
2510
+ grid-template-rows: 0fr;
2511
+ transition: grid-template-rows var(--transition-normal) ease;
2512
+ overflow: hidden;
2513
+
2514
+ & > * {
2515
+ min-block-size: 0;
2516
+ }
2517
+ }
2518
+
2519
+ &[open] > :not(summary) {
2520
+ grid-template-rows: 1fr;
2521
+ }
2522
+ }
2523
+ }
2524
+
2525
+
2526
+ /* Dropdown Component */
2527
+
2528
+ /* Basic dropdown host */
2529
+ nav[data-dropdown] {
2530
+ position: relative;
2531
+ display: inline-block;
2532
+ padding: 0;
2533
+
2534
+ menu {
2535
+ position: absolute;
2536
+ list-style: none;
2537
+ padding: var(--spacing-2);
2538
+ margin: 0;
2539
+ background: var(--color-surface-overlay);
2540
+ border: 1px solid var(--color-border);
2541
+ border-radius: var(--radius-md);
2542
+ box-shadow: var(--shadow-lg);
2543
+ top: 100%;
2544
+ bottom: auto;
2545
+ left: 0;
2546
+ right: auto;
2547
+ margin-top: var(--spacing-2);
2548
+ --dropdown-transition-duration: var(--transition-fast, 160ms);
2549
+ min-width: max(100%, var(--dropdown-min-width, 12rem));
2550
+ width: max-content;
2551
+ opacity: 0;
2552
+ scale: 0.95;
2553
+ visibility: hidden;
2554
+ display: none;
2555
+ pointer-events: none;
2556
+ transform-origin: top center;
2557
+ z-index: var(--z-dropdown, 1050);
2558
+ max-height: min(60vh, 24rem);
2559
+ overflow-y: auto;
2560
+ transition:
2561
+ opacity var(--dropdown-transition-duration) ease,
2562
+ scale var(--dropdown-transition-duration) ease,
2563
+ visibility 0s linear var(--dropdown-transition-duration),
2564
+ display 0s linear var(--dropdown-transition-duration);
2565
+ transition-behavior: allow-discrete;
2566
+ }
2567
+
2568
+ menu[aria-hidden="false"] {
2569
+ display: block;
2570
+ opacity: 1;
2571
+ scale: 1;
2572
+ visibility: visible;
2573
+ pointer-events: auto;
2574
+ transition:
2575
+ opacity var(--dropdown-transition-duration) ease,
2576
+ scale var(--dropdown-transition-duration) ease,
2577
+ visibility 0s linear 0s,
2578
+ display 0s linear 0s;
2579
+ }
2580
+
2581
+ li {
2582
+ padding: var(--spacing-1) 0;
2583
+
2584
+ & + li {
2585
+ border-top: 1px solid var(--color-border);
2586
+ margin-top: var(--spacing-2);
2587
+ }
2588
+
2589
+ &:has(> hr) {
2590
+ border-top: none;
2591
+ margin-top: 0;
2592
+ padding: 0;
2593
+
2594
+ & + li {
2595
+ border-top: none;
2596
+ margin-top: 0;
2597
+ }
2598
+ }
2599
+
2600
+ & > hr {
2601
+ border: none;
2602
+ border-top: 3px solid var(--color-border);
2603
+ margin: var(--spacing-2) 0;
2604
+ }
2605
+ }
2606
+
2607
+ a {
2608
+ display: flex;
2609
+ color: var(--color-text-primary);
2610
+ text-decoration: none;
2611
+ align-items: center;
2612
+ gap: var(--spacing-2);
2613
+
2614
+ &.danger {
2615
+ color: var(--color-danger-600);
2616
+ }
2617
+ }
2618
+
2619
+ &.align-right,
2620
+ &[data-align="right"],
2621
+ &[data-align="end"],
2622
+ &[data-dropdown-align="right"],
2623
+ &[data-dropdown-align="end"] {
2624
+ menu {
2625
+ left: auto;
2626
+ right: 0;
2627
+ }
2628
+ }
2629
+
2630
+ &[data-mode="up"],
2631
+ &[data-dropdown-direction="up"] {
2632
+ menu {
2633
+ top: auto;
2634
+ bottom: 100%;
2635
+ margin-top: 0;
2636
+ margin-bottom: var(--spacing-2);
2637
+ transform-origin: bottom center;
2638
+ }
2639
+ }
2640
+
2641
+ &[data-mode="down"],
2642
+ &[data-dropdown-direction="down"] {
2643
+ menu {
2644
+ top: 100%;
2645
+ bottom: auto;
2646
+ margin-top: var(--spacing-2);
2647
+ margin-bottom: 0;
2648
+ transform-origin: top center;
2649
+ }
2650
+ }
2651
+
2652
+ &[data-mode="auto"] menu {
2653
+ top: 100%;
2654
+ bottom: auto;
2655
+ }
2656
+
2657
+ @media (prefers-reduced-motion: reduce) {
2658
+ menu {
2659
+ transition-duration: 0.01s !important;
2660
+ }
2661
+ }
2662
+ }
2663
+
2664
+ @starting-style {
2665
+ nav[data-dropdown] menu[aria-hidden="false"] {
2666
+ opacity: 0;
2667
+ scale: 0.95;
2668
+ }
2669
+ }
2670
+
2671
+
2672
+ /* Tab Strip Component */
2673
+
2674
+ /* Tab navigation */
2675
+
2676
+ pds-tabstrip {
2677
+ margin-top: var(--spacing-6);
2678
+
2679
+ & > nav {
2680
+ display: flex;
2681
+ gap: var(--spacing-1);
2682
+ border-bottom: 2px solid var(--color-border);
2683
+ margin-bottom: var(--spacing-6);
2684
+ position: relative;
2685
+ overflow-x: auto;
2686
+ overflow-y: hidden;
2687
+ scrollbar-width: none; /* Firefox */
2688
+ -ms-overflow-style: none; /* IE/Edge */
2689
+
2690
+ &::-webkit-scrollbar {
2691
+ display: none; /* Chrome/Safari */
2692
+ }
2693
+
2694
+ /* Tab links */
2695
+ & > a {
2696
+ position: relative;
2697
+ display: inline-flex;
2698
+ align-items: center;
2699
+ gap: var(--spacing-2);
2700
+ padding: var(--spacing-3) var(--spacing-4);
2701
+ font-family: var(--font-family-body);
2702
+ font-size: var(--font-size-base);
2703
+ font-weight: var(--font-weight-medium);
2704
+ color: var(--color-text-secondary);
2705
+ text-decoration: none;
2706
+ white-space: nowrap;
2707
+ border: none;
2708
+ background: transparent;
2709
+ cursor: pointer;
2710
+ transition: color var(--transition-fast);
2711
+ border-bottom: 2px solid transparent;
2712
+ margin-bottom: -2px; /* Overlap the nav border */
2713
+
2714
+ &:hover {
2715
+ color: var(--color-text-primary);
2716
+ background-color: var(--color-surface-hover);
2717
+ }
2718
+
2719
+ &:focus-visible {
2720
+ outline: var(--focus-ring-width, 2px) solid var(--color-primary-500);
2721
+ outline-offset: -2px;
2722
+ border-radius: var(--radius-sm);
2723
+ z-index: 1;
2724
+ }
2725
+
2726
+ /* Active tab */
2727
+ &[aria-current="page"] {
2728
+ color: var(--color-primary-600);
2729
+ font-weight: var(--font-weight-semibold);
2730
+ border-bottom-color: var(--color-primary-600);
2731
+
2732
+ &:hover {
2733
+ color: var(--color-primary-700);
2734
+ border-bottom-color: var(--color-primary-700);
2735
+ background-color: var(--color-primary-50);
2736
+ }
2737
+ }
2738
+ }
2739
+ }
2740
+
2741
+ /* Tab panel */
2742
+ & > pds-tabpanel {
2743
+ display: block;
2744
+ margin-top: var(--spacing-4);
2745
+
2746
+ &[data-tabpanel] {
2747
+ animation: tabFadeIn var(--transition-normal) ease-out;
2748
+ padding: var(--spacing-4) 0;
2749
+
2750
+ &[hidden] {
2751
+ display: none;
2752
+ }
2753
+ }
2754
+ }
2755
+ }
2756
+
2757
+ @keyframes tabFadeIn {
2758
+ from {
2759
+ opacity: 0;
2760
+ transform: translateY(8px);
2761
+ }
2762
+ to {
2763
+ opacity: 1;
2764
+ transform: translateY(0);
2765
+ }
2766
+ }
2767
+
2768
+ /* Mobile responsive */
2769
+ @media (max-width: 639px) {
2770
+ pds-tabstrip > nav {
2771
+ gap: var(--spacing-1);
2772
+ }
2773
+
2774
+ pds-tabstrip > nav > a {
2775
+ padding: var(--spacing-2) var(--spacing-3);
2776
+ font-size: var(--font-size-sm);
2777
+ }
2778
+
2779
+ pds-tabstrip > pds-tabpanel[data-tabpanel] {
2780
+ padding: var(--spacing-3) 0;
2781
+ }
2782
+ }
2783
+
2784
+
2785
+
2786
+ /* Table Styles - Mobile First */
2787
+
2788
+ table {
2789
+ width: 100%;
2790
+ border-collapse: collapse;
2791
+ margin: 0 0 var(--spacing-6) 0;
2792
+ background-color: var(--color-surface-base);
2793
+ border-radius: var(--radius-md);
2794
+ overflow: hidden;
2795
+ font-size: var(--font-size-sm);
2796
+
2797
+ @media (min-width: 640px) {
2798
+ font-size: var(--font-size-base);
2799
+ }
2800
+ }
2801
+
2802
+ .table-responsive {
2803
+ @media (max-width: 639px) {
2804
+ overflow-x: auto;
2805
+ -webkit-overflow-scrolling: touch;
2806
+ margin: 0 0 var(--spacing-6) 0;
2807
+
2808
+ table {
2809
+ min-width: 600px;
2810
+ margin: 0;
2811
+ }
2812
+ }
2813
+ }
2814
+
2815
+ thead {
2816
+ background-color: var(--color-surface-subtle);
2817
+ }
2818
+
2819
+ th {
2820
+ padding: var(--spacing-3) var(--spacing-4);
2821
+ text-align: left;
2822
+ font-weight: var(--font-weight-semibold);
2823
+ color: var(--color-text-primary);
2824
+ border-bottom: 2px solid var(--color-border);
2825
+ }
2826
+
2827
+ td {
2828
+ padding: var(--spacing-3) var(--spacing-4);
2829
+ color: var(--color-text-secondary);
2830
+ border-bottom: 1px solid var(--color-border);
2831
+ }
2832
+
2833
+ tbody {
2834
+ tr {
2835
+ transition: background-color var(--transition-fast);
2836
+
2837
+ &:hover {
2838
+ background-color: var(--color-surface-subtle);
2839
+ }
2840
+
2841
+ &:last-child td {
2842
+ border-bottom: none;
2843
+ }
2844
+ }
2845
+ }
2846
+
2847
+ .table-striped {
2848
+ tbody tr:nth-child(even) {
2849
+ background-color: var(--color-surface-subtle);
2850
+ }
2851
+ }
2852
+
2853
+ .table-bordered {
2854
+ border: 1px solid var(--color-border);
2855
+
2856
+ th, td {
2857
+ border: 1px solid var(--color-border);
2858
+ }
2859
+ }
2860
+
2861
+ .table-compact {
2862
+ th, td {
2863
+ padding: var(--spacing-2) var(--spacing-3);
2864
+ }
2865
+ }
2866
+
2867
+
2868
+
2869
+ /* Card component */
2870
+
2871
+ .card {
2872
+ background: var(--color-surface-base);
2873
+ border-radius: var(--radius-md);
2874
+ padding: var(--spacing-4);
2875
+
2876
+ &-elevated {
2877
+ background: var(--color-surface-elevated);
2878
+ box-shadow: var(--shadow-md);
2879
+ }
2880
+
2881
+ &-outlined,
2882
+ &-basic {
2883
+ background: var(--color-surface-base);
2884
+ border: 1px solid var(--color-border);
2885
+ }
2886
+
2887
+ &-interactive:hover {
2888
+ transform: translateY(-2px);
2889
+ box-shadow: var(--shadow-lg);
2890
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
2891
+ }
2892
+ }
2893
+
2894
+ /* Custom Scrollbars */
2895
+
2896
+ ::-webkit-scrollbar {
2897
+ width: 12px;
2898
+ height: 12px;
2899
+
2900
+ &-track {
2901
+ background: transparent;
2902
+ }
2903
+
2904
+ &-thumb {
2905
+ background: var(--color-secondary-300);
2906
+ border-radius: var(--radius-full);
2907
+ border: 3px solid transparent;
2908
+ background-clip: padding-box;
2909
+ transition: background-color var(--transition-fast);
2910
+
2911
+ &:hover {
2912
+ background: var(--color-secondary-400);
2913
+ border: 2px solid transparent;
2914
+ background-clip: padding-box;
2915
+ }
2916
+
2917
+ &:active {
2918
+ background: var(--color-secondary-500);
2919
+ border: 2px solid transparent;
2920
+ background-clip: padding-box;
2921
+ }
2922
+
2923
+ @media (prefers-color-scheme: dark) {
2924
+ background: var(--color-secondary-600);
2925
+
2926
+ &:hover {
2927
+ background: var(--color-secondary-500);
2928
+ }
2929
+
2930
+ &:active {
2931
+ background: var(--color-secondary-400);
2932
+ }
2933
+ }
2934
+ }
2935
+ }
2936
+
2937
+ * {
2938
+ scrollbar-width: thin;
2939
+ scrollbar-color: var(--color-secondary-300) transparent;
2940
+
2941
+ @media (prefers-color-scheme: dark) {
2942
+ scrollbar-color: var(--color-secondary-600) transparent;
2943
+ }
2944
+ }
2945
+
2946
+ /* Hover effect for scrollable containers */
2947
+ *:hover {
2948
+ scrollbar-color: var(--color-secondary-400) transparent;
2949
+ }
2950
+
2951
+ @media (prefers-color-scheme: dark) {
2952
+ *:hover {
2953
+ scrollbar-color: var(--color-secondary-500) transparent;
2954
+ }
2955
+ }
2956
+
2957
+
2958
+
2959
+ /* Alert dark mode adjustments */
2960
+ html[data-theme="dark"] .alert-success {
2961
+ background-color: var(--color-success-50);
2962
+ border-color: var(--color-success-500);
2963
+ color: var(--color-success-900);
2964
+ }
2965
+
2966
+ html[data-theme="dark"] .alert-info {
2967
+ background-color: var(--color-info-50);
2968
+ border-color: var(--color-info-500);
2969
+ color: var(--color-info-900);
2970
+ }
2971
+
2972
+ html[data-theme="dark"] .alert-warning {
2973
+ background-color: var(--color-warning-50);
2974
+ border-color: var(--color-warning-500);
2975
+ color: var(--color-warning-900);
2976
+ }
2977
+
2978
+ html[data-theme="dark"] .alert-danger,
2979
+ html[data-theme="dark"] .alert-error {
2980
+ background-color: var(--color-danger-50);
2981
+ border-color: var(--color-danger-500);
2982
+ color: var(--color-danger-900);
2983
+ }
2984
+
2985
+ /* Dim images in dark mode */
2986
+ html[data-theme="dark"] img,
2987
+ html[data-theme="dark"] video {
2988
+ opacity: 0.8;
2989
+ transition: opacity var(--transition-normal);
2990
+ }
2991
+
2992
+ html[data-theme="dark"] img:hover,
2993
+ html[data-theme="dark"] video:hover {
2994
+ opacity: 1;
2995
+ }
2996
+
2997
+ }
2998
+
2999
+ @layer utilities {
3000
+
3001
+ /* Icon System */
3002
+
3003
+ pds-icon {
3004
+ display: inline-flex;
3005
+ align-items: center;
3006
+ justify-content: center;
3007
+ flex-shrink: 0;
3008
+ vertical-align: middle;
3009
+ pointer-events: none;
3010
+ }
3011
+
3012
+ /* Icon size utilities */
3013
+ .icon-xs,
3014
+ pds-icon[size="xs"] {
3015
+ width: var(--icon-size-xs);
3016
+ height: var(--icon-size-xs);
3017
+ }
3018
+
3019
+ .icon-sm,
3020
+ pds-icon[size="sm"] {
3021
+ width: var(--icon-size-sm);
3022
+ height: var(--icon-size-sm);
3023
+ }
3024
+
3025
+ .icon-md,
3026
+ pds-icon[size="md"] {
3027
+ width: var(--icon-size-md);
3028
+ height: var(--icon-size-md);
3029
+ }
3030
+
3031
+ .icon-lg,
3032
+ pds-icon[size="lg"] {
3033
+ width: var(--icon-size-lg);
3034
+ height: var(--icon-size-lg);
3035
+ }
3036
+
3037
+ .icon-xl,
3038
+ pds-icon[size="xl"] {
3039
+ width: var(--icon-size-xl);
3040
+ height: var(--icon-size-xl);
3041
+ }
3042
+
3043
+ .icon-2xl,
3044
+ pds-icon[size="2xl"] {
3045
+ width: var(--icon-size-2xl);
3046
+ height: var(--icon-size-2xl);
3047
+ }
3048
+
3049
+ /* Icon color utilities */
3050
+ .icon-primary,
3051
+ pds-icon.primary {
3052
+ color: var(--color-primary-600);
3053
+ }
3054
+
3055
+ .icon-secondary,
3056
+ pds-icon.secondary {
3057
+ color: var(--color-secondary-600);
3058
+ }
3059
+
3060
+ .icon-accent,
3061
+ pds-icon.accent {
3062
+ color: var(--color-accent-600);
3063
+ }
3064
+
3065
+ .icon-success,
3066
+ pds-icon.success {
3067
+ color: var(--color-success-600);
3068
+ }
3069
+
3070
+ .icon-warning,
3071
+ pds-icon.warning {
3072
+ color: var(--color-warning-600);
3073
+ }
3074
+
3075
+ .icon-danger,
3076
+ pds-icon.danger {
3077
+ color: var(--color-danger-600);
3078
+ }
3079
+
3080
+ .icon-info,
3081
+ pds-icon.info {
3082
+ color: var(--color-info-600);
3083
+ }
3084
+
3085
+ .icon-muted,
3086
+ pds-icon.muted {
3087
+ color: var(--color-text-muted);
3088
+ }
3089
+
3090
+ .icon-subtle,
3091
+ pds-icon.subtle {
3092
+ color: var(--color-text-subtle);
3093
+ }
3094
+
3095
+ /* Icon with text combinations */
3096
+ .icon-text {
3097
+ display: inline-flex;
3098
+ align-items: center;
3099
+ gap: var(--spacing-2);
3100
+ }
3101
+
3102
+ .icon-text-start {
3103
+ flex-direction: row;
3104
+ }
3105
+
3106
+ .icon-text-end {
3107
+ flex-direction: row-reverse;
3108
+ }
3109
+
3110
+ /* Button icon utilities */
3111
+ button, a {
3112
+ pds-icon {
3113
+ flex-shrink: 0;
3114
+ }
3115
+
3116
+ &.icon-only {
3117
+ padding: var(--spacing-2);
3118
+ min-width: 44px;
3119
+ width: 44px;
3120
+ height: 44px;
3121
+ display: inline-flex;
3122
+ align-items: center;
3123
+ justify-content: center;
3124
+ }
3125
+ }
3126
+
3127
+ /* Icon in inputs */
3128
+ .input-icon {
3129
+ position: relative;
3130
+ display: flex;
3131
+ align-items: center;
3132
+
3133
+ pds-icon {
3134
+ position: absolute;
3135
+ left: var(--spacing-3);
3136
+ color: var(--color-text-muted);
3137
+ pointer-events: none;
3138
+ width: var(--icon-size-md);
3139
+ height: var(--icon-size-md);
3140
+ }
3141
+
3142
+ input {
3143
+ padding-left: calc(var(--icon-size-md) + var(--spacing-6));
3144
+ width: 100%;
3145
+ }
3146
+ }
3147
+
3148
+ .input-icon-end {
3149
+ position: relative;
3150
+ display: flex;
3151
+ align-items: center;
3152
+
3153
+ pds-icon {
3154
+ position: absolute;
3155
+ left: unset;
3156
+ right: var(--spacing-3);
3157
+ color: var(--color-text-muted);
3158
+ pointer-events: none;
3159
+ width: var(--icon-size-md);
3160
+ height: var(--icon-size-md);
3161
+ }
3162
+
3163
+ input {
3164
+ padding-left: var(--spacing-4);
3165
+ padding-right: calc(var(--icon-size-md) + var(--spacing-6));
3166
+ width: 100%;
3167
+ }
3168
+ }
3169
+
3170
+
3171
+
3172
+
3173
+ /* ============================================================================
3174
+ Layout Utilities
3175
+ Modern grid and flex system for building responsive layouts
3176
+ ============================================================================ */
3177
+
3178
+ /* Container */
3179
+ .container {
3180
+ display: block;
3181
+ width: 100%;
3182
+ max-width: 1400px;
3183
+ margin: 0 auto;
3184
+ padding: var(--spacing-6);
3185
+ }
3186
+
3187
+ /* Grid System */
3188
+ .grid {
3189
+ display: grid;
3190
+ gap: var(--spacing-4);
3191
+ }
3192
+
3193
+ .grid-cols-1 { grid-template-columns: repeat(1, 1fr); }
3194
+ .grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
3195
+ .grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
3196
+ .grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
3197
+ .grid-cols-6 { grid-template-columns: repeat(6, 1fr); }
3198
+
3199
+ /* Auto-fit grids (responsive) */
3200
+ .grid-auto-sm { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
3201
+ .grid-auto-md { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }
3202
+ .grid-auto-lg { grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); }
3203
+ .grid-auto-xl { grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); }
3204
+
3205
+ /* Gap utilities */
3206
+ .gap-0 { gap: 0; }
3207
+ .gap-xs { gap: var(--spacing-1); }
3208
+ .gap-sm { gap: var(--spacing-2); }
3209
+ .gap-md { gap: var(--spacing-4); }
3210
+ .gap-lg { gap: var(--spacing-6); }
3211
+ .gap-xl { gap: var(--spacing-8); }
3212
+
3213
+
3214
+ /* Flexbox System */
3215
+ .flex {
3216
+ display: flex;
3217
+ }
3218
+
3219
+ .flex-wrap {
3220
+ flex-wrap: wrap;
3221
+ }
3222
+
3223
+ .flex-col {
3224
+ flex-direction: column;
3225
+ }
3226
+
3227
+ .flex-row {
3228
+ flex-direction: row;
3229
+ }
3230
+
3231
+ /* Flex alignment */
3232
+ .items-start { align-items: flex-start; }
3233
+ .items-center { align-items: center; }
3234
+ .items-end { align-items: flex-end; }
3235
+ .items-stretch { align-items: stretch; }
3236
+ .items-baseline { align-items: baseline; }
3237
+
3238
+ .justify-start { justify-content: flex-start; }
3239
+ .justify-center { justify-content: center; }
3240
+ .justify-end { justify-content: flex-end; }
3241
+ .justify-between { justify-content: space-between; }
3242
+ .justify-around { justify-content: space-around; }
3243
+ .justify-evenly { justify-content: space-evenly; }
3244
+
3245
+ /* Responsive helpers */
3246
+ @media (max-width: 767px) {
3247
+ .mobile-stack { flex-direction: column; }
3248
+ .mobile-stack > * { width: 100%; }
3249
+ }
3250
+
3251
+ /* ============================================================================
3252
+ Backdrop Utilities
3253
+ Reusable backdrop layer for modal components (dialogs, drawers, overlays)
3254
+ ============================================================================ */
3255
+
3256
+ /* Base backdrop class for modal overlays */
3257
+ .backdrop {
3258
+ position: fixed;
3259
+ inset: 0;
3260
+ background: var(--backdrop-bg);
3261
+ backdrop-filter: var(--backdrop-filter);
3262
+ opacity: 0;
3263
+ pointer-events: none;
3264
+ transition: opacity 0.2s ease;
3265
+ z-index: var(--z-modal, 1040);
3266
+
3267
+ &.active {
3268
+ opacity: var(--backdrop-opacity, 1);
3269
+ pointer-events: auto;
3270
+ }
3271
+
3272
+ /* Backdrop variants */
3273
+ &-light {
3274
+ --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
3275
+ --backdrop-brightness: 1.1;
3276
+ }
3277
+
3278
+ &-dark {
3279
+ --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
3280
+ --backdrop-brightness: 0.6;
3281
+ }
3282
+
3283
+ &-blur-sm {
3284
+ --backdrop-blur: 5px;
3285
+ }
3286
+
3287
+ &-blur-md {
3288
+ --backdrop-blur: 10px;
3289
+ }
3290
+
3291
+ &-blur-lg {
3292
+ --backdrop-blur: 20px;
3293
+ }
3294
+ }
3295
+
3296
+
3297
+ /* Optional utilities/features controlled by config options */
3298
+ /* - Body background mesh rule (applies one of the generated mesh vars) */
3299
+ /* - Liquid glass utility class */
3300
+ /* Optional background mesh applied from config */
3301
+ body {
3302
+ background: var(--background-mesh-04);
3303
+ background-attachment: fixed;
3304
+ }
3305
+ /* Liquid glass utility (opt-in via options.liquidGlassEffects) */
3306
+ .liquid-glass {
3307
+ border-radius: var(--radius-lg);
3308
+ /* Subtle translucent fill blended with surface */
3309
+ background: color-mix(in oklab, var(--color-surface-subtle) 45%, transparent);
3310
+
3311
+ background-image: linear-gradient(
3312
+ 135deg,
3313
+ rgba(255,255,255,0.35),
3314
+ rgba(255,255,255,0.12)
3315
+ );
3316
+ /* Frosted glass blur + saturation */
3317
+ -webkit-backdrop-filter: blur(12px) saturate(140%);
3318
+ backdrop-filter: blur(12px) saturate(140%);
3319
+ /* Soft inner highlight and outer depth */
3320
+ box-shadow:
3321
+ inset 0 1px 0 rgba(255,255,255,0.6),
3322
+ inset 0 -40px 80px rgba(255,255,255,0.12),
3323
+ 0 10px 30px rgba(0,0,0,0.10);
3324
+ /* Glossy border with slight light and dark edges */
3325
+ border: 1px solid color-mix(in oklab, var(--color-primary-500) 22%, transparent);
3326
+ outline: 1px solid color-mix(in oklab, #ffffff 18%, transparent);
3327
+ outline-offset: -1px;
3328
+ }
3329
+
3330
+ html[data-theme="dark"] .liquid-glass {
3331
+ background: color-mix(in oklab, var(--color-surface-inverse) 45%, transparent);
3332
+ background-image: linear-gradient(
3333
+ 135deg,
3334
+ color-mix(in oklab, var(--color-primary-300) 40%, transparent),
3335
+ color-mix(in oklab, var(--color-surface-overlay) 48%, transparent)
3336
+ );
3337
+ box-shadow:
3338
+ inset 0 1px 0 rgba(255,255,255,0.12),
3339
+ inset 0 -40px 80px rgba(0,0,0,0.55),
3340
+ 0 18px 38px rgba(0,0,0,0.65);
3341
+ border: 1px solid color-mix(in oklab, var(--color-primary-300) 26%, transparent);
3342
+ outline: 1px solid color-mix(in oklab, #ffffff 16%, transparent);
3343
+ }
3344
+
3345
+ /* Fallback when backdrop-filter isn't supported */
3346
+ @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
3347
+ .liquid-glass {
3348
+ /* Strengthen fill a bit to compensate for lack of blur */
3349
+ background: color-mix(in oklab, var(--color-surface-subtle) 70%, rgba(255,255,255,0.4));
3350
+ box-shadow:
3351
+ inset 0 1px 0 rgba(255,255,255,0.6),
3352
+ 0 10px 24px rgba(0,0,0,0.08);
3353
+ }
3354
+
3355
+ html[data-theme="dark"] .liquid-glass {
3356
+ background: color-mix(in oklab, var(--color-surface-inverse) 70%, transparent);
3357
+ box-shadow:
3358
+ inset 0 1px 0 rgba(255,255,255,0.1),
3359
+ 0 18px 32px rgba(0,0,0,0.58);
3360
+ }
3361
+ }
3362
+
3363
+
3364
+ /* ============================================================================
3365
+ Border Gradient Utilities
3366
+ Card outlines with gradient borders and glow effects
3367
+ ============================================================================ */
3368
+
3369
+
3370
+ /* Gradient border utility - premium/promo card style */
3371
+ .border-gradient {
3372
+ border: var(--border-width-medium) solid transparent;
3373
+ background:
3374
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3375
+ linear-gradient(var(--gradient-angle, 135deg),
3376
+ var(--color-primary-400),
3377
+ var(--color-accent-400)
3378
+ ) border-box;
3379
+ }
3380
+
3381
+ /* Gradient border variants - different color combinations */
3382
+ .border-gradient-primary {
3383
+ border: var(--border-width-medium) solid transparent;
3384
+ background:
3385
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3386
+ linear-gradient(var(--gradient-angle, 135deg),
3387
+ var(--color-primary-300),
3388
+ var(--color-primary-600)
3389
+ ) border-box;
3390
+ }
3391
+
3392
+ .border-gradient-accent {
3393
+ border: var(--border-width-medium) solid transparent;
3394
+ background:
3395
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3396
+ linear-gradient(var(--gradient-angle, 135deg),
3397
+ var(--color-accent-300),
3398
+ var(--color-accent-600)
3399
+ ) border-box;
3400
+ }
3401
+
3402
+ .border-gradient-secondary {
3403
+ border: var(--border-width-medium) solid transparent;
3404
+ background:
3405
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3406
+ linear-gradient(var(--gradient-angle, 135deg),
3407
+ var(--color-secondary-300),
3408
+ var(--color-secondary-600)
3409
+ ) border-box;
3410
+ }
3411
+
3412
+ /* Gradient border with different strengths/thickness */
3413
+ .border-gradient-soft {
3414
+ border: 1px solid transparent;
3415
+ background:
3416
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3417
+ linear-gradient(var(--gradient-angle, 135deg),
3418
+ var(--color-primary-400),
3419
+ var(--color-accent-400)
3420
+ ) border-box;
3421
+ }
3422
+
3423
+ .border-gradient-medium {
3424
+ border: 2px solid transparent;
3425
+ background:
3426
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3427
+ linear-gradient(var(--gradient-angle, 135deg),
3428
+ var(--color-primary-400),
3429
+ var(--color-accent-400)
3430
+ ) border-box;
3431
+ }
3432
+
3433
+ .border-gradient-strong {
3434
+ border: 3px solid transparent;
3435
+ background:
3436
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3437
+ linear-gradient(var(--gradient-angle, 135deg),
3438
+ var(--color-primary-400),
3439
+ var(--color-accent-400)
3440
+ ) border-box;
3441
+ }
3442
+
3443
+ /* Glow effect utility - for callouts and active states */
3444
+ .border-glow {
3445
+ box-shadow: 0 0 12px var(--color-primary-500);
3446
+ }
3447
+
3448
+ .border-glow-sm {
3449
+ box-shadow: 0 0 6px var(--color-primary-500);
3450
+ }
3451
+
3452
+ .border-glow-lg {
3453
+ box-shadow: 0 0 20px var(--color-primary-500);
3454
+ }
3455
+
3456
+ /* Combined gradient + glow for premium effects */
3457
+ .border-gradient-glow {
3458
+ border: var(--border-width-medium) solid transparent;
3459
+ background:
3460
+ linear-gradient(var(--color-surface-base), var(--color-surface-base)) padding-box,
3461
+ linear-gradient(135deg,
3462
+ var(--color-primary-400),
3463
+ var(--color-accent-400)
3464
+ ) border-box;
3465
+ box-shadow: 0 0 12px var(--color-primary-500);
3466
+ }
3467
+
3468
+ /* Semantic glow variants */
3469
+ .border-glow-primary {
3470
+ box-shadow: 0 0 12px var(--color-primary-500);
3471
+ }
3472
+
3473
+ .border-glow-accent {
3474
+ box-shadow: 0 0 12px var(--color-accent-500);
3475
+ }
3476
+
3477
+ .border-glow-success {
3478
+ box-shadow: 0 0 12px var(--color-success-500);
3479
+ }
3480
+
3481
+ .border-glow-warning {
3482
+ box-shadow: 0 0 12px var(--color-warning-500);
3483
+ }
3484
+
3485
+ .border-glow-danger {
3486
+ box-shadow: 0 0 12px var(--color-danger-500);
3487
+ }
3488
+
3489
+
3490
+
3491
+ /* Surface utilities */
3492
+
3493
+ .surface {
3494
+ background-color: var(--color-surface-base);
3495
+ }
3496
+
3497
+ .surface-subtle {
3498
+ background-color: var(--color-surface-subtle);
3499
+ }
3500
+
3501
+ .surface-elevated {
3502
+ background-color: var(--color-surface-elevated);
3503
+ }
3504
+
3505
+ .surface-sunken {
3506
+ background-color: var(--color-surface-sunken);
3507
+ }
3508
+
3509
+ .surface-overlay {
3510
+ background-color: var(--color-surface-overlay);
3511
+ }
3512
+
3513
+ /* Translucent semantic variants */
3514
+ .surface-translucent {
3515
+ background-color: var(--color-surface-translucent-50);
3516
+ }
3517
+
3518
+ .surface-translucent-25 {
3519
+ background-color: var(--color-surface-translucent-25);
3520
+ }
3521
+
3522
+ .surface-translucent-50 {
3523
+ background-color: var(--color-surface-translucent-50);
3524
+ }
3525
+
3526
+ .surface-translucent-75 {
3527
+ background-color: var(--color-surface-translucent-75);
3528
+ }
3529
+
3530
+ /* Legacy utility retained for backwards compatibility (opinionated overlay) */
3531
+ .surface-overlay {
3532
+ padding: var(--spacing-4);
3533
+ background-color: var(--color-surface-overlay);
3534
+ box-shadow: var(--shadow-lg);
3535
+ border-radius: var(--radius-md);
3536
+ }
3537
+
3538
+
3539
+ /* Inverse surface (dark) using PDS tokens; text/icons inherit currentColor */
3540
+ .surface-inverse {
3541
+ background-color: var(--color-surface-inverse);
3542
+ /* Ensure foregrounds inside use the correct smart-surface tokens */
3543
+ color: var(--surface-inverse-text);
3544
+ --color-text-primary: var(--surface-inverse-text);
3545
+ --color-text-secondary: var(--surface-inverse-text-secondary);
3546
+ --color-text-muted: var(--surface-inverse-text-muted);
3547
+ /* Ensure code/pre and other muted surfaces have contrast on inverse */
3548
+ --color-surface-muted: rgba(255, 255, 255, 0.08);
3549
+ /* Optional: adjust borders/shadows if utilities/components read these */
3550
+ --color-border: var(--surface-inverse-border);
3551
+
3552
+ pds-icon {
3553
+ color: var(--surface-inverse-icon);
3554
+ }
3555
+ }
3556
+
3557
+ /* Shadow utilities */
3558
+ .shadow-sm {
3559
+ box-shadow: var(--shadow-sm);
3560
+ }
3561
+
3562
+ .shadow-base, .shadow {
3563
+ box-shadow: var(--shadow-base);
3564
+ }
3565
+
3566
+ .shadow-md {
3567
+ box-shadow: var(--shadow-md);
3568
+ }
3569
+
3570
+ .shadow-lg {
3571
+ box-shadow: var(--shadow-lg);
3572
+ }
3573
+
3574
+ .shadow-xl {
3575
+ box-shadow: var(--shadow-xl);
3576
+ }
3577
+
3578
+ .shadow-inner {
3579
+ box-shadow: var(--shadow-inner);
3580
+ }
3581
+
3582
+ .shadow-none {
3583
+ box-shadow: none;
3584
+ }
3585
+
3586
+ .text-muted {
3587
+ color: var(--color-text-muted);
3588
+ }
3589
+
3590
+
3591
+ /* Media Element Utilities */
3592
+
3593
+ /* Gallery images */
3594
+ .img-gallery {
3595
+ width: 100%;
3596
+ height: auto;
3597
+ aspect-ratio: 1;
3598
+ object-fit: cover;
3599
+ border-radius: var(--radius-sm);
3600
+ }
3601
+
3602
+ /* Responsive images with different radius sizes */
3603
+ .img-rounded-sm { border-radius: var(--radius-sm); }
3604
+ .img-rounded-md { border-radius: var(--radius-md); }
3605
+ .img-rounded-lg { border-radius: var(--radius-lg); }
3606
+ .img-rounded-xl { border-radius: var(--radius-xl); }
3607
+ .img-rounded-full { border-radius: var(--radius-full); }
3608
+
3609
+ /* Inline images */
3610
+ .img-inline {
3611
+ display: inline;
3612
+ vertical-align: middle;
3613
+ border-radius: var(--radius-xs);
3614
+ margin: 0 var(--spacing-1);
3615
+ max-width: 60px;
3616
+ height: auto;
3617
+ }
3618
+
3619
+ /* Video specific utilities */
3620
+ .video-responsive {
3621
+ width: 100%;
3622
+ max-width: 600px;
3623
+ height: auto;
3624
+ border-radius: var(--radius-md);
3625
+ }
3626
+
3627
+ /* Figure utilities */
3628
+ .figure-responsive {
3629
+ width: 100%;
3630
+ height: auto;
3631
+ }
3632
+
3633
+
3634
+
3635
+ /* Mobile-First Responsive Design */
3636
+
3637
+ /* Small devices (640px and up) */
3638
+ @media (min-width: 640px) {
3639
+ .sm\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
3640
+ .sm\:flex-row { flex-direction: row; }
3641
+ .sm\:text-sm { font-size: var(--font-size-sm); }
3642
+ .sm\:p-6 { padding: var(--spacing-6); }
3643
+ .sm\:gap-6 { gap: var(--spacing-6); }
3644
+ .sm\:hidden { display: none; }
3645
+ .sm\:block { display: block; }
3646
+ }
3647
+
3648
+ /* Medium devices (768px and up) */
3649
+ @media (min-width: 768px) {
3650
+ .md\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
3651
+ .md\:text-lg { font-size: var(--font-size-lg); }
3652
+ .md\:p-8 { padding: var(--spacing-8); }
3653
+ .md\:gap-8 { gap: var(--spacing-8); }
3654
+ .md\:flex-row { flex-direction: row; }
3655
+ .md\:w-1\/2 { width: 50%; }
3656
+ .md\:w-1\/3 { width: 33.333333%; }
3657
+ .md\:hidden { display: none; }
3658
+ .md\:block { display: block; }
3659
+ }
3660
+
3661
+ /* Large devices (1024px and up) */
3662
+ @media (min-width: 1024px) {
3663
+ .lg\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
3664
+ .lg\:text-xl { font-size: var(--font-size-xl); }
3665
+ .lg\:p-12 { padding: var(--spacing-12); }
3666
+ .lg\:gap-12 { gap: var(--spacing-12); }
3667
+ .lg\:w-1\/4 { width: 25%; }
3668
+ .lg\:hidden { display: none; }
3669
+ .lg\:block { display: block; }
3670
+ }
3671
+
3672
+ /* Touch device optimizations */
3673
+ @media (hover: none) and (pointer: coarse) {
3674
+ /* Touch devices - larger touch targets for interactive elements */
3675
+ button, a, select, textarea,
3676
+ input:not([type="radio"]):not([type="checkbox"]) {
3677
+ min-height: 44px;
3678
+ min-width: 44px;
3679
+ }
3680
+
3681
+ /* Radio and checkbox inputs: keep reasonable size but ensure label tap area is large */
3682
+ input[type="radio"],
3683
+ input[type="checkbox"] {
3684
+ /* Keep native size - labels provide the touch target */
3685
+ min-height: unset;
3686
+ min-width: unset;
3687
+ }
3688
+
3689
+ /* Ensure labels with radio/checkbox have adequate touch targets */
3690
+ /* Exclude button-style fieldsets which already have proper sizing */
3691
+ label:has(input[type="radio"]):not(fieldset.buttons label),
3692
+ label:has(input[type="checkbox"]):not(fieldset.buttons label),
3693
+ fieldset[role="radiogroup"]:not(.buttons) label,
3694
+ fieldset[role="group"]:not(.buttons) label {
3695
+ min-height: 44px;
3696
+ display: inline-flex;
3697
+ align-items: center;
3698
+ padding: var(--spacing-2) 0;
3699
+ }
3700
+
3701
+ /* Disable hover effects
3702
+ on touch devices */
3703
+ .card {
3704
+ &:hover {
3705
+ box-shadow: var(--shadow-base);
3706
+ }
3707
+ }
3708
+
3709
+ a {
3710
+ &:hover {
3711
+ color: var(--color-primary-600);
3712
+ }
3713
+ }
3714
+ }
3715
+
3716
+ /* Reduced motion */
3717
+ @media (prefers-reduced-motion: reduce) {
3718
+ *, *::before, *::after {
3719
+ animation-duration: 0.01ms !important;
3720
+ animation-iteration-count: 1 !important;
3721
+ transition-duration: 0.01ms !important;
3722
+ scroll-behavior: auto !important;
3723
+ }
3724
+ }
3725
+
3726
+ /* High contrast mode */
3727
+ @media (prefers-contrast: high) {
3728
+ :root {
3729
+ --color-primary-600: #0000ff;
3730
+ --color-primary-700: #0000cc;
3731
+ }
3732
+
3733
+ button, input, textarea, select {
3734
+ border-width: 2px;
3735
+ }
3736
+ }
3737
+
3738
+ /* Print styles */
3739
+ @media print {
3740
+ *, *::before, *::after {
3741
+ background: transparent !important;
3742
+ color: black !important;
3743
+ box-shadow: none !important;
3744
+ }
3745
+
3746
+ a, a:visited {
3747
+ text-decoration: underline;
3748
+ }
3749
+
3750
+ button {
3751
+ display: none;
3752
+ }
3753
+
3754
+ .mobile-hidden, .desktop-hidden {
3755
+ display: block !important;
3756
+ }
3757
+ }
3758
+
3759
+
3760
+
3761
+ }