rip-lang 3.13.119 → 3.13.121

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 (71) hide show
  1. package/README.md +11 -2
  2. package/docs/RIP-LANG.md +4 -0
  3. package/docs/dist/rip.js +257 -27
  4. package/docs/dist/rip.min.js +183 -183
  5. package/docs/dist/rip.min.js.br +0 -0
  6. package/docs/ui/accordion.rip +103 -0
  7. package/docs/ui/alert-dialog.rip +53 -0
  8. package/docs/ui/autocomplete.rip +115 -0
  9. package/docs/ui/avatar.rip +37 -0
  10. package/docs/ui/badge.rip +15 -0
  11. package/docs/ui/breadcrumb.rip +47 -0
  12. package/docs/ui/button-group.rip +26 -0
  13. package/docs/ui/button.rip +23 -0
  14. package/docs/ui/card.rip +25 -0
  15. package/docs/ui/carousel.rip +110 -0
  16. package/docs/ui/checkbox-group.rip +61 -0
  17. package/docs/ui/checkbox.rip +33 -0
  18. package/docs/ui/collapsible.rip +50 -0
  19. package/docs/ui/combobox.rip +130 -0
  20. package/docs/ui/context-menu.rip +88 -0
  21. package/docs/ui/date-picker.rip +206 -0
  22. package/docs/ui/dialog.rip +60 -0
  23. package/docs/ui/drawer.rip +58 -0
  24. package/docs/ui/editable-value.rip +82 -0
  25. package/docs/ui/field.rip +53 -0
  26. package/docs/ui/fieldset.rip +22 -0
  27. package/docs/ui/form.rip +39 -0
  28. package/docs/ui/grid.rip +901 -0
  29. package/docs/ui/hljs-rip.js +209 -0
  30. package/docs/ui/index.css +1797 -0
  31. package/docs/ui/index.html +2385 -0
  32. package/docs/ui/input-group.rip +28 -0
  33. package/docs/ui/input.rip +36 -0
  34. package/docs/ui/label.rip +16 -0
  35. package/docs/ui/menu.rip +134 -0
  36. package/docs/ui/menubar.rip +151 -0
  37. package/docs/ui/meter.rip +36 -0
  38. package/docs/ui/multi-select.rip +203 -0
  39. package/docs/ui/native-select.rip +33 -0
  40. package/docs/ui/nav-menu.rip +126 -0
  41. package/docs/ui/number-field.rip +162 -0
  42. package/docs/ui/otp-field.rip +89 -0
  43. package/docs/ui/pagination.rip +123 -0
  44. package/docs/ui/popover.rip +93 -0
  45. package/docs/ui/preview-card.rip +75 -0
  46. package/docs/ui/progress.rip +25 -0
  47. package/docs/ui/radio-group.rip +57 -0
  48. package/docs/ui/resizable.rip +123 -0
  49. package/docs/ui/scroll-area.rip +145 -0
  50. package/docs/ui/select.rip +151 -0
  51. package/docs/ui/separator.rip +17 -0
  52. package/docs/ui/skeleton.rip +22 -0
  53. package/docs/ui/slider.rip +165 -0
  54. package/docs/ui/spinner.rip +17 -0
  55. package/docs/ui/table.rip +27 -0
  56. package/docs/ui/tabs.rip +113 -0
  57. package/docs/ui/textarea.rip +48 -0
  58. package/docs/ui/toast.rip +87 -0
  59. package/docs/ui/toggle-group.rip +71 -0
  60. package/docs/ui/toggle.rip +24 -0
  61. package/docs/ui/toolbar.rip +38 -0
  62. package/docs/ui/tooltip.rip +85 -0
  63. package/package.json +1 -1
  64. package/src/compiler.js +24 -12
  65. package/src/components.js +43 -6
  66. package/src/grammar/grammar.rip +2 -2
  67. package/src/lexer.js +26 -0
  68. package/src/parser.js +2 -2
  69. package/src/sourcemap-utils.js +91 -0
  70. package/src/typecheck.js +33 -8
  71. package/src/ui.rip +118 -2
