@actuate-media/cms-admin 0.10.0 → 0.11.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 (284) hide show
  1. package/dist/AdminRoot.d.ts.map +1 -1
  2. package/dist/AdminRoot.js +8 -5
  3. package/dist/AdminRoot.js.map +1 -1
  4. package/dist/__tests__/layout/primitives.test.d.ts +2 -0
  5. package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
  6. package/dist/__tests__/layout/primitives.test.js +34 -0
  7. package/dist/__tests__/layout/primitives.test.js.map +1 -0
  8. package/dist/__tests__/lib/cv.test.d.ts +2 -0
  9. package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
  10. package/dist/__tests__/lib/cv.test.js +66 -0
  11. package/dist/__tests__/lib/cv.test.js.map +1 -0
  12. package/dist/actuate-admin.css +1 -1
  13. package/dist/assets/actuate-logo.d.ts +36 -0
  14. package/dist/assets/actuate-logo.d.ts.map +1 -0
  15. package/dist/assets/actuate-logo.js +15 -0
  16. package/dist/assets/actuate-logo.js.map +1 -0
  17. package/dist/components/Breadcrumbs.js +2 -2
  18. package/dist/components/CommandPalette.js +10 -10
  19. package/dist/components/ContentOverviewChart.js +3 -3
  20. package/dist/components/ErrorBoundary.js +1 -1
  21. package/dist/components/FocalPointPicker.js +2 -2
  22. package/dist/components/FolderTree.js +20 -20
  23. package/dist/components/LivePreview.js +3 -3
  24. package/dist/components/LocaleSwitcher.js +1 -1
  25. package/dist/components/MediaPickerModal.js +4 -4
  26. package/dist/components/PresenceIndicator.js +1 -1
  27. package/dist/components/SEOConfigPanel.d.ts +2 -0
  28. package/dist/components/SEOConfigPanel.d.ts.map +1 -0
  29. package/dist/components/SEOConfigPanel.js +174 -0
  30. package/dist/components/SEOConfigPanel.js.map +1 -0
  31. package/dist/components/SEOPanel.js +9 -9
  32. package/dist/components/SEOPerformance.js +2 -2
  33. package/dist/components/SchedulePublishDialog.js +1 -1
  34. package/dist/components/SharePreviewLinkDialog.js +1 -1
  35. package/dist/components/TipTapEditor.js +5 -5
  36. package/dist/components/VersionHistory.js +2 -2
  37. package/dist/components/ui/Badge.d.ts +33 -3
  38. package/dist/components/ui/Badge.d.ts.map +1 -1
  39. package/dist/components/ui/Badge.js +42 -8
  40. package/dist/components/ui/Badge.js.map +1 -1
  41. package/dist/components/ui/Button.d.ts +19 -8
  42. package/dist/components/ui/Button.d.ts.map +1 -1
  43. package/dist/components/ui/Button.js +35 -14
  44. package/dist/components/ui/Button.js.map +1 -1
  45. package/dist/components/ui/Card.d.ts +26 -0
  46. package/dist/components/ui/Card.d.ts.map +1 -0
  47. package/dist/components/ui/Card.js +45 -0
  48. package/dist/components/ui/Card.js.map +1 -0
  49. package/dist/components/ui/DataTable.js +1 -1
  50. package/dist/components/ui/Input.d.ts +15 -0
  51. package/dist/components/ui/Input.d.ts.map +1 -0
  52. package/dist/components/ui/Input.js +23 -0
  53. package/dist/components/ui/Input.js.map +1 -0
  54. package/dist/components/ui/SearchInput.js +1 -1
  55. package/dist/components/ui/Select.d.ts +16 -0
  56. package/dist/components/ui/Select.d.ts.map +1 -0
  57. package/dist/components/ui/Select.js +25 -0
  58. package/dist/components/ui/Select.js.map +1 -0
  59. package/dist/components/ui/Toast.js +1 -1
  60. package/dist/components/ui/index.d.ts +10 -4
  61. package/dist/components/ui/index.d.ts.map +1 -1
  62. package/dist/components/ui/index.js +5 -2
  63. package/dist/components/ui/index.js.map +1 -1
  64. package/dist/fields/BlockBuilderField.js +3 -3
  65. package/dist/fields/DateField.js +1 -1
  66. package/dist/fields/RelationshipField.js +3 -3
  67. package/dist/fields/TextField.js +1 -1
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +3 -0
  71. package/dist/index.js.map +1 -1
  72. package/dist/layout/Header.js +1 -1
  73. package/dist/layout/Layout.d.ts +14 -0
  74. package/dist/layout/Layout.d.ts.map +1 -1
  75. package/dist/layout/Layout.js +17 -11
  76. package/dist/layout/Layout.js.map +1 -1
  77. package/dist/layout/Sidebar.d.ts.map +1 -1
  78. package/dist/layout/Sidebar.js +21 -11
  79. package/dist/layout/Sidebar.js.map +1 -1
  80. package/dist/layout/primitives/AdminShell.d.ts +43 -0
  81. package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
  82. package/dist/layout/primitives/AdminShell.js +51 -0
  83. package/dist/layout/primitives/AdminShell.js.map +1 -0
  84. package/dist/layout/primitives/Box.d.ts +19 -0
  85. package/dist/layout/primitives/Box.d.ts.map +1 -0
  86. package/dist/layout/primitives/Box.js +12 -0
  87. package/dist/layout/primitives/Box.js.map +1 -0
  88. package/dist/layout/primitives/Cluster.d.ts +27 -0
  89. package/dist/layout/primitives/Cluster.d.ts.map +1 -0
  90. package/dist/layout/primitives/Cluster.js +37 -0
  91. package/dist/layout/primitives/Cluster.js.map +1 -0
  92. package/dist/layout/primitives/Grid.d.ts +45 -0
  93. package/dist/layout/primitives/Grid.d.ts.map +1 -0
  94. package/dist/layout/primitives/Grid.js +59 -0
  95. package/dist/layout/primitives/Grid.js.map +1 -0
  96. package/dist/layout/primitives/PageContainer.d.ts +36 -0
  97. package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
  98. package/dist/layout/primitives/PageContainer.js +41 -0
  99. package/dist/layout/primitives/PageContainer.js.map +1 -0
  100. package/dist/layout/primitives/Split.d.ts +34 -0
  101. package/dist/layout/primitives/Split.d.ts.map +1 -0
  102. package/dist/layout/primitives/Split.js +27 -0
  103. package/dist/layout/primitives/Split.js.map +1 -0
  104. package/dist/layout/primitives/Stack.d.ts +23 -0
  105. package/dist/layout/primitives/Stack.d.ts.map +1 -0
  106. package/dist/layout/primitives/Stack.js +34 -0
  107. package/dist/layout/primitives/Stack.js.map +1 -0
  108. package/dist/layout/primitives/index.d.ts +30 -0
  109. package/dist/layout/primitives/index.d.ts.map +1 -0
  110. package/dist/layout/primitives/index.js +22 -0
  111. package/dist/layout/primitives/index.js.map +1 -0
  112. package/dist/layout/primitives/tokens.d.ts +48 -0
  113. package/dist/layout/primitives/tokens.d.ts.map +1 -0
  114. package/dist/layout/primitives/tokens.js +54 -0
  115. package/dist/layout/primitives/tokens.js.map +1 -0
  116. package/dist/lib/cv.d.ts +53 -0
  117. package/dist/lib/cv.d.ts.map +1 -0
  118. package/dist/lib/cv.js +39 -0
  119. package/dist/lib/cv.js.map +1 -0
  120. package/dist/views/ApiKeys.js +7 -7
  121. package/dist/views/CollectionList.js +8 -8
  122. package/dist/views/Dashboard.d.ts.map +1 -1
  123. package/dist/views/Dashboard.js +333 -78
  124. package/dist/views/Dashboard.js.map +1 -1
  125. package/dist/views/DocumentEdit.js +3 -3
  126. package/dist/views/ForgotPassword.js +2 -2
  127. package/dist/views/FormEditor.js +5 -5
  128. package/dist/views/FormSubmissions.js +6 -6
  129. package/dist/views/Forms.js +2 -2
  130. package/dist/views/Login.d.ts +16 -1
  131. package/dist/views/Login.d.ts.map +1 -1
  132. package/dist/views/Login.js +17 -7
  133. package/dist/views/Login.js.map +1 -1
  134. package/dist/views/MediaBrowser.js +16 -16
  135. package/dist/views/PageEditor.js +2 -2
  136. package/dist/views/Pages.js +10 -10
  137. package/dist/views/PostEditor.js +2 -2
  138. package/dist/views/Posts.js +4 -4
  139. package/dist/views/Redirects.js +4 -4
  140. package/dist/views/ResetPassword.js +2 -2
  141. package/dist/views/SEO.js +6 -6
  142. package/dist/views/ScriptTagEditor.js +4 -4
  143. package/dist/views/ScriptTags.js +2 -2
  144. package/dist/views/Settings.d.ts.map +1 -1
  145. package/dist/views/Settings.js +9 -8
  146. package/dist/views/Settings.js.map +1 -1
  147. package/dist/views/SetupWizard.js +2 -2
  148. package/dist/views/Users.js +4 -4
  149. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  150. package/dist/views/page-builder/AIGenerateDialog.js +10 -10
  151. package/dist/views/page-builder/BlockEditor.js +10 -10
  152. package/dist/views/page-builder/BlockPicker.js +4 -4
  153. package/dist/views/page-builder/BottomBar.js +1 -1
  154. package/dist/views/page-builder/BuilderToolbar.js +2 -2
  155. package/dist/views/page-builder/ContextPanel.js +2 -2
  156. package/dist/views/page-builder/DesignScore.js +9 -9
  157. package/dist/views/page-builder/NodeSettings.js +8 -8
  158. package/dist/views/page-builder/PageBuilder.js +3 -3
  159. package/dist/views/page-builder/PageSettings.js +1 -1
  160. package/dist/views/page-builder/PageTemplates.js +2 -2
  161. package/dist/views/page-builder/SEOPanel.js +13 -13
  162. package/dist/views/page-builder/SavedSections.js +5 -5
  163. package/dist/views/page-builder/TemplatePicker.js +2 -2
  164. package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
  165. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  166. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
  167. package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
  168. package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
  169. package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
  170. package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
  171. package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
  172. package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
  173. package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
  174. package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
  175. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
  176. package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
  177. package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
  178. package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
  179. package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
  180. package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
  181. package/package.json +6 -2
  182. package/src/AdminRoot.tsx +21 -11
  183. package/src/__tests__/layout/primitives.test.ts +37 -0
  184. package/src/__tests__/lib/cv.test.ts +74 -0
  185. package/src/assets/actuate-logo.tsx +72 -0
  186. package/src/components/Breadcrumbs.tsx +6 -6
  187. package/src/components/CommandPalette.tsx +34 -34
  188. package/src/components/ContentOverviewChart.tsx +3 -3
  189. package/src/components/ErrorBoundary.tsx +3 -3
  190. package/src/components/FocalPointPicker.tsx +4 -4
  191. package/src/components/FolderTree.tsx +38 -38
  192. package/src/components/LivePreview.tsx +16 -16
  193. package/src/components/LocaleSwitcher.tsx +7 -7
  194. package/src/components/MediaPickerModal.tsx +21 -21
  195. package/src/components/PresenceIndicator.tsx +2 -2
  196. package/src/components/SEOConfigPanel.tsx +582 -0
  197. package/src/components/SEOPanel.tsx +46 -46
  198. package/src/components/SEOPerformance.tsx +21 -21
  199. package/src/components/SchedulePublishDialog.tsx +4 -4
  200. package/src/components/SharePreviewLinkDialog.tsx +1 -1
  201. package/src/components/TipTapEditor.tsx +33 -33
  202. package/src/components/VersionHistory.tsx +16 -16
  203. package/src/components/ui/Badge.tsx +66 -14
  204. package/src/components/ui/Button.tsx +70 -33
  205. package/src/components/ui/Card.tsx +101 -0
  206. package/src/components/ui/DataTable.tsx +1 -1
  207. package/src/components/ui/Input.tsx +35 -0
  208. package/src/components/ui/SearchInput.tsx +4 -4
  209. package/src/components/ui/Select.tsx +56 -0
  210. package/src/components/ui/Toast.tsx +1 -1
  211. package/src/components/ui/index.ts +18 -4
  212. package/src/fields/BlockBuilderField.tsx +3 -3
  213. package/src/fields/DateField.tsx +1 -1
  214. package/src/fields/RelationshipField.tsx +10 -10
  215. package/src/fields/TextField.tsx +1 -1
  216. package/src/index.ts +28 -0
  217. package/src/layout/Header.tsx +28 -28
  218. package/src/layout/Layout.tsx +39 -46
  219. package/src/layout/Sidebar.tsx +37 -64
  220. package/src/layout/primitives/AdminShell.tsx +118 -0
  221. package/src/layout/primitives/Box.tsx +30 -0
  222. package/src/layout/primitives/Cluster.tsx +74 -0
  223. package/src/layout/primitives/Grid.tsx +120 -0
  224. package/src/layout/primitives/PageContainer.tsx +96 -0
  225. package/src/layout/primitives/Split.tsx +73 -0
  226. package/src/layout/primitives/Stack.tsx +67 -0
  227. package/src/layout/primitives/index.ts +36 -0
  228. package/src/layout/primitives/tokens.ts +76 -0
  229. package/src/lib/cv.ts +96 -0
  230. package/src/styles/build-input.css +1 -1
  231. package/src/views/ApiKeys.tsx +57 -57
  232. package/src/views/CollectionList.tsx +30 -30
  233. package/src/views/Dashboard.tsx +737 -186
  234. package/src/views/DocumentEdit.tsx +9 -9
  235. package/src/views/ForgotPassword.tsx +18 -18
  236. package/src/views/FormEditor.tsx +75 -75
  237. package/src/views/FormSubmissions.tsx +76 -76
  238. package/src/views/Forms.tsx +27 -27
  239. package/src/views/Login.tsx +65 -25
  240. package/src/views/MediaBrowser.tsx +127 -127
  241. package/src/views/PageEditor.tsx +25 -25
  242. package/src/views/Pages.tsx +59 -59
  243. package/src/views/PostEditor.tsx +37 -37
  244. package/src/views/Posts.tsx +48 -48
  245. package/src/views/Redirects.tsx +21 -21
  246. package/src/views/ResetPassword.tsx +28 -28
  247. package/src/views/SEO.tsx +144 -144
  248. package/src/views/ScriptTagEditor.tsx +24 -24
  249. package/src/views/ScriptTags.tsx +10 -10
  250. package/src/views/Settings.tsx +88 -80
  251. package/src/views/SetupWizard.tsx +28 -28
  252. package/src/views/Users.tsx +20 -20
  253. package/src/views/page-builder/AIBlockAssist.tsx +1 -1
  254. package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
  255. package/src/views/page-builder/BlockEditor.tsx +26 -26
  256. package/src/views/page-builder/BlockPicker.tsx +22 -22
  257. package/src/views/page-builder/BottomBar.tsx +8 -8
  258. package/src/views/page-builder/BuilderToolbar.tsx +17 -17
  259. package/src/views/page-builder/ContextPanel.tsx +3 -3
  260. package/src/views/page-builder/DesignScore.tsx +21 -21
  261. package/src/views/page-builder/NodeSettings.tsx +27 -27
  262. package/src/views/page-builder/PageBuilder.tsx +11 -11
  263. package/src/views/page-builder/PageSettings.tsx +4 -4
  264. package/src/views/page-builder/PageTemplates.tsx +18 -18
  265. package/src/views/page-builder/SEOPanel.tsx +53 -53
  266. package/src/views/page-builder/SavedSections.tsx +37 -37
  267. package/src/views/page-builder/TemplatePicker.tsx +17 -17
  268. package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
  269. package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
  270. package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
  271. package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
  272. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
  273. package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
  274. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
  275. package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
  276. package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
  277. package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
  278. package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
  279. package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
  280. package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
  281. package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
  282. package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
  283. package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
  284. package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
