gbs-add-block 2.1.0 → 2.3.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/.gbs/skills/gbs-components/SKILL.md +190 -134
  2. package/.gbs/skills/gbs-components/references/install.md +25 -3
  3. package/.gbs/skills/gbs-components/references/styling.md +246 -207
  4. package/CHANGELOG.md +74 -0
  5. package/README.md +154 -23
  6. package/index.cjs +212 -3
  7. package/package.json +41 -10
  8. package/schema/passport-v1.schema.json +204 -0
  9. package/source/beta-components/accordion/passport.json +259 -0
  10. package/source/beta-components/accordion/styles.css +207 -208
  11. package/source/beta-components/alert/passport.json +250 -0
  12. package/source/beta-components/alert/styles.css +154 -155
  13. package/source/beta-components/avatar/passport.json +294 -0
  14. package/source/beta-components/avatar/styles.css +225 -226
  15. package/source/beta-components/badge/passport.json +332 -0
  16. package/source/beta-components/badge/styles.css +203 -204
  17. package/source/beta-components/breadcrumb/passport.json +243 -0
  18. package/source/beta-components/breadcrumb/styles.css +138 -140
  19. package/source/beta-components/button/passport.json +402 -0
  20. package/source/beta-components/button/passport.manual.json +31 -0
  21. package/source/beta-components/button/styles.css +232 -234
  22. package/source/beta-components/card/passport.json +337 -0
  23. package/source/beta-components/card/styles.css +230 -232
  24. package/source/beta-components/checkbox/passport.json +456 -0
  25. package/source/beta-components/checkbox/styles.css +211 -213
  26. package/source/beta-components/combobox/passport.json +456 -0
  27. package/source/beta-components/combobox/styles.css +419 -417
  28. package/source/beta-components/data-grid/agent/coerce.ts +368 -0
  29. package/source/beta-components/data-grid/agent/contract.ts +410 -0
  30. package/source/beta-components/data-grid/agent/dataset.ts +92 -0
  31. package/source/beta-components/data-grid/agent/engine.ts +470 -0
  32. package/source/beta-components/data-grid/agent/executors.ts +155 -0
  33. package/source/beta-components/data-grid/agent/index.ts +79 -0
  34. package/source/beta-components/data-grid/agent/intent.ts +324 -0
  35. package/source/beta-components/data-grid/agent/operations.ts +335 -0
  36. package/source/beta-components/data-grid/agent/validate.ts +630 -0
  37. package/source/beta-components/data-grid/agent/webmcp.ts +107 -0
  38. package/source/beta-components/data-grid/index.ts +14 -7
  39. package/source/beta-components/data-grid/passport.json +1051 -0
  40. package/source/beta-components/data-grid/passport.manual.json +255 -0
  41. package/source/beta-components/data-grid/react/AskGrid.tsx +164 -0
  42. package/source/beta-components/data-grid/react/DataGrid.tsx +39 -0
  43. package/source/beta-components/data-grid/styles.css +874 -716
  44. package/source/beta-components/date-picker/passport.json +407 -0
  45. package/source/beta-components/date-picker/styles.css +445 -446
  46. package/source/beta-components/dialog/passport.json +344 -0
  47. package/source/beta-components/dialog/styles.css +280 -279
  48. package/source/beta-components/file-uploader/passport.json +518 -0
  49. package/source/beta-components/file-uploader/styles.css +394 -396
  50. package/source/beta-components/input/passport.json +536 -0
  51. package/source/beta-components/input/styles.css +295 -297
  52. package/source/beta-components/menu/passport.json +322 -0
  53. package/source/beta-components/menu/styles.css +224 -223
  54. package/source/beta-components/modal/passport.json +289 -0
  55. package/source/beta-components/modal/styles.css +241 -240
  56. package/source/beta-components/number-input/passport.json +541 -0
  57. package/source/beta-components/number-input/styles.css +230 -231
  58. package/source/beta-components/popover/passport.json +238 -0
  59. package/source/beta-components/popover/styles.css +148 -147
  60. package/source/beta-components/progress/passport.json +270 -0
  61. package/source/beta-components/progress/styles.css +200 -201
  62. package/source/beta-components/radio-group/passport.json +477 -0
  63. package/source/beta-components/radio-group/styles.css +269 -270
  64. package/source/beta-components/shared/core/agent/adapter.ts +65 -0
  65. package/source/beta-components/shared/core/agent/history.ts +120 -0
  66. package/source/beta-components/shared/core/agent/index.ts +46 -0
  67. package/source/beta-components/shared/core/agent/numbers.ts +217 -0
  68. package/source/beta-components/shared/core/agent/schema.ts +180 -0
  69. package/source/beta-components/shared/core/agent/types.ts +169 -0
  70. package/source/beta-components/shared/core/agent/webmcp.ts +328 -0
  71. package/source/beta-components/shared/index.ts +9 -0
  72. package/source/beta-components/shared/react/GramproAIProvider.tsx +50 -0
  73. package/source/beta-components/shared/react/useAskAgent.ts +217 -0
  74. package/source/beta-components/shared/styles.css +79 -0
  75. package/source/beta-components/shared/version.json +4 -4
  76. package/source/beta-components/shared/version.ts +6 -6
  77. package/source/beta-components/skeleton/passport.json +251 -0
  78. package/source/beta-components/skeleton/styles.css +185 -187
  79. package/source/beta-components/spinner/passport.json +245 -0
  80. package/source/beta-components/spinner/styles.css +173 -174
  81. package/source/beta-components/switch/passport.json +421 -0
  82. package/source/beta-components/switch/styles.css +227 -229
  83. package/source/beta-components/tabs/passport.json +315 -0
  84. package/source/beta-components/tabs/styles.css +263 -264
  85. package/source/beta-components/textarea/passport.json +382 -0
  86. package/source/beta-components/textarea/styles.css +158 -160
  87. package/source/beta-components/toaster/passport.json +221 -0
  88. package/source/beta-components/toaster/styles.css +282 -282
  89. package/source/beta-components/tooltip/passport.json +170 -0
  90. package/source/beta-components/tooltip/styles.css +71 -73
  91. package/tools/env.cjs +61 -0
  92. package/tools/passport/cli.cjs +79 -0
  93. package/tools/passport/extract.cjs +493 -0
  94. package/tools/passport/index.cjs +185 -0
  95. package/tools/passport/merge.cjs +131 -0
  96. package/tools/passport/policy.cjs +65 -0
  97. package/tools/passport/validate.cjs +277 -0
  98. package/tools/ts-require.cjs +79 -0
  99. package/source/beta-components/accordion/__tests__/core.test.ts +0 -58
  100. package/source/beta-components/alert/__tests__/core.test.ts +0 -17
  101. package/source/beta-components/avatar/__tests__/core.test.ts +0 -88
  102. package/source/beta-components/badge/__tests__/core.test.ts +0 -46
  103. package/source/beta-components/breadcrumb/__tests__/core.test.ts +0 -58
  104. package/source/beta-components/button/__tests__/core.test.ts +0 -31
  105. package/source/beta-components/card/__tests__/core.test.ts +0 -57
  106. package/source/beta-components/checkbox/__tests__/core.test.ts +0 -40
  107. package/source/beta-components/combobox/__tests__/core.test.ts +0 -134
  108. package/source/beta-components/data-grid/__tests__/core.test.ts +0 -356
  109. package/source/beta-components/data-grid/__tests__/export.test.ts +0 -70
  110. package/source/beta-components/data-grid/__tests__/pdf.test.ts +0 -209
  111. package/source/beta-components/date-picker/__tests__/core.test.ts +0 -273
  112. package/source/beta-components/dialog/__tests__/core.test.ts +0 -86
  113. package/source/beta-components/file-uploader/__tests__/core.test.ts +0 -395
  114. package/source/beta-components/input/__tests__/core.test.ts +0 -75
  115. package/source/beta-components/menu/__tests__/core.test.ts +0 -120
  116. package/source/beta-components/modal/__tests__/core.test.ts +0 -55
  117. package/source/beta-components/number-input/__tests__/core.test.ts +0 -151
  118. package/source/beta-components/progress/__tests__/core.test.ts +0 -56
  119. package/source/beta-components/radio-group/__tests__/core.test.ts +0 -64
  120. package/source/beta-components/shared/__tests__/boundaries.test.ts +0 -95
  121. package/source/beta-components/shared/__tests__/core.test.ts +0 -55
  122. package/source/beta-components/shared/__tests__/position.test.ts +0 -143
  123. package/source/beta-components/skeleton/__tests__/core.test.ts +0 -41
  124. package/source/beta-components/spinner/__tests__/core.test.ts +0 -48
  125. package/source/beta-components/switch/__tests__/core.test.ts +0 -64
  126. package/source/beta-components/tabs/__tests__/core.test.ts +0 -51
  127. package/source/beta-components/textarea/__tests__/core.test.ts +0 -38
  128. package/source/beta-components/toaster/__tests__/core.test.ts +0 -256
  129. package/source/beta-components/tooltip/__tests__/core.test.ts +0 -42
