@sableui/react 0.9.1 → 0.10.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.
Files changed (212) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +95 -0
  3. package/CONTRIBUTING.md +2 -2
  4. package/DESIGN.md +55 -16
  5. package/README.md +12 -0
  6. package/dist/{_contract-C2M1SjBf.d.ts → _contract-CkqXDVww.d.ts} +25 -2
  7. package/dist/blocks/danger-zone-block.js +3 -3
  8. package/dist/blocks/danger-zone-block.meta.js +1 -1
  9. package/dist/blocks/faq-block.js +3 -3
  10. package/dist/blocks/goal-progress-block.js +1 -1
  11. package/dist/blocks/notification-list-block.js +1 -1
  12. package/dist/blocks/pricing-table-block.js +12 -12
  13. package/dist/blocks/product-card-block.js +3 -3
  14. package/dist/blocks/product-card-block.meta.js +3 -3
  15. package/dist/blocks/profile-card-block.js +1 -1
  16. package/dist/blocks/profile-form-block.js +3 -3
  17. package/dist/blocks/revenue-breakdown-block.js +5 -5
  18. package/dist/blocks/stat-row-block.js +3 -3
  19. package/dist/blocks/task-list-block.js +2 -2
  20. package/dist/blocks/team-members-block.js +1 -1
  21. package/dist/blocks/wallet-block.js +4 -4
  22. package/dist/blocks/wallet-block.meta.js +3 -3
  23. package/dist/components/accordion/accordion.meta.js +2 -2
  24. package/dist/components/app-header/app-header.meta.js +1 -1
  25. package/dist/components/app-shell/app-shell.meta.js +2 -2
  26. package/dist/components/area-chart/area-chart.meta.js +3 -3
  27. package/dist/components/badge/badge.js +13 -4
  28. package/dist/components/badge/badge.meta.js +24 -13
  29. package/dist/components/badge/badge.variants.js +37 -23
  30. package/dist/components/banner/banner.meta.js +8 -8
  31. package/dist/components/banner/banner.variants.js +3 -3
  32. package/dist/components/bar-chart/bar-chart.meta.js +4 -4
  33. package/dist/components/breadcrumbs/breadcrumbs.meta.js +1 -1
  34. package/dist/components/button/button.meta.js +3 -3
  35. package/dist/components/card/card.js +16 -7
  36. package/dist/components/card/card.meta.js +4 -4
  37. package/dist/components/checkbox-card/checkbox-card.meta.js +10 -10
  38. package/dist/components/checkbox-card/checkbox-card.variants.js +15 -15
  39. package/dist/components/code-block/code-block.meta.js +1 -1
  40. package/dist/components/command-menu/command-menu.meta.js +1 -1
  41. package/dist/components/context-card/context-card.meta.js +2 -2
  42. package/dist/components/destructive-action-modal/destructive-action-modal.meta.js +1 -1
  43. package/dist/components/dialog/dialog.meta.js +2 -2
  44. package/dist/components/disclosure-picker/disclosure-picker.js +48 -2
  45. package/dist/components/disclosure-picker/disclosure-picker.meta.js +3 -2
  46. package/dist/components/empty-state/empty-state.meta.js +4 -4
  47. package/dist/components/gradient-art/gradient-art.meta.js +3 -3
  48. package/dist/components/label/label.meta.js +1 -1
  49. package/dist/components/line-chart/line-chart.meta.js +3 -3
  50. package/dist/components/meter/meter.js +1 -1
  51. package/dist/components/meter/meter.meta.js +2 -2
  52. package/dist/components/meter/meter.variants.js +1 -1
  53. package/dist/components/middle-truncate/middle-truncate.meta.js +4 -4
  54. package/dist/components/note/note.meta.js +3 -3
  55. package/dist/components/page-header/page-header.js +1 -1
  56. package/dist/components/pagination/pagination.meta.js +2 -2
  57. package/dist/components/phone/phone.meta.js +1 -1
  58. package/dist/components/pie-chart/pie-chart.meta.js +3 -3
  59. package/dist/components/pill/pill.js +4 -2
  60. package/dist/components/pill/pill.meta.js +19 -2
  61. package/dist/components/pill/pill.variants.js +23 -2
  62. package/dist/components/popover/popover.meta.js +2 -2
  63. package/dist/components/radar-chart/radar-chart.meta.js +3 -3
  64. package/dist/components/radial-chart/radial-chart.meta.js +3 -3
  65. package/dist/components/radio/radio.meta.js +2 -2
  66. package/dist/components/radio-card/radio-card.meta.js +6 -6
  67. package/dist/components/radio-card/radio-card.variants.js +15 -15
  68. package/dist/components/scroller/scroller.meta.js +1 -1
  69. package/dist/components/search-input/search-input.meta.js +1 -1
  70. package/dist/components/section-header/section-header.js +1 -1
  71. package/dist/components/segmented-bar/segmented-bar.js +1 -1
  72. package/dist/components/segmented-bar/segmented-bar.meta.js +6 -6
  73. package/dist/components/segmented-bar/segmented-bar.variants.js +4 -4
  74. package/dist/components/select/select.meta.js +2 -2
  75. package/dist/components/sheet/sheet.meta.js +1 -1
  76. package/dist/components/side-nav/side-nav.meta.js +1 -1
  77. package/dist/components/sidebar/sidebar.meta.js +1 -1
  78. package/dist/components/sparkline/sparkline.meta.js +4 -4
  79. package/dist/components/spinner/spinner.meta.js +1 -1
  80. package/dist/components/status-dot/status-dot.js +4 -1
  81. package/dist/components/status-dot/status-dot.meta.js +8 -16
  82. package/dist/components/status-dot/status-dot.variants.js +13 -4
  83. package/dist/components/table/table.meta.js +4 -4
  84. package/dist/components/tabs/tabs.meta.js +1 -1
  85. package/dist/components/textarea/textarea.meta.js +2 -2
  86. package/dist/components/toast/toast.meta.js +1 -1
  87. package/dist/components/tooltip/tooltip.meta.js +2 -2
  88. package/dist/file-hashes.json +120 -118
  89. package/dist/foundations/spacing.js +8 -8
  90. package/dist/index.d.ts +137 -72
  91. package/dist/index.js +12 -1
  92. package/dist/lib/chart/types.js +3 -3
  93. package/dist/lib/palette.js +103 -0
  94. package/dist/lib/selection-card.js +4 -4
  95. package/dist/palette.css +669 -0
  96. package/dist/patterns/auth-page.js +6 -6
  97. package/dist/patterns/auth-page.meta.js +3 -3
  98. package/dist/patterns/brand-landing-page.js +2 -2
  99. package/dist/patterns/chat-panel.js +2 -2
  100. package/dist/patterns/dashboard-page.js +71 -71
  101. package/dist/patterns/dashboard-page.meta.js +5 -5
  102. package/dist/patterns/feed-page.js +25 -25
  103. package/dist/patterns/feed-page.meta.js +3 -3
  104. package/dist/patterns/landing-page.js +1 -1
  105. package/dist/patterns/list-detail-page.js +17 -17
  106. package/dist/patterns/settings-page.js +17 -17
  107. package/dist/presets/index.d.ts +1 -1
  108. package/dist/presets/index.js +17 -2
  109. package/dist/styles.css +115 -50
  110. package/dist/{theme-provider-S0NVJs2Y.d.ts → theme-provider-CdSicAad.d.ts} +1 -1
  111. package/dist/themes/_contract.js +22 -8
  112. package/dist/themes/atelier/atelier.css +13 -13
  113. package/dist/themes/atelier/index.d.ts +1 -1
  114. package/dist/themes/ember/ember.css +13 -13
  115. package/dist/themes/ember/index.d.ts +1 -1
  116. package/dist/themes/index.d.ts +2 -2
  117. package/dist/themes/meridian/index.d.ts +1 -1
  118. package/dist/themes/meridian/meridian.css +13 -13
  119. package/dist/themes/poppy/index.d.ts +1 -1
  120. package/dist/themes/poppy/poppy.css +19 -16
  121. package/dist/themes/prism/index.d.ts +1 -1
  122. package/dist/themes/prism/prism.css +18 -15
  123. package/dist/themes/sable/index.d.ts +1 -1
  124. package/dist/themes/sable/sable.css +18 -22
  125. package/dist/themes/verdant/index.d.ts +1 -1
  126. package/dist/themes/verdant/verdant.css +15 -15
  127. package/llms/blocks/danger-zone-block.md +4 -4
  128. package/llms/blocks/faq-block.md +3 -3
  129. package/llms/blocks/goal-progress-block.md +1 -1
  130. package/llms/blocks/notification-list-block.md +1 -1
  131. package/llms/blocks/pricing-table-block.md +12 -12
  132. package/llms/blocks/product-card-block.md +6 -6
  133. package/llms/blocks/profile-card-block.md +1 -1
  134. package/llms/blocks/profile-form-block.md +3 -3
  135. package/llms/blocks/revenue-breakdown-block.md +5 -5
  136. package/llms/blocks/stat-row-block.md +3 -3
  137. package/llms/blocks/task-list-block.md +2 -2
  138. package/llms/blocks/team-members-block.md +1 -1
  139. package/llms/blocks/wallet-block.md +7 -7
  140. package/llms/components/accordion.md +2 -2
  141. package/llms/components/app-header.md +1 -1
  142. package/llms/components/app-shell.md +2 -2
  143. package/llms/components/area-chart.md +1 -1
  144. package/llms/components/badge.md +15 -7
  145. package/llms/components/banner.md +6 -6
  146. package/llms/components/bar-chart.md +2 -2
  147. package/llms/components/breadcrumbs.md +1 -1
  148. package/llms/components/button.md +3 -3
  149. package/llms/components/card.md +4 -4
  150. package/llms/components/checkbox-card.md +5 -5
  151. package/llms/components/code-block.md +1 -1
  152. package/llms/components/command-menu.md +1 -1
  153. package/llms/components/context-card.md +2 -2
  154. package/llms/components/destructive-action-modal.md +1 -1
  155. package/llms/components/dialog.md +2 -2
  156. package/llms/components/disclosure-picker.md +2 -1
  157. package/llms/components/empty-state.md +4 -4
  158. package/llms/components/gradient-art.md +3 -3
  159. package/llms/components/label.md +1 -1
  160. package/llms/components/line-chart.md +1 -1
  161. package/llms/components/meter.md +2 -2
  162. package/llms/components/middle-truncate.md +5 -5
  163. package/llms/components/note.md +3 -3
  164. package/llms/components/pagination.md +2 -2
  165. package/llms/components/phone.md +1 -1
  166. package/llms/components/pie-chart.md +1 -1
  167. package/llms/components/pill.md +12 -2
  168. package/llms/components/popover.md +2 -2
  169. package/llms/components/radar-chart.md +1 -1
  170. package/llms/components/radial-chart.md +1 -1
  171. package/llms/components/radio-card.md +4 -4
  172. package/llms/components/radio.md +2 -2
  173. package/llms/components/scroller.md +1 -1
  174. package/llms/components/search-input.md +1 -1
  175. package/llms/components/segmented-bar.md +7 -7
  176. package/llms/components/select.md +2 -2
  177. package/llms/components/sheet.md +1 -1
  178. package/llms/components/side-nav.md +1 -1
  179. package/llms/components/sidebar.md +1 -1
  180. package/llms/components/sparkline.md +2 -2
  181. package/llms/components/spinner.md +1 -1
  182. package/llms/components/status-dot.md +4 -4
  183. package/llms/components/table.md +8 -8
  184. package/llms/components/tabs.md +1 -1
  185. package/llms/components/textarea.md +2 -2
  186. package/llms/components/toast.md +1 -1
  187. package/llms/components/tooltip.md +2 -2
  188. package/llms/foundations/spacing.md +7 -7
  189. package/llms/layout/grid.md +1 -1
  190. package/llms/layout/page.md +1 -1
  191. package/llms/layout/region.md +1 -1
  192. package/llms/layout/split-pane.md +1 -1
  193. package/llms/patterns/auth-page.md +11 -11
  194. package/llms/patterns/brand-landing-page.md +2 -2
  195. package/llms/patterns/chat-panel.md +2 -2
  196. package/llms/patterns/dashboard-page.md +78 -78
  197. package/llms/patterns/feed-page.md +31 -31
  198. package/llms/patterns/landing-page.md +1 -1
  199. package/llms/patterns/list-detail-page.md +18 -18
  200. package/llms/patterns/settings-page.md +18 -18
  201. package/llms/reference/token-intent.md +25 -11
  202. package/llms/reference/utilities.md +1 -1
  203. package/llms/tasks/adding-a-component.md +4 -1
  204. package/llms/tasks/building-a-page.md +40 -0
  205. package/llms/tasks/converting-an-app.md +3 -1
  206. package/llms/tasks/using-presets.md +4 -0
  207. package/llms-full.txt +429 -347
  208. package/llms.txt +7 -7
  209. package/package.json +4 -4
  210. package/registry.json +369 -233
  211. package/scripts/lint-rules.mjs +26 -5
  212. package/skills/sable/SKILL.md +14 -3
