@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,2288 @@
1
+ /*
2
+ * Filename: SpeedDial.scss
3
+ * FullPath: modules/projects/veela.css/src/scss/ui/components/speed-dial.scss
4
+ * Change date and time: 21.20.00_23.08.2026
5
+ * Reason for changes: Under geometry clips via data-shape (no getComputedStyle copy).
6
+ */
7
+
8
+ @use "../../basic/design/wavy-runtime" as *;
9
+ @use "../../basic/design/shapes" as *;
10
+ @use "./launcher-icon-mask";
11
+
12
+ /*
13
+ * Keep launcher typography close to its component contract.
14
+ */
15
+ @layer components {
16
+ .speed-dial-root.app-oriented-desktop,
17
+ .speed-dial-root {
18
+ --home-font-sans:
19
+ system-ui,
20
+ -apple-system,
21
+ "Segoe UI",
22
+ Roboto,
23
+ "Noto Sans",
24
+ "Helvetica Neue",
25
+ Arial,
26
+ "Apple Color Emoji",
27
+ "Segoe UI Emoji",
28
+ sans-serif;
29
+
30
+ /* INVARIANT: figure / widget / label cast stays black — do not follow wallpaper halo. */
31
+ --sd-cast-shadow: color-mix(in oklab, #000 38%, transparent);
32
+ --sd-cast-shadow-deep: color-mix(in oklab, #000 40%, transparent);
33
+ --sd-cast-ink: rgb(0 0 0 / 0.88);
34
+ --sd-cast-glow: rgb(0 0 0 / 0.45);
35
+
36
+ container-type: inline-size;
37
+ container-name: speed-dial;
38
+ font-family: var(--home-font-sans);
39
+ -webkit-font-smoothing: antialiased;
40
+ -moz-osx-font-smoothing: grayscale;
41
+ text-rendering: optimizeLegibility;
42
+ font-kerning: normal;
43
+ font-variant-numeric: tabular-nums;
44
+ }
45
+
46
+ /* Native Explorer / Settings / Markdown — collapsible right rail. */
47
+ .speed-dial-core-rail {
48
+ /* INVARIANT: rail glyphs sit on the photo — wallpaper ink, not CanvasText / data-theme. */
49
+ --sd-rail-ink: var(--wallpaper-contrast-color, var(--env-launcher-fg, CanvasText));
50
+ position: fixed;
51
+ inset-block: 12%;
52
+ inset-inline-end: 0;
53
+ z-index: 6;
54
+ display: flex;
55
+ flex-direction: row;
56
+ align-items: stretch;
57
+ pointer-events: none;
58
+ max-block-size: 76%;
59
+ padding: 0px;
60
+ border: none 0px transparent;
61
+ outline: none 0px transparent;
62
+ color: var(--sd-rail-ink);
63
+ }
64
+
65
+ .speed-dial-core-rail__toggle {
66
+ pointer-events: auto;
67
+ align-self: center;
68
+ display: inline-flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ inline-size: 1.65rem;
72
+ block-size: 2.6rem;
73
+ margin: 0;
74
+ padding: 0;
75
+ //border: 1px solid color-mix(in oklab, CanvasText 18%, transparent);
76
+ border: 0px none transparent;
77
+ border-inline-end: none;
78
+ border-radius: 10px 0 0 10px;
79
+ background: transparent;//color-mix(in oklab, Canvas 78%, transparent);
80
+ color: color-mix(in oklab, var(--sd-rail-ink) 78%, transparent);
81
+ --icon-color: color-mix(in oklab, var(--sd-rail-ink) 78%, transparent);
82
+ /*backdrop-filter: blur(10px);
83
+ -webkit-backdrop-filter: blur(10px);*/
84
+ cursor: pointer;
85
+ }
86
+
87
+ .speed-dial-core-rail__toggle ui-icon {
88
+ --icon-size: 1.1rem;
89
+ --icon-color: color-mix(in oklab, var(--sd-rail-ink) 78%, transparent);
90
+ pointer-events: none;
91
+ }
92
+
93
+ .speed-dial-core-rail__panel {
94
+ pointer-events: auto;
95
+ display: none;
96
+ flex-direction: column;
97
+ gap: 0.45rem;
98
+ padding: 0.55rem 0.45rem;
99
+ min-inline-size: 3.4rem;
100
+ max-inline-size: 5.2rem;
101
+ overflow: auto;
102
+ border: 1px solid color-mix(in oklab, var(--sd-rail-ink) 16%, transparent);
103
+ border-inline-end: none;
104
+ border-radius: 14px 0 0 14px;
105
+ background: color-mix(in oklab, var(--wallpaper-underlying-color, Canvas) 82%, transparent);
106
+ backdrop-filter: blur(14px);
107
+ -webkit-backdrop-filter: blur(14px);
108
+ color: var(--sd-rail-ink);
109
+ }
110
+
111
+ .speed-dial-core-rail[data-open] .speed-dial-core-rail__panel {
112
+ display: flex;
113
+ }
114
+
115
+ .speed-dial-core-rail__item {
116
+ appearance: none;
117
+ display: flex;
118
+ flex-direction: column;
119
+ align-items: center;
120
+ gap: 0.2rem;
121
+ margin: 0;
122
+ padding: 0.35rem 0.2rem;
123
+ border: none;
124
+ border-radius: var(--radius-lg);
125
+ background: transparent;
126
+ color: inherit;
127
+ cursor: pointer;
128
+ min-inline-size: 0;
129
+ }
130
+
131
+ .speed-dial-core-rail__item:hover,
132
+ .speed-dial-core-rail__item:focus-visible {
133
+ background: color-mix(in oklab, var(--sd-rail-ink) 10%, transparent);
134
+ outline: none;
135
+ }
136
+
137
+ .speed-dial-core-rail__item ui-icon {
138
+ --icon-size: 1.55rem;
139
+ --icon-color: var(--sd-rail-ink);
140
+ color: var(--sd-rail-ink);
141
+ pointer-events: none;
142
+ }
143
+
144
+ .speed-dial-workspace-pager {
145
+ position: absolute;
146
+ inset-inline: 0;
147
+ inset-block-end: 0.55rem;
148
+ z-index: 5;
149
+ display: flex;
150
+ justify-content: center;
151
+ gap: 0.4rem;
152
+ pointer-events: none;
153
+ }
154
+
155
+ .speed-dial-workspace-pager__dot {
156
+ pointer-events: auto;
157
+ inline-size: 0.45rem;
158
+ block-size: 0.45rem;
159
+ padding: 0;
160
+ border: none;
161
+ border-radius: var(--radius-full);
162
+ background: color-mix(in oklab, var(--wallpaper-contrast-color, var(--env-launcher-fg, CanvasText)) 35%, transparent);
163
+ cursor: pointer;
164
+ }
165
+
166
+ .speed-dial-workspace-pager__dot[data-active] {
167
+ inline-size: 0.85rem;
168
+ background: var(--wallpaper-contrast-color, var(--env-launcher-fg, CanvasText));
169
+ }
170
+
171
+ .sd-widget-host {
172
+ overflow: visible;
173
+ position: relative;
174
+ container-type: size;
175
+ container-name: sd-widget;
176
+ aspect-ratio: auto;
177
+ max-inline-size: none;
178
+ max-block-size: none;
179
+ place-self: stretch;
180
+ --tile-size: 100%;
181
+ background: transparent !important;
182
+ box-shadow: none !important;
183
+ backdrop-filter: none !important;
184
+ -webkit-backdrop-filter: none !important;
185
+ border-radius: 0 !important;
186
+ clip-path: none !important;
187
+ filter: none !important;
188
+ }
189
+
190
+ .sd-widget-host > :is(ui-icon, .ui-ws-item-icon-native, img[data-launcher-icon], .ui-ws-item-icon-img, .ui-ws-item-icon-mask) {
191
+ display: none !important;
192
+ }
193
+
194
+ .sd-widget {
195
+ display: flex;
196
+ flex-direction: column;
197
+ justify-content: center;
198
+ align-items: stretch;
199
+ inline-size: 100%;
200
+ block-size: 100%;
201
+ min-inline-size: 0;
202
+ min-block-size: 0;
203
+ padding: clamp(0.45rem, 6cqi, 0.9rem);
204
+ pointer-events: auto;
205
+ touch-action: none;
206
+ user-select: none;
207
+ -webkit-user-select: none;
208
+ box-sizing: border-box;
209
+ isolation: isolate;
210
+ z-index: 1;
211
+ }
212
+
213
+ .sd-widget-host:not([data-widget="android"]) {
214
+ pointer-events: auto !important;
215
+ cursor: grab;
216
+ touch-action: none;
217
+ user-select: none;
218
+ -webkit-user-select: none;
219
+ /* INVARIANT: keep `container-type: size` so clock `cqi`/`cqb` track the span. */
220
+ }
221
+
222
+ .sd-widget-host[data-interaction-state="onGrab"],
223
+ .sd-widget-host[data-interaction-state="onMoving"] {
224
+ cursor: grabbing;
225
+ }
226
+
227
+ .sd-widget--clock,
228
+ .sd-widget--search {
229
+ /* WHY: Material You — wallpaper ink for L, `--base-color` for hue. Contrast stays majority. */
230
+ --sd-widget-seed: var(--base-color, var(--color-primary, #5a9ec8));
231
+ --sd-you-ink: color-mix(
232
+ in oklab,
233
+ var(--wallpaper-contrast-color, var(--env-launcher-fg)) 72%,
234
+ var(--sd-widget-seed) 28%
235
+ );
236
+ }
237
+
238
+ .sd-widget--clock {
239
+ align-items: center;
240
+ justify-content: center;
241
+ text-align: center;
242
+ gap: 0.12em;
243
+ overflow: hidden;
244
+ padding-block-start: 1.35rem;
245
+ color: var(--sd-you-ink);
246
+ font-variant-numeric: tabular-nums;
247
+ }
248
+
249
+ .sd-widget__time {
250
+ font-size: clamp(1.6rem, min(28cqi, 38cqb), 10rem);
251
+ font-weight: 650;
252
+ line-height: 1;
253
+ letter-spacing: 0.01em;
254
+ font-variant-numeric: tabular-nums;
255
+ font-feature-settings: "tnum" 1;
256
+ text-align: center;
257
+ white-space: nowrap;
258
+ overflow: hidden;
259
+ text-overflow: ellipsis;
260
+ max-inline-size: 100%;
261
+ color: color-mix(in oklab, var(--sd-you-ink) 78%, var(--sd-widget-seed) 22%);
262
+ text-shadow:
263
+ 0 1px 2px var(--sd-cast-ink, rgb(0 0 0 / 0.88)),
264
+ 0 0 12px var(--sd-cast-glow, rgb(0 0 0 / 0.45));
265
+ }
266
+
267
+ .sd-widget__date {
268
+ font-variant-numeric: tabular-nums;
269
+ font-size: clamp(0.75rem, min(10cqi, 12cqb), 2.75rem);
270
+ opacity: 0.86;
271
+ text-align: center;
272
+ white-space: nowrap;
273
+ overflow: hidden;
274
+ text-overflow: ellipsis;
275
+ max-inline-size: 100%;
276
+ color: color-mix(in oklab, var(--sd-you-ink) 88%, var(--wallpaper-contrast-color, var(--env-launcher-fg)) 12%);
277
+ text-shadow:
278
+ 0 1px 2px var(--sd-cast-ink, rgb(0 0 0 / 0.88)),
279
+ 0 0 8px var(--sd-cast-glow, rgb(0 0 0 / 0.45));
280
+ }
281
+
282
+ .ui-ws-item[data-widget="android"] {
283
+ aspect-ratio: auto;
284
+ max-inline-size: none;
285
+ max-block-size: none;
286
+ place-self: stretch;
287
+ pointer-events: none;
288
+ }
289
+
290
+ .sd-widget-chrome,
291
+ .sd-widget-resize {
292
+ pointer-events: auto;
293
+ /* INVARIANT: wallpaper contrast + Canvas ring — readable on light and dark wallpaper. */
294
+ --sd-widget-ink: var(--wallpaper-contrast-color, var(--env-launcher-fg, CanvasText));
295
+ --sd-widget-chip: color-mix(in oklab, Canvas 72%, var(--sd-widget-ink) 28%);
296
+ --sd-widget-ring: color-mix(in oklab, var(--sd-widget-ink) 55%, Canvas 45%);
297
+ }
298
+
299
+ .sd-widget-chrome {
300
+ position: absolute;
301
+ inset-inline: 0;
302
+ inset-block-start: 0;
303
+ block-size: 1.45rem;
304
+ z-index: 4;
305
+ display: grid;
306
+ place-items: center;
307
+ cursor: grab;
308
+ touch-action: none;
309
+ background: transparent;
310
+
311
+ &::before {
312
+ content: "";
313
+ inline-size: 2.4rem;
314
+ block-size: 0.32rem;
315
+ border-radius: var(--radius-full);
316
+ background: var(--sd-widget-chip);
317
+ box-shadow: 0 0 0 1px var(--sd-widget-ring);
318
+ /* WHY: a faint rest hint so the grab strip is findable with a mouse. */
319
+ opacity: 0.01;
320
+ transition: opacity 120ms ease;
321
+ }
322
+ }
323
+
324
+ .sd-widget-resize {
325
+ position: absolute;
326
+ inset-inline-end: 0.15rem;
327
+ inset-block-end: 0.15rem;
328
+ z-index: 5;
329
+ inline-size: 1.35rem;
330
+ block-size: 1.35rem;
331
+ padding: 0;
332
+ border: none;
333
+ border-radius: 0.35rem;
334
+ cursor: nwse-resize;
335
+ touch-action: none;
336
+ background: var(--sd-widget-chip);
337
+ box-shadow: 0 0 0 1px var(--sd-widget-ring);
338
+ opacity: 0;
339
+ transition: opacity 120ms ease;
340
+
341
+ &::before {
342
+ content: "";
343
+ position: absolute;
344
+ inset-inline-end: 0.22rem;
345
+ inset-block-end: 0.22rem;
346
+ inline-size: 0.5rem;
347
+ block-size: 0.5rem;
348
+ border-inline-end: 2px solid var(--sd-widget-ink);
349
+ border-block-end: 2px solid var(--sd-widget-ink);
350
+ border-radius: 0 0 0.08rem 0;
351
+ filter: drop-shadow(0 0 1px Canvas);
352
+ }
353
+
354
+ &::after {
355
+ content: "";
356
+ position: absolute;
357
+ inset: -0.45rem;
358
+ }
359
+ }
360
+
361
+ .sd-widget-host:hover,
362
+ .sd-widget-host:focus-within,
363
+ .sd-widget-host:active,
364
+ .sd-widget-host[data-resizing],
365
+ .sd-widget-host[data-interaction-state="onGrab"],
366
+ .sd-widget-host[data-interaction-state="onMoving"] {
367
+ .sd-widget-chrome::before,
368
+ .sd-widget-resize {
369
+ opacity: 1;
370
+ }
371
+ }
372
+
373
+ @media (pointer: coarse) {
374
+ .sd-widget-chrome {
375
+ block-size: 2.1rem;
376
+ }
377
+
378
+ .sd-widget-resize {
379
+ inline-size: 2.05rem;
380
+ block-size: 2.05rem;
381
+ }
382
+ }
383
+
384
+ .sd-widget--android {
385
+ pointer-events: none;
386
+ opacity: 0.08;
387
+ }
388
+
389
+ .sd-widget__preview {
390
+ inline-size: 100%;
391
+ block-size: 100%;
392
+ object-fit: contain;
393
+ }
394
+
395
+ .sd-widget--search {
396
+ justify-content: center;
397
+ padding-block-start: 2.2rem;
398
+ padding-block-end: 2rem;
399
+ padding-inline: 0.7rem;
400
+ }
401
+
402
+ .sd-widget__search {
403
+ inline-size: 100%;
404
+ min-block-size: clamp(2rem, 28cqb, 3.1rem);
405
+ border: 1px solid color-mix(in oklab, var(--sd-you-ink, var(--wallpaper-contrast-color)) 32%, transparent);
406
+ border-radius: var(--radius-full);
407
+ background: color-mix(
408
+ in oklab,
409
+ color-mix(in oklab, var(--wallpaper-underlying-color, Canvas) 78%, var(--sd-widget-seed, var(--base-color)) 22%) 70%,
410
+ transparent
411
+ );
412
+ color: var(--sd-you-ink, var(--wallpaper-contrast-color));
413
+ caret-color: var(--sd-you-ink, currentColor);
414
+ padding: 0.35rem 0.85rem;
415
+ font: inherit;
416
+ font-size: clamp(0.85rem, 8cqi, 1.2rem);
417
+ touch-action: manipulation;
418
+ user-select: text;
419
+ -webkit-user-select: text;
420
+ cursor: text;
421
+ }
422
+
423
+ .sd-widget__search::placeholder {
424
+ color: color-mix(in oklab, var(--sd-you-ink, var(--wallpaper-contrast-color)) 62%, transparent);
425
+ }
426
+
427
+ .speed-dial-core-rail__label {
428
+ font-size: 0.62rem;
429
+ line-height: 1.15;
430
+ text-align: center;
431
+ max-inline-size: 100%;
432
+ overflow: hidden;
433
+ text-overflow: ellipsis;
434
+ white-space: nowrap;
435
+ opacity: 0.88;
436
+ }
437
+
438
+ ui-window-frame,
439
+ ui-modal,
440
+ .ui-grid-item {
441
+ --opacity: 1;
442
+ --scale: 1;
443
+ --rotate: 0deg;
444
+ --translate-x: 0%;
445
+ --translate-y: 0%;
446
+ isolation: isolate;
447
+ content-visibility: auto;
448
+ transform-origin: 50% 50%;
449
+ transform-style: flat;
450
+ transform-box: fill-box;
451
+ translate: 0% 0% 0%;
452
+ opacity: var(--opacity, 1);
453
+ rotate: 0deg;
454
+ scale: 1;
455
+ }
456
+
457
+ // Speed Dial (Home) Styles
458
+ .speed-dial-root {
459
+ display: grid;
460
+ grid-row: 1 / -1;
461
+ grid-column: 1 / -1;
462
+ grid-template-columns: minmax(0px, 1fr);
463
+ grid-template-rows: minmax(0px, 1fr);
464
+ pointer-events: auto;
465
+ min-inline-size: 0px;
466
+ min-block-size: var(--lv-height, 100lvb);
467
+ max-inline-size: var(--lv-width, 100lvi);
468
+ max-block-size: var(--lv-height, 100lvb);
469
+ inline-size: var(--lv-width, 100lvi);
470
+ block-size: var(--lv-height, 100lvb);
471
+ box-sizing: border-box;
472
+ inset: 0 auto auto 0;
473
+ position: fixed;
474
+ background-color: transparent;
475
+ overflow: hidden;
476
+ perspective: 72rem;
477
+ transform-style: preserve-3d;
478
+ border-radius: 0px;
479
+ user-select: none;
480
+ user-drag: none;
481
+ -webkit-user-drag: none;
482
+ -webkit-user-select: none;
483
+ -webkit-tap-highlight-color: transparent;
484
+ touch-action: none;
485
+
486
+ & > * {
487
+ grid-row: 1 / -1;
488
+ grid-column: 1 / -1;
489
+ }
490
+
491
+ &[data-ws-turning] .speed-dial-grid {
492
+ transform-origin: 50% 50%;
493
+ backface-visibility: hidden;
494
+ will-change: transform, opacity;
495
+ }
496
+
497
+ .speed-dial-grid--turn-ghost {
498
+ pointer-events: none;
499
+ z-index: 3;
500
+ }
501
+ }
502
+
503
+ /* Suppress UA focus ring on orient host (`tabIndex` + programmatic focus for paste). */
504
+ .speed-dial-root.ui-orientbox {
505
+ &:focus,
506
+ &:focus-visible {
507
+ outline: none !important;
508
+ box-shadow: none !important;
509
+ }
510
+ }
511
+
512
+ /* WHY: veela `.ui-orientbox` uses `pointer-events: none` for touch routing; desktop needs full-area context menu / paste. */
513
+ .speed-dial-root.app-oriented-desktop.ui-orientbox {
514
+ pointer-events: auto;
515
+ }
516
+
517
+ .speed-dial-grid {
518
+ grid-row: 1 / -1;
519
+ grid-column: 1 / -1;
520
+ display: grid;
521
+ /* WHY: `--cs-layout-*` follows `--layout-c/r` + `--orient` (ui-launcher-grid).
522
+ * `--grid-columns` is the JS visual count. They must agree after settings. */
523
+ grid-template-columns: repeat(var(--grid-columns, var(--cs-layout-c, 4)), minmax(0, 1fr));
524
+ grid-template-rows: repeat(var(--grid-rows, var(--cs-layout-r, 8)), minmax(0, 1fr));
525
+ padding: var(--speed-dial-padding, 1rem);
526
+ border-radius: 0px;
527
+
528
+ @media (orientation: portrait) {
529
+ padding-block: 2.5rem;
530
+ padding-inline: 1.5rem;
531
+ }
532
+
533
+ @media (orientation: landscape) {
534
+ padding-inline: 2.5rem;
535
+ padding-block: 1.5rem;
536
+ }
537
+
538
+ // Stack order: labels on top so overflowing text below icon tiles is visible.
539
+ // Labels layer is pointer-events: none so it never blocks interaction.
540
+ &[data-grid-layer="icons"] {
541
+ z-index: 2;
542
+ background: transparent !important;
543
+ pointer-events: none;
544
+ isolation: isolate;
545
+ /* WHY: layout contain + CSS-anchor left under-glow 0×0; blur must paint past the cell. */
546
+ contain: style;
547
+ overflow: visible;
548
+
549
+ &:has([data-dragging]) {
550
+ z-index: 3;
551
+ }
552
+ }
553
+
554
+ &[data-grid-layer="labels"] {
555
+ z-index: 1;
556
+ background: transparent !important;
557
+ pointer-events: none !important;
558
+ isolation: isolate;
559
+ /* WHY: avoid paint/size contain so wide captions can overflow cells. */
560
+ contain: layout style;
561
+ overflow: visible;
562
+ transition: none !important;
563
+ transition-duration: 0ms !important;
564
+ animation: none !important;
565
+ animation-duration: 0ms !important;
566
+ }
567
+
568
+ .sd-drop-ghost {
569
+ pointer-events: none;
570
+ z-index: 0;
571
+ border-radius: 1.15rem;
572
+ background: color-mix(in oklab, CanvasText 12%, transparent);
573
+ box-shadow: inset 0 0 0 2px color-mix(in oklab, CanvasText 38%, transparent);
574
+ min-inline-size: 0;
575
+ min-block-size: 0;
576
+ }
577
+
578
+ .ui-ws-item {
579
+ --drag-x: 0px;
580
+ --drag-y: 0px;
581
+ --tile-size: 4rem;
582
+
583
+ /* WHY: labels omit the `auto` fallback — missing `--cell-column` must
584
+ * drop this rule so inline `grid-column` from the label template wins. */
585
+ &:not([data-layer="labels"]) {
586
+ grid-column: var(--cell-column, auto);
587
+ grid-row: var(--cell-row, auto);
588
+ }
589
+
590
+ position: relative;
591
+ display: grid;
592
+ place-content: center;
593
+ place-items: center;
594
+ place-self: center;
595
+ aspect-ratio: 1 / 1;
596
+ inline-size: 100%;
597
+ block-size: 100%;
598
+ min-inline-size: 0;
599
+ min-block-size: 0;
600
+ max-inline-size: var(--tile-size);
601
+ max-block-size: var(--tile-size);
602
+ grid-template-columns: minmax(0px, 1fr);
603
+ grid-template-rows: minmax(0px, 1fr);
604
+
605
+ background-color: transparent;
606
+ pointer-events: auto;
607
+ text-align: center;
608
+ touch-action: none;
609
+ user-select: none;
610
+ -webkit-user-select: none;
611
+ -webkit-tap-highlight-color: transparent;
612
+ contain: none;
613
+ overflow: visible;
614
+ z-index: 1;
615
+ filter: none;
616
+
617
+ transform: translate3d(var(--drag-x, 0px), var(--drag-y, 0px), 0);
618
+ transform-origin: 50% 50%;
619
+
620
+ transition: transform 240ms cubic-bezier(0.22, 0.8, 0.3, 1), scale 180ms ease-out, filter 180ms ease-out;
621
+
622
+ &:hover {
623
+ scale: 1.06;
624
+
625
+ .ui-ws-item-icon:not([data-shape="shapeless"]) {
626
+ background: color-mix(
627
+ in oklab,
628
+ var(--color-surface-container-high, #1f2937) 72%,
629
+ var(--wallpaper-underlying-color, #121214) 28%
630
+ );
631
+ box-shadow: 0 10px 36px -10px var(--sd-cast-shadow-deep, color-mix(in oklab, #000 40%, transparent));
632
+ }
633
+ }
634
+
635
+ &.sd-widget-host:hover,
636
+ &[data-widget]:hover,
637
+ &[data-spanned]:hover {
638
+ scale: 1;
639
+ }
640
+
641
+ &:active {
642
+ scale: 0.94;
643
+ }
644
+
645
+ /* WHY: hover/active scale shifts the visual center vs grabOffset; drop then misses the cell. */
646
+ &[data-dragging],
647
+ &[data-interaction-state="onGrab"],
648
+ &[data-interaction-state="onMoving"],
649
+ &[data-interaction-state="onRelax"],
650
+ &[data-interaction-state="onPlace"] {
651
+ scale: 1;
652
+ transition: none !important;
653
+ }
654
+
655
+ &.sd-widget-host,
656
+ &[data-widget]:not([data-layer="labels"]),
657
+ &[data-spanned]:not([data-layer="labels"]) {
658
+ /* WHY: launcher grid uses place-items:center + 4rem --tile-size; widgets must fill the span. */
659
+ grid-column: var(--cell-column, auto) / span var(--cell-span-x, 1) !important;
660
+ grid-row: var(--cell-row, auto) / span var(--cell-span-y, 1) !important;
661
+ place-self: stretch !important;
662
+ justify-self: stretch !important;
663
+ align-self: stretch !important;
664
+ aspect-ratio: auto !important;
665
+ inline-size: 100% !important;
666
+ block-size: 100% !important;
667
+ max-inline-size: none !important;
668
+ max-block-size: none !important;
669
+ --tile-size: 100%;
670
+ }
671
+
672
+ &.ui-ws-item-icon {
673
+ display: grid;
674
+ transition: background-color 200ms ease, box-shadow 200ms ease;
675
+ --icon-size: 2.2rem;
676
+ --launcher-icon-mask-scale: 1.12;
677
+ /*grid-column: 1 / -1;
678
+ grid-row: 1 / -1;*/
679
+ aspect-ratio: 1 / 1;
680
+
681
+ /* WHY: `.shaped` later-layer stretch/fit-content made icon plates non-square. */
682
+ &.shaped:not(.sd-widget-host) {
683
+ aspect-ratio: 1 / 1 !important;
684
+ inline-size: min(100%, var(--tile-size, 4rem)) !important;
685
+ block-size: min(100%, var(--tile-size, 4rem)) !important;
686
+ /* WHY: `@layer components` `contain:strict` + 1.25rem pad boxes the glyph on WebView. */
687
+ contain: none !important;
688
+ padding: 0.35rem !important;
689
+ }
690
+
691
+ pointer-events: auto;
692
+ position: relative;
693
+ text-align: center;
694
+ place-content: center;
695
+ place-items: center;
696
+ line-height: 0;
697
+ overflow: hidden;
698
+ contain: layout style;
699
+ cursor: pointer;
700
+
701
+ inline-size: 100%;
702
+ block-size: 100%;
703
+ min-inline-size: 0;
704
+ min-block-size: 0;
705
+ max-inline-size: var(--tile-size);
706
+ max-block-size: var(--tile-size);
707
+ padding: 0.8rem;
708
+
709
+ &.sd-widget-host,
710
+ &[data-shape="none"] {
711
+ overflow: visible;
712
+ aspect-ratio: auto !important;
713
+ max-inline-size: none !important;
714
+ max-block-size: none !important;
715
+ inline-size: 100% !important;
716
+ block-size: 100% !important;
717
+ padding: 0;
718
+ line-height: normal;
719
+ cursor: default;
720
+ background: transparent !important;
721
+ box-shadow: none !important;
722
+ backdrop-filter: none !important;
723
+ -webkit-backdrop-filter: none !important;
724
+ border-radius: 0 !important;
725
+ clip-path: none !important;
726
+ filter: none !important;
727
+
728
+ @supports (corner-shape: squircle) {
729
+ corner-shape: unset;
730
+ }
731
+ }
732
+
733
+ /*
734
+ * WHY: mix two opaque colors — `… 80%, transparent` showed crisp wallpaper
735
+ * through the plate. `backdrop-filter` dies on Capacitor WebView and also
736
+ * inside `.speed-dial-root` `perspective` / `preserve-3d`.
737
+ */
738
+ background: color-mix(
739
+ in oklab,
740
+ var(--color-surface-container, #1a1a1e) 78%,
741
+ var(--wallpaper-underlying-color, #121214) 22%
742
+ );
743
+ /* INVARIANT: glyph vs plate — not wallpaper ink (white-on-cream). JS luma may overwrite. */
744
+ --sd-figure-ink: var(--color-on-surface, light-dark(#1a1c1f, #e8eaed));
745
+ border: none;
746
+ box-shadow: 0 6px 24px -8px var(--sd-cast-shadow, color-mix(in oklab, #000 38%, transparent));
747
+ backdrop-filter: blur(16px) saturate(1.2);
748
+ -webkit-backdrop-filter: blur(16px) saturate(1.2);
749
+ filter: none;
750
+
751
+ :where(html[data-cwsp-native-shell="capacitor"]) & {
752
+ backdrop-filter: none;
753
+ -webkit-backdrop-filter: none;
754
+ }
755
+
756
+ &:not([data-shape]) {
757
+ border-radius: 1.5rem !important;
758
+
759
+ @supports (corner-shape: round) {
760
+ corner-shape: round;
761
+ }
762
+ }
763
+
764
+ /*
765
+ * WHY: `@layer components` `.shaped` is a later implicit layer — 1.5rem +
766
+ * stretch/fit-content beat `@layer views` and kept circle as a rounded square.
767
+ * INVARIANT: `corner-shape: squircle` flattens the 1.5rem arc (looks less round).
768
+ */
769
+ &[data-shape="circle"] {
770
+ aspect-ratio: 1 / 1 !important;
771
+ inline-size: min(100%, var(--tile-size, 4rem)) !important;
772
+ block-size: min(100%, var(--tile-size, 4rem)) !important;
773
+ max-inline-size: var(--tile-size, 4rem);
774
+ max-block-size: var(--tile-size, 4rem);
775
+ border-radius: 50% !important;
776
+
777
+ @supports (corner-shape: round) {
778
+ corner-shape: round;
779
+ }
780
+ }
781
+
782
+ &[data-shape="square"] {
783
+ border-radius: max(0.55rem, 14%) !important;
784
+
785
+ @supports (corner-shape: square) {
786
+ corner-shape: square;
787
+ }
788
+ }
789
+
790
+ &[data-shape="squircle"] {
791
+ border-radius: 1.5rem !important;
792
+
793
+ @supports (corner-shape: squircle) {
794
+ corner-shape: unset;
795
+ }
796
+
797
+ @supports (corner-shape: round) {
798
+ corner-shape: round;
799
+ }
800
+ }
801
+
802
+ &[data-shape="wavy"] {
803
+ @include wavy-shaped(100);
804
+
805
+ @supports (border-shape: inset(0)) {
806
+ border-shape: var(--clip-path);
807
+ overflow: hidden !important;
808
+ corner-shape: superellipse(1);
809
+ border-radius: 50% !important;
810
+ }
811
+
812
+ clip-path: var(--clip-path);
813
+
814
+ @supports not (border-shape: inset(0)) {
815
+
816
+ }
817
+ }
818
+
819
+ /* WHY: icon is the silhouette — no glass plate; shadow is a black blur clone. */
820
+ &[data-shape="shapeless"] {
821
+ overflow: visible !important;
822
+ contain: none;
823
+ background: transparent !important;
824
+ box-shadow: none !important;
825
+ backdrop-filter: none !important;
826
+ -webkit-backdrop-filter: none !important;
827
+ border-radius: 0 !important;
828
+ clip-path: none !important;
829
+ padding: 0.12rem;
830
+
831
+ @supports (corner-shape: squircle) {
832
+ corner-shape: unset;
833
+ }
834
+
835
+ img[data-launcher-icon],
836
+ img[data-bookmark-favicon],
837
+ .ui-ws-item-icon-img,
838
+ ui-icon {
839
+ object-fit: contain;
840
+ border-radius: 0;
841
+ }
842
+
843
+ img.sd-icon-silhouette,
844
+ ui-icon.sd-icon-silhouette {
845
+ position: absolute;
846
+ inset: 0;
847
+ z-index: 1;
848
+ pointer-events: none;
849
+ object-fit: contain;
850
+ opacity: 0.4;
851
+ filter: brightness(0) blur(7px);
852
+ transform: scale(var(--sd-item-icon-scale, var(--sd-launcher-icon-scale, 1))) translateY(8%);
853
+ }
854
+
855
+ img[data-launcher-icon]:not(.sd-icon-silhouette),
856
+ img[data-bookmark-favicon]:not(.sd-icon-silhouette),
857
+ .ui-ws-item-icon-img:not(.sd-icon-silhouette),
858
+ ui-icon:not(.sd-icon-silhouette) {
859
+ z-index: 3;
860
+ filter: none;
861
+ }
862
+
863
+ --sd-figure-ink: var(--wallpaper-contrast-color, var(--env-launcher-fg, #f7f7f8));
864
+
865
+ &[data-icon-display="glyph"] ui-icon:not(.sd-icon-silhouette) {
866
+ filter: drop-shadow(0 3px 6px rgb(0 0 0 / 0.42));
867
+ }
868
+
869
+ &[data-icon-display="glyph"] .sd-icon-silhouette {
870
+ display: none;
871
+ }
872
+ }
873
+
874
+ /* WHY: glyphs appear at compact 0.78; bitmaps keep workspace fill (1.28). */
875
+ &[data-icon-display="glyph"] {
876
+ --sd-item-icon-scale: 0.78;
877
+ }
878
+
879
+ /* Bitmap / glyph zoom — Cap needs inline transform; CSS var is backup. */
880
+ img[data-launcher-icon]:not([data-bookmark-favicon]),
881
+ img[data-bookmark-favicon],
882
+ .ui-ws-item-icon-img,
883
+ ui-icon {
884
+ transform: scale(var(--sd-item-icon-scale, var(--sd-launcher-icon-scale, 1.28)));
885
+ transform-origin: center center;
886
+ }
887
+
888
+ img[data-icon-pending],
889
+ img[data-launcher-icon]:not([src]),
890
+ ui-icon[data-icon-pending] {
891
+ opacity: 0;
892
+ visibility: hidden;
893
+ }
894
+
895
+ img[data-launcher-icon]:not([data-bookmark-favicon]) {
896
+ position: absolute;
897
+ inset: 0;
898
+ inline-size: 100%;
899
+ block-size: 100%;
900
+ object-fit: cover;
901
+ object-position: center;
902
+ pointer-events: none;
903
+ z-index: 3;
904
+ filter: drop-shadow(0 1px 3px #0003);
905
+ }
906
+
907
+ /*
908
+ * Bookmark / S2 / chrome favicons — fill the plate shape (clipped by overflow).
909
+ */
910
+ img[data-bookmark-favicon],
911
+ .ui-ws-item-icon-img[data-bookmark-favicon],
912
+ .ui-ws-item-icon-img:not([data-launcher-icon]) {
913
+ position: absolute;
914
+ inset: 0;
915
+ inline-size: stretch;
916
+ block-size: stretch;
917
+ object-fit: cover;
918
+ object-position: center;
919
+ image-rendering: auto;
920
+ border-radius: 0;
921
+ pointer-events: none;
922
+ z-index: 3;
923
+ aspect-ratio: 1 / 1;
924
+ filter: drop-shadow(0 1px 2px #0002);
925
+ }
926
+
927
+ /* Mask path (optional) — ink from `_launcher-icon-mask.scss`. */
928
+ .ui-ws-item-icon-mask[data-launcher-icon] {
929
+ position: absolute;
930
+ inset: 0;
931
+ margin: auto;
932
+ pointer-events: none;
933
+ z-index: 3;
934
+ --launcher-icon-size: var(--icon-size, 2.2rem);
935
+ --launcher-icon-mask-scale: var(--sd-item-icon-scale, var(--sd-launcher-icon-scale, 1.28));
936
+ }
937
+
938
+ ui-icon {
939
+ position: absolute;
940
+ inset: 0;
941
+ inline-size: 100%;
942
+ block-size: 100%;
943
+ max-inline-size: none;
944
+ max-block-size: none;
945
+ min-inline-size: 0;
946
+ min-block-size: 0;
947
+ aspect-ratio: 1 / 1;
948
+ line-height: 0;
949
+ z-index: 3;
950
+ pointer-events: none;
951
+ filter: drop-shadow(0 1px 2px #0002);
952
+
953
+ &:not([data-launcher-icon]) {
954
+ --icon-padding: 0.55rem;
955
+ --icon-size: 1.72rem;
956
+ --icon-color: var(--sd-figure-ink, var(--color-on-surface, light-dark(#1a1c1f, #e8eaed)));
957
+ color: var(--icon-color);
958
+ background: transparent !important;
959
+ }
960
+
961
+ &[data-launcher-icon] {
962
+ --icon-padding: 0px;
963
+ --icon-size: 100%;
964
+ color: inherit;
965
+ }
966
+ }
967
+ }
968
+
969
+ &.ui-ws-item-label[data-widget] {
970
+ visibility: hidden;
971
+ }
972
+
973
+ &.ui-ws-item-label {
974
+ transition: none !important;
975
+ transition-duration: 0ms !important;
976
+ animation: none !important;
977
+ animation-duration: 0ms !important;
978
+ position: absolute;
979
+ inset-inline: 0;
980
+ inset-block-start: 100%;
981
+ pointer-events: none;
982
+ text-align: center;
983
+ display: flex;
984
+ justify-content: center;
985
+ align-items: flex-start;
986
+ padding-block-start: 0.35rem;
987
+ color: var(--wallpaper-contrast-color, var(--env-launcher-fg, #f7f7f8));
988
+ background: transparent;
989
+ white-space: nowrap;
990
+ overflow: visible;
991
+ filter: none;
992
+
993
+ span {
994
+ transition: none !important;
995
+ transition-duration: 0ms !important;
996
+ animation: none !important;
997
+ animation-duration: 0ms !important;
998
+
999
+ display: inline-flex;
1000
+ place-content: center;
1001
+ place-items: center;
1002
+ overflow: visible;
1003
+
1004
+ font-size: 0.72rem;
1005
+ font-weight: 500;
1006
+ letter-spacing: 0.01em;
1007
+ color: var(--wallpaper-contrast-color, var(--env-launcher-fg, #f7f7f8));
1008
+
1009
+ white-space: nowrap;
1010
+ text-overflow: ellipsis;
1011
+ overflow: hidden;
1012
+ padding-block: 0.15rem;
1013
+ padding-inline: 0.4rem;
1014
+ max-inline-size: min(100%, 9rem);
1015
+ inline-size: max-content;
1016
+ border-radius: 6px;
1017
+ pointer-events: none;
1018
+ text-align: center;
1019
+ line-height: 1.25;
1020
+
1021
+ text-shadow:
1022
+ 0 1px 2px var(--sd-cast-ink, rgb(0 0 0 / 0.88)),
1023
+ 0 0 12px var(--sd-cast-glow, rgb(0 0 0 / 0.45));
1024
+ border: none;
1025
+ background: transparent;
1026
+ backdrop-filter: none;
1027
+ -webkit-backdrop-filter: none;
1028
+ box-shadow: none;
1029
+ }
1030
+ }
1031
+
1032
+ /*
1033
+ * WHY: absolute inset "above" is only for icon-layer captions.
1034
+ * Label-layer items already dock via `translate` — applying both double-offsets
1035
+ * lower-row titles far above their tiles.
1036
+ */
1037
+ &:not([data-layer="labels"])[data-label-placement="above"] &.ui-ws-item-label {
1038
+ inset-block-start: auto;
1039
+ inset-block-end: 100%;
1040
+ padding-block-start: 0;
1041
+ padding-block-end: 0.35rem;
1042
+ }
1043
+
1044
+ &:active {
1045
+ will-change: transform;
1046
+ }
1047
+
1048
+ &[data-interaction-state="onGrab"],
1049
+ &[data-interaction-state="onMoving"] {
1050
+ will-change: transform;
1051
+ cursor: grabbing;
1052
+ z-index: 120;
1053
+ transition: none !important;
1054
+ transform: translate3d(var(--drag-x, 0px), var(--drag-y, 0px), 0);
1055
+
1056
+ &.ui-ws-item-label {
1057
+ opacity: 1;
1058
+ pointer-events: none;
1059
+ }
1060
+ }
1061
+
1062
+ &[data-interaction-state="onRelax"] {
1063
+ will-change: transform;
1064
+ z-index: 120;
1065
+ transition: none !important;
1066
+ transform: translate3d(var(--drag-x, 0px), var(--drag-y, 0px), 0);
1067
+ }
1068
+
1069
+ &[data-interaction-state="onPlace"] {
1070
+ will-change: transform;
1071
+ z-index: 120;
1072
+ transition: none !important;
1073
+ transform: translate3d(var(--drag-x, 0px), var(--drag-y, 0px), 0);
1074
+ }
1075
+
1076
+ &[data-layer="labels"] {
1077
+ z-index: 0;
1078
+ filter: none;
1079
+ background: transparent !important;
1080
+ pointer-events: none !important;
1081
+ overflow: visible;
1082
+ transition: transform 240ms cubic-bezier(0.22, 0.8, 0.3, 1);
1083
+ /* INVARIANT: `--cell-column` is 1-based. If lure wiped it, `--cs-grid-*`
1084
+ * still maps `--cell-x` (including 0) so captions do not auto-flow. */
1085
+ grid-column: var(
1086
+ --cell-column,
1087
+ clamp(1, calc(1 + round(nearest, var(--cs-grid-c, 0), 1)), 16)
1088
+ ) / span 1 !important;
1089
+ grid-row: var(
1090
+ --cell-row,
1091
+ clamp(1, calc(1 + round(nearest, var(--cs-grid-r, 0), 1)), 16)
1092
+ ) / span 1 !important;
1093
+ place-self: center;
1094
+
1095
+ /*
1096
+ * WHY: Icons use place-self:center in tall grid cells. Captions sit just under the
1097
+ * tile via `translate` (separate from drag `transform`). Host width uses
1098
+ * `--sd-label-max` so long titles can center + ellipsize instead of clipping.
1099
+ */
1100
+ --sd-label-gap: 0.8rem;
1101
+ --sd-label-max: min(calc(var(--tile-size, 3.5rem) * 2.85), min(94vw, 10.5rem));
1102
+ /* WHY: Capacitor WebView has no CSS `translate` — `transform: none` parked captions under tiles. */
1103
+ --sd-label-shift: calc((var(--tile-size, 4rem) * 0.5) + var(--sd-label-gap));
1104
+ aspect-ratio: auto;
1105
+ display: grid;
1106
+ justify-items: center;
1107
+ align-items: start;
1108
+ inline-size: var(--sd-label-max);
1109
+ min-inline-size: var(--sd-label-max);
1110
+ max-inline-size: var(--sd-label-max);
1111
+ /* WHY: auto-height + place-self:center grew long titles into the plate. */
1112
+ block-size: 0;
1113
+ min-block-size: 0;
1114
+ max-block-size: none;
1115
+ place-self: center;
1116
+ overflow: visible;
1117
+ transform: translate3d(0, var(--sd-label-shift), 0);
1118
+
1119
+ &.ui-ws-item-label {
1120
+ background: transparent !important;
1121
+ pointer-events: none !important;
1122
+ /* INVARIANT: undo icon-layer `position:absolute; inset-block-start:100%` or letters sit in gutters. */
1123
+ position: relative !important;
1124
+ inset: unset !important;
1125
+ inline-size: var(--sd-label-max);
1126
+ min-inline-size: var(--sd-label-max);
1127
+ max-inline-size: var(--sd-label-max);
1128
+ margin-inline: 0;
1129
+ padding-block-start: 0;
1130
+ display: grid;
1131
+ justify-items: center;
1132
+ text-align: center;
1133
+ overflow: visible;
1134
+ color: var(--wallpaper-contrast-color, var(--env-launcher-fg, #f7f7f8));
1135
+ }
1136
+
1137
+ &.ui-ws-item-label span {
1138
+ pointer-events: none !important;
1139
+ display: block;
1140
+ inline-size: auto;
1141
+ max-inline-size: 100%;
1142
+ margin-inline: auto;
1143
+ text-align: center;
1144
+ white-space: nowrap !important;
1145
+ overflow: hidden;
1146
+ text-overflow: ellipsis;
1147
+ font-family: inherit;
1148
+ font-size: clamp(0.68rem, calc(0.09 * var(--tile-size, 3.75rem)), 0.82rem);
1149
+ font-weight: 650;
1150
+ letter-spacing: 0.02em;
1151
+ color: var(--wallpaper-contrast-color, var(--env-launcher-fg, #f7f7f8));
1152
+ padding-block: 0.04rem 0.08rem;
1153
+ padding-inline: 0.22rem;
1154
+ border-radius: var(--radius-full);
1155
+ line-height: 1.15;
1156
+ text-shadow:
1157
+ 0 1px 2px var(--sd-cast-ink, rgb(0 0 0 / 0.88)),
1158
+ 0 0 12px var(--sd-cast-glow, rgb(0 0 0 / 0.45));
1159
+ background: transparent;
1160
+ backdrop-filter: none;
1161
+ -webkit-backdrop-filter: none;
1162
+ box-shadow: none;
1163
+ }
1164
+
1165
+ &[data-label-placement="above"] {
1166
+ --sd-label-shift: calc((var(--tile-size, 4rem) * -0.5) - var(--sd-label-gap));
1167
+ align-items: end;
1168
+
1169
+ &.ui-ws-item-label span {
1170
+ transform: translateY(-100%);
1171
+ }
1172
+ }
1173
+ }
1174
+
1175
+ &[data-layer="labels"][data-interaction-state="onLabelDocked"] {
1176
+ transform: translate3d(0, var(--sd-label-shift), 0) !important;
1177
+ transition: none !important;
1178
+ cursor: default;
1179
+ }
1180
+
1181
+ &[data-layer="labels"][data-interaction-state="onGrab"],
1182
+ &[data-layer="labels"][data-interaction-state="onMoving"] {
1183
+ transition: none !important;
1184
+ }
1185
+
1186
+ &[data-layer="icons"] {
1187
+ z-index: 99;
1188
+ filter: none;
1189
+ touch-action: none;
1190
+ }
1191
+
1192
+ &[data-layer="icons"][data-interaction-state="onGrab"],
1193
+ &[data-layer="icons"][data-interaction-state="onMoving"],
1194
+ &[data-layer="icons"][data-interaction-state="onRelax"],
1195
+ &[data-layer="icons"][data-interaction-state="onPlace"] {
1196
+ z-index: 120;
1197
+ }
1198
+ }
1199
+
1200
+ /* Grid-level under siblings of `.ui-ws-item` (DOM children ≈ 2× icons). */
1201
+ & > .ui-ws-item-icon-under.underlying-shadow-container,
1202
+ & > .ui-ws-item-icon-under {
1203
+ background-color: transparent !important;
1204
+ pointer-events: none !important;
1205
+ overflow: visible !important;
1206
+ z-index: 0 !important;
1207
+ /* INVARIANT: same cell as the plate — WebView has no CSS-anchor fill. */
1208
+ position: relative !important;
1209
+ inset: auto !important;
1210
+ grid-column: var(--cell-column) / span 1 !important;
1211
+ grid-row: var(--cell-row) / span 1 !important;
1212
+ place-self: center;
1213
+ inline-size: min(100%, var(--tile-size, 4rem));
1214
+ block-size: min(100%, var(--tile-size, 4rem));
1215
+ filter: blur(12px) !important;
1216
+ padding: 0px !important;
1217
+ contain: none !important;
1218
+ visibility: visible !important;
1219
+ content-visibility: visible !important;
1220
+ opacity: 1 !important;
1221
+ --drag-x: 0px;
1222
+ --drag-y: 0px;
1223
+ transform: translate3d(var(--drag-x, 0px), var(--drag-y, 0px), 0);
1224
+ transform-origin: 50% 50%;
1225
+ transition: transform 240ms cubic-bezier(0.22, 0.8, 0.3, 1);
1226
+
1227
+ &[data-dragging],
1228
+ &[data-interaction-state="onGrab"],
1229
+ &[data-interaction-state="onMoving"],
1230
+ &[data-interaction-state="onRelax"],
1231
+ &[data-interaction-state="onPlace"] {
1232
+ z-index: 119 !important;
1233
+ transition: none !important;
1234
+ }
1235
+
1236
+ &[data-interaction-state="onPlace"],
1237
+ &[data-interaction-state="onRelax"] {
1238
+ z-index: 0 !important;
1239
+ }
1240
+ }
1241
+
1242
+ & > .ui-ws-item-icon-under .underlying-shadow-geometry {
1243
+ inline-size: 100%;
1244
+ block-size: 100%;
1245
+ background: #000000af !important;
1246
+ transition: filter 200ms ease, box-shadow 200ms ease;
1247
+ padding: 0px !important;
1248
+ visibility: visible !important;
1249
+
1250
+ /* WHY: match plate clip without copying getComputedStyle (WebView crash on pin). */
1251
+ &[data-shape="circle"] {
1252
+ border-radius: 50% !important;
1253
+ }
1254
+
1255
+ &[data-shape="square"] {
1256
+ border-radius: max(0.55rem, 14%) !important;
1257
+ }
1258
+
1259
+ &[data-shape="squircle"] {
1260
+ border-radius: 1.5rem !important;
1261
+ }
1262
+
1263
+ &[data-shape="wavy"] {
1264
+ @include wavy-shaped(100);
1265
+ clip-path: var(--clip-path);
1266
+ }
1267
+ }
1268
+
1269
+ & > .ui-ws-item-icon-under:has(+ .ui-ws-item:hover) .underlying-shadow-geometry {
1270
+ /*filter: blur(8px) !important;*/
1271
+ padding: 0px !important;
1272
+ visibility: visible !important;
1273
+ }
1274
+
1275
+ /* WHY: shapeless / widgets have no plate under-glow. */
1276
+ & > .ui-ws-item-icon-under[data-shape="shapeless"],
1277
+ & > .ui-ws-item-icon-under[data-shape="none"],
1278
+ & > .ui-ws-item-icon-under:has(+ .ui-ws-item[data-shape="shapeless"]),
1279
+ & > .ui-ws-item-icon-under:has(+ .ui-ws-item[data-shape="none"]) {
1280
+ display: none !important;
1281
+ }
1282
+ }
1283
+
1284
+ // Labels are a projection layer: they follow committed grid cells, but
1285
+ // never participate in pointer capture, hover scaling, or icon FLIP.
1286
+ .speed-dial-label-layer {
1287
+ pointer-events: none !important;
1288
+
1289
+ .ui-ws-item {
1290
+ pointer-events: none;
1291
+ touch-action: auto;
1292
+ scale: 1;
1293
+ /* WHY: do not zero `transform` — label dock is `translate3d(0, --sd-label-shift, 0)`. */
1294
+ z-index: 0;
1295
+ grid-column: var(
1296
+ --cell-column,
1297
+ clamp(1, calc(1 + round(nearest, var(--cs-grid-c, 0), 1)), 16)
1298
+ ) / span 1 !important;
1299
+ grid-row: var(
1300
+ --cell-row,
1301
+ clamp(1, calc(1 + round(nearest, var(--cs-grid-r, 0), 1)), 16)
1302
+ ) / span 1 !important;
1303
+ position: relative;
1304
+ transition: none !important;
1305
+ transition-duration: 0ms !important;
1306
+ animation: none !important;
1307
+ animation-duration: 0ms !important;
1308
+ }
1309
+
1310
+ .ui-ws-item:hover,
1311
+ .ui-ws-item:active {
1312
+ scale: 1;
1313
+ }
1314
+ }
1315
+
1316
+ // Home orient layer: tighter padding and tiles on narrow / short containers.
1317
+ .speed-dial-root.app-oriented-desktop {
1318
+ .speed-dial-grid.app-oriented-desktop__grid--labels,
1319
+ .speed-dial-grid.app-oriented-desktop__grid--icons {
1320
+ @container (max-width: 28rem) {
1321
+ padding-inline: clamp(0.35rem, 3.2cqw, var(--padding-lg));
1322
+ padding-block: clamp(0.35rem, 2.8cqh, var(--padding-lg));
1323
+ }
1324
+
1325
+ @container (max-height: 29rem) {
1326
+ padding-block: clamp(0.3rem, 2.2cqh, var(--padding-md));
1327
+ }
1328
+ }
1329
+
1330
+ .ui-ws-item {
1331
+ @container (max-width: 28rem) {
1332
+ --tile-size: clamp(4rem, 12dvmin, 6rem);
1333
+
1334
+ .ui-ws-item-icon {
1335
+ padding: 0.65rem;
1336
+ }
1337
+ }
1338
+ }
1339
+ }
1340
+
1341
+ /*
1342
+ * WHY: ShortcutEditor mounts a <dialog class="speed-dial-editor"> via showModal().
1343
+ * Host is a full-viewport grid; scrim lives on ::backdrop (top layer).
1344
+ */
1345
+ .speed-dial-editor {
1346
+ --sd-editor-seed: var(--base-color, var(--color-primary, #5a7fff));
1347
+ position: fixed;
1348
+ inset: 0;
1349
+ inline-size: 100%;
1350
+ block-size: 100%;
1351
+ max-inline-size: 100%;
1352
+ max-block-size: 100%;
1353
+ margin: 0;
1354
+ border: none;
1355
+ padding: 1rem;
1356
+ display: grid;
1357
+ place-items: center;
1358
+ background: transparent;
1359
+ color: --u2-color-mod(var(--sd-editor-seed), 100);
1360
+ pointer-events: auto;
1361
+ contain: none;
1362
+ content-visibility: visible;
1363
+ overflow: auto;
1364
+ }
1365
+
1366
+ .speed-dial-editor::backdrop {
1367
+ /* WHY: adaptive scrim from wallpaper seed (same contract as context menu). */
1368
+ background: color-mix(
1369
+ in oklab,
1370
+ --u2-color-mod(var(--base-color, var(--color-primary, #5a7fff)), 920) 58%,
1371
+ transparent
1372
+ );
1373
+ backdrop-filter: blur(10px) saturate(1.08);
1374
+ -webkit-backdrop-filter: blur(10px) saturate(1.08);
1375
+ }
1376
+
1377
+ .speed-dial-editor__form {
1378
+ /*
1379
+ * INVARIANT: adaptive colorization via wallpaper `--base-color` + `--u2-color-mod`
1380
+ * (same as `.cw-context-menu`). Do not hardcode slate panels here.
1381
+ */
1382
+ --sd-editor-seed: var(--base-color, var(--color-primary, #5a7fff));
1383
+ --sd-editor-ink: --u2-color-mod(var(--sd-editor-seed), 100);
1384
+ --sd-editor-muted: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 100) 70%, transparent);
1385
+ --sd-editor-field-bg: --u2-color-mod(var(--sd-editor-seed), 900);
1386
+ --sd-editor-field-ink: --u2-color-mod(var(--sd-editor-seed), 100);
1387
+ --sd-editor-panel: --u2-color-mod(var(--sd-editor-seed), 860);
1388
+ --sd-editor-border: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 100) 16%, transparent);
1389
+ --sd-editor-accent: --u2-color-mod(var(--sd-editor-seed), 520);
1390
+ --sd-editor-danger-bg: #7f1d1d;
1391
+ --sd-editor-danger-ink: #fff7f7;
1392
+ color-scheme: dark;
1393
+ inline-size: min(100%, 560px);
1394
+ margin-inline: auto;
1395
+ border-radius: 18px;
1396
+ border: 1px solid var(--sd-editor-border);
1397
+ /* WHY: mix surface token + seed panel so wallpaper tint shows through (not opaque slate). */
1398
+ background: color-mix(
1399
+ in oklab,
1400
+ var(--color-surface-container, var(--sd-editor-panel)) 88%,
1401
+ transparent
1402
+ );
1403
+ color: var(--sd-editor-ink);
1404
+ display: grid;
1405
+ grid-template-rows: auto minmax(0, 1fr) auto;
1406
+ /* WHY: never let global .modal-form min-block-size (~90dvb) clip Label above the fold. */
1407
+ min-block-size: 0;
1408
+ max-block-size: min(86vh, 760px);
1409
+ overflow: hidden;
1410
+ pointer-events: auto;
1411
+ contain: none !important;
1412
+ content-visibility: visible !important;
1413
+ backdrop-filter: blur(14px) saturate(1.12);
1414
+ -webkit-backdrop-filter: blur(14px) saturate(1.12);
1415
+ box-shadow:
1416
+ 0 24px 64px -28px color-mix(in oklab, #000 60%, transparent),
1417
+ 0 0 0 1px color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 100) 10%, transparent);
1418
+ }
1419
+
1420
+ html[data-theme="light"] .speed-dial-editor__form,
1421
+ .speed-dial-editor[data-theme="light"] .speed-dial-editor__form,
1422
+ .speed-dial-editor__form[data-theme="light"] {
1423
+ color-scheme: light only;
1424
+ --sd-editor-ink: --u2-color-mod(var(--sd-editor-seed), 900);
1425
+ --sd-editor-muted: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 900) 70%, transparent);
1426
+ --sd-editor-field-bg: --u2-color-mod(var(--sd-editor-seed), 140);
1427
+ --sd-editor-field-ink: --u2-color-mod(var(--sd-editor-seed), 900);
1428
+ --sd-editor-panel: --u2-color-mod(var(--sd-editor-seed), 120);
1429
+ --sd-editor-border: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 900) 14%, transparent);
1430
+ --sd-editor-accent: --u2-color-mod(var(--sd-editor-seed), 480);
1431
+ --sd-editor-danger-bg: #9f1239;
1432
+ --sd-editor-danger-ink: #fff7f7;
1433
+ background: color-mix(
1434
+ in oklab,
1435
+ var(--color-surface-container, var(--sd-editor-panel)) 92%,
1436
+ transparent
1437
+ );
1438
+ color: var(--sd-editor-ink);
1439
+ box-shadow:
1440
+ 0 18px 48px -24px color-mix(in oklab, #0f172a 26%, transparent),
1441
+ 0 0 0 1px var(--sd-editor-border);
1442
+ }
1443
+
1444
+ html[data-theme="dark"] .speed-dial-editor__form,
1445
+ .speed-dial-editor[data-theme="dark"] .speed-dial-editor__form,
1446
+ .speed-dial-editor__form[data-theme="dark"] {
1447
+ color-scheme: dark only;
1448
+ --sd-editor-ink: --u2-color-mod(var(--sd-editor-seed), 100);
1449
+ --sd-editor-muted: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 100) 70%, transparent);
1450
+ --sd-editor-field-bg: --u2-color-mod(var(--sd-editor-seed), 900);
1451
+ --sd-editor-field-ink: --u2-color-mod(var(--sd-editor-seed), 100);
1452
+ --sd-editor-panel: --u2-color-mod(var(--sd-editor-seed), 860);
1453
+ --sd-editor-border: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 100) 16%, transparent);
1454
+ --sd-editor-accent: --u2-color-mod(var(--sd-editor-seed), 520);
1455
+ background: color-mix(
1456
+ in oklab,
1457
+ var(--color-surface-container, var(--sd-editor-panel)) 88%,
1458
+ transparent
1459
+ );
1460
+ color: var(--sd-editor-ink);
1461
+ }
1462
+
1463
+ .speed-dial-editor__form .modal-header {
1464
+ display: grid;
1465
+ gap: 0.4rem;
1466
+ padding: 1rem 1rem 0.75rem;
1467
+ border-block-end: none;
1468
+ box-shadow: 0 1px 0 var(--sd-editor-border);
1469
+ }
1470
+
1471
+ .speed-dial-editor__form .modal-title {
1472
+ margin: 0;
1473
+ font-size: 1.2rem;
1474
+ font-weight: 650;
1475
+ line-height: 1.25;
1476
+ color: var(--sd-editor-ink);
1477
+ }
1478
+
1479
+ .speed-dial-editor__form .modal-description {
1480
+ margin: 0;
1481
+ font-size: 0.86rem;
1482
+ line-height: 1.35;
1483
+ color: var(--sd-editor-muted);
1484
+ }
1485
+
1486
+ .speed-dial-editor__form .modal-fields {
1487
+ display: grid;
1488
+ gap: 0.75rem;
1489
+ padding: 0.9rem 1rem 1rem;
1490
+ overflow: auto;
1491
+ min-block-size: 0;
1492
+ align-content: start;
1493
+ }
1494
+
1495
+ .speed-dial-editor__form .modal-field {
1496
+ display: grid;
1497
+ gap: 0.35rem;
1498
+ pointer-events: auto;
1499
+ }
1500
+
1501
+ .speed-dial-editor__form [data-field="span"] .sd-icon-resource-row {
1502
+ display: grid;
1503
+ grid-template-columns: 1fr 1fr;
1504
+ gap: 0.45rem;
1505
+ }
1506
+
1507
+ .speed-dial-editor__form input[name="spanCols"],
1508
+ .speed-dial-editor__form input[name="spanRows"] {
1509
+ min-inline-size: 0;
1510
+ inline-size: 100%;
1511
+ pointer-events: auto;
1512
+ }
1513
+
1514
+ .speed-dial-editor__form .modal-field > :is(span, label) {
1515
+ font-size: 0.84rem;
1516
+ color: var(--sd-editor-muted);
1517
+ /* WHY: normalize sets :where(label){pointer-events:none}; captions must not block. */
1518
+ pointer-events: none;
1519
+ user-select: none;
1520
+ margin: 0;
1521
+ font-weight: 600;
1522
+ }
1523
+
1524
+ .speed-dial-editor__form :is(input, select, textarea, button, .btn) {
1525
+ pointer-events: auto !important;
1526
+ position: relative;
1527
+ z-index: 1;
1528
+ }
1529
+
1530
+ .speed-dial-editor__form :is(input, select, textarea) {
1531
+ inline-size: 100%;
1532
+ min-inline-size: 0;
1533
+ border-radius: var(--radius-md);
1534
+ border: 1px solid var(--sd-editor-border);
1535
+ background: var(--sd-editor-field-bg);
1536
+ color: var(--sd-editor-field-ink);
1537
+ caret-color: var(--sd-editor-field-ink);
1538
+ padding: 0.55rem 0.7rem;
1539
+ outline: none;
1540
+ appearance: none;
1541
+ /* WHY: form hosts sometimes paint controls but skip hit-testing under content-visibility. */
1542
+ contain: none !important;
1543
+ content-visibility: visible !important;
1544
+ }
1545
+
1546
+ .speed-dial-editor__form :is(input, select, textarea)::placeholder {
1547
+ color: color-mix(in oklab, var(--sd-editor-field-ink) 45%, transparent);
1548
+ }
1549
+
1550
+ .speed-dial-editor__form textarea {
1551
+ resize: vertical;
1552
+ min-block-size: 4.4rem;
1553
+ }
1554
+
1555
+ .speed-dial-editor__form :is(input, select, textarea):focus {
1556
+ border-color: color-mix(in oklab, var(--sd-editor-accent) 64%, --u2-color-mod(var(--sd-editor-seed), 100) 12%);
1557
+ box-shadow: 0 0 0 2px color-mix(in oklab, var(--sd-editor-accent) 28%, transparent);
1558
+ }
1559
+
1560
+ .speed-dial-editor__form .sd-icon-resource-row {
1561
+ display: grid;
1562
+ grid-template-columns: minmax(0, 1fr) auto auto;
1563
+ align-items: center;
1564
+ gap: 0.45rem;
1565
+ min-inline-size: 0;
1566
+ }
1567
+
1568
+ .speed-dial-editor__form .sd-icon-resource-row > input {
1569
+ inline-size: 100%;
1570
+ min-inline-size: 0;
1571
+ }
1572
+
1573
+ .speed-dial-editor__form .sd-icon-resource-pick {
1574
+ display: inline-flex;
1575
+ align-items: center;
1576
+ justify-content: center;
1577
+ inline-size: 2.4rem;
1578
+ block-size: 2.4rem;
1579
+ min-inline-size: 2.4rem;
1580
+ padding: 0;
1581
+ flex: 0 0 auto;
1582
+ }
1583
+
1584
+ .speed-dial-editor__form .sd-icon-resource-pick ui-icon {
1585
+ --icon-size: 1.25rem;
1586
+ --icon-padding: 0;
1587
+ inline-size: var(--icon-size);
1588
+ block-size: var(--icon-size);
1589
+ min-inline-size: var(--icon-size);
1590
+ min-block-size: var(--icon-size);
1591
+ pointer-events: none;
1592
+ }
1593
+
1594
+ .speed-dial-editor__form .modal-actions {
1595
+ display: grid;
1596
+ grid-template-columns: 1fr auto auto;
1597
+ align-items: center;
1598
+ justify-items: stretch;
1599
+ gap: 0.45rem;
1600
+ padding: 0.65rem 0.85rem;
1601
+ border-block-start: 1px solid var(--sd-editor-border);
1602
+ color: var(--sd-editor-ink);
1603
+ background: transparent;
1604
+ border: none 0px transparent;
1605
+ outline: none 0px transparent;
1606
+ min-inline-size: 0;
1607
+ }
1608
+
1609
+ .speed-dial-editor__form .modal-actions .modal-actions-spacer {
1610
+ display: block;
1611
+ min-inline-size: 0;
1612
+ }
1613
+
1614
+ .speed-dial-editor__form .modal-actions .btn {
1615
+ justify-self: start;
1616
+ white-space: nowrap;
1617
+ min-inline-size: 0;
1618
+ padding: 0.4rem 0.7rem;
1619
+ }
1620
+
1621
+ .speed-dial-editor__form .modal-actions .btn.secondary,
1622
+ .speed-dial-editor__form .modal-actions .btn.save {
1623
+ justify-self: end;
1624
+ }
1625
+
1626
+ .speed-dial-editor__form .btn {
1627
+ border-radius: var(--radius-md);
1628
+ border: 1px solid var(--sd-editor-border);
1629
+ padding: 0.46rem 0.86rem;
1630
+ font-size: 0.86rem;
1631
+ line-height: 1.2;
1632
+ cursor: pointer;
1633
+ color: var(--sd-editor-ink);
1634
+ background: color-mix(in oklab, var(--sd-editor-field-bg) 82%, transparent);
1635
+ }
1636
+
1637
+ .speed-dial-editor__form .btn.secondary {
1638
+ background: color-mix(in oklab, var(--sd-editor-field-bg) 68%, transparent);
1639
+ color: var(--sd-editor-ink);
1640
+ }
1641
+
1642
+ .speed-dial-editor__form .btn.save {
1643
+ border-color: color-mix(in oklab, var(--sd-editor-accent) 55%, transparent);
1644
+ background: color-mix(in oklab, var(--sd-editor-accent) 78%, --u2-color-mod(var(--sd-editor-seed), 920) 22%);
1645
+ color: --u2-color-mod(var(--sd-editor-seed), 100);
1646
+ }
1647
+
1648
+ html[data-theme="light"] .speed-dial-editor__form .btn.save,
1649
+ .speed-dial-editor[data-theme="light"] .speed-dial-editor__form .btn.save,
1650
+ .speed-dial-editor__form[data-theme="light"] .btn.save {
1651
+ background: color-mix(in oklab, var(--sd-editor-accent) 82%, --u2-color-mod(var(--sd-editor-seed), 120) 18%);
1652
+ color: --u2-color-mod(var(--sd-editor-seed), 980);
1653
+ }
1654
+
1655
+ .speed-dial-editor__form .btn.danger {
1656
+ border-color: color-mix(in oklab, var(--sd-editor-danger-bg) 70%, transparent);
1657
+ background: var(--sd-editor-danger-bg);
1658
+ color: var(--sd-editor-danger-ink);
1659
+ }
1660
+
1661
+ .speed-dial-editor__form .btn:hover {
1662
+ filter: brightness(1.08);
1663
+ }
1664
+
1665
+ .speed-dial-editor__form [hidden] {
1666
+ display: none !important;
1667
+ }
1668
+
1669
+ @media (max-width: 820px) {
1670
+ .speed-dial-editor {
1671
+ place-items: center;
1672
+ }
1673
+ .speed-dial-editor__form {
1674
+ inline-size: 100%;
1675
+ max-block-size: 94vh;
1676
+ }
1677
+ }
1678
+ }
1679
+
1680
+ @layer components {
1681
+ :root:has([data-view="home"]),
1682
+ html:has([data-view="home"]) {
1683
+ /* colors */
1684
+ --view-home-bg: linear-gradient(135deg, light-dark(#f8f9fa, #1b1f24) 0%, light-dark(#e9ecef, #0f1216) 100%);
1685
+ --view-fg: light-dark(#1a1a1a, #e9ecef);
1686
+ --view-border: light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.12));
1687
+ --view-card-bg: light-dark(#ffffff, #1a1f26);
1688
+ --view-primary: light-dark(#007acc, #66b7ff);
1689
+
1690
+ /* layout */
1691
+ --view-layout: "flex";
1692
+ --view-padding: var(--space-8);
1693
+ --view-content-max-width: 1200px;
1694
+ --view-hero-padding: var(--space-16);
1695
+ --view-card-gap: var(--space-6);
1696
+ }
1697
+
1698
+ .view-home {
1699
+ display: flex;
1700
+ align-items: center;
1701
+ justify-content: center;
1702
+ block-size: 100%;
1703
+ padding: 2rem;
1704
+ background: var(--view-home-bg);
1705
+ color: var(--view-fg);
1706
+ overflow-y: auto;
1707
+
1708
+ &__content {
1709
+ text-align: center;
1710
+ max-inline-size: 800px;
1711
+ }
1712
+
1713
+ &__header {
1714
+ margin-block-end: 3rem;
1715
+ }
1716
+
1717
+ &__title {
1718
+ margin: 0;
1719
+ font-size: 3rem;
1720
+ font-weight: 800;
1721
+ background: linear-gradient(135deg, var(--view-primary) 0%, light-dark(#0059a6, #3a8ad6) 100%);
1722
+ -webkit-background-clip: text;
1723
+ -webkit-text-fill-color: transparent;
1724
+ background-clip: text;
1725
+ }
1726
+
1727
+ &__subtitle {
1728
+ margin: 0.5rem 0 0;
1729
+ font-size: 1.125rem;
1730
+ color: var(--view-fg);
1731
+ opacity: 0.7;
1732
+ }
1733
+
1734
+ &__actions {
1735
+ display: grid;
1736
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1737
+ gap: 1rem;
1738
+ }
1739
+
1740
+ &__action {
1741
+ display: flex;
1742
+ flex-direction: column;
1743
+ align-items: center;
1744
+ gap: 0.75rem;
1745
+ padding: 1.5rem;
1746
+ border: 1px solid var(--view-border);
1747
+ border-radius: var(--radius-xl);
1748
+ background-color: var(--view-card-bg);
1749
+ color: var(--view-fg);
1750
+ text-align: center;
1751
+ cursor: pointer;
1752
+ transition: transform var(--transition-normal), box-shadow var(--transition-normal), border-color var(--transition-normal);
1753
+
1754
+ ui-icon {
1755
+ opacity: 0.8;
1756
+ color: var(--view-primary);
1757
+ }
1758
+
1759
+ &:hover {
1760
+ transform: translateY(-4px);
1761
+ box-shadow: 0 8px 24px light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4));
1762
+ border-color: var(--view-primary);
1763
+
1764
+ ui-icon {
1765
+ opacity: 1;
1766
+ }
1767
+ }
1768
+
1769
+ &:focus-visible {
1770
+ outline: 2px solid var(--view-primary);
1771
+ outline-offset: 2px;
1772
+ }
1773
+ }
1774
+
1775
+ &__action-title {
1776
+ font-size: 1rem;
1777
+ font-weight: 600;
1778
+ }
1779
+
1780
+ &__action-desc {
1781
+ font-size: 0.8125rem;
1782
+ opacity: 0.6;
1783
+ }
1784
+ }
1785
+
1786
+ /*
1787
+ * WHY: desktop launcher must not paint marketing `.view-home` fill over wallpaper.
1788
+ * Full host contract also comes from fl-design/ui/home-host-apply (OrientDesktop).
1789
+ */
1790
+ .view-home.env-home-workspace,
1791
+ .view-home.view-home--grid {
1792
+ background: transparent !important;
1793
+ padding: 0;
1794
+ overflow: hidden;
1795
+ display: grid;
1796
+ align-items: stretch;
1797
+ justify-items: stretch;
1798
+ /* WHY: host mixin sets pointer-events:none; desktop must receive paste/drop/contextmenu. */
1799
+ pointer-events: auto !important;
1800
+ }
1801
+
1802
+ .view-home.env-home-workspace > .speed-dial-root,
1803
+ .speed-dial-root.app-oriented-desktop {
1804
+ pointer-events: auto !important;
1805
+ }
1806
+
1807
+ /* Base/minimal shell home should behave as desktop grid host. */
1808
+ .view-home--grid {
1809
+ position: relative;
1810
+ display: grid;
1811
+ grid-template-columns: minmax(0, 1fr);
1812
+ grid-template-rows: minmax(0, 1fr);
1813
+ align-items: stretch;
1814
+ justify-items: stretch;
1815
+ block-size: 100%;
1816
+ inline-size: 100%;
1817
+ padding: 0;
1818
+ overflow: hidden;
1819
+ background: transparent;
1820
+
1821
+ .speed-dial-root {
1822
+ position: fixed;
1823
+ inset: 0 auto auto 0;
1824
+ inline-size: var(--lv-width, 100lvi);
1825
+ block-size: var(--lv-height, 100lvb);
1826
+ max-inline-size: var(--lv-width, 100lvi);
1827
+ max-block-size: var(--lv-height, 100lvb);
1828
+ overflow: hidden;
1829
+ }
1830
+ }
1831
+
1832
+ @container speed-dial (inline-size < 48rem) {
1833
+ .view-home {
1834
+ --view-hero-padding: var(--space-8);
1835
+ --view-card-gap: var(--space-4);
1836
+ }
1837
+ }
1838
+
1839
+ @container speed-dial (inline-size < 30rem) {
1840
+ .view-home__actions {
1841
+ grid-template-columns: 1fr;
1842
+ }
1843
+ }
1844
+ }
1845
+
1846
+ /*
1847
+ * WHY: These targeted editor fixes must beat component defaults without relying
1848
+ * on unlayered CSS.
1849
+ */
1850
+ @layer overrides {
1851
+ .speed-dial-editor,
1852
+ .speed-dial-editor__form,
1853
+ .speed-dial-editor__form .modal-field,
1854
+ .speed-dial-editor__form :is(input, select, textarea, button) {
1855
+ pointer-events: auto !important;
1856
+ }
1857
+
1858
+ .speed-dial-editor__form {
1859
+ contain: none !important;
1860
+ content-visibility: visible !important;
1861
+ min-block-size: 0 !important;
1862
+ }
1863
+
1864
+ .speed-dial-editor__form .modal-field > label {
1865
+ pointer-events: none !important;
1866
+ }
1867
+
1868
+ /* WHY: Cap kept stacking footer groups — flat 3-col grid beats flex wrappers. */
1869
+ .speed-dial-editor__form .modal-actions {
1870
+ display: grid !important;
1871
+ grid-template-columns: 1fr auto auto !important;
1872
+ align-items: center !important;
1873
+ gap: 0.45rem !important;
1874
+ flex-direction: row !important;
1875
+ flex-wrap: nowrap !important;
1876
+ }
1877
+
1878
+ .speed-dial-editor__form .modal-actions .btn {
1879
+ white-space: nowrap !important;
1880
+ min-inline-size: 0 !important;
1881
+ max-inline-size: none !important;
1882
+ }
1883
+
1884
+ /* WHY: Cap WebView dropped layered grid — button sat under the resource input. */
1885
+ .speed-dial-editor__form .sd-icon-resource-row {
1886
+ display: grid !important;
1887
+ grid-template-columns: minmax(0, 1fr) 2.5rem !important;
1888
+ align-items: stretch !important;
1889
+ gap: 0.45rem !important;
1890
+ min-inline-size: 0 !important;
1891
+ inline-size: 100% !important;
1892
+ }
1893
+
1894
+ .speed-dial-editor__form .sd-icon-resource-row > input {
1895
+ inline-size: 100% !important;
1896
+ min-inline-size: 0 !important;
1897
+ max-inline-size: none !important;
1898
+ }
1899
+
1900
+ .speed-dial-editor__form .sd-icon-resource-pick {
1901
+ display: inline-flex !important;
1902
+ align-items: center !important;
1903
+ justify-content: center !important;
1904
+ inline-size: 2.5rem !important;
1905
+ block-size: auto !important;
1906
+ min-inline-size: 2.5rem !important;
1907
+ max-inline-size: 2.5rem !important;
1908
+ min-block-size: 2.5rem !important;
1909
+ padding: 0 !important;
1910
+ margin: 0 !important;
1911
+ flex: 0 0 auto !important;
1912
+ }
1913
+
1914
+ .speed-dial-editor__form .sd-icon-resource-pick ui-icon {
1915
+ --icon-size: 1.25rem !important;
1916
+ --icon-padding: 0 !important;
1917
+ inline-size: 1.25rem !important;
1918
+ block-size: 1.25rem !important;
1919
+ pointer-events: none !important;
1920
+ }
1921
+
1922
+ /* WHY: dialog is a full-viewport host (Cap cannot center a shrink-wrapped <dialog>). */
1923
+ .sd-icon-picker {
1924
+ --sd-editor-seed: var(--base-color, var(--color-primary, #5a9ec8));
1925
+ --sd-editor-ink: --u2-color-mod(var(--sd-editor-seed), 100);
1926
+ --sd-editor-field-bg: --u2-color-mod(var(--sd-editor-seed), 900);
1927
+ --sd-editor-panel: --u2-color-mod(var(--sd-editor-seed), 860);
1928
+ --sd-editor-border: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 100) 16%, transparent);
1929
+ --sd-editor-accent: --u2-color-mod(var(--sd-editor-seed), 520);
1930
+ color-scheme: dark;
1931
+ position: fixed;
1932
+ inset: 0;
1933
+ inline-size: 100%;
1934
+ block-size: 100%;
1935
+ max-inline-size: 100%;
1936
+ max-block-size: 100%;
1937
+ margin: 0;
1938
+ padding: 1rem;
1939
+ display: grid;
1940
+ place-items: center;
1941
+ place-content: center;
1942
+ border: none;
1943
+ border-radius: 0;
1944
+ background: transparent;
1945
+ color: var(--sd-editor-ink);
1946
+ overflow: auto;
1947
+ box-shadow: none;
1948
+ }
1949
+
1950
+ html[data-theme="light"] .sd-icon-picker,
1951
+ .sd-icon-picker[data-theme="light"] {
1952
+ color-scheme: light only;
1953
+ --sd-editor-ink: --u2-color-mod(var(--sd-editor-seed), 900);
1954
+ --sd-editor-field-bg: --u2-color-mod(var(--sd-editor-seed), 140);
1955
+ --sd-editor-panel: --u2-color-mod(var(--sd-editor-seed), 120);
1956
+ --sd-editor-border: color-mix(in oklab, --u2-color-mod(var(--sd-editor-seed), 900) 14%, transparent);
1957
+ --sd-editor-accent: --u2-color-mod(var(--sd-editor-seed), 480);
1958
+ color: var(--sd-editor-ink);
1959
+ }
1960
+
1961
+ .sd-icon-picker::backdrop {
1962
+ background: color-mix(
1963
+ in oklab,
1964
+ --u2-color-mod(var(--base-color, var(--color-primary, #5a9ec8)), 920) 58%,
1965
+ transparent
1966
+ );
1967
+ backdrop-filter: blur(10px) saturate(1.08);
1968
+ -webkit-backdrop-filter: blur(10px) saturate(1.08);
1969
+ }
1970
+
1971
+ .sd-icon-picker__form {
1972
+ display: flex !important;
1973
+ flex-direction: column !important;
1974
+ inline-size: min(22rem, 100%) !important;
1975
+ max-inline-size: 100% !important;
1976
+ max-block-size: min(86dvh, 36rem);
1977
+ margin: 0 !important;
1978
+ padding: 0 !important;
1979
+ border: 1px solid var(--sd-editor-border);
1980
+ border-radius: 18px;
1981
+ background: color-mix(
1982
+ in oklab,
1983
+ var(--color-surface-container, var(--sd-editor-panel)) 92%,
1984
+ transparent
1985
+ );
1986
+ color: inherit;
1987
+ overflow: hidden;
1988
+ box-shadow: 0 24px 64px -28px color-mix(in oklab, #000 60%, transparent);
1989
+ backdrop-filter: blur(14px) saturate(1.12);
1990
+ -webkit-backdrop-filter: blur(14px) saturate(1.12);
1991
+ justify-self: center;
1992
+ align-self: center;
1993
+ }
1994
+
1995
+ .sd-icon-picker__header {
1996
+ display: grid;
1997
+ gap: 0.55rem;
1998
+ padding: 0.9rem 0.95rem 0.55rem;
1999
+ }
2000
+
2001
+ .sd-icon-picker__title {
2002
+ margin: 0;
2003
+ font: 650 1.15rem/1.25 ui-sans-serif, system-ui, sans-serif;
2004
+ text-align: center;
2005
+ }
2006
+
2007
+ .sd-icon-picker__tabs {
2008
+ display: grid !important;
2009
+ grid-auto-flow: column !important;
2010
+ grid-auto-columns: 1fr !important;
2011
+ gap: 0.28rem !important;
2012
+ inline-size: 100%;
2013
+ padding: 0.22rem;
2014
+ border-radius: 999px;
2015
+ background: color-mix(in oklab, var(--sd-editor-field-bg) 42%, transparent);
2016
+ }
2017
+
2018
+ .sd-icon-picker__tabs[hidden] {
2019
+ display: none !important;
2020
+ }
2021
+
2022
+ .sd-icon-picker__tab {
2023
+ appearance: none !important;
2024
+ flex: 1 1 0 !important;
2025
+ display: inline-flex !important;
2026
+ align-items: center !important;
2027
+ justify-content: center !important;
2028
+ margin: 0 !important;
2029
+ padding: 0.38rem 0.4rem !important;
2030
+ inline-size: 100% !important;
2031
+ min-inline-size: 0 !important;
2032
+ block-size: auto !important;
2033
+ border: 0 !important;
2034
+ border-radius: 999px !important;
2035
+ background: transparent !important;
2036
+ color: inherit !important;
2037
+ font: 600 0.74rem/1.2 ui-sans-serif, system-ui, sans-serif !important;
2038
+ cursor: pointer;
2039
+ }
2040
+
2041
+ .sd-icon-picker__tab[data-active] {
2042
+ background: color-mix(in oklab, var(--sd-editor-accent, currentColor) 28%, transparent) !important;
2043
+ }
2044
+
2045
+ .sd-icon-picker__search {
2046
+ inline-size: 100% !important;
2047
+ min-inline-size: 0 !important;
2048
+ box-sizing: border-box !important;
2049
+ padding: 0.4rem 0.65rem !important;
2050
+ border-radius: 0.65rem !important;
2051
+ font-size: 0.82rem !important;
2052
+ }
2053
+
2054
+ .sd-icon-picker__search[hidden] {
2055
+ display: none !important;
2056
+ }
2057
+
2058
+ .sd-icon-picker__body {
2059
+ padding: 0.45rem 0.75rem 0.35rem;
2060
+ overflow: auto;
2061
+ min-block-size: 0;
2062
+ max-block-size: min(28rem, 58dvh);
2063
+ background: transparent !important;
2064
+ }
2065
+
2066
+ .sd-icon-picker__section {
2067
+ min-inline-size: 0;
2068
+ }
2069
+
2070
+ .sd-icon-picker__section[hidden] {
2071
+ display: none !important;
2072
+ }
2073
+
2074
+ .sd-icon-picker__grid {
2075
+ display: grid !important;
2076
+ grid-template-columns: repeat(auto-fill, minmax(4.75rem, 1fr)) !important;
2077
+ gap: 0.5rem 0.4rem !important;
2078
+ align-content: start;
2079
+ min-inline-size: 0 !important;
2080
+ }
2081
+
2082
+ .sd-icon-picker__grid--browse {
2083
+ display: grid !important;
2084
+ grid-template-columns: minmax(0, 1fr) !important;
2085
+ grid-template-rows: auto minmax(0, 1fr) !important;
2086
+ gap: 0.35rem !important;
2087
+ }
2088
+
2089
+ .sd-icon-picker__pack-toolbar {
2090
+ display: grid;
2091
+ grid-template-columns: auto minmax(0, 1fr);
2092
+ gap: 0.3rem 0.4rem;
2093
+ align-items: center;
2094
+ }
2095
+
2096
+ .sd-icon-picker__pack-toolbar .sd-icon-picker__search {
2097
+ grid-column: 1 / -1;
2098
+ }
2099
+
2100
+ .sd-icon-picker__pack-back {
2101
+ appearance: none !important;
2102
+ margin: 0;
2103
+ padding: 0.2rem 0.5rem;
2104
+ border: 0 !important;
2105
+ border-radius: 999px !important;
2106
+ background: color-mix(in oklab, var(--sd-editor-field-bg, currentColor) 55%, transparent) !important;
2107
+ color: inherit;
2108
+ font: 600 0.72rem/1.2 ui-sans-serif, system-ui, sans-serif;
2109
+ cursor: pointer;
2110
+ }
2111
+
2112
+ .sd-icon-picker__pack-title {
2113
+ min-inline-size: 0;
2114
+ overflow: hidden;
2115
+ text-overflow: ellipsis;
2116
+ white-space: nowrap;
2117
+ font-size: 0.74rem;
2118
+ opacity: 0.78;
2119
+ }
2120
+
2121
+ .sd-icon-picker__pack-wrap {
2122
+ position: relative;
2123
+ min-inline-size: 0;
2124
+ }
2125
+
2126
+ .sd-icon-picker__pack-browse {
2127
+ appearance: none !important;
2128
+ position: absolute;
2129
+ inset-block-start: 0;
2130
+ inset-inline-end: 0;
2131
+ z-index: 1;
2132
+ display: grid !important;
2133
+ place-items: center;
2134
+ margin: 0 !important;
2135
+ padding: 0 !important;
2136
+ inline-size: 1.2rem !important;
2137
+ block-size: 1.2rem !important;
2138
+ min-inline-size: 1.2rem !important;
2139
+ min-block-size: 1.2rem !important;
2140
+ border: 0 !important;
2141
+ border-radius: 999px !important;
2142
+ background: color-mix(in oklab, var(--sd-editor-panel, Canvas) 82%, transparent) !important;
2143
+ color: inherit;
2144
+ cursor: pointer;
2145
+ }
2146
+
2147
+ .sd-icon-picker__pack-browse ui-icon {
2148
+ --icon-size: 0.72rem !important;
2149
+ --icon-padding: 0 !important;
2150
+ inline-size: 0.72rem !important;
2151
+ block-size: 0.72rem !important;
2152
+ pointer-events: none;
2153
+ }
2154
+
2155
+ .sd-icon-picker__card {
2156
+ display: grid !important;
2157
+ grid-template-columns: minmax(0, 1fr) !important;
2158
+ grid-template-rows: auto max-content !important;
2159
+ justify-items: center !important;
2160
+ align-content: start !important;
2161
+ align-items: start !important;
2162
+ flex-direction: column !important;
2163
+ gap: 0.3rem !important;
2164
+ margin: 0 !important;
2165
+ padding: 0.2rem 0.08rem 0.15rem !important;
2166
+ min-inline-size: 0 !important;
2167
+ inline-size: 100% !important;
2168
+ max-inline-size: 100% !important;
2169
+ block-size: auto !important;
2170
+ min-block-size: 0 !important;
2171
+ border: 0 !important;
2172
+ border-radius: 0.7rem !important;
2173
+ background: transparent !important;
2174
+ box-shadow: none !important;
2175
+ color: inherit !important;
2176
+ cursor: pointer !important;
2177
+ overflow: hidden !important;
2178
+ appearance: none !important;
2179
+ -webkit-appearance: none !important;
2180
+ position: static !important;
2181
+ z-index: auto !important;
2182
+ text-align: center !important;
2183
+ }
2184
+
2185
+ .sd-icon-picker__card:hover,
2186
+ .sd-icon-picker__card:focus-visible {
2187
+ background: color-mix(in oklab, var(--sd-editor-accent, currentColor) 14%, transparent) !important;
2188
+ outline: none;
2189
+ }
2190
+
2191
+ .sd-icon-picker__card img {
2192
+ display: block !important;
2193
+ grid-row: 1 !important;
2194
+ flex: 0 0 auto !important;
2195
+ inline-size: 3rem !important;
2196
+ block-size: 3rem !important;
2197
+ max-inline-size: 3rem !important;
2198
+ max-block-size: 3rem !important;
2199
+ object-fit: cover !important;
2200
+ border-radius: 50% !important;
2201
+ }
2202
+
2203
+ .sd-icon-picker__card-label {
2204
+ display: block !important;
2205
+ grid-row: 2 !important;
2206
+ font-size: 0.62rem !important;
2207
+ line-height: 1.2 !important;
2208
+ text-align: center !important;
2209
+ inline-size: 100% !important;
2210
+ max-inline-size: 100% !important;
2211
+ overflow: hidden !important;
2212
+ text-overflow: ellipsis !important;
2213
+ white-space: nowrap !important;
2214
+ opacity: 0.88;
2215
+ }
2216
+
2217
+ .sd-icon-picker__card:disabled {
2218
+ opacity: 0.45 !important;
2219
+ cursor: not-allowed !important;
2220
+ }
2221
+
2222
+ .sd-icon-picker__footer {
2223
+ display: flex !important;
2224
+ justify-content: flex-end !important;
2225
+ align-items: center !important;
2226
+ gap: 0.45rem;
2227
+ padding: 0.55rem 0.85rem 0.75rem;
2228
+ border-block-start: 1px solid var(--sd-editor-border);
2229
+ }
2230
+
2231
+ .sd-icon-picker__cancel {
2232
+ appearance: none !important;
2233
+ display: inline-flex !important;
2234
+ align-items: center !important;
2235
+ justify-content: center !important;
2236
+ flex: 0 0 auto !important;
2237
+ margin: 0 !important;
2238
+ padding: 0.42rem 0.86rem !important;
2239
+ inline-size: auto !important;
2240
+ width: auto !important;
2241
+ min-inline-size: 0 !important;
2242
+ max-inline-size: none !important;
2243
+ border: 1px solid var(--sd-editor-border) !important;
2244
+ border-radius: 0.65rem !important;
2245
+ background: color-mix(in oklab, var(--sd-editor-field-bg) 68%, transparent) !important;
2246
+ color: inherit !important;
2247
+ font: 600 0.82rem/1.2 ui-sans-serif, system-ui, sans-serif;
2248
+ cursor: pointer;
2249
+ }
2250
+
2251
+ .sd-widget-picker {
2252
+ inline-size: min(90cqi, 92vw);
2253
+ max-block-size: 80vh;
2254
+ padding: 0.85rem;
2255
+ border: none;
2256
+ border-radius: 0.85rem;
2257
+ background: Canvas;
2258
+ color: CanvasText;
2259
+ }
2260
+
2261
+ .sd-widget-picker__list {
2262
+ display: grid;
2263
+ gap: 0.4rem;
2264
+ max-block-size: 60vh;
2265
+ overflow: auto;
2266
+ margin-block: 0.6rem;
2267
+ }
2268
+
2269
+ .sd-widget-picker__item {
2270
+ display: flex;
2271
+ align-items: center;
2272
+ gap: 0.55rem;
2273
+ inline-size: 100%;
2274
+ padding: 0.45rem 0.55rem;
2275
+ border: 1px solid color-mix(in oklab, CanvasText 14%, transparent);
2276
+ border-radius: 0.55rem;
2277
+ background: transparent;
2278
+ color: inherit;
2279
+ text-align: start;
2280
+ cursor: pointer;
2281
+ }
2282
+
2283
+ .sd-widget-picker__item img {
2284
+ inline-size: 2.2rem;
2285
+ block-size: 2.2rem;
2286
+ object-fit: contain;
2287
+ }
2288
+ }