@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.
Files changed (191) hide show
  1. package/README.md +4 -0
  2. package/ai/component-catalog-extension.schema.json +13 -0
  3. package/ai/component-catalog.json +20 -7
  4. package/ai/component-composition.json +17 -3
  5. package/ai/components/list-item.md +1 -1
  6. package/ai/components/pane.md +3 -2
  7. package/ai/components/select.md +1 -0
  8. package/ai/components/toolbar-text.md +2 -1
  9. package/ai/components/workbench.md +3 -2
  10. package/ai/public-api-signatures-v1.md +162 -48
  11. package/ai/skill.md +11 -5
  12. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  13. package/analyzer/index.mjs +3 -2
  14. package/catalog-projection-cli.mjs +96 -0
  15. package/catalog-projection.d.mts +55 -0
  16. package/catalog-projection.mjs +62 -0
  17. package/dist/browser/catalog.js +1 -1
  18. package/dist/browser/collapsible-panel.js +2 -0
  19. package/dist/browser/nav-stack.js +1 -0
  20. package/dist/browser/split-view.js +1 -0
  21. package/dist/browser/toolbar-control-group.js +1 -0
  22. package/dist/browser/workbench.js +1 -0
  23. package/dist/catalog-resources.d.ts +1 -1
  24. package/dist/catalog.d.ts +1 -1
  25. package/dist/catalog.js +11 -10
  26. package/dist/catalog.js.map +1 -1
  27. package/dist/chip.d.ts +9 -3
  28. package/dist/chip.js +1 -1
  29. package/dist/{chunk-EZVNC4J6.js → chunk-3BYFWTP3.js} +7 -3
  30. package/dist/chunk-3BYFWTP3.js.map +1 -0
  31. package/dist/{chunk-5Q3N6EV7.js → chunk-5IJ6UGNZ.js} +3 -3
  32. package/dist/{chunk-5Q3N6EV7.js.map → chunk-5IJ6UGNZ.js.map} +1 -1
  33. package/dist/chunk-7AKGPBCC.js +76 -0
  34. package/dist/chunk-7AKGPBCC.js.map +1 -0
  35. package/dist/{chunk-KROD7KZK.js → chunk-AUVG54KC.js} +2 -2
  36. package/dist/{chunk-KROD7KZK.js.map → chunk-AUVG54KC.js.map} +1 -1
  37. package/dist/{chunk-AUKT3KMG.js → chunk-CQHN45XR.js} +17 -2
  38. package/dist/chunk-CQHN45XR.js.map +1 -0
  39. package/dist/{chunk-SWVW56CV.js → chunk-EN4LDR5Y.js} +2 -2
  40. package/dist/{chunk-SWVW56CV.js.map → chunk-EN4LDR5Y.js.map} +1 -1
  41. package/dist/{chunk-TEYARRAK.js → chunk-F7OCOBTG.js} +5 -2
  42. package/dist/chunk-F7OCOBTG.js.map +1 -0
  43. package/dist/{chunk-5PESG2VP.js → chunk-HXCMWANP.js} +6 -5
  44. package/dist/chunk-HXCMWANP.js.map +1 -0
  45. package/dist/{chunk-NYL63PSD.js → chunk-IA4D5XNT.js} +61 -10
  46. package/dist/chunk-IA4D5XNT.js.map +1 -0
  47. package/dist/{chunk-F4QMLOXJ.js → chunk-IAOAZUOO.js} +2 -2
  48. package/dist/{chunk-F4QMLOXJ.js.map → chunk-IAOAZUOO.js.map} +1 -1
  49. package/dist/{chunk-Y74NWGQW.js → chunk-KFYANKJI.js} +66 -22
  50. package/dist/chunk-KFYANKJI.js.map +1 -0
  51. package/dist/chunk-MOSIE4Z2.js +51 -0
  52. package/dist/chunk-MOSIE4Z2.js.map +1 -0
  53. package/dist/{chunk-7JUBXOIV.js → chunk-NXWE5S57.js} +25 -6
  54. package/dist/chunk-NXWE5S57.js.map +1 -0
  55. package/dist/{chunk-NNMLEDMD.js → chunk-OBAFAH5B.js} +36 -8
  56. package/dist/chunk-OBAFAH5B.js.map +1 -0
  57. package/dist/{chunk-A3CKOW2R.js → chunk-R75GGNWY.js} +123 -20
  58. package/dist/chunk-R75GGNWY.js.map +1 -0
  59. package/dist/chunk-RGS4WX2M.js +44 -0
  60. package/dist/chunk-RGS4WX2M.js.map +1 -0
  61. package/dist/{chunk-N3GKMPDW.js → chunk-RKTTF3L4.js} +3 -1
  62. package/dist/chunk-RKTTF3L4.js.map +1 -0
  63. package/dist/{chunk-RRB26JRJ.js → chunk-RTJNJTG3.js} +2 -2
  64. package/dist/{chunk-RRB26JRJ.js.map → chunk-RTJNJTG3.js.map} +1 -1
  65. package/dist/{chunk-EAC4CDY7.js → chunk-SMZGAPCU.js} +15 -2
  66. package/dist/chunk-SMZGAPCU.js.map +1 -0
  67. package/dist/{chunk-C4OYOKWX.js → chunk-UA6JW52D.js} +36 -2
  68. package/dist/chunk-UA6JW52D.js.map +1 -0
  69. package/dist/{chunk-3SXMEK3B.js → chunk-V3DX3K65.js} +1 -1
  70. package/dist/chunk-V3DX3K65.js.map +1 -0
  71. package/dist/{chunk-6ZXOQEAN.js → chunk-WF75U3V4.js} +7 -1
  72. package/dist/chunk-WF75U3V4.js.map +1 -0
  73. package/dist/{chunk-VCBTX62E.js → chunk-ZRWXFDDS.js} +2 -2
  74. package/dist/chunk-ZRWXFDDS.js.map +1 -0
  75. package/dist/collapsible-panel.d.ts +18 -7
  76. package/dist/collapsible-panel.js +19 -3
  77. package/dist/collapsible-panel.js.map +1 -1
  78. package/dist/content-item.d.ts +36 -5
  79. package/dist/content-item.js +1 -1
  80. package/dist/disclosure-arrow.js +2 -1
  81. package/dist/index.d.ts +3 -3
  82. package/dist/index.js +22 -22
  83. package/dist/list-action-row.js +1 -1
  84. package/dist/list-header.js +1 -1
  85. package/dist/list-item.js +1 -1
  86. package/dist/lucide-icon.d.ts +5 -2
  87. package/dist/lucide-icon.js +2 -1
  88. package/dist/nav-stack.d.ts +3 -1
  89. package/dist/nav-stack.js +2 -1
  90. package/dist/pane.d.ts +10 -4
  91. package/dist/pane.js +1 -1
  92. package/dist/{panel-toolbar-DqwtBxQL.d.ts → panel-toolbar-DDKh4uKd.d.ts} +11 -2
  93. package/dist/popup-menu-register.js +38 -1
  94. package/dist/popup-menu-register.js.map +1 -1
  95. package/dist/popup-menu.d.ts +2 -2
  96. package/dist/popup-menu.js +1 -1
  97. package/dist/select.d.ts +2 -0
  98. package/dist/select.js +1 -1
  99. package/dist/split-view.d.ts +1 -1
  100. package/dist/split-view.js +2 -1
  101. package/dist/split-view.js.map +1 -1
  102. package/dist/styles/app-tab.css +84 -0
  103. package/dist/styles/chip.css +14 -0
  104. package/dist/styles/content-item.css +36 -0
  105. package/dist/styles/list-action-row.css +4 -3
  106. package/dist/styles/list-header.css +4 -3
  107. package/dist/styles/list-item.css +21 -11
  108. package/dist/styles/lucide-icon.css +5 -0
  109. package/dist/styles/nav-stack.css +13 -0
  110. package/dist/styles/pane.css +36 -2
  111. package/dist/styles/popup-menu.css +15 -10
  112. package/dist/styles/resizable-region.css +9 -0
  113. package/dist/styles/select.css +26 -0
  114. package/dist/styles/split-view.css +6 -0
  115. package/dist/styles/sunken-panel.css +7 -0
  116. package/dist/styles/tab-bar.css +3 -0
  117. package/dist/styles/tab-scaffold.css +13 -0
  118. package/dist/styles/text.css +29 -0
  119. package/dist/styles/token-search-field.css +29 -6
  120. package/dist/styles/toolbar-control-group.css +35 -0
  121. package/dist/styles/toolbar-text.css +15 -6
  122. package/dist/styles/toolbar.css +7 -0
  123. package/dist/styles/workbench.css +260 -90
  124. package/dist/sunken-panel.d.ts +6 -1
  125. package/dist/sunken-panel.js +1 -1
  126. package/dist/tab-bar.d.ts +6 -2
  127. package/dist/tab-bar.js +1 -1
  128. package/dist/tab-scaffold.d.ts +3 -0
  129. package/dist/tab-scaffold.js +1 -0
  130. package/dist/tab-scaffold.js.map +1 -1
  131. package/dist/text.d.ts +14 -3
  132. package/dist/text.js +1 -1
  133. package/dist/token-search-field.js +2 -1
  134. package/dist/toolbar-control-group.d.ts +5 -1
  135. package/dist/toolbar-control-group.js +2 -1
  136. package/dist/toolbar-text.d.ts +1 -1
  137. package/dist/toolbar-text.js +1 -1
  138. package/dist/toolbar.d.ts +7 -4
  139. package/dist/toolbar.js +1 -1
  140. package/dist/wire-catalog.js +1 -1
  141. package/dist/wire-content-items.d.ts +9 -0
  142. package/dist/wire-content-items.js +62 -0
  143. package/dist/wire-content-items.js.map +1 -0
  144. package/dist/wire-tab-bars.js +1 -1
  145. package/dist/wire-token-search-fields.js +2 -1
  146. package/dist/wire-workbench.d.ts +7 -0
  147. package/dist/wire-workbench.js +1 -1
  148. package/dist/workbench.d.ts +24 -8
  149. package/dist/workbench.js +2 -1
  150. package/docs/accessibility.md +21 -5
  151. package/docs/catalog.md +36 -0
  152. package/docs/collapsible-panel.md +12 -4
  153. package/docs/component-contract.md +10 -4
  154. package/docs/component-selection.md +65 -15
  155. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  156. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  157. package/docs/design/templates/toolbar-dark.svg +1 -1
  158. package/docs/design/templates/toolbar.svg +1 -1
  159. package/docs/examples/component-catalog-extension.json +6 -0
  160. package/docs/layout.md +61 -3
  161. package/docs/nav-stack.md +5 -0
  162. package/docs/split-view.md +5 -0
  163. package/docs/sunken-panel.md +30 -1
  164. package/docs/tab-scaffold.md +5 -0
  165. package/docs/ui-analyzer.md +4 -0
  166. package/docs/webawesome-theme.md +36 -6
  167. package/docs/workbench.md +60 -14
  168. package/llms.txt +12 -4
  169. package/package.json +16 -2
  170. package/scripts/component-catalog-extension-validation.mjs +28 -0
  171. package/dist/chunk-3SXMEK3B.js.map +0 -1
  172. package/dist/chunk-4R777DUZ.js +0 -34
  173. package/dist/chunk-4R777DUZ.js.map +0 -1
  174. package/dist/chunk-5PESG2VP.js.map +0 -1
  175. package/dist/chunk-6ZXOQEAN.js.map +0 -1
  176. package/dist/chunk-7JUBXOIV.js.map +0 -1
  177. package/dist/chunk-A3CKOW2R.js.map +0 -1
  178. package/dist/chunk-AUKT3KMG.js.map +0 -1
  179. package/dist/chunk-C4OYOKWX.js.map +0 -1
  180. package/dist/chunk-EAC4CDY7.js.map +0 -1
  181. package/dist/chunk-EZVNC4J6.js.map +0 -1
  182. package/dist/chunk-MA73TA6D.js +0 -42
  183. package/dist/chunk-MA73TA6D.js.map +0 -1
  184. package/dist/chunk-MERWRTBG.js +0 -45
  185. package/dist/chunk-MERWRTBG.js.map +0 -1
  186. package/dist/chunk-N3GKMPDW.js.map +0 -1
  187. package/dist/chunk-NNMLEDMD.js.map +0 -1
  188. package/dist/chunk-NYL63PSD.js.map +0 -1
  189. package/dist/chunk-TEYARRAK.js.map +0 -1
  190. package/dist/chunk-VCBTX62E.js.map +0 -1
  191. 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. Use `contentOverflow="visible"` while an anchored popup must escape
