@sableui/react 0.0.0-stage → 0.1.1

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 +55 -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,139 @@
1
+ import { StatusIcons } from './chunk-NEQNXI2G.js';
2
+ import { cn } from './chunk-SRQWQUTW.js';
3
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
+
5
+ function Phone({ statusBar = true, systemChrome = true, className, children, ...props }) {
6
+ return /* @__PURE__ */ jsxs(
7
+ "div",
8
+ {
9
+ className: cn(
10
+ // Hardware is the one surface no preset or mode repaints: a titanium
11
+ // body and band, not a theme's scrim (`overlay` is translucent in some
12
+ // presets, which drew a grey, see-through phone).
13
+ // design-lint-disable-next-line inline-color -- fixed device material, deliberately unthemed
14
+ "@container relative mx-auto w-[280px] [--phone-body:oklch(18%_0.004_265)] [--phone-band:oklch(48%_0.006_265)]",
15
+ className
16
+ ),
17
+ ...props,
18
+ children: [
19
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -start-[0.6cqi] top-[18%] h-[4.5%] w-[0.8cqi] rounded-s-full bg-(--phone-band)" }),
20
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -start-[0.6cqi] top-[25.5%] h-[7%] w-[0.8cqi] rounded-s-full bg-(--phone-band)" }),
21
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -start-[0.6cqi] top-[34%] h-[7%] w-[0.8cqi] rounded-s-full bg-(--phone-band)" }),
22
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -end-[0.6cqi] top-[27%] h-[10.5%] w-[0.8cqi] rounded-e-full bg-(--phone-band)" }),
23
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute -end-[0.4cqi] top-[55%] h-[6%] w-[0.6cqi] rounded-e-full bg-(--phone-band)" }),
24
+ /* @__PURE__ */ jsx("div", { className: "relative rounded-[18cqi] bg-(--phone-body) p-[3.7cqi] shadow-xl ring-[0.5cqi] ring-(--phone-band) ring-inset", children: /* @__PURE__ */ jsxs("div", { className: "relative aspect-[402/874] overflow-hidden rounded-[14.3cqi] bg-background text-foreground", children: [
25
+ /* @__PURE__ */ jsx("div", { className: cn("h-full overflow-auto overscroll-contain scrollbar-hidden", statusBar && "pt-[14.3cqi]"), children }),
26
+ statusBar ? /* @__PURE__ */ jsxs(
27
+ "div",
28
+ {
29
+ "aria-hidden": true,
30
+ className: "absolute inset-x-0 top-0 grid h-[14.3cqi] grid-cols-[1fr_19cqi_1fr] grid-rows-[8cqi] content-start items-center bg-background px-[4cqi] pt-[2.6cqi]",
31
+ children: [
32
+ /* @__PURE__ */ jsx("span", { className: "justify-self-center text-label-md tabular-nums", children: "9:41" }),
33
+ /* @__PURE__ */ jsx("span", {}),
34
+ /* @__PURE__ */ jsx(StatusIcons, { className: "flex items-center gap-[1.15cqi] justify-self-center [&_svg]:h-[2.8cqi] [&_svg]:w-auto" })
35
+ ]
36
+ }
37
+ ) : null,
38
+ systemChrome ? /* @__PURE__ */ jsxs(Fragment, { children: [
39
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute inset-x-0 top-[2.6cqi] mx-auto h-[8cqi] w-[19cqi] rounded-full bg-(--phone-body)" }),
40
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "absolute inset-x-0 bottom-[1.85cqi] mx-auto h-[1.15cqi] min-h-1 w-[35%] rounded-full bg-foreground" })
41
+ ] }) : null
42
+ ] }) })
43
+ ]
44
+ }
45
+ );
46
+ }
47
+ Phone.displayName = "Phone";
48
+
49
+ // src/components/phone/phone.meta.ts
50
+ var phoneMeta = {
51
+ name: "Phone",
52
+ summary: "A current smartphone frame at iPhone proportions: a dark body with a titanium band, thin bezels, an island, an optional status bar and a scrollable screen.",
53
+ status: "stable",
54
+ keywords: [
55
+ "phone",
56
+ "device mockup",
57
+ "mobile preview",
58
+ "frame"
59
+ ],
60
+ usage: {
61
+ description: "Use Phone to frame a mobile product preview when the device context is useful.",
62
+ bestPractices: [
63
+ {
64
+ guidance: "do",
65
+ description: "Use it for mobile UI demos, screenshots, and responsive previews."
66
+ },
67
+ {
68
+ guidance: "do",
69
+ description: "Keep the framed content legible and avoid stuffing full desktop layouts into the phone frame."
70
+ },
71
+ {
72
+ guidance: "dont",
73
+ description: "Do not use Phone as a generic panel, card, or production app shell."
74
+ },
75
+ {
76
+ guidance: "dont",
77
+ description: "Do not use it to test responsive behaviour. The frame is a fixed aspect box, not a viewport, so media queries inside key off the real window."
78
+ }
79
+ ]
80
+ },
81
+ related: {
82
+ components: [
83
+ "Browser"
84
+ ]
85
+ },
86
+ props: [
87
+ {
88
+ name: "children",
89
+ type: "ReactNode",
90
+ description: "Content rendered inside the scrollable screen region."
91
+ },
92
+ {
93
+ name: "statusBar",
94
+ type: "boolean",
95
+ default: "true",
96
+ description: "Draw a status bar (time, signal, battery) across the top of the screen. Turn it off to frame a screenshot that already has one."
97
+ },
98
+ {
99
+ name: "systemChrome",
100
+ type: "boolean",
101
+ default: "true",
102
+ description: "Draw the camera pill and home indicator. Turn it off when the content draws its own system chrome, such as an iOS prototype framed by PhoneFrame from @sableui/react/ios/preview."
103
+ },
104
+ {
105
+ name: "className",
106
+ type: "string",
107
+ description: "Additional classes merged onto the outer wrapper (set the width here; the screen keeps its proportions)."
108
+ }
109
+ ],
110
+ tokensUsed: ["background", "foreground"],
111
+ a11y: [
112
+ "Purely presentational frame; the screen region scrolls when content overflows. Add headings/landmarks in the content as needed.",
113
+ "The frame's chrome (status bar, camera, buttons) is aria-hidden, so the content inside carries the entire accessible meaning. A screenshot with no alt text makes the whole mockup announce as nothing at all."
114
+ ],
115
+ examples: [
116
+ {
117
+ label: "Framing a mobile layout",
118
+ code: '<Phone><div className="p-4"><h2 className="text-title-lg">Activity</h2><p className="text-body-sm text-muted-foreground">3 new collects today.</p></div></Phone>'
119
+ },
120
+ {
121
+ label: "Mockup, not a responsive preview",
122
+ code: `// Phone is DECORATIVE framing for a mobile screenshot on a marketing surface.
123
+
124
+ <Phone>
125
+ <img src="/screenshots/mobile.png" alt="The mobile app" />
126
+ </Phone>
127
+
128
+ // \u2717 Using it to test responsive layout. The frame is a fixed aspect box, not a
129
+ // viewport \u2014 media queries inside it key off the real window, so what you see
130
+ // is not what a phone renders. Resize the browser, or use device emulation.
131
+ // \u2717 Wrapping live, interactive app UI (forms, buttons that act). Same as Browser: the frame says "picture of
132
+ // software", so real controls inside it read as a screenshot that moves. Static composed content is fine.
133
+ // The exception is a clickable iOS prototype: PhoneFrame (@sableui/react/ios/preview)
134
+ // frames a whole phone-sized document in an iframe, where the frame is the device.`
135
+ }
136
+ ]
137
+ };
138
+
139
+ export { Phone, phoneMeta };
@@ -0,0 +1,63 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge, validators } from 'tailwind-merge';
3
+
4
+ // src/lib/cn.ts
5
+ var dsTypographyTokens = [
6
+ "display-4xl",
7
+ "display-3xl",
8
+ "display-2xl",
9
+ "display-xl",
10
+ "display-lg",
11
+ "heading-1",
12
+ "heading-2",
13
+ "heading-3",
14
+ "heading-4",
15
+ "title-lg",
16
+ "title-sm",
17
+ "body-lg",
18
+ "body-md",
19
+ "body-sm",
20
+ "body-xs",
21
+ "label-lg",
22
+ "label-md",
23
+ "label-sm",
24
+ "label-xs",
25
+ "caption",
26
+ "mono-xl",
27
+ "mono-lg",
28
+ "mono-md",
29
+ "mono-caption",
30
+ "mono-sm",
31
+ // UI tier — the workspace register's chrome typography. Registering these is
32
+ // not optional bookkeeping: an unrecognised `text-*` class lands in
33
+ // tailwind-merge's COLOUR group, so `cn("text-ui-md", "text-primary-foreground")`
34
+ // would drop the colour and render, for instance, white text on a white button.
35
+ "ui-md",
36
+ "ui-sm",
37
+ "ui-body",
38
+ "ui-section",
39
+ "ui-micro",
40
+ "ui-num"
41
+ ];
42
+ var twMerge = extendTailwindMerge({
43
+ extend: {
44
+ classGroups: {
45
+ "ds-typography": [{ text: dsTypographyTokens }],
46
+ // `rounded-concentric-<outer>/<inset>` (styles.css) is a border-radius.
47
+ // Unregistered, tailwind-merge kept it AND a component's own
48
+ // `rounded-sm`, so which radius won depended on stylesheet order — a
49
+ // concentric override on a pill tab inside a card silently lost.
50
+ "ds-concentric": [{ "rounded-concentric": [validators.isAny] }]
51
+ },
52
+ conflictingClassGroups: {
53
+ "ds-typography": ["font-size", "leading", "font-weight", "tracking"],
54
+ "ds-concentric": ["rounded"],
55
+ rounded: ["ds-concentric"]
56
+ }
57
+ }
58
+ });
59
+ function cn(...inputs) {
60
+ return twMerge(clsx(inputs));
61
+ }
62
+
63
+ export { cn };
@@ -0,0 +1,15 @@
1
+ // src/themes/atelier/index.ts
2
+ var atelierTheme = {
3
+ id: "atelier",
4
+ label: "Atelier",
5
+ deprecated: { replacement: "base" },
6
+ modes: ["light", "dark"],
7
+ defaultMode: "light",
8
+ fonts: {
9
+ sans: '"Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
10
+ mono: '"Martian Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Courier New", monospace'
11
+ }
12
+ };
13
+ var atelier_default = atelierTheme;
14
+
15
+ export { atelierTheme, atelier_default };
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Foundations — the system's rules as typed data.
3
+ *
4
+ * Typography, motion, spacing, shape, surfaces, scrolling and accessibility
5
+ * rules used to live as prose spread across AGENTS.md and DESIGN.md, which is
6
+ * where agents least often read and where they drifted from the docs pages.
7
+ * Each foundation is now ONE object, rendered three ways from the same source:
8
+ *
9
+ * - the docs site's foundation pages (rules, no-gos and demos)
10
+ * - `llms/foundations/<slug>.md`, served as `sable docs <slug>`
11
+ * - `registry.json → foundations`
12
+ *
13
+ * `build-registry` generates the second and third, so a rule cannot say one
14
+ * thing on the site and another to an agent.
15
+ *
16
+ * Every rule is short enough to obey without reading the rationale; `why` is
17
+ * there for when a rule seems wrong. `enforcedBy` names the gate that checks it
18
+ * (a `sable-lint` rule id, a test, or the registry build). A rule with no gate
19
+ * is a judgment call, and should read like one.
20
+ */
21
+ /** One entry of a closed vocabulary — a type tier, a duration, a radius step. */
22
+ interface FoundationTerm {
23
+ /** The name an author writes: a utility, a token, a recipe. */
24
+ name: string;
25
+ /** The value it carries in the default theme, as a reader would say it. */
26
+ value: string;
27
+ /** When to reach for it. One line. */
28
+ use: string;
29
+ }
30
+ interface FoundationVocabulary {
31
+ title: string;
32
+ /** Optional one-line framing shown above the table. */
33
+ note?: string;
34
+ terms: readonly FoundationTerm[];
35
+ }
36
+ interface FoundationRule {
37
+ rule: string;
38
+ why: string;
39
+ /** The gate that checks it: a sable-lint rule id, a test file, or "build-registry". */
40
+ enforcedBy?: string;
41
+ }
42
+ interface FoundationNoGo {
43
+ never: string;
44
+ instead: string;
45
+ why: string;
46
+ enforcedBy?: string;
47
+ }
48
+ /** A small, measurable detail, shown as before/after code. */
49
+ interface FoundationDetail {
50
+ title: string;
51
+ before: string;
52
+ after: string;
53
+ why: string;
54
+ }
55
+ interface Foundation {
56
+ slug: string;
57
+ title: string;
58
+ /** One sentence: what this foundation governs. */
59
+ summary: string;
60
+ /** The headline count, e.g. "6 families · 2 text colors · 1 utility per node". */
61
+ headline: string;
62
+ vocabularies: readonly FoundationVocabulary[];
63
+ rules: readonly FoundationRule[];
64
+ noGos: readonly FoundationNoGo[];
65
+ details: readonly FoundationDetail[];
66
+ /** Other foundation slugs, docs slugs, or CLI commands worth reading next. */
67
+ related: readonly string[];
68
+ }
69
+
70
+ declare const accessibility: Foundation;
71
+
72
+ declare const motion: Foundation;
73
+
74
+ declare const scrolling: Foundation;
75
+
76
+ declare const shape: Foundation;
77
+
78
+ declare const spacing: Foundation;
79
+
80
+ declare const surfaces: Foundation;
81
+
82
+ declare const typography: Foundation;
83
+
84
+ /** Reading order. `build-registry` emits the same order into llms/foundations. */
85
+ declare const FOUNDATIONS: readonly [Foundation, Foundation, Foundation, Foundation, Foundation, Foundation, Foundation];
86
+ declare const FOUNDATIONS_BY_SLUG: Record<string, Foundation>;
87
+
88
+ export { FOUNDATIONS, FOUNDATIONS_BY_SLUG, type Foundation, type FoundationDetail, type FoundationNoGo, type FoundationRule, type FoundationTerm, type FoundationVocabulary, accessibility, motion, scrolling, shape, spacing, surfaces, typography };