@nanisoft/prism-ui 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,6 +21,27 @@ export type Cta01Action = {
21
21
  * reason to open a tab.
22
22
  */
23
23
  newTab?: boolean;
24
+ /**
25
+ * Which weight this action draws at, when the caller does not say.
26
+ *
27
+ * **A panel wants `default` or `secondary`, never `outline`.** This Block draws
28
+ * its band as a filled `bg-primary` surface and sets the band's ink to
29
+ * `--primary-foreground`, so every ink inside it is inherited from that panel
30
+ * rather than from the page. An `outline` action sets its own fill
31
+ * (`bg-background`) and, before this was settled, left its ink inherited, which
32
+ * put `--background` behind `--primary-foreground`. In the lavender pack's dark
33
+ * mode that is `#19171b` behind `#210c33`, or 1.01:1: a focusable, announced,
34
+ * unreadable button.
35
+ *
36
+ * Both defaults below are self-contained, which is the property that matters:
37
+ * `default` pairs `--primary` with `--primary-foreground` and `secondary`
38
+ * pairs `--secondary` with `--secondary-foreground`, and a pair the Block
39
+ * chooses cannot be changed by whatever surface the Block is placed on. The
40
+ * `outline` variant is fixed too, in `cta-link.tsx`, because a variant that
41
+ * sets a fill should set the matching ink rather than inherit whatever it lands
42
+ * on. It is kept in the type because a caller may want it once the ink is
43
+ * explicit, and dropping it would be a smaller answer than the defect.
44
+ */
24
45
  variant?: 'default' | 'secondary' | 'outline';
25
46
  };
