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