@@ -0,0 +1,19 @@
1
+ import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
+ export interface BoxProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {
3
+ /**
4
+ * The element to render. Defaults to `div`. Use semantic elements (`<section>`,
5
+ * `<article>`, etc.) for accessibility — Box is the lowest-level escape
6
+ * hatch and exists primarily so views don't reach for raw `<div>` with
7
+ * five Tailwind utilities.
8
+ */
9
+ as?: ElementType;
10
+ children?: ReactNode;
11
+ }
12
+ /**
13
+ * The lowest-level primitive — a forwardRef'd div (by default) that exists
14
+ * so consumers always have a stable, semantically-tagged container to
15
+ * compose around. Prefer Box over a bare `<div>` to keep the design system
16
+ * audit clean.
17
+ */
18
+ export declare const Box: import("react").ForwardRefExoticComponent<BoxProps & import("react").RefAttributes<HTMLElement>>;
19
+ //# sourceMappingURL=Box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Box.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Box.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAEnE,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IAC7E;;;;;OAKG;IACH,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,GAAG,kGASd,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ /**
4
+ * The lowest-level primitive — a forwardRef'd div (by default) that exists
5
+ * so consumers always have a stable, semantically-tagged container to
6
+ * compose around. Prefer Box over a bare `<div>` to keep the design system
7
+ * audit clean.
8
+ */
9
+ export const Box = forwardRef(function Box({ as: Component = 'div', children, ...rest }, ref) {
10
+ return (_jsx(Component, { ref: ref, ...rest, children: children }));
11
+ });
12
+ //# sourceMappingURL=Box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Box.js","sourceRoot":"","sources":["../../../src/layout/primitives/Box.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAclC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAwB,SAAS,GAAG,CAC/D,EAAE,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAC5C,GAAG;IAEH,OAAO,CACL,KAAC,SAAS,IAAC,GAAG,EAAE,GAAG,KAAM,IAAI,YAC1B,QAAQ,GACC,CACb,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
+ import type { SpaceToken } from './tokens.js';
3
+ export type ClusterAlign = 'start' | 'center' | 'end' | 'baseline' | 'stretch';
4
+ export type ClusterJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
5
+ export interface ClusterProps extends HTMLAttributes<HTMLElement> {
6
+ /** Gap between children. Maps to Tailwind `gap-{space}`. */
7
+ space?: SpaceToken;
8
+ /** Render as a different element. Defaults to `div`. */
9
+ as?: ElementType;
10
+ /** Align items on the cross axis. */
11
+ align?: ClusterAlign;
12
+ /** Distribute items along the main axis. */
13
+ justify?: ClusterJustify;
14
+ /** Reverse the order of children. */
15
+ reverse?: boolean;
16
+ /** Disable wrapping (default: true, items wrap on overflow). */
17
+ noWrap?: boolean;
18
+ children?: ReactNode;
19
+ }
20
+ /**
21
+ * Horizontal cluster of items with a consistent gap, wrapping by default.
22
+ * The canonical use case is action toolbars (`<Cluster justify="end">`),
23
+ * badge groups, breadcrumbs, etc. Never reach for `flex flex-wrap gap-2`
24
+ * directly — use Cluster.
25
+ */
26
+ export declare function Cluster({ space, as: Component, align, justify, reverse, noWrap, className, children, ...rest }: ClusterProps): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=Cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cluster.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Cluster.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;AAC9E,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEzF,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC/D,4DAA4D;IAC5D,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,wDAAwD;IACxD,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,qCAAqC;IACrC,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAmBD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAW,EACX,EAAE,EAAE,SAAiB,EACrB,KAAgB,EAChB,OAAiB,EACjB,OAAO,EACP,MAAM,EACN,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,YAAY,2CAkBd"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const ALIGN_CLASS = {
3
+ start: 'items-start',
4
+ center: 'items-center',
5
+ end: 'items-end',
6
+ baseline: 'items-baseline',
7
+ stretch: 'items-stretch',
8
+ };
9
+ const JUSTIFY_CLASS = {
10
+ start: 'justify-start',
11
+ center: 'justify-center',
12
+ end: 'justify-end',
13
+ between: 'justify-between',
14
+ around: 'justify-around',
15
+ evenly: 'justify-evenly',
16
+ };
17
+ /**
18
+ * Horizontal cluster of items with a consistent gap, wrapping by default.
19
+ * The canonical use case is action toolbars (`<Cluster justify="end">`),
20
+ * badge groups, breadcrumbs, etc. Never reach for `flex flex-wrap gap-2`
21
+ * directly — use Cluster.
22
+ */
23
+ export function Cluster({ space = '2', as: Component = 'div', align = 'center', justify = 'start', reverse, noWrap, className = '', children, ...rest }) {
24
+ const classes = [
25
+ 'flex',
26
+ reverse ? 'flex-row-reverse' : 'flex-row',
27
+ noWrap ? 'flex-nowrap' : 'flex-wrap',
28
+ `gap-${space}`,
29
+ ALIGN_CLASS[align],
30
+ JUSTIFY_CLASS[justify],
31
+ className,
32
+ ]
33
+ .filter(Boolean)
34
+ .join(' ');
35
+ return (_jsx(Component, { className: classes, ...rest, children: children }));
36
+ }
37
+ //# sourceMappingURL=Cluster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cluster.js","sourceRoot":"","sources":["../../../src/layout/primitives/Cluster.tsx"],"names":[],"mappings":";AAsBA,MAAM,WAAW,GAAiC;IAChD,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,GAAG,EAAE,WAAW;IAChB,QAAQ,EAAE,gBAAgB;IAC1B,OAAO,EAAE,eAAe;CACzB,CAAA;AAED,MAAM,aAAa,GAAmC;IACpD,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,EACtB,KAAK,GAAG,GAAG,EACX,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,KAAK,GAAG,QAAQ,EAChB,OAAO,GAAG,OAAO,EACjB,OAAO,EACP,MAAM,EACN,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EACM;IACb,MAAM,OAAO,GAAG;QACd,MAAM;QACN,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU;QACzC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;QACpC,OAAO,KAAK,EAAE;QACd,WAAW,CAAC,KAAK,CAAC;QAClB,aAAa,CAAC,OAAO,CAAC;QACtB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,KAAC,SAAS,IAAC,SAAS,EAAE,OAAO,KAAM,IAAI,YACpC,QAAQ,GACC,CACb,CAAA;AACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
+ import type { SpaceToken } from './tokens.js';
3
+ /**
4
+ * Responsive column count. Pass a number for static grids, or a map to
5
+ * change column count at each breakpoint.
6
+ *
7
+ * @example
8
+ * columns={3} // 3 cols at every breakpoint
9
+ * columns={{ base: 1, md: 2, lg: 4 }} // responsive
10
+ */
11
+ export type GridResponsive = number | {
12
+ base?: number;
13
+ sm?: number;
14
+ md?: number;
15
+ lg?: number;
16
+ xl?: number;
17
+ '2xl'?: number;
18
+ };
19
+ export interface GridProps extends HTMLAttributes<HTMLElement> {
20
+ columns: GridResponsive;
21
+ /** Gap between cells. */
22
+ space?: SpaceToken;
23
+ /** Row gap (defaults to `space`). */
24
+ rowSpace?: SpaceToken;
25
+ /** Render as a different element. Defaults to `div`. */
26
+ as?: ElementType;
27
+ /**
28
+ * Use auto-fit instead of explicit column counts. When set, `minItemWidth`
29
+ * controls the minimum tile width before the grid reflows. Use this for
30
+ * card grids that should adapt to container width without specific
31
+ * breakpoints.
32
+ */
33
+ autoFit?: boolean;
34
+ /** Min tile width when `autoFit` is true. Defaults to `16rem`. */
35
+ minItemWidth?: string;
36
+ children?: ReactNode;
37
+ }
38
+ /**
39
+ * Responsive CSS grid primitive. Pass either an explicit `columns` count
40
+ * (per-breakpoint or static) or set `autoFit` for a `repeat(auto-fit, …)`
41
+ * tile grid. Both modes share the same `space` / `rowSpace` knobs so
42
+ * usage is consistent across views.
43
+ */
44
+ export declare function Grid({ columns, space, rowSpace, as: Component, autoFit, minItemWidth, className, style, children, ...rest }: GridProps): import("react/jsx-runtime").JSX.Element;
45
+ //# sourceMappingURL=Grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzF,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC5D,OAAO,EAAE,cAAc,CAAA;IACvB,yBAAyB;IACzB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,wDAAwD;IACxD,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAoCD;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,KAAW,EACX,QAAQ,EACR,EAAE,EAAE,SAAiB,EACrB,OAAO,EACP,YAAsB,EACtB,SAAc,EACd,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,SAAS,2CAiCX"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const COL_CLASS = {
3
+ 1: 'grid-cols-1',
4
+ 2: 'grid-cols-2',
5
+ 3: 'grid-cols-3',
6
+ 4: 'grid-cols-4',
7
+ 5: 'grid-cols-5',
8
+ 6: 'grid-cols-6',
9
+ 7: 'grid-cols-7',
10
+ 8: 'grid-cols-8',
11
+ 9: 'grid-cols-9',
12
+ 10: 'grid-cols-10',
13
+ 11: 'grid-cols-11',
14
+ 12: 'grid-cols-12',
15
+ };
16
+ const BP_PREFIX = ['', 'sm:', 'md:', 'lg:', 'xl:', '2xl:'];
17
+ function columnsToClasses(columns) {
18
+ if (typeof columns === 'number') {
19
+ return COL_CLASS[columns] ?? 'grid-cols-1';
20
+ }
21
+ const order = ['base', 'sm', 'md', 'lg', 'xl', '2xl'];
22
+ return order
23
+ .map((bp, i) => {
24
+ const n = columns[bp];
25
+ if (!n)
26
+ return '';
27
+ const base = COL_CLASS[n] ?? 'grid-cols-1';
28
+ return BP_PREFIX[i] + base;
29
+ })
30
+ .filter(Boolean)
31
+ .join(' ');
32
+ }
33
+ /**
34
+ * Responsive CSS grid primitive. Pass either an explicit `columns` count
35
+ * (per-breakpoint or static) or set `autoFit` for a `repeat(auto-fit, …)`
36
+ * tile grid. Both modes share the same `space` / `rowSpace` knobs so
37
+ * usage is consistent across views.
38
+ */
39
+ export function Grid({ columns, space = '4', rowSpace, as: Component = 'div', autoFit, minItemWidth = '16rem', className = '', style, children, ...rest }) {
40
+ if (autoFit) {
41
+ return (_jsx(Component, { className: ['grid', `gap-${space}`, rowSpace ? `gap-y-${rowSpace}` : '', className]
42
+ .filter(Boolean)
43
+ .join(' '), style: {
44
+ gridTemplateColumns: `repeat(auto-fit, minmax(${minItemWidth}, 1fr))`,
45
+ ...style,
46
+ }, ...rest, children: children }));
47
+ }
48
+ const classes = [
49
+ 'grid',
50
+ columnsToClasses(columns),
51
+ `gap-${space}`,
52
+ rowSpace ? `gap-y-${rowSpace}` : '',
53
+ className,
54
+ ]
55
+ .filter(Boolean)
56
+ .join(' ');
57
+ return (_jsx(Component, { className: classes, style: style, ...rest, children: children }));
58
+ }
59
+ //# sourceMappingURL=Grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Grid.js","sourceRoot":"","sources":["../../../src/layout/primitives/Grid.tsx"],"names":[],"mappings":";AAmCA,MAAM,SAAS,GAA2B;IACxC,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,cAAc;CACnB,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAA;AAGnE,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,aAAa,CAAA;IAC5C,CAAC;IACD,MAAM,KAAK,GAAY,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAC9D,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;QACrB,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAA;QACjB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,aAAa,CAAA;QAC1C,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC5B,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,EACnB,OAAO,EACP,KAAK,GAAG,GAAG,EACX,QAAQ,EACR,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,OAAO,EACP,YAAY,GAAG,OAAO,EACtB,SAAS,GAAG,EAAE,EACd,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACG;IACV,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;iBAChF,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC,EACZ,KAAK,EAAE;gBACL,mBAAmB,EAAE,2BAA2B,YAAY,SAAS;gBACrE,GAAG,KAAK;aACT,KACG,IAAI,YAEP,QAAQ,GACC,CACb,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG;QACd,MAAM;QACN,gBAAgB,CAAC,OAAO,CAAC;QACzB,OAAO,KAAK,EAAE;QACd,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QACnC,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,KAAC,SAAS,IAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAM,IAAI,YAClD,QAAQ,GACC,CACb,CAAA;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export interface PageContainerProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
3
+ /** Page title rendered as an h1 inside the page header. */
4
+ title?: ReactNode;
5
+ /** Optional sub-headline shown beneath the title. */
6
+ description?: ReactNode;
7
+ /** Right-aligned action area (buttons, filters). Rendered in the header. */
8
+ actions?: ReactNode;
9
+ /**
10
+ * Maximum width of the content. Defaults to `7xl` (Tailwind's max-w-7xl,
11
+ * ~1280px). Pass `'full'` for edge-to-edge content.
12
+ */
13
+ maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full';
14
+ /** Horizontal padding token. Defaults to `6` (24px). */
15
+ paddingX?: '4' | '6' | '8';
16
+ /** Vertical padding token. Defaults to `6`. */
17
+ paddingY?: '4' | '6' | '8' | '10';
18
+ /** Vertical gap between the header and the body. Defaults to `6`. */
19
+ gap?: '4' | '6' | '8';
20
+ children?: ReactNode;
21
+ }
22
+ /**
23
+ * The single canonical wrapper for every admin page. PageContainer owns
24
+ * three responsibilities so individual views can stop redoing them:
25
+ *
26
+ * 1. Consistent max-width + horizontal padding (so dashboards, lists, and
27
+ * forms all line up visually).
28
+ * 2. A standard header slot with title + description + actions.
29
+ * 3. A standard body slot rendered as a `<Stack>` so children stack with
30
+ * consistent vertical rhythm.
31
+ *
32
+ * Use PageContainer at the top of every screen. Compose with `<Stack>` /
33
+ * `<Grid>` / `<Cluster>` inside. Never roll a per-screen wrapper.
34
+ */
35
+ export declare function PageContainer({ title, description, actions, maxWidth, paddingX, paddingY, gap, className, children, ...rest }: PageContainerProps): import("react/jsx-runtime").JSX.Element;
36
+ //# sourceMappingURL=PageContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageContainer.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/PageContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IACpF,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,qDAAqD;IACrD,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC7F,wDAAwD;IACxD,QAAQ,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAA;IACjC,qEAAqE;IACrE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAgBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAgB,EAChB,QAAc,EACd,QAAc,EACd,GAAS,EACT,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,kBAAkB,2CAiCpB"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Stack } from './Stack.js';
3
+ const MAX_WIDTH_CLASS = {
4
+ sm: 'max-w-sm',
5
+ md: 'max-w-md',
6
+ lg: 'max-w-lg',
7
+ xl: 'max-w-xl',
8
+ '2xl': 'max-w-2xl',
9
+ '3xl': 'max-w-3xl',
10
+ '4xl': 'max-w-4xl',
11
+ '5xl': 'max-w-5xl',
12
+ '6xl': 'max-w-6xl',
13
+ '7xl': 'max-w-7xl',
14
+ full: 'max-w-none',
15
+ };
16
+ /**
17
+ * The single canonical wrapper for every admin page. PageContainer owns
18
+ * three responsibilities so individual views can stop redoing them:
19
+ *
20
+ * 1. Consistent max-width + horizontal padding (so dashboards, lists, and
21
+ * forms all line up visually).
22
+ * 2. A standard header slot with title + description + actions.
23
+ * 3. A standard body slot rendered as a `<Stack>` so children stack with
24
+ * consistent vertical rhythm.
25
+ *
26
+ * Use PageContainer at the top of every screen. Compose with `<Stack>` /
27
+ * `<Grid>` / `<Cluster>` inside. Never roll a per-screen wrapper.
28
+ */
29
+ export function PageContainer({ title, description, actions, maxWidth = '7xl', paddingX = '6', paddingY = '6', gap = '6', className = '', children, ...rest }) {
30
+ const outerClasses = [
31
+ 'mx-auto w-full',
32
+ MAX_WIDTH_CLASS[maxWidth],
33
+ `px-${paddingX}`,
34
+ `py-${paddingY}`,
35
+ className,
36
+ ]
37
+ .filter(Boolean)
38
+ .join(' ');
39
+ return (_jsx("section", { className: outerClasses, ...rest, children: _jsxs(Stack, { space: gap, children: [(title || description || actions) && (_jsxs("header", { className: "flex flex-col gap-3 md:flex-row md:items-start md:justify-between", children: [(title || description) && (_jsxs("div", { className: "min-w-0", children: [title && (_jsx("h1", { className: "text-foreground truncate text-2xl font-semibold tracking-tight", children: title })), description && _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: description })] })), actions && _jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })] })), children] }) }));
40
+ }
41
+ //# sourceMappingURL=PageContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageContainer.js","sourceRoot":"","sources":["../../../src/layout/primitives/PageContainer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAuBlC,MAAM,eAAe,GAAgE;IACnF,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,YAAY;CACnB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,GAAG,EACd,GAAG,GAAG,GAAG,EACT,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EACY;IACnB,MAAM,YAAY,GAAG;QACnB,gBAAgB;QAChB,eAAe,CAAC,QAAQ,CAAC;QACzB,MAAM,QAAQ,EAAE;QAChB,MAAM,QAAQ,EAAE;QAChB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,kBAAS,SAAS,EAAE,YAAY,KAAM,IAAI,YACxC,MAAC,KAAK,IAAC,KAAK,EAAE,GAAG,aACd,CAAC,KAAK,IAAI,WAAW,IAAI,OAAO,CAAC,IAAI,CACpC,kBAAQ,SAAS,EAAC,mEAAmE,aAClF,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CACzB,eAAK,SAAS,EAAC,SAAS,aACrB,KAAK,IAAI,CACR,aAAI,SAAS,EAAC,gEAAgE,YAC3E,KAAK,GACH,CACN,EACA,WAAW,IAAI,YAAG,SAAS,EAAC,oCAAoC,YAAE,WAAW,GAAK,IAC/E,CACP,EACA,OAAO,IAAI,cAAK,SAAS,EAAC,kCAAkC,YAAE,OAAO,GAAO,IACtE,CACV,EACA,QAAQ,IACH,GACA,CACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
+ import type { SpaceToken } from './tokens.js';
3
+ export interface SplitProps extends HTMLAttributes<HTMLElement> {
4
+ /**
5
+ * Fraction of the container the primary pane should take, expressed as
6
+ * a CSS fraction string. Defaults to `'2fr 1fr'` (primary 2x sidebar).
7
+ *
8
+ * @example
9
+ * <Split fraction="3fr 1fr"> // 75% / 25%
10
+ * <Split fraction="minmax(0, 1fr) 320px"> // fluid + fixed sidebar
11
+ */
12
+ fraction?: string;
13
+ /** Gap between the two panes. */
14
+ space?: SpaceToken;
15
+ /**
16
+ * Stack vertically at this breakpoint and below. Pass `false` to never
17
+ * stack. Defaults to `md` (stacks on screens narrower than 768px).
18
+ */
19
+ stackBelow?: 'sm' | 'md' | 'lg' | 'xl' | false;
20
+ /** Reverse the order of children (sidebar first instead of second). */
21
+ reverse?: boolean;
22
+ /** Render as a different element. */
23
+ as?: ElementType;
24
+ children: [ReactNode, ReactNode];
25
+ }
26
+ /**
27
+ * Two-pane split layout (primary + sidebar/aside) that collapses to a
28
+ * stacked layout below a configurable breakpoint. Use this for the
29
+ * document editor (`<Split fraction="minmax(0, 1fr) 320px">`), settings
30
+ * pages with a navigation rail, etc. — anywhere two panes need to live
31
+ * side-by-side at desktop widths and stack on mobile.
32
+ */
33
+ export declare function Split({ fraction, space, stackBelow, reverse, as: Component, className, style, children, ...rest }: SplitProps): import("react/jsx-runtime").JSX.Element;
34
+ //# sourceMappingURL=Split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Split.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Split.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC7D;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iCAAiC;IACjC,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAA;IAC9C,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qCAAqC;IACrC,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;CACjC;AASD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,EACpB,QAAoB,EACpB,KAAW,EACX,UAAiB,EACjB,OAAO,EACP,EAAE,EAAE,SAAiB,EACrB,SAAc,EACd,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,UAAU,2CAqBZ"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const STACK_BELOW_CLASS = {
3
+ sm: 'sm:grid',
4
+ md: 'md:grid',
5
+ lg: 'lg:grid',
6
+ xl: 'xl:grid',
7
+ };
8
+ /**
9
+ * Two-pane split layout (primary + sidebar/aside) that collapses to a
10
+ * stacked layout below a configurable breakpoint. Use this for the
11
+ * document editor (`<Split fraction="minmax(0, 1fr) 320px">`), settings
12
+ * pages with a navigation rail, etc. — anywhere two panes need to live
13
+ * side-by-side at desktop widths and stack on mobile.
14
+ */
15
+ export function Split({ fraction = '2fr 1fr', space = '6', stackBelow = 'md', reverse, as: Component = 'div', className = '', style, children, ...rest }) {
16
+ const stackClass = stackBelow === false ? 'grid' : `flex flex-col ${STACK_BELOW_CLASS[stackBelow]}`;
17
+ const classes = [stackClass, `gap-${space}`, reverse ? 'flex-col-reverse' : '', className]
18
+ .filter(Boolean)
19
+ .join(' ');
20
+ return (_jsx(Component, { className: classes, style: {
21
+ ...(stackBelow === false
22
+ ? { gridTemplateColumns: fraction }
23
+ : { gridTemplateColumns: fraction }),
24
+ ...style,
25
+ }, ...rest, children: children }));
26
+ }
27
+ //# sourceMappingURL=Split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Split.js","sourceRoot":"","sources":["../../../src/layout/primitives/Split.tsx"],"names":[],"mappings":";AA2BA,MAAM,iBAAiB,GAAG;IACxB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;CACL,CAAA;AAEV;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,QAAQ,GAAG,SAAS,EACpB,KAAK,GAAG,GAAG,EACX,UAAU,GAAG,IAAI,EACjB,OAAO,EACP,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,SAAS,GAAG,EAAE,EACd,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACI;IACX,MAAM,UAAU,GACd,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAA;IAClF,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;SACvF,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,KAAC,SAAS,IACR,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE;YACL,GAAG,CAAC,UAAU,KAAK,KAAK;gBACtB,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,EAAE;gBACnC,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC;YACtC,GAAG,KAAK;SACT,KACG,IAAI,YAEP,QAAQ,GACC,CACb,CAAA;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
+ import type { SpaceToken } from './tokens.js';
3
+ export type StackSpace = SpaceToken;
4
+ export interface StackProps extends HTMLAttributes<HTMLElement> {
5
+ /** Vertical gap between children. Maps to Tailwind `gap-{space}`. */
6
+ space?: StackSpace;
7
+ /** Render as a different element (e.g. `<section>`, `<article>`). Defaults to `div`. */
8
+ as?: ElementType;
9
+ /** Center children horizontally (sets `items-center`). */
10
+ align?: 'start' | 'center' | 'end' | 'stretch';
11
+ /** Distribute vertical space (sets `justify-{value}`). */
12
+ justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
13
+ /** Stretch the stack to fill its parent's height. */
14
+ fill?: boolean;
15
+ children?: ReactNode;
16
+ }
17
+ /**
18
+ * Vertical stack with a consistent gap between children. This is the
19
+ * single sanctioned way to space block-level elements in the admin —
20
+ * never reach for `space-y-*` directly.
21
+ */
22
+ export declare function Stack({ space, as: Component, align, justify, fill, className, children, ...rest }: StackProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=Stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stack.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/Stack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,UAAU,GAAG,UAAU,CAAA;AAEnC,MAAM,WAAW,UAAW,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC7D,qEAAqE;IACrE,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,wFAAwF;IACxF,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAA;IAC9C,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtE,qDAAqD;IACrD,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAkBD;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAW,EACX,EAAE,EAAE,SAAiB,EACrB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,SAAc,EACd,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,UAAU,2CAiBZ"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const ALIGN_CLASS = {
3
+ start: 'items-start',
4
+ center: 'items-center',
5
+ end: 'items-end',
6
+ stretch: 'items-stretch',
7
+ };
8
+ const JUSTIFY_CLASS = {
9
+ start: 'justify-start',
10
+ center: 'justify-center',
11
+ end: 'justify-end',
12
+ between: 'justify-between',
13
+ around: 'justify-around',
14
+ evenly: 'justify-evenly',
15
+ };
16
+ /**
17
+ * Vertical stack with a consistent gap between children. This is the
18
+ * single sanctioned way to space block-level elements in the admin —
19
+ * never reach for `space-y-*` directly.
20
+ */
21
+ export function Stack({ space = '4', as: Component = 'div', align, justify, fill, className = '', children, ...rest }) {
22
+ const classes = [
23
+ 'flex flex-col',
24
+ `gap-${space}`,
25
+ align ? ALIGN_CLASS[align] : '',
26
+ justify ? JUSTIFY_CLASS[justify] : '',
27
+ fill ? 'h-full' : '',
28
+ className,
29
+ ]
30
+ .filter(Boolean)
31
+ .join(' ');
32
+ return (_jsx(Component, { className: classes, ...rest, children: children }));
33
+ }
34
+ //# sourceMappingURL=Stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stack.js","sourceRoot":"","sources":["../../../src/layout/primitives/Stack.tsx"],"names":[],"mappings":";AAmBA,MAAM,WAAW,GAAqD;IACpE,KAAK,EAAE,aAAa;IACpB,MAAM,EAAE,cAAc;IACtB,GAAG,EAAE,WAAW;IAChB,OAAO,EAAE,eAAe;CACzB,CAAA;AAED,MAAM,aAAa,GAAuD;IACxE,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,GAAG,GAAG,EACX,EAAE,EAAE,SAAS,GAAG,KAAK,EACrB,KAAK,EACL,OAAO,EACP,IAAI,EACJ,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EACI;IACX,MAAM,OAAO,GAAG;QACd,eAAe;QACf,OAAO,KAAK,EAAE;QACd,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QAC/B,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACrC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACpB,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,OAAO,CACL,KAAC,SAAS,IAAC,SAAS,EAAE,OAAO,KAAM,IAAI,YACpC,QAAQ,GACC,CACb,CAAA;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Layout primitives for the Actuate admin.
3
+ *
4
+ * These exist so views never hand-roll their own flex/grid scaffolding.
5
+ * Every admin view should compose these primitives instead of writing raw
6
+ * Tailwind classes for spacing/alignment/structure. That contract is what
7
+ * keeps layout bugs (sidebar overlap, breakpoint mismatches, missing
8
+ * `min-w-0`) from recurring in new views.
9
+ *
10
+ * Naming follows the "Every Layout" canon
11
+ * (https://every-layout.dev/) plus our own `AdminShell` and
12
+ * `PageContainer` for the admin-specific outer chrome.
13
+ */
14
+ export { AdminShell } from './AdminShell.js';
15
+ export type { AdminShellProps } from './AdminShell.js';
16
+ export { PageContainer } from './PageContainer.js';
17
+ export type { PageContainerProps } from './PageContainer.js';
18
+ export { Stack } from './Stack.js';
19
+ export type { StackProps, StackSpace } from './Stack.js';
20
+ export { Cluster } from './Cluster.js';
21
+ export type { ClusterProps, ClusterAlign, ClusterJustify } from './Cluster.js';
22
+ export { Grid } from './Grid.js';
23
+ export type { GridProps, GridResponsive } from './Grid.js';
24
+ export { Split } from './Split.js';
25
+ export type { SplitProps } from './Split.js';
26
+ export { Box } from './Box.js';
27
+ export type { BoxProps } from './Box.js';
28
+ export { tokens } from './tokens.js';
29
+ export type { SpaceToken, RadiusToken } from './tokens.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAExD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Layout primitives for the Actuate admin.
3
+ *
4
+ * These exist so views never hand-roll their own flex/grid scaffolding.
5
+ * Every admin view should compose these primitives instead of writing raw
6
+ * Tailwind classes for spacing/alignment/structure. That contract is what
7
+ * keeps layout bugs (sidebar overlap, breakpoint mismatches, missing
8
+ * `min-w-0`) from recurring in new views.
9
+ *
10
+ * Naming follows the "Every Layout" canon
11
+ * (https://every-layout.dev/) plus our own `AdminShell` and
12
+ * `PageContainer` for the admin-specific outer chrome.
13
+ */
14
+ export { AdminShell } from './AdminShell.js';
15
+ export { PageContainer } from './PageContainer.js';
16
+ export { Stack } from './Stack.js';
17
+ export { Cluster } from './Cluster.js';
18
+ export { Grid } from './Grid.js';
19
+ export { Split } from './Split.js';
20
+ export { Box } from './Box.js';
21
+ export { tokens } from './tokens.js';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/layout/primitives/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGlC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAGtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGlC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Design tokens — single source of truth for the admin design system.
3
+ *
4
+ * Tokens are surfaced both as TypeScript constants (for inline-style escape
5
+ * hatches) and via CSS custom properties in `styles/theme.css`. Always
6
+ * prefer the CSS variables in production code; the TS constants are for
7
+ * computed inline styles only (e.g. dynamic widths, computed grid sizes).
8
+ */
9
+ export type SpaceToken = '0' | 'px' | '0.5' | '1' | '1.5' | '2' | '2.5' | '3' | '4' | '5' | '6' | '8' | '10' | '12' | '16';
10
+ export type RadiusToken = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
11
+ /** Numeric pixel values for inline style escape hatches. */
12
+ export declare const tokens: {
13
+ space: {
14
+ readonly '0': 0;
15
+ readonly px: 1;
16
+ readonly '0.5': 2;
17
+ readonly '1': 4;
18
+ readonly '1.5': 6;
19
+ readonly '2': 8;
20
+ readonly '2.5': 10;
21
+ readonly '3': 12;
22
+ readonly '4': 16;
23
+ readonly '5': 20;
24
+ readonly '6': 24;
25
+ readonly '8': 32;
26
+ readonly '10': 40;
27
+ readonly '12': 48;
28
+ readonly '16': 64;
29
+ };
30
+ radius: {
31
+ readonly none: 0;
32
+ readonly sm: 2;
33
+ readonly md: 6;
34
+ readonly lg: 8;
35
+ readonly xl: 12;
36
+ readonly full: 9999;
37
+ };
38
+ breakpoint: {
39
+ readonly sm: 640;
40
+ readonly md: 768;
41
+ readonly lg: 1024;
42
+ readonly xl: 1280;
43
+ readonly '2xl': 1536;
44
+ };
45
+ };
46
+ /** Map a space token to the corresponding Tailwind `space-y-*` / `gap-*` value. */
47
+ export declare function spaceToTw(t: SpaceToken): string;
48
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../src/layout/primitives/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,UAAU,GAClB,GAAG,GACH,IAAI,GACJ,KAAK,GACL,GAAG,GACH,KAAK,GACL,GAAG,GACH,KAAK,GACL,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,IAAI,CAAA;AAER,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;AAErE,4DAA4D;AAC5D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuClB,CAAA;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAI/C"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Design tokens — single source of truth for the admin design system.
3
+ *
4
+ * Tokens are surfaced both as TypeScript constants (for inline-style escape
5
+ * hatches) and via CSS custom properties in `styles/theme.css`. Always
6
+ * prefer the CSS variables in production code; the TS constants are for
7
+ * computed inline styles only (e.g. dynamic widths, computed grid sizes).
8
+ */
9
+ /** Numeric pixel values for inline style escape hatches. */
10
+ export const tokens = {
11
+ // Spacing scale matches Tailwind's default (--spacing = 0.25rem = 4px).
12
+ space: {
13
+ '0': 0,
14
+ px: 1,
15
+ '0.5': 2,
16
+ '1': 4,
17
+ '1.5': 6,
18
+ '2': 8,
19
+ '2.5': 10,
20
+ '3': 12,
21
+ '4': 16,
22
+ '5': 20,
23
+ '6': 24,
24
+ '8': 32,
25
+ '10': 40,
26
+ '12': 48,
27
+ '16': 64,
28
+ },
29
+ radius: {
30
+ none: 0,
31
+ sm: 2,
32
+ md: 6,
33
+ lg: 8,
34
+ xl: 12,
35
+ full: 9999,
36
+ },
37
+ // Breakpoints mirror Tailwind defaults so primitives can compose with
38
+ // utility classes without surprises. Use `matchMedia(`(min-width: …`)` to
39
+ // sync JS-driven layout decisions with these values.
40
+ breakpoint: {
41
+ sm: 640,
42
+ md: 768,
43
+ lg: 1024,
44
+ xl: 1280,
45
+ '2xl': 1536,
46
+ },
47
+ };
48
+ /** Map a space token to the corresponding Tailwind `space-y-*` / `gap-*` value. */
49
+ export function spaceToTw(t) {
50
+ // Tailwind's spacing utility already accepts the same scale, so we map
51
+ // 1:1. Centralizing here means callers don't repeat the string literal.
52
+ return t;
53
+ }
54
+ //# sourceMappingURL=tokens.js.map