@kerfjs/ui 5.0.0-beta.52 → 5.0.0-beta.54
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 +1 -0
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/component-catalog-v2.d.ts +3 -0
- package/ai/component-catalog-v2.json +85 -7
- package/ai/component-catalog-v2.schema.json +9 -1
- package/ai/component-catalog.json +108 -11
- package/ai/public-api-signatures-v1.md +215 -25
- package/ai/skill.md +23 -17
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/index.mjs +48 -0
- package/analyzer/loud-pairs.d.mts +49 -0
- package/analyzer/loud-pairs.mjs +357 -0
- package/dist/app-tab.d.ts +7 -5
- package/dist/app-tab.js +1 -1
- package/dist/browser/segmented-control.js +0 -1
- package/dist/catalog.js +4 -4
- package/dist/{chunk-EKYZCRCX.js → chunk-3CGQ7ZNO.js} +54 -22
- package/dist/chunk-3CGQ7ZNO.js.map +1 -0
- package/dist/{chunk-7XJO4D6A.js → chunk-3NBL3OUQ.js} +2 -2
- package/dist/{chunk-7XJO4D6A.js.map → chunk-3NBL3OUQ.js.map} +1 -1
- package/dist/{chunk-2S7OWAEV.js → chunk-44IG7PFV.js} +3 -3
- package/dist/{chunk-2S7OWAEV.js.map → chunk-44IG7PFV.js.map} +1 -1
- package/dist/{chunk-UKKSMZYT.js → chunk-46263QLK.js} +51 -1
- package/dist/chunk-46263QLK.js.map +1 -0
- package/dist/{chunk-DNCOFEUL.js → chunk-5I22LMCV.js} +2 -2
- package/dist/{chunk-DNCOFEUL.js.map → chunk-5I22LMCV.js.map} +1 -1
- package/dist/{chunk-NDUGJ4TU.js → chunk-5NDQABWK.js} +1 -1
- package/dist/{chunk-NDUGJ4TU.js.map → chunk-5NDQABWK.js.map} +1 -1
- package/dist/{chunk-KAQUUTZR.js → chunk-ATHXW6RP.js} +2 -2
- package/dist/{chunk-KAQUUTZR.js.map → chunk-ATHXW6RP.js.map} +1 -1
- package/dist/{chunk-JGFZ42ZF.js → chunk-BJJKFVWW.js} +14 -5
- package/dist/chunk-BJJKFVWW.js.map +1 -0
- package/dist/{chunk-T7C2VZUB.js → chunk-C2FAYFDE.js} +2 -2
- package/dist/{chunk-T7C2VZUB.js.map → chunk-C2FAYFDE.js.map} +1 -1
- package/dist/{chunk-SV22UIW4.js → chunk-DQA5FMOX.js} +2 -2
- package/dist/{chunk-SV22UIW4.js.map → chunk-DQA5FMOX.js.map} +1 -1
- package/dist/{chunk-LIOXPQ7N.js → chunk-GUIHMIT2.js} +12 -10
- package/dist/chunk-GUIHMIT2.js.map +1 -0
- package/dist/{chunk-3S7OUHUN.js → chunk-KPNTVB7A.js} +9 -4
- package/dist/chunk-KPNTVB7A.js.map +1 -0
- package/dist/{chunk-IR53BQUJ.js → chunk-NE5JAOQS.js} +9 -9
- package/dist/chunk-NE5JAOQS.js.map +1 -0
- package/dist/chunk-PSHUSWQH.js +18 -0
- package/dist/chunk-PSHUSWQH.js.map +1 -0
- package/dist/{chunk-OSCL5TKR.js → chunk-RNZAKSME.js} +11 -8
- package/dist/chunk-RNZAKSME.js.map +1 -0
- package/dist/{chunk-ABAXNUXU.js → chunk-T22EM4ET.js} +7 -5
- package/dist/chunk-T22EM4ET.js.map +1 -0
- package/dist/{chunk-YZV2PTY4.js → chunk-TZ5IHWB2.js} +3 -3
- package/dist/{chunk-YZV2PTY4.js.map → chunk-TZ5IHWB2.js.map} +1 -1
- package/dist/{chunk-VOCPXGQN.js → chunk-VHADGP3B.js} +9 -8
- package/dist/chunk-VHADGP3B.js.map +1 -0
- package/dist/{chunk-2CE22Q2K.js → chunk-WZ2GLEY4.js} +2 -1
- package/dist/chunk-WZ2GLEY4.js.map +1 -0
- package/dist/{chunk-M6GLI6A6.js → chunk-X5QSICJ3.js} +5 -5
- package/dist/chunk-X5QSICJ3.js.map +1 -0
- package/dist/chunk-XQV2B4IL.js +14 -0
- package/dist/chunk-XQV2B4IL.js.map +1 -0
- package/dist/{chunk-4XE2CDYB.js → chunk-ZMBU522F.js} +2 -2
- package/dist/{chunk-4XE2CDYB.js.map → chunk-ZMBU522F.js.map} +1 -1
- package/dist/collapsible-panel.d.ts +6 -2
- package/dist/collapsible-panel.js +1 -0
- package/dist/collapsible-panel.js.map +1 -1
- package/dist/css-values.d.ts +1 -1
- package/dist/css-values.js +1 -1
- package/dist/floating-toolbar.d.ts +5 -2
- package/dist/floating-toolbar.js +1 -1
- package/dist/grid.js +1 -1
- package/dist/index.js +20 -19
- package/dist/list-action-row.d.ts +2 -1
- package/dist/list-action-row.js +1 -1
- package/dist/list-header.d.ts +1 -0
- package/dist/list-header.js +1 -1
- package/dist/list-item.d.ts +5 -3
- package/dist/list-item.js +1 -1
- package/dist/list.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/resizable-region.d.ts +4 -1
- package/dist/resizable-region.js +1 -1
- package/dist/row.js +1 -1
- package/dist/segmented-control.d.ts +1 -1
- package/dist/segmented-control.js +1 -3
- package/dist/select.js +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/spacer.js +1 -1
- package/dist/split-view.js +2 -2
- package/dist/state-banner.d.ts +1 -1
- package/dist/state-banner.js +1 -1
- package/dist/styles/badge.css +17 -6
- package/dist/styles/collapsible-panel.css +89 -11
- package/dist/styles/floating-toolbar.css +11 -6
- package/dist/styles/foundation.css +82 -26
- package/dist/styles/list-action-row.css +29 -8
- package/dist/styles/list-header.css +19 -7
- package/dist/styles/list-item.css +11 -3
- package/dist/styles/resizable-region.css +82 -14
- package/dist/styles/segmented-control.css +21 -1
- package/dist/styles/select.css +24 -13
- package/dist/styles/skeleton.css +33 -2
- package/dist/styles/state-banner.css +48 -12
- package/dist/styles/webawesome.css +47 -20
- package/dist/styles/workbench.css +473 -11
- package/dist/toolbar-text.js +1 -1
- package/dist/value-table.js +1 -1
- package/dist/wire-resizable-regions.d.ts +2 -1
- package/dist/wire-resizable-regions.js +2 -1
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-workbench.d.ts +109 -0
- package/dist/wire-workbench.js +355 -0
- package/dist/wire-workbench.js.map +1 -0
- package/dist/workbench.d.ts +65 -6
- package/dist/workbench.js +180 -76
- package/dist/workbench.js.map +1 -1
- package/docs/accessibility.md +54 -9
- package/docs/app-layouts.md +12 -1
- package/docs/collapsible-panel.md +59 -1
- package/docs/component-contract.md +76 -4
- package/docs/component-selection.md +16 -6
- package/docs/design/templates/empty-state/with-action-dark.svg +1 -1
- package/docs/design/templates/empty-state-dark.svg +1 -1
- package/docs/design/templates/list/stack-dark.svg +1 -1
- package/docs/design/templates/list/stack.svg +1 -1
- package/docs/design/templates/list-action-row/selected.svg +1 -1
- package/docs/design/templates/list-action-row.svg +1 -1
- package/docs/design/templates/list-dark.svg +1 -1
- package/docs/design/templates/list-header/action-dark.svg +1 -1
- package/docs/design/templates/list-header/action.svg +1 -1
- package/docs/design/templates/list-header/count-dark.svg +1 -1
- package/docs/design/templates/list-header/count.svg +1 -1
- package/docs/design/templates/list-header/inline-action-dark.svg +1 -1
- package/docs/design/templates/list-header/inline-action.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded-dark.svg +1 -1
- package/docs/design/templates/list-header/toggle-expanded.svg +1 -1
- package/docs/design/templates/list-header-dark.svg +1 -1
- package/docs/design/templates/list-header.svg +1 -1
- package/docs/design/templates/list-item/selected.svg +1 -1
- package/docs/design/templates/list-item.svg +1 -1
- package/docs/design/templates/list.svg +1 -1
- package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
- package/docs/design/templates/segmented-control/equal.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small-dark.svg +1 -1
- package/docs/design/templates/segmented-control/pill-small.svg +1 -1
- package/docs/design/templates/segmented-control-dark.svg +1 -1
- package/docs/design/templates/segmented-control.svg +1 -1
- package/docs/design/templates/state-banner/danger-dark.svg +1 -1
- package/docs/design/templates/state-banner/danger.svg +1 -1
- package/docs/design/templates/state-banner/info-badge-dark.svg +1 -1
- package/docs/design/templates/state-banner/info-badge.svg +1 -1
- package/docs/design/templates/state-banner/info-dark.svg +1 -1
- package/docs/design/templates/state-banner/info.svg +1 -1
- package/docs/design/templates/state-banner/success-dark.svg +1 -1
- package/docs/design/templates/state-banner/success.svg +1 -1
- package/docs/design/templates/state-banner/warning-dark.svg +1 -1
- package/docs/design/templates/state-banner/warning.svg +1 -1
- package/docs/design/templates/state-banner-dark.svg +1 -1
- package/docs/design/templates/state-banner.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs-dark.svg +1 -1
- package/docs/design/templates/tab-bar/workspace-tabs.svg +1 -1
- package/docs/design/templates/tab-bar-dark.svg +1 -1
- package/docs/design/templates/tab-bar.svg +1 -1
- package/docs/design/templates/token-search-field/tokens.svg +1 -1
- package/docs/design/templates/token-search-field.svg +1 -1
- package/docs/design/templates.md +11 -1
- package/docs/device-class.md +2 -1
- package/docs/document-baseline.md +4 -0
- package/docs/layout.md +5 -1
- package/docs/recipes.md +5 -3
- package/docs/type-contracts.md +2 -1
- package/docs/ui-analyzer.md +94 -19
- package/docs/ui-doctor.md +6 -0
- package/docs/ux-demo.md +2 -2
- package/docs/webawesome-theme.md +18 -2
- package/docs/workbench.md +302 -7
- package/llms.txt +14 -6
- package/package.json +5 -1
- package/ux-demo/recipes/collapsible-sidebar.tsx +8 -7
- package/ux-demo/recipes/loading-inspector.tsx +3 -2
- package/dist/chunk-2CE22Q2K.js.map +0 -1
- package/dist/chunk-3S7OUHUN.js.map +0 -1
- package/dist/chunk-ABAXNUXU.js.map +0 -1
- package/dist/chunk-EKYZCRCX.js.map +0 -1
- package/dist/chunk-IR53BQUJ.js.map +0 -1
- package/dist/chunk-JGFZ42ZF.js.map +0 -1
- package/dist/chunk-LIOXPQ7N.js.map +0 -1
- package/dist/chunk-M6GLI6A6.js.map +0 -1
- package/dist/chunk-OSCL5TKR.js.map +0 -1
- package/dist/chunk-UKKSMZYT.js.map +0 -1
- package/dist/chunk-VOCPXGQN.js.map +0 -1
|
@@ -23,9 +23,49 @@ Import the panel CSS (`@kerfjs/ui/collapsible-panel.css`) alongside `foundation.
|
|
|
23
23
|
through the transform alone instead of transitioning from a changing layout
|
|
24
24
|
origin and snapping at the end. The app owns the `collapsed` signal; `size`
|
|
25
25
|
overrides the CSS default width/height.
|
|
26
|
+
A collapsed panel renders `inert` together with `aria-hidden="true"`, straight
|
|
27
|
+
from `collapsed`, so neither Tab, a pointer, nor assistive technology reaches
|
|
28
|
+
content that has slid out of view, and focusing a control can never scroll
|
|
29
|
+
the clipped content back into view. `inert` does not affect rendering, so the
|
|
30
|
+
slide-out still animates; expanding removes both attributes in the same
|
|
31
|
+
render. `aria-hidden` alone had left the panel's controls focusable inside a
|
|
32
|
+
hidden subtree; it stays beside `inert` so the emptied landmark is hidden
|
|
33
|
+
even from tooling that does not prune inert subtrees. Do not add your own
|
|
34
|
+
`inert`, `aria-hidden`, or `tabindex` to hide the content. The
|
|
35
|
+
`restoreControl` renders outside the panel and stays reachable.
|
|
26
36
|
Reusable shell policies are typed props: `separator`, `collapseMotion`,
|
|
27
37
|
`contentOverflow`, and `presentation`. A collapsed panel may also receive a
|
|
28
|
-
`restoreControl`, which Kerf places at the safe-area-aware `restorePosition
|
|
38
|
+
`restoreControl`, which Kerf places at the safe-area-aware `restorePosition`
|
|
39
|
+
corner of the panel's own container (the element holding the panel), never
|
|
40
|
+
of the viewport, so an embedded panel's control stays inside it and scrolls
|
|
41
|
+
with it. While the control shows, that container becomes its containing block
|
|
42
|
+
and isolates its stacking (an app's own `position` on the container still
|
|
43
|
+
wins). The corner is inset by `--kui-collapsible-panel-restore-inset` plus the
|
|
44
|
+
container's edge insets, and it owns that inset, so a `FloatingToolbar` hosting
|
|
45
|
+
the control floats from the corner without adding its own. When the same
|
|
46
|
+
container also holds an expanded inline bottom drawer — a bottom
|
|
47
|
+
`CollapsiblePanel` or a bottom `ResizableRegion` (`axis="vertical"`,
|
|
48
|
+
`edge="start"`) — as a direct child, or inside one of its direct children
|
|
49
|
+
(the app's work-area column), the corner floats that inset above the
|
|
50
|
+
drawer's top edge instead of over the drawer, and returns to the container's
|
|
51
|
+
bottom when the drawer collapses. It follows the drawer through CSS anchor
|
|
52
|
+
positioning, so a drag-resize moves it too; an engine without anchor
|
|
53
|
+
positioning keeps the container's bottom corner. A drawer nested deeper,
|
|
54
|
+
inside the work area's own content, belongs to that content and does not move
|
|
55
|
+
the corner. The corner stacks beneath open overlays: an open overlay is the
|
|
56
|
+
page's top layer, so it covers another panel's restore control as it covers
|
|
57
|
+
the rest of the page, including under the compact overlay's backdrop. The
|
|
58
|
+
control takes `--kui-collapsible-panel-restore-z`, which defaults to two less
|
|
59
|
+
than `--kui-collapsible-panel-overlay-z` (38); the backdrop defaults to one
|
|
60
|
+
less (39), so moving the overlay z-index moves both. Escape, a backdrop
|
|
61
|
+
press, or the panel's own close control reveals the control again, and a
|
|
62
|
+
collapsed overlay leaves it clickable. `ResizableRegion`'s `restoreControl`
|
|
63
|
+
follows the same rules, two below `--kui-resizable-region-overlay-z` (39).
|
|
64
|
+
A collapsed `ResizableRegion` likewise renders `inert` and `aria-hidden` on
|
|
65
|
+
the region itself (and `inert` on its `.kui-resizable-region__content`
|
|
66
|
+
wrapper), so its label leaves the accessibility tree with its content; its
|
|
67
|
+
separator is already hidden while collapsed, and the restore control stays
|
|
68
|
+
outside the region.
|
|
29
69
|
Overlay presentation also clamps fixed-size animated content to the configured
|
|
30
70
|
responsive overlay maximum, so a remembered desktop size cannot escape a narrow
|
|
31
71
|
viewport.
|
|
@@ -181,6 +221,15 @@ const stop = wireSidebar(app, {
|
|
|
181
221
|
});
|
|
182
222
|
```
|
|
183
223
|
|
|
224
|
+
## Sizing in a flex layout
|
|
225
|
+
|
|
226
|
+
An expanded panel holds its `size` in a flex row or column (`flex-shrink: 0`):
|
|
227
|
+
its content keeps that fixed size so collapsing slides it out instead of
|
|
228
|
+
squeezing it, and a shrunk track would only clip the content's trailing edge.
|
|
229
|
+
Give the sibling work area `min-width: 0` / `min-height: 0` (a `Pane` or
|
|
230
|
+
`List flex` already has it) so it is the region that gives way, and switch the
|
|
231
|
+
panel to the compact overlay (`wireSidebar`) where the viewport cannot hold it.
|
|
232
|
+
|
|
184
233
|
## Safe areas
|
|
185
234
|
|
|
186
235
|
A panel grows by the unsafe inset of the edge it docks to and pads its content
|
|
@@ -214,3 +263,12 @@ It is covered end-to-end across Chromium, Firefox, and WebKit by
|
|
|
214
263
|
move/restore, the compact overlay + Escape/backdrop dismiss, the Tab trap, and
|
|
215
264
|
the compact initial state across first load and wide/compact crossings),
|
|
216
265
|
alongside the component/wire unit tests.
|
|
266
|
+
|
|
267
|
+
The focused [CollapsiblePanel route](../ux-demo/?component=collapsible-panel)
|
|
268
|
+
([TSX source](../ux-demo/demos/collapsible-panel.tsx)) also has a **Restore
|
|
269
|
+
control** example: a bottom drawer that starts collapsed, with a
|
|
270
|
+
`FloatingToolbar` `restoreControl` in its frame's bottom-end corner and its
|
|
271
|
+
own hide toggle in the drawer header. Both toggles share one `data-action`,
|
|
272
|
+
and the catalog wires them with `wireSidebar`, so the corner control really
|
|
273
|
+
restores the drawer and focus moves between the two. It is covered by
|
|
274
|
+
`tests/browser/app-layout-catalog.spec.ts` at wide and compact widths.
|
|
@@ -26,7 +26,10 @@ delivery contract. Every v1 entry projects once, in order, under the stable
|
|
|
26
26
|
qualified key `package:id`. Each v2 entry explicitly covers parents/contexts,
|
|
27
27
|
named zones and cardinality, optional explicit JSX prop bindings, child concepts, state ownership, required wiring,
|
|
28
28
|
responsive ownership, layout and geometry, accessibility obligations, public
|
|
29
|
-
CSS boundaries, diagnostics, and provenance.
|
|
29
|
+
CSS boundaries, diagnostics, and provenance. A wrapper entry may add
|
|
30
|
+
`rendersAs`: the cataloged roots it renders (any one of them, or nothing), so
|
|
31
|
+
composition checks treat its elements as each root rather than as an unknown
|
|
32
|
+
child.
|
|
30
33
|
|
|
31
34
|
An entry's optional `cssValueProps` makes CSS-adjacent prop grammar equally
|
|
32
35
|
machine-evaluable. Each path records the property grammar, finite shorthands,
|
|
@@ -245,6 +248,9 @@ and metadata labels. Configure its semantic `tone`, `appearance`, `shape`, and
|
|
|
245
248
|
`size`; do not recreate or override badge anatomy in an application or consuming
|
|
246
249
|
component. Use `label` when visible content is abbreviated and `ariaHidden` only
|
|
247
250
|
when a surrounding component already includes the same value in its accessible name.
|
|
251
|
+
Every tone's text and solid fill use that tone's `--kui-color-{tone}-on-fill`
|
|
252
|
+
token (`neutral` uses the text colors), the foreground tuned to clear WCAG AA
|
|
253
|
+
(4.5:1) on the tone's fills in light and dark mode.
|
|
248
254
|
|
|
249
255
|
`ListItem` renders its leading icon and nested SVG at a root-scaled 18px by
|
|
250
256
|
default while retaining the row's 44px minimum interactive target. Multiline
|
|
@@ -275,7 +281,14 @@ the logical end while the visible glyph defaults to 18px through
|
|
|
275
281
|
`StateBanner` exposes instance-level `--kui-state-banner-background`,
|
|
276
282
|
`--kui-state-banner-border`, `--kui-state-banner-foreground`,
|
|
277
283
|
`--kui-state-banner-detail` and action background variables. Its optional
|
|
278
|
-
badge composes `Badge` beside the title and follows the banner tone by default.
|
|
284
|
+
badge composes `Badge` beside the title and follows the banner tone by default. The
|
|
285
|
+
title, badge, and detail flow as inline text: a wrapping title keeps the badge one item
|
|
286
|
+
gap after its last word, and a detail that does not fit whole beside them moves to its
|
|
287
|
+
own line and truncates at the full copy width (below 576px it always takes its own
|
|
288
|
+
line). The title and detail both use the tone's `--kui-color-{tone}-on-fill`
|
|
289
|
+
foreground (`info` uses `brand`) at full strength, clearing WCAG AA over the tone's fill in light and dark
|
|
290
|
+
mode; the detail reads as secondary through its smaller, regular-weight type, and
|
|
291
|
+
only the neutral tone quiets it, to `--kui-color-neutral-on-quiet`. Its five built-in
|
|
279
292
|
tones can be rethemed globally with
|
|
280
293
|
`--kui-state-banner-{tone}-{background|border|foreground}`. Toolbar control,
|
|
281
294
|
segmented-control, app-tab, and tab-bar colors likewise use their public
|
|
@@ -449,7 +462,8 @@ A value-bearing component's `placeholder` prop is a first-class loading mode: th
|
|
|
449
462
|
component renders its own real chrome (labels, icon and action affordances,
|
|
450
463
|
container geometry) while replacing each **value** slot with a subtle, deliberately
|
|
451
464
|
unanimated `Skeleton` block and disabling its own interactive controls
|
|
452
|
-
(`aria-busy`, dropped `data-action`, disabled buttons).
|
|
465
|
+
(`aria-busy`, dropped `data-action`, disabled buttons). Only unknown values become
|
|
466
|
+
skeletons; nothing else may change. Sizes, shapes, typography, color, and opacity stay
|
|
453
467
|
identical to the populated component, so a parent composes a faithful loading view —
|
|
454
468
|
an inspector, a detail pane — from placeholder children without hand-rebuilding
|
|
455
469
|
markup. The application still owns the loading lifecycle (when to pass `placeholder`)
|
|
@@ -460,6 +474,46 @@ line of its own and centers in its slot. It is a
|
|
|
460
474
|
placeholder, not progress: use `LoadingSpinner` for known busy activity, and never
|
|
461
475
|
animate the skeleton.
|
|
462
476
|
|
|
477
|
+
A placeholder is loading, not unavailable, so it keeps the `disabled` attribute (its
|
|
478
|
+
controls stay inert and out of the keyboard order) but never shows disabled chrome.
|
|
479
|
+
`skeleton.css`, which every component that renders a skeleton loads, neutralizes generic
|
|
480
|
+
disabled styling under `[data-placeholder="true"]` — including Web Awesome's native
|
|
481
|
+
`button:disabled { opacity: 0.5; cursor: not-allowed }` when `webawesome.css` is
|
|
482
|
+
loaded — to full opacity and the non-interactive `default` cursor. That opacity reset
|
|
483
|
+
carries zero specificity, so a component's own opacity (a control hidden until
|
|
484
|
+
interaction) still wins, and each component excludes placeholders from its own
|
|
485
|
+
disabled tone and hover feedback — including hover reveals: a `ListActionRow` with
|
|
486
|
+
`trailingActionVisibility="interaction"` keeps its trailing action hidden when its
|
|
487
|
+
placeholder is hovered, as the resting live row does. The cursor is the one intentional difference from the
|
|
488
|
+
live state: a placeholder is not clickable, so it never advertises a pointer.
|
|
489
|
+
|
|
490
|
+
A control the author disabled is different: it will be unavailable once loaded, so its
|
|
491
|
+
placeholder keeps the live disabled tone. Each such control carries the component-owned
|
|
492
|
+
`data-kui-disabled="true"` marker whenever its own disabled prop is set, independent of
|
|
493
|
+
`placeholder` — `ListItem` and `ListActionRow` `disabled`, `trailingActionDisabled`,
|
|
494
|
+
a `SegmentedControl` choice's `disabled`, and `ListHeader` `actionDisabled` (on the
|
|
495
|
+
action or disclosure toggle). The placeholder reset skips the marker and components key
|
|
496
|
+
their disabled tone on it, so only the `placeholder`-only `disabled` attribute is
|
|
497
|
+
neutralized. That tone is each component's own, never Web Awesome's native
|
|
498
|
+
`button:disabled`, so an author-disabled control is dimmed with or without
|
|
499
|
+
`webawesome.css`. The marker is reserved: the extension-attribute channels
|
|
500
|
+
(`rootAttributes`, `trailingActionAttributes`, `triggerAttributes`) cannot set it. A
|
|
501
|
+
disabled placeholder still shows the `default` cursor, never `not-allowed`.
|
|
502
|
+
Chrome a component draws itself from a known prop stays live, even inside a slot that
|
|
503
|
+
also holds values. `ListItem`'s trailing slot has three inputs: the `busy` spinner is
|
|
504
|
+
component-owned chrome and stays live, while `status` text and author-supplied
|
|
505
|
+
`trailing` content are values and each become a skeleton (the component cannot tell an
|
|
506
|
+
author's chevron from a count, so all `trailing` content is treated as a value).
|
|
507
|
+
`ListActionRow`'s status line follows the same split: its `busy` spinner stays live and
|
|
508
|
+
only the `status` text becomes a skeleton.
|
|
509
|
+
`SegmentedControl` is the one placeholder without a skeleton: its choices are known
|
|
510
|
+
chrome and only the selection is unknown, so it renders every choice's live label or
|
|
511
|
+
icon at its live geometry, selects none, and neutralizes its own disabled chrome.
|
|
512
|
+
`tests/browser/placeholder-fixture.spec.ts` enforces the rule: it renders every
|
|
513
|
+
placeholder component live and as a placeholder from identical props and diffs each
|
|
514
|
+
element's geometry and computed chrome, excluding only the value slots, and checks that
|
|
515
|
+
every author-disabled control is dimmed in both renders.
|
|
516
|
+
|
|
463
517
|
Package source styles express root-scaled geometry with `remify(<px>)`; the
|
|
464
518
|
build converts it against the 16px authoring baseline and exposes only ordinary
|
|
465
519
|
`rem` CSS. Literal pixels remain for intentional hairlines, and `em` remains
|
|
@@ -475,7 +529,25 @@ Kerf JSX declaration boundary for every catalog-supported `wa-*` tag.
|
|
|
475
529
|
Consumers register only the individual Web Awesome modules they render and can
|
|
476
530
|
override `--wa-*` values after the theme import. The shared `--wa-*` values feed
|
|
477
531
|
both Web Awesome controls and Kerf's `--kui-*` foundation aliases, preventing a
|
|
478
|
-
second application palette.
|
|
532
|
+
second application palette. Without the theme, every foundation color token,
|
|
533
|
+
every elevation token (`--kui-shadow-*`), and the focus-ring color fall back to
|
|
534
|
+
the same value the theme assigns, including its `light-dark()` pair, so
|
|
535
|
+
surfaces (including the dark `surface-raised`), links (`text-link` is the brand
|
|
536
|
+
on-quiet text color, not the brand fill), tone text, fills, and raised-surface
|
|
537
|
+
shadows keep their light and dark appearance and contrast either way. The
|
|
538
|
+
theme's elevation shadows are scheme-aware: light keeps the soft Hot Sheet 2
|
|
539
|
+
alphas, and dark raises them (`--wa-shadow-s` 14% to 50% black, `-m` 11% to
|
|
540
|
+
40%, `-l` 9% to 32%) so a raised surface still separates from a near-black
|
|
541
|
+
page.
|
|
542
|
+
Kerf owns the light `brand`, `success`, and `warning` `on-quiet` values in that
|
|
543
|
+
theme layer: each keeps its hue but is dark enough to clear WCAG AA (4.5:1) on
|
|
544
|
+
the lowered page background (`--kui-color-surface-lowered`, `#f2f2f7`), not
|
|
545
|
+
only on the white surface, so toned text reads on every background a page
|
|
546
|
+
paints. It likewise owns every tone's loud pair: each `on-loud` text color
|
|
547
|
+
clears AA on its `fill-loud` in both schemes. Light brand and danger keep white
|
|
548
|
+
text on a slightly deeper fill of the same hue (`#0075db`, `#eb0005`); success
|
|
549
|
+
keeps its bright green with dark text, as warning does; the dark-mode brand and
|
|
550
|
+
danger fills keep their color with dark text.
|
|
479
551
|
|
|
480
552
|
`Select` owns its custom-element reconciliation seam. It gives each slotted
|
|
481
553
|
option icon a stable key and leaves the upgraded Web Awesome-owned slot subtree
|
|
@@ -151,14 +151,14 @@ an upstream component or recipe request.
|
|
|
151
151
|
| One-pane navigation — `NavStack` | A compact flow pushes into details while keeping earlier views mounted, or a single-pane screen needs the same stable layout contract. | Do not use it when list and detail should remain visible together; use `SplitView`. Do not use it alone for co-equal top-level destinations; use one stack per `TabScaffold` tab. | Keep the ordered view array controlled, put view-specific bottom chrome on each view (or use the component fallback), import its CSS explicitly, and call `wireNavStack` for back delegation, content-slide/chrome-cross-fade transitions, and focus move/restore. Mark a preferred initial target with `data-nav-focus` when DOM order is insufficient. | View keys/content/titles, push and pop actions, preferred initial focus targets, and per-view or persistent bottom toolbar content. | `@kerfjs/ui/nav-stack` | [App-layout decision matrix](./app-layouts.md#decision-matrix) |
|
|
152
152
|
| Responsive list-detail — `SplitView` | A primary list and related detail belong together on roomy devices but become a one-pane drill-down on compact devices. | Do not use it for a single linear flow or a multi-panel editor shell. | Provide controlled selection/detail state and device class; opt into resize wiring only when the separator is user adjustable. | Selection, detail content, compact back action, device policy, and optional persisted width. | `@kerfjs/ui/split-view` | [App-layout decision matrix](./app-layouts.md#decision-matrix) |
|
|
153
153
|
| Compact top-level destinations — `TabScaffold` | A handset or portrait-tablet app has two to five co-equal destinations whose scenes and nested navigation must remain mounted across switches. | Do not use it for document tabs, reorderable work items, or a desktop navigation rail. | Keep the active id controlled, import its CSS explicitly, and call `wireTabScaffold`; commonly place one `NavStack` in each tab scene. | Destination definitions, active id, routing, persistence, and roomy-device replacement. | `@kerfjs/ui/tab-scaffold` | [App-layout decision matrix](./app-layouts.md#decision-matrix) |
|
|
154
|
-
| Desktop multi-panel workspace — `Workbench` | A desktop-class tool needs a central work area plus independently collapsible navigator, inspector, or console regions. | Do not shrink the full shell onto compact devices or use it for one standalone panel. | Render only the required rails/drawer, keep collapse state controlled, and replace peripheral regions with stacks or overlays below desktop sizes.
|
|
154
|
+
| Desktop multi-panel workspace — `Workbench` | A desktop-class tool needs a central work area plus independently collapsible navigator, inspector, or console regions. | Do not shrink the full shell onto compact devices or use it for one standalone panel. | Render only the required rails/drawer, keep collapse state controlled, and replace peripheral regions with stacks or overlays below desktop sizes. Opt a panel into drag/keyboard resizing with `resizable` and call `wireWorkbench` with its size signal. | Panel presence/content, collapsed states, sizes, persistence, responsive replacement, and controls. | `@kerfjs/ui/workbench` | [Workbench](./workbench.md) |
|
|
155
155
|
| Standalone rail or drawer — `CollapsiblePanel` | One left/right rail or bottom drawer needs controlled collapse without adopting the complete `Workbench` shell. | Do not use it for several coordinated workspace panels or retain an empty icon-only rail while collapsed. | Pair it with `CollapsiblePanelToggle`; call `wireSidebar` for focus transfer, Escape/backdrop dismissal, compact overlay trapping, and persistence integration. | Panel content/size, collapsed state, toggle placement, persistence, and compact policy. | `@kerfjs/ui/collapsible-panel` | [App-layout decision matrix](./app-layouts.md#decision-matrix) |
|
|
156
156
|
| Lowered content surface — `SunkenPanel` | A main work area or nested content group needs one visually lowered surface with a compact inset and vertical stack. | Do not use it merely to add padding, as a replacement for `Pane` anatomy, or around children that already own the same outer surface. | Compose the application-owned content as children, choose the default `rounded` shape or `square` for a flush edge-to-edge area, and pass `ariaLabel` only when the surface is a distinct named region. | Region semantics, accessible name, shape, scroll ownership, child ordering, and content. | `@kerfjs/ui/sunken-panel` | [SunkenPanel](./sunken-panel.md) |
|
|
157
157
|
| Menu composition | Navigation sections need full-size rows and the same content-item geometry as every other pane. | Do not add sidebar-specific wrapper padding, shrink targets to icon size, nest an interactive trailing control in `ListItem`, or use a chevron on a row that does not disclose content. Use ordinary links for a different navigation contract. | Compose `ListHeader`, `ListItem`, and `ListActionRow` in `.kui-content`; use `ListHeader` toggle mode with real controlled content, and use `.kui-content-item` for other surfaces plus a pane footer for toolbar actions. | Information architecture, disclosure content and state, responsive drawer/shell behavior, and token overrides. | `@kerfjs/ui/layout.css` | [Pane geometry](../README.md#pane-and-content-geometry) |
|
|
158
158
|
| Resizable application pane — `ResizableRegion`, `clampRegionSize`, `resizeRegionFromPointer` | A controlled split pane needs the Kerf separator, collapse state, pointer plus keyboard resizing, or a product-specific decorative grip. | Do not use it for static equal columns; use `Grid`. Use application CSS grid for static asymmetric or intrinsic tracks. Prefer it over Web Awesome `wa-split-panel` unless that component's distinct API is required. Keep `handleIcon` noninteractive. | Call `wireResizableRegions` from `@kerfjs/ui/wire-resizable-regions` once and retain its disposer. | Size signal, min/max policy, collapse policy, persistence, and optional decorative handle icon. | `@kerfjs/ui/resizable-region` | [ResizableRegion contract](./accessibility.md#resizableregion) |
|
|
159
159
|
| One application tab — `AppTab` | A controlled app tab needs selection, close, drag, leading/trailing anatomy, compact/segmented/icon-only presentation, label truncation, safe domain metadata, or a product-specific close glyph. | Do not render it alone or use it for a small settings choice; compose in `TabBar`, or use `SegmentedControl`. Keep `closeIcon` noninteractive. | Compose in `TabBar`; let `wireTabBars` manage interaction. Put only domain `data-*` values in `rootAttributes`; use typed appearance props instead of descendant CSS. | Tab identity, order, selection, close policy, content, domain metadata values, and outer placement. | `@kerfjs/ui/app-tab` | [Tabs contract](./accessibility.md#tabs) |
|
|
160
160
|
| Application tab strip — `TabBar`, `wireTabBars`, `reorderTabs` | Tabs switch page regions and may overflow, close, reorder, fill a segmented inspector strip, sit beside a trailing action, or keep that adjacent action distinct from a far-edge end action. | Do not use it for a compact local view toggle; use `SegmentedControl`. Do not use it for a long choice list; use `Select`. Prefer it over Web Awesome `wa-tab-group`, `wa-tab`, and `wa-tab-panel` for Kerf app tabs. | Call `wireTabBars` once, retain the disposer, and apply `onReorder` synchronously; `reorderTabs` is the default array helper. Combine `trailingPlacement="adjacent"` with `end` for split actions; TabBar owns the shrinking/scrolling tab geometry and keeps both actions visible. Choose typed presentation/allocation props while the parent owns outer placement. | Ordered tabs, selection, panels, routing, closing, persistence, action content, and outer placement. | `@kerfjs/ui/tab-bar` plus `@kerfjs/ui/wire-tab-bars` | [Tabs contract](./accessibility.md#tabs) |
|
|
161
|
-
| Panel, dialog, or page heading — `Toolbar` + `ToolbarText` | A panel, dialog, or page needs an extra-large title, optional icon, grouped trailing actions, and optional supporting copy. | Do not add a private heading wrapper or bespoke layout. The toolbar supplies structure, not modal behavior; use an application overlay or Web Awesome `wa-dialog` for that behavior.
|
|
161
|
+
| Panel, dialog, or page heading — `Toolbar` + `ToolbarText` | A panel, dialog, or page needs an extra-large title, optional icon, grouped trailing actions, and optional supporting copy. | Do not add a private heading wrapper or bespoke layout. The toolbar supplies structure, not modal behavior; use an application overlay or Web Awesome `wa-dialog` for that behavior. In a narrow peripheral rail or drawer, where xlarge would truncate at the panel's minimum size, use the default `ToolbarText` size as pane identity. | Connect title/supporting-copy ids to the host, group controls, and delegate actions. **For a page or view title set `headingLevel` (usually `1`)** on `ToolbarText`; omit it for a dialog title referenced by `aria-labelledby`. | Open state, focus lifecycle, dismissal, controls, ids, copy, and heading level. | `@kerfjs/ui/toolbar` + `@kerfjs/ui/toolbar-text` | [Toolbar headings](./accessibility.md#toolbar-headings) |
|
|
162
162
|
| Dialog or popup geometry — `DialogSurface`, `PopupSurface` | Recurring Web Awesome dialogs need standard sizes/presentations/body/footer insets, or dropdown menus need list-compatible inset ownership. | Do not use these wrappers as generic layout or to replace native dialog/dropdown behavior. Avoid consumer `::part()` overrides and do not stack a dialog body inset around list-owned child geometry. | Wrap one `wa-dialog` or `wa-dropdown`; choose the typed geometry while retaining native labeling, open state, focus, dismissal, and menu semantics. Compose a dialog body as a `List` by default, use `bodyInset="none"` when its children own list geometry, and wrap bare prose in `ListInsetText`. | State, focus lifecycle, dismissal, labels, content, and outer placement. | `@kerfjs/ui/surface-scaffold` | [Surface scaffolds](./surface-scaffold.md) |
|
|
163
163
|
| Key/value facts — `ValueTable`, `ValueTableRow` | Read-only labels and values form a semantic definition list, optionally with a leading icon. | Do not use it for editable form fields or a row/column data grid; use native form or table semantics. | Compose typed `ValueTableRow` entries; pass `icon` when a 24px leading icon adds useful context. | Values, formatting, icon meaning, and empty/loading policy. | `@kerfjs/ui/value-table` | [Component ownership](./component-contract.md#ownership-boundaries) |
|
|
164
164
|
| Indeterminate activity — `LoadingSpinner` | A Kerf surface needs compact, labeled or decorative indeterminate progress. | Do not use it for known progress; use Web Awesome `wa-progress-bar` or `wa-progress-ring`. Direct Web Awesome UI may use `wa-spinner`; do not mix spinner systems within one surface. | None; pass a label when the spinner conveys status. | Loading lifecycle and adjacent status copy. | `@kerfjs/ui/loading-spinner` | [Accessibility](./accessibility.md#shared-rules) |
|
|
@@ -186,12 +186,18 @@ an upstream component or recipe request.
|
|
|
186
186
|
- A `ResizableRegion` overlay automatically clamps both its track and fixed-size
|
|
187
187
|
animated content to the responsive overlay maximum. Set the policy and maximum
|
|
188
188
|
on the component instead of adding application descendant width/height fixes.
|
|
189
|
+
It paints `--kui-color-surface` itself (an inline region stays transparent),
|
|
190
|
+
so do not add a background to make an overlay opaque.
|
|
189
191
|
- Configure application panels through the shared `separator`, `collapseMotion`,
|
|
190
192
|
`contentOverflow`, `presentation`, `restoreControl`, and `restorePosition`
|
|
191
193
|
props on `ResizableRegion`, `Workbench` panels, and `CollapsiblePanel`. These
|
|
192
194
|
cover separator suppression, one-reflow collapse with composited motion,
|
|
193
195
|
bottom-drawer popups, compact overlays or replacements, and safe-area restore
|
|
194
|
-
placement without descendant `.kui-*` overrides. `
|
|
196
|
+
placement without descendant `.kui-*` overrides. A `Workbench` rail's
|
|
197
|
+
or bottom drawer's `responsiveOverlayAt` (like `ResizableRegion`'s
|
|
198
|
+
`responsiveFillAt`) switches it to an overlay below a container breakpoint
|
|
199
|
+
without a device-class check.
|
|
200
|
+
`wireSidebar` also accepts a
|
|
195
201
|
hidden compact replacement and keeps compact overlays exclusive by default.
|
|
196
202
|
- `TokenSearchField` is a structured editor. A native input or `wa-input` is the right answer for ordinary text.
|
|
197
203
|
|
|
@@ -207,8 +213,12 @@ toolbar geometry, hover/pressed treatment, and grouping. `SegmentedControl`,
|
|
|
207
213
|
**inside** a `ToolbarControlGroup`, not loose in the zone. For a page, panel, or
|
|
208
214
|
dialog heading, put an extra-large `ToolbarText` directly in the leading zone,
|
|
209
215
|
optionally preceded by a grouped icon, and group trailing actions. Keep supporting
|
|
210
|
-
copy below as app-owned content.
|
|
211
|
-
|
|
216
|
+
copy below as app-owned content. Size the title to its track: a narrow
|
|
217
|
+
peripheral rail or drawer (a navigator, inspector, or console beside a work
|
|
218
|
+
area that carries the extra-large title, often with its own close control in
|
|
219
|
+
the header) labels itself with the default size, because extra-large truncates
|
|
220
|
+
there — "Inspector" becomes "Ins…" in a 160px rail. A bottom divider is
|
|
221
|
+
enabled by default. Set `dividerSides=""` for none, or
|
|
212
222
|
use the canonical physical-edge combinations (`t`, `r`, `b`, `l`, in that
|
|
213
223
|
order—for example `tr` or `trbl`) when the toolbar owns other separator edges.
|
|
214
224
|
|
|
@@ -216,7 +226,7 @@ Common toolbar patterns:
|
|
|
216
226
|
|
|
217
227
|
| Want | Put in the zone | Notes |
|
|
218
228
|
| ----------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
|
|
219
|
-
| Identity or title text | `<ToolbarText text="…" size="large" />` (or `xlarge` for a page/panel title)
|
|
229
|
+
| 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 |
|
|
220
230
|
| One or more icon/text buttons | `<ToolbarControlGroup>{buttons}</ToolbarControlGroup>` | Use `buttonAppearance="push"` for toggle buttons with `aria-pressed`; `single` for a lone control |
|
|
221
231
|
| An exclusive view switch | `<ToolbarControlGroup><SegmentedControl … /></ToolbarControlGroup>` | Not `TabBar`, which switches tabpanels |
|
|
222
232
|
| A value list | `<ToolbarControlGroup><Select … /></ToolbarControlGroup>` | Register `@kerfjs/ui/select/register` once; use `focusRingOwner="group"` so focus follows the group's geometry |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 220" width="460" height="220"><defs><clipPath id="cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="ct4"><rect x="178.6" y="168.3" width="102.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(174, 174, 178)"><clipPath id="svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(174,174,178)">When someone files a ticket it will show up here.</text><rect x="178.6" y="168.3" width="102.8" height="32" rx="16" fill="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 460 220" width="460" height="220"><defs><clipPath id="cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="ct4"><rect x="178.6" y="168.3" width="102.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g color="rgb(174, 174, 178)"><clipPath id="svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(174,174,178)">When someone files a ticket it will show up here.</text><rect x="178.6" y="168.3" width="102.8" height="32" rx="16" fill="rgb(44,44,46)"/><rect x="179.5" y="168.5" width="101" height="31" rx="15.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="191.63" y="190.3" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(245,245,247)">New ticket</text></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 502" width="492" height="502"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="cp1"><rect x="16" y="296" width="460" height="190"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="274" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="296" width="460" height="190" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="502" 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)">Icon, title, detail, and action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="svgimg4ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="svgimg4ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="svgimg4ct4"><rect x="178.6" y="168.3" width="102.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg4cp0)"><g color="rgb(174, 174, 178)"><clipPath id="svgimg4svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgimg4svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(174,174,178)">When someone files a ticket it will show up here.</text><rect x="178.6" y="168.3" width="102.8" height="32" rx="16" fill="rgb(
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 492 502" width="492" height="502"><defs><clipPath id="cp0"><rect x="16" y="38" width="460" height="220"/></clipPath><clipPath id="cp1"><rect x="16" y="296" width="460" height="190"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="460" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="460" height="220" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="274" width="460" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="296" width="460" height="190" rx="0"/></clipPath></defs><rect x="0" y="0" width="492" height="502" 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)">Icon, title, detail, and action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="460" height="220"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4cp0"><rect x="214" y="53" width="32" height="32"/></clipPath><clipPath id="svgimg4ct2"><rect x="157.7" y="101" width="144.7" height="23"/></clipPath><clipPath id="svgimg4ct3"><rect x="73.7" y="132" width="312.7" height="20.3"/></clipPath><clipPath id="svgimg4ct4"><rect x="178.6" y="168.3" width="102.8" height="32"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="212" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg4cp0)"><g color="rgb(174, 174, 178)"><clipPath id="svgimg4svgic1"><rect x="214" y="53" width="32" height="32"/></clipPath><g clip-path="url(#svgimg4svgic1)"><g transform="translate(214 53)scale(1.33333)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="157.67" y="120" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No open tickets</text><text x="73.67" y="147" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(174,174,178)">When someone files a ticket it will show up here.</text><rect x="178.6" y="168.3" width="102.8" height="32" rx="16" fill="rgb(44,44,46)"/><rect x="179.5" y="168.5" width="101" height="31" rx="15.5" fill="none" stroke="rgb(72,72,74)" stroke-width="1"/><text x="191.63" y="190.3" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(245,245,247)">New ticket</text></g></g></g></g><text x="16" y="286" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(174,174,178)">No results for a filter</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="296" width="460" height="190"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 296)"><defs><clipPath id="svgimg7cp0"><rect x="214" y="66" width="32" height="32.3"/></clipPath><clipPath id="svgimg7ct2"><rect x="174.4" y="114.3" width="111.2" height="23"/></clipPath><clipPath id="svgimg7ct3"><rect x="115.7" y="145.3" width="228.6" height="20.3"/></clipPath></defs><rect x="28.5" y="20.5" width="403" height="191" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#svgimg7cp0)"><g color="rgb(174, 174, 178)"><clipPath id="svgimg7svgic1"><rect x="214" y="66.3" width="32" height="32"/></clipPath><g clip-path="url(#svgimg7svgic1)"><g transform="translate(214 66.344)scale(1.33333)"><path d="M10 20a1 1 0 0 0 .6.9l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .5-1.3l7.2-8A1 1 0 0 0 21 3H3a1 1 0 0 0-.7 1.7l7.2 8A2 2 0 0 1 10 14Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(174, 174, 178)" stroke-width="1.5px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/></g></g></g></g><text x="174.42" y="133.34" font-family="system-ui, "-apple-system", sans-serif" font-size="20" font-weight="650" fill="rgb(245,245,247)">No matches</text><text x="115.72" y="160.34" font-family="system-ui, "-apple-system", sans-serif" font-size="14" fill="rgb(174,174,178)">No tickets match the current filters.</text></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct1"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct2"><rect x="134.8" y="32" width="20.3" height="20"/></clipPath><clipPath id="cp3"><rect x="28" y="72" width="324" height="44"/></clipPath><clipPath id="ov4"><rect x="29" y="73" width="322" height="42" rx="11"/></clipPath><clipPath id="cp5"><rect x="37" y="85" width="18" height="18"/></clipPath><clipPath id="cp7"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ov8"><rect x="63" y="85" width="272" height="18" rx="0"/></clipPath><clipPath id="ct9"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="cp10"><rect x="28" y="124" width="324" height="44"/></clipPath><clipPath id="ov11"><rect x="29" y="125" width="322" height="42" rx="11"/></clipPath><clipPath id="cp12"><rect x="37" y="137" width="18" height="18"/></clipPath><clipPath id="cp14"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ov15"><rect x="63" y="137" width="272" height="18" rx="0"/></clipPath><clipPath id="ct16"><rect x="63" y="137" width="272" height="18"/></clipPath></defs><rect x="28.5" y="20.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g clip-path="url(#ct1)"><text x="37" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(174,174,178)">WORKSPACE</text></g></g><rect x="134.8" y="32" width="20.3" height="20" rx="10" fill="rgb(17,17,19)"/><rect x="135.5" y="32.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="141.41" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(174,174,178)">2</text><g clip-path="url(#cp3)"><rect x="28" y="72" width="324" height="44" rx="12" fill="rgb(40,57,66)"/><rect x="28.5" y="72.5" width="323" height="43" rx="11.5" fill="none" stroke="rgb(53,92,109)" stroke-width="1"/><g clip-path="url(#ov4)"><g clip-path="url(#cp5)"><g color="rgb(245, 245, 247)"><clipPath id="svgic6"><rect x="37" y="85" width="18" height="18"/></clipPath><g clip-path="url(#svgic6)"><g transform="matrix(.75 0 0 .75 37 85)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(245, 245, 247)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(245, 245, 247)" 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 clip-path="url(#cp7)"><g clip-path="url(#ov8)"><text x="63" y="100" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(245,245,247)">Inbox</text></g></g></g></g><g clip-path="url(#cp10)"><rect x="28.5" y="124.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#ov11)"><g clip-path="url(#cp12)"><g color="rgb(245, 245, 247)"><clipPath id="svgic13"><rect x="37" y="137" width="18" height="18"/></clipPath><g clip-path="url(#svgic13)"><g transform="matrix(.75 0 0 .75 37 137)"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.7-.9l-.8-1.2A2 2 0 0 0 7.9 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(245, 245, 247)" 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 clip-path="url(#cp14)"><g clip-path="url(#ov15)"><text x="63" y="152" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(245,245,247)">Projects</text></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 230" width="420" height="230"><defs><clipPath id="cp0"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct1"><rect x="29" y="26.5" width="97.8" height="31"/></clipPath><clipPath id="ct2"><rect x="134.8" y="32" width="20.3" height="20"/></clipPath><clipPath id="cp3"><rect x="28" y="72" width="324" height="44"/></clipPath><clipPath id="ov4"><rect x="29" y="73" width="322" height="42" rx="11"/></clipPath><clipPath id="cp5"><rect x="37" y="85" width="18" height="18"/></clipPath><clipPath id="cp7"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="ov8"><rect x="63" y="85" width="272" height="18" rx="0"/></clipPath><clipPath id="ct9"><rect x="63" y="85" width="272" height="18"/></clipPath><clipPath id="cp10"><rect x="28" y="124" width="324" height="44"/></clipPath><clipPath id="ov11"><rect x="29" y="125" width="322" height="42" rx="11"/></clipPath><clipPath id="cp12"><rect x="37" y="137" width="18" height="18"/></clipPath><clipPath id="cp14"><rect x="63" y="137" width="272" height="18"/></clipPath><clipPath id="ov15"><rect x="63" y="137" width="272" height="18" rx="0"/></clipPath><clipPath id="ct16"><rect x="63" y="137" width="272" height="18"/></clipPath></defs><rect x="28.5" y="20.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#cp0)"><g clip-path="url(#ct1)"><text x="37" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="650" fill="rgb(110,110,115)">WORKSPACE</text></g></g><rect x="134.8" y="32" width="20.3" height="20" rx="10" fill="rgb(242,242,247)"/><rect x="135.5" y="32.5" width="19" height="19" rx="9.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><text x="141.41" y="46.5" font-family="system-ui, "-apple-system", sans-serif" font-size="11" font-weight="650" fill="rgb(110,110,115)">2</text><g clip-path="url(#cp3)"><rect x="28" y="72" width="324" height="44" rx="12" fill="rgb(214,233,249)"/><rect x="28.5" y="72.5" width="323" height="43" rx="11.5" fill="none" stroke="rgb(166,207,242)" stroke-width="1"/><g clip-path="url(#ov4)"><g clip-path="url(#cp5)"><g color="rgb(29, 29, 31)"><clipPath id="svgic6"><rect x="37" y="85" width="18" height="18"/></clipPath><g clip-path="url(#svgic6)"><g transform="matrix(.75 0 0 .75 37 85)"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M5.5 5.1 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.4-6.9A2 2 0 0 0 16.8 4H7.2a2 2 0 0 0-1.7 1.1" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 clip-path="url(#cp7)"><g clip-path="url(#ov8)"><text x="63" y="100" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">Inbox</text></g></g></g></g><g clip-path="url(#cp10)"><rect x="28.5" y="124.5" width="323" height="43" rx="11.5" fill="none" stroke="rgba(0,0,0,0)" stroke-width="1"/><g clip-path="url(#ov11)"><g clip-path="url(#cp12)"><g color="rgb(29, 29, 31)"><clipPath id="svgic13"><rect x="37" y="137" width="18" height="18"/></clipPath><g clip-path="url(#svgic13)"><g transform="matrix(.75 0 0 .75 37 137)"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.7-.9l-.8-1.2A2 2 0 0 0 7.9 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 clip-path="url(#cp14)"><g clip-path="url(#ov15)"><text x="63" y="152" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(29,29,31)">Projects</text></g></g></g></g></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 92" width="420" height="92"><defs><clipPath id="ishc0"><rect x="28" y="20" width="364" height="44" rx="12"/></clipPath><clipPath id="cp1"><rect x="362" y="34" width="16" height="16"/></clipPath><clipPath id="cp3"><rect x="69" y="28" width="271" height="28"/></clipPath><clipPath id="ov4"><rect x="69" y="28" width="271" height="28" rx="0"/></clipPath><clipPath id="ct5"><rect x="69" y="33" width="271" height="18"/></clipPath><clipPath id="cp6"><rect x="37" y="30" width="24" height="24"/></clipPath></defs><rect x="28" y="20" width="364" height="44" rx="12" fill="rgb(214,
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 92" width="420" height="92"><defs><clipPath id="ishc0"><rect x="28" y="20" width="364" height="44" rx="12"/></clipPath><clipPath id="cp1"><rect x="362" y="34" width="16" height="16"/></clipPath><clipPath id="cp3"><rect x="69" y="28" width="271" height="28"/></clipPath><clipPath id="ov4"><rect x="69" y="28" width="271" height="28" rx="0"/></clipPath><clipPath id="ct5"><rect x="69" y="33" width="271" height="18"/></clipPath><clipPath id="cp6"><rect x="37" y="30" width="24" height="24"/></clipPath></defs><rect x="28" y="20" width="364" height="44" rx="12" fill="rgb(214,233,249)"/><g clip-path="url(#ishc0)"><path d="M24 16h372v52H24zm16 5h340a11 11 0 0 1 11 11v20a11 11 0 0 1-11 11H40a11 11 0 0 1-11-11V32a11 11 0 0 1 11-11" fill="rgb(166,207,242)" fill-rule="evenodd"/></g><g clip-path="url(#cp1)"><g color="rgb(29, 29, 31)"><clipPath id="svgic2"><rect x="362" y="34" width="16" height="16"/></clipPath><g clip-path="url(#svgic2)"><g transform="translate(362 34)scale(.66667)"><path d="M21.2 6.8a1 1 0 0 0-4-4L3.8 16.2l-.5.8L2 21.4a.5.5 0 0 0 .6.6L7 20.7l.8-.5Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="m15 5 4 4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 clip-path="url(#cp3)"><g clip-path="url(#ov4)"><text x="69" y="48" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">production.example.com</text></g></g><g clip-path="url(#cp6)"><g color="rgb(29, 29, 31)"><clipPath id="svgic7"><rect x="37" y="30" width="24" height="24"/></clipPath><g clip-path="url(#svgic7)"><g transform="translate(37 30)"><path d="M12 15v5s3-.6 4-2c1-1.6 0-5 0-5" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1 0-3a2 2 0 0 0-3 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12a22 22 0 0 1 2-4 13 13 0 0 1 11-6c0 2.7-.8 7.5-6 11a22 22 0 0 1-4 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12H4s.5-3 2-4c1.6-1 5 0 5 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 452 276" width="452" height="276"><defs><clipPath id="cp0"><rect x="16" y="38" width="420" height="92"/></clipPath><clipPath id="cp1"><rect x="16" y="168" width="420" height="92"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="420" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="420" height="92" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="146" width="420" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="168" width="420" height="92" rx="0"/></clipPath></defs><rect x="0" y="0" width="452" height="276" 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)">Primary with a trailing action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="420" height="92"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4ishc0"><rect x="28" y="20" width="364" height="44" rx="12"/></clipPath><clipPath id="svgimg4cp1"><rect x="362" y="34" width="16" height="16"/></clipPath><clipPath id="svgimg4cp3"><rect x="69" y="28" width="271" height="28"/></clipPath><clipPath id="svgimg4ov4"><rect x="69" y="28" width="271" height="28" rx="0"/></clipPath><clipPath id="svgimg4ct5"><rect x="69" y="33" width="271" height="18"/></clipPath><clipPath id="svgimg4cp6"><rect x="37" y="30" width="24" height="24"/></clipPath></defs><g clip-path="url(#svgimg4ishc0)"><path d="M24 16h372v52H24zm16 5h340a11 11 0 0 1 11 11v20a11 11 0 0 1-11 11H40a11 11 0 0 1-11-11V32a11 11 0 0 1 11-11" fill="rgba(0,0,0,0)" fill-rule="evenodd"/></g><g clip-path="url(#svgimg4cp1)"><g color="rgb(29, 29, 31)"><clipPath id="svgimg4svgic2"><rect x="362" y="34" width="16" height="16"/></clipPath><g clip-path="url(#svgimg4svgic2)"><g transform="translate(362 34)scale(.66667)"><path d="M10 11v6" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M14 11v6" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 6h18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 clip-path="url(#svgimg4cp3)"><g clip-path="url(#svgimg4ov4)"><text x="69" y="48" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(29,29,31)">staging.example.com</text></g></g><g clip-path="url(#svgimg4cp6)"><g color="rgb(29, 29, 31)"><clipPath id="svgimg4svgic7"><rect x="37" y="30" width="24" height="24"/></clipPath><g clip-path="url(#svgimg4svgic7)"><g transform="translate(37 30)"><path d="M12 15v5s3-.6 4-2c1-1.6 0-5 0-5" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1 0-3a2 2 0 0 0-3 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12a22 22 0 0 1 2-4 13 13 0 0 1 11-6c0 2.7-.8 7.5-6 11a22 22 0 0 1-4 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12H4s.5-3 2-4c1.6-1 5 0 5 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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><text x="16" y="158" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Selected primary</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="168" width="420" height="92"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 168)"><defs><clipPath id="svgimg7ishc0"><rect x="28" y="20" width="364" height="44" rx="12"/></clipPath><clipPath id="svgimg7cp1"><rect x="362" y="34" width="16" height="16"/></clipPath><clipPath id="svgimg7cp3"><rect x="69" y="28" width="271" height="28"/></clipPath><clipPath id="svgimg7ov4"><rect x="69" y="28" width="271" height="28" rx="0"/></clipPath><clipPath id="svgimg7ct5"><rect x="69" y="33" width="271" height="18"/></clipPath><clipPath id="svgimg7cp6"><rect x="37" y="30" width="24" height="24"/></clipPath></defs><rect x="28" y="20" width="364" height="44" rx="12" fill="rgb(214,
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 452 276" width="452" height="276"><defs><clipPath id="cp0"><rect x="16" y="38" width="420" height="92"/></clipPath><clipPath id="cp1"><rect x="16" y="168" width="420" height="92"/></clipPath><clipPath id="ct2"><rect x="16" y="16" width="420" height="22"/></clipPath><clipPath id="irc3"><rect x="16" y="38" width="420" height="92" rx="0"/></clipPath><clipPath id="ct5"><rect x="16" y="146" width="420" height="22"/></clipPath><clipPath id="irc6"><rect x="16" y="168" width="420" height="92" rx="0"/></clipPath></defs><rect x="0" y="0" width="452" height="276" 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)">Primary with a trailing action</text><g clip-path="url(#cp0)"><g clip-path="url(#irc3)"><clipPath id="svgimg4vclip"><rect x="16" y="38" width="420" height="92"/></clipPath><g clip-path="url(#svgimg4vclip)"><g transform="translate(16 38)"><defs><clipPath id="svgimg4ishc0"><rect x="28" y="20" width="364" height="44" rx="12"/></clipPath><clipPath id="svgimg4cp1"><rect x="362" y="34" width="16" height="16"/></clipPath><clipPath id="svgimg4cp3"><rect x="69" y="28" width="271" height="28"/></clipPath><clipPath id="svgimg4ov4"><rect x="69" y="28" width="271" height="28" rx="0"/></clipPath><clipPath id="svgimg4ct5"><rect x="69" y="33" width="271" height="18"/></clipPath><clipPath id="svgimg4cp6"><rect x="37" y="30" width="24" height="24"/></clipPath></defs><g clip-path="url(#svgimg4ishc0)"><path d="M24 16h372v52H24zm16 5h340a11 11 0 0 1 11 11v20a11 11 0 0 1-11 11H40a11 11 0 0 1-11-11V32a11 11 0 0 1 11-11" fill="rgba(0,0,0,0)" fill-rule="evenodd"/></g><g clip-path="url(#svgimg4cp1)"><g color="rgb(29, 29, 31)"><clipPath id="svgimg4svgic2"><rect x="362" y="34" width="16" height="16"/></clipPath><g clip-path="url(#svgimg4svgic2)"><g transform="translate(362 34)scale(.66667)"><path d="M10 11v6" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M14 11v6" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M3 6h18" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 clip-path="url(#svgimg4cp3)"><g clip-path="url(#svgimg4ov4)"><text x="69" y="48" font-family="system-ui, "-apple-system", sans-serif" font-size="16" fill="rgb(29,29,31)">staging.example.com</text></g></g><g clip-path="url(#svgimg4cp6)"><g color="rgb(29, 29, 31)"><clipPath id="svgimg4svgic7"><rect x="37" y="30" width="24" height="24"/></clipPath><g clip-path="url(#svgimg4svgic7)"><g transform="translate(37 30)"><path d="M12 15v5s3-.6 4-2c1-1.6 0-5 0-5" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1 0-3a2 2 0 0 0-3 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12a22 22 0 0 1 2-4 13 13 0 0 1 11-6c0 2.7-.8 7.5-6 11a22 22 0 0 1-4 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12H4s.5-3 2-4c1.6-1 5 0 5 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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><text x="16" y="158" font-family="system-ui, "-apple-system", sans-serif" font-size="12" font-weight="600" fill="rgb(110,110,115)">Selected primary</text><g clip-path="url(#cp1)"><g clip-path="url(#irc6)"><clipPath id="svgimg7vclip"><rect x="16" y="168" width="420" height="92"/></clipPath><g clip-path="url(#svgimg7vclip)"><g transform="translate(16 168)"><defs><clipPath id="svgimg7ishc0"><rect x="28" y="20" width="364" height="44" rx="12"/></clipPath><clipPath id="svgimg7cp1"><rect x="362" y="34" width="16" height="16"/></clipPath><clipPath id="svgimg7cp3"><rect x="69" y="28" width="271" height="28"/></clipPath><clipPath id="svgimg7ov4"><rect x="69" y="28" width="271" height="28" rx="0"/></clipPath><clipPath id="svgimg7ct5"><rect x="69" y="33" width="271" height="18"/></clipPath><clipPath id="svgimg7cp6"><rect x="37" y="30" width="24" height="24"/></clipPath></defs><rect x="28" y="20" width="364" height="44" rx="12" fill="rgb(214,233,249)"/><g clip-path="url(#svgimg7ishc0)"><path d="M24 16h372v52H24zm16 5h340a11 11 0 0 1 11 11v20a11 11 0 0 1-11 11H40a11 11 0 0 1-11-11V32a11 11 0 0 1 11-11" fill="rgb(166,207,242)" fill-rule="evenodd"/></g><g clip-path="url(#svgimg7cp1)"><g color="rgb(29, 29, 31)"><clipPath id="svgimg7svgic2"><rect x="362" y="34" width="16" height="16"/></clipPath><g clip-path="url(#svgimg7svgic2)"><g transform="translate(362 34)scale(.66667)"><path d="M21.2 6.8a1 1 0 0 0-4-4L3.8 16.2l-.5.8L2 21.4a.5.5 0 0 0 .6.6L7 20.7l.8-.5Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="m15 5 4 4" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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 clip-path="url(#svgimg7cp3)"><g clip-path="url(#svgimg7ov4)"><text x="69" y="48" font-family="system-ui, "-apple-system", sans-serif" font-size="16" font-weight="650" fill="rgb(29,29,31)">production.example.com</text></g></g><g clip-path="url(#svgimg7cp6)"><g color="rgb(29, 29, 31)"><clipPath id="svgimg7svgic7"><rect x="37" y="30" width="24" height="24"/></clipPath><g clip-path="url(#svgimg7svgic7)"><g transform="translate(37 30)"><path d="M12 15v5s3-.6 4-2c1-1.6 0-5 0-5" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1 0-3a2 2 0 0 0-3 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12a22 22 0 0 1 2-4 13 13 0 0 1 11-6c0 2.7-.8 7.5-6 11a22 22 0 0 1-4 2Z" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" stroke-width="2px" stroke-dasharray="none" stroke-linecap="round" stroke-linejoin="round" stroke-opacity="1" fill-opacity="1" opacity="1"/><path d="M9 12H4s.5-3 2-4c1.6-1 5 0 5 0" style="marker:none;vector-effect:none;color-interpolation:srgb" fill="none" stroke="rgb(29, 29, 31)" 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>
|