@seatlayer/core 0.28.4 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,1456 +1,5 @@
1
- /**
2
- * SeatMap chart document the single source of truth shared by the
3
- * Designer (authoring) and the Renderer (buyer picker).
4
- *
5
- * Coordinates are abstract units (roughly "pixels at scale 1"); the renderer
6
- * fits the chart to its container.
7
- * Rows are PARAMETRIC (origin + count + spacing + curve + rotation) — never
8
- * store per-seat coordinates in the document; expansion happens in layout.ts.
9
- */
10
- interface Point {
11
- x: number;
12
- y: number;
13
- }
14
- interface CubicPath {
15
- start: Point;
16
- control1: Point;
17
- control2: Point;
18
- end: Point;
19
- }
20
- /** A real closed section boundary. `outline` remains its sampled collision and
21
- * persistence fallback; this path is the smooth authoring/buyer paint source. */
22
- type SectionPathSegment = {
23
- kind: 'line';
24
- end: Point;
25
- } | {
26
- kind: 'arc';
27
- center: Point;
28
- radius: number;
29
- clockwise: boolean;
30
- end: Point;
31
- } | {
32
- kind: 'bezier';
33
- control1: Point;
34
- control2: Point;
35
- end: Point;
36
- };
37
- interface SectionOutlinePath {
38
- version: 1;
39
- closed: true;
40
- start: Point;
41
- segments: SectionPathSegment[];
42
- }
43
- interface Category {
44
- key: string;
45
- label: string;
46
- color: string;
47
- /** Base price — used when the category has no explicit tiers. */
48
- price?: number;
49
- /** Durable evidence for semantic/display facts proposed while converting a
50
- * private reference into sellable inventory. */
51
- referenceCategorySource?: ReferenceCategorySource;
52
- /**
53
- * Ticket tiers (Adult / Child / Senior…). When present, a buyer picks a tier
54
- * per seat in this category and the tier's price applies; the first tier is the
55
- * default. Per-category (not per-seat) pricing — see Batch 3.5. Empty/absent =
56
- * a single price (the `price` above).
57
- */
58
- tiers?: CategoryTier[];
59
- }
60
- interface ReferenceCategorySource {
61
- assetId: string;
62
- /** Original sampled section color. `Category.color` is the approved output
63
- * color and may differ only with separately recorded evidence. */
64
- sourceColor: string;
65
- /** Every exact sampled color normalized into the same original 4-bit/channel
66
- * segmentation class. Older documents may contain only `sourceColor`. */
67
- sourceColors?: string[];
68
- /** Logical sections whose generated inventory uses this category. */
69
- logicalSectionIds?: string[];
70
- /** Source-color grouping is deterministic; a semantic regrouping needs its
71
- * own confirmed assignment evidence. */
72
- assignmentDerivation?: 'source-color-class' | 'confirmed-logical-sections';
73
- assignmentEvidence?: 'user-confirmed' | 'authoritative-source';
74
- assignmentSourceDescription?: string;
75
- /** Optional legend/commercial swatch stated by the source. This remains
76
- * immutable provenance when the approved accessible output color differs. */
77
- sourcePaletteColor?: string;
78
- sourcePaletteColorEvidence?: 'user-confirmed' | 'authoritative-source';
79
- sourcePaletteColorSourceDescription?: string;
80
- labelEvidence: 'user-confirmed' | 'authoritative-source';
81
- labelSourceDescription: string;
82
- priceEvidence: 'user-confirmed' | 'authoritative-source';
83
- priceSourceDescription: string;
84
- outputColorEvidence?: 'user-confirmed' | 'authoritative-source';
85
- outputColorSourceDescription?: string;
86
- }
87
- /** One ticket tier within a category: a named price (Adult, Child, Senior…). */
88
- interface CategoryTier {
89
- id: string;
90
- name: string;
91
- price: number;
92
- }
93
- /**
94
- * Accessibility accommodations a seat can carry. Mirrors the taxonomy real
95
- * venues (and seats.io) expose so buyers can filter for exactly what they need
96
- * and organizers can mark seats precisely. `wheelchair` is the legacy default.
97
- */
98
- type AccessibilityType = 'wheelchair' | 'companion' | 'semi-ambulatory' | 'hearing' | 'cart' | 'sign-language' | 'plus-size' | 'lift-armrest';
99
- interface AccessibilityMeta {
100
- key: AccessibilityType;
101
- /** Full descriptive label (designer checkbox, picker legend). */
102
- label: string;
103
- /** Compact label for chips/badges. */
104
- short: string;
105
- /** Single-glyph badge shown on seat chips + filter chips. */
106
- icon: string;
107
- }
108
- /** Ordered taxonomy — drives the designer seat panel and the picker filters. */
109
- declare const ACCESSIBILITY_TYPES: AccessibilityMeta[];
110
- /** Metadata for one accessibility key (undefined for unknown keys). */
111
- declare function accessibilityMeta(key: AccessibilityType): AccessibilityMeta | undefined;
112
- /**
113
- * Outer-ring colour per accommodation. Shared by the buyer picker and the
114
- * designer canvas so an accessible seat reads with the same hue in both — the
115
- * seat's first-listed type wins. `wheelchair` blue is the default fallback.
116
- */
117
- declare const ACCESSIBILITY_RING_COLOR: Record<AccessibilityType, string>;
118
- /** Ring colour for a seat's accessibility set (first-listed type wins). */
119
- declare function accessibilityRingColor(types: AccessibilityType[] | undefined): string;
120
- interface SeatOverride {
121
- /** 0-based seat index within the row. */
122
- index: number;
123
- /** Physical seat absent (pillar, sound desk) — numbering gap preserved. */
124
- skip?: boolean;
125
- /** Position nudge in chart units. */
126
- dx?: number;
127
- dy?: number;
128
- /** Replace the computed label entirely. */
129
- label?: string;
130
- /** Buyer-facing copy only. Booking/API identity remains row id + slot index
131
- * internally and the legacy `label` externally for backwards compatibility. */
132
- displayLabel?: string;
133
- categoryKey?: string;
134
- /** @deprecated legacy flag — read as `['wheelchair']`; write `accessibility`. */
135
- accessible?: boolean;
136
- /** Accessibility accommodations of this seat (empty/absent = none). */
137
- accessibility?: AccessibilityType[];
138
- /**
139
- * Physical wheelchair provision. Absent keeps legacy seat rendering;
140
- * `seat-present` is an explicit removable/fixed accessible chair, while
141
- * `no-seat` is an empty wheelchair bay that remains one sellable inventory
142
- * unit. This is deliberately distinct from `skip`, which removes inventory.
143
- */
144
- wheelchairSpaceType?: 'seat-present' | 'no-seat';
145
- /** Commercial selling/view attributes are deliberately not accessibility. */
146
- commercial?: SeatCommercialAttributes;
147
- /** Seat-specific view photo; falls back to the row photo. */
148
- viewFromSeatUrl?: string;
149
- /** Per-seat label size/color override; falls back to the row/theme default.
150
- * Size is clamped to LABEL_STYLE_MIN_SIZE..MAX_SIZE; color is passed through
151
- * the shared auto-contrast rule at paint time (see {@link LabelStyle}). */
152
- labelStyle?: LabelStyle;
153
- }
154
- interface SeatCommercialAttributes {
155
- restrictedView?: boolean;
156
- obstructedView?: boolean;
157
- premium?: boolean;
158
- note?: string;
159
- }
160
- /**
161
- * Per-object label ink + size overrides layered on top of the chart-wide Theme
162
- * defaults (rowLabelColor / textColor for rows, the section-name ink for
163
- * sections). Both fields are optional: an absent field means "inherit the theme
164
- * default". `color` is a preferred hex — renderers still pass it through the
165
- * shared auto-contrast rule (`stateAwareBookableLabelInk`), so a choice that
166
- * would be illegible over the seat/section background is switched to black or
167
- * white at paint time. `size` is a font size in chart units, clamped to
168
- * LABEL_STYLE_MIN_SIZE..LABEL_STYLE_MAX_SIZE by the shared ops.
169
- */
170
- interface LabelStyle {
171
- size?: number;
172
- color?: string;
173
- }
174
- /** Clamp bounds for a per-object label `size`, shared by ops, MCP, and UI. */
175
- declare const LABEL_STYLE_MIN_SIZE = 8;
176
- declare const LABEL_STYLE_MAX_SIZE = 24;
177
- interface LabelPresentation {
178
- visible?: boolean;
179
- /** Exact Designer-owned label anchor; public semantic MCP schemas omit it. */
180
- position?: Point;
181
- rotation?: number;
182
- style?: 'plain' | 'pill';
183
- /** Per-object size/color override for this row's or section's label. */
184
- labelStyle?: LabelStyle;
185
- /**
186
- * End-position preset for a ROW label — which end(s) of the row show it:
187
- * - `start` (default/undefined) — the row's numbering-start end (legacy behaviour).
188
- * - `end` — the far end of the row.
189
- * - `both` — a label at BOTH ends.
190
- * - `none` — hidden (kept coherent with `visible: false`).
191
- * A free-drag `position` overrides the preset (the designer shows a 'custom'
192
- * state). Ignored for sections (they use `position`/`visible` only).
193
- */
194
- positionPreset?: 'start' | 'end' | 'both' | 'none';
195
- }
196
- /** Brand/venue theming — applied by the renderer in both designer and picker. */
197
- interface ChartTheme {
198
- /** Canvas background color (default dark: #0e1117-ish radial). */
199
- background?: string;
200
- /** Preferred text color for the numbers inside seat markers. */
201
- seatLabelColor?: string;
202
- /** Preferred color for row identifiers such as A, B, C. Falls back to textColor. */
203
- rowLabelColor?: string;
204
- /** Selection ring / accent color (default white ring + brand accent). */
205
- selectionColor?: string;
206
- /** Décor (stage/shape) default fill. */
207
- decorFill?: string;
208
- /** Free-text color default. */
209
- textColor?: string;
210
- /** Font family (CSS stack) for all rendered text — row labels, seat numbers, sections, décor text. */
211
- fontFamily?: string;
212
- /** Seat size multiplier on the base radius (0.7–1.6, default 1) — bigger seats fit longer labels. */
213
- seatScale?: number;
214
- /** Brand accent color — recolors buttons, links, the hold pill, selection UI. */
215
- accent?: string;
216
- /** Ink color for text on the accent (e.g. button labels). Default light. */
217
- accentInk?: string;
218
- /** Organizer logo shown in the picker header (data/R2 URL). Falls back to the name. */
219
- logoUrl?: string;
220
- /** Brand/venue name shown in the picker header when no event name is set. */
221
- brandName?: string;
222
- /** Paid-tier flag: hide the "Powered by SeatMap" badge. */
223
- hideBadge?: boolean;
224
- }
225
- interface RowObject {
226
- type: 'row';
227
- id: string;
228
- /** Present when this row was materialized by the in-canvas reference scan.
229
- * A re-scan of the same asset replaces rows carrying this marker and NEVER
230
- * touches hand-authored rows — the same replace-generated-only invariant as
231
- * applyReferenceInventory. */
232
- referenceScan?: {
233
- assetId: string;
234
- };
235
- /** Row label, e.g. "A". Seat labels are `${label}-${n}`. */
236
- label: string;
237
- /** Buyer-facing row name. `label` remains the legacy inventory prefix. */
238
- displayLabel?: string;
239
- /**
240
- * Buyer-facing type word override (seats.io "Displayed type"). Replaces the
241
- * hardcoded "Row" in the picker tooltip/confirm/cart, e.g. "Table", "Bench",
242
- * "Aisle". ≤24 chars; absent = the default "Row". Pure presentation.
243
- */
244
- displayType?: string;
245
- labelPresentation?: LabelPresentation;
246
- /** Position of the FIRST seat. */
247
- origin: Point;
248
- /** Degrees, clockwise. 0 = seats laid out along +x. */
249
- rotation: number;
250
- /**
251
- * Total arc sweep in degrees across the whole row. 0 = straight.
252
- * Positive bends away from +y (concave toward the focal point when the
253
- * row faces it). Typical theatre rows: 10–40.
254
- */
255
- curve: number;
256
- seatCount: number;
257
- /** Distance between adjacent seat centers, in chart units. */
258
- seatSpacing: number;
259
- /** Optional exact cubic centreline. Normal code owns these coordinates and
260
- * distributes seats by arc length; MCP/model inputs never submit them. */
261
- path?: CubicPath;
262
- categoryKey: string;
263
- /** Deterministic provenance for rows fitted from confirmed reference
264
- * inventory. It enables revision-safe replacement without touching manually
265
- * authored rows or accepting client coordinates. */
266
- referenceInventorySource?: ReferenceInventorySource;
267
- /** Semantic parameters for a row produced by the shared Arc/Fan operation.
268
- * Designer can reopen these parameters while every segment in the group
269
- * still carries the same generation signature. Public MCP tools never accept
270
- * the stored center/angles as arbitrary model-authored coordinates. */
271
- arcFanGeneration?: {
272
- kind: 'arc-fan-v1';
273
- groupId: string;
274
- center: Point;
275
- innerRadius: number;
276
- rowCount: number;
277
- rowGap: number;
278
- startAngle: number;
279
- endAngle: number;
280
- seatPitch: number;
281
- fit: 'seat-pitch' | 'fixed-count';
282
- seatsPerRow?: number;
283
- facing: 'inward' | 'outward';
284
- taperDegrees: number;
285
- skewDegrees: number;
286
- aisleGaps: {
287
- left: number;
288
- center: number;
289
- right: number;
290
- };
291
- rowLabelStart: number;
292
- seatLabelStart: number;
293
- rowIndex: number;
294
- segmentIndex: number;
295
- };
296
- /**
297
- * Membership in one buyer-facing segmented row. Physical component rows and
298
- * their `${rowId}:${slotIndex}` inventory ids remain authoritative; this
299
- * metadata only supplies logical ordering/presentation and explicit aisle
300
- * continuity. The descriptor is repeated on every component so selecting any
301
- * one can resolve the complete logical row without a chart-level side table.
302
- */
303
- segmentedRow?: {
304
- kind: 'segmented-row-v1';
305
- groupId: string;
306
- componentIndex: number;
307
- componentCount: number;
308
- /** The first component must use `start`; later boundaries are explicit. */
309
- boundaryBefore: 'start' | 'continuous' | 'break';
310
- /** Buyer-facing row name; technical component `label` values never change. */
311
- displayLabel: string;
312
- displayType?: string;
313
- labelPresentation?: LabelPresentation;
314
- viewFromSeatUrl?: string;
315
- /** Presentation intent for a continuous node-defined centreline. */
316
- smoothing?: boolean;
317
- };
318
- /**
319
- * Versioned provenance for rows created by the multiple/intertwined block
320
- * generator. Manual geometry edits remove this marker rather than allowing a
321
- * later regeneration to overwrite hand-authored work.
322
- */
323
- rowBlockGeneration?: {
324
- kind: 'row-block-v1';
325
- groupId: string;
326
- style: 'multiple' | 'intertwined';
327
- rowIndex: number;
328
- rowCount: number;
329
- seatsPerRow: number;
330
- origin: Point;
331
- rotation: number;
332
- rowGap: number;
333
- seatSpacing: number;
334
- curve: number;
335
- /** Stable canonical generator signature shared by every intact member. */
336
- signature: string;
337
- };
338
- /** First seat number (default 1). Roman/letters read it as a 1-based ordinal
339
- * (start 1 → I / A). */
340
- seatLabelStart?: number;
341
- /** Seat numbering within the row (default decimal, ltr, step 1). */
342
- seatNumbering?: {
343
- /** ltr / rtl number from an end; `center` numbers outward from the middle
344
- * (centre seat lowest — the premium-centre theatre convention). */
345
- direction: 'ltr' | 'rtl' | 'center';
346
- /** 2 = odd/even numbering (1,3,5… — start at 2 for evens). */
347
- step?: 1 | 2;
348
- /**
349
- * Label scheme for the seat NUMBER part (the row prefix is separate).
350
- * Default `decimal`. Composition with `direction`/`step`/`seatLabelStart`:
351
- * - `decimal` 1,2,3 — honours direction + step + start.
352
- * - `odd` 1,3,5 — odd numbers from the first odd ≥ start.
353
- * - `even` 2,4,6 — even numbers from the first even ≥ start.
354
- * - `updown` 1,3,5,…,6,4,2 — odd-up-even-back; REPLACES direction (uses
355
- * physical left→right order); start shifts.
356
- * - `updown-descending` …5,3,1,2,4,6 — odd-back-even-up; the distinct
357
- * reverse up/down sequence. Also replaces
358
- * direction and uses physical order.
359
- * - `roman` I,II,III — honours direction + step + start (uppercase).
360
- * - `letters-upper` A,B,C…Z,AA — honours direction + step + start.
361
- * - `letters-lower` a,b,c…z,aa — honours direction + step + start.
362
- * Like `step`/`direction` today, the scheme changes the seat's inventory
363
- * label (its booking identity), by design.
364
- */
365
- scheme?: 'decimal' | 'odd' | 'even' | 'updown' | 'updown-descending' | 'roman' | 'letters-upper' | 'letters-lower';
366
- /** Optional prefix prepended to every seat number, e.g. 'R' → 'R1', 'R2'. */
367
- prefix?: string;
368
- /**
369
- * End-at preset ("useEndAt"): the row's numbering ENDS at this value instead
370
- * of starting at `seatLabelStart`. The start is derived so the last-numbered
371
- * seat (highest position rank) lands on `endAt`, respecting the scheme's step
372
- * (odd/even = 2). When set it WINS over the stored `seatLabelStart` (which is
373
- * left untouched). For letters it is a 1-based number index (26 → last seat
374
- * 'Z'); `updown` owns its own sequence and ignores `endAt`.
375
- */
376
- endAt?: number;
377
- };
378
- /**
379
- * Per-seat exceptions, keyed by seat index (0-based position in the row).
380
- * `skip` removes the physical seat but keeps the numbering gap (theatre
381
- * convention: a pillar eats A-3; A-4 stays A-4).
382
- */
383
- overrides?: SeatOverride[];
384
- /**
385
- * Organizer-supplied equirectangular 360 (or wide photo) shown as the
386
- * view-from-seat for every seat in this row. When absent, the picker
387
- * generates a synthetic panorama from chart geometry.
388
- */
389
- viewFromSeatUrl?: string;
390
- /** Default commercial attributes inherited by seats without an override. */
391
- commercial?: SeatCommercialAttributes;
392
- }
393
- interface GAAreaObject {
394
- type: 'gaArea';
395
- id: string;
396
- /** Stable technical/inventory label. */
397
- label: string;
398
- /** Buyer-facing area name; technical `label` and GA unit ids stay stable. */
399
- displayLabel?: string;
400
- /** Buyer-facing type word override (seats.io "Displayed type"), ≤24 chars.
401
- * Absent = the default type word. Pure presentation. */
402
- displayType?: string;
403
- /** Closed polygon, in chart units. */
404
- points: Point[];
405
- /** Explicit aisles/pillars/cutouts excluded from the sellable GA surface. */
406
- holes?: Point[][];
407
- capacity: number;
408
- categoryKey: string;
409
- /** Corner-rounding radius in chart units (default 0 = sharp corners). Pure
410
- * presentation — softens the polygon's corners in every renderer without
411
- * touching capacity, unit identities, or the stored points. Clamped per
412
- * corner to half the shorter adjacent edge at draw time. */
413
- cornerRadius?: number;
414
- /**
415
- * Durable inventory provenance for a surface produced by Join Areas.
416
- *
417
- * A GA unit is identified by the id and zero-based range of the area that
418
- * originally authored it, not by the current polygon which happens to own
419
- * it. Keeping those source ranges means a geometric join never renumbers an
420
- * already published/booked unit. Ordinary (never-joined) areas omit this
421
- * field and implicitly own `[0, capacity)` under their own id.
422
- *
423
- * The ranges must be non-overlapping, contain positive whole counts, and sum
424
- * exactly to `capacity`; validation rejects malformed metadata. Capacity
425
- * growth appends a new range under the surviving area id, while shrinking a
426
- * joined area is deliberately refused because it would silently destroy
427
- * stable inventory identities.
428
- */
429
- inventorySegments?: GAInventorySegment[];
430
- referenceInventorySource?: ReferenceInventorySource;
431
- }
432
- interface GAInventorySegment {
433
- sourceAreaId: string;
434
- startIndex: number;
435
- count: number;
436
- }
437
- /**
438
- * Durable evidence link for sellable objects generated from a private reference.
439
- * The client supplies facts and stable logical-section ids, never coordinates.
440
- */
441
- interface ReferenceAccessibilitySource {
442
- placementDerivation: 'server-synthesized-row-edges';
443
- groupLogicalSectionIds: string[];
444
- assignmentEvidence: 'user-confirmed' | 'authoritative-source';
445
- assignmentSourceDescription: string;
446
- counts: Array<{
447
- type: AccessibilityType;
448
- count: number;
449
- evidence: 'user-confirmed' | 'authoritative-source';
450
- sourceDescription: string;
451
- }>;
452
- }
453
- interface ReferenceInventorySource {
454
- assetId: string;
455
- logicalSectionId: string;
456
- evidence: 'user-confirmed' | 'authoritative-source';
457
- sourceDescription: string;
458
- /** Distinguishes directly supplied inventory from a user-approved server
459
- * distribution based only on an aggregate capacity. */
460
- derivation?: 'explicit-inventory' | 'server-synthesized-from-aggregate';
461
- /** Evidence for the aggregate figure; synthesized rows remain
462
- * `user-confirmed` and are never mislabeled as source-extracted. */
463
- aggregateEvidence?: 'user-confirmed' | 'authoritative-source';
464
- /** Separate evidence for assigning standing inventory to this logical
465
- * section. Aggregate evidence alone cannot prove section placement. */
466
- sectionAssignmentEvidence?: 'user-confirmed' | 'authoritative-source';
467
- sectionAssignmentSourceDescription?: string;
468
- /** Aggregate row synthesis may propose numbering, but persistence requires
469
- * the applying user/agent to confirm that policy explicitly. */
470
- numberingEvidence?: 'user-confirmed';
471
- numberingSourceDescription?: string;
472
- /** Evidence and deterministic placement contract for synthesized accessible
473
- * units in this logical section. */
474
- accessibility?: ReferenceAccessibilitySource;
475
- }
476
- /** Durable evidence that a visible source-backed section shell intentionally
477
- * carries no generated sellable inventory in this reference configuration. */
478
- interface ReferenceInventoryExclusionSource {
479
- assetId: string;
480
- logicalSectionId: string;
481
- reason: string;
482
- evidence: 'user-confirmed' | 'authoritative-source';
483
- sourceDescription: string;
484
- }
485
- /** Open-path stroke semantics. Optional ShapeObject fields retain the legacy
486
- * round/round/no-ending rendering when absent. */
487
- type ShapeLineCap = 'butt' | 'round' | 'square';
488
- type ShapeLineJoin = 'miter' | 'round' | 'bevel';
489
- type ShapeLineEnding = 'none' | 'arrow';
490
- /** Non-bookable décor: stage, walls, exits. */
491
- interface ShapeObject {
492
- type: 'shape';
493
- id: string;
494
- /**
495
- * Closed area shapes (`rect`/`ellipse`/`polygon`) take a `fill`; open path
496
- * primitives (`line` = two points, `polyline` = n points) are stroke-only and
497
- * never filled. All kinds honour the optional `stroke`.
498
- */
499
- kind: 'rect' | 'ellipse' | 'polygon' | 'line' | 'polyline';
500
- label?: string;
501
- /** For rect/ellipse: bounding box. For a stage polygon: the base (pre-shape) box, so its kind can be regenerated. */
502
- x?: number;
503
- y?: number;
504
- width?: number;
505
- height?: number;
506
- /** For polygon/line/polyline. */
507
- points?: Point[];
508
- fill?: string;
509
- /** Optional outline. `width` is in chart units; both fields are required together. */
510
- stroke?: {
511
- color: string;
512
- width: number;
513
- };
514
- /** Open line/polyline only. Absent fields preserve round/round/no-ending legacy rendering. */
515
- lineCap?: ShapeLineCap;
516
- /** Controls corners between open-path segments. */
517
- lineJoin?: ShapeLineJoin;
518
- /** Independent open-path start/end decorations. Closed outlines never use these fields. */
519
- startEnding?: ShapeLineEnding;
520
- endEnding?: ShapeLineEnding;
521
- /** Rect only — corner rounding radius in chart units, clamped to half the short side at edit time. */
522
- cornerRadius?: number;
523
- /** Whole-shape opacity 0.1–1 (default 1). */
524
- opacity?: number;
525
- /** Degrees clockwise about the shape's center (default 0). Applied at render time. */
526
- rotation?: number;
527
- /**
528
- * Semantic tag driving special rendering. `'stage'` gets the gradient +
529
- * prominent uppercase label treatment; a décor landmark role (bar, exit…)
530
- * gets a quieter label. Loose string to avoid a circular import with
531
- * stage.ts / decor.ts (see StageKind / DecorRole there).
532
- */
533
- role?: string;
534
- /** For a stage: which `StageKind` its polygon was generated from. */
535
- stageKind?: string;
536
- }
537
- type RectTableSide = 'top' | 'bottom' | 'left' | 'right';
538
- /** Exact rectangular-table chair distribution. The four keys are deliberately
539
- * required: zero means that edge has no chair, while the sum is the authored
540
- * `seatCount`. Numeric chair identity remains `${table.id}:${index}` in the
541
- * canonical top, bottom, left, right expansion order. */
542
- interface RectTableSeatCounts {
543
- top: number;
544
- bottom: number;
545
- left: number;
546
- right: number;
547
- }
548
- /** Seats arranged around a table. Grouped selling is activated only by an
549
- * event's explicit inventory-model-2 snapshot; model-1 events continue to
550
- * treat every authored chair as an independent unit. */
551
- interface TableObject {
552
- type: 'table';
553
- id: string;
554
- /** e.g. "T1" — seat labels are `${label}-${n}`. */
555
- label: string;
556
- /** Buyer-facing table name; technical chair/group labels stay stable. */
557
- displayLabel?: string;
558
- /** Buyer-facing type word override (seats.io "Displayed type"), ≤24 chars.
559
- * Absent = the default "Row"/"Table" word. Pure presentation. */
560
- displayType?: string;
561
- center: Point;
562
- shape: 'round' | 'rect';
563
- /** Seats around the perimeter (round) or along the enabled edges (rect). */
564
- seatCount: number;
565
- /** Rect tables: which edges get seats (default ['top','bottom']). */
566
- sides?: RectTableSide[];
567
- /**
568
- * Rect tables only: exact chairs on every edge. Absent preserves the legacy
569
- * `seatCount` + `sides` round-robin distribution byte-for-byte. When present,
570
- * all four values are whole numbers >= 0 and their sum equals `seatCount`.
571
- */
572
- seatCountsBySide?: RectTableSeatCounts;
573
- /** Individual-chair semantic overrides. Grouped whole/variable tables cannot
574
- * author these because their only sellable identity is the table itself. */
575
- overrides?: SeatOverride[];
576
- rotation: number;
577
- /** Round tables. */
578
- radius?: number;
579
- /**
580
- * Round tables: the arc (in degrees) the seats occupy, default 360 (full
581
- * ring). Below 360 leaves an open side — e.g. a service gap for waiters, a
582
- * head table facing the room, or clearance against a wall. The opening is
583
- * centred on the `rotation` direction; seats spread across the rest.
584
- */
585
- seatArc?: number;
586
- /** Rect tables. */
587
- width?: number;
588
- height?: number;
589
- categoryKey: string;
590
- /** One buyer owns the complete table at exactly `seatCount` guests. */
591
- bookAsWhole?: boolean;
592
- /** One buyer owns the complete table and chooses a bounded guest quantity. */
593
- variableOccupancy?: boolean;
594
- /** Required inclusive guest bounds when `variableOccupancy` is true. */
595
- minOccupancy?: number;
596
- maxOccupancy?: number;
597
- referenceInventorySource?: ReferenceInventorySource;
598
- }
599
- /** A booth: one bookable unit rendered as a block (trade shows, VIP boxes). */
600
- interface BoothObject {
601
- type: 'booth';
602
- id: string;
603
- /** Stable technical/inventory label. */
604
- label: string;
605
- /** Buyer-facing booth name; technical `label` stays stable. */
606
- displayLabel?: string;
607
- /** Buyer-facing type word override (seats.io "Displayed type"), ≤24 chars.
608
- * Absent = the default type word. Pure presentation. */
609
- displayType?: string;
610
- center: Point;
611
- width: number;
612
- height: number;
613
- rotation: number;
614
- /**
615
- * Optional custom outline (closed polygon, absolute chart coordinates) for
616
- * non-rectangular booths — L-shaped, corner, or island units on expo floors.
617
- * Absent = the default axis-aligned rectangle described by `width`/`height`/
618
- * `rotation`. A booth stays exactly ONE atomic sellable unit whatever its
619
- * outline; `points` is purely geometric. `width`/`height` are retained as the
620
- * last rectangular size so "Back to rectangle" can restore it. When `points`
621
- * is present, renderers draw the polygon and ignore `rotation`.
622
- */
623
- points?: Point[];
624
- categoryKey: string;
625
- referenceInventorySource?: ReferenceInventorySource;
626
- }
627
- /**
628
- * A named region of the venue (Balcony Left, Floor B…). Sections are outlines
629
- * only — objects belong to a section spatially (center inside the outline),
630
- * keeping the document flat (no nesting; simpler for tools and for AI edits).
631
- * Renderer: far zoom shows section shapes/labels instead of seats; clicking
632
- * a section zooms into it.
633
- */
634
- interface SectionObject {
635
- type: 'section';
636
- id: string;
637
- label: string;
638
- /** Buyer-facing section name; logical/id fields remain stable. */
639
- displayLabel?: string;
640
- /**
641
- * Buyer-facing entrance/door hint shown in the picker section card
642
- * ("Entrance X"). ≤40 chars; absent = no entrance line. Pure presentation.
643
- */
644
- entrance?: string;
645
- /**
646
- * Organizer-supplied view image inherited by buyer inventory whose owning
647
- * row/table/booth sits in this logical section. Seat and row photos take
648
- * precedence; multipart components are kept in sync by the shared section
649
- * metadata operation.
650
- */
651
- viewFromSeatUrl?: string;
652
- labelPresentation?: LabelPresentation;
653
- /**
654
- * Stable management/inventory identity shared by disconnected visual
655
- * components of one logical section. When absent, `id` is the logical id.
656
- * Each component keeps its own `id` and reference provenance so rendering,
657
- * editing, measured diffs, and source restoration remain exact.
658
- */
659
- logicalSectionId?: string;
660
- /** Shared semantic Arc/Fan group wrapped by this section. The section id is
661
- * preserved when the fan parameters are reopened and regenerated. */
662
- arcFanGroupId?: string;
663
- /** Closed polygon, chart units. */
664
- outline: Point[];
665
- /** Optional true line/arc/cubic boundary. `outline` is a deterministic sample
666
- * of this path and remains authoritative for membership, validation, and
667
- * clients that predate curved section rendering. */
668
- outlinePath?: SectionOutlinePath;
669
- /** Explicit aisle/cutout polygons excluded from rendering, hit-testing, and membership. */
670
- holes?: Point[][];
671
- /** Durable opaque link to the private reference component. Unlike generator
672
- * provenance, this survives manual geometry edits so a measured diff can
673
- * report drift and server-owned code can restore the source contour. */
674
- referenceSource?: {
675
- assetId: string;
676
- regionId: string;
677
- };
678
- /** Evidence-backed reason this source section remains a visible shell without
679
- * synthesized sellable inventory (press, closed technical zone, etc.). */
680
- referenceInventoryExclusion?: ReferenceInventoryExclusionSource;
681
- /** Deterministic generator provenance for editable reference/parametric shells. */
682
- geometry?: {
683
- kind: 'rectangle' | 'tapered' | 'bezier' | 'contour';
684
- sourceRegionId?: string;
685
- contourMethod?: 'pixel-edge-loops-rdp' | 'shared-edge-vector-fit-v1';
686
- simplificationTolerancePx?: number;
687
- vectorFitErrorPx?: number;
688
- sharedEdgeCount?: number;
689
- };
690
- /** Optional tint override (defaults to a neutral fill / dominant category mix). */
691
- color?: string;
692
- /** Zone this section belongs to (id into `ChartDoc.zones`). Far-zoom nav + pricing group. */
693
- zone?: string;
694
- /**
695
- * Tier height. 0 = floor (default). Higher values lift the section in the
696
- * picker's isometric ("3D") view, drawn on extruded side faces. Same field a
697
- * future multi-floor mode reuses — authored in 2D, never drawn by the user.
698
- *
699
- * This is the coarse, back-compat source for {@link height}/{@link rake}: when
700
- * those are absent, {@link sectionGeometry} derives real geometry from this
701
- * tier so legacy charts render pixel-identical.
702
- */
703
- elevation?: number;
704
- /**
705
- * 3D foundations (Phase A, additive — no migration; charts are JSON blobs).
706
- * Metres the section's **front edge** sits above floor 0 (a balcony/tier floor
707
- * height). Absent ⇒ derived from the coarse {@link elevation} tier via
708
- * {@link sectionGeometry}. Deliberately two scalars, not a foundation polygon:
709
- * front-height + {@link rake} fully determine a rectangular tier's back-height.
710
- *
711
- * NOTE: no consumer reads this raw field directly — all callers go through
712
- * {@link sectionGeometry}. Phase B consumers (iso view lift in
713
- * `SeatmapRenderer`, per-seat eye-height in the `generatePanorama` 360°
714
- * generator) are intentionally NOT wired in Phase A. Range 0–120 m.
715
- */
716
- height?: number;
717
- /**
718
- * Degrees of seating incline within the section (0 = flat; typical stalls
719
- * 5–15°, steep tiers 25–35°). Absent ⇒ 0. Consumed alongside {@link height}
720
- * by the future Phase B iso-lift shear and 360° sightline math — never in
721
- * Phase A. Range 0–45°.
722
- */
723
- rake?: number;
724
- /** Uniform scale about the outline centroid (1 = as drawn). Scales members too. */
725
- scale?: number;
726
- /** 0–100: reviewed strength last used to bend member rows toward a common fitted arc. */
727
- smoothing?: number;
728
- /** Degrees clockwise about the outline centroid (default 0). Rotates members too. */
729
- rotation?: number;
730
- }
731
- /**
732
- * A group of sections (Lower Bowl, Upper Bowl, Floor…). One concept, three jobs:
733
- * the farthest-zoom navigation unit, a pricing group, and (Batch 3) a timed-
734
- * release unit. Kept as a flat list on the doc; sections point back by `zone` id.
735
- */
736
- interface ZoneDef {
737
- id: string;
738
- label: string;
739
- color?: string;
740
- /**
741
- * Authored point this zone faces. Optional only for legacy documents: runtime
742
- * consumers fall back to the active floor/chart focal, while publication of
743
- * a zone-mode draft requires every used zone to carry an explicit point.
744
- */
745
- focalPoint?: Point;
746
- }
747
- /**
748
- * Selection layer — a hit-test/dim filter in the designer, NOT z-order management.
749
- * Fixed set of four; derived from object type via `layerOf()` (no per-object field yet).
750
- */
751
- type SelectionLayer = 'interactive' | 'background' | 'foreground' | 'surroundings';
752
- /** Shape roles emitted by the curated venue-landmark palette. Keep this list in
753
- * lockstep with `DECOR_PRESETS`; the selection-layer unit test fails if either
754
- * vocabulary changes without an explicit routing decision. `reference-focal`
755
- * is source-backed venue context rather than an authoring-palette preset. */
756
- declare const SURROUNDINGS_SHAPE_ROLES: readonly ["reference-focal", "bar", "entrance", "exit", "restroom", "screen", "sound", "concession", "coat", "wall"];
757
- /** Derive an object's selection layer from its type. */
758
- declare function layerOf(obj: ChartObject): SelectionLayer;
759
- /** Free-standing text on the chart (aisle names, door labels…). */
760
- interface TextObject {
761
- type: 'text';
762
- id: string;
763
- /** Persisted provenance for objects created from the venue-icon palette. */
764
- semanticKind?: 'icon';
765
- /**
766
- * Registry key for a vector wayfinding icon (see src/core/icons.ts). Present
767
- * on modern icon placements; the object then renders as a single-color vector
768
- * Path instead of `text`. Absent on legacy emoji icons, which keep rendering
769
- * `text` through the shared glyph path — old charts are never rewritten.
770
- */
771
- iconKey?: string;
772
- text: string;
773
- position: Point;
774
- fontSize: number;
775
- /** Optional CSS family stack for this annotation; absent inherits ChartTheme.fontFamily. */
776
- fontFamily?: string;
777
- rotation: number;
778
- color?: string;
779
- /** Render weight (default false). Maps to Konva fontStyle bold. */
780
- bold?: boolean;
781
- /** Render slant (default false). Maps to Konva fontStyle italic. */
782
- italic?: boolean;
783
- }
784
- /**
785
- * A raster/vector decor graphic drawn IN the chart, beneath the seats and
786
- * sections (ice rink, basketball court, stage art, pitch markings). Purely
787
- * visual venue context — never bookable, never hit-tested, so it never steals a
788
- * seat click. `href` is a self-contained data URL (image or SVG) produced by the
789
- * same client-side downscale used for row photos, so it travels with the doc and
790
- * caches as a single bitmap blit (zero per-frame cost). Placed by top-left
791
- * (x,y) + size, rotated about its centre — the same handles a shape rect uses.
792
- */
793
- interface DecorImageObject {
794
- type: 'decorImage';
795
- id: string;
796
- /** Image or SVG data URL. */
797
- href: string;
798
- x: number;
799
- y: number;
800
- width: number;
801
- height: number;
802
- /** Degrees clockwise about the image centre (default 0). */
803
- rotation?: number;
804
- /** 0–1 (default 1). Multiplied by any chart-theme dimming at render time. */
805
- opacity?: number;
806
- /**
807
- * Z-layer relative to the interactive seat layer. `background` (default)
808
- * draws beneath the seats/sections; `foreground` draws above them (a roof
809
- * canopy, an overlay graphic). Absent = background — no migration needed.
810
- */
811
- layer?: 'background' | 'foreground';
812
- /** Optional caption for the designer inspector / accessibility (not drawn). */
813
- label?: string;
814
- }
815
- type ChartObject = RowObject | GAAreaObject | ShapeObject | TableObject | BoothObject | TextObject | SectionObject | DecorImageObject;
816
- /**
817
- * One floor / level of a multi-floor venue (Batch 5). Each floor owns its own
818
- * geometry, stage focal point, and trace image; categories/zones/tiers stay
819
- * chart-global (one event, one inventory). A single-floor chart has NO `floors`
820
- * — its `objects[]` is the whole venue — so all existing charts are untouched.
821
- */
822
- interface Floor {
823
- id: string;
824
- name: string;
825
- /**
826
- * Absolute physical deck height in metres above the venue/stage datum.
827
- * Optional for backwards compatibility; an absent value resolves to ground
828
- * level (0 m). Section tiers and rakes are separate, section-local metadata.
829
- * Range 0–120 m.
830
- */
831
- baseHeightM?: number;
832
- objects: ChartObject[];
833
- focalPoint: Point;
834
- /**
835
- * Private organizer trace/calibration layer. This is authoring evidence and
836
- * must never be served to, or rendered by, a buyer surface.
837
- */
838
- referenceImage?: ChartReferenceImage;
839
- /**
840
- * Buyer-visible aesthetic background. Canonical documents store URL-only
841
- * images here. Historical `assetId` values are interpreted as a trace layer
842
- * by the background compatibility helpers.
843
- */
844
- backgroundImage?: ChartDoc['backgroundImage'];
845
- }
846
- interface ReferenceCalibration {
847
- type: 'two-point';
848
- /** Points in immutable source-image pixels, selected by a human or trusted detector. */
849
- sourceA: Point;
850
- sourceB: Point;
851
- /** Verified real-world distance between the two source points. */
852
- distance: number;
853
- unit: 'm' | 'ft' | 'chart-unit';
854
- /** Derived and stored for deterministic geometry compilers. */
855
- pixelsPerUnit: number;
856
- }
857
- /**
858
- * A single human-placed seat probe: the author clicks one seat on the reference
859
- * image and the server reads the surrounding seat lattice from it.
860
- *
861
- * COORDINATE-POLICY CARVE-OUT (owner decision 2026-07-21). The reference
862
- * blueprint pipeline runs `coordinatePolicy: 'opaque-region-ids-only'` — the
863
- * server is the sole source of chart coordinates and MCP clients select opaque
864
- * `reg_*` ids, never points. This type is a deliberate, narrow exception on the
865
- * same grounds as `ReferenceCalibration`: the point is placed by a human in the
866
- * designer canvas, not proposed by a model.
867
- *
868
- * Therefore this is DESIGNER-ONLY and is intentionally NOT exposed over MCP.
869
- * That is an accepted, documented exception to the MCP-parity rule — the
870
- * server-is-sole-source guarantee for model-driven edits is worth more than
871
- * parity here. Do not "fix" it by adding a seed point to an MCP tool schema.
872
- */
873
- interface ReferenceSeatSeed {
874
- /** Seed centre in immutable source-image pixels (never chart coordinates). */
875
- source: Point;
876
- /** Half-width of the author's sizing ring, in source pixels — the "this is how
877
- * big one seat is" hint that replaces seats.io's zoom-until-it-matches step. */
878
- radius: number;
879
- /** Whether `radius` was fitted from image pixels or set by hand. Detection
880
- * weights an author-set radius more heavily than one we guessed. */
881
- origin: 'auto-fit' | 'manual';
882
- }
883
- /** One detected row in a scan proposal — a straight seat run in CHART
884
- * coordinates (the server maps source pixels through referencePixelToChart;
885
- * clients never see source-pixel geometry back). */
886
- interface ReferenceScanRowProposal {
887
- start: Point;
888
- end: Point;
889
- seatCount: number;
890
- }
891
- /** Detected rows attributed to one compiled section (or unattributed when the
892
- * lattice extends outside every compiled polygon). */
893
- interface ReferenceScanSectionProposal {
894
- /** Id of the compiled SectionObject the rows landed in; null = unattributed. */
895
- sectionId: string | null;
896
- name: string;
897
- rows: ReferenceScanRowProposal[];
898
- seatCount: number;
899
- /** 0..1 — how well this section's lattice agreed with the probe's pitch. */
900
- confidence: number;
901
- /** Index of the seed (multi-probe) whose pitch produced these rows. */
902
- seedIndex: number;
903
- }
904
- /** Server response for an in-canvas reference scan. A PROPOSAL — nothing is
905
- * committed until the author applies it in the designer (chartOps + undo). */
906
- interface ReferenceScanProposal {
907
- assetId: string;
908
- /** Measured seat diameter / centre-to-centre pitch, in chart units. */
909
- seatDiameter: number;
910
- seatPitch: number;
911
- totalSeats: number;
912
- totalRows: number;
913
- sections: ReferenceScanSectionProposal[];
914
- }
915
- /** Coordinate-free physical scale derived by server code from a confirmed
916
- * semantic feature. Unlike manual two-point calibration, no source points pass
917
- * through an MCP client or language model. */
918
- interface ReferenceDerivedScale {
919
- method: 'confirmed-focal-axis-v1';
920
- feature: 'focal-long-axis' | 'focal-short-axis';
921
- distance: number;
922
- unit: 'm' | 'ft';
923
- evidence: 'user-confirmed' | 'authoritative-source';
924
- sourceDescription: string;
925
- chartUnitsPerUnit: number;
926
- }
927
- interface ChartReferenceImage {
928
- /** Stable private reference asset. New cloud-authored charts use this. */
929
- assetId?: string;
930
- /** Legacy/self-contained source. Optional when assetId is present. */
931
- url?: string;
932
- center: Point;
933
- /** Rendered width in chart units (height follows the cropped image aspect). */
934
- width: number;
935
- opacity: number;
936
- rotation?: number;
937
- visible?: boolean;
938
- layer?: 'below' | 'above';
939
- locked?: boolean;
940
- /** Normalized source crop; defaults to the full image. */
941
- crop?: {
942
- x: number;
943
- y: number;
944
- width: number;
945
- height: number;
946
- };
947
- calibration?: ReferenceCalibration;
948
- /** Server-derived semantic calibration without source-image coordinates. */
949
- derivedScale?: ReferenceDerivedScale;
950
- }
951
- interface ChartDoc {
952
- version: 1;
953
- name: string;
954
- venueType: 'SIMPLE' | 'MIXED';
955
- /** The stage / point every seat looks at. Anchors seat-view + sightlines.
956
- * Multi-floor: mirrors floor 0; each floor also carries its own focalPoint. */
957
- focalPoint: Point;
958
- categories: Category[];
959
- /** Section groupings for far-zoom navigation + pricing (optional; sections reference by id). */
960
- zones?: ZoneDef[];
961
- /** Multi-floor venues (Batch 5): present ⇒ floors[] is the source of truth;
962
- * absent ⇒ single-floor and `objects` below is the whole chart. `objects`
963
- * is kept mirroring floor 0 so single-floor readers never branch. */
964
- floors?: Floor[];
965
- objects: ChartObject[];
966
- /**
967
- * Private floor-plan source used for tracing, calibration, scanning and
968
- * reference-backed generation. Buyer projections always remove this field.
969
- */
970
- referenceImage?: ChartReferenceImage;
971
- /**
972
- * Buyer-visible aesthetic background. Canonical values are URL-only.
973
- * Compatibility: a historical value containing `assetId` is trace-only and
974
- * is never rendered or exposed to buyers.
975
- */
976
- backgroundImage?: ChartReferenceImage;
977
- /** Brand/venue theming (colors); categories carry their own colors separately. */
978
- theme?: ChartTheme;
979
- /** Parametric-template provenance: present ⇒ the chart came from a capacity-
980
- * adjustable template family, and the designer offers a capacity control that
981
- * regenerates it at a new target seat count (Batch 4 "curated singles + resize"). */
982
- template?: {
983
- family: string;
984
- targetSeats: number;
985
- };
986
- }
987
- interface ExpandedSeat {
988
- /** Stable id: `${rowId}:${index}` */
989
- id: string;
990
- /** Public label: `${rowLabel}-${seatNumber}` */
991
- label: string;
992
- /** Buyer-facing copy; absent on legacy charts, where `label` is displayed. */
993
- displayLabel?: string;
994
- x: number;
995
- y: number;
996
- rowId: string;
997
- /** Owning logical section and navigation zone, resolved once at expand time. */
998
- sectionId?: string;
999
- zoneId?: string;
1000
- /** Zone focal when authored, otherwise the active floor/chart legacy fallback. */
1001
- focalPoint?: Point;
1002
- /** Buyer-facing segmented-row identity. `rowId` stays the physical owner id. */
1003
- logicalRowId?: string;
1004
- /**
1005
- * Seat order inside the logical row. A deliberate missing integer is inserted
1006
- * at every aisle boundary, so numerical adjacency cannot bridge a gap.
1007
- */
1008
- logicalSeatIndex?: number;
1009
- categoryKey: string;
1010
- /** 'booth' units render as blocks (dimensions looked up via rowId = booth id). */
1011
- kind?: 'seat' | 'booth';
1012
- /** True when the seat has any accessibility accommodation — renderer rings/dims these. */
1013
- accessible?: boolean;
1014
- /** Specific accessibility accommodations (absent = none) — picker badges/filters these. */
1015
- accessibility?: AccessibilityType[];
1016
- /** Physical wheelchair provision resolved from the seat override. */
1017
- wheelchairSpaceType?: 'seat-present' | 'no-seat';
1018
- commercial?: SeatCommercialAttributes;
1019
- /** Organizer-supplied view-from-seat image (inherited from the row). */
1020
- viewUrl?: string;
1021
- /** Per-seat label size/color override; absent = inherit the row/theme default. */
1022
- labelStyle?: LabelStyle;
1023
- /**
1024
- * Real-world eye height in metres above the focal/stage datum, resolved at
1025
- * expand time from the owning section's `{height, rake}` + drawn depth (Phase B2).
1026
- * Feeds the auto-360° generator's stage-pitch math. Absent ⇒ flat seated eye
1027
- * height (legacy / seats in no section) — so old charts stay pixel-identical.
1028
- */
1029
- eyeHeightM?: number;
1030
- }
1031
- type SeatStatus = 'free' | 'held' | 'booked' | 'not_for_sale';
1032
- /** Buyer canvas projection. Perspective is a view-only projected-2.5D lane. */
1033
- type RendererViewMode = 'flat' | 'isometric' | 'perspective';
1034
- interface RendererCallbacks {
1035
- onSelect?: (seat: ExpandedSeat) => void;
1036
- onDeselect?: (seat: ExpandedSeat) => void;
1037
- /** Buyer tried to add a seat after the active selection cap was reached. */
1038
- onSelectionLimit?: (maxSelection: number) => void;
1039
- /** seat is null when the pointer leaves any seat. */
1040
- onHover?: (seat: ExpandedSeat | null) => void;
1041
- /** Keyboard focus moved to a seat (arrow-key navigation) — for screen-reader announcements. */
1042
- onFocusSeat?: (seat: ExpandedSeat | null) => void;
1043
- /** Called ~1×/sec with the measured frames-per-second. */
1044
- onFps?: (fps: number) => void;
1045
- /** Fired when a GA area is clicked (quantity picking is UI-side). */
1046
- onGAClick?: (areaId: string) => void;
1047
- /**
1048
- * Fired when a tap lands on a section outline while seats are NOT the active
1049
- * rung (i.e. zoomed out, section/zone LOD). The host glides in + shows a
1050
- * section-summary card instead of trying to select a 4px seat (Slice 5).
1051
- */
1052
- onSectionTap?: (sectionId: string) => void;
1053
- /**
1054
- * Fired when a seat/deck is tapped in the 3D all-floors stacked overview — the
1055
- * host drops back to the flat 2D map on that floor ("tap a deck to enter").
1056
- */
1057
- onDeckTap?: (floorId: string) => void;
1058
- /** Fired after any pan/zoom/resize settles — re-anchor screen-space overlays. */
1059
- onViewChange?: () => void;
1060
- /**
1061
- * Organizer manage-mode only (`manageMode` + `marqueeSelect`): fired on
1062
- * pointer-UP after a rubber-band marquee drag, or a ⌘A/Escape bulk shortcut,
1063
- * with the FULL current selection (selectable seats only). The host toolbar
1064
- * reads this to drive bulk block/unblock. Never fires when manageMode is off.
1065
- */
1066
- onMarquee?: (seats: ExpandedSeat[]) => void;
1067
- }
1068
- /** Far-zoom level-of-detail rung: whole zones → section blocks → individual seats. */
1069
- type LodRung = 'zones' | 'sections' | 'seats';
1070
- interface RendererOptions extends RendererCallbacks {
1071
- /** Max seats selectable at once (default 10). */
1072
- maxSelection?: number;
1073
- /** Only these statuses are clickable (default ['free']). */
1074
- selectableStatuses?: SeatStatus[];
1075
- /**
1076
- * Opt-in host behaviour flag — the renderer's own click/selection logic is
1077
- * unchanged (it still selects + fires `onSelect` immediately, so the seat
1078
- * highlights right away). When true, the host (e.g. PublicEventPage) treats
1079
- * that `onSelect` as a pending candidate and shows a confirm card instead of
1080
- * pushing straight into the cart; `deselect([seat.id])` on Cancel un-highlights.
1081
- */
1082
- confirmSelection?: boolean;
1083
- /** ISO 4217 currency for on-map prices ("FROM …"); defaults to money.DEFAULT_CURRENCY.
1084
- * Locale for grouping/symbol placement comes from the active i18n locale. */
1085
- currency?: string;
1086
- /**
1087
- * Organizer manage surface (SDK SeatManager). Opt-in — enables the manage-mode
1088
- * gestures (marquee, ⌘A/Escape) and the bulk-selection helpers. Buyer pan /
1089
- * pinch / tap and every existing code path are byte-identical when this is
1090
- * false (every manage branch is gated on it). Default false.
1091
- */
1092
- manageMode?: boolean;
1093
- /**
1094
- * When `manageMode` is on, a mouse/pen primary-button drag at the seats rung
1095
- * draws a rubber-band marquee that bulk-selects the seats it covers (emitting
1096
- * `onMarquee` on pointer-up) instead of panning. Touch keeps single-finger
1097
- * pan (pinch to zoom); a middle-button drag pans with a mouse. Disabled below
1098
- * the seats rung (zoom in first). No effect unless `manageMode` is also set.
1099
- */
1100
- marqueeSelect?: boolean;
1101
- }
1102
- type RenderedLabelHiddenReason = 'below-minimum-size' | 'outside-viewport' | 'dimmed-or-unavailable' | 'clutter-or-fit' | 'renderer-hidden';
1103
- /** Browser-renderer evidence used by visual QA and catalog release gates. */
1104
- interface RenderedBookableLabelEvidence {
1105
- seatId: string;
1106
- label: string;
1107
- kind: 'seat' | 'booth';
1108
- /** Painted inventory silhouette. Empty wheelchair bays are deliberately
1109
- * square, while physical seats retain the ordinary circular marker. */
1110
- markerShape: 'circle' | 'square' | 'booth';
1111
- /** Physical wheelchair provision represented by this inventory unit. */
1112
- wheelchairSpaceType?: 'seat-present' | 'no-seat';
1113
- categoryKey: string;
1114
- sectionId?: string;
1115
- zoneId?: string;
1116
- status: SeatStatus;
1117
- selected: boolean;
1118
- visible: boolean;
1119
- renderedFontPx: number;
1120
- fill: string;
1121
- ink: string;
1122
- opacity: number;
1123
- /** Buyer-visible accessibility glyph evidence. Filter emphasis uses a
1124
- * screen-space minimum so wheelchair provision remains recognizable at fit. */
1125
- accessibilityMarker?: {
1126
- glyphVisible: boolean;
1127
- glyphWidthPx: number;
1128
- emphasizedByFilter: boolean;
1129
- };
1130
- /** Direct Konva shape bounds and the production near-miss rescue combined. */
1131
- pointerTarget: {
1132
- active: boolean;
1133
- directWidthPx: number;
1134
- directHeightPx: number;
1135
- effectiveMinimumPx: number;
1136
- };
1137
- /** Centre of the painted unit, even when its text is intentionally hidden. */
1138
- screenCenter: {
1139
- x: number;
1140
- y: number;
1141
- };
1142
- screenBox?: {
1143
- x: number;
1144
- y: number;
1145
- width: number;
1146
- height: number;
1147
- };
1148
- hiddenReason?: RenderedLabelHiddenReason;
1149
- }
1150
- interface RenderedHierarchyLabelEvidence {
1151
- id: string;
1152
- kind: 'section' | 'zone';
1153
- role: 'name' | 'availability' | 'price';
1154
- label: string;
1155
- visible: boolean;
1156
- renderedFontPx: number;
1157
- opacity: number;
1158
- fill: string;
1159
- ink: string;
1160
- /** Independent geometric containment check for section-owned text. */
1161
- fitsContainer?: boolean;
1162
- screenBox?: {
1163
- x: number;
1164
- y: number;
1165
- width: number;
1166
- height: number;
1167
- };
1168
- }
1169
- interface RenderedFreeTextEvidence {
1170
- objectId: string;
1171
- kind: 'free-text' | 'stage' | 'table' | 'decor' | 'ga-label' | 'ga-capacity';
1172
- text: string;
1173
- visible: boolean;
1174
- renderedFontPx: number;
1175
- ink: string;
1176
- background: string;
1177
- opacity: number;
1178
- screenBox?: {
1179
- x: number;
1180
- y: number;
1181
- width: number;
1182
- height: number;
1183
- };
1184
- hiddenReason?: 'below-minimum-size' | 'outside-viewport' | 'renderer-hidden';
1185
- }
1186
- interface RenderedGAAreaEvidence {
1187
- areaId: string;
1188
- label: string;
1189
- capacity: number;
1190
- categoryKey: string;
1191
- /** Owning logical section when the rendered GA surface is section-contained. */
1192
- sectionId?: string;
1193
- visible: boolean;
1194
- interactive: boolean;
1195
- opacity: number;
1196
- fill: string;
1197
- effectiveBackground: string;
1198
- screenBox?: {
1199
- x: number;
1200
- y: number;
1201
- width: number;
1202
- height: number;
1203
- };
1204
- }
1205
- interface RendererQualityEvidence {
1206
- viewport: {
1207
- width: number;
1208
- height: number;
1209
- };
1210
- /** Runtime projection actually used for the pixels and hit graph below. */
1211
- projection: RendererViewMode;
1212
- /** Phase-C proof metadata. Present only in the projected-2.5D lane. */
1213
- perspective?: {
1214
- model: 'pinhole-exact-seat-anchors';
1215
- sectionSurfaceModel: 'tangent-plane';
1216
- exactSeatAnchorCount: number;
1217
- depthSorted: true;
1218
- };
1219
- canvasBackground: string;
1220
- effectiveScale: number;
1221
- rung: LodRung;
1222
- minimumVisibleLabelPx: number;
1223
- totalLabelledBookableUnits: number;
1224
- visibleLabels: number;
1225
- hiddenLabels: number;
1226
- /** Seats/table-seats/booths plus the full GA capacity. */
1227
- totalBookableUnits: number;
1228
- selectionRingSeatIds: string[];
1229
- selectionRingColor: string;
1230
- focusedSectionId: string | null;
1231
- focusBackdropVisible: boolean;
1232
- categoryFilterKeys: string[] | null;
1233
- /** Exact scene-graph proof for the clean section-first overview contract. */
1234
- overviewStyle: {
1235
- visibleSectionShells: number;
1236
- categoryPaintedSectionShells: number;
1237
- visibleCategoryDetailOutlines: number;
1238
- visibleSectionRowHints: number;
1239
- visibleSectionAvailabilityLabels: number;
1240
- visibleSectionGADetails: number;
1241
- };
1242
- labels: RenderedBookableLabelEvidence[];
1243
- gaAreas: RenderedGAAreaEvidence[];
1244
- hierarchyLabels: RenderedHierarchyLabelEvidence[];
1245
- freeTextLabels: RenderedFreeTextEvidence[];
1246
- }
1247
- interface ISeatmapRenderer {
1248
- /** Replace the chart. Resets selection and statuses, zooms to fit.
1249
- * `opts.floorId` picks which floor to render on a multi-floor chart (Batch 5). */
1250
- setChart(doc: ChartDoc, opts?: {
1251
- floorId?: string;
1252
- }): void;
1253
- /** Bulk status update; re-renders affected seats only. */
1254
- setStatus(seatIds: string[], status: SeatStatus): void;
1255
- /**
1256
- * Mark the active buyer's own held seats. They remain server-status `held`,
1257
- * but render with the buyer selection treatment instead of the anonymous
1258
- * unavailable treatment used for another buyer's hold.
1259
- */
1260
- setOwnedHold?(seatIds: string[] | null): void;
1261
- /**
1262
- * Mark one selected seat as the buyer's pending confirmation candidate.
1263
- * The candidate receives a strong focus halo while unrelated seats recede;
1264
- * pass null after Select/Cancel. This is visual only and never mutates the
1265
- * renderer selection.
1266
- */
1267
- setSelectionFocus?(seatId: string | null): void;
1268
- /**
1269
- * SYNCHRONOUS repaint that bypasses requestAnimationFrame. Konva's batchDraw()
1270
- * (used by setStatus and friends) schedules the actual paint on the next rAF
1271
- * tick, which Chrome throttles/pauses on hidden, backgrounded, or occluded
1272
- * tabs — so a seat-status delta updates the scene graph but the pixels never
1273
- * change until the tab is foregrounded again. forceDraw() paints the affected
1274
- * layers immediately (Layer.draw() is synchronous) and flushes any pending
1275
- * cache-debounce, so a caller (visibilitychange catch-up, or an opted-in
1276
- * always-live board) can guarantee the canvas reflects current state
1277
- * regardless of tab visibility. No-op difference in the foreground.
1278
- */
1279
- forceDraw(): void;
1280
- getStatus(seatId: string): SeatStatus;
1281
- getSelection(): ExpandedSeat[];
1282
- clearSelection(): void;
1283
- /** Update the buyer selection cap without rebuilding the chart or camera. */
1284
- setMaxSelection?(maxSelection: number): void;
1285
- /**
1286
- * Programmatically restore free seats (for example an Undo action). Added
1287
- * seats respect the active cap and do not reopen a confirmation popover.
1288
- */
1289
- select?(seatIds: string[]): ExpandedSeat[];
1290
- /**
1291
- * Dynamically update organizer-only interaction without rebuilding the
1292
- * renderer. No buyer surface calls this; every behavior remains gated by
1293
- * `manageMode` exactly as it is at construction time.
1294
- */
1295
- setManageInteraction?(options: {
1296
- manageMode: boolean;
1297
- marqueeSelect: boolean;
1298
- selectableStatuses: SeatStatus[];
1299
- maxSelection?: number;
1300
- }): void;
1301
- /** Organizer-only section heat overlay. Values are normalized 0..1. */
1302
- setSectionHeat?(scores: Record<string, number> | null): void;
1303
- /**
1304
- * Manage-mode bulk selection helpers (no-op / empty unless `manageMode`).
1305
- * They select the matching SELECTABLE seats (respecting `selectableStatuses`
1306
- * + closed sections), union with the current selection, and return the seats
1307
- * they added — the SDK SeatManager expands category/row/section picks to
1308
- * labels and drives one batched block/unblock from them.
1309
- */
1310
- selectAllSelectable?(): ExpandedSeat[];
1311
- selectByLabels?(labels: string[]): ExpandedSeat[];
1312
- /** Exact-render QA only: select one server-chosen unit without label ambiguity. */
1313
- setEvidenceSelection?(seatId: string): boolean;
1314
- /** Selectable seats belonging to a section OR zone id (no selection side-effect). */
1315
- getSelectableInSection?(sectionId: string): ExpandedSeat[];
1316
- /** Programmatic deselect of specific seats (e.g. chip × in the cart). */
1317
- deselect(seatIds: string[]): void;
1318
- /**
1319
- * Brief attention pulse on a seat (a ring that expands + fades once) — used to
1320
- * signal live activity, e.g. a seat "just taken" by another buyer via a WS
1321
- * delta. Purely visual; no state change. `color` overrides the default.
1322
- */
1323
- flashSeat(seatId: string, color?: string): void;
1324
- /**
1325
- * Brief organizer attention pulse around a whole section. This is a visual
1326
- * overlay only: it never changes section geometry, hit targets, selection, or
1327
- * the active camera. Useful for grouped realtime operations at venue overview.
1328
- */
1329
- flashSection?(sectionId: string, color?: string): void;
1330
- zoomToFit(): void;
1331
- /** Zoom in one step about the viewport center, clamped to the usual zoom bounds. */
1332
- zoomIn(): void;
1333
- /** Zoom out one step about the viewport center, clamped to the usual zoom bounds. */
1334
- zoomOut(): void;
1335
- /** Individually status-managed seats/table-seats/booths; excludes GA capacity. */
1336
- seatCount(): number;
1337
- /** Seats/table-seats/booths plus the full capacity of rendered GA areas. */
1338
- bookableCount(): number;
1339
- /**
1340
- * Maps a chart-space point (or a seat, by its x/y) to container-relative
1341
- * screen pixels, using the current stage scale/position. Lets host UI anchor
1342
- * DOM overlays (confirm card, tooltip) over a live seat and re-anchor them
1343
- * on `onViewChange`.
1344
- */
1345
- worldToScreen(point: Point): {
1346
- x: number;
1347
- y: number;
1348
- };
1349
- /** When on, dim non-accessible free seats so accessible seats stand out. */
1350
- setAccessibleFilter(on: boolean): void;
1351
- /**
1352
- * Dim free seats that lack ANY of these accessibility types. `null` clears the
1353
- * filter; `[]` means "any accessible seat" (same as setAccessibleFilter(true)).
1354
- */
1355
- setAccessibilityFilter(types: AccessibilityType[] | null): void;
1356
- /** Legend hover-highlight: dim free seats of other categories (null clears). */
1357
- setCategoryHighlight?(key: string | null): void;
1358
- /** Price-band filter (F4): dim free seats whose category is NOT in `keys`
1359
- * (null clears). The widget resolves which categories fall in the band. */
1360
- setCategoryFilter?(keys: string[] | null): void;
1361
- /** Smoothly frame the currently available seats in these categories. `null`
1362
- * returns to the full chart. Used after an explicit buyer price-filter action. */
1363
- focusCategories?(keys: string[] | null): void;
1364
- /** Dim the seats of these section/zone ids (organizer manager: held-back inventory). */
1365
- setDimmedSections?(ids: string[] | null): void;
1366
- /**
1367
- * Phase 2 event-level section states: mark these section/zone ids `closed` —
1368
- * flat grey block, seats greyed + not pickable, section stays rendered.
1369
- * `null`/empty clears. (Distinct from the buyer's applyHidden seat-strip.)
1370
- */
1371
- setClosedSections?(ids: string[] | null): void;
1372
- /**
1373
- * AXS section-focus: dim + desaturate every other section, draw a calm backdrop
1374
- * behind this section, and glide the camera to frame it. Seat-picking is gated
1375
- * until seats are large enough on screen (≥ LABEL_SCALE). Slice 5 / Phase 2 §4.
1376
- */
1377
- focusSection?(id: string): void;
1378
- /** Clear an AXS section focus (restore full-bowl brightness + drop backdrop). */
1379
- clearSectionFocus?(): void;
1380
- /** The currently AXS-focused section id, or null. */
1381
- getFocusedSection?(): string | null;
1382
- /** World-space rect currently visible in the viewport (minimap viewport frame). */
1383
- getVisibleWorldRect?(): {
1384
- x: number;
1385
- y: number;
1386
- width: number;
1387
- height: number;
1388
- };
1389
- /** Axis-aligned world bounds of all seats + section outlines (minimap frame). */
1390
- getWorldBounds?(): {
1391
- x: number;
1392
- y: number;
1393
- width: number;
1394
- height: number;
1395
- };
1396
- /**
1397
- * Colorblind-safe mode: category hues switch to an Okabe-Ito palette and
1398
- * booked seats render hollow (a non-color cue), so seat state never relies
1399
- * on hue alone. Off (the default) renders exactly as before.
1400
- */
1401
- setColorblindSafe?(on: boolean): void;
1402
- /**
1403
- * Switch the projection. `'flat'` = normal top-down; `'isometric'` = the
1404
- * legacy affine preview; `'perspective'` = projected 2.5D with exact pinhole
1405
- * seat anchors/native hit shapes and bounded per-section tangent surfaces.
1406
- * Purely visual — the chart is authored flat.
1407
- */
1408
- setViewMode?(mode: RendererViewMode): void;
1409
- /** Current projection (defaults to 'flat' when unimplemented). */
1410
- getViewMode?(): RendererViewMode;
1411
- /** Multi-floor (Batch 5): switch the shown floor; list floors; read the active id. */
1412
- setActiveFloor?(floorId: string): void;
1413
- getFloors?(): {
1414
- id: string;
1415
- name: string;
1416
- }[];
1417
- getActiveFloorId?(): string;
1418
- /** Render all floors stacked (3D overview) vs the active floor. No-op single-floor. */
1419
- setStacked?(on: boolean): void;
1420
- isStacked?(): boolean;
1421
- /**
1422
- * Section id whose outline contains a container-relative screen point (or null).
1423
- * Feeds the far-zoom "tap a section to zoom in" flow (Slice 5).
1424
- */
1425
- sectionAt?(clientPoint: Point): string | null;
1426
- /** Seat ids belonging to a section — for the section-summary card (Slice 5). */
1427
- sectionMembers?(id: string): string[];
1428
- /**
1429
- * Smoothly glide (pan+zoom) the camera to frame a section (by id) or a world-
1430
- * space bounds rect over a calm easeInOutCubic glide. `prefers-reduced-motion` snaps.
1431
- * A pointer-down (grab/pan) cancels an in-flight glide. Slice 5 "glide in".
1432
- */
1433
- focusRegion?(target: string | {
1434
- x: number;
1435
- y: number;
1436
- width: number;
1437
- height: number;
1438
- }, opts?: {
1439
- animate?: boolean;
1440
- minScale?: number;
1441
- durationMs?: number;
1442
- }): void;
1443
- /** Current LOD rung derived from zoom (for the ZONES/SECTIONS/SEATS pill). */
1444
- getRung?(): LodRung;
1445
- /** Jump the camera to a rung's zoom band, centred on the chart (glided). */
1446
- setRung?(rung: LodRung): void;
1447
- /** Read actual browser-rendered label visibility, size, fill, ink and state.
1448
- * Pure diagnostic: it never changes chart or renderer state. */
1449
- getRenderedQualityEvidence(): RendererQualityEvidence;
1450
- destroy(): void;
1451
- }
1452
- /** localStorage key the Designer writes and the Picker reads. */
1453
- declare const CHART_STORAGE_KEY = "seatmap.chart";
1
+ import { A as AccessibilityType, S as SeatOverride, R as RowObject, L as LabelStyle, a as RectTableSide, C as ChartDoc, b as ChartObject, B as BoothObject, E as ExpandedSeat, T as TableObject, F as Floor, P as Point, c as SectionObject, d as RectTableSeatCounts, G as GAAreaObject, e as GAInventorySegment, f as RendererQualityEvidence, g as RenderedFreeTextEvidence, I as ISeatmapRenderer, h as RendererOptions, i as SeatStatus, j as RendererViewMode, k as LodRung, l as CategoryTier, m as SeatCommercialAttributes, n as RendererCallbacks } from './types-B-tpUFqz.js';
2
+ export { o as ACCESSIBILITY_RING_COLOR, p as ACCESSIBILITY_TYPES, q as AccessibilityMeta, r as CHART_STORAGE_KEY, s as Category, t as ChartReferenceImage, u as ChartTheme, v as CubicPath, D as DecorImageObject, w as LABEL_STYLE_MAX_SIZE, x as LABEL_STYLE_MIN_SIZE, y as LabelPresentation, z as ReferenceAccessibilitySource, H as ReferenceCalibration, J as ReferenceCategorySource, K as ReferenceDerivedScale, M as ReferenceInventoryExclusionSource, N as ReferenceInventorySource, O as ReferenceScanProposal, Q as ReferenceScanRowProposal, U as ReferenceScanSectionProposal, V as ReferenceSeatSeed, W as ReferenceSectionTraceBatchInput, X as ReferenceSectionTraceBatchProposal, Y as ReferenceSectionTraceInput, Z as ReferenceSectionTraceProposal, _ as RenderedBookableLabelEvidence, $ as RenderedGAAreaEvidence, a0 as RenderedHierarchyLabelEvidence, a1 as RenderedLabelHiddenReason, a2 as SURROUNDINGS_SHAPE_ROLES, a3 as SectionOutlinePath, a4 as SectionPathSegment, a5 as SelectionLayer, a6 as ShapeLineCap, a7 as ShapeLineEnding, a8 as ShapeLineJoin, a9 as ShapeObject, aa as TextObject, ab as ZoneDef, ac as accessibilityMeta, ad as accessibilityRingColor, ae as layerOf } from './types-B-tpUFqz.js';
1454
3
 
