orynn 0.2.0 → 0.6.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.
package/dist/styles.css CHANGED
@@ -2,145 +2,378 @@
2
2
  * orynn — default stylesheet
3
3
  * Import once: import "orynn/styles.css";
4
4
  *
5
- * Every value is a CSS custom property. Override globally on :root, per-subtree
6
- * with `[data-orynn-theme]` / inline vars, or via <OrynnProvider>.
5
+ * The default look tracks shadcn/ui. Every value is a CSS custom property with
6
+ * semantic names (background / foreground / card / primary / muted / accent /
7
+ * destructive / border / input / ring) carrying OKLCH values. Override globally
8
+ * on :root, per-subtree with `[data-orynn-theme]` / inline vars / a `.dark`
9
+ * class, or via <OrynnProvider>.
10
+ *
11
+ * All rules are unlayered: the `.orynn-*` class selectors beat element resets
12
+ * (Tailwind Preflight etc.) regardless of `@layer` order, and a consumer's own
13
+ * `className` (loaded after this file) still wins by source order.
7
14
  */
8
15
 
9
16
  :root {
10
- /* ---- palette --------------------------------------------------------- */
11
- --orynn-color-text: #16181d;
12
- --orynn-color-text-muted: #5b6472;
13
- --orynn-color-text-subtle: #858e9c;
14
- --orynn-color-bg: #ffffff;
15
- --orynn-color-bg-subtle: #f7f8fa;
16
- --orynn-color-bg-disabled: #f1f3f5;
17
- --orynn-color-border: #d6dae0;
18
- --orynn-color-border-hover: #b3b9c2;
19
-
20
- /* accent / highlight — the one colour a theme changes most */
21
- --orynn-color-accent: #6366f1;
22
- --orynn-color-accent-hover: #5457e5;
23
- --orynn-color-accent-contrast: #ffffff;
24
- --orynn-color-accent-subtle: color-mix(in srgb, var(--orynn-color-accent) 12%, transparent);
25
- --orynn-color-accent-muted: color-mix(in srgb, var(--orynn-color-accent) 26%, transparent);
26
-
27
- --orynn-color-focus: var(--orynn-color-accent);
28
- --orynn-color-focus-ring: color-mix(in srgb, var(--orynn-color-accent) 25%, transparent);
29
-
30
- --orynn-color-error: #d1242f;
31
- --orynn-color-error-border: #e5484d;
32
- --orynn-color-error-ring: color-mix(in srgb, #e5484d 25%, transparent);
33
- --orynn-color-success: #12805c;
34
- --orynn-color-success-border: #30a46c;
35
- --orynn-color-success-ring: color-mix(in srgb, #30a46c 22%, transparent);
36
-
37
- --orynn-color-option-hover: var(--orynn-color-accent-subtle);
38
- --orynn-color-option-selected-text: var(--orynn-color-accent);
39
- --orynn-color-panel-bg: #ffffff;
40
- --orynn-color-panel-shadow: 0 12px 32px -8px rgba(20, 24, 34, 0.18), 0 2px 8px -2px
41
- rgba(20, 24, 34, 0.1);
42
- --orynn-color-overlay: rgba(15, 18, 26, 0.06);
43
-
44
- /* ---- typography --------------------------------------------------------- */
17
+ /* ---- semantic palette light (shadcn "neutral", OKLCH) ---------- */
18
+ --orynn-color-background: oklch(1 0 0);
19
+ --orynn-color-foreground: oklch(0.145 0 0);
20
+ --orynn-color-card: oklch(1 0 0);
21
+ --orynn-color-card-foreground: oklch(0.145 0 0);
22
+ --orynn-color-popover: oklch(1 0 0);
23
+ --orynn-color-popover-foreground: oklch(0.145 0 0);
24
+ --orynn-color-primary: oklch(0.205 0 0);
25
+ --orynn-color-primary-foreground: oklch(0.985 0 0);
26
+ --orynn-color-secondary: oklch(0.97 0 0);
27
+ --orynn-color-secondary-foreground: oklch(0.205 0 0);
28
+ --orynn-color-muted: oklch(0.97 0 0);
29
+ --orynn-color-muted-foreground: oklch(0.556 0 0);
30
+ --orynn-color-accent: oklch(0.97 0 0);
31
+ --orynn-color-accent-foreground: oklch(0.205 0 0);
32
+ --orynn-color-destructive: oklch(0.577 0.245 27.325);
33
+ --orynn-color-destructive-foreground: oklch(0.985 0 0);
34
+ --orynn-color-border: oklch(0.922 0 0);
35
+ --orynn-color-input: oklch(0.922 0 0);
36
+ --orynn-color-ring: oklch(0.708 0 0);
37
+
38
+ /* orynn extension — shadcn has no success token. Fixed OKLCH greens. */
39
+ --orynn-color-success: oklch(0.62 0.14 155);
40
+ --orynn-color-success-foreground: oklch(0.985 0 0);
41
+
42
+ /* modal scrim (Dialog overlay) distinct from the faint hover tint */
43
+ --orynn-color-scrim: oklch(0 0 0 / 0.5);
44
+ --orynn-color-overlay: color-mix(in oklch, var(--orynn-color-foreground) 8%, transparent);
45
+
46
+ /* ---- radius: one knob, calc-derived scale ----------------------- */
47
+ --orynn-radius: 0.625rem; /* 10px */
48
+ --orynn-radius-sm: calc(var(--orynn-radius) - 4px); /* 6px */
49
+ --orynn-radius-md: calc(var(--orynn-radius) - 2px); /* 8px */
50
+ --orynn-radius-lg: var(--orynn-radius); /* 10px */
51
+ --orynn-radius-xl: calc(var(--orynn-radius) + 4px); /* 14px */
52
+ --orynn-radius-pill: 9999px;
53
+
54
+ /* ---- elevation ------------------------------------------------- */
55
+ --orynn-shadow-xs: 0 1px 2px 0 oklch(0 0 0 / 0.05);
56
+ --orynn-shadow-sm: 0 1px 3px 0 oklch(0 0 0 / 0.1), 0 1px 2px -1px oklch(0 0 0 / 0.1);
57
+ --orynn-shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.1), 0 2px 4px -2px oklch(0 0 0 / 0.1);
58
+ --orynn-shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.1), 0 4px 6px -4px oklch(0 0 0 / 0.1);
59
+
60
+ /* ---- motion ------------------------------------------------- */
61
+ --orynn-duration: 150ms;
62
+ --orynn-duration-modal: 200ms;
63
+ --orynn-ease: cubic-bezier(0.16, 1, 0.3, 1);
64
+ /* <duration> <timing-function> — consumed as `transition: <prop> var(--orynn-transition)` */
65
+ --orynn-transition: var(--orynn-duration) var(--orynn-ease);
66
+
67
+ /* ---- focus / invalid ring ---------------------------------- */
68
+ --orynn-border-width: 1px;
69
+ --orynn-ring-width: 3px;
70
+ --orynn-ring-alpha: 0.5;
71
+ --orynn-invalid-alpha: 0.2;
72
+
73
+ /* ---- z-index --------------------------------------------- */
74
+ --orynn-z-overlay: 50;
75
+ --orynn-z-popover: 50;
76
+ --orynn-z-modal: 50;
77
+
78
+ /* ---- typography ---------------------------------------------- */
45
79
  --orynn-font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
46
- --orynn-font-size: 0.9375rem;
47
- --orynn-font-size-sm: 0.875rem;
80
+ --orynn-font-size: 0.875rem; /* text-sm */
81
+ --orynn-font-size-sm: 0.8125rem;
48
82
  --orynn-font-size-lg: 1rem;
49
83
  --orynn-label-font-size: 0.875rem;
50
- --orynn-label-weight: 600;
51
- --orynn-help-font-size: 0.8125rem;
84
+ --orynn-label-weight: 500; /* font-medium */
85
+ --orynn-help-font-size: 0.875rem; /* shadcn description / message = text-sm */
52
86
  --orynn-line-height: 1.5;
53
87
 
54
- /* ---- shape & density ------------------------------------------------- */
55
- --orynn-radius: 10px;
56
- --orynn-radius-sm: 7px;
57
- --orynn-radius-lg: 14px;
58
- --orynn-radius-pill: 999px;
59
- --orynn-border-width: 1px;
60
- --orynn-ring-width: 3px;
61
- --orynn-transition: 130ms cubic-bezier(0.4, 0, 0.2, 1);
62
-
88
+ /* ---- control sizing & density ------------------------------- */
63
89
  --orynn-control-width: 100%;
64
- --orynn-control-h: 2.625rem;
65
- --orynn-control-h-sm: 2.125rem;
66
- --orynn-control-h-lg: 3rem;
67
- --orynn-control-px: 0.8125rem;
68
- --orynn-gap: 0.375rem;
90
+ --orynn-control-max-width: 450px; /* orynn extension: controls never exceed this */
91
+ --orynn-control-h: 2.25rem; /* h-9 */
92
+ --orynn-control-h-sm: 2rem; /* h-8 */
93
+ --orynn-control-h-lg: 2.5rem; /* h-10 */
94
+ --orynn-control-px: 0.75rem; /* px-3 */
95
+ --orynn-gap: 0.5rem; /* field label/control/help gap — grid gap-2 */
96
+ --orynn-field-gap: 0.5rem;
69
97
 
70
- --orynn-check-size: 1.125rem;
71
- --orynn-check-radius: 5px;
98
+ --orynn-check-size: 1rem; /* size-4 */
99
+ --orynn-check-radius: 4px;
72
100
 
73
- /* ---- layout (Fieldset grid) --------------------------------------- */
101
+ /* ---- Fieldset grid ------------------------------------------ */
74
102
  --orynn-grid-gap: 1rem;
103
+ --orynn-space-md: 0.75rem;
75
104
  --orynn-cols-desktop: 3;
76
105
  --orynn-cols-tablet: 2;
77
106
  --orynn-cols-mobile: 1;
78
107
  }
79
108
 
80
- /* ------------------------------------------------------------- presets ---- */
81
-
109
+ /* ---------------------------------------------------- primary-colour presets --
110
+ Each preset recolours only the primary trio + ring; backgrounds, borders
111
+ and muted surfaces stay neutral — the way a shadcn theme is applied.
112
+ `default` (no attribute) is pure neutral. */
82
113
  [data-orynn-theme="slate"] {
83
- --orynn-color-accent: #475569;
84
- --orynn-color-accent-hover: #3b475a;
114
+ --orynn-color-primary: oklch(0.44 0.03 257);
115
+ --orynn-color-primary-foreground: oklch(0.985 0 0);
116
+ --orynn-color-ring: oklch(0.44 0.03 257);
85
117
  }
86
118
  [data-orynn-theme="teal"] {
87
- --orynn-color-accent: #0d9488;
88
- --orynn-color-accent-hover: #0b8177;
119
+ --orynn-color-primary: oklch(0.58 0.1 185);
120
+ --orynn-color-primary-foreground: oklch(0.985 0 0);
121
+ --orynn-color-ring: oklch(0.58 0.1 185);
89
122
  }
90
123
  [data-orynn-theme="violet"] {
91
- --orynn-color-accent: #7c3aed;
92
- --orynn-color-accent-hover: #6d28d9;
124
+ --orynn-color-primary: oklch(0.53 0.24 293);
125
+ --orynn-color-primary-foreground: oklch(0.985 0 0);
126
+ --orynn-color-ring: oklch(0.53 0.24 293);
93
127
  }
94
128
  [data-orynn-theme="rose"] {
95
- --orynn-color-accent: #e11d48;
96
- --orynn-color-accent-hover: #c81a41;
129
+ --orynn-color-primary: oklch(0.59 0.22 12);
130
+ --orynn-color-primary-foreground: oklch(0.985 0 0);
131
+ --orynn-color-ring: oklch(0.59 0.22 12);
97
132
  }
98
133
  [data-orynn-theme="emerald"] {
99
- --orynn-color-accent: #059669;
100
- --orynn-color-accent-hover: #047857;
134
+ --orynn-color-primary: oklch(0.6 0.13 163);
135
+ --orynn-color-primary-foreground: oklch(0.985 0 0);
136
+ --orynn-color-ring: oklch(0.6 0.13 163);
101
137
  }
102
138
 
139
+ /* ---------------------------------------------------------------- density --
140
+ orynn extension. Touches only control height, inline padding and gaps;
141
+ radius no longer changes with density. `comfortable` == default. */
103
142
  [data-orynn-density="compact"] {
104
- --orynn-control-h: 2.25rem;
105
- --orynn-control-h-sm: 1.875rem;
106
- --orynn-control-h-lg: 2.625rem;
143
+ --orynn-control-h: 2rem;
144
+ --orynn-control-h-sm: 1.75rem;
145
+ --orynn-control-h-lg: 2.25rem;
107
146
  --orynn-control-px: 0.625rem;
108
- --orynn-font-size: 0.875rem;
109
- --orynn-radius: 8px;
110
- --orynn-gap: 0.25rem;
147
+ --orynn-gap: 0.375rem;
148
+ --orynn-field-gap: 0.375rem;
111
149
  }
112
150
  [data-orynn-density="spacious"] {
113
- --orynn-control-h: 3rem;
151
+ --orynn-control-h: 2.75rem;
114
152
  --orynn-control-h-sm: 2.5rem;
115
- --orynn-control-h-lg: 3.5rem;
153
+ --orynn-control-h-lg: 3.25rem;
116
154
  --orynn-control-px: 1rem;
117
- --orynn-gap: 0.5rem;
155
+ --orynn-gap: 0.625rem;
156
+ --orynn-field-gap: 0.625rem;
157
+ }
158
+
159
+ /* ------------------------------------------------------------ dark scheme --
160
+ Opt in with data-orynn-color-scheme="dark", a `.dark` class on any
161
+ ancestor, or <OrynnProvider theme={{ colorScheme: "dark" }}>. */
162
+ [data-orynn-color-scheme="dark"],
163
+ .dark {
164
+ --orynn-color-background: oklch(0.145 0 0);
165
+ --orynn-color-foreground: oklch(0.985 0 0);
166
+ --orynn-color-card: oklch(0.205 0 0);
167
+ --orynn-color-card-foreground: oklch(0.985 0 0);
168
+ --orynn-color-popover: oklch(0.269 0 0);
169
+ --orynn-color-popover-foreground: oklch(0.985 0 0);
170
+ --orynn-color-primary: oklch(0.922 0 0);
171
+ --orynn-color-primary-foreground: oklch(0.205 0 0);
172
+ --orynn-color-secondary: oklch(0.269 0 0);
173
+ --orynn-color-secondary-foreground: oklch(0.985 0 0);
174
+ --orynn-color-muted: oklch(0.269 0 0);
175
+ --orynn-color-muted-foreground: oklch(0.708 0 0);
176
+ --orynn-color-accent: oklch(0.269 0 0);
177
+ --orynn-color-accent-foreground: oklch(0.985 0 0);
178
+ --orynn-color-destructive: oklch(0.704 0.191 22.216);
179
+ --orynn-color-destructive-foreground: oklch(0.985 0 0);
180
+ --orynn-color-border: oklch(1 0 0 / 10%);
181
+ --orynn-color-input: oklch(1 0 0 / 15%);
182
+ --orynn-color-ring: oklch(0.556 0 0);
183
+ --orynn-color-success: oklch(0.7 0.15 160);
184
+ --orynn-color-scrim: oklch(0 0 0 / 0.5);
185
+ --orynn-invalid-alpha: 0.4;
186
+ color-scheme: dark;
187
+ }
188
+
189
+ /* Preset primaries in dark — lift lightness, flip the foreground. */
190
+ [data-orynn-color-scheme="dark"] [data-orynn-theme="slate"],
191
+ [data-orynn-color-scheme="dark"][data-orynn-theme="slate"],
192
+ .dark [data-orynn-theme="slate"],
193
+ .dark[data-orynn-theme="slate"] {
194
+ --orynn-color-primary: oklch(0.7 0.04 257);
195
+ --orynn-color-primary-foreground: oklch(0.2 0.02 257);
196
+ --orynn-color-ring: oklch(0.7 0.04 257);
197
+ }
198
+ [data-orynn-color-scheme="dark"] [data-orynn-theme="teal"],
199
+ [data-orynn-color-scheme="dark"][data-orynn-theme="teal"],
200
+ .dark [data-orynn-theme="teal"],
201
+ .dark[data-orynn-theme="teal"] {
202
+ --orynn-color-primary: oklch(0.7 0.1 185);
203
+ --orynn-color-primary-foreground: oklch(0.2 0.03 185);
204
+ --orynn-color-ring: oklch(0.7 0.1 185);
205
+ }
206
+ [data-orynn-color-scheme="dark"] [data-orynn-theme="violet"],
207
+ [data-orynn-color-scheme="dark"][data-orynn-theme="violet"],
208
+ .dark [data-orynn-theme="violet"],
209
+ .dark[data-orynn-theme="violet"] {
210
+ --orynn-color-primary: oklch(0.62 0.22 293);
211
+ --orynn-color-primary-foreground: oklch(0.98 0.01 293);
212
+ --orynn-color-ring: oklch(0.62 0.22 293);
213
+ }
214
+ [data-orynn-color-scheme="dark"] [data-orynn-theme="rose"],
215
+ [data-orynn-color-scheme="dark"][data-orynn-theme="rose"],
216
+ .dark [data-orynn-theme="rose"],
217
+ .dark[data-orynn-theme="rose"] {
218
+ --orynn-color-primary: oklch(0.65 0.21 12);
219
+ --orynn-color-primary-foreground: oklch(0.98 0.01 12);
220
+ --orynn-color-ring: oklch(0.65 0.21 12);
221
+ }
222
+ [data-orynn-color-scheme="dark"] [data-orynn-theme="emerald"],
223
+ [data-orynn-color-scheme="dark"][data-orynn-theme="emerald"],
224
+ .dark [data-orynn-theme="emerald"],
225
+ .dark[data-orynn-theme="emerald"] {
226
+ --orynn-color-primary: oklch(0.7 0.13 163);
227
+ --orynn-color-primary-foreground: oklch(0.2 0.04 163);
228
+ --orynn-color-ring: oklch(0.7 0.13 163);
229
+ }
230
+
231
+ /* ===================================================================== *
232
+ * keyframes (top level — layer order does not apply to @keyframes)
233
+ * ===================================================================== */
234
+
235
+ /* Enter / exit are single keyframes driven by custom properties so several
236
+ effects (fade + zoom + directional slide) compose instead of the last
237
+ `transform` winning. Radix sets data-state / data-side on the element. */
238
+ @keyframes orynn-enter {
239
+ from {
240
+ opacity: var(--orynn-enter-opacity, 1);
241
+ transform: translate3d(var(--orynn-enter-x, 0), var(--orynn-enter-y, 0), 0)
242
+ scale(var(--orynn-enter-scale, 1));
243
+ }
244
+ }
245
+ @keyframes orynn-exit {
246
+ to {
247
+ opacity: var(--orynn-exit-opacity, 1);
248
+ transform: translate3d(var(--orynn-exit-x, 0), var(--orynn-exit-y, 0), 0)
249
+ scale(var(--orynn-exit-scale, 1));
250
+ }
251
+ }
252
+ @keyframes orynn-overlay-in {
253
+ from {
254
+ opacity: 0;
255
+ }
256
+ }
257
+ @keyframes orynn-overlay-out {
258
+ to {
259
+ opacity: 0;
260
+ }
261
+ }
262
+ @keyframes orynn-spin {
263
+ to {
264
+ transform: rotate(360deg);
265
+ }
266
+ }
267
+ /* legacy anchored popover (Dropdown / DatePicker) entrance */
268
+ @keyframes orynn-pop {
269
+ from {
270
+ opacity: 0;
271
+ transform: translateY(-6px) scale(0.97);
272
+ }
273
+ to {
274
+ opacity: 1;
275
+ transform: translateY(0) scale(1);
276
+ }
277
+ }
278
+ /* reserved for a future <Accordion> / <Collapsible> */
279
+ @keyframes orynn-accordion-down {
280
+ from {
281
+ block-size: 0;
282
+ }
283
+ to {
284
+ block-size: var(--radix-accordion-content-height);
285
+ }
286
+ }
287
+ @keyframes orynn-accordion-up {
288
+ from {
289
+ block-size: var(--radix-accordion-content-height);
290
+ }
291
+ to {
292
+ block-size: 0;
293
+ }
294
+ }
295
+
296
+ /* The <OrynnProvider> wrapper. Kept deliberately light — Orynn does not own
297
+ <body>, so it only carries the colour scheme + type family down. */
298
+ .orynn-root {
299
+ font-family: var(--orynn-font-family);
300
+ color: var(--orynn-color-foreground);
301
+ }
302
+
303
+ /* Themed portal host appended to <body> by <OrynnProvider>. `display: contents`
304
+ so it never affects layout; it exists only to carry the theme data-attrs +
305
+ `--orynn-*` vars + `.dark` class down to portalled overlays. */
306
+ .orynn-portal {
307
+ display: contents;
308
+ }
309
+
310
+ /* ---- shared overlay / popper animation hooks -----------------------
311
+ Applied by every Radix content surface as `class="orynn-content …"` and
312
+ every Dialog backdrop as `class="orynn-overlay …"`. Per-component classes
313
+ add the visual box (bg / border / radius / shadow / padding). */
314
+ .orynn-content {
315
+ transform-origin: var(--radix-popper-transform-origin, center);
316
+ }
317
+ .orynn-content[data-state="open"] {
318
+ animation: orynn-enter var(--orynn-duration) var(--orynn-ease);
319
+ --orynn-enter-opacity: 0;
320
+ --orynn-enter-scale: 0.95;
321
+ }
322
+ .orynn-content[data-state="closed"] {
323
+ animation: orynn-exit var(--orynn-duration) var(--orynn-ease);
324
+ --orynn-exit-opacity: 0;
325
+ --orynn-exit-scale: 0.95;
326
+ }
327
+ .orynn-content[data-side="top"] {
328
+ --orynn-enter-y: 0.5rem;
329
+ }
330
+ .orynn-content[data-side="bottom"] {
331
+ --orynn-enter-y: -0.5rem;
332
+ }
333
+ .orynn-content[data-side="left"] {
334
+ --orynn-enter-x: 0.5rem;
335
+ }
336
+ .orynn-content[data-side="right"] {
337
+ --orynn-enter-x: -0.5rem;
338
+ }
339
+
340
+ .orynn-overlay[data-state="open"] {
341
+ animation: orynn-overlay-in var(--orynn-duration) var(--orynn-ease);
342
+ }
343
+ .orynn-overlay[data-state="closed"] {
344
+ animation: orynn-overlay-out var(--orynn-duration) var(--orynn-ease);
118
345
  }
