@nanisoft/prism-ui 0.10.2 → 0.13.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 (334) hide show
  1. package/LICENSE +21 -21
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/blocks/app-shell-01/app-shell.js +4 -4
  4. package/dist/blocks/app-shell-01/index.d.ts +2 -2
  5. package/dist/blocks/app-shell-01/index.js +1 -1
  6. package/dist/blocks/auth-form-01/auth-form.d.ts +11 -1
  7. package/dist/blocks/auth-form-01/auth-form.d.ts.map +1 -1
  8. package/dist/blocks/auth-form-01/auth-form.js +11 -8
  9. package/dist/blocks/auth-form-01/index.d.ts +2 -2
  10. package/dist/blocks/auth-form-01/index.js +1 -1
  11. package/dist/blocks/cta-01/cta.d.ts +26 -21
  12. package/dist/blocks/cta-01/cta.d.ts.map +1 -1
  13. package/dist/blocks/cta-01/cta.js +2 -2
  14. package/dist/blocks/cta-01/index.d.ts +2 -2
  15. package/dist/blocks/cta-01/index.js +1 -1
  16. package/dist/blocks/data-table-01/data-table.js +7 -7
  17. package/dist/blocks/data-table-01/index.d.ts +2 -2
  18. package/dist/blocks/data-table-01/index.js +1 -1
  19. package/dist/blocks/empty-state-01/empty-state.d.ts +143 -0
  20. package/dist/blocks/empty-state-01/empty-state.d.ts.map +1 -0
  21. package/dist/blocks/empty-state-01/empty-state.js +104 -0
  22. package/dist/blocks/empty-state-01/index.d.ts +3 -0
  23. package/dist/blocks/empty-state-01/index.d.ts.map +1 -0
  24. package/dist/blocks/empty-state-01/index.js +1 -0
  25. package/dist/blocks/feature-grid-01/feature-grid.d.ts +28 -1
  26. package/dist/blocks/feature-grid-01/feature-grid.d.ts.map +1 -1
  27. package/dist/blocks/feature-grid-01/feature-grid.js +34 -3
  28. package/dist/blocks/feature-grid-01/index.d.ts +2 -2
  29. package/dist/blocks/feature-grid-01/index.js +1 -1
  30. package/dist/blocks/hero-01/hero.d.ts +35 -15
  31. package/dist/blocks/hero-01/hero.d.ts.map +1 -1
  32. package/dist/blocks/hero-01/hero.js +14 -9
  33. package/dist/blocks/hero-01/index.d.ts +2 -1
  34. package/dist/blocks/hero-01/index.d.ts.map +1 -1
  35. package/dist/blocks/hero-01/index.js +1 -1
  36. package/dist/blocks/index.d.ts +20 -20
  37. package/dist/blocks/index.js +19 -19
  38. package/dist/blocks/instrument-panel-01/index.d.ts +2 -2
  39. package/dist/blocks/instrument-panel-01/index.js +1 -1
  40. package/dist/blocks/instrument-panel-01/instrument-panel.js +1 -1
  41. package/dist/blocks/logo-strip-01/index.d.ts +2 -2
  42. package/dist/blocks/logo-strip-01/index.js +1 -1
  43. package/dist/blocks/logo-strip-01/logo-strip.d.ts +1 -1
  44. package/dist/blocks/logo-strip-01/logo-strip.js +2 -2
  45. package/dist/blocks/note-grid-01/index.d.ts +2 -2
  46. package/dist/blocks/note-grid-01/index.js +1 -1
  47. package/dist/blocks/note-grid-01/note-grid.d.ts +1 -1
  48. package/dist/blocks/note-grid-01/note-grid.js +1 -1
  49. package/dist/blocks/page-header-01/index.d.ts +2 -2
  50. package/dist/blocks/page-header-01/index.js +1 -1
  51. package/dist/blocks/page-header-01/page-header.d.ts +1 -1
  52. package/dist/blocks/page-header-01/page-header.js +4 -4
  53. package/dist/blocks/pricing-01/index.d.ts +1 -1
  54. package/dist/blocks/pricing-01/index.js +1 -1
  55. package/dist/blocks/pricing-01/pricing.d.ts +8 -1
  56. package/dist/blocks/pricing-01/pricing.d.ts.map +1 -1
  57. package/dist/blocks/pricing-01/pricing.js +15 -5
  58. package/dist/blocks/process-flow-01/index.d.ts +3 -0
  59. package/dist/blocks/process-flow-01/index.d.ts.map +1 -0
  60. package/dist/blocks/process-flow-01/index.js +1 -0
  61. package/dist/blocks/process-flow-01/process-flow.d.ts +118 -0
  62. package/dist/blocks/process-flow-01/process-flow.d.ts.map +1 -0
  63. package/dist/blocks/process-flow-01/process-flow.js +71 -0
  64. package/dist/blocks/process-rail-01/index.d.ts +2 -2
  65. package/dist/blocks/process-rail-01/index.js +1 -1
  66. package/dist/blocks/process-rail-01/process-rail.d.ts +1 -1
  67. package/dist/blocks/process-rail-01/process-rail.js +2 -2
  68. package/dist/blocks/product-grid-01/index.d.ts +2 -2
  69. package/dist/blocks/product-grid-01/index.js +1 -1
  70. package/dist/blocks/product-grid-01/product-grid.d.ts +37 -5
  71. package/dist/blocks/product-grid-01/product-grid.d.ts.map +1 -1
  72. package/dist/blocks/product-grid-01/product-grid.js +20 -6
  73. package/dist/blocks/run-console-01/index.d.ts +3 -0
  74. package/dist/blocks/run-console-01/index.d.ts.map +1 -0
  75. package/dist/blocks/run-console-01/index.js +1 -0
  76. package/dist/blocks/run-console-01/run-console.d.ts +111 -0
  77. package/dist/blocks/run-console-01/run-console.d.ts.map +1 -0
  78. package/dist/blocks/run-console-01/run-console.js +48 -0
  79. package/dist/blocks/settings-panel-01/index.d.ts +2 -2
  80. package/dist/blocks/settings-panel-01/index.js +1 -1
  81. package/dist/blocks/settings-panel-01/settings-panel.d.ts +11 -1
  82. package/dist/blocks/settings-panel-01/settings-panel.d.ts.map +1 -1
  83. package/dist/blocks/settings-panel-01/settings-panel.js +15 -10
  84. package/dist/blocks/site-footer/index.d.ts +2 -2
  85. package/dist/blocks/site-footer/index.js +1 -1
  86. package/dist/blocks/site-footer/site-footer.d.ts +1 -1
  87. package/dist/blocks/site-footer/site-footer.js +2 -2
  88. package/dist/blocks/site-header/index.d.ts +2 -2
  89. package/dist/blocks/site-header/index.js +1 -1
  90. package/dist/blocks/site-header/site-header.d.ts +2 -2
  91. package/dist/blocks/site-header/site-header.js +3 -3
  92. package/dist/blocks/site-navbar/index.d.ts +3 -0
  93. package/dist/blocks/site-navbar/index.d.ts.map +1 -0
  94. package/dist/blocks/site-navbar/index.js +1 -0
  95. package/dist/blocks/site-navbar/mobile-nav.d.ts +48 -0
  96. package/dist/blocks/site-navbar/mobile-nav.d.ts.map +1 -0
  97. package/dist/blocks/site-navbar/mobile-nav.js +35 -0
  98. package/dist/blocks/site-navbar/mode-toggle.d.ts +39 -0
  99. package/dist/blocks/site-navbar/mode-toggle.d.ts.map +1 -0
  100. package/dist/blocks/site-navbar/mode-toggle.js +39 -0
  101. package/dist/blocks/site-navbar/navbar-controls.d.ts +79 -0
  102. package/dist/blocks/site-navbar/navbar-controls.d.ts.map +1 -0
  103. package/dist/blocks/site-navbar/navbar-controls.js +40 -0
  104. package/dist/blocks/site-navbar/search-entry.d.ts +29 -0
  105. package/dist/blocks/site-navbar/search-entry.d.ts.map +1 -0
  106. package/dist/blocks/site-navbar/search-entry.js +52 -0
  107. package/dist/blocks/site-navbar/site-navbar.d.ts +212 -0
  108. package/dist/blocks/site-navbar/site-navbar.d.ts.map +1 -0
  109. package/dist/blocks/site-navbar/site-navbar.js +61 -0
  110. package/dist/blocks/site-navbar/sites-menu.d.ts +40 -0
  111. package/dist/blocks/site-navbar/sites-menu.d.ts.map +1 -0
  112. package/dist/blocks/site-navbar/sites-menu.js +48 -0
  113. package/dist/blocks/site-navbar/theme-menu.d.ts +47 -0
  114. package/dist/blocks/site-navbar/theme-menu.d.ts.map +1 -0
  115. package/dist/blocks/site-navbar/theme-menu.js +55 -0
  116. package/dist/blocks/stack-grid-01/index.d.ts +2 -2
  117. package/dist/blocks/stack-grid-01/index.js +1 -1
  118. package/dist/blocks/stack-grid-01/stack-grid.d.ts +42 -11
  119. package/dist/blocks/stack-grid-01/stack-grid.d.ts.map +1 -1
  120. package/dist/blocks/stack-grid-01/stack-grid.js +15 -7
  121. package/dist/blocks/stats-01/index.d.ts +9 -1
  122. package/dist/blocks/stats-01/index.d.ts.map +1 -1
  123. package/dist/blocks/stats-01/index.js +8 -1
  124. package/dist/blocks/stats-01/stats.d.ts +1 -1
  125. package/dist/blocks/stats-01/stats.js +2 -2
  126. package/dist/blocks/status-ledger-01/index.d.ts +2 -2
  127. package/dist/blocks/status-ledger-01/index.js +1 -1
  128. package/dist/blocks/status-ledger-01/status-ledger.d.ts +1 -1
  129. package/dist/blocks/status-ledger-01/status-ledger.js +2 -2
  130. package/dist/catalog.d.ts +1 -1
  131. package/dist/catalog.d.ts.map +1 -1
  132. package/dist/catalog.js +473 -1
  133. package/dist/components/index.d.ts +104 -66
  134. package/dist/components/index.d.ts.map +1 -1
  135. package/dist/components/index.js +74 -40
  136. package/dist/components/ui/accordion.js +1 -1
  137. package/dist/components/ui/alert-dialog.d.ts +119 -0
  138. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  139. package/dist/components/ui/alert-dialog.js +82 -0
  140. package/dist/components/ui/alert.js +1 -1
  141. package/dist/components/ui/aspect-ratio.d.ts +60 -0
  142. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  143. package/dist/components/ui/aspect-ratio.js +61 -0
  144. package/dist/components/ui/avatar.js +1 -1
  145. package/dist/components/ui/badge.js +1 -1
  146. package/dist/components/ui/breadcrumb.js +1 -1
  147. package/dist/components/ui/button-group.d.ts +68 -0
  148. package/dist/components/ui/button-group.d.ts.map +1 -0
  149. package/dist/components/ui/button-group.js +54 -0
  150. package/dist/components/ui/button.js +1 -1
  151. package/dist/components/ui/calendar.d.ts +158 -0
  152. package/dist/components/ui/calendar.d.ts.map +1 -0
  153. package/dist/components/ui/calendar.js +216 -0
  154. package/dist/components/ui/card.d.ts +18 -6
  155. package/dist/components/ui/card.d.ts.map +1 -1
  156. package/dist/components/ui/card.js +23 -8
  157. package/dist/components/ui/carousel.d.ts +118 -0
  158. package/dist/components/ui/carousel.d.ts.map +1 -0
  159. package/dist/components/ui/carousel.js +152 -0
  160. package/dist/components/ui/chart-frame.d.ts +216 -0
  161. package/dist/components/ui/chart-frame.d.ts.map +1 -0
  162. package/dist/components/ui/chart-frame.js +286 -0
  163. package/dist/components/ui/checkbox.js +1 -1
  164. package/dist/components/ui/collapsible.d.ts +97 -0
  165. package/dist/components/ui/collapsible.d.ts.map +1 -0
  166. package/dist/components/ui/collapsible.js +54 -0
  167. package/dist/components/ui/combobox.d.ts +141 -0
  168. package/dist/components/ui/combobox.d.ts.map +1 -0
  169. package/dist/components/ui/combobox.js +243 -0
  170. package/dist/components/ui/command-palette.d.ts +106 -0
  171. package/dist/components/ui/command-palette.d.ts.map +1 -0
  172. package/dist/components/ui/command-palette.js +176 -0
  173. package/dist/components/ui/command.d.ts +82 -0
  174. package/dist/components/ui/command.d.ts.map +1 -0
  175. package/dist/components/ui/command.js +37 -0
  176. package/dist/components/ui/context-menu.d.ts +151 -0
  177. package/dist/components/ui/context-menu.d.ts.map +1 -0
  178. package/dist/components/ui/context-menu.js +97 -0
  179. package/dist/components/ui/cta-link.js +1 -1
  180. package/dist/components/ui/date-picker.d.ts +111 -0
  181. package/dist/components/ui/date-picker.d.ts.map +1 -0
  182. package/dist/components/ui/date-picker.js +74 -0
  183. package/dist/components/ui/diagram.d.ts +84 -15
  184. package/dist/components/ui/diagram.d.ts.map +1 -1
  185. package/dist/components/ui/diagram.js +77 -7
  186. package/dist/components/ui/dialog.js +1 -1
  187. package/dist/components/ui/diff.d.ts +105 -0
  188. package/dist/components/ui/diff.d.ts.map +1 -0
  189. package/dist/components/ui/diff.js +113 -0
  190. package/dist/components/ui/dropdown-menu.d.ts +18 -0
  191. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  192. package/dist/components/ui/dropdown-menu.js +1 -1
  193. package/dist/components/ui/fact-list.js +1 -1
  194. package/dist/components/ui/field.js +1 -1
  195. package/dist/components/ui/form.d.ts +151 -0
  196. package/dist/components/ui/form.d.ts.map +1 -0
  197. package/dist/components/ui/form.js +73 -0
  198. package/dist/components/ui/hover-card.d.ts +105 -0
  199. package/dist/components/ui/hover-card.d.ts.map +1 -0
  200. package/dist/components/ui/hover-card.js +49 -0
  201. package/dist/components/ui/input-group.d.ts +99 -0
  202. package/dist/components/ui/input-group.d.ts.map +1 -0
  203. package/dist/components/ui/input-group.js +83 -0
  204. package/dist/components/ui/input.js +1 -1
  205. package/dist/components/ui/item.d.ts +113 -0
  206. package/dist/components/ui/item.d.ts.map +1 -0
  207. package/dist/components/ui/item.js +61 -0
  208. package/dist/components/ui/kbd.js +1 -1
  209. package/dist/components/ui/label.d.ts +58 -0
  210. package/dist/components/ui/label.d.ts.map +1 -0
  211. package/dist/components/ui/label.js +29 -0
  212. package/dist/components/ui/live-region.d.ts +9 -0
  213. package/dist/components/ui/live-region.d.ts.map +1 -1
  214. package/dist/components/ui/live-region.js +10 -2
  215. package/dist/components/ui/mark.js +1 -1
  216. package/dist/components/ui/menubar.d.ts +197 -0
  217. package/dist/components/ui/menubar.d.ts.map +1 -0
  218. package/dist/components/ui/menubar.js +109 -0
  219. package/dist/components/ui/meter.d.ts +121 -0
  220. package/dist/components/ui/meter.d.ts.map +1 -0
  221. package/dist/components/ui/meter.js +82 -0
  222. package/dist/components/ui/native-select.d.ts +72 -0
  223. package/dist/components/ui/native-select.d.ts.map +1 -0
  224. package/dist/components/ui/native-select.js +55 -0
  225. package/dist/components/ui/navigation-menu.d.ts +186 -0
  226. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  227. package/dist/components/ui/navigation-menu.js +94 -0
  228. package/dist/components/ui/number-field.d.ts +111 -0
  229. package/dist/components/ui/number-field.d.ts.map +1 -0
  230. package/dist/components/ui/number-field.js +84 -0
  231. package/dist/components/ui/one-time-code.d.ts +127 -0
  232. package/dist/components/ui/one-time-code.d.ts.map +1 -0
  233. package/dist/components/ui/one-time-code.js +57 -0
  234. package/dist/components/ui/pagination.js +1 -1
  235. package/dist/components/ui/popover.js +1 -1
  236. package/dist/components/ui/product-mark.d.ts +1 -1
  237. package/dist/components/ui/product-mark.js +1 -1
  238. package/dist/components/ui/product-switcher.d.ts +1 -1
  239. package/dist/components/ui/product-switcher.js +2 -2
  240. package/dist/components/ui/progress.js +1 -1
  241. package/dist/components/ui/prose.js +1 -1
  242. package/dist/components/ui/pulse-graph.js +1 -1
  243. package/dist/components/ui/pulse-series.js +1 -1
  244. package/dist/components/ui/radio-group.js +1 -1
  245. package/dist/components/ui/resizable.d.ts +129 -0
  246. package/dist/components/ui/resizable.d.ts.map +1 -0
  247. package/dist/components/ui/resizable.js +205 -0
  248. package/dist/components/ui/scroll-area.d.ts +97 -0
  249. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  250. package/dist/components/ui/scroll-area.js +68 -0
  251. package/dist/components/ui/search-dialog.d.ts +139 -0
  252. package/dist/components/ui/search-dialog.d.ts.map +1 -0
  253. package/dist/components/ui/search-dialog.js +178 -0
  254. package/dist/components/ui/section.d.ts +26 -0
  255. package/dist/components/ui/section.d.ts.map +1 -1
  256. package/dist/components/ui/section.js +32 -1
  257. package/dist/components/ui/select.js +1 -1
  258. package/dist/components/ui/separator.js +1 -1
  259. package/dist/components/ui/sheet.d.ts +103 -0
  260. package/dist/components/ui/sheet.d.ts.map +1 -0
  261. package/dist/components/ui/sheet.js +58 -0
  262. package/dist/components/ui/sidebar.d.ts +228 -0
  263. package/dist/components/ui/sidebar.d.ts.map +1 -0
  264. package/dist/components/ui/sidebar.js +172 -0
  265. package/dist/components/ui/signal-field.js +1 -1
  266. package/dist/components/ui/skeleton.js +1 -1
  267. package/dist/components/ui/slider.js +1 -1
  268. package/dist/components/ui/spinner.d.ts +79 -0
  269. package/dist/components/ui/spinner.d.ts.map +1 -0
  270. package/dist/components/ui/spinner.js +79 -0
  271. package/dist/components/ui/switch.js +1 -1
  272. package/dist/components/ui/table-sort.d.ts +97 -0
  273. package/dist/components/ui/table-sort.d.ts.map +1 -0
  274. package/dist/components/ui/table-sort.js +102 -0
  275. package/dist/components/ui/table.js +1 -1
  276. package/dist/components/ui/tabs.js +1 -1
  277. package/dist/components/ui/textarea.js +1 -1
  278. package/dist/components/ui/timeline.d.ts +106 -0
  279. package/dist/components/ui/timeline.d.ts.map +1 -0
  280. package/dist/components/ui/timeline.js +111 -0
  281. package/dist/components/ui/toast.d.ts +219 -0
  282. package/dist/components/ui/toast.d.ts.map +1 -0
  283. package/dist/components/ui/toast.js +270 -0
  284. package/dist/components/ui/toggle-group.d.ts +118 -0
  285. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  286. package/dist/components/ui/toggle-group.js +194 -0
  287. package/dist/components/ui/toggle.d.ts +73 -0
  288. package/dist/components/ui/toggle.d.ts.map +1 -0
  289. package/dist/components/ui/toggle.js +44 -0
  290. package/dist/components/ui/tooltip.js +1 -1
  291. package/dist/components/ui/tree.js +1 -1
  292. package/dist/components/ui/typography.js +1 -1
  293. package/dist/fonts/Inter-OFL.txt +93 -93
  294. package/dist/index.d.ts +72 -70
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +61 -60
  297. package/dist/lib/rank.d.ts +69 -0
  298. package/dist/lib/rank.d.ts.map +1 -0
  299. package/dist/lib/rank.js +77 -0
  300. package/dist/live/index.d.ts +22 -0
  301. package/dist/live/index.d.ts.map +1 -0
  302. package/dist/live/index.js +20 -0
  303. package/dist/live/run-stream-01/index.d.ts +3 -0
  304. package/dist/live/run-stream-01/index.d.ts.map +1 -0
  305. package/dist/live/run-stream-01/index.js +1 -0
  306. package/dist/live/run-stream-01/run-stream.d.ts +125 -0
  307. package/dist/live/run-stream-01/run-stream.d.ts.map +1 -0
  308. package/dist/live/run-stream-01/run-stream.js +111 -0
  309. package/dist/pages/auth-page/index.d.ts +15 -2
  310. package/dist/pages/auth-page/index.d.ts.map +1 -1
  311. package/dist/pages/auth-page/index.js +8 -4
  312. package/dist/pages/blog-post-page/index.js +5 -5
  313. package/dist/pages/dashboard-page/index.d.ts +4 -4
  314. package/dist/pages/dashboard-page/index.js +4 -4
  315. package/dist/pages/docs-shell/docs-shell.d.ts +37 -4
  316. package/dist/pages/docs-shell/docs-shell.d.ts.map +1 -1
  317. package/dist/pages/docs-shell/docs-shell.js +107 -16
  318. package/dist/pages/docs-shell/index.d.ts +2 -2
  319. package/dist/pages/docs-shell/index.js +1 -1
  320. package/dist/pages/index.d.ts +14 -14
  321. package/dist/pages/index.js +7 -7
  322. package/dist/pages/marketing-page/index.d.ts +6 -6
  323. package/dist/pages/marketing-page/index.js +5 -5
  324. package/dist/pages/not-found-page/index.js +4 -4
  325. package/dist/pages/settings-page/index.d.ts +3 -3
  326. package/dist/pages/settings-page/index.js +4 -4
  327. package/dist/provider/index.d.ts +4 -4
  328. package/dist/provider/index.js +2 -2
  329. package/dist/provider/provider.d.ts +1 -1
  330. package/dist/provider/provider.js +1 -1
  331. package/dist/provider/theme-script.d.ts +1 -1
  332. package/dist/provider/theme-script.js +1 -1
  333. package/dist/styles.css +689 -0
  334. package/package.json +9 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Card, CardDescription, CardHeader, CardTitle } from '../../components/ui/card';
