@caqophony/ui 0.3.1 → 0.5.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.
@@ -0,0 +1,615 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode, ReactElement } from 'react';
3
+ import { I as IconName } from './icon.d-DQqyySj2.mjs';
4
+ import 'lucide-react';
5
+
6
+ /**
7
+ * #5956 — the closed tone vocabulary of the material layer. Each tone is a
8
+ * theme token, derived per project from its brand (`deriveMaterialRamp`), so a
9
+ * theme change reaches every band, figure and field. Every class is written
10
+ * out in full so an app's Tailwind scan sees it. `Tone` is held to the ramp's
11
+ * own step list by `material-primitives-5956.test.ts`.
12
+ *
13
+ * `paper` and `ink` hold in dark mode, as a brand step does: art printed on
14
+ * white stays on white. `page` is the page's own surface, in either scheme: the
15
+ * tone for a band that should follow it, such as the one behind a footer.
16
+ *
17
+ * Published alone as `@caqophony/ui/material-tones`, with no client directive
18
+ * (`server-entries.json`), so a server component's art can read `FILL` and
19
+ * `STROKE`. It must import nothing: a shared chunk would carry the directive.
20
+ *
21
+ * Authored by Caqophony
22
+ */
23
+ type Tone = 'night-0' | 'night-1' | 'night-2' | 'sky-0' | 'sky-1' | 'sky-2' | 'sky-3' | 'sky-4' | 'glow' | 'glow-soft' | 'glow-pale' | 'canvas' | 'mist-1' | 'mist-2' | 'mist-3' | 'paper' | 'ink' | 'page';
24
+
25
+ interface BandEdgeSpec {
26
+ /** A layer of clouds behind this band's own. */
27
+ via?: Tone;
28
+ /** The same seed draws the same edge. */
29
+ seed: number;
30
+ }
31
+ interface BandProps {
32
+ /** The band's ground, a theme tone. */
33
+ tone: Tone;
34
+ /** Re-scope the library's tokens for the subtree: `night` turns every library component inside for a dark ground. */
35
+ surface?: 'day' | 'night';
36
+ /** Vertical rhythm. `none`: the content sets it. */
37
+ pad?: 'none' | 'tight' | 'section' | 'open';
38
+ /** The previous band's `Vignette placement="hang"` hangs over this one's top edge. */
39
+ under?: 'none' | 'overhang';
40
+ /** This band's clouds sit over the seam, so bands meet as layers, not a ruled line. They rise up to 108px (58px on a phone) into the band above, and a band of `pad` `none` or `tight` keeps clear of them. */
41
+ edge?: BandEdgeSpec;
42
+ /** Layered behind the content, clipped to the band, hidden from assistive tech. */
43
+ backdrop?: ReactNode;
44
+ /** Sit above the next band (its hanging `Vignette`). */
45
+ raised?: boolean;
46
+ id?: string;
47
+ children: ReactNode;
48
+ }
49
+ /** A full-bleed page section with a ground, a backdrop and a token surface. */
50
+ declare function Band({ tone, surface, pad, under, edge, backdrop, raised, id, children, }: BandProps): react_jsx_runtime.JSX.Element;
51
+
52
+ /** What a generated bitmap must be when it replaces this slot's stand-in. */
53
+ interface FigureSpec {
54
+ role: string;
55
+ aspect: '16:9' | '8:5' | '4:3' | '3:2' | '1:1' | '4:5' | 'full-bleed';
56
+ /** The theme tones the bitmap must stay inside. */
57
+ palette: readonly Tone[];
58
+ prompt: string;
59
+ }
60
+ interface FigureProps {
61
+ spec: FigureSpec;
62
+ /** Real alt text; empty only for decoration, which hides the content from assistive tech. */
63
+ alt: string;
64
+ /**
65
+ * The art slot: one element of the app's own art, which shows until the bitmap
66
+ * exists and must look finished. An element, not a component: this is a client
67
+ * entry, and a server component cannot pass a function across that boundary.
68
+ * The type pins the shape; `Art`, drawing checked data, pins the content.
69
+ */
70
+ children: ReactElement;
71
+ /** `fill`: stretch to the parent box (a backdrop). */
72
+ fit?: 'aspect' | 'fill';
73
+ }
74
+ /** An image slot that records the spec of the bitmap that will replace it. */
75
+ declare function Figure({ spec, alt, children, fit }: FigureProps): react_jsx_runtime.JSX.Element;
76
+
77
+ /**
78
+ * #5985 — the stacked subject zone's shape, width over height: 5:4. The
79
+ * design-tree catalog reads it from this export (by its literal type), so
80
+ * `check-tree`'s `stack-frame-ratio` and the author's prompt state the shape
81
+ * the zone is drawn in. The zone's class is `aspect-[5/4]`: a class cannot be
82
+ * interpolated, and a CSS variable set inline is one the class gate cannot see
83
+ * declared, so a browser test (`material-primitives-5956`) holds the drawn
84
+ * zone to this number, as `HEIGHT`'s `4rem` is held to the header.
85
+ */
86
+ declare const STACK_ZONE_RATIO = 1.25;
87
+ /**
88
+ * #5985 — the stacked zone's width at the narrowest view a page is judged at
89
+ * (390px): the zone is full width with no gutter. `check-tree`'s
90
+ * `art-text-min-size` scales a `stack` frame's text by it; a browser test holds
91
+ * it to the zone as drawn.
92
+ */
93
+ declare const STACK_ZONE_MIN_WIDTH = 390;
94
+ interface HeroSceneProps {
95
+ /**
96
+ * The hero's height from `lg` up, and both are minimums: taller copy grows it.
97
+ * `fold`: the first screen, below the header, up to 56rem. `tall`: 46rem.
98
+ */
99
+ height: 'fold' | 'tall';
100
+ /**
101
+ * The picture: a `Figure fit="fill"`. Its zone is a 5:4 box
102
+ * (`STACK_ZONE_RATIO`) in the stacked layout, and a column taller than wide, about 3:5 to 3:4, from `lg` up, so a
103
+ * piece of art draws a wide `only: "stack"` frame and a tall `only: "side"`
104
+ * frame, both `fit: "contain"`.
105
+ */
106
+ subject: ReactNode;
107
+ /**
108
+ * Which column holds the copy from `lg` up. Absent: `start`. #5985 round 2:
109
+ * the subject's fields read it, so a horizon piece in a side frame ends at the
110
+ * frame's edge toward the copy and runs on only away from it, and downward.
111
+ */
112
+ copySide?: 'start' | 'end';
113
+ /** The copy: its headline, its lede and its calls to action. */
114
+ children: ReactNode;
115
+ }
116
+ /** A hero with a stated height, its copy and its subject in zones of their own. */
117
+ declare function HeroScene({ height, subject, copySide, children, }: HeroSceneProps): react_jsx_runtime.JSX.Element;
118
+
119
+ declare const GAP: {
120
+ readonly 1: "gap-1";
121
+ readonly 2: "gap-2";
122
+ readonly 3: "gap-3";
123
+ readonly 4: "gap-4";
124
+ readonly 6: "gap-6";
125
+ readonly 8: "gap-8";
126
+ readonly 10: "gap-10";
127
+ readonly 12: "gap-12";
128
+ readonly 16: "gap-16";
129
+ };
130
+ type Gap = keyof typeof GAP;
131
+ interface StackProps {
132
+ gap: Gap;
133
+ align?: 'stretch' | 'start' | 'center';
134
+ children: ReactNode;
135
+ }
136
+ /** A vertical run with one gap. */
137
+ declare function Stack({ gap, align, children }: StackProps): react_jsx_runtime.JSX.Element;
138
+ interface InlineProps {
139
+ gap: Gap;
140
+ justify?: 'start' | 'between' | 'center';
141
+ align?: 'center' | 'start';
142
+ /** Below `sm`, each child takes the full width (a phone's CTA row). */
143
+ fillOnPhone?: boolean;
144
+ children: ReactNode;
145
+ }
146
+ /** A wrapping horizontal run. */
147
+ declare function Inline({ gap, justify, align, fillOnPhone, children, }: InlineProps): react_jsx_runtime.JSX.Element;
148
+ interface ColumnsProps {
149
+ /** The desktop column count. */
150
+ count: 2 | 3 | 4;
151
+ gap: Gap;
152
+ /** On a phone: `stack` one column; `scroll` keep the columns in a side-scrolling row. */
153
+ phone: 'stack' | 'scroll';
154
+ /** A dashed route from each column to the next, level with a 48px marker. */
155
+ connect?: boolean;
156
+ children: ReactNode;
157
+ }
158
+ /** Equal columns that know what they do on a phone. */
159
+ declare function Columns({ count, gap, phone, connect, children, }: ColumnsProps): react_jsx_runtime.JSX.Element;
160
+ interface SplitProps {
161
+ /** How the width divides between the first and second child. */
162
+ ratio: 'even' | 'text-media';
163
+ /** Draw the second child first from `md` up. */
164
+ reverse?: boolean;
165
+ gap: Gap;
166
+ children: readonly [ReactNode, ReactNode];
167
+ }
168
+ /** Text beside media; stacks on a phone with the text first. */
169
+ declare function Split({ ratio, reverse, gap, children }: SplitProps): react_jsx_runtime.JSX.Element;
170
+ interface SpacerProps {
171
+ size: 'hero' | 'section';
172
+ }
173
+ /** Empty rhythm between two things that are not in one `Stack`. */
174
+ declare function Spacer({ size }: SpacerProps): react_jsx_runtime.JSX.Element;
175
+ interface InsetProps {
176
+ pad: 3 | 4 | 6;
177
+ children: ReactNode;
178
+ }
179
+ /** Padding, for a library `Card` that has none without its header parts. */
180
+ declare function Inset({ pad, children }: InsetProps): react_jsx_runtime.JSX.Element;
181
+
182
+ interface SkyFieldProps {
183
+ width: number;
184
+ height: number;
185
+ /** Which part stays in view when the box's shape differs. */
186
+ anchor: 'top' | 'center' | 'bottom' | 'right';
187
+ /** `cover` fills the box and may cut the field; `contain` keeps all of it. Absent: `cover`. */
188
+ fit?: 'cover' | 'contain';
189
+ /** Show on one side of a cut only: `phone`/`desktop` at `md`, `stack`/`side` (a `HeroScene`'s subject) at `lg`. */
190
+ only?: 'phone' | 'desktop' | 'stack' | 'side';
191
+ /** `none`: no ground of its own, so a field can stand in a zone over the band's. */
192
+ ground: Tone | 'none';
193
+ children: ReactNode;
194
+ }
195
+ /** A field's size: the one writer is its `SkyField`. */
196
+ interface FieldSize {
197
+ width: number;
198
+ height: number;
199
+ }
200
+ /**
201
+ * #5985 round 2 — which way a field's horizon pieces run on past it. On a
202
+ * `close` side a piece ends at the frame's edge with a natural end (a bank's
203
+ * last bump, a ridge's slope, down to the field's bottom); `down` runs every
204
+ * fill on below the field's bottom.
205
+ */
206
+ interface FieldReach {
207
+ left: 'bleed' | 'close';
208
+ right: 'bleed' | 'close';
209
+ down: boolean;
210
+ }
211
+ /** A field outside a `HeroScene`, `Band`'s edge and the stored art: the bleed both ways, filled to the field's bottom. */
212
+ declare const BLEED_BOTH_SIDES: FieldReach;
213
+ /** A flat illustration field: an SVG in its box, as `fit` says. */
214
+ declare function SkyField({ width, height, anchor, fit, only, ground, children, }: SkyFieldProps): react_jsx_runtime.JSX.Element;
215
+ interface HaloProps {
216
+ cx: number;
217
+ cy: number;
218
+ /** Outermost first: each ring steps down the ramp, with no gradient. */
219
+ rings: ReadonlyArray<{
220
+ r: number;
221
+ tone: Tone;
222
+ }>;
223
+ }
224
+ /** Concentric stepped rings: a sun, or any glow, as flat print layers. */
225
+ declare function Halo({ cx, cy, rings }: HaloProps): react_jsx_runtime.JSX.Element;
226
+ interface CloudBankProps {
227
+ /** The bank's top line, in field units: it fills from here to the field's bottom. */
228
+ y: number;
229
+ /** Bump radius range, in field units: `min` at least 0.1, `max` no less than `min`. */
230
+ min: number;
231
+ max: number;
232
+ /** How far the top line climbs from the left edge to the right, in field units. */
233
+ climb?: number;
234
+ /** Bumps wander around `y` instead of drifting from it: a long bank stays on its line. */
235
+ level?: boolean;
236
+ seed: number;
237
+ tone: Tone;
238
+ }
239
+ /**
240
+ * The one writer of a cloud bank's outline, for `CloudBank`, `Band`'s edge and
241
+ * the stored art's generator: paths of one tone, painted in this order.
242
+ *
243
+ * 1. the left bleed, `BLEED_WIDTHS` field-widths out, from a second stream
244
+ * drawn leftward;
245
+ * 2. the right bleed, the frame's stream carried on as far past;
246
+ * 3. the frame's run, from `-max` to just past the right edge, filled to the
247
+ * field's bottom: byte for byte the path drawn before the bleed (#5985).
248
+ *
249
+ * The frame's run is its own path, painted last, so under `cover` no pixel in
250
+ * view moves: one longer path rasterises its edges a shade differently at small
251
+ * scales. Each bleed reaches under the run by half a `max`, below a diagonal
252
+ * the run's bumps rise away from, so no seam shows where they meet under
253
+ * `contain`, and no start edge lands in a zone.
254
+ *
255
+ * #5985 round 2 — `reach` (a `HeroScene`'s field): `down` fills every path on
256
+ * `DOWN_SHARE` of a field-height below the field's bottom, and a `close` side
257
+ * has no bleed: the run ends with a last bump, a quarter ellipse from the run's
258
+ * top down to the frame's edge at the foot of that fill, at least a `max` wide,
259
+ * so it never stands as a straight edge.
260
+ */
261
+ declare function cloudBankPaths(field: FieldSize, bank: Omit<CloudBankProps, 'tone'>, reach: FieldReach): readonly string[];
262
+ /**
263
+ * A scalloped cloud bank across its field, filled to the field's bottom.
264
+ * `data-scene-piece` names a horizon piece for the rendered check that it spans
265
+ * its zone.
266
+ */
267
+ declare function CloudBank({ tone, ...bank }: CloudBankProps): react_jsx_runtime.JSX.Element;
268
+ interface RidgeProps {
269
+ /** The ridge's base line, in field units: it fills from here to the field's bottom. */
270
+ y: number;
271
+ /** How high the ridge rolls above `y`, in field units. */
272
+ rise: number;
273
+ /** The number of swells across the field. */
274
+ swells: number;
275
+ seed: number;
276
+ tone: Tone;
277
+ }
278
+ /**
279
+ * The one writer of a ridge's outline. Swells `0..n-1` are the ones drawn
280
+ * before the bleed (#5985); the same stream carries on `BLEED_WIDTHS` widths to
281
+ * the right, and as many widths of swells from a second stream lead in from the
282
+ * left, ending on `y`. One path: no stored art draws a ridge, so there are no
283
+ * pixels from before to keep.
284
+ *
285
+ * #5985 round 2 — `down` fills on `DOWN_SHARE` of a field-height below the
286
+ * field's bottom; on a `close` side (a `HeroScene`'s field, toward its copy)
287
+ * there is no bleed: the swell at the edge slopes down to the frame's edge at
288
+ * the foot of that fill.
289
+ */
290
+ declare function ridgePath(field: FieldSize, ridge: Omit<RidgeProps, 'tone'>, reach: FieldReach): string;
291
+ /** A smooth ridge line across its field, filled to the field's bottom. */
292
+ declare function Ridge({ tone, ...ridge }: RidgeProps): react_jsx_runtime.JSX.Element;
293
+ interface StarsProps {
294
+ /** How far down from the field's top they scatter: a fraction of the field's height, above 0 and at most 1. */
295
+ depth: number;
296
+ count: number;
297
+ seed: number;
298
+ tone: Tone;
299
+ }
300
+ /** The one writer of where stars fall: across the field's width, down to `depth` of its height. */
301
+ declare function starDots(field: FieldSize, { depth, count, seed }: Omit<StarsProps, 'tone'>): {
302
+ cx: string;
303
+ cy: string;
304
+ r: string;
305
+ }[];
306
+ /** A scatter of small dots across the field. */
307
+ declare function Stars({ tone, ...stars }: StarsProps): react_jsx_runtime.JSX.Element;
308
+ interface RoutePoint {
309
+ x: number;
310
+ y: number;
311
+ label?: string;
312
+ /** Which side of the point its label sits. */
313
+ side?: 'above' | 'below' | 'left' | 'right';
314
+ /** `passed`: filled; `here`: ringed; `ahead`: hollow. */
315
+ state: 'passed' | 'here' | 'ahead';
316
+ }
317
+ interface RouteLineProps {
318
+ /** The waypoints, in order: at least one. */
319
+ points: readonly [RoutePoint, ...RoutePoint[]];
320
+ tone: Tone;
321
+ /** The halo behind a `here` point and the fill of `ahead` points. */
322
+ markTone: Tone;
323
+ /** The label size, in field units. */
324
+ labelSize: number;
325
+ }
326
+ /**
327
+ * A dashed route through waypoints, each marked by its state. Its line and
328
+ * marks draw where it stands among the pieces; its labels draw in its field's
329
+ * top layer (`SkyField` draws each direct `RouteLine` child again there), so no
330
+ * piece paints over a word.
331
+ */
332
+ declare function RouteLine({ points, tone, markTone, labelSize, }: RouteLineProps): react_jsx_runtime.JSX.Element | null;
333
+
334
+ /**
335
+ * #5985 round 2 — the unit and the range of every number a scene piece takes,
336
+ * written once. The pieces (`sky.tsx`) hold each number to its range at render,
337
+ * with an exact error; the design-tree catalog reads this table from its
338
+ * literal type, so the catalogue line the author reads states the unit and the
339
+ * range, and the check (`scene-range`) names a number past it before anything
340
+ * renders. A key `list.field` is a field of each entry of a list prop.
341
+ *
342
+ * A bound is a number, or a multiple of the field's own width or height: a
343
+ * halo's centre stays in its field whatever size the author draws it at.
344
+ * `Stars depth={0.6}` (gencheck-2 mise-b) was read as 0.6 field units and drew
345
+ * a line of dots: a number with no stated unit is a guess on both sides.
346
+ *
347
+ * Imports nothing, so the catalog reads it with no JSX.
348
+ *
349
+ * Authored by Caqophony
350
+ */
351
+ /** A bound of a range: a number, or `times` the field's `of`. */
352
+ type SceneBound = number | {
353
+ readonly of: 'width' | 'height';
354
+ readonly times: number;
355
+ };
356
+ interface SceneMeasure {
357
+ /** What one of the number is, as the author reads it. */
358
+ readonly unit: string;
359
+ /** A whole number only. */
360
+ readonly whole: boolean;
361
+ readonly min: SceneBound;
362
+ /** `min` itself is outside the range. */
363
+ readonly minOpen: boolean;
364
+ /** Inclusive; null: no upper bound. */
365
+ readonly max: SceneBound | null;
366
+ }
367
+ declare const SCENE_MEASURES: {
368
+ readonly SkyField: {
369
+ readonly width: {
370
+ readonly unit: "field units, the frame's own coordinates";
371
+ readonly whole: false;
372
+ readonly min: 0;
373
+ readonly minOpen: true;
374
+ readonly max: null;
375
+ };
376
+ readonly height: {
377
+ readonly unit: "field units, the frame's own coordinates";
378
+ readonly whole: false;
379
+ readonly min: 0;
380
+ readonly minOpen: true;
381
+ readonly max: null;
382
+ };
383
+ };
384
+ readonly Halo: {
385
+ readonly cx: {
386
+ readonly unit: "field units";
387
+ readonly whole: false;
388
+ readonly min: 0;
389
+ readonly minOpen: false;
390
+ readonly max: {
391
+ readonly of: "width";
392
+ readonly times: 1;
393
+ };
394
+ };
395
+ readonly cy: {
396
+ readonly unit: "field units";
397
+ readonly whole: false;
398
+ readonly min: 0;
399
+ readonly minOpen: false;
400
+ readonly max: {
401
+ readonly of: "height";
402
+ readonly times: 1;
403
+ };
404
+ };
405
+ readonly 'rings.r': {
406
+ readonly unit: "field units";
407
+ readonly whole: false;
408
+ readonly min: 0;
409
+ readonly minOpen: true;
410
+ readonly max: {
411
+ readonly of: "width";
412
+ readonly times: 1;
413
+ };
414
+ };
415
+ };
416
+ readonly CloudBank: {
417
+ readonly y: {
418
+ readonly unit: "field units";
419
+ readonly whole: false;
420
+ readonly min: 0;
421
+ readonly minOpen: false;
422
+ readonly max: {
423
+ readonly of: "height";
424
+ readonly times: 1;
425
+ };
426
+ };
427
+ /** Below 0.1 a radius rounds to 0.0 in the path's one decimal. */
428
+ readonly min: {
429
+ readonly unit: "field units";
430
+ readonly whole: false;
431
+ readonly min: 0.1;
432
+ readonly minOpen: false;
433
+ readonly max: {
434
+ readonly of: "height";
435
+ readonly times: 1;
436
+ };
437
+ };
438
+ readonly max: {
439
+ readonly unit: "field units";
440
+ readonly whole: false;
441
+ readonly min: 0.1;
442
+ readonly minOpen: false;
443
+ readonly max: {
444
+ readonly of: "height";
445
+ readonly times: 1;
446
+ };
447
+ };
448
+ readonly climb: {
449
+ readonly unit: "field units";
450
+ readonly whole: false;
451
+ readonly min: {
452
+ readonly of: "height";
453
+ readonly times: -1;
454
+ };
455
+ readonly minOpen: false;
456
+ readonly max: {
457
+ readonly of: "height";
458
+ readonly times: 1;
459
+ };
460
+ };
461
+ readonly seed: {
462
+ readonly unit: "a seed: the same one draws the same shape";
463
+ readonly whole: true;
464
+ readonly min: 0;
465
+ readonly minOpen: false;
466
+ readonly max: 2147483646;
467
+ };
468
+ };
469
+ readonly Ridge: {
470
+ readonly y: {
471
+ readonly unit: "field units";
472
+ readonly whole: false;
473
+ readonly min: 0;
474
+ readonly minOpen: false;
475
+ readonly max: {
476
+ readonly of: "height";
477
+ readonly times: 1;
478
+ };
479
+ };
480
+ readonly rise: {
481
+ readonly unit: "field units";
482
+ readonly whole: false;
483
+ readonly min: 0;
484
+ readonly minOpen: false;
485
+ readonly max: {
486
+ readonly of: "height";
487
+ readonly times: 1;
488
+ };
489
+ };
490
+ readonly swells: {
491
+ readonly unit: "swells across the field";
492
+ readonly whole: true;
493
+ readonly min: 1;
494
+ readonly minOpen: false;
495
+ readonly max: 512;
496
+ };
497
+ readonly seed: {
498
+ readonly unit: "a seed: the same one draws the same shape";
499
+ readonly whole: true;
500
+ readonly min: 0;
501
+ readonly minOpen: false;
502
+ readonly max: 2147483646;
503
+ };
504
+ };
505
+ readonly Stars: {
506
+ readonly depth: {
507
+ readonly unit: "a fraction of the field's height";
508
+ readonly whole: false;
509
+ readonly min: 0;
510
+ readonly minOpen: true;
511
+ readonly max: 1;
512
+ };
513
+ readonly count: {
514
+ readonly unit: "stars";
515
+ readonly whole: true;
516
+ readonly min: 0;
517
+ readonly minOpen: false;
518
+ readonly max: 5000;
519
+ };
520
+ readonly seed: {
521
+ readonly unit: "a seed: the same one draws the same shape";
522
+ readonly whole: true;
523
+ readonly min: 0;
524
+ readonly minOpen: false;
525
+ readonly max: 2147483646;
526
+ };
527
+ };
528
+ readonly RouteLine: {
529
+ readonly 'points.x': {
530
+ readonly unit: "field units";
531
+ readonly whole: false;
532
+ readonly min: 0;
533
+ readonly minOpen: false;
534
+ readonly max: {
535
+ readonly of: "width";
536
+ readonly times: 1;
537
+ };
538
+ };
539
+ readonly 'points.y': {
540
+ readonly unit: "field units";
541
+ readonly whole: false;
542
+ readonly min: 0;
543
+ readonly minOpen: false;
544
+ readonly max: {
545
+ readonly of: "height";
546
+ readonly times: 1;
547
+ };
548
+ };
549
+ readonly labelSize: {
550
+ readonly unit: "field units";
551
+ readonly whole: false;
552
+ readonly min: 0;
553
+ readonly minOpen: true;
554
+ readonly max: {
555
+ readonly of: "height";
556
+ readonly times: 1;
557
+ };
558
+ };
559
+ };
560
+ };
561
+
562
+ interface DisplayProps {
563
+ /** The scale step; `poster` is the page's one largest moment. */
564
+ level: 'poster' | 'headline' | 'title';
565
+ /** The heading element (the document outline, separate from the size). */
566
+ as: 'h1' | 'h2' | 'h3';
567
+ align?: 'start' | 'center';
568
+ /** The line-length cap, in `ch` steps of the scale. */
569
+ measure?: 'narrow' | 'wide' | 'none';
570
+ children: ReactNode;
571
+ }
572
+ /** Display type: the theme's heading face on the display scale. */
573
+ declare function Display({ level, as: Tag, align, measure, children, }: DisplayProps): react_jsx_runtime.JSX.Element;
574
+ interface TextProps {
575
+ size?: 'lede' | 'body' | 'small' | 'micro';
576
+ tone?: 'default' | 'muted' | 'accent';
577
+ weight?: 'normal' | 'medium' | 'bold';
578
+ align?: 'start' | 'center';
579
+ /** Cap the line length for reading. */
580
+ measure?: boolean;
581
+ as?: 'p' | 'span' | 'div';
582
+ children: ReactNode;
583
+ }
584
+ /** Running text on the theme's body face. */
585
+ declare function Text({ size, tone, weight, align, measure, as: Tag, children, }: TextProps): react_jsx_runtime.JSX.Element;
586
+
587
+ interface VignetteProps {
588
+ /** The screen's name in the title bar, as the product calls it. */
589
+ title: string;
590
+ /** The title bar's icon. */
591
+ icon: IconName;
592
+ /** Marks the content as sample; required, a product view never makes a claim. */
593
+ sampleLabel: string;
594
+ /** The token surface inside the frame: the page's own tokens, or the night band's. */
595
+ surface?: 'day' | 'night';
596
+ /** `hang`: pull the frame over the band below it. */
597
+ placement?: 'inline' | 'hang';
598
+ /** `bottom`: cut the view off at a fixed height, fading out, as a crop. */
599
+ crop?: 'none' | 'bottom';
600
+ /** Real library components at their real size. */
601
+ children: ReactNode;
602
+ }
603
+ /** A raised window holding real library components, marked as sample. */
604
+ declare function Vignette({ title, icon, sampleLabel, surface, placement, crop, children, }: VignetteProps): react_jsx_runtime.JSX.Element;
605
+
606
+ interface WordmarkProps {
607
+ name: string;
608
+ /** The product's mark, drawn in `currentColor` in a 24px box. */
609
+ mark: ReactNode;
610
+ href: string;
611
+ }
612
+ /** A product name with its mark. */
613
+ declare function Wordmark({ name, mark, href }: WordmarkProps): react_jsx_runtime.JSX.Element;
614
+
615
+ export { BLEED_BOTH_SIDES, Band, type BandEdgeSpec, type BandProps, CloudBank, type CloudBankProps, Columns, type ColumnsProps, Display, type DisplayProps, type FieldReach, type FieldSize, Figure, type FigureProps, type FigureSpec, type Gap, Halo, type HaloProps, HeroScene, type HeroSceneProps, Inline, type InlineProps, Inset, type InsetProps, Ridge, type RidgeProps, RouteLine, type RouteLineProps, type RoutePoint, SCENE_MEASURES, STACK_ZONE_MIN_WIDTH, STACK_ZONE_RATIO, type SceneBound, type SceneMeasure, SkyField, type SkyFieldProps, Spacer, type SpacerProps, Split, type SplitProps, Stack, type StackProps, Stars, type StarsProps, Text, type TextProps, type Tone, Vignette, type VignetteProps, Wordmark, type WordmarkProps, cloudBankPaths, ridgePath, starDots };