@kerfjs/ui 5.0.0-beta.51 → 5.0.0-beta.53
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/ai/component-catalog-v2.d.ts +3 -0
- package/ai/component-catalog-v2.json +3 -1
- package/ai/component-catalog-v2.schema.json +7 -0
- package/ai/component-catalog.json +3 -1
- package/ai/public-api-signatures-v1.md +30 -11
- package/ai/skill.md +15 -15
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/app-tab.d.ts +10 -1
- package/dist/app-tab.js +1 -1
- package/dist/browser/segmented-control.js +0 -1
- package/dist/catalog.js +4 -4
- package/dist/{chunk-S4QRSBFI.js → chunk-3NBL3OUQ.js} +2 -2
- package/dist/{chunk-S4QRSBFI.js.map → chunk-3NBL3OUQ.js.map} +1 -1
- package/dist/{chunk-UPZ6EEJN.js → chunk-44IG7PFV.js} +3 -3
- package/dist/{chunk-UPZ6EEJN.js.map → chunk-44IG7PFV.js.map} +1 -1
- package/dist/{chunk-NZXWU4R5.js → chunk-5I22LMCV.js} +2 -2
- package/dist/{chunk-NZXWU4R5.js.map → chunk-5I22LMCV.js.map} +1 -1
- package/dist/{chunk-ULCDZTWL.js → chunk-ATHXW6RP.js} +4 -2
- package/dist/chunk-ATHXW6RP.js.map +1 -0
- package/dist/{chunk-JM53SMVF.js → chunk-BJJKFVWW.js} +14 -5
- package/dist/chunk-BJJKFVWW.js.map +1 -0
- package/dist/{chunk-AEPXGCNF.js → chunk-C2FAYFDE.js} +2 -2
- package/dist/{chunk-AEPXGCNF.js.map → chunk-C2FAYFDE.js.map} +1 -1
- package/dist/{chunk-5FZZMIMD.js → chunk-CCMKJWLX.js} +16 -12
- package/dist/chunk-CCMKJWLX.js.map +1 -0
- package/dist/{chunk-5PMGQDG7.js → chunk-DQA5FMOX.js} +2 -2
- package/dist/{chunk-5PMGQDG7.js.map → chunk-DQA5FMOX.js.map} +1 -1
- package/dist/{chunk-NMGTHYW3.js → chunk-GUIHMIT2.js} +13 -11
- package/dist/chunk-GUIHMIT2.js.map +1 -0
- package/dist/{chunk-KX7DP2GO.js → chunk-KPNTVB7A.js} +9 -4
- package/dist/chunk-KPNTVB7A.js.map +1 -0
- package/dist/{chunk-D547PH4L.js → chunk-RNZAKSME.js} +11 -8
- package/dist/chunk-RNZAKSME.js.map +1 -0
- package/dist/{chunk-UBH743HV.js → chunk-T22EM4ET.js} +7 -5
- package/dist/chunk-T22EM4ET.js.map +1 -0
- package/dist/{chunk-O3RCCSQJ.js → chunk-TZ5IHWB2.js} +3 -3
- package/dist/{chunk-O3RCCSQJ.js.map → chunk-TZ5IHWB2.js.map} +1 -1
- package/dist/{chunk-MO56ZZLG.js → chunk-WZ2GLEY4.js} +6 -2
- package/dist/chunk-WZ2GLEY4.js.map +1 -0
- package/dist/{chunk-DVZCMMB3.js → chunk-X5QSICJ3.js} +5 -5
- package/dist/chunk-X5QSICJ3.js.map +1 -0
- package/dist/{chunk-JMGKM7RK.js → chunk-ZMBU522F.js} +2 -2
- package/dist/{chunk-JMGKM7RK.js.map → chunk-ZMBU522F.js.map} +1 -1
- package/dist/css-values.d.ts +4 -2
- package/dist/css-values.js +1 -1
- package/dist/grid.js +1 -1
- package/dist/index.js +15 -15
- package/dist/list-action-row.d.ts +2 -1
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.d.ts +1 -0
- package/dist/list-header.js +1 -1
- package/dist/list-item.d.ts +5 -3
- package/dist/list-item.js +1 -1
- package/dist/list.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/row.js +1 -1
- package/dist/segmented-control.d.ts +1 -1
- package/dist/segmented-control.js +1 -3
- package/dist/select.js +1 -1
- package/dist/skeleton.d.ts +5 -1
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/state-banner.d.ts +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/app-tab.css +9 -0
- package/dist/styles/badge.css +17 -6
- package/dist/styles/collapsible-panel.css +1 -1
- package/dist/styles/foundation.css +82 -26
- package/dist/styles/list-action-row.css +29 -8
- package/dist/styles/list-header.css +19 -7
- package/dist/styles/list-item.css +11 -3
- package/dist/styles/resizable-region.css +1 -1
- package/dist/styles/segmented-control.css +21 -1
- package/dist/styles/select.css +24 -13
- package/dist/styles/skeleton.css +37 -3
- package/dist/styles/state-banner.css +48 -12
- package/dist/styles/webawesome.css +47 -20
- package/dist/styles/workbench.css +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/value-table.js +1 -1
- package/dist/wire-sidebar.js +1 -1
- package/dist/wire-sidebar.js.map +1 -1
- package/docs/accessibility.md +4 -1
- package/docs/collapsible-panel.md +2 -1
- package/docs/component-contract.md +84 -7
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/count-dark.svg +1 -1
- package/docs/design/templates/list-header/count.svg +1 -1
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
- package/docs/design/templates/list-header/inline-action.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
- package/docs/design/templates/segmented-control/equal.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
- package/docs/design/templates/state-banner/info-badge.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design/templates/token-search-field/tokens.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- package/docs/design/templates.md +11 -1
- package/docs/device-class.md +2 -1
- package/docs/recipes.md +6 -4
- package/docs/ux-demo.md +2 -2
- package/docs/webawesome-theme.md +9 -2
- package/llms.txt +7 -3
- package/package.json +1 -1
- package/ux-demo/recipes/collapsible-sidebar.tsx +12 -11
- package/ux-demo/recipes/composer-form.tsx +2 -0
- package/ux-demo/recipes/loading-inspector.tsx +7 -6
- package/dist/chunk-5FZZMIMD.js.map +0 -1
- package/dist/chunk-D547PH4L.js.map +0 -1
- package/dist/chunk-DVZCMMB3.js.map +0 -1
- package/dist/chunk-JM53SMVF.js.map +0 -1
- package/dist/chunk-KX7DP2GO.js.map +0 -1
- package/dist/chunk-MO56ZZLG.js.map +0 -1
- package/dist/chunk-NMGTHYW3.js.map +0 -1
- package/dist/chunk-UBH743HV.js.map +0 -1
- package/dist/chunk-ULCDZTWL.js.map +0 -1
|
@@ -80,13 +80,21 @@
|
|
|
80
80
|
--kui-radius-pill: var(--wa-border-radius-pill, 999px);
|
|
81
81
|
--kui-disclosure-icon-scale: 0.5;
|
|
82
82
|
/* macOS Tahoe light semantics used by Hot Sheet 2, with a compatible dark extension. */
|
|
83
|
+
/* Every --kui-color-* token (and the focus-ring color) that reads a --wa-*
|
|
84
|
+
token falls back to the value src/webawesome.css assigns to that token,
|
|
85
|
+
including its light-dark() pair, so a page without the Web Awesome theme
|
|
86
|
+
resolves the same palette in both color schemes. A single light color
|
|
87
|
+
here would render, e.g., dark red danger text on a dark surface, and a
|
|
88
|
+
fallback that points at a different token (surface-raised at the surface,
|
|
89
|
+
text-link at the brand fill) silently diverges from the theme.
|
|
90
|
+
tests/browser/tone-contrast.spec.ts pins the parity for every token. */
|
|
83
91
|
--kui-color-surface: var(
|
|
84
92
|
--wa-color-surface-default,
|
|
85
93
|
light-dark(#fff, #1c1c1e)
|
|
86
94
|
);
|
|
87
95
|
--kui-color-surface-raised: var(
|
|
88
96
|
--wa-color-surface-raised,
|
|
89
|
-
|
|
97
|
+
light-dark(#fff, #2c2c2e)
|
|
90
98
|
);
|
|
91
99
|
--kui-color-surface-lowered: var(
|
|
92
100
|
--wa-color-surface-lowered,
|
|
@@ -99,7 +107,7 @@
|
|
|
99
107
|
);
|
|
100
108
|
--kui-color-text-link: var(
|
|
101
109
|
--wa-color-text-link,
|
|
102
|
-
var(--kui-color-brand-
|
|
110
|
+
var(--kui-color-brand-on-quiet)
|
|
103
111
|
);
|
|
104
112
|
|
|
105
113
|
--kui-color-neutral-fill-quiet: var(
|
|
@@ -116,7 +124,7 @@
|
|
|
116
124
|
);
|
|
117
125
|
--kui-color-neutral-border-quiet: var(
|
|
118
126
|
--wa-color-neutral-border-quiet,
|
|
119
|
-
|
|
127
|
+
light-dark(#e5e5ea, #38383a)
|
|
120
128
|
);
|
|
121
129
|
--kui-color-neutral-border-normal: var(
|
|
122
130
|
--wa-color-neutral-border-normal,
|
|
@@ -141,7 +149,7 @@
|
|
|
141
149
|
|
|
142
150
|
--kui-color-brand-fill-loud: var(
|
|
143
151
|
--wa-color-brand-fill-loud,
|
|
144
|
-
light-dark(#
|
|
152
|
+
light-dark(#0075db, #64d2ff)
|
|
145
153
|
);
|
|
146
154
|
--kui-color-brand-fill-quiet: var(
|
|
147
155
|
--wa-color-brand-fill-quiet,
|
|
@@ -179,21 +187,30 @@
|
|
|
179
187
|
--wa-color-brand-border-loud,
|
|
180
188
|
var(--kui-color-brand-fill-loud)
|
|
181
189
|
);
|
|
190
|
+
/* The light brand/success/warning on-quiet values are Kerf-owned (mirrored
|
|
191
|
+
in src/webawesome.css): each is the Hot Sheet 2 hue darkened just enough to
|
|
192
|
+
clear WCAG AA (>=4.5:1) on the lowered page background (#f2f2f7), not only
|
|
193
|
+
on the white surface. The prior #1e6ef4 / #008932 / #a16a00 reached ~4.1:1
|
|
194
|
+
there. Brand #0c62f3 is 4.64:1, success #007f2e 4.62:1, warning #966200
|
|
195
|
+
4.65:1 on the page (5.2:1 on white). */
|
|
182
196
|
--kui-color-brand-on-quiet: var(
|
|
183
197
|
--wa-color-brand-on-quiet,
|
|
184
|
-
light-dark(#
|
|
198
|
+
light-dark(#0c62f3, #8acbff)
|
|
185
199
|
);
|
|
186
200
|
--kui-color-brand-on-normal: var(
|
|
187
201
|
--wa-color-brand-on-normal,
|
|
188
202
|
var(--kui-color-brand-on-quiet)
|
|
189
203
|
);
|
|
190
|
-
--kui-color-brand-on-loud: var(
|
|
204
|
+
--kui-color-brand-on-loud: var(
|
|
205
|
+
--wa-color-brand-on-loud,
|
|
206
|
+
light-dark(#fff, #111113)
|
|
207
|
+
);
|
|
191
208
|
/* Brand accent text placed directly ON a brand fill (quiet or normal), such as
|
|
192
209
|
the info StateBanner and Select's current option. Darker than brand-on-quiet
|
|
193
|
-
so it clears WCAG AA (>=4.5:1): brand-on-quiet (#
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
210
|
+
so it clears WCAG AA (>=4.5:1): brand-on-quiet (#0c62f3) resolves to only
|
|
211
|
+
4.26:1 over brand-fill-normal (#d6ecff), while #1a5dcf (same hue) clears
|
|
212
|
+
~4.9:1 there and ~5.5:1 over brand-fill-quiet (#ebf6ff). The dark value
|
|
213
|
+
matches brand-on-quiet, which already passes over the dark fills. */
|
|
197
214
|
--kui-color-brand-on-fill: light-dark(#1a5dcf, #8acbff);
|
|
198
215
|
|
|
199
216
|
/* Pop is attractive emphasis without status meaning: use it for featured,
|
|
@@ -266,12 +283,19 @@
|
|
|
266
283
|
var(--kui-color-neutral-on-normal)
|
|
267
284
|
)
|
|
268
285
|
);
|
|
269
|
-
--kui-color-success-on-quiet: var(
|
|
270
|
-
|
|
271
|
-
|
|
286
|
+
--kui-color-success-on-quiet: var(
|
|
287
|
+
--wa-color-success-on-quiet,
|
|
288
|
+
light-dark(#007f2e, #63e685)
|
|
289
|
+
);
|
|
290
|
+
--kui-color-success-on-normal: var(
|
|
291
|
+
--wa-color-success-on-normal,
|
|
292
|
+
light-dark(#006d28, #8cea9f)
|
|
293
|
+
);
|
|
294
|
+
--kui-color-success-on-loud: var(--wa-color-success-on-loud, #1d1d1f);
|
|
272
295
|
/* Success text placed ON a success fill (e.g. the success StateBanner). Darker
|
|
273
|
-
than success-on-quiet
|
|
274
|
-
|
|
296
|
+
than success-on-quiet for margin over success-fill-quiet (#e3f7e8): the
|
|
297
|
+
original on-quiet #008932 reached only 4.05:1 there and today's #007f2e sits
|
|
298
|
+
at 4.60:1, while #00792c clears ~5:1. Dark matches success-on-quiet. */
|
|
275
299
|
--kui-color-success-on-fill: light-dark(#00792c, #63e685);
|
|
276
300
|
|
|
277
301
|
--kui-color-warning-fill-loud: var(--wa-color-warning-fill-loud, #ffcc00);
|
|
@@ -315,15 +339,25 @@
|
|
|
315
339
|
var(--kui-color-neutral-on-normal)
|
|
316
340
|
)
|
|
317
341
|
);
|
|
318
|
-
--kui-color-warning-on-quiet: var(
|
|
319
|
-
|
|
342
|
+
--kui-color-warning-on-quiet: var(
|
|
343
|
+
--wa-color-warning-on-quiet,
|
|
344
|
+
light-dark(#966200, #ffd84a)
|
|
345
|
+
);
|
|
346
|
+
--kui-color-warning-on-normal: var(
|
|
347
|
+
--wa-color-warning-on-normal,
|
|
348
|
+
light-dark(#5f3f00, #ffe27a)
|
|
349
|
+
);
|
|
320
350
|
--kui-color-warning-on-loud: var(--wa-color-warning-on-loud, #1d1d1f);
|
|
321
351
|
/* Warning text placed ON a warning fill (e.g. the warning StateBanner). Darker
|
|
322
|
-
than warning-on-quiet
|
|
323
|
-
|
|
352
|
+
than warning-on-quiet for margin over warning-fill-quiet (#fffae8): the
|
|
353
|
+
original on-quiet #a16a00 reached only 4.39:1 there (today's #966200 is
|
|
354
|
+
4.97:1), while #8f5e00 clears ~5.3:1. Dark matches warning-on-quiet. */
|
|
324
355
|
--kui-color-warning-on-fill: light-dark(#8f5e00, #ffd84a);
|
|
325
356
|
|
|
326
|
-
--kui-color-danger-fill-loud: var(
|
|
357
|
+
--kui-color-danger-fill-loud: var(
|
|
358
|
+
--wa-color-danger-fill-loud,
|
|
359
|
+
light-dark(#eb0005, #ff383c)
|
|
360
|
+
);
|
|
327
361
|
--kui-color-danger-fill-quiet: var(
|
|
328
362
|
--wa-color-danger-fill-quiet,
|
|
329
363
|
color-mix(
|
|
@@ -364,9 +398,26 @@
|
|
|
364
398
|
var(--kui-color-neutral-on-normal)
|
|
365
399
|
)
|
|
366
400
|
);
|
|
367
|
-
--kui-color-danger-on-quiet: var(
|
|
368
|
-
|
|
369
|
-
|
|
401
|
+
--kui-color-danger-on-quiet: var(
|
|
402
|
+
--wa-color-danger-on-quiet,
|
|
403
|
+
light-dark(#c20b20, #ff696c)
|
|
404
|
+
);
|
|
405
|
+
--kui-color-danger-on-normal: var(
|
|
406
|
+
--wa-color-danger-on-normal,
|
|
407
|
+
light-dark(#8e0717, #ff8a8c)
|
|
408
|
+
);
|
|
409
|
+
--kui-color-danger-on-loud: var(
|
|
410
|
+
--wa-color-danger-on-loud,
|
|
411
|
+
light-dark(#fff, #111113)
|
|
412
|
+
);
|
|
413
|
+
/* Danger text placed ON a danger fill (e.g. the danger StateBanner) and the
|
|
414
|
+
danger Badge's solid fill. The light value matches danger-on-quiet, which
|
|
415
|
+
already clears WCAG AA (5.7:1) over danger-fill-quiet. The dark value is
|
|
416
|
+
lighter than danger-on-quiet (#ff696c), which reached only 5.7:1 over the
|
|
417
|
+
dark fill-quiet (4.0:1 as dimmed banner detail) and left the solid badge's
|
|
418
|
+
dark text and placeholder skeleton the weakest of any tone on a mid-red
|
|
419
|
+
fill; #ffa0a2 matches the other tones' pale dark on-fill values. */
|
|
420
|
+
--kui-color-danger-on-fill: light-dark(#c20b20, #ffa0a2);
|
|
370
421
|
|
|
371
422
|
/* Compatibility aliases retained for existing @kerfjs/ui consumers. */
|
|
372
423
|
--kui-color-border: var(
|
|
@@ -386,12 +437,17 @@
|
|
|
386
437
|
--kui-color-danger-text: var(--kui-color-danger-on-quiet);
|
|
387
438
|
--kui-focus-ring: var(
|
|
388
439
|
--wa-focus-ring,
|
|
389
|
-
3px solid var(--wa-color-focus,
|
|
440
|
+
3px solid var(--wa-color-focus, light-dark(#007aff, #64d2ff))
|
|
441
|
+
);
|
|
442
|
+
/* Elevation mirrors webawesome.css's scheme-aware shadows: dark raises the
|
|
443
|
+
alpha so a raised surface still separates from a near-black page. */
|
|
444
|
+
--kui-shadow-s: var(
|
|
445
|
+
--wa-shadow-s,
|
|
446
|
+
0 1px 3px light-dark(rgb(0 0 0 / 0.14), rgb(0 0 0 / 0.5))
|
|
390
447
|
);
|
|
391
|
-
--kui-shadow-s: var(--wa-shadow-s, 0 1px 3px rgb(0 0 0 / 0.14));
|
|
392
448
|
--kui-shadow-l: var(
|
|
393
449
|
--wa-shadow-l,
|
|
394
|
-
0 0.75rem 2rem rgb(0 0 0 / 0.09)
|
|
450
|
+
0 0.75rem 2rem light-dark(rgb(0 0 0 / 0.09), rgb(0 0 0 / 0.32))
|
|
395
451
|
);
|
|
396
452
|
}
|
|
397
453
|
|
|
@@ -45,7 +45,9 @@
|
|
|
45
45
|
border-end-end-radius: 0;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
.kui-list-action-row:
|
|
48
|
+
.kui-list-action-row:not([data-placeholder="true"]):has(
|
|
49
|
+
.kui-list-action-row__primary:hover
|
|
50
|
+
) {
|
|
49
51
|
--kui-list-action-row-border: var(--kui-list-action-row-hover-border);
|
|
50
52
|
--kui-list-action-row-background: var(--kui-list-action-row-hover-background);
|
|
51
53
|
}
|
|
@@ -92,12 +94,27 @@
|
|
|
92
94
|
outline: none;
|
|
93
95
|
}
|
|
94
96
|
|
|
95
|
-
|
|
96
|
-
.
|
|
97
|
-
|
|
97
|
+
/* A placeholder is disabled to stay inert, but it is loading, not unavailable:
|
|
98
|
+
it keeps the live row's tone (see the placeholder rule in skeleton.css). The
|
|
99
|
+
disabled tone follows the author's disabled props (the data-kui-disabled
|
|
100
|
+
marker), so a disabled button's placeholder is dimmed like the loaded one;
|
|
101
|
+
only the `not-allowed` cursor is reserved for the live row. */
|
|
102
|
+
.kui-list-action-row
|
|
103
|
+
:is(
|
|
104
|
+
.kui-list-action-row__primary,
|
|
105
|
+
.kui-list-action-row__trailing-action
|
|
106
|
+
)[data-kui-disabled="true"] {
|
|
98
107
|
opacity: 0.58;
|
|
99
108
|
}
|
|
100
109
|
|
|
110
|
+
.kui-list-action-row:not([data-placeholder="true"])
|
|
111
|
+
:is(
|
|
112
|
+
.kui-list-action-row__primary:disabled,
|
|
113
|
+
.kui-list-action-row__trailing-action:disabled
|
|
114
|
+
) {
|
|
115
|
+
cursor: not-allowed;
|
|
116
|
+
}
|
|
117
|
+
|
|
101
118
|
.kui-list-action-row__icon {
|
|
102
119
|
position: absolute;
|
|
103
120
|
inset-block-start: 50%;
|
|
@@ -144,6 +161,9 @@
|
|
|
144
161
|
|
|
145
162
|
.kui-list-action-row__status {
|
|
146
163
|
display: inline-flex;
|
|
164
|
+
/* A full line even when it holds only a placeholder skeleton, which is
|
|
165
|
+
shorter than the text line it stands in for. */
|
|
166
|
+
min-block-size: 1lh;
|
|
147
167
|
align-items: center;
|
|
148
168
|
gap: 0.25rem;
|
|
149
169
|
}
|
|
@@ -180,10 +200,11 @@
|
|
|
180
200
|
opacity: 0;
|
|
181
201
|
}
|
|
182
202
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
203
|
+
/* A placeholder is inert, so hovering it reveals nothing: the trailing action
|
|
204
|
+
keeps the live resting state (hidden until interaction). */
|
|
205
|
+
.kui-list-action-row[data-trailing-visibility="interaction"]:not(
|
|
206
|
+
[data-placeholder="true"]
|
|
207
|
+
):is(:hover, :focus-within)
|
|
187
208
|
.kui-list-action-row__trailing-action {
|
|
188
209
|
opacity: 1;
|
|
189
210
|
}
|
|
@@ -187,8 +187,13 @@
|
|
|
187
187
|
flex: none;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
|
|
191
|
-
|
|
190
|
+
/* A placeholder is disabled to stay inert, but it is loading, not unavailable:
|
|
191
|
+
it keeps the live tone and gives no hover feedback (see the placeholder rule
|
|
192
|
+
in skeleton.css). A disabled control gives none either. */
|
|
193
|
+
.kui-list-header:not([data-placeholder="true"])
|
|
194
|
+
.kui-list-header__action:hover:not(:disabled),
|
|
195
|
+
.kui-list-header:not([data-placeholder="true"])
|
|
196
|
+
.kui-list-header__toggle:hover:not(:disabled) {
|
|
192
197
|
border-color: var(--kui-color-neutral-border-normal);
|
|
193
198
|
background: var(--kui-list-header-hover-background);
|
|
194
199
|
}
|
|
@@ -199,14 +204,21 @@
|
|
|
199
204
|
outline-offset: 1px;
|
|
200
205
|
}
|
|
201
206
|
|
|
202
|
-
|
|
203
|
-
|
|
207
|
+
/* The disabled tone follows the author's `actionDisabled` (the
|
|
208
|
+
data-kui-disabled marker), so a disabled action or toggle's placeholder is
|
|
209
|
+
dimmed like the loaded one; only the `not-allowed` cursor is reserved for
|
|
210
|
+
the live header. The tone is the component's own, never Web Awesome's
|
|
211
|
+
native `button:disabled`, so it holds without webawesome.css. */
|
|
212
|
+
.kui-list-header__action[data-kui-disabled="true"],
|
|
213
|
+
.kui-list-header__toggle[data-kui-disabled="true"] {
|
|
204
214
|
opacity: 0.48;
|
|
205
215
|
}
|
|
206
216
|
|
|
207
|
-
.kui-list-
|
|
208
|
-
|
|
209
|
-
|
|
217
|
+
.kui-list-header:not([data-placeholder="true"])
|
|
218
|
+
.kui-list-header__action:disabled,
|
|
219
|
+
.kui-list-header:not([data-placeholder="true"])
|
|
220
|
+
.kui-list-header__toggle:disabled {
|
|
221
|
+
cursor: not-allowed;
|
|
210
222
|
}
|
|
211
223
|
|
|
212
224
|
.kui-list-header__action > svg,
|
|
@@ -78,17 +78,25 @@
|
|
|
78
78
|
grid-column: 2;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
.kui-list-item:hover {
|
|
81
|
+
.kui-list-item:hover:not([data-placeholder="true"]) {
|
|
82
82
|
border-color: var(--kui-list-item-hover-border);
|
|
83
83
|
background: var(--kui-list-item-hover-background);
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
/* A placeholder is disabled to stay inert, but it is loading, not unavailable:
|
|
87
|
+
it keeps the live row's tone (see the placeholder rule in skeleton.css). The
|
|
88
|
+
disabled tone follows the author's `disabled` prop (the data-kui-disabled
|
|
89
|
+
marker), so a disabled row's placeholder is dimmed like the loaded row; only
|
|
90
|
+
the `not-allowed` cursor is reserved for the live row. */
|
|
91
|
+
.kui-list-item[data-kui-disabled="true"] {
|
|
87
92
|
color: var(--kui-color-neutral-on-quiet);
|
|
88
|
-
cursor: not-allowed;
|
|
89
93
|
opacity: 0.58;
|
|
90
94
|
}
|
|
91
95
|
|
|
96
|
+
.kui-list-item:disabled:not([data-placeholder="true"]) {
|
|
97
|
+
cursor: not-allowed;
|
|
98
|
+
}
|
|
99
|
+
|
|
92
100
|
.kui-list-item[aria-current="page"],
|
|
93
101
|
.kui-list-item[aria-pressed="true"] {
|
|
94
102
|
border-color: var(--kui-list-item-selected-border);
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
z-index: var(--kui-resizable-region-overlay-z, 41);
|
|
153
153
|
max-width: var(--kui-resizable-region-overlay-max-width, 85vw);
|
|
154
154
|
max-height: var(--kui-resizable-region-overlay-max-height, 85vh);
|
|
155
|
-
box-shadow: var(--kui-shadow-l
|
|
155
|
+
box-shadow: var(--kui-shadow-l);
|
|
156
156
|
}
|
|
157
157
|
.kui-resizable-region[data-presentation="overlay"][data-axis="horizontal"] {
|
|
158
158
|
inset-block: 0;
|
|
@@ -148,8 +148,28 @@
|
|
|
148
148
|
outline-offset: 1px;
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
/* A placeholder is disabled to stay inert, but it is loading, not unavailable:
|
|
152
|
+
its choices keep the live tone. SegmentedControl renders no skeleton (its
|
|
153
|
+
choices are known; only the selection is unknown), so it does not load
|
|
154
|
+
skeleton.css and neutralizes disabled chrome itself, including Web Awesome's
|
|
155
|
+
native button:disabled. A choice the author disabled (the data-kui-disabled
|
|
156
|
+
marker) keeps the live disabled tone; only the `not-allowed` cursor is
|
|
157
|
+
reserved for the live control. */
|
|
158
|
+
.kui-segmented-control[data-placeholder="true"] .kui-segmented-control__item {
|
|
159
|
+
cursor: default;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.kui-segmented-control[data-placeholder="true"]
|
|
163
|
+
.kui-segmented-control__item:not([data-kui-disabled="true"]) {
|
|
164
|
+
opacity: 1;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.kui-segmented-control__item[data-kui-disabled="true"] {
|
|
152
168
|
opacity: 0.45;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.kui-segmented-control:not([data-placeholder="true"])
|
|
172
|
+
.kui-segmented-control__item:disabled {
|
|
153
173
|
cursor: not-allowed;
|
|
154
174
|
}
|
|
155
175
|
|
package/dist/styles/select.css
CHANGED
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
.kui-select wa-option {
|
|
117
117
|
--wa-form-control-activated-color: var(--kui-color-brand-fill-normal);
|
|
118
118
|
/* Current option text sits on the activated brand fill; use the darker on-fill
|
|
119
|
-
accent so it clears WCAG AA (brand-on-quiet
|
|
119
|
+
accent so it clears WCAG AA (brand-on-quiet is 4.26:1 over that fill). */
|
|
120
120
|
--current-text-color: var(--kui-color-brand-on-fill);
|
|
121
121
|
}
|
|
122
122
|
.kui-select wa-option::part(start) {
|
|
@@ -189,11 +189,17 @@
|
|
|
189
189
|
width: 100%;
|
|
190
190
|
}
|
|
191
191
|
.kui-select__placeholder-label {
|
|
192
|
+
/* The live field's top label (see webawesome.css): a ListHeader-style label,
|
|
193
|
+
inset by the field's border + inline padding so it lines up with the value. */
|
|
192
194
|
display: block;
|
|
193
|
-
margin-block-end: 0.
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
margin-block-end: 0.375rem;
|
|
196
|
+
padding-inline: calc(1px + var(--kui-layout-item-padding, 0.5rem));
|
|
197
|
+
color: var(--kui-color-neutral-on-quiet);
|
|
198
|
+
font-size: var(--kui-font-xs);
|
|
199
|
+
font-weight: 650;
|
|
200
|
+
letter-spacing: 0.04em;
|
|
201
|
+
line-height: 1.2;
|
|
202
|
+
text-transform: uppercase;
|
|
197
203
|
}
|
|
198
204
|
.kui-select__placeholder-box {
|
|
199
205
|
display: flex;
|
|
@@ -219,23 +225,28 @@
|
|
|
219
225
|
max-width: 100%;
|
|
220
226
|
}
|
|
221
227
|
.kui-select__placeholder-hint {
|
|
228
|
+
/* The live wa-select hint part: small body text at Web Awesome's form-control
|
|
229
|
+
hint metrics (1.6 line height, 7px below the box), inset like the value. */
|
|
222
230
|
display: block;
|
|
223
|
-
margin-block-start: 0.
|
|
231
|
+
margin-block-start: 0.4375rem;
|
|
224
232
|
padding-inline: calc(1px + var(--kui-layout-item-padding, 0.5rem));
|
|
225
233
|
color: var(--kui-color-text-quiet);
|
|
226
|
-
font-size: var(--kui-font-
|
|
227
|
-
line-height: 1.
|
|
234
|
+
font-size: var(--kui-font-s);
|
|
235
|
+
line-height: 1.6;
|
|
228
236
|
}
|
|
229
237
|
.kui-select__placeholder-chevron {
|
|
230
|
-
|
|
231
|
-
|
|
238
|
+
/* The live control's expand-icon box and scale, with the same glyph. */
|
|
239
|
+
display: grid;
|
|
240
|
+
width: 1.25rem;
|
|
232
241
|
height: 1rem;
|
|
233
242
|
flex: none;
|
|
234
|
-
|
|
235
|
-
|
|
243
|
+
place-items: center;
|
|
244
|
+
color: var(--kui-color-neutral-on-quiet);
|
|
245
|
+
transform: scale(var(--kui-disclosure-icon-scale, 0.5));
|
|
236
246
|
}
|
|
237
247
|
.kui-select__placeholder-chevron svg {
|
|
238
248
|
display: block;
|
|
239
|
-
width:
|
|
249
|
+
width: auto;
|
|
240
250
|
height: 100%;
|
|
251
|
+
fill: currentColor;
|
|
241
252
|
}
|
package/dist/styles/skeleton.css
CHANGED
|
@@ -5,14 +5,22 @@
|
|
|
5
5
|
width: 100%;
|
|
6
6
|
max-width: 100%;
|
|
7
7
|
height: 1em;
|
|
8
|
-
min-width: 1.5rem;
|
|
9
8
|
border-radius: var(--kui-skeleton-radius);
|
|
10
9
|
/* Deliberately unanimated: a flat, subtle fill that reads as "not yet loaded"
|
|
11
|
-
without drawing the eye or implying progress.
|
|
12
|
-
|
|
10
|
+
without drawing the eye or implying progress. A host with its own solid
|
|
11
|
+
fill (a solid Badge) supplies `--_kui-skeleton-fill` derived from its
|
|
12
|
+
foreground, since a text-color tint vanishes on a saturated fill. */
|
|
13
|
+
background: var(
|
|
14
|
+
--_kui-skeleton-fill,
|
|
15
|
+
color-mix(in srgb, var(--kui-color-text) 12%, transparent)
|
|
16
|
+
);
|
|
13
17
|
vertical-align: middle;
|
|
14
18
|
}
|
|
15
19
|
|
|
20
|
+
.kui-skeleton[data-block="true"] {
|
|
21
|
+
display: block;
|
|
22
|
+
}
|
|
23
|
+
|
|
16
24
|
.kui-skeleton-lines {
|
|
17
25
|
display: flex;
|
|
18
26
|
width: 100%;
|
|
@@ -24,6 +32,32 @@
|
|
|
24
32
|
height: 0.8em;
|
|
25
33
|
}
|
|
26
34
|
|
|
35
|
+
/* Placeholder mode. A component's `placeholder` keeps its controls `disabled` so
|
|
36
|
+
they stay inert and out of the keyboard order, but a placeholder is loading,
|
|
37
|
+
not unavailable: it must look exactly like the live component except for its
|
|
38
|
+
skeleton values. Neutralize generic disabled chrome, including Web Awesome's
|
|
39
|
+
layered native `button:disabled { opacity: 0.5; cursor: not-allowed }`.
|
|
40
|
+
Opacity carries zero specificity so a component's own opacity rules (a
|
|
41
|
+
hover-revealed control that is invisible until interaction) still win;
|
|
42
|
+
components exclude placeholders from their own disabled tone. The cursor is
|
|
43
|
+
the non-interactive default, never `not-allowed`.
|
|
44
|
+
|
|
45
|
+
A control the author disabled carries `data-kui-disabled="true"` (set from
|
|
46
|
+
the component's own disabled prop, independent of placeholder). It is
|
|
47
|
+
unavailable once loaded, so its placeholder keeps the live disabled tone:
|
|
48
|
+
the reset skips it, and components key their disabled tone on the marker. */
|
|
49
|
+
:where(
|
|
50
|
+
[data-placeholder="true"]:disabled:not([data-kui-disabled="true"]),
|
|
51
|
+
[data-placeholder="true"] :disabled:not([data-kui-disabled="true"])
|
|
52
|
+
) {
|
|
53
|
+
opacity: 1;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
[data-placeholder="true"]:disabled,
|
|
57
|
+
[data-placeholder="true"] :disabled {
|
|
58
|
+
cursor: default;
|
|
59
|
+
}
|
|
60
|
+
|
|
27
61
|
@media (forced-colors: active) {
|
|
28
62
|
.kui-skeleton {
|
|
29
63
|
background: GrayText;
|
|
@@ -41,6 +41,15 @@
|
|
|
41
41
|
align-items: center;
|
|
42
42
|
gap: var(--kui-layout-item-gap, 0.5rem);
|
|
43
43
|
}
|
|
44
|
+
/* The detail is secondary through its smaller, regular-weight type, not a
|
|
45
|
+
dimmed color: an opacity cut toned details below WCAG AA over their fills.
|
|
46
|
+
Only the neutral tone has a quieter text color that still clears AA. */
|
|
47
|
+
.kui-state-banner[data-tone="neutral"] {
|
|
48
|
+
--_kui-state-banner-detail: var(
|
|
49
|
+
--kui-state-banner-detail,
|
|
50
|
+
var(--kui-color-neutral-on-quiet)
|
|
51
|
+
);
|
|
52
|
+
}
|
|
44
53
|
.kui-state-banner[data-tone="info"] {
|
|
45
54
|
--_kui-state-banner-background: var(
|
|
46
55
|
--kui-state-banner-background,
|
|
@@ -123,7 +132,7 @@
|
|
|
123
132
|
);
|
|
124
133
|
--_kui-state-banner-foreground: var(
|
|
125
134
|
--kui-state-banner-foreground,
|
|
126
|
-
var(--kui-state-banner-danger-foreground, var(--kui-color-danger-on-
|
|
135
|
+
var(--kui-state-banner-danger-foreground, var(--kui-color-danger-on-fill))
|
|
127
136
|
);
|
|
128
137
|
}
|
|
129
138
|
.kui-state-banner__icon {
|
|
@@ -134,21 +143,50 @@
|
|
|
134
143
|
width: 1rem;
|
|
135
144
|
height: 1rem;
|
|
136
145
|
}
|
|
146
|
+
/* The copy is inline flow, not flex: a wrapping title lays out as text, so the
|
|
147
|
+
badge follows the title's last word instead of the right edge of a
|
|
148
|
+
flex-shrunk title box, and the detail stays beside them only while it fits
|
|
149
|
+
whole. Otherwise it moves to its own line and truncates at the full copy
|
|
150
|
+
width. Flex shrank the title and detail together, which left a gap before
|
|
151
|
+
the badge and cut the detail early. Each item's trailing margin is the item
|
|
152
|
+
gap, so no margin lands at the start of a wrapped line. */
|
|
137
153
|
.kui-state-banner__copy {
|
|
138
|
-
display: flex;
|
|
139
154
|
min-width: 0;
|
|
140
|
-
|
|
141
|
-
|
|
155
|
+
/* The title's size, so a wrapped title's lines keep the title's own line
|
|
156
|
+
height instead of the larger inherited strut. */
|
|
157
|
+
font-size: var(--kui-font-xs);
|
|
142
158
|
}
|
|
143
159
|
.kui-state-banner__copy strong {
|
|
160
|
+
margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
|
|
144
161
|
font-size: var(--kui-font-xs);
|
|
145
162
|
}
|
|
163
|
+
/* The badge is taller than the title's line. Negative block margins keep it
|
|
164
|
+
out of the line-height calculation, so a wrapped title's lines stay evenly
|
|
165
|
+
spaced whichever line the badge lands on. */
|
|
166
|
+
.kui-state-banner__badge {
|
|
167
|
+
margin-block: -0.5em;
|
|
168
|
+
margin-inline-end: var(--kui-layout-item-gap, 0.5rem);
|
|
169
|
+
vertical-align: baseline;
|
|
170
|
+
}
|
|
171
|
+
/* A placeholder badge holds a skeleton instead of text. With no text, the
|
|
172
|
+
skeleton's baseline would be synthesized from its bottom edge, sitting the
|
|
173
|
+
badge higher than the live one by a font-dependent amount. A zero-width
|
|
174
|
+
character gives it a text baseline in the badge's own font and line
|
|
175
|
+
height, exactly where the live badge's text baseline falls on every
|
|
176
|
+
platform. */
|
|
177
|
+
.kui-state-banner[data-placeholder="true"]
|
|
178
|
+
.kui-state-banner__badge
|
|
179
|
+
> *::before {
|
|
180
|
+
content: "\200b";
|
|
181
|
+
}
|
|
146
182
|
.kui-state-banner__detail {
|
|
147
|
-
|
|
183
|
+
display: inline-block;
|
|
184
|
+
max-width: 100%;
|
|
185
|
+
overflow: clip;
|
|
148
186
|
color: var(--_kui-state-banner-detail);
|
|
149
187
|
font-size: var(--kui-font-2xs);
|
|
150
|
-
opacity: 0.78;
|
|
151
188
|
text-overflow: ellipsis;
|
|
189
|
+
vertical-align: baseline;
|
|
152
190
|
white-space: nowrap;
|
|
153
191
|
}
|
|
154
192
|
.kui-state-banner__action {
|
|
@@ -174,12 +212,10 @@
|
|
|
174
212
|
outline-offset: 2px;
|
|
175
213
|
}
|
|
176
214
|
@media (max-width: 36rem) {
|
|
177
|
-
.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
gap: 0.05rem;
|
|
181
|
-
}
|
|
215
|
+
/* The detail drops below the title. The title row keeps the wide layout's
|
|
216
|
+
relationship: a content-sized badge one item gap after the title, on the
|
|
217
|
+
title's baseline. */
|
|
182
218
|
.kui-state-banner__detail {
|
|
183
|
-
|
|
219
|
+
display: block;
|
|
184
220
|
}
|
|
185
221
|
}
|