3
- import { Section, SectionHeading } from '../../components/ui/section';
2
+ import { Card, CardDescription, CardHeader, CardTitle } from '../../components/ui/card.js';
3
+ import { Section, SectionHeading, childLevel } from '../../components/ui/section.js';
4
4
  /**
5
5
  * A grid of short feature blurbs.
6
6
  *
@@ -11,14 +11,45 @@ import { Section, SectionHeading } from '../../components/ui/section';
11
11
  * The `icon` variant renders a tile per feature and requires an icon per feature.
12
12
  * The `bare` variant renders no tile and requires no icon, and the type says so
13
13
  * rather than the renderer finding out.
14
+ *
15
+ * **The section heading is aligned left, and that is this Block joining the other
16
+ * eight rather than inventing an answer.** `SectionHeading` states its own rule:
17
+ * `center` is right for a band that is only a heading, and `left` is right for a
18
+ * section with content under it, because a centred title above a left-aligned
19
+ * grid reads as two unrelated pieces. A grid of cards is content under its
20
+ * heading, so the rule says left. `NoteGrid01`, `StackGrid01`, `StatusLedger01`,
21
+ * `ProductGrid01`, `LogoStrip01`, `Stats01`, `ProcessRail01` and `ProcessFlow01`
22
+ * all pass `align="left"` for that reason, and this one did not, so it was one of
23
+ * only two Blocks in the package that centred a heading over content.
24
+ *
25
+ * The cost was not visible in this repository, which previews one Block at a time
26
+ * and so never put a centred title next to a left-aligned one. It was visible in
27
+ * the consumer: the Nexus landing is composed from seven of these Blocks and put
28
+ * two centred section titles among five left ones, and the page's own rhythm read
29
+ * as an accident rather than as a decision. A page's composition is the consumer's,
30
+ * but a Block that is the only one of its kind answering a shared question is not a
31
+ * composition the consumer can correct without restyling a catalogue item, which
32
+ * the no-override-path rule does not allow.
33
+ *
34
+ * `Hero01` is the deliberate exception and keeps its own `align`, and `Cta01` draws
35
+ * no section heading at all: a centred hero is a band that is only a heading, the
36
+ * two-column form puts its figure beside the copy rather than under it, and the
37
+ * closing band is a title and two actions on a filled panel with nothing underneath.
38
+ * `test/section-heading-align.test.tsx` holds the whole list, which is the
39
+ * assertion, so a Block that opens with a heading and content under it cannot be
40
+ * added answering this question a second way.
14
41
  */
