@fest-lib/fl-ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/assets/OPFS.uniform.worker-Ddx6J_37.js +2982 -0
  4. package/dist/fl-ui.js +16004 -0
  5. package/dist/font-registry-BWosB92f.js +271 -0
  6. package/package.json +104 -0
  7. package/src/styles/font-loader.ts +224 -0
  8. package/src/styles/font-registry.ts +275 -0
  9. package/src/styles/fonts/_index.scss +8 -0
  10. package/src/styles/fonts/_inter.scss +171 -0
  11. package/src/styles/index.scss +2 -0
  12. package/src/styles/index.ts +33 -0
  13. package/src/styles/layers.scss +1 -0
  14. package/src/styles/patch-global-native-controls.scss +13 -0
  15. package/src/styles/scripts/encode-fonts.ts +172 -0
  16. package/src/styles/skins/thin/Thin.ts +13 -0
  17. package/src/styles/ui/_bar.scss +271 -0
  18. package/src/styles/ui/_buttons.scss +215 -0
  19. package/src/styles/ui/_color.scss +3 -0
  20. package/src/styles/ui/_colorize.scss +5 -0
  21. package/src/styles/ui/_content.scss +169 -0
  22. package/src/styles/ui/_essentials-options.scss +2 -0
  23. package/src/styles/ui/_essentials.scss +705 -0
  24. package/src/styles/ui/_explorer-content.scss +362 -0
  25. package/src/styles/ui/_explorer.scss +237 -0
  26. package/src/styles/ui/_forms-bare-host-elements.scss +25 -0
  27. package/src/styles/ui/_forms-options.scss +2 -0
  28. package/src/styles/ui/_forms.scss +280 -0
  29. package/src/styles/ui/_forms_misc.scss +201 -0
  30. package/src/styles/ui/_gridbox.scss +298 -0
  31. package/src/styles/ui/_home-host.scss +179 -0
  32. package/src/styles/ui/_index.scss +22 -0
  33. package/src/styles/ui/_launcher-typography.scss +31 -0
  34. package/src/styles/ui/_layers.scss +48 -0
  35. package/src/styles/ui/_layout.scss +3 -0
  36. package/src/styles/ui/_markdown.scss +1636 -0
  37. package/src/styles/ui/_modal.scss +258 -0
  38. package/src/styles/ui/_motion.scss +3 -0
  39. package/src/styles/ui/_native-host-button-chrome.scss +31 -0
  40. package/src/styles/ui/_orientation-functions.scss +274 -0
  41. package/src/styles/ui/_orientbox.scss +97 -0
  42. package/src/styles/ui/_scrollbar.scss +257 -0
  43. package/src/styles/ui/_shared-overlays.scss +16 -0
  44. package/src/styles/ui/_sidebar.scss +477 -0
  45. package/src/styles/ui/_speed-dial.scss +47 -0
  46. package/src/styles/ui/_tables.scss +28 -0
  47. package/src/styles/ui/_tabs.scss +406 -0
  48. package/src/styles/ui/_taskbar.scss +215 -0
  49. package/src/styles/ui/_toolbars.scss +165 -0
  50. package/src/styles/ui/_typography.scss +11 -0
  51. package/src/styles/ui/_utils.scss +8 -0
  52. package/src/styles/ui/_variables.scss +45 -0
  53. package/src/styles/ui/_viewport.scss +469 -0
  54. package/src/styles/ui/_window-frame.scss +658 -0
  55. package/src/styles/ui/home-host-apply.scss +10 -0