119
346
 
120
- /* -------------------------------------------------------------- field ---- */
347
+ /* ===================================================================== *
348
+ * components
349
+ * ===================================================================== */
350
+
351
+ /* ------------------------------------------------------------ field ---- */
121
352
 
122
353
  .orynn-field {
123
354
  display: flex;
124
355
  flex-direction: column;
125
- gap: var(--orynn-gap);
356
+ gap: var(--orynn-field-gap);
126
357
  inline-size: var(--orynn-control-width);
358
+ max-inline-size: var(--orynn-control-max-width, 450px);
127
359
  font-family: var(--orynn-font-family);
128
360
  font-size: var(--orynn-font-size);
129
361
  line-height: var(--orynn-line-height);
130
- color: var(--orynn-color-text);
362
+ color: var(--orynn-color-foreground);
131
363
  }
132
364
  .orynn-field__label {
133
365
  font-size: var(--orynn-label-font-size);
134
366
  font-weight: var(--orynn-label-weight);
367
+ line-height: 1;
135
368
  }
136
369
  .orynn-field[data-required] .orynn-field__label::after {
137
370
  content: " *";
138
- color: var(--orynn-color-error);
371
+ color: var(--orynn-color-destructive);
139
372
  }
140
373
  .orynn-field__description {
141
374
  margin: 0;
142
375
  font-size: var(--orynn-help-font-size);
143
- color: var(--orynn-color-text-muted);
376
+ color: var(--orynn-color-muted-foreground);
144
377
  }
145
378
  .orynn-field__control {
146
379
  display: block;
@@ -148,32 +381,46 @@
148
381
  .orynn-field__error {
149
382
  margin: 0;
150
383
  display: flex;
151
- gap: 0.35rem;
384
+ flex-direction: column;
385
+ gap: 0.15rem;
152
386
  font-size: var(--orynn-help-font-size);
153
- color: var(--orynn-color-error);
387
+ color: var(--orynn-color-destructive);
154
388
  }
155
389
  .orynn-field__error span {
156
390
  display: block;
157
391
  }
392
+ .orynn-field__success {
393
+ margin: 0;
394
+ font-size: var(--orynn-help-font-size);
395
+ color: var(--orynn-color-success);
396
+ }
158
397
 
159
- /* --------------------------------------------------------- field box ---- */
398
+ /* ------------------------------------------------------- field box ---- *
399
+ * shadcn Input / Select frame: h-9, rounded-md, 1px border-input,
400
+ * shadow-xs, transparent fill, focus = ring + border-ring. */
160
401
 
161
402
  .orynn-box {
162
403
  position: relative;
163
404
  display: flex;
164
405
  align-items: stretch;
165
406
  inline-size: var(--orynn-control-width);
407
+ max-inline-size: var(--orynn-control-max-width, 450px);
166
408
  min-block-size: var(--orynn-control-h);
167
409
  box-sizing: border-box;
168
410
  font-family: var(--orynn-font-family);
169
411
  font-size: var(--orynn-font-size);
170
412
  line-height: var(--orynn-line-height);
171
- color: var(--orynn-color-text);
172
- background: var(--orynn-color-bg);
173
- border: var(--orynn-border-width) solid var(--orynn-color-border);
174
- border-radius: var(--orynn-radius);
175
- transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition),
176
- background-color var(--orynn-transition);
413
+ color: var(--orynn-color-foreground);
414
+ background: transparent;
415
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
416
+ border-radius: var(--orynn-radius-md);
417
+ box-shadow: var(--orynn-shadow-xs);
418
+ transition: color var(--orynn-transition), border-color var(--orynn-transition), box-shadow
419
+ var(--orynn-transition);
420
+ }
421
+ [data-orynn-color-scheme="dark"] .orynn-box,
422
+ .dark .orynn-box {
423
+ background: color-mix(in oklch, var(--orynn-color-input) 30%, transparent);
177
424
  }
178
425
  .orynn-box[data-size="sm"] {
179
426
  min-block-size: var(--orynn-control-h-sm);
@@ -186,6 +433,9 @@
186
433
  .orynn-box[data-radius="sm"] {
187
434
  border-radius: var(--orynn-radius-sm);
188
435
  }
436
+ .orynn-box[data-radius="md"] {
437
+ border-radius: var(--orynn-radius-md);
438
+ }
189
439
  .orynn-box[data-radius="lg"] {
190
440
  border-radius: var(--orynn-radius-lg);
191
441
  }
@@ -197,48 +447,108 @@
197
447
  }
198
448
 
199
449
  .orynn-box[data-variant="filled"] {
200
- background: var(--orynn-color-bg-subtle);
450
+ background: var(--orynn-color-muted);
201
451
  border-color: transparent;
202
452
  }
203
453
  .orynn-box[data-variant="flushed"] {
204
454
  border-radius: 0;
205
455
  border-inline: 0;
206
456
  border-block-start: 0;
457
+ box-shadow: none;
207
458
  padding-inline: 0;
208
459
  }
209
460
  .orynn-box[data-variant="unstyled"] {
210
461
  border-color: transparent;
211
462
  background: transparent;
463
+ box-shadow: none;
212
464
  }
213
465
 
214
- .orynn-box:hover:not([data-disabled]):not([data-focused]) {
215
- border-color: var(--orynn-color-border-hover);
216
- }
217
466
  .orynn-box[data-focused] {
218
- border-color: var(--orynn-color-focus);
219
- box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
467
+ border-color: var(--orynn-color-ring);
468
+ box-shadow: 0 0 0 var(--orynn-ring-width)
469
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
220
470
  outline: none;
221
471
  }
222
- .orynn-box[data-variant="filled"][data-focused] {
223
- background: var(--orynn-color-bg);
224
- }
225
472
  .orynn-box[data-invalid] {
226
- border-color: var(--orynn-color-error-border);
227
- }
228
- .orynn-box[data-invalid][data-focused] {
229
- box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-error-ring);
473
+ border-color: var(--orynn-color-destructive);
474
+ box-shadow: 0 0 0 var(--orynn-ring-width)
475
+ color-mix(
476
+ in oklch,
477
+ var(--orynn-color-destructive) calc(var(--orynn-invalid-alpha) * 100%),
478
+ transparent
479
+ );
230
480
  }
231
481
  .orynn-box[data-valid] {
232
- border-color: var(--orynn-color-success-border);
233
- }
234
- .orynn-box[data-valid][data-focused] {
235
- box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-success-ring);
482
+ border-color: var(--orynn-color-success);
483
+ box-shadow: 0 0 0 var(--orynn-ring-width)
484
+ color-mix(in oklch, var(--orynn-color-success) 20%, transparent);
236
485
  }
237
486
  .orynn-box[data-disabled] {
238
- background: var(--orynn-color-bg-disabled);
239
- color: var(--orynn-color-text-muted);
487
+ opacity: 0.5;
488
+ cursor: not-allowed;
489
+ }
490
+
491
+ /* addonBefore / addonAfter — segments attached OUTSIDE the border. Only in play
492
+ when the wrapper is rendered; a bare .orynn-box is untouched. */
493
+ .orynn-box__group {
494
+ display: flex;
495
+ align-items: stretch;
496
+ inline-size: var(--orynn-control-width);
497
+ max-inline-size: var(--orynn-control-max-width, 450px);
498
+ box-sizing: border-box;
499
+ }
500
+ .orynn-box__group[data-disabled] {
501
+ opacity: 0.5;
240
502
  cursor: not-allowed;
241
503
  }
504
+ .orynn-box__group > .orynn-box {
505
+ flex: 1 1 auto;
506
+ inline-size: auto;
507
+ max-inline-size: none;
508
+ }
509
+ .orynn-box__group > .orynn-box[data-disabled] {
510
+ opacity: 1;
511
+ }
512
+ .orynn-box__addon {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ flex: 0 0 auto;
516
+ padding-inline: 0.75rem;
517
+ white-space: nowrap;
518
+ font-size: var(--orynn-font-size-sm);
519
+ color: var(--orynn-color-muted-foreground);
520
+ background: var(--orynn-color-muted);
521
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
522
+ }
523
+ .orynn-box__addon[data-side="before"] {
524
+ border-inline-end: 0;
525
+ border-start-start-radius: var(--orynn-radius-md);
526
+ border-end-start-radius: var(--orynn-radius-md);
527
+ }
528
+ .orynn-box__addon[data-side="after"] {
529
+ border-inline-start: 0;
530
+ border-start-end-radius: var(--orynn-radius-md);
531
+ border-end-end-radius: var(--orynn-radius-md);
532
+ }
533
+ .orynn-box[data-addon-before] {
534
+ border-start-start-radius: 0;
535
+ border-end-start-radius: 0;
536
+ }
537
+ .orynn-box[data-addon-after] {
538
+ border-start-end-radius: 0;
539
+ border-end-end-radius: 0;
540
+ }
541
+ /* focus / invalid states carry across the whole group */
542
+ .orynn-box__group:focus-within .orynn-box__addon {
543
+ border-color: var(--orynn-color-ring);
544
+ }
545
+ .orynn-box__group:has(.orynn-box[data-invalid]) .orynn-box__addon {
546
+ border-color: var(--orynn-color-destructive);
547
+ }
548
+ .orynn-box__group > .orynn-box:focus-within {
549
+ position: relative;
550
+ z-index: 1;
551
+ }
242
552
 
243
553
  .orynn-box__field {
244
554
  flex: 1 1 auto;
@@ -252,7 +562,11 @@
252
562
  text-overflow: ellipsis;
253
563
  }
254
564
  .orynn-box__field::placeholder {
255
- color: var(--orynn-color-text-subtle);
565
+ color: var(--orynn-color-muted-foreground);
566
+ }
567
+ .orynn-box__field::selection {
568
+ background: var(--orynn-color-primary);
569
+ color: var(--orynn-color-primary-foreground);
256
570
  }
257
571
  .orynn-box__field:disabled {
258
572
  cursor: not-allowed;
@@ -266,14 +580,14 @@
266
580
  align-items: center;
267
581
  gap: 0.25rem;
268
582
  padding-inline: 0.5rem;
269
- color: var(--orynn-color-text-muted);
583
+ color: var(--orynn-color-muted-foreground);
270
584
  flex: 0 0 auto;
271
585
  }
272
586
  .orynn-box__adornment:first-child {
273
587
  padding-inline: var(--orynn-control-px) 0.25rem;
274
588
  }
275
589
  .orynn-box__adornment--affix {
276
- color: var(--orynn-color-text-subtle);
590
+ color: var(--orynn-color-muted-foreground);
277
591
  font-variant-numeric: tabular-nums;
278
592
  }
279
593
  .orynn-box__iconbtn {
@@ -285,116 +599,150 @@
285
599
  border: 0;
286
600
  background: transparent;
287
601
  border-radius: var(--orynn-radius-sm);
288
- color: var(--orynn-color-text-muted);
602
+ color: var(--orynn-color-muted-foreground);
289
603
  cursor: pointer;
290
604
  transition: background-color var(--orynn-transition), color var(--orynn-transition);
291
605
  }
292
606
  .orynn-box__iconbtn:hover {
293
- background: var(--orynn-color-overlay);
294
- color: var(--orynn-color-text);
607
+ background: var(--orynn-color-accent);
608
+ color: var(--orynn-color-accent-foreground);
609
+ }
610
+ .orynn-box__iconbtn:focus-visible {
611
+ outline: none;
612
+ box-shadow: 0 0 0 var(--orynn-ring-width)
613
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
295
614
  }
296
615
  .orynn-box__iconbtn:disabled {
297
- opacity: 0.4;
616
+ opacity: 0.5;
298
617
  cursor: not-allowed;
299
618
  }
300
619
 
301
- /* floating label */
302
- .orynn-box--floating .orynn-box__field {
303
- padding-block: 1rem 0.35rem;
620
+ /* floating label — orynn extension (shadcn has no floating label). At rest
621
+ the label sits over the field text; when focused / filled ([data-active])
622
+ it lifts onto the top border with a notch background. */
623
+ .orynn-box--floating {
624
+ margin-block-start: 0.55rem;
304
625
  }
305
626
  .orynn-box--floating .orynn-box__label {
306
627
  position: absolute;
307
628
  inset-block-start: 50%;
308
629
  inset-inline-start: calc(var(--orynn-control-px) + 1px);
630
+ max-inline-size: calc(100% - var(--orynn-control-px) * 2);
631
+ overflow: hidden;
632
+ white-space: nowrap;
633
+ text-overflow: ellipsis;
634
+ padding-inline: 0.3rem;
635
+ margin-inline: -0.3rem;
309
636
  transform: translateY(-50%);
310
637
  transform-origin: left center;
311
- color: var(--orynn-color-text-subtle);
638
+ color: var(--orynn-color-muted-foreground);
639
+ background: transparent;
312
640
  pointer-events: none;
313
- transition: transform var(--orynn-transition), color var(--orynn-transition);
314
- font-size: var(--orynn-font-size);
641
+ transition: transform var(--orynn-transition), top var(--orynn-transition), color
642
+ var(--orynn-transition);
643
+ font-size: inherit;
644
+ line-height: 1;
315
645
  }
316
646
  .orynn-box--floating[data-active] .orynn-box__label {
317
- transform: translateY(-1.05rem) scale(0.78);
647
+ inset-block-start: 0;
648
+ transform: translateY(-50%) scale(0.8);
649
+ color: var(--orynn-color-muted-foreground);
650
+ background: var(--orynn-color-background);
651
+ }
652
+ .orynn-box--floating[data-variant="filled"][data-active]:not([data-focused]) .orynn-box__label {
653
+ background: var(--orynn-color-muted);
654
+ }
655
+ .orynn-box--floating[data-active][data-focused] .orynn-box__label {
656
+ color: var(--orynn-color-foreground);
318
657
  }
319
- .orynn-box--floating[data-focused] .orynn-box__label {
320
- color: var(--orynn-color-accent);
658
+ .orynn-box--floating[data-invalid][data-active] .orynn-box__label {
659
+ color: var(--orynn-color-destructive);
660
+ }
661
+ .orynn-box--floating .orynn-box__adornment:first-child ~ .orynn-box__label {
662
+ inset-inline-start: calc(var(--orynn-control-px) + 1.75rem);
321
663
  }
322
664
  .orynn-box--floating[data-active] .orynn-box__adornment:first-child ~ .orynn-box__label {
323
- inset-inline-start: calc(var(--orynn-control-px) + 1.5rem);
665
+ inset-inline-start: calc(var(--orynn-control-px) + 1px);
324
666
  }
325
667
 
326
668
  .orynn-icon-success {
327
669
  color: var(--orynn-color-success);
328
670
  }
329
671
  .orynn-icon-error {
330
- color: var(--orynn-color-error);
672
+ color: var(--orynn-color-destructive);
331
673
  }
332
674
  .orynn-spin {
333
675
  animation: orynn-spin 0.7s linear infinite;
334
676
  }
335
- @keyframes orynn-spin {
336
- to {
337
- transform: rotate(360deg);
338
- }
339
- }
340
677
 
341
- /* ------------------------------------------------------------- inputs ---- */
678
+ /* ----------------------------------------------------------- inputs ---- */
342
679
 
343
680
  .orynn-input {
344
- /* class kept for back-compat + native fallbacks */
681
+ /* class kept for back-compat + the Fieldset native fallbacks */
345
682
  inline-size: 100%;
683
+ max-inline-size: var(--orynn-control-max-width, 450px);
346
684
  min-block-size: var(--orynn-control-h);
347
685
  padding: 0 var(--orynn-control-px);
348
686
  font-family: inherit;
349
687
  font-size: var(--orynn-font-size);
350
- color: var(--orynn-color-text);
351
- background: var(--orynn-color-bg);
352
- border: var(--orynn-border-width) solid var(--orynn-color-border);
353
- border-radius: var(--orynn-radius);
688
+ color: var(--orynn-color-foreground);
689
+ background: transparent;
690
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
691
+ border-radius: var(--orynn-radius-md);
692
+ box-shadow: var(--orynn-shadow-xs);
354
693
  box-sizing: border-box;
355
- transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition);
694
+ transition: color var(--orynn-transition), border-color var(--orynn-transition), box-shadow
695
+ var(--orynn-transition);
356
696
  }
357
- .orynn-input:hover:not(:disabled),
358
- .orynn-dropdown:hover:not(:disabled) {
359
- border-color: var(--orynn-color-border-hover);
697
+ .orynn-input::placeholder {
698
+ color: var(--orynn-color-muted-foreground);
360
699
  }
361
700
  .orynn-input:focus-visible,
362
701
  .orynn-dropdown:focus-visible {
363
702
  outline: none;
364
- border-color: var(--orynn-color-focus);
365
- box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
703
+ border-color: var(--orynn-color-ring);
704
+ box-shadow: 0 0 0 var(--orynn-ring-width)
705
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
366
706
  }
367
707
  .orynn-input[aria-invalid="true"],
368
708
  .orynn-dropdown[aria-invalid="true"] {
369
- border-color: var(--orynn-color-error-border);
709
+ border-color: var(--orynn-color-destructive);
710
+ box-shadow: 0 0 0 var(--orynn-ring-width)
711
+ color-mix(
712
+ in oklch,
713
+ var(--orynn-color-destructive) calc(var(--orynn-invalid-alpha) * 100%),
714
+ transparent
715
+ );
370
716
  }
371
717
  .orynn-input:disabled,
372
718
  .orynn-dropdown:disabled {
373
- background: var(--orynn-color-bg-disabled);
374
- color: var(--orynn-color-text-muted);
719
+ opacity: 0.5;
375
720
  cursor: not-allowed;
376
721
  }
377
722
 
378
723
  /* native <select> — used by the Fieldset built-in and `<Dropdown native />` */
379
724
  .orynn-dropdown {
380
725
  inline-size: 100%;
726
+ max-inline-size: var(--orynn-control-max-width, 450px);
381
727
  min-block-size: var(--orynn-control-h);
382
728
  padding: 0 2rem 0 var(--orynn-control-px);
383
729
  font-family: inherit;
384
730
  font-size: var(--orynn-font-size);
385
- color: var(--orynn-color-text);
386
- background-color: var(--orynn-color-bg);
387
- border: var(--orynn-border-width) solid var(--orynn-color-border);
388
- border-radius: var(--orynn-radius);
731
+ color: var(--orynn-color-foreground);
732
+ background-color: transparent;
733
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
734
+ border-radius: var(--orynn-radius-md);
735
+ box-shadow: var(--orynn-shadow-xs);
389
736
  box-sizing: border-box;
390
737
  appearance: none;
391
- transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition);
392
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%235b6470' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
738
+ transition: color var(--orynn-transition), border-color var(--orynn-transition), box-shadow
739
+ var(--orynn-transition);
740
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='none' stroke='%23a1a1a1' stroke-width='1.75' stroke-linecap='round' d='M1.5 2l4.5 4 4.5-4'/%3E%3C/svg%3E");
393
741
  background-repeat: no-repeat;
394
742
  background-position: right var(--orynn-control-px) center;
395
743
  }
396
744
 
397
- /* ---------------------------------------------------------- textarea ---- */
745
+ /* --------------------------------------------------------- textarea ---- */
398
746
 
399
747
  .orynn-box--textarea {
400
748
  align-items: stretch;
@@ -408,9 +756,12 @@
408
756
  background: transparent;
409
757
  font: inherit;
410
758
  color: inherit;
411
- padding: 0.55rem var(--orynn-control-px);
759
+ padding: 0.5rem var(--orynn-control-px);
412
760
  resize: vertical;
413
- min-block-size: calc(var(--orynn-line-height) * 3em);
761
+ min-block-size: 4rem;
762
+ }
763
+ .orynn-textarea::placeholder {
764
+ color: var(--orynn-color-muted-foreground);
414
765
  }
415
766
  .orynn-textarea[data-resize="none"] {
416
767
  resize: none;
@@ -418,22 +769,22 @@
418
769
  .orynn-textarea[data-resize="both"] {
419
770
  resize: both;
420
771
  }
421
- .orynn-box--floating.orynn-box--textarea .orynn-textarea {
422
- padding-block-start: 1.35rem;
772
+ .orynn-box--floating.orynn-box--textarea {
773
+ min-block-size: 0;
423
774
  }
424
775
  .orynn-box--floating.orynn-box--textarea .orynn-box__label {
425
- inset-block-start: 0.9rem;
426
- transform: none;
776
+ inset-block-start: 0;
777
+ transform: translateY(0.6rem);
427
778
  }
428
779
  .orynn-box--floating.orynn-box--textarea[data-active] .orynn-box__label {
429
- transform: translateY(-0.55rem) scale(0.78);
780
+ transform: translateY(-50%) scale(0.8);
430
781
  }
431
782
  .orynn-box__footer {
432
783
  position: absolute;
433
784
  inset-inline-end: 0.5rem;
434
785
  inset-block-end: 0.35rem;
435
- font-size: 0.72rem;
436
- color: var(--orynn-color-text-subtle);
786
+ font-size: var(--orynn-font-size-sm);
787
+ color: var(--orynn-color-muted-foreground);
437
788
  font-variant-numeric: tabular-nums;
438
789
  pointer-events: none;
439
790
  }
@@ -443,7 +794,7 @@
443
794
  .orynn-number__buttons {
444
795
  display: flex;
445
796
  flex-direction: column;
446
- border-inline-start: var(--orynn-border-width) solid var(--orynn-color-border);
797
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-input);
447
798
  flex: 0 0 auto;
448
799
  }
449
800
  .orynn-number__buttons--horizontal {
@@ -453,28 +804,35 @@
453
804
  display: flex;
454
805
  align-items: center;
455
806
  justify-content: center;
456
- inline-size: 2rem;
807
+ inline-size: 1.9rem;
457
808
  flex: 1 1 0;
458
809
  border: 0;
459
810
  background: transparent;
460
- color: var(--orynn-color-text-muted);
811
+ color: var(--orynn-color-muted-foreground);
461
812
  cursor: pointer;
462
- transition: background-color var(--orynn-transition);
813
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
814
+ }
815
+ .orynn-number__caret {
816
+ font-size: 0.8rem;
817
+ stroke-width: 2.5;
463
818
  }
464
819
  .orynn-number__btn:hover:not(:disabled) {
465
- background: var(--orynn-color-overlay);
466
- color: var(--orynn-color-text);
820
+ background: var(--orynn-color-accent);
821
+ color: var(--orynn-color-accent-foreground);
822
+ }
823
+ .orynn-number__btn:active:not(:disabled) {
824
+ background: color-mix(in oklch, var(--orynn-color-accent) 60%, var(--orynn-color-foreground) 8%);
467
825
  }
468
826
  .orynn-number__btn:disabled {
469
- opacity: 0.35;
827
+ opacity: 0.5;
470
828
  cursor: not-allowed;
471
829
  }
472
830
  .orynn-number__btn + .orynn-number__btn {
473
- border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
831
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-input);
474
832
  }
475
833
  .orynn-number__buttons--horizontal .orynn-number__btn + .orynn-number__btn {
476
834
  border-block-start: 0;
477
- border-inline-start: var(--orynn-border-width) solid var(--orynn-color-border);
835
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-input);
478
836
  }