15
42
  export function FeatureGrid01(props) {
16
43
  const { eyebrow, title, description, numbered = false, headingLevel = 'h2' } = props;
44
+ // A card title is a heading one step below the section that introduces the set,
45
+ // derived rather than written, so a Block embedded one level deeper carries its
46
+ // five headings with it instead of announcing five siblings of the section.
47
+ const Title = childLevel(headingLevel);
17
48
  // Read off `props` rather than destructured, so the two stay one value: taking
18
49
  // `variant` and `features` apart is what would let the arm the type checked
19
50
  // and the arm the renderer followed come to be two different ones.
20
51
  const variant = props.variant ?? 'icon';
21
52
  const { features } = props;
22
- return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsx("div", { className: "grid gap-6 sm:grid-cols-2", children: features.map((feature, index) => (_jsx(Card, { className: "gap-4 py-6", children: _jsxs(CardHeader, { children: [numbered ? (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: String(index + 1).padStart(2, '0') })) : null, variant === 'icon' && 'icon' in feature ? (_jsx("span", { className: "bg-accent text-accent-foreground mb-2 flex size-10 items-center justify-center rounded-lg", children: _jsx(feature.icon, { className: "size-5" }) })) : null, _jsx(CardTitle, { children: feature.title }), _jsx(CardDescription, { children: feature.body })] }) }, feature.title))) })] }));
53
+ return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsx("div", { className: "grid gap-6 sm:grid-cols-2", children: features.map((feature, index) => (_jsx(Card, { className: "gap-4 py-6", children: _jsxs(CardHeader, { children: [numbered ? (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: String(index + 1).padStart(2, '0') })) : null, variant === 'icon' && 'icon' in feature ? (_jsx("span", { className: "bg-accent text-accent-foreground mb-2 flex size-10 items-center justify-center rounded-lg", children: _jsx(feature.icon, { className: "size-5" }) })) : null, _jsx(CardTitle, { children: _jsx(Title, { children: feature.title }) }), _jsx(CardDescription, { children: feature.body })] }) }, feature.title))) })] }));
23
54
  }
