@fest-lib/veela 0.1.19 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/veela.js +4 -33
  2. package/package.json +9 -2
  3. package/src/scss/_layers.scss +5 -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,405 @@
1
+ @use "sass:string";
2
+
3
+ // ============================================================================
4
+ // Tabs Component Styles
5
+ // ============================================================================
6
+ @mixin tabbed-box-tabs($selector: ".ui-tabbed-box-tabs") {
7
+ @at-root :host {
8
+ #{$selector} {
9
+ // ================================================================
10
+ // Base Layout
11
+ // ================================================================
12
+ & {
13
+ display: flex;
14
+ flex-direction: row;
15
+ align-items: center;
16
+
17
+ // Grid positioning
18
+ grid-column: content-col;
19
+ grid-row: 1;
20
+
21
+ // Sizing
22
+ max-inline-size: stretch;
23
+ max-block-size: 3rem;
24
+ inline-size: stretch;
25
+ block-size: fit-content;
26
+ min-block-size: 3rem;
27
+
28
+ // Spacing
29
+ gap: 0.25rem;
30
+ padding-block: 0.25rem;
31
+ padding-inline: 0.25rem;
32
+
33
+ // Visual
34
+ border-radius: 50cqmin;
35
+ overflow: hidden;
36
+ position: relative;
37
+ contain: strict;
38
+
39
+ // Scrolling
40
+ scrollbar-gutter: stable;
41
+ overscroll-behavior-inline: contain;
42
+ scroll-behavior: smooth;
43
+
44
+ // Interaction
45
+ pointer-events: auto;
46
+ touch-action: pan-x;
47
+
48
+ // Alignment
49
+ place-content: center flex-start;
50
+ place-items: center flex-start;
51
+ text-align: start;
52
+ justify-content: safe flex-start;
53
+ justify-items: safe flex-start;
54
+ z-index: 90;
55
+ }
56
+
57
+
58
+
59
+ // ================================================================
60
+ // Tab Items
61
+ // ================================================================
62
+ & :where(.ui-tabbed-box-tab) {
63
+ display: flex;
64
+ flex-direction: row;
65
+ flex-shrink: 0;
66
+ position: relative;
67
+ isolation: isolate;
68
+
69
+ // Sizing
70
+ min-inline-size: 3rem;
71
+ inline-size: fit-content;
72
+
73
+ min-block-size: 2.5rem;
74
+ block-size: fit-content;
75
+ max-block-size: 2.5rem;
76
+ pointer-events: auto;
77
+
78
+ // Spacing
79
+ gap: 0.25rem;
80
+ padding-block: 0.25rem;
81
+ padding-inline: 0.125rem;
82
+
83
+ // Visual
84
+ border-radius: 50cqmin;
85
+ background-color: transparent;
86
+ color: color-mix(in oklch, var(--md3-on-surface) 85%, transparent);
87
+ letter-spacing: 0.01em;
88
+ overflow: visible;
89
+
90
+ // Interaction
91
+ cursor: pointer;
92
+ touch-action: pan-x;
93
+ transition: color var(--duration-normal) var(--ease-out),
94
+ transform var(--duration-fast) var(--ease-emphasized);
95
+
96
+ // Alignment
97
+ place-content: center;
98
+ place-items: center;
99
+ text-align: center;
100
+
101
+ // Performance
102
+ content-visibility: visible;
103
+
104
+ // ============================================================
105
+ // Active Indicator
106
+ // ============================================================
107
+ &::after {
108
+ content: "";
109
+ position: absolute;
110
+ inset-inline: clamp(0.5rem, 4cqi, 1rem);
111
+ inset-inline-end: 3rem;
112
+ inset-block-end: calc(var(--tabbed-indicator-height) * -1);
113
+ block-size: var(--tabbed-indicator-height);
114
+ border-radius: var(--tabbed-indicator-height);
115
+ background: currentColor;
116
+ opacity: 0;
117
+ transform: translate3d(0, 50%, 0) scaleX(0.6);
118
+ transition: transform var(--tabbed-indicator-duration) var(--tabbed-indicator-ease),
119
+ opacity var(--tabbed-indicator-duration) var(--tabbed-indicator-ease);
120
+ overflow: visible;
121
+ place-content: center;
122
+ place-items: center;
123
+ text-align: center;
124
+ }
125
+
126
+ // Bottom position: indicator on top
127
+ :host([tab-position="bottom"]) &::after {
128
+ inset-block-start: calc(var(--tabbed-indicator-height) * -1);
129
+ inset-block-end: auto;
130
+ transform: translate3d(0, -50%, 0) scaleX(0.6);
131
+ }
132
+
133
+ // ============================================================
134
+ // Active State
135
+ // ============================================================
136
+ &:where([aria-selected="true"], [active], .is-active, .active) {
137
+ color: var(--md3-on-primary);
138
+ transform: translateY(-2px);
139
+ place-content: center;
140
+ place-items: center;
141
+ text-align: center;
142
+
143
+ &::after {
144
+ opacity: 1;
145
+ transform: translate3d(0, 0, 0) scaleX(1);
146
+ background: var(--md3-on-primary);
147
+ }
148
+ }
149
+
150
+ // ============================================================
151
+ // Disabled State
152
+ // ============================================================
153
+ &:disabled {
154
+ opacity: var(--state-opacity-disabled, 0.38);
155
+ }
156
+
157
+ // ============================================================
158
+ // Tab Label
159
+ // ============================================================
160
+ :where(.ui-tabbed-box-tab-label) {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ justify-content: flex-start;
164
+ gap: var(--gap-3xs, 0.2rem);
165
+ color: inherit;
166
+ pointer-events: none;
167
+ text-align: inherit;
168
+ line-height: var(--leading-tight, 1.1);
169
+ content-visibility: visible;
170
+ margin-inline: 1rem;
171
+ block-size: fit-content;
172
+ inline-size: fit-content;
173
+ }
174
+
175
+ // ============================================================
176
+ // Close Button
177
+ // ============================================================
178
+ :where(.ui-tabbed-box-tab-close) {
179
+ display: inline-flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ box-sizing: border-box;
183
+ aspect-ratio: 1 / 1;
184
+ flex-shrink: 0;
185
+
186
+ // Sizing
187
+ inline-size: fit-content;
188
+ block-size: fit-content;
189
+ min-inline-size: 2.25rem;
190
+ min-block-size: 2.25rem;
191
+ max-inline-size: 2.25rem;
192
+ max-block-size: 2.25rem;
193
+ padding: 0.25rem;
194
+ gap: 0px;
195
+
196
+ // Visual
197
+ border-radius: var(--radius-full);
198
+ background-color: transparent;
199
+ border: none;
200
+ outline: none;
201
+ color: var(--tabbed-close-color);
202
+
203
+ // Interaction
204
+ cursor: pointer;
205
+ transition: color var(--duration-normal) var(--ease-out),
206
+ transform var(--duration-fast) var(--ease-emphasized);
207
+
208
+ // Performance
209
+ content-visibility: visible;
210
+
211
+ // Icon
212
+ ui-icon {
213
+ content-visibility: visible;
214
+ color: --c2-on-surface(0.0, var(--current, currentColor));
215
+ --icon-color: --c2-on-surface(0.0, var(--current, currentColor));
216
+ inline-size: calc(var(--tabbed-close-size) * 0.5);
217
+ block-size: calc(var(--tabbed-close-size) * 0.5);
218
+ }
219
+
220
+ // States
221
+ &:focus-visible {
222
+ outline: 2px solid color-mix(in oklch, currentColor 35%, transparent);
223
+ outline-offset: 2px;
224
+ }
225
+
226
+ &:hover {
227
+ color: color-mix(in oklch, var(--md3-on-surface) 92%, transparent);
228
+ }
229
+
230
+ &:active {
231
+ transform: scale(0.9);
232
+ }
233
+ }
234
+
235
+ // Active tab: close button styling
236
+ &:where([aria-selected="true"], [active], .is-active, .active) {
237
+ .ui-tabbed-box-tab-close {
238
+ color: color-mix(in oklch, var(--surface-on-primary) 85%, transparent);
239
+ --icon-color: color-mix(in oklch, var(--surface-on-primary) 85%, transparent);
240
+ }
241
+ }
242
+
243
+ // ================================================================
244
+ // Icons
245
+ // ================================================================
246
+ ui-icon {
247
+ color: --c2-on-surface(0.0, var(--current, currentColor));
248
+ --icon-color: --c2-on-surface(0.0, var(--current, currentColor));
249
+
250
+ // Sizing
251
+ inline-size: var(--tabbed-icon-size);
252
+ block-size: var(--tabbed-icon-size);
253
+ aspect-ratio: 1 / 1;
254
+ max-inline-size: stretch;
255
+ max-block-size: stretch;
256
+ padding: 0px;
257
+
258
+ // Layout
259
+ content-visibility: visible;
260
+ place-content: center;
261
+ place-items: center;
262
+ text-align: center;
263
+ }
264
+
265
+ // ================================================================
266
+ // Spacing by Tab Position
267
+ // ================================================================
268
+ @at-root :host([tab-position="bottom"]) #{$selector} & {
269
+ margin-block-start: var(--tabbed-tabs-block-gap);
270
+ margin-block-end: 0;
271
+ }
272
+
273
+ // ================================================================
274
+ // Scroll Gradients
275
+ // ================================================================
276
+ &::before,
277
+ &::after {
278
+ content: "";
279
+ position: absolute;
280
+ inset-block: 0;
281
+ inline-size: min(1.75rem, 8%);
282
+ pointer-events: none;
283
+ opacity: clamp(0, calc(var(--scroll-gradient, 0)), 1);
284
+ transition: opacity var(--duration-normal) var(--ease-out);
285
+ background: linear-gradient(90deg, color-mix(in oklch, var(--md3-surface) 70%, transparent) 0%, transparent 100%);
286
+ }
287
+
288
+ &::before {
289
+ inset-inline-start: 0;
290
+ transform: scaleX(-1);
291
+ --scroll-gradient: attr(data-scrollable-start number, 0);
292
+ }
293
+
294
+ &::after {
295
+ inset-inline-end: 0;
296
+ --scroll-gradient: attr(data-scrollable-end number, 0);
297
+ }
298
+
299
+ // Mask for scrollable tabs
300
+ @supports (mask-image: linear-gradient(#0000, #000)) {
301
+ &[data-scrollable="true"] {
302
+ mask-image: linear-gradient(to right, transparent 0%, black min(2.5rem, 18%), black calc(100% - min(2.5rem, 18%)), transparent 100%);
303
+ }
304
+ }
305
+
306
+ // ================================================================
307
+ // Touch Actions
308
+ // ================================================================
309
+ &, & *, & button {
310
+ touch-action: pan-x;
311
+ }
312
+ }
313
+
314
+ // ============================================================
315
+ // Pinned State: Tab Adjustments
316
+ // ============================================================
317
+ &.pinned {
318
+ display: grid;
319
+ grid-template-columns: minmax(0px, 1fr);
320
+ grid-template-rows: minmax(0px, 1fr);
321
+ grid-column: pinned-col;
322
+
323
+ // Sizing
324
+ inline-size: max-content;
325
+ block-size: stretch;
326
+ overflow: visible;
327
+ contain: none;
328
+
329
+ // Spacing
330
+ padding: 0px;
331
+ padding-inline: 0px;
332
+ margin-inline: 0px;
333
+ gap: 0px;
334
+ margin-inline-start: var(--space-sm);
335
+
336
+ // Visual
337
+ background-color: transparent;
338
+ border-radius: 0px;
339
+ line-height: 0;
340
+ font-size: 0px;
341
+
342
+ // Alignment
343
+ place-content: center !important;
344
+ place-items: center !important;
345
+ text-align: center !important;
346
+
347
+ .ui-tabbed-box-tab {
348
+ display: grid;
349
+ grid-template-columns: minmax(0px, 1fr);
350
+ grid-template-rows: minmax(0px, 1fr);
351
+
352
+ // Sizing
353
+ inline-size: fit-content;
354
+ min-inline-size: 3rem;
355
+ min-block-size: 3rem;
356
+ max-block-size: 3rem;
357
+ aspect-ratio: 1 / 1;
358
+ inset: 0px;
359
+ overflow: hidden;
360
+ pointer-events: auto;
361
+
362
+ // Visual
363
+ border-radius: 50cqmin;
364
+ font-size: 0px;
365
+ line-height: 0;
366
+
367
+ // Alignment
368
+ place-content: center !important;
369
+ place-items: center !important;
370
+ text-align: center !important;
371
+
372
+ //
373
+ gap: 0px !important;
374
+ padding-inline: 0px !important;
375
+ block-size: stretch !important;
376
+
377
+ & > * {
378
+ grid-row: 1 / -1;
379
+ grid-column: 1 / -1;
380
+ background-color: transparent;
381
+ }
382
+ }
383
+
384
+ .ui-tabbed-box-tab-close {
385
+ display: none !important;
386
+ margin-inline: 0px !important;
387
+ }
388
+
389
+ &::after {
390
+ margin: 0px !important;
391
+ inset: 0px !important;
392
+ }
393
+
394
+ ui-icon {
395
+ padding: 0px;
396
+ inline-size: 2rem;
397
+ block-size: 2rem;
398
+ }
399
+ }
400
+
401
+ }
402
+
403
+
404
+ }
405
+ }
@@ -0,0 +1,215 @@
1
+ @use "../core/layout" as l;
2
+ @use "../core/utils" as utils;
3
+
4
+ // Variables for taskbar theming and sizing
5
+ @mixin taskbar-variables {
6
+ --taskbar-height: clamp(44px, 5svh, 56px);
7
+ --taskbar-padding-inline: clamp(8px, 2vw, 16px);
8
+ --taskbar-gap: clamp(6px, 1.2vw, 10px);
9
+ --task-size: clamp(32px, 4.2svh, 40px);
10
+ --task-radius: 10px;
11
+ --taskbar-bg: color-mix(in oklab, var(--c2-surface(0.0, var(--current)), #0b0b0c) 70%, transparent);
12
+ --taskbar-border: color-mix(in oklab, var(--c2-on-surface(0.0, var(--current)), #ffffff) 15%, transparent);
13
+ --taskbar-shadow: 0 -8px 24px -12px color-mix(in oklab, #000 65%, transparent);
14
+ }
15
+
16
+ // Base layout for taskbar
17
+ @mixin taskbar-layout {
18
+ @include l.display(flex, row, center, start);
19
+
20
+ //
21
+ & {
22
+ z-index: 1000;
23
+ position: fixed;
24
+ inset-block-end: env(safe-area-inset-bottom, 0px);
25
+ inset-inline-start: 50%;
26
+ transform: translateX(-50%);
27
+ overflow: hidden;
28
+ overflow-x: scroll;
29
+ border-radius: 0.5rem;
30
+ scrollbar-width: none;
31
+ scrollbar-color: transparent transparent;
32
+ scrollbar-gutter: stable;
33
+ padding: 0px;
34
+ border: 0px none transparent;
35
+ }
36
+
37
+ //
38
+ & {
39
+ min-inline-size: 0px;
40
+ inline-size: fit-content;
41
+ block-size: calc(var(--taskbar-height) + env(safe-area-inset-bottom, 0px));
42
+ }
43
+
44
+ //
45
+ & {
46
+ gap: var(--taskbar-gap);
47
+ }
48
+
49
+ //
50
+ & {
51
+ background-color: transparent;
52
+ backdrop-filter: saturate(120%) blur(12px);
53
+ -webkit-backdrop-filter: saturate(120%) blur(12px);
54
+ }
55
+
56
+ //
57
+ & {
58
+ box-shadow: var(--taskbar-shadow);
59
+ }
60
+
61
+ //
62
+ & {
63
+ overflow: hidden;
64
+ overflow-x: auto;
65
+ scrollbar-width: none;
66
+ scrollbar-color: transparent transparent;
67
+ }
68
+
69
+ //
70
+ &::-webkit-scrollbar {
71
+ display: none;
72
+ inline-size: 0;
73
+ block-size: 0;
74
+ }
75
+
76
+ //
77
+ & {
78
+ scroll-snap-type: x proximity;
79
+ }
80
+ }
81
+
82
+ // Desktop specific adjustments
83
+ @mixin taskbar-type-desktop {
84
+ & {
85
+ flex-direction: row;
86
+ align-items: center;
87
+ justify-content: flex-start;
88
+ }
89
+ }
90
+
91
+ // Mobile specific adjustments
92
+ @mixin taskbar-type-mobile {
93
+ & {
94
+ place-content: center;
95
+ place-items: center;
96
+ place-self: center;
97
+ flex-direction: row;
98
+ justify-content: space-evenly;
99
+ gap: clamp(8px, 3vw, 18px);
100
+ padding-inline: clamp(10px, 4vw, 18px);
101
+ }
102
+ }
103
+
104
+ // Slot children defaults
105
+ @mixin taskbar-children {
106
+ & > ::slotted(ui-task) {
107
+ scroll-snap-align: start;
108
+ inline-size: fit-content;
109
+ }
110
+ }
111
+
112
+ // Focused task colors parameterized by scheme
113
+ @mixin taskbar-focus-colors($bg: var(--c2-surface(0.0, var(--current))), $fg: var(--c2-on-surface(0.0, var(--current)))) {
114
+ & > ::slotted(ui-task[data-focus]) { background-color: $bg; color: $fg; }
115
+ }
116
+
117
+ // Task base styles shared by any task-like button
118
+ @mixin task-base {
119
+ --task-size: clamp(32px, 4.2svh, 40px);
120
+ --task-radius: 10px;
121
+ --task-bg: color-mix(in oklab, var(--c2-surface(0.0, var(--current)), #0b0b0c) 12%, transparent);
122
+ --task-fg: var(--c2-on-surface(0.0, var(--current)));
123
+ --task-border: color-mix(in oklab, var(--c2-on-surface(0.0, var(--current)), #ffffff) 10%, transparent);
124
+
125
+ & {
126
+ display: inline-grid !important;
127
+ grid-template-areas: "icon title";
128
+ grid-auto-flow: column;
129
+ grid-template-columns: minmax(0px, 1fr);
130
+ grid-template-rows: minmax(0px, 1fr);
131
+ place-content: center !important;
132
+ place-items: center !important;
133
+ gap: 0px;
134
+ margin: 0px;
135
+ padding: 0px;
136
+ overflow: hidden;
137
+ scrollbar-width: none;
138
+ scrollbar-color: transparent transparent;
139
+ scrollbar-gutter: stable;
140
+ box-sizing: border-box;
141
+ }
142
+
143
+ & {
144
+ border-radius: 0px;
145
+ border: 0px none transparent;
146
+ border-block-end-width: 0.25rem;
147
+ border-block-end-style: solid;
148
+ border-block-end-color: transparent;
149
+ padding-block-start: 0.25rem;
150
+ }
151
+
152
+ & {
153
+ inline-size: calc(var(--task-size) * 1.4);
154
+ block-size: stretch;
155
+ }
156
+
157
+ & {
158
+ color: var(--task-fg);
159
+ --icon-color: var(--task-fg);
160
+ background-color: var(--task-bg);
161
+ backdrop-filter: blur(6px) saturate(120%);
162
+ -webkit-backdrop-filter: blur(6px) saturate(120%);
163
+ }
164
+
165
+ & {
166
+ box-shadow:
167
+ 0 1px 0 color-mix(in oklab, #fff 6%, transparent) inset,
168
+ 0 6px 14px -8px color-mix(in oklab, #000 50%, transparent);
169
+ }
170
+
171
+ & {
172
+ cursor: pointer;
173
+ transition: transform .18s ease, background-color .18s ease, box-shadow .18s ease, border-color .18s ease;
174
+ }
175
+ }
176
+
177
+ // Task states
178
+ @mixin task-states {
179
+ @include utils.when-focus-visible {
180
+ outline: 2px solid color-mix(in oklab, var(--c2-on-surface(0.0, var(--current)), #ffffff) 70%, transparent);
181
+ outline-offset: 2px;
182
+ }
183
+
184
+ @include utils.when-hover {
185
+ --task-bg: color-mix(in oklab, var(--c2-surface(0.0, var(--current)), #0b0b0c) 18%, transparent);
186
+ transform: translateY(1px) scale(.98);
187
+ }
188
+ }
189
+
190
+ // Task slots
191
+ @mixin task-slots {
192
+ & > .task-icon {
193
+ & {
194
+ padding: 0.25rem;
195
+ inline-size: var(--task-size);
196
+ block-size: var(--task-size);
197
+ }
198
+
199
+ & > ui-icon {
200
+ inline-size: auto;
201
+ block-size: stretch;
202
+ aspect-ratio: 1 / 1;
203
+ color: var(--icon-color);
204
+ }
205
+ }
206
+
207
+ & > .task-title {
208
+ & {
209
+ grid-area: title;
210
+ font: 500 12px/1.2 system-ui, ui-sans-serif;
211
+ opacity: .9;
212
+ display: none;
213
+ }
214
+ }
215
+ }