26
47
  export type Cta01Props = {
@@ -49,6 +70,13 @@ export type Cta01Props = {
49
70
  * Three of the four NaniSoft sites render two actions in their closing band
50
71
  * and all four do, and all four wrote the pair by hand, so each one re-decided
51
72
  * the gap, the order and the weight between them.
73
+ *
74
+ * Its default weight is `outline`, which is the settled answer for the pair:
75
+ * the primary action is filled and this one is not, so the two read as one
76
+ * decision and one alternative rather than as two competing asks. What `outline`
77
+ * may not do is inherit its ink from the filled band behind it, and that is
78
+ * now a property of the variant rather than of where a caller puts it. See
79
+ * `Cta01Action`'s `variant` for the measurement.
52
80
  */
53
81
  secondaryAction?: Cta01Action;
54
82
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cta.d.ts","sourceRoot":"","sources":["../../../src/blocks/cta-01/cta.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAExE;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,WAAW,CAAA;IAC7B;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,eAAe,EACf,IAAI,EACJ,YAAmB,GACpB,EAAE,UAAU,+BAyDZ;AAED,eAAe,KAAK,CAAA"}
1
+ {"version":3,"file":"cta.d.ts","sourceRoot":"","sources":["../../../src/blocks/cta-01/cta.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAExE;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;;;;;;;;;;;;;;;OAiBG;IACH,eAAe,CAAC,EAAE,WAAW,CAAA;IAC7B;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,eAAe,EACf,IAAI,EACJ,YAAmB,GACpB,EAAE,UAAU,+BAyDZ;AAED,eAAe,KAAK,CAAA"}
@@ -1,8 +1,23 @@
1
+ import type { ReactNode } from 'react';
1
2
  import { type HeadingLevel } from '../../components/ui/section';
2
3
  export type HeroAction = {
3
4
  label: string;
5
+ /**
6
+ * Where the action goes. Required for an action that navigates, which is what
7
+ * an action in a hero almost always is.
8
+ *
9
+ * It was optional here and the Component ignored it, which meant an action
10
+ * with a destination rendered as a `<button>` that went nowhere: a control
11
+ * that looks like a link and is not one, and a dead end for a reader who
12
+ * pressed it. An action now renders as a real anchor whenever it names a
13
+ * destination, and falls back to a button only when it genuinely is one. A
14
+ * Block ships no behaviour, so a button here is inert by design rather than by
15
+ * accident, and the two shapes are told apart by exactly this.
16
+ */
4
17
  href?: string;
5
18
  variant?: 'default' | 'outline' | 'secondary' | 'ghost';
19
+ /** Opens the destination in a new tab, with the matching `rel`. */
20
+ newTab?: boolean;
6
21
  };
7
22
  export type Hero01Props = {
8
23
  /**
@@ -23,9 +38,7 @@ export type Hero01Props = {
23
38
  * are not the same decision: a left-aligned hero is nearly always the left half
24
39
  * of a two-column band with a panel or an instrument beside it, and that column
25
40
  * 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.
41
+ * the container can be anything.
29
42
  *
30
43
  * It has no visual effect on its own, which is the point: it aligns the copy
31
44
  * inside whatever width it is given.
@@ -33,6 +46,30 @@ export type Hero01Props = {
33
46
  * @defaultValue 'center'
34
47
  */
35
48
  align?: 'center' | 'left';
49
+ /**
50
+ * The figure beside the copy: a live view of the thing the copy is about.
51
+ *
52
+ * A slot, and the reason is the whole shape of this Block's second form. The
53
+ * hero that names what a product does and the hero that shows it running are
54
+ * the same section, and every one of the four NaniSoft product sites hand-wrote
55
+ * the two-column band that joins them, each with its own grid, its own gap and
56
+ * its own breakpoint. This is that band.
57
+ *
58
+ * What goes in it is the consumer's, and specifically it should be something
59
+ * that would still be true with every animation stopped: a `PulseGraph` of the
60
+ * pipeline the product runs, a `PulseSeries` of what it captures. A slot that
61
+ * only reads as motion is a decoration with a slot, and this system does not
62
+ * author those. The `instrumented` slot is marked as required when the hero is
63
+ * given one, so a figure cannot be half-wired.
64
+ */
65
+ instrument?: ReactNode;
66
+ /**
67
+ * Puts the copy and the instrument side by side rather than stacked, and
68
+ * narrows the copy to the column it shares the band with. Implied by
69
+ * `instrument` and overridable: a consumer with a narrow instrument and a wide
70
+ * hero may want them stacked anyway.
71
+ */
72
+ split?: boolean;
36
73
  /**
37
74
  * Heading level for the title. Defaults to `h2` because a block is composed,
38
75
  * not a page: it installs into a consumer's layout and renders
@@ -42,18 +79,47 @@ export type Hero01Props = {
42
79
  * heading passes one level deeper. See `HeadingLevel`.
43
80
  */
44
81
  headingLevel?: HeadingLevel;
82
+ /**
83
+ * Layout only, exactly as on every Component. Changing a Prism-owned visual
84
+ * property from here is prohibited.
85
+ */
86
+ className?: string;
45
87
  };
46
88
  /**
47
- * A centered marketing hero with an optional eyebrow, a headline, a supporting
48
- * line and up to two actions.
89
+ * A marketing hero with a headline, a supporting line, up to two actions, and
90
+ * an optional live figure beside them.
91
+ *
92
+ * The copy, the actions and the figure are props, and the Block ships none of
93
+ * any of them.
94
+ *
95
+ * **The two forms are one Block.** Centered over the container, or split with a
96
+ * figure in the second column. The centered form is the older one and is what a
97
+ * page whose claim is a sentence wants. The split form is what a product whose
98
+ * claim is a mechanism wants, and it is the form all four NaniSoft product sites
99
+ * want, because each one's hero is about a system that runs rather than about a
100
+ * feature list. Rather than ship `hero-02` and leave every consumer to compose
101
+ * two blocks and re-derive the grid, the band is here: the column split, the gap
102
+ * and the breakpoint at which the columns stack are one decision, made once, in
103
+ * the place that owns the container contract.
104
+ *
105
+ * **A hero with a figure puts the figure where the eye lands second, not
106
+ * last.** The copy column comes first in the DOM and stays first at every width,
107
+ * so a reader who never sees the figure still reads the headline and the
108
+ * destination, and a screen reader reaches the thesis before the drawing. The
109
+ * figure is on the right at desktop and below the copy when the columns stack,
110
+ * which is the order a reader on a phone wants: what this is, then what it does.
111
+ *
112
+ * **Actions are real links.** An action naming an `href` renders as an anchor
113
+ * with the matching `rel`, because a control that looks like a link and is not
114
+ * one is a dead end. An action with no destination renders as a `Button`, which
115
+ * is inert here by design: a Block ships no behaviour, so the honest form of
116
+ * "this does something" in a composed section is the consumer's own control in
117
+ * the slot.
49
118
  *
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.
119
+ * It composes `Section` and `SectionHeading`, so it inherits the container and
120
+ * the vertical rhythm rather than re-deriving either, and it adds no container
121
+ * width and no section padding of its own.
56
122
  */
57
- export declare function Hero01({ eyebrow, title, description, actions, align, headingLevel, }: Hero01Props): import("react").JSX.Element;
123
+ export declare function Hero01({ eyebrow, title, description, actions, align, instrument, split, headingLevel, className, }: Hero01Props): import("react").JSX.Element;
58
124
  export default Hero01;
59
125
  //# sourceMappingURL=hero.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../../src/blocks/hero-01/hero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAGxF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAA;IACvD,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,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;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACzB;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAY,EACZ,KAAgB,EAChB,UAAU,EACV,KAAK,EACL,YAAmB,EACnB,SAAS,GACV,EAAE,WAAW,+BA+Fb;AAED,eAAe,MAAM,CAAA"}
@@ -1,24 +1,56 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { ArrowRight } from 'lucide-react';
3
3
  import { Button } from '../../components/ui/button';
4
+ import { CtaLink } from '../../components/ui/cta-link';
4
5
  import { Section, SectionHeading } from '../../components/ui/section';
5
6
  import { cn } from '../../lib/utils';
6
7
  /**
7
- * A centered marketing hero with an optional eyebrow, a headline, a supporting
8
- * line and up to two actions.
8
+ * A marketing hero with a headline, a supporting line, up to two actions, and
9
+ * an optional live figure beside them.
9
10
  *
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.
11
+ * The copy, the actions and the figure are props, and the Block ships none of
12
+ * any of them.
13
+ *
14
+ * **The two forms are one Block.** Centered over the container, or split with a
15
+ * figure in the second column. The centered form is the older one and is what a
16
+ * page whose claim is a sentence wants. The split form is what a product whose
17
+ * claim is a mechanism wants, and it is the form all four NaniSoft product sites
18
+ * want, because each one's hero is about a system that runs rather than about a
19
+ * feature list. Rather than ship `hero-02` and leave every consumer to compose
20
+ * two blocks and re-derive the grid, the band is here: the column split, the gap
21
+ * and the breakpoint at which the columns stack are one decision, made once, in
22
+ * the place that owns the container contract.
23
+ *
24
+ * **A hero with a figure puts the figure where the eye lands second, not
25
+ * last.** The copy column comes first in the DOM and stays first at every width,
26
+ * so a reader who never sees the figure still reads the headline and the
27
+ * destination, and a screen reader reaches the thesis before the drawing. The
28
+ * figure is on the right at desktop and below the copy when the columns stack,
29
+ * which is the order a reader on a phone wants: what this is, then what it does.
30
+ *
31
+ * **Actions are real links.** An action naming an `href` renders as an anchor
32
+ * with the matching `rel`, because a control that looks like a link and is not
33
+ * one is a dead end. An action with no destination renders as a `Button`, which
34
+ * is inert here by design: a Block ships no behaviour, so the honest form of
35
+ * "this does something" in a composed section is the consumer's own control in
36
+ * the slot.
37
+ *
38
+ * It composes `Section` and `SectionHeading`, so it inherits the container and
39
+ * the vertical rhythm rather than re-deriving either, and it adds no container
40
+ * width and no section padding of its own.
16
41
  */
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] })] }));
42
+ export function Hero01({ eyebrow, title, description, actions = [], align = 'center', instrument, split, headingLevel = 'h2', className, }) {
43
+ const twoColumn = split ?? instrument !== undefined;
44
+ const copy = (_jsxs("div", { "data-slot": "hero-01-copy", className: cn('flex flex-col gap-10', twoColumn ? 'items-start text-left' : 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: twoColumn ? 'left' : align, title: title, description: description }), actions.length ? (_jsx("div", { className: "flex flex-col gap-3 sm:flex-row", children: actions.map((action, index) => {
45
+ const variant = action.variant ?? (index === 0 ? 'default' : 'outline');
46
+ // Positional, for the same reason as `pricing-01`'s feature list: the
47
+ // label is display content, and two actions may share one. Safe here
48
+ // because the list is static and never reordered.
49
+ const content = (_jsxs(_Fragment, { children: [action.label, index === 0 ? (_jsx(ArrowRight, { className: "motion-safe:transition-transform size-4 group-hover:translate-x-0.5" })) : null] }));
50
+ return action.href ? (_jsx(CtaLink, { href: action.href, newTab: action.newTab, size: "lg", variant: variant, className: "group", children: content }, index)) : (_jsx(Button, { size: "lg", variant: variant, className: "group", children: content }, index));
51
+ }) })) : null] }));
52
+ return (_jsxs(Section, { className: cn('relative overflow-hidden', className), 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-band", className: cn(twoColumn
53
+ ? 'grid items-center gap-10 lg:grid-cols-[5fr_6fr] lg:gap-14'
54
+ : 'flex flex-col'), children: [copy, instrument ? (_jsx("div", { "data-slot": "hero-01-instrument", className: "min-w-0", children: instrument })) : null] })] }));
23
55
  }
