@fest-lib/veela 0.1.20 → 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.
- package/dist/veela.js +4 -33
- package/package.json +9 -2
- package/src/scss/_layers.scss +5 -34
- package/src/scss/basic/{misc/_core-layout.scss → _core-layout.scss} +1 -1
- package/src/scss/basic/_layers.scss +1 -0
- package/src/scss/basic/{misc/_layout.scss → _layout.scss} +15 -15
- package/src/scss/basic/{misc/_normalize.scss → _normalize.scss} +5 -103
- package/src/scss/basic/{misc/_states.scss → _states.scss} +2 -2
- package/src/scss/{core/misc → basic}/_utilities.scss +4 -4
- package/src/scss/basic/design/_keyframes.scss +1 -1
- package/src/scss/basic/design/_shapes.scss +1 -1
- package/src/scss/basic/index.scss +14 -16
- package/src/scss/chrome.scss +2 -0
- package/src/scss/core/_color-mod.scss +24 -0
- package/src/scss/core/{misc/_color-properties.scss → _color-properties.scss} +1 -1
- package/src/scss/core/{misc/_tokens.scss → _tokens.scss} +10 -93
- package/src/scss/core/index.scss +13 -1
- package/src/scss/index.scss +7 -2
- package/src/scss/index.ts +1 -1
- package/src/scss/{core/interact → interact}/_viewport.scss +1 -1
- package/src/scss/interact/index.scss +18 -0
- package/src/scss/theme/_effects.scss +60 -0
- package/src/scss/theme/index.scss +8 -0
- package/src/scss/{advanced/index.ts → theme/loader.ts} +3 -4
- package/src/scss/ui/_bar.scss +268 -0
- package/src/scss/ui/_buttons.scss +215 -0
- package/src/scss/ui/_chrome-mixins.scss +104 -0
- package/src/scss/ui/_color.scss +3 -0
- package/src/scss/ui/_colorize.scss +5 -0
- package/src/scss/{advanced/layout → ui}/_content.scss +0 -1
- package/src/scss/ui/_core-layout.scss +4 -0
- package/src/scss/ui/_essentials-options.scss +2 -0
- package/src/scss/ui/_essentials.scss +707 -0
- package/src/scss/ui/_explorer-content.scss +417 -0
- package/src/scss/ui/_explorer.scss +274 -0
- package/src/scss/ui/_forms-bare-host-elements.scss +25 -0
- package/src/scss/ui/_forms-options.scss +2 -0
- package/src/scss/ui/_forms.scss +279 -0
- package/src/scss/ui/_forms_misc.scss +201 -0
- package/src/scss/ui/_gridbox.scss +298 -0
- package/src/scss/ui/_home-host.scss +192 -0
- package/src/scss/ui/_index.scss +23 -0
- package/src/scss/ui/_launcher-typography.scss +31 -0
- package/src/scss/ui/_layers.scss +48 -0
- package/src/scss/ui/_layout.scss +3 -0
- package/src/scss/ui/_markdown.scss +1634 -0
- package/src/scss/ui/_modal.scss +309 -0
- package/src/scss/ui/_motion.scss +3 -0
- package/src/scss/ui/_native-host-button-chrome.scss +31 -0
- package/src/scss/ui/_normalize.scss +5 -0
- package/src/scss/ui/_orientation-functions.scss +273 -0
- package/src/scss/ui/_orientbox.scss +97 -0
- package/src/scss/ui/_scrollbar.scss +257 -0
- package/src/scss/ui/_shared-overlays.scss +16 -0
- package/src/scss/ui/_shared.scss +4 -0
- package/src/scss/ui/_sidebar.scss +478 -0
- package/src/scss/ui/_speed-dial.scss +47 -0
- package/src/scss/ui/_states.scss +4 -0
- package/src/scss/ui/_tables.scss +28 -0
- package/src/scss/ui/_tabs.scss +405 -0
- package/src/scss/ui/_taskbar.scss +215 -0
- package/src/scss/ui/_toolbars.scss +167 -0
- package/src/scss/ui/_typography.scss +11 -0
- package/src/scss/ui/_utils.scss +8 -0
- package/src/scss/ui/_viewport.scss +470 -0
- package/src/scss/ui/_window-frame.scss +658 -0
- package/src/scss/ui/components/app-menu.scss +817 -0
- package/src/scss/ui/components/appearance-desktop.scss +14 -0
- package/src/scss/ui/components/appearance-mobile.scss +14 -0
- package/src/scss/ui/components/calendar/flyout.scss +194 -0
- package/src/scss/ui/components/calendar/index.scss +627 -0
- package/src/scss/ui/components/explorer-settings.scss +232 -0
- package/src/scss/ui/components/file-manager-content.scss +2 -0
- package/src/scss/ui/components/file-manager.scss +2 -0
- package/src/scss/ui/components/launcher-icon-mask.scss +34 -0
- package/src/scss/ui/components/navbar.scss +133 -0
- package/src/scss/ui/components/quick-settings.scss +321 -0
- package/src/scss/ui/components/scrollframe.scss +58 -0
- package/src/scss/ui/components/slider.scss +188 -0
- package/src/scss/ui/components/speed-dial.scss +2288 -0
- package/src/scss/ui/components/statusbar.scss +255 -0
- package/src/scss/ui/components/task.scss +118 -0
- package/src/scss/ui/components/taskbar.scss +514 -0
- package/src/scss/ui/components/text.scss +241 -0
- package/src/scss/ui/components/window.scss +601 -0
- package/src/scss/ui/home-host-apply.scss +10 -0
- package/src/scss/ui/index.scss +7 -0
- package/src/scss/ui/native-controls.scss +17 -0
- package/src/scss/advanced/_index.scss +0 -0
- package/src/scss/advanced/animation/_motion.scss +0 -323
- package/src/scss/advanced/color/_color.scss +0 -328
- package/src/scss/advanced/color/_colorize.scss +0 -325
- package/src/scss/advanced/design/_design-tokens.scss +0 -118
- package/src/scss/advanced/design/_effects.scss +0 -275
- package/src/scss/advanced/design/_shadow.scss +0 -359
- package/src/scss/advanced/design/_surfaces.scss +0 -76
- package/src/scss/advanced/effects/_animations.scss +0 -124
- package/src/scss/advanced/effects/_shadows.scss +0 -50
- package/src/scss/advanced/font/_typography.scss +0 -601
- package/src/scss/advanced/index.scss +0 -11
- package/src/scss/advanced/layout/_index.scss +0 -5
- package/src/scss/advanced/layout/_normalize.scss +0 -543
- package/src/scss/advanced/layout/_shared-overlays.scss +0 -162
- package/src/scss/advanced/md3/_md3.scss +0 -506
- package/src/scss/advanced/md3/_utils.scss +0 -114
- package/src/scss/advanced/misc/_config.scss +0 -119
- package/src/scss/advanced/misc/_initials.scss +0 -298
- package/src/scss/advanced/misc/_mixins.scss +0 -179
- package/src/scss/advanced/misc/_rendering.scss +0 -82
- package/src/scss/advanced/misc/_tokens.scss +0 -74
- package/src/scss/advanced/theme/_shared.scss +0 -232
- package/src/scss/advanced/theme/_states.scss +0 -332
- package/src/scss/advanced/theme/_variants.scss +0 -354
- package/src/scss/advanced/tokens/_material-color.scss +0 -120
- package/src/scss/advanced/tokens/_variables.scss +0 -171
- package/src/scss/basic/misc/_index.scss +0 -18
- package/src/scss/basic/misc/_mixins.scss +0 -179
- package/src/scss/basic/misc/_queries.scss +0 -34
- package/src/scss/basic/misc/_tokens.scss +0 -78
- package/src/scss/basic/misc/_veela.scss +0 -12
- package/src/scss/core/misc/_index.scss +0 -6
- /package/src/scss/basic/{misc/_motion.scss → _motion.scss} +0 -0
- /package/src/scss/{advanced/misc → basic}/_queries.scss +0 -0
- /package/src/scss/basic/{misc/_shared.scss → _shared.scss} +0 -0
- /package/src/scss/core/{misc/_config.scss → _config.scss} +0 -0
- /package/src/scss/core/{misc/_functions.scss → _functions.scss} +0 -0
- /package/src/scss/core/{misc/_icons.scss → _icons.scss} +0 -0
- /package/src/scss/core/{misc/_layout.scss → _layout.scss} +0 -0
- /package/src/scss/core/{misc/_mixins.scss → _mixins.scss} +0 -0
- /package/src/scss/core/{misc/_properties.scss → _properties.scss} +0 -0
- /package/src/scss/core/{misc/_utils.scss → _utils.scss} +0 -0
- /package/src/scss/{core/interact → interact}/_draggable.scss +0 -0
- /package/src/scss/{core/interact → interact}/_position.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-anchor.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-centered.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-cursor.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-draggable.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-mechanic.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-properties.scss +0 -0
- /package/src/scss/{core/interact → interact}/_ps-resizable.scss +0 -0
- /package/src/scss/{core/interact → interact}/_resizable.scss +0 -0
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Filename: window.scss
|
|
3
|
+
* FullPath: modules/projects/veela.css/src/scss/ui/components/window.scss
|
|
4
|
+
* Change date and time: 23.09.20_23.08.2026
|
|
5
|
+
* Reason for changes: Empty footer-handler collapsed — slot child broke :empty / :has-slotted.
|
|
6
|
+
* FIND:win-footer
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/* Shadow sheets import the canonical color function definition. */
|
|
10
|
+
@use "../../core/color-mod";
|
|
11
|
+
|
|
12
|
+
@layer components {
|
|
13
|
+
:host(ui-window) {
|
|
14
|
+
/* Tokens — light defaults via light-dark(); dark flips with color-scheme / data-theme */
|
|
15
|
+
--ui-win-radius: var(--radius-lg, 0.75rem);
|
|
16
|
+
--ui-win-titlebar-height: 2.5rem;
|
|
17
|
+
--ui-win-footer-min: 2.25rem;
|
|
18
|
+
--ui-win-control-size: 1.75rem;
|
|
19
|
+
--ui-win-icon-size: var(--ui-window-icon-size, 0.95rem);
|
|
20
|
+
--ui-win-gap: 0.5rem;
|
|
21
|
+
--ui-win-pad-inline: 0.75rem;
|
|
22
|
+
--ui-win-pad-block: 0.65rem;
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* Prefer document `--color-*` (concrete under data-theme) so Light/Dark pins win.
|
|
26
|
+
* light-dark() kept only as last-resort when veela tokens are absent.
|
|
27
|
+
*/
|
|
28
|
+
--ui-win-seed: var(--base-color, var(--color-primary, #5a9ec8));
|
|
29
|
+
--ui-win-bg: var(--color-surface, light-dark(
|
|
30
|
+
--u2-color-mod(var(--ui-win-seed), 70),
|
|
31
|
+
--u2-color-mod(var(--ui-win-seed), 930)
|
|
32
|
+
));
|
|
33
|
+
--ui-win-fg: var(--color-on-surface, light-dark(
|
|
34
|
+
--u2-color-mod(var(--ui-win-seed), 900),
|
|
35
|
+
--u2-color-mod(var(--ui-win-seed), 100)
|
|
36
|
+
));
|
|
37
|
+
--ui-win-muted: var(--color-on-surface-variant, light-dark(
|
|
38
|
+
--u2-color-mod(var(--ui-win-seed), 700),
|
|
39
|
+
--u2-color-mod(var(--ui-win-seed), 280)
|
|
40
|
+
));
|
|
41
|
+
--ui-win-border: color-mix(in oklab, var(--ui-win-fg) 12%, transparent);
|
|
42
|
+
--ui-win-titlebar-bg: var(--color-surface-container, light-dark(
|
|
43
|
+
--u2-color-mod(var(--ui-win-seed), 40),
|
|
44
|
+
--u2-color-mod(var(--ui-win-seed), 960)
|
|
45
|
+
));
|
|
46
|
+
--ui-win-content-bg: var(--color-surface-container-lowest, light-dark(
|
|
47
|
+
--u2-color-mod(var(--ui-win-seed), 40),
|
|
48
|
+
--u2-color-mod(var(--ui-win-seed), 950)
|
|
49
|
+
));
|
|
50
|
+
--ui-win-footer-bg: var(--color-surface-container-low, light-dark(
|
|
51
|
+
--u2-color-mod(var(--ui-win-seed), 120),
|
|
52
|
+
--u2-color-mod(var(--ui-win-seed), 900)
|
|
53
|
+
));
|
|
54
|
+
--ui-win-shadow:
|
|
55
|
+
light-dark(
|
|
56
|
+
0 18px 40px -18px rgb(15 23 42 / 0.28),
|
|
57
|
+
0 22px 48px -16px rgb(0 0 0 / 0.55)
|
|
58
|
+
);
|
|
59
|
+
/* WHY: transparent idle so controls share the solid titlebar fill (no “chip strip”). */
|
|
60
|
+
--ui-win-control-bg: transparent;
|
|
61
|
+
--ui-win-control-bg-hover: color-mix(in oklab, var(--ui-win-fg) 14%, transparent);
|
|
62
|
+
--ui-win-control-fg: var(--ui-win-fg);
|
|
63
|
+
--ui-win-close-bg: transparent;
|
|
64
|
+
--ui-win-close-bg-hover: light-dark(
|
|
65
|
+
--u2-color-mod(#ef4444, 550),
|
|
66
|
+
--u2-color-mod(#ef4444, 480)
|
|
67
|
+
);
|
|
68
|
+
--ui-win-close-fg: var(--ui-win-fg);
|
|
69
|
+
--ui-win-close-fg-hover: --u2-color-mod(var(--ui-win-seed), 40);
|
|
70
|
+
--icon-color: var(--ui-win-fg);
|
|
71
|
+
/* WHY: do not set --icon-size on the host — it inherits into Explorer/viewer
|
|
72
|
+
* and shrinks list + toolbar glyphs to titlebar chrome size (0.95rem). */
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
* WHY: `light dark` made window chrome follow OS while Settings locked light — cream panel
|
|
76
|
+
* + dark-scheme fg. Inherit document/app scheme; explicit data-theme still wins below.
|
|
77
|
+
*/
|
|
78
|
+
color-scheme: inherit;
|
|
79
|
+
box-sizing: border-box;
|
|
80
|
+
/* WHY: Prefer :host display over setting style attr in CE lifecycle (createElement rules). */
|
|
81
|
+
display: block;
|
|
82
|
+
position: relative;
|
|
83
|
+
inline-size: var(--ui-win-width, min(32rem, 92vw));
|
|
84
|
+
block-size: var(--ui-win-height, min(22rem, 70vh));
|
|
85
|
+
min-inline-size: 16rem;
|
|
86
|
+
min-block-size: 10rem;
|
|
87
|
+
color: var(--ui-win-fg);
|
|
88
|
+
font-family: "InterVariable", "Inter", "Segoe UI", ui-sans-serif, system-ui, sans-serif;
|
|
89
|
+
font-size: 0.875rem;
|
|
90
|
+
line-height: 1.35;
|
|
91
|
+
border-radius: var(--ui-win-radius);
|
|
92
|
+
overflow: hidden;
|
|
93
|
+
box-shadow: var(--ui-win-shadow);
|
|
94
|
+
isolation: isolate;
|
|
95
|
+
contain: layout paint style;
|
|
96
|
+
container-type: inline-size;
|
|
97
|
+
container-name: ui-window;
|
|
98
|
+
|
|
99
|
+
&,
|
|
100
|
+
*,
|
|
101
|
+
*::before,
|
|
102
|
+
*::after {
|
|
103
|
+
box-sizing: border-box;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* WHY: footer always contains <slot>, so :empty / :has-slotted never hid the slab. */
|
|
107
|
+
.footer-handler[data-empty],
|
|
108
|
+
.footer-handler[hidden] {
|
|
109
|
+
display: none !important;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Explicit theme overrides (playground / app shell) */
|
|
114
|
+
:host(ui-window[data-theme="light"]),
|
|
115
|
+
:host(ui-window.theme-light) {
|
|
116
|
+
color-scheme: light;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
:host(ui-window[data-theme="dark"]),
|
|
120
|
+
:host(ui-window.theme-dark) {
|
|
121
|
+
color-scheme: dark;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
:host(ui-window[managed]) {
|
|
125
|
+
position: absolute;
|
|
126
|
+
/* WHY: environment-shell owns geometry via inline left/top/width/height. */
|
|
127
|
+
transform: none !important;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* WHY: Focused window gets a slightly stronger edge so z-order changes are visible. */
|
|
131
|
+
:host(ui-window[managed][data-focused]) {
|
|
132
|
+
box-shadow:
|
|
133
|
+
var(--ui-win-shadow),
|
|
134
|
+
0 0 0 1px color-mix(in oklab, var(--ui-win-fg) 22%, transparent);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/*
|
|
138
|
+
* WHY: CWSP views own their chrome padding; default ui-window pad crushed toolbars into overlaps.
|
|
139
|
+
* INVARIANT: `native-mode` / `data-native-active` need the same flex fill as `managed`, otherwise
|
|
140
|
+
* slotted Explorer (`.view-explorer` → `ui-file-manager`) collapses to toolbar-only height.
|
|
141
|
+
*/
|
|
142
|
+
:host(ui-window[managed]) .content-handler,
|
|
143
|
+
:host(ui-window[native-mode]) .content-handler,
|
|
144
|
+
:host(ui-window[data-native-active]) .content-handler {
|
|
145
|
+
padding: 0;
|
|
146
|
+
overflow: hidden;
|
|
147
|
+
display: flex;
|
|
148
|
+
flex-direction: column;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
:host(ui-window[managed]) .content-handler ::slotted(*),
|
|
152
|
+
:host(ui-window[native-mode]) .content-handler ::slotted(*),
|
|
153
|
+
:host(ui-window[data-native-active]) .content-handler ::slotted(*) {
|
|
154
|
+
flex: 1 1 auto;
|
|
155
|
+
min-block-size: 0;
|
|
156
|
+
min-inline-size: 0;
|
|
157
|
+
max-inline-size: none;
|
|
158
|
+
inline-size: 100%;
|
|
159
|
+
block-size: 100%;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
:host(ui-window[maximized]) {
|
|
163
|
+
--ui-win-radius: 0;
|
|
164
|
+
inset: 0 !important;
|
|
165
|
+
inline-size: 100% !important;
|
|
166
|
+
block-size: 100% !important;
|
|
167
|
+
border-radius: 0;
|
|
168
|
+
transform: none !important;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
* Mobile (env shell): full-bleed; Home FAB overlays the window (no dock slab).
|
|
173
|
+
* Titlebar becomes an empty spacer under the transparent overlay statusband
|
|
174
|
+
* (`--env-status-inset-top`) unless standalone (`data-no-titlebar`).
|
|
175
|
+
*/
|
|
176
|
+
:host(ui-window[data-mobile-max]) {
|
|
177
|
+
--ui-win-radius: 0;
|
|
178
|
+
/* Spacer height matches overlay status / notch when status-gap is on. */
|
|
179
|
+
--ui-win-titlebar-height: var(--env-status-inset-top, max(2rem, env(safe-area-inset-top, 0px)));
|
|
180
|
+
inset: 0 !important;
|
|
181
|
+
inline-size: 100% !important;
|
|
182
|
+
block-size: 100% !important;
|
|
183
|
+
border-radius: 0;
|
|
184
|
+
transform: none !important;
|
|
185
|
+
|
|
186
|
+
@media screen and (pointer: coarse) and (hover: none) {
|
|
187
|
+
block-size: stretch !important;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
:host(ui-window[data-mobile-max]) .title-minimize,
|
|
192
|
+
:host(ui-window[data-mobile-max]) .title-maximize,
|
|
193
|
+
:host(ui-window[data-mobile-max]) .title-close,
|
|
194
|
+
:host(ui-window[data-mobile-max]) .title-exit-native {
|
|
195
|
+
display: none !important;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
:host(ui-window[data-mobile-max]) .title-handler {
|
|
199
|
+
cursor: default;
|
|
200
|
+
/* WHY: transparent spacer sampled as black theme-color and broke Settings/Launcher unity. */
|
|
201
|
+
background: var(--ui-win-titlebar-bg, var(--color-surface, --u2-color-mod(var(--ui-win-seed), 940)));
|
|
202
|
+
border-block-end: 0;
|
|
203
|
+
min-block-size: var(--ui-win-titlebar-height);
|
|
204
|
+
padding-block: 0;
|
|
205
|
+
pointer-events: none;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
:host(ui-window[data-mobile-max]) .title-handler-main,
|
|
209
|
+
:host(ui-window[data-mobile-max]) .title-handler-actions,
|
|
210
|
+
:host(ui-window[data-mobile-max]) .title-handler-buttons {
|
|
211
|
+
display: none !important;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* Standalone PWA mobile: no titlebar — content is edge-to-edge (safe-area via views if needed). */
|
|
215
|
+
:host(ui-window[data-no-titlebar]) {
|
|
216
|
+
--ui-win-titlebar-height: 0px;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
:host(ui-window[data-no-titlebar]) .title-handler {
|
|
220
|
+
display: none !important;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* Desktop/fullscreen with status overlay: maximized windows also reserve the top band. */
|
|
224
|
+
:host(ui-window[data-status-gap]:not([data-no-titlebar])) {
|
|
225
|
+
--ui-win-titlebar-height: var(--env-status-inset-top, max(2rem, env(safe-area-inset-top, 0px)));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
:host(ui-window[data-status-gap]:not([data-no-titlebar])) .title-handler {
|
|
229
|
+
cursor: default;
|
|
230
|
+
background: var(--ui-win-titlebar-bg, var(--color-surface, --u2-color-mod(var(--ui-win-seed), 940)));
|
|
231
|
+
border-block-end: 0;
|
|
232
|
+
min-block-size: var(--ui-win-titlebar-height);
|
|
233
|
+
padding-block: 0;
|
|
234
|
+
pointer-events: none;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
:host(ui-window[data-status-gap]:not([data-no-titlebar])) .title-handler-main,
|
|
238
|
+
:host(ui-window[data-status-gap]:not([data-no-titlebar])) .title-handler-actions,
|
|
239
|
+
:host(ui-window[data-status-gap]:not([data-no-titlebar])) .title-handler-buttons {
|
|
240
|
+
display: none !important;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
:host(ui-window[data-desk-max]) {
|
|
244
|
+
--ui-win-radius: 0;
|
|
245
|
+
/* WHY: titlebar is inside the window — subtracting it left a shadowed slab above the taskbar (PWA). */
|
|
246
|
+
inset: 0 0 var(--env-shell-chrome-stack-reserve, 2.5rem) 0 !important;
|
|
247
|
+
inline-size: auto !important;
|
|
248
|
+
block-size: auto !important;
|
|
249
|
+
border-radius: 0;
|
|
250
|
+
box-shadow: none !important;
|
|
251
|
+
transform: none !important;
|
|
252
|
+
|
|
253
|
+
@media screen and (pointer: coarse) and (hover: none) {
|
|
254
|
+
block-size: stretch !important;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
:host(ui-window[managed][data-focused][data-desk-max]) {
|
|
259
|
+
box-shadow: none !important;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
:host(ui-window[minimized]) {
|
|
263
|
+
block-size: var(--ui-win-titlebar-height) !important;
|
|
264
|
+
min-block-size: var(--ui-win-titlebar-height);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
:host(ui-window[minimized]) .content-handler,
|
|
268
|
+
:host(ui-window[minimized]) .footer-handler,
|
|
269
|
+
:host(ui-window[minimized]) .window-resizer {
|
|
270
|
+
display: none;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
:host(ui-window[hidden-window]) {
|
|
274
|
+
visibility: hidden !important;
|
|
275
|
+
pointer-events: none !important;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
:host(ui-window[maximized]) .window-resizer,
|
|
279
|
+
:host(ui-window[data-mobile-max]) .window-resizer,
|
|
280
|
+
:host(ui-window[data-desk-max]) .window-resizer,
|
|
281
|
+
:host(ui-window[data-native-active]) .window-resizer {
|
|
282
|
+
display: none;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* -------------------------------------------------------------------------- */
|
|
286
|
+
/* native-mode: full-bleed + WCO / standalone / in-tab fallback */
|
|
287
|
+
/* -------------------------------------------------------------------------- */
|
|
288
|
+
|
|
289
|
+
:host(ui-window[native-mode]),
|
|
290
|
+
:host(ui-window[data-native-active]) {
|
|
291
|
+
--ui-win-radius: 0;
|
|
292
|
+
position: fixed !important;
|
|
293
|
+
inset: 0 !important;
|
|
294
|
+
inline-size: 100% !important;
|
|
295
|
+
block-size: 100% !important;
|
|
296
|
+
max-inline-size: none;
|
|
297
|
+
max-block-size: none;
|
|
298
|
+
border-radius: 0;
|
|
299
|
+
transform: none !important;
|
|
300
|
+
box-shadow: none;
|
|
301
|
+
/* WHY: above env chrome (~2e9 in env vars can minify oddly); stay under system overlays. */
|
|
302
|
+
z-index: 100000;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
:host(ui-window[data-native-wco]) .title-handler,
|
|
306
|
+
:host(ui-window[data-native-standalone]) .title-handler {
|
|
307
|
+
/* Prefer standardized window-drag; keep Chromium legacy aliases. */
|
|
308
|
+
window-drag: move;
|
|
309
|
+
app-region: drag;
|
|
310
|
+
-webkit-app-region: drag;
|
|
311
|
+
cursor: default;
|
|
312
|
+
/* Titleband: cover WCO / safe-area strip */
|
|
313
|
+
min-block-size: max(
|
|
314
|
+
var(--ui-win-titlebar-height),
|
|
315
|
+
env(titlebar-area-height, var(--ui-win-titlebar-area-height, 0px)),
|
|
316
|
+
calc(env(safe-area-inset-top, 0px) + 1.75rem)
|
|
317
|
+
);
|
|
318
|
+
padding-block-start: max(env(safe-area-inset-top, 0px), env(titlebar-area-y, 0px));
|
|
319
|
+
padding-inline-start: max(
|
|
320
|
+
env(safe-area-inset-left, 0px),
|
|
321
|
+
env(titlebar-area-x, var(--ui-win-titlebar-area-x, 0px)),
|
|
322
|
+
var(--ui-win-pad-inline)
|
|
323
|
+
);
|
|
324
|
+
padding-inline-end: max(
|
|
325
|
+
env(safe-area-inset-right, 0px),
|
|
326
|
+
max(0px, calc(100vi - env(titlebar-area-x, 0px) - env(titlebar-area-width, 100vi))),
|
|
327
|
+
var(--ui-win-pad-inline)
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
:host(ui-window[data-native-wco]) .title-handler-buttons,
|
|
332
|
+
:host(ui-window[data-native-wco]) .title-handler-actions,
|
|
333
|
+
:host(ui-window[data-native-standalone]) .title-handler-buttons,
|
|
334
|
+
:host(ui-window[data-native-standalone]) .title-handler-actions,
|
|
335
|
+
:host(ui-window[data-native-wco]) .title-handler-buttons button,
|
|
336
|
+
:host(ui-window[data-native-standalone]) .title-handler-buttons button {
|
|
337
|
+
window-drag: none;
|
|
338
|
+
app-region: no-drag;
|
|
339
|
+
-webkit-app-region: no-drag;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/* WCO: OS owns min/max/close — hide custom duplicates. */
|
|
343
|
+
:host(ui-window[data-native-wco]) .title-minimize,
|
|
344
|
+
:host(ui-window[data-native-wco]) .title-maximize,
|
|
345
|
+
:host(ui-window[data-native-wco]) .title-close,
|
|
346
|
+
:host(ui-window[data-native-wco]) .title-exit-native {
|
|
347
|
+
display: none !important;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* Mobile / installed standalone: hide resize-like chrome; keep exit-native for env restore. */
|
|
351
|
+
:host(ui-window[data-native-standalone]) .title-minimize,
|
|
352
|
+
:host(ui-window[data-native-standalone]) .title-maximize,
|
|
353
|
+
:host(ui-window[data-native-standalone]) .title-close {
|
|
354
|
+
display: none !important;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
:host(ui-window[data-native-active]) .footer-handler[data-empty],
|
|
358
|
+
:host(ui-window[data-native-active]) .footer-handler[hidden],
|
|
359
|
+
:host(ui-window[data-mobile-max]) .footer-handler {
|
|
360
|
+
display: none !important;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/*
|
|
364
|
+
* WHY: `.title-handler-buttons button { display: inline-flex }` beats bare `[hidden]` /
|
|
365
|
+
* `.title-exit-native { display: none }` — without !important the 4th control always leaks.
|
|
366
|
+
* INVARIANT: exit-native only for installed standalone; fallback uses maximize as exit.
|
|
367
|
+
*/
|
|
368
|
+
.title-exit-native,
|
|
369
|
+
.title-exit-native[hidden] {
|
|
370
|
+
display: none !important;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
:host(ui-window[data-native-standalone]) .title-exit-native:not([hidden]) {
|
|
374
|
+
display: inline-flex !important;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.window-container {
|
|
378
|
+
display: grid;
|
|
379
|
+
grid-template-rows: minmax(0, max-content) minmax(0, 1fr) minmax(0, max-content);
|
|
380
|
+
grid-template-areas:
|
|
381
|
+
"title"
|
|
382
|
+
"content"
|
|
383
|
+
"footer";
|
|
384
|
+
inline-size: 100%;
|
|
385
|
+
block-size: 100%;
|
|
386
|
+
background: var(--ui-win-bg);
|
|
387
|
+
color: var(--ui-win-fg);
|
|
388
|
+
border: 1px solid var(--ui-win-border);
|
|
389
|
+
border-radius: inherit;
|
|
390
|
+
overflow: hidden;
|
|
391
|
+
/* WHY: isolate title vs content stacking so slotted paint cannot cover chrome. */
|
|
392
|
+
isolation: isolate;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.title-handler {
|
|
396
|
+
grid-area: title;
|
|
397
|
+
/*
|
|
398
|
+
* WHY: Slotted view roots (e.g. settings) can create stacking contexts that paint over
|
|
399
|
+
* the title grid row and swallow drag + min/max/close. Keep chrome above content.
|
|
400
|
+
* INVARIANT: title z > content z (same pattern as env `.wf-frame` titlebar).
|
|
401
|
+
*/
|
|
402
|
+
position: relative;
|
|
403
|
+
z-index: 50;
|
|
404
|
+
display: grid;
|
|
405
|
+
grid-template-columns: minmax(0, 1fr) auto auto;
|
|
406
|
+
align-items: center;
|
|
407
|
+
gap: var(--ui-win-gap);
|
|
408
|
+
min-block-size: var(--ui-win-titlebar-height);
|
|
409
|
+
padding-inline: var(--ui-win-pad-inline);
|
|
410
|
+
padding-block: 0.35rem;
|
|
411
|
+
background: var(--ui-win-titlebar-bg);
|
|
412
|
+
/*border-block-end: 1px solid var(--ui-win-border);*/
|
|
413
|
+
border: 0px none transparent;
|
|
414
|
+
border-block-end: 0px none transparent;
|
|
415
|
+
cursor: grab;
|
|
416
|
+
user-select: none;
|
|
417
|
+
touch-action: none;
|
|
418
|
+
pointer-events: auto;
|
|
419
|
+
|
|
420
|
+
&:active {
|
|
421
|
+
cursor: grabbing;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.title-handler-main {
|
|
426
|
+
display: flex;
|
|
427
|
+
align-items: center;
|
|
428
|
+
gap: 0.5rem;
|
|
429
|
+
min-inline-size: 0;
|
|
430
|
+
overflow: hidden;
|
|
431
|
+
pointer-events: none;
|
|
432
|
+
|
|
433
|
+
::slotted(*),
|
|
434
|
+
.title-text {
|
|
435
|
+
overflow: hidden;
|
|
436
|
+
text-overflow: ellipsis;
|
|
437
|
+
white-space: nowrap;
|
|
438
|
+
font-weight: 600;
|
|
439
|
+
letter-spacing: -0.01em;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.title-handler-actions {
|
|
444
|
+
display: flex;
|
|
445
|
+
align-items: center;
|
|
446
|
+
gap: 0.25rem;
|
|
447
|
+
min-inline-size: 0;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
.title-handler-buttons {
|
|
451
|
+
display: flex;
|
|
452
|
+
align-items: center;
|
|
453
|
+
gap: 0.25rem;
|
|
454
|
+
flex-shrink: 0;
|
|
455
|
+
position: relative;
|
|
456
|
+
z-index: 51;
|
|
457
|
+
pointer-events: auto;
|
|
458
|
+
background: transparent;
|
|
459
|
+
/* WHY: parent titlebar uses touch-action:none for drag; controls need click synthesis. */
|
|
460
|
+
touch-action: manipulation;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.title-handler-buttons button,
|
|
464
|
+
.title-handler-actions button {
|
|
465
|
+
appearance: none;
|
|
466
|
+
display: inline-flex;
|
|
467
|
+
align-items: center;
|
|
468
|
+
justify-content: center;
|
|
469
|
+
inline-size: var(--ui-win-control-size);
|
|
470
|
+
block-size: var(--ui-win-control-size);
|
|
471
|
+
margin: 0;
|
|
472
|
+
padding: 0;
|
|
473
|
+
border: 0;
|
|
474
|
+
border-radius: 999px;
|
|
475
|
+
background: var(--ui-win-control-bg);
|
|
476
|
+
color: var(--ui-win-control-fg);
|
|
477
|
+
--icon-color: currentColor;
|
|
478
|
+
cursor: pointer;
|
|
479
|
+
pointer-events: auto;
|
|
480
|
+
transition:
|
|
481
|
+
background-color 0.15s ease,
|
|
482
|
+
color 0.15s ease,
|
|
483
|
+
transform 0.12s ease;
|
|
484
|
+
|
|
485
|
+
&:hover {
|
|
486
|
+
background: var(--ui-win-control-bg-hover);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
&:active {
|
|
490
|
+
transform: scale(0.94);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
&:focus-visible {
|
|
494
|
+
outline: 2px solid color-mix(in oklab, var(--color-primary, #5a7fff) 70%, transparent);
|
|
495
|
+
outline-offset: 2px;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
ui-icon {
|
|
499
|
+
inline-size: var(--ui-win-icon-size);
|
|
500
|
+
block-size: var(--ui-win-icon-size);
|
|
501
|
+
min-inline-size: var(--ui-win-icon-size);
|
|
502
|
+
min-block-size: var(--ui-win-icon-size);
|
|
503
|
+
flex-shrink: 0;
|
|
504
|
+
--ui-icon-size: var(--ui-win-icon-size);
|
|
505
|
+
--ui-icon-padding: 0;
|
|
506
|
+
pointer-events: none;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.title-handler-buttons .title-close {
|
|
511
|
+
background: var(--ui-win-close-bg);
|
|
512
|
+
color: var(--ui-win-close-fg);
|
|
513
|
+
--icon-color: currentColor;
|
|
514
|
+
|
|
515
|
+
&:hover {
|
|
516
|
+
background: var(--ui-win-close-bg-hover);
|
|
517
|
+
color: var(--ui-win-close-fg-hover);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/* Maximize glyph swaps via JS (`#syncMaximizeIcon`) — one ui-icon, never dual corners. */
|
|
522
|
+
|
|
523
|
+
.content-handler {
|
|
524
|
+
grid-area: content;
|
|
525
|
+
/*
|
|
526
|
+
* WHY (radical): views with `position: fixed; inset: 0` (settings/markdown) escape the
|
|
527
|
+
* content grid and swallow titlebar hits. `transform` makes this the fixed containing
|
|
528
|
+
* block; `contain: paint` keeps compositing under the chrome row.
|
|
529
|
+
*/
|
|
530
|
+
position: relative;
|
|
531
|
+
z-index: 0;
|
|
532
|
+
isolation: isolate;
|
|
533
|
+
transform: translateZ(0);
|
|
534
|
+
contain: paint;
|
|
535
|
+
min-block-size: 0;
|
|
536
|
+
min-inline-size: 0;
|
|
537
|
+
overflow: auto;
|
|
538
|
+
padding: 0px;/*var(--ui-win-pad-block) var(--ui-win-pad-inline);*/
|
|
539
|
+
background: var(--ui-win-content-bg);
|
|
540
|
+
color: var(--ui-win-fg);
|
|
541
|
+
/*
|
|
542
|
+
* WHY: `:host(ui-window[hidden-window])` sets `pointer-events: none !important` on the host;
|
|
543
|
+
* without an explicit `auto` here the slotted view inherits `none` and the entire body
|
|
544
|
+
* (settings tabs, explorer, etc.) becomes unclickable even while visible.
|
|
545
|
+
*/
|
|
546
|
+
pointer-events: auto;
|
|
547
|
+
/*
|
|
548
|
+
* INVARIANT: window content does not inherit the titlebar icon token.
|
|
549
|
+
* Explorer and other views choose their own component token locally.
|
|
550
|
+
*/
|
|
551
|
+
|
|
552
|
+
::slotted(*) {
|
|
553
|
+
max-inline-size: 100%;
|
|
554
|
+
/* WHY: keep view roots inside the content box; do not cover chrome. */
|
|
555
|
+
max-block-size: 100%;
|
|
556
|
+
min-block-size: 0;
|
|
557
|
+
pointer-events: auto;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.footer-handler {
|
|
562
|
+
grid-area: footer;
|
|
563
|
+
display: flex;
|
|
564
|
+
align-items: center;
|
|
565
|
+
justify-content: flex-end;
|
|
566
|
+
gap: 0.5rem;
|
|
567
|
+
min-block-size: var(--ui-win-footer-min);
|
|
568
|
+
padding: 0.45rem var(--ui-win-pad-inline);
|
|
569
|
+
background: var(--ui-win-footer-bg);
|
|
570
|
+
border-block-start: 1px solid var(--ui-win-border);
|
|
571
|
+
color: var(--ui-win-muted);
|
|
572
|
+
|
|
573
|
+
&[data-empty],
|
|
574
|
+
&[hidden] {
|
|
575
|
+
display: none;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/* SE resize affordance (optional slot / child) */
|
|
580
|
+
.window-resizer {
|
|
581
|
+
position: absolute;
|
|
582
|
+
z-index: 4;
|
|
583
|
+
inset-inline-end: 4px;
|
|
584
|
+
inset-block-end: 4px;
|
|
585
|
+
inline-size: 12px;
|
|
586
|
+
block-size: 12px;
|
|
587
|
+
cursor: nwse-resize;
|
|
588
|
+
border-radius: 2px;
|
|
589
|
+
background: linear-gradient(
|
|
590
|
+
135deg,
|
|
591
|
+
transparent 48%,
|
|
592
|
+
color-mix(in oklab, var(--ui-win-muted) 55%, transparent) 50%
|
|
593
|
+
);
|
|
594
|
+
opacity: 0.55;
|
|
595
|
+
pointer-events: auto;
|
|
596
|
+
|
|
597
|
+
&:hover {
|
|
598
|
+
opacity: 0.9;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Filename: home-host-apply.scss
|
|
3
|
+
* FullPath: modules/projects/fl.ui/src/styles/ui/home-host-apply.scss
|
|
4
|
+
* Change date and time: 12.15.00_03.08.2026
|
|
5
|
+
* Reason for changes: Symlink-safe entry for adopted SpeedDial host styles (no relative @use from ts/).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
@use "./home-host" as home-host;
|
|
9
|
+
|
|
10
|
+
@include home-host.home-view-host-styles();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Filename: native-controls.scss
|
|
3
|
+
* FullPath: modules/projects/veela.css/src/scss/ui/native-controls.scss
|
|
4
|
+
* Reason for changes: Curated opt-in native control chrome entry-point.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@use "../layers";
|
|
8
|
+
@use "./forms-bare-host-elements" as bare;
|
|
9
|
+
@use "./native-host-button-chrome" as host;
|
|
10
|
+
|
|
11
|
+
@layer components {
|
|
12
|
+
:where(button) {
|
|
13
|
+
@include host.essentials-native-host-button-chrome-base;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@include bare.emit-bare-form-element-layer();
|
|
File without changes
|