orynn 0.1.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
@@ -1,201 +1,2620 @@
1
1
  /*
2
2
  * orynn — default stylesheet
3
- * Import once in your app: import "orynn/styles.css";
3
+ * Import once: import "orynn/styles.css";
4
4
  *
5
- * Every value below is a CSS custom property on :root. Override them (globally,
6
- * or scoped to a container) to theme the components no build step, no JS.
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: #1a1d21;
12
- --orynn-color-text-muted: #5b6470;
13
- --orynn-color-bg: #ffffff;
14
- --orynn-color-bg-disabled: #f1f3f5;
15
- --orynn-color-border: #c7ccd1;
16
- --orynn-color-border-hover: #9aa2ab;
17
- --orynn-color-focus: #2563eb;
18
- --orynn-color-focus-ring: rgba(37, 99, 235, 0.35);
19
- --orynn-color-error: #d1242f;
20
- --orynn-color-error-border: #e5484d;
21
-
22
- /* 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 ---------------------------------------------- */
23
79
  --orynn-font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
24
- --orynn-font-size: 0.9375rem;
80
+ --orynn-font-size: 0.875rem; /* text-sm */
81
+ --orynn-font-size-sm: 0.8125rem;
82
+ --orynn-font-size-lg: 1rem;
25
83
  --orynn-label-font-size: 0.875rem;
26
- --orynn-help-font-size: 0.8125rem;
27
- --orynn-label-weight: 600;
84
+ --orynn-label-weight: 500; /* font-medium */
85
+ --orynn-help-font-size: 0.875rem; /* shadcn description / message = text-sm */
28
86
  --orynn-line-height: 1.5;
29
87
 
30
- /* spacing & shape */
31
- --orynn-space-2xs: 0.25rem;
32
- --orynn-space-xs: 0.375rem;
33
- --orynn-space-sm: 0.5rem;
34
- --orynn-space-md: 0.75rem;
35
- --orynn-radius: 6px;
36
- --orynn-control-min-height: 2.5rem;
37
- --orynn-control-padding-x: 0.6875rem;
38
- --orynn-border-width: 1px;
88
+ /* ---- control sizing & density ------------------------------- */
89
+ --orynn-control-width: 100%;
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;
39
97
 
40
- /* layout */
98
+ --orynn-check-size: 1rem; /* size-4 */
99
+ --orynn-check-radius: 4px;
100
+
101
+ /* ---- Fieldset grid ------------------------------------------ */
41
102
  --orynn-grid-gap: 1rem;
103
+ --orynn-space-md: 0.75rem;
42
104
  --orynn-cols-desktop: 3;
43
105
  --orynn-cols-tablet: 2;
44
106
  --orynn-cols-mobile: 1;
45
107
  }
46
108
 
47
- /* ---------------------------------------------------------------- fieldset -- */
48
-
49
- .orynn-fieldset {
50
- min-inline-size: 0;
51
- margin: 0;
52
- padding: 0;
53
- border: 0;
54
- font-family: var(--orynn-font-family);
55
- color: var(--orynn-color-text);
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. */
113
+ [data-orynn-theme="slate"] {
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);
56
117
  }
57
-
58
- .orynn-fieldset__legend {
59
- padding: 0;
60
- margin-block-end: var(--orynn-space-md);
61
- font-size: 1rem;
62
- font-weight: var(--orynn-label-weight);
118
+ [data-orynn-theme="teal"] {
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);
122
+ }
123
+ [data-orynn-theme="violet"] {
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);
127
+ }
128
+ [data-orynn-theme="rose"] {
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);
132
+ }
133
+ [data-orynn-theme="emerald"] {
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);
63
137
  }
64
138
 
65
- /* ------------------------------------------------------------------- grid --- */
139
+ /* ---------------------------------------------------------------- density --
140
+ orynn extension. Touches only control height, inline padding and gaps;
141
+ radius no longer changes with density. `comfortable` == default. */
142
+ [data-orynn-density="compact"] {
143
+ --orynn-control-h: 2rem;
144
+ --orynn-control-h-sm: 1.75rem;
145
+ --orynn-control-h-lg: 2.25rem;
146
+ --orynn-control-px: 0.625rem;
147
+ --orynn-gap: 0.375rem;
148
+ --orynn-field-gap: 0.375rem;
149
+ }
150
+ [data-orynn-density="spacious"] {
151
+ --orynn-control-h: 2.75rem;
152
+ --orynn-control-h-sm: 2.5rem;
153
+ --orynn-control-h-lg: 3.25rem;
154
+ --orynn-control-px: 1rem;
155
+ --orynn-gap: 0.625rem;
156
+ --orynn-field-gap: 0.625rem;
157
+ }
66
158
 