24
55
  export default FeatureGrid01;
@@ -1,3 +1,3 @@
1
- export { FeatureGrid01, default } from './feature-grid';
2
- export type { BareFeature, Feature, FeatureGrid01Props, IconFeature, } from './feature-grid';
1
+ export { FeatureGrid01, default } from './feature-grid.js';
2
+ export type { BareFeature, Feature, FeatureGrid01Props, IconFeature, } from './feature-grid.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export { FeatureGrid01, default } from './feature-grid';
1
+ export { FeatureGrid01, default } from './feature-grid.js';
@@ -1,24 +1,44 @@
1
1
  import type { ReactNode } from 'react';
2
- import { type HeadingLevel } from '../../components/ui/section';
2
+ import { type HeadingLevel } from '../../components/ui/section.js';
3
+ /**
4
+ * One action in a hero's action row.
5
+ *
6
+ * **The two arms are two elements, and a caller should not be able to reach the
7
+ * wrong one by accident.** An action that names a destination is an anchor and
8
+ * navigates; an action that does not is a button, and a Block ships no behaviour,
9
+ * so that button is inert by design rather than by accident. The arms are a union
10
+ * rather than one shape with an optional `href` because an optional `href` makes
11
+ * both mistakes silent:
12
+ *
13
+ * - `{ label: 'Start free' }` compiles and renders a primary button that goes
14
+ * nowhere. A hero's first action is almost always a link, so this is the likely
15
+ * mistake and it looks correct on the page.
16
+ * - `{ label: 'Start free', href: maybeUrl }` compiles today and renders a button
17
+ * whenever `maybeUrl` is `undefined`, which is a runtime branch the type said
18
+ * nothing about.
19
+ *
20
+ * So the link arm *requires* `href` and the button arm *forbids* it, as
21
+ * `href?: never`. The second of those is the one worth having: a value that is
22
+ * sometimes a string and sometimes `undefined` is now a type error rather than a
23
+ * button, which is the whole of "a caller should not be able to get it wrong
24
+ * silently".
25
+ */
3
26
  export type HeroAction = {
4
27
  label: string;
5
- /**
6
- * Where the action goes. Required for an action that navigates, which is what
7
- * an action in a hero almost always is.
8
- *
9
- * It was optional here and the Component ignored it, which meant an action
10
- * with a destination rendered as a `<button>` that went nowhere: a control
11
- * that looks like a link and is not one, and a dead end for a reader who
12
- * pressed it. An action now renders as a real anchor whenever it names a
13
- * destination, and falls back to a button only when it genuinely is one. A
14
- * Block ships no behaviour, so a button here is inert by design rather than by
15
- * accident, and the two shapes are told apart by exactly this.
16
- */
17
- href?: string;
18
28
  variant?: 'default' | 'outline' | 'secondary' | 'ghost';
29
+ } & ({
30
+ /** Where the action goes. Present makes the action an anchor. */
31
+ href: string;
19
32
  /** Opens the destination in a new tab, with the matching `rel`. */
20
33
  newTab?: boolean;
21
- };
34
+ } | {
35
+ /**
36
+ * Forbidden, so that "a link whose address happens to be undefined" is a
37
+ * type error rather than a button. Omit the key entirely to mean a button.
38
+ */
39
+ href?: never;
40
+ newTab?: never;
41
+ });
22
42
  export type Hero01Props = {
23
43
  /**
24
44
  * Optional label above the headline. Intentionally has no default: an earlier
@@ -1 +1 @@
1
- {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/hero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;IACvD,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;;;;;;OAUG;IACH,KAAK,EAAE,SAAS,CAAA;IAChB,wEAAwE;IACxE,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAY,EACZ,KAAgB,EAChB,UAAU,EACV,KAAK,EACL,YAAmB,EACnB,SAAS,GACV,EAAE,WAAW,+BA+Fb;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/hero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;CACxD,GAAG,CACA;IACE,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GACD;IACE;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,MAAM,CAAC,EAAE,KAAK,CAAA;CACf,CACJ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;;;;;;OAUG;IACH,KAAK,EAAE,SAAS,CAAA;IAChB,wEAAwE;IACxE,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAY,EACZ,KAAgB,EAChB,UAAU,EACV,KAAK,EACL,YAAmB,EACnB,SAAS,GACV,EAAE,WAAW,+BAoGb;AAED,eAAe,MAAM,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { ArrowRight } from 'lucide-react';
3
- import { Button } from '../../components/ui/button';
4
- import { CtaLink } from '../../components/ui/cta-link';
5
- import { Section, SectionHeading } from '../../components/ui/section';
6
- import { cn } from '../../lib/utils';
3
+ import { Button } from '../../components/ui/button.js';
4
+ import { CtaLink } from '../../components/ui/cta-link.js';
5
+ import { Section, SectionHeading } from '../../components/ui/section.js';
6
+ import { cn } from '../../lib/utils.js';
7
7
  /**
8
8
  * A marketing hero with a headline, a supporting line, up to two actions, and
9
9
  * an optional live figure beside them.
@@ -43,11 +43,16 @@ export function Hero01({ eyebrow, title, description, actions = [], align = 'cen
43
43
  const twoColumn = split ?? instrument !== undefined;
44
44
  const copy = (_jsxs("div", { "data-slot": "hero-01-copy", className: cn('flex flex-col gap-10', twoColumn ? 'items-start text-left' : align === 'center' ? 'items-center text-center' : 'items-start text-left'), children: [eyebrow ? (_jsx("span", { className: "bg-muted text-muted-foreground rounded-full px-3 py-1 text-xs font-medium", children: eyebrow })) : null, _jsx(SectionHeading, { as: headingLevel, align: twoColumn ? 'left' : align, title: title, description: description }), actions.length ? (_jsx("div", { className: "flex flex-col gap-3 sm:flex-row", children: actions.map((action, index) => {
45
45
  const variant = action.variant ?? (index === 0 ? 'default' : 'outline');
46
- // Positional, for the same reason as `pricing-01`'s feature list: the
47
- // label is display content, and two actions may share one. Safe here
48
- // because the list is static and never reordered.
49
- const content = (_jsxs(_Fragment, { children: [action.label, index === 0 ? (_jsx(ArrowRight, { className: "motion-safe:transition-transform size-4 group-hover:translate-x-0.5" })) : null] }));
50
- return action.href ? (_jsx(CtaLink, { href: action.href, newTab: action.newTab, size: "lg", variant: variant, className: "group", children: content }, index)) : (_jsx(Button, { size: "lg", variant: variant, className: "group", children: content }, index));
46
+ // The arrow is a link affordance, so it follows the element and not the
47
+ // position. It was `index === 0`, which put a "goes forward" arrow on an
48
+ // inert button: the one control in the row that cannot be followed wore
49
+ // the mark that says it can. A first action that is genuinely a button
50
+ // gets no arrow, and a second action that is a link still gets none,
51
+ // because the arrow marks the row's primary destination and only one
52
+ // thing is that.
53
+ const isLink = action.href !== undefined;
54
+ const content = (_jsxs(_Fragment, { children: [action.label, index === 0 && isLink ? (_jsx(ArrowRight, { className: "motion-safe:transition-transform size-4 group-hover:translate-x-0.5" })) : null] }));
55
+ return isLink ? (_jsx(CtaLink, { href: action.href, newTab: action.newTab, size: "lg", variant: variant, className: "group", children: content }, index)) : (_jsx(Button, { size: "lg", variant: variant, className: "group", children: content }, index));
51
56
  }) })) : null] }));
52
57
  return (_jsxs(Section, { className: cn('relative overflow-hidden', className), children: [_jsx("div", { "aria-hidden": true, className: "from-primary/5 pointer-events-none absolute inset-0 -z-10 bg-gradient-to-b to-transparent" }), _jsxs("div", { "data-slot": "hero-01-band", className: cn(twoColumn
53
58
  ? 'grid items-center gap-10 lg:grid-cols-[5fr_6fr] lg:gap-14'
@@ -1,2 +1,3 @@
1
- export { Hero01, default } from './hero';
1
+ export { Hero01, default } from './hero.js';
2
+ export type { HeroAction, Hero01Props } from './hero.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAIxC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA"}
@@ -1 +1 @@
1
- export { Hero01, default } from './hero';
1
+ export { Hero01, default } from './hero.js';
@@ -5,24 +5,24 @@
5
5
  * content as props and never fetches application data (ticket 07). The `-NN`
6
6
  * suffix is the block-family variant ordinal.
7
7
  */
8
- export { Hero01 } from './hero-01';
9
- export { FeatureGrid01 } from './feature-grid-01';
10
- export { Stats01 } from './stats-01';
11
- export { Pricing01 } from './pricing-01';
12
- export { Cta01 } from './cta-01';
13
- export { PageHeader01 } from './page-header-01';
14
- export { DataTable01 } from './data-table-01';
15
- export { SettingsPanel01 } from './settings-panel-01';
16
- export { AuthForm01 } from './auth-form-01';
17
- export { AppShell01 } from './app-shell-01';
18
- export { ProcessRail01 } from './process-rail-01';
19
- export { StatusLedger01, STATUS_TIERS } from './status-ledger-01';
20
- export type { StatusTier } from './status-ledger-01';
21
- export { ProductGrid01 } from './product-grid-01';
22
- export { StackGrid01 } from './stack-grid-01';
23
- export { LogoStrip01 } from './logo-strip-01';
24
- export { NoteGrid01 } from './note-grid-01';
25
- export { InstrumentPanel01 } from './instrument-panel-01';
26
- export { SiteHeader } from './site-header';
27
- export { SiteFooter } from './site-footer';
8
+ export { Hero01 } from './hero-01/index.js';
9
+ export { FeatureGrid01 } from './feature-grid-01/index.js';
10
+ export { Stats01 } from './stats-01/index.js';
11
+ export { Pricing01 } from './pricing-01/index.js';
12
+ export { Cta01 } from './cta-01/index.js';
13
+ export { PageHeader01 } from './page-header-01/index.js';
14
+ export { DataTable01 } from './data-table-01/index.js';
15
+ export { SettingsPanel01 } from './settings-panel-01/index.js';
16
+ export { AuthForm01 } from './auth-form-01/index.js';
17
+ export { AppShell01 } from './app-shell-01/index.js';
18
+ export { ProcessRail01 } from './process-rail-01/index.js';
19
+ export { StatusLedger01, STATUS_TIERS } from './status-ledger-01/index.js';
20
+ export type { StatusTier } from './status-ledger-01/index.js';
21
+ export { ProductGrid01 } from './product-grid-01/index.js';
22
+ export { StackGrid01 } from './stack-grid-01/index.js';
23
+ export { LogoStrip01 } from './logo-strip-01/index.js';
24
+ export { NoteGrid01 } from './note-grid-01/index.js';
25
+ export { InstrumentPanel01 } from './instrument-panel-01/index.js';
26
+ export { SiteHeader } from './site-header/index.js';
27
+ export { SiteFooter } from './site-footer/index.js';
28
28
  //# sourceMappingURL=index.d.ts.map
@@ -5,22 +5,22 @@
5
5
  * content as props and never fetches application data (ticket 07). The `-NN`
6
6
  * suffix is the block-family variant ordinal.
7
7
  */
8
- export { Hero01 } from './hero-01';
9
- export { FeatureGrid01 } from './feature-grid-01';
10
- export { Stats01 } from './stats-01';
11
- export { Pricing01 } from './pricing-01';
12
- export { Cta01 } from './cta-01';
13
- export { PageHeader01 } from './page-header-01';
14
- export { DataTable01 } from './data-table-01';
15
- export { SettingsPanel01 } from './settings-panel-01';
16
- export { AuthForm01 } from './auth-form-01';
17
- export { AppShell01 } from './app-shell-01';
18
- export { ProcessRail01 } from './process-rail-01';
19
- export { StatusLedger01, STATUS_TIERS } from './status-ledger-01';
20
- export { ProductGrid01 } from './product-grid-01';
21
- export { StackGrid01 } from './stack-grid-01';
22
- export { LogoStrip01 } from './logo-strip-01';
23
- export { NoteGrid01 } from './note-grid-01';
24
- export { InstrumentPanel01 } from './instrument-panel-01';
25
- export { SiteHeader } from './site-header';
26
- export { SiteFooter } from './site-footer';
8
+ export { Hero01 } from './hero-01/index.js';
9
+ export { FeatureGrid01 } from './feature-grid-01/index.js';
10
+ export { Stats01 } from './stats-01/index.js';
11
+ export { Pricing01 } from './pricing-01/index.js';
12
+ export { Cta01 } from './cta-01/index.js';
13
+ export { PageHeader01 } from './page-header-01/index.js';
14
+ export { DataTable01 } from './data-table-01/index.js';
15
+ export { SettingsPanel01 } from './settings-panel-01/index.js';
16
+ export { AuthForm01 } from './auth-form-01/index.js';
17
+ export { AppShell01 } from './app-shell-01/index.js';
18
+ export { ProcessRail01 } from './process-rail-01/index.js';
19
+ export { StatusLedger01, STATUS_TIERS } from './status-ledger-01/index.js';
20
+ export { ProductGrid01 } from './product-grid-01/index.js';
21
+ export { StackGrid01 } from './stack-grid-01/index.js';
22
+ export { LogoStrip01 } from './logo-strip-01/index.js';
23
+ export { NoteGrid01 } from './note-grid-01/index.js';
24
+ export { InstrumentPanel01 } from './instrument-panel-01/index.js';
25
+ export { SiteHeader } from './site-header/index.js';
26
+ export { SiteFooter } from './site-footer/index.js';
@@ -1,3 +1,3 @@
1
- export { InstrumentPanel01, default } from './instrument-panel';
2
- export type { InstrumentPanel01Props, PanelState } from './instrument-panel';
1
+ export { InstrumentPanel01, default } from './instrument-panel.js';
2
+ export type { InstrumentPanel01Props, PanelState } from './instrument-panel.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export { InstrumentPanel01, default } from './instrument-panel';
1
+ export { InstrumentPanel01, default } from './instrument-panel.js';
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from '../../lib/utils';
2
+ import { cn } from '../../lib/utils.js';
3
3
  /**
4
4
  * The dot each state draws.
5
5
  *
@@ -1,3 +1,3 @@
1
- export { LogoStrip01, default } from './logo-strip';
2
- export type { LogoStrip01Props, LogoStripItem } from './logo-strip';
1
+ export { LogoStrip01, default } from './logo-strip.js';
2
+ export type { LogoStrip01Props, LogoStripItem } from './logo-strip.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export { LogoStrip01, default } from './logo-strip';
1
+ export { LogoStrip01, default } from './logo-strip.js';
@@ -1,4 +1,4 @@
1
- import { type HeadingLevel } from '../../components/ui/section';
1
+ import { type HeadingLevel } from '../../components/ui/section.js';
2
2
  /**
3
3
  * One item of the strip, as a string.
4
4
  *
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Section, SectionHeading } from '../../components/ui/section';
3
- import { cn } from '../../lib/utils';
2
+ import { Section, SectionHeading } from '../../components/ui/section.js';
3
+ import { cn } from '../../lib/utils.js';
4
4
  /**
5
5
  * A single line of short items: the transition band between a hero and the
6
6
  * section that follows it.
@@ -1,3 +1,3 @@
1
- export { NoteGrid01, default } from './note-grid';
2
- export type { NoteGrid01Props, NoteGrid01Note } from './note-grid';
1
+ export { NoteGrid01, default } from './note-grid.js';
2
+ export type { NoteGrid01Props, NoteGrid01Note } from './note-grid.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export { NoteGrid01, default } from './note-grid';
1
+ export { NoteGrid01, default } from './note-grid.js';
@@ -1,4 +1,4 @@
1
- import { type HeadingLevel } from '../../components/ui/section';
1
+ import { type HeadingLevel } from '../../components/ui/section.js';
2
2
  /**
3
3
  * One note in the grid: a title and one or two sentences under it.
4
4
  *
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Section, SectionHeading } from '../../components/ui/section';
2
+ import { Section, SectionHeading } from '../../components/ui/section.js';
3
3
  /**
4
4
  * A grid of short points: a title and a sentence or two, on a hairline above each
5
5
  * one, with no tile and no icon.
@@ -1,3 +1,3 @@
1
- export { PageHeader01, default } from './page-header';
2
- export type { PageHeader01Props, PageHeaderAction, PageHeaderCrumb } from './page-header';
1
+ export { PageHeader01, default } from './page-header.js';
2
+ export type { PageHeader01Props, PageHeaderAction, PageHeaderCrumb } from './page-header.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export { PageHeader01, default } from './page-header';
1
+ export { PageHeader01, default } from './page-header.js';
@@ -1,5 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
- import { type HeadingElement } from '../../components/ui/typography';
2
+ import { type HeadingElement } from '../../components/ui/typography.js';
3
3
  export type PageHeaderCrumb = {
4
4
  label: ReactNode;
5
5
  /** Renders a native anchor. Omit on the current, final step. */
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Fragment } from 'react';
3
- import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '../../components/ui/breadcrumb';
4
- import { Button } from '../../components/ui/button';
5
- import { Separator } from '../../components/ui/separator';
6
- import { Heading, Text } from '../../components/ui/typography';
3
+ import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from '../../components/ui/breadcrumb.js';
4
+ import { Button } from '../../components/ui/button.js';
5
+ import { Separator } from '../../components/ui/separator.js';
6
+ import { Heading, Text } from '../../components/ui/typography.js';
7
7
  /**
8
8
  * A page title band.
9
9
  *
@@ -1,2 +1,2 @@
1
- export { Pricing01, default } from './pricing';
1
+ export { Pricing01, default } from './pricing.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- export { Pricing01, default } from './pricing';
1
+ export { Pricing01, default } from './pricing.js';
@@ -1,4 +1,4 @@
1
- import { type HeadingLevel } from '../../components/ui/section';
1
+ import { type HeadingLevel } from '../../components/ui/section.js';
2
2
  export type Plan = {
3
3
  name: string;
4
4
  price: string;
@@ -29,6 +29,13 @@ export type Pricing01Props = {
29
29
  * plan". A shared library has no plans to sell, so those strings described a
30
30
  * business that does not exist here, and every consumer who installed the block
31
31
  * inherited them.
32
+ *
33
+ * The section heading is aligned left, for the reason `FeatureGrid01` now records
34
+ * in full and `test/section-heading-align.test.tsx` holds: three cards sit under
35
+ * it, and a centred title above a left-aligned grid reads as two unrelated pieces.
36
+ * `Pricing01` and `FeatureGrid01` were the only two Blocks that left the heading
37
+ * centred over content, and neither had a stated reason for it, so both were
38
+ * taking the default rather than making a decision.
32
39
  */
