@pure-ds/storybook 0.4.16 → 0.4.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/.storybook/addons/html-preview/Panel.jsx +80 -29
  2. package/.storybook/addons/html-preview/preview.js +4 -5
  3. package/.storybook/manager.js +337 -49
  4. package/.storybook/preview-head.html +2 -2
  5. package/.storybook/preview.js +2 -2
  6. package/README.md +2 -2
  7. package/dist/pds-reference.json +1916 -267
  8. package/package.json +2 -2
  9. package/public/assets/css/app.css +2 -2
  10. package/public/assets/js/app.js +645 -10574
  11. package/public/assets/js/lit.js +3 -1048
  12. package/public/assets/js/pds.js +429 -7368
  13. package/public/assets/pds/components/pds-calendar.js +1 -1
  14. package/public/assets/pds/components/{pds-jsonform.js → pds-form.js} +536 -45
  15. package/public/assets/pds/custom-elements.json +271 -26
  16. package/public/assets/pds/pds-runtime-config.json +1 -1
  17. package/public/assets/pds/styles/pds-components.css +83 -221
  18. package/public/assets/pds/styles/pds-components.css.js +166 -442
  19. package/public/assets/pds/styles/pds-styles.css +240 -437
  20. package/public/assets/pds/styles/pds-styles.css.js +479 -881
  21. package/public/assets/pds/styles/pds-utilities.css +151 -214
  22. package/public/assets/pds/styles/pds-utilities.css.js +302 -428
  23. package/public/assets/pds/vscode-custom-data.json +63 -63
  24. package/scripts/build-pds-reference.mjs +112 -38
  25. package/scripts/generate-stories.js +2 -2
  26. package/src/js/common/ask.js +48 -21
  27. package/src/js/pds-configurator/pds-config-form.js +9 -9
  28. package/src/js/pds-configurator/pds-demo.js +2 -2
  29. package/src/js/pds-core/pds-config.js +14 -14
  30. package/src/js/pds-core/pds-generator.js +113 -50
  31. package/src/js/pds-core/pds-ontology.js +6 -6
  32. package/src/js/pds.d.ts +2 -2
  33. package/stories/GettingStarted.stories.js +3 -0
  34. package/stories/WhatIsPDS.stories.js +3 -0
  35. package/stories/components/PdsCalendar.stories.js +2 -2
  36. package/stories/components/PdsDrawer.stories.js +15 -15
  37. package/stories/components/PdsForm.stories.js +4356 -0
  38. package/stories/components/{PdsJsonformUiSchema.md → PdsFormUiSchema.md} +2 -2
  39. package/stories/components/PdsRichtext.stories.js +4 -17
  40. package/stories/components/PdsScrollrow.stories.js +224 -72
  41. package/stories/components/PdsSplitpanel.stories.js +63 -28
  42. package/stories/components/PdsTabstrip.stories.js +7 -7
  43. package/stories/enhancements/Accordion.stories.js +2 -2
  44. package/stories/enhancements/Dropdowns.stories.js +13 -10
  45. package/stories/enhancements/RangeSliders.stories.js +9 -9
  46. package/stories/enhancements/RequiredFields.stories.js +8 -8
  47. package/stories/enhancements/Toggles.stories.js +45 -36
  48. package/stories/enhancements/_enhancement-header.js +2 -2
  49. package/stories/foundations/Colors.stories.js +13 -13
  50. package/stories/foundations/HTMLDefaults.stories.js +4 -4
  51. package/stories/foundations/Icons.stories.js +123 -288
  52. package/stories/foundations/MeshGradients.stories.js +161 -250
  53. package/stories/foundations/SmartSurfaces.stories.js +147 -64
  54. package/stories/foundations/Spacing.stories.js +30 -30
  55. package/stories/foundations/Typography.stories.js +352 -723
  56. package/stories/foundations/ZIndex.stories.js +124 -141
  57. package/stories/layout/LayoutOverview.stories.js +345 -250
  58. package/stories/layout/LayoutSystem.stories.js +60 -76
  59. package/stories/patterns/InteractiveStates.stories.js +29 -29
  60. package/stories/patterns/Utilities.stories.js +17 -5
  61. package/stories/primitives/Alerts.stories.js +6 -6
  62. package/stories/primitives/Cards.stories.js +22 -11
  63. package/stories/primitives/{Forms.stories.js → FormElements.stories.js} +20 -11
  64. package/stories/primitives/HtmlFormElements.stories.js +128 -0
  65. package/stories/primitives/{FormGroups.stories.js → HtmlFormGroups.stories.js} +70 -21
  66. package/stories/primitives/Media.stories.js +23 -20
  67. package/stories/utilities/Backdrop.stories.js +68 -27
  68. package/stories/utils/PdsAsk.stories.js +15 -14
  69. package/public/assets/js/app.js.map +0 -7
  70. package/public/assets/js/lit.js.map +0 -7
  71. package/public/assets/js/pds.js.map +0 -7
  72. package/stories/components/PdsJsonform.stories.js +0 -1929
  73. /package/src/{pds-core → node-api}/pds-api.js +0 -0
