@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.
- package/LICENSE +21 -0
- package/README.md +81 -0
- package/THIRD-PARTY-NOTICES.md +48 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/blocks/app-shell-01/app-shell.d.ts +38 -0
- package/dist/blocks/app-shell-01/app-shell.d.ts.map +1 -0
- package/dist/blocks/app-shell-01/app-shell.js +27 -0
- package/dist/blocks/app-shell-01/index.d.ts +3 -0
- package/dist/blocks/app-shell-01/index.d.ts.map +1 -0
- package/dist/blocks/app-shell-01/index.js +1 -0
- package/dist/blocks/auth-form-01/auth-form.d.ts +52 -0
- package/dist/blocks/auth-form-01/auth-form.d.ts.map +1 -0
- package/dist/blocks/auth-form-01/auth-form.js +23 -0
- package/dist/blocks/auth-form-01/index.d.ts +3 -0
- package/dist/blocks/auth-form-01/index.d.ts.map +1 -0
- package/dist/blocks/auth-form-01/index.js +1 -0
- package/dist/blocks/cta-01/cta.d.ts +83 -0
- package/dist/blocks/cta-01/cta.d.ts.map +1 -0
- package/dist/blocks/cta-01/cta.js +29 -0
- package/dist/blocks/cta-01/index.d.ts +3 -0
- package/dist/blocks/cta-01/index.d.ts.map +1 -0
- package/dist/blocks/cta-01/index.js +1 -0
- package/dist/blocks/data-table-01/data-table.d.ts +102 -0
- package/dist/blocks/data-table-01/data-table.d.ts.map +1 -0
- package/dist/blocks/data-table-01/data-table.js +116 -0
- package/dist/blocks/data-table-01/index.d.ts +3 -0
- package/dist/blocks/data-table-01/index.d.ts.map +1 -0
- package/dist/blocks/data-table-01/index.js +1 -0
- package/dist/blocks/feature-grid-01/feature-grid.d.ts +78 -0
- package/dist/blocks/feature-grid-01/feature-grid.d.ts.map +1 -0
- package/dist/blocks/feature-grid-01/feature-grid.js +24 -0
- package/dist/blocks/feature-grid-01/index.d.ts +3 -0
- package/dist/blocks/feature-grid-01/index.d.ts.map +1 -0
- package/dist/blocks/feature-grid-01/index.js +1 -0
- package/dist/blocks/hero-01/hero.d.ts +59 -0
- package/dist/blocks/hero-01/hero.d.ts.map +1 -0
- package/dist/blocks/hero-01/hero.js +24 -0
- package/dist/blocks/hero-01/index.d.ts +2 -0
- package/dist/blocks/hero-01/index.d.ts.map +1 -0
- package/dist/blocks/hero-01/index.js +1 -0
- package/dist/blocks/index.d.ts +28 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +26 -0
- package/dist/blocks/instrument-panel-01/index.d.ts +3 -0
- package/dist/blocks/instrument-panel-01/index.d.ts.map +1 -0
- package/dist/blocks/instrument-panel-01/index.js +1 -0
- package/dist/blocks/instrument-panel-01/instrument-panel.d.ts +114 -0
- package/dist/blocks/instrument-panel-01/instrument-panel.d.ts.map +1 -0
- package/dist/blocks/instrument-panel-01/instrument-panel.js +64 -0
- package/dist/blocks/logo-strip-01/index.d.ts +3 -0
- package/dist/blocks/logo-strip-01/index.d.ts.map +1 -0
- package/dist/blocks/logo-strip-01/index.js +1 -0
- package/dist/blocks/logo-strip-01/logo-strip.d.ts +84 -0
- package/dist/blocks/logo-strip-01/logo-strip.d.ts.map +1 -0
- package/dist/blocks/logo-strip-01/logo-strip.js +40 -0
- package/dist/blocks/note-grid-01/index.d.ts +3 -0
- package/dist/blocks/note-grid-01/index.d.ts.map +1 -0
- package/dist/blocks/note-grid-01/index.js +1 -0
- package/dist/blocks/note-grid-01/note-grid.d.ts +79 -0
- package/dist/blocks/note-grid-01/note-grid.d.ts.map +1 -0
- package/dist/blocks/note-grid-01/note-grid.js +37 -0
- package/dist/blocks/page-header-01/index.d.ts +3 -0
- package/dist/blocks/page-header-01/index.d.ts.map +1 -0
- package/dist/blocks/page-header-01/index.js +1 -0
- package/dist/blocks/page-header-01/page-header.d.ts +48 -0
- package/dist/blocks/page-header-01/page-header.d.ts.map +1 -0
- package/dist/blocks/page-header-01/page-header.js +27 -0
- package/dist/blocks/pricing-01/index.d.ts +2 -0
- package/dist/blocks/pricing-01/index.d.ts.map +1 -0
- package/dist/blocks/pricing-01/index.js +1 -0
- package/dist/blocks/pricing-01/pricing.d.ts +35 -0
- package/dist/blocks/pricing-01/pricing.d.ts.map +1 -0
- package/dist/blocks/pricing-01/pricing.js +20 -0
- package/dist/blocks/process-rail-01/index.d.ts +3 -0
- package/dist/blocks/process-rail-01/index.d.ts.map +1 -0
- package/dist/blocks/process-rail-01/index.js +1 -0
- package/dist/blocks/process-rail-01/process-rail.d.ts +99 -0
- package/dist/blocks/process-rail-01/process-rail.d.ts.map +1 -0
- package/dist/blocks/process-rail-01/process-rail.js +58 -0
- package/dist/blocks/product-grid-01/index.d.ts +3 -0
- package/dist/blocks/product-grid-01/index.d.ts.map +1 -0
- package/dist/blocks/product-grid-01/index.js +1 -0
- package/dist/blocks/product-grid-01/product-grid.d.ts +114 -0
- package/dist/blocks/product-grid-01/product-grid.d.ts.map +1 -0
- package/dist/blocks/product-grid-01/product-grid.js +51 -0
- package/dist/blocks/settings-panel-01/index.d.ts +3 -0
- package/dist/blocks/settings-panel-01/index.d.ts.map +1 -0
- package/dist/blocks/settings-panel-01/index.js +1 -0
- package/dist/blocks/settings-panel-01/settings-panel.d.ts +71 -0
- package/dist/blocks/settings-panel-01/settings-panel.d.ts.map +1 -0
- package/dist/blocks/settings-panel-01/settings-panel.js +38 -0
- package/dist/blocks/site-footer/index.d.ts +3 -0
- package/dist/blocks/site-footer/index.d.ts.map +1 -0
- package/dist/blocks/site-footer/index.js +1 -0
- package/dist/blocks/site-footer/site-footer.d.ts +135 -0
- package/dist/blocks/site-footer/site-footer.d.ts.map +1 -0
- package/dist/blocks/site-footer/site-footer.js +41 -0
- package/dist/blocks/site-header/index.d.ts +3 -0
- package/dist/blocks/site-header/index.d.ts.map +1 -0
- package/dist/blocks/site-header/index.js +1 -0
- package/dist/blocks/site-header/site-header.d.ts +142 -0
- package/dist/blocks/site-header/site-header.d.ts.map +1 -0
- package/dist/blocks/site-header/site-header.js +46 -0
- package/dist/blocks/stack-grid-01/index.d.ts +3 -0
- package/dist/blocks/stack-grid-01/index.d.ts.map +1 -0
- package/dist/blocks/stack-grid-01/index.js +1 -0
- package/dist/blocks/stack-grid-01/stack-grid.d.ts +118 -0
- package/dist/blocks/stack-grid-01/stack-grid.d.ts.map +1 -0
- package/dist/blocks/stack-grid-01/stack-grid.js +49 -0
- package/dist/blocks/stats-01/index.d.ts +2 -0
- package/dist/blocks/stats-01/index.d.ts.map +1 -0
- package/dist/blocks/stats-01/index.js +1 -0
- package/dist/blocks/stats-01/stats.d.ts +28 -0
- package/dist/blocks/stats-01/stats.d.ts.map +1 -0
- package/dist/blocks/stats-01/stats.js +27 -0
- package/dist/blocks/status-ledger-01/index.d.ts +3 -0
- package/dist/blocks/status-ledger-01/index.d.ts.map +1 -0
- package/dist/blocks/status-ledger-01/index.js +1 -0
- package/dist/blocks/status-ledger-01/status-ledger.d.ts +131 -0
- package/dist/blocks/status-ledger-01/status-ledger.d.ts.map +1 -0
- package/dist/blocks/status-ledger-01/status-ledger.js +80 -0
- package/dist/catalog.d.ts +28 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +672 -0
- package/dist/components/index.d.ts +64 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +43 -0
- package/dist/components/ui/accordion.d.ts +65 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +30 -0
- package/dist/components/ui/alert.d.ts +19 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/alert.js +31 -0
- package/dist/components/ui/avatar.d.ts +47 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +30 -0
- package/dist/components/ui/badge.d.ts +14 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +26 -0
- package/dist/components/ui/breadcrumb.d.ts +35 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +48 -0
- package/dist/components/ui/button.d.ts +16 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +63 -0
- package/dist/components/ui/card.d.ts +41 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +53 -0
- package/dist/components/ui/checkbox.d.ts +43 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +18 -0
- package/dist/components/ui/cta-link.d.ts +45 -0
- package/dist/components/ui/cta-link.d.ts.map +1 -0
- package/dist/components/ui/cta-link.js +81 -0
- package/dist/components/ui/diagram.d.ts +154 -0
- package/dist/components/ui/diagram.d.ts.map +1 -0
- package/dist/components/ui/diagram.js +150 -0
- package/dist/components/ui/dialog.d.ts +81 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +60 -0
- package/dist/components/ui/dropdown-menu.d.ts +189 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +67 -0
- package/dist/components/ui/fact-list.d.ts +90 -0
- package/dist/components/ui/fact-list.d.ts.map +1 -0
- package/dist/components/ui/fact-list.js +38 -0
- package/dist/components/ui/field.d.ts +36 -0
- package/dist/components/ui/field.d.ts.map +1 -0
- package/dist/components/ui/field.js +46 -0
- package/dist/components/ui/input.d.ts +12 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +14 -0
- package/dist/components/ui/kbd.d.ts +10 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +12 -0
- package/dist/components/ui/pagination.d.ts +40 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination.js +49 -0
- package/dist/components/ui/popover.d.ts +56 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +25 -0
- package/dist/components/ui/product-mark.d.ts +115 -0
- package/dist/components/ui/product-mark.d.ts.map +1 -0
- package/dist/components/ui/product-mark.js +82 -0
- package/dist/components/ui/product-switcher.d.ts +108 -0
- package/dist/components/ui/product-switcher.d.ts.map +1 -0
- package/dist/components/ui/product-switcher.js +47 -0
- package/dist/components/ui/progress.d.ts +38 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/progress.js +17 -0
- package/dist/components/ui/prose.d.ts +88 -0
- package/dist/components/ui/prose.d.ts.map +1 -0
- package/dist/components/ui/prose.js +53 -0
- package/dist/components/ui/radio-group.d.ts +66 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/radio-group.js +30 -0
- package/dist/components/ui/section.d.ts +60 -0
- package/dist/components/ui/section.d.ts.map +1 -0
- package/dist/components/ui/section.js +21 -0
- package/dist/components/ui/select.d.ts +124 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +47 -0
- package/dist/components/ui/separator.d.ts +16 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +15 -0
- package/dist/components/ui/skeleton.d.ts +12 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +14 -0
- package/dist/components/ui/slider.d.ts +43 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/slider.js +23 -0
- package/dist/components/ui/switch.d.ts +42 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +16 -0
- package/dist/components/ui/table.d.ts +27 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +43 -0
- package/dist/components/ui/tabs.d.ts +66 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +29 -0
- package/dist/components/ui/textarea.d.ts +11 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +13 -0
- package/dist/components/ui/tooltip.d.ts +63 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +25 -0
- package/dist/components/ui/typography.d.ts +32 -0
- package/dist/components/ui/typography.d.ts.map +1 -0
- package/dist/components/ui/typography.js +51 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +5 -0
- package/dist/pages/auth-page/index.d.ts +36 -0
- package/dist/pages/auth-page/index.d.ts.map +1 -0
- package/dist/pages/auth-page/index.js +23 -0
- package/dist/pages/blog-post-page/index.d.ts +174 -0
- package/dist/pages/blog-post-page/index.d.ts.map +1 -0
- package/dist/pages/blog-post-page/index.js +49 -0
- package/dist/pages/dashboard-page/index.d.ts +36 -0
- package/dist/pages/dashboard-page/index.d.ts.map +1 -0
- package/dist/pages/dashboard-page/index.js +24 -0
- package/dist/pages/index.d.ts +21 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +14 -0
- package/dist/pages/marketing-page/index.d.ts +43 -0
- package/dist/pages/marketing-page/index.d.ts.map +1 -0
- package/dist/pages/marketing-page/index.js +25 -0
- package/dist/pages/not-found-page/index.d.ts +112 -0
- package/dist/pages/not-found-page/index.d.ts.map +1 -0
- package/dist/pages/not-found-page/index.js +46 -0
- package/dist/pages/settings-page/index.d.ts +47 -0
- package/dist/pages/settings-page/index.d.ts.map +1 -0
- package/dist/pages/settings-page/index.js +24 -0
- package/dist/provider/index.d.ts +12 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +9 -0
- package/dist/provider/provider.d.ts +42 -0
- package/dist/provider/provider.d.ts.map +1 -0
- package/dist/provider/provider.js +178 -0
- package/dist/provider/theme-script.d.ts +55 -0
- package/dist/provider/theme-script.d.ts.map +1 -0
- package/dist/provider/theme-script.js +79 -0
- package/dist/styles.css +2894 -0
- package/dist/theming/index.d.ts +173 -0
- package/dist/theming/index.d.ts.map +1 -0
- package/dist/theming/index.js +186 -0
- package/package.json +89 -18
- package/components.json +0 -21
- package/public/r/badge.json +0 -26
- package/public/r/button.json +0 -26
- package/public/r/card.json +0 -25
- package/public/r/cta-01.json +0 -44
- package/public/r/feature-grid-01.json +0 -44
- package/public/r/hero-01.json +0 -44
- package/public/r/pricing-01.json +0 -46
- package/public/r/registry.json +0 -294
- package/public/r/section.json +0 -25
- package/public/r/stats-01.json +0 -44
- package/registry.json +0 -294
- package/src/components/ds/blocks/cta-01/block.json +0 -8
- package/src/components/ds/blocks/cta-01/cta.tsx +0 -62
- package/src/components/ds/blocks/cta-01/index.tsx +0 -1
- package/src/components/ds/blocks/feature-grid-01/block.json +0 -8
- package/src/components/ds/blocks/feature-grid-01/feature-grid.tsx +0 -69
- package/src/components/ds/blocks/feature-grid-01/index.tsx +0 -1
- package/src/components/ds/blocks/hero-01/block.json +0 -8
- package/src/components/ds/blocks/hero-01/hero.tsx +0 -85
- package/src/components/ds/blocks/hero-01/index.tsx +0 -1
- package/src/components/ds/blocks/pricing-01/block.json +0 -8
- package/src/components/ds/blocks/pricing-01/index.tsx +0 -1
- package/src/components/ds/blocks/pricing-01/pricing.tsx +0 -122
- package/src/components/ds/blocks/section.meta.json +0 -6
- package/src/components/ds/blocks/section.tsx +0 -86
- package/src/components/ds/blocks/stats-01/block.json +0 -8
- package/src/components/ds/blocks/stats-01/index.tsx +0 -1
- package/src/components/ds/blocks/stats-01/stats.tsx +0 -92
- package/src/components/ui/badge.tsx +0 -37
- package/src/components/ui/button.tsx +0 -77
- package/src/components/ui/card.tsx +0 -65
- package/src/lib/utils.ts +0 -6
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { type HeadingLevel } from '../../components/ui/section';
|
|
2
|
+
/**
|
|
3
|
+
* One part a product is assembled from: its name and the role it plays.
|
|
4
|
+
*
|
|
5
|
+
* Both are required, and a part with no role is a logo and a part with no name
|
|
6
|
+
* is a role. A survey grid is a claim that a set of parts is sufficient, and both
|
|
7
|
+
* halves of that claim are the caller's to make.
|
|
8
|
+
*/
|
|
9
|
+
export type StackPart = {
|
|
10
|
+
/** The part's own name, as its authors spell it. */
|
|
11
|
+
name: string;
|
|
12
|
+
/**
|
|
13
|
+
* One phrase about what the part does here. It is a role rather than a
|
|
14
|
+
* description: the grid is a survey of what a product is built from, not a
|
|
15
|
+
* feature list, and a role that runs to a sentence turns a survey into prose.
|
|
16
|
+
*/
|
|
17
|
+
role: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* One thing a product built itself, rather than assembled: its name and one line
|
|
21
|
+
* about it.
|
|
22
|
+
*
|
|
23
|
+
* The two are required for the same reason `StackPart`'s are, and for one more:
|
|
24
|
+
* a grid of in-house work beside a grid of assembled parts is a claim that the
|
|
25
|
+
* work was NaniSoft's own, and that claim needs a name and a line under it to be
|
|
26
|
+
* a claim a reader can check.
|
|
27
|
+
*/
|
|
28
|
+
export type StackOwn = {
|
|
29
|
+
/** The component's own name. */
|
|
30
|
+
name: string;
|
|
31
|
+
/** One line about what it does and why it is not assembled. */
|
|
32
|
+
blurb: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* The props a StackGrid01 takes.
|
|
36
|
+
*
|
|
37
|
+
* Every string is a prop and the Block ships none: no part, no role, no blurb
|
|
38
|
+
* and no default "built in-house" mark. A grid that hardcoded a part list would
|
|
39
|
+
* hand every consumer a survey of somebody else's stack.
|
|
40
|
+
*/
|
|
41
|
+
export type StackGrid01Props = {
|
|
42
|
+
/** Optional label above the section title. See the No-Default-Eyebrow Rule. */
|
|
43
|
+
eyebrow?: string;
|
|
44
|
+
/** The section title. Omit it for a grid composed under its own heading. */
|
|
45
|
+
title?: string;
|
|
46
|
+
/** One or two sentences under the title. */
|
|
47
|
+
description?: string;
|
|
48
|
+
/**
|
|
49
|
+
* The parts the product is assembled from, in the order a reader should meet
|
|
50
|
+
* them. Order is the caller's because it is a claim about which part matters
|
|
51
|
+
* first.
|
|
52
|
+
*/
|
|
53
|
+
parts: readonly StackPart[];
|
|
54
|
+
/**
|
|
55
|
+
* The things the product built itself, in the order a reader should meet them.
|
|
56
|
+
* Omit it for a product that assembled everything, and pass it when the claim
|
|
57
|
+
* is that some of the work is its own.
|
|
58
|
+
*/
|
|
59
|
+
own?: readonly StackOwn[];
|
|
60
|
+
/**
|
|
61
|
+
* The label on the in-house group, which is the claim the group makes. Omit it
|
|
62
|
+
* when the group is titled by the section itself, and pass a word you mean:
|
|
63
|
+
* "built in-house", "built by Nanisoft" and "our own" are three different
|
|
64
|
+
* claims and the Block does not choose between them.
|
|
65
|
+
*/
|
|
66
|
+
ownLabel?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The line under the grid, for the sentence that qualifies it: what is not
|
|
69
|
+
* here, or where to read the full list.
|
|
70
|
+
*/
|
|
71
|
+
caption?: string;
|
|
72
|
+
/** Heading level for the section title. See `HeadingLevel`. */
|
|
73
|
+
headingLevel?: HeadingLevel;
|
|
74
|
+
/**
|
|
75
|
+
* Layout only, exactly as on every Component. Changing a Prism-owned visual
|
|
76
|
+
* property from here is prohibited.
|
|
77
|
+
*/
|
|
78
|
+
className?: string;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* A survey of what a product is assembled from, and what it built itself.
|
|
82
|
+
*
|
|
83
|
+
* Three of the four NaniSoft sites publish this section, and each one drew it by
|
|
84
|
+
* hand with the same two groups: a survey grid of composed parts, each a name
|
|
85
|
+
* and a role, and below it a second grid of the components the product wrote
|
|
86
|
+
* itself, each a name and a line about it. Three of them also drew the second
|
|
87
|
+
* group differently from the first - a dashed border, a different tile, a mark
|
|
88
|
+
* above the name - because the visual difference is the claim: *this part is
|
|
89
|
+
* ours*.
|
|
90
|
+
*
|
|
91
|
+
* That is what the `own` group is here. It is a separate prop and a separate
|
|
92
|
+
* grid rather than a flag on the part, because the difference is a claim about
|
|
93
|
+
* provenance and a claim is not a property of a row: a part that is assembled and
|
|
94
|
+
* a part that is built are the same kind of thing with a different answer to "who
|
|
95
|
+
* wrote it", and putting the answer in the row would make the two groups
|
|
96
|
+
* indistinguishable in the data as well as on screen.
|
|
97
|
+
*
|
|
98
|
+
* The two groups differ in weight rather than in colour. The composed parts are
|
|
99
|
+
* tiles on the muted surface; the in-house parts sit on the page with a
|
|
100
|
+
* `border-primary` hairline, which is the one place in this system where a border
|
|
101
|
+
* carries a pack's hue and it is paired with `shadow-md` because it is the one
|
|
102
|
+
* element that means *lifted*. No step in either group is a pastel fill: a pastel
|
|
103
|
+
* is a fill for a large area and never a signal, and a tile of pastel behind one
|
|
104
|
+
* word is a signal a reader has to learn.
|
|
105
|
+
*
|
|
106
|
+
* `ownLabel` is required when `own` is passed, because the group is a claim and
|
|
107
|
+
* the claim is the caller's words. Three of the four sites write three different
|
|
108
|
+
* ones, and the Block does not choose.
|
|
109
|
+
*
|
|
110
|
+
* A tile carries a name and a role and nothing else. A part whose role needs two
|
|
111
|
+
* lines belongs in the section's `description`, where it applies to the group
|
|
112
|
+
* rather than to one tile.
|
|
113
|
+
*
|
|
114
|
+
* It is a server Component: no hook, no state and no client code.
|
|
115
|
+
*/
|
|
116
|
+
export declare function StackGrid01({ eyebrow, title, description, parts, own, ownLabel, caption, headingLevel, className, }: StackGrid01Props): import("react").JSX.Element;
|
|
117
|
+
export default StackGrid01;
|
|
118
|
+
//# sourceMappingURL=stack-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-grid.d.ts","sourceRoot":"","sources":["../../../src/blocks/stack-grid-01/stack-grid.tsx"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;IAC3B;;;;OAIG;IACH,GAAG,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,WAAW,EACX,KAAK,EACL,GAAG,EACH,QAAQ,EACR,OAAO,EACP,YAAmB,EACnB,SAAS,GACV,EAAE,gBAAgB,+BA4DlB;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card';
|
|
3
|
+
import { Section, SectionHeading } from '../../components/ui/section';
|
|
4
|
+
import { cn } from '../../lib/utils';
|
|
5
|
+
/**
|
|
6
|
+
* A survey of what a product is assembled from, and what it built itself.
|
|
7
|
+
*
|
|
8
|
+
* Three of the four NaniSoft sites publish this section, and each one drew it by
|
|
9
|
+
* hand with the same two groups: a survey grid of composed parts, each a name
|
|
10
|
+
* and a role, and below it a second grid of the components the product wrote
|
|
11
|
+
* itself, each a name and a line about it. Three of them also drew the second
|
|
12
|
+
* group differently from the first - a dashed border, a different tile, a mark
|
|
13
|
+
* above the name - because the visual difference is the claim: *this part is
|
|
14
|
+
* ours*.
|
|
15
|
+
*
|
|
16
|
+
* That is what the `own` group is here. It is a separate prop and a separate
|
|
17
|
+
* grid rather than a flag on the part, because the difference is a claim about
|
|
18
|
+
* provenance and a claim is not a property of a row: a part that is assembled and
|
|
19
|
+
* a part that is built are the same kind of thing with a different answer to "who
|
|
20
|
+
* wrote it", and putting the answer in the row would make the two groups
|
|
21
|
+
* indistinguishable in the data as well as on screen.
|
|
22
|
+
*
|
|
23
|
+
* The two groups differ in weight rather than in colour. The composed parts are
|
|
24
|
+
* tiles on the muted surface; the in-house parts sit on the page with a
|
|
25
|
+
* `border-primary` hairline, which is the one place in this system where a border
|
|
26
|
+
* carries a pack's hue and it is paired with `shadow-md` because it is the one
|
|
27
|
+
* element that means *lifted*. No step in either group is a pastel fill: a pastel
|
|
28
|
+
* is a fill for a large area and never a signal, and a tile of pastel behind one
|
|
29
|
+
* word is a signal a reader has to learn.
|
|
30
|
+
*
|
|
31
|
+
* `ownLabel` is required when `own` is passed, because the group is a claim and
|
|
32
|
+
* the claim is the caller's words. Three of the four sites write three different
|
|
33
|
+
* ones, and the Block does not choose.
|
|
34
|
+
*
|
|
35
|
+
* A tile carries a name and a role and nothing else. A part whose role needs two
|
|
36
|
+
* lines belongs in the section's `description`, where it applies to the group
|
|
37
|
+
* rather than to one tile.
|
|
38
|
+
*
|
|
39
|
+
* It is a server Component: no hook, no state and no client code.
|
|
40
|
+
*/
|
|
41
|
+
export function StackGrid01({ eyebrow, title, description, parts, own, ownLabel, caption, headingLevel = 'h2', className, }) {
|
|
42
|
+
if (own !== undefined && own.length > 0 && !ownLabel) {
|
|
43
|
+
throw new Error('StackGrid01: the in-house group was passed with no ownLabel, so the grid would make the claim ' +
|
|
44
|
+
'"this part is ours" in a shape and leave the words to a reader to infer. Pass the words you mean, ' +
|
|
45
|
+
'or omit the group.');
|
|
46
|
+
}
|
|
47
|
+
return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsxs("div", { "data-slot": "stack-grid", className: cn('flex flex-col gap-10', className), children: [_jsx("ul", { className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4", children: parts.map((part) => (_jsx("li", { children: _jsxs(Card, { className: "bg-muted h-full gap-2 py-4", children: [_jsx(CardHeader, { className: "gap-1", children: _jsx(CardTitle, { className: "text-sm", children: part.name }) }), _jsx(CardContent, { children: _jsx("p", { className: "text-muted-foreground text-pretty text-xs", children: part.role }) })] }) }, part.name))) }), own && own.length > 0 ? (_jsx("ul", { "data-slot": "stack-grid-own", className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4", children: own.map((entry) => (_jsx("li", { children: _jsxs(Card, { className: "border-primary shadow-md h-full gap-2 py-4", children: [_jsxs(CardHeader, { className: "gap-1", children: [_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: ownLabel }), _jsx(CardTitle, { className: "text-sm", children: entry.name })] }), _jsx(CardContent, { children: _jsx("p", { className: "text-muted-foreground text-pretty text-xs", children: entry.blurb }) })] }) }, entry.name))) })) : null] }), caption ? _jsx("p", { className: "text-muted-foreground mt-6 text-pretty text-sm", children: caption }) : null] }));
|
|
48
|
+
}
|
|
49
|
+
export default StackGrid01;
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/status-ledger-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACvE,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { StatusLedger01, STATUS_TIERS, default } from './status-ledger';
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { type HeadingLevel } from '../../components/ui/section';
|
|
2
|
+
/**
|
|
3
|
+
* The four tiers a StatusLedger01 row can be in.
|
|
4
|
+
*
|
|
5
|
+
* Four, and the fifth is refused deliberately. All four NaniSoft sites publish a
|
|
6
|
+
* ledger of the same kind - what a product can do today, what is designed, what
|
|
7
|
+
* is planned, and what is only a direction - and between them they use eight
|
|
8
|
+
* different words for those four states: `live`, `available` and `complete` all
|
|
9
|
+
* mean the same thing; `approved`, `specified` and `designed` all mean the next
|
|
10
|
+
* one; `planned` means the one after; and `direction` means a research direction
|
|
11
|
+
* that is explicitly not a capability. Eight words for four states is four tiers
|
|
12
|
+
* with a per-product vocabulary, and the vocabulary belongs in the row's
|
|
13
|
+
* `statusLabel`, not in the type.
|
|
14
|
+
*
|
|
15
|
+
* A fifth tier would be the one that splits a state that does not need splitting -
|
|
16
|
+
* `deprecated` over `retired`, or a `live` that is not `complete`. Each such tier
|
|
17
|
+
* is a colour a reader must learn and a word a maintainer must keep true, and a
|
|
18
|
+
* ladder with more rungs than states is how a status column stops being readable.
|
|
19
|
+
* The four below are the states; the words are the caller's.
|
|
20
|
+
*/
|
|
21
|
+
export declare const STATUS_TIERS: readonly ["live", "designed", "planned", "direction"];
|
|
22
|
+
/**
|
|
23
|
+
* One of the four tiers a StatusLedger01 row is in.
|
|
24
|
+
*/
|
|
25
|
+
export type StatusTier = (typeof STATUS_TIERS)[number];
|
|
26
|
+
/**
|
|
27
|
+
* One row of the ledger: a thing, the state it is in, the words for that state,
|
|
28
|
+
* and an optional list of what it does.
|
|
29
|
+
*
|
|
30
|
+
* `statusLabel` is required and separate from `status` because the tier is a
|
|
31
|
+
* colour and the words are a claim. A consumer that passed the tier alone would
|
|
32
|
+
* ship four identical-looking rows to a reader who cannot see colour at all, and
|
|
33
|
+
* a consumer that passed only the words would have no tier to draw.
|
|
34
|
+
*/
|
|
35
|
+
export type StatusRow = {
|
|
36
|
+
/**
|
|
37
|
+
* The name of the thing: a use case, a capability, a stage, a direction. It is
|
|
38
|
+
* the anchor of the row, so it is the first thing a reader reads.
|
|
39
|
+
*/
|
|
40
|
+
name: string;
|
|
41
|
+
/**
|
|
42
|
+
* Which of the four tiers the thing is in. This is what the dot is drawn from;
|
|
43
|
+
* it is not the text a reader sees. See `STATUS_TIERS`.
|
|
44
|
+
*/
|
|
45
|
+
status: StatusTier;
|
|
46
|
+
/**
|
|
47
|
+
* The words for the tier, in the product's own vocabulary. Required, and
|
|
48
|
+
* deliberately not derived from `status`: a site that says "Flagship -
|
|
49
|
+
* available today" and a site that says "Live" are both describing the same
|
|
50
|
+
* tier, and neither word is Prism's to choose.
|
|
51
|
+
*/
|
|
52
|
+
statusLabel: string;
|
|
53
|
+
/**
|
|
54
|
+
* The detail line under the name, when the row needs one sentence about what
|
|
55
|
+
* the thing does.
|
|
56
|
+
*/
|
|
57
|
+
detail?: string;
|
|
58
|
+
/**
|
|
59
|
+
* The bullets the row lists, when the row needs more than one line. A list
|
|
60
|
+
* rather than a paragraph, because a row that lists four things and describes
|
|
61
|
+
* them in prose is a paragraph with a bullet glyph.
|
|
62
|
+
*/
|
|
63
|
+
bullets?: readonly string[];
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* The props a StatusLedger01 takes.
|
|
67
|
+
*
|
|
68
|
+
* Every string is a prop and the Block ships none: no status word, no tier, no
|
|
69
|
+
* row and no bullet. A ledger that hardcoded "available" would make every
|
|
70
|
+
* consumer publish a claim about their own roadmap that they may not be able to
|
|
71
|
+
* keep.
|
|
72
|
+
*/
|
|
73
|
+
export type StatusLedger01Props = {
|
|
74
|
+
/** Optional label above the section title. See the No-Default-Eyebrow Rule. */
|
|
75
|
+
eyebrow?: string;
|
|
76
|
+
/** The section title. Omit it for a ledger composed under its own heading. */
|
|
77
|
+
title?: string;
|
|
78
|
+
/** One or two sentences under the title. */
|
|
79
|
+
description?: string;
|
|
80
|
+
/**
|
|
81
|
+
* The rows, in the order a reader should meet them. Order is the caller's
|
|
82
|
+
* because it is a claim about what matters first, and a ledger that sorted
|
|
83
|
+
* itself would be making that claim on the caller's behalf.
|
|
84
|
+
*/
|
|
85
|
+
rows: readonly StatusRow[];
|
|
86
|
+
/**
|
|
87
|
+
* The line under the ledger, for the sentence that qualifies it: what is not
|
|
88
|
+
* here, or where to read more.
|
|
89
|
+
*/
|
|
90
|
+
caption?: string;
|
|
91
|
+
/** Heading level for the section title. See `HeadingLevel`. */
|
|
92
|
+
headingLevel?: HeadingLevel;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* A ledger of things and the state each is in: a hairline row per entry, a mark
|
|
96
|
+
* for the tier, and the words for the state beside the name.
|
|
97
|
+
*
|
|
98
|
+
* All four NaniSoft sites publish this section, and three of them publish it as a
|
|
99
|
+
* ledger of rows while the fourth publishes the same shape as a list of products;
|
|
100
|
+
* the ledger appears twice in the fourth site as well, once for use cases and
|
|
101
|
+
* once for research directions. Five ledgers across four sites, each one written
|
|
102
|
+
* by hand, each one re-deciding the same four things: which tier words to use,
|
|
103
|
+
* how the tier is drawn, whether the tier is announced, and whether the row
|
|
104
|
+
* carries a detail line or a bullet list.
|
|
105
|
+
*
|
|
106
|
+
* **The tier is four and the words are the caller's.** The `status` prop takes
|
|
107
|
+
* one of four tiers and the `statusLabel` prop takes the words. That split is the
|
|
108
|
+
* whole design: the tier is a colour, and colour is not information a reader can
|
|
109
|
+
* act on; the words are the information, and the words belong to the product. A
|
|
110
|
+
* Block that rendered the tier's own name would force one vocabulary on five
|
|
111
|
+
* products that between them already use eight, and a Block that took only the
|
|
112
|
+
* words would have nothing to draw.
|
|
113
|
+
*
|
|
114
|
+
* The mark is a ring around a fill rather than a filled dot, which is the
|
|
115
|
+
* contested shape this Block ships and the reason is a measurement: a filled
|
|
116
|
+
* pastel dot fails contrast against a light card, and a dot that fails contrast
|
|
117
|
+
* is a dot that does not exist for the reader it was meant to reassure. The ring
|
|
118
|
+
* is in the brand ink, the fill is the tier's own semantic token, and the whole
|
|
119
|
+
* mark is `aria-hidden`, so the row's `statusLabel` is the state a screen reader
|
|
120
|
+
* hears and a reader who cannot see the dot at all still gets the same fact.
|
|
121
|
+
*
|
|
122
|
+
* A row is a `li` inside an `ol`, so the ledger is a list in the document's
|
|
123
|
+
* outline rather than a grid of divs, and the detail line and the bullet list are
|
|
124
|
+
* the two shapes a row takes. A row with neither is a name and a state and is a
|
|
125
|
+
* valid row: most ledgers are mostly those.
|
|
126
|
+
*
|
|
127
|
+
* It is a server Component: no hook, no state, no client code and no router.
|
|
128
|
+
*/
|
|
129
|
+
export declare function StatusLedger01({ eyebrow, title, description, rows, caption, headingLevel, }: StatusLedger01Props): import("react").JSX.Element;
|
|
130
|
+
export default StatusLedger01;
|
|
131
|
+
//# sourceMappingURL=status-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-ledger.d.ts","sourceRoot":"","sources":["../../../src/blocks/status-ledger-01/status-ledger.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,uDAAwD,CAAA;AAEjF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAqBtD;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,IAAI,EAAE,SAAS,SAAS,EAAE,CAAA;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,EACP,YAAmB,GACpB,EAAE,mBAAmB,+BAsDrB;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
* The four tiers a StatusLedger01 row can be in.
|
|
6
|
+
*
|
|
7
|
+
* Four, and the fifth is refused deliberately. All four NaniSoft sites publish a
|
|
8
|
+
* ledger of the same kind - what a product can do today, what is designed, what
|
|
9
|
+
* is planned, and what is only a direction - and between them they use eight
|
|
10
|
+
* different words for those four states: `live`, `available` and `complete` all
|
|
11
|
+
* mean the same thing; `approved`, `specified` and `designed` all mean the next
|
|
12
|
+
* one; `planned` means the one after; and `direction` means a research direction
|
|
13
|
+
* that is explicitly not a capability. Eight words for four states is four tiers
|
|
14
|
+
* with a per-product vocabulary, and the vocabulary belongs in the row's
|
|
15
|
+
* `statusLabel`, not in the type.
|
|
16
|
+
*
|
|
17
|
+
* A fifth tier would be the one that splits a state that does not need splitting -
|
|
18
|
+
* `deprecated` over `retired`, or a `live` that is not `complete`. Each such tier
|
|
19
|
+
* is a colour a reader must learn and a word a maintainer must keep true, and a
|
|
20
|
+
* ladder with more rungs than states is how a status column stops being readable.
|
|
21
|
+
* The four below are the states; the words are the caller's.
|
|
22
|
+
*/
|
|
23
|
+
export const STATUS_TIERS = ['live', 'designed', 'planned', 'direction'];
|
|
24
|
+
/**
|
|
25
|
+
* The dot each tier draws, and the ring around it.
|
|
26
|
+
*
|
|
27
|
+
* The dot is `aria-hidden` and the row's words carry the state, so a tier is
|
|
28
|
+
* never colour alone: a reader who cannot separate success from warning still
|
|
29
|
+
* reads the label. The ring is `border-brand-ink` rather than `border-border`
|
|
30
|
+
* because the mark is a signal, and a signal that reads as a hairline on a card
|
|
31
|
+
* is not a signal. This is the mark the four sites draw by hand, and the reason
|
|
32
|
+
* it is a ring around a fill rather than a filled dot is a measurement: a filled
|
|
33
|
+
* pastel dot fails contrast against a light card, while a hairline ring in the
|
|
34
|
+
* brand ink does not.
|
|
35
|
+
*/
|
|
36
|
+
const TIER_DOT = {
|
|
37
|
+
live: 'bg-success border-success',
|
|
38
|
+
designed: 'bg-warning border-warning',
|
|
39
|
+
planned: 'border-muted-foreground',
|
|
40
|
+
direction: 'border-border',
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* A ledger of things and the state each is in: a hairline row per entry, a mark
|
|
44
|
+
* for the tier, and the words for the state beside the name.
|
|
45
|
+
*
|
|
46
|
+
* All four NaniSoft sites publish this section, and three of them publish it as a
|
|
47
|
+
* ledger of rows while the fourth publishes the same shape as a list of products;
|
|
48
|
+
* the ledger appears twice in the fourth site as well, once for use cases and
|
|
49
|
+
* once for research directions. Five ledgers across four sites, each one written
|
|
50
|
+
* by hand, each one re-deciding the same four things: which tier words to use,
|
|
51
|
+
* how the tier is drawn, whether the tier is announced, and whether the row
|
|
52
|
+
* carries a detail line or a bullet list.
|
|
53
|
+
*
|
|
54
|
+
* **The tier is four and the words are the caller's.** The `status` prop takes
|
|
55
|
+
* one of four tiers and the `statusLabel` prop takes the words. That split is the
|
|
56
|
+
* whole design: the tier is a colour, and colour is not information a reader can
|
|
57
|
+
* act on; the words are the information, and the words belong to the product. A
|
|
58
|
+
* Block that rendered the tier's own name would force one vocabulary on five
|
|
59
|
+
* products that between them already use eight, and a Block that took only the
|
|
60
|
+
* words would have nothing to draw.
|
|
61
|
+
*
|
|
62
|
+
* The mark is a ring around a fill rather than a filled dot, which is the
|
|
63
|
+
* contested shape this Block ships and the reason is a measurement: a filled
|
|
64
|
+
* pastel dot fails contrast against a light card, and a dot that fails contrast
|
|
65
|
+
* is a dot that does not exist for the reader it was meant to reassure. The ring
|
|
66
|
+
* is in the brand ink, the fill is the tier's own semantic token, and the whole
|
|
67
|
+
* mark is `aria-hidden`, so the row's `statusLabel` is the state a screen reader
|
|
68
|
+
* hears and a reader who cannot see the dot at all still gets the same fact.
|
|
69
|
+
*
|
|
70
|
+
* A row is a `li` inside an `ol`, so the ledger is a list in the document's
|
|
71
|
+
* outline rather than a grid of divs, and the detail line and the bullet list are
|
|
72
|
+
* the two shapes a row takes. A row with neither is a name and a state and is a
|
|
73
|
+
* valid row: most ledgers are mostly those.
|
|
74
|
+
*
|
|
75
|
+
* It is a server Component: no hook, no state, no client code and no router.
|
|
76
|
+
*/
|
|
77
|
+
export function StatusLedger01({ eyebrow, title, description, rows, caption, headingLevel = 'h2', }) {
|
|
78
|
+
return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsx("ol", { "data-slot": "status-ledger", className: "flex flex-col", children: rows.map((row) => (_jsxs("li", { "data-slot": "status-ledger-row", "data-status": row.status, className: "border-border flex flex-col gap-2 border-b py-5 first:border-t sm:flex-row sm:items-baseline sm:gap-6", children: [_jsxs("div", { className: "flex shrink-0 items-center gap-3 sm:w-64", children: [_jsx("span", { "aria-hidden": true, "data-tier": row.status, className: cn('border-brand-ink inline-block size-3 shrink-0 rounded-full border', TIER_DOT[row.status]) }), _jsx("span", { className: "text-sm font-semibold", children: row.name })] }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-2", children: [_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: row.statusLabel }), row.detail ? (_jsx("span", { className: "text-muted-foreground text-pretty text-sm", children: row.detail })) : null, row.bullets && row.bullets.length > 0 ? (_jsx("ul", { className: "text-muted-foreground mt-1 flex list-disc flex-col gap-1 pl-5 text-sm", children: row.bullets.map((bullet) => (_jsx("li", { children: bullet }, bullet))) })) : null] })] }, row.name))) }), caption ? _jsx("p", { className: "text-muted-foreground mt-6 text-pretty text-sm", children: caption }) : null] }));
|
|
79
|
+
}
|
|
80
|
+
export default StatusLedger01;
|
|
@@ -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,EA0pBzC,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"}
|