@nanisoft/prism-ui 0.5.0 → 0.6.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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/THIRD-PARTY-NOTICES.md +48 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/blocks/app-shell-01/app-shell.d.ts +38 -0
  6. package/dist/blocks/app-shell-01/app-shell.d.ts.map +1 -0
  7. package/dist/blocks/app-shell-01/app-shell.js +27 -0
  8. package/dist/blocks/app-shell-01/index.d.ts +3 -0
  9. package/dist/blocks/app-shell-01/index.d.ts.map +1 -0
  10. package/dist/blocks/app-shell-01/index.js +1 -0
  11. package/dist/blocks/auth-form-01/auth-form.d.ts +52 -0
  12. package/dist/blocks/auth-form-01/auth-form.d.ts.map +1 -0
  13. package/dist/blocks/auth-form-01/auth-form.js +23 -0
  14. package/dist/blocks/auth-form-01/index.d.ts +3 -0
  15. package/dist/blocks/auth-form-01/index.d.ts.map +1 -0
  16. package/dist/blocks/auth-form-01/index.js +1 -0
  17. package/dist/blocks/cta-01/cta.d.ts +83 -0
  18. package/dist/blocks/cta-01/cta.d.ts.map +1 -0
  19. package/dist/blocks/cta-01/cta.js +29 -0
  20. package/dist/blocks/cta-01/index.d.ts +3 -0
  21. package/dist/blocks/cta-01/index.d.ts.map +1 -0
  22. package/dist/blocks/cta-01/index.js +1 -0
  23. package/dist/blocks/data-table-01/data-table.d.ts +102 -0
  24. package/dist/blocks/data-table-01/data-table.d.ts.map +1 -0
  25. package/dist/blocks/data-table-01/data-table.js +116 -0
  26. package/dist/blocks/data-table-01/index.d.ts +3 -0
  27. package/dist/blocks/data-table-01/index.d.ts.map +1 -0
  28. package/dist/blocks/data-table-01/index.js +1 -0
  29. package/dist/blocks/feature-grid-01/feature-grid.d.ts +78 -0
  30. package/dist/blocks/feature-grid-01/feature-grid.d.ts.map +1 -0
  31. package/dist/blocks/feature-grid-01/feature-grid.js +24 -0
  32. package/dist/blocks/feature-grid-01/index.d.ts +3 -0
  33. package/dist/blocks/feature-grid-01/index.d.ts.map +1 -0
  34. package/dist/blocks/feature-grid-01/index.js +1 -0
  35. package/dist/blocks/hero-01/hero.d.ts +59 -0
  36. package/dist/blocks/hero-01/hero.d.ts.map +1 -0
  37. package/dist/blocks/hero-01/hero.js +24 -0
  38. package/dist/blocks/hero-01/index.d.ts +2 -0
  39. package/dist/blocks/hero-01/index.d.ts.map +1 -0
  40. package/dist/blocks/hero-01/index.js +1 -0
  41. package/dist/blocks/index.d.ts +28 -0
  42. package/dist/blocks/index.d.ts.map +1 -0
  43. package/dist/blocks/index.js +26 -0
  44. package/dist/blocks/instrument-panel-01/index.d.ts +3 -0
  45. package/dist/blocks/instrument-panel-01/index.d.ts.map +1 -0
  46. package/dist/blocks/instrument-panel-01/index.js +1 -0
  47. package/dist/blocks/instrument-panel-01/instrument-panel.d.ts +114 -0
  48. package/dist/blocks/instrument-panel-01/instrument-panel.d.ts.map +1 -0
  49. package/dist/blocks/instrument-panel-01/instrument-panel.js +64 -0
  50. package/dist/blocks/logo-strip-01/index.d.ts +3 -0
  51. package/dist/blocks/logo-strip-01/index.d.ts.map +1 -0
  52. package/dist/blocks/logo-strip-01/index.js +1 -0
  53. package/dist/blocks/logo-strip-01/logo-strip.d.ts +84 -0
  54. package/dist/blocks/logo-strip-01/logo-strip.d.ts.map +1 -0
  55. package/dist/blocks/logo-strip-01/logo-strip.js +40 -0
  56. package/dist/blocks/note-grid-01/index.d.ts +3 -0
  57. package/dist/blocks/note-grid-01/index.d.ts.map +1 -0
  58. package/dist/blocks/note-grid-01/index.js +1 -0
  59. package/dist/blocks/note-grid-01/note-grid.d.ts +79 -0
  60. package/dist/blocks/note-grid-01/note-grid.d.ts.map +1 -0
  61. package/dist/blocks/note-grid-01/note-grid.js +37 -0
  62. package/dist/blocks/page-header-01/index.d.ts +3 -0
  63. package/dist/blocks/page-header-01/index.d.ts.map +1 -0
  64. package/dist/blocks/page-header-01/index.js +1 -0
  65. package/dist/blocks/page-header-01/page-header.d.ts +48 -0
  66. package/dist/blocks/page-header-01/page-header.d.ts.map +1 -0
  67. package/dist/blocks/page-header-01/page-header.js +27 -0
  68. package/dist/blocks/pricing-01/index.d.ts +2 -0
  69. package/dist/blocks/pricing-01/index.d.ts.map +1 -0
  70. package/dist/blocks/pricing-01/index.js +1 -0
  71. package/dist/blocks/pricing-01/pricing.d.ts +35 -0
  72. package/dist/blocks/pricing-01/pricing.d.ts.map +1 -0
  73. package/dist/blocks/pricing-01/pricing.js +20 -0
  74. package/dist/blocks/process-rail-01/index.d.ts +3 -0
  75. package/dist/blocks/process-rail-01/index.d.ts.map +1 -0
  76. package/dist/blocks/process-rail-01/index.js +1 -0
  77. package/dist/blocks/process-rail-01/process-rail.d.ts +99 -0
  78. package/dist/blocks/process-rail-01/process-rail.d.ts.map +1 -0
  79. package/dist/blocks/process-rail-01/process-rail.js +58 -0
  80. package/dist/blocks/product-grid-01/index.d.ts +3 -0
  81. package/dist/blocks/product-grid-01/index.d.ts.map +1 -0
  82. package/dist/blocks/product-grid-01/index.js +1 -0
  83. package/dist/blocks/product-grid-01/product-grid.d.ts +114 -0
  84. package/dist/blocks/product-grid-01/product-grid.d.ts.map +1 -0
  85. package/dist/blocks/product-grid-01/product-grid.js +51 -0
  86. package/dist/blocks/settings-panel-01/index.d.ts +3 -0
  87. package/dist/blocks/settings-panel-01/index.d.ts.map +1 -0
  88. package/dist/blocks/settings-panel-01/index.js +1 -0
  89. package/dist/blocks/settings-panel-01/settings-panel.d.ts +71 -0
  90. package/dist/blocks/settings-panel-01/settings-panel.d.ts.map +1 -0
  91. package/dist/blocks/settings-panel-01/settings-panel.js +38 -0
  92. package/dist/blocks/site-footer/index.d.ts +3 -0
  93. package/dist/blocks/site-footer/index.d.ts.map +1 -0
  94. package/dist/blocks/site-footer/index.js +1 -0
  95. package/dist/blocks/site-footer/site-footer.d.ts +135 -0
  96. package/dist/blocks/site-footer/site-footer.d.ts.map +1 -0
  97. package/dist/blocks/site-footer/site-footer.js +41 -0
  98. package/dist/blocks/site-header/index.d.ts +3 -0
  99. package/dist/blocks/site-header/index.d.ts.map +1 -0
  100. package/dist/blocks/site-header/index.js +1 -0
  101. package/dist/blocks/site-header/site-header.d.ts +142 -0
  102. package/dist/blocks/site-header/site-header.d.ts.map +1 -0
  103. package/dist/blocks/site-header/site-header.js +46 -0
  104. package/dist/blocks/stack-grid-01/index.d.ts +3 -0
  105. package/dist/blocks/stack-grid-01/index.d.ts.map +1 -0
  106. package/dist/blocks/stack-grid-01/index.js +1 -0
  107. package/dist/blocks/stack-grid-01/stack-grid.d.ts +118 -0
  108. package/dist/blocks/stack-grid-01/stack-grid.d.ts.map +1 -0
  109. package/dist/blocks/stack-grid-01/stack-grid.js +49 -0
  110. package/dist/blocks/stats-01/index.d.ts +2 -0
  111. package/dist/blocks/stats-01/index.d.ts.map +1 -0
  112. package/dist/blocks/stats-01/index.js +1 -0
  113. package/dist/blocks/stats-01/stats.d.ts +28 -0
  114. package/dist/blocks/stats-01/stats.d.ts.map +1 -0
  115. package/dist/blocks/stats-01/stats.js +27 -0
  116. package/dist/blocks/status-ledger-01/index.d.ts +3 -0
  117. package/dist/blocks/status-ledger-01/index.d.ts.map +1 -0
  118. package/dist/blocks/status-ledger-01/index.js +1 -0
  119. package/dist/blocks/status-ledger-01/status-ledger.d.ts +131 -0
  120. package/dist/blocks/status-ledger-01/status-ledger.d.ts.map +1 -0
  121. package/dist/blocks/status-ledger-01/status-ledger.js +80 -0
  122. package/dist/catalog.d.ts +28 -0
  123. package/dist/catalog.d.ts.map +1 -0
  124. package/dist/catalog.js +672 -0
  125. package/dist/components/index.d.ts +64 -0
  126. package/dist/components/index.d.ts.map +1 -0
  127. package/dist/components/index.js +43 -0
  128. package/dist/components/ui/accordion.d.ts +65 -0
  129. package/dist/components/ui/accordion.d.ts.map +1 -0
  130. package/dist/components/ui/accordion.js +30 -0
  131. package/dist/components/ui/alert.d.ts +19 -0
  132. package/dist/components/ui/alert.d.ts.map +1 -0
  133. package/dist/components/ui/alert.js +31 -0
  134. package/dist/components/ui/avatar.d.ts +47 -0
  135. package/dist/components/ui/avatar.d.ts.map +1 -0
  136. package/dist/components/ui/avatar.js +30 -0
  137. package/dist/components/ui/badge.d.ts +14 -0
  138. package/dist/components/ui/badge.d.ts.map +1 -0
  139. package/dist/components/ui/badge.js +26 -0
  140. package/dist/components/ui/breadcrumb.d.ts +35 -0
  141. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  142. package/dist/components/ui/breadcrumb.js +48 -0
  143. package/dist/components/ui/button.d.ts +16 -0
  144. package/dist/components/ui/button.d.ts.map +1 -0
  145. package/dist/components/ui/button.js +63 -0
  146. package/dist/components/ui/card.d.ts +41 -0
  147. package/dist/components/ui/card.d.ts.map +1 -0
  148. package/dist/components/ui/card.js +53 -0
  149. package/dist/components/ui/checkbox.d.ts +43 -0
  150. package/dist/components/ui/checkbox.d.ts.map +1 -0
  151. package/dist/components/ui/checkbox.js +18 -0
  152. package/dist/components/ui/cta-link.d.ts +45 -0
  153. package/dist/components/ui/cta-link.d.ts.map +1 -0
  154. package/dist/components/ui/cta-link.js +81 -0
  155. package/dist/components/ui/diagram.d.ts +154 -0
  156. package/dist/components/ui/diagram.d.ts.map +1 -0
  157. package/dist/components/ui/diagram.js +150 -0
  158. package/dist/components/ui/dialog.d.ts +81 -0
  159. package/dist/components/ui/dialog.d.ts.map +1 -0
  160. package/dist/components/ui/dialog.js +60 -0
  161. package/dist/components/ui/dropdown-menu.d.ts +189 -0
  162. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  163. package/dist/components/ui/dropdown-menu.js +67 -0
  164. package/dist/components/ui/fact-list.d.ts +90 -0
  165. package/dist/components/ui/fact-list.d.ts.map +1 -0
  166. package/dist/components/ui/fact-list.js +38 -0
  167. package/dist/components/ui/field.d.ts +36 -0
  168. package/dist/components/ui/field.d.ts.map +1 -0
  169. package/dist/components/ui/field.js +46 -0
  170. package/dist/components/ui/input.d.ts +12 -0
  171. package/dist/components/ui/input.d.ts.map +1 -0
  172. package/dist/components/ui/input.js +14 -0
  173. package/dist/components/ui/kbd.d.ts +10 -0
  174. package/dist/components/ui/kbd.d.ts.map +1 -0
  175. package/dist/components/ui/kbd.js +12 -0
  176. package/dist/components/ui/pagination.d.ts +40 -0
  177. package/dist/components/ui/pagination.d.ts.map +1 -0
  178. package/dist/components/ui/pagination.js +49 -0
  179. package/dist/components/ui/popover.d.ts +56 -0
  180. package/dist/components/ui/popover.d.ts.map +1 -0
  181. package/dist/components/ui/popover.js +25 -0
  182. package/dist/components/ui/product-mark.d.ts +115 -0
  183. package/dist/components/ui/product-mark.d.ts.map +1 -0
  184. package/dist/components/ui/product-mark.js +82 -0
  185. package/dist/components/ui/product-switcher.d.ts +108 -0
  186. package/dist/components/ui/product-switcher.d.ts.map +1 -0
  187. package/dist/components/ui/product-switcher.js +47 -0
  188. package/dist/components/ui/progress.d.ts +38 -0
  189. package/dist/components/ui/progress.d.ts.map +1 -0
  190. package/dist/components/ui/progress.js +17 -0
  191. package/dist/components/ui/prose.d.ts +88 -0
  192. package/dist/components/ui/prose.d.ts.map +1 -0
  193. package/dist/components/ui/prose.js +53 -0
  194. package/dist/components/ui/radio-group.d.ts +66 -0
  195. package/dist/components/ui/radio-group.d.ts.map +1 -0
  196. package/dist/components/ui/radio-group.js +30 -0
  197. package/dist/components/ui/section.d.ts +60 -0
  198. package/dist/components/ui/section.d.ts.map +1 -0
  199. package/dist/components/ui/section.js +21 -0
  200. package/dist/components/ui/select.d.ts +124 -0
  201. package/dist/components/ui/select.d.ts.map +1 -0
  202. package/dist/components/ui/select.js +47 -0
  203. package/dist/components/ui/separator.d.ts +16 -0
  204. package/dist/components/ui/separator.d.ts.map +1 -0
  205. package/dist/components/ui/separator.js +15 -0
  206. package/dist/components/ui/skeleton.d.ts +12 -0
  207. package/dist/components/ui/skeleton.d.ts.map +1 -0
  208. package/dist/components/ui/skeleton.js +14 -0
  209. package/dist/components/ui/slider.d.ts +43 -0
  210. package/dist/components/ui/slider.d.ts.map +1 -0
  211. package/dist/components/ui/slider.js +23 -0
  212. package/dist/components/ui/switch.d.ts +42 -0
  213. package/dist/components/ui/switch.d.ts.map +1 -0
  214. package/dist/components/ui/switch.js +16 -0
  215. package/dist/components/ui/table.d.ts +27 -0
  216. package/dist/components/ui/table.d.ts.map +1 -0
  217. package/dist/components/ui/table.js +43 -0
  218. package/dist/components/ui/tabs.d.ts +66 -0
  219. package/dist/components/ui/tabs.d.ts.map +1 -0
  220. package/dist/components/ui/tabs.js +29 -0
  221. package/dist/components/ui/textarea.d.ts +11 -0
  222. package/dist/components/ui/textarea.d.ts.map +1 -0
  223. package/dist/components/ui/textarea.js +13 -0
  224. package/dist/components/ui/tooltip.d.ts +63 -0
  225. package/dist/components/ui/tooltip.d.ts.map +1 -0
  226. package/dist/components/ui/tooltip.js +25 -0
  227. package/dist/components/ui/typography.d.ts +32 -0
  228. package/dist/components/ui/typography.d.ts.map +1 -0
  229. package/dist/components/ui/typography.js +51 -0
  230. package/dist/index.d.ts +79 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +68 -0
  233. package/dist/lib/utils.d.ts +3 -0
  234. package/dist/lib/utils.d.ts.map +1 -0
  235. package/dist/lib/utils.js +5 -0
  236. package/dist/pages/auth-page/index.d.ts +36 -0
  237. package/dist/pages/auth-page/index.d.ts.map +1 -0
  238. package/dist/pages/auth-page/index.js +23 -0
  239. package/dist/pages/blog-post-page/index.d.ts +174 -0
  240. package/dist/pages/blog-post-page/index.d.ts.map +1 -0
  241. package/dist/pages/blog-post-page/index.js +49 -0
  242. package/dist/pages/dashboard-page/index.d.ts +36 -0
  243. package/dist/pages/dashboard-page/index.d.ts.map +1 -0
  244. package/dist/pages/dashboard-page/index.js +24 -0
  245. package/dist/pages/index.d.ts +21 -0
  246. package/dist/pages/index.d.ts.map +1 -0
  247. package/dist/pages/index.js +14 -0
  248. package/dist/pages/marketing-page/index.d.ts +43 -0
  249. package/dist/pages/marketing-page/index.d.ts.map +1 -0
  250. package/dist/pages/marketing-page/index.js +25 -0
  251. package/dist/pages/not-found-page/index.d.ts +112 -0
  252. package/dist/pages/not-found-page/index.d.ts.map +1 -0
  253. package/dist/pages/not-found-page/index.js +46 -0
  254. package/dist/pages/settings-page/index.d.ts +47 -0
  255. package/dist/pages/settings-page/index.d.ts.map +1 -0
  256. package/dist/pages/settings-page/index.js +24 -0
  257. package/dist/provider/index.d.ts +12 -0
  258. package/dist/provider/index.d.ts.map +1 -0
  259. package/dist/provider/index.js +9 -0
  260. package/dist/provider/provider.d.ts +42 -0
  261. package/dist/provider/provider.d.ts.map +1 -0
  262. package/dist/provider/provider.js +178 -0
  263. package/dist/provider/theme-script.d.ts +55 -0
  264. package/dist/provider/theme-script.d.ts.map +1 -0
  265. package/dist/provider/theme-script.js +79 -0
  266. package/dist/styles.css +2894 -0
  267. package/dist/theming/index.d.ts +173 -0
  268. package/dist/theming/index.d.ts.map +1 -0
  269. package/dist/theming/index.js +186 -0
  270. package/package.json +89 -18
  271. package/components.json +0 -21
  272. package/public/r/badge.json +0 -26
  273. package/public/r/button.json +0 -26
  274. package/public/r/card.json +0 -25
  275. package/public/r/cta-01.json +0 -44
  276. package/public/r/feature-grid-01.json +0 -44
  277. package/public/r/hero-01.json +0 -44
  278. package/public/r/pricing-01.json +0 -46
  279. package/public/r/registry.json +0 -294
  280. package/public/r/section.json +0 -25
  281. package/public/r/stats-01.json +0 -44
  282. package/registry.json +0 -294
  283. package/src/components/ds/blocks/cta-01/block.json +0 -8
  284. package/src/components/ds/blocks/cta-01/cta.tsx +0 -62
  285. package/src/components/ds/blocks/cta-01/index.tsx +0 -1
  286. package/src/components/ds/blocks/feature-grid-01/block.json +0 -8
  287. package/src/components/ds/blocks/feature-grid-01/feature-grid.tsx +0 -69
  288. package/src/components/ds/blocks/feature-grid-01/index.tsx +0 -1
  289. package/src/components/ds/blocks/hero-01/block.json +0 -8
  290. package/src/components/ds/blocks/hero-01/hero.tsx +0 -85
  291. package/src/components/ds/blocks/hero-01/index.tsx +0 -1
  292. package/src/components/ds/blocks/pricing-01/block.json +0 -8
  293. package/src/components/ds/blocks/pricing-01/index.tsx +0 -1
  294. package/src/components/ds/blocks/pricing-01/pricing.tsx +0 -122
  295. package/src/components/ds/blocks/section.meta.json +0 -6
  296. package/src/components/ds/blocks/section.tsx +0 -86
  297. package/src/components/ds/blocks/stats-01/block.json +0 -8
  298. package/src/components/ds/blocks/stats-01/index.tsx +0 -1
  299. package/src/components/ds/blocks/stats-01/stats.tsx +0 -92
  300. package/src/components/ui/badge.tsx +0 -37
  301. package/src/components/ui/button.tsx +0 -77
  302. package/src/components/ui/card.tsx +0 -65
  303. package/src/lib/utils.ts +0 -6