@@ -12,102 +12,28 @@ pds-icon {
12
12
  }
13
13
 
14
14
  /* Icon size utilities */
15
- .icon-xs,
16
- pds-icon[size="xs"] {
17
- width: var(--icon-size-xs);
18
- height: var(--icon-size-xs);
19
- }
20
-
21
- .icon-sm,
22
- pds-icon[size="sm"] {
23
- width: var(--icon-size-sm);
24
- height: var(--icon-size-sm);
25
- }
26
-
27
- .icon-md,
28
- pds-icon[size="md"] {
29
- width: var(--icon-size-md);
30
- height: var(--icon-size-md);
31
- }
32
-
33
- .icon-lg,
34
- pds-icon[size="lg"] {
35
- width: var(--icon-size-lg);
36
- height: var(--icon-size-lg);
37
- }
38
-
39
- .icon-xl,
40
- pds-icon[size="xl"] {
41
- width: var(--icon-size-xl);
42
- height: var(--icon-size-xl);
43
- }
44
-
45
- .icon-2xl,
46
- pds-icon[size="2xl"] {
47
- width: var(--icon-size-2xl);
48
- height: var(--icon-size-2xl);
49
- }
15
+ .icon-xs, pds-icon[size="xs"] { width: var(--icon-size-xs); height: var(--icon-size-xs); }
16
+ .icon-sm, pds-icon[size="sm"] { width: var(--icon-size-sm); height: var(--icon-size-sm); }
17
+ .icon-md, pds-icon[size="md"] { width: var(--icon-size-md); height: var(--icon-size-md); }
18
+ .icon-lg, pds-icon[size="lg"] { width: var(--icon-size-lg); height: var(--icon-size-lg); }
19
+ .icon-xl, pds-icon[size="xl"] { width: var(--icon-size-xl); height: var(--icon-size-xl); }
20
+ .icon-2xl, pds-icon[size="2xl"] { width: var(--icon-size-2xl); height: var(--icon-size-2xl); }
50
21
 
51
22
  /* Icon color utilities */
52
- .icon-primary,
53
- pds-icon.primary {
54
- color: var(--color-primary-600);
55
- }
56
-
57
- .icon-secondary,
58
- pds-icon.secondary {
59
- color: var(--color-secondary-600);
60
- }
61
-
62
- .icon-accent,
63
- pds-icon.accent {
64
- color: var(--color-accent-600);
65
- }
66
-
67
- .icon-success,
68
- pds-icon.success {
69
- color: var(--color-success-600);
70
- }
71
-
72
- .icon-warning,
73
- pds-icon.warning {
74
- color: var(--color-warning-600);
75
- }
76
-
77
- .icon-danger,
78
- pds-icon.danger {
79
- color: var(--color-danger-600);
80
- }
81
-
82
- .icon-info,
83
- pds-icon.info {
84
- color: var(--color-info-600);
85
- }
86
-
87
- .icon-muted,
88
- pds-icon.muted {
89
- color: var(--color-text-muted);
90
- }
91
-
92
- .icon-subtle,
93
- pds-icon.subtle {
94
- color: var(--color-text-subtle);
95
- }
23
+ .icon-primary, pds-icon.primary { color: var(--color-primary-600); }
24
+ .icon-secondary, pds-icon.secondary { color: var(--color-secondary-600); }
25
+ .icon-accent, pds-icon.accent { color: var(--color-accent-600); }
26
+ .icon-success, pds-icon.success { color: var(--color-success-600); }
27
+ .icon-warning, pds-icon.warning { color: var(--color-warning-600); }
28
+ .icon-danger, pds-icon.danger { color: var(--color-danger-600); }
29
+ .icon-info, pds-icon.info { color: var(--color-info-600); }
30
+ .icon-muted, pds-icon.muted { color: var(--color-text-muted); }
31
+ .icon-subtle, pds-icon.subtle { color: var(--color-text-subtle); }
96
32
 
