@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,362 @@
1
+ // File Manager content grid styles (basic variant)
2
+
3
+ //
4
+ @layer ux-file-manager-content {
5
+ /* Tighter actions track + explicit parent columns so subgrid rows align with the header */
6
+ $row-grid: [icon] minmax(0px, 2.5rem) [name] minmax(0px, 1fr) [size] minmax(4.5rem, 6rem) [date] minmax(0px, 7.5rem) [actions] minmax(6.75rem, max-content);
7
+ $row-grid-mobile: [icon] minmax(0px, 2.5rem) [name] minmax(0px, 1fr) [size] minmax(4.5rem, 6rem) [date] minmax(0px, 0px) [actions] minmax(6.75rem, max-content);
8
+
9
+ :host(ui-file-manager-content) {
10
+ &, :where(*) {
11
+ overflow: hidden;
12
+ scrollbar-width: none;
13
+ scrollbar-color: transparent transparent;
14
+ scrollbar-gutter: auto;
15
+ }
16
+
17
+ & {
18
+ perspective: 1000;
19
+ display: flex;
20
+ flex-direction: column;
21
+ flex: 1 1 auto;
22
+ inline-size: 100%;
23
+ block-size: 100%;
24
+ min-inline-size: 0;
25
+ min-block-size: 0;
26
+ overflow: hidden;
27
+ scrollbar-width: none;
28
+ scrollbar-color: transparent transparent;
29
+ scrollbar-gutter: auto;
30
+ grid-column: 1 / -1;
31
+ z-index: 1;
32
+ position: relative;
33
+ contain: none;
34
+ isolation: isolate;
35
+ container-type: size;
36
+
37
+ touch-action: manipulation;
38
+ pointer-events: auto;
39
+ border-radius: 0;
40
+ margin: 0;
41
+
42
+ background-color: var(--color-surface);
43
+ color: var(--color-on-surface);
44
+
45
+ outline: none 0px transparent;
46
+ border: none 0px transparent;
47
+ }
48
+
49
+ /* Grid with subgrid columns */
50
+ .fm-grid {
51
+ display: grid;
52
+ grid-template-columns: #{$row-grid};
53
+ grid-template-rows: auto minmax(0, 1fr);
54
+ row-gap: 0;
55
+ align-content: start;
56
+ inline-size: stretch;
57
+ min-inline-size: 0;
58
+ min-block-size: 0;
59
+ block-size: 100%;
60
+ flex: 1 1 auto;
61
+ overflow: hidden;
62
+ scrollbar-width: none;
63
+ scrollbar-color: transparent transparent;
64
+ scrollbar-gutter: auto;
65
+
66
+ touch-action: manipulation;
67
+ pointer-events: none;
68
+ outline: none 0px transparent;
69
+ border: none 0px transparent;
70
+
71
+ @container (inline-size <= 600px) {
72
+ grid-template-columns: #{$row-grid-mobile};
73
+ }
74
+ }
75
+
76
+ .fm-grid-rows {
77
+ display: grid;
78
+ grid-template-columns: subgrid;
79
+ grid-auto-rows: 2.625rem;
80
+ grid-column: 1 / -1;
81
+ align-content: start;
82
+
83
+ gap: 0.25rem;
84
+ overflow: auto;
85
+ scrollbar-gutter: stable;
86
+ min-block-size: 0;
87
+
88
+ scrollbar-width: thin;
89
+ scrollbar-color: color-mix(in oklab, var(--color-on-surface) 22%, transparent) transparent;
90
+
91
+ inline-size: 100%;
92
+ block-size: 100%;
93
+ min-inline-size: 0;
94
+ z-index: 1;
95
+
96
+ content-visibility: visible;
97
+ contain-intrinsic-size: 1px 2.625rem;
98
+ contain: none;
99
+
100
+ //
101
+ touch-action: manipulation;
102
+ pointer-events: auto;
103
+
104
+ //
105
+ slot { display: contents !important; }
106
+ }
107
+
108
+ :where(.row) {
109
+ background-color: color-mix(in oklab, var(--color-on-surface, #fff) 3%, transparent);
110
+ color: var(--color-on-surface);
111
+
112
+ display: grid;
113
+ grid-template-rows: minmax(0, 2.625rem) !important;
114
+ grid-column: 1 / -1;
115
+ order: var(--order, 1) !important;
116
+ min-block-size: 0;
117
+
118
+ inline-size: stretch;
119
+ place-content: center;
120
+ place-items: center;
121
+ place-self: stretch;
122
+ justify-items: start;
123
+ padding: 0 0.65rem;
124
+ border-radius: 0.625rem;
125
+ border: none;
126
+ cursor: pointer;
127
+ pointer-events: auto;
128
+ touch-action: manipulation;
129
+ block-size: 2.625rem;
130
+ user-drag: none;
131
+ -webkit-user-drag: none;
132
+
133
+ text-align: start;
134
+ text-wrap: nowrap;
135
+ text-overflow: ellipsis;
136
+ white-space: nowrap;
137
+ letter-spacing: normal;
138
+ overflow: hidden;
139
+ gap: 0.35rem;
140
+ flex-wrap: nowrap;
141
+
142
+ // no draggable available on mobile (touch devices currently)
143
+ @media (hover: hover) and (pointer: fine) {
144
+ user-drag: element;
145
+ -webkit-user-drag: element;
146
+ }
147
+
148
+ ui-icon {
149
+ inline-size: 1.25rem;
150
+ block-size: 1.25rem;
151
+ flex-shrink: 0;
152
+ place-content: center;
153
+ place-items: center;
154
+ }
155
+
156
+ a, span {
157
+ background-color: transparent !important;
158
+ }
159
+
160
+ & > * {
161
+ background-color: transparent !important;
162
+ min-block-size: 0;
163
+ block-size: auto;
164
+ }
165
+ }
166
+
167
+ .row {
168
+ &:hover {
169
+ background-color: color-mix(in oklab, var(--color-on-surface) 8%, transparent);
170
+ }
171
+ &:active {
172
+ background-color: color-mix(in oklab, var(--color-on-surface) 11%, transparent);
173
+ }
174
+ &:focus-visible {
175
+ outline: 2px solid var(--color-primary, #3794ff);
176
+ outline-offset: -2px;
177
+ }
178
+ }
179
+
180
+ .c {
181
+ min-inline-size: 0;
182
+ display: flex;
183
+ flex-direction: row;
184
+ text-align: start;
185
+ text-wrap: nowrap;
186
+ text-overflow: ellipsis;
187
+ white-space: nowrap;
188
+ overflow: hidden;
189
+ inline-size: auto;
190
+ place-content: center;
191
+ place-items: center;
192
+ justify-content: start;
193
+ color: inherit;
194
+ min-block-size: 0;
195
+ block-size: auto;
196
+ }
197
+
198
+ .icon { grid-column: icon; place-content: center; place-items: center; }
199
+ .name { grid-column: name; inline-size: stretch; }
200
+ .size {
201
+ grid-column: size;
202
+ justify-content: end;
203
+ text-align: end;
204
+ }
205
+ .date {
206
+ grid-column: date;
207
+ justify-content: end;
208
+ text-align: end;
209
+ }
210
+ .actions { grid-column: actions; }
211
+
212
+ .row, ::slotted(.row), .fm-grid, .fm-grid-header {
213
+ grid-template-columns: #{$row-grid};
214
+ }
215
+
216
+ @container(inline-size <= 600px) {
217
+ .row, ::slotted(.row), .fm-grid, .fm-grid-header { grid-template-columns: #{$row-grid-mobile}; }
218
+ .date { display: none !important; }
219
+ }
220
+
221
+ //
222
+ .actions {
223
+ background-color: color-mix(in oklab, var(--color-on-surface, #fff) 5%, transparent);
224
+ color: var(--color-on-surface);
225
+
226
+ pointer-events: none;
227
+ padding: 0.2rem;
228
+ max-inline-size: stretch;
229
+ border-radius: 999px;
230
+ border: none;
231
+
232
+ display: flex;
233
+ flex-direction: row;
234
+ flex-wrap: nowrap;
235
+ place-content: center;
236
+ place-items: center;
237
+ place-self: center;
238
+ justify-content: flex-end;
239
+ justify-self: end;
240
+ inline-size: max-content;
241
+ block-size: 2.125rem;
242
+ gap: 0.15rem;
243
+ overflow: visible;
244
+ }
245
+
246
+ .action-btn {
247
+ background-color: transparent;
248
+ color: var(--color-on-surface);
249
+
250
+ pointer-events: auto;
251
+ appearance: none;
252
+ border: none;
253
+ padding: 0;
254
+ border-radius: 999px;
255
+ cursor: pointer;
256
+ inline-size: 1.85rem;
257
+ block-size: 1.85rem;
258
+ min-inline-size: 1.85rem;
259
+ min-block-size: 1.85rem;
260
+ flex-shrink: 0;
261
+ aspect-ratio: 1;
262
+ display: inline-flex;
263
+ place-content: center;
264
+ place-items: center;
265
+ transition: background 0.14s ease, transform 0.1s ease;
266
+ position: relative;
267
+ overflow: hidden;
268
+ box-shadow: none;
269
+
270
+ &:hover {
271
+ background-color: color-mix(in oklab, var(--color-on-surface) 12%, transparent);
272
+ }
273
+
274
+ &:active {
275
+ transform: scale(0.94);
276
+ }
277
+
278
+ &:focus-visible {
279
+ outline: 2px solid color-mix(in oklab, var(--color-primary, #3794ff) 55%, transparent);
280
+ outline-offset: 1px;
281
+ }
282
+
283
+ ui-icon {
284
+ inline-size: 1.0625rem;
285
+ block-size: 1.0625rem;
286
+ min-inline-size: 1.0625rem;
287
+ min-block-size: 1.0625rem;
288
+ }
289
+ }
290
+
291
+ .fm-grid-header {
292
+ position: sticky !important;
293
+ display: grid;
294
+ grid-column: 1 / -1;
295
+ inset-block-start: 0;
296
+ z-index: 8;
297
+ padding: 0.4rem 0.65rem;
298
+ border-radius: 0;
299
+ border: none;
300
+ box-shadow: 0 1px 0 color-mix(in oklab, var(--color-on-surface, #fff) 6%, transparent);
301
+ background: color-mix(in oklab, var(--color-on-surface, #fff) 3.5%, transparent);
302
+ font-size: 0.6875rem;
303
+ font-weight: 600;
304
+ letter-spacing: 0.04em;
305
+ text-transform: uppercase;
306
+ color: var(--color-on-surface-variant);
307
+ opacity: 1;
308
+ gap: 0.35rem;
309
+ min-block-size: 2rem;
310
+
311
+ place-content: center;
312
+ place-items: center;
313
+ justify-content: start;
314
+ justify-items: start;
315
+ text-align: start;
316
+
317
+ touch-action: manipulation;
318
+ pointer-events: auto;
319
+
320
+ & > * { inline-size: auto; }
321
+
322
+ .c { font-weight: 600; }
323
+ .icon { grid-column: icon; }
324
+ .name { grid-column: name; inline-size: stretch; }
325
+ .size {
326
+ grid-column: size;
327
+ justify-content: end;
328
+ text-align: end;
329
+ }
330
+ .date {
331
+ grid-column: date;
332
+ justify-content: end;
333
+ text-align: end;
334
+ }
335
+ .actions {
336
+ grid-column: actions;
337
+ inline-size: stretch;
338
+ block-size: fit-content;
339
+ box-shadow: none;
340
+ padding: 0;
341
+ max-inline-size: stretch;
342
+ border-radius: 0;
343
+ display: flex;
344
+ flex-direction: row;
345
+ flex-wrap: nowrap;
346
+ place-content: center;
347
+ place-items: center;
348
+ text-wrap: nowrap;
349
+ text-overflow: ellipsis;
350
+ white-space: nowrap;
351
+ overflow: hidden;
352
+ gap: 0.25rem;
353
+
354
+ justify-content: flex-end;
355
+ justify-items: end;
356
+ justify-self: end;
357
+ text-align: end;
358
+ }
359
+ }
360
+
361
+ }
362
+ }
@@ -0,0 +1,237 @@
1
+ // File Manager shell styles (basic variant)
2
+
3
+ //
4
+ @layer ux-file-manager {
5
+
6
+ :host(ui-file-manager) {
7
+ &, :where(*) {
8
+ box-sizing: border-box;
9
+ user-select: none;
10
+ -webkit-tap-highlight-color: transparent;
11
+ }
12
+
13
+ & {
14
+ perspective: 1000;
15
+ container-type: inline-size;
16
+ display: flex;
17
+ flex-direction: column;
18
+ flex: 1 1 auto;
19
+ inline-size: 100%;
20
+ block-size: 100%;
21
+ min-block-size: 0;
22
+ min-inline-size: 0;
23
+ /* WHY: Avoid skipped list painting under transformed frame ancestors. */
24
+ content-visibility: visible;
25
+ border-radius: 0;
26
+ overflow: hidden;
27
+ margin: 0;
28
+ line-height: normal;
29
+ max-block-size: none;
30
+ max-inline-size: none;
31
+
32
+ background-color: var(--color-surface);
33
+ color: var(--color-on-surface);
34
+ }
35
+
36
+ .fm-root {
37
+ gap: 0;
38
+ display: grid;
39
+ grid-template-columns: [content-col] minmax(0px, 1fr);
40
+ grid-template-rows: auto minmax(0px, 1fr);
41
+ inline-size: 100%;
42
+ block-size: 100%;
43
+ min-inline-size: 0;
44
+ min-block-size: 0;
45
+ flex: 1 1 auto;
46
+ overflow: hidden;
47
+ }
48
+
49
+ .fm-toolbar {
50
+ grid-column: 1 / -1;
51
+ display: grid;
52
+ grid-template-columns: minmax(0px, max-content) minmax(0px, 1fr) minmax(0px, max-content);
53
+ grid-template-rows: minmax(0px, 1fr);
54
+ grid-auto-flow: column;
55
+ place-content: center;
56
+ place-items: center;
57
+ gap: 0.625rem;
58
+ border-radius: 0;
59
+ padding: 0.5rem 0.75rem;
60
+ line-height: normal;
61
+ background: var(--color-surface, #1e1e1e);
62
+ box-shadow: 0 1px 0 color-mix(in oklab, var(--color-on-surface, #fff) 6%, transparent);
63
+
64
+ button, input {
65
+ background-color: transparent;
66
+ color: var(--color-on-surface);
67
+ }
68
+
69
+ input {
70
+ inline-size: stretch;
71
+ block-size: stretch;
72
+ border: none;
73
+ outline: none;
74
+ padding: 0.45rem 0.85rem;
75
+ overflow: auto;
76
+ border-radius: 999px;
77
+ font: 0.8125rem/1.35 ui-monospace, "Cascadia Code", "SF Mono", Consolas, monospace;
78
+ background: color-mix(in oklab, var(--color-on-surface, #fff) 6%, transparent);
79
+ }
80
+
81
+ input:focus-visible {
82
+ box-shadow: 0 0 0 2px color-mix(in oklab, var(--color-primary, #3794ff) 45%, transparent);
83
+ }
84
+
85
+ .btn {
86
+ transition: background 0.14s ease, transform 0.1s ease;
87
+ appearance: none;
88
+ border: 0;
89
+ padding: 0;
90
+ border-radius: 999px;
91
+ cursor: pointer;
92
+ inline-size: 2.5rem;
93
+ block-size: 2.5rem;
94
+ aspect-ratio: 1 / 1;
95
+ display: inline-flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ background: transparent;
99
+
100
+ ui-icon {
101
+ inline-size: 1.25rem;
102
+ block-size: 1.25rem;
103
+ flex-shrink: 0;
104
+ }
105
+ }
106
+
107
+ .btn:hover {
108
+ background: color-mix(in oklab, var(--color-on-surface) 9%, transparent);
109
+ }
110
+
111
+ .btn:active {
112
+ transform: scale(0.96);
113
+ }
114
+
115
+ .btn:focus-visible {
116
+ outline: 2px solid color-mix(in oklab, var(--color-primary, #3794ff) 55%, transparent);
117
+ outline-offset: 1px;
118
+ }
119
+
120
+ & > * {
121
+ display: flex;
122
+ flex-direction: row;
123
+ flex-wrap: nowrap;
124
+ gap: 0.2rem;
125
+ block-size: fit-content;
126
+ min-block-size: stretch;
127
+ align-items: center;
128
+ }
129
+
130
+ & .fm-toolbar-left {
131
+ grid-column: 1;
132
+ }
133
+
134
+ & .fm-toolbar-left,
135
+ & .fm-toolbar-right {
136
+ padding: 0.2rem;
137
+ border-radius: 999px;
138
+ background: color-mix(in oklab, var(--color-on-surface, #fff) 5.5%, transparent);
139
+ }
140
+
141
+ & .fm-toolbar-center {
142
+ grid-column: 2;
143
+ flex-grow: 1;
144
+ inline-size: stretch;
145
+ block-size: fit-content;
146
+ min-block-size: 2.5rem;
147
+ border-radius: 999px;
148
+ padding: 0;
149
+ overflow: hidden;
150
+ place-content: stretch;
151
+ place-items: stretch;
152
+ justify-content: start;
153
+ background: color-mix(in oklab, var(--color-on-surface, #fff) 5.5%, transparent);
154
+
155
+ & > * {
156
+ inline-size: stretch;
157
+ block-size: stretch;
158
+ }
159
+
160
+ & input {
161
+ padding-inline: 0.9rem;
162
+ inline-size: stretch;
163
+ background: transparent;
164
+ }
165
+ }
166
+
167
+ & .fm-toolbar-right { grid-column: 3; }
168
+ }
169
+
170
+ .fm-sidebar {
171
+ grid-row: 2;
172
+ grid-column: sidebar-col;
173
+ align-content: start;
174
+ gap: 0.5rem;
175
+ padding: 0.5rem;
176
+ border-radius: 0.5rem;
177
+ line-height: normal;
178
+ justify-content: start;
179
+ justify-items: start;
180
+ text-align: start;
181
+ display: none;
182
+
183
+ .sec {
184
+ display: grid;
185
+ gap: 0.25rem;
186
+ place-content: start;
187
+ place-items: start;
188
+ justify-content: start;
189
+ justify-items: start;
190
+ }
191
+ .sec-title {
192
+ font-weight: 600;
193
+ opacity: 0.8;
194
+ padding-block: 0.25rem;
195
+ place-self: start;
196
+ }
197
+ .link {
198
+ text-align: start;
199
+ appearance: none;
200
+ border: 0;
201
+ padding: 0.25rem 0.375rem;
202
+ border-radius: 0.375rem;
203
+ cursor: pointer;
204
+ line-height: normal;
205
+ }
206
+ }
207
+
208
+ .fm-content {
209
+ grid-row: 2;
210
+ grid-column: content-col;
211
+ display: flex;
212
+ flex-direction: column;
213
+ inline-size: 100%;
214
+ block-size: 100%;
215
+ min-inline-size: 0;
216
+ min-block-size: 0;
217
+ flex: 1 1 auto;
218
+ overflow: hidden;
219
+ border-radius: 0;
220
+ padding: 0 0.35rem 0.45rem;
221
+
222
+ scrollbar-width: thin;
223
+ scrollbar-color: color-mix(in oklab, var(--color-on-surface) 22%, transparent) transparent;
224
+ }
225
+
226
+ .status { padding: 0.5rem; opacity: 0.8; }
227
+ .status.error { color: var(--error-color, crimson); }
228
+
229
+ @container (inline-size < 520px) {
230
+ .fm-content { grid-column: 1 / -1; }
231
+ .fm-root { grid-column: 1 / -1; }
232
+ .fm-grid { grid-column: 1 / -1; }
233
+ .fm-root[data-with-sidebar="true"] { grid-template-columns: [content-col] minmax(0px, 1fr); }
234
+ .fm-sidebar { display: none !important; }
235
+ }
236
+ }
237
+ }
@@ -0,0 +1,25 @@
1
+ // Host-wide bare form controls (opt-in only; keep out of default fl-ui document scope).
2
+ @mixin emit-bare-form-element-layer() {
3
+ @layer layer.shell.faint.forms {
4
+ input,
5
+ select,
6
+ textarea {
7
+ & {
8
+ background-repeat: no-repeat;
9
+ min-block-size: 2.5rem;
10
+ font-size: inherit;
11
+ max-inline-size: stretch;
12
+ max-inline-size: 100cqi;
13
+
14
+ text-overflow: ellipsis;
15
+ overflow: auto;
16
+ scrollbar-width: none;
17
+ }
18
+ }
19
+
20
+ textarea[data-multiline="true"] {
21
+ min-block-size: 5rem;
22
+ resize: vertical;
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ // Compile-time flags for `_forms.scss` (must live in a dedicated module for `@use` ordering).
2
+ $include-bare-form-element-rules: false !default;