@ryanhelsing/ry-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +223 -0
  2. package/dist/components/ry-accordion.d.ts +24 -0
  3. package/dist/components/ry-accordion.d.ts.map +1 -0
  4. package/dist/components/ry-alert.d.ts +19 -0
  5. package/dist/components/ry-alert.d.ts.map +1 -0
  6. package/dist/components/ry-button.d.ts +19 -0
  7. package/dist/components/ry-button.d.ts.map +1 -0
  8. package/dist/components/ry-code.d.ts +27 -0
  9. package/dist/components/ry-code.d.ts.map +1 -0
  10. package/dist/components/ry-color-input.d.ts +28 -0
  11. package/dist/components/ry-color-input.d.ts.map +1 -0
  12. package/dist/components/ry-color-picker.d.ts +52 -0
  13. package/dist/components/ry-color-picker.d.ts.map +1 -0
  14. package/dist/components/ry-drawer.d.ts +28 -0
  15. package/dist/components/ry-drawer.d.ts.map +1 -0
  16. package/dist/components/ry-dropdown.d.ts +24 -0
  17. package/dist/components/ry-dropdown.d.ts.map +1 -0
  18. package/dist/components/ry-example.d.ts +23 -0
  19. package/dist/components/ry-example.d.ts.map +1 -0
  20. package/dist/components/ry-field.d.ts +18 -0
  21. package/dist/components/ry-field.d.ts.map +1 -0
  22. package/dist/components/ry-icon.d.ts +27 -0
  23. package/dist/components/ry-icon.d.ts.map +1 -0
  24. package/dist/components/ry-knob.d.ts +27 -0
  25. package/dist/components/ry-knob.d.ts.map +1 -0
  26. package/dist/components/ry-modal.d.ts +23 -0
  27. package/dist/components/ry-modal.d.ts.map +1 -0
  28. package/dist/components/ry-select.d.ts +29 -0
  29. package/dist/components/ry-select.d.ts.map +1 -0
  30. package/dist/components/ry-slider.d.ts +30 -0
  31. package/dist/components/ry-slider.d.ts.map +1 -0
  32. package/dist/components/ry-switch.d.ts +22 -0
  33. package/dist/components/ry-switch.d.ts.map +1 -0
  34. package/dist/components/ry-tabs.d.ts +21 -0
  35. package/dist/components/ry-tabs.d.ts.map +1 -0
  36. package/dist/components/ry-theme-toggle.d.ts +21 -0
  37. package/dist/components/ry-theme-toggle.d.ts.map +1 -0
  38. package/dist/components/ry-toast.d.ts +31 -0
  39. package/dist/components/ry-toast.d.ts.map +1 -0
  40. package/dist/components/ry-toggle-button.d.ts +31 -0
  41. package/dist/components/ry-toggle-button.d.ts.map +1 -0
  42. package/dist/components/ry-tooltip.d.ts +23 -0
  43. package/dist/components/ry-tooltip.d.ts.map +1 -0
  44. package/dist/core/ry-element.d.ts +66 -0
  45. package/dist/core/ry-element.d.ts.map +1 -0
  46. package/dist/core/ry-icons.d.ts +38 -0
  47. package/dist/core/ry-icons.d.ts.map +1 -0
  48. package/dist/core/ry-transform.d.ts +35 -0
  49. package/dist/core/ry-transform.d.ts.map +1 -0
  50. package/dist/css/ry-base.css +155 -0
  51. package/dist/css/ry-components.css +1195 -0
  52. package/dist/css/ry-layout.css +240 -0
  53. package/dist/css/ry-structure.css +1737 -0
  54. package/dist/css/ry-theme.css +1433 -0
  55. package/dist/css/ry-tokens.css +145 -0
  56. package/dist/css/ry-ui.css +1207 -0
  57. package/dist/ry-ui.d.ts +54 -0
  58. package/dist/ry-ui.d.ts.map +1 -0
  59. package/dist/ry-ui.js +2433 -0
  60. package/dist/ry-ui.js.map +1 -0
  61. package/dist/types.d.ts +33 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/package.json +40 -0
