@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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +124 -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.js +13 -2
- 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.js +2 -0
- 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/form/form.js +10 -5
- 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/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.js +15 -1
- 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/stepper/stepper.js +11 -2
- 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.js +1 -0
- package/dist/components/toast/toast.meta.js +1 -1
- package/dist/components/tooltip/tooltip.meta.js +2 -2
- package/dist/file-hashes.json +127 -124
- package/dist/foundations/spacing.js +8 -8
- package/dist/index.d.ts +138 -73
- package/dist/index.js +12 -1
- package/dist/lib/chart/types.js +3 -3
- package/dist/lib/is-promise.js +5 -0
- 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 +163 -55
- 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/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/building-with-sable.md +4 -0
- package/llms/tasks/converting-an-app.md +3 -1
- package/llms/tasks/using-presets.md +4 -0
- package/llms-full.txt +433 -347
- package/llms.txt +7 -7
- package/package.json +4 -4
- package/registry.json +369 -233
- package/scripts/lint-rules.mjs +26 -5
- package/scripts/sources.mjs +4 -1
- package/skills/sable/SKILL.md +14 -3
package/scripts/lint-rules.mjs
CHANGED
|
@@ -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-
|
|
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: "
|
|
451
|
-
why: "
|
|
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
|
-
|
|
459
|
-
`|\\b${COLOR_PREFIX}-(
|
|
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
|
},
|
package/scripts/sources.mjs
CHANGED
|
@@ -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
|
-
|
|
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))
|
package/skills/sable/SKILL.md
CHANGED
|
@@ -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.
|
|
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`)
|
|
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
|