@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,443 @@
1
+ /* ==========================================================================
2
+ Base — the default Sable theme.
3
+
4
+ Dark-by-default, content-first, fluid product aesthetic. Palette authored in
5
+ OKLCH (locked hue per ramp, perceptually-even lightness, sRGB-capped chroma).
6
+ Light values live in :root; dark overrides in .dark.
7
+
8
+ Fonts: this theme EXPECTS the host app to provide "Figtree" (sans) and
9
+ "DM Mono" (mono). It declares the font stacks as --font-sans / --font-mono but
10
+ does not load the font files (load them via <link> or @font-face in your app).
11
+
12
+ Components must reference the SEMANTIC tokens (--background, --primary,
13
+ --tone-edition, …), never the palette steps below. See themes/_contract.ts.
14
+ ========================================================================== */
15
+
16
+ :root,
17
+ [data-sable-theme="base"] {
18
+ /* Font stacks (theme-internal; host app provides the actual font files) */
19
+ --font-sans: "Figtree", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
20
+ --font-mono: "DM Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Courier New", monospace;
21
+
22
+ /* Theme foundation vars consumed by styles.css. */
23
+ --theme-radius-none: 0px;
24
+ --theme-radius-xs: 4px;
25
+ --theme-radius-sm: 8px;
26
+ --theme-radius-md: 12px;
27
+ --theme-radius-lg: 16px;
28
+ --theme-radius-xl: 20px;
29
+ --theme-radius-full: 9999px;
30
+
31
+ /* Elevation, light. Layered: a tight contact shadow plus one or two soft drops
32
+ whose offsets roughly double per step. A single 5% blur read mushy and
33
+ barely separated a menu from the page (DESIGN.md → Elevation). */
34
+ --theme-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.04), 0 1px 3px 0 rgb(0 0 0 / 0.03);
35
+ --theme-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.04), 0 2px 6px -1px rgb(0 0 0 / 0.05);
36
+ --theme-shadow-md: 0 1px 2px 0 rgb(0 0 0 / 0.04), 0 4px 8px -2px rgb(0 0 0 / 0.06), 0 12px 24px -6px rgb(0 0 0 / 0.07);
37
+ --theme-shadow-lg: 0 2px 4px 0 rgb(0 0 0 / 0.04), 0 8px 16px -4px rgb(0 0 0 / 0.07), 0 24px 48px -12px rgb(0 0 0 / 0.11);
38
+ --theme-shadow-xl: 0 2px 4px 0 rgb(0 0 0 / 0.04), 0 12px 24px -6px rgb(0 0 0 / 0.08), 0 32px 64px -16px rgb(0 0 0 / 0.13);
39
+
40
+ /* Type-scale foundation vars consumed by styles.css's paired text-* utilities.
41
+ Values mirror styles.css's own fallback defaults exactly (zero visual
42
+ change) — declared explicitly here so the theme owns its type contract. */
43
+ --type-display-4xl-weight: 800;
44
+ --type-display-4xl-leading: 0.9;
45
+ --type-display-4xl-tracking: -0.05em;
46
+ --type-display-3xl-size: 6rem;
47
+ --type-display-3xl-weight: 700;
48
+ --type-display-3xl-leading: 0.95;
49
+ --type-display-3xl-tracking: -0.045em;
50
+ --type-display-2xl-size: 4.5rem;
51
+ --type-display-2xl-weight: 700;
52
+ --type-display-2xl-leading: 1;
53
+ --type-display-2xl-tracking: -0.04em;
54
+ --type-display-xl-size: 3.75rem;
55
+ --type-display-xl-weight: 700;
56
+ --type-display-xl-leading: 1.05;
57
+ --type-display-xl-tracking: -0.035em;
58
+ --type-display-lg-size: 3rem;
59
+ --type-display-lg-weight: 700;
60
+ --type-display-lg-leading: 1.1;
61
+ --type-display-lg-tracking: -0.03em;
62
+ --type-heading-weight: 600;
63
+ --type-heading-1-size: 2.25rem;
64
+ --type-heading-1-leading: 1.15;
65
+ --type-heading-1-tracking: -0.025em;
66
+ --type-heading-2-size: 1.75rem;
67
+ --type-heading-2-leading: 1.2;
68
+ --type-heading-2-tracking: -0.02em;
69
+ --type-heading-3-size: 1.375rem;
70
+ --type-heading-3-leading: 1.25;
71
+ --type-heading-3-tracking: -0.015em;
72
+ --type-heading-4-size: 1.125rem;
73
+ --type-heading-4-leading: 1.3;
74
+ --type-heading-4-tracking: -0.01em;
75
+ --type-title-weight: 600;
76
+ --type-title-leading: 1.4;
77
+ --type-title-tracking: -0.01em;
78
+ --type-title-sm-tracking: -0.005em;
79
+
80
+ /* Overline/eyebrow foundation vars consumed by styles.css's text-overline
81
+ utility. Values mirror styles.css's own fallback defaults exactly (zero
82
+ visual change) — declared explicitly so the theme owns its type contract. */
83
+ --type-overline-size: 0.75rem;
84
+ --type-overline-weight: 600;
85
+ --type-overline-leading: 1.2;
86
+ --type-overline-tracking: 0.08em;
87
+ --type-overline-transform: uppercase;
88
+
89
+ /* ----------------------------------------------------------------------
90
+ Palette ramps (OKLCH). 50 → 950. Theme-internal — never used directly
91
+ by components. Each 600 clears WCAG AA on white except flush-orange-600
92
+ (AA-Large only; use 700 for body text on white).
93
+ ---------------------------------------------------------------------- */
94
+
95
+ /* Absolute white — deliberately OUTSIDE every ramp. Zinc tops out at zinc-50
96
+ (97.2% L, 0.002 C), a faint blue cast that is right for a raised surface and
97
+ wrong for the page itself, so white has no ramp step to come from. It lived
98
+ as a raw literal at five sites for that reason; naming it here is what lets
99
+ the semantic layer reference the palette everywhere with no exceptions.
100
+
101
+ Stays HEX rather than `oklch(100% 0 0)`: the two are the same colour, and at
102
+ the extremes there is nothing for OKLCH to buy. Perceptual notation earns its
103
+ keep on a ramp, where even lightness steps and a locked hue matter; #ffffff
104
+ is just unambiguous and shorter. Same for #000000. Every other colour token
105
+ in every theme is OKLCH — asserted in themes.test.ts, which exempts exactly
106
+ these two. */
107
+ --white: #ffffff;
108
+
109
+ /* Zinc — Hue 264° (cool neutral, near-zero chroma) */
110
+ --zinc-50: oklch(97.2% 0.002 264);
111
+ --zinc-100: oklch(94% 0.003 264);
112
+ --zinc-200: oklch(88% 0.004 264);
113
+ --zinc-300: oklch(79% 0.004 264);
114
+ --zinc-400: oklch(68% 0.004 264);
115
+ --zinc-500: oklch(58% 0.005 264);
116
+ --zinc-600: oklch(48% 0.005 264);
117
+ --zinc-700: oklch(39% 0.004 264);
118
+ --zinc-800: oklch(30% 0.004 264);
119
+ --zinc-850: oklch(27.5% 0.0035 264); /* dark popover: one visible step above the zinc-900 card */
120
+ --zinc-900: oklch(23% 0.003 264);
121
+ --zinc-950: oklch(15% 0.003 264);
122
+
123
+ /* Torch Red — Hue 22° (destructive). 600 darkened to 53% L for AA on white. */
124
+ --torch-red-50: oklch(97.2% 0.013 22);
125
+ --torch-red-100: oklch(94% 0.028 22);
126
+ --torch-red-200: oklch(88% 0.06 22);
127
+ --torch-red-300: oklch(79% 0.118 22);
128
+ --torch-red-400: oklch(68% 0.19 22);
129
+ --torch-red-500: oklch(60% 0.235 22);
130
+ --torch-red-600: oklch(53% 0.225 22);
131
+ --torch-red-700: oklch(45% 0.19 22);
132
+ --torch-red-800: oklch(36% 0.15 22);
133
+ --torch-red-900: oklch(28% 0.11 22);
134
+ --torch-red-950: oklch(18% 0.075 22);
135
+
136
+ /* Blue Gem — Hue 285° (collectible, violet-blue) */
137
+ --blue-gem-50: oklch(97.2% 0.014 285);
138
+ --blue-gem-100: oklch(94% 0.03 285);
139
+ --blue-gem-200: oklch(88% 0.065 285);
140
+ --blue-gem-300: oklch(79% 0.13 285);
141
+ --blue-gem-400: oklch(68% 0.205 285);
142
+ --blue-gem-500: oklch(58% 0.265 285);
143
+ --blue-gem-600: oklch(48% 0.265 285);
144
+ --blue-gem-700: oklch(40% 0.225 285);
145
+ --blue-gem-800: oklch(31% 0.18 285);
146
+ --blue-gem-900: oklch(23% 0.135 285);
147
+ --blue-gem-950: oklch(15% 0.09 285);
148
+
149
+ /* Purple Heart — Hue 309° (edition / brand accent, magenta-purple) */
150
+ --purple-heart-50: oklch(97.2% 0.014 309);
151
+ --purple-heart-100: oklch(94% 0.03 309);
152
+ --purple-heart-200: oklch(88% 0.065 309);
153
+ --purple-heart-300: oklch(79% 0.135 309);
154
+ --purple-heart-400: oklch(68% 0.215 309);
155
+ --purple-heart-500: oklch(60% 0.275 309);
156
+ --purple-heart-600: oklch(52% 0.275 309);
157
+ --purple-heart-700: oklch(43% 0.23 309);
158
+ --purple-heart-800: oklch(33% 0.18 309);
159
+ --purple-heart-900: oklch(24% 0.135 309);
160
+ --purple-heart-950: oklch(15% 0.09 309);
161
+
162
+ /* Caribbean Green — Hue 173° (standard / success, teal-green).
163
+ 600 darkened to 45% L for AA on white. */
164
+ --caribbean-green-50: oklch(97.2% 0.018 173);
165
+ --caribbean-green-100: oklch(94% 0.035 173);
166
+ --caribbean-green-200: oklch(88% 0.07 173);
167
+ --caribbean-green-300: oklch(79% 0.115 173);
168
+ --caribbean-green-400: oklch(68% 0.14 173);
169
+ --caribbean-green-500: oklch(58% 0.135 173);
170
+ --caribbean-green-600: oklch(45% 0.118 173);
171
+ --caribbean-green-700: oklch(38% 0.1 173);
172
+ --caribbean-green-800: oklch(30% 0.08 173);
173
+ --caribbean-green-900: oklch(23% 0.06 173);
174
+ --caribbean-green-950: oklch(15% 0.04 173);
175
+
176
+ /* Flush Orange — Hue 52° (warning, amber-orange). Use 700 for body on white. */
177
+ --flush-orange-50: oklch(97.2% 0.018 52);
178
+ --flush-orange-100: oklch(94% 0.038 52);
179
+ --flush-orange-200: oklch(88% 0.075 52);
180
+ --flush-orange-300: oklch(79% 0.13 52);
181
+ --flush-orange-400: oklch(72% 0.17 52);
182
+ --flush-orange-500: oklch(68% 0.18 52);
183
+ --flush-orange-600: oklch(54% 0.155 52);
184
+ --flush-orange-700: oklch(45% 0.13 52);
185
+ --flush-orange-800: oklch(36% 0.105 52);
186
+ --flush-orange-900: oklch(28% 0.08 52);
187
+ --flush-orange-950: oklch(18% 0.055 52);
188
+
189
+ /* Azure Radiance — Hue 250° (info, sky-blue) */
190
+ --azure-radiance-50: oklch(97.2% 0.014 250);
191
+ --azure-radiance-100: oklch(94% 0.03 250);
192
+ --azure-radiance-200: oklch(88% 0.06 250);
193
+ --azure-radiance-300: oklch(79% 0.115 250);
194
+ --azure-radiance-400: oklch(68% 0.175 250);
195
+ --azure-radiance-500: oklch(60% 0.215 250);
196
+ --azure-radiance-600: oklch(52% 0.225 250);
197
+ --azure-radiance-700: oklch(43% 0.195 250);
198
+ --azure-radiance-800: oklch(34% 0.155 250);
199
+ --azure-radiance-900: oklch(25% 0.115 250);
200
+ --azure-radiance-950: oklch(16% 0.075 250);
201
+
202
+ /* Dark-tuned tone values (boosted chroma; activated via .dark below) */
203
+ --tone-edition-dark: oklch(62% 0.295 318);
204
+ --tone-collectible-dark: oklch(72% 0.225 285);
205
+ --tone-standard-dark: oklch(78% 0.205 168);
206
+ --tone-info-dark: oklch(76% 0.165 235);
207
+ --tone-warning-dark: oklch(82% 0.165 65);
208
+ --highlight-dark: oklch(70% 0.285 318);
209
+ --destructive-dark: oklch(68% 0.225 25);
210
+ /* Success twins the standard tone's dark value today (same caribbean-green),
211
+ but is a SEPARATE token a theme can retune independently of the post-type. */
212
+ --success-dark: oklch(78% 0.205 168);
213
+
214
+ /* ----------------------------------------------------------------------
215
+ Semantic tokens — light mode (the counterpart)
216
+ ---------------------------------------------------------------------- */
217
+ --background: var(--white);
218
+ --foreground: var(--zinc-950);
219
+ --card: var(--white);
220
+ --card-foreground: var(--zinc-950);
221
+ --popover: var(--white);
222
+ --popover-foreground: var(--zinc-950);
223
+
224
+ --primary: var(--zinc-950);
225
+ --primary-foreground: var(--zinc-50);
226
+ --secondary: var(--zinc-100);
227
+ --secondary-foreground: var(--zinc-950);
228
+ --muted: var(--zinc-100);
229
+ --muted-foreground: var(--zinc-600);
230
+ --accent: var(--zinc-100);
231
+ --accent-foreground: var(--zinc-950);
232
+ --destructive: var(--torch-red-600);
233
+ --destructive-foreground: var(--white);
234
+ --success: var(--caribbean-green-600);
235
+ --success-foreground: var(--zinc-50);
236
+
237
+ --border: var(--zinc-200);
238
+ /* Stronger structural divider (grid lines, table rules) — a higher-contrast
239
+ step on the same neutral ramp as --border. */
240
+ --border-strong: var(--zinc-300);
241
+ --input: var(--zinc-200);
242
+ --ring: var(--zinc-500);
243
+
244
+ /* Tones — light (all clear WCAG AA on white) */
245
+ --tone-standard: var(--caribbean-green-600);
246
+ --tone-collectible: var(--blue-gem-600);
247
+ --tone-edition: var(--purple-heart-700);
248
+ --tone-warning: var(--flush-orange-700);
249
+ --tone-info: var(--azure-radiance-600);
250
+ --highlight: var(--purple-heart-700);
251
+
252
+ /* Tone ink — light mode the tone fills resolve to dark 600/700 steps, so the
253
+ legible ink on them is the light neutral. (Flips to dark ink under .dark.) */
254
+ --tone-standard-foreground: var(--zinc-50);
255
+ --tone-collectible-foreground: var(--zinc-50);
256
+ --tone-edition-foreground: var(--zinc-50);
257
+ --tone-warning-foreground: var(--zinc-50);
258
+ --tone-info-foreground: var(--zinc-50);
259
+ --highlight-foreground: var(--zinc-50);
260
+
261
+ /* Overlay — a fixed, theme-independent dark surface (subtly-tinted near-black,
262
+ never pure #000) for scrims, media letterbox, and pills on imagery, with a
263
+ light ink. Mode-independent: a scrim darkens content in both themes, so the
264
+ same value is repeated verbatim under .dark below (kept explicit so every
265
+ semantic token resolves within each mode block — see themes.test.ts). */
266
+ --overlay: var(--zinc-950);
267
+ --overlay-foreground: var(--zinc-50);
268
+
269
+ /* Sidebar — light */
270
+ --sidebar: var(--white);
271
+ --sidebar-foreground: var(--zinc-950);
272
+ --sidebar-primary: var(--zinc-950);
273
+ --sidebar-primary-foreground: var(--zinc-50);
274
+ --sidebar-accent: var(--zinc-100);
275
+ --sidebar-accent-foreground: var(--zinc-950);
276
+ --sidebar-border: var(--zinc-200);
277
+ --sidebar-ring: var(--zinc-500);
278
+
279
+ /* ----------------------------------------------------------------------
280
+ Layout tokens (mode-independent) — see DESIGN.md → Grid & layout.
281
+ Fluid-first: no global max-width; max-width is opt-in per region.
282
+ ---------------------------------------------------------------------- */
283
+ /* Two spacing steps — 8px at the default scale — so every Stack/Row/Grid
284
+ gap number follows the density ("Character") control with the rest of
285
+ the spacing scale instead of staying a fixed 8px beside it. */
286
+ --rhythm-unit: calc(var(--spacing) * 2);
287
+ --grid-columns: 12;
288
+ /* Inter-column gutter: 16px on phones, easing to 24px on desktop. */
289
+ --grid-gutter: clamp(1rem, 0.8rem + 1vw, 1.5rem);
290
+ /* Page margin (outer inset): 16px → 32px, fluid. */
291
+ --page-inset: clamp(16px, 4vw, 32px);
292
+
293
+ /* Content-width scale — opt-in per Region (`max="…"`), named by PURPOSE not
294
+ size. Cap text MEASURE (prose) separately from layout WIDTH. A page's width
295
+ is a Region; the 12-col grid is used WITHIN a region for multi-column content.
296
+ See DESIGN.md → Grid & layout. */
297
+ --measure-prose: 65ch; /* reading measure (~66 chars) — long-form text */
298
+
299
+ /* px, NEVER rem — a region cap is a layout measurement, not type.
300
+ These were declared in rem with the px values stated in these very
301
+ comments, and the comments were wrong in any app that retunes the root
302
+ font size. The docs app runs a 14px responsive root, so `56rem` rendered
303
+ 784px while claiming 896px and `80rem` rendered 1120px while claiming
304
+ 1280px — the default theme silently 12.5% under its own spec, in its own
305
+ primary consumer. Every generated theme already declares px; Base was
306
+ the only one that did not, which is the worst possible one to get wrong.
307
+ The values below are DESIGN.md's table verbatim. */
308
+ --region-form: 480px; /* narrow single-col forms, auth, dialogs */
309
+ --region-feed: 640px; /* single-column timeline / reading feed */
310
+ --region-content: 896px; /* general content + settings/admin panes */
311
+ --region-wide: 1280px; /* dashboards, tables, multi-column grids */
312
+ --region-full: 1536px; /* full-bleed safety ceiling */
313
+ --region-ultrawide: 1800px; /* legacy — prefer --region-full */
314
+
315
+ --nav-height: 56px;
316
+ --sidebar-width: 256px;
317
+ --sidebar-width-collapsed: 64px;
318
+
319
+ /* Layering (z-index) moved to styles.css in 0.44.0 — it is contract, not
320
+ theme. A theme may override an individual step here; it must not be the
321
+ only place a step exists. See DESIGN.md → Layering. */
322
+
323
+ /* ----------------------------------------------------------------------
324
+ Motion tokens (mode-independent) — see DESIGN.md → Motion.
325
+ Quick, deliberate, skippable; no spring/overshoot in product UI.
326
+
327
+ Every duration is multiplied by --motion-scale, so one switch damps or
328
+ kills all token-driven motion: the global reduced-motion rule and the
329
+ <MotionProvider> toggle both set --motion-scale to 0 (see styles.css).
330
+ A duration of 0 makes transitions resolve instantly and infinite loaders
331
+ hold their first frame — i.e. motion becomes static, never broken.
332
+ ---------------------------------------------------------------------- */
333
+ --motion-scale: 1;
334
+
335
+ /* Duration ladder — the 75/150/200/300/500 scale, scaled by --motion-scale. */
336
+ --motion-duration-instant: calc(75ms * var(--motion-scale));
337
+ --motion-duration-fast: calc(150ms * var(--motion-scale));
338
+ --motion-duration-base: calc(200ms * var(--motion-scale));
339
+ --motion-duration-slow: calc(300ms * var(--motion-scale));
340
+ --motion-duration-slower: calc(500ms * var(--motion-scale));
341
+
342
+ /* Semantic durations — entrances settle a touch longer than exits. */
343
+ --motion-duration-enter: var(--motion-duration-base);
344
+ --motion-duration-exit: var(--motion-duration-fast);
345
+
346
+ /* Easings — semantic names (Material-family curves).
347
+ standard ≈ ease-in-out — two-way moves, the general default.
348
+ decelerate ≈ ease-out — entrances (fast in, soft settle).
349
+ emphasized — strong settle for larger surfaces (dialogs, sheets, drawers).
350
+ linear — indeterminate loaders (spin/shimmer).
351
+ spring — a gentle single overshoot (~+4%); the default for delightful
352
+ pops (overlay open, control selection). Tasteful, not gaudy.
353
+ bounce — a stronger overshoot (~+10%); opt-in for playful accents
354
+ (success ticks, celebratory moments). Use sparingly.
355
+ Springs are applied on ENTER only; exits stay overshoot-free. */
356
+ --motion-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
357
+ --motion-ease-decelerate: cubic-bezier(0, 0, 0.2, 1);
358
+ --motion-ease-emphasized: cubic-bezier(0.2, 0, 0, 1);
359
+ --motion-ease-spring: cubic-bezier(0.34, 1.35, 0.5, 1);
360
+ --motion-ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
361
+ --motion-ease-linear: linear;
362
+ }
363
+
364
+ /* ==========================================================================
365
+ Semantic tokens — dark mode (the brand default)
366
+ ========================================================================== */
367
+ .dark,
368
+ .dark[data-sable-theme="base"],
369
+ [data-sable-theme="base"].dark,
370
+ /* A preset-scoped subtree inside a dark page follows the page into dark mode;
371
+ add `.light` to that subtree to pin it light. */
372
+ .dark [data-sable-theme="base"]:not(.light) {
373
+ /* Elevation, dark. A drop barely registers on near-black, so depth is the
374
+ surface step (popover above card) plus a faint top-edge highlight that
375
+ catches "light" on anything floating. Deeper drops than light mode, since
376
+ black on near-black needs more alpha to read at all. */
377
+ --theme-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.3);
378
+ --theme-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.3), 0 2px 6px -1px rgb(0 0 0 / 0.25);
379
+ --theme-shadow-md: inset 0 1px 0 0 rgb(255 255 255 / 0.04), 0 1px 2px 0 rgb(0 0 0 / 0.3), 0 8px 20px -6px rgb(0 0 0 / 0.45);
380
+ --theme-shadow-lg: inset 0 1px 0 0 rgb(255 255 255 / 0.05), 0 2px 4px 0 rgb(0 0 0 / 0.3), 0 20px 40px -12px rgb(0 0 0 / 0.55);
381
+ --theme-shadow-xl: inset 0 1px 0 0 rgb(255 255 255 / 0.05), 0 2px 4px 0 rgb(0 0 0 / 0.3), 0 28px 56px -16px rgb(0 0 0 / 0.6);
382
+
383
+ --background: var(--zinc-950);
384
+ --foreground: var(--zinc-50);
385
+ --card: var(--zinc-900);
386
+ --card-foreground: var(--zinc-50);
387
+ --popover: var(--zinc-850);
388
+ --popover-foreground: var(--zinc-50);
389
+
390
+ --primary: var(--zinc-50);
391
+ --primary-foreground: var(--zinc-950);
392
+ --secondary: var(--zinc-800);
393
+ --secondary-foreground: var(--zinc-50);
394
+ --muted: var(--zinc-800);
395
+ --muted-foreground: var(--zinc-400);
396
+ --accent: var(--zinc-800);
397
+ --accent-foreground: var(--zinc-50);
398
+ --destructive: var(--destructive-dark);
399
+ /* Dark `--destructive` is a light, vibrant red (so `text-destructive` reads on
400
+ the near-black canvas). White ink on that fill is only ~3.3:1 (fails AA), so
401
+ the legible ink flips to the dark neutral — exactly like the tone fills below.
402
+ Dark ink on the light-red fill is ~5.9:1. */
403
+ --destructive-foreground: var(--zinc-950);
404
+ /* Like the tone fills, dark `--success` is a light, vibrant green, so the
405
+ legible ink flips to the dark neutral (same model as --destructive above). */
406
+ --success: var(--success-dark);
407
+ --success-foreground: var(--zinc-950);
408
+
409
+ --border: oklch(from var(--zinc-700) l c h / 0.4);
410
+ --border-strong: oklch(from var(--zinc-500) l c h / 0.55);
411
+ --input: oklch(from var(--zinc-700) l c h / 0.4);
412
+ --ring: var(--zinc-500);
413
+
414
+ /* Tones — dark-tuned (boosted chroma for vibrancy on the dark canvas) */
415
+ --tone-standard: var(--tone-standard-dark);
416
+ --tone-collectible: var(--tone-collectible-dark);
417
+ --tone-edition: var(--tone-edition-dark);
418
+ --tone-warning: var(--tone-warning-dark);
419
+ --tone-info: var(--tone-info-dark);
420
+ --highlight: var(--highlight-dark);
421
+
422
+ /* Tone ink — dark mode the tone fills resolve to lighter dark-tuned values,
423
+ so the legible ink flips to the dark neutral. (--overlay* repeat the :root
424
+ values verbatim — a dark scrim is the same in both modes.) */
425
+ --tone-standard-foreground: var(--zinc-950);
426
+ --tone-collectible-foreground: var(--zinc-950);
427
+ --tone-edition-foreground: var(--zinc-950);
428
+ --tone-warning-foreground: var(--zinc-950);
429
+ --tone-info-foreground: var(--zinc-950);
430
+ --highlight-foreground: var(--zinc-950);
431
+ --overlay: var(--zinc-950);
432
+ --overlay-foreground: var(--zinc-50);
433
+
434
+ /* Sidebar — dark */
435
+ --sidebar: var(--zinc-950);
436
+ --sidebar-foreground: var(--zinc-50);
437
+ --sidebar-primary: var(--zinc-50);
438
+ --sidebar-primary-foreground: var(--zinc-950);
439
+ --sidebar-accent: var(--zinc-800);
440
+ --sidebar-accent-foreground: var(--zinc-50);
441
+ --sidebar-border: var(--zinc-900);
442
+ --sidebar-ring: var(--zinc-500);
443
+ }
@@ -0,0 +1,9 @@
1
+ import { T as ThemeManifest } from '../../_contract-CYScOdf5.js';
2
+
3
+ /**
4
+ * Base — the default Sable theme. Concrete token values live in
5
+ * `base.css`; this manifest is the typed, machine-readable description.
6
+ */
7
+ declare const baseTheme: ThemeManifest;
8
+
9
+ export { baseTheme, baseTheme as default };
@@ -0,0 +1 @@
1
+ export { baseTheme, base_default as default } from '../../chunk-EP55KSYA.js';