@caqophony/ui 0.4.0 → 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.
@@ -37,7 +37,7 @@ interface BandProps {
37
37
  pad?: 'none' | 'tight' | 'section' | 'open';
38
38
  /** The previous band's `Vignette placement="hang"` hangs over this one's top edge. */
39
39
  under?: 'none' | 'overhang';
40
- /** This band's clouds sit over the seam, so bands meet as layers, not a ruled line. They rise into the band above's bottom padding, up to 108px (58px on a phone). */
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
41
  edge?: BandEdgeSpec;
42
42
  /** Layered behind the content, clipped to the band, hidden from assistive tech. */
43
43
  backdrop?: ReactNode;
@@ -74,6 +74,48 @@ interface FigureProps {
74
74
  /** An image slot that records the spec of the bitmap that will replace it. */
75
75
  declare function Figure({ spec, alt, children, fit }: FigureProps): react_jsx_runtime.JSX.Element;
76
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
+
77
119
  declare const GAP: {
78
120
  readonly 1: "gap-1";
79
121
  readonly 2: "gap-2";
@@ -126,8 +168,7 @@ interface SplitProps {
126
168
  /** Text beside media; stacks on a phone with the text first. */
127
169
  declare function Split({ ratio, reverse, gap, children }: SplitProps): react_jsx_runtime.JSX.Element;
128
170
  interface SpacerProps {
129
- /** `phone-sky`: room for the backdrop's picture on a phone, nothing from `md` up. */
130
- size: 'hero' | 'section' | 'phone-sky';
171
+ size: 'hero' | 'section';
131
172
  }
132
173
  /** Empty rhythm between two things that are not in one `Stack`. */
133
174
  declare function Spacer({ size }: SpacerProps): react_jsx_runtime.JSX.Element;
@@ -143,13 +184,34 @@ interface SkyFieldProps {
143
184
  height: number;
144
185
  /** Which part stays in view when the box's shape differs. */
145
186
  anchor: 'top' | 'center' | 'bottom' | 'right';
146
- /** Show only on a phone or only from `md` up. */
147
- only?: 'phone' | 'desktop';
148
- ground: Tone;
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';
149
193
  children: ReactNode;
150
194
  }
151
- /** A flat illustration field: an SVG that covers its box. */
152
- declare function SkyField({ width, height, anchor, only, ground, children, }: SkyFieldProps): react_jsx_runtime.JSX.Element;
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;
153
215
  interface HaloProps {
154
216
  cx: number;
155
217
  cy: number;
@@ -162,46 +224,87 @@ interface HaloProps {
162
224
  /** Concentric stepped rings: a sun, or any glow, as flat print layers. */
163
225
  declare function Halo({ cx, cy, rings }: HaloProps): react_jsx_runtime.JSX.Element;
164
226
  interface CloudBankProps {
165
- /** Field width and height. */
166
- width: number;
167
- height: number;
168
- /** The bank's top line. */
227
+ /** The bank's top line, in field units: it fills from here to the field's bottom. */
169
228
  y: number;
170
- /** Bump radius range: `min` at least 0.1, `max` no less than `min`, at most 2000 bumps. */
229
+ /** Bump radius range, in field units: `min` at least 0.1, `max` no less than `min`. */
171
230
  min: number;
172
231
  max: number;
173
- /** How far the top line climbs from the left edge to the right. */
232
+ /** How far the top line climbs from the left edge to the right, in field units. */
174
233
  climb?: number;
175
234
  /** Bumps wander around `y` instead of drifting from it: a long bank stays on its line. */
176
235
  level?: boolean;
177
236
  seed: number;
178
237
  tone: Tone;
179
238
  }
180
- /** A scalloped cloud bank running edge to edge and filled to the field's bottom. */
181
- declare function CloudBank({ width, height, y, min, max, climb, level, seed, tone, }: CloudBankProps): react_jsx_runtime.JSX.Element;
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;
182
268
  interface RidgeProps {
183
- width: number;
184
- height: number;
269
+ /** The ridge's base line, in field units: it fills from here to the field's bottom. */
185
270
  y: number;
186
- /** How high the ridge rolls above `y`. */
271
+ /** How high the ridge rolls above `y`, in field units. */
187
272
  rise: number;
188
273
  /** The number of swells across the field. */
189
274
  swells: number;
190
275
  seed: number;
191
276
  tone: Tone;
192
277
  }
193
- /** A smooth ridge line, filled to the field's bottom. */
194
- declare function Ridge({ width, height, y, rise, swells, seed, tone, }: RidgeProps): react_jsx_runtime.JSX.Element;
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;
195
293
  interface StarsProps {
196
- width: number;
197
- /** The band they scatter in, from the top. */
198
- height: number;
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;
199
296
  count: number;
200
297
  seed: number;
201
298
  tone: Tone;
202
299
  }
203
- /** A scatter of small dots. */
204
- declare function Stars({ width, height, count, seed, tone }: StarsProps): react_jsx_runtime.JSX.Element;
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;
205
308
  interface RoutePoint {
206
309
  x: number;
207
310
  y: number;
@@ -220,8 +323,241 @@ interface RouteLineProps {
220
323
  /** The label size, in field units. */
221
324
  labelSize: number;
222
325
  }
223
- /** A dashed route through waypoints, each marked by its state. */
224
- declare function RouteLine({ points, tone, markTone, labelSize, }: RouteLineProps): react_jsx_runtime.JSX.Element;
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
+ };
225
561
 
226
562
  interface DisplayProps {
227
563
  /** The scale step; `poster` is the page's one largest moment. */
@@ -276,4 +612,4 @@ interface WordmarkProps {
276
612
  /** A product name with its mark. */
277
613
  declare function Wordmark({ name, mark, href }: WordmarkProps): react_jsx_runtime.JSX.Element;
278
614
 
279
- export { Band, type BandEdgeSpec, type BandProps, CloudBank, type CloudBankProps, Columns, type ColumnsProps, Display, type DisplayProps, Figure, type FigureProps, type FigureSpec, type Gap, Halo, type HaloProps, Inline, type InlineProps, Inset, type InsetProps, Ridge, type RidgeProps, RouteLine, type RouteLineProps, type RoutePoint, 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 };
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 };