33
40
  export declare function Pricing01({ eyebrow, title, description, plans, headingLevel, }: Pricing01Props): import("react").JSX.Element;
34
41
  export default Pricing01;
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/blocks/pricing-01/pricing.tsx"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAExF,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,KAAK,EACL,WAAW,EACX,KAAK,EACL,YAAmB,GACpB,EAAE,cAAc,+BAkEhB;AAED,eAAe,SAAS,CAAA"}
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/blocks/pricing-01/pricing.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAEpG,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,KAAK,EACL,WAAW,EACX,KAAK,EACL,YAAmB,GACpB,EAAE,cAAc,+BAwEhB;AAED,eAAe,SAAS,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Check } from 'lucide-react';
3
- import { Badge } from '../../components/ui/badge';
4
- import { Button } from '../../components/ui/button';
5
- import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '../../components/ui/card';
6
- import { Section, SectionHeading } from '../../components/ui/section';
3
+ import { Badge } from '../../components/ui/badge.js';
4
+ import { Button } from '../../components/ui/button.js';
5
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '../../components/ui/card.js';
6
+ import { Section, SectionHeading, childLevel } from '../../components/ui/section.js';
7
7
  /**
8
8
  * A three-up plan comparison.
9
9
  *
@@ -13,8 +13,18 @@ import { Section, SectionHeading } from '../../components/ui/section';
13
13
  * plan". A shared library has no plans to sell, so those strings described a
14
14
  * business that does not exist here, and every consumer who installed the block
15
15
  * inherited them.
16
+ *
17
+ * The section heading is aligned left, for the reason `FeatureGrid01` now records
18
+ * in full and `test/section-heading-align.test.tsx` holds: three cards sit under
19
+ * it, and a centred title above a left-aligned grid reads as two unrelated pieces.
20
+ * `Pricing01` and `FeatureGrid01` were the only two Blocks that left the heading
21
+ * centred over content, and neither had a stated reason for it, so both were
22
+ * taking the default rather than making a decision.
16
23
  */