@@ -0,0 +1,705 @@
1
+ /* ai-refactor: optimized/refactored at 2026-02-13T00:45:15Z */
2
+ @use "sass:string";
3
+
4
+ /* ai-refactor: optimized/refactored at 2026-02-13T00:45:12Z */
5
+ // WHY: Bare `button` + unscoped `input/select/textarea` rules leak into the host document.
6
+ // Default off; opt in via `patch-global-native-controls.scss` / `loadFlUIGlobalNativeControlStyles()`.
7
+ @use "./essentials-options" as eo;
8
+ @use "./native-host-button-chrome" as hostbtn;
9
+
10
+ @layer tokens, base, layout, utilities, shells, shell, views, view, viewer, components, ux-layer, markdown, essentials, print, print-breaks, overrides;
11
+
12
+ @layer components {
13
+ @if eo.$include-native-button-styles {
14
+ button,
15
+ .btn {
16
+ @include hostbtn.essentials-native-host-button-chrome-base;
17
+ }
18
+ } @else {
19
+ .btn {
20
+ @include hostbtn.essentials-native-host-button-chrome-base;
21
+ }
22
+ }
23
+
24
+ .btn {
25
+ --ui-bg: var(--color-surface-container-high);
26
+ --ui-fg: var(--color-on-surface);
27
+ --ui-bg-hover: var(--color-surface-container-highest);
28
+ --ui-ring: var(--color-primary);
29
+ --ui-radius: var(--radius-lg);
30
+ --ui-pad-y: var(--space-sm);
31
+ --ui-pad-x: var(--space-lg);
32
+ --ui-font-size: var(--text-sm);
33
+ --ui-font-weight: var(--font-weight-semibold);
34
+ --ui-min-h: 40px;
35
+ --ui-opacity: 1;
36
+ appearance: none;
37
+ border: none;
38
+ background: var(--ui-bg);
39
+ color: var(--ui-fg);
40
+ border-radius: var(--ui-radius);
41
+ padding: max(var(--ui-pad-y, 0px), 0px) max(var(--ui-pad-x, 0px), 0px);
42
+ font-size: var(--ui-font-size);
43
+ font-weight: var(--ui-font-weight);
44
+ letter-spacing: 0.01em;
45
+ line-height: 1.2;
46
+ block-size: calc-size(fit-content, max(var(--ui-min-h), size));
47
+ transition:
48
+ background-color var(--motion-fast),
49
+ box-shadow var(--motion-fast),
50
+ transform var(--motion-fast);
51
+ box-shadow: var(--elev-0);
52
+ user-select: none;
53
+ touch-action: manipulation;
54
+ pointer-events: auto;
55
+ gap: var(--space-xs);
56
+ text-transform: none;
57
+ opacity: var(--ui-opacity);
58
+ min-block-size: fit-content;
59
+ min-inline-size: calc-size(fit-content, size + 0.5rem + var(--icon-size, 1rem));
60
+ max-inline-size: none;
61
+ max-block-size: stretch;
62
+ flex-direction: row;
63
+ flex-wrap: nowrap;
64
+ text-wrap: nowrap;
65
+ text-overflow: ellipsis;
66
+ overflow: hidden;
67
+ white-space: nowrap;
68
+ text-align: center;
69
+ text-decoration: none;
70
+ text-shadow: none;
71
+ text-rendering: auto;
72
+ contain: none;
73
+ container-type: normal;
74
+ place-items: center;
75
+ place-content: center;
76
+ justify-content: safe center;
77
+ justify-items: safe center;
78
+ align-content: safe center;
79
+ align-items: safe center;
80
+
81
+ & > ui-icon {
82
+ flex-shrink: 0;
83
+ pointer-events: none;
84
+ color: inherit;
85
+ align-self: center;
86
+ vertical-align: middle;
87
+ }
88
+
89
+ &.btn-icon {
90
+ @media (max-width: 480px) {
91
+ font-size: 0px !important;
92
+ aspect-ratio: 1 / 1;
93
+ block-size: fit-content;
94
+ max-block-size: stretch;
95
+ min-inline-size: 0px;
96
+ max-inline-size: fit-content;
97
+ gap: 0px;
98
+
99
+ .btn-text,
100
+ span:not(.sr-only) {
101
+ display: none !important;
102
+ }
103
+ }
104
+ }
105
+
106
+ &:hover {
107
+ background: var(--ui-bg-hover);
108
+ box-shadow: var(--elev-1);
109
+ transform: translateY(-1px);
110
+ }
111
+
112
+ &:active {
113
+ transform: translateY(0);
114
+ box-shadow: var(--elev-0);
115
+ }
116
+
117
+ &:focus-visible {
118
+ outline: none;
119
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--ui-ring) 35%, transparent);
120
+ }
121
+
122
+ &:disabled {
123
+ opacity: 0.5;
124
+ cursor: not-allowed;
125
+ transform: none !important;
126
+
127
+ &:hover {
128
+ background: var(--color-surface-container-high);
129
+ box-shadow: var(--elev-0);
130
+ }
131
+ }
132
+
133
+ &.primary,
134
+ &.active {
135
+ --ui-bg: var(--color-primary);
136
+ --ui-fg: var(--color-on-primary);
137
+ --ui-ring: var(--color-primary);
138
+ }
139
+
140
+ &.primary {
141
+ --ui-bg-hover: color-mix(in oklab, var(--color-primary) 90%, black);
142
+ }
143
+
144
+ &.active {
145
+ box-shadow: var(--elev-1);
146
+ }
147
+
148
+ &.small {
149
+ --ui-pad-y: var(--space-xs);
150
+ --ui-pad-x: var(--space-md);
151
+ --ui-font-size: var(--text-xs);
152
+ --ui-min-h: 32px;
153
+ --ui-radius: var(--radius-md);
154
+ }
155
+
156
+ &.icon-btn {
157
+ inline-size: 40px;
158
+ block-size: 40px;
159
+ --ui-pad-y: 0px;
160
+ --ui-pad-x: 0px;
161
+ --ui-radius: 9999px;
162
+ --ui-font-size: var(--text-lg);
163
+ }
164
+
165
+ &[data-action="open-md"],
166
+ &[data-action="export-md"],
167
+ &[data-action="export-docx"] {
168
+ --ui-font-size: 12px;
169
+ --ui-pad-x: 8px;
170
+ --ui-pad-y: 0px;
171
+ --ui-min-h: 28px;
172
+ }
173
+
174
+ &:is(
175
+ [data-action="view-markdown-viewer"],
176
+ [data-action="view-markdown-editor"],
177
+ [data-action="view-rich-editor"],
178
+ [data-action="view-settings"],
179
+ [data-action="view-history"],
180
+ [data-action="view-workcenter"]
181
+ ) {
182
+ --ui-font-size: 13px;
183
+ --ui-font-weight: 500;
184
+ --ui-pad-x: 12px;
185
+ --ui-pad-y: 0px;
186
+ --ui-min-h: 32px;
187
+ --ui-radius: 16px;
188
+ text-transform: capitalize;
189
+ }
190
+
191
+ &:is(
192
+ [data-action="view-markdown-viewer"],
193
+ [data-action="view-markdown-editor"],
194
+ [data-action="view-rich-editor"],
195
+ [data-action="view-settings"],
196
+ [data-action="view-history"],
197
+ [data-action="view-workcenter"][data-current],
198
+ [data-action="view-workcenter"].active
199
+ ) {
200
+ --ui-bg: var(--color-surface-container-highest);
201
+ --ui-fg: var(--color-primary);
202
+ --ui-ring: var(--color-primary);
203
+ }
204
+
205
+ &:is(
206
+ [data-action="toggle-edit"],
207
+ [data-action="snip"],
208
+ [data-action="solve"],
209
+ [data-action="code"],
210
+ [data-action="css"],
211
+ [data-action="voice"],
212
+ [data-action="edit-templates"],
213
+ [data-action="recognize"],
214
+ [data-action="analyze"],
215
+ [data-action="select-files"],
216
+ [data-action="clear-prompt"],
217
+ [data-action="view-full-history"]
218
+ ) {
219
+ --ui-font-size: 12px;
220
+ --ui-pad-x: 8px;
221
+ --ui-pad-y: 0px;
222
+ --ui-min-h: 28px;
223
+ --ui-radius: 14px;
224
+ }
225
+
226
+ &:has(> ui-icon):not(:has(> *:not(ui-icon))),
227
+ &:has(> span:only-of-type:empty) {
228
+ font-size: 0px !important;
229
+ aspect-ratio: 1 / 1;
230
+ block-size: fit-content;
231
+ max-block-size: stretch;
232
+ min-inline-size: 0px;
233
+ max-inline-size: fit-content;
234
+ gap: 0px;
235
+ overflow: visible;
236
+
237
+ span:not(.sr-only) {
238
+ display: none !important;
239
+ }
240
+ }
241
+ }
242
+
243
+ .btn-primary {
244
+ background: var(--color-primary);
245
+ color: white;
246
+ border-color: var(--color-primary);
247
+
248
+ &:hover:not(:disabled) {
249
+ background: var(--color-primary-hover);
250
+ border-color: var(--color-primary-hover);
251
+ }
252
+ }
253
+
254
+ @media (max-inline-size: 768px) {
255
+ .btn {
256
+ --ui-pad-y: var(--space-xs);
257
+ --ui-pad-x: var(--space-md);
258
+ --ui-font-size: var(--text-xs);
259
+ --ui-min-h: 36px;
260
+ }
261
+ }
262
+
263
+ @media (max-inline-size: 480px) {
264
+ .btn {
265
+ --ui-pad-y: var(--space-xs);
266
+ --ui-pad-x: var(--space-xs);
267
+ --ui-font-size: var(--text-xs);
268
+ --ui-min-h: 32px;
269
+ white-space: nowrap;
270
+ overflow: hidden;
271
+ text-overflow: ellipsis;
272
+
273
+ &.btn-icon {
274
+ overflow: visible;
275
+ }
276
+ }
277
+ }
278
+
279
+ @media (prefers-reduced-motion: reduce) {
280
+ .btn {
281
+ transition: none;
282
+ transform: none !important;
283
+
284
+ &:hover,
285
+ &:active {
286
+ transform: none !important;
287
+ }
288
+ }
289
+ }
290
+ }
291
+
292
+ @layer utilities {
293
+ .round-decor {
294
+ --background-tone-shift: 0;
295
+ padding-block: 0.25rem;
296
+ border-radius: 0.25rem;
297
+ overflow: hidden;
298
+
299
+ &:empty {
300
+ padding: 0;
301
+ display: none;
302
+ pointer-events: none;
303
+ visibility: collapse;
304
+ }
305
+ }
306
+
307
+ .time-format {
308
+ display: inline-flex;
309
+ flex-direction: row;
310
+ place-content: center;
311
+ place-items: center;
312
+ place-self: center;
313
+ padding: 0.125rem;
314
+ font: 500 0.9em "InterVariable", "Inter", "Fira Mono", "Menlo", "Consolas", monospace;
315
+ font-optical-sizing: auto;
316
+ font-variant-numeric: tabular-nums;
317
+ font-kerning: auto;
318
+ font-stretch: condensed;
319
+ font-width: condensed;
320
+ letter-spacing: -0.05em;
321
+ text-wrap: nowrap;
322
+ text-align: center;
323
+ white-space: nowrap;
324
+ text-overflow: ellipsis;
325
+ }
326
+
327
+ /*
328
+ * WHY: Launcher caption rows use `[data-layer="labels"]`; a global `span { aspect-ratio: 1/1 }` makes each pill as tall as its width (“box” tiles).
329
+ * Square helpers apply only outside label captions (icon/grid tiles still use spans elsewhere).
330
+ */
331
+ .ui-ws-item:not([data-layer="labels"]) span {
332
+ pointer-events: none;
333
+ aspect-ratio: 1 / 1;
334
+ inline-size: fit-content;
335
+ block-size: fit-content;
336
+ display: inline;
337
+ }
338
+
339
+ .ui-ws-item {
340
+ cursor: pointer;
341
+ user-select: none;
342
+ pointer-events: auto;
343
+
344
+ &:active,
345
+ &:has(:active) {
346
+ will-change: inset, translate, transform, opacity, z-index;
347
+ cursor: grabbing;
348
+ }
349
+ }
350
+ }
351
+
352
+ @layer essentials {
353
+
354
+ @media print {
355
+ .ctx-menu, .ux-anchor, .component-loading, .component-error {
356
+ display: none !important;
357
+ visibility: hidden !important;
358
+ opacity: 0 !important;
359
+ pointer-events: none !important;
360
+ position: absolute !important;
361
+ inset: 0 !important;
362
+ z-index: -1 !important;
363
+ inline-size: 0 !important;
364
+ block-size: 0 !important;
365
+ max-inline-size: 0 !important;
366
+ max-block-size: 0 !important;
367
+ min-inline-size: 0 !important;
368
+ min-block-size: 0 !important;
369
+ margin: 0 !important;
370
+ padding: 0 !important;
371
+ border: none !important;
372
+ overflow: hidden !important;
373
+ }
374
+ }
375
+
376
+ @media screen {
377
+ :root, :host, :scope {
378
+ --font-family: "InterVariable", "Inter", "Helvetica Neue", "Helvetica", "Calibri", "Roboto", ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif;
379
+ }
380
+
381
+ ui-window-frame,
382
+ ui-modal,
383
+ .ui-grid-item {
384
+ --opacity: 1;
385
+ --scale: 1;
386
+ --rotate: 0deg;
387
+ --translate-x: 0%;
388
+ --translate-y: 0%;
389
+ isolation: isolate;
390
+ content-visibility: auto;
391
+ transform-origin: 50% 50%;
392
+ transform-style: flat;
393
+ transform-box: fill-box;
394
+ translate: 0% 0% 0%;
395
+ opacity: var(--opacity, 1);
396
+ rotate: 0deg;
397
+ scale: 1;
398
+ }
399
+
400
+ .ctx-menu {
401
+ --font-family: "InterVariable", "Inter", "Helvetica Neue", "Helvetica", "Calibri", "Roboto", ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif;
402
+
403
+ &,
404
+ * {
405
+ visibility: visible;
406
+ content-visibility: visible;
407
+ }
408
+
409
+ position: fixed;
410
+ z-index: 99999;
411
+ inline-size: max-content;
412
+ min-inline-size: 160px;
413
+ max-inline-size: min(240px, 100cqi);
414
+ block-size: fit-content;
415
+ padding: 0.25rem 0;
416
+ border: 1px solid var(--color-outline-variant);
417
+ border-radius: var(--radius-md);
418
+ background-color: var(--color-surface);
419
+ color: var(--color-on-surface);
420
+ font-size: 0.875rem;
421
+ font-weight: 400;
422
+ box-shadow: var(--elev-3);
423
+ opacity: 1;
424
+ visibility: visible;
425
+ pointer-events: auto;
426
+ transform: scale3d(var(--scale, 1), var(--scale, 1), 1) translate3d(var(--translate-x, 0px), var(--translate-y, 0px), 0px);
427
+ transition: opacity 0.15s ease-out, visibility 0.15s ease-out, transform 0.15s ease-out;
428
+ font-family: var(--font-family, 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif') !important;
429
+ text-align: start;
430
+ display: flex;
431
+ flex-direction: column;
432
+ align-items: stretch;
433
+
434
+ &[data-hidden] {
435
+ opacity: 0;
436
+ visibility: hidden;
437
+ pointer-events: none;
438
+ }
439
+
440
+ & > * {
441
+ display: flex;
442
+ flex-direction: row;
443
+ align-items: center;
444
+ justify-content: flex-start;
445
+ text-align: start;
446
+ inline-size: stretch;
447
+ min-block-size: 2rem;
448
+ gap: 0.5rem;
449
+ padding: 0.375rem 0.75rem;
450
+ border: none;
451
+ border-radius: var(--radius-sm);
452
+ outline: none;
453
+ position: relative;
454
+ background-color: transparent;
455
+ color: var(--color-on-surface);
456
+ cursor: pointer;
457
+ text-wrap: nowrap;
458
+ text-overflow: ellipsis;
459
+ white-space: nowrap;
460
+ overflow: hidden;
461
+ pointer-events: auto;
462
+ transition: background-color 0.15s ease, color 0.15s ease;
463
+ font-family: var(--font-family, 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif') !important;
464
+
465
+ &:hover {
466
+ background-color: var(--color-surface-container-high);
467
+ color: var(--color-on-surface);
468
+ }
469
+
470
+ &:active {
471
+ background-color: var(--color-surface-container-highest);
472
+ color: var(--color-on-surface);
473
+ }
474
+
475
+ &:focus-visible {
476
+ outline: var(--focus-ring);
477
+ background-color: var(--color-surface-container-high);
478
+ }
479
+
480
+ &:not(.ctx-menu-separator) {
481
+ gap: 0.5rem;
482
+ }
483
+
484
+ & > * {
485
+ pointer-events: none;
486
+ }
487
+
488
+ & > span {
489
+ flex: 1 1 auto;
490
+ min-inline-size: 0;
491
+ text-align: start !important;
492
+ user-select: none;
493
+ pointer-events: none;
494
+ font-size: 0.875rem;
495
+ font-weight: 400;
496
+ line-height: 1.25;
497
+ color: inherit;
498
+ }
499
+
500
+ & > ui-icon {
501
+ --icon-size: 1rem;
502
+ flex-shrink: 0;
503
+ inline-size: var(--icon-size);
504
+ block-size: var(--icon-size);
505
+ color: var(--color-on-surface-variant);
506
+ user-select: none;
507
+ pointer-events: none;
508
+ }
509
+ }
510
+
511
+ & > .ctx-menu-separator,
512
+ &.ctx-menu-separator {
513
+ min-block-size: auto;
514
+ block-size: 1px;
515
+ margin: 0.125rem 0.375rem;
516
+ padding: 0;
517
+ background-color: var(--color-outline-variant);
518
+ opacity: 0.3;
519
+ pointer-events: none;
520
+ }
521
+
522
+ /*
523
+ * `.grid-rows` applies subgrid + place(center) to children, which centers
524
+ * label text per row. Context menus must stay flex rows with start-aligned labels.
525
+ */
526
+ &.grid-rows {
527
+ display: flex !important;
528
+ flex-direction: column;
529
+ align-items: stretch;
530
+ grid-template-columns: unset !important;
531
+ grid-auto-rows: unset !important;
532
+
533
+ & > *:not(.ctx-menu-separator) {
534
+ display: flex !important;
535
+ flex-flow: row nowrap !important;
536
+ align-items: center !important;
537
+ justify-content: flex-start !important;
538
+ grid-column: unset !important;
539
+ grid-row: unset !important;
540
+ grid-template-columns: unset !important;
541
+ grid-template-rows: unset !important;
542
+ place-content: unset !important;
543
+ place-items: unset !important;
544
+ }
545
+ }
546
+ }
547
+
548
+ .ux-anchor {
549
+ --shift-x: var(--client-x, 0px);
550
+ --shift-y: var(--client-y, 0px);
551
+ --translate-x: round(nearest, min(0px, calc(100cqi - (100% + var(--shift-x, 0px)))), calc(1px / var(--pixel-ratio, 1))) !important;
552
+ --translate-y: round(nearest, min(0px, calc(100cqb - (100% + var(--shift-y, 0px)))), calc(1px / var(--pixel-ratio, 1))) !important;
553
+ inset-inline-start: max(var(--shift-x), 0px);
554
+ inset-block-start: max(var(--shift-y), var(--status-bar-padding, 0px));
555
+ inset-inline-end: auto;
556
+ inset-block-end: auto;
557
+ direction: ltr;
558
+ writing-mode: horizontal-tb;
559
+ translate: 0% 0% 0%;
560
+ transform: none;
561
+ }
562
+
563
+ .component-loading,
564
+ .component-error {
565
+ display: flex;
566
+ flex-direction: column;
567
+ align-items: center;
568
+ justify-content: center;
569
+ padding: 2rem;
570
+ gap: 1rem;
571
+ color: var(--text-secondary, light-dark(#666, #aaa));
572
+ }
573
+
574
+ .component-loading {
575
+ .loading-spinner {
576
+ inline-size: 2rem;
577
+ block-size: 2rem;
578
+ border: 2px solid var(--border, light-dark(#ddd, #444));
579
+ border-block-start: 2px solid var(--primary, light-dark(#007bff, #5fa8ff));
580
+ border-radius: 50%;
581
+ animation: spin 1s linear infinite;
582
+ }
583
+ }
584
+
585
+ .component-error {
586
+ text-align: center;
587
+
588
+ h3 {
589
+ margin: 0;
590
+ color: var(--error, light-dark(#dc3545, #ff6b6b));
591
+ }
592
+
593
+ p {
594
+ margin: 0;
595
+ }
596
+ }
597
+
598
+ ui-icon {
599
+ display: inline-flex;
600
+ align-items: center;
601
+ justify-content: center;
602
+ inline-size: var(--icon-size, 1.25rem);
603
+ block-size: var(--icon-size, 1.25rem);
604
+ min-inline-size: var(--icon-size, 1.25rem);
605
+ min-block-size: var(--icon-size, 1.25rem);
606
+ color: currentColor;
607
+ fill: currentColor;
608
+ flex-shrink: 0;
609
+ vertical-align: middle;
610
+ opacity: 1;
611
+ visibility: visible;
612
+ /* When a parent uses font-size: 0 for layout, keep raster/mask math stable */
613
+ font-size: 1rem;
614
+
615
+ svg,
616
+ img {
617
+ inline-size: 100%;
618
+ block-size: 100%;
619
+ color: inherit;
620
+ fill: currentColor;
621
+ }
622
+ }
623
+
624
+ :is(button, .btn) > ui-icon {
625
+ color: inherit;
626
+ }
627
+
628
+ .file-picker {
629
+ display: flex;
630
+ flex-direction: column;
631
+ align-items: center;
632
+ justify-content: center;
633
+ min-block-size: 300px;
634
+ padding: 2rem;
635
+ text-align: center;
636
+
637
+ .file-picker-header {
638
+ margin-block-end: 2rem;
639
+
640
+ h2 {
641
+ margin: 0 0 0.5rem 0;
642
+ color: var(--color-on-surface);
643
+ font-size: 1.5rem;
644
+ font-weight: 600;
645
+ }
646
+
647
+ p {
648
+ margin: 0;
649
+ color: var(--color-on-surface-variant);
650
+ font-size: 0.9rem;
651
+ }
652
+ }
653
+
654
+ .file-picker-actions {
655
+ display: flex;
656
+ flex-wrap: wrap;
657
+ justify-content: center;
658
+ gap: 1rem;
659
+ margin-block-end: 2rem;
660
+
661
+ .btn {
662
+ display: flex;
663
+ align-items: center;
664
+ gap: 0.5rem;
665
+ padding: 0.75rem 1.5rem;
666
+ border: 1px solid transparent;
667
+ border-radius: var(--radius-md);
668
+ font-weight: 500;
669
+ transition: all 0.2s ease;
670
+
671
+ &:hover {
672
+ transform: translateY(-1px);
673
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
674
+ }
675
+
676
+ &.btn-primary {
677
+ background: var(--color-primary);
678
+ color: var(--color-on-primary);
679
+ border-color: var(--color-primary);
680
+ }
681
+
682
+ &:not(.btn-primary) {
683
+ background: var(--color-surface-container);
684
+ color: var(--color-on-surface);
685
+ border-color: var(--color-outline-variant);
686
+ }
687
+ }
688
+ }
689
+
690
+ .file-picker-info {
691
+ max-inline-size: 400px;
692
+
693
+ p {
694
+ margin: 0.25rem 0;
695
+ font-size: 0.85rem;
696
+ color: var(--color-on-surface-variant);
697
+
698
+ strong {
699
+ color: var(--color-on-surface);
700
+ }
701
+ }
702
+ }
703
+ }
704
+ }
705
+ }