67
- .orynn-grid {
68
- container-type: inline-size;
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;
69
187
  }
70
188
 
71
- .orynn-grid__track {
72
- display: grid;
73
- gap: var(--orynn-grid-gap);
74
- grid-template-columns: repeat(var(--orynn-cols-mobile, 1), minmax(0, 1fr));
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);
75
229
  }
76
230
 
77
- @container (min-width: 30rem) {
78
- .orynn-grid__track {
79
- grid-template-columns: repeat(var(--orynn-cols-tablet, 2), minmax(0, 1fr));
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));
80
250
  }
81
- .orynn-grid__item {
82
- grid-column: span var(--orynn-span-tablet, 1);
251
+ }
252
+ @keyframes orynn-overlay-in {
253
+ from {
254
+ opacity: 0;
83
255
  }
84
256
  }
85
-
86
- @container (min-width: 48rem) {
87
- .orynn-grid__track {
88
- grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
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);
89
276
  }
90
- .orynn-grid__item {
91
- grid-column: span var(--orynn-span-desktop, 1);
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;
92
293
  }
93
294
  }
94
295
 
95
- .orynn-grid__item {
96
- grid-column: span var(--orynn-span-mobile, 1);
97
- min-inline-size: 0;
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);
98
301
  }
99
302
 
100
- /* Fallback for engines without container-query support. */
101
- @supports not (container-type: inline-size) {
102
- .orynn-grid__track {
103
- grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
104
- }
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);
105
345
  }
106
346
 
107
- /* ------------------------------------------------------------------ field --- */
347
+ /* ===================================================================== *
348
+ * components
349
+ * ===================================================================== */
350
+
351
+ /* ------------------------------------------------------------ field ---- */
108
352
 
109
353
  .orynn-field {
110
354
  display: flex;
111
355
  flex-direction: column;
112
- gap: var(--orynn-space-xs);
356
+ gap: var(--orynn-field-gap);
357
+ inline-size: var(--orynn-control-width);
358
+ max-inline-size: var(--orynn-control-max-width, 450px);
113
359
  font-family: var(--orynn-font-family);
114
360
  font-size: var(--orynn-font-size);
115
361
  line-height: var(--orynn-line-height);
116
- color: var(--orynn-color-text);
362
+ color: var(--orynn-color-foreground);
117
363
  }
118
-
119
364
  .orynn-field__label {
120
365
  font-size: var(--orynn-label-font-size);
121
366
  font-weight: var(--orynn-label-weight);
367
+ line-height: 1;
122
368
  }
123
-
124
369
  .orynn-field[data-required] .orynn-field__label::after {
125
370
  content: " *";
126
- color: var(--orynn-color-error);
371
+ color: var(--orynn-color-destructive);
127
372
  }
128
-
129
373
  .orynn-field__description {
130
374
  margin: 0;
131
375
  font-size: var(--orynn-help-font-size);
132
- color: var(--orynn-color-text-muted);
376
+ color: var(--orynn-color-muted-foreground);
133
377
  }
134
-
135
378
  .orynn-field__control {
136
379
  display: block;
137
380
  }
138
-
139
381
  .orynn-field__error {
140
382
  margin: 0;
383
+ display: flex;
384
+ flex-direction: column;
385
+ gap: 0.15rem;
141
386
  font-size: var(--orynn-help-font-size);
142
- color: var(--orynn-color-error);
387
+ color: var(--orynn-color-destructive);
143
388
  }
144
-
145
389
  .orynn-field__error span {
146
390
  display: block;
147
391
  }
392
+ .orynn-field__success {
393
+ margin: 0;
394
+ font-size: var(--orynn-help-font-size);
395
+ color: var(--orynn-color-success);
396
+ }
148
397
 
149
- /* --------------------------------------------------------------- controls --- */
398
+ /* ------------------------------------------------------- field box ---- *
399
+ * shadcn Input / Select frame: h-9, rounded-md, 1px border-input,
400
+ * shadow-xs, transparent fill, focus = ring + border-ring. */
150
401
 
