@sableui/react 0.0.0-stage → 0.1.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 (247) hide show
  1. package/AGENTS.md +157 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +221 -0
  4. package/DESIGN.md +548 -0
  5. package/LICENSE +21 -0
  6. package/README.md +194 -2
  7. package/THIRD_PARTY_NOTICES.md +44 -0
  8. package/bin/sable-lint.mjs +0 -0
  9. package/bin/sable.mjs +1223 -0
  10. package/dist/_contract-CYScOdf5.d.ts +150 -0
  11. package/dist/chunk-3IWZYBGH.js +398 -0
  12. package/dist/chunk-5Z5KLOAU.js +167 -0
  13. package/dist/chunk-7MG4SHYX.js +15 -0
  14. package/dist/chunk-ADLLDWLW.js +15 -0
  15. package/dist/chunk-EP55KSYA.js +14 -0
  16. package/dist/chunk-J23ELQQZ.js +9396 -0
  17. package/dist/chunk-JI7WJP2L.js +286 -0
  18. package/dist/chunk-K7RUHUGC.js +14 -0
  19. package/dist/chunk-KO3NAEBF.js +15 -0
  20. package/dist/chunk-L4IEIQQA.js +14 -0
  21. package/dist/chunk-L6Y46C62.js +270 -0
  22. package/dist/chunk-NEQNXI2G.js +25 -0
  23. package/dist/chunk-PAOZBZME.js +40 -0
  24. package/dist/chunk-RWP4XBSK.js +139 -0
  25. package/dist/chunk-SRQWQUTW.js +63 -0
  26. package/dist/chunk-YXBOYWBN.js +15 -0
  27. package/dist/foundations/index.d.ts +88 -0
  28. package/dist/foundations/index.js +792 -0
  29. package/dist/icon/index.d.ts +60 -0
  30. package/dist/icon/index.js +2 -0
  31. package/dist/icon-sets/brands.d.ts +44 -0
  32. package/dist/icon-sets/brands.js +147 -0
  33. package/dist/icon-sets/reicon.d.ts +8 -0
  34. package/dist/icon-sets/reicon.js +1 -0
  35. package/dist/index.d.ts +7013 -0
  36. package/dist/index.js +15462 -0
  37. package/dist/ios/chrome.css +83 -0
  38. package/dist/ios/frame.css +5 -0
  39. package/dist/ios/index.d.ts +70 -0
  40. package/dist/ios/index.js +313 -0
  41. package/dist/ios/preview.d.ts +64 -0
  42. package/dist/ios/preview.js +133 -0
  43. package/dist/ios/styles.css +77 -0
  44. package/dist/layout/index.d.ts +280 -0
  45. package/dist/layout/index.js +2 -0
  46. package/dist/meta-6dUzgC6M.d.ts +205 -0
  47. package/dist/patterns/index.d.ts +36 -0
  48. package/dist/patterns/index.js +934 -0
  49. package/dist/presets/index.d.ts +37 -0
  50. package/dist/presets/index.js +117 -0
  51. package/dist/registry-CyL28OzJ.d.ts +28 -0
  52. package/dist/styles.css +1893 -0
  53. package/dist/theme-provider-BWcizhAt.d.ts +105 -0
  54. package/dist/themes/atelier/atelier.css +213 -0
  55. package/dist/themes/atelier/index.d.ts +9 -0
  56. package/dist/themes/atelier/index.js +1 -0
  57. package/dist/themes/base/base.css +443 -0
  58. package/dist/themes/base/index.d.ts +9 -0
  59. package/dist/themes/base/index.js +1 -0
  60. package/dist/themes/ember/ember.css +270 -0
  61. package/dist/themes/ember/index.d.ts +9 -0
  62. package/dist/themes/ember/index.js +1 -0
  63. package/dist/themes/index.d.ts +10 -0
  64. package/dist/themes/index.js +8 -0
  65. package/dist/themes/meridian/index.d.ts +9 -0
  66. package/dist/themes/meridian/index.js +1 -0
  67. package/dist/themes/meridian/meridian.css +255 -0
  68. package/dist/themes/poppy/index.d.ts +6 -0
  69. package/dist/themes/poppy/index.js +1 -0
  70. package/dist/themes/poppy/poppy.css +174 -0
  71. package/dist/themes/prism/index.d.ts +6 -0
  72. package/dist/themes/prism/index.js +1 -0
  73. package/dist/themes/prism/prism.css +183 -0
  74. package/dist/themes/verdant/index.d.ts +9 -0
  75. package/dist/themes/verdant/index.js +1 -0
  76. package/dist/themes/verdant/verdant.css +210 -0
  77. package/dist/themes.css +30 -0
  78. package/llms/components/accordion.md +93 -0
  79. package/llms/components/app-header.md +70 -0
  80. package/llms/components/app-shell.md +117 -0
  81. package/llms/components/attachment.md +105 -0
  82. package/llms/components/avatar.md +141 -0
  83. package/llms/components/badge.md +117 -0
  84. package/llms/components/banner.md +119 -0
  85. package/llms/components/bottom-nav.md +80 -0
  86. package/llms/components/breadcrumbs.md +75 -0
  87. package/llms/components/browser.md +67 -0
  88. package/llms/components/bubble.md +119 -0
  89. package/llms/components/button.md +199 -0
  90. package/llms/components/calendar.md +75 -0
  91. package/llms/components/card.md +135 -0
  92. package/llms/components/carousel.md +87 -0
  93. package/llms/components/chat-composer.md +126 -0
  94. package/llms/components/checkbox-card.md +98 -0
  95. package/llms/components/checkbox.md +90 -0
  96. package/llms/components/code-block.md +81 -0
  97. package/llms/components/code.md +62 -0
  98. package/llms/components/collapsible.md +83 -0
  99. package/llms/components/color-field.md +100 -0
  100. package/llms/components/combobox.md +119 -0
  101. package/llms/components/command-menu.md +158 -0
  102. package/llms/components/context-card.md +73 -0
  103. package/llms/components/context-menu.md +79 -0
  104. package/llms/components/data-table.md +99 -0
  105. package/llms/components/date-picker.md +97 -0
  106. package/llms/components/description.md +96 -0
  107. package/llms/components/destructive-action-modal.md +76 -0
  108. package/llms/components/dialog.md +127 -0
  109. package/llms/components/dots-menu.md +64 -0
  110. package/llms/components/empty-state.md +113 -0
  111. package/llms/components/entity.md +67 -0
  112. package/llms/components/feedback.md +63 -0
  113. package/llms/components/fieldset.md +106 -0
  114. package/llms/components/file-dropzone.md +103 -0
  115. package/llms/components/form.md +111 -0
  116. package/llms/components/gliding-highlight.md +84 -0
  117. package/llms/components/inline-status.md +62 -0
  118. package/llms/components/input.md +127 -0
  119. package/llms/components/kbd.md +57 -0
  120. package/llms/components/label.md +73 -0
  121. package/llms/components/marker.md +99 -0
  122. package/llms/components/marquee.md +66 -0
  123. package/llms/components/menu.md +122 -0
  124. package/llms/components/message-scroller.md +110 -0
  125. package/llms/components/message.md +114 -0
  126. package/llms/components/meter.md +124 -0
  127. package/llms/components/middle-truncate.md +62 -0
  128. package/llms/components/note.md +81 -0
  129. package/llms/components/notification-badge.md +67 -0
  130. package/llms/components/number-field.md +70 -0
  131. package/llms/components/otp-field.md +101 -0
  132. package/llms/components/page-header.md +76 -0
  133. package/llms/components/page-loader.md +67 -0
  134. package/llms/components/pagination.md +92 -0
  135. package/llms/components/panel-group.md +120 -0
  136. package/llms/components/panel-section.md +122 -0
  137. package/llms/components/phone.md +70 -0
  138. package/llms/components/pill.md +73 -0
  139. package/llms/components/popover.md +79 -0
  140. package/llms/components/progress.md +98 -0
  141. package/llms/components/radio-card.md +90 -0
  142. package/llms/components/radio.md +86 -0
  143. package/llms/components/relative-time.md +60 -0
  144. package/llms/components/scroller.md +88 -0
  145. package/llms/components/scrub-field.md +97 -0
  146. package/llms/components/search-input.md +84 -0
  147. package/llms/components/select.md +106 -0
  148. package/llms/components/separator.md +70 -0
  149. package/llms/components/settings-menu.md +139 -0
  150. package/llms/components/sheet.md +97 -0
  151. package/llms/components/show-more.md +59 -0
  152. package/llms/components/side-nav.md +106 -0
  153. package/llms/components/sidebar.md +87 -0
  154. package/llms/components/skeleton.md +62 -0
  155. package/llms/components/slider.md +114 -0
  156. package/llms/components/spinner.md +87 -0
  157. package/llms/components/status-bar.md +91 -0
  158. package/llms/components/status-dot.md +70 -0
  159. package/llms/components/stepper.md +125 -0
  160. package/llms/components/streaming-text.md +86 -0
  161. package/llms/components/switch.md +87 -0
  162. package/llms/components/table.md +112 -0
  163. package/llms/components/tabs.md +84 -0
  164. package/llms/components/textarea.md +88 -0
  165. package/llms/components/theme-selector.md +95 -0
  166. package/llms/components/theme-switcher.md +71 -0
  167. package/llms/components/thinking-orb.md +91 -0
  168. package/llms/components/toast.md +130 -0
  169. package/llms/components/toggle.md +95 -0
  170. package/llms/components/toolbar.md +168 -0
  171. package/llms/components/tooltip.md +93 -0
  172. package/llms/components/tree.md +227 -0
  173. package/llms/components/video.md +66 -0
  174. package/llms/components/workspace.md +138 -0
  175. package/llms/foundations/accessibility.md +60 -0
  176. package/llms/foundations/motion.md +96 -0
  177. package/llms/foundations/scrolling.md +41 -0
  178. package/llms/foundations/shape.md +73 -0
  179. package/llms/foundations/spacing.md +82 -0
  180. package/llms/foundations/surfaces.md +69 -0
  181. package/llms/foundations/typography.md +120 -0
  182. package/llms/layout/aspect-box.md +37 -0
  183. package/llms/layout/bleed.md +31 -0
  184. package/llms/layout/center.md +37 -0
  185. package/llms/layout/columns.md +51 -0
  186. package/llms/layout/grid-overlay.md +40 -0
  187. package/llms/layout/grid.md +47 -0
  188. package/llms/layout/page.md +39 -0
  189. package/llms/layout/region.md +49 -0
  190. package/llms/layout/row.md +40 -0
  191. package/llms/layout/safe-area.md +37 -0
  192. package/llms/layout/spacer.md +39 -0
  193. package/llms/layout/split-pane.md +41 -0
  194. package/llms/layout/stack.md +39 -0
  195. package/llms/patterns/auth-page.md +68 -0
  196. package/llms/patterns/brand-landing-page.md +423 -0
  197. package/llms/patterns/chat-panel.md +210 -0
  198. package/llms/patterns/dashboard-page.md +170 -0
  199. package/llms/patterns/feed-page.md +103 -0
  200. package/llms/patterns/landing-page.md +122 -0
  201. package/llms/patterns/list-detail-page.md +100 -0
  202. package/llms/patterns/settings-page.md +121 -0
  203. package/llms/reference/token-intent.md +324 -0
  204. package/llms/reference/utilities.md +129 -0
  205. package/llms/tasks/adding-a-component.md +113 -0
  206. package/llms/tasks/auditing-an-app.md +216 -0
  207. package/llms/tasks/building-a-page.md +109 -0
  208. package/llms/tasks/building-a-tool.md +141 -0
  209. package/llms/tasks/building-an-ios-prototype.md +105 -0
  210. package/llms/tasks/building-with-sable.md +73 -0
  211. package/llms/tasks/choosing-a-component.md +109 -0
  212. package/llms/tasks/converting-an-app.md +139 -0
  213. package/llms/tasks/creating-a-preset.md +43 -0
  214. package/llms/tasks/creating-design-assets.md +96 -0
  215. package/llms/tasks/designing-a-surface.md +115 -0
  216. package/llms/tasks/developing-taste.md +157 -0
  217. package/llms/tasks/getting-started.md +63 -0
  218. package/llms/tasks/learning-from-builds.md +74 -0
  219. package/llms/tasks/reviewing-a-design.md +114 -0
  220. package/llms/tasks/reviewing-a-journey.md +84 -0
  221. package/llms/tasks/reviewing-motion.md +92 -0
  222. package/llms/tasks/using-presets.md +87 -0
  223. package/llms/taste/asset-plan.template.json +53 -0
  224. package/llms/taste/composition-follows-content.md +20 -0
  225. package/llms/taste/hierarchy-is-a-relationship.md +22 -0
  226. package/llms/taste/lessons.json +57 -0
  227. package/llms/taste/motion-needs-a-reason.md +21 -0
  228. package/llms/taste/surface-states-travel-together.md +20 -0
  229. package/llms-full.txt +14906 -0
  230. package/llms.txt +405 -0
  231. package/package.json +185 -3
  232. package/registry.json +18812 -0
  233. package/scripts/agent-setup.mjs +54 -0
  234. package/scripts/design-atlas.mjs +221 -0
  235. package/scripts/design-directions.mjs +123 -0
  236. package/scripts/design-memory.mjs +166 -0
  237. package/scripts/design-preferences.mjs +227 -0
  238. package/scripts/design-presets.mjs +48 -0
  239. package/scripts/grade.mjs +509 -0
  240. package/scripts/lint-rules.mjs +1065 -0
  241. package/scripts/review-evidence.mjs +120 -0
  242. package/scripts/skeleton.mjs +248 -0
  243. package/skills/entry/SKILL.md +34 -0
  244. package/skills/sable/SKILL.md +187 -0
  245. package/skills/sable/agents/openai.yaml +6 -0
  246. package/targets/ios.json +982 -0
  247. package/third-party/reicon-LICENSE.txt +20 -0