97
33
  /* Icon with text combinations */
98
- .icon-text {
99
- display: inline-flex;
100
- align-items: center;
101
- gap: var(--spacing-2);
102
- }
103
-
104
- .icon-text-start {
105
- flex-direction: row;
106
- }
107
-
108
- .icon-text-end {
109
- flex-direction: row-reverse;
110
- }
34
+ .icon-text { display: inline-flex; align-items: center; gap: var(--spacing-2); }
35
+ .icon-text-start { flex-direction: row; }
36
+ .icon-text-end { flex-direction: row-reverse; }
111
37
 
112
38
  /* Button icon utilities */
113
39
  button, a {
@@ -127,46 +53,19 @@ button, a {
127
53
  }
128
54
 
129
55
  /* Icon in inputs */
130
- .input-icon {
56
+ .input-icon, .input-icon-end {
131
57
  position: relative;
132
58
  display: flex;
133
59
  align-items: center;
134
-
135
- pds-icon {
136
- position: absolute;
137
- left: var(--spacing-3);
138
- color: var(--color-text-muted);
139
- pointer-events: none;
140
- width: var(--icon-size-md);
141
- height: var(--icon-size-md);
142
- }
143
-
144
- input {
145
- padding-left: calc(var(--icon-size-md) + var(--spacing-6));
146
- width: 100%;
147
- }
60
+ pds-icon { position: absolute; color: var(--color-text-muted); pointer-events: none; width: var(--icon-size-md); height: var(--icon-size-md); }
61
+ }
62
+ .input-icon {
63
+ pds-icon { left: var(--spacing-3); }
64
+ input { padding-left: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
148
65
  }
149
-
150
66
  .input-icon-end {
151
- position: relative;
152
- display: flex;
153
- align-items: center;
154
-
155
- pds-icon {
156
- position: absolute;
157
- left: unset;
158
- right: var(--spacing-3);
159
- color: var(--color-text-muted);
160
- pointer-events: none;
161
- width: var(--icon-size-md);
162
- height: var(--icon-size-md);
163
- }
164
-
165
- input {
166
- padding-left: var(--spacing-4);
167
- padding-right: calc(var(--icon-size-md) + var(--spacing-6));
168
- width: 100%;
169
- }
67
+ pds-icon { left: unset; right: var(--spacing-3); }
68
+ input { padding-left: var(--spacing-4); padding-right: calc(var(--icon-size-md) + var(--spacing-6)); width: 100%; }
170
69
  }
171
70
 
172
71
 
@@ -205,44 +104,45 @@ button, a {
205
104
  .grid-auto-xl { grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); }
206
105
 
207
106
  /* Gap utilities */
208
- .gap-0 { gap: 0; }
209
- .gap-xs { gap: var(--spacing-1); }
210
- .gap-sm { gap: var(--spacing-2); }
211
- .gap-md { gap: var(--spacing-4); }
212
- .gap-lg { gap: var(--spacing-6); }
213
- .gap-xl { gap: var(--spacing-8); }
107
+ .gap-0 { gap: 0; } .gap-xs { gap: var(--spacing-1); } .gap-sm { gap: var(--spacing-2); } .gap-md { gap: var(--spacing-4); } .gap-lg { gap: var(--spacing-6); } .gap-xl { gap: var(--spacing-8); }
214
108
 
215
109
 
216
110
  /* Flexbox System */
217
- .flex {
218
- display: flex;
219
- }
111
+ .flex { display: flex; }
112
+ .flex-wrap { flex-wrap: wrap; }
113
+ .flex-col { flex-direction: column; }
114
+ .flex-row { flex-direction: row; }
115
+ .grow { flex: 1 1 0%; }
220
116
 
221
- .flex-wrap {
222
- flex-wrap: wrap;
223
- }
117
+ /* Alignment utilities */
118
+ .items-start { align-items: flex-start; } .items-center { align-items: center; } .items-end { align-items: flex-end; } .items-stretch { align-items: stretch; } .items-baseline { align-items: baseline; }
119
+ .justify-start { justify-content: flex-start; } .justify-center { justify-content: center; } .justify-end { justify-content: flex-end; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-evenly { justify-content: space-evenly; }
120
+ .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; }
224
121
 
225
- .flex-col {
226
- flex-direction: column;
122
+ /* Text overflow utility */
123
+ .truncate {
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
227
127
  }
228
128
 
229
- .flex-row {
230
- flex-direction: row;
231
- }
129
+ /* Max-width utilities */
130
+ .max-w-sm { max-width: 400px; } .max-w-md { max-width: 600px; } .max-w-lg { max-width: 800px; } .max-w-xl { max-width: 1200px; }
232
131
 
233
- /* Flex alignment */
234
- .items-start { align-items: flex-start; }
235
- .items-center { align-items: center; }
236
- .items-end { align-items: flex-end; }
237
- .items-stretch { align-items: stretch; }
238
- .items-baseline { align-items: baseline; }
132
+ /* Stack utilities - vertical rhythm for stacked elements */
133
+ [class^="stack-"], [class*=" stack-"] {
134
+ display: flex;
135
+ flex-direction: column;
136
+ }
137
+ .stack-xs { gap: var(--spacing-1); }
138
+ .stack-sm { gap: var(--spacing-2); }
139
+ .stack-md { gap: var(--spacing-4); }
140
+ .stack-lg { gap: var(--spacing-6); }
141
+ .stack-xl { gap: var(--spacing-8); }
239
142
 
240
- .justify-start { justify-content: flex-start; }
241
- .justify-center { justify-content: center; }
242
- .justify-end { justify-content: flex-end; }
243
- .justify-between { justify-content: space-between; }
244
- .justify-around { justify-content: space-around; }
245
- .justify-evenly { justify-content: space-evenly; }
143
+ /* Section spacing - for major content blocks */
144
+ .section { padding-block: var(--spacing-8); }
145
+ .section-lg { padding-block: var(--spacing-12); }
246
146
 
247
147
  /* Responsive helpers */
248
148
  @media (max-width: 767px) {
@@ -273,27 +173,9 @@ button, a {
273
173
  }
274
174
 
275
175
  /* Backdrop variants */
276
- .backdrop-light {
277
- --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2));
278
- --backdrop-brightness: 1.1;
279
- }
280
-
281
- .backdrop-dark {
282
- --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5));
283
- --backdrop-brightness: 0.6;
284
- }
285
-
286
- .backdrop-blur-sm {
287
- --backdrop-blur: 5px;
288
- }
289
-
290
- .backdrop-blur-md {
291
- --backdrop-blur: 10px;
292
- }
293
-
294
- .backdrop-blur-lg {
295
- --backdrop-blur: 20px;
296
- }
176
+ .backdrop-light { --backdrop-bg: linear-gradient(135deg, rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.2)); --backdrop-brightness: 1.1; }
177
+ .backdrop-dark { --backdrop-bg: linear-gradient(135deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.5)); --backdrop-brightness: 0.6; }
178
+ .backdrop-blur-sm { --backdrop-blur: 5px; } .backdrop-blur-md { --backdrop-blur: 10px; } .backdrop-blur-lg { --backdrop-blur: 20px; }
297
179
 