24
56
  export default Hero01;
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,aAAa,yCAA0C,CAAA;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,eAAO,MAAM,oBAAoB,sHAQvB,CAAA;AACV,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAErE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAA;CAChC;AAED,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAmsBzC,CAAA;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,GAAE,SAAS,WAAW,EAAY,GAAG,WAAW,EAAE,CAEnF;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAE1D,CAAA"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,aAAa,yCAA0C,CAAA;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,eAAO,MAAM,oBAAoB,sHAQvB,CAAA;AACV,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAErE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAA;CAChC;AAED,eAAO,MAAM,OAAO,EAAE,SAAS,WAAW,EAouBzC,CAAA;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,KAAK,GAAE,SAAS,WAAW,EAAY,GAAG,WAAW,EAAE,CAEnF;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAE1D,CAAA"}
package/dist/catalog.js CHANGED
@@ -242,6 +242,36 @@ export const catalog = [
242
242
  exports: ['Diagram'],
243
243
  status: 'stable',
244
244
  },
245
+ {
246
+ name: 'PulseGraph',
247
+ slug: 'pulse-graph',
248
+ kind: 'component',
249
+ category: 'Data display',
250
+ description: 'A running system drawn as vector markup: named nodes, the edges between them, a marker travelling the sequence and a breathing focus. Token-driven and server-rendered, so it needs no client runtime.',
251
+ source: 'src/components/ui/pulse-graph.tsx',
252
+ exports: ['PulseGraph'],
253
+ status: 'stable',
254
+ },
255
+ {
256
+ name: 'PulseSeries',
257
+ slug: 'pulse-series',
258
+ kind: 'component',
259
+ category: 'Data display',
260
+ description: 'A live instrument: a series of columns rising out of a named baseline, with a reticle crossing them once per cycle. The values are the caller’s own.',
261
+ source: 'src/components/ui/pulse-series.tsx',
262
+ exports: ['PulseSeries'],
263
+ status: 'stable',
264
+ },
265
+ {
266
+ name: 'SignalField',
267
+ slug: 'signal-field',
268
+ kind: 'component',
269
+ category: 'Data display',
270
+ description: 'A field of marks: the atmosphere a figure is drawn over. Decorative by default and still unless asked to move.',
271
+ source: 'src/components/ui/signal-field.tsx',
272
+ exports: ['SignalField'],
273
+ status: 'stable',
274
+ },
245
275
  {
246
276
  name: 'ProductMark',
247
277
  slug: 'product-mark',
@@ -33,6 +33,12 @@ export { Tree } from './ui/tree';
33
33
  export type { TreeProps, TreeNode, TreeNodePage, TreeNodeGroup, TreeNodeDivider } from './ui/tree';
34
34
  export { Diagram } from './ui/diagram';
35
35
  export type { DiagramProps, DiagramNode, DiagramRelation } from './ui/diagram';
36
+ export { PulseGraph } from './ui/pulse-graph';
37
+ export type { PulseGraphProps, PulseNode, PulseRelation } from './ui/pulse-graph';
38
+ export { PulseSeries } from './ui/pulse-series';
39
+ export type { PulseSeriesProps, PulseBar } from './ui/pulse-series';
40
+ export { SignalField } from './ui/signal-field';
41
+ export type { SignalFieldProps } from './ui/signal-field';
36
42
  export { ProductMark } from './ui/product-mark';
37
43
  export type { ProductMarkProps, ProductMarkSize } from './ui/product-mark';
38
44
  export { Prose } from './ui/prose';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,9 @@ export { Kbd } from './ui/kbd';
27
27
  export { Mark } from './ui/mark';
28
28
  export { Tree } from './ui/tree';
29
29
  export { Diagram } from './ui/diagram';
30
+ export { PulseGraph } from './ui/pulse-graph';
31
+ export { PulseSeries } from './ui/pulse-series';
32
+ export { SignalField } from './ui/signal-field';
30
33
  export { ProductMark } from './ui/product-mark';
31
34
  export { Prose } from './ui/prose';
32
35
  export { FactList } from './ui/fact-list';
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAI3C,QAAA,MAAM,cAAc;;;8EAsDnB,CAAA;AAED;;;;;;GAMG;AACH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAO,EACP,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,+BAQhE;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAI3C,QAAA,MAAM,cAAc;;;8EAmEnB,CAAA;AAED;;;;;;GAMG;AACH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAO,EACP,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,+BAQhE;AAED,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -15,7 +15,20 @@ const buttonVariants = cva(
15
15
  variant: {
16
16
  default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',
17
17
  destructive: 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90',
18
- outline: 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',
18
+ // `outline` sets its own fill and must therefore set its own ink. It
19
+ // carried `bg-background` with no `text-` for its whole life, and the
20
+ // omission was invisible everywhere the ink was inherited from the page
21
+ // ground or a card, because `--foreground` and `--card-foreground` are
22
+ // equal in all twelve pack and mode combinations. On any other surface
23
+ // it silently inherited that surface's ink instead, and the variant was
24
+ // no longer the same button. `Cta01` is the case that shipped: a filled
25
+ // `bg-primary` panel with `--primary-foreground` inherited, in lavender
26
+ // dark, measured 1.01:1 and was unreadable while staying focusable and
27
+ // announced. The reason lives in `cta-link.tsx`, which is the surface
28
+ // that was drawn; this is the same string kept in step by hand, which is
29
+ // the arrangement this repository's JSDoc already records as the reason
30
+ // the two files are separate.
31
+ outline: 'border bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground',
19
32
  secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',
20
33
  ghost: 'hover:bg-accent hover:text-accent-foreground',
21
34
  // `primary` is a surface token, not a text token: in the pastel themes it
@@ -1 +1 @@
1
- {"version":3,"file":"cta-link.d.ts","sourceRoot":"","sources":["../../../src/components/ui/cta-link.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AA0B3C,QAAA,MAAM,eAAe;;;8EAsCpB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,GACrE,YAAY,CAAC,OAAO,eAAe,CAAC,GAAG;IACrC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,OAAO,CAAC,EACf,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,MAAc,EACd,GAAG,EACH,GAAG,KAAK,EACT,EAAE,YAAY,+BAWd;AAED,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"cta-link.d.ts","sourceRoot":"","sources":["../../../src/components/ui/cta-link.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AA0B3C,QAAA,MAAM,eAAe;;;8EAqDpB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,GACrE,YAAY,CAAC,OAAO,eAAe,CAAC,GAAG;IACrC;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,OAAO,CAAC,EACf,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,MAAc,EACd,GAAG,EACH,GAAG,KAAK,EACT,EAAE,YAAY,+BAWd;AAED,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -38,7 +38,22 @@ const ctaLinkVariants = cva(
38
38
  variants: {
39
39
  variant: {
40
40
  default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',
41
- outline: 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground',
41
+ // `outline` sets its own fill and must therefore set its own ink. It
42
+ // carried `bg-background` with no `text-` for its whole life, which made
43
+ // it placement-dependent: on the page ground and on a card the inherited
44
+ // ink is already `--foreground` (verified equal to `--card-foreground` in
45
+ // all twelve pack and mode combinations), so the omission was invisible.
46
+ // On a filled surface it is not. `Cta01` draws a `bg-primary` panel with
47
+ // `--primary-foreground` as the inherited ink and defaulted its second
48
+ // action to this variant, so in the lavender pack's dark mode the button
49
+ // was `--background` behind `--primary-foreground` and measured 1.01:1.
50
+ // The button was in the document, focusable, announced, and unreadable.
51
+ //
52
+ // The contract's own row already covers the pair this now states:
53
+ // `foreground` on `background`, 4.5:1, required, in every pack and mode.
54
+ // What was missing was the component asking for it, and a token pair
55
+ // cannot notice that a variant declined to use one.
56
+ outline: 'border bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground',
42
57
  secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',
43
58
  ghost: 'hover:bg-accent hover:text-accent-foreground',
44
59
  },
@@ -58,9 +58,9 @@ export type DiagramRelation = {
58
58
  /** What both arms of `DiagramProps` carry. */
59
59
  type DiagramFigure = {
60
60
  /** The things drawn. At least one, or the Diagram renders an empty canvas. */
61
- nodes: DiagramNode[];
61
+ nodes: readonly DiagramNode[];
62
62
  /** The relations drawn between them. A relation naming a node that is not in `nodes` is dropped. */
63
- relations: DiagramRelation[];
63
+ relations: readonly DiagramRelation[];
64
64
  /**
65
65
  * Layout only, exactly as on every Component: grid placement and width.
66
66
  * Changing a Prism-owned visual property from here is prohibited, and this
@@ -1 +1 @@
1
- {"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../../../src/components/ui/diagram.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,CAAC,EAAE,MAAM,CAAA;IACT,0EAA0E;IAC1E,CAAC,EAAE,MAAM,CAAA;IACT,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,8CAA8C;AAC9C,KAAK,aAAa,GAAG;IACnB,8EAA8E;IAC9E,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,oGAAoG;IACpG,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GACtC,CACI;IACE;;;;;OAKG;IACH,UAAU,EAAE,IAAI,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GACD;IACE,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,CACJ,CAAA;AAoFH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,iBAAS,OAAO,CAAC,EACf,KAAK,EACL,SAAS,EACT,KAAK,EACL,UAAkB,EAClB,SAAS,GACV,EAAE,YAAY,+BAsFd;AAED,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"diagram.d.ts","sourceRoot":"","sources":["../../../src/components/ui/diagram.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAA;IACV;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,CAAC,EAAE,MAAM,CAAA;IACT,0EAA0E;IAC1E,CAAC,EAAE,MAAM,CAAA;IACT,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,8CAA8C;AAC9C,KAAK,aAAa,GAAG;IACnB,8EAA8E;IAC9E,KAAK,EAAE,SAAS,WAAW,EAAE,CAAA;IAC7B,oGAAoG;IACpG,SAAS,EAAE,SAAS,eAAe,EAAE,CAAA;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GACtC,CACI;IACE;;;;;OAKG;IACH,UAAU,EAAE,IAAI,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GACD;IACE,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,CACJ,CAAA;AAoFH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,iBAAS,OAAO,CAAC,EACf,KAAK,EACL,SAAS,EACT,KAAK,EACL,UAAkB,EAClB,SAAS,GACV,EAAE,YAAY,+BAsFd;AAED,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * One named thing in a PulseGraph, at a position the caller chooses.
3
+ *
4
+ * The coordinate contract is `Diagram`'s, deliberately and unchanged: `x` and
5
+ * `y` are in the caller's own space and are fitted into the canvas, so fractions,
6
+ * pixels or any monotonic scale draw the same shape. A caller migrating a
7
+ * `Diagram` to a `PulseGraph` passes the identical array and only sees the
8
+ * difference in what the drawing does.
9
+ *
10
+ * `lane` is the one addition, and it is the reason this Component exists rather
11
+ * than a `Diagram` with a class added. A node on a lane is a stage in a
12
+ * sequence, which is a claim the drawing makes about the relationship between
13
+ * two nodes: this one runs before that one, and a marker is going to travel
14
+ * between them. A node with no lane is a point in a system with no stated
15
+ * order, and the graph draws it as one: no rail under it, nothing carried
16
+ * between it and anything else. Both shapes are wanted, and a single Component
17
+ * that can draw either is one item in the catalogue rather than two, and one
18
+ * fit, one canvas and one set of ink rules to keep true.
19
+ */
20
+ export type PulseNode = {
21
+ /** A key unique within the graph. Relations name a node by this. */
22
+ id: string;
23
+ /**
24
+ * The name printed beside the node. It is a label on a picture, so a screen
25
+ * reader does not read it; see `PulseGraphProps` for what carries the
26
+ * meaning.
27
+ */
28
+ name: string;
29
+ /** The node's position along the horizontal axis, in the caller's space. */
30
+ x: number;
31
+ /** The node's position along the vertical axis, in the caller's space. */
32
+ y: number;
33
+ /**
34
+ * The stage this node belongs to, as a number. Nodes sharing a lane are
35
+ * stages of one sequence and the marker travels between them in lane order.
36
+ * Omit it for a node that belongs to no sequence, which the drawing renders
37
+ * as a point in a field rather than a stop on a rail.
38
+ */
39
+ lane?: number;
40
+ /** Marks the node the drawing is about. See the Brand Ink Rule. */
41
+ emphasis?: boolean;
42
+ /**
43
+ * A second line under the name, in the mono face, for the thing that
44
+ * qualifies the node: a stage's role, a component's version, a window's
45
+ * cadence. It is drawn and not announced, on the same terms as `name`, and it
46
+ * is the reason a caller does not have to reach for a second component to
47
+ * put a caption under a node.
48
+ */
49
+ note?: string;
50
+ };
51
+ /**
52
+ * One relation between two nodes.
53
+ *
54
+ * `carries` is the difference from `Diagram`'s relation and the reason a
55
+ * caller reaches for this Component: a relation that carries something gets a
56
+ * marker travelling along it, and one that merely holds does not. That is the
57
+ * whole claim the graph makes about the pair, expressed as a property of the
58
+ * edge rather than inferred from whether a marker happens to be drawn there, so
59
+ * a reader who turns motion off can still read which edges were carrying.
60
+ */
61
+ export type PulseRelation = {
62
+ /** The `id` of the node the relation leaves. */
63
+ from: string;
64
+ /** The `id` of the node the relation arrives at. */
65
+ to: string;
66
+ /** Draws the line dashed, for a relation that holds but not by this route. */
67
+ indirect?: boolean;
68
+ /** The line carries a marker travelling from `from` to `to`. */
69
+ carries?: boolean;
70
+ };
71
+ /** What both arms of `PulseGraphProps` carry. */
72
+ type PulseFigure = {
73
+ /**
74
+ * The things drawn. At least one, or the graph renders an empty canvas. This
75
+ * is a claim the type makes rather than a runtime guard, because a figure
76
+ * with nothing in it is a mistake in the caller's data and not a state worth
77
+ * rendering a friendly empty message for.
78
+ */
79
+ nodes: readonly PulseNode[];
80
+ /**
81
+ * The relations drawn between them. A relation naming a node that is not in
82
+ * `nodes` is dropped, and the count of dropped relations is on the element as
83
+ * `data-unresolved-relations` rather than swallowed, because a line that
84
+ * silently did not draw is the failure this Component exists to make
85
+ * impossible.
86
+ */
87
+ relations?: readonly PulseRelation[];
88
+ /**
89
+ * Layout only, exactly as on every Component: grid placement and width.
90
+ * Changing a Prism-owned visual property from here is prohibited.
91
+ */
92
+ className?: string;
93
+ };
94
+ /**
95
+ * The props a PulseGraph takes.
96
+ *
97
+ * The name is required unless the drawing is decorative, and it is forbidden
98
+ * when it is. That is a union rather than `label?: string` for the reason
99
+ * `Diagram` states: only a union lets the type system see the exception.
100
+ */
101
+ export type PulseGraphProps = PulseFigure & ({
102
+ /**
103
+ * Hides the drawing from assistive technology and drops the name. Use it
104
+ * when the surrounding sentence already says what the graph shows, and
105
+ * nothing inside the hidden tree is named either.
106
+ */
107
+ decorative: true;
108
+ label?: never;
109
+ } | {
110
+ /** The name of the drawing, and the only thing a screen reader reads from it. */
111
+ label: string;
112
+ decorative?: false;
113
+ });
114
+ /**
115
+ * A graph of named things, the relations between them, and a marker travelling
116
+ * the sequence.
117
+ *
118
+ * This is the Component the four NaniSoft product sites each lost when they
119
+ * moved off the retired line, rebuilt rather than recovered. Their old heroes
120
+ * drew the right thing, in the wrong way: a `<canvas>` with a
121
+ * `requestAnimationFrame` loop, its colours read out of the DOM once at mount,
122
+ * and numbers invented by a sine hash so the drawing would have something to
123
+ * show. Every part of that was a defect with a real cost, and this file is the
124
+ * argument for each of them in turn.
125
+ *
126
+ * **It is a server Component.** No `'use client'`, no hook, no effect, no
127
+ * context, no runtime. The motion is CSS on the server-rendered markup, so a
128
+ * consumer gets a running figure in a static export with zero bytes of
129
+ * JavaScript, and `check-client-budget.mjs` keeps it off the client roster. The
130
+ * old heroes needed a client runtime on a static-export site; this one needs
131
+ * nothing.
132
+ *
133
+ * **It is SVG, not a canvas, and that is the pack-boundary reason.** A canvas
134
+ * paints pixels it has already resolved, and a `data-pack` boundary is an
135
+ * attribute on an ancestor, so a resolved value does not move when the pack
136
+ * beneath it does. Every stroke and fill below names a semantic token as a
137
+ * utility, so a scoped pack boundary above the drawing restyles it through the
138
+ * cascade exactly as it restyles a heading. This is why `check-vector-ink.mjs`
139
+ * scans this file.
140
+ *
141
+ * **Nothing is hidden and nothing waits.** No rule sets `opacity: 0`; the
142
+ * figure is complete and fully legible at first paint; and the animation only
143
+ * moves things that are already visible. A reader with scripting off, a slow
144
+ * connection, a print stylesheet, or a crawler sees the whole drawing. The
145
+ * reduced-motion block in the stylesheet is one `animation: none`, and because
146
+ * every element's resting state is its full form, that reader gets the same
147
+ * figure, still. This is the `hidden-state` gate's requirement met by the
148
+ * design rather than by an exception, which is why a consumer needs no
149
+ * exception to enable it.
150
+ *
151
+ * **The motion is the token scale's.** Every `prism-ambient-*` class reads its
152
+ * length from `var(--ambient-*)`; nothing in this file states a duration, an
153
+ * easing, or a keyframe name in a shorthand. The one distance this file does set
154
+ * is a geometry length in user units, because the keyframe that consumes it
155
+ * translates by a distance and that distance is a property of this drawing's
156
+ * coordinates rather than a timing.
157
+ *
158
+ * **What it will not do.** It does not invent data. The old canvas filled itself
159
+ * with a sine hash, and every site that shipped it inherited a chart of numbers
160
+ * nobody collected; a reader who screenshotted one and read the axis got a lie
161
+ * with a real typeface on it. Here, a node is a node a caller named, an edge is
162
+ * an edge a caller declared, and an empty graph is an empty graph. The motion
163
+ * says a system is running. It does not say what the numbers were.
164
+ *
165
+ * **The rail.** Nodes carrying a `lane` are stages of one sequence, and the
166
+ * graph draws a rail under them with a marker travelling it, so the order is
167
+ * visible as an order rather than inferred from left-to-right spacing. Nodes
168
+ * with no lane are a field: no rail, no marker, and every node present from the
169
+ * first frame. A graph may have both, and the rail then describes only the lanes
170
+ * that exist.
171
+ *
172
+ * **Accessibility.** `role="img"` with the `label` the caller passes, the same
173
+ * contract `Diagram` holds. Everything inside a `role="img"` is presentational,
174
+ * so node names and notes are drawn for sighted readers and the surrounding
175
+ * sentence is what a screen reader gets. Pass `decorative` when that sentence
176
+ * already says what the drawing shows.
177
+ *
178
+ * Positions are the caller's. The Component fits and draws, and it does not lay
179
+ * out a graph, so it cannot know that two labels will not collide. A relation
180
+ * naming a node that is not in `nodes` is dropped and counted on the element.
181
+ */
182
+ declare function PulseGraph({ nodes, relations, label, decorative, className, }: PulseGraphProps): import("react").JSX.Element;
183
+ export { PulseGraph };
184
+ //# sourceMappingURL=pulse-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pulse-graph.d.ts","sourceRoot":"","sources":["../../../src/components/ui/pulse-graph.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAA;IACV;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,CAAC,EAAE,MAAM,CAAA;IACT,0EAA0E;IAC1E,CAAC,EAAE,MAAM,CAAA;IACT;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,iDAAiD;AACjD,KAAK,WAAW,GAAG;IACjB;;;;;OAKG;IACH,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;IAC3B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GACvC,CACI;IACE;;;;OAIG;IACH,UAAU,EAAE,IAAI,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GACD;IACE,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB,CACJ,CAAA;AAsHH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,iBAAS,UAAU,CAAC,EAClB,KAAK,EACL,SAAc,EACd,KAAK,EACL,UAAkB,EAClB,SAAS,GACV,EAAE,eAAe,+BA4MjB;AAED,OAAO,EAAE,UAAU,EAAE,CAAA"}