181
- the region; this also raises the region on its public popup layer. A collapsed
182
- region can place `restoreControl` in a top or bottom corner with
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. The matching
201
- `--kui-list-item-hover-border` and `--kui-list-item-selected-border` tokens
202
- set state outlines without replacing ListItem CSS or neutralizing global
203
- semantic border colors.
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. `--kui-toolbar-leading-min-width`,
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. A
229
- `TokenSearchField` editor can shrink to zero minimum width inside a narrow
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, and `labelMaxWidth` for an ellipsized visible name. Set `attention`
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 `details` to a safe trailing tick for the chosen
403
- item. Set `checked` when checkbox menu semantics fit. Commands still dispatch
404
- their own `data-action` once on pointer and keyboard selection.
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)"><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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif" font-size="16" font-weight="650" fill="rgb(174,174,178)">Northstar</text></g></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
+ <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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, 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)"><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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif" font-size="16" font-weight="650" fill="rgb(110,110,115)">Northstar</text></g></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
+ <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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, 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, &quot;-apple-system&quot;, 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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif" font-size="16" font-weight="650" fill="rgb(174,174,178)">Northstar</text></g></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
+ <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, &quot;-apple-system&quot;, 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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, 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, &quot;-apple-system&quot;, 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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, sans-serif" font-size="16" font-weight="650" fill="rgb(110,110,115)">Northstar</text></g></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>
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, &quot;-apple-system&quot;, 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="&quot;ui-sans-serif&quot;, &quot;-apple-system&quot;, &quot;system-ui&quot;, &quot;Segoe UI&quot;, 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 the
89
- scroll state and draws nothing until the wiring runs; `always` keeps both lines;
90
- `none` drops them. Layouts forward it through `PaneConfig`
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,
@@ -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
@@ -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
@@ -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)`
@@ -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