151
- .orynn-input,
152
- .orynn-dropdown {
153
- inline-size: 100%;
154
- min-block-size: var(--orynn-control-min-height);
155
- padding: var(--orynn-space-sm) var(--orynn-control-padding-x);
156
- font-family: inherit;
402
+ .orynn-box {
403
+ position: relative;
404
+ display: flex;
405
+ align-items: stretch;
406
+ inline-size: var(--orynn-control-width);
407
+ max-inline-size: var(--orynn-control-max-width, 450px);
408
+ min-block-size: var(--orynn-control-h);
409
+ box-sizing: border-box;
410
+ font-family: var(--orynn-font-family);
157
411
  font-size: var(--orynn-font-size);
158
412
  line-height: var(--orynn-line-height);
159
- color: var(--orynn-color-text);
160
- background-color: var(--orynn-color-bg);
161
- border: var(--orynn-border-width) solid var(--orynn-color-border);
162
- border-radius: var(--orynn-radius);
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);
424
+ }
425
+ .orynn-box[data-size="sm"] {
426
+ min-block-size: var(--orynn-control-h-sm);
427
+ font-size: var(--orynn-font-size-sm);
428
+ }
429
+ .orynn-box[data-size="lg"] {
430
+ min-block-size: var(--orynn-control-h-lg);
431
+ font-size: var(--orynn-font-size-lg);
432
+ }
433
+ .orynn-box[data-radius="sm"] {
434
+ border-radius: var(--orynn-radius-sm);
435
+ }
436
+ .orynn-box[data-radius="md"] {
437
+ border-radius: var(--orynn-radius-md);
438
+ }
439
+ .orynn-box[data-radius="lg"] {
440
+ border-radius: var(--orynn-radius-lg);
441
+ }
442
+ .orynn-box[data-radius="pill"] {
443
+ border-radius: var(--orynn-radius-pill);
444
+ }
445
+ .orynn-box[data-radius="none"] {
446
+ border-radius: 0;
447
+ }
448
+
449
+ .orynn-box[data-variant="filled"] {
450
+ background: var(--orynn-color-muted);
451
+ border-color: transparent;
452
+ }
453
+ .orynn-box[data-variant="flushed"] {
454
+ border-radius: 0;
455
+ border-inline: 0;
456
+ border-block-start: 0;
457
+ box-shadow: none;
458
+ padding-inline: 0;
459
+ }
460
+ .orynn-box[data-variant="unstyled"] {
461
+ border-color: transparent;
462
+ background: transparent;
463
+ box-shadow: none;
464
+ }
465
+
466
+ .orynn-box[data-focused] {
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);
470
+ outline: none;
471
+ }
472
+ .orynn-box[data-invalid] {
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
+ );
480
+ }
481
+ .orynn-box[data-valid] {
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);
485
+ }
486
+ .orynn-box[data-disabled] {
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);
163
498
  box-sizing: border-box;
164
- transition: border-color 0.12s ease, box-shadow 0.12s ease;
499
+ }
500
+ .orynn-box__group[data-disabled] {
501
+ opacity: 0.5;
502
+ cursor: not-allowed;
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
+ }
552
+
553
+ .orynn-box__field {
554
+ flex: 1 1 auto;
555
+ min-inline-size: 0;
556
+ border: 0;
557
+ outline: 0;
558
+ background: transparent;
559
+ font: inherit;
560
+ color: inherit;
561
+ padding: 0 var(--orynn-control-px);
562
+ text-overflow: ellipsis;
563
+ }
564
+ .orynn-box__field::placeholder {
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);
570
+ }
571
+ .orynn-box__field:disabled {
572
+ cursor: not-allowed;
573
+ }
574
+ .orynn-box[data-disabled] .orynn-box__field {
575
+ pointer-events: none;
576
+ }
577
+
578
+ .orynn-box__adornment {
579
+ display: flex;
580
+ align-items: center;
581
+ gap: 0.25rem;
582
+ padding-inline: 0.5rem;
583
+ color: var(--orynn-color-muted-foreground);
584
+ flex: 0 0 auto;
585
+ }
586
+ .orynn-box__adornment:first-child {
587
+ padding-inline: var(--orynn-control-px) 0.25rem;
588
+ }
589
+ .orynn-box__adornment--affix {
590
+ color: var(--orynn-color-muted-foreground);
591
+ font-variant-numeric: tabular-nums;
592
+ }
593
+ .orynn-box__iconbtn {
594
+ display: inline-flex;
595
+ align-items: center;
596
+ justify-content: center;
597
+ inline-size: 1.5rem;
598
+ block-size: 1.5rem;
599
+ border: 0;
600
+ background: transparent;
601
+ border-radius: var(--orynn-radius-sm);
602
+ color: var(--orynn-color-muted-foreground);
603
+ cursor: pointer;
604
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
605
+ }
606
+ .orynn-box__iconbtn:hover {
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);
614
+ }
615
+ .orynn-box__iconbtn:disabled {
616
+ opacity: 0.5;
617
+ cursor: not-allowed;
618
+ }
619
+
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;
625
+ }
626
+ .orynn-box--floating .orynn-box__label {
627
+ position: absolute;
628
+ inset-block-start: 50%;
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;
636
+ transform: translateY(-50%);
637
+ transform-origin: left center;
638
+ color: var(--orynn-color-muted-foreground);
639
+ background: transparent;
640
+ pointer-events: none;
641
+ transition: transform var(--orynn-transition), top var(--orynn-transition), color
642
+ var(--orynn-transition);
643
+ font-size: inherit;
644
+ line-height: 1;
645
+ }
646
+ .orynn-box--floating[data-active] .orynn-box__label {
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);
657
+ }
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);
663
+ }
664
+ .orynn-box--floating[data-active] .orynn-box__adornment:first-child ~ .orynn-box__label {
665
+ inset-inline-start: calc(var(--orynn-control-px) + 1px);
165
666
  }
