orynn 0.1.0 → 0.2.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,984 @@
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
+ * Every value is a CSS custom property. Override globally on :root, per-subtree
6
+ * with `[data-orynn-theme]` / inline vars, or via <OrynnProvider>.
7
7
  */
8
8
 
9
9
  :root {
10
- /* palette */
11
- --orynn-color-text: #1a1d21;
12
- --orynn-color-text-muted: #5b6470;
10
+ /* ---- palette --------------------------------------------------------- */
11
+ --orynn-color-text: #16181d;
12
+ --orynn-color-text-muted: #5b6472;
13
+ --orynn-color-text-subtle: #858e9c;
13
14
  --orynn-color-bg: #ffffff;
15
+ --orynn-color-bg-subtle: #f7f8fa;
14
16
  --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);
17
+ --orynn-color-border: #d6dae0;
18
+ --orynn-color-border-hover: #b3b9c2;
19
+
20
+ /* accent / highlight — the one colour a theme changes most */
21
+ --orynn-color-accent: #6366f1;
22
+ --orynn-color-accent-hover: #5457e5;
23
+ --orynn-color-accent-contrast: #ffffff;
24
+ --orynn-color-accent-subtle: color-mix(in srgb, var(--orynn-color-accent) 12%, transparent);
25
+ --orynn-color-accent-muted: color-mix(in srgb, var(--orynn-color-accent) 26%, transparent);
26
+
27
+ --orynn-color-focus: var(--orynn-color-accent);
28
+ --orynn-color-focus-ring: color-mix(in srgb, var(--orynn-color-accent) 25%, transparent);
29
+
19
30
  --orynn-color-error: #d1242f;
20
31
  --orynn-color-error-border: #e5484d;
32
+ --orynn-color-error-ring: color-mix(in srgb, #e5484d 25%, transparent);
33
+ --orynn-color-success: #12805c;
34
+ --orynn-color-success-border: #30a46c;
35
+ --orynn-color-success-ring: color-mix(in srgb, #30a46c 22%, transparent);
21
36
 
22
- /* typography */
37
+ --orynn-color-option-hover: var(--orynn-color-accent-subtle);
38
+ --orynn-color-option-selected-text: var(--orynn-color-accent);
39
+ --orynn-color-panel-bg: #ffffff;
40
+ --orynn-color-panel-shadow: 0 12px 32px -8px rgba(20, 24, 34, 0.18), 0 2px 8px -2px
41
+ rgba(20, 24, 34, 0.1);
42
+ --orynn-color-overlay: rgba(15, 18, 26, 0.06);
43
+
44
+ /* ---- typography --------------------------------------------------------- */
23
45
  --orynn-font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
24
46
  --orynn-font-size: 0.9375rem;
47
+ --orynn-font-size-sm: 0.875rem;
48
+ --orynn-font-size-lg: 1rem;
25
49
  --orynn-label-font-size: 0.875rem;
26
- --orynn-help-font-size: 0.8125rem;
27
50
  --orynn-label-weight: 600;
51
+ --orynn-help-font-size: 0.8125rem;
28
52
  --orynn-line-height: 1.5;
29
53
 
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;
54
+ /* ---- shape & density ------------------------------------------------- */
55
+ --orynn-radius: 10px;
56
+ --orynn-radius-sm: 7px;
57
+ --orynn-radius-lg: 14px;
58
+ --orynn-radius-pill: 999px;
38
59
  --orynn-border-width: 1px;
60
+ --orynn-ring-width: 3px;
61
+ --orynn-transition: 130ms cubic-bezier(0.4, 0, 0.2, 1);
39
62
 
40
- /* layout */
63
+ --orynn-control-width: 100%;
64
+ --orynn-control-h: 2.625rem;
65
+ --orynn-control-h-sm: 2.125rem;
66
+ --orynn-control-h-lg: 3rem;
67
+ --orynn-control-px: 0.8125rem;
68
+ --orynn-gap: 0.375rem;
69
+
70
+ --orynn-check-size: 1.125rem;
71
+ --orynn-check-radius: 5px;
72
+
73
+ /* ---- layout (Fieldset grid) --------------------------------------- */
41
74
  --orynn-grid-gap: 1rem;
42
75
  --orynn-cols-desktop: 3;
43
76
  --orynn-cols-tablet: 2;
44
77
  --orynn-cols-mobile: 1;
45
78
  }
46
79
 
47
- /* ---------------------------------------------------------------- fieldset -- */
80
+ /* ------------------------------------------------------------- presets ---- */
48
81
 
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);
82
+ [data-orynn-theme="slate"] {
83
+ --orynn-color-accent: #475569;
84
+ --orynn-color-accent-hover: #3b475a;
56
85
  }
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);
86
+ [data-orynn-theme="teal"] {
87
+ --orynn-color-accent: #0d9488;
88
+ --orynn-color-accent-hover: #0b8177;
63
89
  }
