rip-lang 3.13.65 → 3.13.67

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 (49) hide show
  1. package/README.md +1 -1
  2. package/docs/dist/rip.js +28 -8
  3. package/docs/dist/rip.min.js +16 -16
  4. package/docs/dist/rip.min.js.br +0 -0
  5. package/docs/index.html +4 -0
  6. package/docs/ui/accordion.rip +113 -0
  7. package/docs/ui/autocomplete.rip +141 -0
  8. package/docs/ui/avatar.rip +37 -0
  9. package/docs/ui/button.rip +23 -0
  10. package/docs/ui/checkbox-group.rip +65 -0
  11. package/docs/ui/checkbox.rip +33 -0
  12. package/docs/ui/combobox.rip +155 -0
  13. package/docs/ui/context-menu.rip +105 -0
  14. package/docs/ui/date-picker.rip +214 -0
  15. package/docs/ui/dialog.rip +107 -0
  16. package/docs/ui/drawer.rip +79 -0
  17. package/docs/ui/editable-value.rip +80 -0
  18. package/docs/ui/field.rip +53 -0
  19. package/docs/ui/fieldset.rip +22 -0
  20. package/docs/ui/form.rip +39 -0
  21. package/docs/ui/grid.rip +901 -0
  22. package/docs/ui/index.css +1379 -0
  23. package/docs/ui/index.html +2097 -0
  24. package/docs/ui/input.rip +36 -0
  25. package/docs/ui/menu.rip +162 -0
  26. package/docs/ui/menubar.rip +155 -0
  27. package/docs/ui/meter.rip +36 -0
  28. package/docs/ui/multi-select.rip +158 -0
  29. package/docs/ui/nav-menu.rip +129 -0
  30. package/docs/ui/number-field.rip +162 -0
  31. package/docs/ui/otp-field.rip +89 -0
  32. package/docs/ui/popover.rip +143 -0
  33. package/docs/ui/preview-card.rip +73 -0
  34. package/docs/ui/progress.rip +25 -0
  35. package/docs/ui/radio-group.rip +67 -0
  36. package/docs/ui/scroll-area.rip +145 -0
  37. package/docs/ui/select.rip +184 -0
  38. package/docs/ui/separator.rip +17 -0
  39. package/docs/ui/slider.rip +165 -0
  40. package/docs/ui/tabs.rip +124 -0
  41. package/docs/ui/toast.rip +87 -0
  42. package/docs/ui/toggle-group.rip +78 -0
  43. package/docs/ui/toggle.rip +24 -0
  44. package/docs/ui/toolbar.rip +46 -0
  45. package/docs/ui/tooltip.rip +115 -0
  46. package/package.json +2 -1
  47. package/src/app.rip +1 -1
  48. package/src/components.js +3 -4
  49. package/src/lexer.js +1 -1
