@fest-lib/fl-ui 0.1.1

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