@@ -0,0 +1,1797 @@
1
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
2
+ dialog { margin: auto; }
3
+
4
+ body {
5
+ font-family: 'Inter', system-ui, sans-serif;
6
+ font-size: 14px;
7
+ line-height: 1.5;
8
+ color: #18181b;
9
+ background: #fafafa;
10
+ }
11
+
12
+ button { font: inherit; cursor: pointer; }
13
+
14
+ .gallery {
15
+ max-width: 1120px;
16
+ margin: 0 auto;
17
+ padding: 40px 28px;
18
+
19
+ .gallery-header {
20
+ margin-bottom: 40px;
21
+
22
+ > div:first-child { display: flex; align-items: center; justify-content: space-between; }
23
+ h1 { font-size: 28px; font-weight: 700; letter-spacing: -0.03em; }
24
+ p { color: #52525b; margin-top: 4px; }
25
+ }
26
+ }
27
+
28
+ .theme-toggle {
29
+ width: 36px; height: 36px; border: 1px solid #e4e4e7; border-radius: 12px;
30
+ background: white; font-size: 18px; display: grid; place-items: center;
31
+ cursor: pointer; color: #52525b; line-height: 1;
32
+ }
33
+
34
+ .section {
35
+ margin-bottom: 56px;
36
+
37
+ .section-title {
38
+ font-size: 16px; font-weight: 700; letter-spacing: -0.01em;
39
+ padding-bottom: 8px; margin-bottom: 16px;
40
+ border-bottom: 1px solid #e4e4e7;
41
+ display: flex; align-items: center; gap: 8px;
42
+ }
43
+
44
+ .section-desc { color: #52525b; font-size: 13px; margin-bottom: 16px; }
45
+
46
+ .section-nav {
47
+ margin-left: auto; display: flex; gap: 2px;
48
+
49
+ a {
50
+ font-size: 13px; color: #c0c8d4; cursor: pointer;
51
+ width: 26px; height: 26px; display: grid; place-items: center;
52
+ border-radius: 4px; text-decoration: none;
53
+ transition: color 0.12s, background 0.12s;
54
+
55
+ &:hover { color: #18181b; background: #fafafa; }
56
+ }
57
+ }
58
+ }
59
+
60
+ .badge {
61
+ font-size: 11px; font-weight: 600; padding: 3px 10px;
62
+ border-radius: 12px; background: #f4f4f5; color: #18181b;
63
+ border: 1px solid #a1a1aa;
64
+ cursor: pointer; transition: background 0.15s, color 0.15s, border-color 0.15s;
65
+
66
+ &:hover { background: #e4e4e7; color: #27272a; border-color: #71717a; }
67
+ }
68
+
69
+ .demo-row {
70
+ padding: 16px; margin-bottom: 12px;
71
+ background: white; border: 1px solid #e4e4e7; border-radius: 12px;
72
+ }
73
+
74
+ .demo-label {
75
+ font-size: 11px; font-weight: 600; letter-spacing: 0.08em;
76
+ text-transform: uppercase; color: #71717a; margin-bottom: 8px;
77
+ }
78
+
79
+ .demo-btn {
80
+ padding: 6px 16px; border: 1px solid #d4d4d8; border-radius: 12px;
81
+ background: white; font-size: 14px; color: #18181b; outline: none; cursor: pointer;
82
+ user-select: none; transition: transform 0.1s, background 0.1s;
83
+
84
+ &:hover { background: #fafafa; border-color: #71717a; }
85
+ &:active { background: #f5f5f5; transform: scale(0.97); }
86
+ }
87
+
88
+ .status {
89
+ margin-top: 8px; padding: 8px 12px; border-radius: 12px;
90
+ font-size: 12px; font-family: monospace;
91
+ background: #f5f5f5; color: #3f3f46;
92
+ }
93
+
94
+ /* ── Select ── */
95
+
96
+ .gallery button[role="combobox"] {
97
+ display: inline-flex; align-items: center; justify-content: space-between;
98
+ gap: 8px; padding: 6px 12px; height: 36px;
99
+ border: 1px solid #d4d4d8; border-radius: 12px; background: white;
100
+ cursor: pointer; min-width: 200px; font-size: 14px; color: #18181b; outline: none;
101
+
102
+ &::after {
103
+ content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
104
+ display: inline-block; line-height: 0;
105
+ }
106
+
107
+ &[data-open] {
108
+ border-color: #71717a;
109
+ &::after {
110
+ content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23475569' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
111
+ }
112
+ }
113
+
114
+ &[data-placeholder] { color: #71717a; }
115
+ &[data-disabled] { opacity: 0.5; cursor: not-allowed; }
116
+ }
117
+
118
+ .gallery div[role="listbox"] {
119
+ background: white; border: 1px solid #d4d4d8; border-radius: 12px;
120
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
121
+ overflow-y: auto; max-height: 280px; min-width: 200px;
122
+ overscroll-behavior: contain;
123
+ }
124
+
125
+ .gallery div[role="option"] {
126
+ padding: 8px 12px; border-radius: 4px; cursor: pointer;
127
+ font-size: 14px; outline: none; color: #18181b;
128
+
129
+ &[data-highlighted] { background: #fafafa; }
130
+ &[data-selected] { font-weight: 600; color: #18181b; }
131
+ }
132
+
133
+ /* ── Combobox clear button ── */
134
+
135
+ .gallery [data-clear] {
136
+ position: absolute;
137
+ right: 8px;
138
+ background: none;
139
+ border: none;
140
+ color: #71717a;
141
+ cursor: pointer;
142
+ font-size: 14px;
143
+ padding: 2px 4px;
144
+ border-radius: 4px;
145
+ line-height: 1;
146
+
147
+ &:hover { color: #3f3f46; background: #f5f5f5; }
148
+ }
149
+
150
+ /* ── Combobox / Menu popups ── */
151
+
152
+ .gallery .combobox-popup,
153
+ .gallery .menu-popup {
154
+ background: white; border: 1px solid #d4d4d8; border-radius: 12px;
155
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
156
+ overflow-y: auto; max-height: 280px;
157
+ overscroll-behavior: contain;
158
+ }
159
+
160
+ .gallery .option,
161
+ .gallery [role="menuitem"] {
162
+ padding: 8px 12px; border-radius: 4px; cursor: pointer;
163
+ font-size: 14px; outline: none;
164
+
165
+ &[data-highlighted] { background: #fafafa; }
166
+ }
167
+
168
+ .gallery .option[data-selected] { font-weight: 600; color: #18181b; }
169
+
170
+ /* ── Combobox / Text inputs ── */
171
+
172
+ .gallery .combobox-input,
173
+ .gallery input[type="text"]:not(.rip-grid-editor),
174
+ .gallery input[type="email"],
175
+ .gallery input[type="password"] {
176
+ width: 100%; height: 36px; padding: 0 12px;
177
+ border: 1px solid #d4d4d8; border-radius: 12px; font-size: 14px;
178
+ color: #18181b; background: white; outline: none;
179
+
180
+ &:focus { border-color: #18181b; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }
181
+ }
182
+
183
+ /* ── Dialog ── */
184
+
185
+ .gallery dialog[data-open]:not([data-side]) {
186
+ border: none;
187
+ padding: 0;
188
+ background: transparent;
189
+ max-width: min(90vw, 420px);
190
+ width: 100%;
191
+ }
192
+
193
+ .gallery dialog[data-open]:not([data-side])::backdrop {
194
+ background: rgba(0,0,0,0.4);
195
+ animation: fadeIn 150ms ease;
196
+ }
197
+
198
+ .gallery .dialog-panel {
199
+ background: white; border-radius: 12px; padding: 24px;
200
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); max-width: min(90vw, 420px); width: 100%;
201
+ }
202
+
203
+ /* ── Toast ── */
204
+
205
+ .gallery .toast-wrap {
206
+ position: fixed; top: 16px; right: 16px; z-index: 200;
207
+ }
208
+
209
+ .gallery .toast-wrap [role="region"] {
210
+ display: flex; flex-direction: column; gap: 12px;
211
+ }
212
+
213
+ .gallery .toast-wrap [role="status"],
214
+ .gallery .toast-wrap [role="alert"] {
215
+ padding: 12px 14px; border-radius: 12px; background: white;
216
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); display: flex; align-items: center; gap: 8px;
217
+ animation: slideIn 200ms ease; max-width: 220px; border-left: 3px solid #18181b; font-size: 13px; line-height: 1.4;
218
+
219
+ &[data-type="success"] { border-left-color: #16a34a; }
220
+ &[data-type="error"] { border-left-color: #dc2626; }
221
+ &[data-leaving] { animation: fadeOut 200ms ease forwards; }
222
+
223
+ span { font-size: 13px; }
224
+
225
+ button {
226
+ background: none; border: none; color: #71717a; cursor: pointer;
227
+ font-size: 14px; padding: 2px 4px; border-radius: 4px; line-height: 1; flex-shrink: 0;
228
+
229
+ &:hover { color: #3f3f46; background: #f5f5f5; }
230
+ }
231
+ }
232
+
233
+ /* ── Tooltip ── */
234
+
235
+ .gallery [role="tooltip"] {
236
+ background: #1e293b; color: white; font-size: 12px;
237
+ padding: 4px 8px; border-radius: 4px;
238
+
239
+ &[data-entering] { animation: fadeIn 100ms ease; }
240
+ }
241
+
242
+ /* ── Tabs ── */
243
+
244
+ .gallery [role="tablist"] {
245
+ display: flex; gap: 4px; border-bottom: 1px solid #e4e4e7; margin-bottom: 12px;
246
+ }
247
+
248
+ .gallery [role="tab"] {
249
+ padding: 8px 16px; border: none; background: none;
250
+ font-size: 14px; font-weight: 500; color: #52525b; cursor: pointer;
251
+ border-bottom: 2px solid transparent; margin-bottom: -1px;
252
+
253
+ &[data-active] { color: #18181b; border-bottom-color: #18181b; }
254
+ }
255
+
256
+ /* ── Checkbox / Switch ── */
257
+
258
+ .gallery [role="checkbox"],
259
+ .gallery [role="switch"] {
260
+ display: inline-flex; align-items: center; gap: 8px;
261
+ padding: 6px 12px; border: 1px solid #d4d4d8; border-radius: 12px;
262
+ background: white; cursor: pointer; font-size: 14px;
263
+
264
+ &[data-checked] { background: #fafafa; border-color: #18181b; color: #18181b; }
265
+ }
266
+
267
+ /* ── Menu ── */
268
+
269
+ .gallery [aria-haspopup="menu"] {
270
+ padding: 6px 16px; height: 36px; border: 1px solid #d4d4d8;
271
+ border-radius: 12px; background: white; font-size: 14px;
272
+
273
+ &[data-open] { border-color: #18181b; }
274
+ }
275
+
276
+ .gallery [role="menu"] {
277
+ background: white; border: 1px solid #d4d4d8; border-radius: 12px;
278
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
279
+ overflow-y: auto; max-height: 280px; min-width: 160px;
280
+ overscroll-behavior: contain;
281
+ }
282
+
283
+ /* ── Drawer ── */
284
+
285
+ .gallery dialog[data-open][data-side] {
286
+ border: none;
287
+ padding: 0;
288
+ margin: 0;
289
+ background: transparent;
290
+ position: fixed;
291
+ inset: 0;
292
+ max-width: none;
293
+ max-height: none;
294
+ width: 100%;
295
+ height: 100%;
296
+ }
297
+
298
+ .gallery dialog[data-open][data-side]::backdrop {
299
+ background: rgba(0,0,0,0.4);
300
+ animation: fadeIn 150ms ease;
301
+ }
302
+
303
+ .gallery .drawer-panel {
304
+ position: fixed; top: 0; bottom: 0; width: min(85vw, 360px);
305
+ background: white; padding: 24px; box-shadow: -4px 0 16px rgba(0,0,0,0.12);
306
+ animation: slideInRight 200ms ease;
307
+ overflow-y: auto;
308
+
309
+ h2 { font-size: 18px; font-weight: 700; margin-bottom: 8px; }
310
+ p { color: #52525b; font-size: 14px; margin-bottom: 12px; }
311
+
312
+ button {
313
+ margin-top: 12px;
314
+ padding: 8px 20px;
315
+ border: 1px solid #d4d4d8;
316
+ border-radius: 12px;
317
+ background: white;
318
+ font-size: 14px;
319
+ font-weight: 500;
320
+ color: #18181b;
321
+ cursor: pointer;
322
+
323
+ &:hover { background: #fafafa; border-color: #71717a; }
324
+ &:active { background: #f5f5f5; }
325
+ }
326
+ }
327
+
328
+ [data-side="right"] .drawer-panel { right: 0; }
329
+ [data-side="left"] .drawer-panel { left: 0; animation-name: slideInLeft; }
330
+
331
+ @keyframes slideInRight { from { transform: translateX(100%); } to { transform: none; } }
332
+ @keyframes slideInLeft { from { transform: translateX(-100%); } to { transform: none; } }
333
+
334
+ /* ── Scroll Area ── */
335
+
336
+ .scroll-demo {
337
+ [data-orientation] {
338
+ position: relative;
339
+ max-height: 200px;
340
+ border: 1px solid #e4e4e7;
341
+ border-radius: 12px;
342
+ }
343
+
344
+ [data-viewport] {
345
+ max-height: inherit;
346
+ padding: 8px 12px;
347
+ &::-webkit-scrollbar { display: none; }
348
+ }
349
+
350
+ [data-scrollbar] {
351
+ position: absolute;
352
+ top: 2px;
353
+ bottom: 2px;
354
+ right: 2px;
355
+ width: 8px;
356
+ opacity: 0;
357
+ transition: opacity 200ms ease;
358
+ z-index: 1;
359
+ }
360
+
361
+ [data-orientation]:hover [data-scrollbar],
362
+ [data-scrolling] [data-scrollbar],
363
+ [data-dragging] [data-scrollbar] { opacity: 1; }
364
+
365
+ [data-thumb] {
366
+ width: 100%;
367
+ background: rgba(0,0,0,0.3);
368
+ border-radius: 4px;
369
+ cursor: grab;
370
+ transition: background 150ms ease;
371
+
372
+ &:hover { background: rgba(0,0,0,0.5); }
373
+ &:active { background: rgba(0,0,0,0.6); }
374
+ }
375
+ }
376
+
377
+ /* ── Number Field ── */
378
+
379
+ .gallery .nf-wrap [role="group"] {
380
+ display: inline-flex;
381
+ align-items: center;
382
+ border: 1px solid #d4d4d8;
383
+ border-radius: 12px;
384
+ overflow: hidden;
385
+
386
+ input {
387
+ width: 80px; height: 36px; text-align: center;
388
+ border: none; outline: none; font-size: 14px;
389
+ color: #18181b; background: white;
390
+
391
+ &:focus { outline: none; box-shadow: none; border-color: transparent; }
392
+ }
393
+
394
+ button {
395
+ width: 36px; height: 36px; border: none; outline: none;
396
+ background: #fafafa; color: #3f3f46; font-size: 16px;
397
+ cursor: pointer; display: grid; place-items: center;
398
+ user-select: none;
399
+
400
+ &:hover:not(:disabled) { background: #e4e4e7; }
401
+ &:active:not(:disabled) { background: #d4d4d8; }
402
+ &:disabled { opacity: 0.3; cursor: not-allowed; }
403
+ }
404
+
405
+ [data-decrement] { border-right: 1px solid #e4e4e7; }
406
+ [data-decrement]::before { content: "−"; }
407
+ [data-increment] { border-left: 1px solid #e4e4e7; }
408
+ [data-increment]::before { content: "+"; }
409
+
410
+ &[data-disabled] { opacity: 0.5; pointer-events: none; }
411
+ }
412
+
413
+ /* ── Slider ── */
414
+
415
+ .gallery .slider-wrap {
416
+ padding: 12px 0;
417
+ touch-action: none;
418
+
419
+ [data-track] {
420
+ position: relative;
421
+ height: 6px;
422
+ background: #e4e4e7;
423
+ border-radius: 3px;
424
+ cursor: pointer;
425
+ }
426
+
427
+ [data-indicator] {
428
+ height: 100%;
429
+ background: #18181b;
430
+ border-radius: 3px;
431
+ pointer-events: none;
432
+ }
433
+
434
+ [data-thumb] {
435
+ width: 20px;
436
+ height: 20px;
437
+ background: white;
438
+ border: 2px solid #18181b;
439
+ border-radius: 50%;
440
+ transform: translate(-50%, -50%);
441
+ top: 50%;
442
+ cursor: grab;
443
+ transition: box-shadow 150ms ease;
444
+
445
+ &:hover { box-shadow: 0 0 0 4px rgba(59,130,246,0.15); }
446
+ &[data-active] { cursor: grabbing; box-shadow: 0 0 0 4px rgba(59,130,246,0.25); }
447
+ }
448
+
449
+ &[data-disabled] {
450
+ opacity: 0.5;
451
+ pointer-events: none;
452
+ }
453
+ }
454
+
455
+ /* ── Separator ── */
456
+
457
+ .gallery [role="none"][data-orientation="horizontal"],
458
+ .gallery [role="separator"][data-orientation="horizontal"] {
459
+ border: none; border-top: 1px solid #d4d4d8; margin: 8px 0; width: 100%;
460
+ }
461
+
462
+ .gallery [role="none"][data-orientation="vertical"],
463
+ .gallery [role="separator"][data-orientation="vertical"] {
464
+ border: none; border-left: 1px solid #d4d4d8; margin: 0;
465
+ align-self: stretch; width: 0; min-height: 20px;
466
+ }
467
+
468
+ /* ── Button ── */
469
+
470
+ .gallery .btn-demo .btn-row {
471
+ display: flex; align-items: center; gap: 8px;
472
+ }
473
+
474
+ .gallery .btn-demo button {
475
+ padding: 8px 16px; border: 1px solid #d4d4d8; border-radius: 12px;
476
+ background: white; font-size: 14px; font-weight: 500; color: #18181b;
477
+ cursor: pointer; user-select: none; transition: all 150ms ease;
478
+
479
+ &:hover:not([data-disabled]) { background: #fafafa; border-color: #71717a; }
480
+ &:active:not([data-disabled]) { background: #f5f5f5; transform: scale(0.98); }
481
+ &[data-disabled] { opacity: 0.5; cursor: not-allowed; }
482
+ }
483
+
484
+ /* ── Toggle ── */
485
+
486
+ .gallery .toggle-heart {
487
+ button {
488
+ width: 48px; height: 48px; border: 1px solid #e4e4e7; border-radius: 12px;
489
+ background: white; cursor: pointer; display: grid; place-items: center;
490
+ transition: all 150ms ease;
491
+
492
+ &:hover { background: #fef2f2; border-color: #fca5a5; }
493
+ }
494
+
495
+ .heart {
496
+ font-size: 24px; color: #d4d4d8; transition: all 150ms ease; line-height: 1;
497
+ }
498
+
499
+ [aria-pressed="true"] {
500
+ background: #fef2f2; border-color: #f87171;
501
+
502
+ .heart { color: #ef4444; }
503
+ }
504
+ }
505
+
506
+ /* ── Progress ── */
507
+
508
+ .progress-track {
509
+ width: 200px; height: 8px; background: #e4e4e7; border-radius: 4px; overflow: hidden;
510
+ }
511
+
512
+ .progress-fill {
513
+ height: 100%; background: #18181b; border-radius: 4px; transition: width 300ms;
514
+ }
515
+
516
+ /* ── Meter ── */
517
+
518
+ .gallery [role="meter"] {
519
+ width: 200px; height: 8px; background: #e4e4e7; border-radius: 4px;
520
+
521
+ &[data-level="low"] { background: linear-gradient(90deg, #ef4444 var(--meter-percent), #e4e4e7 var(--meter-percent)); border-radius: 4px; }
522
+ &[data-level="optimum"] { background: linear-gradient(90deg, #22c55e var(--meter-percent), #e4e4e7 var(--meter-percent)); border-radius: 4px; }
523
+ &[data-level="high"] { background: linear-gradient(90deg, #f59e0b var(--meter-percent), #e4e4e7 var(--meter-percent)); border-radius: 4px; }
524
+ }
525
+
526
+ /* ── Grid ── */
527
+
528
+ .grid-container {
529
+ position: relative; overflow: auto; height: 420px;
530
+ background: white; border-radius: 12px;
531
+ box-shadow: 0 1px 3px rgba(0,0,0,0.08);
532
+
533
+ &:focus { outline: none; }
534
+ &:not([data-selecting]) .rip-grid tbody tr:hover td { background: rgba(59,130,246,0.06); }
535
+ }
536
+
537
+ .rip-grid {
538
+ width: 100%; border-collapse: collapse; table-layout: fixed;
539
+ font-family: system-ui, -apple-system, sans-serif; font-size: 13px; color: #18181b;
540
+
541
+ thead th {
542
+ position: sticky; top: 0; z-index: 2; height: 36px; padding: 0 10px;
543
+ background: #fafafa; color: #3f3f46; font-weight: 600; font-size: 11px;
544
+ text-transform: uppercase; letter-spacing: 0.5px;
545
+ border-bottom: 1px solid #e4e4e7; white-space: nowrap; user-select: none;
546
+ }
547
+
548
+ thead tr:hover .resize-handle { background: rgba(0,0,0,0.08); }
549
+
550
+ tbody td {
551
+ height: 32px; padding: 0 10px;
552
+ border-bottom: 1px solid #e4e4e7; white-space: nowrap;
553
+ overflow: hidden; text-overflow: ellipsis; cursor: default; user-select: none;
554
+
555
+ &[data-selected] { background: rgba(59,130,246,0.08); }
556
+ &[data-active] { background: rgba(59,130,246,0.20); outline: 2px solid #18181b; outline-offset: -2px; position: relative; z-index: 1; }
557
+ }
558
+
559
+ tbody tr.even td { background: #fafafa; }
560
+ tbody tr.even td[data-selected] { background: rgba(59,130,246,0.12); }
561
+ tbody tr.spacer td { padding: 0; border: none; line-height: 0; font-size: 0; }
562
+ }
563
+
564
+ .grid-cell-ref {
565
+ font-size: 11px; font-family: 'SF Mono', ui-monospace, monospace;
566
+ color: #52525b; font-weight: 500;
567
+ }
568
+
569
+ .sort-arrow { color: #71717a; font-size: 11px; margin-left: 3px; }
570
+
571
+ .sort-badge {
572
+ display: inline-block; font-size: 9px; color: #52525b; background: #e4e4e7;
573
+ border-radius: 50%; width: 14px; height: 14px; line-height: 14px;
574
+ text-align: center; margin-left: 2px;
575
+ }
576
+
577
+ .resize-handle {
578
+ position: absolute; right: 0; top: 0; bottom: 0; width: 2px;
579
+ cursor: col-resize; z-index: 3; background: transparent;
580
+
581
+ &:hover, &.active { background: rgba(59,130,246,0.3); }
582
+ }
583
+
584
+ .rip-grid-editor {
585
+ position: absolute; z-index: 10; box-sizing: border-box;
586
+ border: 2px solid #18181b; border-radius: 0;
587
+ font-family: system-ui, -apple-system, sans-serif; font-size: 13px;
588
+ padding: 0 8px; outline: none; background: white; color: #18181b;
589
+ }
590
+
591
+ select.rip-grid-editor { cursor: pointer; padding-left: 4px; }
592
+
593
+ .cell-checkbox { pointer-events: none; margin: 0; vertical-align: middle; }
594
+
595
+ /* ── OTP Field ── */
596
+
597
+ .gallery [role="group"][aria-label="One-time password"] {
598
+ display: inline-flex; gap: 6px;
599
+
600
+ input {
601
+ width: 40px; height: 44px; text-align: center; font-size: 18px; font-weight: 600;
602
+ border: 1px solid #d4d4d8; border-radius: 12px; background: white; color: #18181b;
603
+
604
+ &:focus { border-color: #18181b; box-shadow: 0 0 0 2px rgba(59,130,246,0.15); outline: none; }
605
+ &[data-filled] { border-color: #18181b; }
606
+ }
607
+
608
+ &[data-complete] input { border-color: #22c55e; background: #f0fdf4; }
609
+ &[data-disabled] input { opacity: 0.5; cursor: not-allowed; }
610
+ }
611
+
612
+ /* ── MultiSelect ── */
613
+
614
+ .gallery [data-chips] {
615
+ display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
616
+ padding: 4px 8px; border: 1px solid #d4d4d8; border-radius: 12px;
617
+ background: white; min-height: 38px; cursor: text;
618
+
619
+ &:focus-within { border-color: #18181b; box-shadow: 0 0 0 2px rgba(59,130,246,0.15); }
620
+
621
+ input {
622
+ border: none; outline: none; font: inherit; min-width: 80px;
623
+ flex: 1; padding: 4px 0; background: transparent;
624
+ }
625
+ }
626
+
627
+ .gallery [data-chip] {
628
+ display: inline-flex; align-items: center; gap: 4px;
629
+ padding: 2px 8px; background: #fafafa; color: #18181b;
630
+ border-radius: 4px; font-size: 12px; font-weight: 500;
631
+
632
+ [data-remove] {
633
+ border: none; background: none; color: #18181b; cursor: pointer;
634
+ font-size: 11px; padding: 0 2px; line-height: 1; border-radius: 2px;
635
+
636
+ &:hover { background: #f4f4f5; }
637
+ }
638
+ }
639
+
640
+ /* ── EditableValue ── */
641
+
642
+ .gallery [data-editing] { position: relative; }
643
+
644
+ .gallery [data-edit-trigger] {
645
+ border: none; background: none; color: #71717a; cursor: pointer;
646
+ font-size: 14px; padding: 2px 6px; border-radius: 4px; margin-left: 4px;
647
+
648
+ &:hover { color: #18181b; background: #f5f5f5; }
649
+ }
650
+
651
+ .gallery [data-editor][data-open] {
652
+ background: white; border: 1px solid #d4d4d8; border-radius: 12px;
653
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 12px;
654
+ min-width: 200px; animation: fadeIn 0.15s ease;
655
+
656
+ input { width: 100%; padding: 6px 10px; border: 1px solid #d4d4d8; border-radius: 4px; font: inherit; }
657
+ }
658
+
659
+ /* ── DatePicker ── */
660
+
661
+ .gallery [data-calendar] {
662
+ background: white; border: 1px solid #d4d4d8; border-radius: 12px;
663
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 12px;
664
+ min-width: 260px;
665
+ }
666
+
667
+ .gallery [data-header] {
668
+ display: flex; align-items: center; justify-content: space-between;
669
+ margin-bottom: 8px;
670
+
671
+ [data-prev], [data-next] {
672
+ border: none; background: none; cursor: pointer; font-size: 18px;
673
+ color: #3f3f46; width: 28px; height: 28px; border-radius: 4px;
674
+ display: flex; align-items: center; justify-content: center;
675
+
676
+ &:hover { background: #f5f5f5; }
677
+ }
678
+
679
+ [data-month-label] { font-weight: 600; font-size: 14px; color: #18181b; }
680
+ }
681
+
682
+ .gallery [data-weekdays] {
683
+ display: grid; grid-template-columns: repeat(7, 1fr);
684
+ text-align: center; margin-bottom: 4px;
685
+
686
+ [data-weekday] { font-size: 11px; font-weight: 600; color: #71717a; padding: 4px; }
687
+ }
688
+
689
+ .gallery [data-days] {
690
+ display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px;
691
+
692
+ button {
693
+ border: none; background: none; cursor: pointer; font-size: 13px;
694
+ padding: 6px; border-radius: 4px; color: #18181b; text-align: center;
695
+ min-width: 32px; min-height: 32px;
696
+
697
+ &:hover { background: #f5f5f5; }
698
+ &:active:not([data-selected]) { background: #f4f4f5; color: #18181b; }
699
+ &[data-outside] { color: #d4d4d8; }
700
+ &[data-today] { font-weight: 700; outline: 2px solid #18181b; outline-offset: -2px; }
701
+ &[data-selected] { background: #18181b; color: white; }
702
+ &[data-in-range] { background: #f4f4f5; color: #27272a; border-radius: 0; }
703
+ &[data-range-start] { border-radius: 4px 0 0 4px; }
704
+ }
705
+ }
706
+
707
+ .gallery [data-trigger]:has(+ [data-calendar]),
708
+ .gallery [data-trigger][aria-haspopup] {
709
+ padding: 8px 14px; border: 1px solid #d4d4d8; border-radius: 12px;
710
+ background: white; cursor: pointer; font-size: 14px; color: #18181b;
711
+ min-width: 180px; min-height: 38px;
712
+
713
+ &:hover { border-color: #71717a; }
714
+ &[aria-expanded="true"] { border-color: #18181b; }
715
+ }
716
+
717
+ /* ── Field ── */
718
+
719
+ .gallery [data-label] {
720
+ display: block; font-size: 13px; font-weight: 600; color: #334155; margin-bottom: 4px;
721
+
722
+ [data-required] { color: #ef4444; }
723
+ }
724
+
725
+ .gallery [data-description] {
726
+ font-size: 12px; color: #52525b; margin-top: 4px;
727
+ }
728
+
729
+ .gallery [data-error] {
730
+ font-size: 12px; color: #ef4444; margin-top: 4px;
731
+ }
732
+
733
+ .gallery [data-invalid] input { border-color: #ef4444; }
734
+
735
+ /* ── Fieldset ── */
736
+
737
+ .gallery fieldset {
738
+ border: 1px solid #e4e4e7; border-radius: 12px; padding: 16px;
739
+ display: flex; flex-direction: column; gap: 12px;
740
+
741
+ legend[data-legend] {
742
+ font-size: 14px; font-weight: 600; color: #18181b; padding: 0 4px;
743
+ }
744
+ }
745
+
746
+ /* ── Form ── */
747
+
748
+ .gallery form {
749
+ display: flex; flex-direction: column; gap: 12px;
750
+
751
+ button[type="submit"] {
752
+ align-self: flex-start; padding: 8px 20px; background: #18181b;
753
+ color: white; border: none; border-radius: 12px; font-size: 14px;
754
+ cursor: pointer; user-select: none; transition: background 0.15s, transform 0.1s;
755
+
756
+ &:hover { background: #27272a; }
757
+ &:active { transform: scale(0.97); }
758
+ &:focus-visible { outline: 2px solid #18181b; outline-offset: 2px; }
759
+ }
760
+
761
+ &[data-submitting] button[type="submit"] { opacity: 0.6; cursor: wait; }
762
+ }
763
+
764
+ /* ── PreviewCard ── */
765
+
766
+ .gallery [data-content][data-open] {
767
+ animation: fadeIn 0.15s ease;
768
+ }
769
+
770
+ /* ── Menubar ── */
771
+
772
+ .gallery [role="menubar"] {
773
+ display: inline-flex; gap: 2px; background: #fafafa;
774
+ border: 1px solid #e4e4e7; border-radius: 12px; padding: 4px;
775
+
776
+ [data-menu-trigger] {
777
+ padding: 8px 16px; border: none; background: transparent;
778
+ cursor: pointer; font-size: 14px; color: #3f3f46; border-radius: 12px;
779
+ transition: all 0.15s;
780
+
781
+ &:hover, &[data-open] { background: white; color: #18181b; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
782
+ &:focus-visible { outline: 2px solid #18181b; outline-offset: -2px; }
783
+ }
784
+
785
+ [role="menu"] {
786
+ background: white; border: 1px solid #d4d4d8; border-radius: 12px;
787
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
788
+ min-width: 140px; z-index: 50;
789
+ }
790
+ }
791
+
792
+ /* ── NavigationMenu ── */
793
+
794
+ .gallery nav[role="navigation"] {
795
+ display: inline-flex; align-items: center; gap: 2px;
796
+ padding: 4px; background: #f5f5f5; border-radius: 12px;
797
+ }
798
+
799
+ .gallery nav[role="navigation"] > a,
800
+ .gallery nav[role="navigation"] > div > button {
801
+ appearance: none; padding: 6px 14px; border: none; background: transparent;
802
+ cursor: pointer; font: inherit; font-size: 13px; font-weight: 500;
803
+ color: #3f3f46; border-radius: 5px; text-decoration: none;
804
+ user-select: none; transition: all 0.1s; outline: none;
805
+ }
806
+
807
+ .gallery nav[role="navigation"] > a:hover,
808
+ .gallery nav[role="navigation"] > div > button:hover,
809
+ .gallery nav[role="navigation"] > div > button[data-open] {
810
+ background: white; color: #18181b; box-shadow: 0 1px 3px rgba(0,0,0,0.08);
811
+ }
812
+
813
+ .gallery nav[role="navigation"] > a:active,
814
+ .gallery nav[role="navigation"] > div > button:active { transform: scale(0.96); }
815
+
816
+ .gallery nav[role="navigation"] > div > button {
817
+ display: flex; align-items: center; gap: 4px;
818
+ }
819
+
820
+ .gallery nav[role="navigation"] > div > button::after {
821
+ content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
822
+ display: inline-block; line-height: 0; transition: transform 0.2s ease;
823
+ }
824
+
825
+ .gallery nav[role="navigation"] > div > button[data-open]::after { transform: rotate(180deg); }
826
+
827
+ .gallery nav[role="navigation"] [data-nav-panel] {
828
+ background: white; border: 1px solid #e4e4e7; border-radius: 12px;
829
+ box-shadow: 0 8px 24px rgba(0,0,0,0.1); padding: 6px;
830
+ min-width: 180px; z-index: 50;
831
+ }
832
+
833
+ .gallery nav[role="navigation"] [data-nav-panel] a {
834
+ display: block; padding: 8px 12px; color: #3f3f46; text-decoration: none;
835
+ border-radius: 12px; font-size: 13px; transition: background 0.1s;
836
+ }
837
+
838
+ .gallery nav[role="navigation"] [data-nav-panel] a:hover {
839
+ background: #f5f5f5; color: #18181b;
840
+ }
841
+
842
+ /* ── ToggleGroup ── */
843
+
844
+ .gallery [role="group"][data-orientation]:has(button[aria-pressed]) {
845
+ display: inline-flex; gap: 0;
846
+
847
+ &[data-orientation="horizontal"] { flex-direction: row; }
848
+ &[data-orientation="vertical"] { flex-direction: column; }
849
+
850
+ button[aria-pressed] {
851
+ padding: 6px 14px; border: 1px solid #d4d4d8; background: white;
852
+ cursor: pointer; font-size: 13px; color: #71717a; transition: all 0.15s;
853
+ user-select: none;
854
+
855
+ &:first-of-type { border-radius: 6px 0 0 6px; }
856
+ &:last-of-type { border-radius: 0 6px 6px 0; }
857
+ &:not(:first-of-type) { margin-left: -1px; }
858
+ &[data-pressed="true"] { background: #18181b; color: white; border-color: #18181b; z-index: 1; }
859
+ &:hover:not([data-pressed="true"]) { background: #fafafa; color: #3f3f46; }
860
+ &:active { transform: scale(0.97); }
861
+ &:focus-visible { outline: 2px solid #18181b; outline-offset: -2px; z-index: 2; }
862
+ }
863
+ }
864
+
865
+ /* ── RadioGroup ── */
866
+
867
+ .gallery [role="radiogroup"] {
868
+ display: inline-flex; gap: 4px;
869
+
870
+ &[data-orientation="horizontal"] { flex-direction: row; }
871
+ &[data-orientation="vertical"] { flex-direction: column; }
872
+
873
+ [role="radio"] {
874
+ display: flex; align-items: center; gap: 8px;
875
+ padding: 6px 14px; border: 1px solid #d4d4d8; border-radius: 12px;
876
+ background: white; cursor: pointer; font-size: 13px; color: #3f3f46; transition: all 0.15s;
877
+
878
+ &[data-checked] { background: #fafafa; color: #18181b; border-color: #18181b; }
879
+ &:hover:not([data-checked]) { background: #fafafa; }
880
+ &:focus-visible { outline: 2px solid #18181b; outline-offset: 2px; }
881
+ }
882
+ }
883
+
884
+ /* ── CheckboxGroup ── */
885
+
886
+ .gallery [role="group"][aria-label] {
887
+ display: inline-flex; gap: 4px;
888
+
889
+ &[data-orientation="horizontal"] { flex-direction: row; }
890
+ &[data-orientation="vertical"] { flex-direction: column; }
891
+
892
+ [role="checkbox"] {
893
+ display: flex; align-items: center; gap: 8px;
894
+ padding: 6px 14px; border: 1px solid #d4d4d8; border-radius: 12px;
895
+ background: white; cursor: pointer; font-size: 13px; color: #3f3f46; transition: all 0.15s;
896
+
897
+ &[data-checked] { background: #fafafa; color: #18181b; border-color: #18181b; }
898
+ &:hover:not([data-checked]) { background: #fafafa; }
899
+ &:focus-visible { outline: 2px solid #18181b; outline-offset: 2px; }
900
+ }
901
+ }
902
+
903
+ /* ── Avatar ── */
904
+
905
+ .gallery [role="img"][aria-label] {
906
+ display: inline-flex; align-items: center; justify-content: center;
907
+ width: 40px; height: 40px; border-radius: 50%; overflow: hidden;
908
+ background: #e4e4e7; color: #3f3f46; font-size: 14px; font-weight: 600;
909
+
910
+ img { width: 100%; height: 100%; object-fit: cover; }
911
+
912
+ [data-initials] { user-select: none; }
913
+
914
+ [data-placeholder] {
915
+ color: #71717a; font-size: 18px; font-weight: 400;
916
+ }
917
+ }
918
+
919
+ /* ── ContextMenu ── */
920
+
921
+ .gallery [role="menu"][data-open] { min-width: 140px; }
922
+
923
+ /* ── Toolbar ── */
924
+
925
+ .gallery [role="toolbar"] {
926
+ display: inline-flex; align-items: center; gap: 2px;
927
+ padding: 4px; background: #f5f5f5; border-radius: 12px;
928
+
929
+ &[data-orientation="vertical"] { flex-direction: column; }
930
+
931
+ button {
932
+ padding: 6px 14px; border: none; border-radius: 5px; background: transparent;
933
+ font-size: 13px; font-weight: 500; color: #3f3f46; cursor: pointer;
934
+ user-select: none; transition: all 0.1s;
935
+
936
+ &:hover { background: white; color: #18181b; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
937
+ &:active { transform: scale(0.96); }
938
+ &[aria-pressed="true"] { background: white; color: #18181b; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
939
+ &:focus-visible { outline: 2px solid #18181b; outline-offset: -2px; }
940
+ }
941
+ }
942
+
943
+ /* ── Table of Contents ── */
944
+
945
+ html { scroll-behavior: auto; }
946
+ html.no-transition, html.no-transition * { transition: none !important; }
947
+
948
+ .toc {
949
+ display: grid; grid-template-columns: 1fr 1fr;
950
+ margin-bottom: 36px;
951
+ background: white; border: 1px solid #e4e4e7; border-radius: 12px;
952
+ overflow: hidden;
953
+ }
954
+
955
+ .toc-nav {
956
+ display: flex; flex-wrap: wrap; align-content: flex-start;
957
+ gap: 12px 20px; padding: 16px 20px;
958
+ }
959
+
960
+ .toc-group { display: flex; flex-direction: column; gap: 3px; }
961
+
962
+ .toc-label {
963
+ font-size: 10px; font-weight: 700; letter-spacing: 0.08em;
964
+ text-transform: uppercase; color: #71717a; margin-bottom: 2px;
965
+ }
966
+
967
+ .toc-search {
968
+ width: 100%; padding: 5px 10px; margin-bottom: 8px;
969
+ border: 1px solid #e4e4e7; border-radius: 5px;
970
+ font-size: 12px; background: white; color: #18181b; outline: none;
971
+ height: 28px;
972
+
973
+ &:focus { border-color: #18181b; box-shadow: 0 0 0 2px rgba(59,130,246,0.1); }
974
+ &::placeholder { color: #b0b8c4; }
975
+ }
976
+
977
+ .toc a {
978
+ font-size: 12px; color: #3f3f46; text-decoration: none;
979
+ padding: 2px 8px; border-radius: 4px; background: #f5f5f5;
980
+ cursor: pointer; transition: transform 0.12s; outline: none;
981
+
982
+ &:hover, &[data-active] { background: #f4f4f5; color: #18181b; transform: scale(1.05); }
983
+ &:focus-visible { background: #f4f4f5; color: #18181b; outline: 2px solid #18181b; outline-offset: 1px; }
984
+ &[data-hidden] { display: none; }
985
+ }
986
+
987
+ .toc-group:not(:has(a:not([data-hidden]))) { display: none; }
988
+
989
+ .toc-detail {
990
+ border-left: 1px solid #e4e4e7; background: #fafbfc;
991
+ padding: 16px 20px; display: flex; flex-direction: column;
992
+ position: relative; min-height: 280px;
993
+ }
994
+
995
+ .toc-detail h3 {
996
+ font-size: 16px; font-weight: 700; letter-spacing: -0.01em;
997
+ display: flex; align-items: center; gap: 8px; margin-bottom: 4px;
998
+ }
999
+
1000
+ .toc-detail .toc-desc {
1001
+ font-size: 13px; color: #52525b; margin-bottom: 12px;
1002
+ }
1003
+
1004
+ .toc-detail .api { border: none; background: transparent; padding: 0; }
1005
+
1006
+ .toc-detail .jump {
1007
+ position: absolute; top: 16px; right: 20px;
1008
+ font-size: 12px; color: #18181b; text-decoration: none;
1009
+
1010
+ &:hover { text-decoration: underline; }
1011
+ }
1012
+
1013
+ .toc-empty {
1014
+ display: flex; align-items: center; justify-content: center;
1015
+ height: 100%; color: #71717a; font-size: 13px;
1016
+ }
1017
+
1018
+ /* ── API Reference ── */
1019
+
1020
+ .api {
1021
+ margin-top: 12px; padding: 10px 14px;
1022
+ background: #fafafa; border: 1px solid #e4e4e7; border-radius: 12px;
1023
+ }
1024
+
1025
+ .api dl {
1026
+ display: grid; grid-template-columns: auto 1fr;
1027
+ gap: 5px 10px; align-items: baseline; margin: 0;
1028
+ }
1029
+
1030
+ .api dt {
1031
+ font-size: 10px; font-weight: 700; letter-spacing: 0.06em;
1032
+ text-transform: uppercase; color: #71717a; white-space: nowrap;
1033
+ }
1034
+
1035
+ .api dd { display: flex; flex-wrap: wrap; gap: 3px; margin: 0; }
1036
+
1037
+ .api code {
1038
+ font-size: 11px; font-family: 'SF Mono', ui-monospace, monospace;
1039
+ padding: 1px 5px; background: white; border: 1px solid #e4e4e7;
1040
+ border-radius: 3px; color: #334155; white-space: nowrap;
1041
+ }
1042
+
1043
+ .api kbd {
1044
+ font-size: 10px; font-family: inherit; font-weight: 500;
1045
+ padding: 1px 5px; background: white; border: 1px solid #d1d5db;
1046
+ border-radius: 3px; color: #374151; box-shadow: 0 1px 0 #d1d5db;
1047
+ white-space: nowrap;
1048
+ }
1049
+
1050
+ .api .api-none { font-size: 11px; color: #d4d4d8; font-style: italic; }
1051
+
1052
+ /* ── Source Code Viewer ── */
1053
+
1054
+ body:has(.source-overlay) { overflow: hidden; }
1055
+
1056
+ .source-overlay {
1057
+ position: fixed; inset: 0; background: rgba(0,0,0,0.5);
1058
+ display: grid; place-items: center; z-index: 200;
1059
+ animation: fadeIn 150ms ease;
1060
+ }
1061
+
1062
+ .source-modal {
1063
+ background: white; border-radius: 12px;
1064
+ box-shadow: 0 8px 32px rgba(0,0,0,0.2);
1065
+ width: min(90vw, 760px); max-height: 85vh;
1066
+ display: flex; flex-direction: column;
1067
+ overflow: hidden;
1068
+ }
1069
+
1070
+ .source-header {
1071
+ display: flex; align-items: center; justify-content: space-between;
1072
+ padding: 12px 16px; border-bottom: 1px solid #e4e4e7;
1073
+ flex-shrink: 0;
1074
+ }
1075
+
1076
+ .source-title { display: flex; align-items: center; gap: 8px; }
1077
+
1078
+ .source-name {
1079
+ font-size: 15px; font-weight: 700; color: #0f172a;
1080
+ }
1081
+
1082
+ .source-badge {
1083
+ font-size: 10px; font-weight: 600; padding: 2px 8px;
1084
+ border-radius: 12px; background: #f4f4f5; color: #18181b;
1085
+ }
1086
+
1087
+ .source-close {
1088
+ width: 28px; height: 28px; border-radius: 12px;
1089
+ border: none; background: none; color: #71717a;
1090
+ font-size: 18px; cursor: pointer; display: grid; place-items: center;
1091
+ transition: background 0.15s, color 0.15s;
1092
+
1093
+ &:hover { background: #f5f5f5; color: #3f3f46; }
1094
+ }
1095
+
1096
+ .source-body {
1097
+ overflow: auto; flex: 1; min-height: 0;
1098
+ }
1099
+
1100
+ .source-pre {
1101
+ margin: 0; padding: 16px 0; display: flex;
1102
+ font-size: 13px; line-height: 1.6;
1103
+ font-family: ui-monospace, 'SF Mono', 'Cascadia Code', 'Fira Code', Menlo, monospace;
1104
+ }
1105
+
1106
+ .source-gutter {
1107
+ color: #71717a; text-align: right; padding: 0 12px 0 16px;
1108
+ user-select: none; flex-shrink: 0;
1109
+ border-right: 1px solid #e4e4e7;
1110
+ }
1111
+
1112
+ .source-code {
1113
+ padding: 0 16px; flex: 1; min-width: 0;
1114
+ white-space: pre; background: transparent !important;
1115
+ margin: 0; color: #18181b;
1116
+ }
1117
+
1118
+ .source-code.hljs { padding: 0 16px; }
1119
+
1120
+ /* Light mode syntax theme */
1121
+ .source-code .hljs-comment { color: #6b7280; font-style: italic; }
1122
+ .source-code .hljs-keyword { color: #7c3aed; }
1123
+ .source-code .hljs-built_in { color: #6d28d9; }
1124
+ .source-code .hljs-string,
1125
+ .source-code .hljs-regexp { color: #16a34a; }
1126
+ .source-code .hljs-number,
1127
+ .source-code .hljs-literal { color: #d97706; }
1128
+ .source-code .hljs-title,
1129
+ .source-code .hljs-title\.function,
1130
+ .source-code .hljs-title\.class { color: #27272a; }
1131
+ .source-code .hljs-function { color: #27272a; }
1132
+ .source-code .hljs-params { color: #9333ea; }
1133
+ .source-code .hljs-variable { color: #0891b2; }
1134
+ .source-code .hljs-attribute { color: #0d9488; }
1135
+ .source-code .hljs-operator { color: #52525b; }
1136
+ .source-code .hljs-subst { color: #dc2626; }
1137
+ .source-code .hljs-type { color: #0891b2; }
1138
+
1139
+ /* ── Badge ── */
1140
+
1141
+ .gallery [data-variant] {
1142
+ display: inline-flex; align-items: center; font-size: 11px; font-weight: 600;
1143
+ padding: 2px 8px; border-radius: 12px; user-select: none;
1144
+
1145
+ &[data-variant="solid"] { background: #18181b; color: white; }
1146
+ &[data-variant="outline"] { background: transparent; color: #18181b; border: 1px solid #18181b; }
1147
+ &[data-variant="subtle"] { background: #f4f4f5; color: #18181b; }
1148
+ }
1149
+
1150
+ /* ── Kbd ── */
1151
+
1152
+ .gallery kbd:not(.api kbd) {
1153
+ display: inline-block; font-family: ui-monospace, 'SF Mono', monospace;
1154
+ font-size: 12px; font-weight: 500; padding: 2px 6px;
1155
+ background: #fafafa; border: 1px solid #d1d5db; border-radius: 4px;
1156
+ color: #374151; box-shadow: 0 1px 0 #d1d5db; line-height: 1.4;
1157
+ }
1158
+
1159
+ /* ── Skeleton ── */
1160
+
1161
+ .gallery [aria-busy="true"][role="status"]:not([aria-label="Carousel"]) {
1162
+ width: var(--skeleton-width, 100%); height: var(--skeleton-height, 1em);
1163
+ background: linear-gradient(90deg, #e4e4e7 25%, #f5f5f5 50%, #e4e4e7 75%);
1164
+ background-size: 200% 100%;
1165
+ animation: shimmer 1.5s infinite;
1166
+ border-radius: 4px;
1167
+
1168
+ &[data-circle] { border-radius: 50%; }
1169
+ }
1170
+
1171
+ @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
1172
+
1173
+ /* ── Spinner ── */
1174
+
1175
+ .gallery .spinner-demo [role="status"][aria-label] {
1176
+ width: var(--spinner-size, 24px); height: var(--spinner-size, 24px);
1177
+ border: 3px solid #e4e4e7; border-top-color: #18181b;
1178
+ border-radius: 50%; animation: spin 0.6s linear infinite;
1179
+ }
1180
+
1181
+ @keyframes spin { to { transform: rotate(360deg); } }
1182
+
1183
+ /* ── AspectRatio ── */
1184
+
1185
+ .gallery .aspect-demo > div {
1186
+ overflow: hidden; border-radius: 12px; background: #e4e4e7;
1187
+
1188
+ img { width: 100%; height: 100%; object-fit: cover; }
1189
+ }
1190
+
1191
+ /* ── Card ── */
1192
+
1193
+ .gallery .card-demo { background: none; border: none; padding: 0; }
1194
+
1195
+ .gallery .card-demo > div {
1196
+ background: white; border: 1px solid #e4e4e7; border-radius: 12px;
1197
+ overflow: hidden; transition: box-shadow 0.2s;
1198
+
1199
+ &[data-interactive] { cursor: pointer; }
1200
+ &[data-interactive]:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
1201
+
1202
+ [data-header] { padding: 16px 16px 0; }
1203
+ [data-header] h3 { font-size: 16px; font-weight: 700; }
1204
+ [data-content] { padding: 12px 16px; color: #52525b; font-size: 13px; }
1205
+ [data-footer] { padding: 12px 16px; display: flex; gap: 8px; border-top: 1px solid #e4e4e7; }
1206
+ }
1207
+
1208
+ /* ── Label ── */
1209
+
1210
+ .gallery label[data-required] { font-size: 13px; font-weight: 600; color: #334155; }
1211
+ .gallery label[data-required]::after { content: " *"; color: #ef4444; }
1212
+
1213
+ /* ── Textarea ── */
1214
+
1215
+ .gallery textarea {
1216
+ width: 100%; min-height: 80px; padding: 8px 12px;
1217
+ border: 1px solid #d4d4d8; border-radius: 12px; font: inherit; font-size: 14px;
1218
+ color: #18181b; background: white; outline: none; resize: vertical;
1219
+
1220
+ &:focus { border-color: #18181b; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }
1221
+ &[data-disabled] { opacity: 0.5; cursor: not-allowed; }
1222
+ }
1223
+
1224
+ /* ── NativeSelect ── */
1225
+
1226
+ .gallery .native-select-demo select {
1227
+ padding: 6px 12px; height: 36px; border: 1px solid #d4d4d8; border-radius: 12px;
1228
+ background: white; font: inherit; font-size: 14px; color: #18181b; outline: none; cursor: pointer;
1229
+
1230
+ &:focus { border-color: #18181b; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }
1231
+ &[data-disabled] { opacity: 0.5; cursor: not-allowed; }
1232
+ }
1233
+
1234
+ /* ── InputGroup ── */
1235
+
1236
+ .gallery .input-group-demo > div:not(.demo-label) {
1237
+ display: inline-flex; align-items: center;
1238
+ border: 1px solid #d4d4d8; border-radius: 12px; overflow: hidden;
1239
+
1240
+ &[data-focused] { border-color: #18181b; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }
1241
+ &[data-disabled] { opacity: 0.5; }
1242
+
1243
+ [data-prefix], [data-suffix] {
1244
+ padding: 0 10px; background: #fafafa; color: #52525b;
1245
+ font-size: 14px; height: 36px; display: flex; align-items: center;
1246
+ border: none; border-right: 1px solid #e4e4e7; outline: none; user-select: none;
1247
+ }
1248
+
1249
+ [data-suffix] { border-right: none; border-left: 1px solid #e4e4e7; }
1250
+
1251
+ input {
1252
+ border: none; outline: none; padding: 0 12px; height: 36px;
1253
+ font: inherit; font-size: 14px; flex: 1; min-width: 0;
1254
+ }
1255
+ }
1256
+
1257
+ /* ── ButtonGroup ── */
1258
+
1259
+ .gallery [role="group"][data-orientation]:not(:has(button[aria-pressed])):not([role="radiogroup"]):not(:has([data-track])):not(:has([role="checkbox"])) {
1260
+ display: inline-flex;
1261
+
1262
+ &[data-orientation="horizontal"] { flex-direction: row; }
1263
+ &[data-orientation="vertical"] { flex-direction: column; }
1264
+
1265
+ button {
1266
+ padding: 6px 14px; border: 1px solid #d4d4d8; background: white;
1267
+ cursor: pointer; font-size: 13px; color: #18181b; transition: all 0.15s;
1268
+
1269
+ &:first-child { border-radius: 6px 0 0 6px; }
1270
+ &:last-child { border-radius: 0 6px 6px 0; }
1271
+ &:not(:first-child) { margin-left: -1px; }
1272
+ &:hover { background: #fafafa; z-index: 1; }
1273
+ &:active { background: #f5f5f5; }
1274
+ }
1275
+
1276
+ &[data-disabled] { opacity: 0.5; pointer-events: none; }
1277
+ }
1278
+
1279
+ /* ── AlertDialog ── */
1280
+
1281
+ .gallery dialog[data-open][role="alertdialog"],
1282
+ .gallery dialog[data-open]:has([role="alertdialog"]) {
1283
+ border: none;
1284
+ padding: 0;
1285
+ background: transparent;
1286
+ max-width: min(90vw, 420px);
1287
+ width: 100%;
1288
+ }
1289
+
1290
+ .gallery dialog[data-open][role="alertdialog"]::backdrop,
1291
+ .gallery dialog[data-open]:has([role="alertdialog"])::backdrop {
1292
+ background: rgba(0,0,0,0.4);
1293
+ animation: fadeIn 150ms ease;
1294
+ }
1295
+
1296
+ .gallery .alert-dialog-panel {
1297
+ background: white; border-radius: 12px; padding: 24px;
1298
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); max-width: min(90vw, 420px); width: 100%;
1299
+ }
1300
+
1301
+ /* ── Sheet ── */
1302
+
1303
+ .gallery [data-sheet] {
1304
+ position: fixed; background: white; padding: 24px;
1305
+ box-shadow: 0 0 24px rgba(0,0,0,0.15); overflow-y: auto;
1306
+
1307
+ &[data-side="right"] { top: 0; right: 0; bottom: 0; width: min(85vw, 360px); animation: slideInRight 200ms ease; }
1308
+ &[data-side="left"] { top: 0; left: 0; bottom: 0; width: min(85vw, 360px); animation: slideInLeft 200ms ease; }
1309
+ &[data-side="top"] { top: 0; left: 0; right: 0; height: min(85vh, 320px); animation: slideInTop 200ms ease; }
1310
+ &[data-side="bottom"] { bottom: 0; left: 0; right: 0; height: min(85vh, 320px); animation: slideInBottom 200ms ease; }
1311
+
1312
+ h2 { font-size: 18px; font-weight: 700; margin-bottom: 8px; }
1313
+ p { color: #52525b; font-size: 14px; margin-bottom: 12px; }
1314
+ }
1315
+
1316
+ @keyframes slideInTop { from { transform: translateY(-100%); } to { transform: none; } }
1317
+ @keyframes slideInBottom { from { transform: translateY(100%); } to { transform: none; } }
1318
+
1319
+ /* ── Breadcrumb ── */
1320
+
1321
+ .gallery nav[aria-label="Breadcrumb"] ol {
1322
+ display: flex; align-items: center; gap: 6px; list-style: none;
1323
+ font-size: 13px; color: #52525b;
1324
+
1325
+ [data-item] { color: #52525b; text-decoration: none; }
1326
+ [data-item]:hover:not([data-current]) { color: #18181b; text-decoration: underline; }
1327
+ [data-item] + [data-item]::before { content: var(--breadcrumb-separator, '/'); color: #d4d4d8; margin-right: 6px; user-select: none; text-decoration: none; display: inline-block; }
1328
+ [data-current] { color: #18181b; font-weight: 600; }
1329
+ }
1330
+
1331
+ /* ── Table ── */
1332
+
1333
+ .gallery .table-demo table {
1334
+ width: 100%; border-collapse: collapse; font-size: 13px;
1335
+
1336
+ caption { font-size: 14px; font-weight: 600; text-align: left; padding: 8px 0; color: #18181b; }
1337
+
1338
+ th { text-align: left; padding: 8px 12px; font-weight: 600; color: #3f3f46;
1339
+ border-bottom: 1px solid #e4e4e7; font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; }
1340
+ td { padding: 8px 12px; border-bottom: 1px solid #e4e4e7; color: #18181b; }
1341
+
1342
+ &[data-striped] tbody tr:nth-child(even) td { background: #fafafa; }
1343
+ }
1344
+
1345
+ /* ── Collapsible ── */
1346
+
1347
+ .gallery [data-trigger]:has(+ [data-content]) {
1348
+ padding: 8px 14px; border: 1px solid #d4d4d8; border-radius: 12px;
1349
+ background: white; cursor: pointer; font-size: 14px; width: 100%; text-align: left;
1350
+
1351
+ &[aria-expanded="true"] { border-color: #71717a; }
1352
+ &:hover { background: #fafafa; }
1353
+ }
1354
+
1355
+ .gallery .collapsible-demo [data-content] {
1356
+ padding: 12px 14px; color: #52525b; font-size: 13px;
1357
+ border: 1px solid #e4e4e7; border-top: none; border-radius: 0 0 6px 6px;
1358
+ }
1359
+
1360
+ /* ── Pagination ── */
1361
+
1362
+ .gallery nav[aria-label="Pagination"] {
1363
+ display: inline-flex; align-items: center; gap: 2px;
1364
+
1365
+ button {
1366
+ min-width: 32px; height: 32px; padding: 0 8px;
1367
+ border: 1px solid #e4e4e7; border-radius: 12px; background: white;
1368
+ font-size: 13px; color: #3f3f46; cursor: pointer; transition: all 0.15s;
1369
+
1370
+ &:hover:not(:disabled):not([data-active]) { background: #f5f5f5; border-color: #71717a; }
1371
+ &[data-active] { background: #18181b; color: white; border-color: #18181b; }
1372
+ &[data-active]:hover { background: #27272a; }
1373
+ &:disabled { opacity: 0.4; cursor: not-allowed; }
1374
+ }
1375
+
1376
+ [data-prev]::before { content: '‹'; }
1377
+ [data-next]::before { content: '›'; }
1378
+ [data-ellipsis] { min-width: 32px; text-align: center; color: #71717a; font-size: 13px; user-select: none; }
1379
+ }
1380
+
1381
+ /* ── Carousel ── */
1382
+
1383
+ .gallery [aria-roledescription="carousel"] {
1384
+ position: relative; overflow: hidden;
1385
+ border: 1px solid #e4e4e7; border-radius: 12px; background: white;
1386
+
1387
+ [role="tablist"] {
1388
+ border-bottom: none; margin-bottom: 0;
1389
+ min-height: 160px; display: grid; place-items: center;
1390
+ padding: 24px; text-align: center; font-size: 18px; color: #3f3f46;
1391
+ }
1392
+
1393
+ [role="tabpanel"] { padding: 24px; text-align: center; }
1394
+
1395
+ [data-prev], [data-next] {
1396
+ position: absolute; top: 50%; transform: translateY(-50%);
1397
+ width: 32px; height: 32px; border-radius: 50%;
1398
+ border: 1px solid #e4e4e7; background: white; cursor: pointer;
1399
+ display: grid; place-items: center; font-size: 16px; color: #3f3f46;
1400
+ box-shadow: 0 2px 6px rgba(0,0,0,0.08); z-index: 2;
1401
+
1402
+ &:hover:not(:disabled) { background: #f5f5f5; }
1403
+ &:disabled { opacity: 0.3; cursor: not-allowed; }
1404
+ }
1405
+
1406
+ [data-prev] { left: 8px; }
1407
+ [data-next] { right: 8px; }
1408
+ [data-prev]::before { content: '‹'; }
1409
+ [data-next]::before { content: '›'; }
1410
+ }
1411
+
1412
+ /* ── Resizable ── */
1413
+
1414
+ .gallery .resizable-demo > div {
1415
+ border: 1px solid #e4e4e7; border-radius: 12px; overflow: hidden;
1416
+ min-height: 160px;
1417
+
1418
+ [data-panel] {
1419
+ display: flex; align-items: center; justify-content: center;
1420
+ font-size: 13px; color: #52525b; background: white; overflow: hidden;
1421
+ }
1422
+
1423
+ [data-handle] {
1424
+ flex-shrink: 0; background: #e4e4e7; cursor: col-resize;
1425
+ display: flex; align-items: center; justify-content: center;
1426
+ transition: background 0.15s;
1427
+
1428
+ &:hover, &[data-dragging] { background: #18181b; }
1429
+ }
1430
+
1431
+ &[data-orientation="horizontal"] [data-handle] { width: 4px; }
1432
+ &[data-orientation="vertical"] [data-handle] { height: 4px; cursor: row-resize; }
1433
+ }
1434
+
1435
+ /* ── Dark Mode ── */
1436
+
1437
+ [data-theme="dark"] {
1438
+ body { color: #e4e4e7; background: #0f172a; }
1439
+ button { color: #e4e4e7; }
1440
+
1441
+ .gallery-header p { color: #71717a; }
1442
+
1443
+ .theme-toggle { border-color: #334155; background: #1e293b; color: #71717a; }
1444
+ .theme-toggle:hover { background: #334155; color: #e4e4e7; }
1445
+
1446
+ .section .section-title { border-bottom-color: #334155; color: #e4e4e7; }
1447
+ .badge { background: #172554; color: #71717a; border-color: #1e3a8a; }
1448
+ .badge:hover { background: #1e3a8a; color: #a1a1aa; border-color: #18181b; }
1449
+ .section .section-desc { color: #71717a; }
1450
+ .section .section-nav a { color: #3f3f46; }
1451
+ .section .section-nav a:hover { color: #71717a; background: #172554; }
1452
+
1453
+ .demo-row { background: #1e293b; border-color: #334155; }
1454
+ .demo-label { color: #52525b; }
1455
+ .demo-btn { border-color: #3f3f46; background: #334155; color: #e4e4e7; }
1456
+ .demo-row a[href] { color: #71717a; }
1457
+ .status { background: #0f172a; color: #71717a; }
1458
+
1459
+ .toc { background: #1e293b; border-color: #334155; }
1460
+ .toc-search { border-color: #334155; background: #0f172a; color: #e4e4e7; }
1461
+ .toc-search::placeholder { color: #52525b; }
1462
+ .toc-label { color: #52525b; }
1463
+ .toc a { color: #71717a; background: #0f172a; }
1464
+ .toc a:hover, .toc a[data-active] { background: #172554; color: #71717a; }
1465
+ .toc-detail { border-left-color: #334155; background: #0f172a; }
1466
+ .toc-detail h3 { color: #e4e4e7; }
1467
+ .toc-detail .toc-desc { color: #71717a; }
1468
+ .toc-detail .jump { color: #71717a; }
1469
+ .toc-empty { color: #3f3f46; }
1470
+
1471
+ .api { background: #0f172a; border-color: #334155; }
1472
+ .api dt { color: #52525b; }
1473
+ .api code { background: #1e293b; border-color: #334155; color: #d4d4d8; }
1474
+ .api kbd { background: #1e293b; border-color: #3f3f46; color: #71717a; box-shadow: 0 1px 0 #3f3f46; }
1475
+
1476
+ /* Select / Combobox */
1477
+ .gallery button[role="combobox"] { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1478
+ .gallery button[role="combobox"][data-open] { border-color: #71717a; }
1479
+ .gallery button[role="combobox"][data-placeholder] { color: #52525b; }
1480
+ .gallery div[role="listbox"] { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1481
+ .gallery div[role="option"] { color: #e4e4e7; }
1482
+ .gallery div[role="option"][data-highlighted] { background: #172554; }
1483
+ .gallery div[role="option"][data-selected] { color: #71717a; }
1484
+ .gallery .combobox-popup, .gallery .menu-popup { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1485
+ .gallery .option[data-highlighted], .gallery [role="menuitem"][data-highlighted] { background: #172554; }
1486
+ .gallery .option[data-selected] { color: #71717a; }
1487
+ .gallery [data-clear] { color: #52525b; }
1488
+ .gallery [data-clear]:hover { color: #71717a; background: #334155; }
1489
+
1490
+ /* Text inputs */
1491
+ .gallery .combobox-input, .gallery input[type="text"]:not(.rip-grid-editor) { border-color: #3f3f46; color: #e4e4e7; background: #0f172a; }
1492
+ .gallery input[type="email"], .gallery input[type="password"], .gallery input[type="number"] { border-color: #3f3f46 !important; color: #e4e4e7 !important; background: #0f172a !important; }
1493
+
1494
+ /* Dialog / Drawer */
1495
+ .gallery .dialog-panel { background: #1e293b; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1496
+ .gallery dialog[data-open]:not([data-side])::backdrop { background: rgba(0,0,0,0.6); }
1497
+ .gallery .drawer-panel { background: #1e293b; box-shadow: -4px 0 16px rgba(0,0,0,0.4); }
1498
+ .gallery dialog[data-open][data-side]::backdrop { background: rgba(0,0,0,0.6); }
1499
+ .gallery .drawer-panel h2 { color: #e4e4e7; }
1500
+ .gallery .drawer-panel p { color: #71717a; }
1501
+ .gallery .drawer-panel button { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1502
+ .gallery .drawer-panel button:hover { background: #334155; border-color: #52525b; }
1503
+
1504
+ /* Toast */
1505
+ .gallery [role="status"] { background: #1e293b; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1506
+ .gallery [role="status"] button { color: #52525b; }
1507
+ .gallery [role="status"] button:hover { color: #71717a; background: #334155; }
1508
+
1509
+ /* Tooltip */
1510
+ .gallery [role="tooltip"] { background: #e4e4e7; color: #0f172a; }
1511
+
1512
+ /* Tabs */
1513
+ .gallery [role="tablist"] { border-bottom-color: #334155; }
1514
+ .gallery [role="tab"] { color: #52525b; }
1515
+ .gallery [role="tab"][data-active] { color: #71717a; border-bottom-color: #71717a; }
1516
+
1517
+ /* Checkbox / Switch */
1518
+ .gallery [role="checkbox"], .gallery [role="switch"] { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1519
+ .gallery [role="checkbox"][data-checked], .gallery [role="switch"][data-checked] { background: #172554; border-color: #18181b; color: #71717a; }
1520
+
1521
+ /* Menu */
1522
+ .gallery [aria-haspopup="menu"] { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1523
+ .gallery [role="menu"] { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1524
+
1525
+ /* Scroll Area */
1526
+ .scroll-demo [data-orientation] { border-color: #334155; }
1527
+
1528
+ /* Number Field */
1529
+ .gallery .nf-wrap [role="group"] { border-color: #3f3f46; }
1530
+ .gallery .nf-wrap [role="group"] input { color: #e4e4e7; background: #1e293b; }
1531
+ .gallery .nf-wrap [role="group"] button { background: #0f172a; color: #71717a; }
1532
+ .gallery .nf-wrap [role="group"] button:hover:not(:disabled) { background: #334155; }
1533
+ .gallery .nf-wrap [role="group"] [data-decrement] { border-right-color: #334155; }
1534
+ .gallery .nf-wrap [role="group"] [data-increment] { border-left-color: #334155; }
1535
+
1536
+ /* Slider */
1537
+ .gallery .slider-wrap [data-track] { background: #334155; }
1538
+ .gallery .slider-wrap [data-thumb] { background: #1e293b; border-color: #71717a; }
1539
+
1540
+ /* Separator */
1541
+ .gallery [role="none"][data-orientation="horizontal"], .gallery [role="separator"][data-orientation="horizontal"] { border-top-color: #3f3f46; }
1542
+ .gallery [role="none"][data-orientation="vertical"], .gallery [role="separator"][data-orientation="vertical"] { border-left-color: #3f3f46; }
1543
+
1544
+ /* Button */
1545
+ .gallery .btn-demo button { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1546
+ .gallery .btn-demo button:hover:not([data-disabled]) { background: #334155; border-color: #52525b; }
1547
+ .gallery .btn-demo button:active:not([data-disabled]) { background: #0f172a; }
1548
+
1549
+ /* Toggle */
1550
+ .gallery .toggle-heart button { border-color: #334155; background: #1e293b; }
1551
+ .gallery .toggle-heart button:hover { background: #3f1d1d; border-color: #7f1d1d; }
1552
+ .gallery .toggle-heart .heart { color: #3f3f46; }
1553
+ .gallery .toggle-heart [aria-pressed="true"] { background: #3f1d1d; border-color: #f87171; }
1554
+
1555
+ /* Progress / Meter */
1556
+ .progress-track { background: #334155; }
1557
+ .gallery [role="meter"] { background: #334155; }
1558
+ .gallery [role="meter"][data-level="low"] { background: linear-gradient(90deg, #ef4444 var(--meter-percent), #334155 var(--meter-percent)); }
1559
+ .gallery [role="meter"][data-level="optimum"] { background: linear-gradient(90deg, #22c55e var(--meter-percent), #334155 var(--meter-percent)); }
1560
+ .gallery [role="meter"][data-level="high"] { background: linear-gradient(90deg, #f59e0b var(--meter-percent), #334155 var(--meter-percent)); }
1561
+
1562
+ /* Avatar */
1563
+ .gallery [role="img"][aria-label] { background: #334155; color: #71717a; }
1564
+ .gallery [role="img"][aria-label] [data-placeholder] { color: #52525b; }
1565
+
1566
+ /* Grid */
1567
+ .grid-container { background: #1e293b; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1568
+ .rip-grid { color: #e4e4e7; }
1569
+ .rip-grid thead th { background: #0f172a; color: #71717a; border-bottom-color: #334155; }
1570
+ .rip-grid tbody td { border-bottom-color: #334155; }
1571
+ .rip-grid tbody tr.even td { background: #172032; }
1572
+ .rip-grid-editor { background: #1e293b; color: #e4e4e7; }
1573
+ .sort-badge { color: #71717a; background: #334155; }
1574
+
1575
+ /* OTP Field */
1576
+ .gallery [role="group"][aria-label="One-time password"] input { border-color: #3f3f46; background: #0f172a; color: #e4e4e7; }
1577
+ .gallery [role="group"][aria-label="One-time password"] input[data-filled] { border-color: #18181b; }
1578
+ .gallery [role="group"][aria-label="One-time password"][data-complete] input { border-color: #22c55e; background: #052e16; }
1579
+
1580
+ /* MultiSelect */
1581
+ .gallery [data-chips] { border-color: #3f3f46; background: #1e293b; }
1582
+ .gallery [data-chips] input { color: #e4e4e7; }
1583
+ .gallery [data-chip] { background: #172554; color: #71717a; }
1584
+ .gallery [data-chip] [data-remove] { color: #71717a; }
1585
+ .gallery [data-chip] [data-remove]:hover { background: #1e3a5f; }
1586
+
1587
+ /* Editable Value */
1588
+ .gallery [data-edit-trigger] { color: #52525b; }
1589
+ .gallery [data-edit-trigger]:hover { color: #71717a; background: #172554; }
1590
+ .gallery [data-editor][data-open] { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1591
+ .gallery [data-editor][data-open] input { border-color: #3f3f46; background: #0f172a; color: #e4e4e7; }
1592
+
1593
+ /* DatePicker */
1594
+ .gallery [data-calendar] { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1595
+ .gallery [data-header] [data-prev], .gallery [data-header] [data-next] { color: #71717a; }
1596
+ .gallery [data-header] [data-prev]:hover, .gallery [data-header] [data-next]:hover { background: #334155; }
1597
+ .gallery [data-header] [data-month-label] { color: #e4e4e7; }
1598
+ .gallery [data-weekdays] [data-weekday] { color: #52525b; }
1599
+ .gallery [data-days] button { color: #e4e4e7; }
1600
+ .gallery [data-days] button:hover { background: #334155; }
1601
+ .gallery [data-days] button:active:not([data-selected]) { background: #1e3a5f; color: #a1a1aa; }
1602
+ .gallery [data-days] button[data-outside] { color: #3f3f46; }
1603
+ .gallery [data-days] button[data-in-range] { background: #1e3a5f; color: #a1a1aa; }
1604
+ .gallery [data-trigger]:has(+ [data-calendar]) { border-color: #3f3f46; background: #334155; color: #e4e4e7; }
1605
+ .gallery [data-trigger][aria-haspopup] { border-color: #3f3f46; background: #334155; color: #e4e4e7; }
1606
+
1607
+ /* Field / Fieldset / Form */
1608
+ .gallery [data-label] { color: #d4d4d8; }
1609
+ .gallery [data-description] { color: #52525b; }
1610
+ .gallery fieldset { border-color: #334155; }
1611
+ .gallery fieldset legend[data-legend] { color: #e4e4e7; }
1612
+ .gallery form button[type="submit"] { background: #18181b; }
1613
+ .gallery form button[type="submit"]:hover { background: #27272a; }
1614
+ .gallery [data-invalid] input { border-color: #ef4444; }
1615
+
1616
+ /* Menubar */
1617
+ .gallery [role="menubar"] { background: #0f172a; border-color: #334155; }
1618
+ .gallery [role="menubar"] [data-menu-trigger] { color: #71717a; }
1619
+ .gallery [role="menubar"] [data-menu-trigger]:hover, .gallery [role="menubar"] [data-menu-trigger][data-open] { background: #1e293b; color: #e4e4e7; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1620
+ .gallery [role="menubar"] [role="menu"] { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1621
+
1622
+ /* Navigation Menu */
1623
+ .gallery nav[role="navigation"] { background: #0f172a; }
1624
+ .gallery nav[role="navigation"] > a, .gallery nav[role="navigation"] > div > button { color: #71717a; }
1625
+ .gallery nav[role="navigation"] > a:hover, .gallery nav[role="navigation"] > div > button:hover, .gallery nav[role="navigation"] > div > button[data-open] { background: #1e293b; color: #e4e4e7; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1626
+ .gallery nav[role="navigation"] [data-nav-panel] { background: #1e293b; border-color: #3f3f46; box-shadow: 0 8px 24px rgba(0,0,0,0.4); }
1627
+ .gallery nav[role="navigation"] [data-nav-panel] a { color: #71717a; }
1628
+ .gallery nav[role="navigation"] [data-nav-panel] a:hover { background: #334155; color: #e4e4e7; }
1629
+
1630
+ /* ToggleGroup / RadioGroup / CheckboxGroup */
1631
+ .gallery [role="group"][data-orientation]:has(button[aria-pressed]) button[aria-pressed] { border-color: #3f3f46; background: #1e293b; color: #52525b; }
1632
+ .gallery [role="group"][data-orientation]:has(button[aria-pressed]) button[aria-pressed][data-pressed="true"] { background: #18181b; color: white; border-color: #18181b; }
1633
+ .gallery [role="group"][data-orientation]:has(button[aria-pressed]) button[aria-pressed]:hover:not([data-pressed="true"]) { background: #334155; color: #71717a; }
1634
+ .gallery [role="radiogroup"] [role="radio"] { border-color: #3f3f46; background: #1e293b; color: #71717a; }
1635
+ .gallery [role="radiogroup"] [role="radio"][data-checked] { background: #172554; color: #71717a; border-color: #18181b; }
1636
+ .gallery [role="radiogroup"] [role="radio"]:hover:not([data-checked]) { background: #334155; }
1637
+ .gallery [role="group"][aria-label] [role="checkbox"] { border-color: #3f3f46; background: #1e293b; color: #71717a; }
1638
+ .gallery [role="group"][aria-label] [role="checkbox"][data-checked] { background: #172554; color: #71717a; border-color: #18181b; }
1639
+ .gallery [role="group"][aria-label] [role="checkbox"]:hover:not([data-checked]) { background: #334155; }
1640
+
1641
+ /* Toolbar */
1642
+ .gallery [role="toolbar"] { background: #0f172a; }
1643
+ .gallery [role="toolbar"] button { color: #71717a; }
1644
+ .gallery [role="toolbar"] button:hover { background: #1e293b; color: #e4e4e7; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1645
+ .gallery [role="toolbar"] button[aria-pressed="true"] { background: #1e293b; color: #71717a; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1646
+
1647
+ /* Badge */
1648
+ .gallery [data-variant="solid"] { background: #27272a; }
1649
+ .gallery [data-variant="outline"] { color: #71717a; border-color: #71717a; }
1650
+ .gallery [data-variant="subtle"] { background: #172554; color: #71717a; }
1651
+
1652
+ /* Kbd */
1653
+ .gallery kbd:not(.api kbd) { background: #1e293b; border-color: #3f3f46; color: #71717a; box-shadow: 0 1px 0 #3f3f46; }
1654
+
1655
+ /* Skeleton */
1656
+ .gallery [aria-busy="true"][role="status"]:not([aria-label="Carousel"]) { background: linear-gradient(90deg, #334155 25%, #3f3f46 50%, #334155 75%); background-size: 200% 100%; }
1657
+
1658
+ /* Spinner */
1659
+ .gallery .spinner-demo [role="status"][aria-label] { border-color: #334155; border-top-color: #71717a; }
1660
+
1661
+ /* Card */
1662
+ .gallery .card-demo > div { background: #1e293b; border-color: #334155; }
1663
+ .gallery .card-demo > div [data-header] h3 { color: #e4e4e7; }
1664
+ .gallery .card-demo > div [data-content] { color: #71717a; }
1665
+
1666
+ /* Label */
1667
+ .gallery label[data-required] { color: #d4d4d8; }
1668
+
1669
+ /* Textarea */
1670
+ .gallery textarea { border-color: #3f3f46; background: #0f172a; color: #e4e4e7; }
1671
+
1672
+ /* NativeSelect */
1673
+ .gallery .native-select-demo select { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1674
+
1675
+ /* InputGroup */
1676
+ .gallery .input-group-demo > div:not(.demo-label) { border-color: #3f3f46; }
1677
+ .gallery .input-group-demo > div:not(.demo-label) [data-prefix], .gallery .input-group-demo > div:not(.demo-label) [data-suffix] { background: #0f172a; color: #71717a; border-color: #334155; }
1678
+ .gallery .input-group-demo > div:not(.demo-label) input { color: #e4e4e7; background: #1e293b; }
1679
+
1680
+ /* ButtonGroup */
1681
+ .gallery [role="group"][data-orientation]:not(:has(button[aria-pressed])):not([role="radiogroup"]):not(:has([data-track])):not(:has([role="checkbox"])) {
1682
+ button { border-color: #3f3f46; background: #1e293b; color: #e4e4e7; }
1683
+ button:hover { background: #334155; }
1684
+ }
1685
+
1686
+ /* AlertDialog */
1687
+ .gallery .alert-dialog-panel { background: #1e293b; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1688
+ .gallery dialog[data-open][role="alertdialog"]::backdrop,
1689
+ .gallery dialog[data-open]:has([role="alertdialog"])::backdrop { background: rgba(0,0,0,0.6); }
1690
+
1691
+ /* Sheet */
1692
+ .gallery [data-sheet] { background: #1e293b; box-shadow: 0 0 24px rgba(0,0,0,0.4); }
1693
+ .gallery [data-sheet] h2 { color: #e4e4e7; }
1694
+ .gallery [data-sheet] p { color: #71717a; }
1695
+
1696
+ /* Breadcrumb */
1697
+ .gallery nav[aria-label="Breadcrumb"] ol [data-item] { color: #71717a; }
1698
+ .gallery nav[aria-label="Breadcrumb"] ol [data-item]:hover:not([data-current]) { color: #e4e4e7; }
1699
+ .gallery nav[aria-label="Breadcrumb"] ol [data-item] + [data-item]::before { color: #3f3f46; }
1700
+ .gallery nav[aria-label="Breadcrumb"] ol [data-current] { color: #e4e4e7; }
1701
+
1702
+ /* Table */
1703
+ .gallery .table-demo table caption { color: #e4e4e7; }
1704
+ .gallery .table-demo table th { color: #71717a; border-bottom-color: #334155; }
1705
+ .gallery .table-demo table td { color: #e4e4e7; border-bottom-color: #334155; }
1706
+ .gallery .table-demo table[data-striped] tbody tr:nth-child(even) td { background: #172032; }
1707
+
1708
+ /* Collapsible */
1709
+ .gallery .collapsible-demo [data-content] { border-color: #334155; color: #71717a; }
1710
+
1711
+ /* Pagination */
1712
+ .gallery nav[aria-label="Pagination"] button { border-color: #3f3f46; background: #1e293b; color: #71717a; }
1713
+ .gallery nav[aria-label="Pagination"] button:hover:not(:disabled) { background: #334155; border-color: #52525b; }
1714
+ .gallery nav[aria-label="Pagination"] button[data-active] { background: #18181b; color: white; border-color: #18181b; }
1715
+ .gallery nav[aria-label="Pagination"] [data-ellipsis] { color: #52525b; }
1716
+
1717
+ /* Carousel */
1718
+ .gallery [aria-roledescription="carousel"] { border-color: #334155; background: #1e293b; }
1719
+ .gallery [aria-roledescription="carousel"] [data-prev], .gallery [aria-roledescription="carousel"] [data-next] { border-color: #3f3f46; background: #1e293b; color: #71717a; box-shadow: 0 2px 6px rgba(0,0,0,0.3); }
1720
+ .gallery [aria-roledescription="carousel"] [data-prev]:hover:not(:disabled), .gallery [aria-roledescription="carousel"] [data-next]:hover:not(:disabled) { background: #334155; }
1721
+
1722
+ /* Resizable */
1723
+ .gallery .resizable-demo > div { border-color: #334155; }
1724
+ .gallery .resizable-demo > div [data-panel] { background: #1e293b; color: #71717a; }
1725
+ .gallery .resizable-demo > div [data-handle] { background: #3f3f46; }
1726
+
1727
+ /* Shared demo styles */
1728
+ .context-zone { border-color: #52525b; color: #71717a; }
1729
+ .dialog-desc { color: #71717a; }
1730
+ .floating-panel { background: #1e293b; border-color: #3f3f46; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1731
+ .floating-title { color: #e4e4e7; }
1732
+ .floating-desc { color: #71717a; }
1733
+
1734
+ /* Accordion demo */
1735
+ .accordion-trigger, .gallery [data-trigger][data-trigger] button, .gallery button[data-trigger] { border-color: #3f3f46 !important; background: #334155 !important; color: #e4e4e7 !important; }
1736
+ .accordion-content { color: #71717a; }
1737
+
1738
+ /* Source Code Viewer */
1739
+ .source-overlay { background: rgba(0,0,0,0.6); }
1740
+ .source-modal { background: #1e293b; box-shadow: 0 8px 32px rgba(0,0,0,0.5); }
1741
+ .source-header { border-bottom-color: #334155; }
1742
+ .source-name { color: #e4e4e7; }
1743
+ .source-badge { background: #172554; color: #71717a; }
1744
+ .source-close { color: #52525b; }
1745
+ .source-close:hover { background: #334155; color: #e4e4e7; }
1746
+ .source-gutter { color: #3f3f46; border-right-color: #334155; }
1747
+ .source-code { color: #e4e4e7; }
1748
+ .source-code .hljs-comment { color: #52525b; font-style: italic; }
1749
+ .source-code .hljs-keyword { color: #c084fc; }
1750
+ .source-code .hljs-built_in { color: #a78bfa; }
1751
+ .source-code .hljs-string,
1752
+ .source-code .hljs-regexp { color: #86efac; }
1753
+ .source-code .hljs-number,
1754
+ .source-code .hljs-literal { color: #fbbf24; }
1755
+ .source-code .hljs-title,
1756
+ .source-code .hljs-function { color: #a1a1aa; }
1757
+ .source-code .hljs-params { color: #f0abfc; }
1758
+ .source-code .hljs-variable { color: #67e8f9; }
1759
+ .source-code .hljs-attribute { color: #5eead4; }
1760
+ .source-code .hljs-property { color: #e4e4e7; }
1761
+ .source-code .hljs-operator { color: #71717a; }
1762
+ .source-code .hljs-subst { color: #fca5a5; }
1763
+ .source-code .hljs-type { color: #67e8f9; }
1764
+ }
1765
+
1766
+ /* ── Shared demo styles ── */
1767
+
1768
+ .context-zone {
1769
+ padding: 24px; border: 2px dashed #d4d4d8; border-radius: 12px;
1770
+ text-align: center; color: #52525b; cursor: context-menu;
1771
+ }
1772
+
1773
+ .dialog-desc { color: #52525b; margin-bottom: 20px; }
1774
+
1775
+ .floating-panel {
1776
+ padding: 12px 16px; background: white; border: 1px solid #d4d4d8;
1777
+ border-radius: 12px; box-shadow: 0 4px 16px rgba(0,0,0,0.12); min-width: 200px;
1778
+ }
1779
+
1780
+ .floating-title { font-size: 14px; font-weight: 600; color: #18181b; margin-bottom: 4px; }
1781
+ .floating-desc { font-size: 13px; color: #52525b; margin-top: 4px; }
1782
+
1783
+ /* ── Accordion demo ── */
1784
+
1785
+ .accordion-trigger {
1786
+ width: 100%; text-align: left; padding: 8px 12px;
1787
+ border: 1px solid #e4e4e7; border-radius: 12px; background: white;
1788
+ font-size: 14px; cursor: pointer; margin-bottom: 4px;
1789
+ }
1790
+
1791
+ .accordion-content { padding: 8px 12px; color: #52525b; font-size: 13px; }
1792
+
1793
+ /* ── Animations ── */
1794
+
1795
+ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
1796
+ @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }
1797
+ @keyframes slideIn { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: none; } }