1455
4
  /**
1456
5
  * Pure geometry helpers — no Konva, no DOM. Turns the parametric chart
@@ -3169,11 +1718,39 @@ declare class PickerController {
3169
1718
  /**
3170
1719
  * Synthetic view-from-seat panorama, generated from chart geometry alone.
3171
1720
  *
3172
- * Draws a 2048×1024 equirectangular texture of a dark hall with the stage
3173
- * placed at the correct bearing and angular size for THIS seat closer seats
3174
- * see a bigger stage, off-center seats see it at an angle. Used whenever the
3175
- * organizer hasn't uploaded a real photo/360 for the seat; both go through the
3176
- * same viewer.
1721
+ * Draws a 2048×1024 equirectangular texture of the hall as seen from THIS seat.
1722
+ * Everything is placed from geometry the viewer already carriesthe seat's
1723
+ * position, its per-seat eye height (which already bakes in its section's
1724
+ * height + rake + row rise), and every other seat's position + eye height:
1725
+ *
1726
+ * • the SCENE at the correct bearing/angular size, chosen from the chart's own
1727
+ * geometry — a proscenium theatre stage, an in-the-round centre-stage deck,
1728
+ * or a flat sports playing surface (see {@link classifyScene});
1729
+ * • the SURROUNDING STANDS — other sections drawn as darker raked banks
1730
+ * rising to the pitch of their highest seat at their true bearing (upper
1731
+ * tiers loom higher, a pit sits below the horizon), so the buyer senses the
1732
+ * bowl wrapping around them;
1733
+ * • a BALCONY-OVERHANG ceiling lip where a high, near section sits overhead;
1734
+ * • the AUDIENCE — nearby people drawn as stylised head/neck/shoulder
1735
+ * silhouettes at their true bearing, rising behind and dropping in front
1736
+ * with the rake, near rows occluding far ones (painter's order).
1737
+ *
1738
+ * Used whenever the organizer hasn't uploaded a real photo/360 for the seat;
1739
+ * both go through the same viewer, and the designer preview reuses this exact
1740
+ * generator so authors see what buyers will.
1741
+ *
1742
+ * Height data drives the extra depth: a FLAT chart (no eye-height spread) draws
1743
+ * only the plain dark hall + scene + audience it always has — no raked masses,
1744
+ * no overhang, nothing invented from absent data.
1745
+ *
1746
+ * SCENE + PER-VENUE VARIATION. The picker hands this generator only seats — never
1747
+ * the stage object — so scene TYPE is inferred from the audience geometry around
1748
+ * the focal point (a bowl that wraps ~360° with a small central void is a
1749
+ * centre-stage arena; a large elongated void is a sports surface; a one-sided
1750
+ * audience is a proscenium theatre), and a stable per-chart seed (hashed from the
1751
+ * seat count + section ids + focal) drives backdrop hue, lighting tint and rig
1752
+ * layout so every venue looks like its own place. All deterministic: same
1753
+ * chart + seat ⇒ byte-identical texture (no Date, no Math.random).
3177
1754
  *
3178
1755
  * Equirectangular mapping: x = (yaw + 180°)/360° · W, y = (90° − pitch)/180° · H,
3179
1756
  * where yaw 0 = the direction the camera faces by default.
@@ -3259,4 +1836,4 @@ declare function formatMoney(amount: number, currency?: string, fractionDigits?:
3259
1836
  /** Bare symbol for input adornments ("€", "$", "₹"). */
