@sableui/react 0.9.0 → 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 (221) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +124 -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.js +13 -2
  35. package/dist/components/button/button.meta.js +3 -3
  36. package/dist/components/card/card.js +16 -7
  37. package/dist/components/card/card.meta.js +4 -4
  38. package/dist/components/checkbox-card/checkbox-card.meta.js +10 -10
  39. package/dist/components/checkbox-card/checkbox-card.variants.js +15 -15
  40. package/dist/components/code-block/code-block.meta.js +1 -1
  41. package/dist/components/command-menu/command-menu.js +2 -0
  42. package/dist/components/command-menu/command-menu.meta.js +1 -1
  43. package/dist/components/context-card/context-card.meta.js +2 -2
  44. package/dist/components/destructive-action-modal/destructive-action-modal.meta.js +1 -1
  45. package/dist/components/dialog/dialog.meta.js +2 -2
  46. package/dist/components/disclosure-picker/disclosure-picker.js +48 -2
  47. package/dist/components/disclosure-picker/disclosure-picker.meta.js +3 -2
  48. package/dist/components/empty-state/empty-state.meta.js +4 -4
  49. package/dist/components/form/form.js +10 -5
  50. package/dist/components/gradient-art/gradient-art.meta.js +3 -3
  51. package/dist/components/label/label.meta.js +1 -1
  52. package/dist/components/line-chart/line-chart.meta.js +3 -3
  53. package/dist/components/meter/meter.js +1 -1
  54. package/dist/components/meter/meter.meta.js +2 -2
  55. package/dist/components/meter/meter.variants.js +1 -1
  56. package/dist/components/middle-truncate/middle-truncate.meta.js +4 -4
  57. package/dist/components/note/note.meta.js +3 -3
  58. package/dist/components/page-header/page-header.js +1 -1
  59. package/dist/components/pagination/pagination.meta.js +2 -2
  60. package/dist/components/phone/phone.meta.js +1 -1
  61. package/dist/components/pie-chart/pie-chart.meta.js +3 -3
  62. package/dist/components/pill/pill.js +4 -2
  63. package/dist/components/pill/pill.meta.js +19 -2
  64. package/dist/components/pill/pill.variants.js +23 -2
  65. package/dist/components/popover/popover.meta.js +2 -2
  66. package/dist/components/radar-chart/radar-chart.meta.js +3 -3
  67. package/dist/components/radial-chart/radial-chart.meta.js +3 -3
  68. package/dist/components/radio/radio.meta.js +2 -2
  69. package/dist/components/radio-card/radio-card.meta.js +6 -6
  70. package/dist/components/radio-card/radio-card.variants.js +15 -15
  71. package/dist/components/scroller/scroller.meta.js +1 -1
  72. package/dist/components/search-input/search-input.meta.js +1 -1
  73. package/dist/components/section-header/section-header.js +1 -1
  74. package/dist/components/segmented-bar/segmented-bar.js +1 -1
  75. package/dist/components/segmented-bar/segmented-bar.meta.js +6 -6
  76. package/dist/components/segmented-bar/segmented-bar.variants.js +4 -4
  77. package/dist/components/select/select.meta.js +2 -2
  78. package/dist/components/sheet/sheet.js +15 -1
  79. package/dist/components/sheet/sheet.meta.js +1 -1
  80. package/dist/components/side-nav/side-nav.meta.js +1 -1
  81. package/dist/components/sidebar/sidebar.meta.js +1 -1
  82. package/dist/components/sparkline/sparkline.meta.js +4 -4
  83. package/dist/components/spinner/spinner.meta.js +1 -1
  84. package/dist/components/status-dot/status-dot.js +4 -1
  85. package/dist/components/status-dot/status-dot.meta.js +8 -16
  86. package/dist/components/status-dot/status-dot.variants.js +13 -4
  87. package/dist/components/stepper/stepper.js +11 -2
  88. package/dist/components/table/table.meta.js +4 -4
  89. package/dist/components/tabs/tabs.meta.js +1 -1
  90. package/dist/components/textarea/textarea.meta.js +2 -2
  91. package/dist/components/toast/toast.js +1 -0
  92. package/dist/components/toast/toast.meta.js +1 -1
  93. package/dist/components/tooltip/tooltip.meta.js +2 -2
  94. package/dist/file-hashes.json +127 -124
  95. package/dist/foundations/spacing.js +8 -8
  96. package/dist/index.d.ts +138 -73
  97. package/dist/index.js +12 -1
  98. package/dist/lib/chart/types.js +3 -3
  99. package/dist/lib/is-promise.js +5 -0
  100. package/dist/lib/palette.js +103 -0
  101. package/dist/lib/selection-card.js +4 -4
  102. package/dist/palette.css +669 -0
  103. package/dist/patterns/auth-page.js +6 -6
  104. package/dist/patterns/auth-page.meta.js +3 -3
  105. package/dist/patterns/brand-landing-page.js +2 -2
  106. package/dist/patterns/chat-panel.js +2 -2
  107. package/dist/patterns/dashboard-page.js +71 -71
  108. package/dist/patterns/dashboard-page.meta.js +5 -5
  109. package/dist/patterns/feed-page.js +25 -25
  110. package/dist/patterns/feed-page.meta.js +3 -3
  111. package/dist/patterns/landing-page.js +1 -1
  112. package/dist/patterns/list-detail-page.js +17 -17
  113. package/dist/patterns/settings-page.js +17 -17
  114. package/dist/presets/index.d.ts +1 -1
  115. package/dist/presets/index.js +17 -2
  116. package/dist/styles.css +163 -55
  117. package/dist/{theme-provider-S0NVJs2Y.d.ts → theme-provider-CdSicAad.d.ts} +1 -1
  118. package/dist/themes/_contract.js +22 -8
  119. package/dist/themes/atelier/atelier.css +13 -13
  120. package/dist/themes/atelier/index.d.ts +1 -1
  121. package/dist/themes/ember/ember.css +13 -13
  122. package/dist/themes/ember/index.d.ts +1 -1
  123. package/dist/themes/index.d.ts +2 -2
  124. package/dist/themes/meridian/index.d.ts +1 -1
  125. package/dist/themes/meridian/meridian.css +13 -13
  126. package/dist/themes/poppy/index.d.ts +1 -1
  127. package/dist/themes/poppy/poppy.css +19 -16
  128. package/dist/themes/prism/index.d.ts +1 -1
  129. package/dist/themes/prism/prism.css +18 -15
  130. package/dist/themes/sable/index.d.ts +1 -1
  131. package/dist/themes/sable/sable.css +18 -22
  132. package/dist/themes/verdant/index.d.ts +1 -1
  133. package/dist/themes/verdant/verdant.css +15 -15
  134. package/llms/blocks/danger-zone-block.md +4 -4
  135. package/llms/blocks/faq-block.md +3 -3
  136. package/llms/blocks/goal-progress-block.md +1 -1
  137. package/llms/blocks/notification-list-block.md +1 -1
  138. package/llms/blocks/pricing-table-block.md +12 -12
  139. package/llms/blocks/product-card-block.md +6 -6
  140. package/llms/blocks/profile-card-block.md +1 -1
  141. package/llms/blocks/profile-form-block.md +3 -3
  142. package/llms/blocks/revenue-breakdown-block.md +5 -5
  143. package/llms/blocks/stat-row-block.md +3 -3
  144. package/llms/blocks/task-list-block.md +2 -2
  145. package/llms/blocks/team-members-block.md +1 -1
  146. package/llms/blocks/wallet-block.md +7 -7
  147. package/llms/components/accordion.md +2 -2
  148. package/llms/components/app-header.md +1 -1
  149. package/llms/components/app-shell.md +2 -2
  150. package/llms/components/area-chart.md +1 -1
  151. package/llms/components/badge.md +15 -7
  152. package/llms/components/banner.md +6 -6
  153. package/llms/components/bar-chart.md +2 -2
  154. package/llms/components/breadcrumbs.md +1 -1
  155. package/llms/components/button.md +3 -3
  156. package/llms/components/card.md +4 -4
  157. package/llms/components/checkbox-card.md +5 -5
  158. package/llms/components/code-block.md +1 -1
  159. package/llms/components/command-menu.md +1 -1
  160. package/llms/components/context-card.md +2 -2
  161. package/llms/components/destructive-action-modal.md +1 -1
  162. package/llms/components/dialog.md +2 -2
  163. package/llms/components/disclosure-picker.md +2 -1
  164. package/llms/components/empty-state.md +4 -4
  165. package/llms/components/gradient-art.md +3 -3
  166. package/llms/components/label.md +1 -1
  167. package/llms/components/line-chart.md +1 -1
  168. package/llms/components/meter.md +2 -2
  169. package/llms/components/middle-truncate.md +5 -5
  170. package/llms/components/note.md +3 -3
  171. package/llms/components/pagination.md +2 -2
  172. package/llms/components/phone.md +1 -1
  173. package/llms/components/pie-chart.md +1 -1
  174. package/llms/components/pill.md +12 -2
  175. package/llms/components/popover.md +2 -2
  176. package/llms/components/radar-chart.md +1 -1
  177. package/llms/components/radial-chart.md +1 -1
  178. package/llms/components/radio-card.md +4 -4
  179. package/llms/components/radio.md +2 -2
  180. package/llms/components/scroller.md +1 -1
  181. package/llms/components/search-input.md +1 -1
  182. package/llms/components/segmented-bar.md +7 -7
  183. package/llms/components/select.md +2 -2
  184. package/llms/components/sheet.md +1 -1
  185. package/llms/components/side-nav.md +1 -1
  186. package/llms/components/sidebar.md +1 -1
  187. package/llms/components/sparkline.md +2 -2
  188. package/llms/components/spinner.md +1 -1
  189. package/llms/components/status-dot.md +4 -4
  190. package/llms/components/table.md +8 -8
  191. package/llms/components/tabs.md +1 -1
  192. package/llms/components/textarea.md +2 -2
  193. package/llms/components/toast.md +1 -1
  194. package/llms/components/tooltip.md +2 -2
  195. package/llms/foundations/spacing.md +7 -7
  196. package/llms/layout/grid.md +1 -1
  197. package/llms/layout/page.md +1 -1
  198. package/llms/layout/region.md +1 -1
  199. package/llms/layout/split-pane.md +1 -1
  200. package/llms/patterns/auth-page.md +11 -11
  201. package/llms/patterns/brand-landing-page.md +2 -2
  202. package/llms/patterns/chat-panel.md +2 -2
  203. package/llms/patterns/dashboard-page.md +78 -78
  204. package/llms/patterns/feed-page.md +31 -31
  205. package/llms/patterns/landing-page.md +1 -1
  206. package/llms/patterns/list-detail-page.md +18 -18
  207. package/llms/patterns/settings-page.md +18 -18
  208. package/llms/reference/token-intent.md +25 -11
  209. package/llms/reference/utilities.md +1 -1
  210. package/llms/tasks/adding-a-component.md +4 -1
  211. package/llms/tasks/building-a-page.md +40 -0
  212. package/llms/tasks/building-with-sable.md +4 -0
  213. package/llms/tasks/converting-an-app.md +3 -1
  214. package/llms/tasks/using-presets.md +4 -0
  215. package/llms-full.txt +433 -347
  216. package/llms.txt +7 -7
  217. package/package.json +4 -4
  218. package/registry.json +369 -233
  219. package/scripts/lint-rules.mjs +26 -5
  220. package/scripts/sources.mjs +4 -1
  221. package/skills/sable/SKILL.md +14 -3
