@nanisoft/prism-ui 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) 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 +23 -0
  18. package/dist/blocks/cta-01/cta.d.ts.map +1 -0
  19. package/dist/blocks/cta-01/cta.js +24 -0
  20. package/dist/blocks/cta-01/index.d.ts +2 -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 +27 -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 +14 -0
  32. package/dist/blocks/feature-grid-01/index.d.ts +2 -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 +30 -0
  36. package/dist/blocks/hero-01/hero.d.ts.map +1 -0
  37. package/dist/blocks/hero-01/hero.js +12 -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 +18 -0
  42. package/dist/blocks/index.d.ts.map +1 -0
  43. package/dist/blocks/index.js +17 -0
  44. package/dist/blocks/page-header-01/index.d.ts +3 -0
  45. package/dist/blocks/page-header-01/index.d.ts.map +1 -0
  46. package/dist/blocks/page-header-01/index.js +1 -0
  47. package/dist/blocks/page-header-01/page-header.d.ts +48 -0
  48. package/dist/blocks/page-header-01/page-header.d.ts.map +1 -0
  49. package/dist/blocks/page-header-01/page-header.js +27 -0
  50. package/dist/blocks/pricing-01/index.d.ts +2 -0
  51. package/dist/blocks/pricing-01/index.d.ts.map +1 -0
  52. package/dist/blocks/pricing-01/index.js +1 -0
  53. package/dist/blocks/pricing-01/pricing.d.ts +35 -0
  54. package/dist/blocks/pricing-01/pricing.d.ts.map +1 -0
  55. package/dist/blocks/pricing-01/pricing.js +20 -0
  56. package/dist/blocks/settings-panel-01/index.d.ts +3 -0
  57. package/dist/blocks/settings-panel-01/index.d.ts.map +1 -0
  58. package/dist/blocks/settings-panel-01/index.js +1 -0
  59. package/dist/blocks/settings-panel-01/settings-panel.d.ts +71 -0
  60. package/dist/blocks/settings-panel-01/settings-panel.d.ts.map +1 -0
  61. package/dist/blocks/settings-panel-01/settings-panel.js +38 -0
  62. package/dist/blocks/stats-01/index.d.ts +2 -0
  63. package/dist/blocks/stats-01/index.d.ts.map +1 -0
  64. package/dist/blocks/stats-01/index.js +1 -0
  65. package/dist/blocks/stats-01/stats.d.ts +28 -0
  66. package/dist/blocks/stats-01/stats.d.ts.map +1 -0
  67. package/dist/blocks/stats-01/stats.js +27 -0
  68. package/dist/catalog.d.ts +28 -0
  69. package/dist/catalog.d.ts.map +1 -0
  70. package/dist/catalog.js +502 -0
  71. package/dist/components/index.d.ts +53 -0
  72. package/dist/components/index.d.ts.map +1 -0
  73. package/dist/components/index.js +37 -0
  74. package/dist/components/ui/accordion.d.ts +65 -0
  75. package/dist/components/ui/accordion.d.ts.map +1 -0
  76. package/dist/components/ui/accordion.js +30 -0
  77. package/dist/components/ui/alert.d.ts +19 -0
  78. package/dist/components/ui/alert.d.ts.map +1 -0
  79. package/dist/components/ui/alert.js +31 -0
  80. package/dist/components/ui/avatar.d.ts +47 -0
  81. package/dist/components/ui/avatar.d.ts.map +1 -0
  82. package/dist/components/ui/avatar.js +30 -0
  83. package/dist/components/ui/badge.d.ts +14 -0
  84. package/dist/components/ui/badge.d.ts.map +1 -0
  85. package/dist/components/ui/badge.js +26 -0
  86. package/dist/components/ui/breadcrumb.d.ts +35 -0
  87. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  88. package/dist/components/ui/breadcrumb.js +48 -0
  89. package/dist/components/ui/button.d.ts +16 -0
  90. package/dist/components/ui/button.d.ts.map +1 -0
  91. package/dist/components/ui/button.js +63 -0
  92. package/dist/components/ui/card.d.ts +16 -0
  93. package/dist/components/ui/card.d.ts.map +1 -0
  94. package/dist/components/ui/card.js +28 -0
  95. package/dist/components/ui/checkbox.d.ts +43 -0
  96. package/dist/components/ui/checkbox.d.ts.map +1 -0
  97. package/dist/components/ui/checkbox.js +18 -0
  98. package/dist/components/ui/dialog.d.ts +81 -0
  99. package/dist/components/ui/dialog.d.ts.map +1 -0
  100. package/dist/components/ui/dialog.js +60 -0
  101. package/dist/components/ui/dropdown-menu.d.ts +189 -0
  102. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  103. package/dist/components/ui/dropdown-menu.js +67 -0
  104. package/dist/components/ui/field.d.ts +36 -0
  105. package/dist/components/ui/field.d.ts.map +1 -0
  106. package/dist/components/ui/field.js +46 -0
  107. package/dist/components/ui/input.d.ts +12 -0
  108. package/dist/components/ui/input.d.ts.map +1 -0
  109. package/dist/components/ui/input.js +14 -0
  110. package/dist/components/ui/kbd.d.ts +10 -0
  111. package/dist/components/ui/kbd.d.ts.map +1 -0
  112. package/dist/components/ui/kbd.js +12 -0
  113. package/dist/components/ui/pagination.d.ts +40 -0
  114. package/dist/components/ui/pagination.d.ts.map +1 -0
  115. package/dist/components/ui/pagination.js +49 -0
  116. package/dist/components/ui/popover.d.ts +56 -0
  117. package/dist/components/ui/popover.d.ts.map +1 -0
  118. package/dist/components/ui/popover.js +25 -0
  119. package/dist/components/ui/progress.d.ts +38 -0
  120. package/dist/components/ui/progress.d.ts.map +1 -0
  121. package/dist/components/ui/progress.js +17 -0
  122. package/dist/components/ui/radio-group.d.ts +66 -0
  123. package/dist/components/ui/radio-group.d.ts.map +1 -0
  124. package/dist/components/ui/radio-group.js +30 -0
  125. package/dist/components/ui/section.d.ts +37 -0
  126. package/dist/components/ui/section.d.ts.map +1 -0
  127. package/dist/components/ui/section.js +12 -0
  128. package/dist/components/ui/select.d.ts +124 -0
  129. package/dist/components/ui/select.d.ts.map +1 -0
  130. package/dist/components/ui/select.js +47 -0
  131. package/dist/components/ui/separator.d.ts +16 -0
  132. package/dist/components/ui/separator.d.ts.map +1 -0
  133. package/dist/components/ui/separator.js +15 -0
  134. package/dist/components/ui/skeleton.d.ts +12 -0
  135. package/dist/components/ui/skeleton.d.ts.map +1 -0
  136. package/dist/components/ui/skeleton.js +14 -0
  137. package/dist/components/ui/slider.d.ts +43 -0
  138. package/dist/components/ui/slider.d.ts.map +1 -0
  139. package/dist/components/ui/slider.js +17 -0
  140. package/dist/components/ui/switch.d.ts +42 -0
  141. package/dist/components/ui/switch.d.ts.map +1 -0
  142. package/dist/components/ui/switch.js +16 -0
  143. package/dist/components/ui/table.d.ts +27 -0
  144. package/dist/components/ui/table.d.ts.map +1 -0
  145. package/dist/components/ui/table.js +43 -0
  146. package/dist/components/ui/tabs.d.ts +66 -0
  147. package/dist/components/ui/tabs.d.ts.map +1 -0
  148. package/dist/components/ui/tabs.js +29 -0
  149. package/dist/components/ui/textarea.d.ts +11 -0
  150. package/dist/components/ui/textarea.d.ts.map +1 -0
  151. package/dist/components/ui/textarea.js +13 -0
  152. package/dist/components/ui/tooltip.d.ts +63 -0
  153. package/dist/components/ui/tooltip.d.ts.map +1 -0
  154. package/dist/components/ui/tooltip.js +25 -0
  155. package/dist/components/ui/typography.d.ts +32 -0
  156. package/dist/components/ui/typography.d.ts.map +1 -0
  157. package/dist/components/ui/typography.js +51 -0
  158. package/dist/index.d.ts +55 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +51 -0
  161. package/dist/lib/utils.d.ts +3 -0
  162. package/dist/lib/utils.d.ts.map +1 -0
  163. package/dist/lib/utils.js +5 -0
  164. package/dist/pages/auth-page/index.d.ts +36 -0
  165. package/dist/pages/auth-page/index.d.ts.map +1 -0
  166. package/dist/pages/auth-page/index.js +23 -0
  167. package/dist/pages/dashboard-page/index.d.ts +36 -0
  168. package/dist/pages/dashboard-page/index.d.ts.map +1 -0
  169. package/dist/pages/dashboard-page/index.js +24 -0
  170. package/dist/pages/index.d.ts +17 -0
  171. package/dist/pages/index.d.ts.map +1 -0
  172. package/dist/pages/index.js +12 -0
  173. package/dist/pages/marketing-page/index.d.ts +43 -0
  174. package/dist/pages/marketing-page/index.d.ts.map +1 -0
  175. package/dist/pages/marketing-page/index.js +25 -0
  176. package/dist/pages/settings-page/index.d.ts +47 -0
  177. package/dist/pages/settings-page/index.d.ts.map +1 -0
  178. package/dist/pages/settings-page/index.js +24 -0
  179. package/dist/provider/index.d.ts +12 -0
  180. package/dist/provider/index.d.ts.map +1 -0
  181. package/dist/provider/index.js +9 -0
  182. package/dist/provider/provider.d.ts +37 -0
  183. package/dist/provider/provider.d.ts.map +1 -0
  184. package/dist/provider/provider.js +87 -0
  185. package/dist/provider/theme-script.d.ts +17 -0
  186. package/dist/provider/theme-script.d.ts.map +1 -0
  187. package/dist/provider/theme-script.js +28 -0
  188. package/dist/styles.css +2413 -0
  189. package/dist/theming/index.d.ts +43 -0
  190. package/dist/theming/index.d.ts.map +1 -0
  191. package/dist/theming/index.js +60 -0
  192. package/package.json +79 -18
  193. package/components.json +0 -21
  194. package/public/r/badge.json +0 -26
  195. package/public/r/button.json +0 -26
  196. package/public/r/card.json +0 -25
  197. package/public/r/cta-01.json +0 -44
  198. package/public/r/feature-grid-01.json +0 -44
  199. package/public/r/hero-01.json +0 -44
  200. package/public/r/pricing-01.json +0 -46
  201. package/public/r/registry.json +0 -294
  202. package/public/r/section.json +0 -25
  203. package/public/r/stats-01.json +0 -44
  204. package/registry.json +0 -294
  205. package/src/components/ds/blocks/cta-01/block.json +0 -8
  206. package/src/components/ds/blocks/cta-01/cta.tsx +0 -62
  207. package/src/components/ds/blocks/cta-01/index.tsx +0 -1
  208. package/src/components/ds/blocks/feature-grid-01/block.json +0 -8
  209. package/src/components/ds/blocks/feature-grid-01/feature-grid.tsx +0 -69
  210. package/src/components/ds/blocks/feature-grid-01/index.tsx +0 -1
  211. package/src/components/ds/blocks/hero-01/block.json +0 -8
  212. package/src/components/ds/blocks/hero-01/hero.tsx +0 -85
  213. package/src/components/ds/blocks/hero-01/index.tsx +0 -1
  214. package/src/components/ds/blocks/pricing-01/block.json +0 -8
  215. package/src/components/ds/blocks/pricing-01/index.tsx +0 -1
  216. package/src/components/ds/blocks/pricing-01/pricing.tsx +0 -122
  217. package/src/components/ds/blocks/section.meta.json +0 -6
  218. package/src/components/ds/blocks/section.tsx +0 -86
  219. package/src/components/ds/blocks/stats-01/block.json +0 -8
  220. package/src/components/ds/blocks/stats-01/index.tsx +0 -1
  221. package/src/components/ds/blocks/stats-01/stats.tsx +0 -92
  222. package/src/components/ui/badge.tsx +0 -37
  223. package/src/components/ui/button.tsx +0 -77
  224. package/src/components/ui/card.tsx +0 -65
  225. package/src/lib/utils.ts +0 -6
