@sableui/react 0.9.1 → 0.11.0
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/AGENTS.md +1 -1
- package/CHANGELOG.md +109 -0
- package/CONTRIBUTING.md +2 -2
- package/DESIGN.md +55 -16
- package/README.md +12 -0
- package/dist/{_contract-C2M1SjBf.d.ts → _contract-CkqXDVww.d.ts} +25 -2
- package/dist/blocks/danger-zone-block.js +3 -3
- package/dist/blocks/danger-zone-block.meta.js +1 -1
- package/dist/blocks/faq-block.js +3 -3
- package/dist/blocks/goal-progress-block.js +1 -1
- package/dist/blocks/notification-list-block.js +1 -1
- package/dist/blocks/pricing-table-block.js +12 -12
- package/dist/blocks/product-card-block.js +3 -3
- package/dist/blocks/product-card-block.meta.js +3 -3
- package/dist/blocks/profile-card-block.js +1 -1
- package/dist/blocks/profile-form-block.js +3 -3
- package/dist/blocks/revenue-breakdown-block.js +5 -5
- package/dist/blocks/stat-row-block.js +3 -3
- package/dist/blocks/task-list-block.js +2 -2
- package/dist/blocks/team-members-block.js +1 -1
- package/dist/blocks/wallet-block.js +4 -4
- package/dist/blocks/wallet-block.meta.js +3 -3
- package/dist/components/accordion/accordion.meta.js +2 -2
- package/dist/components/app-header/app-header.meta.js +1 -1
- package/dist/components/app-shell/app-shell.meta.js +2 -2
- package/dist/components/area-chart/area-chart.meta.js +3 -3
- package/dist/components/badge/badge.js +13 -4
- package/dist/components/badge/badge.meta.js +24 -13
- package/dist/components/badge/badge.variants.js +37 -23
- package/dist/components/banner/banner.meta.js +8 -8
- package/dist/components/banner/banner.variants.js +3 -3
- package/dist/components/bar-chart/bar-chart.meta.js +4 -4
- package/dist/components/breadcrumbs/breadcrumbs.meta.js +1 -1
- package/dist/components/button/button.meta.js +3 -3
- package/dist/components/card/card.js +16 -7
- package/dist/components/card/card.meta.js +4 -4
- package/dist/components/checkbox-card/checkbox-card.meta.js +10 -10
- package/dist/components/checkbox-card/checkbox-card.variants.js +15 -15
- package/dist/components/code-block/code-block.meta.js +1 -1
- package/dist/components/command-menu/command-menu.meta.js +1 -1
- package/dist/components/context-card/context-card.meta.js +2 -2
- package/dist/components/destructive-action-modal/destructive-action-modal.meta.js +1 -1
- package/dist/components/dialog/dialog.meta.js +2 -2
- package/dist/components/disclosure-picker/disclosure-picker.js +48 -2
- package/dist/components/disclosure-picker/disclosure-picker.meta.js +3 -2
- package/dist/components/empty-state/empty-state.meta.js +4 -4
- package/dist/components/gradient-art/gradient-art.meta.js +3 -3
- package/dist/components/label/label.meta.js +1 -1
- package/dist/components/line-chart/line-chart.meta.js +3 -3
- package/dist/components/meter/meter.js +1 -1
- package/dist/components/meter/meter.meta.js +2 -2
- package/dist/components/meter/meter.variants.js +1 -1
- package/dist/components/middle-truncate/middle-truncate.meta.js +4 -4
- package/dist/components/note/note.meta.js +3 -3
- package/dist/components/page-header/page-header.js +1 -1
- package/dist/components/pagination/pagination.meta.js +2 -2
- package/dist/components/panel-section/index.js +2 -1
- package/dist/components/panel-section/panel-section.js +15 -0
- package/dist/components/panel-section/panel-section.meta.js +32 -0
- package/dist/components/phone/phone.meta.js +1 -1
- package/dist/components/pie-chart/pie-chart.meta.js +3 -3
- package/dist/components/pill/pill.js +4 -2
- package/dist/components/pill/pill.meta.js +19 -2
- package/dist/components/pill/pill.variants.js +23 -2
- package/dist/components/popover/popover.meta.js +2 -2
- package/dist/components/radar-chart/radar-chart.meta.js +3 -3
- package/dist/components/radial-chart/radial-chart.meta.js +3 -3
- package/dist/components/radio/radio.meta.js +2 -2
- package/dist/components/radio-card/radio-card.meta.js +6 -6
- package/dist/components/radio-card/radio-card.variants.js +15 -15
- package/dist/components/scroller/scroller.meta.js +1 -1
- package/dist/components/search-input/search-input.meta.js +1 -1
- package/dist/components/section-header/section-header.js +1 -1
- package/dist/components/segmented-bar/segmented-bar.js +1 -1
- package/dist/components/segmented-bar/segmented-bar.meta.js +6 -6
- package/dist/components/segmented-bar/segmented-bar.variants.js +4 -4
- package/dist/components/select/select.meta.js +2 -2
- package/dist/components/sheet/sheet.meta.js +1 -1
- package/dist/components/side-nav/side-nav.meta.js +1 -1
- package/dist/components/sidebar/sidebar.meta.js +1 -1
- package/dist/components/sparkline/sparkline.meta.js +4 -4
- package/dist/components/spinner/spinner.meta.js +1 -1
- package/dist/components/status-dot/status-dot.js +4 -1
- package/dist/components/status-dot/status-dot.meta.js +8 -16
- package/dist/components/status-dot/status-dot.variants.js +13 -4
- package/dist/components/table/table.meta.js +4 -4
- package/dist/components/tabs/tabs.meta.js +1 -1
- package/dist/components/textarea/textarea.meta.js +2 -2
- package/dist/components/toast/toast.meta.js +1 -1
- package/dist/components/tooltip/tooltip.meta.js +2 -2
- package/dist/file-hashes.json +123 -121
- package/dist/foundations/spacing.js +8 -8
- package/dist/index.d.ts +171 -76
- package/dist/index.js +12 -1
- package/dist/lib/chart/types.js +3 -3
- package/dist/lib/palette.js +103 -0
- package/dist/lib/selection-card.js +4 -4
- package/dist/palette.css +669 -0
- package/dist/patterns/auth-page.js +6 -6
- package/dist/patterns/auth-page.meta.js +3 -3
- package/dist/patterns/brand-landing-page.js +2 -2
- package/dist/patterns/chat-panel.js +2 -2
- package/dist/patterns/dashboard-page.js +71 -71
- package/dist/patterns/dashboard-page.meta.js +5 -5
- package/dist/patterns/feed-page.js +25 -25
- package/dist/patterns/feed-page.meta.js +3 -3
- package/dist/patterns/landing-page.js +1 -1
- package/dist/patterns/list-detail-page.js +17 -17
- package/dist/patterns/settings-page.js +17 -17
- package/dist/presets/index.d.ts +1 -1
- package/dist/presets/index.js +17 -2
- package/dist/styles.css +115 -50
- package/dist/{theme-provider-S0NVJs2Y.d.ts → theme-provider-CdSicAad.d.ts} +1 -1
- package/dist/themes/_contract.js +22 -8
- package/dist/themes/atelier/atelier.css +13 -13
- package/dist/themes/atelier/index.d.ts +1 -1
- package/dist/themes/ember/ember.css +13 -13
- package/dist/themes/ember/index.d.ts +1 -1
- package/dist/themes/index.d.ts +2 -2
- package/dist/themes/meridian/index.d.ts +1 -1
- package/dist/themes/meridian/meridian.css +13 -13
- package/dist/themes/poppy/index.d.ts +1 -1
- package/dist/themes/poppy/poppy.css +19 -16
- package/dist/themes/prism/index.d.ts +1 -1
- package/dist/themes/prism/prism.css +18 -15
- package/dist/themes/sable/index.d.ts +1 -1
- package/dist/themes/sable/sable.css +18 -22
- package/dist/themes/verdant/index.d.ts +1 -1
- package/dist/themes/verdant/verdant.css +15 -15
- package/llms/blocks/danger-zone-block.md +4 -4
- package/llms/blocks/faq-block.md +3 -3
- package/llms/blocks/goal-progress-block.md +1 -1
- package/llms/blocks/notification-list-block.md +1 -1
- package/llms/blocks/pricing-table-block.md +12 -12
- package/llms/blocks/product-card-block.md +6 -6
- package/llms/blocks/profile-card-block.md +1 -1
- package/llms/blocks/profile-form-block.md +3 -3
- package/llms/blocks/revenue-breakdown-block.md +5 -5
- package/llms/blocks/stat-row-block.md +3 -3
- package/llms/blocks/task-list-block.md +2 -2
- package/llms/blocks/team-members-block.md +1 -1
- package/llms/blocks/wallet-block.md +7 -7
- package/llms/components/accordion.md +2 -2
- package/llms/components/app-header.md +1 -1
- package/llms/components/app-shell.md +2 -2
- package/llms/components/area-chart.md +1 -1
- package/llms/components/badge.md +15 -7
- package/llms/components/banner.md +6 -6
- package/llms/components/bar-chart.md +2 -2
- package/llms/components/breadcrumbs.md +1 -1
- package/llms/components/button.md +3 -3
- package/llms/components/card.md +4 -4
- package/llms/components/checkbox-card.md +5 -5
- package/llms/components/code-block.md +1 -1
- package/llms/components/command-menu.md +1 -1
- package/llms/components/context-card.md +2 -2
- package/llms/components/destructive-action-modal.md +1 -1
- package/llms/components/dialog.md +2 -2
- package/llms/components/disclosure-picker.md +2 -1
- package/llms/components/empty-state.md +4 -4
- package/llms/components/gradient-art.md +3 -3
- package/llms/components/label.md +1 -1
- package/llms/components/line-chart.md +1 -1
- package/llms/components/meter.md +2 -2
- package/llms/components/middle-truncate.md +5 -5
- package/llms/components/note.md +3 -3
- package/llms/components/pagination.md +2 -2
- package/llms/components/panel-section.md +28 -0
- package/llms/components/phone.md +1 -1
- package/llms/components/pie-chart.md +1 -1
- package/llms/components/pill.md +12 -2
- package/llms/components/popover.md +2 -2
- package/llms/components/radar-chart.md +1 -1
- package/llms/components/radial-chart.md +1 -1
- package/llms/components/radio-card.md +4 -4
- package/llms/components/radio.md +2 -2
- package/llms/components/scroller.md +1 -1
- package/llms/components/search-input.md +1 -1
- package/llms/components/segmented-bar.md +7 -7
- package/llms/components/select.md +2 -2
- package/llms/components/sheet.md +1 -1
- package/llms/components/side-nav.md +1 -1
- package/llms/components/sidebar.md +1 -1
- package/llms/components/sparkline.md +2 -2
- package/llms/components/spinner.md +1 -1
- package/llms/components/status-dot.md +4 -4
- package/llms/components/table.md +8 -8
- package/llms/components/tabs.md +1 -1
- package/llms/components/textarea.md +2 -2
- package/llms/components/toast.md +1 -1
- package/llms/components/tooltip.md +2 -2
- package/llms/foundations/spacing.md +7 -7
- package/llms/layout/grid.md +1 -1
- package/llms/layout/page.md +1 -1
- package/llms/layout/region.md +1 -1
- package/llms/layout/split-pane.md +1 -1
- package/llms/patterns/auth-page.md +11 -11
- package/llms/patterns/brand-landing-page.md +2 -2
- package/llms/patterns/chat-panel.md +2 -2
- package/llms/patterns/dashboard-page.md +78 -78
- package/llms/patterns/feed-page.md +31 -31
- package/llms/patterns/landing-page.md +1 -1
- package/llms/patterns/list-detail-page.md +18 -18
- package/llms/patterns/settings-page.md +18 -18
- package/llms/reference/token-intent.md +25 -11
- package/llms/reference/utilities.md +1 -1
- package/llms/tasks/adding-a-component.md +4 -1
- package/llms/tasks/building-a-page.md +40 -0
- package/llms/tasks/converting-an-app.md +3 -1
- package/llms/tasks/using-presets.md +4 -0
- package/llms-full.txt +457 -347
- package/llms.txt +8 -8
- package/package.json +4 -4
- package/registry.json +397 -233
- package/scripts/lint-rules.mjs +26 -5
- package/skills/sable/SKILL.md +14 -3
|
@@ -36,12 +36,12 @@ Use MiddleTruncate when both the beginning and end of a long identifier must rem
|
|
|
36
36
|
|
|
37
37
|
## Examples
|
|
38
38
|
|
|
39
|
-
###
|
|
39
|
+
### API key
|
|
40
40
|
|
|
41
41
|
```tsx
|
|
42
42
|
import { MiddleTruncate } from "@sableui/react"
|
|
43
43
|
|
|
44
|
-
<MiddleTruncate text="
|
|
44
|
+
<MiddleTruncate text="demo_key_7f3a9c2e5b8d1f4a6c0e9b3d7a2f5c8e1b4" />
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
### Custom start/end counts
|
|
@@ -49,7 +49,7 @@ import { MiddleTruncate } from "@sableui/react"
|
|
|
49
49
|
```tsx
|
|
50
50
|
import { MiddleTruncate } from "@sableui/react"
|
|
51
51
|
|
|
52
|
-
<MiddleTruncate text="
|
|
52
|
+
<MiddleTruncate text="9f2c4e7a1b3d5f60c8e2a4b6d8f0e1c3a5b7d9f2" startChars={4} endChars={4} />
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
### Copyable value
|
|
@@ -57,6 +57,6 @@ import { MiddleTruncate } from "@sableui/react"
|
|
|
57
57
|
```tsx
|
|
58
58
|
import { Button, Icon, MiddleTruncate, Row, useCopy } from "@sableui/react"
|
|
59
59
|
|
|
60
|
-
const { copy, copied } = useCopy(
|
|
61
|
-
<Row gap={1}><MiddleTruncate text={
|
|
60
|
+
const { copy, copied } = useCopy(commitHash)
|
|
61
|
+
<Row gap={1}><MiddleTruncate text={commitHash} /><Button variant="ghost" size="icon-xs" aria-label="Copy commit hash" onClick={copy}><Icon name={copied ? "check" : "copy"} /></Button></Row>
|
|
62
62
|
```
|
package/llms/components/note.md
CHANGED
|
@@ -53,7 +53,7 @@ Use Note for helpful supporting information that should sit near the relevant co
|
|
|
53
53
|
```tsx
|
|
54
54
|
import { Note } from "@sableui/react"
|
|
55
55
|
|
|
56
|
-
<Note tone="info">
|
|
56
|
+
<Note tone="info">Reports refresh every hour.</Note>
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
### With title
|
|
@@ -61,7 +61,7 @@ import { Note } from "@sableui/react"
|
|
|
61
61
|
```tsx
|
|
62
62
|
import { Note } from "@sableui/react"
|
|
63
63
|
|
|
64
|
-
<Note tone="warning" title="Low balance">
|
|
64
|
+
<Note tone="warning" title="Low balance">Add credits before your next export.</Note>
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
### Warning with a remedy, inside a dialog
|
|
@@ -77,5 +77,5 @@ import { Note } from "@sableui/react"
|
|
|
77
77
|
```tsx
|
|
78
78
|
import { Note } from "@sableui/react"
|
|
79
79
|
|
|
80
|
-
<Note tone="neutral" icon="lock">Pricing
|
|
80
|
+
<Note tone="neutral" icon="lock">Pricing cannot be changed after an order is placed.</Note>
|
|
81
81
|
```
|
|
@@ -13,7 +13,7 @@ Use Pagination when a result set is split into discrete pages and the user needs
|
|
|
13
13
|
### Best practices
|
|
14
14
|
|
|
15
15
|
- Do: Keep page state controlled by the parent route or data layer so URL, filters, and result fetches stay in sync.
|
|
16
|
-
- Do: Use a specific label when multiple pagers appear on a page, such as "
|
|
16
|
+
- Do: Use a specific label when multiple pagers appear on a page, such as "Customer pages".
|
|
17
17
|
- Do: Reset to page 1 when filters or search terms materially change the result set.
|
|
18
18
|
- Don't: Use Pagination for tiny lists where all items fit comfortably on one page.
|
|
19
19
|
- Don't: Hide disabled previous/next buttons at the bounds; disabled controls make the current position clearer.
|
|
@@ -79,7 +79,7 @@ const [page, setPage] = useState(8)
|
|
|
79
79
|
```tsx
|
|
80
80
|
import { DataTable, Pagination, Stack } from "@sableui/react"
|
|
81
81
|
|
|
82
|
-
<Stack gap={2}><DataTable data={rows} columns={columns} rowKey={(row) => row.id} /><Pagination label="
|
|
82
|
+
<Stack gap={2}><DataTable data={rows} columns={columns} rowKey={(row) => row.id} /><Pagination label="Customer pages" page={page} total={12} onPageChange={setPage} /></Stack>
|
|
83
83
|
```
|
|
84
84
|
|
|
85
85
|
### Server query state
|
|
@@ -27,6 +27,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
|
|
|
27
27
|
| Header | yes | The section title in the UI section tier, with an optional trailing action. |
|
|
28
28
|
| PropertyRow | no | One property: label left, control right. `stacked` moves the control to its own line for full-width controls. |
|
|
29
29
|
| PropertyPair | no | Two controls side by side, with optional captions above each. |
|
|
30
|
+
| PropertyGroup | no | A set of properties folded behind one row that names the group and summarises its value, opening with +/− to the controls beneath. |
|
|
30
31
|
|
|
31
32
|
## Subcomponents
|
|
32
33
|
|
|
@@ -34,6 +35,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
|
|
|
34
35
|
| --- | --- | --- |
|
|
35
36
|
| PropertyRow | { label: ReactNode; htmlFor?: string; hint?: string; stacked?: boolean; scrub?: { value, onValueChange, step?, min?, max?, onGestureStart?, onGestureEnd?, disabled? } } | One property line. `hint` becomes the label's hover explanation; `stacked` puts the control on its own line. `scrub` makes the property NAME a drag handle for its value — the Figma/Framer/Paper convention, and the answer for a numeric row with no honest glyph to put in a ScrubField (a schema-generated `levels` or `seed`, where a `#` would be noise pretending to be meaning). Opt-in and additive: a row without it is unchanged. The label stays a real `<label htmlFor>` — a 2px jitter threshold keeps a click a click, and the click synthesised after a real drag is swallowed so a scrub does not also select the field's text. |
|
|
36
37
|
| PropertyPair | { labels?: [ReactNode, ReactNode] } | Two controls side by side in a 2-up grid, with optional captions above each. |
|
|
38
|
+
| PropertyGroup | { label: ReactNode; summary?: ReactNode; defaultOpen?: boolean; open?: boolean; onOpenChange?: (open: boolean) => void } | A collapsible set of properties inside a section, at the panel's scale (an Accordion is page furniture). The row shows the label, then the summary (the group's value, readable while closed: a word, a few swatches, or both), then a + that turns to − when open. Groups open independently and stack with a hairline between them. Built on Collapsible. |
|
|
37
39
|
|
|
38
40
|
## Props
|
|
39
41
|
|
|
@@ -48,6 +50,7 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
|
|
|
48
50
|
|
|
49
51
|
## Accessibility
|
|
50
52
|
|
|
53
|
+
- PropertyGroup's row is a real button with aria-expanded (Collapsible); its summary is part of the button's name, so a closed group still announces its value.
|
|
51
54
|
- PropertyRow renders a real <label>; pass htmlFor with the control's id so clicking the label focuses it.
|
|
52
55
|
- The section title is an h3, so panels contribute a real heading outline rather than styled divs.
|
|
53
56
|
- `hint` is exposed as the label's title attribute — keep the essential meaning in the label itself, since title text is not reliably announced.
|
|
@@ -59,6 +62,31 @@ Use PanelSection to group properties inside an inspector or docked panel, with P
|
|
|
59
62
|
|
|
60
63
|
## Examples
|
|
61
64
|
|
|
65
|
+
### Groups that fold behind their value
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
import { PanelSection, PropertyGroup, PropertyRow, ScrubField, Select, SelectContent, SelectItem, SelectTrigger } from "@sableui/react"
|
|
69
|
+
|
|
70
|
+
<PanelSection title="Color">
|
|
71
|
+
<PropertyGroup label="Tones" summary="Brand only">
|
|
72
|
+
<PropertyRow label="Scheme">
|
|
73
|
+
<Select value="brand">
|
|
74
|
+
<SelectTrigger size="xs" />
|
|
75
|
+
<SelectContent>
|
|
76
|
+
<SelectItem value="brand">Brand only</SelectItem>
|
|
77
|
+
<SelectItem value="harmonize">Harmonize</SelectItem>
|
|
78
|
+
</SelectContent>
|
|
79
|
+
</Select>
|
|
80
|
+
</PropertyRow>
|
|
81
|
+
</PropertyGroup>
|
|
82
|
+
<PropertyGroup label="Grid" summary="8px">
|
|
83
|
+
<PropertyRow label="Size">
|
|
84
|
+
<ScrubField label="Grid size" value={8} min={1} max={64} suffix="px" />
|
|
85
|
+
</PropertyRow>
|
|
86
|
+
</PropertyGroup>
|
|
87
|
+
</PanelSection>
|
|
88
|
+
```
|
|
89
|
+
|
|
62
90
|
### Blending section, 2-up
|
|
63
91
|
|
|
64
92
|
```tsx
|
package/llms/components/phone.md
CHANGED
|
@@ -46,7 +46,7 @@ Use Phone to frame a mobile product preview when the device context is useful.
|
|
|
46
46
|
```tsx
|
|
47
47
|
import { Phone } from "@sableui/react"
|
|
48
48
|
|
|
49
|
-
<Phone><div className="p-4"><h2 className="text-title-lg">Activity</h2><p className="text-body-sm text-muted-foreground">3 new
|
|
49
|
+
<Phone><div className="p-4"><h2 className="text-title-lg">Activity</h2><p className="text-body-sm text-muted-foreground">3 new orders today.</p></div></Phone>
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
### Mockup, not a responsive preview
|
|
@@ -43,7 +43,7 @@ Use PieChart for a share of one total across two to six categories — traffic s
|
|
|
43
43
|
|
|
44
44
|
## Tokens used
|
|
45
45
|
|
|
46
|
-
`tone-
|
|
46
|
+
`tone-1`, `tone-2`, `tone-3`, `tone-info`, `tone-warning`, `primary`, `muted-foreground`, `border`, `popover`, `popover-foreground`, `foreground`, `background`
|
|
47
47
|
|
|
48
48
|
## Motion
|
|
49
49
|
|
package/llms/components/pill.md
CHANGED
|
@@ -25,6 +25,7 @@ Use Pill for a row of filters or choices a person clicks to narrow or toggle wha
|
|
|
25
25
|
| selected | boolean | false | Marks the pill as chosen. Solid lifts onto the primary surface; outline takes a primary tint and soft primary edge. Sets aria-pressed. |
|
|
26
26
|
| appearance | "solid" \| "outline" | "solid" | solid for a filter row; outline for quiet chips that annotate other content (a reaction under a message, a tag on a card), where a filled chip would compete with what it annotates. |
|
|
27
27
|
| size | "md" \| "sm" | "md" | md sits on the density ladder's xs control height (28px); sm is 24px, for chips under or inside other content. |
|
|
28
|
+
| tone | "neutral" \| "red" \| "orange" \| "yellow" \| "green" \| "teal" \| "blue" \| "purple" \| "pink" | "neutral" | neutral is the chip as described. A palette family colours it as a category, like the choices in a tag picker: a wash at rest, the solid family colour when selected. Painted from the theme's generated palette. |
|
|
28
29
|
| icon | ReactNode | — | Optional leading glyph (e.g. <Icon name="lock" />), rendered before the children with the base gap. |
|
|
29
30
|
|
|
30
31
|
## Variants
|
|
@@ -32,10 +33,11 @@ Use Pill for a row of filters or choices a person clicks to narrow or toggle wha
|
|
|
32
33
|
- **appearance**: solid, outline
|
|
33
34
|
- **size**: md, sm
|
|
34
35
|
- **selected**: true, false
|
|
36
|
+
- **tone**: neutral, red, orange, yellow, green, teal, blue, purple, pink
|
|
35
37
|
|
|
36
38
|
## Tokens used
|
|
37
39
|
|
|
38
|
-
`secondary`, `secondary-foreground`, `accent`, `accent-foreground`, `primary`, `primary-foreground`, `card`, `border`, `muted-foreground`, `foreground`
|
|
40
|
+
`palette-wash`, `palette-wash-strong`, `palette-edge`, `palette-solid`, `palette-text`, `palette-solid-ink`, `secondary`, `secondary-foreground`, `accent`, `accent-foreground`, `primary`, `primary-foreground`, `card`, `border`, `muted-foreground`, `foreground`
|
|
39
41
|
|
|
40
42
|
## Accessibility
|
|
41
43
|
|
|
@@ -48,12 +50,20 @@ Use Pill for a row of filters or choices a person clicks to narrow or toggle wha
|
|
|
48
50
|
|
|
49
51
|
## Examples
|
|
50
52
|
|
|
53
|
+
### Tag picker
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
import { Pill, Row } from "@sableui/react"
|
|
57
|
+
|
|
58
|
+
<Row gap={1}><Pill tone="blue" selected onClick={() => {}}>Design</Pill><Pill tone="teal" onClick={() => {}}>Research</Pill><Pill tone="orange" onClick={() => {}}>Marketing</Pill></Row>
|
|
59
|
+
```
|
|
60
|
+
|
|
51
61
|
### Filter row
|
|
52
62
|
|
|
53
63
|
```tsx
|
|
54
64
|
import { Pill, Row } from "@sableui/react"
|
|
55
65
|
|
|
56
|
-
<Row gap={1}><Pill selected onClick={() => {}}>All</Pill><Pill onClick={() => {}}>
|
|
66
|
+
<Row gap={1}><Pill selected onClick={() => {}}>All</Pill><Pill onClick={() => {}}>Projects</Pill><Pill onClick={() => {}}>Reports</Pill></Row>
|
|
57
67
|
```
|
|
58
68
|
|
|
59
69
|
### Outline, small (reactions)
|
|
@@ -67,7 +67,7 @@ Use Popover for anchored secondary content that needs more room than a tooltip b
|
|
|
67
67
|
```tsx
|
|
68
68
|
import { Button, Popover, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger } from "@sableui/react"
|
|
69
69
|
|
|
70
|
-
<Popover><PopoverTrigger render={<Button variant="secondary">Details</Button>} /><PopoverContent><PopoverTitle>
|
|
70
|
+
<Popover><PopoverTrigger render={<Button variant="secondary">Details</Button>} /><PopoverContent><PopoverTitle>Plan details</PopoverTitle><PopoverDescription>Up to 10 seats, billed monthly per seat.</PopoverDescription></PopoverContent></Popover>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### With close
|
|
@@ -75,5 +75,5 @@ import { Button, Popover, PopoverContent, PopoverDescription, PopoverTitle, Popo
|
|
|
75
75
|
```tsx
|
|
76
76
|
import { Button, Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger } from "@sableui/react"
|
|
77
77
|
|
|
78
|
-
<Popover><PopoverTrigger render={<Button variant="secondary">Open</Button>} /><PopoverContent><PopoverTitle>Heads up</PopoverTitle><PopoverDescription>
|
|
78
|
+
<Popover><PopoverTrigger render={<Button variant="secondary">Open</Button>} /><PopoverContent><PopoverTitle>Heads up</PopoverTitle><PopoverDescription>Upgrading starts a new billing period today.</PopoverDescription><PopoverClose render={<Button size="sm">Got it</Button>} /></PopoverContent></Popover>
|
|
79
79
|
```
|
|
@@ -42,7 +42,7 @@ Use RadarChart to compare the shape of a profile across five to eight dimensions
|
|
|
42
42
|
|
|
43
43
|
## Tokens used
|
|
44
44
|
|
|
45
|
-
`tone-
|
|
45
|
+
`tone-1`, `tone-2`, `tone-3`, `tone-info`, `tone-warning`, `primary`, `muted-foreground`, `border`, `popover`, `popover-foreground`, `foreground`, `background`
|
|
46
46
|
|
|
47
47
|
## Motion
|
|
48
48
|
|
|
@@ -44,7 +44,7 @@ Use RadialChart for progress toward goals (several rings), a single score or usa
|
|
|
44
44
|
|
|
45
45
|
## Tokens used
|
|
46
46
|
|
|
47
|
-
`tone-
|
|
47
|
+
`tone-1`, `tone-2`, `tone-3`, `tone-info`, `tone-warning`, `primary`, `muted-foreground`, `border`, `popover`, `popover-foreground`, `foreground`, `background`
|
|
48
48
|
|
|
49
49
|
## Motion
|
|
50
50
|
|
|
@@ -39,18 +39,18 @@ Use RadioCard for visual choice cards when users compare a small set of named op
|
|
|
39
39
|
| description | ReactNode | — | Optional supporting copy beneath the title (text-body-sm, muted). |
|
|
40
40
|
| trailing | ReactNode | — | End-aligned on the title's line: a price, a delivery date, a count. The title takes the rest of the row. |
|
|
41
41
|
| icon | ReactNode | — | Leading icon (e.g. a solid <Icon>). Its presence switches to the two-dimensional card — icon top-left, indicator top-right, copy below — and the glyph is rendered as a solid-fill icon in the tone colour. |
|
|
42
|
-
| tone | "neutral" \| "
|
|
42
|
+
| tone | "neutral" \| "3" \| "2" \| "1" \| "info" \| "warning" | "neutral" | Semantic colour the selected state carries across the border, radio, and icon glyph. Neutral uses the primary ring with a muted wash. |
|
|
43
43
|
| disabled | boolean | false | Dims the card and blocks selection. The group skips it during keyboard navigation. |
|
|
44
44
|
| titleClassName | string | — | Merged onto the title span (default text-title-sm) — e.g. to tighten copy in a two-column layout. |
|
|
45
45
|
| descriptionClassName | string | — | Merged onto the description span (default text-body-sm text-muted-foreground). |
|
|
46
46
|
|
|
47
47
|
## Variants
|
|
48
48
|
|
|
49
|
-
- **tone**: neutral,
|
|
49
|
+
- **tone**: neutral, 3, 2, 1, info, warning
|
|
50
50
|
|
|
51
51
|
## Tokens used
|
|
52
52
|
|
|
53
|
-
`input`, `card`, `foreground`, `primary`, `muted`, `ring`, `muted-foreground`, `tone-
|
|
53
|
+
`input`, `card`, `foreground`, `primary`, `muted`, `ring`, `muted-foreground`, `tone-3`, `tone-2`, `tone-1`, `tone-info`, `tone-warning`
|
|
54
54
|
|
|
55
55
|
## Accessibility
|
|
56
56
|
|
|
@@ -71,7 +71,7 @@ Use RadioCard for visual choice cards when users compare a small set of named op
|
|
|
71
71
|
```tsx
|
|
72
72
|
import { Icon, RadioCard, RadioGroup } from "@sableui/react"
|
|
73
73
|
|
|
74
|
-
<RadioGroup defaultValue="
|
|
74
|
+
<RadioGroup defaultValue="starter" className="grid sm:grid-cols-3"><RadioCard value="starter" tone="3" icon={<Icon name="plus" />} title="Starter" description="Free for one person" /><RadioCard value="studio" tone="2" icon={<Icon name="gem" />} title="Studio" description="For small teams" /><RadioCard value="business" tone="1" icon={<Icon name="image-stack" />} title="Business" description="SSO and audit log" /></RadioGroup>
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
### Plan picker (plain)
|
package/llms/components/radio.md
CHANGED
|
@@ -63,7 +63,7 @@ import { Field, Fieldset, FieldsetContent, FieldsetLegend, Radio, RadioGroup } f
|
|
|
63
63
|
<FieldsetContent>
|
|
64
64
|
<RadioGroup defaultValue="standard">
|
|
65
65
|
<Field label="Standard" orientation="horizontal"><Radio value="standard" /></Field>
|
|
66
|
-
<Field label="
|
|
66
|
+
<Field label="Poll" orientation="horizontal"><Radio value="poll" /></Field>
|
|
67
67
|
</RadioGroup>
|
|
68
68
|
</FieldsetContent>
|
|
69
69
|
</Fieldset>
|
|
@@ -79,7 +79,7 @@ import { Field, Fieldset, FieldsetContent, FieldsetLegend, Radio, RadioGroup } f
|
|
|
79
79
|
<FieldsetContent>
|
|
80
80
|
<RadioGroup defaultValue="standard">
|
|
81
81
|
<Field label="Standard" orientation="horizontal"><Radio value="standard" /></Field>
|
|
82
|
-
<Field label="
|
|
82
|
+
<Field label="Poll" orientation="horizontal" disabled><Radio value="poll" /></Field>
|
|
83
83
|
</RadioGroup>
|
|
84
84
|
</FieldsetContent>
|
|
85
85
|
</Fieldset>
|
|
@@ -60,7 +60,7 @@ Use Scroller to create a contained overflow region for content that naturally ex
|
|
|
60
60
|
```tsx
|
|
61
61
|
import { Scroller } from "@sableui/react"
|
|
62
62
|
|
|
63
|
-
<Scroller label="
|
|
63
|
+
<Scroller label="Projects" className="h-64"><ul className="space-y-2 p-4">{items.map((item) => (<li key={item.id} className="text-body-sm">{item.title}</li>))}</ul></Scroller>
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
### Capped, scrolls past the cap
|
|
@@ -72,7 +72,7 @@ import { SearchInput } from "@sableui/react"
|
|
|
72
72
|
```tsx
|
|
73
73
|
import { Field, SearchInput } from "@sableui/react"
|
|
74
74
|
|
|
75
|
-
<Field label="Search posts"><SearchInput defaultValue="
|
|
75
|
+
<Field label="Search posts"><SearchInput defaultValue="roadmap" className="max-w-80" /></Field>
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
### Disabled
|
|
@@ -36,11 +36,11 @@ Use SegmentedBar when a stat card or row needs to show how a total divides into
|
|
|
36
36
|
## Variants
|
|
37
37
|
|
|
38
38
|
- **size**: sm, md, lg
|
|
39
|
-
- **tone**:
|
|
39
|
+
- **tone**: 1, 2, 3, info, primary, neutral, success, warning, destructive
|
|
40
40
|
|
|
41
41
|
## Tokens used
|
|
42
42
|
|
|
43
|
-
`tone-
|
|
43
|
+
`tone-1`, `tone-2`, `tone-3`, `tone-info`, `primary`, `muted-foreground`, `success`, `tone-warning`, `destructive`
|
|
44
44
|
|
|
45
45
|
## Motion
|
|
46
46
|
|
|
@@ -51,7 +51,7 @@ Use SegmentedBar when a stat card or row needs to show how a total divides into
|
|
|
51
51
|
|
|
52
52
|
## Accessibility
|
|
53
53
|
|
|
54
|
-
- Rendered role=img with an aria-label built from `label` and each segment's share ("Revenue by
|
|
54
|
+
- Rendered role=img with an aria-label built from `label` and each segment's share ("Revenue by channel: Direct 42%, Partners 27%"), so the whole breakdown is read in one stop.
|
|
55
55
|
- Colour alone does not identify a segment: always show a legend with each segment's label beside the bar.
|
|
56
56
|
|
|
57
57
|
## Related
|
|
@@ -67,13 +67,13 @@ Use SegmentedBar when a stat card or row needs to show how a total divides into
|
|
|
67
67
|
import { SegmentedBar, Stack, StatusDot } from "@sableui/react"
|
|
68
68
|
|
|
69
69
|
const sales = [
|
|
70
|
-
{ label: "
|
|
71
|
-
{ label: "
|
|
72
|
-
{ label: "
|
|
70
|
+
{ label: "Direct", value: 42, tone: "1" },
|
|
71
|
+
{ label: "Partners", value: 27, tone: "2" },
|
|
72
|
+
{ label: "Referrals", value: 19, tone: "3" },
|
|
73
73
|
] as const
|
|
74
74
|
|
|
75
75
|
<Stack gap={3}>
|
|
76
|
-
<SegmentedBar label="Revenue by
|
|
76
|
+
<SegmentedBar label="Revenue by channel" segments={[...sales]} size="lg" />
|
|
77
77
|
<ul className="flex flex-col gap-1.5">
|
|
78
78
|
{sales.map((s) => (
|
|
79
79
|
<li key={s.label} className="flex items-center gap-2 text-body-sm">
|
|
@@ -94,7 +94,7 @@ import { SelectContent, SelectGroup, SelectGroupLabel, SelectItem } from "@sable
|
|
|
94
94
|
```tsx
|
|
95
95
|
import { Field, Select, SelectContent, SelectItem, SelectTrigger } from "@sableui/react"
|
|
96
96
|
|
|
97
|
-
<Field label="Default visibility" description="Controls how new
|
|
97
|
+
<Field label="Default visibility" description="Controls how new projects appear."><Select defaultValue="public"><SelectTrigger placeholder="Choose visibility" /><SelectContent><SelectItem value="public">Public</SelectItem><SelectItem value="private">Private</SelectItem><SelectItem value="unlisted">Unlisted</SelectItem></SelectContent></Select></Field>
|
|
98
98
|
```
|
|
99
99
|
|
|
100
100
|
### Rich item labels
|
|
@@ -102,5 +102,5 @@ import { Field, Select, SelectContent, SelectItem, SelectTrigger } from "@sableu
|
|
|
102
102
|
```tsx
|
|
103
103
|
import { Badge, Select, SelectContent, SelectItem, SelectTrigger } from "@sableui/react"
|
|
104
104
|
|
|
105
|
-
<Select defaultValue="
|
|
105
|
+
<Select defaultValue="business" items={[{ value: "business", label: "Business" }, { value: "studio", label: "Studio" }]}><SelectTrigger /><SelectContent><SelectItem value="business" label="Business"><span className="flex items-center gap-2"><Badge tone="1">Business</Badge><span>Business plan</span></span></SelectItem><SelectItem value="studio" label="Studio"><span className="flex items-center gap-2"><Badge tone="2">Studio</Badge><span>Studio</span></span></SelectItem></SelectContent></Select>
|
|
106
106
|
```
|
package/llms/components/sheet.md
CHANGED
|
@@ -103,5 +103,5 @@ import { Button, Sheet, SheetClose, SheetContent, SheetFooter, SheetHeader, Shee
|
|
|
103
103
|
```tsx
|
|
104
104
|
import { Button, Sheet, SheetClose, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from "@sableui/react"
|
|
105
105
|
|
|
106
|
-
<Sheet><SheetTrigger render={<Button variant="secondary">Details</Button>} /><SheetContent side="bottom"><SheetHeader><SheetTitle>
|
|
106
|
+
<Sheet><SheetTrigger render={<Button variant="secondary">Details</Button>} /><SheetContent side="bottom"><SheetHeader><SheetTitle>Order details</SheetTitle></SheetHeader><SheetFooter><SheetClose render={<Button variant="secondary">Close</Button>} /></SheetFooter></SheetContent></Sheet>
|
|
107
107
|
```
|
|
@@ -84,7 +84,7 @@ import { SideNav, SideNavGroup, SideNavItem } from "@sableui/react"
|
|
|
84
84
|
import { SideNav, SideNavItem } from "@sableui/react"
|
|
85
85
|
// <Link> = your router's link (react-router, next/link, @tanstack/router, …)
|
|
86
86
|
|
|
87
|
-
<SideNav size="lg"><SideNavItem label="Profile" active render={<Link to="/settings/profile" />} /><SideNavItem label="
|
|
87
|
+
<SideNav size="lg"><SideNavItem label="Profile" active render={<Link to="/settings/profile" />} /><SideNavItem label="Billing" render={<Link to="/settings/billing" />} /><SideNavItem label="Security" render={<Link to="/settings/security" />} /></SideNav>
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
### Inside Sidebar chrome
|
|
@@ -67,7 +67,7 @@ Use Sidebar for persistent desktop navigation or application chrome outside the
|
|
|
67
67
|
import { Icon, NotificationBadge, Sidebar, SidebarBrand, SidebarFooter, SidebarHeader, SidebarItem, SidebarNav } from "@sableui/react"
|
|
68
68
|
// <Link> = your router's link (react-router, next/link, @tanstack/router, …)
|
|
69
69
|
|
|
70
|
-
<Sidebar><SidebarHeader><SidebarBrand mark={<Icon name="music" variant="solid" />} label="Undertow" render={<Link to="/" />} /></SidebarHeader><SidebarNav><SidebarItem icon={<Icon name="bell" />} label="Notifications" badge={<NotificationBadge count={3} />} render={<Link to="/notifications" />} /></SidebarNav><SidebarFooter>{
|
|
70
|
+
<Sidebar><SidebarHeader><SidebarBrand mark={<Icon name="music" variant="solid" />} label="Undertow" render={<Link to="/" />} /></SidebarHeader><SidebarNav><SidebarItem icon={<Icon name="bell" />} label="Notifications" badge={<NotificationBadge count={3} />} render={<Link to="/notifications" />} /></SidebarNav><SidebarFooter>{account}</SidebarFooter></Sidebar>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
### Collapsible (icon rail)
|
|
@@ -24,7 +24,7 @@ Use Sparkline next to a number to show where it has been — a KPI's last 30 day
|
|
|
24
24
|
| data | number[] | — | The values, oldest first. |
|
|
25
25
|
| label | string | — | What the line tracks ("Revenue, last 30 days"). The spoken summary adds the first and last values, low and high. |
|
|
26
26
|
| variant | "line" \| "area" \| "bar" | "line" | A line, a line over a soft fill, or columns. |
|
|
27
|
-
| tone | "
|
|
27
|
+
| tone | "1" \| "2" \| "3" \| "info" \| "warning" \| "primary" \| "neutral" \| "success" \| "destructive" | "primary" | Colour by role. |
|
|
28
28
|
| className | string | "h-8 w-24" | Sizes it; the drawing stretches to fit. |
|
|
29
29
|
| animate | boolean | true | Draw on (or rise) when it scrolls into view. |
|
|
30
30
|
| locale | string | runtime locale | BCP 47 locale for default number and date formatting. |
|
|
@@ -35,7 +35,7 @@ Use Sparkline next to a number to show where it has been — a KPI's last 30 day
|
|
|
35
35
|
|
|
36
36
|
## Tokens used
|
|
37
37
|
|
|
38
|
-
`primary`, `tone-
|
|
38
|
+
`primary`, `tone-1`, `tone-2`, `tone-3`, `tone-info`, `tone-warning`, `muted-foreground`, `success`, `destructive`
|
|
39
39
|
|
|
40
40
|
## Motion
|
|
41
41
|
|
|
@@ -28,18 +28,18 @@ Use StatusDot as a compact visual state cue next to text, avatars, rows, or labe
|
|
|
28
28
|
|
|
29
29
|
| Name | Type | Default | Description |
|
|
30
30
|
| --- | --- | --- | --- |
|
|
31
|
-
| tone | "neutral" \| "
|
|
31
|
+
| tone | "neutral" \| "1" \| "2" \| "3" \| "success" \| "warning" \| "info" \| "destructive" \| "red" \| "orange" \| "yellow" \| "green" \| "teal" \| "blue" \| "purple" \| "pink" | "neutral" | Semantic color of the dot, or a palette family (red … pink) for a category legend. |
|
|
32
32
|
| size | "sm" \| "md" \| "lg" | "md" | Dot diameter. |
|
|
33
33
|
| pulse | boolean | false | Wrap the dot in an animated ping ring to signal a live state. |
|
|
34
34
|
|
|
35
35
|
## Variants
|
|
36
36
|
|
|
37
|
-
- **tone**: neutral,
|
|
37
|
+
- **tone**: neutral, 1, 2, 3, success, warning, info, destructive, red, orange, yellow, green, teal, blue, purple, pink
|
|
38
38
|
- **size**: sm, md, lg
|
|
39
39
|
|
|
40
40
|
## Tokens used
|
|
41
41
|
|
|
42
|
-
`muted-foreground`, `tone-
|
|
42
|
+
`palette-dot`, `muted-foreground`, `tone-3`, `success`, `tone-warning`, `tone-info`, `tone-1`, `tone-2`, `destructive`
|
|
43
43
|
|
|
44
44
|
## Accessibility
|
|
45
45
|
|
|
@@ -58,7 +58,7 @@ Use StatusDot as a compact visual state cue next to text, avatars, rows, or labe
|
|
|
58
58
|
```tsx
|
|
59
59
|
import { Row, StatusDot } from "@sableui/react"
|
|
60
60
|
|
|
61
|
-
<Row gap={2}><StatusDot tone="
|
|
61
|
+
<Row gap={2}><StatusDot tone="3" /><StatusDot tone="info" /><StatusDot tone="warning" /><StatusDot tone="destructive" /></Row>
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
### With label — use Badge
|
package/llms/components/table.md
CHANGED
|
@@ -63,25 +63,25 @@ Use Table for structured data with consistent columns and rows. Use DataTable wh
|
|
|
63
63
|
|
|
64
64
|
## Examples
|
|
65
65
|
|
|
66
|
-
###
|
|
66
|
+
### Orders
|
|
67
67
|
|
|
68
68
|
```tsx
|
|
69
69
|
import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "@sableui/react"
|
|
70
70
|
|
|
71
71
|
<Table>
|
|
72
|
-
<TableCaption>Recent
|
|
72
|
+
<TableCaption>Recent orders</TableCaption>
|
|
73
73
|
<TableHeader>
|
|
74
74
|
<TableRow>
|
|
75
|
-
<TableHead>
|
|
76
|
-
<TableHead>
|
|
75
|
+
<TableHead>Customer</TableHead>
|
|
76
|
+
<TableHead>Order</TableHead>
|
|
77
77
|
<TableHead>Paid</TableHead>
|
|
78
78
|
</TableRow>
|
|
79
79
|
</TableHeader>
|
|
80
80
|
<TableBody>
|
|
81
81
|
<TableRow>
|
|
82
82
|
<TableCell>@nova</TableCell>
|
|
83
|
-
<TableCell
|
|
84
|
-
<TableCell
|
|
83
|
+
<TableCell>1042</TableCell>
|
|
84
|
+
<TableCell>$48.00</TableCell>
|
|
85
85
|
</TableRow>
|
|
86
86
|
</TableBody>
|
|
87
87
|
</Table>
|
|
@@ -100,7 +100,7 @@ import { Avatar, Badge, Button, Row, Table, TableBody, TableCaption, TableCell,
|
|
|
100
100
|
```tsx
|
|
101
101
|
import { Card, CardContent, CardHeader, CardTitle, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@sableui/react"
|
|
102
102
|
|
|
103
|
-
<Card><CardHeader><CardTitle>
|
|
103
|
+
<Card><CardHeader><CardTitle>Customers</CardTitle></CardHeader><CardContent flush><Table><TableHeader><TableRow><TableHead>Customer</TableHead><TableHead>Paid</TableHead></TableRow></TableHeader><TableBody><TableRow><TableCell>@nova</TableCell><TableCell>$48.00</TableCell></TableRow></TableBody></Table></CardContent></Card>
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
### Summary footer
|
|
@@ -108,5 +108,5 @@ import { Card, CardContent, CardHeader, CardTitle, Table, TableBody, TableCell,
|
|
|
108
108
|
```tsx
|
|
109
109
|
import { Table, TableBody, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "@sableui/react"
|
|
110
110
|
|
|
111
|
-
<Table><TableHeader><TableRow><TableHead>Item</TableHead><TableHead className="text-end">Amount</TableHead></TableRow></TableHeader><TableBody><TableRow><TableCell>
|
|
111
|
+
<Table><TableHeader><TableRow><TableHead>Item</TableHead><TableHead className="text-end">Amount</TableHead></TableRow></TableHeader><TableBody><TableRow><TableCell>Studio plan</TableCell><TableCell className="text-end">$192.00</TableCell></TableRow></TableBody><TableFooter><TableRow><TableCell>Total</TableCell><TableCell className="text-end">$192.00</TableCell></TableRow></TableFooter></Table>
|
|
112
112
|
```
|
package/llms/components/tabs.md
CHANGED
|
@@ -80,5 +80,5 @@ import { Tabs, TabsList, TabsPanel, TabsTrigger } from "@sableui/react"
|
|
|
80
80
|
```tsx
|
|
81
81
|
import { Tabs, TabsList, TabsPanel, TabsTrigger } from "@sableui/react"
|
|
82
82
|
|
|
83
|
-
<Tabs defaultValue="overview"><TabsList><TabsTrigger value="overview">Overview</TabsTrigger><TabsTrigger value="
|
|
83
|
+
<Tabs defaultValue="overview"><TabsList><TabsTrigger value="overview">Overview</TabsTrigger><TabsTrigger value="billing" disabled>Billing</TabsTrigger></TabsList><TabsPanel value="overview">Overview content</TabsPanel></Tabs>
|
|
84
84
|
```
|
|
@@ -60,7 +60,7 @@ import { Textarea } from "@sableui/react"
|
|
|
60
60
|
```tsx
|
|
61
61
|
import { Textarea } from "@sableui/react"
|
|
62
62
|
|
|
63
|
-
<Textarea rows={6} placeholder="Tell
|
|
63
|
+
<Textarea rows={6} placeholder="Tell your team what this project is for…" />
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
### Auto-resize
|
|
@@ -84,5 +84,5 @@ import { Textarea } from "@sableui/react"
|
|
|
84
84
|
```tsx
|
|
85
85
|
import { Textarea } from "@sableui/react"
|
|
86
86
|
|
|
87
|
-
<Textarea disabled defaultValue="
|
|
87
|
+
<Textarea disabled defaultValue="Notes lock once the invoice is sent." />
|
|
88
88
|
```
|
package/llms/components/toast.md
CHANGED
|
@@ -104,7 +104,7 @@ toast.promise(publish(), { loading: "Publishing…", success: "Published", error
|
|
|
104
104
|
```tsx
|
|
105
105
|
import { toast } from "@sableui/react"
|
|
106
106
|
|
|
107
|
-
const id = toast.loading("
|
|
107
|
+
const id = toast.loading("Uploading report…"); /* later */ toast.update(id, { title: "Uploaded", type: "success", timeout: 4000 })
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
### Custom toast markup (composed parts)
|
|
@@ -73,7 +73,7 @@ Use Tooltip for brief nonessential hints tied to a specific control or piece of
|
|
|
73
73
|
```tsx
|
|
74
74
|
import { Button, Icon, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@sableui/react"
|
|
75
75
|
|
|
76
|
-
<TooltipProvider><Tooltip><TooltipTrigger render={<Button variant="ghost" size="icon-sm" aria-label="Info"><Icon name="info" /></Button>} /><TooltipContent>
|
|
76
|
+
<TooltipProvider><Tooltip><TooltipTrigger render={<Button variant="ghost" size="icon-sm" aria-label="Info"><Icon name="info" /></Button>} /><TooltipContent>Saved to your workspace.</TooltipContent></Tooltip></TooltipProvider>
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
### Sides
|
|
@@ -89,5 +89,5 @@ import { Button, Tooltip, TooltipContent, TooltipTrigger } from "@sableui/react"
|
|
|
89
89
|
```tsx
|
|
90
90
|
import { Button, Icon, SimpleTooltip } from "@sableui/react"
|
|
91
91
|
|
|
92
|
-
<SimpleTooltip content="
|
|
92
|
+
<SimpleTooltip content="Saved to your workspace."><Button variant="ghost" size="icon-sm" aria-label="Info"><Icon name="info" /></Button></SimpleTooltip>
|
|
93
93
|
```
|