@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,477 @@
1
+ // Layout Components - Refactored and Optimized
2
+ // Unified with design system variables and mixins
3
+ @use "veela-lib" as *;
4
+ @use "../../library/mixins" as ui;
5
+ @use "../../library/tokens" as t;
6
+
7
+ //
8
+ @mixin sidebar {
9
+
10
+ //
11
+ .sidebar {
12
+ align-items: stretch;
13
+ box-sizing: border-box;
14
+ user-select: none;
15
+ text-align: start;
16
+ padding: 0px;
17
+ touch-action: pan-y;
18
+ pointer-events: auto;
19
+ justify-content: start;
20
+ block-size: stretch;
21
+ margin: 0px;
22
+
23
+ //
24
+ @include flex-center;
25
+ @include container-clamped(clamp(0px, var(--sidebar-width, 20rem), 100cqi), stretch);
26
+ @include scrollable("y");
27
+ @include hide-scrollbar;
28
+
29
+ //
30
+ @include ui.vstack(0px);
31
+ @include ui.tonal-surface(surface-container-low, var(--surface-opacity-default), var(--radius-sm), 0px, 1, true);
32
+
33
+ //
34
+ & {
35
+ box-sizing: border-box;
36
+ border: none 0 transparent;
37
+ outline: none 0 transparent;
38
+ max-block-size: stretch;
39
+ min-block-size: 0px;
40
+ box-shadow: none;
41
+
42
+ contain: strict;
43
+ content-visibility: auto;
44
+ block-size: stretch;
45
+ padding: 0.25rem;
46
+ padding-inline: 0.25rem;
47
+ padding-block: 0.25rem;
48
+
49
+ border-radius: 0px;
50
+ border-start-start-radius: 0px;
51
+ border-end-start-radius: 0px;
52
+ //background-color: oklch(from --c2-surface(0.15, var(--current, currentColor)) l c h / 0.9);
53
+ //filter: drop-shadow(0 1.5rem 1rem color-mix(in oklch, #000 22%, transparent));
54
+ //backdrop-filter: blur(1rem);
55
+ background-color: transparent;
56
+ filter: drop-shadow(0 1.5rem 1rem color-mix(in oklch, #000 22%, transparent));
57
+ }
58
+
59
+ //
60
+ &[slot="sidebar"] {
61
+ grid-column: 1 / 2;
62
+ grid-row: 1 / -1;
63
+ position: sticky;
64
+ inset-block-start: var(--padding-sm);
65
+ align-self: start;
66
+ display: flex;
67
+ flex-direction: column;
68
+ touch-action: pan-y;
69
+ justify-content: start;
70
+
71
+ //
72
+ @include container-clamped(stretch, stretch);
73
+ @include scrollable;
74
+ @include hide-scrollbar;
75
+ @include container("lg") {
76
+ position: static;
77
+ max-block-size: none;
78
+ order: 2;
79
+ inline-size: calc(100cqi - clamp(0px, var(--padding-sm), 100cqi));
80
+ }
81
+
82
+ //
83
+ & { min-block-size: 0px; box-shadow: none; block-size: stretch; max-block-size: stretch; }
84
+ }
85
+
86
+ ul {
87
+ user-select: none;
88
+ overflow: visible;
89
+ box-sizing: border-box;
90
+ margin: 0px;
91
+ touch-action: pan-y;
92
+ justify-content: start;
93
+ max-block-size: none;
94
+ block-size: max-content;
95
+ margin-block: 0.25rem;
96
+
97
+ //
98
+ @include container-clamped(stretch, fit-content);
99
+ @include ui.tonal-list(surface, var(--surface-opacity-subtle), var(--radius-sm), 0);
100
+
101
+ //
102
+ /*filter: drop-shadow(0 1.5rem 1rem color-mix(in oklch, #000 22%, transparent));*/
103
+ background-color: oklch(from var(--surface-color) l c h / 1);
104
+ /*backdrop-filter: blur(1rem);*/
105
+
106
+ //
107
+ &, &:focus {
108
+ border: none 0 transparent;
109
+ outline: none 0 transparent;
110
+ }
111
+
112
+ //
113
+ & { block-size: max-content; min-block-size: max-content; max-block-size: none; }
114
+
115
+ //
116
+ li {
117
+ overflow: visible;
118
+ font-size: t.$font-sm;
119
+ transition: var(--transition-colors);
120
+ touch-action: pan-y;
121
+
122
+ //
123
+ @include container-clamped(stretch, fit-content);
124
+
125
+ //
126
+ &, * { pointer-events: none; }
127
+
128
+ //
129
+ a {
130
+ display: flex;
131
+ flex-direction: row;
132
+ flex-wrap: nowrap;
133
+ pointer-events: auto;
134
+ background: transparent;
135
+ touch-action: pan-y;
136
+
137
+ //
138
+ @include container-clamped(stretch, fit-content);
139
+ @include nav-item;
140
+
141
+ //
142
+ &, &:focus {
143
+ border: none;
144
+ outline: none;
145
+ }
146
+
147
+ //
148
+ & { padding: var(--padding-lg); column-gap: var(--gap-xs); gap: var(--gap-md); }
149
+ @media (max-height: 600px) { padding: var(--padding-xl); gap: var(--gap-sm); }
150
+ @media (max-height: 480px) { padding: var(--padding-lg); gap: var(--gap-md); }
151
+
152
+ //
153
+ & {
154
+ position: relative;
155
+ isolation: isolate;
156
+ border-radius: var(--radius-sm);
157
+ transition: color var(--transition-colors), background-color var(--transition-colors);
158
+ color: color-mix(in oklch, var(--on-surface, currentColor) 72%, transparent);
159
+ min-block-size: 3rem; // 56px
160
+ }
161
+
162
+ &::before {
163
+ content: "";
164
+ position: absolute;
165
+ inset: 0;
166
+ border-radius: inherit;
167
+ background: color-mix(in oklch, var(--primary, var(--color-primary, currentColor)) 18%, transparent);
168
+ opacity: 0;
169
+ transform: scale3d(0.4, 1, 1);
170
+ transition: opacity var(--transition-colors), transform var(--transition-medium, var(--transition-colors));
171
+ pointer-events: none;
172
+ }
173
+
174
+ &::after {
175
+ display: none; // Remove the small indicator
176
+ }
177
+
178
+ &:where(:hover, :focus-visible, :focus, :active) {
179
+ color: color-mix(in oklch, var(--on-surface, currentColor) 94%, transparent);
180
+
181
+ &::before {
182
+ opacity: 0.55;
183
+ transform: scale3d(1, 1, 1);
184
+ }
185
+
186
+ ui-icon {
187
+ color: color-mix(in oklch, var(--on-surface, currentColor) 94%, transparent);
188
+ }
189
+ }
190
+
191
+ &[data-active="true"] {
192
+ color: color-mix(in oklch, var(--on-secondary-container, var(--on-surface, currentColor)) 100%, transparent);
193
+ font-weight: var(--font-weight-semibold);
194
+ letter-spacing: 0.01em;
195
+
196
+ &::before {
197
+ opacity: 1;
198
+ transform: scale3d(1, 1, 1);
199
+ background: var(--secondary-container, color-mix(in oklch, var(--primary, var(--color-primary, currentColor)) 25%, transparent));
200
+ box-shadow: none;
201
+ }
202
+
203
+ ui-icon {
204
+ color: currentColor;
205
+ }
206
+ }
207
+
208
+ @media (prefers-reduced-motion: reduce) {
209
+ &, &::before, &::after {
210
+ transition-duration: 0ms;
211
+ transform: none;
212
+ }
213
+ }
214
+
215
+ ui-icon {
216
+ justify-self: start;
217
+ inline-size: var(--icon-size);
218
+ block-size: var(--icon-size);
219
+ --icon-size: var(--icon-size-sm);
220
+ color: color-mix(in oklch, var(--on-surface, currentColor) 58%, transparent);
221
+ transition: color var(--transition-colors), transform var(--transition-medium, var(--transition-colors));
222
+
223
+ @media (max-width: 720px) { --icon-size: var(--icon-size-md); }
224
+ @media (max-width: 480px) { --icon-size: var(--icon-size-lg); }
225
+ }
226
+
227
+ //
228
+ span {
229
+ display: block;
230
+ justify-self: start;
231
+ text-align: start;
232
+ @include container-clamped(stretch, max-content);
233
+ }
234
+ }
235
+ }
236
+ }
237
+
238
+ &,
239
+ ul,
240
+ ul li,
241
+ ul li a,
242
+ ul li a span {
243
+ text-align: start;
244
+ direction: ltr;
245
+ justify-items: start;
246
+ justify-self: start;
247
+ }
248
+
249
+ //
250
+ @include container("lg") {
251
+ nav {
252
+ inline-size: 100cqi;
253
+
254
+ //
255
+ padding: var(--padding-sm) var(--padding-xs);
256
+ @media (max-width: 720px) { padding: var(--padding-md) var(--padding-sm); }
257
+ @media (max-width: 480px) { padding: var(--padding-lg) var(--padding-md); }
258
+
259
+ //
260
+ ul {
261
+ gap: 0;
262
+ padding-inline: 0;
263
+ inline-size: stretch;
264
+
265
+ li {
266
+ flex: 0 0 auto;
267
+ white-space: nowrap;
268
+ border-radius: var(--radius-sm);
269
+
270
+ //
271
+ @media (max-width: 480px) { border-radius: var(--radius-md); }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+
279
+ // ============================================================================
280
+ // Sidebar Component Styles
281
+ // ============================================================================
282
+ @mixin tabbed-sidebar($selector: ".sidebar") {
283
+ @at-root :host {
284
+ #{$selector} {
285
+ // ================================================================
286
+ // Base Layout
287
+ // ================================================================
288
+ & {
289
+ display: flex;
290
+ flex-direction: column;
291
+ justify-content: start;
292
+ gap: 0px;
293
+
294
+ // Grid positioning
295
+ grid-column: 1 / 2 span;
296
+ grid-row: 2 / -1;
297
+ z-index: 2;
298
+
299
+ // Sizing
300
+ min-inline-size: 0px;
301
+ min-block-size: 0px;
302
+ max-inline-size: stretch;
303
+ max-block-size: stretch;
304
+
305
+ // Spacing
306
+ padding: 0px !important;
307
+ margin: 0px !important;
308
+
309
+ // Visual
310
+ background: none;
311
+ box-shadow: none;
312
+ border-radius: 0px;
313
+ overflow: visible;
314
+
315
+ // Transform & Animation
316
+ transform: translateX(0px);
317
+ background-color: transparent;
318
+ transition-behavior: allow-discrete;
319
+
320
+ //
321
+ /*filter: drop-shadow(0 1.5rem 1rem color-mix(in oklch, #000 22%, transparent));*/
322
+ filter: none;
323
+ }
324
+
325
+ // ================================================================
326
+ // Slotted Sidebar Content
327
+ // ================================================================
328
+ ::slotted([slot="sidebar"]) {
329
+ // Grid positioning
330
+ grid-row: 1 / -1;
331
+
332
+ // Sizing
333
+ inline-size: stretch;
334
+ block-size: stretch;
335
+ max-block-size: stretch;
336
+ flex-grow: 1;
337
+
338
+ // Spacing
339
+ padding: 0rem;
340
+ margin: 0px;
341
+ gap: 0px;
342
+
343
+ // Layout
344
+ place-content: center;
345
+ place-items: center;
346
+ align-content: start;
347
+ line-height: normal;
348
+
349
+ // Visual
350
+ box-shadow: none;
351
+ }
352
+
353
+ // ================================================================
354
+ // Desktop Layout (≥800px)
355
+ // ================================================================
356
+ @at-root :host(:not([sidebar-drop-menu])) {
357
+ --sidebar-inline-grid-size: 0px;
358
+
359
+ //
360
+ #{$selector} {
361
+ & {
362
+ will-change: inline-size;
363
+ grid-column: 1 / 2 span;
364
+ position: relative;
365
+ min-inline-size: 0px;
366
+ inline-size: clamp(min(20rem, 100%), max(16rem, 10cqi), 100cqi);
367
+ max-inline-size: none;
368
+ transform: translate3d(-100%, 0, 0);
369
+ transition: transform var(--transition-medium, 0.28s) ease,
370
+ box-shadow var(--transition-medium, 0.28s) ease;
371
+ pointer-events: none;
372
+ block-size: stretch;
373
+ max-block-size: stretch;
374
+ }
375
+
376
+ // Hidden state
377
+ &:is([sidebar-opened="false"], :not([sidebar-opened="true"], [sidebar-opened=""])) {
378
+ pointer-events: none;
379
+ transform: translate3d(-100%, 0, 0);
380
+ }
381
+
382
+ // Visible state
383
+ &:is([sidebar-opened="true"], [sidebar-opened=""]) {
384
+ transform: translate3d(0, 0, 0);
385
+ pointer-events: auto;
386
+
387
+ @starting-style {
388
+ transform: translate3d(-100%, 0, 0);
389
+ box-shadow: none;
390
+ }
391
+ }
392
+ }
393
+ }
394
+
395
+ // ================================================================
396
+ // Drop Menu Mode
397
+ // ================================================================
398
+ @at-root :host([sidebar-drop-menu]) {
399
+ --sidebar-inline-grid-size: 0px;
400
+
401
+ #{$selector} {
402
+ & {
403
+ // Grid positioning
404
+ grid-column: sidebar-col !important;
405
+ grid-row: 2 / -1;
406
+ z-index: 5;
407
+
408
+ // Sizing
409
+ inline-size: min(26rem, 80cqi);
410
+ min-inline-size: clamp(16rem, 32cqi, 24rem);
411
+ block-size: stretch;
412
+ max-block-size: min(48rem, 100cqb);
413
+
414
+ // Spacing
415
+ padding-block: clamp(0.75rem, 1cqb + 0.5rem, 1.25rem);
416
+ padding-inline: clamp(0.75rem, 1cqi + 0.75rem, 1.5rem);
417
+
418
+ // Visual
419
+ background-color: color-mix(in oklch, var(--surface-color) 96%, transparent);
420
+ border: 1px solid color-mix(in oklch, var(--md3-outline) 40%, transparent);
421
+ border-radius: 0px;
422
+ box-shadow: 0 1.5rem 3rem color-mix(in oklch, #000 22%, transparent);
423
+
424
+ // Transform & Animation
425
+ transform-origin: top center;
426
+ transform: translate3d(0, -20%, 0);
427
+ transition-behavior: allow-discrete;
428
+ transition:
429
+ visibility var(--transition-medium, 0.3s) steps(1, jump-both),
430
+ transform var(--transition-medium, 0.3s) var(--ease-emphasized),
431
+ opacity var(--transition-medium, 0.3s) var(--ease-out),
432
+ box-shadow var(--transition-medium, 0.3s) var(--ease-emphasized);
433
+
434
+ // Initial state
435
+ pointer-events: none;
436
+ visibility: hidden;
437
+ opacity: 0;
438
+ }
439
+
440
+ // Visible state
441
+ &:is([sidebar-opened=""], [sidebar-opened="true"]) {
442
+ opacity: 1;
443
+ pointer-events: auto;
444
+ transform: translate3d(0, 0, 0);
445
+ visibility: visible;
446
+
447
+ @starting-style {
448
+ transform: translate3d(0, -20%, 0);
449
+ }
450
+ }
451
+
452
+ // Backdrop overlay
453
+ &:has([sidebar-opened="true"]) .content-box::after {
454
+ opacity: 0.6;
455
+ pointer-events: auto;
456
+ }
457
+ }
458
+ }
459
+
460
+ // ================================================================
461
+ // Drop Menu: Bottom Tab Position
462
+ // ================================================================
463
+ @at-root :host([sidebar-drop-menu][tab-position="bottom"]) #{$selector} {
464
+ inset-block-start: auto;
465
+ inset-block-end: calc(var(--tabbed-bar-block-size) + var(--tabbed-padding-block));
466
+ transform-origin: bottom center;
467
+ transform: translate3d(0, 20%, 0);
468
+
469
+ &:is([sidebar-opened=""], [sidebar-opened="true"]) {
470
+ @starting-style {
471
+ transform: translate3d(0, 20%, 0);
472
+ }
473
+ }
474
+ }
475
+ }
476
+ }
477
+ }
@@ -0,0 +1,47 @@
1
+ @use "../lib/core/interact/viewport" as *;
2
+
3
+ //
4
+ // Desktop-like launcher / speed-dial grids (orient-aware drag + placement).
5
+ // Use with:
6
+ // - Host: `data-mixin="ui-orientbox"` ancestor, `data-grid-columns` / `data-grid-rows`
7
+ // - Items: `compute_grid_item_cell` (see `.ui-gridlayout` or include mixin on children)
8
+ // - JS: `fest/dom` `resolveGridCellFromClientPoint`, `fest/lure` `bindDraggable`, `fest/core` `normalizeGridLayout` / `redirectCell`
9
+ //
10
+ @layer ux-launcher-grid {
11
+ .ui-launcher-grid, .ui-speed-dial-grid {
12
+ @include compute_orient_grid_layout();
13
+
14
+ display: grid;
15
+ position: relative;
16
+ container-type: size;
17
+ box-sizing: border-box;
18
+ inline-size: stretch;
19
+ block-size: stretch;
20
+ min-inline-size: 0px;
21
+ min-block-size: 0px;
22
+ pointer-events: none;
23
+ gap: 0;
24
+ place-content: center;
25
+ place-items: center;
26
+
27
+ // Override `--layout-c` / `--layout-r` (or set `--grid-cols` / `--grid-rows` in a parent theme) to match `data-grid-*` + app state.
28
+ --layout-c: 4;
29
+ --layout-r: 8;
30
+
31
+ --sd-inherit-layout-c: var(--layout-c, 4);
32
+ --sd-inherit-layout-r: var(--layout-r, 8);
33
+ --sd-inherit-cs-layout-c: var(--cs-layout-c, var(--layout-c, 4));
34
+ --sd-inherit-cs-layout-r: var(--cs-layout-r, var(--layout-r, 8));
35
+
36
+ grid-template-columns: repeat(var(--cs-layout-c, 4), minmax(0px, 1fr));
37
+ grid-template-rows: repeat(var(--cs-layout-r, 8), minmax(0px, 1fr));
38
+
39
+ //
40
+ & > :where(.ui-ws-item, [data-launcher-item]) {
41
+ @include compute_grid_item_cell();
42
+ --f-col: clamp(1, var(--sd-inherit-layout-c, var(--layout-c, 4)), 16);
43
+ --f-row: clamp(1, var(--sd-inherit-layout-r, var(--layout-r, 8)), 16);
44
+ pointer-events: auto;
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,28 @@
1
+ @use "./layout" as layout;
2
+
3
+ //
4
+ @mixin table-base {
5
+ inline-size: stretch;
6
+ border-collapse: collapse;
7
+ border-radius: var(--radius-md);
8
+ overflow: hidden;
9
+ box-shadow: var(--shadow-md);
10
+ }
11
+
12
+ //
13
+ @mixin table-header {
14
+ background-color: var(--gradient-primary);
15
+ color: var(--text-light);
16
+ padding: var(--space-md) var(--space-sm);
17
+ text-align: start;
18
+ font-weight: var(--font-weight-semibold);
19
+ font-size: var(--font-size-sm);
20
+ white-space: nowrap;
21
+ }
22
+
23
+ //
24
+ @mixin table-cell {
25
+ padding: var(--space-sm);
26
+ border-block-end: 1px solid var(--bg-tertiary);
27
+ vertical-align: middle;
28
+ }