@@ -1,5 +1,6 @@
1
1
  // src/components/pill/pill.variants.ts
2
2
  import { cva } from "class-variance-authority";
3
+ import { PALETTE_COLORS } from "../../lib/palette.js";
3
4
  var pillVariants = cva(
4
5
  /*
5
6
  * The asymmetric `pt-[0.23em] pb-[0.1em]` is the LEGACY optical correction: a
@@ -31,6 +32,20 @@ var pillVariants = cva(
31
32
  selected: {
32
33
  true: "",
33
34
  false: ""
35
+ },
36
+ // `neutral` is the chip as described above. A palette family is a
37
+ // category colour (a tag someone picks): the chip paints from the slots
38
+ // its data-palette scope fills, so no step is named here.
39
+ tone: {
40
+ neutral: "",
41
+ red: "",
42
+ orange: "",
43
+ yellow: "",
44
+ green: "",
45
+ teal: "",
46
+ blue: "",
47
+ purple: "",
48
+ pink: ""
34
49
  }
35
50
  },
36
51
  compoundVariants: [
@@ -51,12 +66,18 @@ var pillVariants = cva(
51
66
  // Transparent on whatever it sits on; the hover is derived from that
52
67
  // surface (sable-surface-interactive), not a fixed accent fill.
53
68
  class: "border-border text-muted-foreground sable-surface-interactive"
54
- }
69
+ },
70
+ // After the neutral looks, so cn's merge lets these win.
71
+ { appearance: "solid", selected: false, tone: [...PALETTE_COLORS], class: "bg-palette-wash text-palette-text hover:bg-palette-wash-strong hover:text-palette-text" },
72
+ { appearance: "solid", selected: true, tone: [...PALETTE_COLORS], class: "bg-palette-solid text-palette-solid-ink hover:bg-palette-solid" },
73
+ { appearance: "outline", selected: false, tone: [...PALETTE_COLORS], class: "border-palette-edge text-palette-text" },
74
+ { appearance: "outline", selected: true, tone: [...PALETTE_COLORS], class: "border-palette-edge bg-palette-wash text-palette-text hover:bg-palette-wash-strong" }
55
75
  ],
56
76
  defaultVariants: {
57
77
  appearance: "solid",
58
78
  size: "md",
59
- selected: false
79
+ selected: false,
80
+ tone: "neutral"
60
81
  }
61
82
  }
62
83
  );
@@ -123,11 +123,11 @@ var popoverMeta = {
123
123
  examples: [
124
124
  {
125
125
  label: "Basic",
126
- code: '<Popover><PopoverTrigger render={<Button variant="secondary">Details</Button>} /><PopoverContent><PopoverTitle>Edition details</PopoverTitle><PopoverDescription>A limited run of 100, stored permanently on Arweave.</PopoverDescription></PopoverContent></Popover>'
126
+ code: '<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>'
127
127
  },
128
128
  {
129
129
  label: "With close",
130
- code: '<Popover><PopoverTrigger render={<Button variant="secondary">Open</Button>} /><PopoverContent><PopoverTitle>Heads up</PopoverTitle><PopoverDescription>Collecting mints a compressed NFT to your wallet.</PopoverDescription><PopoverClose render={<Button size="sm">Got it</Button>} /></PopoverContent></Popover>'
130
+ code: '<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>'
131
131
  }
132
132
  ]
133
133
  };
@@ -144,9 +144,9 @@ var radarChartMeta = {
144
144
  }
145
145
  ],
146
146
  tokensUsed: [
147
- "tone-edition",
148
- "tone-collectible",
149
- "tone-standard",
147
+ "tone-1",
148
+ "tone-2",
149
+ "tone-3",
150
150
  "tone-info",
151
151
  "tone-warning",
152
152
  "primary",
@@ -156,9 +156,9 @@ var radialChartMeta = {
156
156
  }
157
157
  ],
158
158
  tokensUsed: [
159
- "tone-edition",
160
- "tone-collectible",
161
- "tone-standard",
159
+ "tone-1",
160
+ "tone-2",
161
+ "tone-3",
162
162
  "tone-info",
163
163
  "tone-warning",
164
164
  "primary",
@@ -80,7 +80,7 @@ var radioMeta = {
80
80
  <FieldsetContent>
81
81
  <RadioGroup defaultValue="standard">
82
82
  <Field label="Standard" orientation="horizontal"><Radio value="standard" /></Field>
83
- <Field label="Edition" orientation="horizontal"><Radio value="edition" /></Field>
83
+ <Field label="Poll" orientation="horizontal"><Radio value="poll" /></Field>
84
84
  </RadioGroup>
85
85
  </FieldsetContent>
86
86
  </Fieldset>`
@@ -92,7 +92,7 @@ var radioMeta = {
92
92
  <FieldsetContent>
93
93
  <RadioGroup defaultValue="standard">
94
94
  <Field label="Standard" orientation="horizontal"><Radio value="standard" /></Field>
95
- <Field label="Edition" orientation="horizontal" disabled><Radio value="edition" /></Field>
95
+ <Field label="Poll" orientation="horizontal" disabled><Radio value="poll" /></Field>
96
96
  </RadioGroup>
97
97
  </FieldsetContent>
98
98
  </Fieldset>`
@@ -77,7 +77,7 @@ var radioCardMeta = {
77
77
  },
78
78
  {
79
79
  name: "tone",
80
- type: '"neutral" | "standard" | "collectible" | "edition" | "info" | "warning"',
80
+ type: '"neutral" | "3" | "2" | "1" | "info" | "warning"',
81
81
  default: '"neutral"',
82
82
  description: "Semantic colour the selected state carries across the border, radio, and icon glyph. Neutral uses the primary ring with a muted wash."
83
83
  },
@@ -106,7 +106,7 @@ var radioCardMeta = {
106
106
  }
107
107
  ],
108
108
  variants: {
109
- tone: ["neutral", "standard", "collectible", "edition", "info", "warning"]
109
+ tone: ["neutral", "3", "2", "1", "info", "warning"]
110
110
  },
111
111
  tokensUsed: [
112
112
  "input",
@@ -116,9 +116,9 @@ var radioCardMeta = {
116
116
  "muted",
117
117
  "ring",
118
118
  "muted-foreground",
119
- "tone-standard",
120
- "tone-collectible",
121
- "tone-edition",
119
+ "tone-3",
120
+ "tone-2",
121
+ "tone-1",
122
122
  "tone-info",
123
123
  "tone-warning"
124
124
  ],
@@ -132,7 +132,7 @@ var radioCardMeta = {
132
132
  examples: [
133
133
  {
134
134
  label: "Post type (tone + icon)",
135
- code: '<RadioGroup defaultValue="post" className="grid sm:grid-cols-3"><RadioCard value="post" tone="standard" icon={<Icon name="plus" />} title="Standard" description="Share without minting" /><RadioCard value="collectible" tone="collectible" icon={<Icon name="gem" />} title="Collectible" description="Free to collect as NFT" /><RadioCard value="edition" tone="edition" icon={<Icon name="image-stack" />} title="Edition" description="Sell as NFT editions" /></RadioGroup>'
135
+ code: '<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>'
136
136
  },
137
137
  {
138
138
  label: "Plan picker (plain)",
@@ -7,23 +7,23 @@ var radioCardToneClasses = {
7
7
  dot: "bg-primary",
8
8
  glyph: "text-foreground"
9
9
  },
10
- standard: {
11
- card: SELECTION_CARD_CHECKED.standard,
12
- marker: "group-data-[checked]:border-tone-standard",
13
- dot: "bg-tone-standard",
14
- glyph: "text-tone-standard"
10
+ "3": {
11
+ card: SELECTION_CARD_CHECKED["3"],
12
+ marker: "group-data-[checked]:border-tone-3",
13
+ dot: "bg-tone-3",
14
+ glyph: "text-tone-3"
15
15
  },
16
- collectible: {
17
- card: SELECTION_CARD_CHECKED.collectible,
18
- marker: "group-data-[checked]:border-tone-collectible",
19
- dot: "bg-tone-collectible",
20
- glyph: "text-tone-collectible"
16
+ "2": {
17
+ card: SELECTION_CARD_CHECKED["2"],
18
+ marker: "group-data-[checked]:border-tone-2",
19
+ dot: "bg-tone-2",
20
+ glyph: "text-tone-2"
21
21
  },
22
- edition: {
23
- card: SELECTION_CARD_CHECKED.edition,
24
- marker: "group-data-[checked]:border-tone-edition",
25
- dot: "bg-tone-edition",
26
- glyph: "text-tone-edition"
22
+ "1": {
23
+ card: SELECTION_CARD_CHECKED["1"],
24
+ marker: "group-data-[checked]:border-tone-1",
25
+ dot: "bg-tone-1",
26
+ glyph: "text-tone-1"
27
27
  },
28
28
  info: {
29
29
  card: SELECTION_CARD_CHECKED.info,
@@ -97,7 +97,7 @@ var scrollerMeta = {
97
97
  examples: [
98
98
  {
99
99
  label: "Vertical with overflow",
100
- code: '<Scroller label="Editions" 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>'
100
+ code: '<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>'
101
101
  },
102
102
  {
103
103
  label: "Capped, scrolls past the cap",
@@ -116,7 +116,7 @@ var searchInputMeta = {
116
116
  },
117
117
  {
118
118
  label: "Uncontrolled, sized as a whole",
119
- code: '<Field label="Search posts"><SearchInput defaultValue="editions" className="max-w-80" /></Field>'
119
+ code: '<Field label="Search posts"><SearchInput defaultValue="roadmap" className="max-w-80" /></Field>'
120
120
  },
121
121
  {
122
122
  label: "Disabled",
@@ -18,7 +18,7 @@ function SectionHeader({
18
18
  ...props
19
19
  }) {
20
20
  const generatedId = useId();
21
- return /* @__PURE__ */ jsxs("div", { "data-slot": "section-header", className: cn("flex flex-col gap-1", className), ...props, children: [
21
+ return /* @__PURE__ */ jsxs("div", { "data-slot": "section-header", className: cn("flex flex-col gap-2", className), ...props, children: [
22
22
  /* @__PURE__ */ jsx(
23
23
  HeadingRow,
24
24
  {
@@ -2,7 +2,7 @@
2
2
  import { cn } from "../../lib/cn.js";
3
3
  import { segmentedBarSegmentVariants, segmentedBarVariants } from "./segmented-bar.variants.js";
4
4
  import { jsx } from "react/jsx-runtime";
5
- var SEGMENTED_BAR_TONES = ["edition", "collectible", "standard", "info", "primary", "neutral"];
5
+ var SEGMENTED_BAR_TONES = ["1", "2", "3", "info", "primary", "neutral"];
6
6
  function SegmentedBar({ segments, label, locale, size, className, ...props }) {
7
7
  const total = segments.reduce((sum, s) => sum + Math.max(0, s.value), 0);
8
8
  const percent = new Intl.NumberFormat(locale, { style: "percent", maximumFractionDigits: 0 });
@@ -59,12 +59,12 @@ var segmentedBarMeta = {
59
59
  ],
60
60
  variants: {
61
61
  size: ["sm", "md", "lg"],
62
- tone: ["edition", "collectible", "standard", "info", "primary", "neutral", "success", "warning", "destructive"]
62
+ tone: ["1", "2", "3", "info", "primary", "neutral", "success", "warning", "destructive"]
63
63
  },
64
64
  tokensUsed: [
65
- "tone-edition",
66
- "tone-collectible",
67
- "tone-standard",
65
+ "tone-1",
66
+ "tone-2",
67
+ "tone-3",
68
68
  "tone-info",
69
69
  "primary",
70
70
  "muted-foreground",
@@ -89,13 +89,13 @@ var segmentedBarMeta = {
89
89
  { slot: "activity", recipe: "none", part: "SegmentedBar", why: "No indeterminate state \u2014 an unknown breakdown is not drawn." }
90
90
  ],
91
91
  a11y: [
92
- 'Rendered role=img with an aria-label built from `label` and each segment\'s share ("Revenue by type: Editions 42%, Collectibles 27%"), so the whole breakdown is read in one stop.',
92
+ '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.',
93
93
  "Colour alone does not identify a segment: always show a legend with each segment's label beside the bar."
94
94
  ],
95
95
  examples: [
96
96
  {
97
97
  label: "With a legend",
98
- code: 'const sales = [\n { label: "Editions", value: 42, tone: "edition" },\n { label: "Collectibles", value: 27, tone: "collectible" },\n { label: "Standard", value: 19, tone: "standard" },\n] as const\n\n<Stack gap={3}>\n <SegmentedBar label="Revenue by type" segments={[...sales]} size="lg" />\n <ul className="flex flex-col gap-1.5">\n {sales.map((s) => (\n <li key={s.label} className="flex items-center gap-2 text-body-sm">\n <StatusDot tone={s.tone} />\n <span className="flex-1 text-muted-foreground">{s.label}</span>\n <span className="text-mono-caption">{s.value}%</span>\n </li>\n ))}\n </ul>\n</Stack>'
98
+ code: 'const sales = [\n { label: "Direct", value: 42, tone: "1" },\n { label: "Partners", value: 27, tone: "2" },\n { label: "Referrals", value: 19, tone: "3" },\n] as const\n\n<Stack gap={3}>\n <SegmentedBar label="Revenue by channel" segments={[...sales]} size="lg" />\n <ul className="flex flex-col gap-1.5">\n {sales.map((s) => (\n <li key={s.label} className="flex items-center gap-2 text-body-sm">\n <StatusDot tone={s.tone} />\n <span className="flex-1 text-muted-foreground">{s.label}</span>\n <span className="text-mono-caption">{s.value}%</span>\n </li>\n ))}\n </ul>\n</Stack>'
99
99
  },
100
100
  {
101
101
  label: "Test results \u2014 status tones",
@@ -5,9 +5,9 @@ var segmentedBarSegmentVariants = cva(
5
5
  {
6
6
  variants: {
7
7
  tone: {
8
- edition: "bg-tone-edition",
9
- collectible: "bg-tone-collectible",
10
- standard: "bg-tone-standard",
8
+ "1": "bg-tone-1",
9
+ "2": "bg-tone-2",
10
+ "3": "bg-tone-3",
11
11
  info: "bg-tone-info",
12
12
  primary: "bg-primary",
13
13
  neutral: "bg-muted-foreground",
@@ -17,7 +17,7 @@ var segmentedBarSegmentVariants = cva(
17
17
  }
18
18
  },
19
19
  defaultVariants: {
20
- tone: "standard"
20
+ tone: "3"
21
21
  }
22
22
  }
23
23
  );
@@ -176,11 +176,11 @@ var selectMeta = {
176
176
  },
177
177
  {
178
178
  label: "Inside Field",
179
- code: '<Field label="Default visibility" description="Controls how new editions 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>'
179
+ code: '<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>'
180
180
  },
181
181
  {
182
182
  label: "Rich item labels",
183
- code: '<Select defaultValue="edition" items={[{ value: "edition", label: "Edition" }, { value: "collectible", label: "Collectible" }]}><SelectTrigger /><SelectContent><SelectItem value="edition" label="Edition"><span className="flex items-center gap-2"><Badge tone="edition">Edition</Badge><span>Edition drop</span></span></SelectItem><SelectItem value="collectible" label="Collectible"><span className="flex items-center gap-2"><Badge tone="collectible">Collectible</Badge><span>Collectible</span></span></SelectItem></SelectContent></Select>'
183
+ code: '<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>'
184
184
  }
185
185
  ]
186
186
  };
@@ -158,7 +158,7 @@ var sheetMeta = {
158
158
  },
159
159
  {
160
160
  label: "Bottom side",
161
- code: '<Sheet><SheetTrigger render={<Button variant="secondary">Details</Button>} /><SheetContent side="bottom"><SheetHeader><SheetTitle>Edition details</SheetTitle></SheetHeader><SheetFooter><SheetClose render={<Button variant="secondary">Close</Button>} /></SheetFooter></SheetContent></Sheet>'
161
+ code: '<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>'
162
162
  }
163
163
  ]
164
164
  };
@@ -122,7 +122,7 @@ var sideNavMeta = {
122
122
  },
123
123
  {
124
124
  label: "Chrome-weight rail (size=lg)",
125
- code: '<SideNav size="lg"><SideNavItem label="Profile" active render={<Link to="/settings/profile" />} /><SideNavItem label="Wallets" render={<Link to="/settings/wallets" />} /><SideNavItem label="Security" render={<Link to="/settings/security" />} /></SideNav>'
125
+ code: '<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>'
126
126
  },
127
127
  {
128
128
  label: "Inside Sidebar chrome",
@@ -106,7 +106,7 @@ var sidebarMeta = {
106
106
  examples: [
107
107
  {
108
108
  label: "Rail with nav",
109
- code: '<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>{wallet}</SidebarFooter></Sidebar>'
109
+ code: '<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>'
110
110
  },
111
111
  {
112
112
  label: "Collapsible (icon rail)",
@@ -60,7 +60,7 @@ var sparklineMeta = {
60
60
  },
61
61
  {
62
62
  name: "tone",
63
- type: '"edition" | "collectible" | "standard" | "info" | "warning" | "primary" | "neutral" | "success" | "destructive"',
63
+ type: '"1" | "2" | "3" | "info" | "warning" | "primary" | "neutral" | "success" | "destructive"',
64
64
  default: '"primary"',
65
65
  description: "Colour by role."
66
66
  },
@@ -92,9 +92,9 @@ var sparklineMeta = {
92
92
  },
93
93
  tokensUsed: [
94
94
  "primary",
95
- "tone-edition",
96
- "tone-collectible",
97
- "tone-standard",
95
+ "tone-1",
96
+ "tone-2",
97
+ "tone-3",
98
98
  "tone-info",
99
99
  "tone-warning",
100
100
  "muted-foreground",
@@ -109,7 +109,7 @@ var spinnerMeta = {
109
109
  },
110
110
  {
111
111
  label: "Inside a button (Button owns it \u2014 use loading)",
112
- code: "<Button loading>Collecting</Button>"
112
+ code: "<Button loading>Saving</Button>"
113
113
  }
114
114
  ]
115
115
  };
@@ -1,5 +1,6 @@
1
1
  // src/components/status-dot/status-dot.tsx
2
2
  import { cn } from "../../lib/cn.js";
3
+ import { isPaletteColor } from "../../lib/palette.js";
3
4
  import { statusDotVariants } from "./status-dot.variants.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  function StatusDot({
@@ -10,11 +11,13 @@ function StatusDot({
10
11
  ...props
11
12
  }) {
12
13
  const dot = statusDotVariants({ tone, size });
14
+ const palette = isPaletteColor(tone) ? tone : void 0;
13
15
  if (pulse) {
14
16
  return /* @__PURE__ */ jsxs(
15
17
  "span",
16
18
  {
17
19
  "aria-hidden": "true",
20
+ "data-palette": palette,
18
21
  className: cn("relative inline-flex shrink-0", className),
19
22
  ...props,
20
23
  children: [
@@ -32,7 +35,7 @@ function StatusDot({
32
35
  }
33
36
  );
34
37
  }
35
- return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn(dot, className), ...props });
38
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", "data-palette": palette, className: cn(dot, className), ...props });
36
39
  }
37
40
  StatusDot.displayName = "StatusDot";
38
41
  export {
@@ -53,9 +53,9 @@ var statusDotMeta = {
53
53
  props: [
54
54
  {
55
55
  name: "tone",
56
- type: '"neutral" | "standard" | "success" | "warning" | "info" | "edition" | "collectible" | "destructive"',
56
+ type: '"neutral" | "1" | "2" | "3" | "success" | "warning" | "info" | "destructive" | "red" | "orange" | "yellow" | "green" | "teal" | "blue" | "purple" | "pink"',
57
57
  default: '"neutral"',
58
- description: "Semantic color of the dot."
58
+ description: "Semantic color of the dot, or a palette family (red \u2026 pink) for a category legend."
59
59
  },
60
60
  {
61
61
  name: "size",
@@ -71,26 +71,18 @@ var statusDotMeta = {
71
71
  }
72
72
  ],
73
73
  variants: {
74
- tone: [
75
- "neutral",
76
- "standard",
77
- "success",
78
- "warning",
79
- "info",
80
- "edition",
81
- "collectible",
82
- "destructive"
83
- ],
74
+ tone: ["neutral", "1", "2", "3", "success", "warning", "info", "destructive", "red", "orange", "yellow", "green", "teal", "blue", "purple", "pink"],
84
75
  size: ["sm", "md", "lg"]
85
76
  },
86
77
  tokensUsed: [
78
+ "palette-dot",
87
79
  "muted-foreground",
88
- "tone-standard",
80
+ "tone-3",
89
81
  "success",
90
82
  "tone-warning",
91
83
  "tone-info",
92
- "tone-edition",
93
- "tone-collectible",
84
+ "tone-1",
85
+ "tone-2",
94
86
  "destructive"
95
87
  ],
96
88
  a11y: [
@@ -100,7 +92,7 @@ var statusDotMeta = {
100
92
  examples: [
101
93
  {
102
94
  label: "Tones",
103
- code: '<Row gap={2}><StatusDot tone="standard" /><StatusDot tone="info" /><StatusDot tone="warning" /><StatusDot tone="destructive" /></Row>'
95
+ code: '<Row gap={2}><StatusDot tone="3" /><StatusDot tone="info" /><StatusDot tone="warning" /><StatusDot tone="destructive" /></Row>'
104
96
  },
105
97
  {
106
98
  label: "With label \u2014 use Badge",
@@ -4,13 +4,22 @@ var statusDotVariants = cva("inline-block shrink-0 rounded-full", {
4
4
  variants: {
5
5
  tone: {
6
6
  neutral: "bg-muted-foreground",
7
- standard: "bg-tone-standard",
7
+ "3": "bg-tone-3",
8
8
  success: "bg-success",
9
9
  warning: "bg-tone-warning",
10
10
  info: "bg-tone-info",
11
- edition: "bg-tone-edition",
12
- collectible: "bg-tone-collectible",
13
- destructive: "bg-destructive"
11
+ "1": "bg-tone-1",
12
+ "2": "bg-tone-2",
13
+ destructive: "bg-destructive",
14
+ // A palette family paints from the slot its data-palette scope fills.
15
+ red: "bg-palette-dot",
16
+ orange: "bg-palette-dot",
17
+ yellow: "bg-palette-dot",
18
+ green: "bg-palette-dot",
19
+ teal: "bg-palette-dot",
20
+ blue: "bg-palette-dot",
21
+ purple: "bg-palette-dot",
22
+ pink: "bg-palette-dot"
14
23
  },
15
24
  size: {
16
25
  sm: "size-1.5",
@@ -121,8 +121,8 @@ var tableMeta = {
121
121
  ],
122
122
  examples: [
123
123
  {
124
- label: "Collectors",
125
- code: "<Table>\n <TableCaption>Recent collectors</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead>Collector</TableHead>\n <TableHead>Edition</TableHead>\n <TableHead>Paid</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell>@nova</TableCell>\n <TableCell>#012</TableCell>\n <TableCell>0.5 SOL</TableCell>\n </TableRow>\n </TableBody>\n</Table>"
124
+ label: "Orders",
125
+ code: "<Table>\n <TableCaption>Recent orders</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead>Customer</TableHead>\n <TableHead>Order</TableHead>\n <TableHead>Paid</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow>\n <TableCell>@nova</TableCell>\n <TableCell>1042</TableCell>\n <TableCell>$48.00</TableCell>\n </TableRow>\n </TableBody>\n</Table>"
126
126
  },
127
127
  {
128
128
  label: "Rich status cells",
@@ -130,11 +130,11 @@ var tableMeta = {
130
130
  },
131
131
  {
132
132
  label: "Flush in a card",
133
- code: "<Card><CardHeader><CardTitle>Collectors</CardTitle></CardHeader><CardContent flush><Table><TableHeader><TableRow><TableHead>Collector</TableHead><TableHead>Paid</TableHead></TableRow></TableHeader><TableBody><TableRow><TableCell>@nova</TableCell><TableCell>0.5 SOL</TableCell></TableRow></TableBody></Table></CardContent></Card>"
133
+ code: "<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>"
134
134
  },
135
135
  {
136
136
  label: "Summary footer",
137
- code: '<Table><TableHeader><TableRow><TableHead>Item</TableHead><TableHead className="text-end">Amount</TableHead></TableRow></TableHeader><TableBody><TableRow><TableCell>Primary sale</TableCell><TableCell className="text-end">42 SOL</TableCell></TableRow></TableBody><TableFooter><TableRow><TableCell>Total</TableCell><TableCell className="text-end">42 SOL</TableCell></TableRow></TableFooter></Table>'
137
+ code: '<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>'
138
138
  }
139
139
  ]
140
140
  };
@@ -111,7 +111,7 @@ var tabsMeta = {
111
111
  },
112
112
  {
113
113
  label: "With a disabled tab",
114
- code: '<Tabs defaultValue="overview"><TabsList><TabsTrigger value="overview">Overview</TabsTrigger><TabsTrigger value="holders" disabled>Holders</TabsTrigger></TabsList><TabsPanel value="overview">Overview content</TabsPanel></Tabs>'
114
+ code: '<Tabs defaultValue="overview"><TabsList><TabsTrigger value="overview">Overview</TabsTrigger><TabsTrigger value="billing" disabled>Billing</TabsTrigger></TabsList><TabsPanel value="overview">Overview content</TabsPanel></Tabs>'
115
115
  }
116
116
  ]
117
117
  };
@@ -96,7 +96,7 @@ var textareaMeta = {
96
96
  },
97
97
  {
98
98
  label: "With rows",
99
- code: '<Textarea rows={6} placeholder="Tell the story behind this edition\u2026" />'
99
+ code: '<Textarea rows={6} placeholder="Tell your team what this project is for\u2026" />'
100
100
  },
101
101
  {
102
102
  label: "Auto-resize",
@@ -108,7 +108,7 @@ var textareaMeta = {
108
108
  },
109
109
  {
110
110
  label: "Disabled",
111
- code: '<Textarea disabled defaultValue="Captions lock once the edition is minted." />'
111
+ code: '<Textarea disabled defaultValue="Notes lock once the invoice is sent." />'
112
112
  }
113
113
  ]
114
114
  };
@@ -236,7 +236,7 @@ var toastMeta = {
236
236
  },
237
237
  {
238
238
  label: "Persistent loading, updated in place",
239
- code: 'const id = toast.loading("Pinning to Arweave\u2026"); /* later */ toast.update(id, { title: "Pinned", type: "success", timeout: 4000 })'
239
+ code: 'const id = toast.loading("Uploading report\u2026"); /* later */ toast.update(id, { title: "Uploaded", type: "success", timeout: 4000 })'
240
240
  },
241
241
  {
242
242
  label: "Custom toast markup (composed parts)",
@@ -139,7 +139,7 @@ var tooltipMeta = {
139
139
  examples: [
140
140
  {
141
141
  label: "Basic",
142
- code: '<TooltipProvider><Tooltip><TooltipTrigger render={<Button variant="ghost" size="icon-sm" aria-label="Info"><Icon name="info" /></Button>} /><TooltipContent>Stored permanently on Arweave.</TooltipContent></Tooltip></TooltipProvider>'
142
+ code: '<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>'
143
143
  },
144
144
  {
145
145
  label: "Sides",
@@ -147,7 +147,7 @@ var tooltipMeta = {
147
147
  },
148
148
  {
149
149
  label: "Shorthand (SimpleTooltip)",
150
- code: '<SimpleTooltip content="Stored permanently on Arweave."><Button variant="ghost" size="icon-sm" aria-label="Info"><Icon name="info" /></Button></SimpleTooltip>'
150
+ code: '<SimpleTooltip content="Saved to your workspace."><Button variant="ghost" size="icon-sm" aria-label="Info"><Icon name="info" /></Button></SimpleTooltip>'
151
151
  }
152
152
  ]
153
153
  };