@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,78 @@
|
|
|
1
|
+
import type { LucideIcon } from 'lucide-react';
|
|
2
|
+
import { type HeadingLevel } from '../../components/ui/section';
|
|
3
|
+
/**
|
|
4
|
+
* One feature in an icon-bearing grid.
|
|
5
|
+
*
|
|
6
|
+
* The icon is required, not optional, because this tile is always rendered: an
|
|
7
|
+
* optional icon here would compile and then paint an empty accent tile, which is
|
|
8
|
+
* the safe-at-render condition an optional prop turns unsafe.
|
|
9
|
+
*/
|
|
10
|
+
export type IconFeature = {
|
|
11
|
+
icon: LucideIcon;
|
|
12
|
+
title: string;
|
|
13
|
+
body: string;
|
|
14
|
+
};
|
|
15
|
+
/** One feature in a bare grid, which renders no tile and so asks for no icon. */
|
|
16
|
+
export type BareFeature = {
|
|
17
|
+
title: string;
|
|
18
|
+
body: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* A feature, in whichever of the two shapes the grid's `variant` admits.
|
|
22
|
+
*
|
|
23
|
+
* The requirement is expressed as a union discriminated on `variant` rather than
|
|
24
|
+
* as `icon?: LucideIcon` on one type, because only a union lets the type system
|
|
25
|
+
* see the exception. A single type cannot require an icon in one variant and not
|
|
26
|
+
* in the other: it can only be required in both, which makes the bare variant
|
|
27
|
+
* impossible, or optional in both, which makes the icon variant's empty tile
|
|
28
|
+
* possible. The discriminator is the same `variant` value the Block branches on
|
|
29
|
+
* at render, so the two cannot disagree.
|
|
30
|
+
*/
|
|
31
|
+
export type Feature = IconFeature | BareFeature;
|
|
32
|
+
type FeatureGrid01CommonProps = {
|
|
33
|
+
eyebrow?: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Puts the feature's position in the grid on the card, zero-padded to two
|
|
38
|
+
* digits, above the title.
|
|
39
|
+
*
|
|
40
|
+
* The ordinal is rendered from the card's position rather than taken from the
|
|
41
|
+
* feature, because a list that carries its own numbers is a list whose numbers
|
|
42
|
+
* can disagree with its order after a sort, a filter or an insertion. All four
|
|
43
|
+
* NaniSoft sites render one: three of them as `01` in the mono face on every
|
|
44
|
+
* card, and the fourth on a set of pillars as well as on the grid.
|
|
45
|
+
*
|
|
46
|
+
* It is off by default. A number on a card is a claim that the set is a
|
|
47
|
+
* sequence, and a grid of features is usually a set.
|
|
48
|
+
*/
|
|
49
|
+
numbered?: boolean;
|
|
50
|
+
/** Heading level for the section title. See `HeadingLevel`. */
|
|
51
|
+
headingLevel?: HeadingLevel;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* The `icon` arm is the one an omitted `variant` selects, so the default and
|
|
55
|
+
* the required icon live on the same arm: a consumer who writes nothing about
|
|
56
|
+
* the variant gets the tiles and the icons they imply.
|
|
57
|
+
*/
|
|
58
|
+
export type FeatureGrid01Props = FeatureGrid01CommonProps & ({
|
|
59
|
+
variant?: 'icon';
|
|
60
|
+
features: IconFeature[];
|
|
61
|
+
} | {
|
|
62
|
+
variant: 'bare';
|
|
63
|
+
features: BareFeature[];
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* A grid of short feature blurbs.
|
|
67
|
+
*
|
|
68
|
+
* The feature list is a prop. It previously hardcoded the catalog's own selling
|
|
69
|
+
* points under the heading "Why this catalog", so an installed block argued for
|
|
70
|
+
* the library inside the consumer's product.
|
|
71
|
+
*
|
|
72
|
+
* The `icon` variant renders a tile per feature and requires an icon per feature.
|
|
73
|
+
* The `bare` variant renders no tile and requires no icon, and the type says so
|
|
74
|
+
* rather than the renderer finding out.
|
|
75
|
+
*/
|
|
76
|
+
export declare function FeatureGrid01(props: FeatureGrid01Props): import("react").JSX.Element;
|
|
77
|
+
export default FeatureGrid01;
|
|
78
|
+
//# sourceMappingURL=feature-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-grid.d.ts","sourceRoot":"","sources":["../../../src/blocks/feature-grid-01/feature-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAExF;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,WAAW,CAAA;AAE/C,KAAK,wBAAwB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,GACvD,CACI;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAC/C,CAAA;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BA0CtD;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardDescription, CardHeader, CardTitle } from '../../components/ui/card';
|
|
3
|
+
import { Section, SectionHeading } from '../../components/ui/section';
|
|
4
|
+
/**
|
|
5
|
+
* A grid of short feature blurbs.
|
|
6
|
+
*
|
|
7
|
+
* The feature list is a prop. It previously hardcoded the catalog's own selling
|
|
8
|
+
* points under the heading "Why this catalog", so an installed block argued for
|
|
9
|
+
* the library inside the consumer's product.
|
|
10
|
+
*
|
|
11
|
+
* The `icon` variant renders a tile per feature and requires an icon per feature.
|
|
12
|
+
* The `bare` variant renders no tile and requires no icon, and the type says so
|
|
13
|
+
* rather than the renderer finding out.
|
|
14
|
+
*/
|
|
15
|
+
export function FeatureGrid01(props) {
|
|
16
|
+
const { eyebrow, title, description, numbered = false, headingLevel = 'h2' } = props;
|
|
17
|
+
// Read off `props` rather than destructured, so the two stay one value: taking
|
|
18
|
+
// `variant` and `features` apart is what would let the arm the type checked
|
|
19
|
+
// and the arm the renderer followed come to be two different ones.
|
|
20
|
+
const variant = props.variant ?? 'icon';
|
|
21
|
+
const { features } = props;
|
|
22
|
+
return (_jsxs(Section, { children: [title ? (_jsx(SectionHeading, { as: headingLevel, eyebrow: eyebrow, title: title, description: description, className: "mb-12" })) : null, _jsx("div", { className: "grid gap-6 sm:grid-cols-2", children: features.map((feature, index) => (_jsx(Card, { className: "gap-4 py-6", children: _jsxs(CardHeader, { children: [numbered ? (_jsx("span", { className: "text-muted-foreground font-mono text-xs", children: String(index + 1).padStart(2, '0') })) : null, variant === 'icon' && 'icon' in feature ? (_jsx("span", { className: "bg-accent text-accent-foreground mb-2 flex size-10 items-center justify-center rounded-lg", children: _jsx(feature.icon, { className: "size-5" }) })) : null, _jsx(CardTitle, { children: feature.title }), _jsx(CardDescription, { children: feature.body })] }) }, feature.title))) })] }));
|
|
23
|
+
}
|
|
24
|
+
export default FeatureGrid01;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/feature-grid-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EACV,WAAW,EACX,OAAO,EACP,kBAAkB,EAClB,WAAW,GACZ,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { FeatureGrid01, default } from './feature-grid';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type HeadingLevel } from '../../components/ui/section';
|
|
2
|
+
export type HeroAction = {
|
|
3
|
+
label: string;
|
|
4
|
+
href?: string;
|
|
5
|
+
variant?: 'default' | 'outline' | 'secondary' | 'ghost';
|
|
6
|
+
};
|
|
7
|
+
export type Hero01Props = {
|
|
8
|
+
/**
|
|
9
|
+
* Optional label above the headline. Intentionally has no default: an earlier
|
|
10
|
+
* version shipped a hardcoded "Now in open beta" pill, which meant every
|
|
11
|
+
* consumer who installed this block inherited a status badge making a claim
|
|
12
|
+
* about their product. Pass one if you mean it.
|
|
13
|
+
*/
|
|
14
|
+
eyebrow?: string;
|
|
15
|
+
title: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
actions?: HeroAction[];
|
|
18
|
+
/**
|
|
19
|
+
* Whether the copy is centered in the band or set flush to the left edge of
|
|
20
|
+
* the container.
|
|
21
|
+
*
|
|
22
|
+
* This is the hero's own alignment and not `SectionHeading`'s, because the two
|
|
23
|
+
* are not the same decision: a left-aligned hero is nearly always the left half
|
|
24
|
+
* of a two-column band with a panel or an instrument beside it, and that column
|
|
25
|
+
* is narrower than the container, so the alignment has to be the hero's before
|
|
26
|
+
* the container can be anything. Three of the four NaniSoft sites compose a
|
|
27
|
+
* left-aligned hero, each beside a panel, and each wrote the alignment by hand
|
|
28
|
+
* because this Block was the centered form only.
|
|
29
|
+
*
|
|
30
|
+
* It has no visual effect on its own, which is the point: it aligns the copy
|
|
31
|
+
* inside whatever width it is given.
|
|
32
|
+
*
|
|
33
|
+
* @defaultValue 'center'
|
|
34
|
+
*/
|
|
35
|
+
align?: 'center' | 'left';
|
|
36
|
+
/**
|
|
37
|
+
* Heading level for the title. Defaults to `h2` because a block is composed,
|
|
38
|
+
* not a page: it installs into a consumer's layout and renders
|
|
39
|
+
* inside catalog previews, so the surrounding document already owns the `h1`.
|
|
40
|
+
* A page that uses this block as its top-level heading opts in with
|
|
41
|
+
* `headingLevel="h1"`; a document that already names this section in its own
|
|
42
|
+
* heading passes one level deeper. See `HeadingLevel`.
|
|
43
|
+
*/
|
|
44
|
+
headingLevel?: HeadingLevel;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* A centered marketing hero with an optional eyebrow, a headline, a supporting
|
|
48
|
+
* line and up to two actions.
|
|
49
|
+
*
|
|
50
|
+
* The copy and the actions are props, and the Block ships none of either. It
|
|
51
|
+
* previously shipped nothing of its own here and the remaining thing worth saying
|
|
52
|
+
* is the alignment: `align` is this Block's own prop rather than a pass-through of
|
|
53
|
+
* `SectionHeading`'s, because a left-aligned hero is nearly always one column of a
|
|
54
|
+
* two-column band and that column is narrower than the container, so the alignment
|
|
55
|
+
* has to be decided before the container is anything.
|
|
56
|
+
*/
|
|
57
|
+
export declare function Hero01({ eyebrow, title, description, actions, align, headingLevel, }: Hero01Props): import("react").JSX.Element;
|
|
58
|
+
export default Hero01;
|
|
59
|
+
//# sourceMappingURL=hero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/hero.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;CACxD,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAY,EACZ,KAAgB,EAChB,YAAmB,GACpB,EAAE,WAAW,+BAkDb;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowRight } from 'lucide-react';
|
|
3
|
+
import { Button } from '../../components/ui/button';
|
|
4
|
+
import { Section, SectionHeading } from '../../components/ui/section';
|
|
5
|
+
import { cn } from '../../lib/utils';
|
|
6
|
+
/**
|
|
7
|
+
* A centered marketing hero with an optional eyebrow, a headline, a supporting
|
|
8
|
+
* line and up to two actions.
|
|
9
|
+
*
|
|
10
|
+
* The copy and the actions are props, and the Block ships none of either. It
|
|
11
|
+
* previously shipped nothing of its own here and the remaining thing worth saying
|
|
12
|
+
* is the alignment: `align` is this Block's own prop rather than a pass-through of
|
|
13
|
+
* `SectionHeading`'s, because a left-aligned hero is nearly always one column of a
|
|
14
|
+
* two-column band and that column is narrower than the container, so the alignment
|
|
15
|
+
* has to be decided before the container is anything.
|
|
16
|
+
*/
|
|
17
|
+
export function Hero01({ eyebrow, title, description, actions = [], align = 'center', headingLevel = 'h2', }) {
|
|
18
|
+
return (_jsxs(Section, { className: "relative overflow-hidden", children: [_jsx("div", { "aria-hidden": true, className: "from-primary/5 pointer-events-none absolute inset-0 -z-10 bg-gradient-to-b to-transparent" }), _jsxs("div", { "data-slot": "hero-01-copy", className: cn('flex flex-col gap-10', align === 'center' ? 'items-center text-center' : 'items-start text-left'), children: [eyebrow ? (_jsx("span", { className: "bg-muted text-muted-foreground rounded-full px-3 py-1 text-xs font-medium", children: eyebrow })) : null, _jsx(SectionHeading, { as: headingLevel, align: align, title: title, description: description }), actions.length ? (_jsx("div", { className: "flex flex-col gap-3 sm:flex-row", children: actions.map((action, index) => (
|
|
19
|
+
// Positional, for the same reason as `pricing-01`'s feature list:
|
|
20
|
+
// the label is display content, and two actions may share one.
|
|
21
|
+
// Safe here because the list is static and never reordered.
|
|
22
|
+
_jsxs(Button, { size: "lg", variant: action.variant ?? (index === 0 ? 'default' : 'outline'), className: "group", children: [action.label, index === 0 ? (_jsx(ArrowRight, { className: "motion-safe:transition-transform size-4 group-hover:translate-x-0.5" })) : null] }, index))) })) : null] })] }));
|
|
23
|
+
}
|
|
24
|
+
export default Hero01;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Hero01, default } from './hero';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every Prism Block.
|
|
3
|
+
*
|
|
4
|
+
* A Block is a pre-composed, product-agnostic section: it accepts data and
|
|
5
|
+
* content as props and never fetches application data (ticket 07). The `-NN`
|
|
6
|
+
* suffix is the block-family variant ordinal.
|
|
7
|
+
*/
|
|
8
|
+
export { Hero01 } from './hero-01';
|
|
9
|
+
export { FeatureGrid01 } from './feature-grid-01';
|
|
10
|
+
export { Stats01 } from './stats-01';
|
|
11
|
+
export { Pricing01 } from './pricing-01';
|
|
12
|
+
export { Cta01 } from './cta-01';
|
|
13
|
+
export { PageHeader01 } from './page-header-01';
|
|
14
|
+
export { DataTable01 } from './data-table-01';
|
|
15
|
+
export { SettingsPanel01 } from './settings-panel-01';
|
|
16
|
+
export { AuthForm01 } from './auth-form-01';
|
|
17
|
+
export { AppShell01 } from './app-shell-01';
|
|
18
|
+
export { ProcessRail01 } from './process-rail-01';
|
|
19
|
+
export { StatusLedger01, STATUS_TIERS } from './status-ledger-01';
|
|
20
|
+
export type { StatusTier } from './status-ledger-01';
|
|
21
|
+
export { ProductGrid01 } from './product-grid-01';
|
|
22
|
+
export { StackGrid01 } from './stack-grid-01';
|
|
23
|
+
export { LogoStrip01 } from './logo-strip-01';
|
|
24
|
+
export { NoteGrid01 } from './note-grid-01';
|
|
25
|
+
export { InstrumentPanel01 } from './instrument-panel-01';
|
|
26
|
+
export { SiteHeader } from './site-header';
|
|
27
|
+
export { SiteFooter } from './site-footer';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blocks/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every Prism Block.
|
|
3
|
+
*
|
|
4
|
+
* A Block is a pre-composed, product-agnostic section: it accepts data and
|
|
5
|
+
* content as props and never fetches application data (ticket 07). The `-NN`
|
|
6
|
+
* suffix is the block-family variant ordinal.
|
|
7
|
+
*/
|
|
8
|
+
export { Hero01 } from './hero-01';
|
|
9
|
+
export { FeatureGrid01 } from './feature-grid-01';
|
|
10
|
+
export { Stats01 } from './stats-01';
|
|
11
|
+
export { Pricing01 } from './pricing-01';
|
|
12
|
+
export { Cta01 } from './cta-01';
|
|
13
|
+
export { PageHeader01 } from './page-header-01';
|
|
14
|
+
export { DataTable01 } from './data-table-01';
|
|
15
|
+
export { SettingsPanel01 } from './settings-panel-01';
|
|
16
|
+
export { AuthForm01 } from './auth-form-01';
|
|
17
|
+
export { AppShell01 } from './app-shell-01';
|
|
18
|
+
export { ProcessRail01 } from './process-rail-01';
|
|
19
|
+
export { StatusLedger01, STATUS_TIERS } from './status-ledger-01';
|
|
20
|
+
export { ProductGrid01 } from './product-grid-01';
|
|
21
|
+
export { StackGrid01 } from './stack-grid-01';
|
|
22
|
+
export { LogoStrip01 } from './logo-strip-01';
|
|
23
|
+
export { NoteGrid01 } from './note-grid-01';
|
|
24
|
+
export { InstrumentPanel01 } from './instrument-panel-01';
|
|
25
|
+
export { SiteHeader } from './site-header';
|
|
26
|
+
export { SiteFooter } from './site-footer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/instrument-panel-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC/D,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { InstrumentPanel01, default } from './instrument-panel';
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The state a panel's title bar claims about what is inside it.
|
|
4
|
+
*
|
|
5
|
+
* Three, and none of them is a fifth: `neutral` says nothing, `live` says the
|
|
6
|
+
* content is updating now, and `paused` says it is not. A fourth state such as
|
|
7
|
+
* `error` or `stale` is a claim about a specific system's health, and a panel
|
|
8
|
+
* that shipped one would be making a claim about every consumer's data on their
|
|
9
|
+
* behalf.
|
|
10
|
+
*/
|
|
11
|
+
export type PanelState = 'neutral' | 'live' | 'paused';
|
|
12
|
+
/**
|
|
13
|
+
* The props an InstrumentPanel01 takes.
|
|
14
|
+
*
|
|
15
|
+
* The content is a slot and the frame is the Block. A panel that took a prop per
|
|
16
|
+
* kind of instrument would be four panels, and an instrument - a graph, a chart,
|
|
17
|
+
* a table, a canvas, a piece of application-owned markup - is the one thing in
|
|
18
|
+
* this system that Prism cannot draw, because drawing it is the application's job
|
|
19
|
+
* and its data is the application's own.
|
|
20
|
+
*/
|
|
21
|
+
export type InstrumentPanel01Props = {
|
|
22
|
+
/**
|
|
23
|
+
* What the panel shows, in one phrase: "the estate, as one graph", "the loop,
|
|
24
|
+
* live". It is the panel's title and the only visible text the Block adds, so
|
|
25
|
+
* it is required.
|
|
26
|
+
*/
|
|
27
|
+
label: string;
|
|
28
|
+
/**
|
|
29
|
+
* The state the title bar claims about the content. `neutral` renders a quiet
|
|
30
|
+
* dot and no words; `live` and `paused` require `stateLabel` with them, because
|
|
31
|
+
* the words are what a reader is told and the dot is only what a reader sees.
|
|
32
|
+
*
|
|
33
|
+
* @defaultValue 'neutral'
|
|
34
|
+
*/
|
|
35
|
+
state?: PanelState;
|
|
36
|
+
/**
|
|
37
|
+
* The words for the state, in the product's own vocabulary. Required whenever
|
|
38
|
+
* `state` is `live` or `paused`: "live view", "paused", "snapshotting" and
|
|
39
|
+
* "verified" are four different claims about four different systems, and none
|
|
40
|
+
* of them is Prism's to choose.
|
|
41
|
+
*/
|
|
42
|
+
stateLabel?: string;
|
|
43
|
+
/**
|
|
44
|
+
* A slot on the right of the title bar, for a control the panel does not own: a
|
|
45
|
+
* range selector, a pause button, a link to the full view. A slot rather than a
|
|
46
|
+
* prop, because every one of those is application state.
|
|
47
|
+
*/
|
|
48
|
+
actions?: ReactNode;
|
|
49
|
+
/**
|
|
50
|
+
* The instrument. Any node the consumer composes: a graph, a chart, a table, a
|
|
51
|
+
* canvas, a placeholder in a static export. The Block draws the frame and the
|
|
52
|
+
* bar and nothing else.
|
|
53
|
+
*/
|
|
54
|
+
children: ReactNode;
|
|
55
|
+
/**
|
|
56
|
+
* The line under the instrument, for what a reader needs to know before
|
|
57
|
+
* trusting it: where the data came from, how fresh it is, what is not shown.
|
|
58
|
+
*/
|
|
59
|
+
footnote?: ReactNode;
|
|
60
|
+
/**
|
|
61
|
+
* A caption for the panel as a whole, published as the frame's accessible name
|
|
62
|
+
* and as no visible text. It is how a reader navigating by figure knows which
|
|
63
|
+
* figure they have landed on.
|
|
64
|
+
*/
|
|
65
|
+
caption?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Layout only, exactly as on every Component. Changing a Prism-owned visual
|
|
68
|
+
* property from here is prohibited.
|
|
69
|
+
*/
|
|
70
|
+
className?: string;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* A bordered instrument panel with a titled bar: the frame a live view of
|
|
74
|
+
* something is shown in, beside the copy that explains it.
|
|
75
|
+
*
|
|
76
|
+
* Three of the four NaniSoft sites compose this as the right half of their hero,
|
|
77
|
+
* and each one wrote the same four things by hand: a bordered panel, a bar across
|
|
78
|
+
* the top with a small state dot on the left, the name of the view in the middle
|
|
79
|
+
* and something on the right, the instrument below, and a footnote under it. Each
|
|
80
|
+
* also gave the panel a definite height, because an instrument whose height is
|
|
81
|
+
* whatever its content is makes the hero beside it jump while it loads.
|
|
82
|
+
*
|
|
83
|
+
* **The panel owns the frame, never the instrument.** What goes inside is
|
|
84
|
+
* whatever the consumer composed, and that is not a limitation: an instrument is
|
|
85
|
+
* the one thing in this system Prism cannot draw, because it is a view of the
|
|
86
|
+
* consumer's data and every consumer's data is a different drawing. A panel that
|
|
87
|
+
* took a prop per instrument kind would be four panels and would still not cover
|
|
88
|
+
* the fifth consumer to write their own.
|
|
89
|
+
*
|
|
90
|
+
* The state dot is `aria-hidden` and the words beside it are not. All three sites
|
|
91
|
+
* that draw a dot write the state in words next to it, and that is the rule here:
|
|
92
|
+
* a dot is a shape, and a reader who cannot see `success` has learned nothing from
|
|
93
|
+
* it. `stateLabel` is therefore required whenever the state is `live` or `paused`,
|
|
94
|
+
* and the Block throws without it rather than shipping a state a reader can only
|
|
95
|
+
* see.
|
|
96
|
+
*
|
|
97
|
+
* The bar is a `Section`-width row rather than a page-width one, because a panel
|
|
98
|
+
* is a column and a column that runs the page's width is not a column. The frame
|
|
99
|
+
* carries `shadow-sm`, the resting surface step, and no more: a panel is a card
|
|
100
|
+
* with an instrument in it, and the only element in this system that means
|
|
101
|
+
* *lifted* is the one with a border in the pack's primary hue, which this is not.
|
|
102
|
+
*
|
|
103
|
+
* The three states are `neutral`, `live` and `paused`, and there is no fourth. A
|
|
104
|
+
* state such as `error` or `stale` is a claim about a specific system's health,
|
|
105
|
+
* and a panel that shipped one would be making that claim about every consumer's
|
|
106
|
+
* data.
|
|
107
|
+
*
|
|
108
|
+
* It is a server Component. It holds no state and imports no client code, so a
|
|
109
|
+
* consumer that puts a client instrument inside it pays for the instrument and not
|
|
110
|
+
* for the frame.
|
|
111
|
+
*/
|
|
112
|
+
export declare function InstrumentPanel01({ label, state, stateLabel, actions, children, footnote, caption, className, }: InstrumentPanel01Props): import("react").JSX.Element;
|
|
113
|
+
export default InstrumentPanel01;
|
|
114
|
+
//# sourceMappingURL=instrument-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument-panel.d.ts","sourceRoot":"","sources":["../../../src/blocks/instrument-panel-01/instrument-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAiBtD;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB;;;;OAIG;IACH,QAAQ,EAAE,SAAS,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAiB,EACjB,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,sBAAsB,+BA2CxB;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../../lib/utils';
|
|
3
|
+
/**
|
|
4
|
+
* The dot each state draws.
|
|
5
|
+
*
|
|
6
|
+
* All three are `aria-hidden`, and the state is announced in words beside them
|
|
7
|
+
* rather than by the colour: a live dot is a shape a reader who cannot see
|
|
8
|
+
* `success` has not been told anything, and the three sites that draw one all
|
|
9
|
+
* write the words next to it. That is the rule this reproduces, and it is why
|
|
10
|
+
* `stateLabel` is required whenever `state` is set to anything but `neutral`.
|
|
11
|
+
*/
|
|
12
|
+
const STATE_DOT = {
|
|
13
|
+
neutral: 'bg-muted-foreground',
|
|
14
|
+
live: 'bg-success',
|
|
15
|
+
paused: 'bg-warning',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* A bordered instrument panel with a titled bar: the frame a live view of
|
|
19
|
+
* something is shown in, beside the copy that explains it.
|
|
20
|
+
*
|
|
21
|
+
* Three of the four NaniSoft sites compose this as the right half of their hero,
|
|
22
|
+
* and each one wrote the same four things by hand: a bordered panel, a bar across
|
|
23
|
+
* the top with a small state dot on the left, the name of the view in the middle
|
|
24
|
+
* and something on the right, the instrument below, and a footnote under it. Each
|
|
25
|
+
* also gave the panel a definite height, because an instrument whose height is
|
|
26
|
+
* whatever its content is makes the hero beside it jump while it loads.
|
|
27
|
+
*
|
|
28
|
+
* **The panel owns the frame, never the instrument.** What goes inside is
|
|
29
|
+
* whatever the consumer composed, and that is not a limitation: an instrument is
|
|
30
|
+
* the one thing in this system Prism cannot draw, because it is a view of the
|
|
31
|
+
* consumer's data and every consumer's data is a different drawing. A panel that
|
|
32
|
+
* took a prop per instrument kind would be four panels and would still not cover
|
|
33
|
+
* the fifth consumer to write their own.
|
|
34
|
+
*
|
|
35
|
+
* The state dot is `aria-hidden` and the words beside it are not. All three sites
|
|
36
|
+
* that draw a dot write the state in words next to it, and that is the rule here:
|
|
37
|
+
* a dot is a shape, and a reader who cannot see `success` has learned nothing from
|
|
38
|
+
* it. `stateLabel` is therefore required whenever the state is `live` or `paused`,
|
|
39
|
+
* and the Block throws without it rather than shipping a state a reader can only
|
|
40
|
+
* see.
|
|
41
|
+
*
|
|
42
|
+
* The bar is a `Section`-width row rather than a page-width one, because a panel
|
|
43
|
+
* is a column and a column that runs the page's width is not a column. The frame
|
|
44
|
+
* carries `shadow-sm`, the resting surface step, and no more: a panel is a card
|
|
45
|
+
* with an instrument in it, and the only element in this system that means
|
|
46
|
+
* *lifted* is the one with a border in the pack's primary hue, which this is not.
|
|
47
|
+
*
|
|
48
|
+
* The three states are `neutral`, `live` and `paused`, and there is no fourth. A
|
|
49
|
+
* state such as `error` or `stale` is a claim about a specific system's health,
|
|
50
|
+
* and a panel that shipped one would be making that claim about every consumer's
|
|
51
|
+
* data.
|
|
52
|
+
*
|
|
53
|
+
* It is a server Component. It holds no state and imports no client code, so a
|
|
54
|
+
* consumer that puts a client instrument inside it pays for the instrument and not
|
|
55
|
+
* for the frame.
|
|
56
|
+
*/
|
|
57
|
+
export function InstrumentPanel01({ label, state = 'neutral', stateLabel, actions, children, footnote, caption, className, }) {
|
|
58
|
+
if (state !== 'neutral' && !stateLabel) {
|
|
59
|
+
throw new Error(`InstrumentPanel01: the panel state is '${state}' and no stateLabel was passed, so the state would ` +
|
|
60
|
+
'be a dot a reader can only see. Pass the words you mean, or use the neutral state.');
|
|
61
|
+
}
|
|
62
|
+
return (_jsxs("figure", { "data-slot": "instrument-panel", "data-state": state, "aria-label": caption, className: cn('bg-card flex w-full flex-col gap-0 rounded-xl border shadow-sm', className), children: [_jsxs("div", { "data-slot": "instrument-panel-bar", className: "border-border text-muted-foreground flex items-center gap-3 border-b px-4 py-2 text-xs", children: [_jsx("span", { "aria-hidden": true, "data-state": state, className: cn('inline-block size-2 shrink-0 rounded-full', STATE_DOT[state]) }), _jsx("span", { className: "truncate font-medium", children: label }), stateLabel ? _jsx("span", { className: "truncate", children: stateLabel }) : null, actions ? _jsx("span", { className: "ms-auto flex shrink-0 items-center gap-2", children: actions }) : null] }), _jsx("div", { "data-slot": "instrument-panel-body", className: "min-h-0 flex-1 px-4 py-3", children: children }), footnote ? (_jsx("figcaption", { "data-slot": "instrument-panel-footnote", className: "text-muted-foreground border-border border-t px-4 py-2 text-xs", children: footnote })) : null] }));
|
|
63
|
+
}
|
|
64
|
+
export default InstrumentPanel01;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/logo-strip-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACnD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { LogoStrip01, default } from './logo-strip';
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type HeadingLevel } from '../../components/ui/section';
|
|
2
|
+
/**
|
|
3
|
+
* One item of the strip, as a string.
|
|
4
|
+
*
|
|
5
|
+
* A string rather than a node, because the strip is a run of short words and a
|
|
6
|
+
* node would let a caller put a paragraph in a slot whose whole job is to be
|
|
7
|
+
* scannable in one glance. A caller with more than a few words about one item
|
|
8
|
+
* wants a `NoteGrid01` row or a `StatusLedger01` row, not a longer strip.
|
|
9
|
+
*/
|
|
10
|
+
export type LogoStripItem = string;
|
|
11
|
+
/**
|
|
12
|
+
* The props a LogoStrip01 takes.
|
|
13
|
+
*
|
|
14
|
+
* Every string is a prop and the Block ships none. There is no default list of
|
|
15
|
+
* technologies, no default list of customers and no default list of words: a
|
|
16
|
+
* strip that hardcoded any of them would hand every consumer a claim about who
|
|
17
|
+
* uses their product.
|
|
18
|
+
*/
|
|
19
|
+
export type LogoStrip01Props = {
|
|
20
|
+
/**
|
|
21
|
+
* The items, in the order a reader should meet them. Order is the caller's
|
|
22
|
+
* because it is a claim about which item matters first.
|
|
23
|
+
*/
|
|
24
|
+
items: readonly LogoStripItem[];
|
|
25
|
+
/**
|
|
26
|
+
* The strip's accessible name, for a strip that is not inside a region the
|
|
27
|
+
* reader can already name. It is rendered as the list's name and as no visible
|
|
28
|
+
* text, because the items are the visible content and a heading above them would
|
|
29
|
+
* be a heading about a heading.
|
|
30
|
+
*
|
|
31
|
+
* It is required because it is a word a reader hears. A Block that ships no copy
|
|
32
|
+
* ships no reader-facing copy either, so "Highlights" is not this Block's to
|
|
33
|
+
* choose: on one site the strip is a list of data sources and on another it is a
|
|
34
|
+
* list of capabilities, and the word that says which is the caller's.
|
|
35
|
+
*/
|
|
36
|
+
label: string;
|
|
37
|
+
/** Optional label above the section title. See the No-Default-Eyebrow Rule. */
|
|
38
|
+
eyebrow?: string;
|
|
39
|
+
/** The section title. Omit it for a strip composed under its own heading. */
|
|
40
|
+
title?: string;
|
|
41
|
+
/** One or two sentences under the title. */
|
|
42
|
+
description?: string;
|
|
43
|
+
/** Heading level for the section title. See `HeadingLevel`. */
|
|
44
|
+
headingLevel?: HeadingLevel;
|
|
45
|
+
/**
|
|
46
|
+
* Layout only, exactly as on every Component. Changing a Prism-owned visual
|
|
47
|
+
* property from here is prohibited.
|
|
48
|
+
*/
|
|
49
|
+
className?: string;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* A single line of short items: the transition band between a hero and the
|
|
53
|
+
* section that follows it.
|
|
54
|
+
*
|
|
55
|
+
* All four NaniSoft sites compose this band, immediately after the hero and
|
|
56
|
+
* before the first numbered section, and each one wrote it as the same thing: a
|
|
57
|
+
* row of three to six short phrases, separated by a middot, in muted text, with
|
|
58
|
+
* no heading at all. Four hand-written strips, four sets of site CSS, and one
|
|
59
|
+
* question each of them answered differently - whether the strip is a list, a
|
|
60
|
+
* paragraph with separators, or a decorative row of spans.
|
|
61
|
+
*
|
|
62
|
+
* It is a `ul`, so a screen reader hears how many items there are before it
|
|
63
|
+
* hears the first one. That is the whole answer to the question: a strip whose
|
|
64
|
+
* items are spans in a `div` is announced as one run of text with no count, and a
|
|
65
|
+
* reader deciding whether to keep listening has nothing to weigh.
|
|
66
|
+
*
|
|
67
|
+
* **The strip does not move.** A band of items that slides is an entrance
|
|
68
|
+
* animation, and this system has none: motion is state feedback only, shortened
|
|
69
|
+
* rather than removed under reduced motion. What the four sites actually wanted
|
|
70
|
+
* from their strips was a second, quieter statement of what the product is, and
|
|
71
|
+
* repetition of the type does that without anything moving. A strip of more than
|
|
72
|
+
* about eight items wraps onto three lines on a phone and stops being a band, so
|
|
73
|
+
* a longer set belongs in a `StackGrid01`.
|
|
74
|
+
*
|
|
75
|
+
* The items are `text-balance` so a two-word item does not break across lines
|
|
76
|
+
* where a one-word item beside it does not. There is no separator glyph between
|
|
77
|
+
* them: a middot is punctuation a screen reader reads and a sighted reader parses
|
|
78
|
+
* as content, and the gap already separates two words from two words.
|
|
79
|
+
*
|
|
80
|
+
* It is a server Component: no hook, no state, no keyframes and no client code.
|
|
81
|
+
*/
|
|
82
|
+
export declare function LogoStrip01({ items, label, eyebrow, title, description, headingLevel, className, }: LogoStrip01Props): import("react").JSX.Element | null;
|
|
83
|
+
export default LogoStrip01;
|
|
84
|
+
//# sourceMappingURL=logo-strip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo-strip.d.ts","sourceRoot":"","sources":["../../../src/blocks/logo-strip-01/logo-strip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAElC;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IAC/B;;;;;;;;;;OAUG;IACH,KAAK,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,OAAO,EACP,KAAK,EACL,WAAW,EACX,YAAmB,EACnB,SAAS,GACV,EAAE,gBAAgB,sCA+BlB;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Section, SectionHeading } from '../../components/ui/section';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
|
+
/**
|
|
5
|
+
* A single line of short items: the transition band between a hero and the
|
|
6
|
+
* section that follows it.
|
|
7
|
+
*
|
|
8
|
+
* All four NaniSoft sites compose this band, immediately after the hero and
|
|
9
|
+
* before the first numbered section, and each one wrote it as the same thing: a
|
|
10
|
+
* row of three to six short phrases, separated by a middot, in muted text, with
|
|
11
|
+
* no heading at all. Four hand-written strips, four sets of site CSS, and one
|
|
12
|
+
* question each of them answered differently - whether the strip is a list, a
|
|
13
|
+
* paragraph with separators, or a decorative row of spans.
|
|
14
|
+
*
|
|
15
|
+
* It is a `ul`, so a screen reader hears how many items there are before it
|
|
16
|
+
* hears the first one. That is the whole answer to the question: a strip whose
|
|
17
|
+
* items are spans in a `div` is announced as one run of text with no count, and a
|
|
18
|
+
* reader deciding whether to keep listening has nothing to weigh.
|
|
19
|
+
*
|
|
20
|
+
* **The strip does not move.** A band of items that slides is an entrance
|
|
21
|
+
* animation, and this system has none: motion is state feedback only, shortened
|
|
22
|
+
* rather than removed under reduced motion. What the four sites actually wanted
|
|
23
|
+
* from their strips was a second, quieter statement of what the product is, and
|
|
24
|
+
* repetition of the type does that without anything moving. A strip of more than
|
|
25
|
+
* about eight items wraps onto three lines on a phone and stops being a band, so
|
|
26
|
+
* a longer set belongs in a `StackGrid01`.
|
|
27
|
+
*
|
|
28
|
+
* The items are `text-balance` so a two-word item does not break across lines
|
|
29
|
+
* where a one-word item beside it does not. There is no separator glyph between
|
|
30
|
+
* them: a middot is punctuation a screen reader reads and a sighted reader parses
|
|
31
|
+
* as content, and the gap already separates two words from two words.
|
|
32
|
+
*
|
|
33
|
+
* It is a server Component: no hook, no state, no keyframes and no client code.
|
|
34
|
+
*/
|
|
35
|
+
export function LogoStrip01({ items, label, eyebrow, title, description, headingLevel = 'h2', className, }) {
|
|
36
|
+
if (items.length === 0)
|
|
37
|
+
return null;
|
|
38
|
+
return (_jsxs(Section, { className: "py-10 sm:py-14", children: [title ? (_jsx(SectionHeading, { as: headingLevel, align: "left", eyebrow: eyebrow, title: title, description: description, className: "mb-10" })) : null, _jsx("ul", { "data-slot": "logo-strip", "aria-label": items.length > 1 ? label : undefined, className: cn('text-muted-foreground flex flex-wrap items-center justify-center gap-x-4 gap-y-2 text-center text-sm', className), children: items.map((item) => (_jsx("li", { "data-slot": "logo-strip-item", className: "text-balance", children: item }, item))) })] }));
|
|
39
|
+
}
|
|
40
|
+
export default LogoStrip01;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/blocks/note-grid-01/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACjD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { NoteGrid01, default } from './note-grid';
|