@@ -0,0 +1,1379 @@
1
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
2
+
3
+ body {
4
+ font-family: 'Inter', system-ui, sans-serif;
5
+ font-size: 14px;
6
+ line-height: 1.5;
7
+ color: #1e293b;
8
+ background: #f8fafc;
9
+ }
10
+
11
+ button { font: inherit; cursor: pointer; }
12
+
13
+ .gallery {
14
+ max-width: 900px;
15
+ margin: 0 auto;
16
+ padding: 32px 24px;
17
+
18
+ .gallery-header {
19
+ margin-bottom: 32px;
20
+
21
+ > div:first-child { display: flex; align-items: center; justify-content: space-between; }
22
+ h1 { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }
23
+ p { color: #64748b; margin-top: 4px; }
24
+ }
25
+ }
26
+
27
+ .theme-toggle {
28
+ width: 36px; height: 36px; border: 1px solid #e2e8f0; border-radius: 8px;
29
+ background: white; font-size: 18px; display: grid; place-items: center;
30
+ cursor: pointer; color: #64748b; line-height: 1;
31
+ }
32
+
33
+ .section {
34
+ margin-bottom: 48px;
35
+
36
+ .section-title {
37
+ font-size: 16px; font-weight: 700; letter-spacing: -0.01em;
38
+ padding-bottom: 8px; margin-bottom: 16px;
39
+ border-bottom: 2px solid #e2e8f0;
40
+ display: flex; align-items: center; gap: 8px;
41
+ }
42
+
43
+ .section-desc { color: #64748b; font-size: 13px; margin-bottom: 16px; }
44
+
45
+ .section-nav {
46
+ margin-left: auto; display: flex; gap: 2px;
47
+
48
+ a {
49
+ font-size: 13px; color: #c0c8d4; cursor: pointer;
50
+ width: 26px; height: 26px; display: grid; place-items: center;
51
+ border-radius: 4px; text-decoration: none;
52
+ transition: color 0.12s, background 0.12s;
53
+
54
+ &:hover { color: #3b82f6; background: #eff6ff; }
55
+ }
56
+ }
57
+ }
58
+
59
+ .badge {
60
+ font-size: 11px; font-weight: 600; padding: 3px 10px;
61
+ border-radius: 10px; background: #dbeafe; color: #1d4ed8;
62
+ border: 1px solid #93c5fd;
63
+ cursor: pointer; transition: background 0.15s, color 0.15s, border-color 0.15s;
64
+
65
+ &:hover { background: #bfdbfe; color: #1e40af; border-color: #60a5fa; }
66
+ }
67
+
68
+ .demo-row {
69
+ padding: 16px; margin-bottom: 12px;
70
+ background: white; border: 1px solid #e2e8f0; border-radius: 8px;
71
+ }
72
+
73
+ .demo-label {
74
+ font-size: 11px; font-weight: 600; letter-spacing: 0.08em;
75
+ text-transform: uppercase; color: #94a3b8; margin-bottom: 8px;
76
+ }
77
+
78
+ .demo-btn {
79
+ padding: 6px 16px; border: 1px solid #cbd5e1; border-radius: 6px;
80
+ background: white; font-size: 14px; color: #1e293b; outline: none; cursor: pointer;
81
+ user-select: none; transition: transform 0.1s, background 0.1s;
82
+
83
+ &:hover { background: #f8fafc; border-color: #94a3b8; }
84
+ &:active { background: #f1f5f9; transform: scale(0.97); }
85
+ }
86
+
87
+ .status {
88
+ margin-top: 8px; padding: 8px 12px; border-radius: 6px;
89
+ font-size: 12px; font-family: monospace;
90
+ background: #f1f5f9; color: #475569;
91
+ }
92
+
93
+ /* ── Select ── */
94
+
95
+ .gallery button[role="combobox"] {
96
+ display: inline-flex; align-items: center; justify-content: space-between;
97
+ gap: 8px; padding: 6px 12px; height: 36px;
98
+ border: 1px solid #cbd5e1; border-radius: 6px; background: white;
99
+ cursor: pointer; min-width: 200px; font-size: 14px; color: #1e293b; outline: none;
100
+
101
+ &::after {
102
+ 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");
103
+ display: inline-block; line-height: 0;
104
+ }
105
+
106
+ &[data-open] {
107
+ border-color: #94a3b8;
108
+ &::after {
109
+ 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");
110
+ }
111
+ }
112
+
113
+ &[data-placeholder] { color: #94a3b8; }
114
+ &[data-disabled] { opacity: 0.5; cursor: not-allowed; }
115
+ }
116
+
117
+ .gallery div[role="listbox"] {
118
+ background: white; border: 1px solid #cbd5e1; border-radius: 6px;
119
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
120
+ overflow-y: auto; max-height: 280px; min-width: 200px; margin-top: 2px; z-index: 50;
121
+
122
+ &:not([data-open]) { display: none; }
123
+ }
124
+
125
+ .gallery div[role="option"] {
126
+ padding: 8px 12px; border-radius: 4px; cursor: pointer;
127
+ font-size: 14px; outline: none; color: #1e293b;
128
+
129
+ &[data-highlighted] { background: #eff6ff; }
130
+ &[data-selected] { font-weight: 600; color: #1d4ed8; }
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: #94a3b8;
141
+ cursor: pointer;
142
+ font-size: 14px;
143
+ padding: 2px 4px;
144
+ border-radius: 4px;
145
+ line-height: 1;
146
+
147
+ &:hover { color: #475569; background: #f1f5f9; }
148
+ }
149
+
150
+ /* ── Combobox / Menu popups ── */
151
+
152
+ .gallery .combobox-popup,
153
+ .gallery .menu-popup {
154
+ background: white; border: 1px solid #cbd5e1; border-radius: 6px;
155
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px; z-index: 100;
156
+ overflow-y: auto; max-height: 280px;
157
+ }
158
+
159
+ .gallery .option,
160
+ .gallery [role="menuitem"] {
161
+ padding: 8px 12px; border-radius: 4px; cursor: pointer;
162
+ font-size: 14px; outline: none;
163
+
164
+ &[data-highlighted] { background: #eff6ff; }
165
+ }
166
+
167
+ .gallery .option[data-selected] { font-weight: 600; color: #1d4ed8; }
168
+
169
+ /* ── Combobox / Text inputs ── */
170
+
171
+ .gallery .combobox-input,
172
+ .gallery input[type="text"]:not(.rip-grid-editor),
173
+ .gallery input[type="email"],
174
+ .gallery input[type="password"] {
175
+ width: 100%; height: 36px; padding: 0 12px;
176
+ border: 1px solid #cbd5e1; border-radius: 6px; font-size: 14px;
177
+ color: #1e293b; background: white; outline: none;
178
+
179
+ &:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,0.1); }
180
+ }
181
+
182
+ /* ── Dialog ── */
183
+
184
+ .gallery [data-open]:has(> [role="dialog"][aria-modal]) {
185
+ position: fixed; inset: 0; background: rgba(0,0,0,0.4);
186
+ display: grid; place-items: center; z-index: 100;
187
+ animation: fadeIn 150ms ease;
188
+ }
189
+
190
+ .gallery .dialog-panel {
191
+ background: white; border-radius: 12px; padding: 24px;
192
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); max-width: min(90vw, 420px); width: 100%;
193
+ }
194
+
195
+ /* ── Toast ── */
196
+
197
+ .gallery .toast-wrap {
198
+ position: fixed; top: 16px; right: 16px; z-index: 200;
199
+ }
200
+
201
+ .gallery .toast-wrap [role="region"] {
202
+ display: flex; flex-direction: column; gap: 12px;
203
+ }
204
+
205
+ .gallery .toast-wrap [role="status"],
206
+ .gallery .toast-wrap [role="alert"] {
207
+ padding: 12px 14px; border-radius: 8px; background: white;
208
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); display: flex; align-items: center; gap: 8px;
209
+ animation: slideIn 200ms ease; max-width: 220px; border-left: 3px solid #3b82f6; font-size: 13px; line-height: 1.4;
210
+
211
+ &[data-type="success"] { border-left-color: #16a34a; }
212
+ &[data-type="error"] { border-left-color: #dc2626; }
213
+ &[data-leaving] { animation: fadeOut 200ms ease forwards; }
214
+
215
+ span { font-size: 13px; }
216
+
217
+ button {
218
+ background: none; border: none; color: #94a3b8; cursor: pointer;
219
+ font-size: 14px; padding: 2px 4px; border-radius: 4px; line-height: 1; flex-shrink: 0;
220
+
221
+ &:hover { color: #475569; background: #f1f5f9; }
222
+ }
223
+ }
224
+
225
+ /* ── Tooltip ── */
226
+
227
+ .gallery [role="tooltip"] {
228
+ background: #1e293b; color: white; font-size: 12px;
229
+ padding: 4px 8px; border-radius: 4px; z-index: 200;
230
+
231
+ &[data-entering] { animation: fadeIn 100ms ease; }
232
+ }
233
+
234
+ /* ── Tabs ── */
235
+
236
+ .gallery [role="tablist"] {
237
+ display: flex; gap: 4px; border-bottom: 1px solid #e2e8f0; margin-bottom: 12px;
238
+ }
239
+
240
+ .gallery [role="tab"] {
241
+ padding: 8px 16px; border: none; background: none;
242
+ font-size: 14px; font-weight: 500; color: #64748b; cursor: pointer;
243
+ border-bottom: 2px solid transparent; margin-bottom: -1px;
244
+
245
+ &[data-active] { color: #1d4ed8; border-bottom-color: #1d4ed8; }
246
+ }
247
+
248
+ /* ── Checkbox / Switch ── */
249
+
250
+ .gallery [role="checkbox"],
251
+ .gallery [role="switch"] {
252
+ display: inline-flex; align-items: center; gap: 8px;
253
+ padding: 6px 12px; border: 1px solid #cbd5e1; border-radius: 6px;
254
+ background: white; cursor: pointer; font-size: 14px;
255
+
256
+ &[data-checked] { background: #eff6ff; border-color: #3b82f6; color: #1d4ed8; }
257
+ }
258
+
259
+ /* ── Menu ── */
260
+
261
+ .gallery [aria-haspopup="menu"] {
262
+ padding: 6px 16px; height: 36px; border: 1px solid #cbd5e1;
263
+ border-radius: 6px; background: white; font-size: 14px;
264
+
265
+ &[data-open] { border-color: #3b82f6; }
266
+ }
267
+
268
+ .gallery [role="menu"] {
269
+ background: white; border: 1px solid #cbd5e1; border-radius: 6px;
270
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
271
+ overflow-y: auto; max-height: 280px; min-width: 160px;
272
+
273
+ &:not([data-open]) { display: none; }
274
+ }
275
+
276
+ /* ── Drawer ── */
277
+
278
+ .gallery [data-open][data-side] {
279
+ position: fixed; inset: 0; background: rgba(0,0,0,0.4);
280
+ z-index: 100; animation: fadeIn 150ms ease;
281
+ }
282
+
283
+ .gallery .drawer-panel {
284
+ position: fixed; top: 0; bottom: 0; width: min(85vw, 360px);
285
+ background: white; padding: 24px; box-shadow: -4px 0 16px rgba(0,0,0,0.12);
286
+ animation: slideInRight 200ms ease;
287
+ overflow-y: auto;
288
+
289
+ h2 { font-size: 18px; font-weight: 700; margin-bottom: 8px; }
290
+ p { color: #64748b; font-size: 14px; margin-bottom: 12px; }
291
+
292
+ button {
293
+ margin-top: 12px;
294
+ padding: 8px 20px;
295
+ border: 1px solid #cbd5e1;
296
+ border-radius: 6px;
297
+ background: white;
298
+ font-size: 14px;
299
+ font-weight: 500;
300
+ color: #1e293b;
301
+ cursor: pointer;
302
+
303
+ &:hover { background: #f8fafc; border-color: #94a3b8; }
304
+ &:active { background: #f1f5f9; }
305
+ }
306
+ }
307
+
308
+ [data-side="right"] .drawer-panel { right: 0; }
309
+ [data-side="left"] .drawer-panel { left: 0; animation-name: slideInLeft; }
310
+
311
+ @keyframes slideInRight { from { transform: translateX(100%); } to { transform: none; } }
312
+ @keyframes slideInLeft { from { transform: translateX(-100%); } to { transform: none; } }
313
+
314
+ /* ── Scroll Area ── */
315
+
316
+ .scroll-demo {
317
+ [data-orientation] {
318
+ position: relative;
319
+ max-height: 200px;
320
+ border: 1px solid #e2e8f0;
321
+ border-radius: 6px;
322
+ }
323
+
324
+ [data-viewport] {
325
+ max-height: inherit;
326
+ padding: 8px 12px;
327
+ &::-webkit-scrollbar { display: none; }
328
+ }
329
+
330
+ [data-scrollbar] {
331
+ position: absolute;
332
+ top: 2px;
333
+ bottom: 2px;
334
+ right: 2px;
335
+ width: 8px;
336
+ opacity: 0;
337
+ transition: opacity 200ms ease;
338
+ z-index: 1;
339
+ }
340
+
341
+ [data-orientation]:hover [data-scrollbar],
342
+ [data-scrolling] [data-scrollbar],
343
+ [data-dragging] [data-scrollbar] { opacity: 1; }
344
+
345
+ [data-thumb] {
346
+ width: 100%;
347
+ background: rgba(0,0,0,0.3);
348
+ border-radius: 4px;
349
+ cursor: grab;
350
+ transition: background 150ms ease;
351
+
352
+ &:hover { background: rgba(0,0,0,0.5); }
353
+ &:active { background: rgba(0,0,0,0.6); }
354
+ }
355
+ }
356
+
357
+ /* ── Number Field ── */
358
+
359
+ .gallery .nf-wrap [role="group"] {
360
+ display: inline-flex;
361
+ align-items: center;
362
+ border: 1px solid #cbd5e1;
363
+ border-radius: 6px;
364
+ overflow: hidden;
365
+
366
+ input {
367
+ width: 80px; height: 36px; text-align: center;
368
+ border: none; outline: none; font-size: 14px;
369
+ color: #1e293b; background: white;
370
+
371
+ &:focus { outline: none; box-shadow: none; border-color: transparent; }
372
+ }
373
+
374
+ button {
375
+ width: 36px; height: 36px; border: none; outline: none;
376
+ background: #f8fafc; color: #475569; font-size: 16px;
377
+ cursor: pointer; display: grid; place-items: center;
378
+ user-select: none;
379
+
380
+ &:hover:not(:disabled) { background: #e2e8f0; }
381
+ &:active:not(:disabled) { background: #cbd5e1; }
382
+ &:disabled { opacity: 0.3; cursor: not-allowed; }
383
+ }
384
+
385
+ [data-decrement] { border-right: 1px solid #e2e8f0; }
386
+ [data-decrement]::before { content: "−"; }
387
+ [data-increment] { border-left: 1px solid #e2e8f0; }
388
+ [data-increment]::before { content: "+"; }
389
+
390
+ &[data-disabled] { opacity: 0.5; pointer-events: none; }
391
+ }
392
+
393
+ /* ── Slider ── */
394
+
395
+ .gallery .slider-wrap {
396
+ padding: 12px 0;
397
+ touch-action: none;
398
+
399
+ [data-track] {
400
+ position: relative;
401
+ height: 6px;
402
+ background: #e2e8f0;
403
+ border-radius: 3px;
404
+ cursor: pointer;
405
+ }
406
+
407
+ [data-indicator] {
408
+ height: 100%;
409
+ background: #3b82f6;
410
+ border-radius: 3px;
411
+ pointer-events: none;
412
+ }
413
+
414
+ [data-thumb] {
415
+ width: 20px;
416
+ height: 20px;
417
+ background: white;
418
+ border: 2px solid #3b82f6;
419
+ border-radius: 50%;
420
+ transform: translate(-50%, -50%);
421
+ top: 50%;
422
+ cursor: grab;
423
+ transition: box-shadow 150ms ease;
424
+
425
+ &:hover { box-shadow: 0 0 0 4px rgba(59,130,246,0.15); }
426
+ &[data-active] { cursor: grabbing; box-shadow: 0 0 0 4px rgba(59,130,246,0.25); }
427
+ }
428
+
429
+ &[data-disabled] {
430
+ opacity: 0.5;
431
+ pointer-events: none;
432
+ }
433
+ }
434
+
435
+ /* ── Separator ── */
436
+
437
+ .gallery [role="none"][data-orientation="horizontal"],
438
+ .gallery [role="separator"][data-orientation="horizontal"] {
439
+ border: none; border-top: 1px solid #cbd5e1; margin: 8px 0; width: 100%;
440
+ }
441
+
442
+ .gallery [role="none"][data-orientation="vertical"],
443
+ .gallery [role="separator"][data-orientation="vertical"] {
444
+ border: none; border-left: 1px solid #cbd5e1; margin: 0;
445
+ align-self: stretch; width: 0; min-height: 20px;
446
+ }
447
+
448
+ /* ── Button ── */
449
+
450
+ .gallery .btn-demo .btn-row {
451
+ display: flex; align-items: center; gap: 8px;
452
+ }
453
+
454
+ .gallery .btn-demo button {
455
+ padding: 8px 16px; border: 1px solid #cbd5e1; border-radius: 6px;
456
+ background: white; font-size: 14px; font-weight: 500; color: #1e293b;
457
+ cursor: pointer; user-select: none; transition: all 150ms ease;
458
+
459
+ &:hover:not([data-disabled]) { background: #f8fafc; border-color: #94a3b8; }
460
+ &:active:not([data-disabled]) { background: #f1f5f9; transform: scale(0.98); }
461
+ &[data-disabled] { opacity: 0.5; cursor: not-allowed; }
462
+ }
463
+
464
+ /* ── Toggle ── */
465
+
466
+ .gallery .toggle-heart {
467
+ button {
468
+ width: 48px; height: 48px; border: 1px solid #e2e8f0; border-radius: 10px;
469
+ background: white; cursor: pointer; display: grid; place-items: center;
470
+ transition: all 150ms ease;
471
+
472
+ &:hover { background: #fef2f2; border-color: #fca5a5; }
473
+ }
474
+
475
+ .heart {
476
+ font-size: 24px; color: #cbd5e1; transition: all 150ms ease; line-height: 1;
477
+ }
478
+
479
+ [aria-pressed="true"] {
480
+ background: #fef2f2; border-color: #f87171;
481
+
482
+ .heart { color: #ef4444; }
483
+ }
484
+ }
485
+
486
+ /* ── Progress ── */
487
+
488
+ .progress-track {
489
+ width: 200px; height: 8px; background: #e2e8f0; border-radius: 4px; overflow: hidden;
490
+ }
491
+
492
+ .progress-fill {
493
+ height: 100%; background: #3b82f6; border-radius: 4px; transition: width 300ms;
494
+ }
495
+
496
+ /* ── Meter ── */
497
+
498
+ .gallery [role="meter"] {
499
+ width: 200px; height: 8px; background: #e2e8f0; border-radius: 4px;
500
+
501
+ &[data-level="low"] { background: linear-gradient(90deg, #ef4444 var(--meter-percent), #e2e8f0 var(--meter-percent)); border-radius: 4px; }
502
+ &[data-level="optimum"] { background: linear-gradient(90deg, #22c55e var(--meter-percent), #e2e8f0 var(--meter-percent)); border-radius: 4px; }
503
+ &[data-level="high"] { background: linear-gradient(90deg, #f59e0b var(--meter-percent), #e2e8f0 var(--meter-percent)); border-radius: 4px; }
504
+ }
505
+
506
+ /* ── Grid ── */
507
+
508
+ .grid-container {
509
+ position: relative; overflow: auto; height: 420px;
510
+ background: white; border-radius: 6px;
511
+ box-shadow: 0 1px 3px rgba(0,0,0,0.08);
512
+
513
+ &:focus { outline: none; }
514
+ &:not([data-selecting]) .rip-grid tbody tr:hover td { background: rgba(59,130,246,0.06); }
515
+ }
516
+
517
+ .rip-grid {
518
+ width: 100%; border-collapse: collapse; table-layout: fixed;
519
+ font-family: system-ui, -apple-system, sans-serif; font-size: 13px; color: #1e293b;
520
+
521
+ thead th {
522
+ position: sticky; top: 0; z-index: 2; height: 36px; padding: 0 10px;
523
+ background: #f8fafc; color: #475569; font-weight: 600; font-size: 11px;
524
+ text-transform: uppercase; letter-spacing: 0.5px;
525
+ border-bottom: 2px solid #e2e8f0; white-space: nowrap; user-select: none;
526
+ }
527
+
528
+ thead tr:hover .resize-handle { background: rgba(0,0,0,0.08); }
529
+
530
+ tbody td {
531
+ height: 32px; padding: 0 10px;
532
+ border-bottom: 1px solid #e2e8f0; white-space: nowrap;
533
+ overflow: hidden; text-overflow: ellipsis; cursor: default; user-select: none;
534
+
535
+ &[data-selected] { background: rgba(59,130,246,0.08); }
536
+ &[data-active] { background: rgba(59,130,246,0.20); outline: 2px solid #3b82f6; outline-offset: -2px; position: relative; z-index: 1; }
537
+ }
538
+
539
+ tbody tr.even td { background: #f8fafc; }
540
+ tbody tr.even td[data-selected] { background: rgba(59,130,246,0.12); }
541
+ tbody tr.spacer td { padding: 0; border: none; line-height: 0; font-size: 0; }
542
+ }
543
+
544
+ .grid-cell-ref {
545
+ font-size: 11px; font-family: 'SF Mono', ui-monospace, monospace;
546
+ color: #64748b; font-weight: 500;
547
+ }
548
+
549
+ .sort-arrow { color: #94a3b8; font-size: 11px; margin-left: 3px; }
550
+
551
+ .sort-badge {
552
+ display: inline-block; font-size: 9px; color: #64748b; background: #e2e8f0;
553
+ border-radius: 50%; width: 14px; height: 14px; line-height: 14px;
554
+ text-align: center; margin-left: 2px;
555
+ }
556
+
557
+ .resize-handle {
558
+ position: absolute; right: 0; top: 0; bottom: 0; width: 2px;
559
+ cursor: col-resize; z-index: 3; background: transparent;
560
+
561
+ &:hover, &.active { background: rgba(59,130,246,0.3); }
562
+ }
563
+
564
+ .rip-grid-editor {
565
+ position: absolute; z-index: 10; box-sizing: border-box;
566
+ border: 2px solid #3b82f6; border-radius: 0;
567
+ font-family: system-ui, -apple-system, sans-serif; font-size: 13px;
568
+ padding: 0 8px; outline: none; background: white; color: #1e293b;
569
+ }
570
+
571
+ select.rip-grid-editor { cursor: pointer; padding-left: 4px; }
572
+
573
+ .cell-checkbox { pointer-events: none; margin: 0; vertical-align: middle; }
574
+
575
+ /* ── OTP Field ── */
576
+
577
+ .gallery [role="group"][aria-label="One-time password"] {
578
+ display: inline-flex; gap: 6px;
579
+
580
+ input {
581
+ width: 40px; height: 44px; text-align: center; font-size: 18px; font-weight: 600;
582
+ border: 1px solid #cbd5e1; border-radius: 6px; background: white; color: #1e293b;
583
+
584
+ &:focus { border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.15); outline: none; }
585
+ &[data-filled] { border-color: #3b82f6; }
586
+ }
587
+
588
+ &[data-complete] input { border-color: #22c55e; }
589
+ &[data-disabled] input { opacity: 0.5; cursor: not-allowed; }
590
+ }
591
+
592
+ /* ── MultiSelect ── */
593
+
594
+ .gallery [data-chips] {
595
+ display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
596
+ padding: 4px 8px; border: 1px solid #cbd5e1; border-radius: 6px;
597
+ background: white; min-height: 38px; cursor: text;
598
+
599
+ &:focus-within { border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.15); }
600
+
601
+ input {
602
+ border: none; outline: none; font: inherit; min-width: 80px;
603
+ flex: 1; padding: 4px 0; background: transparent;
604
+ }
605
+ }
606
+
607
+ .gallery [data-chip] {
608
+ display: inline-flex; align-items: center; gap: 4px;
609
+ padding: 2px 8px; background: #eff6ff; color: #1d4ed8;
610
+ border-radius: 4px; font-size: 12px; font-weight: 500;
611
+
612
+ [data-remove] {
613
+ border: none; background: none; color: #3b82f6; cursor: pointer;
614
+ font-size: 11px; padding: 0 2px; line-height: 1; border-radius: 2px;
615
+
616
+ &:hover { background: #dbeafe; }
617
+ }
618
+ }
619
+
620
+ /* ── EditableValue ── */
621
+
622
+ .gallery [data-editing] { position: relative; }
623
+
624
+ .gallery [data-edit-trigger] {
625
+ border: none; background: none; color: #94a3b8; cursor: pointer;
626
+ font-size: 14px; padding: 2px 6px; border-radius: 4px; margin-left: 4px;
627
+
628
+ &:hover { color: #3b82f6; background: #f1f5f9; }
629
+ }
630
+
631
+ .gallery [data-editor][data-open] {
632
+ background: white; border: 1px solid #cbd5e1; border-radius: 8px;
633
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 12px;
634
+ min-width: 200px; animation: fadeIn 0.15s ease;
635
+
636
+ input { width: 100%; padding: 6px 10px; border: 1px solid #cbd5e1; border-radius: 4px; font: inherit; }
637
+ }
638
+
639
+ /* ── DatePicker ── */
640
+
641
+ .gallery [data-calendar] {
642
+ background: white; border: 1px solid #cbd5e1; border-radius: 8px;
643
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 12px;
644
+ min-width: 260px;
645
+ }
646
+
647
+ .gallery [data-header] {
648
+ display: flex; align-items: center; justify-content: space-between;
649
+ margin-bottom: 8px;
650
+
651
+ [data-prev], [data-next] {
652
+ border: none; background: none; cursor: pointer; font-size: 18px;
653
+ color: #475569; width: 28px; height: 28px; border-radius: 4px;
654
+ display: flex; align-items: center; justify-content: center;
655
+
656
+ &:hover { background: #f1f5f9; }
657
+ }
658
+
659
+ [data-month-label] { font-weight: 600; font-size: 14px; color: #1e293b; }
660
+ }
661
+
662
+ .gallery [data-weekdays] {
663
+ display: grid; grid-template-columns: repeat(7, 1fr);
664
+ text-align: center; margin-bottom: 4px;
665
+
666
+ [data-weekday] { font-size: 11px; font-weight: 600; color: #94a3b8; padding: 4px; }
667
+ }
668
+
669
+ .gallery [data-days] {
670
+ display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px;
671
+
672
+ button {
673
+ border: none; background: none; cursor: pointer; font-size: 13px;
674
+ padding: 6px; border-radius: 4px; color: #1e293b; text-align: center;
675
+ min-width: 32px; min-height: 32px;
676
+
677
+ &:hover { background: #f1f5f9; }
678
+ &[data-outside] { color: #cbd5e1; }
679
+ &[data-today] { font-weight: 700; outline: 2px solid #3b82f6; outline-offset: -2px; }
680
+ &[data-selected] { background: #3b82f6; color: white; }
681
+ &[data-in-range] { background: #eff6ff; border-radius: 0; }
682
+ &[data-range-start] { border-radius: 4px 0 0 4px; }
683
+ }
684
+ }
685
+
686
+ .gallery [data-trigger]:has(+ [data-calendar]),
687
+ .gallery [data-trigger][aria-haspopup] {
688
+ padding: 8px 14px; border: 1px solid #cbd5e1; border-radius: 6px;
689
+ background: white; cursor: pointer; font-size: 14px; color: #1e293b;
690
+ min-width: 180px; min-height: 38px;
691
+
692
+ &:hover { border-color: #94a3b8; }
693
+ &[aria-expanded="true"] { border-color: #3b82f6; }
694
+ }
695
+
696
+ /* ── Field ── */
697
+
698
+ .gallery [data-label] {
699
+ display: block; font-size: 13px; font-weight: 600; color: #334155; margin-bottom: 4px;
700
+
701
+ [data-required] { color: #ef4444; }
702
+ }
703
+
704
+ .gallery [data-description] {
705
+ font-size: 12px; color: #64748b; margin-top: 4px;
706
+ }
707
+
708
+ .gallery [data-error] {
709
+ font-size: 12px; color: #ef4444; margin-top: 4px;
710
+ }
711
+
712
+ .gallery [data-invalid] input { border-color: #ef4444; }
713
+
714
+ /* ── Fieldset ── */
715
+
716
+ .gallery fieldset {
717
+ border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px;
718
+ display: flex; flex-direction: column; gap: 12px;
719
+
720
+ legend[data-legend] {
721
+ font-size: 14px; font-weight: 600; color: #1e293b; padding: 0 4px;
722
+ }
723
+ }
724
+
725
+ /* ── Form ── */
726
+
727
+ .gallery form {
728
+ display: flex; flex-direction: column; gap: 12px;
729
+
730
+ button[type="submit"] {
731
+ align-self: flex-start; padding: 8px 20px; background: #3b82f6;
732
+ color: white; border: none; border-radius: 6px; font-size: 14px;
733
+ cursor: pointer; user-select: none; transition: background 0.15s, transform 0.1s;
734
+
735
+ &:hover { background: #2563eb; }
736
+ &:active { transform: scale(0.97); }
737
+ &:focus-visible { outline: 2px solid #3b82f6; outline-offset: 2px; }
738
+ }
739
+
740
+ &[data-submitting] button[type="submit"] { opacity: 0.6; cursor: wait; }
741
+ }
742
+
743
+ /* ── PreviewCard ── */
744
+
745
+ .gallery [data-content][data-open] {
746
+ animation: fadeIn 0.15s ease;
747
+ }
748
+
749
+ /* ── Menubar ── */
750
+
751
+ .gallery [role="menubar"] {
752
+ display: inline-flex; gap: 0; background: #f8fafc;
753
+ border: 1px solid #e2e8f0; border-radius: 6px; padding: 2px;
754
+
755
+ [data-menu-trigger] {
756
+ padding: 6px 14px; border: none; background: transparent;
757
+ cursor: pointer; font-size: 13px; color: #475569; border-radius: 4px;
758
+ transition: all 0.15s;
759
+
760
+ &:hover, &[data-open] { background: white; color: #1e293b; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
761
+ &:focus-visible { outline: 2px solid #3b82f6; outline-offset: -2px; }
762
+ }
763
+
764
+ [role="menu"] {
765
+ background: white; border: 1px solid #cbd5e1; border-radius: 6px;
766
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
767
+ min-width: 140px; z-index: 50;
768
+ }
769
+ }
770
+
771
+ /* ── NavigationMenu ── */
772
+
773
+ .gallery nav[role="navigation"] {
774
+ display: inline-flex; align-items: center; gap: 2px;
775
+ padding: 4px; background: #f1f5f9; border-radius: 8px;
776
+ }
777
+
778
+ .gallery nav[role="navigation"] > a,
779
+ .gallery nav[role="navigation"] > div > button {
780
+ appearance: none; padding: 6px 14px; border: none; background: transparent;
781
+ cursor: pointer; font: inherit; font-size: 13px; font-weight: 500;
782
+ color: #475569; border-radius: 5px; text-decoration: none;
783
+ user-select: none; transition: all 0.1s; outline: none;
784
+ }
785
+
786
+ .gallery nav[role="navigation"] > a:hover,
787
+ .gallery nav[role="navigation"] > div > button:hover,
788
+ .gallery nav[role="navigation"] > div > button[data-open] {
789
+ background: white; color: #1e293b; box-shadow: 0 1px 3px rgba(0,0,0,0.08);
790
+ }
791
+
792
+ .gallery nav[role="navigation"] > a:active,
793
+ .gallery nav[role="navigation"] > div > button:active { transform: scale(0.96); }
794
+
795
+ .gallery nav[role="navigation"] > div > button {
796
+ display: flex; align-items: center; gap: 4px;
797
+ }
798
+
799
+ .gallery nav[role="navigation"] > div > button::after {
800
+ 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");
801
+ display: inline-block; line-height: 0; transition: transform 0.2s ease;
802
+ }
803
+
804
+ .gallery nav[role="navigation"] > div > button[data-open]::after { transform: rotate(180deg); }
805
+
806
+ .gallery nav[role="navigation"] [data-nav-panel] {
807
+ background: white; border: 1px solid #e2e8f0; border-radius: 10px;
808
+ box-shadow: 0 8px 24px rgba(0,0,0,0.1); padding: 6px;
809
+ min-width: 180px; z-index: 50;
810
+ }
811
+
812
+ .gallery nav[role="navigation"] [data-nav-panel] a {
813
+ display: block; padding: 8px 12px; color: #475569; text-decoration: none;
814
+ border-radius: 6px; font-size: 13px; transition: background 0.1s;
815
+ }
816
+
817
+ .gallery nav[role="navigation"] [data-nav-panel] a:hover {
818
+ background: #f1f5f9; color: #1e293b;
819
+ }
820
+
821
+ /* ── ToggleGroup ── */
822
+
823
+ .gallery [role="group"][data-orientation]:has(button[aria-pressed]) {
824
+ display: inline-flex; gap: 0;
825
+
826
+ &[data-orientation="horizontal"] { flex-direction: row; }
827
+ &[data-orientation="vertical"] { flex-direction: column; }
828
+
829
+ button[aria-pressed] {
830
+ padding: 6px 14px; border: 1px solid #cbd5e1; background: white;
831
+ cursor: pointer; font-size: 13px; color: #94a3b8; transition: all 0.15s;
832
+ user-select: none;
833
+
834
+ &:first-of-type { border-radius: 6px 0 0 6px; }
835
+ &:last-of-type { border-radius: 0 6px 6px 0; }
836
+ &:not(:first-of-type) { margin-left: -1px; }
837
+ &[data-pressed="true"] { background: #3b82f6; color: white; border-color: #3b82f6; z-index: 1; }
838
+ &:hover:not([data-pressed="true"]) { background: #f8fafc; color: #475569; }
839
+ &:active { transform: scale(0.97); }
840
+ &:focus-visible { outline: 2px solid #3b82f6; outline-offset: -2px; z-index: 2; }
841
+ }
842
+ }
843
+
844
+ /* ── RadioGroup ── */
845
+
846
+ .gallery [role="radiogroup"] {
847
+ display: inline-flex; gap: 4px;
848
+
849
+ &[data-orientation="horizontal"] { flex-direction: row; }
850
+ &[data-orientation="vertical"] { flex-direction: column; }
851
+
852
+ [role="radio"] {
853
+ display: flex; align-items: center; gap: 8px;
854
+ padding: 6px 14px; border: 1px solid #cbd5e1; border-radius: 6px;
855
+ background: white; cursor: pointer; font-size: 13px; color: #475569; transition: all 0.15s;
856
+
857
+ &[data-checked] { background: #eff6ff; color: #1d4ed8; border-color: #3b82f6; }
858
+ &:hover:not([data-checked]) { background: #f8fafc; }
859
+ &:focus-visible { outline: 2px solid #3b82f6; outline-offset: 2px; }
860
+ }
861
+ }
862
+
863
+ /* ── CheckboxGroup ── */
864
+
865
+ .gallery [role="group"][aria-label] {
866
+ display: inline-flex; gap: 4px;
867
+
868
+ &[data-orientation="horizontal"] { flex-direction: row; }
869
+ &[data-orientation="vertical"] { flex-direction: column; }
870
+
871
+ [role="checkbox"] {
872
+ display: flex; align-items: center; gap: 8px;
873
+ padding: 6px 14px; border: 1px solid #cbd5e1; border-radius: 6px;
874
+ background: white; cursor: pointer; font-size: 13px; color: #475569; transition: all 0.15s;
875
+
876
+ &[data-checked] { background: #eff6ff; color: #1d4ed8; border-color: #3b82f6; }
877
+ &:hover:not([data-checked]) { background: #f8fafc; }
878
+ &:focus-visible { outline: 2px solid #3b82f6; outline-offset: 2px; }
879
+ }
880
+ }
881
+
882
+ /* ── Avatar ── */
883
+
884
+ .gallery [role="img"][aria-label] {
885
+ display: inline-flex; align-items: center; justify-content: center;
886
+ width: 40px; height: 40px; border-radius: 50%; overflow: hidden;
887
+ background: #e2e8f0; color: #475569; font-size: 14px; font-weight: 600;
888
+
889
+ img { width: 100%; height: 100%; object-fit: cover; }
890
+
891
+ [data-initials] { user-select: none; }
892
+
893
+ [data-placeholder] {
894
+ color: #94a3b8; font-size: 18px; font-weight: 400;
895
+ }
896
+ }
897
+
898
+ /* ── ContextMenu ── */
899
+
900
+ .gallery [role="menu"][data-open] {
901
+ background: white; border: 1px solid #cbd5e1; border-radius: 6px;
902
+ box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px;
903
+ min-width: 140px;
904
+ }
905
+
906
+ /* ── Toolbar ── */
907
+
908
+ .gallery [role="toolbar"] {
909
+ display: inline-flex; align-items: center; gap: 2px;
910
+ padding: 4px; background: #f1f5f9; border-radius: 8px;
911
+
912
+ &[data-orientation="vertical"] { flex-direction: column; }
913
+
914
+ button {
915
+ padding: 6px 14px; border: none; border-radius: 5px; background: transparent;
916
+ font-size: 13px; font-weight: 500; color: #475569; cursor: pointer;
917
+ user-select: none; transition: all 0.1s;
918
+
919
+ &:hover { background: white; color: #1e293b; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
920
+ &:active { transform: scale(0.96); }
921
+ &[aria-pressed="true"] { background: white; color: #1d4ed8; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
922
+ &:focus-visible { outline: 2px solid #3b82f6; outline-offset: -2px; }
923
+ }
924
+ }
925
+
926
+ /* ── Table of Contents ── */
927
+
928
+ html { scroll-behavior: auto; }
929
+ html.no-transition, html.no-transition * { transition: none !important; }
930
+
931
+ .toc {
932
+ display: grid; grid-template-columns: 1fr 1fr;
933
+ margin-bottom: 36px;
934
+ background: white; border: 1px solid #e2e8f0; border-radius: 10px;
935
+ overflow: hidden;
936
+ }
937
+
938
+ .toc-nav {
939
+ display: flex; flex-wrap: wrap; align-content: flex-start;
940
+ gap: 12px 20px; padding: 16px 20px;
941
+ }
942
+
943
+ .toc-group { display: flex; flex-direction: column; gap: 3px; }
944
+
945
+ .toc-label {
946
+ font-size: 10px; font-weight: 700; letter-spacing: 0.08em;
947
+ text-transform: uppercase; color: #94a3b8; margin-bottom: 2px;
948
+ }
949
+
950
+ .toc-search {
951
+ width: 100%; padding: 5px 10px; margin-bottom: 8px;
952
+ border: 1px solid #e2e8f0; border-radius: 5px;
953
+ font-size: 12px; background: white; color: #1e293b; outline: none;
954
+ height: 28px;
955
+
956
+ &:focus { border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.1); }
957
+ &::placeholder { color: #b0b8c4; }
958
+ }
959
+
960
+ .toc a {
961
+ font-size: 12px; color: #475569; text-decoration: none;
962
+ padding: 2px 8px; border-radius: 4px; background: #f1f5f9;
963
+ cursor: pointer; transition: transform 0.12s; outline: none;
964
+
965
+ &:hover, &[data-active] { background: #dbeafe; color: #1d4ed8; transform: scale(1.05); }
966
+ &:focus-visible { background: #dbeafe; color: #1d4ed8; outline: 2px solid #3b82f6; outline-offset: 1px; }
967
+ &[data-hidden] { display: none; }
968
+ }
969
+
970
+ .toc-group:not(:has(a:not([data-hidden]))) { display: none; }
971
+
972
+ .toc-detail {
973
+ border-left: 1px solid #e2e8f0; background: #fafbfc;
974
+ padding: 16px 20px; display: flex; flex-direction: column;
975
+ position: relative; min-height: 280px;
976
+ }
977
+
978
+ .toc-detail h3 {
979
+ font-size: 16px; font-weight: 700; letter-spacing: -0.01em;
980
+ display: flex; align-items: center; gap: 8px; margin-bottom: 4px;
981
+ }
982
+
983
+ .toc-detail .toc-desc {
984
+ font-size: 13px; color: #64748b; margin-bottom: 12px;
985
+ }
986
+
987
+ .toc-detail .api { border: none; background: transparent; padding: 0; }
988
+
989
+ .toc-detail .jump {
990
+ position: absolute; top: 16px; right: 20px;
991
+ font-size: 12px; color: #3b82f6; text-decoration: none;
992
+
993
+ &:hover { text-decoration: underline; }
994
+ }
995
+
996
+ .toc-empty {
997
+ display: flex; align-items: center; justify-content: center;
998
+ height: 100%; color: #94a3b8; font-size: 13px;
999
+ }
1000
+
1001
+ /* ── API Reference ── */
1002
+
1003
+ .api {
1004
+ margin-top: 12px; padding: 10px 14px;
1005
+ background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px;
1006
+ }
1007
+
1008
+ .api dl {
1009
+ display: grid; grid-template-columns: auto 1fr;
1010
+ gap: 5px 10px; align-items: baseline; margin: 0;
1011
+ }
1012
+
1013
+ .api dt {
1014
+ font-size: 10px; font-weight: 700; letter-spacing: 0.06em;
1015
+ text-transform: uppercase; color: #94a3b8; white-space: nowrap;
1016
+ }
1017
+
1018
+ .api dd { display: flex; flex-wrap: wrap; gap: 3px; margin: 0; }
1019
+
1020
+ .api code {
1021
+ font-size: 11px; font-family: 'SF Mono', ui-monospace, monospace;
1022
+ padding: 1px 5px; background: white; border: 1px solid #e2e8f0;
1023
+ border-radius: 3px; color: #334155; white-space: nowrap;
1024
+ }
1025
+
1026
+ .api kbd {
1027
+ font-size: 10px; font-family: inherit; font-weight: 500;
1028
+ padding: 1px 5px; background: white; border: 1px solid #d1d5db;
1029
+ border-radius: 3px; color: #374151; box-shadow: 0 1px 0 #d1d5db;
1030
+ white-space: nowrap;
1031
+ }
1032
+
1033
+ .api .api-none { font-size: 11px; color: #cbd5e1; font-style: italic; }
1034
+
1035
+ /* ── Source Code Viewer ── */
1036
+
1037
+ .source-overlay {
1038
+ position: fixed; inset: 0; background: rgba(0,0,0,0.5);
1039
+ display: grid; place-items: center; z-index: 200;
1040
+ animation: fadeIn 150ms ease;
1041
+ }
1042
+
1043
+ .source-modal {
1044
+ background: white; border-radius: 12px;
1045
+ box-shadow: 0 8px 32px rgba(0,0,0,0.2);
1046
+ width: min(90vw, 760px); max-height: 85vh;
1047
+ display: flex; flex-direction: column;
1048
+ overflow: hidden;
1049
+ }
1050
+
1051
+ .source-header {
1052
+ display: flex; align-items: center; justify-content: space-between;
1053
+ padding: 12px 16px; border-bottom: 1px solid #e2e8f0;
1054
+ flex-shrink: 0;
1055
+ }
1056
+
1057
+ .source-title { display: flex; align-items: center; gap: 8px; }
1058
+
1059
+ .source-name {
1060
+ font-size: 15px; font-weight: 700; color: #0f172a;
1061
+ }
1062
+
1063
+ .source-badge {
1064
+ font-size: 10px; font-weight: 600; padding: 2px 8px;
1065
+ border-radius: 10px; background: #dbeafe; color: #1d4ed8;
1066
+ }
1067
+
1068
+ .source-close {
1069
+ width: 28px; height: 28px; border-radius: 6px;
1070
+ border: none; background: none; color: #94a3b8;
1071
+ font-size: 18px; cursor: pointer; display: grid; place-items: center;
1072
+ transition: background 0.15s, color 0.15s;
1073
+
1074
+ &:hover { background: #f1f5f9; color: #475569; }
1075
+ }
1076
+
1077
+ .source-body {
1078
+ overflow: auto; flex: 1; min-height: 0;
1079
+ }
1080
+
1081
+ .source-pre {
1082
+ margin: 0; padding: 16px 0; display: flex;
1083
+ font-size: 13px; line-height: 1.6;
1084
+ font-family: ui-monospace, 'SF Mono', 'Cascadia Code', 'Fira Code', Menlo, monospace;
1085
+ }
1086
+
1087
+ .source-gutter {
1088
+ color: #94a3b8; text-align: right; padding: 0 12px 0 16px;
1089
+ user-select: none; flex-shrink: 0;
1090
+ border-right: 1px solid #e2e8f0;
1091
+ }
1092
+
1093
+ .source-code {
1094
+ padding: 0 16px; flex: 1; min-width: 0;
1095
+ white-space: pre; background: transparent !important;
1096
+ margin: 0;
1097
+ }
1098
+
1099
+ .source-code.hljs { padding: 0 16px; }
1100
+
1101
+ /* ── Dark Mode ── */
1102
+
1103
+ [data-theme="dark"] {
1104
+ body { color: #e2e8f0; background: #0f172a; }
1105
+ button { color: #e2e8f0; }
1106
+
1107
+ .gallery-header p { color: #94a3b8; }
1108
+
1109
+ .theme-toggle { border-color: #334155; background: #1e293b; color: #94a3b8; }
1110
+ .theme-toggle:hover { background: #334155; color: #e2e8f0; }
1111
+
1112
+ .section .section-title { border-bottom-color: #334155; color: #e2e8f0; }
1113
+ .badge { background: #172554; color: #60a5fa; border-color: #1e3a8a; }
1114
+ .badge:hover { background: #1e3a8a; color: #93c5fd; border-color: #3b82f6; }
1115
+ .section .section-desc { color: #94a3b8; }
1116
+ .section .section-nav a { color: #475569; }
1117
+ .section .section-nav a:hover { color: #60a5fa; background: #172554; }
1118
+
1119
+ .demo-row { background: #1e293b; border-color: #334155; }
1120
+ .demo-label { color: #64748b; }
1121
+ .demo-btn { border-color: #475569; background: #334155; color: #e2e8f0; }
1122
+ .demo-row a[href] { color: #60a5fa; }
1123
+ .status { background: #0f172a; color: #94a3b8; }
1124
+
1125
+ .toc { background: #1e293b; border-color: #334155; }
1126
+ .toc-search { border-color: #334155; background: #0f172a; color: #e2e8f0; }
1127
+ .toc-search::placeholder { color: #64748b; }
1128
+ .toc-label { color: #64748b; }
1129
+ .toc a { color: #94a3b8; background: #0f172a; }
1130
+ .toc a:hover, .toc a[data-active] { background: #172554; color: #60a5fa; }
1131
+ .toc-detail { border-left-color: #334155; background: #0f172a; }
1132
+ .toc-detail h3 { color: #e2e8f0; }
1133
+ .toc-detail .toc-desc { color: #94a3b8; }
1134
+ .toc-detail .jump { color: #60a5fa; }
1135
+ .toc-empty { color: #475569; }
1136
+
1137
+ .api { background: #0f172a; border-color: #334155; }
1138
+ .api dt { color: #64748b; }
1139
+ .api code { background: #1e293b; border-color: #334155; color: #cbd5e1; }
1140
+ .api kbd { background: #1e293b; border-color: #475569; color: #94a3b8; box-shadow: 0 1px 0 #475569; }
1141
+
1142
+ /* Select / Combobox */
1143
+ .gallery button[role="combobox"] { border-color: #475569; background: #1e293b; color: #e2e8f0; }
1144
+ .gallery button[role="combobox"][data-open] { border-color: #60a5fa; }
1145
+ .gallery button[role="combobox"][data-placeholder] { color: #64748b; }
1146
+ .gallery div[role="listbox"] { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1147
+ .gallery div[role="option"] { color: #e2e8f0; }
1148
+ .gallery div[role="option"][data-highlighted] { background: #172554; }
1149
+ .gallery div[role="option"][data-selected] { color: #60a5fa; }
1150
+ .gallery .combobox-popup, .gallery .menu-popup { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1151
+ .gallery .option[data-highlighted], .gallery [role="menuitem"][data-highlighted] { background: #172554; }
1152
+ .gallery .option[data-selected] { color: #60a5fa; }
1153
+ .gallery [data-clear] { color: #64748b; }
1154
+ .gallery [data-clear]:hover { color: #94a3b8; background: #334155; }
1155
+
1156
+ /* Text inputs */
1157
+ .gallery .combobox-input, .gallery input[type="text"]:not(.rip-grid-editor) { border-color: #475569; color: #e2e8f0; background: #0f172a; }
1158
+ .gallery input[type="email"], .gallery input[type="password"], .gallery input[type="number"] { border-color: #475569 !important; color: #e2e8f0 !important; background: #0f172a !important; }
1159
+
1160
+ /* Dialog / Drawer */
1161
+ .gallery .dialog-panel { background: #1e293b; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1162
+ .gallery .drawer-panel { background: #1e293b; box-shadow: -4px 0 16px rgba(0,0,0,0.4); }
1163
+ .gallery .drawer-panel h2 { color: #e2e8f0; }
1164
+ .gallery .drawer-panel p { color: #94a3b8; }
1165
+ .gallery .drawer-panel button { border-color: #475569; background: #1e293b; color: #e2e8f0; }
1166
+ .gallery .drawer-panel button:hover { background: #334155; border-color: #64748b; }
1167
+
1168
+ /* Toast */
1169
+ .gallery [role="status"] { background: #1e293b; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1170
+ .gallery [role="status"] button { color: #64748b; }
1171
+ .gallery [role="status"] button:hover { color: #94a3b8; background: #334155; }
1172
+
1173
+ /* Tooltip */
1174
+ .gallery [role="tooltip"] { background: #e2e8f0; color: #0f172a; }
1175
+
1176
+ /* Tabs */
1177
+ .gallery [role="tablist"] { border-bottom-color: #334155; }
1178
+ .gallery [role="tab"] { color: #64748b; }
1179
+ .gallery [role="tab"][data-active] { color: #60a5fa; border-bottom-color: #60a5fa; }
1180
+
1181
+ /* Checkbox / Switch */
1182
+ .gallery [role="checkbox"], .gallery [role="switch"] { border-color: #475569; background: #1e293b; color: #e2e8f0; }
1183
+ .gallery [role="checkbox"][data-checked], .gallery [role="switch"][data-checked] { background: #172554; border-color: #3b82f6; color: #60a5fa; }
1184
+
1185
+ /* Menu */
1186
+ .gallery [aria-haspopup="menu"] { border-color: #475569; background: #1e293b; color: #e2e8f0; }
1187
+ .gallery [role="menu"] { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1188
+ .gallery [role="menu"][data-open] { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1189
+
1190
+ /* Scroll Area */
1191
+ .scroll-demo [data-orientation] { border-color: #334155; }
1192
+
1193
+ /* Number Field */
1194
+ .gallery .nf-wrap [role="group"] { border-color: #475569; }
1195
+ .gallery .nf-wrap [role="group"] input { color: #e2e8f0; background: #1e293b; }
1196
+ .gallery .nf-wrap [role="group"] button { background: #0f172a; color: #94a3b8; }
1197
+ .gallery .nf-wrap [role="group"] button:hover:not(:disabled) { background: #334155; }
1198
+ .gallery .nf-wrap [role="group"] [data-decrement] { border-right-color: #334155; }
1199
+ .gallery .nf-wrap [role="group"] [data-increment] { border-left-color: #334155; }
1200
+
1201
+ /* Slider */
1202
+ .gallery .slider-wrap [data-track] { background: #334155; }
1203
+ .gallery .slider-wrap [data-thumb] { background: #1e293b; border-color: #60a5fa; }
1204
+
1205
+ /* Separator */
1206
+ .gallery [role="none"][data-orientation="horizontal"], .gallery [role="separator"][data-orientation="horizontal"] { border-top-color: #475569; }
1207
+ .gallery [role="none"][data-orientation="vertical"], .gallery [role="separator"][data-orientation="vertical"] { border-left-color: #475569; }
1208
+
1209
+ /* Button */
1210
+ .gallery .btn-demo button { border-color: #475569; background: #1e293b; color: #e2e8f0; }
1211
+ .gallery .btn-demo button:hover:not([data-disabled]) { background: #334155; border-color: #64748b; }
1212
+ .gallery .btn-demo button:active:not([data-disabled]) { background: #0f172a; }
1213
+
1214
+ /* Toggle */
1215
+ .gallery .toggle-heart button { border-color: #334155; background: #1e293b; }
1216
+ .gallery .toggle-heart button:hover { background: #3f1d1d; border-color: #7f1d1d; }
1217
+ .gallery .toggle-heart .heart { color: #475569; }
1218
+ .gallery .toggle-heart [aria-pressed="true"] { background: #3f1d1d; border-color: #f87171; }
1219
+
1220
+ /* Progress / Meter */
1221
+ .progress-track { background: #334155; }
1222
+ .gallery [role="meter"] { background: #334155; }
1223
+ .gallery [role="meter"][data-level="low"] { background: linear-gradient(90deg, #ef4444 var(--meter-percent), #334155 var(--meter-percent)); }
1224
+ .gallery [role="meter"][data-level="optimum"] { background: linear-gradient(90deg, #22c55e var(--meter-percent), #334155 var(--meter-percent)); }
1225
+ .gallery [role="meter"][data-level="high"] { background: linear-gradient(90deg, #f59e0b var(--meter-percent), #334155 var(--meter-percent)); }
1226
+
1227
+ /* Avatar */
1228
+ .gallery [role="img"][aria-label] { background: #334155; color: #94a3b8; }
1229
+ .gallery [role="img"][aria-label] [data-placeholder] { color: #64748b; }
1230
+
1231
+ /* Grid */
1232
+ .grid-container { background: #1e293b; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1233
+ .rip-grid { color: #e2e8f0; }
1234
+ .rip-grid thead th { background: #0f172a; color: #94a3b8; border-bottom-color: #334155; }
1235
+ .rip-grid tbody td { border-bottom-color: #334155; }
1236
+ .rip-grid tbody tr.even td { background: #172032; }
1237
+ .rip-grid-editor { background: #1e293b; color: #e2e8f0; }
1238
+ .sort-badge { color: #94a3b8; background: #334155; }
1239
+
1240
+ /* OTP Field */
1241
+ .gallery [role="group"][aria-label="One-time password"] input { border-color: #475569; background: #0f172a; color: #e2e8f0; }
1242
+
1243
+ /* MultiSelect */
1244
+ .gallery [data-chips] { border-color: #475569; background: #1e293b; }
1245
+ .gallery [data-chips] input { color: #e2e8f0; }
1246
+ .gallery [data-chip] { background: #172554; color: #60a5fa; }
1247
+ .gallery [data-chip] [data-remove] { color: #60a5fa; }
1248
+ .gallery [data-chip] [data-remove]:hover { background: #1e3a5f; }
1249
+
1250
+ /* Editable Value */
1251
+ .gallery [data-edit-trigger] { color: #64748b; }
1252
+ .gallery [data-edit-trigger]:hover { color: #60a5fa; background: #172554; }
1253
+ .gallery [data-editor][data-open] { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1254
+ .gallery [data-editor][data-open] input { border-color: #475569; background: #0f172a; color: #e2e8f0; }
1255
+
1256
+ /* DatePicker */
1257
+ .gallery [data-calendar] { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1258
+ .gallery [data-header] [data-prev], .gallery [data-header] [data-next] { color: #94a3b8; }
1259
+ .gallery [data-header] [data-prev]:hover, .gallery [data-header] [data-next]:hover { background: #334155; }
1260
+ .gallery [data-header] [data-month-label] { color: #e2e8f0; }
1261
+ .gallery [data-weekdays] [data-weekday] { color: #64748b; }
1262
+ .gallery [data-days] button { color: #e2e8f0; }
1263
+ .gallery [data-days] button:hover { background: #334155; }
1264
+ .gallery [data-days] button[data-outside] { color: #475569; }
1265
+ .gallery [data-days] button[data-in-range] { background: #172554; }
1266
+ .gallery [data-trigger]:has(+ [data-calendar]) { border-color: #475569; background: #334155; color: #e2e8f0; }
1267
+ .gallery [data-trigger][aria-haspopup] { border-color: #475569; background: #334155; color: #e2e8f0; }
1268
+
1269
+ /* Field / Fieldset / Form */
1270
+ .gallery [data-label] { color: #cbd5e1; }
1271
+ .gallery [data-description] { color: #64748b; }
1272
+ .gallery fieldset { border-color: #334155; }
1273
+ .gallery fieldset legend[data-legend] { color: #e2e8f0; }
1274
+ .gallery form button[type="submit"] { background: #3b82f6; }
1275
+ .gallery form button[type="submit"]:hover { background: #2563eb; }
1276
+ .gallery [data-invalid] input { border-color: #ef4444; }
1277
+
1278
+ /* Menubar */
1279
+ .gallery [role="menubar"] { background: #0f172a; border-color: #334155; }
1280
+ .gallery [role="menubar"] [data-menu-trigger] { color: #94a3b8; }
1281
+ .gallery [role="menubar"] [data-menu-trigger]:hover, .gallery [role="menubar"] [data-menu-trigger][data-open] { background: #1e293b; color: #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1282
+ .gallery [role="menubar"] [role="menu"] { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1283
+
1284
+ /* Navigation Menu */
1285
+ .gallery nav[role="navigation"] { background: #0f172a; }
1286
+ .gallery nav[role="navigation"] > a, .gallery nav[role="navigation"] > div > button { color: #94a3b8; }
1287
+ .gallery nav[role="navigation"] > a:hover, .gallery nav[role="navigation"] > div > button:hover, .gallery nav[role="navigation"] > div > button[data-open] { background: #1e293b; color: #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1288
+ .gallery nav[role="navigation"] [data-nav-panel] { background: #1e293b; border-color: #475569; box-shadow: 0 8px 24px rgba(0,0,0,0.4); }
1289
+ .gallery nav[role="navigation"] [data-nav-panel] a { color: #94a3b8; }
1290
+ .gallery nav[role="navigation"] [data-nav-panel] a:hover { background: #334155; color: #e2e8f0; }
1291
+
1292
+ /* ToggleGroup / RadioGroup / CheckboxGroup */
1293
+ .gallery [role="group"][data-orientation] button[aria-pressed] { border-color: #475569; background: #1e293b; color: #64748b; }
1294
+ .gallery [role="group"][data-orientation] button[aria-pressed][data-pressed="true"] { background: #3b82f6; color: white; border-color: #3b82f6; }
1295
+ .gallery [role="group"][data-orientation] button[aria-pressed]:hover:not([data-pressed="true"]) { background: #334155; color: #94a3b8; }
1296
+ .gallery [role="radiogroup"] [role="radio"] { border-color: #475569; background: #1e293b; color: #94a3b8; }
1297
+ .gallery [role="radiogroup"] [role="radio"][data-checked] { background: #172554; color: #60a5fa; border-color: #3b82f6; }
1298
+ .gallery [role="radiogroup"] [role="radio"]:hover:not([data-checked]) { background: #334155; }
1299
+ .gallery [role="group"][aria-label] [role="checkbox"] { border-color: #475569; background: #1e293b; color: #94a3b8; }
1300
+ .gallery [role="group"][aria-label] [role="checkbox"][data-checked] { background: #172554; color: #60a5fa; border-color: #3b82f6; }
1301
+ .gallery [role="group"][aria-label] [role="checkbox"]:hover:not([data-checked]) { background: #334155; }
1302
+
1303
+ /* Toolbar */
1304
+ .gallery [role="toolbar"] { background: #0f172a; }
1305
+ .gallery [role="toolbar"] button { color: #94a3b8; }
1306
+ .gallery [role="toolbar"] button:hover { background: #1e293b; color: #e2e8f0; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1307
+ .gallery [role="toolbar"] button[aria-pressed="true"] { background: #1e293b; color: #60a5fa; box-shadow: 0 1px 3px rgba(0,0,0,0.3); }
1308
+
1309
+ /* Shared demo styles */
1310
+ .context-zone { border-color: #64748b; color: #94a3b8; }
1311
+ .dialog-desc { color: #94a3b8; }
1312
+ .floating-panel { background: #1e293b; border-color: #475569; box-shadow: 0 4px 16px rgba(0,0,0,0.4); }
1313
+ .floating-title { color: #e2e8f0; }
1314
+ .floating-desc { color: #94a3b8; }
1315
+
1316
+ /* Accordion demo */
1317
+ .accordion-trigger, .gallery [data-trigger][data-trigger] button, .gallery button[data-trigger] { border-color: #475569 !important; background: #334155 !important; color: #e2e8f0 !important; }
1318
+ .accordion-content { color: #94a3b8; }
1319
+
1320
+ /* Source Code Viewer */
1321
+ .source-overlay { background: rgba(0,0,0,0.6); }
1322
+ .source-modal { background: #1e293b; box-shadow: 0 8px 32px rgba(0,0,0,0.5); }
1323
+ .source-header { border-bottom-color: #334155; }
1324
+ .source-name { color: #e2e8f0; }
1325
+ .source-badge { background: #172554; color: #60a5fa; }
1326
+ .source-close { color: #64748b; }
1327
+ .source-close:hover { background: #334155; color: #e2e8f0; }
1328
+ .source-gutter { color: #475569; border-right-color: #334155; }
1329
+ .source-code { color: #e2e8f0; }
1330
+ .source-code .hljs-comment { color: #64748b; }
1331
+ .source-code .hljs-keyword,
1332
+ .source-code .hljs-built_in { color: #c084fc; }
1333
+ .source-code .hljs-string,
1334
+ .source-code .hljs-regexp { color: #86efac; }
1335
+ .source-code .hljs-number,
1336
+ .source-code .hljs-literal { color: #fbbf24; }
1337
+ .source-code .hljs-title,
1338
+ .source-code .hljs-function { color: #60a5fa; }
1339
+ .source-code .hljs-params { color: #f0abfc; }
1340
+ .source-code .hljs-attr,
1341
+ .source-code .hljs-attribute { color: #67e8f9; }
1342
+ .source-code .hljs-variable,
1343
+ .source-code .hljs-property { color: #e2e8f0; }
1344
+ .source-code .hljs-subst { color: #fca5a5; }
1345
+ .source-code .hljs-symbol { color: #fbbf24; }
1346
+ }
1347
+
1348
+ /* ── Shared demo styles ── */
1349
+
1350
+ .context-zone {
1351
+ padding: 24px; border: 2px dashed #cbd5e1; border-radius: 8px;
1352
+ text-align: center; color: #64748b; cursor: context-menu;
1353
+ }
1354
+
1355
+ .dialog-desc { color: #64748b; margin-bottom: 20px; }
1356
+
1357
+ .floating-panel {
1358
+ padding: 12px 16px; background: white; border: 1px solid #cbd5e1;
1359
+ border-radius: 8px; box-shadow: 0 4px 16px rgba(0,0,0,0.12); min-width: 200px;
1360
+ }
1361
+
1362
+ .floating-title { font-size: 14px; font-weight: 600; color: #1e293b; margin-bottom: 4px; }
1363
+ .floating-desc { font-size: 13px; color: #64748b; margin-top: 4px; }
1364
+
1365
+ /* ── Accordion demo ── */
1366
+
1367
+ .accordion-trigger {
1368
+ width: 100%; text-align: left; padding: 8px 12px;
1369
+ border: 1px solid #e2e8f0; border-radius: 6px; background: white;
1370
+ font-size: 14px; cursor: pointer; margin-bottom: 4px;
1371
+ }
1372
+
1373
+ .accordion-content { padding: 8px 12px; color: #64748b; font-size: 13px; }
1374
+
1375
+ /* ── Animations ── */
1376
+
1377
+ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
1378
+ @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }
1379
+ @keyframes slideIn { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: none; } }