3260
1837
  declare function currencySymbol(currency?: string): string;
3261
1838
 
3262
- export { ACCESSIBILITY_RING_COLOR, ACCESSIBILITY_TYPES, type AccessibilityMeta, type AccessibilityType, type AvailabilityRule, type BoothObject, CHART_STORAGE_KEY, type Category, type CategoryTier, type ChartDoc, type ChartObject, type ChartReferenceImage, type ChartTheme, type CubicPath, DEFAULT_CURRENCY, type DecorImageObject, type Dict, type ExpandChartOptions, type ExpandedSeat, type Floor, type GAAreaObject, type GAInventorySegment, type HoldConflict, type HoldInfo, type HoldSelectionRequest, type HoldServerItem, type ISeatmapRenderer, LABEL_STYLE_MAX_SIZE, LABEL_STYLE_MIN_SIZE, type LabelPresentation, type LabelStyle, type Locale, type LodRung, MAX_EVENT_INVENTORY, MAX_GA_CAPACITY, type PanoramaResult, type PickerCallbacks, PickerController, type PickerGAArea, type PickerOptions, type PickerSeat, type PickerTransport, type Point, RENDERED_QUALITY_REPORT_VERSION, type RectTableSeatCounts, type RectTableSide, type ReferenceAccessibilitySource, type ReferenceCalibration, type ReferenceCategorySource, type ReferenceDerivedScale, type ReferenceInventoryExclusionSource, type ReferenceInventorySource, type ReferenceScanProposal, type ReferenceScanRowProposal, type ReferenceScanSectionProposal, type ReferenceSeatSeed, type RenderedBookableLabelEvidence, type RenderedEvidenceState, type RenderedFreeTextEvidence, type RenderedGAAreaEvidence, type RenderedHierarchyLabelEvidence, type RenderedLabelHiddenReason, type RenderedQualityFinding, type RenderedQualityFindingCode, type RenderedQualityReport, type RenderedQualitySample, type RendererCallbacks, type RendererOptions, type RendererQualityEvidence, type RendererViewMode, type RowObject, type RowSeatSlot, SUPPORTED_LOCALES, SURROUNDINGS_SHAPE_ROLES, type SeatCommercialAttributes, type SeatHoverDetails, type SeatOverride, type SeatStatus, SeatmapRenderer, type SectionCategory, type SectionNode, type SectionObject, type SectionOutlinePath, type SectionPathSegment, type SectionSummary, type SelectionLayer, type ShapeLineCap, type ShapeLineEnding, type ShapeLineJoin, type ShapeObject, TIER_HEIGHT_M, type TableObject, type TableSeatSlot, type TableSelectionDetails, type TextObject, UNGROUPED_ID, type ZoneDef, accessibilityMeta, accessibilityRingColor, allObjects, applyHidden, chartBounds, computeSections, createRenderer, currencySymbol, expandBooth, expandChart, expandRow, expandRowSlots, expandTable, expandTableSlots, floorObjects, floorsOf, formatDate, formatMoney, gaAreasOf, gaInventorySegments, gaUnitLabel, gaUnitLabels, generateSeatPanorama, generateSeatThumb, getLocale, growJoinedGAInventory, hiddenObjectIds, inspectRenderedQualityEvidence, isGaUnitLabel, isSectionHidden, layerOf, loadLocale, objectCenter, owningSectionForObject, pointInPolygon, pointInPolygonWithHoles, polygonLabelPoint, resolveLocale, rowInventoryCount, rowSeatPositions, seatLabelPart, sectionGeometry, setLocale, setMoneyLocale, setStringOverrides, stackFloors, t, tCount, tableInventoryCount, tableSeatCountsBySide, validGAInventorySegments };
1839
+ export { AccessibilityType, type AvailabilityRule, BoothObject, CategoryTier, ChartDoc, ChartObject, DEFAULT_CURRENCY, type Dict, type ExpandChartOptions, ExpandedSeat, Floor, GAAreaObject, GAInventorySegment, type HoldConflict, type HoldInfo, type HoldSelectionRequest, type HoldServerItem, ISeatmapRenderer, LabelStyle, type Locale, LodRung, MAX_EVENT_INVENTORY, MAX_GA_CAPACITY, type PanoramaResult, type PickerCallbacks, PickerController, type PickerGAArea, type PickerOptions, type PickerSeat, type PickerTransport, Point, RENDERED_QUALITY_REPORT_VERSION, RectTableSeatCounts, RectTableSide, type RenderedEvidenceState, RenderedFreeTextEvidence, type RenderedQualityFinding, type RenderedQualityFindingCode, type RenderedQualityReport, type RenderedQualitySample, RendererCallbacks, RendererOptions, RendererQualityEvidence, RendererViewMode, RowObject, type RowSeatSlot, SUPPORTED_LOCALES, SeatCommercialAttributes, type SeatHoverDetails, SeatOverride, SeatStatus, SeatmapRenderer, type SectionCategory, type SectionNode, SectionObject, type SectionSummary, TIER_HEIGHT_M, TableObject, type TableSeatSlot, type TableSelectionDetails, UNGROUPED_ID, allObjects, applyHidden, chartBounds, computeSections, createRenderer, currencySymbol, expandBooth, expandChart, expandRow, expandRowSlots, expandTable, expandTableSlots, floorObjects, floorsOf, formatDate, formatMoney, gaAreasOf, gaInventorySegments, gaUnitLabel, gaUnitLabels, generateSeatPanorama, generateSeatThumb, getLocale, growJoinedGAInventory, hiddenObjectIds, inspectRenderedQualityEvidence, isGaUnitLabel, isSectionHidden, loadLocale, objectCenter, owningSectionForObject, pointInPolygon, pointInPolygonWithHoles, polygonLabelPoint, resolveLocale, rowInventoryCount, rowSeatPositions, seatLabelPart, sectionGeometry, setLocale, setMoneyLocale, setStringOverrides, stackFloors, t, tCount, tableInventoryCount, tableSeatCountsBySide, validGAInventorySegments };