@@ -0,0 +1,78 @@
1
+ import type { LucideIcon } from 'lucide-react';
2
+ import { type HeadingLevel } from '../../components/ui/section';
3
+ /**
4
+ * One feature in an icon-bearing grid.
5
+ *
6
+ * The icon is required, not optional, because this tile is always rendered: an
7
+ * optional icon here would compile and then paint an empty accent tile, which is
8
+ * the safe-at-render condition an optional prop turns unsafe.
9
+ */
10
+ export type IconFeature = {
11
+ icon: LucideIcon;
12
+ title: string;
13
+ body: string;
14
+ };
15
+ /** One feature in a bare grid, which renders no tile and so asks for no icon. */
16
+ export type BareFeature = {
17
+ title: string;
18
+ body: string;
19
+ };
20
+ /**
21
+ * A feature, in whichever of the two shapes the grid's `variant` admits.
22
+ *
23
+ * The requirement is expressed as a union discriminated on `variant` rather than
24
+ * as `icon?: LucideIcon` on one type, because only a union lets the type system
25
+ * see the exception. A single type cannot require an icon in one variant and not
26
+ * in the other: it can only be required in both, which makes the bare variant
27
+ * impossible, or optional in both, which makes the icon variant's empty tile
28
+ * possible. The discriminator is the same `variant` value the Block branches on
29
+ * at render, so the two cannot disagree.
30
+ */
31
+ export type Feature = IconFeature | BareFeature;
32
+ type FeatureGrid01CommonProps = {
33
+ eyebrow?: string;
34
+ title?: string;
35
+ description?: string;
36
+ /**
37
+ * Puts the feature's position in the grid on the card, zero-padded to two
38
+ * digits, above the title.
39
+ *
40
+ * The ordinal is rendered from the card's position rather than taken from the
41
+ * feature, because a list that carries its own numbers is a list whose numbers
42
+ * can disagree with its order after a sort, a filter or an insertion. All four
43
+ * NaniSoft sites render one: three of them as `01` in the mono face on every
44
+ * card, and the fourth on a set of pillars as well as on the grid.
45
+ *
46
+ * It is off by default. A number on a card is a claim that the set is a
47
+ * sequence, and a grid of features is usually a set.
48
+ */
49
+ numbered?: boolean;
50
+ /** Heading level for the section title. See `HeadingLevel`. */
51
+ headingLevel?: HeadingLevel;
52
+ };
53
+ /**
54
+ * The `icon` arm is the one an omitted `variant` selects, so the default and
55
+ * the required icon live on the same arm: a consumer who writes nothing about
56
+ * the variant gets the tiles and the icons they imply.
57
+ */
58
+ export type FeatureGrid01Props = FeatureGrid01CommonProps & ({
59
+ variant?: 'icon';
60
+ features: IconFeature[];
61
+ } | {
62
+ variant: 'bare';
63
+ features: BareFeature[];
64
+ });
65
+ /**
66
+ * A grid of short feature blurbs.
67
+ *
68
+ * The feature list is a prop. It previously hardcoded the catalog's own selling
69
+ * points under the heading "Why this catalog", so an installed block argued for
70
+ * the library inside the consumer's product.
71
+ *
72
+ * The `icon` variant renders a tile per feature and requires an icon per feature.
73
+ * The `bare` variant renders no tile and requires no icon, and the type says so
74
+ * rather than the renderer finding out.
75
+ */
76
+ export declare function FeatureGrid01(props: FeatureGrid01Props): import("react").JSX.Element;
77
+ export default FeatureGrid01;
78
+ //# sourceMappingURL=feature-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-grid.d.ts","sourceRoot":"","sources":["../../../src/blocks/feature-grid-01/feature-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAExF;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,WAAW,CAAA;AAE/C,KAAK,wBAAwB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,GACvD,CACI;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAC/C,CAAA;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BA0CtD;AAED,eAAe,aAAa,CAAA"}
@@ -0,0 +1,24 @@
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';
4
+ /**
5
+ * A grid of short feature blurbs.
6
+ *
7
+ * The feature list is a prop. It previously hardcoded the catalog's own selling
8
+ * points under the heading "Why this catalog", so an installed block argued for
9
+ * the library inside the consumer's product.
10
+ *
11
+ * The `icon` variant renders a tile per feature and requires an icon per feature.
12
+ * The `bare` variant renders no tile and requires no icon, and the type says so
13
+ * rather than the renderer finding out.
14
+ */
15
+ export function FeatureGrid01(props) {
16
+ const { eyebrow, title, description, numbered = false, headingLevel = 'h2' } = props;
17
+ // Read off `props` rather than destructured, so the two stay one value: taking
18
+ // `variant` and `features` apart is what would let the arm the type checked
19
+ // and the arm the renderer followed come to be two different ones.
20
+ const variant = props.variant ?? 'icon';
21
+ 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))) })] }));
23
+ }
24
+ export default FeatureGrid01;
@@ -0,0 +1,3 @@
1
+ export { FeatureGrid01, default } from './feature-grid';
2
+ export type { BareFeature, Feature, FeatureGrid01Props, IconFeature, } from './feature-grid';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/feature-grid-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EACV,WAAW,EACX,OAAO,EACP,kBAAkB,EAClB,WAAW,GACZ,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1 @@
1
+ export { FeatureGrid01, default } from './feature-grid';
@@ -0,0 +1,59 @@
1
+ import { type HeadingLevel } from '../../components/ui/section';
2
+ export type HeroAction = {
3
+ label: string;
4
+ href?: string;
5
+ variant?: 'default' | 'outline' | 'secondary' | 'ghost';
6
+ };
7
+ export type Hero01Props = {
8
+ /**
9
+ * Optional label above the headline. Intentionally has no default: an earlier
10
+ * version shipped a hardcoded "Now in open beta" pill, which meant every
11
+ * consumer who installed this block inherited a status badge making a claim
12
+ * about their product. Pass one if you mean it.
13
+ */
14
+ eyebrow?: string;
15
+ title: string;
16
+ description?: string;
17
+ actions?: HeroAction[];
18
+ /**
19
+ * Whether the copy is centered in the band or set flush to the left edge of
20
+ * the container.
21
+ *
22
+ * This is the hero's own alignment and not `SectionHeading`'s, because the two
23
+ * are not the same decision: a left-aligned hero is nearly always the left half
24
+ * of a two-column band with a panel or an instrument beside it, and that column
25
+ * is narrower than the container, so the alignment has to be the hero's before
26
+ * the container can be anything. Three of the four NaniSoft sites compose a
27
+ * left-aligned hero, each beside a panel, and each wrote the alignment by hand
28
+ * because this Block was the centered form only.
29
+ *
30
+ * It has no visual effect on its own, which is the point: it aligns the copy
31
+ * inside whatever width it is given.
32
+ *
33
+ * @defaultValue 'center'
34
+ */
35
+ align?: 'center' | 'left';
36
+ /**
37
+ * Heading level for the title. Defaults to `h2` because a block is composed,
38
+ * not a page: it installs into a consumer's layout and renders
39
+ * inside catalog previews, so the surrounding document already owns the `h1`.
40
+ * A page that uses this block as its top-level heading opts in with
41
+ * `headingLevel="h1"`; a document that already names this section in its own
42
+ * heading passes one level deeper. See `HeadingLevel`.
43
+ */
44
+ headingLevel?: HeadingLevel;
45
+ };
46
+ /**
47
+ * A centered marketing hero with an optional eyebrow, a headline, a supporting
48
+ * line and up to two actions.
49
+ *
50
+ * The copy and the actions are props, and the Block ships none of either. It
51
+ * previously shipped nothing of its own here and the remaining thing worth saying
52
+ * is the alignment: `align` is this Block's own prop rather than a pass-through of
53
+ * `SectionHeading`'s, because a left-aligned hero is nearly always one column of a
54
+ * two-column band and that column is narrower than the container, so the alignment
55
+ * has to be decided before the container is anything.
56
+ */
57
+ export declare function Hero01({ eyebrow, title, description, actions, align, headingLevel, }: Hero01Props): import("react").JSX.Element;
58
+ export default Hero01;
59
+ //# sourceMappingURL=hero.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/hero.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;CACxD,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAY,EACZ,KAAgB,EAChB,YAAmB,GACpB,EAAE,WAAW,+BAkDb;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowRight } from 'lucide-react';
3
+ import { Button } from '../../components/ui/button';
4
+ import { Section, SectionHeading } from '../../components/ui/section';
5
+ import { cn } from '../../lib/utils';
6
+ /**
7
+ * A centered marketing hero with an optional eyebrow, a headline, a supporting
8
+ * line and up to two actions.
9
+ *
10
+ * The copy and the actions are props, and the Block ships none of either. It
11
+ * previously shipped nothing of its own here and the remaining thing worth saying
12
+ * is the alignment: `align` is this Block's own prop rather than a pass-through of
13
+ * `SectionHeading`'s, because a left-aligned hero is nearly always one column of a
14
+ * two-column band and that column is narrower than the container, so the alignment
15
+ * has to be decided before the container is anything.
16
+ */
17
+ export function Hero01({ eyebrow, title, description, actions = [], align = 'center', headingLevel = 'h2', }) {
18
+ return (_jsxs(Section, { className: "relative overflow-hidden", 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-copy", className: cn('flex flex-col gap-10', 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: align, title: title, description: description }), actions.length ? (_jsx("div", { className: "flex flex-col gap-3 sm:flex-row", children: actions.map((action, index) => (
19
+ // Positional, for the same reason as `pricing-01`'s feature list:
20
+ // the label is display content, and two actions may share one.
21
+ // Safe here because the list is static and never reordered.
22
+ _jsxs(Button, { size: "lg", variant: action.variant ?? (index === 0 ? 'default' : 'outline'), className: "group", children: [action.label, index === 0 ? (_jsx(ArrowRight, { className: "motion-safe:transition-transform size-4 group-hover:translate-x-0.5" })) : null] }, index))) })) : null] })] }));
23
+ }
24
+ export default Hero01;
@@ -0,0 +1,2 @@
1
+ export { Hero01, default } from './hero';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export { Hero01, default } from './hero';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Every Prism Block.
3
+ *
4
+ * A Block is a pre-composed, product-agnostic section: it accepts data and
5
+ * content as props and never fetches application data (ticket 07). The `-NN`
6
+ * suffix is the block-family variant ordinal.
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';
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blocks/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Every Prism Block.
3
+ *
4
+ * A Block is a pre-composed, product-agnostic section: it accepts data and
5
+ * content as props and never fetches application data (ticket 07). The `-NN`
6
+ * suffix is the block-family variant ordinal.
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';
@@ -0,0 +1,3 @@
1
+ export { InstrumentPanel01, default } from './instrument-panel';
2
+ export type { InstrumentPanel01Props, PanelState } from './instrument-panel';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/instrument-panel-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC/D,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1 @@
1
+ export { InstrumentPanel01, default } from './instrument-panel';
@@ -0,0 +1,114 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * The state a panel's title bar claims about what is inside it.
4
+ *
5
+ * Three, and none of them is a fifth: `neutral` says nothing, `live` says the
6
+ * content is updating now, and `paused` says it is not. A fourth state such as
7
+ * `error` or `stale` is a claim about a specific system's health, and a panel
8
+ * that shipped one would be making a claim about every consumer's data on their
9
+ * behalf.
10
+ */
11
+ export type PanelState = 'neutral' | 'live' | 'paused';
12
+ /**
13
+ * The props an InstrumentPanel01 takes.
14
+ *
15
+ * The content is a slot and the frame is the Block. A panel that took a prop per
16
+ * kind of instrument would be four panels, and an instrument - a graph, a chart,
17
+ * a table, a canvas, a piece of application-owned markup - is the one thing in
18
+ * this system that Prism cannot draw, because drawing it is the application's job
19
+ * and its data is the application's own.
20
+ */
21
+ export type InstrumentPanel01Props = {
22
+ /**
23
+ * What the panel shows, in one phrase: "the estate, as one graph", "the loop,
24
+ * live". It is the panel's title and the only visible text the Block adds, so
25
+ * it is required.
26
+ */
27
+ label: string;
28
+ /**
29
+ * The state the title bar claims about the content. `neutral` renders a quiet
30
+ * dot and no words; `live` and `paused` require `stateLabel` with them, because
31
+ * the words are what a reader is told and the dot is only what a reader sees.
32
+ *
33
+ * @defaultValue 'neutral'
34
+ */
35
+ state?: PanelState;
36
+ /**
37
+ * The words for the state, in the product's own vocabulary. Required whenever
38
+ * `state` is `live` or `paused`: "live view", "paused", "snapshotting" and
39
+ * "verified" are four different claims about four different systems, and none
40
+ * of them is Prism's to choose.
41
+ */
42
+ stateLabel?: string;
43
+ /**
44
+ * A slot on the right of the title bar, for a control the panel does not own: a
45
+ * range selector, a pause button, a link to the full view. A slot rather than a
46
+ * prop, because every one of those is application state.
47
+ */
48
+ actions?: ReactNode;
49
+ /**
50
+ * The instrument. Any node the consumer composes: a graph, a chart, a table, a
51
+ * canvas, a placeholder in a static export. The Block draws the frame and the
52
+ * bar and nothing else.
53
+ */
54
+ children: ReactNode;
55
+ /**
56
+ * The line under the instrument, for what a reader needs to know before
57
+ * trusting it: where the data came from, how fresh it is, what is not shown.
58
+ */
59
+ footnote?: ReactNode;
60
+ /**
61
+ * A caption for the panel as a whole, published as the frame's accessible name
62
+ * and as no visible text. It is how a reader navigating by figure knows which
63
+ * figure they have landed on.
64
+ */
65
+ caption?: string;
66
+ /**
67
+ * Layout only, exactly as on every Component. Changing a Prism-owned visual
68
+ * property from here is prohibited.
69
+ */
70
+ className?: string;
71
+ };
72
+ /**
73
+ * A bordered instrument panel with a titled bar: the frame a live view of
74
+ * something is shown in, beside the copy that explains it.
75
+ *
76
+ * Three of the four NaniSoft sites compose this as the right half of their hero,
77
+ * and each one wrote the same four things by hand: a bordered panel, a bar across
78
+ * the top with a small state dot on the left, the name of the view in the middle
79
+ * and something on the right, the instrument below, and a footnote under it. Each
80
+ * also gave the panel a definite height, because an instrument whose height is
81
+ * whatever its content is makes the hero beside it jump while it loads.
82
+ *
83
+ * **The panel owns the frame, never the instrument.** What goes inside is
84
+ * whatever the consumer composed, and that is not a limitation: an instrument is
85
+ * the one thing in this system Prism cannot draw, because it is a view of the
86
+ * consumer's data and every consumer's data is a different drawing. A panel that
87
+ * took a prop per instrument kind would be four panels and would still not cover
88
+ * the fifth consumer to write their own.
89
+ *
90
+ * The state dot is `aria-hidden` and the words beside it are not. All three sites
91
+ * that draw a dot write the state in words next to it, and that is the rule here:
92
+ * a dot is a shape, and a reader who cannot see `success` has learned nothing from
93
+ * it. `stateLabel` is therefore required whenever the state is `live` or `paused`,
94
+ * and the Block throws without it rather than shipping a state a reader can only
95
+ * see.
96
+ *
97
+ * The bar is a `Section`-width row rather than a page-width one, because a panel
98
+ * is a column and a column that runs the page's width is not a column. The frame
99
+ * carries `shadow-sm`, the resting surface step, and no more: a panel is a card
100
+ * with an instrument in it, and the only element in this system that means
101
+ * *lifted* is the one with a border in the pack's primary hue, which this is not.
102
+ *
103
+ * The three states are `neutral`, `live` and `paused`, and there is no fourth. A
104
+ * state such as `error` or `stale` is a claim about a specific system's health,
105
+ * and a panel that shipped one would be making that claim about every consumer's
106
+ * data.
107
+ *
108
+ * It is a server Component. It holds no state and imports no client code, so a
109
+ * consumer that puts a client instrument inside it pays for the instrument and not
110
+ * for the frame.
111
+ */
112
+ export declare function InstrumentPanel01({ label, state, stateLabel, actions, children, footnote, caption, className, }: InstrumentPanel01Props): import("react").JSX.Element;
113
+ export default InstrumentPanel01;
114
+ //# sourceMappingURL=instrument-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrument-panel.d.ts","sourceRoot":"","sources":["../../../src/blocks/instrument-panel-01/instrument-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAiBtD;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,QAAQ,EAAE,SAAS,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,sBAAsB,+BA2CxB;AAED,eAAe,iBAAiB,CAAA"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils';
3
+ /**
4
+ * The dot each state draws.
5
+ *
6
+ * All three are `aria-hidden`, and the state is announced in words beside them
7
+ * rather than by the colour: a live dot is a shape a reader who cannot see
8
+ * `success` has not been told anything, and the three sites that draw one all
9
+ * write the words next to it. That is the rule this reproduces, and it is why
10
+ * `stateLabel` is required whenever `state` is set to anything but `neutral`.
11
+ */
12
+ const STATE_DOT = {
13
+ neutral: 'bg-muted-foreground',
14
+ live: 'bg-success',
15
+ paused: 'bg-warning',
16
+ };
17
+ /**
18
+ * A bordered instrument panel with a titled bar: the frame a live view of
19
+ * something is shown in, beside the copy that explains it.
20
+ *
21
+ * Three of the four NaniSoft sites compose this as the right half of their hero,
22
+ * and each one wrote the same four things by hand: a bordered panel, a bar across
23
+ * the top with a small state dot on the left, the name of the view in the middle
24
+ * and something on the right, the instrument below, and a footnote under it. Each
25
+ * also gave the panel a definite height, because an instrument whose height is
26
+ * whatever its content is makes the hero beside it jump while it loads.
27
+ *
28
+ * **The panel owns the frame, never the instrument.** What goes inside is
29
+ * whatever the consumer composed, and that is not a limitation: an instrument is
30
+ * the one thing in this system Prism cannot draw, because it is a view of the
31
+ * consumer's data and every consumer's data is a different drawing. A panel that
32
+ * took a prop per instrument kind would be four panels and would still not cover
33
+ * the fifth consumer to write their own.
34
+ *
35
+ * The state dot is `aria-hidden` and the words beside it are not. All three sites
36
+ * that draw a dot write the state in words next to it, and that is the rule here:
37
+ * a dot is a shape, and a reader who cannot see `success` has learned nothing from
38
+ * it. `stateLabel` is therefore required whenever the state is `live` or `paused`,
39
+ * and the Block throws without it rather than shipping a state a reader can only
40
+ * see.
41
+ *
42
+ * The bar is a `Section`-width row rather than a page-width one, because a panel
43
+ * is a column and a column that runs the page's width is not a column. The frame
44
+ * carries `shadow-sm`, the resting surface step, and no more: a panel is a card
45
+ * with an instrument in it, and the only element in this system that means
46
+ * *lifted* is the one with a border in the pack's primary hue, which this is not.
47
+ *
48
+ * The three states are `neutral`, `live` and `paused`, and there is no fourth. A
49
+ * state such as `error` or `stale` is a claim about a specific system's health,
50
+ * and a panel that shipped one would be making that claim about every consumer's
51
+ * data.
52
+ *
53
+ * It is a server Component. It holds no state and imports no client code, so a
54
+ * consumer that puts a client instrument inside it pays for the instrument and not
55
+ * for the frame.
56
+ */
57
+ export function InstrumentPanel01({ label, state = 'neutral', stateLabel, actions, children, footnote, caption, className, }) {
58
+ if (state !== 'neutral' && !stateLabel) {
59
+ throw new Error(`InstrumentPanel01: the panel state is '${state}' and no stateLabel was passed, so the state would ` +
60
+ 'be a dot a reader can only see. Pass the words you mean, or use the neutral state.');
61
+ }
62
+ return (_jsxs("figure", { "data-slot": "instrument-panel", "data-state": state, "aria-label": caption, className: cn('bg-card flex w-full flex-col gap-0 rounded-xl border shadow-sm', className), children: [_jsxs("div", { "data-slot": "instrument-panel-bar", className: "border-border text-muted-foreground flex items-center gap-3 border-b px-4 py-2 text-xs", children: [_jsx("span", { "aria-hidden": true, "data-state": state, className: cn('inline-block size-2 shrink-0 rounded-full', STATE_DOT[state]) }), _jsx("span", { className: "truncate font-medium", children: label }), stateLabel ? _jsx("span", { className: "truncate", children: stateLabel }) : null, actions ? _jsx("span", { className: "ms-auto flex shrink-0 items-center gap-2", children: actions }) : null] }), _jsx("div", { "data-slot": "instrument-panel-body", className: "min-h-0 flex-1 px-4 py-3", children: children }), footnote ? (_jsx("figcaption", { "data-slot": "instrument-panel-footnote", className: "text-muted-foreground border-border border-t px-4 py-2 text-xs", children: footnote })) : null] }));
63
+ }
64
+ export default InstrumentPanel01;
@@ -0,0 +1,3 @@
1
+ export { LogoStrip01, default } from './logo-strip';
2
+ export type { LogoStrip01Props, LogoStripItem } from './logo-strip';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/logo-strip-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACnD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1 @@
1
+ export { LogoStrip01, default } from './logo-strip';
@@ -0,0 +1,84 @@
1
+ import { type HeadingLevel } from '../../components/ui/section';
2
+ /**
3
+ * One item of the strip, as a string.
4
+ *
5
+ * A string rather than a node, because the strip is a run of short words and a
6
+ * node would let a caller put a paragraph in a slot whose whole job is to be
7
+ * scannable in one glance. A caller with more than a few words about one item
8
+ * wants a `NoteGrid01` row or a `StatusLedger01` row, not a longer strip.
9
+ */
10
+ export type LogoStripItem = string;
11
+ /**
12
+ * The props a LogoStrip01 takes.
13
+ *
14
+ * Every string is a prop and the Block ships none. There is no default list of
15
+ * technologies, no default list of customers and no default list of words: a
16
+ * strip that hardcoded any of them would hand every consumer a claim about who
17
+ * uses their product.
18
+ */
19
+ export type LogoStrip01Props = {
20
+ /**
21
+ * The items, in the order a reader should meet them. Order is the caller's
22
+ * because it is a claim about which item matters first.
23
+ */
24
+ items: readonly LogoStripItem[];
25
+ /**
26
+ * The strip's accessible name, for a strip that is not inside a region the
27
+ * reader can already name. It is rendered as the list's name and as no visible
28
+ * text, because the items are the visible content and a heading above them would
29
+ * be a heading about a heading.
30
+ *
31
+ * It is required because it is a word a reader hears. A Block that ships no copy
32
+ * ships no reader-facing copy either, so "Highlights" is not this Block's to
33
+ * choose: on one site the strip is a list of data sources and on another it is a
34
+ * list of capabilities, and the word that says which is the caller's.
35
+ */
36
+ label: string;
37
+ /** Optional label above the section title. See the No-Default-Eyebrow Rule. */
38
+ eyebrow?: string;
39
+ /** The section title. Omit it for a strip composed under its own heading. */
40
+ title?: string;
41
+ /** One or two sentences under the title. */
42
+ description?: string;
43
+ /** Heading level for the section title. See `HeadingLevel`. */
44
+ headingLevel?: HeadingLevel;
45
+ /**
46
+ * Layout only, exactly as on every Component. Changing a Prism-owned visual
47
+ * property from here is prohibited.
48
+ */
49
+ className?: string;
50
+ };
51
+ /**
52
+ * A single line of short items: the transition band between a hero and the
53
+ * section that follows it.
54
+ *
55
+ * All four NaniSoft sites compose this band, immediately after the hero and
56
+ * before the first numbered section, and each one wrote it as the same thing: a
57
+ * row of three to six short phrases, separated by a middot, in muted text, with
58
+ * no heading at all. Four hand-written strips, four sets of site CSS, and one
59
+ * question each of them answered differently - whether the strip is a list, a
60
+ * paragraph with separators, or a decorative row of spans.
61
+ *
62
+ * It is a `ul`, so a screen reader hears how many items there are before it
63
+ * hears the first one. That is the whole answer to the question: a strip whose
64
+ * items are spans in a `div` is announced as one run of text with no count, and a
65
+ * reader deciding whether to keep listening has nothing to weigh.
66
+ *
67
+ * **The strip does not move.** A band of items that slides is an entrance
68
+ * animation, and this system has none: motion is state feedback only, shortened
69
+ * rather than removed under reduced motion. What the four sites actually wanted
70
+ * from their strips was a second, quieter statement of what the product is, and
71
+ * repetition of the type does that without anything moving. A strip of more than
72
+ * about eight items wraps onto three lines on a phone and stops being a band, so
73
+ * a longer set belongs in a `StackGrid01`.
74
+ *
75
+ * The items are `text-balance` so a two-word item does not break across lines
76
+ * where a one-word item beside it does not. There is no separator glyph between
77
+ * them: a middot is punctuation a screen reader reads and a sighted reader parses
78
+ * as content, and the gap already separates two words from two words.
79
+ *
80
+ * It is a server Component: no hook, no state, no keyframes and no client code.
81
+ */
82
+ export declare function LogoStrip01({ items, label, eyebrow, title, description, headingLevel, className, }: LogoStrip01Props): import("react").JSX.Element | null;
83
+ export default LogoStrip01;
84
+ //# sourceMappingURL=logo-strip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo-strip.d.ts","sourceRoot":"","sources":["../../../src/blocks/logo-strip-01/logo-strip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAElC;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IAC/B;;;;;;;;;;OAUG;IACH,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,OAAO,EACP,KAAK,EACL,WAAW,EACX,YAAmB,EACnB,SAAS,GACV,EAAE,gBAAgB,sCA+BlB;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,40 @@
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';
4
+ /**
5
+ * A single line of short items: the transition band between a hero and the
6
+ * section that follows it.
7
+ *
8
+ * All four NaniSoft sites compose this band, immediately after the hero and
9
+ * before the first numbered section, and each one wrote it as the same thing: a
10
+ * row of three to six short phrases, separated by a middot, in muted text, with
11
+ * no heading at all. Four hand-written strips, four sets of site CSS, and one
12
+ * question each of them answered differently - whether the strip is a list, a
13
+ * paragraph with separators, or a decorative row of spans.
14
+ *
15
+ * It is a `ul`, so a screen reader hears how many items there are before it
16
+ * hears the first one. That is the whole answer to the question: a strip whose
17
+ * items are spans in a `div` is announced as one run of text with no count, and a
18
+ * reader deciding whether to keep listening has nothing to weigh.
19
+ *
20
+ * **The strip does not move.** A band of items that slides is an entrance
21
+ * animation, and this system has none: motion is state feedback only, shortened
22
+ * rather than removed under reduced motion. What the four sites actually wanted
23
+ * from their strips was a second, quieter statement of what the product is, and
24
+ * repetition of the type does that without anything moving. A strip of more than
25
+ * about eight items wraps onto three lines on a phone and stops being a band, so
26
+ * a longer set belongs in a `StackGrid01`.
27
+ *
28
+ * The items are `text-balance` so a two-word item does not break across lines
29
+ * where a one-word item beside it does not. There is no separator glyph between
30
+ * them: a middot is punctuation a screen reader reads and a sighted reader parses
31
+ * as content, and the gap already separates two words from two words.
32
+ *
33
+ * It is a server Component: no hook, no state, no keyframes and no client code.
34
+ */
35
+ export function LogoStrip01({ items, label, eyebrow, title, description, headingLevel = 'h2', className, }) {
36
+ if (items.length === 0)
37
+ return null;
38
+ return (_jsxs(Section, { className: "py-10 sm:py-14", children: [title ? (_jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description, className: "mb-10" })) : null, _jsx("ul", { "data-slot": "logo-strip", "aria-label": items.length > 1 ? label : undefined, className: cn('text-muted-foreground flex flex-wrap items-center justify-center gap-x-4 gap-y-2 text-center text-sm', className), children: items.map((item) => (_jsx("li", { "data-slot": "logo-strip-item", className: "text-balance", children: item }, item))) })] }));
39
+ }
40
+ export default LogoStrip01;
@@ -0,0 +1,3 @@
1
+ export { NoteGrid01, default } from './note-grid';
2
+ export type { NoteGrid01Props, NoteGrid01Note } from './note-grid';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/note-grid-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACjD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1 @@
1
+ export { NoteGrid01, default } from './note-grid';