@@ -1,446 +1,445 @@
1
- /*
2
- * DatePicker styles (DatePicker and DateRangePicker).
3
- *
4
- * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
- * (set them on :root to theme every component at once) and fall back to the
6
- * same default palette otherwise. Rules live in the `gbs` layer; declare
7
- * where it sits in your global CSS, e.g. `@layer reset, gbs, app,
8
- * utilities;`, and anything in a later layer overrides them.
9
- */
10
-
11
- @layer gbs {
12
- .dp-root {
13
- --dp-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
14
- --dp-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
15
- --dp-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
16
- --dp-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
17
- --dp-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
18
- --dp-input-bg: var(--gbs-input-bg, var(--dg-input-bg, light-dark(#ffffff, #121216)));
19
- --dp-accent: var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa)));
20
- --dp-accent-fg: var(--gbs-accent-fg, var(--dg-accent-fg, light-dark(#ffffff, #0b1220)));
21
- --dp-accent-soft: var(--gbs-accent-soft, var(--dg-accent-soft, light-dark(#eff6ff, #172554)));
22
- --dp-accent-strong: var(--gbs-accent-strong, var(--dg-accent-strong, light-dark(#1d4ed8, #bfdbfe)));
23
- --dp-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
24
- --dp-danger: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
25
- --dp-shadow: var(--gbs-shadow, var(--dg-shadow, 0 10px 30px -8px light-dark(rgb(0 0 0 / 0.18), rgb(0 0 0 / 0.6))));
26
- --dp-radius: var(--gbs-radius, var(--dg-radius, 8px));
27
- --dp-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
28
- --dp-height: 36px;
29
- --dp-px: 10px;
30
- --dp-day-size: 34px;
31
-
32
- color-scheme: inherit;
33
- position: relative;
34
- display: flex;
35
- flex-direction: column;
36
- gap: 4px;
37
- width: 100%;
38
- min-width: 0;
39
- font-size: var(--dp-font-size);
40
- line-height: 1.4;
41
- color: var(--dp-fg);
42
- }
43
-
44
- :where(.dark, [data-theme="dark"]) .dp-root {
45
- color-scheme: dark;
46
- }
47
- :where(.light, [data-theme="light"]) .dp-root {
48
- color-scheme: light;
49
- }
50
-
51
- :where(.dp-root, .dp-popover) *,
52
- :where(.dp-root, .dp-popover) *::before,
53
- :where(.dp-root, .dp-popover) *::after {
54
- box-sizing: border-box;
55
- }
56
-
57
- .dp-root[data-size="sm"] {
58
- --dp-height: 30px;
59
- --dp-font-size: 12px;
60
- --dp-px: 8px;
61
- --dp-day-size: 30px;
62
- }
63
- .dp-root[data-size="lg"] {
64
- --dp-height: 44px;
65
- --dp-font-size: 14px;
66
- --dp-px: 12px;
67
- --dp-day-size: 38px;
68
- }
69
-
70
- .dp-label {
71
- font-weight: 500;
72
- }
73
- .dp-label[data-required]::after {
74
- content: " *";
75
- color: var(--dp-danger);
76
- }
77
- .dp-description {
78
- color: var(--dp-muted);
79
- font-size: 0.92em;
80
- }
81
- .dp-error {
82
- color: var(--dp-danger);
83
- font-size: 0.92em;
84
- }
85
-
86
- /* --------------------------------------------------------------- field */
87
-
88
- .dp-control {
89
- display: flex;
90
- align-items: center;
91
- gap: 4px;
92
- width: 100%;
93
- min-height: var(--dp-height);
94
- padding: 2px var(--dp-px);
95
- border: 1px solid var(--dp-border);
96
- border-radius: var(--dp-radius);
97
- background: var(--dp-input-bg);
98
- }
99
- .dp-control:hover:not([data-disabled]) {
100
- border-color: color-mix(in oklab, var(--dp-border), var(--dp-fg) 25%);
101
- }
102
- .dp-control:focus-within,
103
- .dp-root[data-state="open"] .dp-control {
104
- outline: 2px solid var(--dp-focus);
105
- outline-offset: -1px;
106
- }
107
- .dp-control[data-invalid] {
108
- border-color: var(--dp-danger);
109
- }
110
- .dp-control[data-invalid]:focus-within,
111
- .dp-root[data-invalid][data-state="open"] .dp-control {
112
- outline-color: var(--dp-danger);
113
- }
114
- .dp-control[data-disabled] {
115
- opacity: 0.55;
116
- }
117
- .dp-control[data-disabled] .dp-input {
118
- cursor: not-allowed;
119
- }
120
-
121
- .dp-input {
122
- flex: 1 1 auto;
123
- width: 100%;
124
- min-width: 0;
125
- padding: 0;
126
- border: 0;
127
- outline: 0;
128
- background: transparent;
129
- color: inherit;
130
- font: inherit;
131
- }
132
- .dp-input::placeholder {
133
- color: var(--dp-muted);
134
- }
135
- .dp-input:read-only {
136
- cursor: pointer;
137
- }
138
- .dp-separator {
139
- flex: none;
140
- color: var(--dp-muted);
141
- }
142
-
143
- .dp-actions {
144
- display: flex;
145
- flex: none;
146
- align-items: center;
147
- gap: 2px;
148
- color: var(--dp-muted);
149
- }
150
- .dp-icon-button {
151
- display: inline-grid;
152
- place-items: center;
153
- width: 26px;
154
- height: 26px;
155
- padding: 0;
156
- border: 0;
157
- border-radius: 6px;
158
- background: transparent;
159
- color: inherit;
160
- cursor: pointer;
161
- }
162
- .dp-icon-button:hover:not(:disabled) {
163
- background: var(--dp-hover);
164
- color: var(--dp-fg);
165
- }
166
- .dp-icon-button:focus-visible {
167
- outline: 2px solid var(--dp-focus);
168
- outline-offset: 1px;
169
- }
170
- .dp-icon-button:disabled {
171
- opacity: 0.4;
172
- cursor: default;
173
- }
174
-
175
- /* ------------------------------------------------------------- popover */
176
-
177
- .dp-popover {
178
- position: fixed;
179
- inset: auto;
180
- margin: 0;
181
- padding: 0;
182
- overflow: visible;
183
- border: 1px solid var(--dp-border);
184
- border-radius: var(--dp-radius);
185
- background: var(--dp-bg);
186
- color: var(--dp-fg);
187
- box-shadow: var(--dp-shadow);
188
- font-size: var(--dp-font-size);
189
- }
190
- .dp-panel-root {
191
- display: flex;
192
- align-items: stretch;
193
- }
194
-
195
- .dp-presets {
196
- display: flex;
197
- flex-direction: column;
198
- gap: 2px;
199
- padding: 8px;
200
- border-inline-end: 1px solid var(--dp-border);
201
- }
202
- .dp-preset {
203
- padding: 6px 10px;
204
- border: 0;
205
- border-radius: 6px;
206
- background: transparent;
207
- color: inherit;
208
- font: inherit;
209
- text-align: start;
210
- white-space: nowrap;
211
- cursor: pointer;
212
- }
213
- .dp-preset:hover {
214
- background: var(--dp-hover);
215
- }
216
- .dp-preset:focus-visible {
217
- outline: 2px solid var(--dp-focus);
218
- outline-offset: -2px;
219
- }
220
-
221
- .dp-calendar {
222
- display: flex;
223
- flex-direction: column;
224
- padding: 8px;
225
- }
226
-
227
- .dp-nav {
228
- display: flex;
229
- align-items: center;
230
- justify-content: space-between;
231
- gap: 4px;
232
- padding-bottom: 4px;
233
- }
234
- /* "Previous" points the reading-back way in both directions. */
235
- [dir="rtl"] .dp-nav-step svg {
236
- transform: scaleX(-1);
237
- }
238
- .dp-nav-title {
239
- display: inline-flex;
240
- align-items: center;
241
- gap: 4px;
242
- padding: 4px 8px;
243
- border: 0;
244
- border-radius: 6px;
245
- background: transparent;
246
- color: inherit;
247
- font: inherit;
248
- font-weight: 600;
249
- cursor: pointer;
250
- }
251
- .dp-nav-title:hover {
252
- background: var(--dp-hover);
253
- }
254
- .dp-nav-title:focus-visible {
255
- outline: 2px solid var(--dp-focus);
256
- outline-offset: -2px;
257
- }
258
- .dp-nav-chevron {
259
- color: var(--dp-muted);
260
- transition: transform 120ms ease;
261
- }
262
- .dp-nav-title[aria-expanded="true"] .dp-nav-chevron {
263
- transform: rotate(180deg);
264
- }
265
- @media (prefers-reduced-motion: reduce) {
266
- .dp-nav-chevron {
267
- transition: none;
268
- }
269
- }
270
-
271
- /* ---------------------------------------------------------- month grid */
272
-
273
- .dp-months {
274
- display: flex;
275
- gap: 16px;
276
- }
277
- .dp-month-caption {
278
- padding-bottom: 4px;
279
- color: var(--dp-muted);
280
- font-weight: 600;
281
- text-align: center;
282
- }
283
- .dp-grid {
284
- border-collapse: collapse;
285
- table-layout: fixed;
286
- }
287
- .dp-weekday,
288
- .dp-week-number {
289
- width: var(--dp-day-size);
290
- padding: 4px 0;
291
- color: var(--dp-muted);
292
- font-size: 0.85em;
293
- font-weight: 600;
294
- text-align: center;
295
- }
296
- .dp-week-number {
297
- width: 28px;
298
- border-inline-end: 1px solid var(--dp-border);
299
- font-weight: 400;
300
- }
301
- .dp-week-number abbr {
302
- text-decoration: none;
303
- }
304
- .dp-cell {
305
- padding: 1px 0;
306
- }
307
-
308
- .dp-day {
309
- display: grid;
310
- place-items: center;
311
- width: var(--dp-day-size);
312
- height: var(--dp-day-size);
313
- padding: 0;
314
- border: 0;
315
- border-radius: 6px;
316
- background: transparent;
317
- color: inherit;
318
- font: inherit;
319
- font-variant-numeric: tabular-nums;
320
- cursor: pointer;
321
- }
322
- .dp-day:hover:not(:disabled) {
323
- background: var(--dp-hover);
324
- }
325
- .dp-day:focus-visible {
326
- outline: 2px solid var(--dp-focus);
327
- outline-offset: -2px;
328
- }
329
- .dp-day[data-outside] {
330
- color: var(--dp-muted);
331
- opacity: 0.6;
332
- }
333
- .dp-day[data-today] {
334
- font-weight: 700;
335
- box-shadow: inset 0 0 0 1px var(--dp-accent);
336
- }
337
- .dp-day[data-selected] {
338
- background: var(--dp-accent);
339
- color: var(--dp-accent-fg);
340
- font-weight: 600;
341
- }
342
- .dp-day[data-selected]:hover {
343
- background: var(--dp-accent);
344
- }
345
- .dp-day:disabled {
346
- opacity: 0.35;
347
- cursor: not-allowed;
348
- }
349
-
350
- /* The band spans the cell, so a range reads as one continuous stripe. */
351
- .dp-cell[data-in-range] {
352
- background: var(--dp-accent-soft);
353
- }
354
- .dp-cell[data-range-start] {
355
- border-start-start-radius: 6px;
356
- border-end-start-radius: 6px;
357
- }
358
- .dp-cell[data-range-end] {
359
- border-start-end-radius: 6px;
360
- border-end-end-radius: 6px;
361
- }
362
-
363
- /* --------------------------------------------------- month/year panels */
364
-
365
- .dp-panel {
366
- display: grid;
367
- grid-template-columns: repeat(3, minmax(0, 1fr));
368
- gap: 4px;
369
- padding: 4px 0;
370
- }
371
- .dp-panel-item {
372
- padding: 8px 6px;
373
- border: 0;
374
- border-radius: 6px;
375
- background: transparent;
376
- color: inherit;
377
- font: inherit;
378
- cursor: pointer;
379
- }
380
- .dp-panel-item:hover:not(:disabled) {
381
- background: var(--dp-hover);
382
- }
383
- .dp-panel-item:focus-visible {
384
- outline: 2px solid var(--dp-focus);
385
- outline-offset: -2px;
386
- }
387
- .dp-panel-item[data-selected] {
388
- background: var(--dp-accent);
389
- color: var(--dp-accent-fg);
390
- font-weight: 600;
391
- }
392
- .dp-panel-item:disabled {
393
- opacity: 0.35;
394
- cursor: not-allowed;
395
- }
396
-
397
- .dp-footer {
398
- display: flex;
399
- align-items: center;
400
- justify-content: space-between;
401
- gap: 8px;
402
- margin-top: 4px;
403
- padding-top: 6px;
404
- border-top: 1px solid var(--dp-border);
405
- }
406
- .dp-link-button {
407
- padding: 4px 6px;
408
- border: 0;
409
- border-radius: 4px;
410
- background: none;
411
- color: var(--dp-accent);
412
- font: inherit;
413
- cursor: pointer;
414
- }
415
- .dp-link-button:hover {
416
- background: var(--dp-hover);
417
- }
418
- .dp-link-button:focus-visible {
419
- outline: 2px solid var(--dp-focus);
420
- outline-offset: -2px;
421
- }
422
-
423
- .dp-sr-only {
424
- position: absolute;
425
- width: 1px;
426
- height: 1px;
427
- margin: -1px;
428
- padding: 0;
429
- overflow: hidden;
430
- clip-path: inset(50%);
431
- white-space: nowrap;
432
- border: 0;
433
- }
434
-
435
- @media (forced-colors: active) {
436
- .dp-day[data-selected],
437
- .dp-panel-item[data-selected] {
438
- background: Highlight;
439
- color: HighlightText;
440
- }
441
- .dp-cell[data-in-range] {
442
- background: Highlight;
443
- forced-color-adjust: none;
444
- }
445
- }
446
- }
1
+ /*
2
+ * DatePicker styles (DatePicker and DateRangePicker).
3
+ *
4
+ * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
+ * (set them on :root to theme every component at once) and fall back to the
6
+ * same default palette otherwise. Rules are unlayered: they beat a framework
7
+ * reset on specificity, and lose to anything you pass through `className`.
8
+ * With Tailwind v4, import this file after the framework and inside its
9
+ * components layer - see the README.
10
+ */
11
+
12
+ .dp-root {
13
+ --dp-bg: var(--gbs-bg, var(--dg-bg, light-dark(#ffffff, #0b0b0e)));
14
+ --dp-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
15
+ --dp-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
16
+ --dp-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
17
+ --dp-hover: var(--gbs-hover, var(--dg-hover, light-dark(#f4f4f5, #1f1f23)));
18
+ --dp-input-bg: var(--gbs-input-bg, var(--dg-input-bg, light-dark(#ffffff, #121216)));
19
+ --dp-accent: var(--gbs-accent, var(--dg-accent, light-dark(#2563eb, #60a5fa)));
20
+ --dp-accent-fg: var(--gbs-accent-fg, var(--dg-accent-fg, light-dark(#ffffff, #0b1220)));
21
+ --dp-accent-soft: var(--gbs-accent-soft, var(--dg-accent-soft, light-dark(#eff6ff, #172554)));
22
+ --dp-accent-strong: var(--gbs-accent-strong, var(--dg-accent-strong, light-dark(#1d4ed8, #bfdbfe)));
23
+ --dp-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
24
+ --dp-danger: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
25
+ --dp-shadow: var(--gbs-shadow, var(--dg-shadow, 0 10px 30px -8px light-dark(rgb(0 0 0 / 0.18), rgb(0 0 0 / 0.6))));
26
+ --dp-radius: var(--gbs-radius, var(--dg-radius, 8px));
27
+ --dp-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
28
+ --dp-height: 36px;
29
+ --dp-px: 10px;
30
+ --dp-day-size: 34px;
31
+
32
+ color-scheme: inherit;
33
+ position: relative;
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: 4px;
37
+ width: 100%;
38
+ min-width: 0;
39
+ font-size: var(--dp-font-size);
40
+ line-height: 1.4;
41
+ color: var(--dp-fg);
42
+ }
43
+
44
+ :where(.dark, [data-theme="dark"]) .dp-root {
45
+ color-scheme: dark;
46
+ }
47
+ :where(.light, [data-theme="light"]) .dp-root {
48
+ color-scheme: light;
49
+ }
50
+
51
+ :where(.dp-root, .dp-popover) *,
52
+ :where(.dp-root, .dp-popover) *::before,
53
+ :where(.dp-root, .dp-popover) *::after {
54
+ box-sizing: border-box;
55
+ }
56
+
57
+ .dp-root[data-size="sm"] {
58
+ --dp-height: 30px;
59
+ --dp-font-size: 12px;
60
+ --dp-px: 8px;
61
+ --dp-day-size: 30px;
62
+ }
63
+ .dp-root[data-size="lg"] {
64
+ --dp-height: 44px;
65
+ --dp-font-size: 14px;
66
+ --dp-px: 12px;
67
+ --dp-day-size: 38px;
68
+ }
69
+
70
+ .dp-label {
71
+ font-weight: 500;
72
+ }
73
+ .dp-label[data-required]::after {
74
+ content: " *";
75
+ color: var(--dp-danger);
76
+ }
77
+ .dp-description {
78
+ color: var(--dp-muted);
79
+ font-size: 0.92em;
80
+ }
81
+ .dp-error {
82
+ color: var(--dp-danger);
83
+ font-size: 0.92em;
84
+ }
85
+
86
+ /* --------------------------------------------------------------- field */
87
+
88
+ .dp-control {
89
+ display: flex;
90
+ align-items: center;
91
+ gap: 4px;
92
+ width: 100%;
93
+ min-height: var(--dp-height);
94
+ padding: 2px var(--dp-px);
95
+ border: 1px solid var(--dp-border);
96
+ border-radius: var(--dp-radius);
97
+ background: var(--dp-input-bg);
98
+ }
99
+ .dp-control:hover:not([data-disabled]) {
100
+ border-color: color-mix(in oklab, var(--dp-border), var(--dp-fg) 25%);
101
+ }
102
+ .dp-control:focus-within,
103
+ .dp-root[data-state="open"] .dp-control {
104
+ outline: 2px solid var(--dp-focus);
105
+ outline-offset: -1px;
106
+ }
107
+ .dp-control[data-invalid] {
108
+ border-color: var(--dp-danger);
109
+ }
110
+ .dp-control[data-invalid]:focus-within,
111
+ .dp-root[data-invalid][data-state="open"] .dp-control {
112
+ outline-color: var(--dp-danger);
113
+ }
114
+ .dp-control[data-disabled] {
115
+ opacity: 0.55;
116
+ }
117
+ .dp-control[data-disabled] .dp-input {
118
+ cursor: not-allowed;
119
+ }
120
+
121
+ .dp-input {
122
+ flex: 1 1 auto;
123
+ width: 100%;
124
+ min-width: 0;
125
+ padding: 0;
126
+ border: 0;
127
+ outline: 0;
128
+ background: transparent;
129
+ color: inherit;
130
+ font: inherit;
131
+ }
132
+ .dp-input::placeholder {
133
+ color: var(--dp-muted);
134
+ }
135
+ .dp-input:read-only {
136
+ cursor: pointer;
137
+ }
138
+ .dp-separator {
139
+ flex: none;
140
+ color: var(--dp-muted);
141
+ }
142
+
143
+ .dp-actions {
144
+ display: flex;
145
+ flex: none;
146
+ align-items: center;
147
+ gap: 2px;
148
+ color: var(--dp-muted);
149
+ }
150
+ .dp-icon-button {
151
+ display: inline-grid;
152
+ place-items: center;
153
+ width: 26px;
154
+ height: 26px;
155
+ padding: 0;
156
+ border: 0;
157
+ border-radius: 6px;
158
+ background: transparent;
159
+ color: inherit;
160
+ cursor: pointer;
161
+ }
162
+ .dp-icon-button:hover:not(:disabled) {
163
+ background: var(--dp-hover);
164
+ color: var(--dp-fg);
165
+ }
166
+ .dp-icon-button:focus-visible {
167
+ outline: 2px solid var(--dp-focus);
168
+ outline-offset: 1px;
169
+ }
170
+ .dp-icon-button:disabled {
171
+ opacity: 0.4;
172
+ cursor: default;
173
+ }
174
+
175
+ /* ------------------------------------------------------------- popover */
176
+
177
+ .dp-popover {
178
+ position: fixed;
179
+ inset: auto;
180
+ margin: 0;
181
+ padding: 0;
182
+ overflow: visible;
183
+ border: 1px solid var(--dp-border);
184
+ border-radius: var(--dp-radius);
185
+ background: var(--dp-bg);
186
+ color: var(--dp-fg);
187
+ box-shadow: var(--dp-shadow);
188
+ font-size: var(--dp-font-size);
189
+ }
190
+ .dp-panel-root {
191
+ display: flex;
192
+ align-items: stretch;
193
+ }
194
+
195
+ .dp-presets {
196
+ display: flex;
197
+ flex-direction: column;
198
+ gap: 2px;
199
+ padding: 8px;
200
+ border-inline-end: 1px solid var(--dp-border);
201
+ }
202
+ .dp-preset {
203
+ padding: 6px 10px;
204
+ border: 0;
205
+ border-radius: 6px;
206
+ background: transparent;
207
+ color: inherit;
208
+ font: inherit;
209
+ text-align: start;
210
+ white-space: nowrap;
211
+ cursor: pointer;
212
+ }
213
+ .dp-preset:hover {
214
+ background: var(--dp-hover);
215
+ }
216
+ .dp-preset:focus-visible {
217
+ outline: 2px solid var(--dp-focus);
218
+ outline-offset: -2px;
219
+ }
220
+
221
+ .dp-calendar {
222
+ display: flex;
223
+ flex-direction: column;
224
+ padding: 8px;
225
+ }
226
+
227
+ .dp-nav {
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: space-between;
231
+ gap: 4px;
232
+ padding-bottom: 4px;
233
+ }
234
+ /* "Previous" points the reading-back way in both directions. */
235
+ [dir="rtl"] .dp-nav-step svg {
236
+ transform: scaleX(-1);
237
+ }
238
+ .dp-nav-title {
239
+ display: inline-flex;
240
+ align-items: center;
241
+ gap: 4px;
242
+ padding: 4px 8px;
243
+ border: 0;
244
+ border-radius: 6px;
245
+ background: transparent;
246
+ color: inherit;
247
+ font: inherit;
248
+ font-weight: 600;
249
+ cursor: pointer;
250
+ }
251
+ .dp-nav-title:hover {
252
+ background: var(--dp-hover);
253
+ }
254
+ .dp-nav-title:focus-visible {
255
+ outline: 2px solid var(--dp-focus);
256
+ outline-offset: -2px;
257
+ }
258
+ .dp-nav-chevron {
259
+ color: var(--dp-muted);
260
+ transition: transform 120ms ease;
261
+ }
262
+ .dp-nav-title[aria-expanded="true"] .dp-nav-chevron {
263
+ transform: rotate(180deg);
264
+ }
265
+ @media (prefers-reduced-motion: reduce) {
266
+ .dp-nav-chevron {
267
+ transition: none;
268
+ }
269
+ }
270
+
271
+ /* ---------------------------------------------------------- month grid */
272
+
273
+ .dp-months {
274
+ display: flex;
275
+ gap: 16px;
276
+ }
277
+ .dp-month-caption {
278
+ padding-bottom: 4px;
279
+ color: var(--dp-muted);
280
+ font-weight: 600;
281
+ text-align: center;
282
+ }
283
+ .dp-grid {
284
+ border-collapse: collapse;
285
+ table-layout: fixed;
286
+ }
287
+ .dp-weekday,
288
+ .dp-week-number {
289
+ width: var(--dp-day-size);
290
+ padding: 4px 0;
291
+ color: var(--dp-muted);
292
+ font-size: 0.85em;
293
+ font-weight: 600;
294
+ text-align: center;
295
+ }
296
+ .dp-week-number {
297
+ width: 28px;
298
+ border-inline-end: 1px solid var(--dp-border);
299
+ font-weight: 400;
300
+ }
301
+ .dp-week-number abbr {
302
+ text-decoration: none;
303
+ }
304
+ .dp-cell {
305
+ padding: 1px 0;
306
+ }
307
+
308
+ .dp-day {
309
+ display: grid;
310
+ place-items: center;
311
+ width: var(--dp-day-size);
312
+ height: var(--dp-day-size);
313
+ padding: 0;
314
+ border: 0;
315
+ border-radius: 6px;
316
+ background: transparent;
317
+ color: inherit;
318
+ font: inherit;
319
+ font-variant-numeric: tabular-nums;
320
+ cursor: pointer;
321
+ }
322
+ .dp-day:hover:not(:disabled) {
323
+ background: var(--dp-hover);
324
+ }
325
+ .dp-day:focus-visible {
326
+ outline: 2px solid var(--dp-focus);
327
+ outline-offset: -2px;
328
+ }
329
+ .dp-day[data-outside] {
330
+ color: var(--dp-muted);
331
+ opacity: 0.6;
332
+ }
333
+ .dp-day[data-today] {
334
+ font-weight: 700;
335
+ box-shadow: inset 0 0 0 1px var(--dp-accent);
336
+ }
337
+ .dp-day[data-selected] {
338
+ background: var(--dp-accent);
339
+ color: var(--dp-accent-fg);
340
+ font-weight: 600;
341
+ }
342
+ .dp-day[data-selected]:hover {
343
+ background: var(--dp-accent);
344
+ }
345
+ .dp-day:disabled {
346
+ opacity: 0.35;
347
+ cursor: not-allowed;
348
+ }
349
+
350
+ /* The band spans the cell, so a range reads as one continuous stripe. */
351
+ .dp-cell[data-in-range] {
352
+ background: var(--dp-accent-soft);
353
+ }
354
+ .dp-cell[data-range-start] {
355
+ border-start-start-radius: 6px;
356
+ border-end-start-radius: 6px;
357
+ }
358
+ .dp-cell[data-range-end] {
359
+ border-start-end-radius: 6px;
360
+ border-end-end-radius: 6px;
361
+ }
362
+
363
+ /* --------------------------------------------------- month/year panels */
364
+
365
+ .dp-panel {
366
+ display: grid;
367
+ grid-template-columns: repeat(3, minmax(0, 1fr));
368
+ gap: 4px;
369
+ padding: 4px 0;
370
+ }
371
+ .dp-panel-item {
372
+ padding: 8px 6px;
373
+ border: 0;
374
+ border-radius: 6px;
375
+ background: transparent;
376
+ color: inherit;
377
+ font: inherit;
378
+ cursor: pointer;
379
+ }
380
+ .dp-panel-item:hover:not(:disabled) {
381
+ background: var(--dp-hover);
382
+ }
383
+ .dp-panel-item:focus-visible {
384
+ outline: 2px solid var(--dp-focus);
385
+ outline-offset: -2px;
386
+ }
387
+ .dp-panel-item[data-selected] {
388
+ background: var(--dp-accent);
389
+ color: var(--dp-accent-fg);
390
+ font-weight: 600;
391
+ }
392
+ .dp-panel-item:disabled {
393
+ opacity: 0.35;
394
+ cursor: not-allowed;
395
+ }
396
+
397
+ .dp-footer {
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: space-between;
401
+ gap: 8px;
402
+ margin-top: 4px;
403
+ padding-top: 6px;
404
+ border-top: 1px solid var(--dp-border);
405
+ }
406
+ .dp-link-button {
407
+ padding: 4px 6px;
408
+ border: 0;
409
+ border-radius: 4px;
410
+ background: none;
411
+ color: var(--dp-accent);
412
+ font: inherit;
413
+ cursor: pointer;
414
+ }
415
+ .dp-link-button:hover {
416
+ background: var(--dp-hover);
417
+ }
418
+ .dp-link-button:focus-visible {
419
+ outline: 2px solid var(--dp-focus);
420
+ outline-offset: -2px;
421
+ }
422
+
423
+ .dp-sr-only {
424
+ position: absolute;
425
+ width: 1px;
426
+ height: 1px;
427
+ margin: -1px;
428
+ padding: 0;
429
+ overflow: hidden;
430
+ clip-path: inset(50%);
431
+ white-space: nowrap;
432
+ border: 0;
433
+ }
434
+
435
+ @media (forced-colors: active) {
436
+ .dp-day[data-selected],
437
+ .dp-panel-item[data-selected] {
438
+ background: Highlight;
439
+ color: HighlightText;
440
+ }
441
+ .dp-cell[data-in-range] {
442
+ background: Highlight;
443
+ forced-color-adjust: none;
444
+ }
445
+ }