@fest-lib/veela 1.0.9 → 1.0.11

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fest-lib/veela",
3
3
  "description": "fest-lib Veela: CSS tokens, --c2 color functions, Agate.UX, SCSS + runtime loaders",
4
- "version": "1.0.9",
4
+ "version": "1.0.11",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": true,
@@ -0,0 +1,193 @@
1
+ /*
2
+ * Overlay syntax paint + CSS Custom Highlight selection.
3
+ *
4
+ * FIND:code-highlight
5
+ * WHY: Syntax colors are a fixed light-dark() palette. Chrome tokens
6
+ * (`--color-primary`) and `color-mix` with `CanvasText` resolve to navy/black
7
+ * on the code background. `::highlight(code-selection)` mirrors host selection.
8
+ */
9
+ @layer components {
10
+ .code-highlight-overlay {
11
+ display: block;
12
+ pointer-events: none;
13
+ user-select: none;
14
+ overflow: hidden;
15
+ margin: 0;
16
+ padding: 0;
17
+ padding-inline-start: var(--code-gutter, 0px);
18
+ box-sizing: border-box;
19
+ color-scheme: inherit;
20
+ color: light-dark(#1f2328, #e6edf3);
21
+ -webkit-text-fill-color: currentColor;
22
+ white-space: pre;
23
+ tab-size: 4;
24
+ z-index: 1;
25
+ visibility: visible;
26
+ opacity: 1;
27
+ }
28
+
29
+ .code-highlight-overlay,
30
+ .code-highlight-overlay__gutter,
31
+ .code-highlight-overlay__paint,
32
+ .code-highlight-overlay__paint * {
33
+ font-family: inherit;
34
+ font-size: inherit;
35
+ font-weight: inherit;
36
+ font-style: inherit;
37
+ font-stretch: inherit;
38
+ font-variant: inherit;
39
+ font-variant-ligatures: none;
40
+ font-feature-settings: "liga" 0, "clig" 0, "calt" 0, "dlig" 0;
41
+ font-kerning: none;
42
+ font-variation-settings: inherit;
43
+ line-height: var(--code-line-height, inherit);
44
+ letter-spacing: inherit;
45
+ word-spacing: inherit;
46
+ tab-size: inherit;
47
+ text-rendering: inherit;
48
+ font-synthesis: none;
49
+ -webkit-text-fill-color: currentColor;
50
+ }
51
+
52
+ .code-highlight-overlay__gutter {
53
+ position: absolute;
54
+ inset-block-start: 0;
55
+ inset-inline-start: 0;
56
+ inline-size: var(--code-gutter, 0px);
57
+ text-align: end;
58
+ padding-inline-end: 0.5rem;
59
+ box-sizing: border-box;
60
+ color: light-dark(#656d76, #8b949e);
61
+ white-space: pre;
62
+ overflow: hidden;
63
+ user-select: none;
64
+ pointer-events: none;
65
+ }
66
+
67
+ .code-highlight-overlay__paint {
68
+ min-inline-size: 0;
69
+ margin: 0;
70
+ padding: 0;
71
+ white-space: pre;
72
+ overflow: visible;
73
+ }
74
+
75
+ pre:has(> .code-highlight-overlay),
76
+ .code-highlight-host:has(> .code-highlight-overlay) {
77
+ position: relative;
78
+ }
79
+
80
+ pre:has(> .code-highlight-overlay) > code,
81
+ .code-highlight-source:has(+ .code-highlight-overlay),
82
+ .code-highlight-host > .code-highlight-source {
83
+ display: block;
84
+ line-height: var(--code-line-height, normal);
85
+ padding-inline-start: var(--code-gutter, 0px);
86
+ font-variant-ligatures: none;
87
+ font-kerning: none;
88
+ font-feature-settings: "liga" 0, "clig" 0, "calt" 0, "dlig" 0;
89
+ caret-color: light-dark(#1f2328, #e6edf3);
90
+ }
91
+
92
+ /* INVARIANT: never hide source unless overlay paint has glyphs. */
93
+ pre:has(> .code-highlight-painted + .code-highlight-overlay) > code.code-highlight-painted,
94
+ .code-highlight-source.code-highlight-painted:has(+ .code-highlight-overlay),
95
+ .code-highlight-host > .code-highlight-source.code-highlight-painted {
96
+ color: transparent;
97
+ -webkit-text-fill-color: transparent;
98
+ }
99
+
100
+ pre:has(> .code-highlight-overlay) > code::selection,
101
+ .code-highlight-source::selection {
102
+ background-color: color-mix(in oklab, #79c0ff 32%, transparent);
103
+ color: transparent;
104
+ -webkit-text-fill-color: transparent;
105
+ }
106
+
107
+ pre[data-language]:not([data-language=""]) {
108
+ position: relative;
109
+ }
110
+
111
+ pre[data-language]:not([data-language=""])::after {
112
+ content: attr(data-language);
113
+ position: absolute;
114
+ inset-block-start: 0.35rem;
115
+ inset-inline-end: 0.5rem;
116
+ z-index: 2;
117
+ padding: 0.1em 0.45em;
118
+ border-radius: var(--radius-xs, 4px);
119
+ font-family: var(--md-font-sans, var(--font-family, sans-serif));
120
+ font-size: 0.7em;
121
+ line-height: 1.2;
122
+ letter-spacing: 0.02em;
123
+ text-transform: lowercase;
124
+ color: light-dark(#656d76, #8b949e);
125
+ background: color-mix(in oklab, var(--md-bg-code, var(--view-code-bg, Canvas)) 70%, transparent);
126
+ pointer-events: none;
127
+ }
128
+
129
+ .code-highlight-overlay {
130
+ .hljs-comment,
131
+ .hljs-quote {
132
+ color: light-dark(#656d76, #8b949e);
133
+ }
134
+
135
+ .hljs-keyword,
136
+ .hljs-selector-tag,
137
+ .hljs-literal,
138
+ .hljs-built_in {
139
+ color: light-dark(#0550ae, #79c0ff);
140
+ }
141
+
142
+ .hljs-string,
143
+ .hljs-addition,
144
+ .hljs-attr {
145
+ color: light-dark(#0a3069, #a5d6ff);
146
+ }
147
+
148
+ .hljs-number,
149
+ .hljs-variable,
150
+ .hljs-template-variable,
151
+ .hljs-type {
152
+ color: light-dark(#116329, #3fb950);
153
+ }
154
+
155
+ .hljs-title,
156
+ .hljs-title.function_,
157
+ .hljs-section,
158
+ .hljs-name {
159
+ color: light-dark(#0550ae, #79c0ff);
160
+ }
161
+
162
+ .hljs-property,
163
+ .hljs-attribute,
164
+ .hljs-selector-class,
165
+ .hljs-selector-id {
166
+ color: light-dark(#116329, #7ee787);
167
+ }
168
+
169
+ .hljs-meta,
170
+ .hljs-doctag,
171
+ .hljs-punctuation,
172
+ .hljs-operator,
173
+ .hljs-tag {
174
+ color: light-dark(#656d76, #c9d1d9);
175
+ }
176
+
177
+ .hljs-deletion {
178
+ color: light-dark(#cf222e, #ffa198);
179
+ }
180
+
181
+ .hljs-emphasis,
182
+ .hljs-strong {
183
+ color: inherit;
184
+ }
185
+ }
186
+ }
187
+
188
+ @layer overrides {
189
+ ::highlight(code-selection) {
190
+ background-color: color-mix(in oklab, #79c0ff 32%, transparent);
191
+ color: inherit;
192
+ }
193
+ }
@@ -23,6 +23,7 @@
23
23
  @use "../core/config" as config;
24
24
  @use "../core/tokens" as tokens;
25
25
  @use "../core/mixins" as mixins;
26
+ @use "./code-highlight";
26
27
 
27
28
  /* ─── Animations ──────────────────────────────────────────────────────────── */
28
29
 
@@ -1,8 +1,9 @@
1
1
  /*
2
2
  * Filename: QuickSettings.scss
3
3
  * FullPath: modules/projects/fl.ui/src/ui/navigation/settings/QuickSettings.scss
4
- * Change date and time: 09.40.00_19.08.2026
5
- * Reason for changes: Footer row for Settings / Explorer shortcut buttons.
4
+ * Change date and time: 20.00.00_03.09.2026
5
+ * Reason for changes: Drop contrast-color()/inherit() Capacitor WebView drops the rest of the sheet.
6
+ * FIND:chrome-rail
6
7
  */
7
8
 
8
9
  /* Unlayered `:host` rules beat `ux-preload`'s layered `:host{display:none}` default. */
@@ -66,8 +67,8 @@
66
67
  border-radius: 14px;
67
68
  border: 1px solid var(--qs-outline);
68
69
  background: var(--qs-surface);
69
- color: var(--qs-on-surface);
70
- color: contrast-color(var(--qs-surface));
70
+ /* WHY: contrast-color()/inherit() need Chrome flags; replaceSync then drops later rules (sliders, footer). */
71
+ color: var(--color-on-surface, var(--qs-on-surface));
71
72
  /* INVARIANT: no backdrop-filter — Win11-like solid panel per spec, keeps perf on low-end devices. */
72
73
  box-shadow:
73
74
  0 20px 48px -20px rgba(0, 0, 0, 0.4),
@@ -94,8 +95,7 @@
94
95
  min-inline-size: var(--icon-size);
95
96
  min-block-size: var(--icon-size);
96
97
  line-height: 0;
97
- color: contrast-color(var(--qs-surface));
98
- color: color-mix(in oklch, contrast-color(var(--qs-surface)) 40%, var(--color-primary, var(--qs-primary)));
98
+ color: color-mix(in oklab, var(--color-on-surface, var(--qs-on-surface)) 55%, var(--color-primary, var(--qs-primary)));
99
99
  }
100
100
 
101
101
 
@@ -109,19 +109,17 @@
109
109
  border-radius: 10px;
110
110
  color: inherit;
111
111
  background: color-mix(in oklab, var(--qs-on-surface) 8%, transparent);
112
- color: contrast-color(inherit(background-color));
112
+ color: var(--color-on-surface, var(--qs-on-surface));
113
113
  text-align: start;
114
114
  cursor: pointer;
115
115
  transition: background-color 140ms ease, color 140ms ease;
116
116
 
117
117
  &:hover {
118
118
  background: color-mix(in oklab, var(--qs-on-surface) 14%, transparent);
119
- color: contrast-color(inherit(background-color));
120
119
  }
121
120
 
122
121
  &:active {
123
122
  background: color-mix(in oklab, var(--qs-on-surface) 18%, transparent);
124
- color: contrast-color(inherit(background-color));
125
123
  }
126
124
 
127
125
  &:focus-visible {
@@ -132,11 +130,8 @@
132
130
  &[aria-pressed="true"] {
133
131
  background: color-mix(in oklab, var(--color-primary, var(--qs-primary)) 26%, transparent);
134
132
  color: var(--color-primary, var(--qs-primary));
135
- color: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 60%, var(--color-primary, var(--qs-primary)));
136
133
 
137
134
  .qs-tile-icon {
138
- --icon-color: var(--color-primary, var(--qs-primary));
139
- --icon-color: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 60%, var(--color-primary, var(--qs-primary)));
140
135
  --icon-color: currentColor;
141
136
  }
142
137
  }
@@ -148,7 +143,7 @@
148
143
  gap: 0.05rem;
149
144
  min-inline-size: 0;
150
145
  overflow: hidden;
151
- color: color-mix(in oklch, contrast-color(var(--qs-surface)) 40%, var(--color-primary, var(--qs-primary)));
146
+ color: var(--color-on-surface, var(--qs-on-surface));
152
147
  }
153
148
 
154
149
  .qs-tile-label {
@@ -157,7 +152,7 @@
157
152
  white-space: nowrap;
158
153
  overflow: hidden;
159
154
  text-overflow: ellipsis;
160
- color: contrast-color(var(--qs-surface));
155
+ color: inherit;
161
156
  }
162
157
 
163
158
  .qs-tile-sub {
@@ -167,7 +162,7 @@
167
162
  white-space: nowrap;
168
163
  overflow: hidden;
169
164
  text-overflow: ellipsis;
170
- color: contrast-color(var(--qs-surface));
165
+ color: inherit;
171
166
  }
172
167
 
173
168
  .qs-sliders {
@@ -175,7 +170,7 @@
175
170
  gap: 0.6rem;
176
171
  padding-block-start: 0.7rem;
177
172
  border-block-start: 1px solid var(--qs-outline);
178
- color: contrast-color(var(--qs-surface));
173
+ color: var(--color-on-surface, var(--qs-on-surface));
179
174
  }
180
175
 
181
176
  .qs-slider-row {
@@ -195,7 +190,7 @@
195
190
  min-inline-size: var(--icon-size);
196
191
  min-block-size: var(--icon-size);
197
192
  line-height: 0;
198
- color: contrast-color(var(--qs-surface));
193
+ color: inherit;
199
194
  }
200
195
 
201
196
  .qs-slider-col {
@@ -220,21 +215,19 @@
220
215
  block-size: 1.1rem;
221
216
  margin: 0;
222
217
  background: transparent;
223
- color: contrast-color(inherit(background-color));
218
+ color: var(--color-on-surface, var(--qs-on-surface));
224
219
  cursor: pointer;
225
220
 
226
221
  &::-webkit-slider-runnable-track {
227
222
  block-size: 4px;
228
223
  border-radius: 999px;
229
224
  background: color-mix(in oklab, var(--qs-on-surface) 18%, transparent);
230
- color: contrast-color(inherit(background-color));
231
225
  }
232
226
 
233
227
  &::-moz-range-track {
234
228
  block-size: 4px;
235
229
  border-radius: 999px;
236
230
  background: color-mix(in oklab, var(--qs-on-surface) 18%, transparent);
237
- color: contrast-color(inherit(background-color));
238
231
  }
239
232
 
240
233
  &::-webkit-slider-thumb {
@@ -245,8 +238,7 @@
245
238
  margin-block-start: -6px;
246
239
  border-radius: 50%;
247
240
  border: none;
248
- background: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 40%, var(--color-primary, var(--qs-primary)));
249
- color: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 40%, var(--color-primary, var(--qs-primary)));
241
+ background: var(--color-primary, var(--qs-primary));
250
242
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
251
243
  }
252
244
 
@@ -255,16 +247,13 @@
255
247
  block-size: 1rem;
256
248
  border-radius: 50%;
257
249
  border: none;
258
- background: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 40%, var(--color-primary, var(--qs-primary)));
259
- color: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 40%, var(--color-primary, var(--qs-primary)));
250
+ background: var(--color-primary, var(--qs-primary));
260
251
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
261
252
  }
262
253
 
263
254
  &:focus-visible::-webkit-slider-thumb {
264
255
  outline: 2px solid var(--color-primary, var(--qs-primary));
265
256
  outline-offset: 2px;
266
- color: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 40%, var(--color-primary, var(--qs-primary)));
267
- background: color-mix(in oklch, contrast-color(var(--qs-surface, var(--color-surface))) 40%, var(--color-primary, var(--qs-primary)));
268
257
  }
269
258
  }
270
259
 
@@ -288,7 +277,7 @@
288
277
  border: none;
289
278
  border-radius: 8px;
290
279
  background: color-mix(in oklab, var(--qs-on-surface) 8%, transparent);
291
- color: contrast-color(var(--qs-surface));
280
+ color: var(--color-on-surface, var(--qs-on-surface));
292
281
  font: 600 0.72rem/1.2 ui-sans-serif, system-ui, sans-serif;
293
282
  cursor: pointer;
294
283
  transition: background-color 140ms ease;
@@ -141,6 +141,100 @@
141
141
  pointer-events: none;
142
142
  }
143
143
 
144
+ /* Calendar / Quick Settings / pin — collapsible left rail, mirrored from core-rail. */
145
+ .speed-dial-chrome-rail {
146
+ --sd-rail-ink: var(--wallpaper-contrast-color, var(--env-launcher-fg, CanvasText));
147
+ position: fixed;
148
+ inset-block: 12%;
149
+ inset-inline-start: 0;
150
+ z-index: 6;
151
+ display: flex;
152
+ flex-direction: row-reverse;
153
+ align-items: stretch;
154
+ pointer-events: none;
155
+ max-block-size: 76%;
156
+ padding: 0;
157
+ border: none;
158
+ outline: none;
159
+ color: var(--sd-rail-ink);
160
+ }
161
+
162
+ .speed-dial-chrome-rail__toggle {
163
+ pointer-events: auto;
164
+ align-self: center;
165
+ display: inline-flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ inline-size: 1.65rem;
169
+ block-size: 2.6rem;
170
+ margin: 0;
171
+ padding: 0;
172
+ border: 0 none transparent;
173
+ border-radius: 0 10px 10px 0;
174
+ background: transparent;
175
+ color: color-mix(in oklab, var(--sd-rail-ink) 78%, transparent);
176
+ --icon-color: color-mix(in oklab, var(--sd-rail-ink) 78%, transparent);
177
+ cursor: pointer;
178
+ }
179
+
180
+ .speed-dial-chrome-rail__toggle ui-icon {
181
+ --icon-size: 1.1rem;
182
+ --icon-color: color-mix(in oklab, var(--sd-rail-ink) 78%, transparent);
183
+ pointer-events: none;
184
+ }
185
+
186
+ .speed-dial-chrome-rail__panel {
187
+ pointer-events: auto;
188
+ display: none;
189
+ flex-direction: column;
190
+ gap: 0.45rem;
191
+ padding: 0.55rem 0.45rem;
192
+ min-inline-size: 3.4rem;
193
+ max-inline-size: 5.2rem;
194
+ overflow: auto;
195
+ border: 1px solid color-mix(in oklab, var(--sd-rail-ink) 16%, transparent);
196
+ border-inline-start: none;
197
+ border-radius: 0 14px 14px 0;
198
+ background: color-mix(in oklab, var(--wallpaper-underlying-color, Canvas) 82%, transparent);
199
+ backdrop-filter: blur(14px);
200
+ -webkit-backdrop-filter: blur(14px);
201
+ color: var(--sd-rail-ink);
202
+ }
203
+
204
+ .speed-dial-chrome-rail[data-open] .speed-dial-chrome-rail__panel {
205
+ display: flex;
206
+ }
207
+
208
+ .speed-dial-chrome-rail__item {
209
+ appearance: none;
210
+ display: flex;
211
+ flex-direction: column;
212
+ align-items: center;
213
+ gap: 0.2rem;
214
+ margin: 0;
215
+ padding: 0.35rem 0.2rem;
216
+ border: none;
217
+ border-radius: var(--radius-lg);
218
+ background: transparent;
219
+ color: inherit;
220
+ cursor: pointer;
221
+ min-inline-size: 0;
222
+ }
223
+
224
+ .speed-dial-chrome-rail__item:hover,
225
+ .speed-dial-chrome-rail__item:focus-visible,
226
+ .speed-dial-chrome-rail__item[data-pressed] {
227
+ background: color-mix(in oklab, var(--sd-rail-ink) 10%, transparent);
228
+ outline: none;
229
+ }
230
+
231
+ .speed-dial-chrome-rail__item ui-icon {
232
+ --icon-size: 1.55rem;
233
+ --icon-color: var(--sd-rail-ink);
234
+ color: var(--sd-rail-ink);
235
+ pointer-events: none;
236
+ }
237
+
144
238
  .speed-dial-workspace-pager {
145
239
  position: absolute;
146
240
  inset-inline: 0;
@@ -381,6 +475,18 @@
381
475
  }
382
476
  }
383
477
 
478
+ .speed-dial-root[data-tiles-locked] {
479
+ .sd-widget-host:not([data-widget="android"]) {
480
+ cursor: default;
481
+ }
482
+
483
+ .sd-widget-chrome,
484
+ .sd-widget-resize {
485
+ display: none;
486
+ pointer-events: none;
487
+ }
488
+ }
489
+
384
490
  .sd-widget--android {
385
491
  pointer-events: none;
386
492
  opacity: 0.08;
@@ -424,7 +530,8 @@
424
530
  color: color-mix(in oklab, var(--sd-you-ink, var(--wallpaper-contrast-color)) 62%, transparent);
425
531
  }
426
532
 
427
- .speed-dial-core-rail__label {
533
+ .speed-dial-core-rail__label,
534
+ .speed-dial-chrome-rail__label {
428
535
  font-size: 0.62rem;
429
536
  line-height: 1.15;
430
537
  text-align: center;