@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,1207 @@
1
+ /**
2
+ * ry-ui CSS Bundle
3
+ *
4
+ * This file bundles all CSS in the correct order:
5
+ * 1. Tokens (design system variables)
6
+ * 2. Structure (layout and behavior) - uses data-ry-target selectors
7
+ * 3. Theme (visual styling) - uses .ry-* class selectors
8
+ *
9
+ * For custom themes, load only:
10
+ * - ry-tokens.css (or your own tokens)
11
+ * - ry-structure.css
12
+ * - your-theme.css
13
+ */
14
+
15
+ /* ═══════════════════════════════════════════════════════════════════════════
16
+ PART 1: TOKENS
17
+ Design system variables - colors, spacing, typography, etc.
18
+ ═══════════════════════════════════════════════════════════════════════════ */
19
+
20
+ :root {
21
+ /* Colors - Primary */
22
+ --ry-color-primary: #3b82f6;
23
+ --ry-color-primary-hover: #2563eb;
24
+ --ry-color-primary-active: #1d4ed8;
25
+
26
+ /* Colors - Secondary */
27
+ --ry-color-secondary: #64748b;
28
+ --ry-color-secondary-hover: #475569;
29
+ --ry-color-secondary-active: #334155;
30
+
31
+ /* Colors - Semantic */
32
+ --ry-color-success: #22c55e;
33
+ --ry-color-warning: #f59e0b;
34
+ --ry-color-danger: #ef4444;
35
+ --ry-color-info: #06b6d4;
36
+
37
+ /* Colors - Text */
38
+ --ry-color-text: #1e293b;
39
+ --ry-color-text-muted: #64748b;
40
+ --ry-color-text-inverse: #ffffff;
41
+
42
+ /* Colors - Background */
43
+ --ry-color-bg: #ffffff;
44
+ --ry-color-bg-subtle: #f8fafc;
45
+ --ry-color-bg-muted: #f1f5f9;
46
+
47
+ /* Colors - Border */
48
+ --ry-color-border: #e2e8f0;
49
+ --ry-color-border-strong: #cbd5e1;
50
+
51
+ /* Colors - Overlay */
52
+ --ry-color-overlay: rgba(0, 0, 0, 0.5);
53
+
54
+ /* Typography - Fonts */
55
+ --ry-font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
56
+ --ry-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
57
+
58
+ /* Typography - Sizes */
59
+ --ry-text-xs: 0.75rem;
60
+ --ry-text-sm: 0.875rem;
61
+ --ry-text-base: 1rem;
62
+ --ry-text-lg: 1.125rem;
63
+ --ry-text-xl: 1.25rem;
64
+ --ry-text-2xl: 1.5rem;
65
+ --ry-text-3xl: 1.875rem;
66
+ --ry-text-4xl: 2.25rem;
67
+
68
+ /* Typography - Weights */
69
+ --ry-font-normal: 400;
70
+ --ry-font-medium: 500;
71
+ --ry-font-semibold: 600;
72
+ --ry-font-bold: 700;
73
+
74
+ /* Typography - Line Heights */
75
+ --ry-leading-tight: 1.25;
76
+ --ry-leading-normal: 1.5;
77
+ --ry-leading-relaxed: 1.75;
78
+
79
+ /* Spacing */
80
+ --ry-space-0: 0;
81
+ --ry-space-1: 0.25rem;
82
+ --ry-space-2: 0.5rem;
83
+ --ry-space-3: 0.75rem;
84
+ --ry-space-4: 1rem;
85
+ --ry-space-5: 1.25rem;
86
+ --ry-space-6: 1.5rem;
87
+ --ry-space-8: 2rem;
88
+ --ry-space-10: 2.5rem;
89
+ --ry-space-12: 3rem;
90
+ --ry-space-16: 4rem;
91
+ --ry-space-20: 5rem;
92
+
93
+ /* Borders & Radius */
94
+ --ry-radius-none: 0;
95
+ --ry-radius-sm: 0.25rem;
96
+ --ry-radius-md: 0.375rem;
97
+ --ry-radius-lg: 0.5rem;
98
+ --ry-radius-xl: 0.75rem;
99
+ --ry-radius-2xl: 1rem;
100
+ --ry-radius-full: 9999px;
101
+ --ry-border-width: 1px;
102
+
103
+ /* Shadows */
104
+ --ry-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
105
+ --ry-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
106
+ --ry-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
107
+ --ry-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
108
+
109
+ /* Transitions */
110
+ --ry-duration-fast: 100ms;
111
+ --ry-duration-normal: 200ms;
112
+ --ry-duration-slow: 300ms;
113
+ --ry-ease: cubic-bezier(0.4, 0, 0.2, 1);
114
+ --ry-ease-in: cubic-bezier(0.4, 0, 1, 1);
115
+ --ry-ease-out: cubic-bezier(0, 0, 0.2, 1);
116
+
117
+ /* Z-Index */
118
+ --ry-z-dropdown: 1000;
119
+ --ry-z-sticky: 1020;
120
+ --ry-z-fixed: 1030;
121
+ --ry-z-modal-backdrop: 1040;
122
+ --ry-z-modal: 1050;
123
+ --ry-z-popover: 1060;
124
+ --ry-z-tooltip: 1070;
125
+ --ry-z-toast: 1080;
126
+
127
+ /* Focus */
128
+ --ry-focus-ring: 0 0 0 3px rgba(59, 130, 246, 0.5);
129
+ }
130
+
131
+ /* ═══════════════════════════════════════════════════════════════════════════
132
+ PART 2: STRUCTURE
133
+ Layout and behavioral styles using data-ry-target selectors.
134
+ No colors, shadows, or decorative properties.
135
+ ═══════════════════════════════════════════════════════════════════════════ */
136
+
137
+ /* Transform wrapper (FOUC prevention) */
138
+ ry { display: none; }
139
+
140
+ /* Scroll lock (for modals, drawers) */
141
+ body[data-ry-scroll-lock] {
142
+ overflow: hidden;
143
+ padding-right: var(--ry-scrollbar-width, 0);
144
+ }
145
+
146
+ /* Minimal reset */
147
+ body { margin: 0; padding: 0; }
148
+
149
+ /* Box sizing */
150
+ [data-ry-target],
151
+ ry-page, ry-header, ry-main, ry-footer, ry-section, ry-aside,
152
+ ry-grid, ry-stack, ry-cluster, ry-split, ry-center,
153
+ ry-card, ry-accordion, ry-modal, ry-tabs, ry-dropdown,
154
+ ry-button, ry-badge, ry-alert, ry-field, ry-nav, ry-logo, ry-actions,
155
+ ry-accordion-item, ry-tab, ry-menu, ry-menu-item, ry-divider,
156
+ ry-theme-toggle, ry-select, ry-switch, ry-tooltip, ry-drawer, ry-toast,
157
+ ry-toggle-button, ry-knob, ry-slider, ry-color-picker, ry-color-input {
158
+ box-sizing: border-box;
159
+ }
160
+
161
+ [data-ry-target] *,
162
+ ry-page *, ry-header *, ry-main *, ry-footer *, ry-section *,
163
+ ry-card *, ry-accordion *, ry-modal *, ry-tabs *, ry-dropdown * {
164
+ box-sizing: inherit;
165
+ }
166
+
167
+ /* Display defaults - Block */
168
+ ry-page, ry-header, ry-main, ry-footer, ry-section, ry-aside,
169
+ ry-card, ry-accordion, ry-accordion-item, ry-tabs, ry-tab, ry-alert, ry-field {
170
+ display: block;
171
+ }
172
+
173
+ /* Display defaults - Flex */
174
+ ry-grid, ry-stack, ry-cluster, ry-split, ry-center, ry-nav, ry-actions {
175
+ display: flex;
176
+ }
177
+
178
+ /* Display defaults - Inline */
179
+ ry-badge, ry-logo { display: inline-flex; }
180
+ ry-modal, ry-drawer { display: contents; }
181
+ ry-button, ry-menu-item { display: inline-flex; }
182
+
183
+ /* Page layout */
184
+ ry-page {
185
+ display: flex;
186
+ flex-direction: column;
187
+ min-height: 100vh;
188
+ min-height: 100dvh;
189
+ }
190
+
191
+ /* Header */
192
+ ry-header {
193
+ display: flex;
194
+ align-items: center;
195
+ justify-content: space-between;
196
+ gap: var(--ry-space-4);
197
+ padding: var(--ry-space-4) var(--ry-space-6);
198
+ }
199
+ ry-header[sticky] { position: sticky; top: 0; z-index: var(--ry-z-sticky); }
200
+
201
+ /* Main */
202
+ ry-main {
203
+ flex: 1;
204
+ width: 100%;
205
+ max-width: 1200px;
206
+ margin: 0 auto;
207
+ padding: var(--ry-space-8) var(--ry-space-6);
208
+ }
209
+
210
+ /* Footer */
211
+ ry-footer {
212
+ padding: var(--ry-space-6);
213
+ text-align: center;
214
+ }
215
+
216
+ /* Section */
217
+ ry-section { margin-bottom: var(--ry-space-12); }
218
+ ry-section:last-child { margin-bottom: 0; }
219
+
220
+ /* Grid */
221
+ ry-grid {
222
+ display: grid;
223
+ gap: var(--ry-space-4);
224
+ }
225
+ ry-grid[cols="1"] { grid-template-columns: 1fr; }
226
+ ry-grid[cols="2"] { grid-template-columns: repeat(2, 1fr); }
227
+ ry-grid[cols="3"] { grid-template-columns: repeat(3, 1fr); }
228
+ ry-grid[cols="4"] { grid-template-columns: repeat(4, 1fr); }
229
+ ry-grid[cols="5"] { grid-template-columns: repeat(5, 1fr); }
230
+ ry-grid[cols="6"] { grid-template-columns: repeat(6, 1fr); }
231
+
232
+ @media (max-width: 640px) {
233
+ ry-grid[cols="2"], ry-grid[cols="3"], ry-grid[cols="4"],
234
+ ry-grid[cols="5"], ry-grid[cols="6"] { grid-template-columns: 1fr; }
235
+ }
236
+ @media (min-width: 641px) and (max-width: 1024px) {
237
+ ry-grid[cols="3"], ry-grid[cols="4"],
238
+ ry-grid[cols="5"], ry-grid[cols="6"] { grid-template-columns: repeat(2, 1fr); }
239
+ }
240
+
241
+ /* Stack */
242
+ ry-stack { display: flex; flex-direction: column; gap: var(--ry-space-4); }
243
+ ry-stack[gap="sm"] { gap: var(--ry-space-2); }
244
+ ry-stack[gap="md"] { gap: var(--ry-space-4); }
245
+ ry-stack[gap="lg"] { gap: var(--ry-space-6); }
246
+ ry-stack[gap="xl"] { gap: var(--ry-space-8); }
247
+
248
+ /* Cluster */
249
+ ry-cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ry-space-3); }
250
+ ry-cluster[gap="sm"] { gap: var(--ry-space-2); }
251
+ ry-cluster[gap="md"] { gap: var(--ry-space-3); }
252
+ ry-cluster[gap="lg"] { gap: var(--ry-space-4); }
253
+
254
+ /* Split */
255
+ ry-split { display: flex; gap: var(--ry-space-6); }
256
+ ry-split > :first-child { flex: 1; }
257
+ ry-split > :last-child { flex-shrink: 0; width: 300px; }
258
+ @media (max-width: 768px) {
259
+ ry-split { flex-direction: column; }
260
+ ry-split > :last-child { width: 100%; }
261
+ }
262
+
263
+ /* Center */
264
+ ry-center {
265
+ display: flex;
266
+ flex-direction: column;
267
+ align-items: center;
268
+ justify-content: center;
269
+ text-align: center;
270
+ }
271
+
272
+ /* Nav */
273
+ ry-nav { display: flex; align-items: center; gap: var(--ry-space-4); }
274
+ ry-nav a { text-decoration: none; }
275
+
276
+ /* Logo */
277
+ ry-logo { display: inline-flex; align-items: center; }
278
+
279
+ /* Actions */
280
+ ry-actions { display: flex; align-items: center; gap: var(--ry-space-2); }
281
+
282
+ /* Divider */
283
+ ry-divider { display: block; height: 1px; margin: var(--ry-space-4) 0; }
284
+ ry-divider[vertical] { width: 1px; height: auto; align-self: stretch; margin: 0 var(--ry-space-4); }
285
+
286
+ /* Buttons */
287
+ ry-button {
288
+ display: inline-flex;
289
+ align-items: center;
290
+ justify-content: center;
291
+ gap: var(--ry-space-2);
292
+ padding: var(--ry-space-2) var(--ry-space-4);
293
+ white-space: nowrap;
294
+ cursor: pointer;
295
+ user-select: none;
296
+ }
297
+ ry-button[disabled] {
298
+ cursor: not-allowed;
299
+ pointer-events: none;
300
+ }
301
+ ry-button[size="sm"] { padding: var(--ry-space-1) var(--ry-space-3); }
302
+ ry-button[size="lg"] { padding: var(--ry-space-3) var(--ry-space-6); }
303
+
304
+ /* Toggle Button */
305
+ ry-toggle-button {
306
+ display: inline-flex;
307
+ align-items: center;
308
+ justify-content: center;
309
+ gap: var(--ry-space-2);
310
+ padding: var(--ry-space-2) var(--ry-space-4);
311
+ white-space: nowrap;
312
+ cursor: pointer;
313
+ user-select: none;
314
+ }
315
+ ry-toggle-button[disabled] { cursor: not-allowed; pointer-events: none; }
316
+ ry-toggle-button[size="sm"] { padding: var(--ry-space-1) var(--ry-space-3); }
317
+ ry-toggle-button[size="lg"] { padding: var(--ry-space-3) var(--ry-space-6); }
318
+ ry-toggle-button[icon]:empty { padding: var(--ry-space-2); }
319
+ ry-toggle-button[icon][size="sm"]:empty { padding: var(--ry-space-1); }
320
+ ry-toggle-button[icon][size="lg"]:empty { padding: var(--ry-space-3); }
321
+ ry-toggle-button[block] { display: block; width: 100%; text-align: left; padding: var(--ry-space-4); }
322
+
323
+ /* Knob */
324
+ ry-knob { display: inline-flex; flex-direction: column; align-items: center; gap: var(--ry-space-1); user-select: none; outline: none; }
325
+ ry-knob[disabled] { pointer-events: none; }
326
+ ry-knob [data-ry-target="ring"] { --knob-size: 64px; --knob-rotation: -135deg; --knob-percent: 0; position: relative; width: var(--knob-size); height: var(--knob-size); cursor: grab; }
327
+ ry-knob [data-ry-target="ring"].ry-knob__ring--dragging { cursor: grabbing; }
328
+ ry-knob [data-ry-target="cap"] { position: absolute; inset: 0; transform: rotate(var(--knob-rotation)); }
329
+ ry-knob [data-ry-target="indicator"] { position: absolute; width: 3px; height: 10px; top: 6px; left: 50%; margin-left: -1.5px; }
330
+ ry-knob [data-ry-target="display"] { display: block; min-width: 3em; text-align: center; }
331
+ ry-knob [data-ry-target="label"] { display: block; text-align: center; }
332
+ ry-knob[size="sm"] [data-ry-target="ring"] { --knob-size: 48px; }
333
+ ry-knob[size="lg"] [data-ry-target="ring"] { --knob-size: 80px; }
334
+
335
+ /* Slider */
336
+ ry-slider { display: block; position: relative; padding: var(--ry-space-4) 0; touch-action: none; user-select: none; }
337
+ ry-slider[disabled] { pointer-events: none; }
338
+ ry-slider [data-ry-target="track"] { position: relative; height: var(--ry-slider-track, 14px); cursor: pointer; }
339
+ ry-slider [data-ry-target="fill"] { position: absolute; height: 100%; }
340
+ ry-slider [data-ry-target^="thumb"] { position: absolute; width: var(--ry-slider-thumb, 32px); height: var(--ry-slider-thumb, 32px); top: 50%; transform: translate(-50%, -50%); cursor: grab; }
341
+ ry-slider [data-ry-target^="thumb"]:active { cursor: grabbing; }
342
+ ry-slider [data-ry-target="labels"] { display: flex; justify-content: space-between; margin-top: var(--ry-space-2); pointer-events: none; }
343
+ ry-slider [data-ry-target^="tooltip"] { position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%); white-space: nowrap; opacity: 0; visibility: hidden; transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease); pointer-events: none; }
344
+ ry-slider [data-ry-target^="thumb"]:hover [data-ry-target^="tooltip"], ry-slider [data-ry-target^="thumb"]:focus [data-ry-target^="tooltip"] { opacity: 1; visibility: visible; }
345
+ ry-slider[vertical] { display: inline-flex; width: auto; height: 200px; padding: 0 var(--ry-space-4); }
346
+ ry-slider[vertical] [data-ry-target="track"] { width: var(--ry-slider-track, 14px); height: 100%; }
347
+ ry-slider[vertical] [data-ry-target="fill"] { width: 100%; height: auto; bottom: 0; left: 0; }
348
+ ry-slider[vertical] [data-ry-target^="thumb"] { left: 50%; top: auto; transform: translate(-50%, 50%); }
349
+ ry-slider[vertical] [data-ry-target="labels"] { flex-direction: column-reverse; justify-content: space-between; height: 100%; margin-top: 0; margin-left: var(--ry-space-2); }
350
+ ry-slider[size="sm"] { --ry-slider-track: 10px; --ry-slider-thumb: 24px; }
351
+ ry-slider[size="lg"] { --ry-slider-track: 18px; --ry-slider-thumb: 40px; }
352
+
353
+ /* Cards */
354
+ ry-card { display: block; padding: var(--ry-space-6); }
355
+ ry-card h3 { margin: 0 0 var(--ry-space-2) 0; }
356
+ ry-card p { margin: 0 0 var(--ry-space-4) 0; }
357
+ ry-card p:last-child { margin-bottom: 0; }
358
+
359
+ /* Badges */
360
+ ry-badge {
361
+ display: inline-flex;
362
+ align-items: center;
363
+ padding: var(--ry-space-1) var(--ry-space-2);
364
+ line-height: 1;
365
+ }
366
+
367
+ /* Alerts */
368
+ ry-alert { display: flex; gap: var(--ry-space-3); padding: var(--ry-space-4); }
369
+ ry-alert [slot="title"] { margin: 0 0 var(--ry-space-1) 0; }
370
+ ry-alert p, ry-alert [data-ry-target="content"] { margin: 0; }
371
+
372
+ /* Form elements */
373
+ ry-field input, ry-field textarea, ry-field select {
374
+ display: block;
375
+ width: 100%;
376
+ padding: var(--ry-space-2) var(--ry-space-3);
377
+ }
378
+ ry-field input:disabled, ry-field textarea:disabled { cursor: not-allowed; }
379
+ ry-field label, ry-field [data-ry-target="label"] { display: block; margin-bottom: var(--ry-space-2); }
380
+ ry-field { display: block; margin-bottom: var(--ry-space-4); }
381
+
382
+ /* Accordion */
383
+ ry-accordion { overflow: hidden; }
384
+ ry-accordion [data-ry-target="trigger"] {
385
+ display: flex;
386
+ align-items: center;
387
+ justify-content: space-between;
388
+ width: 100%;
389
+ padding: var(--ry-space-4) var(--ry-space-6);
390
+ text-align: left;
391
+ border: none;
392
+ cursor: pointer;
393
+ }
394
+ ry-accordion [data-ry-target="icon"] {
395
+ flex-shrink: 0;
396
+ transition: transform var(--ry-duration-normal) var(--ry-ease);
397
+ }
398
+ ry-accordion [data-ry-target="item"][data-ry-state="open"] [data-ry-target="icon"] { transform: rotate(180deg); }
399
+ ry-accordion [data-ry-target="panel"] { overflow: hidden; }
400
+ ry-accordion [data-ry-target="item"][data-ry-state="closed"] [data-ry-target="panel"] { display: none; }
401
+ ry-accordion [data-ry-target="panel"] > * { padding: var(--ry-space-4) var(--ry-space-6); }
402
+
403
+ /* Tabs */
404
+ ry-tabs { display: block; }
405
+ ry-tabs [data-ry-target="list"] { display: flex; gap: var(--ry-space-1); margin-bottom: var(--ry-space-4); }
406
+ ry-tabs [data-ry-target="trigger"] {
407
+ padding: var(--ry-space-2) var(--ry-space-4);
408
+ border: none;
409
+ border-bottom: 2px solid transparent;
410
+ margin-bottom: -1px;
411
+ cursor: pointer;
412
+ }
413
+ ry-tabs [data-ry-target="panel"], ry-tab { display: none; }
414
+ ry-tabs [data-ry-target="panel"][data-ry-state="active"], ry-tab[active], ry-tab[data-ry-state="active"] { display: block; }
415
+ ry-tabs:not(:defined) ry-tab:first-of-type { display: block; }
416
+
417
+ /* Modal */
418
+ ry-modal { display: contents; }
419
+ ry-modal [data-ry-target="backdrop"] {
420
+ position: fixed;
421
+ inset: 0;
422
+ z-index: var(--ry-z-modal-backdrop);
423
+ opacity: 0;
424
+ visibility: hidden;
425
+ transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease);
426
+ }
427
+ ry-modal[data-ry-state="open"] [data-ry-target="backdrop"] { opacity: 1; visibility: visible; }
428
+ ry-modal [data-ry-target="dialog"] {
429
+ position: fixed;
430
+ top: 50%;
431
+ left: 50%;
432
+ z-index: var(--ry-z-modal);
433
+ width: 100%;
434
+ max-width: 32rem;
435
+ max-height: calc(100vh - var(--ry-space-8));
436
+ overflow: auto;
437
+ opacity: 0;
438
+ visibility: hidden;
439
+ transform: translate(-50%, -50%) scale(0.95);
440
+ transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease), transform var(--ry-duration-normal) var(--ry-ease);
441
+ }
442
+ ry-modal[data-ry-state="open"] [data-ry-target="dialog"] { opacity: 1; visibility: visible; transform: translate(-50%, -50%) scale(1); }
443
+ ry-modal [data-ry-target="header"] { display: flex; align-items: center; justify-content: space-between; padding: var(--ry-space-4) var(--ry-space-6); }
444
+ ry-modal [data-ry-target="header"] h3 { margin: 0; }
445
+ ry-modal [data-ry-target="close"] { display: flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; padding: 0; border: none; cursor: pointer; }
446
+ ry-modal [data-ry-target="body"] { padding: var(--ry-space-6); }
447
+ ry-modal [data-ry-target="footer"] { display: flex; justify-content: flex-end; gap: var(--ry-space-3); padding: var(--ry-space-4) var(--ry-space-6); }
448
+
449
+ /* Dropdown */
450
+ ry-dropdown { position: relative; display: inline-block; }
451
+ ry-dropdown [data-ry-target="menu"], ry-dropdown ry-menu {
452
+ position: absolute;
453
+ top: 100%;
454
+ left: 0;
455
+ z-index: var(--ry-z-dropdown);
456
+ min-width: 12rem;
457
+ margin-top: var(--ry-space-1);
458
+ padding: var(--ry-space-1);
459
+ opacity: 0;
460
+ visibility: hidden;
461
+ transform: translateY(-0.5rem);
462
+ transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease);
463
+ }
464
+ ry-dropdown[data-ry-state="open"] [data-ry-target="menu"], ry-dropdown[data-ry-state="open"] ry-menu {
465
+ opacity: 1;
466
+ visibility: visible;
467
+ transform: translateY(0);
468
+ }
469
+ ry-menu-item {
470
+ display: block;
471
+ width: 100%;
472
+ padding: var(--ry-space-2) var(--ry-space-3);
473
+ text-align: left;
474
+ text-decoration: none;
475
+ border: none;
476
+ cursor: pointer;
477
+ }
478
+
479
+ /* Switch */
480
+ ry-switch { display: inline-flex; align-items: center; gap: var(--ry-space-3); cursor: pointer; user-select: none; }
481
+ ry-switch[disabled] { cursor: not-allowed; }
482
+ ry-switch [data-ry-target="track"] { position: relative; display: inline-flex; width: 2.75rem; height: 1.5rem; flex-shrink: 0; }
483
+ ry-switch [data-ry-target="thumb"] {
484
+ position: absolute;
485
+ top: 2px;
486
+ left: 2px;
487
+ width: 1.125rem;
488
+ height: 1.125rem;
489
+ transition: transform var(--ry-duration-fast) var(--ry-ease);
490
+ }
491
+ ry-switch[checked] [data-ry-target="thumb"] { transform: translateX(1.25rem); }
492
+ ry-switch [data-ry-target="input"] { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; }
493
+ ry-switch:focus-visible { outline: none; }
494
+
495
+ /* Tooltip */
496
+ ry-tooltip { position: relative; display: inline-block; }
497
+ ry-tooltip [data-ry-target="content"] {
498
+ position: absolute;
499
+ z-index: var(--ry-z-tooltip);
500
+ padding: var(--ry-space-2) var(--ry-space-3);
501
+ white-space: nowrap;
502
+ opacity: 0;
503
+ visibility: hidden;
504
+ pointer-events: none;
505
+ transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease);
506
+ }
507
+ ry-tooltip[data-ry-state="open"] [data-ry-target="content"] { opacity: 1; visibility: visible; }
508
+ /* Tooltip positioning - CSS handles all layout, no JS needed */
509
+ ry-tooltip[data-ry-position="top"] [data-ry-target="content"] { bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: var(--ry-space-2); }
510
+ ry-tooltip[data-ry-position="bottom"] [data-ry-target="content"] { top: 100%; left: 50%; transform: translateX(-50%); margin-top: var(--ry-space-2); }
511
+ ry-tooltip[data-ry-position="left"] [data-ry-target="content"] { right: 100%; top: 50%; transform: translateY(-50%); margin-right: var(--ry-space-2); }
512
+ ry-tooltip[data-ry-position="right"] [data-ry-target="content"] { left: 100%; top: 50%; transform: translateY(-50%); margin-left: var(--ry-space-2); }
513
+
514
+ /* Drawer */
515
+ ry-drawer { display: contents; }
516
+ ry-drawer [data-ry-target="backdrop"] {
517
+ position: fixed;
518
+ inset: 0;
519
+ z-index: var(--ry-z-modal-backdrop);
520
+ opacity: 0;
521
+ visibility: hidden;
522
+ transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease);
523
+ }
524
+ ry-drawer[data-ry-state="open"] [data-ry-target="backdrop"] { opacity: 1; visibility: visible; }
525
+ ry-drawer [data-ry-target="panel"] {
526
+ position: fixed;
527
+ z-index: var(--ry-z-modal);
528
+ opacity: 0;
529
+ visibility: hidden;
530
+ transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease), transform var(--ry-duration-normal) var(--ry-ease);
531
+ }
532
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"] { opacity: 1; visibility: visible; }
533
+ ry-drawer [data-ry-target="panel"][data-ry-side="left"] { top: 0; left: 0; bottom: 0; width: 20rem; max-width: 100%; transform: translateX(-100%); }
534
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="left"] { transform: translateX(0); }
535
+ ry-drawer [data-ry-target="panel"][data-ry-side="right"] { top: 0; right: 0; bottom: 0; width: 20rem; max-width: 100%; transform: translateX(100%); }
536
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="right"] { transform: translateX(0); }
537
+ ry-drawer [data-ry-target="panel"][data-ry-side="top"] { top: 0; left: 0; right: 0; height: auto; max-height: 80vh; transform: translateY(-100%); }
538
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="top"] { transform: translateY(0); }
539
+ ry-drawer [data-ry-target="panel"][data-ry-side="bottom"] { bottom: 0; left: 0; right: 0; height: auto; max-height: 80vh; transform: translateY(100%); }
540
+ ry-drawer[data-ry-state="open"] [data-ry-target="panel"][data-ry-side="bottom"] { transform: translateY(0); }
541
+ ry-drawer [data-ry-target="close"] { position: absolute; top: var(--ry-space-4); right: var(--ry-space-4); display: flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; padding: 0; border: none; cursor: pointer; }
542
+ ry-drawer [data-ry-target="content"] { padding: var(--ry-space-6); padding-top: var(--ry-space-12); overflow-y: auto; height: 100%; }
543
+
544
+ /* Toast */
545
+ [data-ry-target="toast-container"] {
546
+ position: fixed;
547
+ top: var(--ry-space-4);
548
+ right: var(--ry-space-4);
549
+ z-index: var(--ry-z-toast);
550
+ display: flex;
551
+ flex-direction: column;
552
+ gap: var(--ry-space-3);
553
+ max-width: 24rem;
554
+ pointer-events: none;
555
+ }
556
+ ry-toast {
557
+ display: flex;
558
+ align-items: flex-start;
559
+ gap: var(--ry-space-3);
560
+ padding: var(--ry-space-4);
561
+ pointer-events: auto;
562
+ opacity: 0;
563
+ transform: translateX(1rem);
564
+ transition: opacity var(--ry-duration-normal) var(--ry-ease), transform var(--ry-duration-normal) var(--ry-ease);
565
+ }
566
+ ry-toast[data-ry-state="visible"] { opacity: 1; transform: translateX(0); }
567
+ ry-toast[data-ry-state="hiding"] { opacity: 0; transform: translateX(1rem); }
568
+ ry-toast [data-ry-target="icon"] { flex-shrink: 0; width: 1.25rem; height: 1.25rem; display: flex; align-items: center; justify-content: center; }
569
+ ry-toast [data-ry-target="content"] { flex: 1; }
570
+ ry-toast [data-ry-target="close"] { flex-shrink: 0; display: flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; padding: 0; margin: calc(var(--ry-space-1) * -1); border: none; cursor: pointer; }
571
+
572
+ /* Select */
573
+ ry-select { position: relative; display: inline-block; min-width: 12rem; }
574
+ ry-select[disabled] { cursor: not-allowed; }
575
+ ry-select [data-ry-target="trigger"] { display: flex; align-items: center; justify-content: space-between; gap: var(--ry-space-2); width: 100%; padding: var(--ry-space-2) var(--ry-space-3); cursor: pointer; }
576
+ ry-select [data-ry-target="value"] { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
577
+ ry-select [data-ry-target="arrow"] { flex-shrink: 0; transition: transform var(--ry-duration-fast) var(--ry-ease); }
578
+ ry-select[data-ry-state="open"] [data-ry-target="arrow"] { transform: rotate(180deg); }
579
+ ry-select [data-ry-target="dropdown"] {
580
+ position: absolute;
581
+ top: 100%;
582
+ left: 0;
583
+ right: 0;
584
+ z-index: var(--ry-z-dropdown);
585
+ margin-top: var(--ry-space-1);
586
+ padding: var(--ry-space-1);
587
+ max-height: 15rem;
588
+ overflow-y: auto;
589
+ opacity: 0;
590
+ visibility: hidden;
591
+ transform: translateY(-0.5rem);
592
+ transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease);
593
+ }
594
+ ry-select[data-ry-state="open"] [data-ry-target="dropdown"] { opacity: 1; visibility: visible; transform: translateY(0); }
595
+ ry-select[data-ry-position="top"] [data-ry-target="dropdown"] { top: auto; bottom: 100%; margin-top: 0; margin-bottom: var(--ry-space-1); transform: translateY(0.5rem); }
596
+ ry-select[data-ry-position="top"][data-ry-state="open"] [data-ry-target="dropdown"] { transform: translateY(0); }
597
+ ry-select [data-ry-target="option"] { padding: var(--ry-space-2) var(--ry-space-3); cursor: pointer; }
598
+ ry-select [data-ry-target="option"][data-disabled] { cursor: not-allowed; }
599
+ ry-select [data-ry-target="native"] { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; }
600
+ ry-option { display: none; }
601
+
602
+ /* Code */
603
+ ry-code { display: block; overflow: hidden; margin-bottom: var(--ry-space-4, 1rem); }
604
+ ry-code [data-ry-target="header"] { display: flex; align-items: center; justify-content: space-between; padding: var(--ry-space-2) var(--ry-space-4); }
605
+ ry-code [data-ry-target="title"] { text-transform: uppercase; letter-spacing: 0.05em; }
606
+ ry-code [data-ry-target="copy"] { display: flex; align-items: center; justify-content: center; width: 1.75rem; height: 1.75rem; padding: 0; border: none; cursor: pointer; }
607
+ ry-code [data-ry-target="copy"] svg { width: 16px; height: 16px; }
608
+ ry-code [data-ry-target="content"] { overflow: auto; padding: 0 var(--ry-space-4) var(--ry-space-4); }
609
+ ry-code [data-ry-target="pre"] { margin: 0; overflow: visible; }
610
+ ry-code [data-ry-target="code"] { display: block; white-space: pre; tab-size: 2; }
611
+ ry-code .ry-code__line { display: flex; }
612
+ ry-code .ry-code__line-number { flex-shrink: 0; width: 2rem; text-align: right; padding-right: var(--ry-space-2); user-select: none; }
613
+ ry-code .ry-code__line-content { flex: 1; min-width: 0; padding-left: var(--ry-space-2); }
614
+ ry-code .ry-code__color-preview { display: inline-block; width: 0.625rem; height: 0.625rem; margin-right: var(--ry-space-1); vertical-align: middle; }
615
+
616
+ /* Example */
617
+ ry-example { display: grid; grid-template-columns: 1fr 1fr; gap: var(--ry-space-4); align-items: start; }
618
+ ry-example [data-ry-target="code"] { min-width: 0; }
619
+ ry-example [data-ry-target="preview"] { min-width: 0; padding: var(--ry-space-4); }
620
+ @media (max-width: 768px) { ry-example { grid-template-columns: 1fr; } }
621
+ ry-example[data-stacked] { grid-template-columns: 1fr; }
622
+
623
+ /* Icon */
624
+ ry-icon { display: inline-flex; align-items: center; justify-content: center; vertical-align: middle; flex-shrink: 0; }
625
+ ry-icon svg { display: block; }
626
+
627
+ /* Checkbox */
628
+ input[type="checkbox"] {
629
+ appearance: none;
630
+ -webkit-appearance: none;
631
+ display: inline-flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ width: 1.125rem;
635
+ height: 1.125rem;
636
+ flex-shrink: 0;
637
+ cursor: pointer;
638
+ vertical-align: middle;
639
+ }
640
+ input[type="checkbox"]:disabled { cursor: not-allowed; }
641
+ input[type="checkbox"]::after {
642
+ content: '';
643
+ display: block;
644
+ width: 0.375rem;
645
+ height: 0.625rem;
646
+ opacity: 0;
647
+ transform: rotate(45deg) scale(0.8);
648
+ transition: opacity var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease);
649
+ }
650
+ input[type="checkbox"]:checked::after { opacity: 1; transform: rotate(45deg) scale(1); }
651
+
652
+ /* Radio */
653
+ input[type="radio"] {
654
+ appearance: none;
655
+ -webkit-appearance: none;
656
+ display: inline-flex;
657
+ align-items: center;
658
+ justify-content: center;
659
+ width: 1.125rem;
660
+ height: 1.125rem;
661
+ flex-shrink: 0;
662
+ cursor: pointer;
663
+ vertical-align: middle;
664
+ }
665
+ input[type="radio"]:disabled { cursor: not-allowed; }
666
+ input[type="radio"]::after {
667
+ content: '';
668
+ display: block;
669
+ width: 0.5rem;
670
+ height: 0.5rem;
671
+ opacity: 0;
672
+ transform: scale(0);
673
+ transition: opacity var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease);
674
+ }
675
+ input[type="radio"]:checked::after { opacity: 1; transform: scale(1); }
676
+
677
+ /* Table */
678
+ table { width: 100%; border-collapse: collapse; text-align: left; }
679
+ th, td { padding: var(--ry-space-3) var(--ry-space-4); vertical-align: top; }
680
+ th { text-align: left; }
681
+
682
+ /* Keyframes */
683
+ @keyframes ry-fade-in { from { opacity: 0; } to { opacity: 1; } }
684
+ @keyframes ry-fade-out { from { opacity: 1; } to { opacity: 0; } }
685
+ @keyframes ry-slide-up { from { transform: translateY(1rem); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
686
+ @keyframes ry-slide-down { from { transform: translateY(-1rem); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
687
+ @keyframes ry-scale-in { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } }
688
+
689
+ /* Color Picker */
690
+ ry-color-picker { position: relative; display: inline-block; user-select: none; }
691
+ ry-color-picker[disabled] { pointer-events: none; }
692
+ ry-color-picker [data-ry-target="trigger"] { display: block; width: var(--ry-color-picker-trigger-size, 32px); height: var(--ry-color-picker-trigger-size, 32px); padding: 0; border: none; cursor: pointer; }
693
+ ry-color-picker [data-ry-target="trigger-color"] { display: block; width: 100%; height: 100%; }
694
+ ry-color-picker [data-ry-target="panel"] { width: var(--ry-color-picker-width, 240px); }
695
+ ry-color-picker:not([inline]) [data-ry-target="panel"] { position: absolute; left: 0; z-index: var(--ry-z-dropdown, 1000); opacity: 0; visibility: hidden; }
696
+ ry-color-picker[data-ry-position="bottom"] [data-ry-target="panel"] { top: 100%; margin-top: var(--ry-space-1); transform: translateY(-0.5rem); }
697
+ ry-color-picker[data-ry-position="top"] [data-ry-target="panel"] { bottom: 100%; top: auto; margin-bottom: var(--ry-space-1); transform: translateY(0.5rem); }
698
+ ry-color-picker[data-ry-state="open"][data-ry-position] [data-ry-target="panel"] { opacity: 1; visibility: visible; transform: translateY(0); transition: opacity var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease); }
699
+ ry-color-picker[inline] [data-ry-target="panel"] { position: static; opacity: 1; visibility: visible; transform: none; }
700
+ ry-color-picker [data-ry-target="grid"] { position: relative; width: 100%; height: var(--ry-color-picker-grid-height, 160px); cursor: crosshair; touch-action: none; }
701
+ ry-color-picker [data-ry-target="grid-handle"] { position: absolute; width: var(--ry-color-picker-handle-size, 16px); height: var(--ry-color-picker-handle-size, 16px); transform: translate(-50%, -50%); cursor: grab; }
702
+ ry-color-picker [data-ry-target="grid-handle"]:active { cursor: grabbing; }
703
+ ry-color-picker [data-ry-target="controls"] { display: flex; gap: var(--ry-space-3); padding: var(--ry-space-3); }
704
+ ry-color-picker [data-ry-target="sliders"] { flex: 1; display: flex; flex-direction: column; gap: var(--ry-space-2); justify-content: center; }
705
+ ry-color-picker .ry-color-picker__slider { position: relative; height: var(--ry-color-picker-slider-height, 12px); cursor: pointer; touch-action: none; }
706
+ ry-color-picker .ry-color-picker__slider-handle { position: absolute; top: 50%; width: var(--ry-color-picker-slider-handle, 16px); height: var(--ry-color-picker-slider-handle, 16px); transform: translate(-50%, -50%); cursor: grab; }
707
+ ry-color-picker .ry-color-picker__slider-handle:active { cursor: grabbing; }
708
+ ry-color-picker [data-ry-target="preview"] { position: relative; width: var(--ry-color-picker-preview-size, 40px); height: var(--ry-color-picker-preview-size, 40px); flex-shrink: 0; }
709
+ ry-color-picker [data-ry-target="preview-color"] { position: absolute; inset: 0; }
710
+ ry-color-picker [data-ry-target="input-row"] { display: flex; gap: var(--ry-space-2); padding: 0 var(--ry-space-3) var(--ry-space-3); }
711
+ ry-color-picker [data-ry-target="input"] { flex: 1; min-width: 0; padding: var(--ry-space-2) var(--ry-space-3); }
712
+ ry-color-picker [data-ry-target="format-toggle"] { flex-shrink: 0; padding: var(--ry-space-2) var(--ry-space-3); border: none; cursor: pointer; }
713
+ ry-color-picker [data-ry-target="swatches"] { display: flex; flex-wrap: wrap; gap: var(--ry-space-1); padding: 0 var(--ry-space-3) var(--ry-space-3); }
714
+ ry-color-picker .ry-color-picker__swatch { width: var(--ry-color-picker-swatch-size, 20px); height: var(--ry-color-picker-swatch-size, 20px); padding: 0; border: none; cursor: pointer; }
715
+
716
+ /* Color Input */
717
+ ry-color-input { position: relative; display: inline-block; }
718
+ ry-color-input[disabled] { pointer-events: none; }
719
+ ry-color-input [data-ry-target="trigger"] { display: flex; align-items: stretch; }
720
+ ry-color-input [data-ry-target="swatch"] { display: flex; align-items: center; justify-content: center; width: var(--ry-color-input-swatch-width, 40px); flex-shrink: 0; padding: 0; border: none; cursor: pointer; }
721
+ ry-color-input [data-ry-target="swatch-color"] { display: block; width: 100%; height: 100%; }
722
+ ry-color-input [data-ry-target="input"] { flex: 1; min-width: 0; padding: var(--ry-space-2) var(--ry-space-3); }
723
+ ry-color-input [data-ry-target="panel"] { position: absolute; left: 0; z-index: var(--ry-z-dropdown, 1000); opacity: 0; visibility: hidden; pointer-events: none; }
724
+ ry-color-input[data-ry-position="bottom"] [data-ry-target="panel"] { top: 100%; margin-top: var(--ry-space-1); transform: translateY(-0.5rem); }
725
+ ry-color-input[data-ry-position="top"] [data-ry-target="panel"] { bottom: 100%; top: auto; margin-bottom: var(--ry-space-1); transform: translateY(0.5rem); }
726
+ ry-color-input[data-ry-state="open"][data-ry-position] [data-ry-target="panel"] { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0); transition: opacity var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease); }
727
+ ry-color-input ry-color-picker[inline] [data-ry-target="panel"] { border: none; box-shadow: none; }
728
+
729
+ /* ═══════════════════════════════════════════════════════════════════════════
730
+ PART 3: THEME
731
+ Visual styling - colors, shadows, borders, typography decoration.
732
+ Uses .ry-* class selectors for styling that can be swapped out.
733
+ ═══════════════════════════════════════════════════════════════════════════ */
734
+
735
+ /* Base */
736
+ html { background-color: var(--ry-color-bg); }
737
+
738
+ /* Focus */
739
+ [data-ry-target]:focus-visible,
740
+ ry-button:focus-visible {
741
+ outline: none;
742
+ box-shadow: var(--ry-focus-ring);
743
+ }
744
+
745
+ /* Page typography */
746
+ ry-page {
747
+ font-family: var(--ry-font-sans);
748
+ font-size: var(--ry-text-base);
749
+ line-height: var(--ry-leading-normal);
750
+ color: var(--ry-color-text);
751
+ background-color: var(--ry-color-bg);
752
+ }
753
+ ry-page h1, ry-page h2, ry-page h3, ry-page h4, ry-page h5, ry-page h6 {
754
+ margin: 0 0 var(--ry-space-4) 0;
755
+ font-weight: var(--ry-font-semibold);
756
+ line-height: var(--ry-leading-tight);
757
+ color: var(--ry-color-text);
758
+ }
759
+ ry-page h1 { font-size: var(--ry-text-4xl); }
760
+ ry-page h2 { font-size: var(--ry-text-3xl); }
761
+ ry-page h3 { font-size: var(--ry-text-2xl); }
762
+ ry-page h4 { font-size: var(--ry-text-xl); }
763
+ ry-page p { margin: 0 0 var(--ry-space-4) 0; }
764
+ ry-page a { color: var(--ry-color-primary); text-decoration: none; }
765
+ ry-page a:hover { text-decoration: underline; }
766
+
767
+ /* Header */
768
+ ry-header {
769
+ background-color: var(--ry-color-bg);
770
+ border-bottom: var(--ry-border-width) solid var(--ry-color-border);
771
+ }
772
+
773
+ /* Footer */
774
+ ry-footer {
775
+ background-color: var(--ry-color-bg-subtle);
776
+ border-top: var(--ry-border-width) solid var(--ry-color-border);
777
+ color: var(--ry-color-text-muted);
778
+ }
779
+
780
+ /* Nav */
781
+ ry-nav a {
782
+ color: var(--ry-color-text-muted);
783
+ font-size: var(--ry-text-sm);
784
+ font-weight: var(--ry-font-medium);
785
+ transition: color var(--ry-duration-fast) var(--ry-ease);
786
+ }
787
+ ry-nav a:hover { color: var(--ry-color-text); }
788
+ ry-nav a[aria-current="page"] { color: var(--ry-color-primary); }
789
+
790
+ /* Logo */
791
+ ry-logo {
792
+ font-size: var(--ry-text-xl);
793
+ font-weight: var(--ry-font-bold);
794
+ color: var(--ry-color-text);
795
+ }
796
+
797
+ /* Divider */
798
+ ry-divider { background-color: var(--ry-color-border); }
799
+
800
+ /* Buttons */
801
+ ry-button, .ry-btn {
802
+ font-family: var(--ry-font-sans);
803
+ font-size: var(--ry-text-sm);
804
+ font-weight: var(--ry-font-medium);
805
+ line-height: var(--ry-leading-normal);
806
+ text-decoration: none;
807
+ background-color: var(--ry-color-primary);
808
+ color: var(--ry-color-text-inverse);
809
+ border: var(--ry-border-width) solid transparent;
810
+ border-radius: var(--ry-radius-md);
811
+ transition-property: background-color, border-color, color, box-shadow;
812
+ transition-duration: var(--ry-duration-fast);
813
+ transition-timing-function: var(--ry-ease);
814
+ }
815
+ ry-button:hover, .ry-btn:hover { background-color: var(--ry-color-primary-hover); }
816
+ ry-button:active, .ry-btn:active { background-color: var(--ry-color-primary-active); }
817
+ ry-button[disabled], .ry-btn:disabled { opacity: 0.5; }
818
+
819
+ ry-button[variant="secondary"], .ry-btn--secondary { background-color: var(--ry-color-secondary); }
820
+ ry-button[variant="secondary"]:hover, .ry-btn--secondary:hover { background-color: var(--ry-color-secondary-hover); }
821
+
822
+ ry-button[variant="outline"], .ry-btn--outline { background-color: transparent; color: var(--ry-color-primary); border-color: var(--ry-color-primary); }
823
+ ry-button[variant="outline"]:hover, .ry-btn--outline:hover { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); }
824
+
825
+ ry-button[variant="ghost"], .ry-btn--ghost { background-color: transparent; color: var(--ry-color-text); }
826
+ ry-button[variant="ghost"]:hover, .ry-btn--ghost:hover { background-color: var(--ry-color-bg-muted); }
827
+
828
+ ry-button[variant="danger"], .ry-btn--danger { background-color: var(--ry-color-danger); }
829
+ ry-button[variant="danger"]:hover, .ry-btn--danger:hover { background-color: var(--ry-color-danger-hover, #dc2626); }
830
+
831
+ ry-button[size="sm"], .ry-btn--sm { font-size: var(--ry-text-xs); }
832
+ ry-button[size="lg"], .ry-btn--lg { font-size: var(--ry-text-base); }
833
+
834
+ /* Toggle Button */
835
+ ry-toggle-button {
836
+ font-family: var(--ry-font-sans);
837
+ font-size: var(--ry-text-sm);
838
+ font-weight: var(--ry-font-medium);
839
+ line-height: var(--ry-leading-normal);
840
+ text-decoration: none;
841
+ background-color: var(--ry-color-bg);
842
+ color: var(--ry-color-text);
843
+ border: var(--ry-border-width) solid var(--ry-color-border);
844
+ border-radius: var(--ry-radius-md);
845
+ transition-property: background-color, border-color, color, box-shadow;
846
+ transition-duration: var(--ry-duration-fast);
847
+ transition-timing-function: var(--ry-ease);
848
+ }
849
+ ry-toggle-button:hover { background-color: var(--ry-color-bg-muted); border-color: var(--ry-color-border-strong); }
850
+ ry-toggle-button:active { background-color: var(--ry-color-bg-subtle); }
851
+ ry-toggle-button[pressed] { background-color: var(--ry-color-primary); border-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); }
852
+ ry-toggle-button[pressed]:hover { background-color: var(--ry-color-primary-hover); border-color: var(--ry-color-primary-hover); }
853
+ ry-toggle-button[disabled] { opacity: 0.5; }
854
+ ry-toggle-button:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); }
855
+ ry-toggle-button[size="sm"] { font-size: var(--ry-text-xs); }
856
+ ry-toggle-button[size="lg"] { font-size: var(--ry-text-base); }
857
+
858
+ /* Slider */
859
+ ry-slider [data-ry-target="track"] { background-color: var(--ry-color-bg-muted); border-radius: var(--ry-radius-full); }
860
+ ry-slider [data-ry-target="fill"] { background-color: var(--ry-color-primary); border-radius: var(--ry-radius-full); }
861
+ ry-slider [data-ry-target^="thumb"] { background-color: var(--ry-color-bg); border: 2px solid var(--ry-color-primary); border-radius: var(--ry-radius-full); box-shadow: var(--ry-shadow-sm); transition: box-shadow var(--ry-duration-fast) var(--ry-ease); }
862
+ ry-slider [data-ry-target^="thumb"]:hover { box-shadow: var(--ry-shadow-md); }
863
+ ry-slider [data-ry-target^="thumb"]:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); }
864
+ ry-slider[disabled] { opacity: 0.5; }
865
+ ry-slider [data-ry-target="labels"] { font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); }
866
+ ry-slider [data-ry-target^="tooltip"] { background-color: var(--ry-color-text); color: var(--ry-color-text-inverse); padding: var(--ry-space-1) var(--ry-space-2); border-radius: var(--ry-radius-md); font-size: var(--ry-text-xs); font-weight: var(--ry-font-medium); }
867
+ ry-slider[color="secondary"] [data-ry-target="fill"] { background-color: var(--ry-color-secondary); }
868
+ ry-slider[color="secondary"] [data-ry-target^="thumb"] { border-color: var(--ry-color-secondary); }
869
+ ry-slider[color="success"] [data-ry-target="fill"] { background-color: var(--ry-color-success); }
870
+ ry-slider[color="success"] [data-ry-target^="thumb"] { border-color: var(--ry-color-success); }
871
+ ry-slider[color="warning"] [data-ry-target="fill"] { background-color: var(--ry-color-warning); }
872
+ ry-slider[color="warning"] [data-ry-target^="thumb"] { border-color: var(--ry-color-warning); }
873
+ ry-slider[color="danger"] [data-ry-target="fill"] { background-color: var(--ry-color-danger); }
874
+ ry-slider[color="danger"] [data-ry-target^="thumb"] { border-color: var(--ry-color-danger); }
875
+ ry-slider[color="info"] [data-ry-target="fill"] { background-color: var(--ry-color-info); }
876
+ ry-slider[color="info"] [data-ry-target^="thumb"] { border-color: var(--ry-color-info); }
877
+
878
+ /* Knob */
879
+ ry-knob [data-ry-target="ring"] { background: conic-gradient(from 225deg, var(--ry-color-primary) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg)); border-radius: var(--ry-radius-full); }
880
+ ry-knob [data-ry-target="cap"] { background: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-full); margin: 4px; width: calc(100% - 8px); height: calc(100% - 8px); }
881
+ ry-knob [data-ry-target="indicator"] { background-color: var(--ry-color-primary); border-radius: 1.5px; }
882
+ ry-knob [data-ry-target="display"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); }
883
+ ry-knob [data-ry-target="label"] { font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); }
884
+ ry-knob:focus-visible [data-ry-target="ring"] { box-shadow: var(--ry-focus-ring); }
885
+ ry-knob[disabled] { opacity: 0.5; }
886
+ ry-knob[color="secondary"] [data-ry-target="ring"] { background: conic-gradient(from 225deg, var(--ry-color-secondary) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg)); }
887
+ ry-knob[color="secondary"] [data-ry-target="indicator"] { background-color: var(--ry-color-secondary); }
888
+ ry-knob[color="success"] [data-ry-target="ring"] { background: conic-gradient(from 225deg, var(--ry-color-success) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg)); }
889
+ ry-knob[color="success"] [data-ry-target="indicator"] { background-color: var(--ry-color-success); }
890
+ ry-knob[color="warning"] [data-ry-target="ring"] { background: conic-gradient(from 225deg, var(--ry-color-warning) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg)); }
891
+ ry-knob[color="warning"] [data-ry-target="indicator"] { background-color: var(--ry-color-warning); }
892
+ ry-knob[color="danger"] [data-ry-target="ring"] { background: conic-gradient(from 225deg, var(--ry-color-danger) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg)); }
893
+ ry-knob[color="danger"] [data-ry-target="indicator"] { background-color: var(--ry-color-danger); }
894
+
895
+ /* Cards */
896
+ ry-card {
897
+ background-color: var(--ry-color-bg);
898
+ border: var(--ry-border-width) solid var(--ry-color-border);
899
+ border-radius: var(--ry-radius-lg);
900
+ box-shadow: var(--ry-shadow-sm);
901
+ }
902
+ ry-card h3 { font-size: var(--ry-text-lg); font-weight: var(--ry-font-semibold); }
903
+ ry-card p { color: var(--ry-color-text-muted); }
904
+
905
+ /* Badges */
906
+ ry-badge, .ry-badge {
907
+ font-size: var(--ry-text-xs);
908
+ font-weight: var(--ry-font-medium);
909
+ background-color: var(--ry-color-bg-muted);
910
+ color: var(--ry-color-text);
911
+ border-radius: var(--ry-radius-full);
912
+ }
913
+ ry-badge[variant="primary"], .ry-badge--primary { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); }
914
+ ry-badge[variant="success"], .ry-badge--success { background-color: var(--ry-color-success); color: var(--ry-color-text-inverse); }
915
+ ry-badge[variant="warning"], .ry-badge--warning { background-color: var(--ry-color-warning); color: var(--ry-color-text); }
916
+ ry-badge[variant="danger"], .ry-badge--danger { background-color: var(--ry-color-danger); color: var(--ry-color-text-inverse); }
917
+
918
+ /* Alerts */
919
+ ry-alert, .ry-alert {
920
+ background-color: var(--ry-color-bg-subtle);
921
+ border: var(--ry-border-width) solid var(--ry-color-border);
922
+ border-radius: var(--ry-radius-lg);
923
+ }
924
+ ry-alert[type="info"], .ry-alert--info { background-color: var(--ry-color-info-bg, #ecfeff); border-color: var(--ry-color-info); color: var(--ry-color-info-text, #0e7490); }
925
+ ry-alert[type="success"], .ry-alert--success { background-color: var(--ry-color-success-bg, #f0fdf4); border-color: var(--ry-color-success); color: var(--ry-color-success-text, #15803d); }
926
+ ry-alert[type="warning"], .ry-alert--warning { background-color: var(--ry-color-warning-bg, #fffbeb); border-color: var(--ry-color-warning); color: var(--ry-color-warning-text, #b45309); }
927
+ ry-alert[type="danger"], .ry-alert--danger { background-color: var(--ry-color-danger-bg, #fef2f2); border-color: var(--ry-color-danger); color: var(--ry-color-danger-text, #b91c1c); }
928
+ ry-alert [slot="title"] { font-weight: var(--ry-font-semibold); }
929
+
930
+ /* Form elements */
931
+ ry-field input, ry-field textarea, ry-field select, .ry-input {
932
+ font-family: var(--ry-font-sans);
933
+ font-size: var(--ry-text-base);
934
+ line-height: var(--ry-leading-normal);
935
+ color: var(--ry-color-text);
936
+ background-color: var(--ry-color-bg);
937
+ border: var(--ry-border-width) solid var(--ry-color-border);
938
+ border-radius: var(--ry-radius-md);
939
+ transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease);
940
+ }
941
+ ry-field input:hover, ry-field textarea:hover, .ry-input:hover { border-color: var(--ry-color-border-strong); }
942
+ ry-field input:focus, ry-field textarea:focus, .ry-input:focus { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
943
+ ry-field input::placeholder, ry-field textarea::placeholder, .ry-input::placeholder { color: var(--ry-color-text-muted); }
944
+ ry-field input:disabled, ry-field textarea:disabled, .ry-input:disabled { background-color: var(--ry-color-bg-muted); opacity: 0.5; }
945
+ ry-field label, ry-field [data-ry-target="label"], .ry-label { font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); }
946
+
947
+ /* Accordion */
948
+ ry-accordion { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); }
949
+ ry-accordion [data-ry-target="item"], .ry-accordion__item { border-bottom: var(--ry-border-width) solid var(--ry-color-border); }
950
+ ry-accordion [data-ry-target="item"]:last-child, .ry-accordion__item:last-child { border-bottom: none; }
951
+ ry-accordion [data-ry-target="trigger"], .ry-accordion__trigger {
952
+ font-family: var(--ry-font-sans);
953
+ font-size: var(--ry-text-base);
954
+ font-weight: var(--ry-font-medium);
955
+ color: var(--ry-color-text);
956
+ background-color: transparent;
957
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
958
+ }
959
+ ry-accordion [data-ry-target="trigger"]:hover, .ry-accordion__trigger:hover { background-color: var(--ry-color-bg-subtle); }
960
+ ry-accordion [data-ry-target="trigger"]:focus-visible, .ry-accordion__trigger:focus-visible { outline: none; box-shadow: inset var(--ry-focus-ring); }
961
+
962
+ /* Tabs */
963
+ ry-tabs [data-ry-target="list"], .ry-tabs__list { border-bottom: var(--ry-border-width) solid var(--ry-color-border); }
964
+ ry-tabs [data-ry-target="trigger"], .ry-tabs__trigger {
965
+ font-family: var(--ry-font-sans);
966
+ font-size: var(--ry-text-sm);
967
+ font-weight: var(--ry-font-medium);
968
+ color: var(--ry-color-text-muted);
969
+ background: transparent;
970
+ transition: color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease);
971
+ }
972
+ ry-tabs [data-ry-target="trigger"]:hover, .ry-tabs__trigger:hover { color: var(--ry-color-text); }
973
+ ry-tabs [data-ry-target="trigger"][aria-selected="true"], .ry-tabs__trigger[aria-selected="true"] { color: var(--ry-color-primary); border-bottom-color: var(--ry-color-primary); }
974
+ ry-tabs [data-ry-target="trigger"]:focus-visible, .ry-tabs__trigger:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); border-radius: var(--ry-radius-sm); }
975
+
976
+ /* Modal */
977
+ ry-modal [data-ry-target="backdrop"], .ry-modal__backdrop { background-color: var(--ry-color-overlay); }
978
+ ry-modal [data-ry-target="dialog"], .ry-modal__dialog { background-color: var(--ry-color-bg); border-radius: var(--ry-radius-xl); box-shadow: var(--ry-shadow-xl); }
979
+ ry-modal [data-ry-target="header"], .ry-modal__header { border-bottom: var(--ry-border-width) solid var(--ry-color-border); }
980
+ ry-modal [data-ry-target="header"] h3, .ry-modal__title { font-size: var(--ry-text-lg); font-weight: var(--ry-font-semibold); }
981
+ ry-modal [data-ry-target="close"], .ry-modal__close {
982
+ font-size: var(--ry-text-xl);
983
+ background: transparent;
984
+ border-radius: var(--ry-radius-md);
985
+ color: var(--ry-color-text-muted);
986
+ transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease);
987
+ }
988
+ ry-modal [data-ry-target="close"]:hover, .ry-modal__close:hover { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); }
989
+ ry-modal [data-ry-target="footer"], .ry-modal__footer { border-top: var(--ry-border-width) solid var(--ry-color-border); background-color: var(--ry-color-bg-subtle); }
990
+
991
+ /* Dropdown */
992
+ ry-dropdown [data-ry-target="menu"], ry-dropdown ry-menu, .ry-dropdown__menu {
993
+ background-color: var(--ry-color-bg);
994
+ border: var(--ry-border-width) solid var(--ry-color-border);
995
+ border-radius: var(--ry-radius-lg);
996
+ box-shadow: var(--ry-shadow-lg);
997
+ }
998
+ ry-menu-item, .ry-dropdown__item {
999
+ font-family: var(--ry-font-sans);
1000
+ font-size: var(--ry-text-sm);
1001
+ color: var(--ry-color-text);
1002
+ background: transparent;
1003
+ border-radius: var(--ry-radius-md);
1004
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
1005
+ }
1006
+ ry-menu-item:hover, .ry-dropdown__item:hover { background-color: var(--ry-color-bg-muted); }
1007
+ ry-menu-item:focus-visible, .ry-dropdown__item:focus-visible { outline: none; box-shadow: inset var(--ry-focus-ring); }
1008
+
1009
+ /* Switch */
1010
+ ry-switch[disabled] { opacity: 0.5; }
1011
+ ry-switch [data-ry-target="track"], .ry-switch__track {
1012
+ background-color: var(--ry-color-bg-muted);
1013
+ border: var(--ry-border-width) solid var(--ry-color-border);
1014
+ border-radius: var(--ry-radius-full);
1015
+ transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease);
1016
+ }
1017
+ ry-switch[checked] [data-ry-target="track"], ry-switch[checked] .ry-switch__track { background-color: var(--ry-color-primary); border-color: var(--ry-color-primary); }
1018
+ ry-switch [data-ry-target="thumb"], .ry-switch__thumb { background-color: var(--ry-color-bg); border-radius: var(--ry-radius-full); box-shadow: var(--ry-shadow-sm); }
1019
+ ry-switch:focus-visible [data-ry-target="track"], ry-switch:focus-visible .ry-switch__track { box-shadow: var(--ry-focus-ring); }
1020
+
1021
+ /* Tooltip */
1022
+ ry-tooltip [data-ry-target="content"], .ry-tooltip__content {
1023
+ font-size: var(--ry-text-xs);
1024
+ font-weight: var(--ry-font-medium);
1025
+ line-height: var(--ry-leading-tight);
1026
+ background-color: var(--ry-color-text);
1027
+ color: var(--ry-color-text-inverse);
1028
+ border-radius: var(--ry-radius-md);
1029
+ }
1030
+
1031
+ /* Drawer */
1032
+ ry-drawer [data-ry-target="backdrop"], .ry-drawer__backdrop { background-color: var(--ry-color-overlay); }
1033
+ ry-drawer [data-ry-target="panel"], .ry-drawer__panel { background-color: var(--ry-color-bg); box-shadow: var(--ry-shadow-xl); }
1034
+ ry-drawer [data-ry-target="panel"][data-ry-side="bottom"], .ry-drawer__panel[data-ry-side="bottom"] { border-radius: var(--ry-radius-xl) var(--ry-radius-xl) 0 0; }
1035
+ ry-drawer [data-ry-target="close"], .ry-drawer__close {
1036
+ font-size: var(--ry-text-xl);
1037
+ background: transparent;
1038
+ border-radius: var(--ry-radius-md);
1039
+ color: var(--ry-color-text-muted);
1040
+ transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease);
1041
+ }
1042
+ ry-drawer [data-ry-target="close"]:hover, .ry-drawer__close:hover { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); }
1043
+
1044
+ /* Toast */
1045
+ ry-toast {
1046
+ font-family: var(--ry-font-sans);
1047
+ background-color: var(--ry-color-bg);
1048
+ border: var(--ry-border-width) solid var(--ry-color-border);
1049
+ border-radius: var(--ry-radius-lg);
1050
+ box-shadow: var(--ry-shadow-lg);
1051
+ }
1052
+ ry-toast [data-ry-target="icon"], .ry-toast__icon { font-size: var(--ry-text-sm); }
1053
+ ry-toast[variant="info"] [data-ry-target="icon"] { color: var(--ry-color-info); }
1054
+ ry-toast[variant="success"] [data-ry-target="icon"] { color: var(--ry-color-success); }
1055
+ ry-toast[variant="warning"] [data-ry-target="icon"] { color: var(--ry-color-warning); }
1056
+ ry-toast[variant="error"] [data-ry-target="icon"] { color: var(--ry-color-danger); }
1057
+ ry-toast [data-ry-target="content"], .ry-toast__content { font-size: var(--ry-text-sm); color: var(--ry-color-text); line-height: var(--ry-leading-normal); }
1058
+ ry-toast [data-ry-target="close"], .ry-toast__close {
1059
+ font-size: var(--ry-text-lg);
1060
+ background: transparent;
1061
+ border-radius: var(--ry-radius-sm);
1062
+ color: var(--ry-color-text-muted);
1063
+ transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease);
1064
+ }
1065
+ ry-toast [data-ry-target="close"]:hover, .ry-toast__close:hover { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); }
1066
+
1067
+ /* Select */
1068
+ ry-select[disabled] { opacity: 0.5; }
1069
+ ry-select [data-ry-target="trigger"], .ry-select__trigger {
1070
+ font-family: var(--ry-font-sans);
1071
+ font-size: var(--ry-text-base);
1072
+ line-height: var(--ry-leading-normal);
1073
+ background-color: var(--ry-color-bg);
1074
+ border: var(--ry-border-width) solid var(--ry-color-border);
1075
+ border-radius: var(--ry-radius-md);
1076
+ transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease);
1077
+ }
1078
+ ry-select:hover [data-ry-target="trigger"], ry-select:hover .ry-select__trigger { border-color: var(--ry-color-border-strong); }
1079
+ ry-select:focus-visible [data-ry-target="trigger"], ry-select:focus-visible .ry-select__trigger { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
1080
+ ry-select[data-ry-state="open"] [data-ry-target="trigger"], ry-select[data-ry-state="open"] .ry-select__trigger { border-color: var(--ry-color-primary); }
1081
+ ry-select [data-ry-target="value"], .ry-select__value { color: var(--ry-color-text-muted); }
1082
+ ry-select [data-ry-target="value"][data-selected], .ry-select__value--selected { color: var(--ry-color-text); }
1083
+ ry-select [data-ry-target="arrow"], .ry-select__arrow { font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); }
1084
+ ry-select [data-ry-target="dropdown"], .ry-select__dropdown {
1085
+ background-color: var(--ry-color-bg);
1086
+ border: var(--ry-border-width) solid var(--ry-color-border);
1087
+ border-radius: var(--ry-radius-lg);
1088
+ box-shadow: var(--ry-shadow-lg);
1089
+ }
1090
+ ry-select [data-ry-target="option"], .ry-select__option {
1091
+ font-size: var(--ry-text-sm);
1092
+ color: var(--ry-color-text);
1093
+ border-radius: var(--ry-radius-md);
1094
+ transition: background-color var(--ry-duration-fast) var(--ry-ease);
1095
+ }
1096
+ ry-select [data-ry-target="option"]:hover, ry-select [data-ry-target="option"][data-highlighted],
1097
+ .ry-select__option:hover, .ry-select__option[data-highlighted] { background-color: var(--ry-color-bg-muted); }
1098
+ ry-select [data-ry-target="option"][aria-selected="true"], .ry-select__option[aria-selected="true"] { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); }
1099
+ ry-select [data-ry-target="option"][data-disabled], .ry-select__option[data-disabled] { opacity: 0.5; }
1100
+ ry-select [data-ry-target="option"][data-disabled]:hover, .ry-select__option[data-disabled]:hover { background-color: transparent; }
1101
+
1102
+ /* Code (Cool/GitHub light as default) */
1103
+ ry-code { background-color: var(--ry-code-bg, #f6f8fa); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); }
1104
+ .ry-code__header { background-color: var(--ry-code-header-bg, #eaeef2); }
1105
+ .ry-code__title { font-family: var(--ry-font-sans); font-size: var(--ry-text-xs); font-weight: var(--ry-font-bold); color: var(--ry-code-title-color, #57606a); }
1106
+ .ry-code__copy { background: transparent; border-radius: var(--ry-radius-full); color: var(--ry-code-icon-color, #8c959f); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); }
1107
+ .ry-code__copy:hover { background-color: var(--ry-code-icon-hover-bg, #d0d7de); color: var(--ry-code-icon-hover-color, #24292f); }
1108
+ .ry-code__copy--success { color: var(--ry-color-success); }
1109
+ .ry-code__pre, .ry-code__code { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); line-height: var(--ry-leading-relaxed); color: var(--ry-code-text-color, #24292f); }
1110
+ .ry-code__line-number { color: var(--ry-code-line-number-color, rgba(140, 149, 159, 0.6)); border-right: 1px solid var(--ry-code-line-border-color, #d0d7de); }
1111
+ .ry-code__color-preview { border: 1px solid var(--ry-code-color-preview-border, rgba(36, 41, 47, 0.3)); border-radius: var(--ry-radius-sm); }
1112
+ /* Syntax highlighting */
1113
+ .ry-code__keyword { color: var(--ry-code-keyword, #cf222e); }
1114
+ .ry-code__property { color: var(--ry-code-property, #0550ae); }
1115
+ .ry-code__value { color: var(--ry-code-value, #0a3069); }
1116
+ .ry-code__string { color: var(--ry-code-string, #0a3069); }
1117
+ .ry-code__number { color: var(--ry-code-number, #0550ae); }
1118
+ .ry-code__comment { color: var(--ry-code-comment, #6e7781); font-style: italic; }
1119
+ .ry-code__selector { color: var(--ry-code-selector, #116329); }
1120
+ .ry-code__punctuation { color: var(--ry-code-punctuation, #24292f); }
1121
+ .ry-code__tag { color: var(--ry-code-tag, #116329); }
1122
+ .ry-code__attribute { color: var(--ry-code-attribute, #0550ae); }
1123
+ .ry-code__color { color: var(--ry-code-value, #0a3069); }
1124
+
1125
+ /* Example */
1126
+ .ry-example__preview { background-color: var(--ry-color-bg-subtle); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); }
1127
+
1128
+ /* Icon */
1129
+ ry-icon { color: currentColor; }
1130
+
1131
+ /* Checkbox */
1132
+ input[type="checkbox"] {
1133
+ background-color: var(--ry-color-bg);
1134
+ border: var(--ry-border-width) solid var(--ry-color-border);
1135
+ border-radius: var(--ry-radius-sm);
1136
+ transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease);
1137
+ }
1138
+ input[type="checkbox"]:hover { border-color: var(--ry-color-border-strong); }
1139
+ input[type="checkbox"]:focus-visible { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
1140
+ input[type="checkbox"]:checked { background-color: var(--ry-color-primary); border-color: var(--ry-color-primary); }
1141
+ input[type="checkbox"]:checked:hover { background-color: var(--ry-color-primary-hover); border-color: var(--ry-color-primary-hover); }
1142
+ input[type="checkbox"]::after { border-right: 2px solid var(--ry-color-text-inverse); border-bottom: 2px solid var(--ry-color-text-inverse); margin-bottom: 2px; }
1143
+ input[type="checkbox"]:disabled { opacity: 0.5; background-color: var(--ry-color-bg-muted); }
1144
+
1145
+ /* Radio */
1146
+ input[type="radio"] {
1147
+ background-color: var(--ry-color-bg);
1148
+ border: var(--ry-border-width) solid var(--ry-color-border);
1149
+ border-radius: var(--ry-radius-full);
1150
+ transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease);
1151
+ }
1152
+ input[type="radio"]:hover { border-color: var(--ry-color-border-strong); }
1153
+ input[type="radio"]:focus-visible { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
1154
+ input[type="radio"]:checked { border-color: var(--ry-color-primary); }
1155
+ input[type="radio"]:checked:hover { border-color: var(--ry-color-primary-hover); }
1156
+ input[type="radio"]::after { background-color: var(--ry-color-primary); border-radius: var(--ry-radius-full); }
1157
+ input[type="radio"]:disabled { opacity: 0.5; background-color: var(--ry-color-bg-muted); }
1158
+
1159
+ /* Table */
1160
+ table { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); color: var(--ry-color-text); }
1161
+ th { font-weight: var(--ry-font-semibold); color: var(--ry-color-text); background-color: var(--ry-color-bg-subtle); border-bottom: var(--ry-border-width) solid var(--ry-color-border); }
1162
+ td { border-bottom: var(--ry-border-width) solid var(--ry-color-border); }
1163
+ tbody tr:last-child td { border-bottom: none; }
1164
+ tbody tr:hover { background-color: var(--ry-color-bg-subtle); }
1165
+ table[data-bordered] { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); }
1166
+ table[data-bordered] th, table[data-bordered] td { border: var(--ry-border-width) solid var(--ry-color-border); }
1167
+ table[data-striped] tbody tr:nth-child(even) { background-color: var(--ry-color-bg-subtle); }
1168
+ table[data-striped] tbody tr:hover { background-color: var(--ry-color-bg-muted); }
1169
+
1170
+ /* Color Picker */
1171
+ ry-color-picker[disabled] { opacity: 0.5; }
1172
+ ry-color-picker [data-ry-target="trigger"] { background-color: var(--ry-color-bg); background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 8px 8px; border-radius: var(--ry-radius-md); overflow: hidden; }
1173
+ ry-color-picker [data-ry-target="trigger"]:focus-visible { box-shadow: var(--ry-focus-ring); }
1174
+ ry-color-picker [data-ry-target="trigger-color"] { border-radius: calc(var(--ry-radius-md) - 1px); outline: 3px solid rgba(0, 0, 0, 0.2); outline-offset: -3px; }
1175
+ ry-color-picker [data-ry-target="panel"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); }
1176
+ ry-color-picker [data-ry-target="grid"] { background-color: var(--grid-hue-color, #ff0000); background-image: linear-gradient(to top, #000 0%, transparent 100%), linear-gradient(to right, #fff 0%, transparent 100%); border-radius: var(--ry-radius-lg) var(--ry-radius-lg) 0 0; }
1177
+ ry-color-picker [data-ry-target="grid-handle"] { background-color: transparent; border: 2px solid #fff; border-radius: var(--ry-radius-full); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3); }
1178
+ ry-color-picker [data-ry-target="grid-handle"]:focus-visible { outline: none; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3), var(--ry-focus-ring); }
1179
+ ry-color-picker .ry-color-picker__hue { background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(360, 100%, 50%) 100%); border-radius: var(--ry-radius-full); }
1180
+ ry-color-picker .ry-color-picker__alpha { background-image: linear-gradient(to right, transparent 0%, var(--alpha-color, #ff0000) 100%), repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 100% 100%, 8px 8px; border-radius: var(--ry-radius-full); }
1181
+ ry-color-picker .ry-color-picker__slider-handle { background-color: #fff; border-radius: var(--ry-radius-full); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2), var(--ry-shadow-sm); }
1182
+ ry-color-picker .ry-color-picker__slider-handle:focus-visible { outline: none; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2), var(--ry-focus-ring); }
1183
+ ry-color-picker [data-ry-target="preview"] { background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 8px 8px; border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); overflow: hidden; }
1184
+ ry-color-picker [data-ry-target="preview-color"] { border-radius: inherit; outline: 3px solid rgba(0, 0, 0, 0.2); outline-offset: -3px; }
1185
+ ry-color-picker [data-ry-target="input"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); color: var(--ry-color-text); background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); }
1186
+ ry-color-picker [data-ry-target="input"]:hover { border-color: var(--ry-color-border-strong); }
1187
+ ry-color-picker [data-ry-target="input"]:focus { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
1188
+ ry-color-picker [data-ry-target="format-toggle"] { font-family: var(--ry-font-sans); font-size: var(--ry-text-xs); font-weight: var(--ry-font-semibold); color: var(--ry-color-text-muted); background-color: var(--ry-color-bg-muted); border-radius: var(--ry-radius-md); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); }
1189
+ ry-color-picker [data-ry-target="format-toggle"]:hover { background-color: var(--ry-color-bg-subtle); color: var(--ry-color-text); }
1190
+ ry-color-picker [data-ry-target="format-toggle"]:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); }
1191
+ ry-color-picker .ry-color-picker__swatch { border-radius: var(--ry-radius-sm); transition: transform var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); }
1192
+ ry-color-picker .ry-color-picker__swatch:hover { transform: scale(1.1); box-shadow: var(--ry-shadow-md); }
1193
+ ry-color-picker .ry-color-picker__swatch:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); }
1194
+
1195
+ /* Color Input */
1196
+ ry-color-input[disabled] { opacity: 0.5; }
1197
+ ry-color-input [data-ry-target="trigger"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); overflow: hidden; transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); }
1198
+ ry-color-input:hover [data-ry-target="trigger"] { border-color: var(--ry-color-border-strong); }
1199
+ ry-color-input:focus-within [data-ry-target="trigger"] { border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); }
1200
+ ry-color-input [data-ry-target="swatch"] { background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 8px 8px; border-right: var(--ry-border-width) solid var(--ry-color-border); transition: background-color var(--ry-duration-fast) var(--ry-ease); }
1201
+ ry-color-input [data-ry-target="swatch"]:hover { background-color: var(--ry-color-bg-muted); }
1202
+ ry-color-input [data-ry-target="swatch"]:focus-visible { outline: none; }
1203
+ ry-color-input [data-ry-target="swatch-color"] { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); }
1204
+ ry-color-input [data-ry-target="input"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); color: var(--ry-color-text); background-color: transparent; border: none; }
1205
+ ry-color-input [data-ry-target="input"]:focus { outline: none; }
1206
+ ry-color-input [data-ry-target="input"]::placeholder { color: var(--ry-color-text-muted); }
1207
+ ry-color-input [data-ry-target="panel"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); }