64
-
65
- /* ------------------------------------------------------------------- grid --- */
66
-
67
- .orynn-grid {
68
- container-type: inline-size;
90
+ [data-orynn-theme="violet"] {
91
+ --orynn-color-accent: #7c3aed;
92
+ --orynn-color-accent-hover: #6d28d9;
69
93
  }
70
-
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));
94
+ [data-orynn-theme="rose"] {
95
+ --orynn-color-accent: #e11d48;
96
+ --orynn-color-accent-hover: #c81a41;
75
97
  }
76
-
77
- @container (min-width: 30rem) {
78
- .orynn-grid__track {
79
- grid-template-columns: repeat(var(--orynn-cols-tablet, 2), minmax(0, 1fr));
80
- }
81
- .orynn-grid__item {
82
- grid-column: span var(--orynn-span-tablet, 1);
83
- }
98
+ [data-orynn-theme="emerald"] {
99
+ --orynn-color-accent: #059669;
100
+ --orynn-color-accent-hover: #047857;
84
101
  }
85
102
 
86
- @container (min-width: 48rem) {
87
- .orynn-grid__track {
88
- grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
89
- }
90
- .orynn-grid__item {
91
- grid-column: span var(--orynn-span-desktop, 1);
92
- }
93
- }
94
-
95
- .orynn-grid__item {
96
- grid-column: span var(--orynn-span-mobile, 1);
97
- min-inline-size: 0;
103
+ [data-orynn-density="compact"] {
104
+ --orynn-control-h: 2.25rem;
105
+ --orynn-control-h-sm: 1.875rem;
106
+ --orynn-control-h-lg: 2.625rem;
107
+ --orynn-control-px: 0.625rem;
108
+ --orynn-font-size: 0.875rem;
109
+ --orynn-radius: 8px;
110
+ --orynn-gap: 0.25rem;
98
111
  }
99
-
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
- }
112
+ [data-orynn-density="spacious"] {
113
+ --orynn-control-h: 3rem;
114
+ --orynn-control-h-sm: 2.5rem;
115
+ --orynn-control-h-lg: 3.5rem;
116
+ --orynn-control-px: 1rem;
117
+ --orynn-gap: 0.5rem;
105
118
  }
106
119
 
107
- /* ------------------------------------------------------------------ field --- */
120
+ /* -------------------------------------------------------------- field ---- */
108
121
 
109
122
  .orynn-field {
110
123
  display: flex;
111
124
  flex-direction: column;
112
- gap: var(--orynn-space-xs);
125
+ gap: var(--orynn-gap);
126
+ inline-size: var(--orynn-control-width);
113
127
  font-family: var(--orynn-font-family);
114
128
  font-size: var(--orynn-font-size);
115
129
  line-height: var(--orynn-line-height);
116
130
  color: var(--orynn-color-text);
117
131
  }
118
-
119
132
  .orynn-field__label {
120
133
  font-size: var(--orynn-label-font-size);
121
134
  font-weight: var(--orynn-label-weight);
122
135
  }
123
-
124
136
  .orynn-field[data-required] .orynn-field__label::after {
125
137
  content: " *";
126
138
  color: var(--orynn-color-error);
127
139
  }
128
-
129
140
  .orynn-field__description {
130
141
  margin: 0;
131
142
  font-size: var(--orynn-help-font-size);
132
143
  color: var(--orynn-color-text-muted);
133
144
  }
134
-
135
145
  .orynn-field__control {
136
146
  display: block;
137
147
  }
138
-
139
148
  .orynn-field__error {
140
149
  margin: 0;
150
+ display: flex;
151
+ gap: 0.35rem;
141
152
  font-size: var(--orynn-help-font-size);
142
153
  color: var(--orynn-color-error);
143
154
  }
144
-
145
155
  .orynn-field__error span {
146
156
  display: block;
147
157
  }
148
158
 
149
- /* --------------------------------------------------------------- controls --- */
159
+ /* --------------------------------------------------------- field box ---- */
150
160
 
151
- .orynn-input,
152
- .orynn-dropdown {
161
+ .orynn-box {
162
+ position: relative;
163
+ display: flex;
164
+ align-items: stretch;
165
+ inline-size: var(--orynn-control-width);
166
+ min-block-size: var(--orynn-control-h);
167
+ box-sizing: border-box;
168
+ font-family: var(--orynn-font-family);
169
+ font-size: var(--orynn-font-size);
170
+ line-height: var(--orynn-line-height);
171
+ color: var(--orynn-color-text);
172
+ background: var(--orynn-color-bg);
173
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
174
+ border-radius: var(--orynn-radius);
175
+ transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition),
176
+ background-color var(--orynn-transition);
177
+ }
178
+ .orynn-box[data-size="sm"] {
179
+ min-block-size: var(--orynn-control-h-sm);
180
+ font-size: var(--orynn-font-size-sm);
181
+ }
182
+ .orynn-box[data-size="lg"] {
183
+ min-block-size: var(--orynn-control-h-lg);
184
+ font-size: var(--orynn-font-size-lg);
185
+ }
186
+ .orynn-box[data-radius="sm"] {
187
+ border-radius: var(--orynn-radius-sm);
188
+ }
189
+ .orynn-box[data-radius="lg"] {
190
+ border-radius: var(--orynn-radius-lg);
191
+ }
192
+ .orynn-box[data-radius="pill"] {
193
+ border-radius: var(--orynn-radius-pill);
194
+ }
195
+ .orynn-box[data-radius="none"] {
196
+ border-radius: 0;
197
+ }
198
+
199
+ .orynn-box[data-variant="filled"] {
200
+ background: var(--orynn-color-bg-subtle);
201
+ border-color: transparent;
202
+ }
203
+ .orynn-box[data-variant="flushed"] {
204
+ border-radius: 0;
205
+ border-inline: 0;
206
+ border-block-start: 0;
207
+ padding-inline: 0;
208
+ }
209
+ .orynn-box[data-variant="unstyled"] {
210
+ border-color: transparent;
211
+ background: transparent;
212
+ }
213
+
214
+ .orynn-box:hover:not([data-disabled]):not([data-focused]) {
215
+ border-color: var(--orynn-color-border-hover);
216
+ }
217
+ .orynn-box[data-focused] {
218
+ border-color: var(--orynn-color-focus);
219
+ box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
220
+ outline: none;
221
+ }
222
+ .orynn-box[data-variant="filled"][data-focused] {
223
+ background: var(--orynn-color-bg);
224
+ }
225
+ .orynn-box[data-invalid] {
226
+ border-color: var(--orynn-color-error-border);
227
+ }
228
+ .orynn-box[data-invalid][data-focused] {
229
+ box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-error-ring);
230
+ }
231
+ .orynn-box[data-valid] {
232
+ border-color: var(--orynn-color-success-border);
233
+ }
234
+ .orynn-box[data-valid][data-focused] {
235
+ box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-success-ring);
236
+ }
237
+ .orynn-box[data-disabled] {
238
+ background: var(--orynn-color-bg-disabled);
239
+ color: var(--orynn-color-text-muted);
240
+ cursor: not-allowed;
241
+ }
242
+
243
+ .orynn-box__field {
244
+ flex: 1 1 auto;
245
+ min-inline-size: 0;
246
+ border: 0;
247
+ outline: 0;
248
+ background: transparent;
249
+ font: inherit;
250
+ color: inherit;
251
+ padding: 0 var(--orynn-control-px);
252
+ text-overflow: ellipsis;
253
+ }
254
+ .orynn-box__field::placeholder {
255
+ color: var(--orynn-color-text-subtle);
256
+ }
257
+ .orynn-box__field:disabled {
258
+ cursor: not-allowed;
259
+ }
260
+ .orynn-box[data-disabled] .orynn-box__field {
261
+ pointer-events: none;
262
+ }
263
+
264
+ .orynn-box__adornment {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 0.25rem;
268
+ padding-inline: 0.5rem;
269
+ color: var(--orynn-color-text-muted);
270
+ flex: 0 0 auto;
271
+ }
272
+ .orynn-box__adornment:first-child {
273
+ padding-inline: var(--orynn-control-px) 0.25rem;
274
+ }
275
+ .orynn-box__adornment--affix {
276
+ color: var(--orynn-color-text-subtle);
277
+ font-variant-numeric: tabular-nums;
278
+ }
279
+ .orynn-box__iconbtn {
280
+ display: inline-flex;
281
+ align-items: center;
282
+ justify-content: center;
283
+ inline-size: 1.5rem;
284
+ block-size: 1.5rem;
285
+ border: 0;
286
+ background: transparent;
287
+ border-radius: var(--orynn-radius-sm);
288
+ color: var(--orynn-color-text-muted);
289
+ cursor: pointer;
290
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
291
+ }
292
+ .orynn-box__iconbtn:hover {
293
+ background: var(--orynn-color-overlay);
294
+ color: var(--orynn-color-text);
295
+ }
296
+ .orynn-box__iconbtn:disabled {
297
+ opacity: 0.4;
298
+ cursor: not-allowed;
299
+ }
300
+
301
+ /* floating label */
302
+ .orynn-box--floating .orynn-box__field {
303
+ padding-block: 1rem 0.35rem;
304
+ }
305
+ .orynn-box--floating .orynn-box__label {
306
+ position: absolute;
307
+ inset-block-start: 50%;
308
+ inset-inline-start: calc(var(--orynn-control-px) + 1px);
309
+ transform: translateY(-50%);
310
+ transform-origin: left center;
311
+ color: var(--orynn-color-text-subtle);
312
+ pointer-events: none;
313
+ transition: transform var(--orynn-transition), color var(--orynn-transition);
314
+ font-size: var(--orynn-font-size);
315
+ }
316
+ .orynn-box--floating[data-active] .orynn-box__label {
317
+ transform: translateY(-1.05rem) scale(0.78);
318
+ }
319
+ .orynn-box--floating[data-focused] .orynn-box__label {
320
+ color: var(--orynn-color-accent);
321
+ }
322
+ .orynn-box--floating[data-active] .orynn-box__adornment:first-child ~ .orynn-box__label {
323
+ inset-inline-start: calc(var(--orynn-control-px) + 1.5rem);
324
+ }
325
+
326
+ .orynn-icon-success {
327
+ color: var(--orynn-color-success);
328
+ }
329
+ .orynn-icon-error {
330
+ color: var(--orynn-color-error);
331
+ }
332
+ .orynn-spin {
333
+ animation: orynn-spin 0.7s linear infinite;
334
+ }
335
+ @keyframes orynn-spin {
336
+ to {
337
+ transform: rotate(360deg);
338
+ }
339
+ }
340
+
341
+ /* ------------------------------------------------------------- inputs ---- */
342
+
343
+ .orynn-input {
344
+ /* class kept for back-compat + native fallbacks */
153
345
  inline-size: 100%;
154
- min-block-size: var(--orynn-control-min-height);
155
- padding: var(--orynn-space-sm) var(--orynn-control-padding-x);
346
+ min-block-size: var(--orynn-control-h);
347
+ padding: 0 var(--orynn-control-px);
156
348
  font-family: inherit;
157
349
  font-size: var(--orynn-font-size);
158
- line-height: var(--orynn-line-height);
159
350
  color: var(--orynn-color-text);
160
- background-color: var(--orynn-color-bg);
351
+ background: var(--orynn-color-bg);
161
352
  border: var(--orynn-border-width) solid var(--orynn-color-border);
162
353
  border-radius: var(--orynn-radius);
163
354
  box-sizing: border-box;
164
- transition: border-color 0.12s ease, box-shadow 0.12s ease;
355
+ transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition);
165
356
  }