17
24
  export function Pricing01({ eyebrow, title, description, plans, headingLevel = 'h2', }) {
18
- return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsx("div", { className: "grid gap-6 lg:grid-cols-3", children: plans.map((plan) => (_jsxs(Card, { className: plan.featured ? 'border-primary shadow-md' : undefined, children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(CardTitle, { children: plan.name }), plan.featured && plan.badge ? _jsx(Badge, { children: plan.badge }) : null] }), plan.body ? _jsx(CardDescription, { children: plan.body }) : null, _jsxs("p", { className: "mt-2 text-3xl font-semibold tracking-tight", children: [plan.price, plan.period ? (_jsx("span", { className: "text-muted-foreground text-sm font-normal", children: plan.period })) : null] })] }), _jsx(CardContent, { className: "flex flex-col gap-3", children: plan.features.map((feature, index) => (_jsxs("p", { className: "flex items-start gap-2 text-sm", children: [_jsx(Check, { className: "text-success mt-0.5 size-4 shrink-0" }), feature] }, index))) }), _jsx(CardFooter, { className: "mt-auto", children: _jsx(Button, { className: "w-full", variant: plan.featured ? 'default' : 'outline', children: plan.cta }) })] }, plan.name))) })] }));
25
+ // A plan name is a heading one step below the section that introduces the set,
26
+ // so three plans under one `h2` are three `h3`s and not three competing sections.
27
+ const Title = childLevel(headingLevel);
28
+ return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsx("div", { className: "grid gap-6 lg:grid-cols-3", children: plans.map((plan) => (_jsxs(Card, { className: plan.featured ? 'border-primary shadow-md' : undefined, children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(CardTitle, { children: _jsx(Title, { children: plan.name }) }), plan.featured && plan.badge ? _jsx(Badge, { children: plan.badge }) : null] }), plan.body ? _jsx(CardDescription, { children: plan.body }) : null, _jsxs("p", { className: "mt-2 text-3xl font-semibold tracking-tight", children: [plan.price, plan.period ? (_jsx("span", { className: "text-muted-foreground text-sm font-normal", children: plan.period })) : null] })] }), _jsx(CardContent, { className: "flex flex-col gap-3", children: plan.features.map((feature, index) => (_jsxs("p", { className: "flex items-start gap-2 text-sm", children: [_jsx(Check, { className: "text-success mt-0.5 size-4 shrink-0" }), feature] }, index))) }), _jsx(CardFooter, { className: "mt-auto", children: _jsx(Button, { className: "w-full", variant: plan.featured ? 'default' : 'outline', children: plan.cta }) })] }, plan.name))) })] }));
19
29
  }