@@ -0,0 +1,1737 @@
1
+ /**
2
+ * ry-ui Structure CSS
3
+ *
4
+ * Pure layout and behavioral styles using data-ry-target selectors.
5
+ * No colors, shadows, or decorative properties.
6
+ * Works with any theme or no theme at all.
7
+ *
8
+ * Users can bring their own styling (e.g., Tailwind) - classes are optional.
9
+ * JS queries use [data-ry-target], structure CSS uses [data-ry-target],
10
+ * only theme CSS requires .ry-* classes.
11
+ */
12
+
13
+ /* ═══════════════════════════════════════════════════════════════
14
+ SCROLL LOCK (for modals, drawers)
15
+ ═══════════════════════════════════════════════════════════════ */
16
+
17
+ body[data-ry-scroll-lock] {
18
+ overflow: hidden;
19
+ padding-right: var(--ry-scrollbar-width, 0);
20
+ }
21
+
22
+ /* ═══════════════════════════════════════════════════════════════
23
+ TRANSFORM WRAPPER (FOUC prevention)
24
+ ═══════════════════════════════════════════════════════════════ */
25
+
26
+ ry {
27
+ display: none;
28
+ }
29
+
30
+ /* ═══════════════════════════════════════════════════════════════
31
+ BOX SIZING RESET
32
+ ═══════════════════════════════════════════════════════════════ */
33
+
34
+ [data-ry-target],
35
+ ry-page, ry-header, ry-main, ry-footer, ry-section, ry-aside,
36
+ ry-grid, ry-stack, ry-cluster, ry-split, ry-center,
37
+ ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown,
38
+ ry-button, ry-badge, ry-alert, ry-field, ry-nav, ry-logo, ry-actions,
39
+ ry-accordion-item, ry-tab, ry-menu, ry-menu-item, ry-divider,
40
+ ry-theme-toggle, ry-select, ry-switch, ry-tooltip, ry-drawer, ry-toast,
41
+ ry-toggle-button, ry-knob, ry-slider, ry-color-picker, ry-color-input {
42
+ box-sizing: border-box;
43
+ }
44
+
45
+ [data-ry-target] *,
46
+ ry-page *, ry-header *, ry-main *, ry-footer *, ry-section *,
47
+ ry-card *, ry-accordion *, ry-modal *, ry-tabs *, ry-dropdown * {
48
+ box-sizing: inherit;
49
+ }
50
+
51
+ /* ═══════════════════════════════════════════════════════════════
52
+ CUSTOM ELEMENT DISPLAY DEFAULTS
53
+ ═══════════════════════════════════════════════════════════════ */
54
+
55
+ /* Block elements */
56
+ ry-page,
57
+ ry-header,
58
+ ry-main,
59
+ ry-footer,
60
+ ry-section,
61
+ ry-aside,
62
+ ry-card,
63
+ ry-accordion,
64
+ ry-accordion-item,
65
+ ry-tabs,
66
+ ry-tab,
67
+ ry-alert,
68
+ ry-field {
69
+ display: block;
70
+ }
71
+
72
+ /* Flex containers */
73
+ ry-grid,
74
+ ry-stack,
75
+ ry-cluster,
76
+ ry-split,
77
+ ry-center,
78
+ ry-nav,
79
+ ry-actions {
80
+ display: flex;
81
+ }
82
+
83
+ /* Inline elements */
84
+ ry-badge,
85
+ ry-logo {
86
+ display: inline-flex;
87
+ }
88
+
89
+ /* Contents (wrapper doesn't affect layout) */
90
+ ry-modal,
91
+ ry-drawer {
92
+ display: contents;
93
+ }
94
+
95
+ /* Button-like elements */
96
+ ry-button,
97
+ ry-menu-item {
98
+ display: inline-flex;
99
+ }
100
+
101
+ /* ═══════════════════════════════════════════════════════════════
102
+ PAGE LAYOUT
103
+ ═══════════════════════════════════════════════════════════════ */
104
+
105
+ ry-page {
106
+ display: flex;
107
+ flex-direction: column;
108
+ min-height: 100vh;
109
+ min-height: 100dvh;
110
+ }
111
+
112
+ /* ═══════════════════════════════════════════════════════════════
113
+ HEADER
114
+ ═══════════════════════════════════════════════════════════════ */
115
+
116
+ ry-header {
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: space-between;
120
+ gap: var(--ry-space-4, 1rem);
121
+ padding: var(--ry-space-4, 1rem) var(--ry-space-6, 1.5rem);
122
+ }
123
+
124
+ ry-header[sticky] {
125
+ position: sticky;
126
+ top: 0;
127
+ z-index: var(--ry-z-sticky, 1020);
128
+ }
129
+
130
+ /* ═══════════════════════════════════════════════════════════════
131
+ MAIN
132
+ ═══════════════════════════════════════════════════════════════ */
133
+
134
+ ry-main {
135
+ flex: 1;
136
+ width: 100%;
137
+ max-width: 1200px;
138
+ margin: 0 auto;
139
+ padding: var(--ry-space-8, 2rem) var(--ry-space-6, 1.5rem);
140
+ }
141
+
142
+ /* ═══════════════════════════════════════════════════════════════
143
+ FOOTER
144
+ ═══════════════════════════════════════════════════════════════ */
145
+
146
+ ry-footer {
147
+ padding: var(--ry-space-6, 1.5rem);
148
+ text-align: center;
149
+ }
150
+
151
+ /* ═══════════════════════════════════════════════════════════════
152
+ SECTION
153
+ ═══════════════════════════════════════════════════════════════ */
154
+
155
+ ry-section {
156
+ margin-bottom: var(--ry-space-12, 3rem);
157
+ }
158
+
159
+ ry-section:last-child {
160
+ margin-bottom: 0;
161
+ }
162
+
163
+ /* ═══════════════════════════════════════════════════════════════
164
+ GRID
165
+ ═══════════════════════════════════════════════════════════════ */
166
+
167
+ ry-grid {
168
+ display: grid;
169
+ gap: var(--ry-space-4, 1rem);
170
+ }
171
+
172
+ ry-grid[cols="1"] { grid-template-columns: 1fr; }
173
+ ry-grid[cols="2"] { grid-template-columns: repeat(2, 1fr); }
174
+ ry-grid[cols="3"] { grid-template-columns: repeat(3, 1fr); }
175
+ ry-grid[cols="4"] { grid-template-columns: repeat(4, 1fr); }
176
+ ry-grid[cols="5"] { grid-template-columns: repeat(5, 1fr); }
177
+ ry-grid[cols="6"] { grid-template-columns: repeat(6, 1fr); }
178
+
179
+ @media (max-width: 640px) {
180
+ ry-grid[cols="2"],
181
+ ry-grid[cols="3"],
182
+ ry-grid[cols="4"],
183
+ ry-grid[cols="5"],
184
+ ry-grid[cols="6"] {
185
+ grid-template-columns: 1fr;
186
+ }
187
+ }
188
+
189
+ @media (min-width: 641px) and (max-width: 1024px) {
190
+ ry-grid[cols="3"],
191
+ ry-grid[cols="4"],
192
+ ry-grid[cols="5"],
193
+ ry-grid[cols="6"] {
194
+ grid-template-columns: repeat(2, 1fr);
195
+ }
196
+ }
197
+
198
+ /* ═══════════════════════════════════════════════════════════════
199
+ STACK (vertical)
200
+ ═══════════════════════════════════════════════════════════════ */
201
+
202
+ ry-stack {
203
+ display: flex;
204
+ flex-direction: column;
205
+ gap: var(--ry-space-4, 1rem);
206
+ }
207
+
208
+ ry-stack[gap="sm"] { gap: var(--ry-space-2, 0.5rem); }
209
+ ry-stack[gap="md"] { gap: var(--ry-space-4, 1rem); }
210
+ ry-stack[gap="lg"] { gap: var(--ry-space-6, 1.5rem); }
211
+ ry-stack[gap="xl"] { gap: var(--ry-space-8, 2rem); }
212
+
213
+ /* ═══════════════════════════════════════════════════════════════
214
+ CLUSTER (horizontal, wraps)
215
+ ═══════════════════════════════════════════════════════════════ */
216
+
217
+ ry-cluster {
218
+ display: flex;
219
+ flex-wrap: wrap;
220
+ align-items: center;
221
+ gap: var(--ry-space-3, 0.75rem);
222
+ }
223
+
224
+ ry-cluster[gap="sm"] { gap: var(--ry-space-2, 0.5rem); }
225
+ ry-cluster[gap="md"] { gap: var(--ry-space-3, 0.75rem); }
226
+ ry-cluster[gap="lg"] { gap: var(--ry-space-4, 1rem); }
227
+
228
+ /* ═══════════════════════════════════════════════════════════════
229
+ SPLIT (two columns)
230
+ ═══════════════════════════════════════════════════════════════ */
231
+
232
+ ry-split {
233
+ display: flex;
234
+ gap: var(--ry-space-6, 1.5rem);
235
+ }
236
+
237
+ ry-split > :first-child {
238
+ flex: 1;
239
+ }
240
+
241
+ ry-split > :last-child {
242
+ flex-shrink: 0;
243
+ width: 300px;
244
+ }
245
+
246
+ @media (max-width: 768px) {
247
+ ry-split {
248
+ flex-direction: column;
249
+ }
250
+ ry-split > :last-child {
251
+ width: 100%;
252
+ }
253
+ }
254
+
255
+ /* ═══════════════════════════════════════════════════════════════
256
+ CENTER
257
+ ═══════════════════════════════════════════════════════════════ */
258
+
259
+ ry-center {
260
+ display: flex;
261
+ flex-direction: column;
262
+ align-items: center;
263
+ justify-content: center;
264
+ text-align: center;
265
+ }
266
+
267
+ /* ═══════════════════════════════════════════════════════════════
268
+ NAV
269
+ ═══════════════════════════════════════════════════════════════ */
270
+
271
+ ry-nav {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: var(--ry-space-4, 1rem);
275
+ }
276
+
277
+ ry-nav a {
278
+ text-decoration: none;
279
+ }
280
+
281
+ /* ═══════════════════════════════════════════════════════════════
282
+ LOGO
283
+ ═══════════════════════════════════════════════════════════════ */
284
+
285
+ ry-logo {
286
+ display: inline-flex;
287
+ align-items: center;
288
+ }
289
+
290
+ /* ═══════════════════════════════════════════════════════════════
291
+ ACTIONS
292
+ ═══════════════════════════════════════════════════════════════ */
293
+
294
+ ry-actions {
295
+ display: flex;
296
+ align-items: center;
297
+ gap: var(--ry-space-2, 0.5rem);
298
+ }
299
+
300
+ /* ═══════════════════════════════════════════════════════════════
301
+ DIVIDER
302
+ ═══════════════════════════════════════════════════════════════ */
303
+
304
+ ry-divider {
305
+ display: block;
306
+ height: 1px;
307
+ margin: var(--ry-space-4, 1rem) 0;
308
+ }
309
+
310
+ ry-divider[vertical] {
311
+ width: 1px;
312
+ height: auto;
313
+ align-self: stretch;
314
+ margin: 0 var(--ry-space-4, 1rem);
315
+ }
316
+
317
+ /* ═══════════════════════════════════════════════════════════════
318
+ BUTTONS
319
+ ═══════════════════════════════════════════════════════════════ */
320
+
321
+ ry-button {
322
+ display: inline-flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ gap: var(--ry-space-2, 0.5rem);
326
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-4, 1rem);
327
+ white-space: nowrap;
328
+ cursor: pointer;
329
+ user-select: none;
330
+ }
331
+
332
+ ry-button[disabled] {
333
+ cursor: not-allowed;
334
+ pointer-events: none;
335
+ }
336
+
337
+ /* Button sizes */
338
+ ry-button[size="sm"] {
339
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-3, 0.75rem);
340
+ }
341
+
342
+ ry-button[size="lg"] {
343
+ padding: var(--ry-space-3, 0.75rem) var(--ry-space-6, 1.5rem);
344
+ }
345
+
346
+ /* ═══════════════════════════════════════════════════════════════
347
+ TOGGLE BUTTON
348
+ ═══════════════════════════════════════════════════════════════ */
349
+
350
+ ry-toggle-button {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ justify-content: center;
354
+ gap: var(--ry-space-2, 0.5rem);
355
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-4, 1rem);
356
+ white-space: nowrap;
357
+ cursor: pointer;
358
+ user-select: none;
359
+ }
360
+
361
+ ry-toggle-button[disabled] {
362
+ cursor: not-allowed;
363
+ pointer-events: none;
364
+ }
365
+
366
+ /* Toggle button sizes */
367
+ ry-toggle-button[size="sm"] {
368
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-3, 0.75rem);
369
+ }
370
+
371
+ ry-toggle-button[size="lg"] {
372
+ padding: var(--ry-space-3, 0.75rem) var(--ry-space-6, 1.5rem);
373
+ }
374
+
375
+ /* Icon-only toggle button */
376
+ ry-toggle-button[icon]:empty {
377
+ padding: var(--ry-space-2, 0.5rem);
378
+ }
379
+
380
+ ry-toggle-button[icon][size="sm"]:empty {
381
+ padding: var(--ry-space-1, 0.25rem);
382
+ }
383
+
384
+ ry-toggle-button[icon][size="lg"]:empty {
385
+ padding: var(--ry-space-3, 0.75rem);
386
+ }
387
+
388
+ /* Block toggle button (card-style, full width) */
389
+ ry-toggle-button[block] {
390
+ display: block;
391
+ width: 100%;
392
+ text-align: left;
393
+ padding: var(--ry-space-4, 1rem);
394
+ }
395
+
396
+ /* ═══════════════════════════════════════════════════════════════
397
+ KNOB
398
+ ═══════════════════════════════════════════════════════════════ */
399
+
400
+ ry-knob {
401
+ display: inline-flex;
402
+ flex-direction: column;
403
+ align-items: center;
404
+ gap: var(--ry-space-1, 0.25rem);
405
+ user-select: none;
406
+ outline: none;
407
+ }
408
+
409
+ ry-knob[disabled] {
410
+ pointer-events: none;
411
+ }
412
+
413
+ ry-knob [data-ry-target="ring"] {
414
+ --knob-size: 64px;
415
+ --knob-rotation: -135deg;
416
+ --knob-percent: 0;
417
+
418
+ position: relative;
419
+ width: var(--knob-size);
420
+ height: var(--knob-size);
421
+ cursor: grab;
422
+ }
423
+
424
+ ry-knob [data-ry-target="ring"].ry-knob__ring--dragging {
425
+ cursor: grabbing;
426
+ }
427
+
428
+ ry-knob [data-ry-target="cap"] {
429
+ position: absolute;
430
+ inset: 0;
431
+ transform: rotate(var(--knob-rotation));
432
+ }
433
+
434
+ ry-knob [data-ry-target="indicator"] {
435
+ position: absolute;
436
+ width: 3px;
437
+ height: 10px;
438
+ top: 6px;
439
+ left: 50%;
440
+ margin-left: -1.5px;
441
+ }
442
+
443
+ ry-knob [data-ry-target="display"] {
444
+ display: block;
445
+ min-width: 3em;
446
+ text-align: center;
447
+ }
448
+
449
+ ry-knob [data-ry-target="label"] {
450
+ display: block;
451
+ text-align: center;
452
+ }
453
+
454
+ /* Sizes */
455
+ ry-knob[size="sm"] [data-ry-target="ring"] { --knob-size: 48px; }
456
+ ry-knob[size="lg"] [data-ry-target="ring"] { --knob-size: 80px; }
457
+
458
+ /* ═══════════════════════════════════════════════════════════════
459
+ SLIDER
460
+ ═══════════════════════════════════════════════════════════════ */
461
+
462
+ ry-slider {
463
+ display: block;
464
+ position: relative;
465
+ padding: var(--ry-space-4, 1rem) 0;
466
+ touch-action: none;
467
+ user-select: none;
468
+ }
469
+
470
+ ry-slider[disabled] {
471
+ pointer-events: none;
472
+ }
473
+
474
+ ry-slider [data-ry-target="track"] {
475
+ position: relative;
476
+ height: var(--ry-slider-track, 14px);
477
+ cursor: pointer;
478
+ }
479
+
480
+ ry-slider [data-ry-target="fill"] {
481
+ position: absolute;
482
+ height: 100%;
483
+ }
484
+
485
+ ry-slider [data-ry-target^="thumb"] {
486
+ position: absolute;
487
+ width: var(--ry-slider-thumb, 32px);
488
+ height: var(--ry-slider-thumb, 32px);
489
+ top: 50%;
490
+ transform: translate(-50%, -50%);
491
+ cursor: grab;
492
+ }
493
+
494
+ ry-slider [data-ry-target^="thumb"]:active {
495
+ cursor: grabbing;
496
+ }
497
+
498
+ ry-slider [data-ry-target="labels"] {
499
+ display: flex;
500
+ justify-content: space-between;
501
+ margin-top: var(--ry-space-2, 0.5rem);
502
+ pointer-events: none;
503
+ }
504
+
505
+ ry-slider [data-ry-target^="tooltip"] {
506
+ position: absolute;
507
+ bottom: calc(100% + 8px);
508
+ left: 50%;
509
+ transform: translateX(-50%);
510
+ white-space: nowrap;
511
+ opacity: 0;
512
+ visibility: hidden;
513
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
514
+ visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
515
+ pointer-events: none;
516
+ }
517
+
518
+ ry-slider [data-ry-target^="thumb"]:hover [data-ry-target^="tooltip"],
519
+ ry-slider [data-ry-target^="thumb"]:focus [data-ry-target^="tooltip"],
520
+ ry-slider[data-dragging] [data-ry-target^="tooltip"] {
521
+ opacity: 1;
522
+ visibility: visible;
523
+ }
524
+
525
+ /* Vertical */
526
+ ry-slider[vertical] {
527
+ display: inline-flex;
528
+ width: auto;
529
+ height: 200px;
530
+ padding: 0 var(--ry-space-4, 1rem);
531
+ }
532
+
533
+ ry-slider[vertical] [data-ry-target="track"] {
534
+ width: var(--ry-slider-track, 14px);
535
+ height: 100%;
536
+ }
537
+
538
+ ry-slider[vertical] [data-ry-target="fill"] {
539
+ width: 100%;
540
+ height: auto;
541
+ bottom: 0;
542
+ left: 0;
543
+ }
544
+
545
+ ry-slider[vertical] [data-ry-target^="thumb"] {
546
+ left: 50%;
547
+ top: auto;
548
+ transform: translate(-50%, 50%);
549
+ }
550
+
551
+ ry-slider[vertical] [data-ry-target="labels"] {
552
+ flex-direction: column-reverse;
553
+ justify-content: space-between;
554
+ height: 100%;
555
+ margin-top: 0;
556
+ margin-left: var(--ry-space-2, 0.5rem);
557
+ }
558
+
559
+ /* Sizes */
560
+ ry-slider[size="sm"] { --ry-slider-track: 10px; --ry-slider-thumb: 24px; }
561
+ ry-slider[size="lg"] { --ry-slider-track: 18px; --ry-slider-thumb: 40px; }
562
+
563
+ /* ═══════════════════════════════════════════════════════════════
564
+ CARDS
565
+ ═══════════════════════════════════════════════════════════════ */
566
+
567
+ ry-card {
568
+ display: block;
569
+ padding: var(--ry-space-6, 1.5rem);
570
+ }
571
+
572
+ ry-card h3 {
573
+ margin: 0 0 var(--ry-space-2, 0.5rem) 0;
574
+ }
575
+
576
+ ry-card p {
577
+ margin: 0 0 var(--ry-space-4, 1rem) 0;
578
+ }
579
+
580
+ ry-card p:last-child {
581
+ margin-bottom: 0;
582
+ }
583
+
584
+ /* ═══════════════════════════════════════════════════════════════
585
+ BADGES
586
+ ═══════════════════════════════════════════════════════════════ */
587
+
588
+ ry-badge {
589
+ display: inline-flex;
590
+ align-items: center;
591
+ padding: var(--ry-space-1, 0.25rem) var(--ry-space-2, 0.5rem);
592
+ line-height: 1;
593
+ }
594
+
595
+ /* ═══════════════════════════════════════════════════════════════
596
+ ALERTS
597
+ ═══════════════════════════════════════════════════════════════ */
598
+
599
+ ry-alert {
600
+ display: flex;
601
+ gap: var(--ry-space-3, 0.75rem);
602
+ padding: var(--ry-space-4, 1rem);
603
+ }
604
+
605
+ ry-alert [slot="title"] {
606
+ margin: 0 0 var(--ry-space-1, 0.25rem) 0;
607
+ }
608
+
609
+ ry-alert p,
610
+ ry-alert [data-ry-target="content"] {
611
+ margin: 0;
612
+ }
613
+
614
+ /* ═══════════════════════════════════════════════════════════════
615
+ FORM ELEMENTS
616
+ ═══════════════════════════════════════════════════════════════ */
617
+
618
+ ry-field input,
619
+ ry-field textarea,
620
+ ry-field select {
621
+ display: block;
622
+ width: 100%;
623
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
624
+ }
625
+
626
+ ry-field input:disabled,
627
+ ry-field textarea:disabled {
628
+ cursor: not-allowed;
629
+ }
630
+
631
+ ry-field label,
632
+ ry-field [data-ry-target="label"] {
633
+ display: block;
634
+ margin-bottom: var(--ry-space-2, 0.5rem);
635
+ }
636
+
637
+ ry-field {
638
+ display: block;
639
+ margin-bottom: var(--ry-space-4, 1rem);
640
+ }
641
+
642
+ /* ═══════════════════════════════════════════════════════════════
643
+ ACCORDION
644
+ ═══════════════════════════════════════════════════════════════ */
645
+
646
+ ry-accordion {
647
+ overflow: hidden;
648
+ }
649
+
650
+ ry-accordion [data-ry-target="trigger"] {
651
+ display: flex;
652
+ align-items: center;
653
+ justify-content: space-between;
654
+ width: 100%;
655
+ padding: var(--ry-space-4, 1rem) var(--ry-space-6, 1.5rem);
656
+ text-align: left;
657
+ border: none;
658
+ cursor: pointer;
659
+ }
660
+
661
+ ry-accordion [data-ry-target="icon"] {
662
+ flex-shrink: 0;
663
+ transition: transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
664
+ }
665
+
666
+ ry-accordion [data-ry-target="item"][data-ry-state="open"] [data-ry-target="icon"] {
667
+ transform: rotate(180deg);
668
+ }
669
+
670
+ ry-accordion [data-ry-target="panel"] {
671
+ overflow: hidden;
672
+ }
673
+
674
+ ry-accordion [data-ry-target="item"][data-ry-state="closed"] [data-ry-target="panel"] {
675
+ display: none;
676
+ }
677
+
678
+ ry-accordion [data-ry-target="panel"] > * {
679
+ padding: var(--ry-space-4, 1rem) var(--ry-space-6, 1.5rem);
680
+ }
681
+
682
+ /* ═══════════════════════════════════════════════════════════════
683
+ TABS
684
+ ═══════════════════════════════════════════════════════════════ */
685
+
686
+ ry-tabs {
687
+ display: block;
688
+ }
689
+
690
+ ry-tabs [data-ry-target="list"] {
691
+ display: flex;
692
+ gap: var(--ry-space-1, 0.25rem);
693
+ margin-bottom: var(--ry-space-4, 1rem);
694
+ }
695
+
696
+ ry-tabs [data-ry-target="trigger"] {
697
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-4, 1rem);
698
+ border: none;
699
+ border-bottom: 2px solid transparent;
700
+ margin-bottom: -1px;
701
+ cursor: pointer;
702
+ }
703
+
704
+ ry-tabs [data-ry-target="panel"],
705
+ ry-tab {
706
+ display: none;
707
+ }
708
+
709
+ ry-tabs [data-ry-target="panel"][data-ry-state="active"],
710
+ ry-tab[active],
711
+ ry-tab[data-ry-state="active"] {
712
+ display: block;
713
+ }
714
+
715
+ ry-tabs:not(:defined) ry-tab:first-of-type {
716
+ display: block;
717
+ }
718
+
719
+ /* ═══════════════════════════════════════════════════════════════
720
+ MODAL
721
+ ═══════════════════════════════════════════════════════════════ */
722
+
723
+ ry-modal {
724
+ display: contents;
725
+ }
726
+
727
+ ry-modal [data-ry-target="backdrop"] {
728
+ position: fixed;
729
+ inset: 0;
730
+ z-index: var(--ry-z-modal-backdrop, 1040);
731
+ opacity: 0;
732
+ visibility: hidden;
733
+ transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
734
+ visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
735
+ }
736
+
737
+ ry-modal[data-ry-state="open"] [data-ry-target="backdrop"] {
738
+ opacity: 1;
739
+ visibility: visible;
740
+ }
741
+
742
+ ry-modal [data-ry-target="dialog"] {
743
+ position: fixed;
744
+ top: 50%;
745
+ left: 50%;
746
+ z-index: var(--ry-z-modal, 1050);
747
+ width: 100%;
748
+ max-width: 32rem;
749
+ max-height: calc(100vh - var(--ry-space-8, 2rem));
750
+ overflow: auto;
751
+ opacity: 0;
752
+ visibility: hidden;
753
+ transform: translate(-50%, -50%) scale(0.95);
754
+ transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
755
+ visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
756
+ transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
757
+ }
758
+
759
+ ry-modal[data-ry-state="open"] [data-ry-target="dialog"] {
760
+ opacity: 1;
761
+ visibility: visible;
762
+ transform: translate(-50%, -50%) scale(1);
763
+ }
764
+
765
+ ry-modal [data-ry-target="header"] {
766
+ display: flex;
767
+ align-items: center;
768
+ justify-content: space-between;
769
+ padding: var(--ry-space-4, 1rem) var(--ry-space-6, 1.5rem);
770
+ }
771
+
772
+ ry-modal [data-ry-target="header"] h3 {
773
+ margin: 0;
774
+ }
775
+
776
+ ry-modal [data-ry-target="close"] {
777
+ display: flex;
778
+ align-items: center;
779
+ justify-content: center;
780
+ width: 2rem;
781
+ height: 2rem;
782
+ padding: 0;
783
+ border: none;
784
+ cursor: pointer;
785
+ }
786
+
787
+ ry-modal [data-ry-target="body"] {
788
+ padding: var(--ry-space-6, 1.5rem);
789
+ }
790
+
791
+ ry-modal [data-ry-target="footer"] {
792
+ display: flex;
793
+ justify-content: flex-end;
794
+ gap: var(--ry-space-3, 0.75rem);
795
+ padding: var(--ry-space-4, 1rem) var(--ry-space-6, 1.5rem);
796
+ }
797
+
798
+ /* ═══════════════════════════════════════════════════════════════
799
+ DROPDOWN
800
+ ═══════════════════════════════════════════════════════════════ */
801
+
802
+ ry-dropdown {
803
+ position: relative;
804
+ display: inline-block;
805
+ }
806
+
807
+ ry-dropdown [data-ry-target="menu"],
808
+ ry-dropdown ry-menu {
809
+ position: absolute;
810
+ top: 100%;
811
+ left: 0;
812
+ z-index: var(--ry-z-dropdown, 1000);
813
+ min-width: 12rem;
814
+ margin-top: var(--ry-space-1, 0.25rem);
815
+ padding: var(--ry-space-1, 0.25rem);
816
+ opacity: 0;
817
+ visibility: hidden;
818
+ transform: translateY(-0.5rem);
819
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
820
+ visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
821
+ transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
822
+ }
823
+
824
+ ry-dropdown[data-ry-state="open"] [data-ry-target="menu"],
825
+ ry-dropdown[data-ry-state="open"] ry-menu {
826
+ opacity: 1;
827
+ visibility: visible;
828
+ transform: translateY(0);
829
+ }
830
+
831
+ ry-menu-item {
832
+ display: block;
833
+ width: 100%;
834
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
835
+ text-align: left;
836
+ text-decoration: none;
837
+ border: none;
838
+ cursor: pointer;
839
+ }
840
+
841
+ /* ═══════════════════════════════════════════════════════════════
842
+ SWITCH
843
+ ═══════════════════════════════════════════════════════════════ */
844
+
845
+ ry-switch {
846
+ display: inline-flex;
847
+ align-items: center;
848
+ gap: var(--ry-space-3, 0.75rem);
849
+ cursor: pointer;
850
+ user-select: none;
851
+ }
852
+
853
+ ry-switch[disabled] {
854
+ cursor: not-allowed;
855
+ }
856
+
857
+ ry-switch [data-ry-target="track"] {
858
+ position: relative;
859
+ display: inline-flex;
860
+ width: 2.75rem;
861
+ height: 1.5rem;
862
+ flex-shrink: 0;
863
+ }
864
+
865
+ ry-switch [data-ry-target="thumb"] {
866
+ position: absolute;
867
+ top: 2px;
868
+ left: 2px;
869
+ width: 1.125rem;
870
+ height: 1.125rem;
871
+ transition: transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
872
+ }
873
+
874
+ ry-switch[checked] [data-ry-target="thumb"] {
875
+ transform: translateX(1.25rem);
876
+ }
877
+
878
+ ry-switch [data-ry-target="input"] {
879
+ position: absolute;
880
+ width: 1px;
881
+ height: 1px;
882
+ margin: -1px;
883
+ padding: 0;
884
+ overflow: hidden;
885
+ clip: rect(0, 0, 0, 0);
886
+ border: 0;
887
+ }
888
+
889
+ ry-switch:focus-visible {
890
+ outline: none;
891
+ }
892
+
893
+ /* ═══════════════════════════════════════════════════════════════
894
+ TOOLTIP
895
+ ═══════════════════════════════════════════════════════════════ */
896
+
897
+ ry-tooltip {
898
+ position: relative;
899
+ display: inline-block;
900
+ }
901
+
902
+ ry-tooltip [data-ry-target="content"] {
903
+ position: absolute;
904
+ z-index: var(--ry-z-tooltip, 1070);
905
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
906
+ white-space: nowrap;
907
+ opacity: 0;
908
+ visibility: hidden;
909
+ pointer-events: none;
910
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
911
+ visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
912
+ }
913
+
914
+ ry-tooltip[data-ry-state="open"] [data-ry-target="content"] {
915
+ opacity: 1;
916
+ visibility: visible;
917
+ }
918
+
919
+ /* Tooltip positioning - CSS handles all layout, no JS needed */
920
+ ry-tooltip[data-ry-position="top"] [data-ry-target="content"] {
921
+ bottom: 100%;
922
+ left: 50%;
923
+ transform: translateX(-50%);
924
+ margin-bottom: var(--ry-space-2, 0.5rem);
925
+ }
926
+
927
+ ry-tooltip[data-ry-position="bottom"] [data-ry-target="content"] {
928
+ top: 100%;
929
+ left: 50%;
930
+ transform: translateX(-50%);
931
+ margin-top: var(--ry-space-2, 0.5rem);
932
+ }
933
+
934
+ ry-tooltip[data-ry-position="left"] [data-ry-target="content"] {
935
+ right: 100%;
936
+ top: 50%;
937
+ transform: translateY(-50%);
938
+ margin-right: var(--ry-space-2, 0.5rem);
939
+ }
940
+
941
+ ry-tooltip[data-ry-position="right"] [data-ry-target="content"] {
942
+ left: 100%;
943
+ top: 50%;
944
+ transform: translateY(-50%);
945
+ margin-left: var(--ry-space-2, 0.5rem);
946
+ }
947
+
948
+ /* ═══════════════════════════════════════════════════════════════
949
+ DRAWER
950
+ ═══════════════════════════════════════════════════════════════ */
951
+
952
+ ry-drawer {
953
+ display: contents;
954
+ }
955
+
956
+ ry-drawer [data-ry-target="backdrop"] {
957
+ position: fixed;
958
+ inset: 0;
959
+ z-index: var(--ry-z-modal-backdrop, 1040);
960
+ opacity: 0;
961
+ visibility: hidden;
962
+ transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
963
+ visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
964
+ }
965
+
966
+ ry-drawer[data-ry-state="open"] [data-ry-target="backdrop"] {
967
+ opacity: 1;
968
+ visibility: visible;
969
+ }
970
+
971
+ ry-drawer [data-ry-target="panel"] {
972
+ position: fixed;
973
+ z-index: var(--ry-z-modal, 1050);
974
+ opacity: 0;
975
+ visibility: hidden;
976
+ transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
977
+ visibility var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
978
+ transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
979
+ }
980
+
981
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"] {
982
+ opacity: 1;
983
+ visibility: visible;
984
+ }
985
+
986
+ /* Left drawer */
987
+ ry-drawer [data-ry-target="panel"][data-ry-side="left"] {
988
+ top: 0;
989
+ left: 0;
990
+ bottom: 0;
991
+ width: 20rem;
992
+ max-width: 100%;
993
+ transform: translateX(-100%);
994
+ }
995
+
996
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="left"] {
997
+ transform: translateX(0);
998
+ }
999
+
1000
+ /* Right drawer */
1001
+ ry-drawer [data-ry-target="panel"][data-ry-side="right"] {
1002
+ top: 0;
1003
+ right: 0;
1004
+ bottom: 0;
1005
+ width: 20rem;
1006
+ max-width: 100%;
1007
+ transform: translateX(100%);
1008
+ }
1009
+
1010
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="right"] {
1011
+ transform: translateX(0);
1012
+ }
1013
+
1014
+ /* Top drawer */
1015
+ ry-drawer [data-ry-target="panel"][data-ry-side="top"] {
1016
+ top: 0;
1017
+ left: 0;
1018
+ right: 0;
1019
+ height: auto;
1020
+ max-height: 80vh;
1021
+ transform: translateY(-100%);
1022
+ }
1023
+
1024
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="top"] {
1025
+ transform: translateY(0);
1026
+ }
1027
+
1028
+ /* Bottom drawer */
1029
+ ry-drawer [data-ry-target="panel"][data-ry-side="bottom"] {
1030
+ bottom: 0;
1031
+ left: 0;
1032
+ right: 0;
1033
+ height: auto;
1034
+ max-height: 80vh;
1035
+ transform: translateY(100%);
1036
+ }
1037
+
1038
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="bottom"] {
1039
+ transform: translateY(0);
1040
+ }
1041
+
1042
+ ry-drawer [data-ry-target="close"] {
1043
+ position: absolute;
1044
+ top: var(--ry-space-4, 1rem);
1045
+ right: var(--ry-space-4, 1rem);
1046
+ display: flex;
1047
+ align-items: center;
1048
+ justify-content: center;
1049
+ width: 2rem;
1050
+ height: 2rem;
1051
+ padding: 0;
1052
+ border: none;
1053
+ cursor: pointer;
1054
+ }
1055
+
1056
+ ry-drawer [data-ry-target="content"] {
1057
+ padding: var(--ry-space-6, 1.5rem);
1058
+ padding-top: var(--ry-space-12, 3rem);
1059
+ overflow-y: auto;
1060
+ height: 100%;
1061
+ }
1062
+
1063
+ /* ═══════════════════════════════════════════════════════════════
1064
+ TOAST
1065
+ ═══════════════════════════════════════════════════════════════ */
1066
+
1067
+ [data-ry-target="toast-container"] {
1068
+ position: fixed;
1069
+ top: var(--ry-space-4, 1rem);
1070
+ right: var(--ry-space-4, 1rem);
1071
+ z-index: var(--ry-z-toast, 1080);
1072
+ display: flex;
1073
+ flex-direction: column;
1074
+ gap: var(--ry-space-3, 0.75rem);
1075
+ max-width: 24rem;
1076
+ pointer-events: none;
1077
+ }
1078
+
1079
+ ry-toast {
1080
+ display: flex;
1081
+ align-items: flex-start;
1082
+ gap: var(--ry-space-3, 0.75rem);
1083
+ padding: var(--ry-space-4, 1rem);
1084
+ pointer-events: auto;
1085
+ opacity: 0;
1086
+ transform: translateX(1rem);
1087
+ transition: opacity var(--ry-duration-normal, 200ms) var(--ry-ease, ease),
1088
+ transform var(--ry-duration-normal, 200ms) var(--ry-ease, ease);
1089
+ }
1090
+
1091
+ ry-toast[data-ry-state="visible"] {
1092
+ opacity: 1;
1093
+ transform: translateX(0);
1094
+ }
1095
+
1096
+ ry-toast[data-ry-state="hiding"] {
1097
+ opacity: 0;
1098
+ transform: translateX(1rem);
1099
+ }
1100
+
1101
+ ry-toast [data-ry-target="icon"] {
1102
+ flex-shrink: 0;
1103
+ width: 1.25rem;
1104
+ height: 1.25rem;
1105
+ display: flex;
1106
+ align-items: center;
1107
+ justify-content: center;
1108
+ }
1109
+
1110
+ ry-toast [data-ry-target="content"] {
1111
+ flex: 1;
1112
+ }
1113
+
1114
+ ry-toast [data-ry-target="close"] {
1115
+ flex-shrink: 0;
1116
+ display: flex;
1117
+ align-items: center;
1118
+ justify-content: center;
1119
+ width: 1.5rem;
1120
+ height: 1.5rem;
1121
+ padding: 0;
1122
+ margin: calc(var(--ry-space-1, 0.25rem) * -1);
1123
+ border: none;
1124
+ cursor: pointer;
1125
+ }
1126
+
1127
+ /* ═══════════════════════════════════════════════════════════════
1128
+ SELECT
1129
+ ═══════════════════════════════════════════════════════════════ */
1130
+
1131
+ ry-select {
1132
+ position: relative;
1133
+ display: inline-block;
1134
+ min-width: 12rem;
1135
+ }
1136
+
1137
+ ry-select[disabled] {
1138
+ cursor: not-allowed;
1139
+ }
1140
+
1141
+ ry-select [data-ry-target="trigger"] {
1142
+ display: flex;
1143
+ align-items: center;
1144
+ justify-content: space-between;
1145
+ gap: var(--ry-space-2, 0.5rem);
1146
+ width: 100%;
1147
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
1148
+ cursor: pointer;
1149
+ }
1150
+
1151
+ ry-select [data-ry-target="value"] {
1152
+ flex: 1;
1153
+ overflow: hidden;
1154
+ text-overflow: ellipsis;
1155
+ white-space: nowrap;
1156
+ }
1157
+
1158
+ ry-select [data-ry-target="arrow"] {
1159
+ flex-shrink: 0;
1160
+ transition: transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1161
+ }
1162
+
1163
+ ry-select[data-ry-state="open"] [data-ry-target="arrow"] {
1164
+ transform: rotate(180deg);
1165
+ }
1166
+
1167
+ ry-select [data-ry-target="dropdown"] {
1168
+ position: absolute;
1169
+ top: 100%;
1170
+ left: 0;
1171
+ right: 0;
1172
+ z-index: var(--ry-z-dropdown, 1000);
1173
+ margin-top: var(--ry-space-1, 0.25rem);
1174
+ padding: var(--ry-space-1, 0.25rem);
1175
+ max-height: 15rem;
1176
+ overflow-y: auto;
1177
+ opacity: 0;
1178
+ visibility: hidden;
1179
+ transform: translateY(-0.5rem);
1180
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1181
+ visibility var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1182
+ transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1183
+ }
1184
+
1185
+ ry-select[data-ry-state="open"] [data-ry-target="dropdown"] {
1186
+ opacity: 1;
1187
+ visibility: visible;
1188
+ transform: translateY(0);
1189
+ }
1190
+
1191
+ ry-select[data-ry-position="top"] [data-ry-target="dropdown"] {
1192
+ top: auto;
1193
+ bottom: 100%;
1194
+ margin-top: 0;
1195
+ margin-bottom: var(--ry-space-1, 0.25rem);
1196
+ transform: translateY(0.5rem);
1197
+ }
1198
+
1199
+ ry-select[data-ry-position="top"][data-ry-state="open"] [data-ry-target="dropdown"] {
1200
+ transform: translateY(0);
1201
+ }
1202
+
1203
+ ry-select [data-ry-target="option"] {
1204
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
1205
+ cursor: pointer;
1206
+ }
1207
+
1208
+ ry-select [data-ry-target="option"][data-disabled] {
1209
+ cursor: not-allowed;
1210
+ }
1211
+
1212
+ ry-select [data-ry-target="native"] {
1213
+ position: absolute;
1214
+ width: 1px;
1215
+ height: 1px;
1216
+ margin: -1px;
1217
+ padding: 0;
1218
+ overflow: hidden;
1219
+ clip: rect(0, 0, 0, 0);
1220
+ border: 0;
1221
+ }
1222
+
1223
+ ry-option {
1224
+ display: none;
1225
+ }
1226
+
1227
+ /* ═══════════════════════════════════════════════════════════════
1228
+ KEYFRAMES (structural animations)
1229
+ ═══════════════════════════════════════════════════════════════ */
1230
+
1231
+ @keyframes ry-fade-in {
1232
+ from { opacity: 0; }
1233
+ to { opacity: 1; }
1234
+ }
1235
+
1236
+ @keyframes ry-fade-out {
1237
+ from { opacity: 1; }
1238
+ to { opacity: 0; }
1239
+ }
1240
+
1241
+ @keyframes ry-slide-up {
1242
+ from { transform: translateY(1rem); opacity: 0; }
1243
+ to { transform: translateY(0); opacity: 1; }
1244
+ }
1245
+
1246
+ @keyframes ry-slide-down {
1247
+ from { transform: translateY(-1rem); opacity: 0; }
1248
+ to { transform: translateY(0); opacity: 1; }
1249
+ }
1250
+
1251
+ @keyframes ry-scale-in {
1252
+ from { transform: scale(0.95); opacity: 0; }
1253
+ to { transform: scale(1); opacity: 1; }
1254
+ }
1255
+
1256
+ /* ═══════════════════════════════════════════════════════════════
1257
+ CODE
1258
+ ═══════════════════════════════════════════════════════════════ */
1259
+
1260
+ ry-code {
1261
+ display: block;
1262
+ overflow: hidden;
1263
+ margin-bottom: var(--ry-space-4, 1rem);
1264
+ }
1265
+
1266
+ ry-code [data-ry-target="header"] {
1267
+ display: flex;
1268
+ align-items: center;
1269
+ justify-content: space-between;
1270
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-4, 1rem);
1271
+ }
1272
+
1273
+ ry-code [data-ry-target="title"] {
1274
+ text-transform: uppercase;
1275
+ letter-spacing: 0.05em;
1276
+ }
1277
+
1278
+ ry-code [data-ry-target="copy"] {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ justify-content: center;
1282
+ width: 1.75rem;
1283
+ height: 1.75rem;
1284
+ padding: 0;
1285
+ border: none;
1286
+ cursor: pointer;
1287
+ }
1288
+
1289
+ ry-code [data-ry-target="copy"] svg {
1290
+ width: 16px;
1291
+ height: 16px;
1292
+ }
1293
+
1294
+ ry-code [data-ry-target="content"] {
1295
+ overflow: auto;
1296
+ padding: 0 var(--ry-space-4, 1rem) var(--ry-space-4, 1rem);
1297
+ }
1298
+
1299
+ ry-code [data-ry-target="pre"] {
1300
+ margin: 0;
1301
+ overflow: visible;
1302
+ }
1303
+
1304
+ ry-code [data-ry-target="code"] {
1305
+ display: block;
1306
+ white-space: pre;
1307
+ tab-size: 2;
1308
+ }
1309
+
1310
+ ry-code .ry-code__line {
1311
+ display: flex;
1312
+ }
1313
+
1314
+ ry-code .ry-code__line-number {
1315
+ flex-shrink: 0;
1316
+ width: 2rem;
1317
+ text-align: right;
1318
+ padding-right: var(--ry-space-2, 0.5rem);
1319
+ user-select: none;
1320
+ }
1321
+
1322
+ ry-code .ry-code__line-content {
1323
+ flex: 1;
1324
+ min-width: 0;
1325
+ padding-left: var(--ry-space-2, 0.5rem);
1326
+ }
1327
+
1328
+ ry-code .ry-code__color-preview {
1329
+ display: inline-block;
1330
+ width: 0.625rem;
1331
+ height: 0.625rem;
1332
+ margin-right: var(--ry-space-1, 0.25rem);
1333
+ vertical-align: middle;
1334
+ }
1335
+
1336
+ /* ═══════════════════════════════════════════════════════════════
1337
+ EXAMPLE
1338
+ ═══════════════════════════════════════════════════════════════ */
1339
+
1340
+ ry-example {
1341
+ display: grid;
1342
+ grid-template-columns: 1fr 1fr;
1343
+ gap: var(--ry-space-4, 1rem);
1344
+ align-items: start;
1345
+ }
1346
+
1347
+ ry-example [data-ry-target="code"] {
1348
+ min-width: 0;
1349
+ }
1350
+
1351
+ ry-example [data-ry-target="preview"] {
1352
+ min-width: 0;
1353
+ padding: var(--ry-space-4, 1rem);
1354
+ }
1355
+
1356
+ @media (max-width: 768px) {
1357
+ ry-example {
1358
+ grid-template-columns: 1fr;
1359
+ }
1360
+ }
1361
+
1362
+ ry-example[data-stacked] {
1363
+ grid-template-columns: 1fr;
1364
+ }
1365
+
1366
+ /* ═══════════════════════════════════════════════════════════════
1367
+ ICON
1368
+ ═══════════════════════════════════════════════════════════════ */
1369
+
1370
+ ry-icon {
1371
+ display: inline-flex;
1372
+ align-items: center;
1373
+ justify-content: center;
1374
+ vertical-align: middle;
1375
+ flex-shrink: 0;
1376
+ }
1377
+
1378
+ ry-icon svg {
1379
+ display: block;
1380
+ }
1381
+
1382
+ /* ═══════════════════════════════════════════════════════════════
1383
+ CHECKBOX
1384
+ ═══════════════════════════════════════════════════════════════ */
1385
+
1386
+ input[type="checkbox"] {
1387
+ appearance: none;
1388
+ -webkit-appearance: none;
1389
+ display: inline-flex;
1390
+ align-items: center;
1391
+ justify-content: center;
1392
+ width: 1.125rem;
1393
+ height: 1.125rem;
1394
+ flex-shrink: 0;
1395
+ cursor: pointer;
1396
+ vertical-align: middle;
1397
+ }
1398
+
1399
+ input[type="checkbox"]:disabled {
1400
+ cursor: not-allowed;
1401
+ }
1402
+
1403
+ input[type="checkbox"]::after {
1404
+ content: '';
1405
+ display: block;
1406
+ width: 0.375rem;
1407
+ height: 0.625rem;
1408
+ opacity: 0;
1409
+ transform: rotate(45deg) scale(0.8);
1410
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1411
+ transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1412
+ }
1413
+
1414
+ input[type="checkbox"]:checked::after {
1415
+ opacity: 1;
1416
+ transform: rotate(45deg) scale(1);
1417
+ }
1418
+
1419
+ /* ═══════════════════════════════════════════════════════════════
1420
+ RADIO
1421
+ ═══════════════════════════════════════════════════════════════ */
1422
+
1423
+ input[type="radio"] {
1424
+ appearance: none;
1425
+ -webkit-appearance: none;
1426
+ display: inline-flex;
1427
+ align-items: center;
1428
+ justify-content: center;
1429
+ width: 1.125rem;
1430
+ height: 1.125rem;
1431
+ flex-shrink: 0;
1432
+ cursor: pointer;
1433
+ vertical-align: middle;
1434
+ }
1435
+
1436
+ input[type="radio"]:disabled {
1437
+ cursor: not-allowed;
1438
+ }
1439
+
1440
+ input[type="radio"]::after {
1441
+ content: '';
1442
+ display: block;
1443
+ width: 0.5rem;
1444
+ height: 0.5rem;
1445
+ opacity: 0;
1446
+ transform: scale(0);
1447
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1448
+ transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1449
+ }
1450
+
1451
+ input[type="radio"]:checked::after {
1452
+ opacity: 1;
1453
+ transform: scale(1);
1454
+ }
1455
+
1456
+ /* ═══════════════════════════════════════════════════════════════
1457
+ TABLE
1458
+ ═══════════════════════════════════════════════════════════════ */
1459
+
1460
+ table {
1461
+ width: 100%;
1462
+ border-collapse: collapse;
1463
+ text-align: left;
1464
+ }
1465
+
1466
+ th, td {
1467
+ padding: var(--ry-space-3, 0.75rem) var(--ry-space-4, 1rem);
1468
+ vertical-align: top;
1469
+ }
1470
+
1471
+ th {
1472
+ text-align: left;
1473
+ }
1474
+
1475
+ /* ═══════════════════════════════════════════════════════════════
1476
+ COLOR PICKER
1477
+ ═══════════════════════════════════════════════════════════════ */
1478
+
1479
+ ry-color-picker {
1480
+ position: relative;
1481
+ display: inline-block;
1482
+ user-select: none;
1483
+ }
1484
+
1485
+ ry-color-picker[disabled] {
1486
+ pointer-events: none;
1487
+ }
1488
+
1489
+ /* Trigger button (dropdown mode) */
1490
+ ry-color-picker [data-ry-target="trigger"] {
1491
+ display: block;
1492
+ width: var(--ry-color-picker-trigger-size, 32px);
1493
+ height: var(--ry-color-picker-trigger-size, 32px);
1494
+ padding: 0;
1495
+ border: none;
1496
+ cursor: pointer;
1497
+ }
1498
+
1499
+ ry-color-picker [data-ry-target="trigger-color"] {
1500
+ display: block;
1501
+ width: 100%;
1502
+ height: 100%;
1503
+ }
1504
+
1505
+ /* Panel */
1506
+ ry-color-picker [data-ry-target="panel"] {
1507
+ width: var(--ry-color-picker-width, 240px);
1508
+ }
1509
+
1510
+ /* Dropdown mode: panel is absolutely positioned */
1511
+ ry-color-picker:not([inline]) [data-ry-target="panel"] {
1512
+ position: absolute;
1513
+ left: 0;
1514
+ z-index: var(--ry-z-dropdown, 1000);
1515
+ opacity: 0;
1516
+ visibility: hidden;
1517
+ }
1518
+
1519
+ /* Position below trigger */
1520
+ ry-color-picker[data-ry-position="bottom"] [data-ry-target="panel"] {
1521
+ top: 100%;
1522
+ margin-top: var(--ry-space-1, 0.25rem);
1523
+ transform: translateY(-0.5rem);
1524
+ }
1525
+
1526
+ /* Position above trigger */
1527
+ ry-color-picker[data-ry-position="top"] [data-ry-target="panel"] {
1528
+ bottom: 100%;
1529
+ top: auto;
1530
+ margin-bottom: var(--ry-space-1, 0.25rem);
1531
+ transform: translateY(0.5rem);
1532
+ }
1533
+
1534
+ /* Open state - only animate when position is set */
1535
+ ry-color-picker[data-ry-state="open"][data-ry-position] [data-ry-target="panel"] {
1536
+ opacity: 1;
1537
+ visibility: visible;
1538
+ transform: translateY(0);
1539
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1540
+ transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1541
+ }
1542
+
1543
+ /* Inline mode: panel always visible */
1544
+ ry-color-picker[inline] [data-ry-target="panel"] {
1545
+ position: static;
1546
+ opacity: 1;
1547
+ visibility: visible;
1548
+ transform: none;
1549
+ }
1550
+
1551
+ /* Grid (saturation/brightness) */
1552
+ ry-color-picker [data-ry-target="grid"] {
1553
+ position: relative;
1554
+ width: 100%;
1555
+ height: var(--ry-color-picker-grid-height, 160px);
1556
+ cursor: crosshair;
1557
+ touch-action: none;
1558
+ }
1559
+
1560
+ ry-color-picker [data-ry-target="grid-handle"] {
1561
+ position: absolute;
1562
+ width: var(--ry-color-picker-handle-size, 16px);
1563
+ height: var(--ry-color-picker-handle-size, 16px);
1564
+ transform: translate(-50%, -50%);
1565
+ cursor: grab;
1566
+ }
1567
+
1568
+ ry-color-picker [data-ry-target="grid-handle"]:active {
1569
+ cursor: grabbing;
1570
+ }
1571
+
1572
+ /* Controls row (sliders + preview) */
1573
+ ry-color-picker [data-ry-target="controls"] {
1574
+ display: flex;
1575
+ gap: var(--ry-space-3, 0.75rem);
1576
+ padding: var(--ry-space-3, 0.75rem);
1577
+ }
1578
+
1579
+ ry-color-picker [data-ry-target="sliders"] {
1580
+ flex: 1;
1581
+ display: flex;
1582
+ flex-direction: column;
1583
+ gap: var(--ry-space-2, 0.5rem);
1584
+ justify-content: center;
1585
+ }
1586
+
1587
+ /* Sliders (hue, alpha) */
1588
+ ry-color-picker .ry-color-picker__slider {
1589
+ position: relative;
1590
+ height: var(--ry-color-picker-slider-height, 12px);
1591
+ cursor: pointer;
1592
+ touch-action: none;
1593
+ }
1594
+
1595
+ ry-color-picker .ry-color-picker__slider-handle {
1596
+ position: absolute;
1597
+ top: 50%;
1598
+ width: var(--ry-color-picker-slider-handle, 16px);
1599
+ height: var(--ry-color-picker-slider-handle, 16px);
1600
+ transform: translate(-50%, -50%);
1601
+ cursor: grab;
1602
+ }
1603
+
1604
+ ry-color-picker .ry-color-picker__slider-handle:active {
1605
+ cursor: grabbing;
1606
+ }
1607
+
1608
+ /* Preview swatch */
1609
+ ry-color-picker [data-ry-target="preview"] {
1610
+ position: relative;
1611
+ width: var(--ry-color-picker-preview-size, 40px);
1612
+ height: var(--ry-color-picker-preview-size, 40px);
1613
+ flex-shrink: 0;
1614
+ }
1615
+
1616
+ ry-color-picker [data-ry-target="preview-color"] {
1617
+ position: absolute;
1618
+ inset: 0;
1619
+ }
1620
+
1621
+ /* Input row */
1622
+ ry-color-picker [data-ry-target="input-row"] {
1623
+ display: flex;
1624
+ gap: var(--ry-space-2, 0.5rem);
1625
+ padding: 0 var(--ry-space-3, 0.75rem) var(--ry-space-3, 0.75rem);
1626
+ }
1627
+
1628
+ ry-color-picker [data-ry-target="input"] {
1629
+ flex: 1;
1630
+ min-width: 0;
1631
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
1632
+ }
1633
+
1634
+ ry-color-picker [data-ry-target="format-toggle"] {
1635
+ flex-shrink: 0;
1636
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
1637
+ border: none;
1638
+ cursor: pointer;
1639
+ }
1640
+
1641
+ /* Swatches */
1642
+ ry-color-picker [data-ry-target="swatches"] {
1643
+ display: flex;
1644
+ flex-wrap: wrap;
1645
+ gap: var(--ry-space-1, 0.25rem);
1646
+ padding: 0 var(--ry-space-3, 0.75rem) var(--ry-space-3, 0.75rem);
1647
+ }
1648
+
1649
+ ry-color-picker .ry-color-picker__swatch {
1650
+ width: var(--ry-color-picker-swatch-size, 20px);
1651
+ height: var(--ry-color-picker-swatch-size, 20px);
1652
+ padding: 0;
1653
+ border: none;
1654
+ cursor: pointer;
1655
+ }
1656
+
1657
+ /* ═══════════════════════════════════════════════════════════════
1658
+ COLOR INPUT
1659
+ ═══════════════════════════════════════════════════════════════ */
1660
+
1661
+ ry-color-input {
1662
+ position: relative;
1663
+ display: inline-block;
1664
+ }
1665
+
1666
+ ry-color-input[disabled] {
1667
+ pointer-events: none;
1668
+ }
1669
+
1670
+ ry-color-input [data-ry-target="trigger"] {
1671
+ display: flex;
1672
+ align-items: stretch;
1673
+ }
1674
+
1675
+ ry-color-input [data-ry-target="swatch"] {
1676
+ display: flex;
1677
+ align-items: center;
1678
+ justify-content: center;
1679
+ width: var(--ry-color-input-swatch-width, 40px);
1680
+ flex-shrink: 0;
1681
+ padding: 0;
1682
+ border: none;
1683
+ cursor: pointer;
1684
+ }
1685
+
1686
+ ry-color-input [data-ry-target="swatch-color"] {
1687
+ display: block;
1688
+ width: 100%;
1689
+ height: 100%;
1690
+ }
1691
+
1692
+ ry-color-input [data-ry-target="input"] {
1693
+ flex: 1;
1694
+ min-width: 0;
1695
+ padding: var(--ry-space-2, 0.5rem) var(--ry-space-3, 0.75rem);
1696
+ }
1697
+
1698
+ /* Panel (dropdown) */
1699
+ ry-color-input [data-ry-target="panel"] {
1700
+ position: absolute;
1701
+ left: 0;
1702
+ z-index: var(--ry-z-dropdown, 1000);
1703
+ opacity: 0;
1704
+ visibility: hidden;
1705
+ pointer-events: none;
1706
+ }
1707
+
1708
+ /* Position below trigger */
1709
+ ry-color-input[data-ry-position="bottom"] [data-ry-target="panel"] {
1710
+ top: 100%;
1711
+ margin-top: var(--ry-space-1, 0.25rem);
1712
+ transform: translateY(-0.5rem);
1713
+ }
1714
+
1715
+ /* Position above trigger */
1716
+ ry-color-input[data-ry-position="top"] [data-ry-target="panel"] {
1717
+ bottom: 100%;
1718
+ top: auto;
1719
+ margin-bottom: var(--ry-space-1, 0.25rem);
1720
+ transform: translateY(0.5rem);
1721
+ }
1722
+
1723
+ /* Open state */
1724
+ ry-color-input[data-ry-state="open"][data-ry-position] [data-ry-target="panel"] {
1725
+ opacity: 1;
1726
+ visibility: visible;
1727
+ pointer-events: auto;
1728
+ transform: translateY(0);
1729
+ transition: opacity var(--ry-duration-fast, 100ms) var(--ry-ease, ease),
1730
+ transform var(--ry-duration-fast, 100ms) var(--ry-ease, ease);
1731
+ }
1732
+
1733
+ /* Hide the embedded picker's panel border since we provide our own */
1734
+ ry-color-input ry-color-picker[inline] [data-ry-target="panel"] {
1735
+ border: none;
1736
+ box-shadow: none;
1737
+ }