166
-
167
357
  .orynn-input:hover:not(:disabled),
168
358
  .orynn-dropdown:hover:not(:disabled) {
169
359
  border-color: var(--orynn-color-border-hover);
170
360
  }
171
-
172
361
  .orynn-input:focus-visible,
173
362
  .orynn-dropdown:focus-visible {
174
363
  outline: none;
175
364
  border-color: var(--orynn-color-focus);
176
- box-shadow: 0 0 0 3px var(--orynn-color-focus-ring);
365
+ box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
177
366
  }
178
-
179
367
  .orynn-input[aria-invalid="true"],
180
368
  .orynn-dropdown[aria-invalid="true"] {
181
369
  border-color: var(--orynn-color-error-border);
182
370
  }
183
-
184
371
  .orynn-input:disabled,
185
372
  .orynn-dropdown:disabled {
186
- background-color: var(--orynn-color-bg-disabled);
373
+ background: var(--orynn-color-bg-disabled);
187
374
  color: var(--orynn-color-text-muted);
188
375
  cursor: not-allowed;
189
376
  }
190
377
 
191
- .orynn-input:read-only {
192
- background-color: var(--orynn-color-bg-disabled);
193
- }
194
-
378
+ /* native <select> — used by the Fieldset built-in and `<Dropdown native />` */
195
379
  .orynn-dropdown {
380
+ inline-size: 100%;
381
+ min-block-size: var(--orynn-control-h);
382
+ padding: 0 2rem 0 var(--orynn-control-px);
383
+ font-family: inherit;
384
+ font-size: var(--orynn-font-size);
385
+ color: var(--orynn-color-text);
386
+ background-color: var(--orynn-color-bg);
387
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
388
+ border-radius: var(--orynn-radius);
389
+ box-sizing: border-box;
196
390
  appearance: none;
197
- padding-inline-end: 2rem;
391
+ transition: border-color var(--orynn-transition), box-shadow var(--orynn-transition);
198
392
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%235b6470' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
199
393
  background-repeat: no-repeat;
200
- background-position: right var(--orynn-control-padding-x) center;
394
+ background-position: right var(--orynn-control-px) center;
395
+ }
396
+
397
+ /* ---------------------------------------------------------- textarea ---- */
398
+
399
+ .orynn-box--textarea {
400
+ align-items: stretch;
401
+ min-block-size: 0;
402
+ }
403
+ .orynn-textarea {
404
+ flex: 1 1 auto;
405
+ min-inline-size: 0;
406
+ border: 0;
407
+ outline: 0;
408
+ background: transparent;
409
+ font: inherit;
410
+ color: inherit;
411
+ padding: 0.55rem var(--orynn-control-px);
412
+ resize: vertical;
413
+ min-block-size: calc(var(--orynn-line-height) * 3em);
414
+ }
415
+ .orynn-textarea[data-resize="none"] {
416
+ resize: none;
417
+ }
418
+ .orynn-textarea[data-resize="both"] {
419
+ resize: both;
420
+ }
421
+ .orynn-box--floating.orynn-box--textarea .orynn-textarea {
422
+ padding-block-start: 1.35rem;
423
+ }
424
+ .orynn-box--floating.orynn-box--textarea .orynn-box__label {
425
+ inset-block-start: 0.9rem;
426
+ transform: none;
427
+ }
428
+ .orynn-box--floating.orynn-box--textarea[data-active] .orynn-box__label {
429
+ transform: translateY(-0.55rem) scale(0.78);
430
+ }
431
+ .orynn-box__footer {
432
+ position: absolute;
433
+ inset-inline-end: 0.5rem;
434
+ inset-block-end: 0.35rem;
435
+ font-size: 0.72rem;
436
+ color: var(--orynn-color-text-subtle);
437
+ font-variant-numeric: tabular-nums;
438
+ pointer-events: none;
439
+ }
440
+
441
+ /* ----------------------------------------------------------- number ----- */
442
+
443
+ .orynn-number__buttons {
444
+ display: flex;
445
+ flex-direction: column;
446
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-border);
447
+ flex: 0 0 auto;
448
+ }
449
+ .orynn-number__buttons--horizontal {
450
+ flex-direction: row-reverse;
451
+ }
452
+ .orynn-number__btn {
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: center;
456
+ inline-size: 2rem;
457
+ flex: 1 1 0;
458
+ border: 0;
459
+ background: transparent;
460
+ color: var(--orynn-color-text-muted);
461
+ cursor: pointer;
462
+ transition: background-color var(--orynn-transition);
463
+ }
464
+ .orynn-number__btn:hover:not(:disabled) {
465
+ background: var(--orynn-color-overlay);
466
+ color: var(--orynn-color-text);
467
+ }
468
+ .orynn-number__btn:disabled {
469
+ opacity: 0.35;
470
+ cursor: not-allowed;
471
+ }
472
+ .orynn-number__btn + .orynn-number__btn {
473
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
474
+ }
475
+ .orynn-number__buttons--horizontal .orynn-number__btn + .orynn-number__btn {
476
+ border-block-start: 0;
477
+ border-inline-start: var(--orynn-border-width) solid var(--orynn-color-border);
478
+ }
479
+
480
+ /* ------------------------------------------------------- checkbox/radio -- */
481
+
482
+ .orynn-choice {
483
+ position: relative;
484
+ display: inline-flex;
485
+ align-items: flex-start;
486
+ gap: 0.55rem;
487
+ font-family: var(--orynn-font-family);
488
+ font-size: var(--orynn-font-size);
489
+ color: var(--orynn-color-text);
490
+ cursor: pointer;
491
+ line-height: 1.4;
492
+ }
493
+ .orynn-choice[data-disabled] {
494
+ cursor: not-allowed;
495
+ color: var(--orynn-color-text-muted);
496
+ }
497
+ .orynn-choice--start {
498
+ flex-direction: row-reverse;
499
+ }
500
+
501
+ .orynn-choice__native {
502
+ position: absolute;
503
+ inset: 0;
504
+ inline-size: 100%;
505
+ block-size: 100%;
506
+ margin: 0;
507
+ opacity: 0;
508
+ cursor: inherit;
509
+ }
510
+
511
+ .orynn-choice__control {
512
+ position: relative;
513
+ flex: 0 0 auto;
514
+ inline-size: var(--orynn-check-size);
515
+ block-size: var(--orynn-check-size);
516
+ margin-block-start: 0.1rem;
517
+ display: grid;
518
+ place-items: center;
519
+ border: 1.5px solid var(--orynn-color-border);
520
+ background: var(--orynn-color-bg);
521
+ color: var(--orynn-color-accent-contrast);
522
+ transition: background-color var(--orynn-transition), border-color var(--orynn-transition),
523
+ box-shadow var(--orynn-transition);
524
+ }
525
+ .orynn-choice__control--checkbox {
526
+ border-radius: var(--orynn-check-radius);
527
+ }
528
+ .orynn-choice__control--radio {
529
+ border-radius: 999px;
530
+ }
531
+
532
+ .orynn-choice__native:hover:not(:disabled) ~ .orynn-choice__control {
533
+ border-color: var(--orynn-color-border-hover);
534
+ }
535
+ .orynn-choice__native:focus-visible ~ .orynn-choice__control {
536
+ border-color: var(--orynn-color-focus);
537
+ box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
538
+ }
539
+ .orynn-choice[data-invalid] .orynn-choice__control {
540
+ border-color: var(--orynn-color-error-border);
541
+ }
542
+
543
+ .orynn-choice__native:checked ~ .orynn-choice__control,
544
+ .orynn-choice__native:indeterminate ~ .orynn-choice__control {
545
+ background: var(--orynn-color-accent);
546
+ border-color: var(--orynn-color-accent);
547
+ }
548
+ .orynn-choice--outline .orynn-choice__native:checked ~ .orynn-choice__control,
549
+ .orynn-choice--outline .orynn-choice__native:indeterminate ~ .orynn-choice__control {
550
+ background: transparent;
551
+ color: var(--orynn-color-accent);
552
+ }
553
+ .orynn-choice__native:disabled ~ .orynn-choice__control {
554
+ background: var(--orynn-color-bg-disabled);
555
+ }
556
+ .orynn-choice__native:disabled:checked ~ .orynn-choice__control {
557
+ background: var(--orynn-color-accent-muted);
558
+ border-color: transparent;
559
+ }
560
+
561
+ .orynn-choice__mark {
562
+ grid-area: 1 / 1;
563
+ display: grid;
564
+ place-items: center;
565
+ inline-size: 80%;
566
+ block-size: 80%;
567
+ opacity: 0;
568
+ transform: scale(0.5);
569
+ transition: opacity var(--orynn-transition), transform var(--orynn-transition);
570
+ }
571
+ .orynn-choice__mark svg {
572
+ inline-size: 100%;
573
+ block-size: 100%;
574
+ }
575
+ .orynn-choice__native:checked ~ .orynn-choice__control .orynn-choice__mark--check {
576
+ opacity: 1;
577
+ transform: scale(1);
578
+ }
579
+ .orynn-choice__native:indeterminate ~ .orynn-choice__control .orynn-choice__mark--check {
580
+ opacity: 0;
581
+ }
582
+ .orynn-choice__native:indeterminate ~ .orynn-choice__control .orynn-choice__mark--dash {
583
+ opacity: 1;
584
+ transform: scale(1);
585
+ }
586
+
587
+ .orynn-choice__mark--dot {
588
+ inline-size: 45%;
589
+ block-size: 45%;
590
+ border-radius: 999px;
591
+ background: currentColor;
592
+ }
593
+ .orynn-choice__native:checked ~ .orynn-choice__control--radio .orynn-choice__mark--dot {
594
+ opacity: 1;
595
+ transform: scale(1);
596
+ }
597
+
598
+ .orynn-choice__text {
599
+ display: flex;
600
+ flex-direction: column;
601
+ gap: 0.1rem;
602
+ }
603
+ .orynn-choice__label {
604
+ font-weight: 500;
605
+ }
606
+ .orynn-choice__desc {
607
+ font-size: var(--orynn-help-font-size);
608
+ color: var(--orynn-color-text-muted);
609
+ }
610
+
611
+ .orynn-choice-group {
612
+ display: flex;
613
+ flex-direction: column;
614
+ gap: 0.6rem;
615
+ }
616
+ .orynn-choice-group[data-orientation="horizontal"] {
617
+ flex-direction: row;
618
+ flex-wrap: wrap;
619
+ gap: 1rem;
620
+ }
621
+
622
+ .orynn-choice--card {
623
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
624
+ border-radius: var(--orynn-radius);
625
+ padding: 0.7rem 0.85rem;
626
+ align-items: center;
627
+ transition: border-color var(--orynn-transition), background-color var(--orynn-transition);
628
+ }
629
+ .orynn-choice--card:has(.orynn-choice__native:checked) {
630
+ border-color: var(--orynn-color-accent);
631
+ background: var(--orynn-color-accent-subtle);
632
+ }
633
+ .orynn-choice--card:has(.orynn-choice__native:focus-visible) {
634
+ box-shadow: 0 0 0 var(--orynn-ring-width) var(--orynn-color-focus-ring);
635
+ }
636
+
637
+ /* --------------------------------------------------------- popover ------ */
638
+
639
+ .orynn-popover {
640
+ position: fixed;
641
+ z-index: 1000;
642
+ background: var(--orynn-color-panel-bg);
643
+ border: var(--orynn-border-width) solid var(--orynn-color-border);
644
+ border-radius: var(--orynn-radius-lg);
645
+ box-shadow: var(--orynn-color-panel-shadow);
646
+ font-family: var(--orynn-font-family);
647
+ color: var(--orynn-color-text);
648
+ overflow: hidden;
649
+ animation: orynn-pop var(--orynn-transition);
650
+ }
651
+ @keyframes orynn-pop {
652
+ from {
653
+ opacity: 0;
654
+ transform: translateY(-4px);
655
+ }
656
+ to {
657
+ opacity: 1;
658
+ transform: translateY(0);
659
+ }
660
+ }
661
+
662
+ /* ---------------------------------------------------------- select ----- */
663
+
664
+ .orynn-select__value {
665
+ display: flex;
666
+ flex: 1 1 auto;
667
+ min-inline-size: 0;
668
+ align-items: center;
669
+ gap: 0.4rem;
670
+ padding: 0 var(--orynn-control-px);
671
+ overflow: hidden;
672
+ }
673
+ .orynn-select__value--placeholder {
674
+ color: var(--orynn-color-text-subtle);
675
+ }
676
+ .orynn-select__single {
677
+ white-space: nowrap;
678
+ overflow: hidden;
679
+ text-overflow: ellipsis;
680
+ }
681
+ .orynn-select__search {
682
+ flex: 1 1 4rem;
683
+ min-inline-size: 2rem;
684
+ border: 0;
685
+ outline: 0;
686
+ background: transparent;
687
+ font: inherit;
688
+ color: inherit;
689
+ padding: 0;
690
+ }
691
+ .orynn-select__chips {
692
+ display: flex;
693
+ flex-wrap: wrap;
694
+ gap: 0.3rem;
695
+ align-items: center;
696
+ }
697
+ .orynn-select__chip {
698
+ display: inline-flex;
699
+ align-items: center;
700
+ gap: 0.25rem;
701
+ background: var(--orynn-color-accent-subtle);
702
+ color: var(--orynn-color-accent);
703
+ border-radius: var(--orynn-radius-pill);
704
+ padding: 0.1rem 0.25rem 0.1rem 0.55rem;
705
+ font-size: 0.82em;
706
+ max-inline-size: 12rem;
707
+ }
708
+ .orynn-select__chip span {
709
+ overflow: hidden;
710
+ text-overflow: ellipsis;
711
+ white-space: nowrap;
712
+ }
713
+ .orynn-select__chip button {
714
+ display: inline-flex;
715
+ border: 0;
716
+ background: transparent;
717
+ color: inherit;
718
+ cursor: pointer;
719
+ padding: 0.1rem;
720
+ border-radius: 999px;
721
+ }
722
+ .orynn-select__chip button:hover {
723
+ background: var(--orynn-color-accent-muted);
724
+ }
725
+ .orynn-select__chevron {
726
+ transition: transform var(--orynn-transition);
727
+ }
728
+ .orynn-box[data-focused] .orynn-select__chevron,
729
+ .orynn-box[data-open] .orynn-select__chevron {
730
+ transform: rotate(180deg);
731
+ }
732
+
733
+ .orynn-listbox {
734
+ max-block-size: min(18rem, 60vh);
735
+ overflow-y: auto;
736
+ padding: 0.35rem;
737
+ outline: none;
738
+ }
739
+ .orynn-listbox__empty {
740
+ padding: 0.9rem 0.75rem;
741
+ text-align: center;
742
+ color: var(--orynn-color-text-subtle);
743
+ font-size: var(--orynn-help-font-size);
744
+ }
745
+ .orynn-listbox__group {
746
+ padding: 0.45rem 0.6rem 0.2rem;
747
+ font-size: 0.72rem;
748
+ font-weight: 700;
749
+ text-transform: uppercase;
750
+ letter-spacing: 0.04em;
751
+ color: var(--orynn-color-text-subtle);
752
+ position: sticky;
753
+ inset-block-start: -0.35rem;
754
+ background: var(--orynn-color-panel-bg);
755
+ }
756
+ .orynn-option {
757
+ display: flex;
758
+ align-items: center;
759
+ gap: 0.55rem;
760
+ padding: 0.5rem 0.6rem;
761
+ border-radius: var(--orynn-radius-sm);
762
+ cursor: pointer;
763
+ color: var(--orynn-color-text);
764
+ line-height: 1.35;
765
+ }
766
+ .orynn-option__body {
767
+ display: flex;
768
+ flex-direction: column;
769
+ gap: 0.05rem;
770
+ flex: 1 1 auto;
771
+ min-inline-size: 0;
772
+ }
773
+ .orynn-option__label {
774
+ overflow: hidden;
775
+ text-overflow: ellipsis;
776
+ white-space: nowrap;
777
+ }
778
+ .orynn-option__label mark {
779
+ background: transparent;
780
+ color: var(--orynn-color-accent);
781
+ font-weight: 700;
782
+ }
783
+ .orynn-option__desc {
784
+ font-size: var(--orynn-help-font-size);
785
+ color: var(--orynn-color-text-muted);
786
+ }
787
+ .orynn-option[data-active] {
788
+ background: var(--orynn-color-option-hover);
789
+ }
790
+ .orynn-option[data-selected] {
791
+ color: var(--orynn-color-option-selected-text);
792
+ font-weight: 600;
793
+ }
794
+ .orynn-option[data-disabled] {
795
+ opacity: 0.4;
796
+ cursor: not-allowed;
797
+ }
798
+ .orynn-option__check {
799
+ margin-inline-start: auto;
800
+ color: var(--orynn-color-accent);
801
+ flex: 0 0 auto;
802
+ }
803
+
804
+ /* ------------------------------------------------------- datepicker ----- */
805
+
806
+ .orynn-calendar {
807
+ padding: 0.75rem;
808
+ inline-size: 17.5rem;
809
+ user-select: none;
810
+ }
811
+ .orynn-calendar__header {
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: space-between;
815
+ margin-block-end: 0.4rem;
816
+ }
817
+ .orynn-calendar__title {
818
+ display: flex;
819
+ gap: 0.3rem;
820
+ font-weight: 600;
821
+ font-size: 0.9rem;
822
+ }
823
+ .orynn-calendar__nav {
824
+ display: inline-flex;
825
+ align-items: center;
826
+ justify-content: center;
827
+ inline-size: 1.9rem;
828
+ block-size: 1.9rem;
829
+ border: 0;
830
+ background: transparent;
831
+ border-radius: var(--orynn-radius-sm);
832
+ color: var(--orynn-color-text-muted);
833
+ cursor: pointer;
834
+ }
835
+ .orynn-calendar__nav:hover:not(:disabled) {
836
+ background: var(--orynn-color-overlay);
837
+ color: var(--orynn-color-text);
838
+ }
839
+ .orynn-calendar__nav:disabled {
840
+ opacity: 0.35;
841
+ cursor: not-allowed;
842
+ }
843
+ .orynn-calendar__select {
844
+ border: 0;
845
+ background: transparent;
846
+ font: inherit;
847
+ font-weight: 600;
848
+ color: inherit;
849
+ cursor: pointer;
850
+ border-radius: var(--orynn-radius-sm);
851
+ padding: 0.1rem 0.2rem;
852
+ }
853
+ .orynn-calendar__select:hover {
854
+ background: var(--orynn-color-overlay);
855
+ }
856
+ .orynn-calendar__grid {
857
+ inline-size: 100%;
858
+ border-collapse: collapse;
859
+ }
860
+ .orynn-calendar__grid th {
861
+ font-size: 0.72rem;
862
+ font-weight: 600;
863
+ color: var(--orynn-color-text-subtle);
864
+ padding: 0.3rem 0;
865
+ }
866
+ .orynn-calendar__weeknum {
867
+ color: var(--orynn-color-text-subtle);
868
+ font-size: 0.72rem;
869
+ }
870
+ .orynn-calendar__day {
871
+ inline-size: 2.15rem;
872
+ block-size: 2.15rem;
873
+ border: 0;
874
+ background: transparent;
875
+ font: inherit;
876
+ font-size: 0.85rem;
877
+ color: var(--orynn-color-text);
878
+ border-radius: 999px;
879
+ cursor: pointer;
880
+ transition: background-color var(--orynn-transition), color var(--orynn-transition);
881
+ }
882
+ .orynn-calendar__day:hover:not(:disabled) {
883
+ background: var(--orynn-color-option-hover);
884
+ }
885
+ .orynn-calendar__day[data-outside] {
886
+ color: var(--orynn-color-text-subtle);
887
+ }
888
+ .orynn-calendar__day[data-today] {
889
+ box-shadow: inset 0 0 0 1px var(--orynn-color-accent-muted);
890
+ font-weight: 700;
891
+ }
892
+ .orynn-calendar__day[data-selected] {
893
+ background: var(--orynn-color-accent);
894
+ color: var(--orynn-color-accent-contrast);
895
+ font-weight: 700;
896
+ }
897
+ .orynn-calendar__day:disabled {
898
+ opacity: 0.3;
899
+ cursor: not-allowed;
900
+ }
901
+ .orynn-calendar__footer {
902
+ display: flex;
903
+ justify-content: space-between;
904
+ margin-block-start: 0.5rem;
905
+ padding-block-start: 0.5rem;
906
+ border-block-start: var(--orynn-border-width) solid var(--orynn-color-border);
907
+ }
908
+ .orynn-calendar__action {
909
+ border: 0;
910
+ background: transparent;
911
+ color: var(--orynn-color-accent);
912
+ font: inherit;
913
+ font-size: 0.82rem;
914
+ font-weight: 600;
915
+ cursor: pointer;
916
+ padding: 0.2rem 0.4rem;
917
+ border-radius: var(--orynn-radius-sm);
918
+ }
919
+ .orynn-calendar__action:hover {
920
+ background: var(--orynn-color-accent-subtle);
921
+ }
922
+
923
+ /* ------------------------------------------------------------- grid ----- */
924
+
925
+ .orynn-fieldset {
926
+ min-inline-size: 0;
927
+ margin: 0;
928
+ padding: 0;
929
+ border: 0;
930
+ font-family: var(--orynn-font-family);
931
+ color: var(--orynn-color-text);
932
+ }
933
+ .orynn-fieldset__legend {
934
+ padding: 0;
935
+ margin-block-end: var(--orynn-space-md, 0.75rem);
936
+ font-size: 1rem;
937
+ font-weight: var(--orynn-label-weight);
938
+ }
939
+ .orynn-grid {
940
+ container-type: inline-size;
941
+ }
942
+ .orynn-grid__track {
943
+ display: grid;
944
+ gap: var(--orynn-grid-gap);
945
+ grid-template-columns: repeat(var(--orynn-cols-mobile, 1), minmax(0, 1fr));
946
+ }
947
+ @container (min-width: 30rem) {
948
+ .orynn-grid__track {
949
+ grid-template-columns: repeat(var(--orynn-cols-tablet, 2), minmax(0, 1fr));
950
+ }
951
+ .orynn-grid__item {
952
+ grid-column: span var(--orynn-span-tablet, 1);
953
+ }
954
+ }
955
+ @container (min-width: 48rem) {
956
+ .orynn-grid__track {
957
+ grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
958
+ }
959
+ .orynn-grid__item {
960
+ grid-column: span var(--orynn-span-desktop, 1);
961
+ }
962
+ }
963
+ .orynn-grid__item {
964
+ grid-column: span var(--orynn-span-mobile, 1);
965
+ min-inline-size: 0;
966
+ }
967
+ @supports not (container-type: inline-size) {
968
+ .orynn-grid__track {
969
+ grid-template-columns: repeat(var(--orynn-cols-desktop, 3), minmax(0, 1fr));
970
+ }
971
+ }
972
+
973
+ @media (prefers-reduced-motion: reduce) {
974
+ .orynn-popover,
975
+ .orynn-spin {
976
+ animation: none;
977
+ }
978
+ .orynn-box,
979
+ .orynn-option,
980
+ .orynn-calendar__day,
981
+ .orynn-choice__control {
982
+ transition: none;
983
+ }
201
984
  }