@viraui/react 2026.6.0 → 2026.6.1
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/dist/catalog.json +5 -5
- package/dist/components/stack/stack.d.ts +4 -1
- package/dist/components/tabs/tabs.css +1 -1
- package/dist/components/text/text.css +1 -1
- package/dist/components/text/text.d.ts +12 -2
- package/dist/components/text/text.js +2 -1
- package/dist/components/textfield/textfield.d.ts +1 -0
- package/dist/components/title/title.css +1 -1
- package/dist/components/title/title.d.ts +12 -2
- package/dist/components/title/title.js +2 -1
- package/dist/specs/PROTOCOL.md +1 -1
- package/dist/specs/activity-hints.xml +18 -3
- package/dist/specs/components/accordion/patterns.xml +69 -5
- package/dist/specs/components/accordion/props.xml +4 -4
- package/dist/specs/components/accordion/usage.xml +8 -4
- package/dist/specs/components/annotate/patterns.xml +50 -3
- package/dist/specs/components/annotate/props.xml +22 -22
- package/dist/specs/components/annotate/usage.xml +7 -6
- package/dist/specs/components/autocomplete/patterns.xml +123 -7
- package/dist/specs/components/autocomplete/props.xml +14 -14
- package/dist/specs/components/autocomplete/usage.xml +11 -6
- package/dist/specs/components/avatar/patterns.xml +78 -3
- package/dist/specs/components/avatar/props.xml +8 -8
- package/dist/specs/components/avatar/usage.xml +9 -3
- package/dist/specs/components/avatar-group/patterns.xml +65 -3
- package/dist/specs/components/avatar-group/props.xml +8 -8
- package/dist/specs/components/avatar-group/usage.xml +10 -7
- package/dist/specs/components/badge/patterns.xml +57 -3
- package/dist/specs/components/badge/props.xml +8 -8
- package/dist/specs/components/badge/usage.xml +5 -3
- package/dist/specs/components/beam/meta.xml +1 -1
- package/dist/specs/components/beam/patterns.xml +68 -3
- package/dist/specs/components/beam/props.xml +22 -22
- package/dist/specs/components/beam/usage.xml +7 -7
- package/dist/specs/components/bleed/patterns.xml +54 -3
- package/dist/specs/components/bleed/props.xml +2 -2
- package/dist/specs/components/bleed/usage.xml +6 -3
- package/dist/specs/components/breakpoints/meta.xml +1 -1
- package/dist/specs/components/breakpoints/patterns.xml +1 -6
- package/dist/specs/components/breakpoints/props.xml +4 -2
- package/dist/specs/components/breakpoints/usage.xml +10 -2
- package/dist/specs/components/button/patterns.xml +124 -6
- package/dist/specs/components/button/props.xml +33 -32
- package/dist/specs/components/button/usage.xml +13 -13
- package/dist/specs/components/checkbox/patterns.xml +83 -3
- package/dist/specs/components/checkbox/props.xml +10 -10
- package/dist/specs/components/checkbox/usage.xml +11 -6
- package/dist/specs/components/chip/patterns.xml +74 -3
- package/dist/specs/components/chip/props.xml +14 -14
- package/dist/specs/components/chip/usage.xml +10 -6
- package/dist/specs/components/clamp-text/patterns.xml +1 -4
- package/dist/specs/components/clamp-text/props.xml +2 -2
- package/dist/specs/components/clamp-text/usage.xml +8 -5
- package/dist/specs/components/dialog/patterns.xml +136 -15
- package/dist/specs/components/dialog/props.xml +2 -2
- package/dist/specs/components/dialog/usage.xml +9 -7
- package/dist/specs/components/elevator/patterns.xml +54 -3
- package/dist/specs/components/elevator/usage.xml +8 -5
- package/dist/specs/components/fieldset/patterns.xml +97 -3
- package/dist/specs/components/fieldset/usage.xml +7 -5
- package/dist/specs/components/fit-text/patterns.xml +1 -4
- package/dist/specs/components/fit-text/props.xml +2 -2
- package/dist/specs/components/fit-text/usage.xml +8 -6
- package/dist/specs/components/glow/meta.xml +1 -1
- package/dist/specs/components/glow/patterns.xml +74 -3
- package/dist/specs/components/glow/props.xml +16 -16
- package/dist/specs/components/glow/usage.xml +8 -7
- package/dist/specs/components/grid/patterns.xml +88 -5
- package/dist/specs/components/grid/props.xml +23 -23
- package/dist/specs/components/grid/usage.xml +9 -5
- package/dist/specs/components/icon-button/patterns.xml +97 -6
- package/dist/specs/components/icon-button/props.xml +32 -32
- package/dist/specs/components/icon-button/usage.xml +11 -9
- package/dist/specs/components/linear-progress/patterns.xml +58 -3
- package/dist/specs/components/linear-progress/props.xml +6 -6
- package/dist/specs/components/linear-progress/usage.xml +9 -8
- package/dist/specs/components/masonry/patterns.xml +68 -5
- package/dist/specs/components/masonry/props.xml +2 -2
- package/dist/specs/components/masonry/usage.xml +9 -4
- package/dist/specs/components/menu/patterns.xml +179 -15
- package/dist/specs/components/menu/usage.xml +8 -7
- package/dist/specs/components/meter/patterns.xml +49 -3
- package/dist/specs/components/meter/props.xml +6 -6
- package/dist/specs/components/meter/usage.xml +10 -7
- package/dist/specs/components/popover/patterns.xml +118 -9
- package/dist/specs/components/popover/props.xml +2 -2
- package/dist/specs/components/popover/usage.xml +9 -8
- package/dist/specs/components/progressive-blur/meta.xml +1 -1
- package/dist/specs/components/progressive-blur/patterns.xml +1 -4
- package/dist/specs/components/progressive-blur/props.xml +2 -2
- package/dist/specs/components/progressive-blur/usage.xml +7 -6
- package/dist/specs/components/radio/patterns.xml +55 -5
- package/dist/specs/components/radio/props.xml +8 -8
- package/dist/specs/components/radio/usage.xml +9 -6
- package/dist/specs/components/select/patterns.xml +124 -8
- package/dist/specs/components/select/props.xml +18 -18
- package/dist/specs/components/select/usage.xml +11 -10
- package/dist/specs/components/separator/patterns.xml +121 -3
- package/dist/specs/components/separator/props.xml +4 -4
- package/dist/specs/components/separator/usage.xml +8 -5
- package/dist/specs/components/shimmer/patterns.xml +23 -3
- package/dist/specs/components/shimmer/props.xml +8 -8
- package/dist/specs/components/shimmer/usage.xml +7 -5
- package/dist/specs/components/skeleton/patterns.xml +172 -4
- package/dist/specs/components/skeleton/props.xml +14 -14
- package/dist/specs/components/skeleton/usage.xml +11 -7
- package/dist/specs/components/slider/patterns.xml +111 -3
- package/dist/specs/components/slider/props.xml +10 -10
- package/dist/specs/components/slider/usage.xml +11 -5
- package/dist/specs/components/spinner/patterns.xml +35 -3
- package/dist/specs/components/spinner/props.xml +2 -2
- package/dist/specs/components/spinner/usage.xml +8 -5
- package/dist/specs/components/stack/patterns.xml +359 -3
- package/dist/specs/components/stack/props.xml +24 -22
- package/dist/specs/components/stack/usage.xml +16 -10
- package/dist/specs/components/static-noise/meta.xml +1 -1
- package/dist/specs/components/static-noise/patterns.xml +20 -3
- package/dist/specs/components/static-noise/usage.xml +5 -5
- package/dist/specs/components/surface/patterns.xml +188 -3
- package/dist/specs/components/surface/props.xml +26 -26
- package/dist/specs/components/surface/usage.xml +15 -12
- package/dist/specs/components/switch/patterns.xml +73 -3
- package/dist/specs/components/switch/props.xml +12 -12
- package/dist/specs/components/switch/usage.xml +10 -5
- package/dist/specs/components/tabs/patterns.xml +111 -6
- package/dist/specs/components/tabs/props.xml +2 -2
- package/dist/specs/components/tabs/usage.xml +7 -3
- package/dist/specs/components/text/patterns.xml +97 -3
- package/dist/specs/components/text/props.xml +48 -43
- package/dist/specs/components/text/usage.xml +11 -4
- package/dist/specs/components/textarea/patterns.xml +49 -3
- package/dist/specs/components/textarea/props.xml +7 -6
- package/dist/specs/components/textarea/usage.xml +8 -5
- package/dist/specs/components/textfield/patterns.xml +163 -3
- package/dist/specs/components/textfield/props.xml +12 -11
- package/dist/specs/components/textfield/usage.xml +9 -3
- package/dist/specs/components/title/patterns.xml +74 -3
- package/dist/specs/components/title/props.xml +48 -43
- package/dist/specs/components/title/usage.xml +10 -7
- package/dist/specs/components/toast/patterns.xml +85 -8
- package/dist/specs/components/toast/usage.xml +8 -5
- package/dist/specs/components/toggle-button/patterns.xml +101 -3
- package/dist/specs/components/toggle-button/props.xml +16 -16
- package/dist/specs/components/toggle-button/usage.xml +9 -5
- package/dist/specs/components/toggle-group/patterns.xml +34 -5
- package/dist/specs/components/toggle-group/usage.xml +9 -5
- package/dist/specs/components/tooltip/patterns.xml +110 -6
- package/dist/specs/components/tooltip/props.xml +2 -2
- package/dist/specs/components/tooltip/usage.xml +8 -5
- package/dist/specs/components/typewriter/patterns.xml +18 -3
- package/dist/specs/components/typewriter/props.xml +2 -2
- package/dist/specs/components/typewriter/usage.xml +9 -8
- package/dist/specs/foundation/attributes.xml +67 -37
- package/dist/specs/foundation/bootstrap.xml +6 -6
- package/dist/specs/foundation/elevation.xml +51 -3
- package/dist/specs/foundation/modules.xml +117 -40
- package/dist/specs/foundation/theme-topics.xml +62 -27
- package/dist/specs/foundation/toggles.xml +2 -2
- package/dist/specs/index.xml +42 -6
- package/dist/specs/patterns/card-grid.xml +35 -0
- package/dist/specs/patterns/compose-layout-first.xml +32 -0
- package/dist/specs/patterns/equal-width-actions.xml +22 -0
- package/dist/specs/patterns/page-chrome.xml +34 -0
- package/dist/specs/patterns/settings-panel.xml +30 -0
- package/dist/specs/patterns/settings-row.xml +9 -7
- package/dist/specs/patterns/stack-as-surface.xml +37 -0
- package/package.json +2 -2
|
@@ -1,7 +1,101 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<patterns surface="fieldset">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<!-- Sources: preview-grid + Fieldset stories — cleaned (no handlers). Use render={<RadioGroup />} / CheckboxGroup — not invented Fieldset parts. -->
|
|
4
|
+
|
|
5
|
+
<example title="Billing Textfields section">
|
|
6
|
+
<tsx><![CDATA[
|
|
7
|
+
<Surface border="all" radius="m" hPadding="l" vPadding="l">
|
|
8
|
+
<Fieldset label="Billing details">
|
|
9
|
+
<Stack vPadding="m" rowGap="m">
|
|
10
|
+
<Textfield name="company" label="Company" placeholder="Enter company name" />
|
|
11
|
+
<Textfield name="taxId" label="Tax ID" placeholder="Enter fiscal number" />
|
|
12
|
+
</Stack>
|
|
13
|
+
</Fieldset>
|
|
14
|
+
</Surface>
|
|
15
|
+
]]></tsx>
|
|
16
|
+
<notes>From Fieldset stories `Default`. Legend on Fieldset; each Textfield keeps its own label. Stack owns gap.</notes>
|
|
17
|
+
</example>
|
|
18
|
+
|
|
19
|
+
<example title="RadioGroup via render">
|
|
20
|
+
<tsx><![CDATA[
|
|
21
|
+
<Field.Root name="spacing">
|
|
22
|
+
<Fieldset
|
|
23
|
+
label="Spacing preset"
|
|
24
|
+
description="Choose the spacing preset for this workspace."
|
|
25
|
+
render={<RadioGroup<'default' | 'comfortable' | 'compact'> defaultValue="comfortable" />}
|
|
26
|
+
>
|
|
27
|
+
<Radio label="Default" value="default" />
|
|
28
|
+
<Radio label="Comfortable" value="comfortable" />
|
|
29
|
+
<Radio label="Compact" value="compact" />
|
|
30
|
+
</Fieldset>
|
|
31
|
+
</Field.Root>
|
|
32
|
+
]]></tsx>
|
|
33
|
+
<notes>From Fieldset stories `WithRadioGroup`. Merge RadioGroup through `render`; group copy needs `Field.Root` ancestor.</notes>
|
|
34
|
+
</example>
|
|
35
|
+
|
|
36
|
+
<example title="Receiving method radio cards">
|
|
37
|
+
<tsx><![CDATA[
|
|
38
|
+
<Field.Root name="receiving-method">
|
|
39
|
+
<Fieldset label="Receiving Method" render={<RadioGroup defaultValue="bank-transfer" />}>
|
|
40
|
+
<Stack columnGap="m" vAlign="start" direction="row" expandChildren>
|
|
41
|
+
<Surface border="all" radius="s" color={2}>
|
|
42
|
+
<Radio
|
|
43
|
+
description="SWIFT / IBAN"
|
|
44
|
+
id="receiving-method-bank-transfer"
|
|
45
|
+
label="Bank Transfer"
|
|
46
|
+
value="bank-transfer"
|
|
47
|
+
hPadding="m"
|
|
48
|
+
vPadding="m"
|
|
49
|
+
/>
|
|
50
|
+
</Surface>
|
|
51
|
+
<Surface border="all" radius="s">
|
|
52
|
+
<Radio
|
|
53
|
+
description="Instant Payout"
|
|
54
|
+
id="receiving-method-paypal"
|
|
55
|
+
label="PayPal"
|
|
56
|
+
value="paypal"
|
|
57
|
+
hPadding="m"
|
|
58
|
+
vPadding="m"
|
|
59
|
+
/>
|
|
60
|
+
</Surface>
|
|
61
|
+
</Stack>
|
|
62
|
+
</Fieldset>
|
|
63
|
+
</Field.Root>
|
|
64
|
+
]]></tsx>
|
|
65
|
+
<notes>From preview-grid `payout-preferences`. Card chrome is Surface; Fieldset only owns legend + RadioGroup merge.</notes>
|
|
66
|
+
</example>
|
|
67
|
+
|
|
68
|
+
<example title="Disabled Mode Fieldset">
|
|
69
|
+
<tsx><![CDATA[
|
|
70
|
+
<Field.Root disabled name="mode">
|
|
71
|
+
<Fieldset disabled label="Mode" render={<RadioGroup disabled defaultValue="manual" />}>
|
|
72
|
+
<Radio label="Auto" value="auto" />
|
|
73
|
+
<Radio label="Manual" value="manual" />
|
|
74
|
+
</Fieldset>
|
|
75
|
+
</Field.Root>
|
|
76
|
+
]]></tsx>
|
|
77
|
+
<notes>From preview-grid `disabled-surface-contrast`. Disabled Fieldset + RadioGroup together under disabled `Field.Root`.</notes>
|
|
78
|
+
</example>
|
|
79
|
+
|
|
80
|
+
<example title="Plan cards with group error">
|
|
81
|
+
<tsx><![CDATA[
|
|
82
|
+
<Field.Root dirty invalid name="plan">
|
|
83
|
+
<Fieldset
|
|
84
|
+
label="Plan"
|
|
85
|
+
error="Select a plan to continue."
|
|
86
|
+
render={<RadioGroup />}
|
|
87
|
+
>
|
|
88
|
+
<Stack expandChildren rowGap="s">
|
|
89
|
+
<Surface border="all" radius="m">
|
|
90
|
+
<Radio description="For getting started." hPadding="m" id="plan-free" label="Free" value="free" vPadding="m" />
|
|
91
|
+
</Surface>
|
|
92
|
+
<Surface border="all" radius="m">
|
|
93
|
+
<Radio description="For growing teams." hPadding="m" id="plan-pro" label="Pro" value="pro" vPadding="m" />
|
|
94
|
+
</Surface>
|
|
95
|
+
</Stack>
|
|
96
|
+
</Fieldset>
|
|
97
|
+
</Field.Root>
|
|
98
|
+
]]></tsx>
|
|
99
|
+
<notes>From Fieldset stories `WithRadioCardLayout`. Group `error` requires `Field.Root`; strip controlled selection handlers from the hint.</notes>
|
|
6
100
|
</example>
|
|
7
101
|
</patterns>
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<usage surface="fieldset">
|
|
3
|
-
<do>Section legends for multiple related fields — billing
|
|
3
|
+
<do>Section legends for multiple related fields — billing/shipping with Textfield, Textarea, or Select children; Stack owns gap inside</do>
|
|
4
|
+
<do>Login/signup (or similar) tab panels: optional Fieldset around related Textfields + Button inside Tabs — Stack/Surface layout only; 0 custom CSS</do>
|
|
4
5
|
<do>Choice groups that need a shared legend, group description, or group error — Field.Root > Fieldset render={<RadioGroup<Value> />} or render={<CheckboxGroup />}</do>
|
|
5
|
-
<do>
|
|
6
|
-
<do>
|
|
7
|
-
<
|
|
8
|
-
<dont>Wrapping Fieldset.Root in Stack render — breaks Base UI render merge with RadioGroup or CheckboxGroup</dont>
|
|
6
|
+
<do>Type-safe radio unions via RadioGroup<'ssd' | 'hdd'> merged through Fieldset `render`</do>
|
|
7
|
+
<do>Shared legend plus optional group description/error — border/section chrome belongs on Surface (or Stack `render={<Surface />}`), not Fieldset</do>
|
|
8
|
+
<dont>Wrapping a lone Textfield, Textarea, Select, Radio, or Checkbox in Fieldset when its own label is enough</dont>
|
|
9
9
|
<dont>Expecting description or error on Fieldset without a Field.Root ancestor</dont>
|
|
10
|
+
<dont>Wrapping Fieldset.Root in Stack `render` — breaks Base UI render merge with RadioGroup or CheckboxGroup</dont>
|
|
11
|
+
<dont>Putting group legend, description, or validation on RadioGroup or CheckboxGroup props — those belong on Fieldset (with Field.Root when validating)</dont>
|
|
10
12
|
<dont>Omitting RadioGroup<Value> generics when option values are a restricted union</dont>
|
|
11
13
|
</usage>
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<patterns surface="fit-text">
|
|
3
|
-
|
|
4
|
-
<tsx><![CDATA[<FitText>…</FitText>]]></tsx>
|
|
5
|
-
<notes>Public assembly hint from legacy guide; not API authority.</notes>
|
|
6
|
-
</example>
|
|
3
|
+
<!-- Skip: zero viraui-app and design-kitchen usage. Package stories cover Title/Text children + maxFontSize; no consumer extract to promote. -->
|
|
7
4
|
</patterns>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<prop name="maxFontSize" kind="react">
|
|
14
14
|
<description>Caps the fitted font size using any valid CSS length string.</description>
|
|
15
15
|
</prop>
|
|
16
|
-
<
|
|
16
|
+
<prop name="max-font-size" kind="css">
|
|
17
17
|
<description>Upper bound for the fitted font size on the display slot.</description>
|
|
18
|
-
</
|
|
18
|
+
</prop>
|
|
19
19
|
</props>
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<usage surface="fit-text">
|
|
3
|
-
<do>
|
|
4
|
-
<do>Multi-line display
|
|
5
|
-
<do>
|
|
6
|
-
<
|
|
7
|
-
<dont>
|
|
8
|
-
<dont>
|
|
3
|
+
<do>Short headlines that fill a constrained inline width — wrap Title (or Text) as children inside a width-owned Surface / Stack</do>
|
|
4
|
+
<do>Multi-line display: put `<br />` (or block structure) inside Title/Text children — FitText does not invent line breaks</do>
|
|
5
|
+
<do>Cap growth with `maxFontSize` CSS length when the fitted size must not exceed a bound</do>
|
|
6
|
+
<do>Pick FitText to scale; ClampText to truncate with ellipsis; Title alone when size preset is enough without width-fit</do>
|
|
7
|
+
<dont>Using FitText for truncation or ellipsis — use ClampText</dont>
|
|
8
|
+
<dont>Expecting automatic wrapping without `br` or block children</dont>
|
|
9
|
+
<dont>Putting interactive controls inside FitText — children render twice; reference tree is `aria-hidden` + `inert`</dont>
|
|
10
|
+
<dont>Long body copy that should reflow at a fixed type size — use Text</dont>
|
|
9
11
|
</usage>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<meta id="glow" title="Glow" category="effect" shared_contract="glow">
|
|
3
|
-
<summary>Decorative pointer-driven border highlight on a transparent Surface shell (radius only). Put the visual card as children; a shared rAF tracker paints CSS variables without React re-renders. Memory-heavy — use sparingly
|
|
3
|
+
<summary>Decorative pointer-driven border highlight on a transparent Surface shell (radius only). Put the visual card as children; a shared rAF tracker paints CSS variables without React re-renders. Memory/CPU-heavy — use sparingly; prefer one focal instance per view.</summary>
|
|
4
4
|
<exports>
|
|
5
5
|
<export name="Glow" />
|
|
6
6
|
</exports>
|
|
@@ -1,7 +1,78 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<patterns surface="glow">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<!-- Sources: viraui-app/components — cleaned (no portal props, no menu handlers). -->
|
|
4
|
+
|
|
5
|
+
<example title="Pointer glow report row">
|
|
6
|
+
<tsx><![CDATA[
|
|
7
|
+
<Glow radius="full" borderOffset={0} borderWidth={1} proximity={10}>
|
|
8
|
+
<Surface overflow="hidden" color={2} hPadding="m" radius="full" vPadding="m">
|
|
9
|
+
<Stack columnGap="m" direction="row" hAlign="space-between" vAlign="center">
|
|
10
|
+
<Stack rowGap="s">
|
|
11
|
+
<Text weight="semibold">Q2 payout report</Text>
|
|
12
|
+
<Text size="s" tone="muted">
|
|
13
|
+
PDF · Updated 2 hours ago · 14 pages
|
|
14
|
+
</Text>
|
|
15
|
+
</Stack>
|
|
16
|
+
|
|
17
|
+
<Menu>
|
|
18
|
+
<Menu.Trigger
|
|
19
|
+
render={
|
|
20
|
+
<IconButton
|
|
21
|
+
aria-label="More actions for Q2 payout report"
|
|
22
|
+
icon={<DotsVertical size={16} />}
|
|
23
|
+
pill
|
|
24
|
+
size="s"
|
|
25
|
+
variant="flat"
|
|
26
|
+
/>
|
|
27
|
+
}
|
|
28
|
+
/>
|
|
29
|
+
<Menu.Popup align="end" side="bottom">
|
|
30
|
+
<Menu.Item>Rename</Menu.Item>
|
|
31
|
+
<Menu.Item>Duplicate</Menu.Item>
|
|
32
|
+
<Menu.Item>Archive</Menu.Item>
|
|
33
|
+
<Menu.Separator />
|
|
34
|
+
<Menu.Item sentiment="destructive">Delete</Menu.Item>
|
|
35
|
+
</Menu.Popup>
|
|
36
|
+
</Menu>
|
|
37
|
+
</Stack>
|
|
38
|
+
</Surface>
|
|
39
|
+
</Glow>
|
|
40
|
+
]]></tsx>
|
|
41
|
+
<notes>From `editor/preview-grid/blocks/menu-more` ReportRow. Glow wraps the pill Surface; pointer-driven border only. Drop preview portal props. Compose Surface as children — Glow is decoration.</notes>
|
|
42
|
+
</example>
|
|
43
|
+
|
|
44
|
+
<example title="Report list with glow rows">
|
|
45
|
+
<tsx><![CDATA[
|
|
46
|
+
<Surface overflow="hidden" border="all" color={1} radius="l">
|
|
47
|
+
<Stack rowGap="m" hPadding="m" vPadding="m">
|
|
48
|
+
<Stack rowGap="xs">
|
|
49
|
+
<Title size="6" render={<h2 />}>
|
|
50
|
+
Recent reports
|
|
51
|
+
</Title>
|
|
52
|
+
<Text size="s" tone="muted">
|
|
53
|
+
IconButton more-menu on each export row — rename, archive, or delete.
|
|
54
|
+
</Text>
|
|
55
|
+
</Stack>
|
|
56
|
+
|
|
57
|
+
<Stack rowGap="s">
|
|
58
|
+
<Glow radius="full" borderOffset={0} borderWidth={1} proximity={10}>
|
|
59
|
+
<Surface overflow="hidden" color={2} hPadding="m" radius="full" vPadding="m">
|
|
60
|
+
<Stack columnGap="m" direction="row" hAlign="space-between" vAlign="center">
|
|
61
|
+
<Stack rowGap="s">
|
|
62
|
+
<Text weight="semibold">SEPA batch export</Text>
|
|
63
|
+
<Text size="s" tone="muted">
|
|
64
|
+
CSV · Generated yesterday · 1,284 rows
|
|
65
|
+
</Text>
|
|
66
|
+
</Stack>
|
|
67
|
+
{/* trailing IconButton menu */}
|
|
68
|
+
</Stack>
|
|
69
|
+
</Surface>
|
|
70
|
+
</Glow>
|
|
71
|
+
{/* more Glow rows */}
|
|
72
|
+
</Stack>
|
|
73
|
+
</Stack>
|
|
74
|
+
</Surface>
|
|
75
|
+
]]></tsx>
|
|
76
|
+
<notes>From `editor/preview-grid/blocks/menu-more` list shell. Stack of Glow-wrapped rows inside a card Surface. Reserve Glow for rare focal lists — do not default-decorate every card.</notes>
|
|
6
77
|
</example>
|
|
7
78
|
</patterns>
|
|
@@ -47,28 +47,28 @@
|
|
|
47
47
|
<prop name="angleLag" kind="react">
|
|
48
48
|
<description>CSS transition duration in milliseconds for the pointer-driven starting angle. Soft follow by default; set 0 for instant snap.</description>
|
|
49
49
|
</prop>
|
|
50
|
-
<
|
|
50
|
+
<prop name="starting-angle" kind="css">
|
|
51
51
|
<description>Conic gradient start angle in degrees (unitless number). Pointer tracker writes a continuous unwrapped value.</description>
|
|
52
|
-
</
|
|
53
|
-
<
|
|
52
|
+
</prop>
|
|
53
|
+
<prop name="angle-lag" kind="css">
|
|
54
54
|
<description>Transition duration for `--vui-glow-starting-angle`.</description>
|
|
55
|
-
</
|
|
56
|
-
<
|
|
55
|
+
</prop>
|
|
56
|
+
<prop name="active-opacity" kind="css">
|
|
57
57
|
<description>Current glow opacity from proximity tracking. Written by the shared tracker.</description>
|
|
58
|
-
</
|
|
59
|
-
<
|
|
58
|
+
</prop>
|
|
59
|
+
<prop name="spread" kind="css">
|
|
60
60
|
<description>Angular width of the highlighted arc.</description>
|
|
61
|
-
</
|
|
62
|
-
<
|
|
61
|
+
</prop>
|
|
62
|
+
<prop name="border-width" kind="css">
|
|
63
63
|
<description>Masked glow border ring width.</description>
|
|
64
|
-
</
|
|
65
|
-
<
|
|
64
|
+
</prop>
|
|
65
|
+
<prop name="border-color" kind="css">
|
|
66
66
|
<description>Masked border ring color under the highlight.</description>
|
|
67
|
-
</
|
|
68
|
-
<
|
|
67
|
+
</prop>
|
|
68
|
+
<prop name="border-offset" kind="css">
|
|
69
69
|
<description>Glow ring offset from the surface edge.</description>
|
|
70
|
-
</
|
|
71
|
-
<
|
|
70
|
+
</prop>
|
|
71
|
+
<prop name="color" kind="css">
|
|
72
72
|
<description>Glow fill (solid color or gradient).</description>
|
|
73
|
-
</
|
|
73
|
+
</prop>
|
|
74
74
|
</props>
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<usage surface="glow">
|
|
3
|
-
<do>Wrap a Surface (
|
|
4
|
-
<do>
|
|
5
|
-
<do>
|
|
6
|
-
<
|
|
7
|
-
<
|
|
8
|
-
<dont>
|
|
3
|
+
<do>Wrap a Surface (and nested Stack content) that should highlight toward the pointer — Glow is a transparent Surface shell (`radius` only)</do>
|
|
4
|
+
<do>Compose list/report rows: Glow around a pill Surface with Stack row + Text + Menu/IconButton trailing actions</do>
|
|
5
|
+
<do>Use `radius="auto"` when Glow sits inside a padded ancestor Surface so corners stay concentric</do>
|
|
6
|
+
<do>Share one pointer path across a small Grid/Stack of glow shells via `globalHighlight` — still keep the set focal, not every card</do>
|
|
7
|
+
<do>Use sparingly — pointer tracking is memory/CPU-heavy; prefer one focal highlight (or a small shared-tracker grid) per view</do>
|
|
8
|
+
<dont>Treating Glow as the visual card — nest Surface/Stack for color, padding, and content</dont>
|
|
9
|
+
<dont>Relying on Glow for keyboard focus or status — decorative only</dont>
|
|
10
|
+
<dont>Setting `overflow="hidden"` on an ancestor Surface when an outer ring (`borderOffset` negative) must remain visible</dont>
|
|
9
11
|
<dont>Expecting soft bloom Light layer — Glow is border-ring only</dont>
|
|
10
|
-
<dont>Using many Glow instances on one page — memory- and CPU-heavy</dont>
|
|
11
12
|
<dont>Expecting continuous spin — use Beam instead</dont>
|
|
12
13
|
</usage>
|
|
@@ -1,9 +1,92 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<patterns surface="grid">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
<!-- Sources: viraui-app/components — cleaned (no handlers, no i18n, no app-only chrome). -->
|
|
4
|
+
|
|
5
|
+
<example title="Fixed-breadth preview wall">
|
|
6
|
+
<tsx><![CDATA[
|
|
7
|
+
<Grid
|
|
8
|
+
columns={6}
|
|
9
|
+
colMinWidth="min(calc(var(--space-m) * 23), 28rem)"
|
|
10
|
+
columnGap="xl"
|
|
11
|
+
rowGap="xl"
|
|
12
|
+
aria-label="Component examples"
|
|
13
|
+
>
|
|
14
|
+
<Grid.Item>
|
|
15
|
+
<Stack rowGap="xl">{/* column A cards */}</Stack>
|
|
16
|
+
</Grid.Item>
|
|
17
|
+
<Grid.Item>
|
|
18
|
+
<Stack rowGap="xl">{/* column B cards */}</Stack>
|
|
19
|
+
</Grid.Item>
|
|
20
|
+
<Grid.Item column="span 2">
|
|
21
|
+
<Grid columns={2} rowGap="xl" columnGap="xl">
|
|
22
|
+
<Grid.Item>
|
|
23
|
+
<Stack rowGap="xl">{/* nested column */}</Stack>
|
|
24
|
+
</Grid.Item>
|
|
25
|
+
<Grid.Item>
|
|
26
|
+
<Stack rowGap="xl">{/* nested column */}</Stack>
|
|
27
|
+
</Grid.Item>
|
|
28
|
+
<Grid.Item column="span 2">{/* full-width nested block */}</Grid.Item>
|
|
29
|
+
</Grid>
|
|
30
|
+
</Grid.Item>
|
|
31
|
+
</Grid>
|
|
32
|
+
]]></tsx>
|
|
33
|
+
<notes>From `editor/preview-grid/preview-grid`. `columns` + explicit `colMinWidth` → fixed-breadth tracks that scroll in overflow parents. Nest Grids; use `column="span N"` for spans — not custom `grid-column` CSS.</notes>
|
|
34
|
+
</example>
|
|
35
|
+
|
|
36
|
+
<example title="Icon toolbar matrix">
|
|
37
|
+
<tsx><![CDATA[
|
|
38
|
+
<Surface border="all" color={1} radius="l" hPadding="m" vPadding="m">
|
|
39
|
+
<Grid columns={7} rows={6} columnGap="m" rowGap="m">
|
|
40
|
+
<Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
|
|
41
|
+
<IconButton aria-label="Home" icon={<House size={22} aria-hidden />} variant="flat" />
|
|
42
|
+
</Grid.Item>
|
|
43
|
+
<Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
|
|
44
|
+
<IconButton aria-label="Search" icon={<Magnifier size={22} aria-hidden />} variant="flat" />
|
|
45
|
+
</Grid.Item>
|
|
46
|
+
<Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
|
|
47
|
+
<IconButton aria-label="Settings" icon={<Gear size={22} aria-hidden />} variant="flat" />
|
|
48
|
+
</Grid.Item>
|
|
49
|
+
{/* more IconButtons… */}
|
|
50
|
+
</Grid>
|
|
51
|
+
<Stack hAlign="center" vPadding={['l', 's']} expandChildren>
|
|
52
|
+
<Chip variant="blue">+3000 more icons</Chip>
|
|
53
|
+
</Stack>
|
|
54
|
+
</Surface>
|
|
55
|
+
]]></tsx>
|
|
56
|
+
<notes>From `editor/preview-grid/blocks/action-toolbar`. Fixed `columns`/`rows` matrix; `Grid.Item render={<Stack …/>}` centers each glyph. Drop Tooltip handle plumbing from the hint.</notes>
|
|
57
|
+
</example>
|
|
58
|
+
|
|
59
|
+
<example title="Decorative 3-column backdrop">
|
|
60
|
+
<tsx><![CDATA[
|
|
61
|
+
<Grid aria-hidden columnGap="m" vPadding="xl" columns={3} rowGap="m">
|
|
62
|
+
<Grid.Item>
|
|
63
|
+
<Elevator resting={1}>
|
|
64
|
+
<Surface border="all" overflow="hidden" radius="l">
|
|
65
|
+
<Stack hPadding="m" rowGap="s" vPadding="m">
|
|
66
|
+
<Skeleton animate={false} aria-hidden height="8rem" radius="m" width="100%" />
|
|
67
|
+
<Skeleton animate={false} aria-hidden height="1rem" radius="full" width="70%" />
|
|
68
|
+
</Stack>
|
|
69
|
+
</Surface>
|
|
70
|
+
</Elevator>
|
|
71
|
+
</Grid.Item>
|
|
72
|
+
<Grid.Item>{/* tile */}</Grid.Item>
|
|
73
|
+
<Grid.Item>{/* tile */}</Grid.Item>
|
|
74
|
+
{/* repeat to fill 3×3 */}
|
|
75
|
+
</Grid>
|
|
76
|
+
]]></tsx>
|
|
77
|
+
<notes>From `prompts/prompts-info-state` backdrop. Bare `columns={3}` uses fluid `1fr` tracks. Absolute positioning of the wall stays in shell CSS — Grid owns tracks/gaps only.</notes>
|
|
78
|
+
</example>
|
|
79
|
+
|
|
80
|
+
<example title="Full-width item span">
|
|
81
|
+
<tsx><![CDATA[
|
|
82
|
+
<Grid columns={2} columnGap="xl" rowGap="xl">
|
|
83
|
+
<Grid.Item>{/* card */}</Grid.Item>
|
|
84
|
+
<Grid.Item>{/* card */}</Grid.Item>
|
|
85
|
+
<Grid.Item fullWidth>{/* banner spanning both tracks */}</Grid.Item>
|
|
86
|
+
<Grid.Item>{/* card */}</Grid.Item>
|
|
87
|
+
<Grid.Item>{/* card */}</Grid.Item>
|
|
88
|
+
</Grid>
|
|
89
|
+
]]></tsx>
|
|
90
|
+
<notes>Prefer `Grid.Item fullWidth` (or `column="span 2"`) over inventing `width: 100%` / `grid-column` CSS on children. Mirrors nested span usage in preview-grid.</notes>
|
|
8
91
|
</example>
|
|
9
92
|
</patterns>
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<description>Spans the item across every row track (`grid-row: 1 / -1`). Wins over `row` when both are set.</description>
|
|
34
34
|
</prop>
|
|
35
35
|
<prop name="Item.fullWidth" kind="react">
|
|
36
|
-
<description>Spans the item across every column track (`grid-column: 1 / -1`). Wins over `column` when both are set.</description>
|
|
36
|
+
<description>Spans the item across every column track (`grid-column: 1 / -1`). Wins over `column` when both are set. Prefer this over inventing `width: 100%` / `grid-column` CSS on the item.</description>
|
|
37
37
|
</prop>
|
|
38
38
|
<prop name="Item.ref" kind="react">
|
|
39
39
|
<description>Ref forwarded to the rendered item root element.</description>
|
|
@@ -65,37 +65,37 @@
|
|
|
65
65
|
<prop name="vPadding" kind="react">
|
|
66
66
|
<description>Sets block padding using one token for both sides or a `[start, end]` tuple.</description>
|
|
67
67
|
</prop>
|
|
68
|
-
<
|
|
68
|
+
<prop name="column-gap" kind="css">
|
|
69
69
|
<description>Grid column gap on the root.</description>
|
|
70
|
-
</
|
|
71
|
-
<
|
|
70
|
+
</prop>
|
|
71
|
+
<prop name="column-min-w" kind="css">
|
|
72
72
|
<description>Minimum column track width for auto-fill/auto-fit track sizing, and the fixed track breadth when `columns` is set with an explicit `colMinWidth`.</description>
|
|
73
|
-
</
|
|
74
|
-
<
|
|
73
|
+
</prop>
|
|
74
|
+
<prop name="column-size" kind="css">
|
|
75
75
|
<description>Resolved column track size (`minmax` formula) used by auto-fill/fit.</description>
|
|
76
|
-
</
|
|
77
|
-
<
|
|
76
|
+
</prop>
|
|
77
|
+
<prop name="columns" kind="css">
|
|
78
78
|
<description>Fixed column track count when `columns` is set and filling is inactive; bare `columns` sizes tracks as `minmax(0, 1fr)`; with explicit `colMinWidth`, tracks use `var(--vui-grid-column-min-w)` under `data-grid-fixed-breadth`.</description>
|
|
79
|
-
</
|
|
80
|
-
<
|
|
79
|
+
</prop>
|
|
80
|
+
<prop name="padding-block-end" kind="css">
|
|
81
81
|
<description>Block-end padding when padding is enabled.</description>
|
|
82
|
-
</
|
|
83
|
-
<
|
|
82
|
+
</prop>
|
|
83
|
+
<prop name="padding-block-start" kind="css">
|
|
84
84
|
<description>Block-start padding when padding is enabled.</description>
|
|
85
|
-
</
|
|
86
|
-
<
|
|
85
|
+
</prop>
|
|
86
|
+
<prop name="padding-inline-end" kind="css">
|
|
87
87
|
<description>Inline-end padding when padding is enabled.</description>
|
|
88
|
-
</
|
|
89
|
-
<
|
|
88
|
+
</prop>
|
|
89
|
+
<prop name="padding-inline-start" kind="css">
|
|
90
90
|
<description>Inline-start padding when padding is enabled.</description>
|
|
91
|
-
</
|
|
92
|
-
<
|
|
91
|
+
</prop>
|
|
92
|
+
<prop name="row-gap" kind="css">
|
|
93
93
|
<description>Grid row gap on the root.</description>
|
|
94
|
-
</
|
|
95
|
-
<
|
|
94
|
+
</prop>
|
|
95
|
+
<prop name="row-min-h" kind="css">
|
|
96
96
|
<description>Minimum row track size when fixed rows are enabled.</description>
|
|
97
|
-
</
|
|
98
|
-
<
|
|
97
|
+
</prop>
|
|
98
|
+
<prop name="rows" kind="css">
|
|
99
99
|
<description>Fixed row track count when `rows` is set.</description>
|
|
100
|
-
</
|
|
100
|
+
</prop>
|
|
101
101
|
</props>
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<usage surface="grid">
|
|
3
|
-
<do>Responsive card or tile walls that need true CSS Grid tracks (auto-fill/fit or fixed columns)</do>
|
|
4
|
-
<do>
|
|
5
|
-
<do>
|
|
3
|
+
<do>Responsive card or tile walls that need true CSS Grid tracks (auto-fill/fit or fixed columns) — prefer over inventing `grid-template` CSS</do>
|
|
4
|
+
<do>Compose tiles as Elevator → Surface → Stack (title/body/actions) inside `Grid.Item` — Grid owns tracks/gaps; Stack owns card internals</do>
|
|
5
|
+
<do>Fixed-count columns with explicit `colMinWidth` so a parent with `overflow: auto` can scroll</do>
|
|
6
|
+
<do>Span tracks with `Item.fullWidth` / `Item.fullHeight` — not inventing `grid-column` / `width: 100%` CSS on items</do>
|
|
7
|
+
<do>Center cell content via `Grid.Item render={<Stack hAlign="center" vAlign="center" />}` (e.g. IconButton toolbars) — one node, no cell CSS</do>
|
|
6
8
|
<do>Token-spaced grids with optional axis padding without custom grid CSS</do>
|
|
7
9
|
<dont>Using Masonry when you need explicit row/column placement or full-width/full-height spans</dont>
|
|
8
|
-
<dont>Re-declaring grid-template and gap in app CSS when Grid can own the layout</dont>
|
|
9
|
-
<dont>
|
|
10
|
+
<dont>Re-declaring `grid-template` and `gap` in app CSS when Grid can own the layout</dont>
|
|
11
|
+
<dont>Inventing CSS `gap` / `padding` on this root when public spacing props cover it</dont>
|
|
12
|
+
<dont>Setting both `fullWidth` and `column` (or `fullHeight` and `row`) and expecting the explicit placement to win — full-* data attrs override</dont>
|
|
13
|
+
<dont>Using Grid for simple one-axis flex spacing — prefer Stack</dont>
|
|
10
14
|
</usage>
|
|
@@ -1,11 +1,102 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
<patterns surface="icon-button">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<!-- Sources: viraui-app/components — cleaned (no handlers, no app-only chrome, no CSS that reinvents Stack props). -->
|
|
4
|
+
|
|
5
|
+
<example title="Canvas zoom cluster">
|
|
6
|
+
<tsx><![CDATA[
|
|
7
|
+
<Surface color={1} border="all" radius="m" vPadding="2xs" hPadding="2xs">
|
|
8
|
+
<Stack direction="row" vAlign="center">
|
|
9
|
+
<IconButton aria-label="Zoom out" icon={<Minus />} variant="flat" />
|
|
10
|
+
<IconButton aria-label="Reset zoom" icon={<FocusCenter />} variant="flat" />
|
|
11
|
+
<IconButton aria-label="Zoom in" icon={<Plus />} variant="flat" />
|
|
12
|
+
</Stack>
|
|
13
|
+
</Surface>
|
|
14
|
+
]]></tsx>
|
|
15
|
+
<notes>From `editor/canvas/canvas-zoom`. Dense flat IconButton row inside Surface. Absolute overlay position is shell CSS — Stack owns the row. Always set `aria-label`.</notes>
|
|
6
16
|
</example>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
<
|
|
17
|
+
|
|
18
|
+
<example title="Toolbar grid (flat)">
|
|
19
|
+
<tsx><![CDATA[
|
|
20
|
+
<Surface border="all" color={1} radius="l" hPadding="m" vPadding="m">
|
|
21
|
+
<Grid columns={7} rows={2} columnGap="m" rowGap="m">
|
|
22
|
+
<Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
|
|
23
|
+
<IconButton aria-label="Bold" icon={<TextBold />} variant="flat" />
|
|
24
|
+
</Grid.Item>
|
|
25
|
+
<Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
|
|
26
|
+
<IconButton aria-label="Italic" icon={<TextItalic />} variant="flat" />
|
|
27
|
+
</Grid.Item>
|
|
28
|
+
{/* more tools… */}
|
|
29
|
+
</Grid>
|
|
30
|
+
</Surface>
|
|
31
|
+
]]></tsx>
|
|
32
|
+
<notes>From `editor/preview-grid/blocks/action-toolbar`. Flat IconButton per cell; Tooltip.Trigger may wrap the control in the app — omit kitchen portal chrome here.</notes>
|
|
33
|
+
</example>
|
|
34
|
+
|
|
35
|
+
<example title="Textfield endAddon copy">
|
|
36
|
+
<tsx><![CDATA[
|
|
37
|
+
<Textfield
|
|
38
|
+
aria-label="Invite link"
|
|
39
|
+
value="https://app.example.com/invite/abc"
|
|
40
|
+
endAddon={
|
|
41
|
+
<IconButton aria-label="Copy invite link" icon={<ArrowUpRight />} size="s" variant="secondary" />
|
|
42
|
+
}
|
|
43
|
+
/>
|
|
44
|
+
]]></tsx>
|
|
45
|
+
<notes>From `editor/preview-grid/blocks/invite-team`. Compact secondary IconButton as field `endAddon`.</notes>
|
|
46
|
+
</example>
|
|
47
|
+
|
|
48
|
+
<example title="Menu trigger (pill)">
|
|
49
|
+
<tsx><![CDATA[
|
|
50
|
+
<Menu>
|
|
51
|
+
<Menu.Trigger
|
|
52
|
+
render={
|
|
53
|
+
<IconButton
|
|
54
|
+
aria-label="More actions"
|
|
55
|
+
icon={<DotsVertical />}
|
|
56
|
+
pill
|
|
57
|
+
size="s"
|
|
58
|
+
variant="flat"
|
|
59
|
+
/>
|
|
60
|
+
}
|
|
61
|
+
/>
|
|
62
|
+
<Menu.Popup align="end" side="bottom">
|
|
63
|
+
<Menu.Item>Rename</Menu.Item>
|
|
64
|
+
<Menu.Item>Duplicate</Menu.Item>
|
|
65
|
+
<Menu.Separator />
|
|
66
|
+
<Menu.Item sentiment="destructive">Delete</Menu.Item>
|
|
67
|
+
</Menu.Popup>
|
|
68
|
+
</Menu>
|
|
69
|
+
]]></tsx>
|
|
70
|
+
<notes>From `editor/preview-grid/blocks/menu-more`. Pill flat IconButton as `Menu.Trigger` via `render`.</notes>
|
|
71
|
+
</example>
|
|
72
|
+
|
|
73
|
+
<example title="Card close (secondary)">
|
|
74
|
+
<tsx><![CDATA[
|
|
75
|
+
<Stack columnGap="s" direction="row" hAlign="space-between" vAlign="start">
|
|
76
|
+
<Stack rowGap="xs">
|
|
77
|
+
<Title size="6" render={<h2 />}>
|
|
78
|
+
Preferences
|
|
79
|
+
</Title>
|
|
80
|
+
<Text size="s" maxWidth="18rem" tone="muted">
|
|
81
|
+
Manage your account settings and notifications.
|
|
82
|
+
</Text>
|
|
83
|
+
</Stack>
|
|
84
|
+
<IconButton aria-label="Close preferences card" icon={<Xmark />} size="s" variant="secondary" />
|
|
85
|
+
</Stack>
|
|
86
|
+
]]></tsx>
|
|
87
|
+
<notes>From `editor/preview-grid/blocks/preferences` (+ payout-preferences same close pattern). Header trailing chrome.</notes>
|
|
88
|
+
</example>
|
|
89
|
+
|
|
90
|
+
<example title="Dialog step adjusters">
|
|
91
|
+
<tsx><![CDATA[
|
|
92
|
+
<Stack direction="row" vAlign="center" columnGap="m" hAlign="center">
|
|
93
|
+
<IconButton aria-label="Decrease goal" icon={<Minus />} size="l" variant="secondary" />
|
|
94
|
+
<Title size="1" render={<span />}>
|
|
95
|
+
8,000
|
|
96
|
+
</Title>
|
|
97
|
+
<IconButton aria-label="Increase goal" icon={<Plus />} size="l" variant="secondary" />
|
|
98
|
+
</Stack>
|
|
99
|
+
]]></tsx>
|
|
100
|
+
<notes>From `editor/preview-grid/blocks/daily-activity-goal` dialog. Large secondary IconButtons flanking a value.</notes>
|
|
10
101
|
</example>
|
|
11
102
|
</patterns>
|