479
837
 
480
838
  /* ------------------------------------------------------- checkbox/radio -- */
@@ -483,16 +841,16 @@
483
841
  position: relative;
484
842
  display: inline-flex;
485
843
  align-items: flex-start;
486
- gap: 0.55rem;
844
+ gap: 0.5rem;
487
845
  font-family: var(--orynn-font-family);
488
846
  font-size: var(--orynn-font-size);
489
- color: var(--orynn-color-text);
847
+ color: var(--orynn-color-foreground);
490
848
  cursor: pointer;
491
849
  line-height: 1.4;
492
850
  }
493
851
  .orynn-choice[data-disabled] {
494
852
  cursor: not-allowed;
495
- color: var(--orynn-color-text-muted);
853
+ opacity: 0.5;
496
854
  }
497
855
  .orynn-choice--start {
498
856
  flex-direction: row-reverse;
@@ -513,12 +871,13 @@
513
871
  flex: 0 0 auto;
514
872
  inline-size: var(--orynn-check-size);
515
873
  block-size: var(--orynn-check-size);
516
- margin-block-start: 0.1rem;
874
+ margin-block-start: 0.125rem;
517
875
  display: grid;
518
876
  place-items: center;
519
- border: 1.5px solid var(--orynn-color-border);
520
- background: var(--orynn-color-bg);
521
- color: var(--orynn-color-accent-contrast);
877
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
878
+ background: transparent;
879
+ box-shadow: var(--orynn-shadow-xs);
880
+ color: var(--orynn-color-primary-foreground);
522
881
  transition: background-color var(--orynn-transition), border-color var(--orynn-transition),
523
882
  box-shadow var(--orynn-transition);
524
883
  }
@@ -526,44 +885,37 @@
526
885
  border-radius: var(--orynn-check-radius);
527
886
  }
528
887
  .orynn-choice__control--radio {
529
- border-radius: 999px;
888
+ border-radius: 9999px;
889
+ color: var(--orynn-color-primary);
530
890
  }
531
891
 
532
- .orynn-choice__native:hover:not(:disabled) ~ .orynn-choice__control {
533
- border-color: var(--orynn-color-border-hover);
534
- }
535
892
  .orynn-choice__native:focus-visible ~ .orynn-choice__control {
536
- border-color: var(--orynn-color-focus);
537
- box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
893
+ border-color: var(--orynn-color-ring);
894
+ box-shadow: 0 0 0 var(--orynn-ring-width)
895
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
538
896
  }
539
897
  .orynn-choice[data-invalid] .orynn-choice__control {
540
- border-color: var(--orynn-color-error-border);
898
+ border-color: var(--orynn-color-destructive);
541
899
  }
542
900
 