@@ -25,6 +25,14 @@
25
25
  * both linters zero-dependency.
26
26
  */
27
27
 
28
+ const STEP = "(?:50|100|200|300|400|500|600|700|800|900|950)"
29
+ /** Every family Tailwind ships, whether or not Sable generates it. */
30
+ const TAILWIND_FAMILIES = ["slate", "gray", "grey", "zinc", "neutral", "stone", "red", "orange", "amber", "yellow", "lime", "green", "emerald", "teal", "cyan", "sky", "blue", "indigo", "violet", "purple", "fuchsia", "pink", "rose"]
31
+ /** The tones that get a generated scale — keep in step with PALETTE_TONES in src/lib/palette.ts. */
32
+ const PALETTE_TONE_SCALES = ["tone-1", "tone-2", "tone-3", "tone-info", "tone-warning", "success", "destructive"]
33
+ /** Everything src/palette.css generates — keep in step with PALETTE_SCALES in src/lib/palette.ts. */
34
+ export const PALETTE_SCALES = ["neutral", "red", "orange", "yellow", "green", "teal", "blue", "purple", "pink", ...PALETTE_TONE_SCALES]
35
+
28
36
  /** Utility prefixes that take a colour token. */
29
37
  export const COLOR_PREFIX =
30
38
  "(?:bg|text|border|fill|stroke|ring|ring-offset|from|to|via|decoration|outline|divide|caret|accent|shadow)"