166
667
 
167
- .orynn-input:hover:not(:disabled),
168
- .orynn-dropdown:hover:not(:disabled) {
169
- border-color: var(--orynn-color-border-hover);
668
+ .orynn-icon-success {
669
+ color: var(--orynn-color-success);
670
+ }
671
+ .orynn-icon-error {
672
+ color: var(--orynn-color-destructive);
170
673
  }
674
+ .orynn-spin {
675
+ animation: orynn-spin 0.7s linear infinite;
676
+ }
677
+
678
+ /* ----------------------------------------------------------- inputs ---- */
171
679
 
680
+ .orynn-input {
681
+ /* class kept for back-compat + the Fieldset native fallbacks */
682
+ inline-size: 100%;
683
+ max-inline-size: var(--orynn-control-max-width, 450px);
684
+ min-block-size: var(--orynn-control-h);
685
+ padding: 0 var(--orynn-control-px);
686
+ font-family: inherit;
687
+ font-size: var(--orynn-font-size);
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);
693
+ box-sizing: border-box;
694
+ transition: color var(--orynn-transition), border-color var(--orynn-transition), box-shadow
695
+ var(--orynn-transition);
696
+ }
697
+ .orynn-input::placeholder {
698
+ color: var(--orynn-color-muted-foreground);
699
+ }
172
700
  .orynn-input:focus-visible,
173
701
  .orynn-dropdown:focus-visible {
174
702
  outline: none;
175
- border-color: var(--orynn-color-focus);
176
- box-shadow: 0 0 0 3px 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);
177
706
  }
178
-
179
707
  .orynn-input[aria-invalid="true"],
180
708
  .orynn-dropdown[aria-invalid="true"] {
181
- 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
+ );
182
716
  }
183
-
184
717
  .orynn-input:disabled,
185
718
  .orynn-dropdown:disabled {
186
- background-color: var(--orynn-color-bg-disabled);
187
- color: var(--orynn-color-text-muted);
719
+ opacity: 0.5;
188
720
  cursor: not-allowed;
189
721
  }
190
722
 
191
- .orynn-input:read-only {
192
- background-color: var(--orynn-color-bg-disabled);
193
- }
194
-
723
+ /* native <select> — used by the Fieldset built-in and `<Dropdown native />` */
195
724
  .orynn-dropdown {
725
+ inline-size: 100%;
726
+ max-inline-size: var(--orynn-control-max-width, 450px);
727
+ min-block-size: var(--orynn-control-h);
728
+ padding: 0 2rem 0 var(--orynn-control-px);
729
+ font-family: inherit;
730
+ font-size: var(--orynn-font-size);
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);
736
+ box-sizing: border-box;
196
737
  appearance: none;
197
- padding-inline-end: 2rem;
198
- 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");
199
741
  background-repeat: no-repeat;