20
30
  export default Pricing01;
@@ -0,0 +1,3 @@
1
+ export { ProcessFlow01, default } from './process-flow.js';
2
+ export type { ProcessFlow01Props, ProcessStage, FlowColumns } from './process-flow.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/process-flow-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1 @@
1
+ export { ProcessFlow01, default } from './process-flow.js';
@@ -0,0 +1,118 @@
1
+ import { type HeadingLevel } from '../../components/ui/section.js';
2
+ /**
3
+ * One stage of a pipeline, as the flow draws it.
4
+ *
5
+ * The same shape as a `ProcessStep`, declared separately rather than imported: a
6
+ * flow and a rail are different claims and a consumer composing one has no reason
7
+ * to take the other's type, and sharing the declaration would invite a caller to
8
+ * widen a rail by reaching for a flow's step.
9
+ */
10
+ export type ProcessStage = {
11
+ /** The stage's own name, as a reader would name it in conversation. */
12
+ name: string;
13
+ /** One line about what happens at this stage. */
14
+ description: string;
15
+ };
16
+ /**
17
+ * How many stages a flow puts on one line.
18
+ *
19
+ * The grid tracks, not the stage count. A flow is a sequence that has to wrap, so
20
+ * the number of stages is the caller's and the number on a line is this Block's:
21
+ * those are different questions, and a caller that had to state both would state
22
+ * them in step by hand, which is the thing a Block should not ask.
23
+ *
24
+ * Three is the default because three divides the two lengths the sites actually
25
+ * state, six and nine, and a row of three is the widest that still leaves an ordinal
26
+ * and a name beside each other without one of them wrapping.
27
+ */
28
+ export type FlowColumns = 2 | 3 | 4;
29
+ /**
30
+ * The props a ProcessFlow01 takes.
31
+ *
32
+ * Every string is a prop. The Block ships no stage, no ordinal and no label for the
33
+ * end of the flow: a pipeline that hardcoded a stage name would hand every consumer
34
+ * a diagram of somebody else's pipeline.
35
+ */
36
+ export type ProcessFlow01Props = {
37
+ /** Optional label above the section title. See the No-Default-Eyebrow Rule. */
38
+ eyebrow?: string;
39
+ /** The section title. Omit it for a flow composed under its own heading. */
40
+ title?: string;
41
+ /** One or two sentences under the title. */
42
+ description?: string;
43
+ /**
44
+ * The label on the last stage, for a flow that ends in a state worth naming:
45
+ * "merged", "shipping", "verified". Omit it when the last stage needs no label,
46
+ * which is the honest state for a pipeline that has not finished.
47
+ */
48
+ finalLabel?: string;
49
+ /**
50
+ * The stages, in the order the pipeline runs.
51
+ *
52
+ * An array rather than the tuple `ProcessRail01` uses, and the difference is the
53
+ * whole of what this Block is for. A rail holds one line, so its length is a
54
+ * layout claim the type can make and a wider rail would break; a flow wraps, so
55
+ * its length is content and the type has nothing to say about it. Six stages are
56
+ * six stages, and the grid carries them.
57
+ */
58
+ stages: ProcessStage[];
59
+ /**
60
+ * How many stages sit on one line. Defaults to 3.
61
+ *
62
+ * A prop because a five-stage pipeline and a nine-stage one do not read alike at
63
+ * the same width, and a caller who knows their own length knows their own line.
64
+ */
65
+ columns?: FlowColumns;
66
+ /** Heading level for the section title. See `HeadingLevel`. */
67
+ headingLevel?: HeadingLevel;
68
+ className?: string;
69
+ };
70
+ /**
71
+ * A pipeline drawn as a flow: the stages in order, wrapping across lines.
72
+ *
73
+ * **The rail's refusal of a fifth stage is left standing.** `ProcessRail01` holds
74
+ * two, three or four stages and a five-element array is a compile error, and that is
75
+ * the same decision this Block is built beside rather than against: a rail is a
76
+ * claim about a sequence on one line, and a rail that quietly dropped a stage to fit
77
+ * a width would be a diagram of a process that is not the process. A company site
78
+ * states six stages, and it was drawing them as a grid of short points, where the
79
+ * six ordinals and the terminal label were lost and a sequence read as a set. That
80
+ * gap is a gap in the roster, and the honest repair is a second shape rather than a
81
+ * wider tuple: raising the rail's ceiling to six would make the fourth column
82
+ * unrepresentable as a type error, which is the property that made the original
83
+ * decision good.
84
+ *
85
+ * **It is one `<ol>`, and that is the part the layout is built around.** A flow that
86
+ * wrapped into a row per group would be several lists, and a screen reader would
87
+ * announce it as three lists of two, which is precisely the set-where-a-sequence-was
88
+ * that this Block exists to avoid. So the stages are one ordered list and the
89
+ * wrapping is done by the grid, which means the Block never gets to know where a
90
+ * line broke, and therefore cannot draw something that is only right on the widest
91
+ * screen.
92
+ *
93
+ * **The ordinal is the continuity mechanism, and it is treated as one.** It runs
94
+ * `01` through to the last stage with no restart, in the mono face, at a size a
95
+ * reader can scan down a column rather than read one at a time. That is what makes a
96
+ * wrapped flow legible: a reader who lands on stage four sees `04` and knows it
97
+ * continues stage three, whatever the column count happens to be at the width they
98
+ * are using. Nothing else in this Block is load-bearing for the sequence, and
99
+ * anything that needed to know where the line broke would be.
100
+ *
101
+ * **The thread is a line through the stages, not a box around each one.** Each
102
+ * stage draws a top border and the grid separates them by a single pixel, so a run
103
+ * of stages on one line reads as one line broken by hairline gaps, and the gap
104
+ * between two lines is wider. That is the same technique the rail uses, and it is
105
+ * chosen here for a specific reason: it holds at any column count, including the
106
+ * one-column layout a phone gets, without the Block knowing anything about it. A
107
+ * connector drawn between a stage and its successor would need the column count to
108
+ * be right, and would be wrong at every width the type does not describe.
109
+ *
110
+ * A caption of more than about twelve words wraps under a stage and the line stops
111
+ * reading as a line, so the caption is a line and the detail belongs above the flow
112
+ * in `description`.
113
+ *
114
+ * It is a server Component: no hook, no state and no client code.
115
+ */
116
+ export declare function ProcessFlow01({ eyebrow, title, description, finalLabel, stages, columns, headingLevel, className, }: ProcessFlow01Props): import("react").JSX.Element;
117
+ export default ProcessFlow01;
118
+ //# sourceMappingURL=process-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-flow.d.ts","sourceRoot":"","sources":["../../../src/blocks/process-flow-01/process-flow.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAgBnC;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;OAQG;IACH,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,KAAK,EACL,WAAW,EACX,UAAU,EACV,MAAM,EACN,OAAW,EACX,YAAmB,EACnB,SAAS,GACV,EAAE,kBAAkB,+BAgDpB;AAED,eAAe,aAAa,CAAA"}