@@ -442,21 +450,34 @@ export function makeRules({ semanticTokens, motionTokens, labelContrast = null,
442
450
  {
443
451
  id: "inline-color",
444
452
  scope: "both",
445
- why: "Inline oklch()/hex color. Use a semantic token (bg-card, text-tone-edition-foreground, bg-overlay…). Literal colors belong only in a theme file.",
453
+ why: "Inline oklch()/hex color. Use a semantic token (bg-card, text-tone-1-foreground, bg-overlay…). Literal colors belong only in a theme file.",
446
454
  regex: /oklch\s*\(|#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{4}|[0-9a-fA-F]{3})\b/g,
447
455
  },
448
456
  {
449
457
  id: "palette-ref",
450
- scope: "both",
451
- why: "Raw palette-step reference (e.g. --zinc-950, text-(--purple-heart-700), border-orange-500). Palette steps are theme-internal — name a semantic token instead. After the tone-foreground + overlay tokens, this rule has ZERO sanctioned exceptions.",
458
+ scope: "package",
459
+ why: "Palette-step reference (e.g. --zinc-950, text-(--purple-heart-700), border-orange-500, bg-tone-1-100) in a component. A component paints roles only, so it re-themes with the role; the generated palette is for apps. After the tone-foreground + overlay tokens, this rule has ZERO sanctioned exceptions.",
452
460
  // Two shapes, and the second is the one that got away. A CSS var ending in
453
461
  // a ramp step catches `--zinc-950`; a bare Tailwind palette utility catches
454
462
  // `border-orange-500`, which is what actually shipped in a consumer app for
455
463
  // weeks. Semantic/layout/motion tokens never end in a numeric step, so both
456
464
  // halves are theme-agnostic.
457
465
  regex: new RegExp(
458
- "--[a-zA-Z][\\w-]*-(?:50|100|200|300|400|500|600|700|800|900|950)\\b" +
459
- `|\\b${COLOR_PREFIX}-(?:slate|gray|grey|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950)\\b`,
466
+ `--[a-zA-Z][\\w-]*-${STEP}\\b` +
467
+ `|\\b${COLOR_PREFIX}-(?:${[...TAILWIND_FAMILIES, ...PALETTE_TONE_SCALES].join("|")})-${STEP}\\b`,
468
+ "g",
469
+ ),
470
+ },
471
+ {
472
+ id: "palette-ref",
473
+ scope: "consumer",
474
+ why: "Palette step that does not follow the theme (e.g. --zinc-950, text-(--purple-heart-700), bg-lime-500). Sable generates neutral, red, orange, yellow, green, teal, blue, purple and pink, plus a scale under every tone (bg-tone-1-100), all from the active theme — use one of those for decorative or categorical colour, and a semantic token for surfaces, text and actions. A theme's own ramps are internal, and Tailwind's other families are switched off.",
475
+ // The generated palette (src/lib/palette.ts) is themed, so an app may use
476
+ // it; anything else ending in a step is a theme's internal ramp or a
477
+ // Tailwind family Sable switched off, and paints nothing or the wrong thing.
478
+ regex: new RegExp(
479
+ `--(?!(?:${PALETTE_SCALES.join("|")})-${STEP}\\b)[a-zA-Z][\\w-]*-${STEP}\\b` +
480
+ `|\\b${COLOR_PREFIX}-(?:${TAILWIND_FAMILIES.filter((name) => !PALETTE_SCALES.includes(name)).join("|")})-${STEP}\\b`,
460
481
  "g",
461
482
  ),
462
483
  },
@@ -195,7 +195,10 @@ export function sourcesCss(pkgRoot, root, outFile) {
195
195
  * that component unstyled, silently — so it fails. A whole-package @source is
196
196
  * correct, just heavy, so it only gets a note.
197
197
  */
198
- const WHOLE_DIST = /@source[^;]*(?:@sableui\/react|packages\/sable)\/dist(?:\/\*\*)?[^;]*;/
198
+ // The whole-package scan only: `dist`, `dist/` or a `dist/**` glob. A single
199
+ // module (`dist/components/chart/chart.js`, a lazy route's) and an exclusion
200
+ // (`@source not …`) are deliberate and trim nothing away.
201
+ const WHOLE_DIST = /@source\s+(?!not\b)["'][^"']*(?:@sableui\/react|packages\/sable)\/dist\/?(?:\*\*(?:\/[^"']*)?)?["']/
199
202
 
200
203
  export function sourcesCheck(pkgRoot, root, cssFiles) {
201
204
  const generated = cssFiles.find((f) => f.text.includes(SOURCES_MARKER))
@@ -157,14 +157,23 @@ The installed catalog and guides are authoritative for API and token names.
157
157
  your own from parts; that is not a gap and needs no apology. Apps on Sable
158
158
  should not all look alike.
159
159
  2. Resolve styling in this order: Sable component/variant, Sable utility or recipe,
160
- semantic token, then app-owned CSS for a genuinely uncovered need. Retrieve
160
+ semantic token, then app-owned CSS for a genuinely uncovered need. Colour
161
+ beyond the roles (tags, avatars, labels, legends) comes from the generated
162
+ palette, which follows the theme: a family as a component's tone
163
+ (`<Badge tone="teal">`) or the pairs `bg-blue-100 text-blue-800`; never hex or
164
+ a theme's own ramp (`sable token palette`). Retrieve
161
165
  `sable utility <name>` and `sable token <group>` rather than guessing names.
162
166
  Use paired typography, spacing steps, density/control ladders, relative surfaces,
163
167
  concentric geometry, scroll policies, and supported motion recipes.
164
168
  3. Inspect a relevant `sable pattern <Name> --skeleton` and layout contracts when
165
169
  composing a page. Reuse a pattern when its information architecture fits;
166
170
  otherwise compose an original layout from Sable primitives. Do not force a
167
- dashboard or marketing shell onto a different product brief.
171
+ dashboard or marketing shell onto a different product brief. Structure: one
172
+ direction is `Stack`/`Row` (flex); content that lines up across rows and
173
+ columns is `Grid`/`Columns`; width is a `Region`. Measure vertical space in
174
+ baseline steps (`sable docs spacing`): `Stack`/`Row`/`Grid` gap numbers, even
175
+ Tailwind steps between blocks, paired type tiers. It is a rhythm to keep, not
176
+ a grid to force: never pad or nudge components to pin text to lines.
168
177
  4. Put identity in app-owned theme tokens, composition, and assets. Component
169
178
  `className` is for layout; fill, edges, corners, ink, and interaction appearance
170
179
  come from supported variants. Do not override controls to imitate a reference.
@@ -181,7 +190,9 @@ The installed catalog and guides are authoritative for API and token names.
181
190
  Save a short brief in the project's existing design location: audience, primary
182
191
  task, content, constraints, selected identity, and meaningful states, plus each
183
192
  route's width (a Region `max`, or fluid) and why, chosen by what the person does
184
- there (`sable docs building-a-page`). Name the product's signature surfaces: the
193
+ there (`sable docs building-a-page`), and its column structure: which content
194
+ spans which of the 12 columns at which breakpoint, or "one measure, no columns".
195
+ A grid is a choice per route, not a requirement; stating it is. Name the product's signature surfaces: the
185
196
  one to three places its identity lives (a shop's product card and search, a music
186
197
  app's player and album tile). Design those from the brief's direction first,
187
198
  composing Sable's parts and behaviour; take a Sable reference for one only when