@nanisoft/prism-ui 0.5.1 → 0.7.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 (132) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/blocks/cta-01/cta.d.ts +66 -6
  3. package/dist/blocks/cta-01/cta.d.ts.map +1 -1
  4. package/dist/blocks/cta-01/cta.js +8 -3
  5. package/dist/blocks/cta-01/index.d.ts +1 -0
  6. package/dist/blocks/cta-01/index.d.ts.map +1 -1
  7. package/dist/blocks/feature-grid-01/feature-grid.d.ts +57 -6
  8. package/dist/blocks/feature-grid-01/feature-grid.d.ts.map +1 -1
  9. package/dist/blocks/feature-grid-01/feature-grid.js +12 -2
  10. package/dist/blocks/feature-grid-01/index.d.ts +1 -0
  11. package/dist/blocks/feature-grid-01/index.d.ts.map +1 -1
  12. package/dist/blocks/hero-01/hero.d.ts +30 -1
  13. package/dist/blocks/hero-01/hero.d.ts.map +1 -1
  14. package/dist/blocks/hero-01/hero.js +14 -2
  15. package/dist/blocks/index.d.ts +10 -0
  16. package/dist/blocks/index.d.ts.map +1 -1
  17. package/dist/blocks/index.js +9 -0
  18. package/dist/blocks/instrument-panel-01/index.d.ts +3 -0
  19. package/dist/blocks/instrument-panel-01/index.d.ts.map +1 -0
  20. package/dist/blocks/instrument-panel-01/index.js +1 -0
  21. package/dist/blocks/instrument-panel-01/instrument-panel.d.ts +114 -0
  22. package/dist/blocks/instrument-panel-01/instrument-panel.d.ts.map +1 -0
  23. package/dist/blocks/instrument-panel-01/instrument-panel.js +64 -0
  24. package/dist/blocks/logo-strip-01/index.d.ts +3 -0
  25. package/dist/blocks/logo-strip-01/index.d.ts.map +1 -0
  26. package/dist/blocks/logo-strip-01/index.js +1 -0
  27. package/dist/blocks/logo-strip-01/logo-strip.d.ts +84 -0
  28. package/dist/blocks/logo-strip-01/logo-strip.d.ts.map +1 -0
  29. package/dist/blocks/logo-strip-01/logo-strip.js +40 -0
  30. package/dist/blocks/note-grid-01/index.d.ts +3 -0
  31. package/dist/blocks/note-grid-01/index.d.ts.map +1 -0
  32. package/dist/blocks/note-grid-01/index.js +1 -0
  33. package/dist/blocks/note-grid-01/note-grid.d.ts +79 -0
  34. package/dist/blocks/note-grid-01/note-grid.d.ts.map +1 -0
  35. package/dist/blocks/note-grid-01/note-grid.js +37 -0
  36. package/dist/blocks/pricing-01/pricing.js +1 -1
  37. package/dist/blocks/process-rail-01/index.d.ts +3 -0
  38. package/dist/blocks/process-rail-01/index.d.ts.map +1 -0
  39. package/dist/blocks/process-rail-01/index.js +1 -0
  40. package/dist/blocks/process-rail-01/process-rail.d.ts +99 -0
  41. package/dist/blocks/process-rail-01/process-rail.d.ts.map +1 -0
  42. package/dist/blocks/process-rail-01/process-rail.js +58 -0
  43. package/dist/blocks/product-grid-01/index.d.ts +3 -0
  44. package/dist/blocks/product-grid-01/index.d.ts.map +1 -0
  45. package/dist/blocks/product-grid-01/index.js +1 -0
  46. package/dist/blocks/product-grid-01/product-grid.d.ts +114 -0
  47. package/dist/blocks/product-grid-01/product-grid.d.ts.map +1 -0
  48. package/dist/blocks/product-grid-01/product-grid.js +51 -0
  49. package/dist/blocks/site-footer/index.d.ts +3 -0
  50. package/dist/blocks/site-footer/index.d.ts.map +1 -0
  51. package/dist/blocks/site-footer/index.js +1 -0
  52. package/dist/blocks/site-footer/site-footer.d.ts +135 -0
  53. package/dist/blocks/site-footer/site-footer.d.ts.map +1 -0
  54. package/dist/blocks/site-footer/site-footer.js +41 -0
  55. package/dist/blocks/site-header/index.d.ts +3 -0
  56. package/dist/blocks/site-header/index.d.ts.map +1 -0
  57. package/dist/blocks/site-header/index.js +1 -0
  58. package/dist/blocks/site-header/site-header.d.ts +142 -0
  59. package/dist/blocks/site-header/site-header.d.ts.map +1 -0
  60. package/dist/blocks/site-header/site-header.js +46 -0
  61. package/dist/blocks/stack-grid-01/index.d.ts +3 -0
  62. package/dist/blocks/stack-grid-01/index.d.ts.map +1 -0
  63. package/dist/blocks/stack-grid-01/index.js +1 -0
  64. package/dist/blocks/stack-grid-01/stack-grid.d.ts +118 -0
  65. package/dist/blocks/stack-grid-01/stack-grid.d.ts.map +1 -0
  66. package/dist/blocks/stack-grid-01/stack-grid.js +49 -0
  67. package/dist/blocks/status-ledger-01/index.d.ts +3 -0
  68. package/dist/blocks/status-ledger-01/index.d.ts.map +1 -0
  69. package/dist/blocks/status-ledger-01/index.js +1 -0
  70. package/dist/blocks/status-ledger-01/status-ledger.d.ts +131 -0
  71. package/dist/blocks/status-ledger-01/status-ledger.d.ts.map +1 -0
  72. package/dist/blocks/status-ledger-01/status-ledger.js +80 -0
  73. package/dist/catalog.d.ts.map +1 -1
  74. package/dist/catalog.js +180 -0
  75. package/dist/components/index.d.ts +11 -0
  76. package/dist/components/index.d.ts.map +1 -1
  77. package/dist/components/index.js +6 -0
  78. package/dist/components/ui/card.d.ts +25 -0
  79. package/dist/components/ui/card.d.ts.map +1 -1
  80. package/dist/components/ui/card.js +25 -0
  81. package/dist/components/ui/cta-link.d.ts +45 -0
  82. package/dist/components/ui/cta-link.d.ts.map +1 -0
  83. package/dist/components/ui/cta-link.js +81 -0
  84. package/dist/components/ui/diagram.d.ts +154 -0
  85. package/dist/components/ui/diagram.d.ts.map +1 -0
  86. package/dist/components/ui/diagram.js +150 -0
  87. package/dist/components/ui/fact-list.d.ts +90 -0
  88. package/dist/components/ui/fact-list.d.ts.map +1 -0
  89. package/dist/components/ui/fact-list.js +38 -0
  90. package/dist/components/ui/product-mark.d.ts +115 -0
  91. package/dist/components/ui/product-mark.d.ts.map +1 -0
  92. package/dist/components/ui/product-mark.js +82 -0
  93. package/dist/components/ui/product-switcher.d.ts +108 -0
  94. package/dist/components/ui/product-switcher.d.ts.map +1 -0
  95. package/dist/components/ui/product-switcher.js +47 -0
  96. package/dist/components/ui/prose.d.ts +88 -0
  97. package/dist/components/ui/prose.d.ts.map +1 -0
  98. package/dist/components/ui/prose.js +53 -0
  99. package/dist/components/ui/section.d.ts +24 -1
  100. package/dist/components/ui/section.d.ts.map +1 -1
  101. package/dist/components/ui/section.js +11 -2
  102. package/dist/components/ui/slider.d.ts.map +1 -1
  103. package/dist/components/ui/slider.js +7 -1
  104. package/dist/index.d.ts +24 -0
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +17 -0
  107. package/dist/pages/blog-post-page/index.d.ts +174 -0
  108. package/dist/pages/blog-post-page/index.d.ts.map +1 -0
  109. package/dist/pages/blog-post-page/index.js +49 -0
  110. package/dist/pages/docs-shell/docs-shell.d.ts +250 -0
  111. package/dist/pages/docs-shell/docs-shell.d.ts.map +1 -0
  112. package/dist/pages/docs-shell/docs-shell.js +197 -0
  113. package/dist/pages/docs-shell/index.d.ts +3 -0
  114. package/dist/pages/docs-shell/index.d.ts.map +1 -0
  115. package/dist/pages/docs-shell/index.js +1 -0
  116. package/dist/pages/index.d.ts +13 -2
  117. package/dist/pages/index.d.ts.map +1 -1
  118. package/dist/pages/index.js +10 -2
  119. package/dist/pages/not-found-page/index.d.ts +112 -0
  120. package/dist/pages/not-found-page/index.d.ts.map +1 -0
  121. package/dist/pages/not-found-page/index.js +46 -0
  122. package/dist/provider/provider.d.ts +5 -0
  123. package/dist/provider/provider.d.ts.map +1 -1
  124. package/dist/provider/provider.js +129 -38
  125. package/dist/provider/theme-script.d.ts +41 -3
  126. package/dist/provider/theme-script.d.ts.map +1 -1
  127. package/dist/provider/theme-script.js +68 -17
  128. package/dist/styles.css +555 -12
  129. package/dist/theming/index.d.ts +132 -2
  130. package/dist/theming/index.d.ts.map +1 -1
  131. package/dist/theming/index.js +127 -1
  132. package/package.json +14 -4
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils';
3
+ /**
4
+ * The full spectrum, as the five series tokens and nothing else.
5
+ *
6
+ * A product with no pack of its own is the one entry in a product set that has
7
+ * no single hue, and the standing decision is that it wears the spectrum rather
8
+ * than a colourless mark: a colourless dot reads as a product with no identity,
9
+ * which is the one thing such an entry is not. This line is that decision
10
+ * translated into the current contract.
11
+ *
12
+ * The stops are `chart-1` through `chart-5` because they are the only five-way
13
+ * colour set the token contract publishes, and because `chart-1` starts at the
14
+ * page's own pack hue, so a sweep drawn under a scoped boundary begins in that
15
+ * pack and moves out of it. `chart-1` closes the wheel so the sweep has no seam
16
+ * at 0 degrees.
17
+ *
18
+ * It is the one gradient in the shipped surface. The geometry is Tailwind's and
19
+ * the colour stops are semantic, which is the only gradient DESIGN.md allows,
20
+ * and the element it paints is `aria-hidden`: a gradient is never the carrier of
21
+ * a name, and this one is not.
22
+ */
23
+ const SPECTRUM = 'bg-[conic-gradient(var(--chart-1),var(--chart-2),var(--chart-3),var(--chart-4),var(--chart-5),var(--chart-1))]';
24
+ /**
25
+ * The three sizes a product mark is drawn at: the mark's diameter and the name
26
+ * beside it, taken together so the two parts of the mark stay in proportion.
27
+ *
28
+ * The mark is one of a fixed set rather than something a caller sizes through
29
+ * `className`, because `className` is layout only and a mark sized by a layout
30
+ * class is a mark the layout owns. A product set shows its marks in a switcher,
31
+ * in a row and on a page header, and those three are the sizes a set needs.
32
+ */
33
+ const SIZES = {
34
+ sm: { mark: 'size-4', name: 'text-xs' },
35
+ md: { mark: 'size-5', name: 'text-sm' },
36
+ lg: { mark: 'size-6', name: 'text-base' },
37
+ };
38
+ /**
39
+ * A product's two-part colour mark: a hairline ring in the brand ink around a
40
+ * core in the pack's own fill, beside the product's name in the brand ink.
41
+ *
42
+ * Two parts, and both colours come from tokens, which is the whole reason this
43
+ * is promoted out of the two hand-written copies it replaces. The ring is
44
+ * `brand-ink`, the pack's brand hue as a stroke; the core is `primary`, the
45
+ * pack's brand value as a fill. That split is not a preference. DESIGN.md's Fill,
46
+ * Not the Ink Rule says a pastel brand value is a fill and never text, so the
47
+ * core may be `primary` and the name may not, and the Brand Ink Rule says the
48
+ * name reads `brand-ink` rather than `foreground` or `primary-foreground`. A
49
+ * hand-written copy gets one of those two wrong and nothing in the rendered
50
+ * result says which.
51
+ *
52
+ * Uniqueness across the set comes from the pack: each product wears its own
53
+ * pack's hue, and the one entry with no pack wears the spectrum, so no two marks
54
+ * in a set resolve to the same pair of colours. The set is the consumer's data.
55
+ * This Component draws one member of it, and it is the same member wherever it is
56
+ * drawn from.
57
+ *
58
+ * The mark carries its own `data-pack` boundary on its root, so a product's hue
59
+ * follows from the pack the caller passed rather than from whichever pack the
60
+ * page happens to be wearing, and a boundary lands on the mark rather than on
61
+ * whatever encloses it. The boundary is on a span carrying no radius utility,
62
+ * which is one of the two placements DESIGN.md's pack-boundary law allows, and
63
+ * the disc itself is fully rounded. Nothing about the mark's shape moves when a
64
+ * pack boundary lands above it, which is the half of that law a consumer
65
+ * implementing only the colour half gets wrong.
66
+ *
67
+ * It is a server Component: no hook, no mode, no context, no client code and no
68
+ * `'use client'` line. A consumer renders it from a server file and needs
69
+ * nothing from the provider mounted.
70
+ *
71
+ * The disc is `aria-hidden` and the name is not, so the mark adds a shape beside
72
+ * the word rather than a second reading of it.
73
+ */
74
+ function ProductMark({ id, name, pack, size = 'md', className }) {
75
+ const drawn = SIZES[size];
76
+ // `default` is the absence of a pack id, spelled the way the token build
77
+ // spells it, so a base-pack product resolves `primary` from the page rather
78
+ // than from an attribute that matches no emitted rule.
79
+ const boundary = pack && pack !== 'default' ? pack : undefined;
80
+ return (_jsxs("span", { "data-slot": "product-mark", "data-pack": boundary, className: cn('inline-flex items-center gap-2', className), children: [_jsx("span", { "data-slot": "product-mark-disc", "data-product": id, "aria-hidden": true, className: cn('inline-block shrink-0 rounded-full border border-brand-ink', drawn.mark, pack ? 'bg-primary' : SPECTRUM) }), _jsx("span", { "data-slot": "product-mark-name", className: cn('font-medium text-brand-ink', drawn.name), children: name })] }));
81
+ }
82
+ export { ProductMark };
@@ -0,0 +1,108 @@
1
+ import type { ComponentProps } from 'react';
2
+ import { type ProductMarkProps, type ProductMarkSize } from './product-mark';
3
+ /**
4
+ * One product in the set a switcher moves between.
5
+ *
6
+ * The three facts the mark is drawn from, and no directory. Which products exist
7
+ * is the consumer's decision: Prism ships the mark and the switch that reads it,
8
+ * not a list of NaniSoft's products, so a consumer composing a set of its own
9
+ * does not have to name them here to be able to switch between them.
10
+ */
11
+ export type SwitcherProduct = {
12
+ /**
13
+ * The product's key within the set. It is carried on the markup as
14
+ * `data-product` through `ProductMark`, so a test can name one member rather
15
+ * than the first one, and two members in one document are addressable.
16
+ */
17
+ id: string;
18
+ /** The product's own name, which is the second part of its mark. */
19
+ name: string;
20
+ /**
21
+ * The product's pack, which is the hue of its mark. Omit it, or pass `null`, for
22
+ * the one member of a set that has no pack of its own: that member is drawn as
23
+ * the full spectrum rather than as a colourless mark.
24
+ */
25
+ pack?: ProductMarkProps['pack'];
26
+ /**
27
+ * Where the member goes. Required, because a switcher whose members do not go
28
+ * anywhere is a list of labels.
29
+ */
30
+ href: string;
31
+ };
32
+ /**
33
+ * The props a ProductSwitcher takes.
34
+ *
35
+ * There is no `current` requirement: a switcher marks the member the reader is on
36
+ * with `aria-current="page"`, and the caller's own router is what knows that. The
37
+ * member is passed as `currentId` and the switcher marks it; nothing here is a
38
+ * router and nothing here decides where a link goes.
39
+ */
40
+ export type ProductSwitcherProps = Omit<ComponentProps<'nav'>, 'children'> & {
41
+ /**
42
+ * The set to move between, in the order a reader should meet it. Order is the
43
+ * caller's because it is a claim about which product matters first.
44
+ */
45
+ products: readonly SwitcherProduct[];
46
+ /**
47
+ * The `id` of the member the reader is on. Marked `aria-current="page"`, which
48
+ * is how a reader and a screen reader both know where they are. Omit it when
49
+ * the switcher is rendered on a page that is not one of the members.
50
+ */
51
+ currentId?: string;
52
+ /**
53
+ * The drawn size of every mark, so a set shows one size rather than a mix. See
54
+ * `ProductMarkSize`.
55
+ *
56
+ * @defaultValue 'sm'
57
+ */
58
+ size?: ProductMarkSize;
59
+ /**
60
+ * A heading for the set, for a switcher that is not inside a landmark the
61
+ * reader can already name. Rendered as the navigation's accessible name and as
62
+ * no visible text, because the marks beside it are the labels.
63
+ */
64
+ label?: string;
65
+ /**
66
+ * Layout only, exactly as on every Component. Changing a Prism-owned visual
67
+ * property from here is prohibited.
68
+ */
69
+ className?: string;
70
+ };
71
+ /**
72
+ * A switch between the members of a set of products.
73
+ *
74
+ * One job: let a reader who is in one product move to another, and say which one
75
+ * they are in. All four NaniSoft sites need it and each one wrote it: the
76
+ * company's own site moves between its products from a row of coloured dots, and
77
+ * each product site names its siblings in its header. The mark is `ProductMark`,
78
+ * so the two parts of a member's identity - the ring in the brand ink and the
79
+ * core in its own pack fill - are the same two colours wherever the member is
80
+ * drawn, in a switcher, in a row or on a page header.
81
+ *
82
+ * It is a Component rather than a Block because a switcher is not a region of a
83
+ * page: it is a control that appears in one, it fetches nothing, and every
84
+ * member of the set is a prop. The header that carries it is a Block, and it
85
+ * composes this.
86
+ *
87
+ * **The current member is marked, not styled.** A switcher that only colours the
88
+ * current member is a switcher a colourblind reader cannot use and a screen
89
+ * reader cannot read at all, so the current member carries `aria-current="page"`
90
+ * and Prism's focus ring comes from the browser's own link behaviour. There is
91
+ * no `variant` for the current member and no way to override the marking, which
92
+ * is the whole reason this is a Component rather than a list of anchors the
93
+ * caller writes.
94
+ *
95
+ * The set is a `nav` with an accessible name rather than a bare list of links,
96
+ * because a set of links that move between sections of one product is a
97
+ * navigation region and a screen reader should say so. `label` names it; the
98
+ * default name is `Products`, and a consumer whose set is not products passes
99
+ * its own word rather than accepting a claim about what its set is.
100
+ *
101
+ * It is a server Component: no hook, no context, no state and no client code,
102
+ * so a switcher in a static page costs no JavaScript at all. A consumer that
103
+ * wants a menu rather than a row of marks composes `DropdownMenu` with the marks
104
+ * and does not use this.
105
+ */
106
+ declare function ProductSwitcher({ products, currentId, size, label, className, ...props }: ProductSwitcherProps): import("react").JSX.Element | null;
107
+ export { ProductSwitcher };
108
+ //# sourceMappingURL=product-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-switcher.d.ts","sourceRoot":"","sources":["../../../src/components/ui/product-switcher.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,EAAe,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGzF;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAA;IACV,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC/B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IAC3E;;;OAGG;IACH,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAA;IACpC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,eAAe,CAAA;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,iBAAS,eAAe,CAAC,EACvB,QAAQ,EACR,SAAS,EACT,IAAW,EACX,KAAkB,EAClB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,oBAAoB,sCA+BtB;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ProductMark } from './product-mark';
3
+ import { cn } from '../../lib/utils';
4
+ /**
5
+ * A switch between the members of a set of products.
6
+ *
7
+ * One job: let a reader who is in one product move to another, and say which one
8
+ * they are in. All four NaniSoft sites need it and each one wrote it: the
9
+ * company's own site moves between its products from a row of coloured dots, and
10
+ * each product site names its siblings in its header. The mark is `ProductMark`,
11
+ * so the two parts of a member's identity - the ring in the brand ink and the
12
+ * core in its own pack fill - are the same two colours wherever the member is
13
+ * drawn, in a switcher, in a row or on a page header.
14
+ *
15
+ * It is a Component rather than a Block because a switcher is not a region of a
16
+ * page: it is a control that appears in one, it fetches nothing, and every
17
+ * member of the set is a prop. The header that carries it is a Block, and it
18
+ * composes this.
19
+ *
20
+ * **The current member is marked, not styled.** A switcher that only colours the
21
+ * current member is a switcher a colourblind reader cannot use and a screen
22
+ * reader cannot read at all, so the current member carries `aria-current="page"`
23
+ * and Prism's focus ring comes from the browser's own link behaviour. There is
24
+ * no `variant` for the current member and no way to override the marking, which
25
+ * is the whole reason this is a Component rather than a list of anchors the
26
+ * caller writes.
27
+ *
28
+ * The set is a `nav` with an accessible name rather than a bare list of links,
29
+ * because a set of links that move between sections of one product is a
30
+ * navigation region and a screen reader should say so. `label` names it; the
31
+ * default name is `Products`, and a consumer whose set is not products passes
32
+ * its own word rather than accepting a claim about what its set is.
33
+ *
34
+ * It is a server Component: no hook, no context, no state and no client code,
35
+ * so a switcher in a static page costs no JavaScript at all. A consumer that
36
+ * wants a menu rather than a row of marks composes `DropdownMenu` with the marks
37
+ * and does not use this.
38
+ */
39
+ function ProductSwitcher({ products, currentId, size = 'sm', label = 'Products', className, ...props }) {
40
+ if (products.length === 0)
41
+ return null;
42
+ return (_jsx("nav", { "data-slot": "product-switcher", "aria-label": label, className: cn('flex flex-wrap items-center gap-x-4 gap-y-2', className), ...props, children: products.map((product) => {
43
+ const current = product.id === currentId;
44
+ return (_jsx("a", { href: product.href, "aria-current": current ? 'page' : undefined, "data-current": current ? 'true' : undefined, className: "rounded-sm transition-opacity duration-fast ease-out hover:opacity-80", children: _jsx(ProductMark, { id: product.id, name: product.name, pack: product.pack, size: size }) }, product.id));
45
+ }) }));
46
+ }
47
+ export { ProductSwitcher };
@@ -0,0 +1,88 @@
1
+ import type { ComponentProps, ReactNode } from 'react';
2
+ /**
3
+ * The size a run of prose is set at.
4
+ *
5
+ * Two, and closed: `base` is the reading size a document body is set at, and
6
+ * `lg` is the one step up a marketing page's supporting copy uses. A third step
7
+ * would be a decision about the type scale rather than about prose, and the type
8
+ * scale is `Text`'s.
9
+ */
10
+ declare const PROSE_SIZES: {
11
+ readonly base: "text-base";
12
+ readonly lg: "text-lg";
13
+ };
14
+ /**
15
+ * The three sizes a run of prose is set at.
16
+ *
17
+ * @defaultValue 'base'
18
+ */
19
+ export type ProseSize = keyof typeof PROSE_SIZES;
20
+ /**
21
+ * The props a Prose takes.
22
+ *
23
+ * The content is `children`, so a Prose never decides what is in it. The prose
24
+ * is authored wherever it is authored - a Markdown pipeline, a CMS, a file of
25
+ * React - and Prism owns the measure, the rhythm and the block treatments, not
26
+ * the words.
27
+ */
28
+ export type ProseProps = ComponentProps<'div'> & {
29
+ /**
30
+ * The authored body. Any flow content: paragraphs, lists, headings, tables,
31
+ * code, images. The vertical rhythm and the treatments below apply to whatever
32
+ * is passed, so the caller writes plain elements and Prism styles them.
33
+ */
34
+ children: ReactNode;
35
+ /**
36
+ * The reading size. `base` is the document body; `lg` is the one step up a
37
+ * marketing page's supporting copy is set at.
38
+ *
39
+ * @defaultValue 'base'
40
+ */
41
+ size?: ProseSize;
42
+ /**
43
+ * Drops the measure so the run fills the space it is given. The measure is the
44
+ * whole point of the component, so this is opt-in and not a prop a caller sets
45
+ * because the width looked wrong: a line longer than the measure is the defect
46
+ * this exists to remove.
47
+ */
48
+ fullWidth?: boolean;
49
+ /**
50
+ * Layout only, exactly as on every Component. Changing a Prism-owned visual
51
+ * property from here is prohibited.
52
+ */
53
+ className?: string;
54
+ };
55
+ /**
56
+ * A run of consumer-authored body copy, set at the measure.
57
+ *
58
+ * One job: hold authored prose to the reading measure and to the block rhythm,
59
+ * so a document does not have to restate either. Every NaniSoft site publishes
60
+ * long-form pages, and each one re-derived the same answer: a column that stops
61
+ * growing, paragraphs that are too far apart or too close, and a link that is
62
+ * either an unstyled word or an over-decorated one. This is that answer once.
63
+ *
64
+ * It is a Component rather than a Block because it owns no content at all: there
65
+ * is no string, no number and no data to pass, and what it holds is whatever the
66
+ * caller wrote. A Block is a section with content as props; this is the measure
67
+ * and nothing else.
68
+ *
69
+ * The treatments are child selectors rather than a wrapper per block, so the
70
+ * caller's own elements are the ones styled. That is what keeps the component
71
+ * markup-free: a consumer writing `<p>` and `<h2>` gets the system treatment, and
72
+ * a consumer writing Prism's own `Heading` and `Text` gets exactly the same
73
+ * result, because the two spellings converge on the same element.
74
+ *
75
+ * The measure is the emitted `--container-measure` token, read as
76
+ * `max-w-measure`, and the narrow measure a quotation wants is not offered here:
77
+ * a run set narrower than the reading measure is a caller decision about one
78
+ * element, and `className` is layout only.
79
+ *
80
+ * `text-pretty` is on the root rather than on the paragraphs, because Prism's
81
+ * type rule gives body copy `text-pretty` and putting it here means a caller's
82
+ * own `<p>` inherits it rather than needing a class of its own.
83
+ *
84
+ * It is a server Component: no hook, no context and no client code.
85
+ */
86
+ declare function Prose({ children, size, fullWidth, className, ...props }: ProseProps): import("react").JSX.Element;
87
+ export { Prose };
88
+ //# sourceMappingURL=prose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prose.d.ts","sourceRoot":"","sources":["../../../src/components/ui/prose.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItD;;;;;;;GAOG;AACH,QAAA,MAAM,WAAW;;;CAGP,CAAA;AAEV;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAA;AAEhD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/C;;;;OAIG;IACH,QAAQ,EAAE,SAAS,CAAA;IACnB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,iBAAS,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAa,EAAE,SAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BAkC7F;AAED,OAAO,EAAE,KAAK,EAAE,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils';
3
+ /**
4
+ * The size a run of prose is set at.
5
+ *
6
+ * Two, and closed: `base` is the reading size a document body is set at, and
7
+ * `lg` is the one step up a marketing page's supporting copy uses. A third step
8
+ * would be a decision about the type scale rather than about prose, and the type
9
+ * scale is `Text`'s.
10
+ */
11
+ const PROSE_SIZES = {
12
+ base: 'text-base',
13
+ lg: 'text-lg',
14
+ };
15
+ /**
16
+ * A run of consumer-authored body copy, set at the measure.
17
+ *
18
+ * One job: hold authored prose to the reading measure and to the block rhythm,
19
+ * so a document does not have to restate either. Every NaniSoft site publishes
20
+ * long-form pages, and each one re-derived the same answer: a column that stops
21
+ * growing, paragraphs that are too far apart or too close, and a link that is
22
+ * either an unstyled word or an over-decorated one. This is that answer once.
23
+ *
24
+ * It is a Component rather than a Block because it owns no content at all: there
25
+ * is no string, no number and no data to pass, and what it holds is whatever the
26
+ * caller wrote. A Block is a section with content as props; this is the measure
27
+ * and nothing else.
28
+ *
29
+ * The treatments are child selectors rather than a wrapper per block, so the
30
+ * caller's own elements are the ones styled. That is what keeps the component
31
+ * markup-free: a consumer writing `<p>` and `<h2>` gets the system treatment, and
32
+ * a consumer writing Prism's own `Heading` and `Text` gets exactly the same
33
+ * result, because the two spellings converge on the same element.
34
+ *
35
+ * The measure is the emitted `--container-measure` token, read as
36
+ * `max-w-measure`, and the narrow measure a quotation wants is not offered here:
37
+ * a run set narrower than the reading measure is a caller decision about one
38
+ * element, and `className` is layout only.
39
+ *
40
+ * `text-pretty` is on the root rather than on the paragraphs, because Prism's
41
+ * type rule gives body copy `text-pretty` and putting it here means a caller's
42
+ * own `<p>` inherits it rather than needing a class of its own.
43
+ *
44
+ * It is a server Component: no hook, no context and no client code.
45
+ */
46
+ function Prose({ children, size = 'base', fullWidth = false, className, ...props }) {
47
+ return (_jsx("div", { "data-slot": "prose", "data-size": size, className: cn('text-pretty flex flex-col gap-4 leading-relaxed', fullWidth ? 'max-w-none' : 'max-w-measure', PROSE_SIZES[size],
48
+ // The block treatments. Every child is styled by its own tag so a
49
+ // consumer's plain elements read as the system, and the gaps the flex
50
+ // column owns are the rhythm between blocks.
51
+ '[&_a]:text-foreground [&_a]:underline [&_a]:underline-offset-4 [&_a:hover]:underline', '[&_blockquote]:border-border [&_blockquote]:text-muted-foreground [&_blockquote]:border-l-2 [&_blockquote]:pl-4 [&_blockquote]:italic', '[&_code]:bg-muted [&_code]:text-muted-foreground [&_code]:rounded-sm [&_code]:px-1 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-xs', '[&_h1]:text-balance [&_h1]:text-3xl [&_h1]:font-semibold [&_h1]:tracking-tight', '[&_h2]:text-balance [&_h2]:mt-2 [&_h2]:text-2xl [&_h2]:font-semibold [&_h2]:tracking-tight', '[&_h3]:text-balance [&_h3]:mt-2 [&_h3]:text-xl [&_h3]:font-semibold [&_h3]:tracking-tight', '[&_h4]:text-balance [&_h4]:text-lg [&_h4]:font-semibold', '[&_hr]:bg-border [&_hr]:h-px [&_hr]:my-2', '[&_img]:rounded-lg', '[&_li]:leading-relaxed [&_ol]:list-decimal [&_ol]:pl-6 [&_ul]:list-disc [&_ul]:pl-6', '[&_p]:leading-relaxed', '[&_pre]:bg-muted [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:p-4 [&_pre]:font-mono [&_pre]:text-xs', '[&_pre_code]:bg-transparent [&_pre_code]:p-0', '[&_strong]:font-semibold', '[&_table]:w-full [&_td]:px-3 [&_td]:py-2 [&_td]:align-top [&_th]:px-3 [&_th]:py-2 [&_th]:text-left', className), ...props, children: children }));
52
+ }
53
+ export { Prose };
@@ -20,7 +20,30 @@ export declare function Section({ className, children, ...props }: React.Compone
20
20
  * placed, not about the block, which is why it is a prop and not a default.
21
21
  */
22
22
  export type HeadingLevel = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
23
- export declare function SectionHeading({ eyebrow, title, as: Heading, description, align, className, }: {
23
+ /**
24
+ * The heading a section opens with: an optional eyebrow, the title, an optional
25
+ * supporting line, and the level of the one heading it renders.
26
+ *
27
+ * `align` is the block's own decision about where the heading sits in the
28
+ * container. `center` is right for a band that is only a heading, and `left` is
29
+ * right for a section with content under it, where a centred title above a
30
+ * left-aligned list reads as two unrelated pieces.
31
+ */
32
+ export declare function SectionHeading({ index, eyebrow, title, as: Heading, description, align, className, }: {
33
+ /**
34
+ * A short ordinal for the section: "01", "02", "7". It is rendered in the mono
35
+ * face above the title, because a section's position in a sequence is machine
36
+ * notation rather than a word, and the mono stack is what this repository
37
+ * annotates machine-readable values with.
38
+ *
39
+ * It is a separate prop from `eyebrow` and not a default value of it, because
40
+ * the two say different things: an eyebrow is a word a reader reads, and an
41
+ * index is a number that is only meaningful beside the section it counts. All
42
+ * four NaniSoft sites render one of these above every section heading, and
43
+ * three of them render it beside a label rather than above a title, which is
44
+ * the same fact in a different arrangement.
45
+ */
46
+ index?: string;
24
47
  eyebrow?: ReactNode;
25
48
  title: ReactNode;
26
49
  description?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/components/ui/section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,+BAWjC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAElE,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,KAAK,EACL,EAAE,EAAE,OAAc,EAClB,WAAW,EACX,KAAgB,EAChB,SAAS,GACV,EAAE;IACD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;IAChB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;OAKG;IACH,EAAE,CAAC,EAAE,YAAY,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,+BAwBA"}
1
+ {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/components/ui/section.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,+BAWjC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAElE;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,KAAK,EACL,EAAE,EAAE,OAAc,EAClB,WAAW,EACX,KAAgB,EAChB,SAAS,GACV,EAAE;IACD;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;IAChB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;OAKG;IACH,EAAE,CAAC,EAAE,YAAY,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,+BA6BA"}
@@ -7,6 +7,15 @@ import { cn } from '../../lib/utils';
7
7
  export function Section({ className, children, ...props }) {
8
8
  return (_jsx("section", { className: cn('py-16 sm:py-24', className), ...props, children: _jsx("div", { className: "mx-auto w-full max-w-6xl px-6 lg:px-8", children: children }) }));
9
9
  }
10
- export function SectionHeading({ eyebrow, title, as: Heading = 'h2', description, align = 'center', className, }) {
11
- return (_jsxs("div", { className: cn('flex flex-col gap-4', align === 'center' ? 'items-center text-center' : 'items-start text-left', className), children: [eyebrow ? (_jsx("span", { className: "text-muted-foreground text-sm font-medium tracking-wide uppercase", children: eyebrow })) : null, _jsx(Heading, { className: "text-3xl font-semibold tracking-tight text-balance sm:text-4xl", children: title }), description ? (_jsx("p", { className: "text-muted-foreground max-w-2xl text-lg text-pretty", children: description })) : null] }));
10
+ /**
11
+ * The heading a section opens with: an optional eyebrow, the title, an optional
12
+ * supporting line, and the level of the one heading it renders.
13
+ *
14
+ * `align` is the block's own decision about where the heading sits in the
15
+ * container. `center` is right for a band that is only a heading, and `left` is
16
+ * right for a section with content under it, where a centred title above a
17
+ * left-aligned list reads as two unrelated pieces.
18
+ */
19
+ export function SectionHeading({ index, eyebrow, title, as: Heading = 'h2', description, align = 'center', className, }) {
20
+ return (_jsxs("div", { className: cn('flex flex-col gap-4', align === 'center' ? 'items-center text-center' : 'items-start text-left', className), children: [index ? (_jsx("span", { className: "text-muted-foreground font-mono text-xs font-normal tracking-normal", children: index })) : null, eyebrow ? (_jsx("span", { className: "text-muted-foreground text-sm font-medium tracking-wide uppercase", children: eyebrow })) : null, _jsx(Heading, { className: "text-3xl font-semibold tracking-tight text-balance sm:text-4xl", children: title }), description ? (_jsx("p", { className: "text-muted-foreground max-w-2xl text-lg text-pretty", children: description })) : null] }));
12
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/components/ui/slider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAI3C;;;;;GAKG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IAC3F,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gEAAgE;IAChE,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC;AAED;;;;;;;;GAQG;AACH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,GAAG,KAAK,EACT,EAAE,WAAW,+BA4Bb;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"slider.d.ts","sourceRoot":"","sources":["../../../src/components/ui/slider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAI3C;;;;;GAKG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC;IAC3F,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gEAAgE;IAChE,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC;AAED;;;;;;;;GAQG;AACH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,GAAG,KAAK,EACT,EAAE,WAAW,+BAiCb;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -12,6 +12,12 @@ import { cn } from '../../lib/utils';
12
12
  * Input of type number.
13
13
  */
14
14
  function Slider({ className, 'aria-label': ariaLabel, ...props }) {
15
- return (_jsx(SliderPrimitive.Root, { "data-slot": "slider", className: cn('relative flex w-full touch-none items-center select-none', 'data-[orientation=vertical]:h-full data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col', 'data-[disabled]:opacity-50', className), ...props, children: _jsxs(SliderPrimitive.Control, { className: "flex w-full items-center data-[orientation=vertical]:h-full data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", children: [_jsx(SliderPrimitive.Track, { className: "bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5", children: _jsx(SliderPrimitive.Indicator, { className: "bg-primary absolute rounded-full data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full" }) }), _jsx(SliderPrimitive.Thumb, { "aria-label": ariaLabel, className: cn('border-primary bg-background shadow-xs ring-ring/50 block size-4 shrink-0 rounded-full border outline-none', 'transition-[color,box-shadow] duration-fast ease-out', 'hover:ring-4 focus-visible:ring-4', 'data-[disabled]:pointer-events-none') })] }) }));
15
+ return (_jsx(SliderPrimitive.Root, { "data-slot": "slider", className: cn('relative flex w-full touch-none items-center select-none', 'data-[orientation=vertical]:h-full data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col', 'data-[disabled]:opacity-50', className), ...props, children: _jsxs(SliderPrimitive.Control, { className: "flex w-full items-center data-[orientation=vertical]:h-full data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", children: [_jsx(SliderPrimitive.Track, { className: "bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5", children: _jsx(SliderPrimitive.Indicator, { className: "bg-primary absolute rounded-full data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full" }) }), _jsx(SliderPrimitive.Thumb, { "aria-label": ariaLabel, className: cn(
16
+ // `ring-ring` at full strength, not shadcn's stock `ring-ring/50`. The alpha
17
+ // is applied here rather than in the token, so the contrast gate measures a
18
+ // compliant ring and never sees that half strength fails 3:1. This thumb is
19
+ // the element the JSDoc above says stays focusable, so it is the one
20
+ // indicator a keyboard user has. See the comment on the Button's base class.
21
+ 'border-primary bg-background shadow-xs ring-ring block size-4 shrink-0 rounded-full border outline-none', 'transition-[color,box-shadow] duration-fast ease-out', 'hover:ring-4 focus-visible:ring-4', 'data-[disabled]:pointer-events-none') })] }) }));
16
22
  }
17
23
  export { Slider };
package/dist/index.d.ts CHANGED
@@ -7,6 +7,8 @@
7
7
  * item import its own subpath instead.
8
8
  */
9
9
  export { Button } from './components/ui/button';
10
+ export { CtaLink } from './components/ui/cta-link';
11
+ export type { CtaLinkProps } from './components/ui/cta-link';
10
12
  export { Badge } from './components/ui/badge';
11
13
  export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, } from './components/ui/card';
12
14
  export { Section, SectionHeading } from './components/ui/section';
@@ -36,6 +38,16 @@ export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuIte
36
38
  export { Popover, PopoverTrigger, PopoverContent } from './components/ui/popover';
37
39
  export { Tabs, TabsList, TabsTrigger, TabsContent } from './components/ui/tabs';
38
40
  export { Avatar, AvatarImage, AvatarFallback } from './components/ui/avatar';
41
+ export { Diagram } from './components/ui/diagram';
42
+ export type { DiagramProps, DiagramNode, DiagramRelation } from './components/ui/diagram';
43
+ export { ProductMark } from './components/ui/product-mark';
44
+ export type { ProductMarkProps, ProductMarkSize } from './components/ui/product-mark';
45
+ export { Prose } from './components/ui/prose';
46
+ export type { ProseProps, ProseSize } from './components/ui/prose';
47
+ export { FactList } from './components/ui/fact-list';
48
+ export type { FactListProps, Fact } from './components/ui/fact-list';
49
+ export { ProductSwitcher } from './components/ui/product-switcher';
50
+ export type { ProductSwitcherProps, SwitcherProduct } from './components/ui/product-switcher';
39
51
  export { Hero01 } from './blocks/hero-01';
40
52
  export { FeatureGrid01 } from './blocks/feature-grid-01';
41
53
  export { Stats01 } from './blocks/stats-01';
@@ -46,10 +58,22 @@ export { DataTable01 } from './blocks/data-table-01';
46
58
  export { SettingsPanel01 } from './blocks/settings-panel-01';
47
59
  export { AuthForm01 } from './blocks/auth-form-01';
48
60
  export { AppShell01 } from './blocks/app-shell-01';
61
+ export { ProcessRail01 } from './blocks/process-rail-01';
62
+ export { StatusLedger01, STATUS_TIERS } from './blocks/status-ledger-01';
63
+ export type { StatusTier } from './blocks/status-ledger-01';
64
+ export { ProductGrid01 } from './blocks/product-grid-01';
65
+ export { StackGrid01 } from './blocks/stack-grid-01';
66
+ export { LogoStrip01 } from './blocks/logo-strip-01';
67
+ export { NoteGrid01 } from './blocks/note-grid-01';
68
+ export { InstrumentPanel01 } from './blocks/instrument-panel-01';
69
+ export { SiteHeader } from './blocks/site-header';
70
+ export { SiteFooter } from './blocks/site-footer';
49
71
  export { MarketingPage } from './pages/marketing-page';
50
72
  export { DashboardPage } from './pages/dashboard-page';
51
73
  export { SettingsPage } from './pages/settings-page';
52
74
  export { AuthPage } from './pages/auth-page';
75
+ export { NotFoundPage } from './pages/not-found-page';
76
+ export { BlogPostPage } from './pages/blog-post-page';
53
77
  export { PACKS, MODES, parseStoredTheme, themeAttributes } from './theming';
54
78
  export type { PackId, Mode } from './theming';
55
79
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@
7
7
  * item import its own subpath instead.
8
8
  */
9
9
  export { Button } from './components/ui/button';
10
+ export { CtaLink } from './components/ui/cta-link';
10
11
  export { Badge } from './components/ui/badge';
11
12
  export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, } from './components/ui/card';
12
13
  export { Section, SectionHeading } from './components/ui/section';
@@ -34,6 +35,11 @@ export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuIte
34
35
  export { Popover, PopoverTrigger, PopoverContent } from './components/ui/popover';
35
36
  export { Tabs, TabsList, TabsTrigger, TabsContent } from './components/ui/tabs';
36
37
  export { Avatar, AvatarImage, AvatarFallback } from './components/ui/avatar';
38
+ export { Diagram } from './components/ui/diagram';
39
+ export { ProductMark } from './components/ui/product-mark';
40
+ export { Prose } from './components/ui/prose';
41
+ export { FactList } from './components/ui/fact-list';
42
+ export { ProductSwitcher } from './components/ui/product-switcher';
37
43
  export { Hero01 } from './blocks/hero-01';
38
44
  export { FeatureGrid01 } from './blocks/feature-grid-01';
39
45
  export { Stats01 } from './blocks/stats-01';
@@ -44,8 +50,19 @@ export { DataTable01 } from './blocks/data-table-01';
44
50
  export { SettingsPanel01 } from './blocks/settings-panel-01';
45
51
  export { AuthForm01 } from './blocks/auth-form-01';
46
52
  export { AppShell01 } from './blocks/app-shell-01';
53
+ export { ProcessRail01 } from './blocks/process-rail-01';
54
+ export { StatusLedger01, STATUS_TIERS } from './blocks/status-ledger-01';
55
+ export { ProductGrid01 } from './blocks/product-grid-01';
56
+ export { StackGrid01 } from './blocks/stack-grid-01';
57
+ export { LogoStrip01 } from './blocks/logo-strip-01';
58
+ export { NoteGrid01 } from './blocks/note-grid-01';
59
+ export { InstrumentPanel01 } from './blocks/instrument-panel-01';
60
+ export { SiteHeader } from './blocks/site-header';
61
+ export { SiteFooter } from './blocks/site-footer';
47
62
  export { MarketingPage } from './pages/marketing-page';
48
63
  export { DashboardPage } from './pages/dashboard-page';
49
64
  export { SettingsPage } from './pages/settings-page';
50
65
  export { AuthPage } from './pages/auth-page';
66
+ export { NotFoundPage } from './pages/not-found-page';
67
+ export { BlogPostPage } from './pages/blog-post-page';
51
68
  export { PACKS, MODES, parseStoredTheme, themeAttributes } from './theming';