@caqophony/ui 0.4.0 → 0.5.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.
@@ -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,33 @@ 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 — how far a field's horizon pieces run on past it: every piece
202
+ * bleeds both ways (`BLEED_WIDTHS`), and `down` runs every fill on below the
203
+ * field's bottom. #5997 retired the copy-side end (`close`): the approved port
204
+ * runs its ground the hero's full width, under the copy, and an end inside the
205
+ * scene showed as a tongue on every generated hero (generation check 7, 4 of 4).
206
+ */
207
+ interface FieldReach {
208
+ down: boolean;
209
+ }
210
+ /** A field outside a `HeroScene`, `Band`'s edge and the stored art: the bleed both ways, filled to the field's bottom. */
211
+ declare const BLEED_BOTH_SIDES: FieldReach;
212
+ /** A flat illustration field: an SVG in its box, as `fit` says. */
213
+ declare function SkyField({ width, height, anchor, fit, only, ground, children, }: SkyFieldProps): react_jsx_runtime.JSX.Element;
153
214
  interface HaloProps {
154
215
  cx: number;
155
216
  cy: number;
@@ -162,51 +223,91 @@ interface HaloProps {
162
223
  /** Concentric stepped rings: a sun, or any glow, as flat print layers. */
163
224
  declare function Halo({ cx, cy, rings }: HaloProps): react_jsx_runtime.JSX.Element;
164
225
  interface CloudBankProps {
165
- /** Field width and height. */
166
- width: number;
167
- height: number;
168
- /** The bank's top line. */
226
+ /** The bank's top line, in field units: it fills from here to the field's bottom. */
169
227
  y: number;
170
- /** Bump radius range: `min` at least 0.1, `max` no less than `min`, at most 2000 bumps. */
228
+ /** Bump radius range, in field units: `min` at least 0.1, `max` no less than `min`. */
171
229
  min: number;
172
230
  max: number;
173
- /** How far the top line climbs from the left edge to the right. */
231
+ /** How far the top line climbs from the left edge to the right, in field units. */
174
232
  climb?: number;
175
233
  /** Bumps wander around `y` instead of drifting from it: a long bank stays on its line. */
176
234
  level?: boolean;
177
235
  seed: number;
178
236
  tone: Tone;
179
237
  }
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;
238
+ /**
239
+ * The one writer of a cloud bank's outline, for `CloudBank`, `Band`'s edge and
240
+ * the stored art's generator: paths of one tone, painted in this order.
241
+ *
242
+ * 1. the left bleed, `BLEED_WIDTHS` field-widths out, from a second stream
243
+ * drawn leftward;
244
+ * 2. the right bleed, the frame's stream carried on as far past;
245
+ * 3. the frame's run, from `-max` to just past the right edge, filled to the
246
+ * field's bottom: byte for byte the path drawn before the bleed (#5985).
247
+ *
248
+ * The frame's run is its own path, painted last, so under `cover` no pixel in
249
+ * view moves: one longer path rasterises its edges a shade differently at small
250
+ * scales. Each bleed reaches under the run by half a `max`, below a diagonal
251
+ * the run's bumps rise away from, so no seam shows where they meet under
252
+ * `contain`, and no start edge lands in a zone.
253
+ *
254
+ * #5985 round 2 — `reach` (a `HeroScene`'s field): `down` fills every path on
255
+ * `DOWN_SHARE` of a field-height below the field's bottom.
256
+ */
257
+ declare function cloudBankPaths(field: FieldSize, bank: Omit<CloudBankProps, 'tone'>, reach: FieldReach): readonly string[];
258
+ /**
259
+ * A scalloped cloud bank across its field, filled to the field's bottom.
260
+ * `data-scene-piece` names a horizon piece for the rendered check that it spans
261
+ * its zone.
262
+ */
263
+ declare function CloudBank({ tone, ...bank }: CloudBankProps): react_jsx_runtime.JSX.Element;
182
264
  interface RidgeProps {
183
- width: number;
184
- height: number;
265
+ /** The ridge's base line, in field units: it fills from here to the field's bottom. */
185
266
  y: number;
186
- /** How high the ridge rolls above `y`. */
267
+ /** How high the ridge rolls above `y`, in field units. */
187
268
  rise: number;
188
269
  /** The number of swells across the field. */
189
270
  swells: number;
190
271
  seed: number;
191
272
  tone: Tone;
192
273
  }
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;
274
+ /**
275
+ * The one writer of a ridge's outline. Swells `0..n-1` are the ones drawn
276
+ * before the bleed (#5985); the same stream carries on `BLEED_WIDTHS` widths to
277
+ * the right, and as many widths of swells from a second stream lead in from the
278
+ * left, ending on `y`. One path: no stored art draws a ridge, so there are no
279
+ * pixels from before to keep.
280
+ *
281
+ * #5985 round 2 — `down` fills on `DOWN_SHARE` of a field-height below the
282
+ * field's bottom.
283
+ */
284
+ declare function ridgePath(field: FieldSize, ridge: Omit<RidgeProps, 'tone'>, reach: FieldReach): string;
285
+ /** A smooth ridge line across its field, filled to the field's bottom. */
286
+ declare function Ridge({ tone, ...ridge }: RidgeProps): react_jsx_runtime.JSX.Element;
195
287
  interface StarsProps {
196
- width: number;
197
- /** The band they scatter in, from the top. */
198
- height: number;
288
+ /** How far down from the field's top they scatter: a fraction of the field's height, above 0 and at most 1. */
289
+ depth: number;
199
290
  count: number;
200
291
  seed: number;
201
292
  tone: Tone;
202
293
  }
203
- /** A scatter of small dots. */
204
- declare function Stars({ width, height, count, seed, tone }: StarsProps): react_jsx_runtime.JSX.Element;
294
+ /** The one writer of where stars fall: across the field's width, down to `depth` of its height. */
295
+ declare function starDots(field: FieldSize, { depth, count, seed }: Omit<StarsProps, 'tone'>): {
296
+ cx: string;
297
+ cy: string;
298
+ r: string;
299
+ }[];
300
+ /** A scatter of small dots across the field. */
301
+ declare function Stars({ tone, ...stars }: StarsProps): react_jsx_runtime.JSX.Element;
205
302
  interface RoutePoint {
206
303
  x: number;
207
304
  y: number;
208
305
  label?: string;
209
- /** Which side of the point its label sits. */
306
+ /**
307
+ * Which side of the point its label sits, first: the route keeps it unless
308
+ * the label would cross another or a mark, or leave the field, and then
309
+ * places it on the first side clear of them (#5997).
310
+ */
210
311
  side?: 'above' | 'below' | 'left' | 'right';
211
312
  /** `passed`: filled; `here`: ringed; `ahead`: hollow. */
212
313
  state: 'passed' | 'here' | 'ahead';
@@ -220,8 +321,241 @@ interface RouteLineProps {
220
321
  /** The label size, in field units. */
221
322
  labelSize: number;
222
323
  }
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;
324
+ /**
325
+ * A dashed route through waypoints, each marked by its state. Its line and
326
+ * marks draw where it stands among the pieces; its labels draw in its field's
327
+ * top layer (`SkyField` draws each direct `RouteLine` child again there), so no
328
+ * piece paints over a word.
329
+ */
330
+ declare function RouteLine({ points, tone, markTone, labelSize, }: RouteLineProps): react_jsx_runtime.JSX.Element | null;
331
+
332
+ /**
333
+ * #5985 round 2 — the unit and the range of every number a scene piece takes,
334
+ * written once. The pieces (`sky.tsx`) hold each number to its range at render,
335
+ * with an exact error; the design-tree catalog reads this table from its
336
+ * literal type, so the catalogue line the author reads states the unit and the
337
+ * range, and the check (`scene-range`) names a number past it before anything
338
+ * renders. A key `list.field` is a field of each entry of a list prop.
339
+ *
340
+ * A bound is a number, or a multiple of the field's own width or height: a
341
+ * halo's centre stays in its field whatever size the author draws it at.
342
+ * `Stars depth={0.6}` (gencheck-2 mise-b) was read as 0.6 field units and drew
343
+ * a line of dots: a number with no stated unit is a guess on both sides.
344
+ *
345
+ * Imports nothing, so the catalog reads it with no JSX.
346
+ *
347
+ * Authored by Caqophony
348
+ */
349
+ /** A bound of a range: a number, or `times` the field's `of`. */
350
+ type SceneBound = number | {
351
+ readonly of: 'width' | 'height';
352
+ readonly times: number;
353
+ };
354
+ interface SceneMeasure {
355
+ /** What one of the number is, as the author reads it. */
356
+ readonly unit: string;
357
+ /** A whole number only. */
358
+ readonly whole: boolean;
359
+ readonly min: SceneBound;
360
+ /** `min` itself is outside the range. */
361
+ readonly minOpen: boolean;
362
+ /** Inclusive; null: no upper bound. */
363
+ readonly max: SceneBound | null;
364
+ }
365
+ declare const SCENE_MEASURES: {
366
+ readonly SkyField: {
367
+ readonly width: {
368
+ readonly unit: "field units, the frame's own coordinates";
369
+ readonly whole: false;
370
+ readonly min: 0;
371
+ readonly minOpen: true;
372
+ readonly max: null;
373
+ };
374
+ readonly height: {
375
+ readonly unit: "field units, the frame's own coordinates";
376
+ readonly whole: false;
377
+ readonly min: 0;
378
+ readonly minOpen: true;
379
+ readonly max: null;
380
+ };
381
+ };
382
+ readonly Halo: {
383
+ readonly cx: {
384
+ readonly unit: "field units";
385
+ readonly whole: false;
386
+ readonly min: 0;
387
+ readonly minOpen: false;
388
+ readonly max: {
389
+ readonly of: "width";
390
+ readonly times: 1;
391
+ };
392
+ };
393
+ readonly cy: {
394
+ readonly unit: "field units";
395
+ readonly whole: false;
396
+ readonly min: 0;
397
+ readonly minOpen: false;
398
+ readonly max: {
399
+ readonly of: "height";
400
+ readonly times: 1;
401
+ };
402
+ };
403
+ readonly 'rings.r': {
404
+ readonly unit: "field units";
405
+ readonly whole: false;
406
+ readonly min: 0;
407
+ readonly minOpen: true;
408
+ readonly max: {
409
+ readonly of: "width";
410
+ readonly times: 1;
411
+ };
412
+ };
413
+ };
414
+ readonly CloudBank: {
415
+ readonly y: {
416
+ readonly unit: "field units";
417
+ readonly whole: false;
418
+ readonly min: 0;
419
+ readonly minOpen: false;
420
+ readonly max: {
421
+ readonly of: "height";
422
+ readonly times: 1;
423
+ };
424
+ };
425
+ /** Below 0.1 a radius rounds to 0.0 in the path's one decimal. */
426
+ readonly min: {
427
+ readonly unit: "field units";
428
+ readonly whole: false;
429
+ readonly min: 0.1;
430
+ readonly minOpen: false;
431
+ readonly max: {
432
+ readonly of: "height";
433
+ readonly times: 1;
434
+ };
435
+ };
436
+ readonly max: {
437
+ readonly unit: "field units";
438
+ readonly whole: false;
439
+ readonly min: 0.1;
440
+ readonly minOpen: false;
441
+ readonly max: {
442
+ readonly of: "height";
443
+ readonly times: 1;
444
+ };
445
+ };
446
+ readonly climb: {
447
+ readonly unit: "field units";
448
+ readonly whole: false;
449
+ readonly min: {
450
+ readonly of: "height";
451
+ readonly times: -1;
452
+ };
453
+ readonly minOpen: false;
454
+ readonly max: {
455
+ readonly of: "height";
456
+ readonly times: 1;
457
+ };
458
+ };
459
+ readonly seed: {
460
+ readonly unit: "a seed: the same one draws the same shape";
461
+ readonly whole: true;
462
+ readonly min: 0;
463
+ readonly minOpen: false;
464
+ readonly max: 2147483646;
465
+ };
466
+ };
467
+ readonly Ridge: {
468
+ readonly y: {
469
+ readonly unit: "field units";
470
+ readonly whole: false;
471
+ readonly min: 0;
472
+ readonly minOpen: false;
473
+ readonly max: {
474
+ readonly of: "height";
475
+ readonly times: 1;
476
+ };
477
+ };
478
+ readonly rise: {
479
+ readonly unit: "field units";
480
+ readonly whole: false;
481
+ readonly min: 0;
482
+ readonly minOpen: false;
483
+ readonly max: {
484
+ readonly of: "height";
485
+ readonly times: 1;
486
+ };
487
+ };
488
+ readonly swells: {
489
+ readonly unit: "swells across the field";
490
+ readonly whole: true;
491
+ readonly min: 1;
492
+ readonly minOpen: false;
493
+ readonly max: 512;
494
+ };
495
+ readonly seed: {
496
+ readonly unit: "a seed: the same one draws the same shape";
497
+ readonly whole: true;
498
+ readonly min: 0;
499
+ readonly minOpen: false;
500
+ readonly max: 2147483646;
501
+ };
502
+ };
503
+ readonly Stars: {
504
+ readonly depth: {
505
+ readonly unit: "a fraction of the field's height";
506
+ readonly whole: false;
507
+ readonly min: 0;
508
+ readonly minOpen: true;
509
+ readonly max: 1;
510
+ };
511
+ readonly count: {
512
+ readonly unit: "stars";
513
+ readonly whole: true;
514
+ readonly min: 0;
515
+ readonly minOpen: false;
516
+ readonly max: 5000;
517
+ };
518
+ readonly seed: {
519
+ readonly unit: "a seed: the same one draws the same shape";
520
+ readonly whole: true;
521
+ readonly min: 0;
522
+ readonly minOpen: false;
523
+ readonly max: 2147483646;
524
+ };
525
+ };
526
+ readonly RouteLine: {
527
+ readonly 'points.x': {
528
+ readonly unit: "field units";
529
+ readonly whole: false;
530
+ readonly min: 0;
531
+ readonly minOpen: false;
532
+ readonly max: {
533
+ readonly of: "width";
534
+ readonly times: 1;
535
+ };
536
+ };
537
+ readonly 'points.y': {
538
+ readonly unit: "field units";
539
+ readonly whole: false;
540
+ readonly min: 0;
541
+ readonly minOpen: false;
542
+ readonly max: {
543
+ readonly of: "height";
544
+ readonly times: 1;
545
+ };
546
+ };
547
+ readonly labelSize: {
548
+ readonly unit: "field units";
549
+ readonly whole: false;
550
+ readonly min: 0;
551
+ readonly minOpen: true;
552
+ readonly max: {
553
+ readonly of: "height";
554
+ readonly times: 1;
555
+ };
556
+ };
557
+ };
558
+ };
225
559
 
226
560
  interface DisplayProps {
227
561
  /** The scale step; `poster` is the page's one largest moment. */
@@ -276,4 +610,4 @@ interface WordmarkProps {
276
610
  /** A product name with its mark. */
277
611
  declare function Wordmark({ name, mark, href }: WordmarkProps): react_jsx_runtime.JSX.Element;
278
612
 
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 };
613
+ 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 };