orynn 0.2.0 → 0.5.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,163 +957,1230 @@
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: 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 {
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 {
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 {
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);
731
1105
  }
732
-
733
- .orynn-listbox {
734
- max-block-size: min(18rem, 60vh);
1106
+ .orynn-button--outline:hover {
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,
1116
+ .dark .orynn-button--outline:hover {
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 {
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 {
1135
+ background: transparent;
1136
+ text-decoration: underline;
1137
+ }
1138
+
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
+ /* ------------------------------------------------------------- badge ---- */
1155
+
1156
+ .orynn-badge {
1157
+ display: inline-flex;
1158
+ align-items: center;
1159
+ justify-content: center;
1160
+ gap: 0.25rem;
1161
+ inline-size: fit-content;
1162
+ flex-shrink: 0;
1163
+ white-space: nowrap;
1164
+ box-sizing: border-box;
1165
+ padding: 0.125rem 0.5rem;
1166
+ border: var(--orynn-border-width) solid transparent;
1167
+ border-radius: var(--orynn-radius-md);
1168
+ font-family: var(--orynn-font-family);
1169
+ font-size: 0.75rem;
1170
+ font-weight: 500;
1171
+ line-height: 1;
1172
+ background: var(--orynn-color-primary);
1173
+ color: var(--orynn-color-primary-foreground);
1174
+ }
1175
+ .orynn-badge > svg {
1176
+ inline-size: 0.75rem;
1177
+ block-size: 0.75rem;
1178
+ pointer-events: none;
1179
+ }
1180
+ .orynn-badge--secondary {
1181
+ background: var(--orynn-color-secondary);
1182
+ color: var(--orynn-color-secondary-foreground);
1183
+ }
1184
+ .orynn-badge--destructive {
1185
+ background: var(--orynn-color-destructive);
1186
+ color: #fff;
1187
+ }
1188
+ .orynn-badge--outline {
1189
+ background: transparent;
1190
+ color: var(--orynn-color-foreground);
1191
+ border-color: var(--orynn-color-border);
1192
+ }
1193
+ /* --- Badge: size / dot / remove (additive) */
1194
+ .orynn-badge[data-size="sm"] {
1195
+ padding: 0 0.375rem;
1196
+ font-size: 0.6875rem;
1197
+ }
1198
+ .orynn-badge__dot {
1199
+ inline-size: 0.375rem;
1200
+ block-size: 0.375rem;
1201
+ border-radius: 9999px;
1202
+ background: currentColor;
1203
+ flex-shrink: 0;
1204
+ }
1205
+ .orynn-badge__remove {
1206
+ display: inline-flex;
1207
+ align-items: center;
1208
+ justify-content: center;
1209
+ margin-inline-start: 0.125rem;
1210
+ margin-inline-end: -0.15rem;
1211
+ border: 0;
1212
+ padding: 0;
1213
+ background: transparent;
1214
+ color: currentColor;
1215
+ cursor: pointer;
1216
+ opacity: 0.7;
1217
+ border-radius: 9999px;
1218
+ }
1219
+ .orynn-badge__remove:hover {
1220
+ opacity: 1;
1221
+ }
1222
+ .orynn-badge__remove > svg {
1223
+ inline-size: 0.7rem;
1224
+ block-size: 0.7rem;
1225
+ }
1226
+
1227
+ /* -------------------------------------------------------------- card ---- */
1228
+
1229
+ .orynn-card {
1230
+ display: flex;
1231
+ flex-direction: column;
1232
+ gap: 1.5rem;
1233
+ box-sizing: border-box;
1234
+ padding-block: 1.5rem;
1235
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1236
+ border-radius: var(--orynn-radius-xl);
1237
+ background: var(--orynn-color-card);
1238
+ color: var(--orynn-color-card-foreground);
1239
+ box-shadow: var(--orynn-shadow-sm);
1240
+ font-family: var(--orynn-font-family);
1241
+ font-size: var(--orynn-font-size);
1242
+ }
1243
+ /* --- Card: interactive affordance (additive) */
1244
+ .orynn-card[data-interactive] {
1245
+ cursor: pointer;
1246
+ text-align: start;
1247
+ transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition);
1248
+ }
1249
+ .orynn-card[data-interactive]:hover {
1250
+ border-color: color-mix(in oklch, var(--orynn-color-ring) 60%, var(--orynn-color-border));
1251
+ }
1252
+ .orynn-card[data-interactive]:focus-visible {
1253
+ outline: none;
1254
+ border-color: var(--orynn-color-ring);
1255
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1256
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1257
+ }
1258
+ .orynn-card__header {
1259
+ display: grid;
1260
+ grid-auto-rows: min-content;
1261
+ grid-template-rows: auto auto;
1262
+ align-items: start;
1263
+ gap: 0.375rem;
1264
+ padding-inline: 1.5rem;
1265
+ }
1266
+ .orynn-card__header:has([data-slot="card-action"]) {
1267
+ grid-template-columns: 1fr auto;
1268
+ }
1269
+ .orynn-card__title {
1270
+ font-weight: 600;
1271
+ line-height: 1;
1272
+ }
1273
+ .orynn-card__description {
1274
+ font-size: var(--orynn-font-size);
1275
+ color: var(--orynn-color-muted-foreground);
1276
+ }
1277
+ .orynn-card__action {
1278
+ grid-column: 2;
1279
+ grid-row: 1 / span 2;
1280
+ align-self: start;
1281
+ justify-self: end;
1282
+ }
1283
+ .orynn-card__content {
1284
+ padding-inline: 1.5rem;
1285
+ }
1286
+ .orynn-card__footer {
1287
+ display: flex;
1288
+ align-items: center;
1289
+ padding-inline: 1.5rem;
1290
+ }
1291
+
1292
+ /* ------------------------------------------------------------- alert ---- */
1293
+
1294
+ .orynn-alert {
1295
+ position: relative;
1296
+ display: grid;
1297
+ grid-template-columns: 0 1fr;
1298
+ align-items: start;
1299
+ row-gap: 0.125rem;
1300
+ inline-size: 100%;
1301
+ box-sizing: border-box;
1302
+ padding: 0.75rem 1rem;
1303
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1304
+ border-radius: var(--orynn-radius-lg);
1305
+ background: var(--orynn-color-card);
1306
+ color: var(--orynn-color-card-foreground);
1307
+ font-family: var(--orynn-font-family);
1308
+ font-size: var(--orynn-font-size);
1309
+ }
1310
+ .orynn-alert:has(> svg) {
1311
+ grid-template-columns: 1rem 1fr;
1312
+ column-gap: 0.75rem;
1313
+ }
1314
+ .orynn-alert > svg {
1315
+ inline-size: 1rem;
1316
+ block-size: 1rem;
1317
+ transform: translateY(0.125rem);
1318
+ color: currentColor;
1319
+ }
1320
+ .orynn-alert__title {
1321
+ grid-column-start: 2;
1322
+ min-block-size: 1rem;
1323
+ font-weight: 500;
1324
+ letter-spacing: -0.01em;
1325
+ line-height: 1;
1326
+ overflow: hidden;
1327
+ text-overflow: ellipsis;
1328
+ white-space: nowrap;
1329
+ }
1330
+ .orynn-alert__description {
1331
+ grid-column-start: 2;
1332
+ display: grid;
1333
+ justify-items: start;
1334
+ gap: 0.25rem;
1335
+ font-size: var(--orynn-font-size);
1336
+ color: var(--orynn-color-muted-foreground);
1337
+ }
1338
+ .orynn-alert--destructive {
1339
+ color: var(--orynn-color-destructive);
1340
+ }
1341
+ .orynn-alert--destructive .orynn-alert__description {
1342
+ color: color-mix(in oklch, var(--orynn-color-destructive) 90%, transparent);
1343
+ }
1344
+ /* --- Alert: extra variants + dismiss (additive) */
1345
+ .orynn-alert--success {
1346
+ color: var(--orynn-color-success);
1347
+ border-color: color-mix(in oklch, var(--orynn-color-success) 40%, var(--orynn-color-border));
1348
+ }
1349
+ .orynn-alert--warning {
1350
+ color: oklch(0.62 0.16 65);
1351
+ border-color: color-mix(in oklch, oklch(0.62 0.16 65) 40%, var(--orynn-color-border));
1352
+ }
1353
+ .orynn-alert--info {
1354
+ color: var(--orynn-color-primary);
1355
+ border-color: color-mix(in oklch, var(--orynn-color-primary) 25%, var(--orynn-color-border));
1356
+ }
1357
+ .orynn-alert--success .orynn-alert__description,
1358
+ .orynn-alert--warning .orynn-alert__description,
1359
+ .orynn-alert--info .orynn-alert__description {
1360
+ color: color-mix(in oklch, currentColor 85%, transparent);
1361
+ }
1362
+ .orynn-alert__dismiss {
1363
+ position: absolute;
1364
+ inset-block-start: 0.625rem;
1365
+ inset-inline-end: 0.625rem;
1366
+ display: inline-flex;
1367
+ align-items: center;
1368
+ justify-content: center;
1369
+ inline-size: 1.25rem;
1370
+ block-size: 1.25rem;
1371
+ border: 0;
1372
+ padding: 0;
1373
+ background: transparent;
1374
+ color: currentColor;
1375
+ opacity: 0.6;
1376
+ cursor: pointer;
1377
+ border-radius: var(--orynn-radius-sm);
1378
+ }
1379
+ .orynn-alert__dismiss:hover {
1380
+ opacity: 1;
1381
+ }
1382
+ .orynn-alert[data-dismissible] {
1383
+ padding-inline-end: 2.25rem;
1384
+ }
1385
+
1386
+ /* --------------------------------------------------------- separator ---- */
1387
+
1388
+ .orynn-separator {
1389
+ flex-shrink: 0;
1390
+ border: 0;
1391
+ background: var(--orynn-color-border);
1392
+ }
1393
+ .orynn-separator[data-orientation="horizontal"] {
1394
+ block-size: 1px;
1395
+ inline-size: 100%;
1396
+ }
1397
+ .orynn-separator[data-orientation="vertical"] {
1398
+ inline-size: 1px;
1399
+ align-self: stretch;
1400
+ block-size: 100%;
1401
+ }
1402
+ /* --- Separator: dashed + labelled (additive) */
1403
+ .orynn-separator[data-variant="dashed"] {
1404
+ background: transparent;
1405
+ }
1406
+ .orynn-separator[data-variant="dashed"][data-orientation="horizontal"] {
1407
+ border-block-start: 1px dashed var(--orynn-color-border);
1408
+ block-size: 0;
1409
+ }
1410
+ .orynn-separator[data-variant="dashed"][data-orientation="vertical"] {
1411
+ border-inline-start: 1px dashed var(--orynn-color-border);
1412
+ inline-size: 0;
1413
+ }
1414
+ .orynn-separator--labelled {
1415
+ display: flex;
1416
+ align-items: center;
1417
+ gap: 0.75rem;
1418
+ background: transparent;
1419
+ block-size: auto;
1420
+ }
1421
+ .orynn-separator--labelled::before,
1422
+ .orynn-separator--labelled::after {
1423
+ content: "";
1424
+ flex: 1 1 auto;
1425
+ block-size: 1px;
1426
+ background: var(--orynn-color-border);
1427
+ }
1428
+ .orynn-separator--labelled[data-variant="dashed"]::before,
1429
+ .orynn-separator--labelled[data-variant="dashed"]::after {
1430
+ background: transparent;
1431
+ border-block-start: 1px dashed var(--orynn-color-border);
1432
+ }
1433
+ .orynn-separator__label {
1434
+ flex: 0 0 auto;
1435
+ font-size: var(--orynn-font-size-sm);
1436
+ color: var(--orynn-color-muted-foreground);
1437
+ }
1438
+
1439
+ /* ------------------------------------------------------------- table ---- */
1440
+
1441
+ .orynn-table__wrap {
1442
+ position: relative;
1443
+ inline-size: 100%;
1444
+ overflow-x: auto;
1445
+ }
1446
+ .orynn-table {
1447
+ inline-size: 100%;
1448
+ caption-side: bottom;
1449
+ border-collapse: collapse;
1450
+ font-family: var(--orynn-font-family);
1451
+ font-size: var(--orynn-font-size);
1452
+ color: var(--orynn-color-foreground);
1453
+ }
1454
+ .orynn-table__header tr {
1455
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1456
+ }
1457
+ .orynn-table__body tr:last-child {
1458
+ border-block-end: 0;
1459
+ }
1460
+ .orynn-table__footer {
1461
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
1462
+ background: color-mix(in oklch, var(--orynn-color-muted) 50%, transparent);
1463
+ font-weight: 500;
1464
+ }
1465
+ .orynn-table__row {
1466
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1467
+ transition: background-color var(--orynn-transition);
1468
+ }
1469
+ .orynn-table__row:hover {
1470
+ background: color-mix(in oklch, var(--orynn-color-muted) 50%, transparent);
1471
+ }
1472
+ .orynn-table__row[data-state="selected"] {
1473
+ background: var(--orynn-color-muted);
1474
+ }
1475
+ .orynn-table__head {
1476
+ block-size: 2.5rem;
1477
+ padding: 0 0.5rem;
1478
+ text-align: start;
1479
+ vertical-align: middle;
1480
+ font-weight: 500;
1481
+ white-space: nowrap;
1482
+ color: var(--orynn-color-foreground);
1483
+ }
1484
+ .orynn-table__cell {
1485
+ padding: 0.5rem;
1486
+ vertical-align: middle;
1487
+ white-space: nowrap;
1488
+ }
1489
+ .orynn-table__caption {
1490
+ margin-block-start: 1rem;
1491
+ font-size: var(--orynn-font-size);
1492
+ color: var(--orynn-color-muted-foreground);
1493
+ }
1494
+ /* --- Table: compact size + sticky header (additive) */
1495
+ .orynn-table[data-size="sm"] .orynn-table__head {
1496
+ block-size: 2rem;
1497
+ font-size: var(--orynn-font-size-sm);
1498
+ }
1499
+ .orynn-table[data-size="sm"] .orynn-table__cell {
1500
+ padding: 0.3rem 0.5rem;
1501
+ font-size: var(--orynn-font-size-sm);
1502
+ }
1503
+ .orynn-table__header[data-sticky] {
1504
+ position: sticky;
1505
+ inset-block-start: 0;
1506
+ z-index: 1;
1507
+ background: var(--orynn-color-card);
1508
+ }
1509
+
1510
+ /* ------------------------------------------------------------ switch ---- */
1511
+
1512
+ .orynn-switch {
1513
+ display: inline-flex;
1514
+ flex-shrink: 0;
1515
+ align-items: center;
1516
+ box-sizing: border-box;
1517
+ block-size: 1.15rem;
1518
+ inline-size: 2rem;
1519
+ padding: 0;
1520
+ border: var(--orynn-border-width) solid transparent;
1521
+ border-radius: 9999px;
1522
+ background: var(--orynn-color-input);
1523
+ box-shadow: var(--orynn-shadow-xs);
1524
+ cursor: pointer;
1525
+ outline: none;
1526
+ transition: var(--orynn-transition);
1527
+ }
1528
+ .orynn-switch[data-size="sm"] {
1529
+ block-size: 0.875rem;
1530
+ inline-size: 1.5rem;
1531
+ }
1532
+ [data-orynn-color-scheme="dark"] .orynn-switch,
1533
+ .dark .orynn-switch {
1534
+ background: color-mix(in oklch, var(--orynn-color-input) 80%, transparent);
1535
+ }
1536
+ .orynn-switch[data-state="checked"] {
1537
+ background: var(--orynn-color-primary);
1538
+ }
1539
+ .orynn-switch:focus-visible {
1540
+ border-color: var(--orynn-color-ring);
1541
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1542
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1543
+ }
1544
+ .orynn-switch:disabled {
1545
+ cursor: not-allowed;
1546
+ opacity: 0.5;
1547
+ }
1548
+ .orynn-switch__thumb {
1549
+ display: block;
1550
+ block-size: 1rem;
1551
+ inline-size: 1rem;
1552
+ border-radius: 9999px;
1553
+ background: var(--orynn-color-background);
1554
+ pointer-events: none;
1555
+ transform: translateX(0);
1556
+ transition: transform var(--orynn-transition);
1557
+ }
1558
+ .orynn-switch[data-size="sm"] .orynn-switch__thumb {
1559
+ block-size: 0.75rem;
1560
+ inline-size: 0.75rem;
1561
+ }
1562
+ .orynn-switch[data-state="checked"] .orynn-switch__thumb {
1563
+ transform: translateX(calc(100% - 2px));
1564
+ }
1565
+ [data-orynn-color-scheme="dark"] .orynn-switch[data-state="checked"] .orynn-switch__thumb,
1566
+ .dark .orynn-switch[data-state="checked"] .orynn-switch__thumb {
1567
+ background: var(--orynn-color-primary-foreground);
1568
+ }
1569
+ [data-orynn-color-scheme="dark"] .orynn-switch[data-state="unchecked"] .orynn-switch__thumb,
1570
+ .dark .orynn-switch[data-state="unchecked"] .orynn-switch__thumb {
1571
+ background: var(--orynn-color-foreground);
1572
+ }
1573
+
1574
+ /* --- Switch: lg size, thumb icon, on/off text, label layout (additive) */
1575
+ .orynn-switch[data-size="lg"] {
1576
+ block-size: 1.5rem;
1577
+ inline-size: 2.75rem;
1578
+ }
1579
+ .orynn-switch[data-size="lg"] .orynn-switch__thumb {
1580
+ block-size: 1.25rem;
1581
+ inline-size: 1.25rem;
1582
+ }
1583
+ .orynn-switch__thumb {
1584
+ display: inline-flex;
1585
+ align-items: center;
1586
+ justify-content: center;
1587
+ }
1588
+ .orynn-switch__thumb > svg {
1589
+ inline-size: 0.7rem;
1590
+ block-size: 0.7rem;
1591
+ color: var(--orynn-color-muted-foreground);
1592
+ }
1593
+ .orynn-switch__text {
1594
+ position: absolute;
1595
+ font-size: 0.6rem;
1596
+ font-weight: 600;
1597
+ color: var(--orynn-color-primary-foreground);
1598
+ pointer-events: none;
1599
+ line-height: 1;
1600
+ }
1601
+ .orynn-switch__text--on {
1602
+ inset-inline-start: 0.3rem;
1603
+ opacity: 0;
1604
+ }
1605
+ .orynn-switch__text--off {
1606
+ inset-inline-end: 0.3rem;
1607
+ color: var(--orynn-color-muted-foreground);
1608
+ opacity: 1;
1609
+ }
1610
+ .orynn-switch[data-state="checked"] .orynn-switch__text--on {
1611
+ opacity: 1;
1612
+ }
1613
+ .orynn-switch[data-state="checked"] .orynn-switch__text--off {
1614
+ opacity: 0;
1615
+ }
1616
+ .orynn-switch-field {
1617
+ display: inline-flex;
1618
+ align-items: flex-start;
1619
+ gap: 0.625rem;
1620
+ cursor: pointer;
1621
+ font-family: var(--orynn-font-family);
1622
+ }
1623
+ .orynn-switch-field[data-placement="start"] {
1624
+ flex-direction: row-reverse;
1625
+ }
1626
+ .orynn-switch-field__text {
1627
+ display: flex;
1628
+ flex-direction: column;
1629
+ gap: 0.15rem;
1630
+ }
1631
+ .orynn-switch-field__label {
1632
+ font-size: var(--orynn-font-size-sm);
1633
+ font-weight: 500;
1634
+ color: var(--orynn-color-foreground);
1635
+ line-height: 1.2;
1636
+ }
1637
+ .orynn-switch-field__description {
1638
+ font-size: var(--orynn-help-font-size);
1639
+ color: var(--orynn-color-muted-foreground);
1640
+ }
1641
+ .orynn-switch-field:has(.orynn-switch:disabled) {
1642
+ cursor: not-allowed;
1643
+ opacity: 0.6;
1644
+ }
1645
+
1646
+ /* -------------------------------------------------------------- tabs ---- */
1647
+
1648
+ .orynn-tabs {
1649
+ display: flex;
1650
+ flex-direction: column;
1651
+ gap: 0.5rem;
1652
+ }
1653
+ .orynn-tabs[data-orientation="vertical"] {
1654
+ flex-direction: row;
1655
+ }
1656
+ .orynn-tabs__list {
1657
+ display: inline-flex;
1658
+ inline-size: fit-content;
1659
+ align-items: center;
1660
+ justify-content: center;
1661
+ box-sizing: border-box;
1662
+ block-size: var(--orynn-control-h);
1663
+ padding: 3px;
1664
+ border-radius: var(--orynn-radius-lg);
1665
+ background: var(--orynn-color-muted);
1666
+ color: var(--orynn-color-muted-foreground);
1667
+ }
1668
+ .orynn-tabs[data-orientation="vertical"] .orynn-tabs__list {
1669
+ flex-direction: column;
1670
+ block-size: auto;
1671
+ }
1672
+ .orynn-tabs__trigger {
1673
+ display: inline-flex;
1674
+ flex: 1 1 auto;
1675
+ align-items: center;
1676
+ justify-content: center;
1677
+ gap: 0.375rem;
1678
+ block-size: calc(100% - 1px);
1679
+ padding: 0.25rem 0.5rem;
1680
+ border: var(--orynn-border-width) solid transparent;
1681
+ border-radius: var(--orynn-radius-md);
1682
+ background: transparent;
1683
+ color: color-mix(in oklch, var(--orynn-color-foreground) 60%, transparent);
1684
+ font-family: var(--orynn-font-family);
1685
+ font-size: var(--orynn-font-size);
1686
+ font-weight: 500;
1687
+ white-space: nowrap;
1688
+ cursor: pointer;
1689
+ outline: none;
1690
+ transition: var(--orynn-transition);
1691
+ }
1692
+ .orynn-tabs__trigger:hover {
1693
+ color: var(--orynn-color-foreground);
1694
+ }
1695
+ .orynn-tabs__trigger[data-state="active"] {
1696
+ background: var(--orynn-color-background);
1697
+ color: var(--orynn-color-foreground);
1698
+ box-shadow: var(--orynn-shadow-sm);
1699
+ }
1700
+ [data-orynn-color-scheme="dark"] .orynn-tabs__trigger[data-state="active"],
1701
+ .dark .orynn-tabs__trigger[data-state="active"] {
1702
+ background: color-mix(in oklch, var(--orynn-color-input) 30%, transparent);
1703
+ border-color: var(--orynn-color-input);
1704
+ }
1705
+ .orynn-tabs__trigger:focus-visible {
1706
+ border-color: var(--orynn-color-ring);
1707
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1708
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1709
+ }
1710
+ .orynn-tabs__trigger:disabled {
1711
+ pointer-events: none;
1712
+ opacity: 0.5;
1713
+ }
1714
+ .orynn-tabs__trigger > svg {
1715
+ inline-size: 1rem;
1716
+ block-size: 1rem;
1717
+ flex-shrink: 0;
1718
+ pointer-events: none;
1719
+ }
1720
+ .orynn-tabs__content {
1721
+ flex: 1 1 auto;
1722
+ outline: none;
1723
+ }
1724
+
1725
+ /* --- Tabs: size / fitted / variant (additive; pill is the untouched default) */
1726
+ .orynn-tabs[data-size="sm"] .orynn-tabs__list {
1727
+ block-size: var(--orynn-control-h-sm);
1728
+ }
1729
+ .orynn-tabs[data-size="lg"] .orynn-tabs__list {
1730
+ block-size: var(--orynn-control-h-lg);
1731
+ }
1732
+ .orynn-tabs[data-size="sm"] .orynn-tabs__trigger {
1733
+ font-size: var(--orynn-font-size-sm);
1734
+ }
1735
+ .orynn-tabs[data-size="lg"] .orynn-tabs__trigger {
1736
+ font-size: var(--orynn-font-size-lg);
1737
+ }
1738
+ .orynn-tabs[data-fitted] .orynn-tabs__list {
1739
+ display: flex;
1740
+ inline-size: 100%;
1741
+ }
1742
+ .orynn-tabs[data-variant="underline"] .orynn-tabs__list {
1743
+ background: transparent;
1744
+ padding: 0;
1745
+ border-radius: 0;
1746
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1747
+ gap: 0.25rem;
1748
+ }
1749
+ .orynn-tabs[data-variant="underline"] .orynn-tabs__trigger {
1750
+ border-radius: 0;
1751
+ border-block-end: 2px solid transparent;
1752
+ margin-block-end: -1px;
1753
+ }
1754
+ .orynn-tabs[data-variant="underline"] .orynn-tabs__trigger[data-state="active"] {
1755
+ background: transparent;
1756
+ box-shadow: none;
1757
+ border-block-end-color: var(--orynn-color-primary);
1758
+ color: var(--orynn-color-foreground);
1759
+ }
1760
+ .orynn-tabs[data-variant="enclosed"] .orynn-tabs__list {
1761
+ background: transparent;
1762
+ padding: 0;
1763
+ border-radius: 0;
1764
+ border-block-end: var(--orynn-border-width) solid var(--orynn-color-border);
1765
+ gap: 0.25rem;
1766
+ }
1767
+ .orynn-tabs[data-variant="enclosed"] .orynn-tabs__trigger {
1768
+ border: var(--orynn-border-width) solid transparent;
1769
+ border-end-start-radius: 0;
1770
+ border-end-end-radius: 0;
1771
+ margin-block-end: -1px;
1772
+ }
1773
+ .orynn-tabs[data-variant="enclosed"] .orynn-tabs__trigger[data-state="active"] {
1774
+ background: var(--orynn-color-background);
1775
+ box-shadow: none;
1776
+ border-color: var(--orynn-color-border);
1777
+ border-block-end-color: var(--orynn-color-background);
1778
+ }
1779
+
1780
+ /* ------------------------------------------------------------ dialog ---- */
1781
+
1782
+ .orynn-dialog__overlay {
1783
+ position: fixed;
1784
+ inset: 0;
1785
+ z-index: var(--orynn-z-overlay);
1786
+ background: var(--orynn-color-scrim);
1787
+ }
1788
+ .orynn-dialog__content {
1789
+ position: fixed;
1790
+ inset-block-start: 50%;
1791
+ inset-inline-start: 50%;
1792
+ translate: -50% -50%;
1793
+ z-index: var(--orynn-z-modal);
1794
+ display: grid;
1795
+ gap: 1rem;
1796
+ inline-size: 100%;
1797
+ max-inline-size: calc(100% - 2rem);
1798
+ box-sizing: border-box;
1799
+ padding: 1.5rem;
1800
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1801
+ border-radius: var(--orynn-radius-lg);
1802
+ background: var(--orynn-color-background);
1803
+ color: var(--orynn-color-foreground);
1804
+ box-shadow: var(--orynn-shadow-lg);
1805
+ font-family: var(--orynn-font-family);
1806
+ font-size: var(--orynn-font-size);
1807
+ animation-duration: var(--orynn-duration-modal);
1808
+ animation-timing-function: var(--orynn-ease);
1809
+ }
1810
+ @media (min-width: 40rem) {
1811
+ .orynn-dialog__content {
1812
+ max-inline-size: 32rem;
1813
+ }
1814
+ }
1815
+ .orynn-dialog__content[data-state="open"] {
1816
+ animation-name: orynn-enter;
1817
+ --orynn-enter-opacity: 0;
1818
+ --orynn-enter-scale: 0.95;
1819
+ }
1820
+ .orynn-dialog__content[data-state="closed"] {
1821
+ animation-name: orynn-exit;
1822
+ --orynn-exit-opacity: 0;
1823
+ --orynn-exit-scale: 0.95;
1824
+ }
1825
+ /* size / scrollable (additive; unset === the 40rem default above) */
1826
+ @media (min-width: 40rem) {
1827
+ .orynn-dialog__content[data-size="sm"] {
1828
+ max-inline-size: 24rem;
1829
+ }
1830
+ .orynn-dialog__content[data-size="md"] {
1831
+ max-inline-size: 28rem;
1832
+ }
1833
+ .orynn-dialog__content[data-size="lg"] {
1834
+ max-inline-size: 32rem;
1835
+ }
1836
+ .orynn-dialog__content[data-size="xl"] {
1837
+ max-inline-size: 42rem;
1838
+ }
1839
+ }
1840
+ .orynn-dialog__content[data-size="full"] {
1841
+ max-inline-size: calc(100% - 2rem);
1842
+ max-block-size: calc(100% - 2rem);
1843
+ }
1844
+ .orynn-dialog__content[data-scrollable] {
1845
+ max-block-size: calc(100dvh - 4rem);
1846
+ overflow-y: auto;
1847
+ }
1848
+ .orynn-dialog__close {
1849
+ position: absolute;
1850
+ inset-block-start: 1rem;
1851
+ inset-inline-end: 1rem;
1852
+ display: inline-flex;
1853
+ align-items: center;
1854
+ justify-content: center;
1855
+ inline-size: 1.5rem;
1856
+ block-size: 1.5rem;
1857
+ border: 0;
1858
+ border-radius: var(--orynn-radius-sm);
1859
+ background: transparent;
1860
+ color: inherit;
1861
+ opacity: 0.7;
1862
+ cursor: pointer;
1863
+ transition: opacity var(--orynn-transition);
1864
+ }
1865
+ .orynn-dialog__close:hover {
1866
+ opacity: 1;
1867
+ }
1868
+ .orynn-dialog__close:focus-visible {
1869
+ outline: none;
1870
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1871
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1872
+ }
1873
+ .orynn-dialog__close > svg {
1874
+ inline-size: 1rem;
1875
+ block-size: 1rem;
1876
+ }
1877
+ .orynn-dialog__header {
1878
+ display: flex;
1879
+ flex-direction: column;
1880
+ gap: 0.5rem;
1881
+ text-align: center;
1882
+ }
1883
+ .orynn-dialog__footer {
1884
+ display: flex;
1885
+ flex-direction: column-reverse;
1886
+ gap: 0.5rem;
1887
+ }
1888
+ @media (min-width: 40rem) {
1889
+ .orynn-dialog__header {
1890
+ text-align: start;
1891
+ }
1892
+ .orynn-dialog__footer {
1893
+ flex-direction: row;
1894
+ justify-content: flex-end;
1895
+ }
1896
+ }
1897
+ .orynn-dialog__title {
1898
+ font-size: var(--orynn-font-size-lg);
1899
+ font-weight: 600;
1900
+ line-height: 1;
1901
+ }
1902
+ .orynn-dialog__description {
1903
+ font-size: var(--orynn-font-size);
1904
+ color: var(--orynn-color-muted-foreground);
1905
+ }
1906
+
1907
+ /* -------------------------------------------------- popover (primitive) -- */
1908
+
1909
+ .orynn-popover__content {
1910
+ z-index: var(--orynn-z-popover);
1911
+ inline-size: 18rem;
1912
+ box-sizing: border-box;
1913
+ padding: 1rem;
1914
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1915
+ border-radius: var(--orynn-radius-md);
1916
+ background: var(--orynn-color-popover);
1917
+ color: var(--orynn-color-popover-foreground);
1918
+ box-shadow: var(--orynn-shadow-md);
1919
+ font-family: var(--orynn-font-family);
1920
+ font-size: var(--orynn-font-size);
1921
+ outline: none;
1922
+ }
1923
+ .orynn-popover__arrow {
1924
+ fill: var(--orynn-color-popover);
1925
+ }
1926
+
1927
+ /* ----------------------------------------------------------- tooltip ---- */
1928
+
1929
+ .orynn-tooltip__content {
1930
+ z-index: var(--orynn-z-popover);
1931
+ inline-size: fit-content;
1932
+ max-inline-size: 20rem;
1933
+ padding: 0.375rem 0.75rem;
1934
+ border-radius: var(--orynn-radius-md);
1935
+ background: var(--orynn-color-foreground);
1936
+ color: var(--orynn-color-background);
1937
+ font-family: var(--orynn-font-family);
1938
+ font-size: var(--orynn-font-size-sm);
1939
+ line-height: 1.3;
1940
+ text-wrap: balance;
1941
+ }
1942
+ .orynn-tooltip__arrow {
1943
+ fill: var(--orynn-color-foreground);
1944
+ }
1945
+
1946
+ /* ------------------------------------------------------ dropdown menu ---- */
1947
+
1948
+ .orynn-menu__content {
1949
+ z-index: var(--orynn-z-popover);
1950
+ min-inline-size: 8rem;
1951
+ max-block-size: var(--radix-dropdown-menu-content-available-height);
1952
+ overflow-x: hidden;
1953
+ overflow-y: auto;
1954
+ box-sizing: border-box;
1955
+ padding: 0.25rem;
1956
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
1957
+ border-radius: var(--orynn-radius-md);
1958
+ background: var(--orynn-color-popover);
1959
+ color: var(--orynn-color-popover-foreground);
1960
+ box-shadow: var(--orynn-shadow-md);
1961
+ font-family: var(--orynn-font-family);
1962
+ font-size: var(--orynn-font-size);
1963
+ }
1964
+ .orynn-menu__sub-content {
1965
+ box-shadow: var(--orynn-shadow-lg);
1966
+ }
1967
+ .orynn-menu__item {
1968
+ position: relative;
1969
+ display: flex;
1970
+ align-items: center;
1971
+ gap: 0.5rem;
1972
+ padding: 0.375rem 0.5rem;
1973
+ border-radius: var(--orynn-radius-sm);
1974
+ font-size: var(--orynn-font-size);
1975
+ line-height: 1.35;
1976
+ cursor: default;
1977
+ user-select: none;
1978
+ outline: none;
1979
+ }
1980
+ .orynn-menu__item[data-inset],
1981
+ .orynn-menu__item--check {
1982
+ padding-inline-start: 2rem;
1983
+ }
1984
+ .orynn-menu__item[data-highlighted] {
1985
+ background: var(--orynn-color-accent);
1986
+ color: var(--orynn-color-accent-foreground);
1987
+ }
1988
+ .orynn-menu__item[data-disabled] {
1989
+ pointer-events: none;
1990
+ opacity: 0.5;
1991
+ }
1992
+ .orynn-menu__item > svg {
1993
+ inline-size: 1rem;
1994
+ block-size: 1rem;
1995
+ flex-shrink: 0;
1996
+ pointer-events: none;
1997
+ }
1998
+ .orynn-menu__item[data-variant="destructive"] {
1999
+ color: var(--orynn-color-destructive);
2000
+ }
2001
+ .orynn-menu__item[data-variant="destructive"][data-highlighted] {
2002
+ background: color-mix(in oklch, var(--orynn-color-destructive) 10%, transparent);
2003
+ color: var(--orynn-color-destructive);
2004
+ }
2005
+ .orynn-menu__indicator {
2006
+ position: absolute;
2007
+ inset-inline-start: 0.5rem;
2008
+ display: inline-flex;
2009
+ align-items: center;
2010
+ justify-content: center;
2011
+ inline-size: 0.875rem;
2012
+ block-size: 0.875rem;
2013
+ }
2014
+ .orynn-menu__indicator > svg {
2015
+ inline-size: 0.875rem;
2016
+ block-size: 0.875rem;
2017
+ }
2018
+ .orynn-menu__indicator .orynn-menu__dot {
2019
+ inline-size: 0.5rem;
2020
+ block-size: 0.5rem;
2021
+ fill: currentColor;
2022
+ }
2023
+ .orynn-menu__label {
2024
+ padding: 0.375rem 0.5rem;
2025
+ font-size: var(--orynn-font-size);
2026
+ font-weight: 500;
2027
+ }
2028
+ .orynn-menu__label[data-inset] {
2029
+ padding-inline-start: 2rem;
2030
+ }
2031
+ .orynn-menu__separator {
2032
+ block-size: 1px;
2033
+ margin: 0.25rem -0.25rem;
2034
+ background: var(--orynn-color-border);
2035
+ }
2036
+ .orynn-menu__shortcut {
2037
+ margin-inline-start: auto;
2038
+ font-size: var(--orynn-font-size-sm);
2039
+ letter-spacing: 0.1em;
2040
+ color: var(--orynn-color-muted-foreground);
2041
+ }
2042
+ .orynn-menu__sub-trigger[data-state="open"] {
2043
+ background: var(--orynn-color-accent);
2044
+ color: var(--orynn-color-accent-foreground);
2045
+ }
2046
+ .orynn-menu__sub-chevron {
2047
+ margin-inline-start: auto;
2048
+ }
2049
+
2050
+ /* --------------------------------------------------------- popover ------ *
2051
+ * legacy anchored popover — the positioner for <Dropdown> / <DatePicker>.
2052
+ * (The public <Popover> primitive uses .orynn-popover__content — phase 6.) */
2053
+
2054
+ .orynn-popover {
2055
+ position: fixed;
2056
+ z-index: var(--orynn-z-popover);
2057
+ background: var(--orynn-color-popover);
2058
+ color: var(--orynn-color-popover-foreground);
2059
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
2060
+ border-radius: var(--orynn-radius-md);
2061
+ box-shadow: var(--orynn-shadow-md);
2062
+ font-family: var(--orynn-font-family);
2063
+ font-size: var(--orynn-font-size);
2064
+ overflow: hidden;
2065
+ transform-origin: top center;
2066
+ animation: orynn-pop 150ms var(--orynn-ease);
2067
+ }
2068
+
2069
+ /* ---------------------------------------------------------- select ----- */
2070
+
2071
+ .orynn-select__value {
2072
+ display: flex;
2073
+ flex: 1 1 auto;
2074
+ min-inline-size: 0;
2075
+ align-items: center;
2076
+ gap: 0.4rem;
2077
+ padding: 0 var(--orynn-control-px);
2078
+ overflow: hidden;
2079
+ }
2080
+ .orynn-select__value--placeholder {
2081
+ color: var(--orynn-color-muted-foreground);
2082
+ }
2083
+ .orynn-select__single {
2084
+ white-space: nowrap;
2085
+ overflow: hidden;
2086
+ text-overflow: ellipsis;
2087
+ }
2088
+ .orynn-select__search {
2089
+ flex: 1 1 4rem;
2090
+ min-inline-size: 2rem;
2091
+ border: 0;
2092
+ outline: 0;
2093
+ background: transparent;
2094
+ font: inherit;
2095
+ color: inherit;
2096
+ padding: 0;
2097
+ }
2098
+ .orynn-select__chips {
2099
+ display: flex;
2100
+ flex-wrap: wrap;
2101
+ gap: 0.3rem;
2102
+ align-items: center;
2103
+ }
2104
+ .orynn-select__chip {
2105
+ display: inline-flex;
2106
+ align-items: center;
2107
+ gap: 0.25rem;
2108
+ background: var(--orynn-color-secondary);
2109
+ color: var(--orynn-color-secondary-foreground);
2110
+ border-radius: var(--orynn-radius-sm);
2111
+ padding: 0.125rem 0.25rem 0.125rem 0.5rem;
2112
+ font-size: var(--orynn-font-size-sm);
2113
+ max-inline-size: 12rem;
2114
+ }
2115
+ .orynn-select__chip span {
2116
+ overflow: hidden;
2117
+ text-overflow: ellipsis;
2118
+ white-space: nowrap;
2119
+ }
2120
+ .orynn-select__chip button {
2121
+ display: inline-flex;
2122
+ border: 0;
2123
+ background: transparent;
2124
+ color: inherit;
2125
+ cursor: pointer;
2126
+ padding: 0.1rem;
2127
+ border-radius: 9999px;
2128
+ }
2129
+ .orynn-select__chip button:hover {
2130
+ background: color-mix(in oklch, var(--orynn-color-secondary-foreground) 15%, transparent);
2131
+ }
2132
+ .orynn-select__chevron {
2133
+ transition: transform var(--orynn-transition);
2134
+ }
2135
+ .orynn-box[data-focused] .orynn-select__chevron,
2136
+ .orynn-box[data-open] .orynn-select__chevron {
2137
+ transform: rotate(180deg);
2138
+ }
2139
+
2140
+ .orynn-listbox {
2141
+ max-block-size: min(18rem, 60vh);
735
2142
  overflow-y: auto;
736
- padding: 0.35rem;
2143
+ overscroll-behavior: contain;
2144
+ padding: 0.25rem;
2145
+ scroll-padding-block: 0.25rem;
737
2146
  outline: none;
2147
+ scrollbar-width: thin;
2148
+ scrollbar-color: var(--orynn-color-border) transparent;
2149
+ }
2150
+ .orynn-listbox::-webkit-scrollbar {
2151
+ inline-size: 0.55rem;
2152
+ }
2153
+ .orynn-listbox::-webkit-scrollbar-thumb {
2154
+ background: var(--orynn-color-border);
2155
+ border-radius: var(--orynn-radius-pill);
2156
+ border: 3px solid transparent;
2157
+ background-clip: content-box;
738
2158
  }
739
2159
  .orynn-listbox__empty {
740
- padding: 0.9rem 0.75rem;
2160
+ padding: 1rem 0.75rem;
741
2161
  text-align: center;
742
- color: var(--orynn-color-text-subtle);
2162
+ color: var(--orynn-color-muted-foreground);
743
2163
  font-size: var(--orynn-help-font-size);
744
2164
  }
745
2165
  .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);
2166
+ padding: 0.375rem 0.5rem;
2167
+ font-size: var(--orynn-font-size-sm);
2168
+ color: var(--orynn-color-muted-foreground);
752
2169
  position: sticky;
753
- inset-block-start: -0.35rem;
754
- background: var(--orynn-color-panel-bg);
2170
+ inset-block-start: -0.25rem;
2171
+ background: var(--orynn-color-popover);
2172
+ z-index: 1;
755
2173
  }
756
2174
  .orynn-option {
757
2175
  display: flex;
758
2176
  align-items: center;
759
- gap: 0.55rem;
760
- padding: 0.5rem 0.6rem;
2177
+ gap: 0.5rem;
2178
+ padding: 0.375rem 0.5rem;
761
2179
  border-radius: var(--orynn-radius-sm);
762
2180
  cursor: pointer;
763
- color: var(--orynn-color-text);
2181
+ color: var(--orynn-color-popover-foreground);
764
2182
  line-height: 1.35;
2183
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
765
2184
  }
766
2185
  .orynn-option__body {
767
2186
  display: flex;
@@ -777,150 +2196,381 @@
777
2196
  }
778
2197
  .orynn-option__label mark {
779
2198
  background: transparent;
780
- color: var(--orynn-color-accent);
781
- font-weight: 700;
2199
+ color: var(--orynn-color-primary);
2200
+ font-weight: 600;
782
2201
  }
783
2202
  .orynn-option__desc {
784
2203
  font-size: var(--orynn-help-font-size);
785
- color: var(--orynn-color-text-muted);
2204
+ color: var(--orynn-color-muted-foreground);
2205
+ overflow: hidden;
2206
+ text-overflow: ellipsis;
2207
+ white-space: nowrap;
786
2208
  }
787
2209
  .orynn-option[data-active] {
788
- background: var(--orynn-color-option-hover);
2210
+ background: var(--orynn-color-accent);
2211
+ color: var(--orynn-color-accent-foreground);
2212
+ }
2213
+ .orynn-option[data-active] .orynn-option__desc {
2214
+ color: inherit;
789
2215
  }
790
2216
  .orynn-option[data-selected] {
791
- color: var(--orynn-color-option-selected-text);
792
- font-weight: 600;
2217
+ font-weight: 500;
793
2218
  }
794
2219
  .orynn-option[data-disabled] {
795
- opacity: 0.4;
2220
+ opacity: 0.5;
796
2221
  cursor: not-allowed;
797
2222
  }
798
2223
  .orynn-option__check {
799
2224
  margin-inline-start: auto;
800
- color: var(--orynn-color-accent);
2225
+ color: currentColor;
801
2226
  flex: 0 0 auto;
802
2227
  }
2228
+ /* creatable row + select-all action — additive, only rendered on opt-in */
2229
+ .orynn-option--create .orynn-option__label {
2230
+ color: var(--orynn-color-primary);
2231
+ font-weight: 500;
2232
+ }
2233
+ .orynn-listbox__action {
2234
+ display: block;
2235
+ inline-size: 100%;
2236
+ text-align: start;
2237
+ border: 0;
2238
+ background: transparent;
2239
+ font: inherit;
2240
+ font-size: var(--orynn-font-size-sm);
2241
+ font-weight: 500;
2242
+ color: var(--orynn-color-primary);
2243
+ padding: 0.375rem 0.5rem;
2244
+ border-radius: var(--orynn-radius-sm);
2245
+ cursor: pointer;
2246
+ position: sticky;
2247
+ inset-block-start: -0.25rem;
2248
+ background: var(--orynn-color-popover);
2249
+ z-index: 1;
2250
+ transition: background-color var(--orynn-transition);
2251
+ }
2252
+ .orynn-listbox__action:hover {
2253
+ background: var(--orynn-color-accent);
2254
+ }
803
2255
 
804
2256
  /* ------------------------------------------------------- datepicker ----- */
805
2257
 
806
2258
  .orynn-calendar {
807
2259
  padding: 0.75rem;
808
- inline-size: 17.5rem;
2260
+ inline-size: max-content;
2261
+ color: var(--orynn-color-popover-foreground);
809
2262
  user-select: none;
810
2263
  }
811
2264
  .orynn-calendar__header {
812
2265
  display: flex;
813
2266
  align-items: center;
814
2267
  justify-content: space-between;
815
- margin-block-end: 0.4rem;
2268
+ gap: 0.25rem;
2269
+ margin-block-end: 0.5rem;
816
2270
  }
817
2271
  .orynn-calendar__title {
818
2272
  display: flex;
819
- gap: 0.3rem;
820
- font-weight: 600;
821
- font-size: 0.9rem;
2273
+ flex: 1 1 auto;
2274
+ gap: 0.25rem;
2275
+ justify-content: center;
2276
+ font-weight: 500;
2277
+ font-size: var(--orynn-font-size);
822
2278
  }
823
2279
  .orynn-calendar__nav {
824
2280
  display: inline-flex;
2281
+ flex: 0 0 auto;
825
2282
  align-items: center;
826
2283
  justify-content: center;
827
- inline-size: 1.9rem;
828
- block-size: 1.9rem;
2284
+ inline-size: 2rem;
2285
+ block-size: 2rem;
829
2286
  border: 0;
830
2287
  background: transparent;
831
- border-radius: var(--orynn-radius-sm);
832
- color: var(--orynn-color-text-muted);
2288
+ border-radius: var(--orynn-radius-md);
2289
+ color: var(--orynn-color-muted-foreground);
833
2290
  cursor: pointer;
2291
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
834
2292
  }
835
2293
  .orynn-calendar__nav:hover:not(:disabled) {
836
- background: var(--orynn-color-overlay);
837
- color: var(--orynn-color-text);
2294
+ background: var(--orynn-color-accent);
2295
+ color: var(--orynn-color-accent-foreground);
2296
+ }
2297
+ .orynn-calendar__nav:focus-visible,
2298
+ .orynn-calendar__select:focus-visible,
2299
+ .orynn-calendar__day:focus-visible,
2300
+ .orynn-calendar__action:focus-visible {
2301
+ outline: none;
2302
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2303
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
838
2304
  }
839
2305
  .orynn-calendar__nav:disabled {
840
- opacity: 0.35;
2306
+ opacity: 0.5;
841
2307
  cursor: not-allowed;
842
2308
  }
843
2309
  .orynn-calendar__select {
2310
+ appearance: none;
2311
+ -webkit-appearance: none;
844
2312
  border: 0;
845
2313
  background: transparent;
846
2314
  font: inherit;
847
- font-weight: 600;
2315
+ font-weight: 500;
848
2316
  color: inherit;
849
2317
  cursor: pointer;
850
2318
  border-radius: var(--orynn-radius-sm);
851
- padding: 0.1rem 0.2rem;
2319
+ padding: 0.2rem 0.4rem;
2320
+ transition: background-color var(--orynn-transition);
852
2321
  }
853
2322
  .orynn-calendar__select:hover {
854
- background: var(--orynn-color-overlay);
2323
+ background: var(--orynn-color-accent);
2324
+ }
2325
+ .orynn-calendar__select option {
2326
+ color: var(--orynn-color-popover-foreground);
2327
+ background: var(--orynn-color-popover);
855
2328
  }
856
2329
  .orynn-calendar__grid {
857
2330
  inline-size: 100%;
858
2331
  border-collapse: collapse;
859
2332
  }
860
2333
  .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;
2334
+ font-size: var(--orynn-font-size-sm);
2335
+ font-weight: 400;
2336
+ color: var(--orynn-color-muted-foreground);
2337
+ padding: 0.3rem 0 0.45rem;
865
2338
  }
866
2339
  .orynn-calendar__weeknum {
867
- color: var(--orynn-color-text-subtle);
868
- font-size: 0.72rem;
2340
+ color: var(--orynn-color-muted-foreground);
2341
+ font-size: var(--orynn-font-size-sm);
2342
+ text-align: center;
869
2343
  }
870
2344
  .orynn-calendar__day {
871
- inline-size: 2.15rem;
872
- block-size: 2.15rem;
2345
+ inline-size: 2rem;
2346
+ block-size: 2rem;
873
2347
  border: 0;
874
2348
  background: transparent;
875
2349
  font: inherit;
876
- font-size: 0.85rem;
877
- color: var(--orynn-color-text);
878
- border-radius: 999px;
2350
+ font-size: var(--orynn-font-size);
2351
+ color: var(--orynn-color-popover-foreground);
2352
+ border-radius: var(--orynn-radius-md);
879
2353
  cursor: pointer;
880
2354
  transition: background-color var(--orynn-transition), color var(--orynn-transition);
881
2355
  }
882
- .orynn-calendar__day:hover:not(:disabled) {
883
- background: var(--orynn-color-option-hover);
2356
+ .orynn-calendar__day:hover:not(:disabled):not([data-selected]) {
2357
+ background: var(--orynn-color-accent);
2358
+ color: var(--orynn-color-accent-foreground);
884
2359
  }
885
2360
  .orynn-calendar__day[data-outside] {
886
- color: var(--orynn-color-text-subtle);
2361
+ color: var(--orynn-color-muted-foreground);
2362
+ opacity: 0.6;
887
2363
  }
888
- .orynn-calendar__day[data-today] {
889
- box-shadow: inset 0 0 0 1px var(--orynn-color-accent-muted);
890
- font-weight: 700;
2364
+ .orynn-calendar__day[data-today]:not([data-selected]) {
2365
+ background: var(--orynn-color-accent);
2366
+ color: var(--orynn-color-accent-foreground);
891
2367
  }
892
2368
  .orynn-calendar__day[data-selected] {
893
- background: var(--orynn-color-accent);
894
- color: var(--orynn-color-accent-contrast);
895
- font-weight: 700;
2369
+ background: var(--orynn-color-primary);
2370
+ color: var(--orynn-color-primary-foreground);
2371
+ font-weight: 500;
2372
+ }
2373
+ .orynn-calendar__day[data-selected]:hover:not(:disabled) {
2374
+ background: color-mix(in oklch, var(--orynn-color-primary) 90%, transparent);
896
2375
  }
897
2376
  .orynn-calendar__day:disabled {
898
- opacity: 0.3;
2377
+ opacity: 0.4;
899
2378
  cursor: not-allowed;
900
2379
  }
2380
+ /* range mode — additive; only fires when the data-range-* attrs are present */
2381
+ .orynn-calendar__day[data-in-range]:not([data-selected]) {
2382
+ background: color-mix(in oklch, var(--orynn-color-primary) 14%, transparent);
2383
+ color: var(--orynn-color-popover-foreground);
2384
+ border-radius: 0;
2385
+ }
2386
+ .orynn-calendar__day[data-range-start] {
2387
+ border-start-end-radius: 0;
2388
+ border-end-end-radius: 0;
2389
+ }
2390
+ .orynn-calendar__day[data-range-end] {
2391
+ border-start-start-radius: 0;
2392
+ border-end-start-radius: 0;
2393
+ }
2394
+ .orynn-calendar__day[data-range-start][data-range-end] {
2395
+ border-radius: var(--orynn-radius-md);
2396
+ }
901
2397
  .orynn-calendar__footer {
902
2398
  display: flex;
903
2399
  justify-content: space-between;
904
- margin-block-start: 0.5rem;
905
- padding-block-start: 0.5rem;
2400
+ margin-block-start: 0.6rem;
2401
+ padding-block-start: 0.6rem;
906
2402
  border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
907
2403
  }
908
2404
  .orynn-calendar__action {
909
2405
  border: 0;
910
2406
  background: transparent;
911
- color: var(--orynn-color-accent);
2407
+ color: var(--orynn-color-popover-foreground);
912
2408
  font: inherit;
913
- font-size: 0.82rem;
914
- font-weight: 600;
2409
+ font-size: var(--orynn-font-size-sm);
2410
+ font-weight: 500;
915
2411
  cursor: pointer;
916
- padding: 0.2rem 0.4rem;
2412
+ padding: 0.25rem 0.5rem;
917
2413
  border-radius: var(--orynn-radius-sm);
2414
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
918
2415
  }
919
2416
  .orynn-calendar__action:hover {
920
- background: var(--orynn-color-accent-subtle);
2417
+ background: var(--orynn-color-accent);
2418
+ color: var(--orynn-color-accent-foreground);
2419
+ }
2420
+
2421
+ /* clickable header title (drills day -> month -> year) + the month / year
2422
+ pick grids. Additive: the day grid is unchanged. */
2423
+ button.orynn-calendar__title {
2424
+ border: 0;
2425
+ background: transparent;
2426
+ color: inherit;
2427
+ cursor: pointer;
2428
+ padding: 0.2rem 0.5rem;
2429
+ border-radius: var(--orynn-radius-sm);
2430
+ transition: background-color var(--orynn-transition);
2431
+ }
2432
+ button.orynn-calendar__title:hover:not(:disabled) {
2433
+ background: var(--orynn-color-accent);
2434
+ color: var(--orynn-color-accent-foreground);
2435
+ }
2436
+ button.orynn-calendar__title:disabled {
2437
+ cursor: default;
2438
+ }
2439
+ button.orynn-calendar__title:focus-visible {
2440
+ outline: none;
2441
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2442
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2443
+ }
2444
+ .orynn-calendar__pickgrid {
2445
+ display: flex;
2446
+ flex-direction: column;
2447
+ gap: 0.25rem;
2448
+ padding-block: 0.25rem;
2449
+ min-inline-size: 15.5rem;
2450
+ }
2451
+ .orynn-calendar__pickrow {
2452
+ display: grid;
2453
+ grid-template-columns: repeat(3, 1fr);
2454
+ gap: 0.25rem;
2455
+ }
2456
+ .orynn-calendar__cell {
2457
+ block-size: 2.25rem;
2458
+ border: 0;
2459
+ background: transparent;
2460
+ font: inherit;
2461
+ font-size: var(--orynn-font-size-sm);
2462
+ color: var(--orynn-color-popover-foreground);
2463
+ border-radius: var(--orynn-radius-md);
2464
+ cursor: pointer;
2465
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2466
+ }
2467
+ .orynn-calendar__cell:hover:not(:disabled):not([data-selected]) {
2468
+ background: var(--orynn-color-accent);
2469
+ color: var(--orynn-color-accent-foreground);
2470
+ }
2471
+ .orynn-calendar__cell[data-selected] {
2472
+ background: var(--orynn-color-primary);
2473
+ color: var(--orynn-color-primary-foreground);
2474
+ font-weight: 500;
2475
+ }
2476
+ .orynn-calendar__cell[data-outside] {
2477
+ color: var(--orynn-color-muted-foreground);
2478
+ opacity: 0.6;
2479
+ }
2480
+ .orynn-calendar__cell:disabled {
2481
+ opacity: 0.4;
2482
+ cursor: not-allowed;
2483
+ }
2484
+ .orynn-calendar__cell:focus-visible {
2485
+ outline: none;
2486
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2487
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2488
+ }
2489
+
2490
+ /* multi-month day view (numberOfMonths > 1) */
2491
+ .orynn-calendar__panels {
2492
+ display: flex;
2493
+ gap: 1rem;
2494
+ align-items: flex-start;
2495
+ }
2496
+
2497
+ /* preset side rail (only rendered when the `presets` prop is passed) */
2498
+ .orynn-datepicker__panel {
2499
+ display: flex;
2500
+ align-items: stretch;
2501
+ }
2502
+ .orynn-datepicker__presets {
2503
+ display: flex;
2504
+ flex-direction: column;
2505
+ gap: 0.15rem;
2506
+ padding: 0.75rem 0.5rem;
2507
+ border-inline-end: var(--orynn-border-width) solid var(--orynn-color-border);
2508
+ min-inline-size: 8.5rem;
2509
+ }
2510
+ .orynn-datepicker__preset {
2511
+ border: 0;
2512
+ background: transparent;
2513
+ color: var(--orynn-color-popover-foreground);
2514
+ font: inherit;
2515
+ font-size: var(--orynn-font-size-sm);
2516
+ text-align: start;
2517
+ cursor: pointer;
2518
+ padding: 0.4rem 0.5rem;
2519
+ border-radius: var(--orynn-radius-sm);
2520
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2521
+ }
2522
+ .orynn-datepicker__preset:hover {
2523
+ background: var(--orynn-color-accent);
2524
+ color: var(--orynn-color-accent-foreground);
2525
+ }
2526
+ .orynn-datepicker__preset:focus-visible {
2527
+ outline: none;
2528
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2529
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
2530
+ }
2531
+
2532
+ /* time column (showTime) */
2533
+ .orynn-datepicker__withtime {
2534
+ display: flex;
2535
+ align-items: stretch;
2536
+ }
2537
+ .orynn-datepicker__time {
2538
+ display: flex;
2539
+ flex-direction: column;
2540
+ gap: 0.4rem;
2541
+ padding: 0.75rem;
2542
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-border);
2543
+ justify-content: flex-start;
2544
+ }
2545
+ .orynn-datepicker__time-label {
2546
+ font-size: var(--orynn-font-size-sm);
2547
+ font-weight: 500;
2548
+ color: var(--orynn-color-muted-foreground);
2549
+ }
2550
+ .orynn-datepicker__time-fields {
2551
+ display: flex;
2552
+ align-items: center;
2553
+ gap: 0.3rem;
2554
+ color: var(--orynn-color-popover-foreground);
2555
+ }
2556
+ .orynn-datepicker__time-select {
2557
+ appearance: none;
2558
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
2559
+ background: var(--orynn-color-background);
2560
+ color: inherit;
2561
+ font: inherit;
2562
+ font-size: var(--orynn-font-size-sm);
2563
+ border-radius: var(--orynn-radius-sm);
2564
+ padding: 0.25rem 0.4rem;
2565
+ cursor: pointer;
2566
+ }
2567
+ .orynn-datepicker__time-select:focus-visible {
2568
+ outline: none;
2569
+ box-shadow: 0 0 0 var(--orynn-ring-width)
2570
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
921
2571
  }
922
2572
 
923
- /* ------------------------------------------------------------- grid ----- */
2573
+ /* -------------------------------------------------- fieldset / grid ----- */
924
2574
 
925
2575
  .orynn-fieldset {
926
2576
  min-inline-size: 0;
@@ -928,51 +2578,37 @@
928
2578
  padding: 0;
929
2579
  border: 0;
930
2580
  font-family: var(--orynn-font-family);
931
- color: var(--orynn-color-text);
2581
+ color: var(--orynn-color-foreground);
932
2582
  }
933
2583
  .orynn-fieldset__legend {
934
2584
  padding: 0;
935
2585
  margin-block-end: var(--orynn-space-md, 0.75rem);
936
- font-size: 1rem;
937
- font-weight: var(--orynn-label-weight);
2586
+ font-size: var(--orynn-font-size-lg);
2587
+ font-weight: 600;
938
2588
  }
2589
+ /* The active column count (--orynn-cols) is measured and set inline by
2590
+ <FieldGrid>; the stylesheet just consumes it. */
939
2591
  .orynn-grid {
940
- container-type: inline-size;
2592
+ min-inline-size: 0;
941
2593
  }
942
2594
  .orynn-grid__track {
943
2595
  display: grid;
944
2596
  gap: var(--orynn-grid-gap);
945
- grid-template-columns: repeat(var(--orynn-cols-mobile, 1), minmax(0, 1fr));
946
- }
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
- }
954
- }
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
- }
2597
+ grid-template-columns: repeat(var(--orynn-cols, 1), minmax(0, 1fr));
962
2598
  }
963
2599
  .orynn-grid__item {
964
- grid-column: span var(--orynn-span-mobile, 1);
2600
+ grid-column: span var(--orynn-span, 1);
965
2601
  min-inline-size: 0;
966
2602
  }
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
- }
971
- }
972
2603
 
973
2604
  @media (prefers-reduced-motion: reduce) {
974
2605
  .orynn-popover,
975
- .orynn-spin {
2606
+ .orynn-spin,
2607
+ .orynn-content,
2608
+ .orynn-content[data-state="open"],
2609
+ .orynn-content[data-state="closed"],
2610
+ .orynn-overlay[data-state="open"],
2611
+ .orynn-overlay[data-state="closed"] {
976
2612
  animation: none;
977
2613
  }
978
2614
  .orynn-box,