@@ -0,0 +1,105 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { T as ThemeManifest } from './_contract-CYScOdf5.js';
4
+
5
+ declare const SABLE_THEME_ATTRIBUTE: "data-sable-theme";
6
+ declare const DEFAULT_THEME_ID: string;
7
+ declare const defaultThemeId: string;
8
+ declare const themeManifests: readonly [ThemeManifest, ThemeManifest, ThemeManifest, ThemeManifest, ThemeManifest, ThemeManifest, ThemeManifest];
9
+ /** Six distinct starting points; legacy themes remain addressable separately. */
10
+ declare const featuredThemeManifests: ThemeManifest[];
11
+ type ThemeId = (typeof themeManifests)[number]["id"];
12
+ declare const themeIds: ThemeId[];
13
+ declare const themeManifestById: Record<ThemeId, ThemeManifest>;
14
+ declare function isThemeId(value: string): value is ThemeId;
15
+ declare function getThemeManifest(themeId: ThemeId): ThemeManifest;
16
+ /**
17
+ * Builds a combined `themeManifestById`-shaped lookup from the built-in
18
+ * registry plus any consumer-supplied `customThemes`. Used by
19
+ * `SableThemeProvider` so an externally-supplied theme id survives
20
+ * storage-restore instead of being silently discarded back to the default.
21
+ * Custom themes with an id colliding with a built-in one win (last write).
22
+ */
23
+ declare function buildThemeManifestById(customThemes?: readonly ThemeManifest[]): Record<string, ThemeManifest>;
24
+ /** Own-property check against an arbitrary `themeManifestById`-shaped map. */
25
+ declare function isKnownThemeId(value: string, manifestById: Record<string, ThemeManifest>): boolean;
26
+
27
+ /**
28
+ * A theme id: one of Sable's built-in ids (`themeIds`), or any string when a
29
+ * `customThemes` manifest supplies it. The `string & {}` trick keeps
30
+ * autocomplete for the closed union while still accepting arbitrary strings
31
+ * — see https://www.totaltypescript.com/tips/create-autocomplete-helper.
32
+ */
33
+ type AnyThemeId = ThemeId | (string & {});
34
+ declare const SABLE_COLOR_STORAGE_KEY: "sable-color-preference";
35
+ declare const SABLE_THEME_STORAGE_KEY: "sable-theme-id";
36
+ type SableColorMode = "light" | "dark";
37
+ type SableThemePreference = SableColorMode | "system";
38
+ interface SableThemeContextValue {
39
+ /** Resolved color mode applied to the target element. */
40
+ mode: SableColorMode;
41
+ /** Explicit alias for consumers that prefer color-mode language. */
42
+ colorMode: SableColorMode;
43
+ /** Stored color preference; "system" resolves through prefers-color-scheme. */
44
+ preference: SableThemePreference;
45
+ /** Explicit alias for consumers that prefer color-preference language. */
46
+ colorPreference: SableThemePreference;
47
+ /** Active Sable design theme id. */
48
+ themeId: AnyThemeId;
49
+ /** Featured theme manifests; legacy imports remain available separately. */
50
+ themes: typeof featuredThemeManifests;
51
+ setPreference: (preference: SableThemePreference) => void;
52
+ setColorPreference: (preference: SableThemePreference) => void;
53
+ setThemeId: (themeId: AnyThemeId) => void;
54
+ toggle: () => void;
55
+ toggleColorMode: () => void;
56
+ }
57
+ interface SableThemeProviderProps {
58
+ children: ReactNode;
59
+ /** Initial color preference when uncontrolled and no stored value exists. @default "dark" */
60
+ defaultPreference?: SableThemePreference;
61
+ /** Controlled color preference. */
62
+ preference?: SableThemePreference;
63
+ /** Notified whenever setPreference/setColorPreference is called. */
64
+ onPreferenceChange?: (preference: SableThemePreference) => void;
65
+ /** Initial design theme when uncontrolled and no stored value exists. @default "base" */
66
+ defaultThemeId?: AnyThemeId;
67
+ /** Controlled design theme id. */
68
+ themeId?: AnyThemeId;
69
+ /** Notified whenever setThemeId is called. */
70
+ onThemeIdChange?: (themeId: AnyThemeId) => void;
71
+ /** localStorage key for the color preference. Pass null to disable persistence. */
72
+ colorStorageKey?: string | null;
73
+ /** localStorage key for the design theme id. Pass null to disable persistence. */
74
+ themeStorageKey?: string | null;
75
+ /**
76
+ * Where to write `.dark` and `data-sable-theme`. Defaults to <html> so
77
+ * portaled overlays share the same token layer.
78
+ */
79
+ target?: "root" | (() => HTMLElement | null);
80
+ /**
81
+ * Additional theme manifests beyond Sable's built-in themes, e.g. a
82
+ * theme synthesized for a consumer project from an app-owned preset.
83
+ * Their ids become valid `themeId` values and survive storage-restore
84
+ * (localStorage / cross-tab `storage` events) just like built-in ids.
85
+ * Sable does not inject their CSS — the consumer is responsible for
86
+ * importing the theme's stylesheet.
87
+ */
88
+ customThemes?: ThemeManifest[];
89
+ }
90
+ declare function applySableColorMode(mode: SableColorMode, target?: HTMLElement | null): void;
91
+ declare function applySableTheme(themeId: AnyThemeId, target?: HTMLElement | null): void;
92
+ /**
93
+ * Applies and persists Sable's two theme axes:
94
+ *
95
+ * - color preference: light / dark / system, written as `.dark`
96
+ * - design theme: any id in `themeIds` (or a custom theme), written as `data-sable-theme`
97
+ */
98
+ declare function SableThemeProvider({ children, defaultPreference, preference: controlledPreference, onPreferenceChange, defaultThemeId, themeId: controlledThemeId, onThemeIdChange, colorStorageKey, themeStorageKey, target, customThemes, }: SableThemeProviderProps): react.JSX.Element;
99
+ /**
100
+ * Reads Sable's active color preference and design theme. Safe without a
101
+ * provider; mutators become no-ops and the default (Base, dark) is reported.
102
+ */
103
+ declare function useSableTheme(): SableThemeContextValue;
104
+
105
+ export { type AnyThemeId as A, DEFAULT_THEME_ID as D, SABLE_COLOR_STORAGE_KEY as S, type ThemeId as T, SABLE_THEME_ATTRIBUTE as a, SABLE_THEME_STORAGE_KEY as b, type SableColorMode as c, type SableThemeContextValue as d, type SableThemePreference as e, SableThemeProvider as f, type SableThemeProviderProps as g, applySableColorMode as h, applySableTheme as i, buildThemeManifestById as j, defaultThemeId as k, featuredThemeManifests as l, getThemeManifest as m, isKnownThemeId as n, isThemeId as o, themeManifestById as p, themeManifests as q, themeIds as t, useSableTheme as u };
@@ -0,0 +1,213 @@
1
+ /* ==========================================================================
2
+ Mono Editorial — a Sable theme, developed from reference analysis.
3
+
4
+ Components must reference the SEMANTIC tokens (--background, --primary,
5
+ --tone-edition, …), never any palette ramp directly. See themes/_contract.ts.
6
+ ========================================================================== */
7
+
8
+ [data-sable-theme="atelier"] {
9
+ /* Font stacks (theme-internal; host app provides the actual font files) */
10
+ --font-sans: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
11
+ --font-mono: "Martian Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Courier New", monospace;
12
+
13
+ /*
14
+ * Region/page-inset foundation vars consumed by the `Region` layout primitive.
15
+ * Previously undefined in this theme, so every `Region` on this page silently
16
+ * inherited the original default theme's hardcoded defaults (1536px/1280px/896px, 32px inset) via
17
+ * the package's unconditional default-theme import —
18
+ * unrelated to this reference's actual measured rhythm. Findings doc's "Layout &
19
+ * information architecture" section: capped content sections measured ~1200px
20
+ * with 48px side padding; full-bleed media panels use small (~12-20px) margins
21
+ * instead (handled per-instance via `bleed`, not this cap).
22
+ */
23
+ --page-inset: clamp(20px, 3vw, 48px);
24
+ --region-form: 480px;
25
+ --region-feed: 640px;
26
+ --region-content: 896px;
27
+ --region-wide: 1200px; /* 1200px — matches the findings doc's measured container width */
28
+ --region-full: 1440px;
29
+ --region-ultrawide: 1800px;
30
+
31
+ /* Theme foundation vars consumed by styles.css. */
32
+ --theme-radius-none: 0px;
33
+ --theme-radius-xs: 4px;
34
+ --theme-radius-sm: 8px;
35
+ --theme-radius-md: 12px;
36
+ --theme-radius-lg: 16px;
37
+ --theme-radius-xl: 20px;
38
+ --theme-radius-full: 9999px;
39
+
40
+ /* Type-scale foundation vars consumed by styles.css's paired text-* utilities. */
41
+ --type-display-4xl-weight: 700;
42
+ --type-display-4xl-leading: 0.8;
43
+ --type-display-4xl-tracking: -0.05em;
44
+ --type-display-3xl-size: 9.1429rem /* 128px at the 14px desktop root */;
45
+ --type-display-3xl-weight: 700;
46
+ --type-display-3xl-leading: 0.8;
47
+ --type-display-3xl-tracking: -0.05em;
48
+ --type-display-2xl-size: 6.2857rem /* 88px at the 14px desktop root */;
49
+ --type-display-2xl-weight: 700;
50
+ --type-display-2xl-leading: 0.85;
51
+ --type-display-2xl-tracking: -0.045em;
52
+ --type-display-xl-size: 4.5714rem /* 64px at the 14px desktop root */;
53
+ --type-display-xl-weight: 700;
54
+ --type-display-xl-leading: 0.9;
55
+ --type-display-xl-tracking: -0.04em;
56
+ --type-display-lg-size: 3.1429rem /* 44px at the 14px desktop root */;
57
+ --type-display-lg-weight: 700;
58
+ --type-display-lg-leading: 0.95;
59
+ --type-display-lg-tracking: -0.035em;
60
+ --type-heading-weight: 700;
61
+ --type-heading-1-size: 2.3571rem /* 33px at the 14px desktop root */;
62
+ --type-heading-1-leading: 1.0;
63
+ --type-heading-1-tracking: -0.03em;
64
+ --type-heading-2-size: 1.8571rem /* 26px at the 14px desktop root */;
65
+ --type-heading-2-leading: 1.1;
66
+ --type-heading-2-tracking: -0.025em;
67
+ --type-heading-3-size: 1.3571rem /* 19px at the 14px desktop root */;
68
+ --type-heading-3-leading: 1.2;
69
+ --type-heading-3-tracking: -0.02em;
70
+ --type-heading-4-size: 1.1429rem /* 16px at the 14px desktop root */;
71
+ --type-heading-4-leading: 1.2;
72
+ --type-heading-4-tracking: -0.02em;
73
+ --type-title-weight: 400;
74
+ --type-title-leading: 1.2;
75
+ --type-title-tracking: -0.02em;
76
+ --type-title-sm-tracking: -0.01em;
77
+
78
+ /* Overline/eyebrow foundation vars consumed by styles.css's text-overline utility. */
79
+ --type-overline-size: 0.7857rem /* 11px at the 14px desktop root */;
80
+ --type-overline-weight: 400;
81
+ --type-overline-leading: 1.4;
82
+ --type-overline-tracking: 0em;
83
+ --type-overline-transform: uppercase;
84
+
85
+ /* ----------------------------------------------------------------------
86
+ Semantic tokens — light mode
87
+ ---------------------------------------------------------------------- */
88
+ --background: #ffffff;
89
+ --foreground: #000000;
90
+ /* White, like the page: Atelier's chrome is flat, so a card is drawn by its
91
+ hairline, not a fill. The old 93% grey sat DARKER than --muted (so a card
92
+ in a muted well inverted the surface order) and equal to --accent (so a
93
+ pressed toggle on a card was invisible), and swallowed its own border. */
94
+ --card: #ffffff;
95
+ --card-foreground: #000000;
96
+ --popover: #ffffff;
97
+ --popover-foreground: #000000;
98
+ --muted: oklch(96% 0 0);
99
+ --muted-foreground: oklch(51% 0 0);
100
+ --border: oklch(92% 0 0);
101
+ --border-strong: oklch(85% 0 0);
102
+ --input: oklch(92% 0 0);
103
+ --ring: #000000;
104
+ --primary: #000000;
105
+ --primary-foreground: #ffffff;
106
+ --secondary: oklch(96% 0 0);
107
+ --secondary-foreground: #000000;
108
+ --accent: oklch(93% 0 0);
109
+ --accent-foreground: #000000;
110
+ --destructive: oklch(50% 0.18 22);
111
+ --destructive-foreground: #ffffff;
112
+ --success: oklch(50% 0.10 173);
113
+ --success-foreground: #ffffff;
114
+ --tone-standard: oklch(45% 0 0);
115
+ --tone-collectible: oklch(46% 0.11 300);
116
+ --tone-edition: oklch(46% 0.09 173);
117
+ --tone-info: oklch(47% 0.10 250);
118
+ --tone-warning: oklch(52% 0.12 52);
119
+ --highlight: oklch(93% 0 0);
120
+ --tone-standard-foreground: #ffffff;
121
+ --tone-collectible-foreground: #ffffff;
122
+ --tone-edition-foreground: #ffffff;
123
+ --tone-info-foreground: #ffffff;
124
+ --tone-warning-foreground: #ffffff;
125
+ --highlight-foreground: #000000;
126
+ --overlay: oklch(7% 0 0 / 0.55);
127
+ --overlay-foreground: #ffffff;
128
+ --sidebar: #ffffff;
129
+ --sidebar-foreground: #000000;
130
+ --sidebar-primary: #000000;
131
+ --sidebar-primary-foreground: #ffffff;
132
+ --sidebar-accent: oklch(96% 0 0);
133
+ --sidebar-accent-foreground: #000000;
134
+ --sidebar-border: oklch(92% 0 0);
135
+ --sidebar-ring: #000000;
136
+
137
+ /* ----------------------------------------------------------------------
138
+ Motion tokens (mode-independent)
139
+ ---------------------------------------------------------------------- */
140
+ --motion-scale: 1;
141
+ --motion-duration-instant: calc(75ms * var(--motion-scale));
142
+ --motion-duration-fast: calc(150ms * var(--motion-scale));
143
+ --motion-duration-base: calc(200ms * var(--motion-scale));
144
+ --motion-duration-slow: calc(400ms * var(--motion-scale));
145
+ --motion-duration-slower: calc(700ms * var(--motion-scale));
146
+ --motion-duration-enter: calc(400ms * var(--motion-scale));
147
+ --motion-duration-exit: calc(200ms * var(--motion-scale));
148
+ --motion-ease-standard: cubic-bezier(0.215, 0.61, 0.355, 1);
149
+ --motion-ease-decelerate: cubic-bezier(0.215, 0.61, 0.355, 1);
150
+ --motion-ease-emphasized: cubic-bezier(0.19, 1, 0.22, 1);
151
+ /* Spring/bounce carried from Sable defaults per the audit ("nothing springy
152
+ observed in reference") — not derived curves of their own. */
153
+ --motion-ease-spring: cubic-bezier(0.34, 1.35, 0.5, 1);
154
+ --motion-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
155
+ --motion-ease-linear: linear;
156
+ }
157
+
158
+ /* ==========================================================================
159
+ Semantic tokens — dark mode
160
+ ========================================================================== */
161
+ .dark[data-sable-theme="atelier"],
162
+ [data-sable-theme="atelier"].dark,
163
+ /* A dark island inside a light page: an inspector, a dark sidebar, a dark
164
+ hero. Without this arm, a nested .dark kept the light tokens. */
165
+ [data-sable-theme="atelier"] .dark,
166
+ /* …and the reverse: a preset-scoped subtree inside a dark page follows the page
167
+ into dark mode. Add `.light` to the subtree to pin it light. */
168
+ .dark [data-sable-theme="atelier"]:not(.light) {
169
+ --background: oklch(13% 0 0);
170
+ --foreground: #ffffff;
171
+ --card: oklch(20.5% 0 0);
172
+ --card-foreground: #ffffff;
173
+ --popover: oklch(24% 0 0);
174
+ --popover-foreground: #ffffff;
175
+ --muted: oklch(26% 0 0);
176
+ --muted-foreground: oklch(84% 0 0);
177
+ --border: oklch(29% 0 0);
178
+ --border-strong: oklch(36% 0 0);
179
+ --input: oklch(29% 0 0);
180
+ --ring: #ffffff;
181
+ --primary: #ffffff;
182
+ --primary-foreground: #000000;
183
+ --secondary: oklch(26% 0 0);
184
+ --secondary-foreground: #ffffff;
185
+ --accent: oklch(28% 0 0); /* above --popover: a hover row or chip inside a menu/dialog must still read */
186
+ --accent-foreground: #ffffff;
187
+ --destructive: oklch(66% 0.19 22);
188
+ --destructive-foreground: oklch(13% 0 0);
189
+ --success: oklch(72% 0.12 173);
190
+ --success-foreground: oklch(13% 0 0);
191
+ --tone-standard: oklch(80% 0 0);
192
+ --tone-collectible: oklch(76% 0.12 300);
193
+ --tone-edition: oklch(76% 0.10 173);
194
+ --tone-info: oklch(76% 0.10 250);
195
+ --tone-warning: oklch(80% 0.13 52);
196
+ --highlight: oklch(26% 0 0);
197
+ --tone-standard-foreground: oklch(13% 0 0);
198
+ --tone-collectible-foreground: oklch(13% 0 0);
199
+ --tone-edition-foreground: oklch(13% 0 0);
200
+ --tone-info-foreground: oklch(13% 0 0);
201
+ --tone-warning-foreground: oklch(13% 0 0);
202
+ --highlight-foreground: #ffffff;
203
+ --overlay: oklch(0% 0 0 / 0.7);
204
+ --overlay-foreground: #ffffff;
205
+ --sidebar: oklch(13% 0 0);
206
+ --sidebar-foreground: #ffffff;
207
+ --sidebar-primary: #ffffff;
208
+ --sidebar-primary-foreground: #000000;
209
+ --sidebar-accent: oklch(21% 0 0);
210
+ --sidebar-accent-foreground: #ffffff;
211
+ --sidebar-border: oklch(26% 0 0);
212
+ --sidebar-ring: #ffffff;
213
+ }
@@ -0,0 +1,9 @@
1
+ import { T as ThemeManifest } from '../../_contract-CYScOdf5.js';
2
+
3
+ /**
4
+ * Mono Editorial — a Sable theme. Concrete token values live in
5
+ * `atelier.css`; this manifest is the typed, machine-readable description.
6
+ */
7
+ declare const atelierTheme: ThemeManifest;
8
+
9
+ export { atelierTheme, atelierTheme as default };
@@ -0,0 +1 @@
1
+ export { atelierTheme, atelier_default as default } from '../../chunk-YXBOYWBN.js';