543
- .orynn-choice__native:checked ~ .orynn-choice__control,
544
- .orynn-choice__native:indeterminate ~ .orynn-choice__control {
545
- background: var(--orynn-color-accent);
546
- border-color: var(--orynn-color-accent);
547
- }
548
- .orynn-choice--outline .orynn-choice__native:checked ~ .orynn-choice__control,
549
- .orynn-choice--outline .orynn-choice__native:indeterminate ~ .orynn-choice__control {
901
+ /* checkbox fill on check / indeterminate (radio keeps its neutral border) */
902
+ .orynn-choice__native:checked ~ .orynn-choice__control--checkbox,
903
+ .orynn-choice__native:indeterminate ~ .orynn-choice__control--checkbox {
904
+ background: var(--orynn-color-primary);
905
+ border-color: var(--orynn-color-primary);
906
+ }
907
+ .orynn-choice--outline .orynn-choice__native:checked ~ .orynn-choice__control--checkbox,
908
+ .orynn-choice--outline .orynn-choice__native:indeterminate ~ .orynn-choice__control--checkbox {
550
909
  background: transparent;
551
- color: var(--orynn-color-accent);
552
- }
553
- .orynn-choice__native:disabled ~ .orynn-choice__control {
554
- background: var(--orynn-color-bg-disabled);
555
- }
556
- .orynn-choice__native:disabled:checked ~ .orynn-choice__control {
557
- background: var(--orynn-color-accent-muted);
558
- border-color: transparent;
910
+ color: var(--orynn-color-primary);
559
911
  }
560
912
 
561
913
  .orynn-choice__mark {
562
914
  grid-area: 1 / 1;
563
915
  display: grid;
564
916
  place-items: center;
565
- inline-size: 80%;
566
- block-size: 80%;
917
+ inline-size: 85%;
918
+ block-size: 85%;
567
919
  opacity: 0;
568
920
  transform: scale(0.5);
569
921
  transition: opacity var(--orynn-transition), transform var(--orynn-transition);
@@ -585,9 +937,9 @@
585
937
  }
586
938
 
587
939
  .orynn-choice__mark--dot {
588
- inline-size: 45%;
589
- block-size: 45%;
590
- border-radius: 999px;
940
+ inline-size: 0.5rem;
941
+ block-size: 0.5rem;
942
+ border-radius: 9999px;
591
943
  background: currentColor;
592
944
  }
593
945
  .orynn-choice__native:checked ~ .orynn-choice__control--radio .orynn-choice__mark--dot {
@@ -605,374 +957,2467 @@
605
957
  }
606
958
  .orynn-choice__desc {
607
959
  font-size: var(--orynn-help-font-size);
608
- color: var(--orynn-color-text-muted);
960
+ color: var(--orynn-color-muted-foreground);
609
961
  }
610
962
 
611
963
  .orynn-choice-group {
612
964
  display: flex;
613
965
  flex-direction: column;
614
- gap: 0.6rem;
966
+ gap: 0.75rem;
615
967
  }
616
968
  .orynn-choice-group[data-orientation="horizontal"] {
617
969
  flex-direction: row;
618
970
  flex-wrap: wrap;
619
971
  gap: 1rem;
620
972
  }
973
+ /* columns grid (additive — only when data-columns is set) */
974
+ .orynn-choice-group[data-columns] {
975
+ display: grid;
976
+ grid-template-columns: repeat(var(--orynn-choice-columns, 2), minmax(0, 1fr));
977
+ gap: 0.75rem 1rem;
978
+ }
979
+ .orynn-choice-group__selectall {
980
+ margin-block-end: 0.25rem;
981
+ }
982
+ .orynn-choice-group[data-columns] .orynn-choice-group__selectall {
983
+ grid-column: 1 / -1;
984
+ }
985
+ .orynn-choice__icon {
986
+ display: inline-flex;
987
+ align-items: center;
988
+ margin-inline-end: 0.35rem;
989
+ }
621
990
 
622
991
  .orynn-choice--card {
623
- border: var(--orynn-border-width) solid var(--orynn-color-border);
624
- border-radius: var(--orynn-radius);
625
- padding: 0.7rem 0.85rem;
992
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
993
+ border-radius: var(--orynn-radius-md);
994
+ padding: 0.75rem;
626
995
  align-items: center;
996
+ box-shadow: var(--orynn-shadow-xs);
627
997
  transition: border-color var(--orynn-transition), background-color var(--orynn-transition);
628
998
  }
629
999
  .orynn-choice--card:has(.orynn-choice__native:checked) {
630
- border-color: var(--orynn-color-accent);
631
- background: var(--orynn-color-accent-subtle);
1000
+ border-color: var(--orynn-color-primary);
1001
+ background: color-mix(in oklch, var(--orynn-color-primary) 5%, var(--orynn-color-background));
632
1002
  }
633
1003
  .orynn-choice--card:has(.orynn-choice__native:focus-visible) {
634
- box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
1004
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1005
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
635
1006
  }
636
1007
 
637
- /* --------------------------------------------------------- popover ------ */
1008
+ /* ------------------------------------------------------------- label ---- */
638
1009
 
639
- .orynn-popover {
640
- position: fixed;
641
- z-index: 1000;
642
- background: var(--orynn-color-panel-bg);
643
- border: var(--orynn-border-width) solid var(--orynn-color-border);
644
- border-radius: var(--orynn-radius-lg);
645
- box-shadow: var(--orynn-color-panel-shadow);
646
- font-family: var(--orynn-font-family);
647
- color: var(--orynn-color-text);
648
- overflow: hidden;
649
- animation: orynn-pop var(--orynn-transition);
1010
+ .orynn-label {
1011
+ display: inline-flex;
1012
+ align-items: center;
1013
+ gap: 0.5rem;
1014
+ font-size: var(--orynn-font-size);
1015
+ font-weight: 500;
1016
+ line-height: 1;
1017
+ user-select: none;
650
1018
  }
651
- @keyframes orynn-pop {
652
- from {
653
- opacity: 0;
654
- transform: translateY(-4px);
655
- }
656
- to {
657
- opacity: 1;
658
- transform: translateY(0);
659
- }
1019
+ .orynn-label[data-disabled="true"] {
1020
+ pointer-events: none;
1021
+ opacity: 0.5;
1022
+ }
1023
+ .orynn-label__required {
1024
+ color: var(--orynn-color-destructive);
1025
+ margin-inline-start: -0.25rem;
1026
+ }
1027
+ .orynn-label__optional {
1028
+ font-weight: 400;
1029
+ font-size: var(--orynn-font-size-sm);
1030
+ color: var(--orynn-color-muted-foreground);
1031
+ margin-inline-start: -0.25rem;
660
1032
  }
661
1033
 
662
- /* ---------------------------------------------------------- select ----- */
1034
+ /* ------------------------------------------------------------ button ---- */
663
1035
 
664
- .orynn-select__value {
665
- display: flex;
666
- flex: 1 1 auto;
667
- min-inline-size: 0;
1036
+ .orynn-button {
1037
+ display: inline-flex;
1038
+ flex-shrink: 0;
668
1039
  align-items: center;
669
- gap: 0.4rem;
670
- padding: 0 var(--orynn-control-px);
671
- overflow: hidden;
1040
+ justify-content: center;
1041
+ gap: 0.5rem;
1042
+ white-space: nowrap;
1043
+ box-sizing: border-box;
1044
+ block-size: var(--orynn-control-h);
1045
+ padding-inline: 1rem;
1046
+ border: var(--orynn-border-width) solid transparent;
1047
+ border-radius: var(--orynn-radius-md);
1048
+ font-family: var(--orynn-font-family);
1049
+ font-size: var(--orynn-font-size);
1050
+ font-weight: 500;
1051
+ line-height: 1;
1052
+ cursor: var(--orynn-button-cursor, pointer);
1053
+ outline: none;
1054
+ transition: var(--orynn-transition);
1055
+ /* default variant */
1056
+ background: var(--orynn-color-primary);
1057
+ color: var(--orynn-color-primary-foreground);
1058
+ }
1059
+ .orynn-button > svg {
1060
+ inline-size: 1rem;
1061
+ block-size: 1rem;
1062
+ flex-shrink: 0;
1063
+ pointer-events: none;
672
1064
  }
673
- .orynn-select__value--placeholder {
674
- color: var(--orynn-color-text-subtle);
1065
+ .orynn-button:hover:not([data-hover-effect="none"]) {
1066
+ background: color-mix(in oklch, var(--orynn-color-primary) 90%, transparent);
675
1067
  }
676
- .orynn-select__single {
677
- white-space: nowrap;
678
- overflow: hidden;
679
- text-overflow: ellipsis;
1068
+ .orynn-button:focus-visible {
1069
+ border-color: var(--orynn-color-ring);
1070
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1071
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
680
1072
  }
681
- .orynn-select__search {
682
- flex: 1 1 4rem;
683
- min-inline-size: 2rem;
684
- border: 0;
685
- outline: 0;
686
- background: transparent;
687
- font: inherit;
688
- color: inherit;
689
- padding: 0;
1073
+ .orynn-button:disabled,
1074
+ .orynn-button[data-disabled] {
1075
+ pointer-events: none;
1076
+ opacity: 0.5;
690
1077
  }
691
- .orynn-select__chips {
692
- display: flex;
693
- flex-wrap: wrap;
694
- gap: 0.3rem;
695
- align-items: center;
1078
+ .orynn-button[aria-invalid="true"] {
1079
+ border-color: var(--orynn-color-destructive);
696
1080
  }
697
- .orynn-select__chip {
698
- display: inline-flex;
699
- align-items: center;
700
- gap: 0.25rem;
701
- background: var(--orynn-color-accent-subtle);
702
- color: var(--orynn-color-accent);
703
- border-radius: var(--orynn-radius-pill);
704
- padding: 0.1rem 0.25rem 0.1rem 0.55rem;
705
- font-size: 0.82em;
706
- max-inline-size: 12rem;
1081
+
1082
+ .orynn-button--secondary {
1083
+ background: var(--orynn-color-secondary);
1084
+ color: var(--orynn-color-secondary-foreground);
707
1085
  }
708
- .orynn-select__chip span {
709
- overflow: hidden;
710
- text-overflow: ellipsis;
711
- white-space: nowrap;
1086
+ .orynn-button--secondary:hover:not([data-hover-effect="none"]) {
1087
+ background: color-mix(in oklch, var(--orynn-color-secondary) 80%, transparent);
712
1088
  }
713
- .orynn-select__chip button {
714
- display: inline-flex;
715
- border: 0;
716
- background: transparent;
717
- color: inherit;
718
- cursor: pointer;
719
- padding: 0.1rem;
720
- border-radius: 999px;
1089
+ .orynn-button--destructive {
1090
+ background: var(--orynn-color-destructive);
1091
+ color: #fff;
721
1092
  }
722
- .orynn-select__chip button:hover {
723
- background: var(--orynn-color-accent-muted);
1093
+ .orynn-button--destructive:hover:not([data-hover-effect="none"]) {
1094
+ background: color-mix(in oklch, var(--orynn-color-destructive) 90%, transparent);
724
1095
  }
725
- .orynn-select__chevron {
726
- transition: transform var(--orynn-transition);
1096
+ .orynn-button--destructive:focus-visible {
1097
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1098
+ color-mix(in oklch, var(--orynn-color-destructive) 20%, transparent);
727
1099
  }
728
- .orynn-box[data-focused] .orynn-select__chevron,
729
- .orynn-box[data-open] .orynn-select__chevron {
730
- transform: rotate(180deg);
1100
+ .orynn-button--outline {
1101
+ border-color: var(--orynn-color-border);
1102
+ background: var(--orynn-color-background);
1103
+ box-shadow: var(--orynn-shadow-xs);
1104
+ color: var(--orynn-color-foreground);
1105
+ }
1106
+ .orynn-button--outline:hover:not([data-hover-effect="none"]) {
1107
+ background: var(--orynn-color-accent);
1108
+ color: var(--orynn-color-accent-foreground);
1109
+ }
1110
+ [data-orynn-color-scheme="dark"] .orynn-button--outline,
1111
+ .dark .orynn-button--outline {
1112
+ border-color: var(--orynn-color-input);
1113
+ background: color-mix(in oklch, var(--orynn-color-input) 30%, transparent);
1114
+ }
1115
+ [data-orynn-color-scheme="dark"] .orynn-button--outline:hover:not([data-hover-effect="none"]),
1116
+ .dark .orynn-button--outline:hover:not([data-hover-effect="none"]) {
1117
+ background: color-mix(in oklch, var(--orynn-color-input) 50%, transparent);
1118
+ }
1119
+ .orynn-button--ghost {
1120
+ background: transparent;
1121
+ color: var(--orynn-color-foreground);
1122
+ }
1123
+ .orynn-button--ghost:hover:not([data-hover-effect="none"]) {
1124
+ background: var(--orynn-color-accent);
1125
+ color: var(--orynn-color-accent-foreground);
1126
+ }
1127
+ .orynn-button--link {
1128
+ block-size: auto;
1129
+ padding: 0;
1130
+ background: transparent;
1131
+ color: var(--orynn-color-primary);
1132
+ text-underline-offset: 4px;
1133
+ }
1134
+ .orynn-button--link:hover:not([data-hover-effect="none"]) {
1135
+ background: transparent;
1136
+ text-decoration: underline;
731
1137
  }
732
1138
 
733
- .orynn-listbox {
734
- max-block-size: min(18rem, 60vh);
735
- overflow-y: auto;
736
- padding: 0.35rem;
1139
+ .orynn-button--sm {
1140
+ block-size: var(--orynn-control-h-sm);
1141
+ gap: 0.375rem;
1142
+ padding-inline: 0.75rem;
1143
+ }
1144
+ .orynn-button--lg {
1145
+ block-size: var(--orynn-control-h-lg);
1146
+ padding-inline: 1.5rem;
1147
+ }
1148
+ .orynn-button--icon {
1149
+ inline-size: var(--orynn-control-h);
1150
+ block-size: var(--orynn-control-h);
1151
+ padding: 0;
1152
+ }
1153
+
1154
+ /* -- per-instance state knobs (data-attrs set by <Button>) --------------- *
1155
+ * Defaults (no attr) are unchanged. Every effect is token-driven so a theme
1156
+ * can retune it without new markup. */
1157
+
1158
+ /* hover: "lift" — raise + shadow, settle on press */
1159
+ .orynn-button[data-hover-effect="lift"] {
1160
+ transition: var(--orynn-transition), transform 120ms var(--orynn-ease), box-shadow 120ms
1161
+ var(--orynn-ease);
1162
+ }
1163
+ .orynn-button[data-hover-effect="lift"]:hover:not(:disabled):not([data-disabled]) {
1164
+ transform: translateY(var(--orynn-button-hover-lift, -1px));
1165
+ box-shadow: var(--orynn-button-hover-shadow, var(--orynn-shadow-md));
1166
+ }
1167
+ .orynn-button[data-hover-effect="lift"]:active:not(:disabled) {
1168
+ transform: translateY(0);
1169
+ }
1170
+
1171
+ /* hover: "glow" — soft ring in the fill colour */
1172
+ .orynn-button[data-hover-effect="glow"] {
1173
+ transition: var(--orynn-transition), box-shadow 140ms var(--orynn-ease);
1174
+ }
1175
+ .orynn-button[data-hover-effect="glow"]:hover:not(:disabled):not([data-disabled]) {
1176
+ box-shadow: 0 0 0 var(--orynn-button-glow-size, 4px)
1177
+ var(--orynn-button-glow, color-mix(in oklch, var(--orynn-color-primary) 22%, transparent));
1178
+ }
1179
+
1180
+ /* hover: "outline-fill" — flood the fill (reads well on ghost / outline) */
1181
+ .orynn-button[data-hover-effect="outline-fill"]:hover:not(:disabled):not([data-disabled]) {
1182
+ background: var(--orynn-button-fill-bg, var(--orynn-color-primary));
1183
+ color: var(--orynn-button-fill-fg, var(--orynn-color-primary-foreground));
1184
+ border-color: var(--orynn-button-fill-bg, var(--orynn-color-primary));
1185
+ text-decoration: none;
1186
+ }
1187
+
1188
+ /* focus-visible styles */
1189
+ .orynn-button[data-focus-style="solid"]:focus-visible {
1190
+ border-color: transparent;
1191
+ box-shadow: none;
1192
+ outline: var(--orynn-button-focus-width, 2px) solid var(--orynn-color-ring);
1193
+ outline-offset: var(--orynn-button-focus-offset, 2px);
1194
+ }
1195
+ .orynn-button[data-focus-style="ring-inset"]:focus-visible {
1196
+ border-color: transparent;
1197
+ box-shadow: inset 0 0 0 var(--orynn-button-focus-width, 2px) var(--orynn-color-ring);
1198
+ }
1199
+ .orynn-button[data-focus-style="none"]:focus-visible {
1200
+ border-color: transparent;
1201
+ box-shadow: none;
737
1202
  outline: none;
738
1203
  }
739
- .orynn-listbox__empty {
740
- padding: 0.9rem 0.75rem;
741
- text-align: center;
742
- color: var(--orynn-color-text-subtle);
1204
+
1205
+ /* selected / pressed */
1206
+ .orynn-button[data-selected] {
1207
+ background: var(--orynn-button-selected-bg, var(--orynn-color-primary));
1208
+ color: var(--orynn-button-selected-fg, var(--orynn-color-primary-foreground));
1209
+ border-color: var(--orynn-button-selected-border, transparent);
1210
+ }
1211
+ .orynn-button[data-selected]:hover:not(:disabled):not([data-hover-effect="none"]) {
1212
+ background: color-mix(
1213
+ in oklch,
1214
+ var(--orynn-button-selected-bg, var(--orynn-color-primary)) 88%,
1215
+ var(--orynn-color-foreground)
1216
+ );
1217
+ }
1218
+
1219
+ /* ------------------------------------------------------------- badge ---- */
1220
+
1221
+ .orynn-badge {
1222
+ display: inline-flex;
1223
+ align-items: center;
1224
+ justify-content: center;
1225
+ gap: 0.25rem;
1226
+ inline-size: fit-content;
1227
+ flex-shrink: 0;
1228
+ white-space: nowrap;
1229
+ box-sizing: border-box;
1230
+ padding: 0.125rem 0.5rem;
1231
+ border: var(--orynn-border-width) solid transparent;
1232
+ border-radius: var(--orynn-radius-md);
1233
+ font-family: var(--orynn-font-family);
1234
+ font-size: 0.75rem;
1235
+ font-weight: 500;
1236
+ line-height: 1;
1237
+ background: var(--orynn-color-primary);
1238
+ color: var(--orynn-color-primary-foreground);
1239
+ }
1240
+ .orynn-badge > svg {
1241
+ inline-size: 0.75rem;
1242
+ block-size: 0.75rem;
1243
+ pointer-events: none;
1244
+ }
1245
+ .orynn-badge--secondary {
1246
+ background: var(--orynn-color-secondary);
1247
+ color: var(--orynn-color-secondary-foreground);
1248
+ }
1249
+ .orynn-badge--destructive {
1250
+ background: var(--orynn-color-destructive);
1251
+ color: #fff;
1252
+ }
1253
+ .orynn-badge--outline {
1254
+ background: transparent;
1255
+ color: var(--orynn-color-foreground);
1256
+ border-color: var(--orynn-color-border);
1257
+ }
1258
+ /* --- Badge: size / dot / remove (additive) */
1259
+ .orynn-badge[data-size="sm"] {
1260
+ padding: 0 0.375rem;
1261
+ font-size: 0.6875rem;
1262
+ }
1263
+ .orynn-badge__dot {
1264
+ inline-size: 0.375rem;
1265
+ block-size: 0.375rem;
1266
+ border-radius: 9999px;
1267
+ background: currentColor;
1268
+ flex-shrink: 0;
1269
+ }
1270
+ .orynn-badge__remove {
1271
+ display: inline-flex;
1272
+ align-items: center;
1273
+ justify-content: center;
1274
+ margin-inline-start: 0.125rem;
1275
+ margin-inline-end: -0.15rem;
1276
+ border: 0;
1277
+ padding: 0;
1278
+ background: transparent;
1279
+ color: currentColor;
1280
+ cursor: pointer;
1281
+ opacity: 0.7;
1282
+ border-radius: 9999px;
1283
+ }
1284
+ .orynn-badge__remove:hover {
1285
+ opacity: 1;
1286
+ }
1287
+ .orynn-badge__remove > svg {
1288
+ inline-size: 0.7rem;
1289
+ block-size: 0.7rem;
1290
+ }
1291
+
1292
+ /* -------------------------------------------------------------- card ---- */
1293
+
1294
+ .orynn-card {
1295
+ display: flex;
1296
+ flex-direction: column;
1297
+ gap: 1.5rem;
1298
+ box-sizing: border-box;
1299
+ padding-block: 1.5rem;
1300
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1301
+ border-radius: var(--orynn-radius-xl);
1302
+ background: var(--orynn-color-card);
1303
+ color: var(--orynn-color-card-foreground);
1304
+ box-shadow: var(--orynn-shadow-sm);
1305
+ font-family: var(--orynn-font-family);
1306
+ font-size: var(--orynn-font-size);
1307
+ }
1308
+ /* --- Card: interactive affordance (additive) */
1309
+ .orynn-card[data-interactive] {
1310
+ cursor: pointer;
1311
+ text-align: start;
1312
+ transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition);
1313
+ }
1314
+ .orynn-card[data-interactive]:hover {
1315
+ border-color: color-mix(in oklch, var(--orynn-color-ring) 60%, var(--orynn-color-border));
1316
+ }
1317
+ .orynn-card[data-interactive]:focus-visible {
1318
+ outline: none;
1319
+ border-color: var(--orynn-color-ring);
1320
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1321
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1322
+ }
1323
+ .orynn-card__header {
1324
+ display: grid;
1325
+ grid-auto-rows: min-content;
1326
+ grid-template-rows: auto auto;
1327
+ align-items: start;
1328
+ gap: 0.375rem;
1329
+ padding-inline: 1.5rem;
1330
+ }
1331
+ .orynn-card__header:has([data-slot="card-action"]) {
1332
+ grid-template-columns: 1fr auto;
1333
+ }
1334
+ .orynn-card__title {
1335
+ font-weight: 600;
1336
+ line-height: 1;
1337
+ }
1338
+ .orynn-card__description {
1339
+ font-size: var(--orynn-font-size);
1340
+ color: var(--orynn-color-muted-foreground);
1341
+ }
1342
+ .orynn-card__action {
1343
+ grid-column: 2;
1344
+ grid-row: 1 / span 2;
1345
+ align-self: start;
1346
+ justify-self: end;
1347
+ }
1348
+ .orynn-card__content {
1349
+ padding-inline: 1.5rem;
1350
+ }
1351
+ .orynn-card__footer {
1352
+ display: flex;
1353
+ align-items: center;
1354
+ padding-inline: 1.5rem;
1355
+ }
1356
+
1357
+ /* ------------------------------------------------------------- alert ---- */
1358
+
1359
+ .orynn-alert {
1360
+ position: relative;
1361
+ display: grid;
1362
+ grid-template-columns: 0 1fr;
1363
+ align-items: start;
1364
+ row-gap: 0.125rem;
1365
+ inline-size: 100%;
1366
+ box-sizing: border-box;
1367
+ padding: 0.75rem 1rem;
1368
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1369
+ border-radius: var(--orynn-radius-lg);
1370
+ background: var(--orynn-color-card);
1371
+ color: var(--orynn-color-card-foreground);
1372
+ font-family: var(--orynn-font-family);
1373
+ font-size: var(--orynn-font-size);
1374
+ }
1375
+ .orynn-alert:has(> svg) {
1376
+ grid-template-columns: 1rem 1fr;
1377
+ column-gap: 0.75rem;
1378
+ }
1379
+ .orynn-alert > svg {
1380
+ inline-size: 1rem;
1381
+ block-size: 1rem;
1382
+ transform: translateY(0.125rem);
1383
+ color: currentColor;
1384
+ }
1385
+ .orynn-alert__title {
1386
+ grid-column-start: 2;
1387
+ min-block-size: 1rem;
1388
+ font-weight: 500;
1389
+ letter-spacing: -0.01em;
1390
+ line-height: 1;
1391
+ overflow: hidden;
1392
+ text-overflow: ellipsis;
1393
+ white-space: nowrap;
1394
+ }
1395
+ .orynn-alert__description {
1396
+ grid-column-start: 2;
1397
+ display: grid;
1398
+ justify-items: start;
1399
+ gap: 0.25rem;
1400
+ font-size: var(--orynn-font-size);
1401
+ color: var(--orynn-color-muted-foreground);
1402
+ }
1403
+ .orynn-alert--destructive {
1404
+ color: var(--orynn-color-destructive);
1405
+ }
1406
+ .orynn-alert--destructive .orynn-alert__description {
1407
+ color: color-mix(in oklch, var(--orynn-color-destructive) 90%, transparent);
1408
+ }
1409
+ /* --- Alert: extra variants + dismiss (additive) */
1410
+ .orynn-alert--success {
1411
+ color: var(--orynn-color-success);
1412
+ border-color: color-mix(in oklch, var(--orynn-color-success) 40%, var(--orynn-color-border));
1413
+ }
1414
+ .orynn-alert--warning {
1415
+ color: oklch(0.62 0.16 65);
1416
+ border-color: color-mix(in oklch, oklch(0.62 0.16 65) 40%, var(--orynn-color-border));
1417
+ }
1418
+ .orynn-alert--info {
1419
+ color: var(--orynn-color-primary);
1420
+ border-color: color-mix(in oklch, var(--orynn-color-primary) 25%, var(--orynn-color-border));
1421
+ }
1422
+ .orynn-alert--success .orynn-alert__description,
1423
+ .orynn-alert--warning .orynn-alert__description,
1424
+ .orynn-alert--info .orynn-alert__description {
1425
+ color: color-mix(in oklch, currentColor 85%, transparent);
1426
+ }
1427
+ .orynn-alert__dismiss {
1428
+ position: absolute;
1429
+ inset-block-start: 0.625rem;
1430
+ inset-inline-end: 0.625rem;
1431
+ display: inline-flex;
1432
+ align-items: center;
1433
+ justify-content: center;
1434
+ inline-size: 1.25rem;
1435
+ block-size: 1.25rem;
1436
+ border: 0;
1437
+ padding: 0;
1438
+ background: transparent;
1439
+ color: currentColor;
1440
+ opacity: 0.6;
1441
+ cursor: pointer;
1442
+ border-radius: var(--orynn-radius-sm);
1443
+ }
1444
+ .orynn-alert__dismiss:hover {
1445
+ opacity: 1;
1446
+ }
1447
+ .orynn-alert[data-dismissible] {
1448
+ padding-inline-end: 2.25rem;
1449
+ }
1450
+
1451
+ /* --------------------------------------------------------- separator ---- */
1452
+
1453
+ .orynn-separator {
1454
+ flex-shrink: 0;
1455
+ border: 0;
1456
+ background: var(--orynn-color-border);
1457
+ }
1458
+ .orynn-separator[data-orientation="horizontal"] {
1459
+ block-size: 1px;
1460
+ inline-size: 100%;
1461
+ }
1462
+ .orynn-separator[data-orientation="vertical"] {
1463
+ inline-size: 1px;
1464
+ align-self: stretch;
1465
+ block-size: 100%;
1466
+ }
1467
+ /* --- Separator: dashed + labelled (additive) */
1468
+ .orynn-separator[data-variant="dashed"] {
1469
+ background: transparent;
1470
+ }
1471
+ .orynn-separator[data-variant="dashed"][data-orientation="horizontal"] {
1472
+ border-block-start: 1px dashed var(--orynn-color-border);
1473
+ block-size: 0;
1474
+ }
1475
+ .orynn-separator[data-variant="dashed"][data-orientation="vertical"] {
1476
+ border-inline-start: 1px dashed var(--orynn-color-border);
1477
+ inline-size: 0;
1478
+ }
1479
+ .orynn-separator--labelled {
1480
+ display: flex;
1481
+ align-items: center;
1482
+ gap: 0.75rem;
1483
+ background: transparent;
1484
+ block-size: auto;
1485
+ }
1486
+ .orynn-separator--labelled::before,
1487
+ .orynn-separator--labelled::after {
1488
+ content: "";
1489
+ flex: 1 1 auto;
1490
+ block-size: 1px;
1491
+ background: var(--orynn-color-border);
1492
+ }
1493
+ .orynn-separator--labelled[data-variant="dashed"]::before,
1494
+ .orynn-separator--labelled[data-variant="dashed"]::after {
1495
+ background: transparent;
1496
+ border-block-start: 1px dashed var(--orynn-color-border);
1497
+ }
1498
+ .orynn-separator__label {
1499
+ flex: 0 0 auto;
1500
+ font-size: var(--orynn-font-size-sm);
1501
+ color: var(--orynn-color-muted-foreground);
1502
+ }
1503
+
1504
+ /* ------------------------------------------------------------- table ---- */
1505
+
1506
+ .orynn-table__wrap {
1507
+ position: relative;
1508
+ inline-size: 100%;
1509
+ overflow-x: auto;
1510
+ }
1511
+ .orynn-table {
1512
+ inline-size: 100%;
1513
+ caption-side: bottom;
1514
+ border-collapse: collapse;
1515
+ font-family: var(--orynn-font-family);
1516
+ font-size: var(--orynn-font-size);
1517
+ color: var(--orynn-color-foreground);
1518
+ }
1519
+ .orynn-table__header tr {
1520
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1521
+ }
1522
+ .orynn-table__body tr:last-child {
1523
+ border-block-end: 0;
1524
+ }
1525
+ .orynn-table__footer {
1526
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
1527
+ background: color-mix(in oklch, var(--orynn-color-muted) 50%, transparent);
1528
+ font-weight: 500;
1529
+ }
1530
+ .orynn-table__row {
1531
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1532
+ transition: background-color var(--orynn-transition);
1533
+ }
1534
+ .orynn-table__row:hover {
1535
+ background: color-mix(in oklch, var(--orynn-color-muted) 50%, transparent);
1536
+ }
1537
+ .orynn-table__row[data-state="selected"] {
1538
+ background: var(--orynn-color-muted);
1539
+ }
1540
+ .orynn-table__head {
1541
+ block-size: 2.5rem;
1542
+ padding: 0 0.5rem;
1543
+ text-align: start;
1544
+ vertical-align: middle;
1545
+ font-weight: 500;
1546
+ white-space: nowrap;
1547
+ color: var(--orynn-color-foreground);
1548
+ }
1549
+ .orynn-table__cell {
1550
+ padding: 0.5rem;
1551
+ vertical-align: middle;
1552
+ white-space: nowrap;
1553
+ }
1554
+ .orynn-table__caption {
1555
+ margin-block-start: 1rem;
1556
+ font-size: var(--orynn-font-size);
1557
+ color: var(--orynn-color-muted-foreground);
1558
+ }
1559
+ /* --- Table: compact size + sticky header (additive) */
1560
+ .orynn-table[data-size="sm"] .orynn-table__head {
1561
+ block-size: 2rem;
1562
+ font-size: var(--orynn-font-size-sm);
1563
+ }
1564
+ .orynn-table[data-size="sm"] .orynn-table__cell {
1565
+ padding: 0.3rem 0.5rem;
1566
+ font-size: var(--orynn-font-size-sm);
1567
+ }
1568
+ .orynn-table__header[data-sticky] {
1569
+ position: sticky;
1570
+ inset-block-start: 0;
1571
+ z-index: 1;
1572
+ background: var(--orynn-color-card);
1573
+ }
1574
+
1575
+ /* ------------------------------------------------------------ switch ---- */
1576
+
1577
+ .orynn-switch {
1578
+ display: inline-flex;
1579
+ flex-shrink: 0;
1580
+ align-items: center;
1581
+ box-sizing: border-box;
1582
+ block-size: 1.15rem;
1583
+ inline-size: 2rem;
1584
+ padding: 0;
1585
+ border: var(--orynn-border-width) solid transparent;
1586
+ border-radius: 9999px;
1587
+ background: var(--orynn-color-input);
1588
+ box-shadow: var(--orynn-shadow-xs);
1589
+ cursor: pointer;
1590
+ outline: none;
1591
+ transition: var(--orynn-transition);
1592
+ }
1593
+ .orynn-switch[data-size="sm"] {
1594
+ block-size: 0.875rem;
1595
+ inline-size: 1.5rem;
1596
+ }
1597
+ [data-orynn-color-scheme="dark"] .orynn-switch,
1598
+ .dark .orynn-switch {
1599
+ background: color-mix(in oklch, var(--orynn-color-input) 80%, transparent);
1600
+ }
1601
+ .orynn-switch[data-state="checked"] {
1602
+ background: var(--orynn-color-primary);
1603
+ }
1604
+ .orynn-switch:focus-visible {
1605
+ border-color: var(--orynn-color-ring);
1606
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1607
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1608
+ }
1609
+ .orynn-switch:disabled {
1610
+ cursor: not-allowed;
1611
+ opacity: 0.5;
1612
+ }
1613
+ .orynn-switch__thumb {
1614
+ display: block;
1615
+ block-size: 1rem;
1616
+ inline-size: 1rem;
1617
+ border-radius: 9999px;
1618
+ background: var(--orynn-color-background);
1619
+ pointer-events: none;
1620
+ transform: translateX(0);
1621
+ transition: transform var(--orynn-transition);
1622
+ }
1623
+ .orynn-switch[data-size="sm"] .orynn-switch__thumb {
1624
+ block-size: 0.75rem;
1625
+ inline-size: 0.75rem;
1626
+ }
1627
+ .orynn-switch[data-state="checked"] .orynn-switch__thumb {
1628
+ transform: translateX(calc(100% - 2px));
1629
+ }
1630
+ [data-orynn-color-scheme="dark"] .orynn-switch[data-state="checked"] .orynn-switch__thumb,
1631
+ .dark .orynn-switch[data-state="checked"] .orynn-switch__thumb {
1632
+ background: var(--orynn-color-primary-foreground);
1633
+ }
1634
+ [data-orynn-color-scheme="dark"] .orynn-switch[data-state="unchecked"] .orynn-switch__thumb,
1635
+ .dark .orynn-switch[data-state="unchecked"] .orynn-switch__thumb {
1636
+ background: var(--orynn-color-foreground);
1637
+ }
1638
+
1639
+ /* --- Switch: lg size, thumb icon, on/off text, label layout (additive) */
1640
+ .orynn-switch[data-size="lg"] {
1641
+ block-size: 1.5rem;
1642
+ inline-size: 2.75rem;
1643
+ }
1644
+ .orynn-switch[data-size="lg"] .orynn-switch__thumb {
1645
+ block-size: 1.25rem;
1646
+ inline-size: 1.25rem;
1647
+ }
1648
+ .orynn-switch__thumb {
1649
+ display: inline-flex;
1650
+ align-items: center;
1651
+ justify-content: center;
1652
+ }
1653
+ .orynn-switch__thumb > svg {
1654
+ inline-size: 0.7rem;
1655
+ block-size: 0.7rem;
1656
+ color: var(--orynn-color-muted-foreground);
1657
+ }
1658
+ .orynn-switch__text {
1659
+ position: absolute;
1660
+ font-size: 0.6rem;
1661
+ font-weight: 600;
1662
+ color: var(--orynn-color-primary-foreground);
1663
+ pointer-events: none;
1664
+ line-height: 1;
1665
+ }
1666
+ .orynn-switch__text--on {
1667
+ inset-inline-start: 0.3rem;
1668
+ opacity: 0;
1669
+ }
1670
+ .orynn-switch__text--off {
1671
+ inset-inline-end: 0.3rem;
1672
+ color: var(--orynn-color-muted-foreground);
1673
+ opacity: 1;
1674
+ }
1675
+ .orynn-switch[data-state="checked"] .orynn-switch__text--on {
1676
+ opacity: 1;
1677
+ }
1678
+ .orynn-switch[data-state="checked"] .orynn-switch__text--off {
1679
+ opacity: 0;
1680
+ }
1681
+ .orynn-switch-field {
1682
+ display: inline-flex;
1683
+ align-items: flex-start;
1684
+ gap: 0.625rem;
1685
+ cursor: pointer;
1686
+ font-family: var(--orynn-font-family);
1687
+ }
1688
+ .orynn-switch-field[data-placement="start"] {
1689
+ flex-direction: row-reverse;
1690
+ }
1691
+ .orynn-switch-field__text {
1692
+ display: flex;
1693
+ flex-direction: column;
1694
+ gap: 0.15rem;
1695
+ }
1696
+ .orynn-switch-field__label {
1697
+ font-size: var(--orynn-font-size-sm);
1698
+ font-weight: 500;
1699
+ color: var(--orynn-color-foreground);
1700
+ line-height: 1.2;
1701
+ }
1702
+ .orynn-switch-field__description {
743
1703
  font-size: var(--orynn-help-font-size);
1704
+ color: var(--orynn-color-muted-foreground);
1705
+ }
1706
+ .orynn-switch-field:has(.orynn-switch:disabled) {
1707
+ cursor: not-allowed;
1708
+ opacity: 0.6;
1709
+ }
1710
+
1711
+ /* -------------------------------------------------------------- tabs ---- */
1712
+
1713
+ .orynn-tabs {
1714
+ display: flex;
1715
+ flex-direction: column;
1716
+ gap: 0.5rem;
1717
+ }
1718
+ .orynn-tabs[data-orientation="vertical"] {
1719
+ flex-direction: row;
1720
+ }
1721
+ .orynn-tabs__list {
1722
+ display: inline-flex;
1723
+ inline-size: fit-content;
1724
+ align-items: center;
1725
+ justify-content: center;
1726
+ box-sizing: border-box;
1727
+ block-size: var(--orynn-control-h);
1728
+ padding: 3px;
1729
+ border-radius: var(--orynn-radius-lg);
1730
+ background: var(--orynn-color-muted);
1731
+ color: var(--orynn-color-muted-foreground);
1732
+ }
1733
+ .orynn-tabs[data-orientation="vertical"] .orynn-tabs__list {
1734
+ flex-direction: column;
1735
+ block-size: auto;
1736
+ }
1737
+ .orynn-tabs__trigger {
1738
+ display: inline-flex;
1739
+ flex: 1 1 auto;
1740
+ align-items: center;
1741
+ justify-content: center;
1742
+ gap: 0.375rem;
1743
+ block-size: calc(100% - 1px);
1744
+ padding: 0.25rem 0.5rem;
1745
+ border: var(--orynn-border-width) solid transparent;
1746
+ border-radius: var(--orynn-radius-md);
1747
+ background: transparent;
1748
+ color: color-mix(in oklch, var(--orynn-color-foreground) 60%, transparent);
1749
+ font-family: var(--orynn-font-family);
1750
+ font-size: var(--orynn-font-size);
1751
+ font-weight: 500;
1752
+ white-space: nowrap;
1753
+ cursor: pointer;
1754
+ outline: none;
1755
+ transition: var(--orynn-transition);
1756
+ }
1757
+ .orynn-tabs__trigger:hover {
1758
+ color: var(--orynn-color-foreground);
1759
+ }
1760
+ .orynn-tabs__trigger[data-state="active"] {
1761
+ background: var(--orynn-color-background);
1762
+ color: var(--orynn-color-foreground);
1763
+ box-shadow: var(--orynn-shadow-sm);
1764
+ }
1765
+ [data-orynn-color-scheme="dark"] .orynn-tabs__trigger[data-state="active"],
1766
+ .dark .orynn-tabs__trigger[data-state="active"] {
1767
+ background: color-mix(in oklch, var(--orynn-color-input) 30%, transparent);
1768
+ border-color: var(--orynn-color-input);
1769
+ }
1770
+ .orynn-tabs__trigger:focus-visible {
1771
+ border-color: var(--orynn-color-ring);
1772
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1773
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1774
+ }
1775
+ .orynn-tabs__trigger:disabled {
1776
+ pointer-events: none;
1777
+ opacity: 0.5;
1778
+ }
1779
+ .orynn-tabs__trigger > svg {
1780
+ inline-size: 1rem;
1781
+ block-size: 1rem;
1782
+ flex-shrink: 0;
1783
+ pointer-events: none;
1784
+ }
1785
+ .orynn-tabs__content {
1786
+ flex: 1 1 auto;
1787
+ outline: none;
1788
+ }
1789
+
1790
+ /* --- Tabs: size / fitted / variant (additive; pill is the untouched default) */
1791
+ .orynn-tabs[data-size="sm"] .orynn-tabs__list {
1792
+ block-size: var(--orynn-control-h-sm);
1793
+ }
1794
+ .orynn-tabs[data-size="lg"] .orynn-tabs__list {
1795
+ block-size: var(--orynn-control-h-lg);
1796
+ }
1797
+ .orynn-tabs[data-size="sm"] .orynn-tabs__trigger {
1798
+ font-size: var(--orynn-font-size-sm);
1799
+ }
1800
+ .orynn-tabs[data-size="lg"] .orynn-tabs__trigger {
1801
+ font-size: var(--orynn-font-size-lg);
1802
+ }
1803
+ .orynn-tabs[data-fitted] .orynn-tabs__list {
1804
+ display: flex;
1805
+ inline-size: 100%;
1806
+ }
1807
+ .orynn-tabs[data-variant="underline"] .orynn-tabs__list {
1808
+ background: transparent;
1809
+ padding: 0;
1810
+ border-radius: 0;
1811
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1812
+ gap: 0.25rem;
1813
+ }
1814
+ .orynn-tabs[data-variant="underline"] .orynn-tabs__trigger {
1815
+ border-radius: 0;
1816
+ border-block-end: 2px solid transparent;
1817
+ margin-block-end: -1px;
1818
+ }
1819
+ .orynn-tabs[data-variant="underline"] .orynn-tabs__trigger[data-state="active"] {
1820
+ background: transparent;
1821
+ box-shadow: none;
1822
+ border-block-end-color: var(--orynn-color-primary);
1823
+ color: var(--orynn-color-foreground);
1824
+ }
1825
+ .orynn-tabs[data-variant="enclosed"] .orynn-tabs__list {
1826
+ background: transparent;
1827
+ padding: 0;
1828
+ border-radius: 0;
1829
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1830
+ gap: 0.25rem;
1831
+ }
1832
+ .orynn-tabs[data-variant="enclosed"] .orynn-tabs__trigger {
1833
+ border: var(--orynn-border-width) solid transparent;
1834
+ border-end-start-radius: 0;
1835
+ border-end-end-radius: 0;
1836
+ margin-block-end: -1px;
1837
+ }
1838
+ .orynn-tabs[data-variant="enclosed"] .orynn-tabs__trigger[data-state="active"] {
1839
+ background: var(--orynn-color-background);
1840
+ box-shadow: none;
1841
+ border-color: var(--orynn-color-border);
1842
+ border-block-end-color: var(--orynn-color-background);
1843
+ }
1844
+
1845
+ /* ------------------------------------------------------------ dialog ---- */
1846
+
1847
+ .orynn-dialog__overlay {
1848
+ position: fixed;
1849
+ inset: 0;
1850
+ z-index: var(--orynn-z-overlay);
1851
+ background: var(--orynn-color-scrim);
1852
+ }
1853
+ .orynn-dialog__content {
1854
+ position: fixed;
1855
+ inset-block-start: 50%;
1856
+ inset-inline-start: 50%;
1857
+ translate: -50% -50%;
1858
+ z-index: var(--orynn-z-modal);
1859
+ display: grid;
1860
+ gap: 1rem;
1861
+ inline-size: 100%;
1862
+ max-inline-size: calc(100% - 2rem);
1863
+ box-sizing: border-box;
1864
+ padding: 1.5rem;
1865
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1866
+ border-radius: var(--orynn-radius-lg);
1867
+ background: var(--orynn-color-background);
1868
+ color: var(--orynn-color-foreground);
1869
+ box-shadow: var(--orynn-shadow-lg);
1870
+ font-family: var(--orynn-font-family);
1871
+ font-size: var(--orynn-font-size);
1872
+ animation-duration: var(--orynn-duration-modal);
1873
+ animation-timing-function: var(--orynn-ease);
1874
+ }
1875
+ @media (min-width: 40rem) {
1876
+ .orynn-dialog__content {
1877
+ max-inline-size: 32rem;
1878
+ }
1879
+ }
1880
+ .orynn-dialog__content[data-state="open"] {
1881
+ animation-name: orynn-enter;
1882
+ --orynn-enter-opacity: 0;
1883
+ --orynn-enter-scale: 0.95;
1884
+ }
1885
+ .orynn-dialog__content[data-state="closed"] {
1886
+ animation-name: orynn-exit;
1887
+ --orynn-exit-opacity: 0;
1888
+ --orynn-exit-scale: 0.95;
1889
+ }
1890
+ /* size / scrollable (additive; unset === the 40rem default above) */
1891
+ @media (min-width: 40rem) {
1892
+ .orynn-dialog__content[data-size="sm"] {
1893
+ max-inline-size: 24rem;
1894
+ }
1895
+ .orynn-dialog__content[data-size="md"] {
1896
+ max-inline-size: 28rem;
1897
+ }
1898
+ .orynn-dialog__content[data-size="lg"] {
1899
+ max-inline-size: 32rem;
1900
+ }
1901
+ .orynn-dialog__content[data-size="xl"] {
1902
+ max-inline-size: 42rem;
1903
+ }
1904
+ }
1905
+ .orynn-dialog__content[data-size="full"] {
1906
+ max-inline-size: calc(100% - 2rem);
1907
+ max-block-size: calc(100% - 2rem);
1908
+ }
1909
+ .orynn-dialog__content[data-scrollable] {
1910
+ max-block-size: calc(100dvh - 4rem);
1911
+ overflow-y: auto;
1912
+ }
1913
+ .orynn-dialog__close {
1914
+ position: absolute;
1915
+ inset-block-start: 1rem;
1916
+ inset-inline-end: 1rem;
1917
+ display: inline-flex;
1918
+ align-items: center;
1919
+ justify-content: center;
1920
+ inline-size: 1.5rem;
1921
+ block-size: 1.5rem;
1922
+ border: 0;
1923
+ border-radius: var(--orynn-radius-sm);
1924
+ background: transparent;
1925
+ color: inherit;
1926
+ opacity: 0.7;
1927
+ cursor: pointer;
1928
+ transition: opacity var(--orynn-transition);
1929
+ }
1930
+ .orynn-dialog__close:hover {
1931
+ opacity: 1;
1932
+ }
1933
+ .orynn-dialog__close:focus-visible {
1934
+ outline: none;
1935
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1936
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1937
+ }
1938
+ .orynn-dialog__close > svg {
1939
+ inline-size: 1rem;
1940
+ block-size: 1rem;
1941
+ }
1942
+ .orynn-dialog__header {
1943
+ display: flex;
1944
+ flex-direction: column;
1945
+ gap: 0.5rem;
1946
+ text-align: center;
1947
+ }
1948
+ .orynn-dialog__footer {
1949
+ display: flex;
1950
+ flex-direction: column-reverse;
1951
+ gap: 0.5rem;
1952
+ }
1953
+ @media (min-width: 40rem) {
1954
+ .orynn-dialog__header {
1955
+ text-align: start;
1956
+ }
1957
+ .orynn-dialog__footer {
1958
+ flex-direction: row;
1959
+ justify-content: flex-end;
1960
+ }
1961
+ }
1962
+ .orynn-dialog__title {
1963
+ font-size: var(--orynn-font-size-lg);
1964
+ font-weight: 600;
1965
+ line-height: 1;
1966
+ }
1967
+ .orynn-dialog__description {
1968
+ font-size: var(--orynn-font-size);
1969
+ color: var(--orynn-color-muted-foreground);
1970
+ }
1971
+
1972
+ /* -------------------------------------------------- popover (primitive) -- */
1973
+
1974
+ .orynn-popover__content {
1975
+ z-index: var(--orynn-z-popover);
1976
+ inline-size: 18rem;
1977
+ box-sizing: border-box;
1978
+ padding: 1rem;
1979
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1980
+ border-radius: var(--orynn-radius-md);
1981
+ background: var(--orynn-color-popover);
1982
+ color: var(--orynn-color-popover-foreground);
1983
+ box-shadow: var(--orynn-shadow-md);
1984
+ font-family: var(--orynn-font-family);
1985
+ font-size: var(--orynn-font-size);
1986
+ outline: none;
1987
+ }
1988
+ .orynn-popover__arrow {
1989
+ fill: var(--orynn-color-popover);
1990
+ }
1991
+
1992
+ /* ----------------------------------------------------------- tooltip ---- */
1993
+
1994
+ .orynn-tooltip__content {
1995
+ z-index: var(--orynn-z-popover);
1996
+ inline-size: fit-content;
1997
+ max-inline-size: 20rem;
1998
+ padding: 0.375rem 0.75rem;
1999
+ border-radius: var(--orynn-radius-md);
2000
+ background: var(--orynn-color-foreground);
2001
+ color: var(--orynn-color-background);
2002
+ font-family: var(--orynn-font-family);
2003
+ font-size: var(--orynn-font-size-sm);
2004
+ line-height: 1.3;
2005
+ text-wrap: balance;
2006
+ }
2007
+ .orynn-tooltip__arrow {
2008
+ fill: var(--orynn-color-foreground);
2009
+ }
2010
+
2011
+ /* ------------------------------------------------------ dropdown menu ---- */
2012
+
2013
+ .orynn-menu__content {
2014
+ z-index: var(--orynn-z-popover);
2015
+ min-inline-size: 8rem;
2016
+ max-block-size: var(--radix-dropdown-menu-content-available-height);
2017
+ overflow-x: hidden;
2018
+ overflow-y: auto;
2019
+ box-sizing: border-box;
2020
+ padding: 0.25rem;
2021
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
2022
+ border-radius: var(--orynn-radius-md);
2023
+ background: var(--orynn-color-popover);
2024
+ color: var(--orynn-color-popover-foreground);
2025
+ box-shadow: var(--orynn-shadow-md);
2026
+ font-family: var(--orynn-font-family);
2027
+ font-size: var(--orynn-font-size);
2028
+ }
2029
+ .orynn-menu__sub-content {
2030
+ box-shadow: var(--orynn-shadow-lg);
2031
+ }
2032
+ .orynn-menu__item {
2033
+ position: relative;
2034
+ display: flex;
2035
+ align-items: center;
2036
+ gap: 0.5rem;
2037
+ padding: 0.375rem 0.5rem;
2038
+ border-radius: var(--orynn-radius-sm);
2039
+ font-size: var(--orynn-font-size);
2040
+ line-height: 1.35;
2041
+ cursor: default;
2042
+ user-select: none;
2043
+ outline: none;
2044
+ }
2045
+ .orynn-menu__item[data-inset],
2046
+ .orynn-menu__item--check {
2047
+ padding-inline-start: 2rem;
2048
+ }
2049
+ .orynn-menu__item[data-highlighted] {
2050
+ background: var(--orynn-color-accent);
2051
+ color: var(--orynn-color-accent-foreground);
2052
+ }
2053
+ .orynn-menu__item[data-disabled] {
2054
+ pointer-events: none;
2055
+ opacity: 0.5;
2056
+ }
2057
+ .orynn-menu__item > svg {
2058
+ inline-size: 1rem;
2059
+ block-size: 1rem;
2060
+ flex-shrink: 0;
2061
+ pointer-events: none;
2062
+ }
2063
+ .orynn-menu__item[data-variant="destructive"] {
2064
+ color: var(--orynn-color-destructive);
2065
+ }
2066
+ .orynn-menu__item[data-variant="destructive"][data-highlighted] {
2067
+ background: color-mix(in oklch, var(--orynn-color-destructive) 10%, transparent);
2068
+ color: var(--orynn-color-destructive);
2069
+ }
2070
+ .orynn-menu__indicator {
2071
+ position: absolute;
2072
+ inset-inline-start: 0.5rem;
2073
+ display: inline-flex;
2074
+ align-items: center;
2075
+ justify-content: center;
2076
+ inline-size: 0.875rem;
2077
+ block-size: 0.875rem;
2078
+ }
2079
+ .orynn-menu__indicator > svg {
2080
+ inline-size: 0.875rem;
2081
+ block-size: 0.875rem;
2082
+ }
2083
+ .orynn-menu__indicator .orynn-menu__dot {
2084
+ inline-size: 0.5rem;
2085
+ block-size: 0.5rem;
2086
+ fill: currentColor;
2087
+ }
2088
+ .orynn-menu__label {
2089
+ padding: 0.375rem 0.5rem;
2090
+ font-size: var(--orynn-font-size);
2091
+ font-weight: 500;
2092
+ }
2093
+ .orynn-menu__label[data-inset] {
2094
+ padding-inline-start: 2rem;
2095
+ }
2096
+ .orynn-menu__separator {
2097
+ block-size: 1px;
2098
+ margin: 0.25rem -0.25rem;
2099
+ background: var(--orynn-color-border);
2100
+ }
2101
+ .orynn-menu__shortcut {
2102
+ margin-inline-start: auto;
2103
+ font-size: var(--orynn-font-size-sm);
2104
+ letter-spacing: 0.1em;
2105
+ color: var(--orynn-color-muted-foreground);
2106
+ }
2107
+ .orynn-menu__sub-trigger[data-state="open"] {
2108
+ background: var(--orynn-color-accent);
2109
+ color: var(--orynn-color-accent-foreground);
2110
+ }
2111
+ .orynn-menu__sub-chevron {
2112
+ margin-inline-start: auto;
2113
+ }
2114
+
2115
+ /* --------------------------------------------------------- popover ------ *
2116
+ * legacy anchored popover — the positioner for <Dropdown> / <DatePicker>.
2117
+ * (The public <Popover> primitive uses .orynn-popover__content — phase 6.) */
2118
+
2119
+ .orynn-popover {
2120
+ position: fixed;
2121
+ z-index: var(--orynn-z-popover);
2122
+ background: var(--orynn-color-popover);
2123
+ color: var(--orynn-color-popover-foreground);
2124
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
2125
+ border-radius: var(--orynn-radius-md);
2126
+ box-shadow: var(--orynn-shadow-md);
2127
+ font-family: var(--orynn-font-family);
2128
+ font-size: var(--orynn-font-size);
2129
+ overflow: hidden;
2130
+ transform-origin: top center;
2131
+ animation: orynn-pop 150ms var(--orynn-ease);
2132
+ }
2133
+
2134
+ /* ---------------------------------------------------------- select ----- */
2135
+
2136
+ .orynn-select__value {
2137
+ display: flex;
2138
+ flex: 1 1 auto;
2139
+ min-inline-size: 0;
2140
+ align-items: center;
2141
+ gap: 0.4rem;
2142
+ padding: 0 var(--orynn-control-px);
2143
+ overflow: hidden;
2144
+ }
2145
+ .orynn-select__value--placeholder {
2146
+ color: var(--orynn-color-muted-foreground);
2147
+ }
2148
+ .orynn-select__single {
2149
+ white-space: nowrap;
2150
+ overflow: hidden;
2151
+ text-overflow: ellipsis;
2152
+ }
2153
+ .orynn-select__search {
2154
+ flex: 1 1 4rem;
2155
+ min-inline-size: 2rem;
2156
+ border: 0;
2157
+ outline: 0;
2158
+ background: transparent;
2159
+ font: inherit;
2160
+ color: inherit;
2161
+ padding: 0;
2162
+ }
2163
+ .orynn-select__chips {
2164
+ display: flex;
2165
+ flex-wrap: wrap;
2166
+ gap: 0.3rem;
2167
+ align-items: center;
2168
+ }
2169
+ .orynn-select__chip {
2170
+ display: inline-flex;
2171
+ align-items: center;
2172
+ gap: 0.25rem;
2173
+ background: var(--orynn-color-secondary);
2174
+ color: var(--orynn-color-secondary-foreground);
2175
+ border-radius: var(--orynn-radius-sm);
2176
+ padding: 0.125rem 0.25rem 0.125rem 0.5rem;
2177
+ font-size: var(--orynn-font-size-sm);
2178
+ max-inline-size: 12rem;
2179
+ }
2180
+ .orynn-select__chip span {
2181
+ overflow: hidden;
2182
+ text-overflow: ellipsis;
2183
+ white-space: nowrap;
2184
+ }
2185
+ .orynn-select__chip button {
2186
+ display: inline-flex;
2187
+ border: 0;
2188
+ background: transparent;
2189
+ color: inherit;
2190
+ cursor: pointer;
2191
+ padding: 0.1rem;
2192
+ border-radius: 9999px;
2193
+ }
2194
+ .orynn-select__chip button:hover {
2195
+ background: color-mix(in oklch, var(--orynn-color-secondary-foreground) 15%, transparent);
2196
+ }
2197
+ .orynn-select__chevron {
2198
+ transition: transform var(--orynn-transition);
2199
+ }
2200
+ .orynn-box[data-focused] .orynn-select__chevron,
2201
+ .orynn-box[data-open] .orynn-select__chevron {
2202
+ transform: rotate(180deg);
2203
+ }
2204
+
2205
+ .orynn-listbox {
2206
+ max-block-size: min(18rem, 60vh);
2207
+ overflow-y: auto;
2208
+ overscroll-behavior: contain;
2209
+ padding: 0.25rem;
2210
+ scroll-padding-block: 0.25rem;
2211
+ outline: none;
2212
+ scrollbar-width: thin;
2213
+ scrollbar-color: var(--orynn-color-border) transparent;
2214
+ }
2215
+ .orynn-listbox::-webkit-scrollbar {
2216
+ inline-size: 0.55rem;
2217
+ }
2218
+ .orynn-listbox::-webkit-scrollbar-thumb {
2219
+ background: var(--orynn-color-border);
2220
+ border-radius: var(--orynn-radius-pill);
2221
+ border: 3px solid transparent;
2222
+ background-clip: content-box;
2223
+ }
2224
+ .orynn-listbox__empty {
2225
+ padding: 1rem 0.75rem;
2226
+ text-align: center;
2227
+ color: var(--orynn-color-muted-foreground);
2228
+ font-size: var(--orynn-help-font-size);
2229
+ }
2230
+ .orynn-listbox__group {
2231
+ padding: 0.375rem 0.5rem;
2232
+ font-size: var(--orynn-font-size-sm);
2233
+ color: var(--orynn-color-muted-foreground);
2234
+ position: sticky;
2235
+ inset-block-start: -0.25rem;
2236
+ background: var(--orynn-color-popover);
2237
+ z-index: 1;
2238
+ }
2239
+ .orynn-option {
2240
+ display: flex;
2241
+ align-items: center;
2242
+ gap: 0.5rem;
2243
+ padding: 0.375rem 0.5rem;
2244
+ border-radius: var(--orynn-radius-sm);
2245
+ cursor: pointer;
2246
+ color: var(--orynn-color-popover-foreground);
2247
+ line-height: 1.35;
2248
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2249
+ }
2250
+ .orynn-option__body {
2251
+ display: flex;
2252
+ flex-direction: column;
2253
+ gap: 0.05rem;
2254
+ flex: 1 1 auto;
2255
+ min-inline-size: 0;
2256
+ }
2257
+ .orynn-option__label {
2258
+ overflow: hidden;
2259
+ text-overflow: ellipsis;
2260
+ white-space: nowrap;
2261
+ }
2262
+ .orynn-option__label mark {
2263
+ background: transparent;
2264
+ color: var(--orynn-color-primary);
2265
+ font-weight: 600;
2266
+ }
2267
+ .orynn-option__desc {
2268
+ font-size: var(--orynn-help-font-size);
2269
+ color: var(--orynn-color-muted-foreground);
2270
+ overflow: hidden;
2271
+ text-overflow: ellipsis;
2272
+ white-space: nowrap;
2273
+ }
2274
+ .orynn-option[data-active] {
2275
+ background: var(--orynn-color-accent);
2276
+ color: var(--orynn-color-accent-foreground);
2277
+ }
2278
+ .orynn-option[data-active] .orynn-option__desc {
2279
+ color: inherit;
2280
+ }
2281
+ .orynn-option[data-selected] {
2282
+ font-weight: 500;
2283
+ }
2284
+ .orynn-option[data-disabled] {
2285
+ opacity: 0.5;
2286
+ cursor: not-allowed;
2287
+ }
2288
+ .orynn-option__check {
2289
+ margin-inline-start: auto;
2290
+ color: currentColor;
2291
+ flex: 0 0 auto;
2292
+ }
2293
+ /* creatable row + select-all action — additive, only rendered on opt-in */
2294
+ .orynn-option--create .orynn-option__label {
2295
+ color: var(--orynn-color-primary);
2296
+ font-weight: 500;
2297
+ }
2298
+ .orynn-listbox__action {
2299
+ display: block;
2300
+ inline-size: 100%;
2301
+ text-align: start;
2302
+ border: 0;
2303
+ background: transparent;
2304
+ font: inherit;
2305
+ font-size: var(--orynn-font-size-sm);
2306
+ font-weight: 500;
2307
+ color: var(--orynn-color-primary);
2308
+ padding: 0.375rem 0.5rem;
2309
+ border-radius: var(--orynn-radius-sm);
2310
+ cursor: pointer;
2311
+ position: sticky;
2312
+ inset-block-start: -0.25rem;
2313
+ background: var(--orynn-color-popover);
2314
+ z-index: 1;
2315
+ transition: background-color var(--orynn-transition);
2316
+ }
2317
+ .orynn-listbox__action:hover {
2318
+ background: var(--orynn-color-accent);
2319
+ }
2320
+
2321
+ /* ------------------------------------------------------- datepicker ----- */
2322
+
2323
+ .orynn-calendar {
2324
+ /* Tunables — a theme or the `calendarWidth` prop can override these. */
2325
+ --orynn-calendar-min-width: 0px;
2326
+ --orynn-calendar-day-max: 2.75rem;
2327
+ --orynn-calendar-day-height: 2rem;
2328
+
2329
+ padding: 0.75rem;
2330
+ box-sizing: border-box;
2331
+ /* Natural width — used when the calendar carries extra furniture
2332
+ (multi-month panels, a presets rail, a time column); the popover then
2333
+ sizes to this content instead of to the trigger. */
2334
+ inline-size: max-content;
2335
+ max-inline-size: 100%;
2336
+ color: var(--orynn-color-popover-foreground);
2337
+ user-select: none;
2338
+ }
2339
+ /* `data-fill` (plain single month, or inline): stretch to the host width so the
2340
+ popover matches the trigger and the day columns spread edge-to-edge. */
2341
+ .orynn-calendar[data-fill] {
2342
+ inline-size: 100%;
2343
+ min-inline-size: var(--orynn-calendar-min-width);
2344
+ }
2345
+ .orynn-calendar__header {
2346
+ display: flex;
2347
+ align-items: center;
2348
+ justify-content: space-between;
2349
+ gap: 0.25rem;
2350
+ margin-block-end: 0.5rem;
2351
+ }
2352
+ .orynn-calendar__title {
2353
+ display: flex;
2354
+ flex: 1 1 auto;
2355
+ gap: 0.25rem;
2356
+ justify-content: center;
2357
+ font-weight: 500;
2358
+ font-size: var(--orynn-font-size);
2359
+ }
2360
+ .orynn-calendar__nav {
2361
+ display: inline-flex;
2362
+ flex: 0 0 auto;
2363
+ align-items: center;
2364
+ justify-content: center;
2365
+ inline-size: 2rem;
2366
+ block-size: 2rem;
2367
+ border: 0;
2368
+ background: transparent;
2369
+ border-radius: var(--orynn-radius-md);
2370
+ color: var(--orynn-color-muted-foreground);
2371
+ cursor: pointer;
2372
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2373
+ }
2374
+ .orynn-calendar__nav:hover:not(:disabled) {
2375
+ background: var(--orynn-color-accent);
2376
+ color: var(--orynn-color-accent-foreground);
2377
+ }
2378
+ .orynn-calendar__nav:focus-visible,
2379
+ .orynn-calendar__select:focus-visible,
2380
+ .orynn-calendar__day:focus-visible,
2381
+ .orynn-calendar__action:focus-visible {
2382
+ outline: none;
2383
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2384
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2385
+ }
2386
+ .orynn-calendar__nav:disabled {
2387
+ opacity: 0.5;
2388
+ cursor: not-allowed;
2389
+ }
2390
+ .orynn-calendar__select {
2391
+ appearance: none;
2392
+ -webkit-appearance: none;
2393
+ border: 0;
2394
+ background: transparent;
2395
+ font: inherit;
2396
+ font-weight: 500;
2397
+ color: inherit;
2398
+ cursor: pointer;
2399
+ border-radius: var(--orynn-radius-sm);
2400
+ padding: 0.2rem 0.4rem;
2401
+ transition: background-color var(--orynn-transition);
2402
+ }
2403
+ .orynn-calendar__select:hover {
2404
+ background: var(--orynn-color-accent);
2405
+ }
2406
+ .orynn-calendar__select option {
2407
+ color: var(--orynn-color-popover-foreground);
2408
+ background: var(--orynn-color-popover);
2409
+ }
2410
+ .orynn-calendar__grid {
2411
+ inline-size: 100%;
2412
+ border-collapse: collapse;
2413
+ }
2414
+ /* fill mode: even columns that split the width instead of hugging the digits */
2415
+ .orynn-calendar[data-fill] .orynn-calendar__grid {
2416
+ table-layout: fixed;
2417
+ }
2418
+ .orynn-calendar__grid th {
2419
+ font-size: var(--orynn-font-size-sm);
2420
+ font-weight: 400;
2421
+ color: var(--orynn-color-muted-foreground);
2422
+ padding: 0.3rem 0 0.45rem;
2423
+ text-align: center;
2424
+ }
2425
+ .orynn-calendar__grid td {
2426
+ text-align: center;
2427
+ padding: 0;
2428
+ }
2429
+ .orynn-calendar__weeknum {
2430
+ color: var(--orynn-color-muted-foreground);
2431
+ font-size: var(--orynn-font-size-sm);
2432
+ text-align: center;
2433
+ }
2434
+ .orynn-calendar__day {
2435
+ inline-size: 2rem;
2436
+ block-size: 2rem;
2437
+ border: 0;
2438
+ background: transparent;
2439
+ font: inherit;
2440
+ font-size: var(--orynn-font-size);
2441
+ color: var(--orynn-color-popover-foreground);
2442
+ border-radius: var(--orynn-radius-md);
2443
+ cursor: pointer;
2444
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2445
+ }
2446
+ /* fill mode: the cell spreads to the column; the tap target stays a tidy
2447
+ centred square capped by the token. */
2448
+ .orynn-calendar[data-fill] .orynn-calendar__day {
2449
+ inline-size: 100%;
2450
+ max-inline-size: var(--orynn-calendar-day-max);
2451
+ block-size: var(--orynn-calendar-day-height);
2452
+ margin-inline: auto;
2453
+ }
2454
+ .orynn-calendar__day:hover:not(:disabled):not([data-selected]) {
2455
+ background: var(--orynn-color-accent);
2456
+ color: var(--orynn-color-accent-foreground);
2457
+ }
2458
+ .orynn-calendar__day[data-outside] {
2459
+ color: var(--orynn-color-muted-foreground);
2460
+ opacity: 0.6;
2461
+ }
2462
+ .orynn-calendar__day[data-today]:not([data-selected]) {
2463
+ background: var(--orynn-color-accent);
2464
+ color: var(--orynn-color-accent-foreground);
2465
+ }
2466
+ .orynn-calendar__day[data-selected] {
2467
+ background: var(--orynn-color-primary);
2468
+ color: var(--orynn-color-primary-foreground);
2469
+ font-weight: 500;
2470
+ }
2471
+ .orynn-calendar__day[data-selected]:hover:not(:disabled) {
2472
+ background: color-mix(in oklch, var(--orynn-color-primary) 90%, transparent);
2473
+ }
2474
+ .orynn-calendar__day:disabled {
2475
+ opacity: 0.4;
2476
+ cursor: not-allowed;
2477
+ }
2478
+ /* range mode — additive; only fires when the data-range-* attrs are present */
2479
+ .orynn-calendar__day[data-in-range]:not([data-selected]) {
2480
+ background: color-mix(in oklch, var(--orynn-color-primary) 14%, transparent);
2481
+ color: var(--orynn-color-popover-foreground);
2482
+ border-radius: 0;
2483
+ }
2484
+ .orynn-calendar__day[data-range-start] {
2485
+ border-start-end-radius: 0;
2486
+ border-end-end-radius: 0;
2487
+ }
2488
+ .orynn-calendar__day[data-range-end] {
2489
+ border-start-start-radius: 0;
2490
+ border-end-start-radius: 0;
2491
+ }
2492
+ .orynn-calendar__day[data-range-start][data-range-end] {
2493
+ border-radius: var(--orynn-radius-md);
2494
+ }
2495
+ .orynn-calendar__footer {
2496
+ display: flex;
2497
+ justify-content: space-between;
2498
+ margin-block-start: 0.6rem;
2499
+ padding-block-start: 0.6rem;
2500
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
2501
+ }
2502
+ .orynn-calendar__action {
2503
+ border: 0;
2504
+ background: transparent;
2505
+ color: var(--orynn-color-popover-foreground);
2506
+ font: inherit;
2507
+ font-size: var(--orynn-font-size-sm);
2508
+ font-weight: 500;
2509
+ cursor: pointer;
2510
+ padding: 0.25rem 0.5rem;
2511
+ border-radius: var(--orynn-radius-sm);
2512
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2513
+ }
2514
+ .orynn-calendar__action:hover {
2515
+ background: var(--orynn-color-accent);
2516
+ color: var(--orynn-color-accent-foreground);
2517
+ }
2518
+
2519
+ /* clickable header title (drills day -> month -> year) + the month / year
2520
+ pick grids. Additive: the day grid is unchanged. */
2521
+ button.orynn-calendar__title {
2522
+ border: 0;
2523
+ background: transparent;
2524
+ color: inherit;
2525
+ cursor: pointer;
2526
+ padding: 0.2rem 0.5rem;
2527
+ border-radius: var(--orynn-radius-sm);
2528
+ transition: background-color var(--orynn-transition);
2529
+ }
2530
+ button.orynn-calendar__title:hover:not(:disabled) {
2531
+ background: var(--orynn-color-accent);
2532
+ color: var(--orynn-color-accent-foreground);
2533
+ }
2534
+ button.orynn-calendar__title:disabled {
2535
+ cursor: default;
2536
+ }
2537
+ button.orynn-calendar__title:focus-visible {
2538
+ outline: none;
2539
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2540
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2541
+ }
2542
+ .orynn-calendar__pickgrid {
2543
+ display: flex;
2544
+ flex-direction: column;
2545
+ gap: 0.25rem;
2546
+ padding-block: 0.25rem;
2547
+ min-inline-size: 15.5rem;
2548
+ }
2549
+ .orynn-calendar__pickrow {
2550
+ display: grid;
2551
+ grid-template-columns: repeat(3, 1fr);
2552
+ gap: 0.25rem;
2553
+ }
2554
+ .orynn-calendar__cell {
2555
+ block-size: 2.25rem;
2556
+ border: 0;
2557
+ background: transparent;
2558
+ font: inherit;
2559
+ font-size: var(--orynn-font-size-sm);
2560
+ color: var(--orynn-color-popover-foreground);
2561
+ border-radius: var(--orynn-radius-md);
2562
+ cursor: pointer;
2563
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2564
+ }
2565
+ .orynn-calendar__cell:hover:not(:disabled):not([data-selected]) {
2566
+ background: var(--orynn-color-accent);
2567
+ color: var(--orynn-color-accent-foreground);
2568
+ }
2569
+ .orynn-calendar__cell[data-selected] {
2570
+ background: var(--orynn-color-primary);
2571
+ color: var(--orynn-color-primary-foreground);
2572
+ font-weight: 500;
2573
+ }
2574
+ .orynn-calendar__cell[data-outside] {
2575
+ color: var(--orynn-color-muted-foreground);
2576
+ opacity: 0.6;
2577
+ }
2578
+ .orynn-calendar__cell:disabled {
2579
+ opacity: 0.4;
2580
+ cursor: not-allowed;
2581
+ }
2582
+ .orynn-calendar__cell:focus-visible {
2583
+ outline: none;
2584
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2585
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2586
+ }
2587
+
2588
+ /* multi-month day view (numberOfMonths > 1) — each panel keeps a comfortable
2589
+ natural width instead of being squeezed into the trigger width. */
2590
+ .orynn-calendar__panels {
2591
+ display: flex;
2592
+ gap: 1rem;
2593
+ align-items: flex-start;
2594
+ }
2595
+ .orynn-calendar__panels > .orynn-calendar__grid {
2596
+ flex: 1 1 0;
2597
+ min-inline-size: 14rem;
2598
+ }
2599
+
2600
+ /* preset side rail (only rendered when the `presets` prop is passed) */
2601
+ .orynn-datepicker__panel {
2602
+ display: flex;
2603
+ align-items: stretch;
2604
+ }
2605
+ .orynn-datepicker__panel > .orynn-calendar,
2606
+ .orynn-datepicker__panel > .orynn-datepicker__withtime,
2607
+ .orynn-datepicker__withtime > .orynn-calendar {
2608
+ flex: 1 1 auto;
2609
+ min-inline-size: 0;
2610
+ }
2611
+ .orynn-datepicker__presets {
2612
+ display: flex;
2613
+ flex-direction: column;
2614
+ gap: 0.15rem;
2615
+ padding: 0.75rem 0.5rem;
2616
+ border-inline-end: var(--orynn-border-width) solid var(--orynn-color-border);
2617
+ min-inline-size: 8.5rem;
2618
+ }
2619
+ .orynn-datepicker__preset {
2620
+ border: 0;
2621
+ background: transparent;
2622
+ color: var(--orynn-color-popover-foreground);
2623
+ font: inherit;
2624
+ font-size: var(--orynn-font-size-sm);
2625
+ text-align: start;
2626
+ cursor: pointer;
2627
+ padding: 0.4rem 0.5rem;
2628
+ border-radius: var(--orynn-radius-sm);
2629
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2630
+ }
2631
+ .orynn-datepicker__preset:hover {
2632
+ background: var(--orynn-color-accent);
2633
+ color: var(--orynn-color-accent-foreground);
2634
+ }
2635
+ .orynn-datepicker__preset:focus-visible {
2636
+ outline: none;
2637
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2638
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2639
+ }
2640
+
2641
+ /* time column (showTime) */
2642
+ .orynn-datepicker__withtime {
2643
+ display: flex;
2644
+ align-items: stretch;
2645
+ }
2646
+ .orynn-datepicker__time {
2647
+ display: flex;
2648
+ flex-direction: column;
2649
+ gap: 0.4rem;
2650
+ padding: 0.75rem;
2651
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-border);
2652
+ justify-content: flex-start;
2653
+ }
2654
+ .orynn-datepicker__time-label {
2655
+ font-size: var(--orynn-font-size-sm);
2656
+ font-weight: 500;
2657
+ color: var(--orynn-color-muted-foreground);
2658
+ }
2659
+ .orynn-datepicker__time-fields {
2660
+ display: flex;
2661
+ align-items: center;
2662
+ gap: 0.3rem;
2663
+ color: var(--orynn-color-popover-foreground);
2664
+ }
2665
+ .orynn-datepicker__time-select {
2666
+ appearance: none;
2667
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
2668
+ background: var(--orynn-color-background);
2669
+ color: inherit;
2670
+ font: inherit;
2671
+ font-size: var(--orynn-font-size-sm);
2672
+ border-radius: var(--orynn-radius-sm);
2673
+ padding: 0.25rem 0.4rem;
2674
+ cursor: pointer;
2675
+ }
2676
+ .orynn-datepicker__time-select:focus-visible {
2677
+ outline: none;
2678
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2679
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2680
+ }
2681
+
2682
+ /* -------------------------------------------------- fieldset / grid ----- */
2683
+
2684
+ .orynn-fieldset {
2685
+ min-inline-size: 0;
2686
+ margin: 0;
2687
+ padding: 0;
2688
+ border: 0;
2689
+ font-family: var(--orynn-font-family);
2690
+ color: var(--orynn-color-foreground);
2691
+ }
2692
+ .orynn-fieldset__legend {
2693
+ padding: 0;
2694
+ margin-block-end: var(--orynn-space-md, 0.75rem);
2695
+ font-size: var(--orynn-font-size-lg);
2696
+ font-weight: 600;
2697
+ }
2698
+ /* The active column count (--orynn-cols) is measured and set inline by
2699
+ <FieldGrid>; the stylesheet just consumes it. */
2700
+ .orynn-grid {
2701
+ min-inline-size: 0;
2702
+ }
2703
+ .orynn-grid__track {
2704
+ display: grid;
2705
+ gap: var(--orynn-grid-gap);
2706
+ grid-template-columns: repeat(var(--orynn-cols, 1), minmax(0, 1fr));
2707
+ }
2708
+ .orynn-grid__item {
2709
+ grid-column: span var(--orynn-span, 1);
2710
+ min-inline-size: 0;
2711
+ }
2712
+
2713
+ /* ========================================================= 0.6 additions == */
2714
+
2715
+ /* --------------------------------------------------------- accordion ---- */
2716
+
2717
+ .orynn-accordion {
2718
+ --orynn-accordion-trigger-py: 0.875rem;
2719
+ --orynn-accordion-trigger-px: 0.125rem;
2720
+ --orynn-accordion-font-size: var(--orynn-font-size);
2721
+ --orynn-accordion-body-pb: 1rem;
2722
+ --orynn-accordion-gap: 0.5rem;
2723
+ --orynn-accordion-radius: var(--orynn-radius-lg);
2724
+ --orynn-accordion-duration: 200ms;
2725
+
2726
+ display: block;
2727
+ inline-size: 100%;
2728
+ color: var(--orynn-color-foreground);
2729
+ font-family: var(--orynn-font-family);
2730
+ }
2731
+ .orynn-accordion[data-size="sm"] {
2732
+ --orynn-accordion-trigger-py: 0.625rem;
2733
+ --orynn-accordion-font-size: var(--orynn-font-size-sm);
2734
+ --orynn-accordion-body-pb: 0.75rem;
2735
+ }
2736
+ .orynn-accordion[data-size="lg"] {
2737
+ --orynn-accordion-trigger-py: 1.125rem;
2738
+ --orynn-accordion-font-size: var(--orynn-font-size-lg);
2739
+ --orynn-accordion-body-pb: 1.25rem;
2740
+ }
2741
+
2742
+ .orynn-accordion__item {
2743
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
2744
+ }
2745
+ .orynn-accordion[data-variant="bordered"] {
2746
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
2747
+ }
2748
+ .orynn-accordion[data-variant="ghost"] .orynn-accordion__item,
2749
+ .orynn-accordion[data-variant="ghost"] {
2750
+ border: 0;
2751
+ }
2752
+ .orynn-accordion[data-variant="separated"] {
2753
+ display: flex;
2754
+ flex-direction: column;
2755
+ gap: var(--orynn-accordion-gap);
2756
+ }
2757
+ .orynn-accordion[data-variant="separated"] .orynn-accordion__item {
2758
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
2759
+ border-radius: var(--orynn-accordion-radius);
2760
+ padding-inline: 1rem;
2761
+ background: var(--orynn-color-card);
2762
+ }
2763
+
2764
+ .orynn-accordion__header {
2765
+ display: flex;
2766
+ margin: 0;
2767
+ }
2768
+ .orynn-accordion__trigger {
2769
+ flex: 1 1 auto;
2770
+ display: flex;
2771
+ align-items: center;
2772
+ gap: 0.75rem;
2773
+ inline-size: 100%;
2774
+ padding-block: var(--orynn-accordion-trigger-py);
2775
+ padding-inline: var(--orynn-accordion-trigger-px);
2776
+ border: 0;
2777
+ background: transparent;
2778
+ font: inherit;
2779
+ font-size: var(--orynn-accordion-font-size);
2780
+ font-weight: 500;
2781
+ color: inherit;
2782
+ text-align: start;
2783
+ cursor: pointer;
2784
+ transition: color var(--orynn-transition);
2785
+ }
2786
+ .orynn-accordion__trigger[data-icon-position="start"] {
2787
+ justify-content: flex-start;
2788
+ }
2789
+ .orynn-accordion__trigger[data-icon-position="end"] .orynn-accordion__label {
2790
+ flex: 1 1 auto;
2791
+ }
2792
+ .orynn-accordion__trigger:hover {
2793
+ color: var(--orynn-color-primary);
2794
+ }
2795
+ .orynn-accordion__trigger:focus-visible {
2796
+ outline: none;
2797
+ border-radius: var(--orynn-radius-sm);
2798
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2799
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2800
+ }
2801
+ .orynn-accordion__trigger:disabled {
2802
+ opacity: 0.5;
2803
+ cursor: not-allowed;
2804
+ }
2805
+ .orynn-accordion__icon {
2806
+ display: inline-flex;
2807
+ flex: 0 0 auto;
2808
+ inline-size: 1rem;
2809
+ block-size: 1rem;
2810
+ color: var(--orynn-color-muted-foreground);
2811
+ transition: transform var(--orynn-accordion-duration) var(--orynn-ease);
2812
+ }
2813
+ .orynn-accordion__icon > svg {
2814
+ inline-size: 100%;
2815
+ block-size: 100%;
2816
+ }
2817
+ .orynn-accordion__trigger[data-state="open"] .orynn-accordion__icon {
2818
+ transform: rotate(180deg);
2819
+ }
2820
+
2821
+ .orynn-accordion__content {
2822
+ overflow: hidden;
2823
+ font-size: var(--orynn-accordion-font-size);
2824
+ color: var(--orynn-color-muted-foreground);
2825
+ }
2826
+ .orynn-accordion__content[data-state="open"] {
2827
+ animation: orynn-accordion-down var(--orynn-accordion-duration) var(--orynn-ease);
2828
+ }
2829
+ .orynn-accordion__content[data-state="closed"] {
2830
+ animation: orynn-accordion-up var(--orynn-accordion-duration) var(--orynn-ease);
2831
+ }
2832
+ .orynn-accordion__body {
2833
+ padding-block: 0 var(--orynn-accordion-body-pb);
2834
+ padding-inline: var(--orynn-accordion-trigger-px);
2835
+ line-height: 1.6;
2836
+ }
2837
+ @keyframes orynn-accordion-down {
2838
+ from {
2839
+ block-size: 0;
2840
+ }
2841
+ to {
2842
+ block-size: var(--radix-accordion-content-height);
2843
+ }
2844
+ }
2845
+ @keyframes orynn-accordion-up {
2846
+ from {
2847
+ block-size: var(--radix-accordion-content-height);
2848
+ }
2849
+ to {
2850
+ block-size: 0;
2851
+ }
2852
+ }
2853
+
2854
+ /* ----------------------------------------------------------- slider ----- */
2855
+
2856
+ .orynn-slider {
2857
+ --orynn-slider-track-size: 0.375rem;
2858
+ --orynn-slider-thumb-size: 1.125rem;
2859
+ --orynn-slider-track-color: var(--orynn-color-muted);
2860
+ --orynn-slider-range-color: var(--orynn-color-primary);
2861
+ --orynn-slider-thumb-color: var(--orynn-color-background);
2862
+ --orynn-slider-thumb-border: var(--orynn-color-primary);
2863
+
2864
+ position: relative;
2865
+ display: flex;
2866
+ align-items: center;
2867
+ inline-size: 100%;
2868
+ touch-action: none;
2869
+ user-select: none;
2870
+ }
2871
+ .orynn-slider[data-size="sm"] {
2872
+ --orynn-slider-track-size: 0.25rem;
2873
+ --orynn-slider-thumb-size: 0.875rem;
2874
+ }
2875
+ .orynn-slider[data-size="lg"] {
2876
+ --orynn-slider-track-size: 0.5rem;
2877
+ --orynn-slider-thumb-size: 1.375rem;
2878
+ }
2879
+ .orynn-slider[data-orientation="vertical"] {
2880
+ flex-direction: column;
2881
+ inline-size: auto;
2882
+ block-size: 12rem;
2883
+ }
2884
+ .orynn-slider[data-disabled] {
2885
+ opacity: 0.5;
2886
+ cursor: not-allowed;
2887
+ }
2888
+
2889
+ .orynn-slider__track {
2890
+ position: relative;
2891
+ flex-grow: 1;
2892
+ border-radius: 999px;
2893
+ background: var(--orynn-slider-track-color);
2894
+ }
2895
+ .orynn-slider[data-orientation="horizontal"] .orynn-slider__track {
2896
+ block-size: var(--orynn-slider-track-size);
2897
+ }
2898
+ .orynn-slider[data-orientation="vertical"] .orynn-slider__track {
2899
+ inline-size: var(--orynn-slider-track-size);
2900
+ }
2901
+ .orynn-slider__range {
2902
+ position: absolute;
2903
+ border-radius: inherit;
2904
+ background: var(--orynn-slider-range-color);
2905
+ transition: none;
2906
+ }
2907
+ .orynn-slider[data-orientation="horizontal"] .orynn-slider__range {
2908
+ block-size: 100%;
2909
+ }
2910
+ .orynn-slider[data-orientation="vertical"] .orynn-slider__range {
2911
+ inline-size: 100%;
2912
+ }
2913
+
2914
+ .orynn-slider__thumb {
2915
+ display: block;
2916
+ inline-size: var(--orynn-slider-thumb-size);
2917
+ block-size: var(--orynn-slider-thumb-size);
2918
+ border-radius: 999px;
2919
+ background: var(--orynn-slider-thumb-color);
2920
+ border: 2px solid var(--orynn-slider-thumb-border);
2921
+ box-shadow: var(--orynn-shadow-sm);
2922
+ cursor: grab;
2923
+ transition: box-shadow var(--orynn-transition);
2924
+ }
2925
+ .orynn-slider__thumb:hover {
2926
+ box-shadow: 0 0 0 4px color-mix(in oklch, var(--orynn-color-ring) 18%, transparent);
2927
+ }
2928
+ .orynn-slider__thumb:focus-visible {
2929
+ outline: none;
2930
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2931
+ color-mix(in oklch, var(--orynn-color-ring) 45%, transparent);
2932
+ }
2933
+ .orynn-slider__thumb:active {
2934
+ cursor: grabbing;
2935
+ }
2936
+
2937
+ .orynn-slider__tick {
2938
+ position: absolute;
2939
+ inline-size: 2px;
2940
+ block-size: 2px;
2941
+ border-radius: 999px;
2942
+ background: color-mix(in oklch, var(--orynn-color-foreground) 30%, transparent);
2943
+ transform: translateX(-50%);
2944
+ inset-block-start: 50%;
2945
+ margin-block-start: -1px;
2946
+ }
2947
+
2948
+ .orynn-slider__tooltip {
2949
+ position: absolute;
2950
+ inset-block-end: calc(100% + 0.5rem);
2951
+ inset-inline-start: 50%;
2952
+ transform: translateX(-50%);
2953
+ padding: 0.15rem 0.4rem;
2954
+ border-radius: var(--orynn-radius-sm);
2955
+ background: var(--orynn-color-foreground);
2956
+ color: var(--orynn-color-background);
2957
+ font-size: var(--orynn-font-size-sm);
2958
+ line-height: 1.2;
2959
+ white-space: nowrap;
2960
+ pointer-events: none;
2961
+ opacity: 0;
2962
+ transition: opacity var(--orynn-transition);
2963
+ }
2964
+ .orynn-slider[data-tooltip="always"] .orynn-slider__tooltip,
2965
+ .orynn-slider[data-tooltip="hover"] .orynn-slider__thumb:hover .orynn-slider__tooltip,
2966
+ .orynn-slider[data-tooltip="hover"] .orynn-slider__thumb:focus-visible .orynn-slider__tooltip {
2967
+ opacity: 1;
2968
+ }
2969
+
2970
+ .orynn-slider__marks {
2971
+ position: absolute;
2972
+ inset-inline: 0;
2973
+ inset-block-start: calc(50% + var(--orynn-slider-thumb-size) / 2 + 0.25rem);
2974
+ block-size: 0;
2975
+ }
2976
+ .orynn-slider__mark {
2977
+ position: absolute;
2978
+ display: flex;
2979
+ flex-direction: column;
2980
+ align-items: center;
2981
+ transform: translateX(-50%);
2982
+ }
2983
+ .orynn-slider__mark-dot {
2984
+ inline-size: 3px;
2985
+ block-size: 3px;
2986
+ border-radius: 999px;
2987
+ background: var(--orynn-color-muted-foreground);
2988
+ }
2989
+ .orynn-slider__mark-label {
2990
+ margin-block-start: 0.35rem;
2991
+ font-size: var(--orynn-font-size-sm);
2992
+ color: var(--orynn-color-muted-foreground);
2993
+ white-space: nowrap;
744
2994
  }
745
- .orynn-listbox__group {
746
- padding: 0.45rem 0.6rem 0.2rem;
747
- font-size: 0.72rem;
748
- font-weight: 700;
749
- text-transform: uppercase;
750
- letter-spacing: 0.04em;
751
- color: var(--orynn-color-text-subtle);
752
- position: sticky;
753
- inset-block-start: -0.35rem;
754
- background: var(--orynn-color-panel-bg);
2995
+
2996
+ /* --------------------------------------------------------- progress ---- */
2997
+
2998
+ .orynn-progress__wrap {
2999
+ inline-size: 100%;
755
3000
  }
756
- .orynn-option {
3001
+ .orynn-progress__meta {
757
3002
  display: flex;
758
- align-items: center;
759
- gap: 0.55rem;
760
- padding: 0.5rem 0.6rem;
761
- border-radius: var(--orynn-radius-sm);
762
- cursor: pointer;
763
- color: var(--orynn-color-text);
764
- line-height: 1.35;
3003
+ justify-content: space-between;
3004
+ gap: 1rem;
3005
+ margin-block-end: 0.4rem;
3006
+ font-size: var(--orynn-font-size-sm);
765
3007
  }
766
- .orynn-option__body {
767
- display: flex;
768
- flex-direction: column;
769
- gap: 0.05rem;
770
- flex: 1 1 auto;
771
- min-inline-size: 0;
3008
+ .orynn-progress__label {
3009
+ color: var(--orynn-color-foreground);
3010
+ font-weight: 500;
772
3011
  }
773
- .orynn-option__label {
3012
+ .orynn-progress__value {
3013
+ color: var(--orynn-color-muted-foreground);
3014
+ font-variant-numeric: tabular-nums;
3015
+ }
3016
+
3017
+ .orynn-progress {
3018
+ --orynn-progress-height: 0.5rem;
3019
+ --orynn-progress-track: var(--orynn-color-muted);
3020
+ --orynn-progress-fill: var(--orynn-color-primary);
3021
+
3022
+ position: relative;
3023
+ display: block;
3024
+ inline-size: 100%;
3025
+ block-size: var(--orynn-progress-height);
774
3026
  overflow: hidden;
775
- text-overflow: ellipsis;
776
- white-space: nowrap;
3027
+ border-radius: 999px;
3028
+ background: var(--orynn-progress-track);
777
3029
  }
778
- .orynn-option__label mark {
3030
+ .orynn-progress[data-size="sm"] {
3031
+ --orynn-progress-height: 0.35rem;
3032
+ }
3033
+ .orynn-progress[data-size="lg"] {
3034
+ --orynn-progress-height: 0.75rem;
3035
+ }
3036
+ .orynn-progress[data-variant="success"] {
3037
+ --orynn-progress-fill: var(--orynn-color-success, oklch(0.62 0.17 145));
3038
+ }
3039
+ .orynn-progress[data-variant="warning"] {
3040
+ --orynn-progress-fill: oklch(0.75 0.15 80);
3041
+ }
3042
+ .orynn-progress[data-variant="destructive"] {
3043
+ --orynn-progress-fill: var(--orynn-color-destructive);
3044
+ }
3045
+
3046
+ .orynn-progress__bar {
3047
+ block-size: 100%;
3048
+ inline-size: 100%;
3049
+ background: var(--orynn-progress-fill);
3050
+ transition: transform 320ms var(--orynn-ease);
3051
+ }
3052
+ .orynn-progress[data-striped] .orynn-progress__bar {
3053
+ background-image: linear-gradient(
3054
+ 45deg,
3055
+ color-mix(in oklch, #fff 18%, transparent) 25%,
3056
+ transparent 25%,
3057
+ transparent 50%,
3058
+ color-mix(in oklch, #fff 18%, transparent) 50%,
3059
+ color-mix(in oklch, #fff 18%, transparent) 75%,
3060
+ transparent 75%,
3061
+ transparent
3062
+ );
3063
+ background-size: 1rem 1rem;
3064
+ }
3065
+ .orynn-progress[data-animated] .orynn-progress__bar {
3066
+ animation: orynn-progress-stripes 1s linear infinite;
3067
+ }
3068
+ .orynn-progress[data-indeterminate] .orynn-progress__bar {
3069
+ inline-size: 40%;
3070
+ transform: none;
3071
+ animation: orynn-progress-indeterminate 1.3s var(--orynn-ease) infinite;
3072
+ }
3073
+ @keyframes orynn-progress-stripes {
3074
+ from {
3075
+ background-position: 0 0;
3076
+ }
3077
+ to {
3078
+ background-position: 1rem 0;
3079
+ }
3080
+ }
3081
+ @keyframes orynn-progress-indeterminate {
3082
+ 0% {
3083
+ margin-inline-start: -40%;
3084
+ }
3085
+ 100% {
3086
+ margin-inline-start: 100%;
3087
+ }
3088
+ }
3089
+
3090
+ /* circular */
3091
+ .orynn-progress--circle {
3092
+ block-size: auto;
3093
+ inline-size: auto;
3094
+ overflow: visible;
779
3095
  background: transparent;
780
- color: var(--orynn-color-accent);
781
- font-weight: 700;
3096
+ border-radius: 0;
3097
+ display: inline-grid;
3098
+ place-items: center;
782
3099
  }
783
- .orynn-option__desc {
784
- font-size: var(--orynn-help-font-size);
785
- color: var(--orynn-color-text-muted);
3100
+ .orynn-progress__svg {
3101
+ inline-size: 100%;
3102
+ block-size: 100%;
3103
+ transform: rotate(-90deg);
3104
+ grid-area: 1 / 1;
786
3105
  }
787
- .orynn-option[data-active] {
788
- background: var(--orynn-color-option-hover);
3106
+ .orynn-progress__ring-track {
3107
+ stroke: var(--orynn-progress-track);
789
3108
  }
790
- .orynn-option[data-selected] {
791
- color: var(--orynn-color-option-selected-text);
792
- font-weight: 600;
3109
+ .orynn-progress__ring {
3110
+ stroke: var(--orynn-progress-fill);
3111
+ transition: stroke-dashoffset 320ms var(--orynn-ease);
793
3112
  }
794
- .orynn-option[data-disabled] {
795
- opacity: 0.4;
796
- cursor: not-allowed;
3113
+ .orynn-progress--circle[data-indeterminate] .orynn-progress__svg {
3114
+ animation: orynn-progress-spin 0.9s linear infinite;
797
3115
  }
798
- .orynn-option__check {
799
- margin-inline-start: auto;
800
- color: var(--orynn-color-accent);
801
- flex: 0 0 auto;
3116
+ @keyframes orynn-progress-spin {
3117
+ to {
3118
+ transform: rotate(270deg);
3119
+ }
3120
+ }
3121
+ .orynn-progress__circle-value {
3122
+ grid-area: 1 / 1;
3123
+ font-size: var(--orynn-font-size-sm);
3124
+ font-weight: 600;
3125
+ font-variant-numeric: tabular-nums;
3126
+ color: var(--orynn-color-foreground);
802
3127
  }
803
3128
 
804
- /* ------------------------------------------------------- datepicker ----- */
3129
+ /* ----------------------------------------------------------- toast ----- */
805
3130
 
806
- .orynn-calendar {
807
- padding: 0.75rem;
808
- inline-size: 17.5rem;
809
- user-select: none;
3131
+ .orynn-toaster {
3132
+ position: fixed;
3133
+ z-index: var(--orynn-z-toast, 9999);
3134
+ display: flex;
3135
+ flex-direction: column;
3136
+ gap: var(--orynn-toaster-gap, 12px);
3137
+ inline-size: min(24rem, calc(100vw - 2 * var(--orynn-toaster-offset, 24px)));
3138
+ max-block-size: 100vh;
3139
+ margin: 0;
3140
+ padding: 0;
3141
+ list-style: none;
3142
+ outline: none;
810
3143
  }
811
- .orynn-calendar__header {
3144
+ .orynn-toaster[data-position$="-left"] {
3145
+ inset-inline-start: var(--orynn-toaster-offset, 24px);
3146
+ }
3147
+ .orynn-toaster[data-position$="-right"] {
3148
+ inset-inline-end: var(--orynn-toaster-offset, 24px);
3149
+ }
3150
+ .orynn-toaster[data-position$="-center"] {
3151
+ inset-inline-start: 50%;
3152
+ transform: translateX(-50%);
3153
+ }
3154
+ .orynn-toaster[data-position^="top"] {
3155
+ flex-direction: column;
3156
+ }
3157
+ .orynn-toaster[data-position^="bottom"] {
3158
+ flex-direction: column-reverse;
3159
+ }
3160
+
3161
+ .orynn-toast {
3162
+ --orynn-toast-accent: var(--orynn-color-foreground);
3163
+
812
3164
  display: flex;
813
- align-items: center;
814
- justify-content: space-between;
815
- margin-block-end: 0.4rem;
3165
+ align-items: flex-start;
3166
+ gap: 0.625rem;
3167
+ inline-size: 100%;
3168
+ box-sizing: border-box;
3169
+ padding: 0.875rem 1rem;
3170
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
3171
+ border-radius: var(--orynn-radius-lg);
3172
+ background: var(--orynn-color-popover);
3173
+ color: var(--orynn-color-popover-foreground);
3174
+ box-shadow: var(--orynn-shadow-lg, var(--orynn-shadow-md));
3175
+ font-family: var(--orynn-font-family);
3176
+ font-size: var(--orynn-font-size-sm);
816
3177
  }
817
- .orynn-calendar__title {
3178
+ .orynn-toast[data-variant="success"] {
3179
+ --orynn-toast-accent: var(--orynn-color-success, oklch(0.62 0.17 145));
3180
+ }
3181
+ .orynn-toast[data-variant="error"] {
3182
+ --orynn-toast-accent: var(--orynn-color-destructive);
3183
+ }
3184
+ .orynn-toast[data-variant="warning"] {
3185
+ --orynn-toast-accent: oklch(0.72 0.15 80);
3186
+ }
3187
+ .orynn-toast[data-variant="info"] {
3188
+ --orynn-toast-accent: var(--orynn-color-primary);
3189
+ }
3190
+ .orynn-toast[data-variant="loading"] {
3191
+ --orynn-toast-accent: var(--orynn-color-muted-foreground);
3192
+ }
3193
+
3194
+ .orynn-toaster[data-rich-colors] .orynn-toast[data-variant]:not([data-variant="default"]) {
3195
+ background: color-mix(in oklch, var(--orynn-toast-accent) 12%, var(--orynn-color-popover));
3196
+ border-color: color-mix(in oklch, var(--orynn-toast-accent) 35%, var(--orynn-color-border));
3197
+ color: color-mix(in oklch, var(--orynn-toast-accent) 55%, var(--orynn-color-popover-foreground));
3198
+ }
3199
+
3200
+ .orynn-toast__icon {
3201
+ flex: none;
3202
+ display: inline-flex;
3203
+ inline-size: 1.1rem;
3204
+ block-size: 1.1rem;
3205
+ margin-block-start: 0.05rem;
3206
+ color: var(--orynn-toast-accent);
3207
+ }
3208
+ .orynn-toast__icon > svg {
3209
+ inline-size: 100%;
3210
+ block-size: 100%;
3211
+ }
3212
+ .orynn-toast__content {
3213
+ flex: 1 1 auto;
3214
+ min-inline-size: 0;
818
3215
  display: flex;
819
- gap: 0.3rem;
3216
+ flex-direction: column;
3217
+ gap: 0.15rem;
3218
+ }
3219
+ .orynn-toast__title {
820
3220
  font-weight: 600;
821
- font-size: 0.9rem;
3221
+ color: var(--orynn-color-foreground);
3222
+ line-height: 1.35;
822
3223
  }
823
- .orynn-calendar__nav {
824
- display: inline-flex;
825
- align-items: center;
826
- justify-content: center;
827
- inline-size: 1.9rem;
828
- block-size: 1.9rem;
829
- border: 0;
830
- background: transparent;
3224
+ .orynn-toast__description {
3225
+ color: var(--orynn-color-muted-foreground);
3226
+ line-height: 1.4;
3227
+ }
3228
+ .orynn-toast__action {
3229
+ flex: none;
3230
+ align-self: center;
3231
+ padding: 0.3rem 0.6rem;
3232
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
831
3233
  border-radius: var(--orynn-radius-sm);
832
- color: var(--orynn-color-text-muted);
3234
+ background: transparent;
3235
+ color: var(--orynn-color-foreground);
3236
+ font: inherit;
3237
+ font-weight: 500;
833
3238
  cursor: pointer;
3239
+ white-space: nowrap;
3240
+ transition: background-color var(--orynn-transition);
834
3241
  }
835
- .orynn-calendar__nav:hover:not(:disabled) {
836
- background: var(--orynn-color-overlay);
837
- color: var(--orynn-color-text);
838
- }
839
- .orynn-calendar__nav:disabled {
840
- opacity: 0.35;
841
- cursor: not-allowed;
3242
+ .orynn-toast__action:hover {
3243
+ background: var(--orynn-color-accent);
842
3244
  }
843
- .orynn-calendar__select {
3245
+ .orynn-toast__close {
3246
+ flex: none;
3247
+ align-self: flex-start;
3248
+ display: inline-flex;
3249
+ inline-size: 1.1rem;
3250
+ block-size: 1.1rem;
3251
+ padding: 0;
844
3252
  border: 0;
845
3253
  background: transparent;
846
- font: inherit;
847
- font-weight: 600;
848
- color: inherit;
3254
+ color: var(--orynn-color-muted-foreground);
849
3255
  cursor: pointer;
850
3256
  border-radius: var(--orynn-radius-sm);
851
- padding: 0.1rem 0.2rem;
3257
+ transition: color var(--orynn-transition);
852
3258
  }
853
- .orynn-calendar__select:hover {
854
- background: var(--orynn-color-overlay);
3259
+ .orynn-toast__close:hover {
3260
+ color: var(--orynn-color-foreground);
855
3261
  }
856
- .orynn-calendar__grid {
3262
+ .orynn-toast__close > svg {
857
3263
  inline-size: 100%;
858
- border-collapse: collapse;
3264
+ block-size: 100%;
859
3265
  }
860
- .orynn-calendar__grid th {
861
- font-size: 0.72rem;
862
- font-weight: 600;
863
- color: var(--orynn-color-text-subtle);
864
- padding: 0.3rem 0;
3266
+
3267
+ .orynn-toast[data-state="open"] {
3268
+ animation: orynn-toast-in 200ms var(--orynn-ease);
865
3269
  }
866
- .orynn-calendar__weeknum {
867
- color: var(--orynn-color-text-subtle);
868
- font-size: 0.72rem;
3270
+ .orynn-toast[data-state="closed"] {
3271
+ animation: orynn-toast-out 140ms ease-in;
869
3272
  }
870
- .orynn-calendar__day {
871
- inline-size: 2.15rem;
872
- block-size: 2.15rem;
873
- border: 0;
874
- background: transparent;
875
- font: inherit;
876
- font-size: 0.85rem;
877
- color: var(--orynn-color-text);
878
- border-radius: 999px;
879
- cursor: pointer;
880
- transition: background-color var(--orynn-transition), color var(--orynn-transition);
3273
+ .orynn-toast[data-swipe="move"] {
3274
+ transform: translateX(var(--radix-toast-swipe-move-x, 0));
881
3275
  }
882
- .orynn-calendar__day:hover:not(:disabled) {
883
- background: var(--orynn-color-option-hover);
3276
+ .orynn-toast[data-swipe="cancel"] {
3277
+ transform: translateX(0);
3278
+ transition: transform 160ms var(--orynn-ease);
884
3279
  }
885
- .orynn-calendar__day[data-outside] {
886
- color: var(--orynn-color-text-subtle);
3280
+ .orynn-toast[data-swipe="end"] {
3281
+ animation: orynn-toast-swipe-out 140ms ease-out;
887
3282
  }
888
- .orynn-calendar__day[data-today] {
889
- box-shadow: inset 0 0 0 1px var(--orynn-color-accent-muted);
890
- font-weight: 700;
3283
+ @keyframes orynn-toast-in {
3284
+ from {
3285
+ opacity: 0;
3286
+ transform: translateY(0.5rem) scale(0.98);
3287
+ }
3288
+ to {
3289
+ opacity: 1;
3290
+ transform: none;
3291
+ }
891
3292
  }
892
- .orynn-calendar__day[data-selected] {
893
- background: var(--orynn-color-accent);
894
- color: var(--orynn-color-accent-contrast);
895
- font-weight: 700;
3293
+ @keyframes orynn-toast-out {
3294
+ to {
3295
+ opacity: 0;
3296
+ transform: scale(0.97);
3297
+ }
896
3298
  }
897
- .orynn-calendar__day:disabled {
898
- opacity: 0.3;
899
- cursor: not-allowed;
3299
+ @keyframes orynn-toast-swipe-out {
3300
+ to {
3301
+ transform: translateX(var(--radix-toast-swipe-end-x, 100%));
3302
+ opacity: 0;
3303
+ }
900
3304
  }
901
- .orynn-calendar__footer {
3305
+
3306
+ /* -------------------------------------------------------- pagination --- */
3307
+
3308
+ .orynn-pagination {
3309
+ --orynn-pagination-size: 2.25rem;
3310
+ --orynn-pagination-font: var(--orynn-font-size-sm);
3311
+ --orynn-pagination-gap: 0.25rem;
3312
+ --orynn-pagination-radius: var(--orynn-radius-md);
3313
+
3314
+ display: block;
3315
+ font-family: var(--orynn-font-family);
3316
+ }
3317
+ .orynn-pagination[data-size="sm"] {
3318
+ --orynn-pagination-size: 1.875rem;
3319
+ --orynn-pagination-font: var(--orynn-font-size-sm);
3320
+ }
3321
+ .orynn-pagination[data-size="lg"] {
3322
+ --orynn-pagination-size: 2.75rem;
3323
+ --orynn-pagination-font: var(--orynn-font-size);
3324
+ }
3325
+ .orynn-pagination[data-disabled] {
3326
+ opacity: 0.55;
3327
+ pointer-events: none;
3328
+ }
3329
+
3330
+ .orynn-pagination__list {
902
3331
  display: flex;
903
- justify-content: space-between;
904
- margin-block-start: 0.5rem;
905
- padding-block-start: 0.5rem;
906
- border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
3332
+ flex-wrap: wrap;
3333
+ align-items: center;
3334
+ gap: var(--orynn-pagination-gap);
3335
+ margin: 0;
3336
+ padding: 0;
3337
+ list-style: none;
907
3338
  }
908
- .orynn-calendar__action {
909
- border: 0;
3339
+ .orynn-pagination__item {
3340
+ display: flex;
3341
+ }
3342
+
3343
+ .orynn-pagination__link {
3344
+ display: inline-flex;
3345
+ align-items: center;
3346
+ justify-content: center;
3347
+ gap: 0.3rem;
3348
+ min-inline-size: var(--orynn-pagination-size);
3349
+ block-size: var(--orynn-pagination-size);
3350
+ padding-inline: 0.5rem;
3351
+ border: var(--orynn-border-width) solid transparent;
3352
+ border-radius: var(--orynn-pagination-radius);
910
3353
  background: transparent;
911
- color: var(--orynn-color-accent);
3354
+ color: var(--orynn-color-foreground);
912
3355
  font: inherit;
913
- font-size: 0.82rem;
914
- font-weight: 600;
3356
+ font-size: var(--orynn-pagination-font);
3357
+ font-weight: 500;
3358
+ font-variant-numeric: tabular-nums;
915
3359
  cursor: pointer;
916
- padding: 0.2rem 0.4rem;
917
- border-radius: var(--orynn-radius-sm);
3360
+ transition: background-color var(--orynn-transition), border-color var(--orynn-transition), color
3361
+ var(--orynn-transition);
918
3362
  }
919
- .orynn-calendar__action:hover {
920
- background: var(--orynn-color-accent-subtle);
3363
+ .orynn-pagination__link > svg {
3364
+ inline-size: 1em;
3365
+ block-size: 1em;
921
3366
  }
922
-
923
- /* ------------------------------------------------------------- grid ----- */
924
-
925
- .orynn-fieldset {
926
- min-inline-size: 0;
927
- margin: 0;
928
- padding: 0;
929
- border: 0;
930
- font-family: var(--orynn-font-family);
931
- color: var(--orynn-color-text);
3367
+ .orynn-pagination__link:hover:not(:disabled):not([data-active]) {
3368
+ background: var(--orynn-color-accent);
3369
+ color: var(--orynn-color-accent-foreground);
932
3370
  }
933
- .orynn-fieldset__legend {
934
- padding: 0;
935
- margin-block-end: var(--orynn-space-md, 0.75rem);
936
- font-size: 1rem;
937
- font-weight: var(--orynn-label-weight);
3371
+ .orynn-pagination__link:focus-visible {
3372
+ outline: none;
3373
+ box-shadow: 0 0 0 var(--orynn-ring-width)
3374
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
938
3375
  }
939
- .orynn-grid {
940
- container-type: inline-size;
3376
+ .orynn-pagination__link:disabled {
3377
+ opacity: 0.45;
3378
+ cursor: not-allowed;
941
3379
  }
942
- .orynn-grid__track {
943
- display: grid;
944
- gap: var(--orynn-grid-gap);
945
- grid-template-columns: repeat(var(--orynn-cols-mobile, 1), minmax(0, 1fr));
3380
+
3381
+ /* variant: outline (default) — bordered idle boxes */
3382
+ .orynn-pagination[data-variant="outline"] .orynn-pagination__link {
3383
+ border-color: var(--orynn-color-border);
946
3384
  }
947
- @container (min-width: 30rem) {
948
- .orynn-grid__track {
949
- grid-template-columns: repeat(var(--orynn-cols-tablet, 2), minmax(0, 1fr));
950
- }
951
- .orynn-grid__item {
952
- grid-column: span var(--orynn-span-tablet, 1);
953
- }
3385
+ .orynn-pagination[data-variant="outline"] .orynn-pagination__link[data-active],
3386
+ .orynn-pagination[data-variant="solid"] .orynn-pagination__link[data-active] {
3387
+ background: var(--orynn-color-primary);
3388
+ border-color: var(--orynn-color-primary);
3389
+ color: var(--orynn-color-primary-foreground);
954
3390
  }
955
- @container (min-width: 48rem) {
956
- .orynn-grid__track {
957
- grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
958
- }
959
- .orynn-grid__item {
960
- grid-column: span var(--orynn-span-desktop, 1);
961
- }
3391
+ /* variant: ghost — no borders, active = muted fill */
3392
+ .orynn-pagination[data-variant="ghost"] .orynn-pagination__link[data-active] {
3393
+ background: var(--orynn-color-muted);
3394
+ color: var(--orynn-color-foreground);
962
3395
  }
963
- .orynn-grid__item {
964
- grid-column: span var(--orynn-span-mobile, 1);
965
- min-inline-size: 0;
3396
+ /* variant: solid — every item filled faintly, active = primary */
3397
+ .orynn-pagination[data-variant="solid"] .orynn-pagination__link:not([data-active]) {
3398
+ background: var(--orynn-color-muted);
966
3399
  }
967
- @supports not (container-type: inline-size) {
968
- .orynn-grid__track {
969
- grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
970
- }
3400
+
3401
+ .orynn-pagination__nav-label {
3402
+ font-weight: 500;
3403
+ }
3404
+ .orynn-pagination__ellipsis {
3405
+ display: inline-flex;
3406
+ align-items: center;
3407
+ justify-content: center;
3408
+ min-inline-size: var(--orynn-pagination-size);
3409
+ block-size: var(--orynn-pagination-size);
3410
+ color: var(--orynn-color-muted-foreground);
971
3411
  }
972
3412
 
973
3413
  @media (prefers-reduced-motion: reduce) {
974
3414
  .orynn-popover,
975
- .orynn-spin {
3415
+ .orynn-spin,
3416
+ .orynn-content,
3417
+ .orynn-content[data-state="open"],
3418
+ .orynn-content[data-state="closed"],
3419
+ .orynn-overlay[data-state="open"],
3420
+ .orynn-overlay[data-state="closed"] {
976
3421
  animation: none;
977
3422
  }
978
3423
  .orynn-box,
@@ -981,4 +3426,23 @@
981
3426
  .orynn-choice__control {
982
3427
  transition: none;
983
3428
  }
3429
+ .orynn-button[data-hover-effect="lift"]:hover,
3430
+ .orynn-button[data-hover-effect="lift"]:active {
3431
+ transform: none;
3432
+ }
3433
+ .orynn-accordion__content[data-state="open"],
3434
+ .orynn-accordion__content[data-state="closed"] {
3435
+ animation: none;
3436
+ }
3437
+ .orynn-accordion__icon,
3438
+ .orynn-progress__bar,
3439
+ .orynn-progress__ring,
3440
+ .orynn-progress__svg,
3441
+ .orynn-progress[data-indeterminate] .orynn-progress__bar,
3442
+ .orynn-progress--circle[data-indeterminate] .orynn-progress__svg,
3443
+ .orynn-slider__range,
3444
+ .orynn-toast {
3445
+ transition: none;
3446
+ animation: none;
3447
+ }
984
3448
  }