@@ -0,0 +1,18 @@
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
+ //# 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"}
@@ -0,0 +1,17 @@
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';
@@ -0,0 +1,3 @@
1
+ export { PageHeader01, default } from './page-header';
2
+ export type { PageHeader01Props, PageHeaderAction, PageHeaderCrumb } from './page-header';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/page-header-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACrD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1 @@
1
+ export { PageHeader01, default } from './page-header';
@@ -0,0 +1,48 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type HeadingElement } from '../../components/ui/typography';
3
+ export type PageHeaderCrumb = {
4
+ label: ReactNode;
5
+ /** Renders a native anchor. Omit on the current, final step. */
6
+ href?: string;
7
+ };
8
+ export type PageHeaderAction = {
9
+ label: string;
10
+ variant?: 'default' | 'outline' | 'secondary' | 'ghost';
11
+ size?: 'default' | 'sm' | 'lg';
12
+ };
13
+ export type PageHeader01Props = {
14
+ /**
15
+ * The trail above the title. The final item always renders as the current
16
+ * page, whether or not it carries an `href`.
17
+ */
18
+ breadcrumbs?: PageHeaderCrumb[];
19
+ /** The page title. */
20
+ title: ReactNode;
21
+ /** One supporting line under the title. */
22
+ description?: ReactNode;
23
+ /**
24
+ * Declarative actions rendered as Prism Buttons. Use `actionsSlot` for a
25
+ * control that needs its own behaviour, such as a router link or a menu.
26
+ */
27
+ actions?: PageHeaderAction[];
28
+ /** A slot for consumer-provided controls on the action row. */
29
+ actionsSlot?: ReactNode;
30
+ /**
31
+ * The heading element for the title. Defaults to `h2` because a block is
32
+ * composed; a page whose own document outline this header opens passes
33
+ * `h1`. See `HeadingElement`.
34
+ */
35
+ headingLevel?: HeadingElement;
36
+ };
37
+ /**
38
+ * A page title band.
39
+ *
40
+ * It places a breadcrumb trail and a row of actions above the title, then a
41
+ * rule below the header. The trail is passed in as props and renders native
42
+ * anchors, so the consumer owns navigation and can substitute their own
43
+ * router by passing `actionsSlot` and breadcrumb labels. Every string and
44
+ * every step is a prop; the block ships none of its own.
45
+ */
46
+ export declare function PageHeader01({ breadcrumbs, title, description, actions, actionsSlot, headingLevel, }: PageHeader01Props): import("react").JSX.Element;
47
+ export default PageHeader01;
48
+ //# sourceMappingURL=page-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-header.d.ts","sourceRoot":"","sources":["../../../src/blocks/page-header-01/page-header.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAYhD,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAEnF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,CAAA;IAChB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;IACvD,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;IAC/B,sBAAsB;IACtB,KAAK,EAAE,SAAS,CAAA;IAChB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,cAAc,CAAA;CAC9B,CAAA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAC3B,WAAW,EACX,KAAK,EACL,WAAW,EACX,OAAY,EACZ,WAAW,EACX,YAAmB,GACpB,EAAE,iBAAiB,+BAiEnB;AAED,eAAe,YAAY,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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';
7
+ /**
8
+ * A page title band.
9
+ *
10
+ * It places a breadcrumb trail and a row of actions above the title, then a
11
+ * rule below the header. The trail is passed in as props and renders native
12
+ * anchors, so the consumer owns navigation and can substitute their own
13
+ * router by passing `actionsSlot` and breadcrumb labels. Every string and
14
+ * every step is a prop; the block ships none of its own.
15
+ */
16
+ export function PageHeader01({ breadcrumbs, title, description, actions = [], actionsSlot, headingLevel = 'h2', }) {
17
+ const hasTrail = Boolean(breadcrumbs?.length);
18
+ const hasActions = actions.length > 0 || Boolean(actionsSlot);
19
+ return (_jsxs("header", { className: "flex flex-col gap-4", children: [hasTrail || hasActions ? (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-4", children: [hasTrail ? (_jsx(Breadcrumb, { children: _jsx(BreadcrumbList, { children: breadcrumbs?.map((crumb, index) => {
20
+ const last = index === breadcrumbs.length - 1;
21
+ return (
22
+ // Positional, for the same reason as the other blocks: the
23
+ // label is display content and two steps may share one.
24
+ _jsxs(Fragment, { children: [index > 0 ? _jsx(BreadcrumbSeparator, {}) : null, _jsx(BreadcrumbItem, { children: last || !crumb.href ? (_jsx(BreadcrumbPage, { children: crumb.label })) : (_jsx(BreadcrumbLink, { href: crumb.href, children: crumb.label })) })] }, index));
25
+ }) }) })) : (_jsx("span", {})), hasActions ? (_jsxs("div", { className: "flex items-center gap-2", children: [actionsSlot, actions.map((action, index) => (_jsx(Button, { variant: action.variant ?? (index === 0 ? 'default' : 'outline'), size: action.size, children: action.label }, index)))] })) : null] })) : null, _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Heading, { as: headingLevel, size: "3xl", children: title }), description ? (_jsx(Text, { size: "lg", tone: "muted", children: description })) : null] }), _jsx(Separator, {})] }));
26
+ }
27
+ export default PageHeader01;
@@ -0,0 +1,2 @@
1
+ export { Pricing01, default } from './pricing';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/pricing-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1 @@
1
+ export { Pricing01, default } from './pricing';
@@ -0,0 +1,35 @@
1
+ import { type HeadingLevel } from '../../components/ui/section';
2
+ export type Plan = {
3
+ name: string;
4
+ price: string;
5
+ /** Rendered after the price, e.g. " / month". Omit for a one-off figure. */
6
+ period?: string;
7
+ body?: string;
8
+ features: string[];
9
+ cta: string;
10
+ /** Lifts the plan with a primary border and a filled button. */
11
+ featured?: boolean;
12
+ /** Overrides the "Popular" badge on the featured plan. */
13
+ badge?: string;
14
+ };
15
+ export type Pricing01Props = {
16
+ eyebrow?: string;
17
+ title?: string;
18
+ description?: string;
19
+ plans: Plan[];
20
+ /** Heading level for the section title. See `HeadingLevel`. */
21
+ headingLevel?: HeadingLevel;
22
+ };
23
+ /**
24
+ * A three-up plan comparison.
25
+ *
26
+ * Every plan is a prop, including the price and the call to action. It previously
27
+ * hardcoded "$0 / $24 / $68", "Talk to us", "MIT licence" and "Figma library",
28
+ * and shipped a heading reading "Pricing" above a title already reading "Pick a
29
+ * plan". A shared library has no plans to sell, so those strings described a
30
+ * business that does not exist here, and every consumer who installed the block
31
+ * inherited them.
32
+ */
33
+ export declare function Pricing01({ eyebrow, title, description, plans, headingLevel, }: Pricing01Props): import("react").JSX.Element;
34
+ export default Pricing01;
35
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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';
7
+ /**
8
+ * A three-up plan comparison.
9
+ *
10
+ * Every plan is a prop, including the price and the call to action. It previously
11
+ * hardcoded "$0 / $24 / $68", "Talk to us", "MIT licence" and "Figma library",
12
+ * and shipped a heading reading "Pricing" above a title already reading "Pick a
13
+ * plan". A shared library has no plans to sell, so those strings described a
14
+ * business that does not exist here, and every consumer who installed the block
15
+ * inherited them.
16
+ */
17
+ 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 ? _jsx(Badge, { children: plan.badge ?? 'Popular' }) : 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
+ }
20
+ export default Pricing01;
@@ -0,0 +1,3 @@
1
+ export { SettingsPanel01, default } from './settings-panel';
2
+ export type { SettingsPanel01Props, SettingsPanelField, SettingsPanelOption, SettingsPanelSection, } from './settings-panel';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/settings-panel-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC3D,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1 @@
1
+ export { SettingsPanel01, default } from './settings-panel';
@@ -0,0 +1,71 @@
1
+ import { type FormEvent, type ReactNode } from 'react';
2
+ export type SettingsPanelOption = {
3
+ label: string;
4
+ value: string;
5
+ };
6
+ type SettingsPanelFieldBase = {
7
+ id: string;
8
+ label: string;
9
+ description?: string;
10
+ disabled?: boolean;
11
+ };
12
+ export type SettingsPanelField = (SettingsPanelFieldBase & {
13
+ kind: 'text';
14
+ type?: 'text' | 'email' | 'url';
15
+ placeholder?: string;
16
+ value?: string;
17
+ defaultValue?: string;
18
+ onChange?: (value: string) => void;
19
+ }) | (SettingsPanelFieldBase & {
20
+ kind: 'textarea';
21
+ placeholder?: string;
22
+ rows?: number;
23
+ value?: string;
24
+ defaultValue?: string;
25
+ onChange?: (value: string) => void;
26
+ }) | (SettingsPanelFieldBase & {
27
+ kind: 'switch';
28
+ checked?: boolean;
29
+ defaultChecked?: boolean;
30
+ onCheckedChange?: (checked: boolean) => void;
31
+ }) | (SettingsPanelFieldBase & {
32
+ kind: 'select';
33
+ placeholder?: string;
34
+ options: SettingsPanelOption[];
35
+ value?: string;
36
+ defaultValue?: string;
37
+ onValueChange?: (value: string) => void;
38
+ });
39
+ export type SettingsPanelSection = {
40
+ id: string;
41
+ title: string;
42
+ description?: string;
43
+ fields: SettingsPanelField[];
44
+ };
45
+ export type SettingsPanel01Props = {
46
+ title: string;
47
+ description?: string;
48
+ /** The settings groups, each rendered with a heading and its own fields. */
49
+ sections: SettingsPanelSection[];
50
+ /** The submit button label. Omit to render no footer. */
51
+ submitLabel?: string;
52
+ onSubmit?: (event: FormEvent<HTMLFormElement>) => void;
53
+ /** A secondary control, such as Cancel. */
54
+ secondaryAction?: {
55
+ label: string;
56
+ onClick?: () => void;
57
+ };
58
+ /** Extra content in the footer, e.g. a status note. */
59
+ footer?: ReactNode;
60
+ };
61
+ /**
62
+ * A settings form grouped into sections.
63
+ *
64
+ * A field is a small object describing one control: a text input, a textarea,
65
+ * a select or a switch, with its label, description and value handlers. The
66
+ * block renders the card, the groups and the footer; it owns no values and no
67
+ * copy, so a consumer wires it to whatever form state or mutation they use.
68
+ */
69
+ export declare function SettingsPanel01({ title, description, sections, submitLabel, onSubmit, secondaryAction, footer, }: SettingsPanel01Props): import("react").JSX.Element;
70
+ export default SettingsPanel01;
71
+ //# sourceMappingURL=settings-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-panel.d.ts","sourceRoot":"","sources":["../../../src/blocks/settings-panel-01/settings-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AA6BhE,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,KAAK,sBAAsB,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAC1B,CAAC,sBAAsB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,CAAC,GACF,CAAC,sBAAsB,GAAG;IACxB,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC,CAAC,GACF,CAAC,sBAAsB,GAAG;IACxB,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;CAC7C,CAAC,GACF,CAAC,sBAAsB,GAAG;IACxB,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC,CAAC,CAAA;AAEN,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,kBAAkB,EAAE,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACtD,2CAA2C;IAC3C,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,CAAA;IACzD,uDAAuD;IACvD,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB,CAAA;AAyFD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,eAAe,EACf,MAAM,GACP,EAAE,oBAAoB,+BAmDtB;AAED,eAAe,eAAe,CAAA"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Fragment } from 'react';
4
+ import { Button } from '../../components/ui/button';
5
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '../../components/ui/card';
6
+ import { Field, FieldDescription, FieldGroup, FieldLabel, } from '../../components/ui/field';
7
+ import { Input } from '../../components/ui/input';
8
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../components/ui/select';
9
+ import { Separator } from '../../components/ui/separator';
10
+ import { Switch } from '../../components/ui/switch';
11
+ import { Textarea } from '../../components/ui/textarea';
12
+ function SettingsField({ field }) {
13
+ if (field.kind === 'switch') {
14
+ return (_jsxs(Field, { className: "flex-row items-center justify-between gap-4", children: [_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx(FieldLabel, { htmlFor: field.id, children: field.label }), field.description ? (_jsx(FieldDescription, { children: field.description })) : null] }), _jsx(Switch, { id: field.id, checked: field.checked, defaultChecked: field.defaultChecked, onCheckedChange: field.onCheckedChange, disabled: field.disabled })] }));
15
+ }
16
+ if (field.kind === 'select') {
17
+ return (_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: field.id, children: field.label }), _jsxs(Select, { value: field.value, defaultValue: field.defaultValue, onValueChange: field.onValueChange
18
+ ? (value) => field.onValueChange?.(value ?? '')
19
+ : undefined, disabled: field.disabled, items: Object.fromEntries(field.options.map((option) => [option.value, option.label])), children: [_jsx(SelectTrigger, { id: field.id, className: "w-full", children: _jsx(SelectValue, { placeholder: field.placeholder }) }), _jsx(SelectContent, { children: field.options.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] }), field.description ? _jsx(FieldDescription, { children: field.description }) : null] }));
20
+ }
21
+ if (field.kind === 'textarea') {
22
+ return (_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: field.id, children: field.label }), _jsx(Textarea, { id: field.id, rows: field.rows, placeholder: field.placeholder, value: field.value, defaultValue: field.defaultValue, onChange: field.onChange ? (event) => field.onChange?.(event.target.value) : undefined, disabled: field.disabled }), field.description ? _jsx(FieldDescription, { children: field.description }) : null] }));
23
+ }
24
+ return (_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: field.id, children: field.label }), _jsx(Input, { id: field.id, type: field.type ?? 'text', placeholder: field.placeholder, value: field.value, defaultValue: field.defaultValue, onChange: field.onChange ? (event) => field.onChange?.(event.target.value) : undefined, disabled: field.disabled }), field.description ? _jsx(FieldDescription, { children: field.description }) : null] }));
25
+ }
26
+ /**
27
+ * A settings form grouped into sections.
28
+ *
29
+ * A field is a small object describing one control: a text input, a textarea,
30
+ * a select or a switch, with its label, description and value handlers. The
31
+ * block renders the card, the groups and the footer; it owns no values and no
32
+ * copy, so a consumer wires it to whatever form state or mutation they use.
33
+ */
34
+ export function SettingsPanel01({ title, description, sections, submitLabel, onSubmit, secondaryAction, footer, }) {
35
+ const hasFooter = Boolean(submitLabel || secondaryAction || footer);
36
+ return (_jsx("form", { onSubmit: onSubmit, className: "w-full", children: _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: title }), description ? _jsx(CardDescription, { children: description }) : null] }), _jsx(CardContent, { className: "flex flex-col", children: sections.map((section, index) => (_jsxs(Fragment, { children: [index > 0 ? _jsx(Separator, { className: "my-6" }) : null, _jsxs("section", { className: "flex flex-col gap-4", "aria-labelledby": `${section.id}-heading`, children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("h3", { id: `${section.id}-heading`, className: "text-lg font-semibold tracking-tight", children: section.title }), section.description ? (_jsx("p", { className: "text-muted-foreground text-sm", children: section.description })) : null] }), _jsx(FieldGroup, { children: section.fields.map((field) => (_jsx(SettingsField, { field: field }, field.id))) })] })] }, section.id))) }), hasFooter ? (_jsxs(CardFooter, { className: "justify-end gap-2", children: [footer, secondaryAction ? (_jsx(Button, { type: "button", variant: "outline", onClick: secondaryAction.onClick, children: secondaryAction.label })) : null, submitLabel ? _jsx(Button, { type: "submit", children: submitLabel }) : null] })) : null] }) }));
37
+ }
38
+ export default SettingsPanel01;
@@ -0,0 +1,2 @@
1
+ export { Stats01, default } from './stats';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/stats-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1 @@
1
+ export { Stats01, default } from './stats';
@@ -0,0 +1,28 @@
1
+ import { type HeadingLevel } from '../../components/ui/section';
2
+ export type Stat = {
3
+ label: string;
4
+ value: string;
5
+ /** Percentage change. Positive reads as growth, negative as decline. */
6
+ delta?: number;
7
+ /** Period the delta compares against, e.g. "vs last month". */
8
+ hint?: string;
9
+ };
10
+ export type Stats01Props = {
11
+ eyebrow?: string;
12
+ title?: string;
13
+ stats: Stat[];
14
+ /** Heading level for the section title. See `HeadingLevel`. */
15
+ headingLevel?: HeadingLevel;
16
+ };
17
+ /**
18
+ * A KPI row. Every number is a prop.
19
+ *
20
+ * This block used to carry a hardcoded set reading "128 blocks shipped" and "9.4k
21
+ * weekly installs". Those were invented figures about a library nobody installs
22
+ * yet, and because they lived in the component rather than at the call site, a
23
+ * consumer who installed the block shipped fabricated metrics into their own
24
+ * dashboard. A stat block with invented stats in it is worse than no stat block.
25
+ */
26
+ export declare function Stats01({ eyebrow, title, stats, headingLevel }: Stats01Props): import("react").JSX.Element;
27
+ export default Stats01;
28
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/blocks/stats-01/stats.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAExF,MAAM,MAAM,IAAI,GAAG;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AA2BD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAmB,EAAE,EAAE,YAAY,+BAiCnF;AAED,eAAe,OAAO,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowDownRight, ArrowUpRight, Minus } from 'lucide-react';
3
+ import { Card, CardContent } from '../../components/ui/card';
4
+ import { Section, SectionHeading } from '../../components/ui/section';
5
+ function Delta({ value }) {
6
+ if (value === 0) {
7
+ return (_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs", children: [_jsx(Minus, { className: "size-3" }), "0%"] }));
8
+ }
9
+ const up = value > 0;
10
+ const Icon = up ? ArrowUpRight : ArrowDownRight;
11
+ return (_jsxs("span", { className: up
12
+ ? 'text-success flex items-center gap-1 text-xs'
13
+ : 'text-destructive flex items-center gap-1 text-xs', children: [_jsx(Icon, { className: "size-3" }), Math.abs(value), "%"] }));
14
+ }
15
+ /**
16
+ * A KPI row. Every number is a prop.
17
+ *
18
+ * This block used to carry a hardcoded set reading "128 blocks shipped" and "9.4k
19
+ * weekly installs". Those were invented figures about a library nobody installs
20
+ * yet, and because they lived in the component rather than at the call site, a
21
+ * consumer who installed the block shipped fabricated metrics into their own
22
+ * dashboard. A stat block with invented stats in it is worse than no stat block.
23
+ */
24
+ export function Stats01({ eyebrow, title, stats, headingLevel = 'h2' }) {
25
+ return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, eyebrow: eyebrow, title: title, align: "left", className: "mb-10" })) : null, _jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: stats.map((stat) => (_jsx(Card, { className: "gap-2 py-5", children: _jsxs(CardContent, { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-muted-foreground text-sm", children: stat.label }), _jsx("span", { className: "text-2xl font-semibold tracking-tight", children: stat.value }), stat.delta === undefined && !stat.hint ? null : (_jsxs("div", { className: "flex items-center gap-2", children: [stat.delta === undefined ? null : _jsx(Delta, { value: stat.delta }), stat.hint ? (_jsx("span", { className: "text-muted-foreground text-xs", children: stat.hint })) : null] }))] }) }, stat.label))) })] }));
26
+ }
27
+ export default Stats01;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The checked Prism catalogue: the single list of Components, Blocks and Pages.
3
+ *
4
+ * This is the shape fixed by tickets 09 and 19, not the finished 28-item roster.
5
+ * The v1 build grows it one authored entry at a time; `source` and `exports` are
6
+ * the fields the build checks against disk and the emitted declarations, never
7
+ * the reverse, so the internal shadcn registry stays derived rather than
8
+ * authoritative. Tooling only: a consumer's runtime UI must not import this.
9
+ */
10
+ export declare const CATALOG_KINDS: readonly ["component", "block", "page"];
11
+ export type CatalogKind = (typeof CATALOG_KINDS)[number];
12
+ export declare const COMPONENT_CATEGORIES: readonly ["Call to action", "Forms and inputs", "Feedback", "Layout", "Data display", "Typography", "Miscellaneous"];
13
+ export type ComponentCategory = (typeof COMPONENT_CATEGORIES)[number];
14
+ export interface CatalogItem {
15
+ name: string;
16
+ slug: string;
17
+ kind: CatalogKind;
18
+ category: ComponentCategory | null;
19
+ description: string;
20
+ source: string;
21
+ exports: string[];
22
+ status: 'stable' | 'deprecated';
23
+ }
24
+ export declare const catalog: readonly CatalogItem[];
25
+ /** Returns the catalogue ordered for display and keyed for lookup. */
26
+ export declare function buildCatalog(items?: readonly CatalogItem[]): CatalogItem[];
27
+ export declare const catalogBySlug: ReadonlyMap<string, CatalogItem>;
28
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,aAAa,yCAA0C,CAAA;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,eAAO,MAAM,oBAAoB,sHAQvB,CAAA;AACV,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAErE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAA;CAChC;AAED,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAiezC,CAAA;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,GAAE,SAAS,WAAW,EAAY,GAAG,WAAW,EAAE,CAEnF;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAE1D,CAAA"}