200
- background-position: right var(--orynn-control-padding-x) center;
742
+ background-position: right var(--orynn-control-px) center;
743
+ }
744
+
745
+ /* --------------------------------------------------------- textarea ---- */
746
+
747
+ .orynn-box--textarea {
748
+ align-items: stretch;
749
+ min-block-size: 0;
750
+ }
751
+ .orynn-textarea {
752
+ flex: 1 1 auto;
753
+ min-inline-size: 0;
754
+ border: 0;
755
+ outline: 0;
756
+ background: transparent;
757
+ font: inherit;
758
+ color: inherit;
759
+ padding: 0.5rem var(--orynn-control-px);
760
+ resize: vertical;
761
+ min-block-size: 4rem;
762
+ }
763
+ .orynn-textarea::placeholder {
764
+ color: var(--orynn-color-muted-foreground);
765
+ }
766
+ .orynn-textarea[data-resize="none"] {
767
+ resize: none;
768
+ }
769
+ .orynn-textarea[data-resize="both"] {
770
+ resize: both;
771
+ }
772
+ .orynn-box--floating.orynn-box--textarea {
773
+ min-block-size: 0;
774
+ }
775
+ .orynn-box--floating.orynn-box--textarea .orynn-box__label {
776
+ inset-block-start: 0;
777
+ transform: translateY(0.6rem);
778
+ }
779
+ .orynn-box--floating.orynn-box--textarea[data-active] .orynn-box__label {
780
+ transform: translateY(-50%) scale(0.8);
781
+ }
782
+ .orynn-box__footer {
783
+ position: absolute;
784
+ inset-inline-end: 0.5rem;
785
+ inset-block-end: 0.35rem;
786
+ font-size: var(--orynn-font-size-sm);
787
+ color: var(--orynn-color-muted-foreground);
788
+ font-variant-numeric: tabular-nums;
789
+ pointer-events: none;
790
+ }
791
+
792
+ /* ----------------------------------------------------------- number ----- */
793
+
794
+ .orynn-number__buttons {
795
+ display: flex;
796
+ flex-direction: column;
797
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-input);
798
+ flex: 0 0 auto;
799
+ }
800
+ .orynn-number__buttons--horizontal {
801
+ flex-direction: row-reverse;
802
+ }
803
+ .orynn-number__btn {
804
+ display: flex;
805
+ align-items: center;
806
+ justify-content: center;
807
+ inline-size: 1.9rem;
808
+ flex: 1 1 0;
809
+ border: 0;
810
+ background: transparent;
811
+ color: var(--orynn-color-muted-foreground);
812
+ cursor: pointer;
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;
818
+ }
819
+ .orynn-number__btn:hover:not(:disabled) {
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%);
825
+ }
826
+ .orynn-number__btn:disabled {
827
+ opacity: 0.5;
828
+ cursor: not-allowed;
829
+ }
830
+ .orynn-number__btn + .orynn-number__btn {
831
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-input);
832
+ }
833
+ .orynn-number__buttons--horizontal .orynn-number__btn + .orynn-number__btn {
834
+ border-block-start: 0;
835
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-input);
836
+ }
837
+
838
+ /* ------------------------------------------------------- checkbox/radio -- */
839
+
840
+ .orynn-choice {
841
+ position: relative;
842
+ display: inline-flex;
843
+ align-items: flex-start;
844
+ gap: 0.5rem;
845
+ font-family: var(--orynn-font-family);
846
+ font-size: var(--orynn-font-size);
847
+ color: var(--orynn-color-foreground);
848
+ cursor: pointer;
849
+ line-height: 1.4;
850
+ }
851
+ .orynn-choice[data-disabled] {
852
+ cursor: not-allowed;
853
+ opacity: 0.5;
854
+ }
855
+ .orynn-choice--start {
856
+ flex-direction: row-reverse;
857
+ }
858
+
859
+ .orynn-choice__native {
860
+ position: absolute;
861
+ inset: 0;
862
+ inline-size: 100%;
863
+ block-size: 100%;
864
+ margin: 0;
865
+ opacity: 0;
866
+ cursor: inherit;
867
+ }
868
+
869
+ .orynn-choice__control {
870
+ position: relative;
871
+ flex: 0 0 auto;
872
+ inline-size: var(--orynn-check-size);
873
+ block-size: var(--orynn-check-size);
874
+ margin-block-start: 0.125rem;
875
+ display: grid;
876
+ place-items: center;
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);
881
+ transition: background-color var(--orynn-transition), border-color var(--orynn-transition),
882
+ box-shadow var(--orynn-transition);
883
+ }
884
+ .orynn-choice__control--checkbox {
885
+ border-radius: var(--orynn-check-radius);
886
+ }
887
+ .orynn-choice__control--radio {
888
+ border-radius: 9999px;
889
+ color: var(--orynn-color-primary);
890
+ }
891
+
892
+ .orynn-choice__native:focus-visible ~ .orynn-choice__control {
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);
896
+ }
897
+ .orynn-choice[data-invalid] .orynn-choice__control {
898
+ border-color: var(--orynn-color-destructive);
899
+ }
900
+
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 {
909
+ background: transparent;
910
+ color: var(--orynn-color-primary);
911
+ }
912
+
913
+ .orynn-choice__mark {
914
+ grid-area: 1 / 1;
915
+ display: grid;
916
+ place-items: center;
917
+ inline-size: 85%;
918
+ block-size: 85%;
919
+ opacity: 0;
920
+ transform: scale(0.5);
921
+ transition: opacity var(--orynn-transition), transform var(--orynn-transition);
922
+ }
923
+ .orynn-choice__mark svg {
924
+ inline-size: 100%;
925
+ block-size: 100%;
926
+ }
927
+ .orynn-choice__native:checked ~ .orynn-choice__control .orynn-choice__mark--check {
928
+ opacity: 1;
929
+ transform: scale(1);
930
+ }
931
+ .orynn-choice__native:indeterminate ~ .orynn-choice__control .orynn-choice__mark--check {
932
+ opacity: 0;
933
+ }
934
+ .orynn-choice__native:indeterminate ~ .orynn-choice__control .orynn-choice__mark--dash {
935
+ opacity: 1;
936
+ transform: scale(1);
937
+ }
938
+
939
+ .orynn-choice__mark--dot {
940
+ inline-size: 0.5rem;
941
+ block-size: 0.5rem;
942
+ border-radius: 9999px;
943
+ background: currentColor;
944
+ }
945
+ .orynn-choice__native:checked ~ .orynn-choice__control--radio .orynn-choice__mark--dot {
946
+ opacity: 1;
947
+ transform: scale(1);
948
+ }
949
+
950
+ .orynn-choice__text {
951
+ display: flex;
952
+ flex-direction: column;
953
+ gap: 0.1rem;
954
+ }
955
+ .orynn-choice__label {
956
+ font-weight: 500;
957
+ }
958
+ .orynn-choice__desc {
959
+ font-size: var(--orynn-help-font-size);
960
+ color: var(--orynn-color-muted-foreground);
961
+ }
962
+
963
+ .orynn-choice-group {
964
+ display: flex;
965
+ flex-direction: column;
966
+ gap: 0.75rem;
967
+ }
968
+ .orynn-choice-group[data-orientation="horizontal"] {
969
+ flex-direction: row;
970
+ flex-wrap: wrap;
971
+ gap: 1rem;
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
+ }
990
+
991
+ .orynn-choice--card {
992
+ border: var(--orynn-border-width) solid var(--orynn-color-input);
993
+ border-radius: var(--orynn-radius-md);
994
+ padding: 0.75rem;
995
+ align-items: center;
996
+ box-shadow: var(--orynn-shadow-xs);
997
+ transition: border-color var(--orynn-transition), background-color var(--orynn-transition);
998
+ }
999
+ .orynn-choice--card:has(.orynn-choice__native:checked) {
1000
+ border-color: var(--orynn-color-primary);
1001
+ background: color-mix(in oklch, var(--orynn-color-primary) 5%, var(--orynn-color-background));
1002
+ }
1003
+ .orynn-choice--card:has(.orynn-choice__native:focus-visible) {
1004
+ box-shadow: 0 0 0 var(--orynn-ring-width)
1005
+ color-mix(in oklch, var(--orynn-color-ring) 50%, transparent);
1006
+ }
1007
+
1008
+ /* ------------------------------------------------------------- label ---- */
1009
+
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;
1018
+ }
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;
1032
+ }
1033
+
1034
+ /* ------------------------------------------------------------ button ---- */
1035
+
1036
+ .orynn-button {
1037
+ display: inline-flex;
1038
+ flex-shrink: 0;
1039
+ align-items: center;
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;
1064
+ }
1065
+ .orynn-button:hover {
1066
+ background: color-mix(in oklch, var(--orynn-color-primary) 90%, transparent);
1067
+ }
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);
1072
+ }
1073
+ .orynn-button:disabled,
1074
+ .orynn-button[data-disabled] {
1075
+ pointer-events: none;
1076
+ opacity: 0.5;
1077
+ }
1078
+ .orynn-button[aria-invalid="true"] {
1079
+ border-color: var(--orynn-color-destructive);
1080
+ }
1081
+
1082
+ .orynn-button--secondary {
1083
+ background: var(--orynn-color-secondary);
1084
+ color: var(--orynn-color-secondary-foreground);
1085
+ }
1086
+ .orynn-button--secondary:hover {
1087
+ background: color-mix(in oklch, var(--orynn-color-secondary) 80%, transparent);
1088
+ }
1089
+ .orynn-button--destructive {
1090
+ background: var(--orynn-color-destructive);
1091
+ color: #fff;
1092
+ }
1093
+ .orynn-button--destructive:hover {
1094
+ background: color-mix(in oklch, var(--orynn-color-destructive) 90%, transparent);
1095
+ }
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);
1099
+ }
1100
+ .orynn-button--outline {
1101
+ border-color: var(--orynn-color-border);
1102
+ background: var(--orynn-color-background);
1103
+ box-shadow: var(--orynn-shadow-xs);
1104
+ color: var(--orynn-color-foreground);
1105
+ }
1106
+ .orynn-button--outline:hover {
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);
2142
+ overflow-y: auto;
2143
+ overscroll-behavior: contain;
2144
+ padding: 0.25rem;
2145
+ scroll-padding-block: 0.25rem;
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;
2158
+ }
2159
+ .orynn-listbox__empty {
2160
+ padding: 1rem 0.75rem;
2161
+ text-align: center;
2162
+ color: var(--orynn-color-muted-foreground);
2163
+ font-size: var(--orynn-help-font-size);
2164
+ }
2165
+ .orynn-listbox__group {
2166
+ padding: 0.375rem 0.5rem;
2167
+ font-size: var(--orynn-font-size-sm);
2168
+ color: var(--orynn-color-muted-foreground);
2169
+ position: sticky;
2170
+ inset-block-start: -0.25rem;
2171
+ background: var(--orynn-color-popover);
2172
+ z-index: 1;
2173
+ }
2174
+ .orynn-option {
2175
+ display: flex;
2176
+ align-items: center;
2177
+ gap: 0.5rem;
2178
+ padding: 0.375rem 0.5rem;
2179
+ border-radius: var(--orynn-radius-sm);
2180
+ cursor: pointer;
2181
+ color: var(--orynn-color-popover-foreground);
2182
+ line-height: 1.35;
2183
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2184
+ }
2185
+ .orynn-option__body {
2186
+ display: flex;
2187
+ flex-direction: column;
2188
+ gap: 0.05rem;
2189
+ flex: 1 1 auto;
2190
+ min-inline-size: 0;
2191
+ }
2192
+ .orynn-option__label {
2193
+ overflow: hidden;
2194
+ text-overflow: ellipsis;
2195
+ white-space: nowrap;
2196
+ }
2197
+ .orynn-option__label mark {
2198
+ background: transparent;
2199
+ color: var(--orynn-color-primary);
2200
+ font-weight: 600;
2201
+ }
2202
+ .orynn-option__desc {
2203
+ font-size: var(--orynn-help-font-size);
2204
+ color: var(--orynn-color-muted-foreground);
2205
+ overflow: hidden;
2206
+ text-overflow: ellipsis;
2207
+ white-space: nowrap;
2208
+ }
2209
+ .orynn-option[data-active] {
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;
2215
+ }
2216
+ .orynn-option[data-selected] {
2217
+ font-weight: 500;
2218
+ }
2219
+ .orynn-option[data-disabled] {
2220
+ opacity: 0.5;
2221
+ cursor: not-allowed;
2222
+ }
2223
+ .orynn-option__check {
2224
+ margin-inline-start: auto;
2225
+ color: currentColor;
2226
+ flex: 0 0 auto;
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
+ }
2255
+
2256
+ /* ------------------------------------------------------- datepicker ----- */
2257
+
2258
+ .orynn-calendar {
2259
+ padding: 0.75rem;
2260
+ inline-size: max-content;
2261
+ color: var(--orynn-color-popover-foreground);
2262
+ user-select: none;
2263
+ }
2264
+ .orynn-calendar__header {
2265
+ display: flex;
2266
+ align-items: center;
2267
+ justify-content: space-between;
2268
+ gap: 0.25rem;
2269
+ margin-block-end: 0.5rem;
2270
+ }
2271
+ .orynn-calendar__title {
2272
+ display: flex;
2273
+ flex: 1 1 auto;
2274
+ gap: 0.25rem;
2275
+ justify-content: center;
2276
+ font-weight: 500;
2277
+ font-size: var(--orynn-font-size);
2278
+ }
2279
+ .orynn-calendar__nav {
2280
+ display: inline-flex;
2281
+ flex: 0 0 auto;
2282
+ align-items: center;
2283
+ justify-content: center;
2284
+ inline-size: 2rem;
2285
+ block-size: 2rem;
2286
+ border: 0;
2287
+ background: transparent;
2288
+ border-radius: var(--orynn-radius-md);
2289
+ color: var(--orynn-color-muted-foreground);
2290
+ cursor: pointer;
2291
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2292
+ }
2293
+ .orynn-calendar__nav:hover:not(:disabled) {
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);
2304
+ }
2305
+ .orynn-calendar__nav:disabled {
2306
+ opacity: 0.5;
2307
+ cursor: not-allowed;
2308
+ }
2309
+ .orynn-calendar__select {
2310
+ appearance: none;
2311
+ -webkit-appearance: none;
2312
+ border: 0;
2313
+ background: transparent;
2314
+ font: inherit;
2315
+ font-weight: 500;
2316
+ color: inherit;
2317
+ cursor: pointer;
2318
+ border-radius: var(--orynn-radius-sm);
2319
+ padding: 0.2rem 0.4rem;
2320
+ transition: background-color var(--orynn-transition);
2321
+ }
2322
+ .orynn-calendar__select:hover {
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);
2328
+ }
2329
+ .orynn-calendar__grid {
2330
+ inline-size: 100%;
2331
+ border-collapse: collapse;
2332
+ }
2333
+ .orynn-calendar__grid th {
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;
2338
+ }
2339
+ .orynn-calendar__weeknum {
2340
+ color: var(--orynn-color-muted-foreground);
2341
+ font-size: var(--orynn-font-size-sm);
2342
+ text-align: center;
2343
+ }
2344
+ .orynn-calendar__day {
2345
+ inline-size: 2rem;
2346
+ block-size: 2rem;
2347
+ border: 0;
2348
+ background: transparent;
2349
+ font: inherit;
2350
+ font-size: var(--orynn-font-size);
2351
+ color: var(--orynn-color-popover-foreground);
2352
+ border-radius: var(--orynn-radius-md);
2353
+ cursor: pointer;
2354
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2355
+ }
2356
+ .orynn-calendar__day:hover:not(:disabled):not([data-selected]) {
2357
+ background: var(--orynn-color-accent);
2358
+ color: var(--orynn-color-accent-foreground);
2359
+ }
2360
+ .orynn-calendar__day[data-outside] {
2361
+ color: var(--orynn-color-muted-foreground);
2362
+ opacity: 0.6;
2363
+ }
2364
+ .orynn-calendar__day[data-today]:not([data-selected]) {
2365
+ background: var(--orynn-color-accent);
2366
+ color: var(--orynn-color-accent-foreground);
2367
+ }
2368
+ .orynn-calendar__day[data-selected] {
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);
2375
+ }
2376
+ .orynn-calendar__day:disabled {
2377
+ opacity: 0.4;
2378
+ cursor: not-allowed;
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
+ }
2397
+ .orynn-calendar__footer {
2398
+ display: flex;
2399
+ justify-content: space-between;
2400
+ margin-block-start: 0.6rem;
2401
+ padding-block-start: 0.6rem;
2402
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
2403
+ }
2404
+ .orynn-calendar__action {
2405
+ border: 0;
2406
+ background: transparent;
2407
+ color: var(--orynn-color-popover-foreground);
2408
+ font: inherit;
2409
+ font-size: var(--orynn-font-size-sm);
2410
+ font-weight: 500;
2411
+ cursor: pointer;
2412
+ padding: 0.25rem 0.5rem;
2413
+ border-radius: var(--orynn-radius-sm);
2414
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
2415
+ }
2416
+ .orynn-calendar__action:hover {
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);
2571
+ }
2572
+
2573
+ /* -------------------------------------------------- fieldset / grid ----- */
2574
+
2575
+ .orynn-fieldset {
2576
+ min-inline-size: 0;
2577
+ margin: 0;
2578
+ padding: 0;
2579
+ border: 0;
2580
+ font-family: var(--orynn-font-family);
2581
+ color: var(--orynn-color-foreground);
2582
+ }
2583
+ .orynn-fieldset__legend {
2584
+ padding: 0;
2585
+ margin-block-end: var(--orynn-space-md, 0.75rem);
2586
+ font-size: var(--orynn-font-size-lg);
2587
+ font-weight: 600;
2588
+ }
2589
+ /* The active column count (--orynn-cols) is measured and set inline by
2590
+ <FieldGrid>; the stylesheet just consumes it. */
2591
+ .orynn-grid {
2592
+ min-inline-size: 0;
2593
+ }
2594
+ .orynn-grid__track {
2595
+ display: grid;
2596
+ gap: var(--orynn-grid-gap);
2597
+ grid-template-columns: repeat(var(--orynn-cols, 1), minmax(0, 1fr));
2598
+ }
2599
+ .orynn-grid__item {
2600
+ grid-column: span var(--orynn-span, 1);
2601
+ min-inline-size: 0;
2602
+ }
2603
+
2604
+ @media (prefers-reduced-motion: reduce) {
2605
+ .orynn-popover,
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"] {
2612
+ animation: none;
2613
+ }
2614
+ .orynn-box,
2615
+ .orynn-option,
2616
+ .orynn-calendar__day,
2617
+ .orynn-choice__control {
2618
+ transition: none;
2619
+ }
201
2620
  }