@kerfjs/ui 5.0.0-beta.61 → 5.0.0-beta.63
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/README.md +4 -0
- package/ai/component-catalog-extension.schema.json +13 -0
- package/ai/component-catalog.json +20 -7
- package/ai/component-composition.json +17 -3
- package/ai/components/list-item.md +1 -1
- package/ai/components/pane.md +3 -2
- package/ai/components/select.md +1 -0
- package/ai/components/toolbar-text.md +2 -1
- package/ai/components/workbench.md +3 -2
- package/ai/public-api-signatures-v1.md +162 -48
- package/ai/skill.md +11 -5
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +3 -2
- package/catalog-projection-cli.mjs +96 -0
- package/catalog-projection.d.mts +55 -0
- package/catalog-projection.mjs +62 -0
- package/dist/browser/catalog.js +1 -1
- package/dist/browser/collapsible-panel.js +2 -0
- package/dist/browser/nav-stack.js +1 -0
- package/dist/browser/split-view.js +1 -0
- package/dist/browser/toolbar-control-group.js +1 -0
- package/dist/browser/workbench.js +1 -0
- package/dist/catalog-resources.d.ts +1 -1
- package/dist/catalog.d.ts +1 -1
- package/dist/catalog.js +11 -10
- package/dist/catalog.js.map +1 -1
- package/dist/chip.d.ts +9 -3
- package/dist/chip.js +1 -1
- package/dist/{chunk-EZVNC4J6.js → chunk-3BYFWTP3.js} +7 -3
- package/dist/chunk-3BYFWTP3.js.map +1 -0
- package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
- package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
- package/dist/chunk-7AKGPBCC.js +76 -0
- package/dist/chunk-7AKGPBCC.js.map +1 -0
- package/dist/{chunk-KROD7KZK.js → chunk-AUVG54KC.js} +2 -2
- package/dist/{chunk-KROD7KZK.js.map → chunk-AUVG54KC.js.map} +1 -1
- package/dist/{chunk-AUKT3KMG.js → chunk-CQHN45XR.js} +17 -2
- package/dist/chunk-CQHN45XR.js.map +1 -0
- package/dist/{chunk-SWVW56CV.js → chunk-EN4LDR5Y.js} +2 -2
- package/dist/{chunk-SWVW56CV.js.map → chunk-EN4LDR5Y.js.map} +1 -1
- package/dist/{chunk-TEYARRAK.js → chunk-F7OCOBTG.js} +5 -2
- package/dist/chunk-F7OCOBTG.js.map +1 -0
- package/dist/{chunk-5PESG2VP.js → chunk-HXCMWANP.js} +6 -5
- package/dist/chunk-HXCMWANP.js.map +1 -0
- package/dist/{chunk-NYL63PSD.js → chunk-IA4D5XNT.js} +61 -10
- package/dist/chunk-IA4D5XNT.js.map +1 -0
- package/dist/{chunk-F4QMLOXJ.js → chunk-IAOAZUOO.js} +2 -2
- package/dist/{chunk-F4QMLOXJ.js.map → chunk-IAOAZUOO.js.map} +1 -1
- package/dist/{chunk-Y74NWGQW.js → chunk-KFYANKJI.js} +66 -22
- package/dist/chunk-KFYANKJI.js.map +1 -0
- package/dist/chunk-MOSIE4Z2.js +51 -0
- package/dist/chunk-MOSIE4Z2.js.map +1 -0
- package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
- package/dist/chunk-NXWE5S57.js.map +1 -0
- package/dist/{chunk-NNMLEDMD.js → chunk-OBAFAH5B.js} +36 -8
- package/dist/chunk-OBAFAH5B.js.map +1 -0
- package/dist/{chunk-A3CKOW2R.js → chunk-R75GGNWY.js} +123 -20
- package/dist/chunk-R75GGNWY.js.map +1 -0
- package/dist/chunk-RGS4WX2M.js +44 -0
- package/dist/chunk-RGS4WX2M.js.map +1 -0
- package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
- package/dist/chunk-RKTTF3L4.js.map +1 -0
- package/dist/{chunk-RRB26JRJ.js → chunk-RTJNJTG3.js} +2 -2
- package/dist/{chunk-RRB26JRJ.js.map → chunk-RTJNJTG3.js.map} +1 -1
- package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
- package/dist/chunk-SMZGAPCU.js.map +1 -0
- package/dist/{chunk-C4OYOKWX.js → chunk-UA6JW52D.js} +36 -2
- package/dist/chunk-UA6JW52D.js.map +1 -0
- package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
- package/dist/chunk-V3DX3K65.js.map +1 -0
- package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
- package/dist/chunk-WF75U3V4.js.map +1 -0
- package/dist/{chunk-VCBTX62E.js → chunk-ZRWXFDDS.js} +2 -2
- package/dist/chunk-ZRWXFDDS.js.map +1 -0
- package/dist/collapsible-panel.d.ts +18 -7
- package/dist/collapsible-panel.js +19 -3
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/content-item.d.ts +36 -5
- package/dist/content-item.js +1 -1
- package/dist/disclosure-arrow.js +2 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +22 -22
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/lucide-icon.d.ts +5 -2
- package/dist/lucide-icon.js +2 -1
- package/dist/nav-stack.d.ts +3 -1
- package/dist/nav-stack.js +2 -1
- package/dist/pane.d.ts +10 -4
- package/dist/pane.js +1 -1
- package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
- package/dist/popup-menu-register.js +38 -1
- package/dist/popup-menu-register.js.map +1 -1
- package/dist/popup-menu.d.ts +2 -2
- package/dist/popup-menu.js +1 -1
- package/dist/select.d.ts +2 -0
- package/dist/select.js +1 -1
- package/dist/split-view.d.ts +1 -1
- package/dist/split-view.js +2 -1
- package/dist/split-view.js.map +1 -1
- package/dist/styles/app-tab.css +84 -0
- package/dist/styles/chip.css +14 -0
- package/dist/styles/content-item.css +36 -0
- package/dist/styles/list-action-row.css +4 -3
- package/dist/styles/list-header.css +4 -3
- package/dist/styles/list-item.css +21 -11
- package/dist/styles/lucide-icon.css +5 -0
- package/dist/styles/nav-stack.css +13 -0
- package/dist/styles/pane.css +36 -2
- package/dist/styles/popup-menu.css +15 -10
- package/dist/styles/resizable-region.css +9 -0
- package/dist/styles/select.css +26 -0
- package/dist/styles/split-view.css +6 -0
- package/dist/styles/sunken-panel.css +7 -0
- package/dist/styles/tab-bar.css +3 -0
- package/dist/styles/tab-scaffold.css +13 -0
- package/dist/styles/text.css +29 -0
- package/dist/styles/token-search-field.css +29 -6
- package/dist/styles/toolbar-control-group.css +35 -0
- package/dist/styles/toolbar-text.css +15 -6
- package/dist/styles/toolbar.css +7 -0
- package/dist/styles/workbench.css +260 -90
- package/dist/sunken-panel.d.ts +6 -1
- package/dist/sunken-panel.js +1 -1
- package/dist/tab-bar.d.ts +6 -2
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +3 -0
- package/dist/tab-scaffold.js +1 -0
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/text.d.ts +14 -3
- package/dist/text.js +1 -1
- package/dist/token-search-field.js +2 -1
- package/dist/toolbar-control-group.d.ts +5 -1
- package/dist/toolbar-control-group.js +2 -1
- package/dist/toolbar-text.d.ts +1 -1
- package/dist/toolbar-text.js +1 -1
- package/dist/toolbar.d.ts +7 -4
- package/dist/toolbar.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-content-items.d.ts +9 -0
- package/dist/wire-content-items.js +62 -0
- package/dist/wire-content-items.js.map +1 -0
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.js +2 -1
- package/dist/wire-workbench.d.ts +7 -0
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench.d.ts +24 -8
- package/dist/workbench.js +2 -1
- package/docs/accessibility.md +21 -5
- package/docs/catalog.md +36 -0
- package/docs/collapsible-panel.md +12 -4
- package/docs/component-contract.md +10 -4
- package/docs/component-selection.md +65 -15
- package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
- package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
- package/docs/design/templates/toolbar-dark.svg +1 -1
- package/docs/design/templates/toolbar.svg +1 -1
- package/docs/examples/component-catalog-extension.json +6 -0
- package/docs/layout.md +61 -3
- package/docs/nav-stack.md +5 -0
- package/docs/split-view.md +5 -0
- package/docs/sunken-panel.md +30 -1
- package/docs/tab-scaffold.md +5 -0
- package/docs/ui-analyzer.md +4 -0
- package/docs/webawesome-theme.md +36 -6
- package/docs/workbench.md +60 -14
- package/llms.txt +12 -4
- package/package.json +16 -2
- package/scripts/component-catalog-extension-validation.mjs +28 -0
- package/dist/chunk-3SXMEK3B.js.map +0 -1
- package/dist/chunk-4R777DUZ.js +0 -34
- package/dist/chunk-4R777DUZ.js.map +0 -1
- package/dist/chunk-5PESG2VP.js.map +0 -1
- package/dist/chunk-6ZXOQEAN.js.map +0 -1
- package/dist/chunk-7JUBXOIV.js.map +0 -1
- package/dist/chunk-A3CKOW2R.js.map +0 -1
- package/dist/chunk-AUKT3KMG.js.map +0 -1
- package/dist/chunk-C4OYOKWX.js.map +0 -1
- package/dist/chunk-EAC4CDY7.js.map +0 -1
- package/dist/chunk-EZVNC4J6.js.map +0 -1
- package/dist/chunk-MA73TA6D.js +0 -42
- package/dist/chunk-MA73TA6D.js.map +0 -1
- package/dist/chunk-MERWRTBG.js +0 -45
- package/dist/chunk-MERWRTBG.js.map +0 -1
- package/dist/chunk-N3GKMPDW.js.map +0 -1
- package/dist/chunk-NNMLEDMD.js.map +0 -1
- package/dist/chunk-NYL63PSD.js.map +0 -1
- package/dist/chunk-TEYARRAK.js.map +0 -1
- package/dist/chunk-VCBTX62E.js.map +0 -1
- package/dist/chunk-Y74NWGQW.js.map +0 -1
|
@@ -176,10 +176,16 @@ an upstream component or recipe request.
|
|
|
176
176
|
|
|
177
177
|
## Ambiguous choices
|
|
178
178
|
|
|
179
|
+
For a lowered background behind an entire scrolling work area, choose
|
|
180
|
+
`Pane appearance="sunken"` or the appearance option on the layout that owns
|
|
181
|
+
the scroll viewport. Use `SunkenPanel` for a padded content group that does
|
|
182
|
+
not introduce scrolling. See [Lowered work surfaces](./layout.md#lowered-work-surfaces).
|
|
183
|
+
|
|
179
184
|
Set `ResizableRegion`'s `--kui-resizable-region-background` for an inline
|
|
180
|
-
surface.
|
|
181
|
-
|
|
182
|
-
|
|
185
|
+
surface. An open descendant `PopupMenu` or Web Awesome dropdown automatically
|
|
186
|
+
releases clipping and raises the region on its public popup layer. Set
|
|
187
|
+
`contentOverflow="visible"` for other anchored content that must escape the
|
|
188
|
+
region. A collapsed region can place `restoreControl` in a top or bottom corner with
|
|
183
189
|
`restorePosition`, set its typed `restoreInset`, or use
|
|
184
190
|
`restorePlacement="inline"` for a control in normal flow.
|
|
185
191
|
|
|
@@ -196,11 +202,16 @@ whole label. `divider` owns a before or after separator. Set
|
|
|
196
202
|
`--kui-list-item-*` tokens control its row, icon, label, and trailing geometry
|
|
197
203
|
and color. `ListHeader` exposes `--kui-list-header-min-height`, title padding,
|
|
198
204
|
title minimum height, and border-width tokens for section density.
|
|
205
|
+
Set `--kui-list-group-divider-color` on a containing `List` to give
|
|
206
|
+
`ListHeader`, `ListItem`, and `ListActionRow` the same before/after divider
|
|
207
|
+
color; each row otherwise uses the quiet neutral border tone.
|
|
199
208
|
For a filled command list, set `--kui-list-item-background` and
|
|
200
|
-
`--kui-list-item-border` on the list or row.
|
|
201
|
-
`--kui-list-item-hover-
|
|
202
|
-
|
|
203
|
-
|
|
209
|
+
`--kui-list-item-border` on the list or row. Scope `--kui-list-item-color`,
|
|
210
|
+
`--kui-list-item-hover-background`, `--kui-list-item-selected-color`, and
|
|
211
|
+
`--kui-list-item-selected-background` at the same boundary for text and state
|
|
212
|
+
fills. The matching `--kui-list-item-hover-border` and
|
|
213
|
+
`--kui-list-item-selected-border` tokens set state outlines without replacing
|
|
214
|
+
ListItem CSS or neutralizing global semantic border colors.
|
|
204
215
|
|
|
205
216
|
Use `ListItemLink` from `@kerfjs/ui/list-item` for a navigation row with a
|
|
206
217
|
real `href`. It shares `ListItem` content slots, density, selection, and row
|
|
@@ -212,7 +223,9 @@ name. Disabled and loading links omit `href` and leave the tab order. Use
|
|
|
212
223
|
Use `Toolbar responsive="trailing-priority"` for a collapsible search in the
|
|
213
224
|
trailing zone that should take a full second row when expanded. `responsiveAt`
|
|
214
225
|
chooses the compact or narrow container breakpoint. The leading identity stays
|
|
215
|
-
in the first row.
|
|
226
|
+
in the first row. Set `centerAlign="balanced"` when the center zone must sit on
|
|
227
|
+
the toolbar's midpoint despite unequal or empty side content; it gives the
|
|
228
|
+
leading and trailing zones equal tracks. `--kui-toolbar-leading-min-width`,
|
|
216
229
|
`--kui-toolbar-trailing-gap`, `--kui-toolbar-trailing-justify`, and the
|
|
217
230
|
`--kui-toolbar-*-padding-inline` zone tokens adjust local geometry without
|
|
218
231
|
selecting toolbar anatomy from application CSS.
|
|
@@ -225,8 +238,10 @@ For compact dialog copy, use `Text flush lineHeight="tight"`; block Text still
|
|
|
225
238
|
resets native margins. `ValueTable density="compact"` reduces row padding and
|
|
226
239
|
gap. Its `--kui-value-table-row-columns`, `--kui-value-table-row-padding-block`,
|
|
227
240
|
and `--kui-value-table-row-gap` tokens support a specific metadata layout.
|
|
228
|
-
Use `ToolbarText size="xsmall"` for a dense rail heading.
|
|
229
|
-
`
|
|
241
|
+
Use `ToolbarText size="xsmall"` for a dense rail heading. Use
|
|
242
|
+
`size="xlarge-fixed"` for a toolbar heading at the fixed 20px step; `xlarge`
|
|
243
|
+
retains the responsive page-title clamp. Pass `headingLevel` when the text is
|
|
244
|
+
a section landmark. A `TokenSearchField` editor can shrink to zero minimum width inside a narrow
|
|
230
245
|
group; set `--kui-token-search-editor-min-width` only when a wider editor is
|
|
231
246
|
required.
|
|
232
247
|
|
|
@@ -234,7 +249,11 @@ required.
|
|
|
234
249
|
- `TabBar` changes tabpanels and supports overflow/reorder; `SegmentedControl` chooses among a few compact views; `Select` handles a longer value list.
|
|
235
250
|
|
|
236
251
|
Use `AppTab presentation="icon-only"` with its `name` kept as the accessible
|
|
237
|
-
tab name
|
|
252
|
+
tab name. For segmented tabs that should show names in a wide reader and icons
|
|
253
|
+
in a narrower container, set `TabBar iconOnlyAt="wide"` (832px), `"narrow"`
|
|
254
|
+
(704px), or `"compact"` (448px), and give each segmented `AppTab` a leading
|
|
255
|
+
icon. The tablist's own width controls the switch; the visually hidden name
|
|
256
|
+
remains its accessible name. Use `labelMaxWidth` for an ellipsized visible name. Set `attention`
|
|
238
257
|
to color a tab's name with `--kui-app-tab-attention-color`. Set `dropTarget`
|
|
239
258
|
while an app drag is over a tab's content; the tab keeps its selection semantics
|
|
240
259
|
and uses the `--kui-app-tab-drop-target-*` tokens for its highlight. Set
|
|
@@ -246,7 +265,9 @@ its internal classes. `--kui-tab-bar-trailing-flex` controls the trailing zone.
|
|
|
246
265
|
Set `pinned` on the first `AppTab` when that tab must remain visible as peers
|
|
247
266
|
scroll. It stays inside the tablist and keyboard order. Set the public
|
|
248
267
|
`--kui-app-tab-pinned-background` token if the surrounding surface differs from
|
|
249
|
-
the default; the pinned tab must cover peers as they scroll beneath it.
|
|
268
|
+
the default; the pinned tab must cover peers as they scroll beneath it. Call
|
|
269
|
+
`wireTabBars` for keyboard selection and reorder behavior and its WebKit RTL
|
|
270
|
+
scroll correction.
|
|
250
271
|
|
|
251
272
|
- `StateBanner` persists beside affected work; `EmptyState` replaces absent content; `wa-callout` is contextual ecosystem content; `wa-toast` and `wa-toast-item` are transient and must not carry the only copy of important state.
|
|
252
273
|
|
|
@@ -258,6 +279,10 @@ stacked copy's spacing at an instance boundary.
|
|
|
258
279
|
|
|
259
280
|
For a compact `Select`, set `triggerWidth` to `"fit-content"`, `"max-content"`,
|
|
260
281
|
or `"fill"` and cap it with `--kui-select-trigger-max-width` when needed.
|
|
282
|
+
For a round icon-only toolbar trigger, set `selectedPresentation="icon-only"`
|
|
283
|
+
and `caret={false}`. The control keeps its accessible name, current choice help
|
|
284
|
+
tag, and keyboard-operated listbox; the selected icon stays centered even when
|
|
285
|
+
`renderSelected` supplies it. The default keeps the visible caret.
|
|
261
286
|
Custom `renderSelected` text inherits the control color by default; the
|
|
262
287
|
`--kui-select-selected-color`, `--kui-select-selected-font-size`, and
|
|
263
288
|
`--kui-select-selected-font-weight` tokens configure its typography. Plain
|
|
@@ -338,8 +363,18 @@ example `b`, `tr`, or `trbl`) only when the toolbar owns a permanent separator
|
|
|
338
363
|
edge. Dividers earn their place: never fake one with a border or pad below one
|
|
339
364
|
to make it look right.
|
|
340
365
|
|
|
366
|
+
`Toolbar` renders a semantic `header` by default. Set `position="footer"`
|
|
367
|
+
for a toolbar at the bottom of a pane or page; Workbench's
|
|
368
|
+
`mainBottomToolbar` and the catalog resource bar apply this automatically.
|
|
369
|
+
The position changes the HTML element without changing zones or geometry.
|
|
370
|
+
|
|
341
371
|
Common toolbar patterns:
|
|
342
372
|
|
|
373
|
+
For a long-running icon action, set `busy` on its single-control
|
|
374
|
+
`ToolbarControlGroup` and supply a descriptive `busyLabel`. The group preserves
|
|
375
|
+
the control's dimensions, shows `LoadingSpinner` in its icon slot, sets
|
|
376
|
+
`aria-busy`, and makes the control inert until the app clears `busy`.
|
|
377
|
+
|
|
343
378
|
| Want | Put in the zone | Notes |
|
|
344
379
|
| ----------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
|
|
345
380
|
| Identity or title text | `<ToolbarText text="…" size="large" />` (or `xlarge` for a page/panel title that fits) | Wrap in a `single` borderless group only when it must align with adjacent control pills |
|
|
@@ -399,9 +434,12 @@ items shape covers single-line and batch actions; compute each batch child's
|
|
|
399
434
|
```
|
|
400
435
|
|
|
401
436
|
For a flat command menu with persistent sort choices, group commands under
|
|
402
|
-
`heading` entries and set `
|
|
403
|
-
|
|
404
|
-
|
|
437
|
+
`heading` entries and set `checked` explicitly on each choice. Checked rows
|
|
438
|
+
show a checkmark; the background marks the current keyboard row, as in `Select`.
|
|
439
|
+
Only items with `checked: true` or `checked: false` reserve checkmark space.
|
|
440
|
+
Omit `checked` for a plain command, including one beside checkbox items.
|
|
441
|
+
Commands still dispatch their own `data-action` once on pointer and keyboard
|
|
442
|
+
selection.
|
|
405
443
|
|
|
406
444
|
For a row opened by right-click, render `PopupMenu` with `context`, `label`,
|
|
407
445
|
and a stable root `data-*` marker. Its trigger is an invisible anchor removed
|
|
@@ -450,6 +488,12 @@ geometry and 44px targets.
|
|
|
450
488
|
</Pane>
|
|
451
489
|
```
|
|
452
490
|
|
|
491
|
+
When that child is a selectable card, configure `ContentItem` with
|
|
492
|
+
`interactive`, `action`, `itemId`, and a `selectionMode`; wire
|
|
493
|
+
`wireContentItems` once for Enter and Space. The component owns selection,
|
|
494
|
+
hover, focus, and disabled paint in its reserved 1px frame (see
|
|
495
|
+
[Content items](./layout.md#content-items)).
|
|
496
|
+
|
|
453
497
|
Incorrect: duplicating component-like rows and compensating for nested padding
|
|
454
498
|
forks the package anatomy and spacing contract.
|
|
455
499
|
|
|
@@ -470,6 +514,12 @@ The application updates its tag list after the action. `size="compact"` uses a
|
|
|
470
514
|
20px chip with a 16px remove button, and `disabled` disables removal. Tone,
|
|
471
515
|
appearance, and shape use the same semantic choices as `Badge`; use `Badge`
|
|
472
516
|
when no removal is needed and the content is status or count metadata.
|
|
517
|
+
Pass an unsized, decorative `LucideIcon` through `icon` for a leading glyph;
|
|
518
|
+
Chip sizes it to its own type scale and aligns it beside the label. For a long
|
|
519
|
+
plain-text label, set `truncate`: the chip can shrink within a `Row`, its label
|
|
520
|
+
gets a one-line ellipsis, and the full string is the label's native `title`.
|
|
521
|
+
Keep a price or other unbreakable sibling in `Text wrap="nowrap"`. `truncate`
|
|
522
|
+
requires a string label so the title cannot lose text hidden inside markup.
|
|
473
523
|
|
|
474
524
|
```tsx
|
|
475
525
|
<Chip
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 104" width="640" height="104"><defs><clipPath id="cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#cp0)"
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 104" width="640" height="104"><defs><clipPath id="cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#cp0)"/><g clip-path="url(#ov1)"><rect x="28.5" y="28.5" width="91" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp2)"><g clip-path="url(#ov3)"><g clip-path="url(#cp4)"><g clip-path="url(#ct5)"><text x="38" y="55.41" font-family=""ui-sans-serif", "-apple-system", "system-ui", "Segoe UI", sans-serif" font-size="16" font-weight="650" fill="rgb(174,174,178)">Northstar</text></g></g></g></g></g><rect x="488" y="28" width="124" height="44" rx="22" fill="rgb(58,58,60)"/><rect x="488.5" y="28.5" width="123" height="43" rx="21.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><rect x="490.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp6)"><g color="rgb(174, 174, 178)"><clipPath id="svgic7"><rect x="502" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgic7)"><g transform="translate(502 42)scale(.66667)"><path d="M3 5z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 12z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 19z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 5h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 12h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 19h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="530.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp8)"><g color="rgb(174, 174, 178)"><clipPath id="svgic9"><rect x="542" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgic9)"><g transform="translate(542 42)scale(.66667)"><rect width="18" height="18" x="3" y="3" rx="2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M15 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="570.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp10)"><g color="rgb(174, 174, 178)"><clipPath id="svgic11"><rect x="582" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgic11)"><g transform="translate(582 42)scale(.66667)"><path d="M9.7 4.1a2.3 2.3 0 0 1 4.6 0 2.3 2.3 0 0 0 3.3 2 2.3 2.3 0 0 1 2.4 4 2.3 2.3 0 0 0 0 3.8 2.3 2.3 0 0 1-2.4 4 2.3 2.3 0 0 0-3.3 2 2.3 2.3 0 0 1-4.6 0 2.3 2.3 0 0 0-3.3-2A2.3 2.3 0 0 1 4 14a2.3 2.3 0 0 0 0-3.8 2.3 2.3 0 0 1 2.3-4 2.3 2.3 0 0 0 3.4-2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><circle cx="12" cy="12" r="3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 104" width="640" height="104"><defs><clipPath id="cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#cp0)"
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 104" width="640" height="104"><defs><clipPath id="cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#cp0)"/><g clip-path="url(#ov1)"><rect x="28.5" y="28.5" width="91" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp2)"><g clip-path="url(#ov3)"><g clip-path="url(#cp4)"><g clip-path="url(#ct5)"><text x="38" y="55.41" font-family=""ui-sans-serif", "-apple-system", "system-ui", "Segoe UI", sans-serif" font-size="16" font-weight="650" fill="rgb(110,110,115)">Northstar</text></g></g></g></g></g><rect x="488" y="28" width="124" height="44" rx="22" fill="rgb(229,229,234)"/><rect x="488.5" y="28.5" width="123" height="43" rx="21.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><rect x="490.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp6)"><g color="rgb(110, 110, 115)"><clipPath id="svgic7"><rect x="502" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgic7)"><g transform="translate(502 42)scale(.66667)"><path d="M3 5z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 12z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 19z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 5h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 12h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 19h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="530.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp8)"><g color="rgb(110, 110, 115)"><clipPath id="svgic9"><rect x="542" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgic9)"><g transform="translate(542 42)scale(.66667)"><rect width="18" height="18" x="3" y="3" rx="2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M15 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="570.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp10)"><g color="rgb(110, 110, 115)"><clipPath id="svgic11"><rect x="582" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgic11)"><g transform="translate(582 42)scale(.66667)"><path d="M9.7 4.1a2.3 2.3 0 0 1 4.6 0 2.3 2.3 0 0 0 3.3 2 2.3 2.3 0 0 1 2.4 4 2.3 2.3 0 0 0 0 3.8 2.3 2.3 0 0 1-2.4 4 2.3 2.3 0 0 0-3.3 2 2.3 2.3 0 0 1-4.6 0 2.3 2.3 0 0 0-3.3-2A2.3 2.3 0 0 1 4 14a2.3 2.3 0 0 0 0-3.8 2.3 2.3 0 0 1 2.3-4 2.3 2.3 0 0 0 3.4-2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><circle cx="12" cy="12" r="3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 672 158" width="672" height="158"><defs><clipPath id="cp0"><rect x="16" y="38" width="640" height="104"/></clipPath><clipPath id="ct1"><rect x="16" y="16" width="640" height="22"/></clipPath><clipPath id="irc2"><rect x="16" y="38" width="640" height="104" rx="0"/></clipPath></defs><rect x="0" y="0" width="672" height="158" rx="0" fill="rgb(28,28,30)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Title with a trailing group</text><g clip-path="url(#cp0)"><g clip-path="url(#irc2)"><clipPath id="svgimg3vclip"><rect x="16" y="38" width="640" height="104"/></clipPath><g clip-path="url(#svgimg3vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg3cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="svgimg3ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="svgimg3cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="svgimg3ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="svgimg3cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#svgimg3cp0)"
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 672 158" width="672" height="158"><defs><clipPath id="cp0"><rect x="16" y="38" width="640" height="104"/></clipPath><clipPath id="ct1"><rect x="16" y="16" width="640" height="22"/></clipPath><clipPath id="irc2"><rect x="16" y="38" width="640" height="104" rx="0"/></clipPath></defs><rect x="0" y="0" width="672" height="158" rx="0" fill="rgb(28,28,30)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">Title with a trailing group</text><g clip-path="url(#cp0)"><g clip-path="url(#irc2)"><clipPath id="svgimg3vclip"><rect x="16" y="38" width="640" height="104"/></clipPath><g clip-path="url(#svgimg3vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg3cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="svgimg3ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="svgimg3cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="svgimg3ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="svgimg3cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#svgimg3cp0)"/><g clip-path="url(#svgimg3ov1)"><rect x="28.5" y="28.5" width="91" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp2)"><g clip-path="url(#svgimg3ov3)"><g clip-path="url(#svgimg3cp4)"><g clip-path="url(#svgimg3ct5)"><text x="38" y="55.41" font-family=""ui-sans-serif", "-apple-system", "system-ui", "Segoe UI", sans-serif" font-size="16" font-weight="650" fill="rgb(174,174,178)">Northstar</text></g></g></g></g></g><rect x="488" y="28" width="124" height="44" rx="22" fill="rgb(58,58,60)"/><rect x="488.5" y="28.5" width="123" height="43" rx="21.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><rect x="490.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp6)"><g color="rgb(174, 174, 178)"><clipPath id="svgimg3svgic7"><rect x="502" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgimg3svgic7)"><g transform="translate(502 42)scale(.66667)"><path d="M3 5z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 12z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 19z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 5h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 12h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 19h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="530.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp8)"><g color="rgb(174, 174, 178)"><clipPath id="svgimg3svgic9"><rect x="542" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgimg3svgic9)"><g transform="translate(542 42)scale(.66667)"><rect width="18" height="18" x="3" y="3" rx="2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M15 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="570.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp10)"><g color="rgb(174, 174, 178)"><clipPath id="svgimg3svgic11"><rect x="582" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgimg3svgic11)"><g transform="translate(582 42)scale(.66667)"><path d="M9.7 4.1a2.3 2.3 0 0 1 4.6 0 2.3 2.3 0 0 0 3.3 2 2.3 2.3 0 0 1 2.4 4 2.3 2.3 0 0 0 0 3.8 2.3 2.3 0 0 1-2.4 4 2.3 2.3 0 0 0-3.3 2 2.3 2.3 0 0 1-4.6 0 2.3 2.3 0 0 0-3.3-2A2.3 2.3 0 0 1 4 14a2.3 2.3 0 0 0 0-3.8 2.3 2.3 0 0 1 2.3-4 2.3 2.3 0 0 0 3.4-2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><circle cx="12" cy="12" r="3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 672 158" width="672" height="158"><defs><clipPath id="cp0"><rect x="16" y="38" width="640" height="104"/></clipPath><clipPath id="ct1"><rect x="16" y="16" width="640" height="22"/></clipPath><clipPath id="irc2"><rect x="16" y="38" width="640" height="104" rx="0"/></clipPath></defs><rect x="0" y="0" width="672" height="158" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Title with a trailing group</text><g clip-path="url(#cp0)"><g clip-path="url(#irc2)"><clipPath id="svgimg3vclip"><rect x="16" y="38" width="640" height="104"/></clipPath><g clip-path="url(#svgimg3vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg3cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="svgimg3ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="svgimg3cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="svgimg3ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="svgimg3cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#svgimg3cp0)"
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 672 158" width="672" height="158"><defs><clipPath id="cp0"><rect x="16" y="38" width="640" height="104"/></clipPath><clipPath id="ct1"><rect x="16" y="16" width="640" height="22"/></clipPath><clipPath id="irc2"><rect x="16" y="38" width="640" height="104" rx="0"/></clipPath></defs><rect x="0" y="0" width="672" height="158" rx="0" fill="rgb(255,255,255)"/><text x="16" y="28" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Title with a trailing group</text><g clip-path="url(#cp0)"><g clip-path="url(#irc2)"><clipPath id="svgimg3vclip"><rect x="16" y="38" width="640" height="104"/></clipPath><g clip-path="url(#svgimg3vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg3cp0"><rect x="28" y="28" width="452" height="44"/></clipPath><clipPath id="svgimg3ov1"><rect x="28" y="28" width="452" height="44" rx="0"/></clipPath><clipPath id="svgimg3cp2"><rect x="30" y="30" width="88.1" height="40"/></clipPath><clipPath id="svgimg3ov3"><rect x="30" y="30" width="88.1" height="40" rx="0"/></clipPath><clipPath id="svgimg3cp4"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3ct5"><rect x="38" y="40.4" width="72.1" height="19.2"/></clipPath><clipPath id="svgimg3cp6"><rect x="502" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp8"><rect x="542" y="42" width="16" height="16"/></clipPath><clipPath id="svgimg3cp10"><rect x="582" y="42" width="16" height="16"/></clipPath></defs><g clip-path="url(#svgimg3cp0)"/><g clip-path="url(#svgimg3ov1)"><rect x="28.5" y="28.5" width="91" height="43" rx="21.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp2)"><g clip-path="url(#svgimg3ov3)"><g clip-path="url(#svgimg3cp4)"><g clip-path="url(#svgimg3ct5)"><text x="38" y="55.41" font-family=""ui-sans-serif", "-apple-system", "system-ui", "Segoe UI", sans-serif" font-size="16" font-weight="650" fill="rgb(110,110,115)">Northstar</text></g></g></g></g></g><rect x="488" y="28" width="124" height="44" rx="22" fill="rgb(229,229,234)"/><rect x="488.5" y="28.5" width="123" height="43" rx="21.5" fill="none" stroke="rgb(209,209,214)" stroke-width="1"/><rect x="490.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp6)"><g color="rgb(110, 110, 115)"><clipPath id="svgimg3svgic7"><rect x="502" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgimg3svgic7)"><g transform="translate(502 42)scale(.66667)"><path d="M3 5z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 12z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 19z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 5h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 12h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 19h13" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="530.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp8)"><g color="rgb(110, 110, 115)"><clipPath id="svgimg3svgic9"><rect x="542" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgimg3svgic9)"><g transform="translate(542 42)scale(.66667)"><rect width="18" height="18" x="3" y="3" rx="2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M15 3v18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><rect x="570.5" y="30.5" width="39" height="39" rx="19.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg3cp10)"><g color="rgb(110, 110, 115)"><clipPath id="svgimg3svgic11"><rect x="582" y="42" width="16" height="16"/></clipPath><g clip-path="url(#svgimg3svgic11)"><g transform="translate(582 42)scale(.66667)"><path d="M9.7 4.1a2.3 2.3 0 0 1 4.6 0 2.3 2.3 0 0 0 3.3 2 2.3 2.3 0 0 1 2.4 4 2.3 2.3 0 0 0 0 3.8 2.3 2.3 0 0 1-2.4 4 2.3 2.3 0 0 0-3.3 2 2.3 2.3 0 0 1-4.6 0 2.3 2.3 0 0 0-3.3-2A2.3 2.3 0 0 1 4 14a2.3 2.3 0 0 0 0-3.8 2.3 2.3 0 0 1 2.3-4 2.3 2.3 0 0 0 3.4-2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><circle cx="12" cy="12" r="3" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(110, 110, 115)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g></g></g></g></g></svg>
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
],
|
|
18
18
|
"publicClasses": ["acme-filter-chip"],
|
|
19
19
|
"publicTokens": ["--acme-filter-chip-accent"],
|
|
20
|
+
"uses": ["chip"],
|
|
21
|
+
"source": "src/filter-chip.tsx",
|
|
22
|
+
"demoSource": "ux-demo/demos/filter-chip.tsx",
|
|
20
23
|
"geometry": {
|
|
21
24
|
"margin": "none",
|
|
22
25
|
"border": "self",
|
|
@@ -31,6 +34,9 @@
|
|
|
31
34
|
"purpose": "An application inspector composed from Kerf panel, content, and value primitives.",
|
|
32
35
|
"useWhen": ["A selected record needs a titled fact-and-action region."],
|
|
33
36
|
"avoidWhen": ["A ValueTable alone expresses the complete interaction."],
|
|
37
|
+
"uses": ["acme-filter-chip", "toolbar", "value-table"],
|
|
38
|
+
"source": "src/inspector.tsx",
|
|
39
|
+
"demoSource": "ux-demo/demos/inspector.tsx",
|
|
34
40
|
"geometry": {
|
|
35
41
|
"margin": "parent",
|
|
36
42
|
"border": "child",
|
package/docs/layout.md
CHANGED
|
@@ -36,6 +36,40 @@ size) tall, and below that lets the whole pane scroll as one column, header,
|
|
|
36
36
|
content, and footer together, so the content keeps its natural height. The
|
|
37
37
|
default `fixed` always pins them.
|
|
38
38
|
|
|
39
|
+
### Lowered work surfaces
|
|
40
|
+
|
|
41
|
+
Set `appearance="sunken"` when the work area itself should use the lowered
|
|
42
|
+
surface color, including blank space below short content and the scroll
|
|
43
|
+
viewport. The default appearance is unchanged. The fixed Pane paints its
|
|
44
|
+
content scroller; with `chromePlacement="auto"`, the Pane root paints the
|
|
45
|
+
surface because it becomes the scroller in a short viewport. Header and footer
|
|
46
|
+
chrome stay on the normal surface. No second scroll container or
|
|
47
|
+
`SunkenPanel` wrapper is needed.
|
|
48
|
+
Sunken panes draw their header/footer dividers by default, even when short
|
|
49
|
+
content does not scroll. Pass `chromeDividers="scroll"` to restore scroll-state
|
|
50
|
+
dividers or `"none"` to hide them.
|
|
51
|
+
For custom chrome colors in auto mode, set `--kui-pane-chrome-background`
|
|
52
|
+
on the Pane; it defaults to `--kui-color-surface`.
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<Pane appearance="sunken" footer={<Composer />}>
|
|
56
|
+
<Conversation />
|
|
57
|
+
</Pane>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`PaneConfig.appearance` forwards through Workbench `mainPane`, panel `pane`,
|
|
61
|
+
and CollapsiblePanel `pane`. Workbench also applies that choice to its main or
|
|
62
|
+
panel region when it renders no Pane chrome. Set `appearance: "sunken"` on a
|
|
63
|
+
`NavStackView` or `TabScaffoldTab` when its view or scene owns scrolling.
|
|
64
|
+
For a `SplitView`, put a `Pane` in the list or detail region and set its
|
|
65
|
+
appearance; SplitView only arranges the regions and does not own their scroll.
|
|
66
|
+
Choose the innermost owner when composing layouts.
|
|
67
|
+
|
|
68
|
+
The color uses `--kui-sunken-panel-background`, falling back to
|
|
69
|
+
`--kui-color-surface-lowered`, just like `SunkenPanel`. Select one scroll owner
|
|
70
|
+
in a nested layout so a translucent override paints once. The public color
|
|
71
|
+
override may be set at a Pane or layout boundary.
|
|
72
|
+
|
|
39
73
|
Pass any combination of logical sides to `separators`: `block-start`,
|
|
40
74
|
`block-end`, `inline-start`, and `inline-end`. Every line is off by default and
|
|
41
75
|
each enabled side uses `--kui-pane-separator-width` (1px) and
|
|
@@ -85,9 +119,10 @@ Toolbar, and List stylesheets draw from those. The line is an inset shadow or a
|
|
|
85
119
|
inside the component, so no state ever moves the chrome, the content, or a tab.
|
|
86
120
|
Never write a border onto a component to show one.
|
|
87
121
|
|
|
88
|
-
Configure a pane with `chromeDividers`: `scroll` (the default) follows
|
|
89
|
-
scroll state and draws nothing until the wiring runs; `always`
|
|
90
|
-
`none` drops them.
|
|
122
|
+
Configure a pane with `chromeDividers`: `scroll` (the plain-pane default) follows
|
|
123
|
+
the scroll state and draws nothing until the wiring runs; `always` (the sunken
|
|
124
|
+
pane default) keeps both lines; `none` drops them. Explicit values override
|
|
125
|
+
either default. Layouts forward it through `PaneConfig`
|
|
91
126
|
(`mainPane.chromeDividers`, a panel's `pane.chromeDividers`). A `NavStack` and a
|
|
92
127
|
`TabScaffold` take the same `chromeDividers` for their own chrome (the stack's
|
|
93
128
|
top chrome and bottom toolbar, the scaffold's bar), and a `SplitView` forwards
|
|
@@ -169,6 +204,18 @@ region (`role="region"`), and `focusTarget` to make the item a programmatic
|
|
|
169
204
|
focus target (`tabindex="-1"`), for example a NavStack view's `data-nav-focus`
|
|
170
205
|
target.
|
|
171
206
|
|
|
207
|
+
For a selectable card, set `interactive`, a delegated `action`, and an optional
|
|
208
|
+
`itemId`. Wire `wireContentItems(root)` once on the containing app root; it
|
|
209
|
+
activates focused cards with Enter or Space and forwards the resulting click to
|
|
210
|
+
the app's ordinary `data-action` handler. `selectionMode="toggle"` maps
|
|
211
|
+
`selected` to a button's `aria-pressed`; `selectionMode="single"` maps it to an
|
|
212
|
+
option's `aria-selected` and belongs in an app-owned `role="listbox"` container.
|
|
213
|
+
An interactive card is a Tab stop, and `disabled` removes its action and Tab
|
|
214
|
+
stop while exposing `aria-disabled`. Keep interactive descendants outside a
|
|
215
|
+
card; a card is one action target. Hover, pressed, focus, and selected paints
|
|
216
|
+
reuse the reserved border without changing geometry. `rootAttributes` still
|
|
217
|
+
accepts safe app `data-*` metadata, while the card owns its interaction data.
|
|
218
|
+
|
|
172
219
|
The rendered classes — `.kui-content-item`, `.kui-content-item--framed`, and
|
|
173
220
|
`.kui-content-item--pill` — stay public for the rare element that must carry the
|
|
174
221
|
geometry itself (for example a `<ul>` list or a `Text` paragraph in an
|
|
@@ -291,6 +338,14 @@ display copy, and `font="monospace"` for code or identifiers (the
|
|
|
291
338
|
finite props compose with each other and with every semantic `variant`; omit
|
|
292
339
|
them to inherit the surrounding color, size, and font.
|
|
293
340
|
|
|
341
|
+
Control long copy with `wrap`: `normal` (default) restores ordinary wrapping,
|
|
342
|
+
`anywhere` breaks long unbroken strings, `nowrap` holds one line, and
|
|
343
|
+
`truncate` holds one line with an ellipsis. `truncate` sets `min-width: 0`, so
|
|
344
|
+
Text can shrink beside a fixed-size sibling in a `Row`; the sibling keeps its
|
|
345
|
+
width. On `normal` or `anywhere`, set a positive integer `maxLines` to clamp
|
|
346
|
+
wrapped text with an ellipsis. Omit `maxLines` for unlimited lines. The cap is
|
|
347
|
+
incompatible with `nowrap` and `truncate`.
|
|
348
|
+
|
|
294
349
|
```tsx
|
|
295
350
|
import { Text } from "@kerfjs/ui/text";
|
|
296
351
|
|
|
@@ -302,6 +357,9 @@ import { Text } from "@kerfjs/ui/text";
|
|
|
302
357
|
<Text variant="h2" size="xlarge">A display-sized section title</Text>;
|
|
303
358
|
<strong>Inbox<Text variant="span" tone="quiet" size="compact"> · 3 msg</Text></strong>;
|
|
304
359
|
<Text tone="danger" font="monospace">ERR_INVALID_ID</Text>;
|
|
360
|
+
<Text wrap="anywhere">A-very-long-unbroken-identifier</Text>;
|
|
361
|
+
<Text wrap="truncate" variant="span">Long vendor name</Text>;
|
|
362
|
+
<Text wrap="normal" maxLines={2}>A long summary capped at two lines.</Text>;
|
|
305
363
|
```
|
|
306
364
|
|
|
307
365
|
## Spacer
|
package/docs/nav-stack.md
CHANGED
|
@@ -60,6 +60,11 @@ optional per-view `bottomToolbar`. The component-level
|
|
|
60
60
|
The back control appears automatically once the stack has more than one entry;
|
|
61
61
|
`wireNavStack`'s `onBack` is where the app pops its own signal.
|
|
62
62
|
|
|
63
|
+
Set a view's `appearance: "sunken"` to paint its scroll viewport with the
|
|
64
|
+
shared lowered-surface color, including space after short content. When the
|
|
65
|
+
view holds a `Pane` as its only child, set the appearance on the Pane instead
|
|
66
|
+
if its content owns scrolling. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
67
|
+
|
|
63
68
|
## The top toolbar
|
|
64
69
|
|
|
65
70
|
The top chrome is a real `Toolbar`, so it follows the same zone,
|
package/docs/split-view.md
CHANGED
|
@@ -26,6 +26,11 @@ shared interior edge. A pane whose only child is a `Pane` lets that child own
|
|
|
26
26
|
the insets, and the compact form hands them to its `NavStack`. See
|
|
27
27
|
[Choosing an app layout › Safe areas](app-layouts.md#safe-areas).
|
|
28
28
|
|
|
29
|
+
For a lowered list or detail background, render a `Pane` in that region with
|
|
30
|
+
`appearance="sunken"`. SplitView arranges regions but does not own their
|
|
31
|
+
vertical scroll; its compact NavStack form can use the view's or nested Pane's
|
|
32
|
+
appearance. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
33
|
+
|
|
29
34
|
## Responsive by device class
|
|
30
35
|
|
|
31
36
|
`SplitView` is declarative; the app derives `compact` from the device class and
|
package/docs/sunken-panel.md
CHANGED
|
@@ -23,6 +23,28 @@ The default `shape="rounded"` uses the shared rounded-rectangle radius. Choose
|
|
|
23
23
|
</SunkenPanel>
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
+
## Filling a work area
|
|
27
|
+
|
|
28
|
+
Set `fill` when the panel is the direct layout root of a parent with a definite
|
|
29
|
+
height. Inside a flex column, use `flex` so it takes the remaining space and
|
|
30
|
+
can shrink with its parent. Like `Grid`, `flex` accepts `true` (equivalent to
|
|
31
|
+
`1 1 auto`), a CSS flex keyword, or a typed `CssFlex` value. The panel keeps
|
|
32
|
+
`min-height: 0`, allowing its parent to own scrolling.
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
<List fill>
|
|
36
|
+
<Toolbar label="Work area" />
|
|
37
|
+
<SunkenPanel flex>
|
|
38
|
+
<WorkArea />
|
|
39
|
+
</SunkenPanel>
|
|
40
|
+
</List>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Inside a `Pane`, the Pane's content remains the scroll owner. Place a
|
|
44
|
+
`SunkenPanel fill` in a definite-height Pane content region when the surface
|
|
45
|
+
itself needs to cover empty space, or use `flex` when a flex parent allocates
|
|
46
|
+
the remaining space. The panel does not add another scroller.
|
|
47
|
+
|
|
26
48
|
## Ownership
|
|
27
49
|
|
|
28
50
|
The root owns its lowered background, 8px padding, and 8px vertical gap.
|
|
@@ -38,6 +60,10 @@ Do not use `SunkenPanel` merely to add padding, as a substitute for pane
|
|
|
38
60
|
header/content/footer anatomy, or around a child that already owns the same
|
|
39
61
|
outer surface.
|
|
40
62
|
|
|
63
|
+
For a lowered scrolling work area with Pane chrome, use
|
|
64
|
+
[`Pane appearance="sunken"`](layout.md#lowered-work-surfaces). It paints the
|
|
65
|
+
scroll viewport and empty space without adding a second scroller.
|
|
66
|
+
|
|
41
67
|
## Public styling boundary
|
|
42
68
|
|
|
43
69
|
Override the public properties at the composition boundary:
|
|
@@ -51,7 +77,10 @@ Override the public properties at the composition boundary:
|
|
|
51
77
|
`--kui-sunken-panel-background` can be overridden for a known backdrop. Keep
|
|
52
78
|
the default lowered surface opaque; a translucent override compounds when
|
|
53
79
|
sunken panels nest. See [Contextual transparency](./webawesome-theme.md#contextual-transparency)
|
|
54
|
-
for the color and contrast evaluation.
|
|
80
|
+
for the color and contrast evaluation and its opt-in bounded prototype. The
|
|
81
|
+
prototype also compares Pane and Web Awesome sunken surfaces. Assign its
|
|
82
|
+
first, second, and transparent deeper tints on application-owned wrappers;
|
|
83
|
+
a single translucent override on every nested surface has no depth cap.
|
|
55
84
|
|
|
56
85
|
The public root class is `.kui-sunken-panel`. Prefer the properties above over
|
|
57
86
|
styling descendants. The `square` shape deliberately overrides the radius
|
package/docs/tab-scaffold.md
CHANGED
|
@@ -59,6 +59,11 @@ truncate horizontally with an ellipsis when a destination name exceeds its
|
|
|
59
59
|
share of the bar. On larger device classes, promote the tab set to a
|
|
60
60
|
`Workbench` rail or a persistent sidebar instead of a bottom bar.
|
|
61
61
|
|
|
62
|
+
Set a tab's `appearance: "sunken"` when its scene owns scrolling and should
|
|
63
|
+
paint the lowered surface behind short or long content. For a scene whose
|
|
64
|
+
only child is a `Pane` or `NavStack`, set appearance on that child's scroll
|
|
65
|
+
owner. See [Lowered work surfaces](layout.md#lowered-work-surfaces).
|
|
66
|
+
|
|
62
67
|
## Scroll divider
|
|
63
68
|
|
|
64
69
|
The bar has no permanent top border. With `wireScrollDividers(appRoot)`
|
package/docs/ui-analyzer.md
CHANGED
|
@@ -80,6 +80,10 @@ policy, or analysis inputs to the containing application.
|
|
|
80
80
|
| `KUI-L021` | error | CSS overrides a component token that a typed prop sets. |
|
|
81
81
|
| `KUI-L022` | error | A class placed on a component's root is styled by the application (a hook class). |
|
|
82
82
|
|
|
83
|
+
For `KUI-L004` and `KUI-L007`, scroll and inset declarations belong to the
|
|
84
|
+
subject of each CSS selector. An ancestor class used only to qualify a
|
|
85
|
+
descendant selector is not treated as a scroll owner or inset source.
|
|
86
|
+
|
|
83
87
|
Errors are provable contract violations and make the command exit 1. Review
|
|
84
88
|
findings are deliberately heuristic and do not fail by default; pass
|
|
85
89
|
`--fail-on-review` when a project has reviewed its baseline and wants them to
|