298
180
 
299
181
  /* Optional utilities/features controlled by config options */
@@ -538,22 +420,101 @@ html[data-theme="dark"] .liquid-glass {
538
420
  }
539
421
 
540
422
 
541
- /* Inverse surface (dark) using PDS tokens; text/icons inherit currentColor */
423
+ /*
424
+ * SURFACE-INVERSE: Local Theme Context Flip
425
+ *
426
+ * We can't simply add .surface-inverse to the dark mode selector because that would
427
+ * also apply the dark color PALETTE (grays, surfaces, etc.), which would override
428
+ * --color-surface-inverse itself. Instead, we duplicate only the SEMANTIC tokens.
429
+ *
430
+ * Light theme .surface-inverse → dark semantic tokens
431
+ * Dark theme .surface-inverse → light semantic tokens (flip back)
432
+ */
433
+
434
+ /* Surface-inverse visual properties (shared, uses smart surface tokens) */
542
435
  .surface-inverse {
543
436
  background-color: var(--color-surface-inverse);
544
- /* Ensure foregrounds inside use the correct smart-surface tokens */
545
437
  color: var(--surface-inverse-text);
546
- --color-text-primary: var(--surface-inverse-text);
547
- --color-text-secondary: var(--surface-inverse-text-secondary);
548
- --color-text-muted: var(--surface-inverse-text-muted);
549
- /* Ensure code/pre and other muted surfaces have contrast on inverse */
550
- --color-surface-muted: rgba(255, 255, 255, 0.08);
551
- /* Optional: adjust borders/shadows if utilities/components read these */
552
- --color-border: var(--surface-inverse-border);
553
438
 
554
439
  pds-icon {
555
440
  color: var(--surface-inverse-icon);
556
441
  }
442
+
443
+ /* btn-primary stays vibrant in any context */
444
+ & .btn-primary {
445
+ background-color: var(--color-primary-500);
446
+ border-color: var(--color-primary-500);
447
+ color: var(--color-primary-contrast, #ffffff);
448
+
449
+ &:hover {
450
+ background-color: var(--color-primary-400);
451
+ border-color: var(--color-primary-400);
452
+ }
453
+ }
454
+ }
455
+
456
+ /* Light-mode inverse: apply dark semantic tokens */
457
+ html:not([data-theme="dark"]) .surface-inverse {
458
+ --color-text-primary: var(--color-gray-100);
459
+ --color-text-secondary: var(--color-gray-300);
460
+ --color-text-muted: var(--color-gray-400);
461
+ --color-border: var(--color-gray-700);
462
+ --color-input-bg: var(--color-gray-800);
463
+ --color-input-disabled-bg: var(--color-gray-900);
464
+ --color-input-disabled-text: var(--color-gray-600);
465
+ --color-code-bg: var(--color-gray-800);
466
+ --color-surface-muted: rgba(255, 255, 255, 0.08);
467
+
468
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
469
+ & .btn-secondary {
470
+ background-color: rgba(255, 255, 255, 0.12);
471
+ color: var(--surface-inverse-text);
472
+ border-color: rgba(255, 255, 255, 0.25);
473
+
474
+ &:hover { background-color: rgba(255, 255, 255, 0.2); }
475
+ &:active { background-color: rgba(255, 255, 255, 0.28); }
476
+ }
477
+
478
+ & select {
479
+ background-color: rgba(255, 255, 255, 0.1);
480
+ color: var(--surface-inverse-text);
481
+ }
482
+
483
+ & a:not([class*="btn"]) {
484
+ color: var(--color-primary-300, #7dd3fc);
485
+ }
486
+ }
487
+
488
+ /* Dark-mode inverse: flip back to light semantic tokens */
489
+ html[data-theme="dark"] .surface-inverse {
490
+ --color-text-primary: var(--color-gray-900);
491
+ --color-text-secondary: var(--color-gray-600);
492
+ --color-text-muted: var(--color-gray-600);
493
+ --color-border: var(--color-gray-300);
494
+ --color-input-bg: var(--color-surface-base);
495
+ --color-input-disabled-bg: var(--color-gray-50);
496
+ --color-input-disabled-text: var(--color-gray-500);
497
+ --color-code-bg: var(--color-gray-100);
498
+ --color-surface-muted: var(--color-gray-100);
499
+
500
+ & button:not(.btn-primary):not(.btn-outline):not(.btn-danger):not(.btn-success):not(.btn-warning),
501
+ & .btn-secondary {
502
+ background-color: rgba(0, 0, 0, 0.06);
503
+ color: var(--surface-inverse-text);
504
+ border-color: rgba(0, 0, 0, 0.15);
505
+
506
+ &:hover { background-color: rgba(0, 0, 0, 0.1); }
507
+ &:active { background-color: rgba(0, 0, 0, 0.15); }
508
+ }
509
+
510
+ & select {
511
+ background-color: #ffffff;
512
+ color: var(--surface-inverse-text);
513
+ }
514
+
515
+ & a:not([class*="btn"]) {
516
+ color: var(--color-primary-600, #0284c7);
517
+ }
557
518
  }
558
519
 
559
520
  /* Shadow utilities */
@@ -602,11 +563,7 @@ html[data-theme="dark"] .liquid-glass {
602
563
  }
603
564
 
604
565
  /* Responsive images with different radius sizes */
605
- .img-rounded-sm { border-radius: var(--radius-sm); }
606
- .img-rounded-md { border-radius: var(--radius-md); }
607
- .img-rounded-lg { border-radius: var(--radius-lg); }
608
- .img-rounded-xl { border-radius: var(--radius-xl); }
609
- .img-rounded-full { border-radius: var(--radius-full); }
566
+ .img-rounded-sm { border-radius: var(--radius-sm); } .img-rounded-md { border-radius: var(--radius-md); } .img-rounded-lg { border-radius: var(--radius-lg); } .img-rounded-xl { border-radius: var(--radius-xl); } .img-rounded-full { border-radius: var(--radius-full); }
610
567
 
611
568
  /* Inline images */
612
569
  .img-inline {
@@ -638,37 +595,17 @@ html[data-theme="dark"] .liquid-glass {
638
595
 
639
596
  /* Small devices (640px and up) */
640
597
  @media (min-width: 640px) {
641
- .sm\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); }
642
- .sm\:flex-row { flex-direction: row; }
643
- .sm\:text-sm { font-size: var(--font-size-sm); }
644
- .sm\:p-6 { padding: var(--spacing-6); }
645
- .sm\:gap-6 { gap: var(--spacing-6); }
646
- .sm\:hidden { display: none; }
647
- .sm\:block { display: block; }
598
+ .sm\:grid-cols-2 { grid-template-columns: repeat(2, 1fr); } .sm\:flex-row { flex-direction: row; } .sm\:text-sm { font-size: var(--font-size-sm); } .sm\:p-6 { padding: var(--spacing-6); } .sm\:gap-6 { gap: var(--spacing-6); } .sm\:hidden { display: none; } .sm\:block { display: block; }
648
599
  }
649
600
 
650
601
  /* Medium devices (768px and up) */
651
602
  @media (min-width: 768px) {
652
- .md\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); }
653
- .md\:text-lg { font-size: var(--font-size-lg); }
654
- .md\:p-8 { padding: var(--spacing-8); }
655
- .md\:gap-8 { gap: var(--spacing-8); }
656
- .md\:flex-row { flex-direction: row; }
657
- .md\:w-1\/2 { width: 50%; }
658
- .md\:w-1\/3 { width: 33.333333%; }
659
- .md\:hidden { display: none; }
660
- .md\:block { display: block; }
603
+ .md\:grid-cols-3 { grid-template-columns: repeat(3, 1fr); } .md\:text-lg { font-size: var(--font-size-lg); } .md\:p-8 { padding: var(--spacing-8); } .md\:gap-8 { gap: var(--spacing-8); } .md\:flex-row { flex-direction: row; } .md\:w-1\/2 { width: 50%; } .md\:w-1\/3 { width: 33.333333%; } .md\:hidden { display: none; } .md\:block { display: block; }
661
604
  }
662
605
 
663
606
  /* Large devices (1024px and up) */
664
607
  @media (min-width: 1024px) {
665
- .lg\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); }
666
- .lg\:text-xl { font-size: var(--font-size-xl); }
667
- .lg\:p-12 { padding: var(--spacing-12); }
668
- .lg\:gap-12 { gap: var(--spacing-12); }
669
- .lg\:w-1\/4 { width: 25%; }
670
- .lg\:hidden { display: none; }
671
- .lg\:block { display: block; }
608
+ .lg\:grid-cols-4 { grid-template-columns: repeat(4, 1fr); } .lg\:text-xl { font-size: var(--font-size-xl); } .lg\:p-12 { padding: var(--spacing-12); } .lg\:gap-12 { gap: var(--spacing-12); } .lg\:w-1\/4 { width: 25%; } .lg\:hidden { display: none; } .lg\:block { display: block; }
672
609
  }
673
610
 
674
611
  /* Touch device optimizations */