@fest-lib/veela 0.1.20 → 1.0.2

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