@seatlayer/core 0.25.0 → 0.26.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.cjs +2101 -298
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +652 -54
- package/dist/index.d.ts +652 -54
- package/dist/index.js +2089 -297
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -95,7 +95,7 @@ interface CategoryTier {
|
|
|
95
95
|
* venues (and seats.io) expose so buyers can filter for exactly what they need
|
|
96
96
|
* and organizers can mark seats precisely. `wheelchair` is the legacy default.
|
|
97
97
|
*/
|
|
98
|
-
type AccessibilityType = 'wheelchair' | 'companion' | 'semi-ambulatory' | 'hearing' | 'sign-language' | 'plus-size' | 'lift-armrest';
|
|
98
|
+
type AccessibilityType = 'wheelchair' | 'companion' | 'semi-ambulatory' | 'hearing' | 'cart' | 'sign-language' | 'plus-size' | 'lift-armrest';
|
|
99
99
|
interface AccessibilityMeta {
|
|
100
100
|
key: AccessibilityType;
|
|
101
101
|
/** Full descriptive label (designer checkbox, picker legend). */
|
|
@@ -135,6 +135,13 @@ interface SeatOverride {
|
|
|
135
135
|
accessible?: boolean;
|
|
136
136
|
/** Accessibility accommodations of this seat (empty/absent = none). */
|
|
137
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';
|
|
138
145
|
/** Commercial selling/view attributes are deliberately not accessibility. */
|
|
139
146
|
commercial?: SeatCommercialAttributes;
|
|
140
147
|
/** Seat-specific view photo; falls back to the row photo. */
|
|
@@ -218,6 +225,13 @@ interface ChartTheme {
|
|
|
218
225
|
interface RowObject {
|
|
219
226
|
type: 'row';
|
|
220
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
|
+
};
|
|
221
235
|
/** Row label, e.g. "A". Seat labels are `${label}-${n}`. */
|
|
222
236
|
label: string;
|
|
223
237
|
/** Buyer-facing row name. `label` remains the legacy inventory prefix. */
|
|
@@ -279,6 +293,48 @@ interface RowObject {
|
|
|
279
293
|
rowIndex: number;
|
|
280
294
|
segmentIndex: number;
|
|
281
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
|
+
};
|
|
282
338
|
/** First seat number (default 1). Roman/letters read it as a 1-based ordinal
|
|
283
339
|
* (start 1 → I / A). */
|
|
284
340
|
seatLabelStart?: number;
|
|
@@ -297,13 +353,16 @@ interface RowObject {
|
|
|
297
353
|
* - `even` 2,4,6 — even numbers from the first even ≥ start.
|
|
298
354
|
* - `updown` 1,3,5,…,6,4,2 — odd-up-even-back; REPLACES direction (uses
|
|
299
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.
|
|
300
359
|
* - `roman` I,II,III — honours direction + step + start (uppercase).
|
|
301
360
|
* - `letters-upper` A,B,C…Z,AA — honours direction + step + start.
|
|
302
361
|
* - `letters-lower` a,b,c…z,aa — honours direction + step + start.
|
|
303
362
|
* Like `step`/`direction` today, the scheme changes the seat's inventory
|
|
304
363
|
* label (its booking identity), by design.
|
|
305
364
|
*/
|
|
306
|
-
scheme?: 'decimal' | 'odd' | 'even' | 'updown' | 'roman' | 'letters-upper' | 'letters-lower';
|
|
365
|
+
scheme?: 'decimal' | 'odd' | 'even' | 'updown' | 'updown-descending' | 'roman' | 'letters-upper' | 'letters-lower';
|
|
307
366
|
/** Optional prefix prepended to every seat number, e.g. 'R' → 'R1', 'R2'. */
|
|
308
367
|
prefix?: string;
|
|
309
368
|
/**
|
|
@@ -334,7 +393,10 @@ interface RowObject {
|
|
|
334
393
|
interface GAAreaObject {
|
|
335
394
|
type: 'gaArea';
|
|
336
395
|
id: string;
|
|
396
|
+
/** Stable technical/inventory label. */
|
|
337
397
|
label: string;
|
|
398
|
+
/** Buyer-facing area name; technical `label` and GA unit ids stay stable. */
|
|
399
|
+
displayLabel?: string;
|
|
338
400
|
/** Buyer-facing type word override (seats.io "Displayed type"), ≤24 chars.
|
|
339
401
|
* Absent = the default type word. Pure presentation. */
|
|
340
402
|
displayType?: string;
|
|
@@ -344,8 +406,29 @@ interface GAAreaObject {
|
|
|
344
406
|
holes?: Point[][];
|
|
345
407
|
capacity: number;
|
|
346
408
|
categoryKey: string;
|
|
409
|
+
/**
|
|
410
|
+
* Durable inventory provenance for a surface produced by Join Areas.
|
|
411
|
+
*
|
|
412
|
+
* A GA unit is identified by the id and zero-based range of the area that
|
|
413
|
+
* originally authored it, not by the current polygon which happens to own
|
|
414
|
+
* it. Keeping those source ranges means a geometric join never renumbers an
|
|
415
|
+
* already published/booked unit. Ordinary (never-joined) areas omit this
|
|
416
|
+
* field and implicitly own `[0, capacity)` under their own id.
|
|
417
|
+
*
|
|
418
|
+
* The ranges must be non-overlapping, contain positive whole counts, and sum
|
|
419
|
+
* exactly to `capacity`; validation rejects malformed metadata. Capacity
|
|
420
|
+
* growth appends a new range under the surviving area id, while shrinking a
|
|
421
|
+
* joined area is deliberately refused because it would silently destroy
|
|
422
|
+
* stable inventory identities.
|
|
423
|
+
*/
|
|
424
|
+
inventorySegments?: GAInventorySegment[];
|
|
347
425
|
referenceInventorySource?: ReferenceInventorySource;
|
|
348
426
|
}
|
|
427
|
+
interface GAInventorySegment {
|
|
428
|
+
sourceAreaId: string;
|
|
429
|
+
startIndex: number;
|
|
430
|
+
count: number;
|
|
431
|
+
}
|
|
349
432
|
/**
|
|
350
433
|
* Durable evidence link for sellable objects generated from a private reference.
|
|
351
434
|
* The client supplies facts and stable logical-section ids, never coordinates.
|
|
@@ -394,20 +477,46 @@ interface ReferenceInventoryExclusionSource {
|
|
|
394
477
|
evidence: 'user-confirmed' | 'authoritative-source';
|
|
395
478
|
sourceDescription: string;
|
|
396
479
|
}
|
|
480
|
+
/** Open-path stroke semantics. Optional ShapeObject fields retain the legacy
|
|
481
|
+
* round/round/no-ending rendering when absent. */
|
|
482
|
+
type ShapeLineCap = 'butt' | 'round' | 'square';
|
|
483
|
+
type ShapeLineJoin = 'miter' | 'round' | 'bevel';
|
|
484
|
+
type ShapeLineEnding = 'none' | 'arrow';
|
|
397
485
|
/** Non-bookable décor: stage, walls, exits. */
|
|
398
486
|
interface ShapeObject {
|
|
399
487
|
type: 'shape';
|
|
400
488
|
id: string;
|
|
401
|
-
|
|
489
|
+
/**
|
|
490
|
+
* Closed area shapes (`rect`/`ellipse`/`polygon`) take a `fill`; open path
|
|
491
|
+
* primitives (`line` = two points, `polyline` = n points) are stroke-only and
|
|
492
|
+
* never filled. All kinds honour the optional `stroke`.
|
|
493
|
+
*/
|
|
494
|
+
kind: 'rect' | 'ellipse' | 'polygon' | 'line' | 'polyline';
|
|
402
495
|
label?: string;
|
|
403
496
|
/** For rect/ellipse: bounding box. For a stage polygon: the base (pre-shape) box, so its kind can be regenerated. */
|
|
404
497
|
x?: number;
|
|
405
498
|
y?: number;
|
|
406
499
|
width?: number;
|
|
407
500
|
height?: number;
|
|
408
|
-
/** For polygon. */
|
|
501
|
+
/** For polygon/line/polyline. */
|
|
409
502
|
points?: Point[];
|
|
410
503
|
fill?: string;
|
|
504
|
+
/** Optional outline. `width` is in chart units; both fields are required together. */
|
|
505
|
+
stroke?: {
|
|
506
|
+
color: string;
|
|
507
|
+
width: number;
|
|
508
|
+
};
|
|
509
|
+
/** Open line/polyline only. Absent fields preserve round/round/no-ending legacy rendering. */
|
|
510
|
+
lineCap?: ShapeLineCap;
|
|
511
|
+
/** Controls corners between open-path segments. */
|
|
512
|
+
lineJoin?: ShapeLineJoin;
|
|
513
|
+
/** Independent open-path start/end decorations. Closed outlines never use these fields. */
|
|
514
|
+
startEnding?: ShapeLineEnding;
|
|
515
|
+
endEnding?: ShapeLineEnding;
|
|
516
|
+
/** Rect only — corner rounding radius in chart units, clamped to half the short side at edit time. */
|
|
517
|
+
cornerRadius?: number;
|
|
518
|
+
/** Whole-shape opacity 0.1–1 (default 1). */
|
|
519
|
+
opacity?: number;
|
|
411
520
|
/** Degrees clockwise about the shape's center (default 0). Applied at render time. */
|
|
412
521
|
rotation?: number;
|
|
413
522
|
/**
|
|
@@ -420,12 +529,27 @@ interface ShapeObject {
|
|
|
420
529
|
/** For a stage: which `StageKind` its polygon was generated from. */
|
|
421
530
|
stageKind?: string;
|
|
422
531
|
}
|
|
423
|
-
|
|
532
|
+
type RectTableSide = 'top' | 'bottom' | 'left' | 'right';
|
|
533
|
+
/** Exact rectangular-table chair distribution. The four keys are deliberately
|
|
534
|
+
* required: zero means that edge has no chair, while the sum is the authored
|
|
535
|
+
* `seatCount`. Numeric chair identity remains `${table.id}:${index}` in the
|
|
536
|
+
* canonical top, bottom, left, right expansion order. */
|
|
537
|
+
interface RectTableSeatCounts {
|
|
538
|
+
top: number;
|
|
539
|
+
bottom: number;
|
|
540
|
+
left: number;
|
|
541
|
+
right: number;
|
|
542
|
+
}
|
|
543
|
+
/** Seats arranged around a table. Grouped selling is activated only by an
|
|
544
|
+
* event's explicit inventory-model-2 snapshot; model-1 events continue to
|
|
545
|
+
* treat every authored chair as an independent unit. */
|
|
424
546
|
interface TableObject {
|
|
425
547
|
type: 'table';
|
|
426
548
|
id: string;
|
|
427
549
|
/** e.g. "T1" — seat labels are `${label}-${n}`. */
|
|
428
550
|
label: string;
|
|
551
|
+
/** Buyer-facing table name; technical chair/group labels stay stable. */
|
|
552
|
+
displayLabel?: string;
|
|
429
553
|
/** Buyer-facing type word override (seats.io "Displayed type"), ≤24 chars.
|
|
430
554
|
* Absent = the default "Row"/"Table" word. Pure presentation. */
|
|
431
555
|
displayType?: string;
|
|
@@ -434,7 +558,16 @@ interface TableObject {
|
|
|
434
558
|
/** Seats around the perimeter (round) or along the enabled edges (rect). */
|
|
435
559
|
seatCount: number;
|
|
436
560
|
/** Rect tables: which edges get seats (default ['top','bottom']). */
|
|
437
|
-
sides?:
|
|
561
|
+
sides?: RectTableSide[];
|
|
562
|
+
/**
|
|
563
|
+
* Rect tables only: exact chairs on every edge. Absent preserves the legacy
|
|
564
|
+
* `seatCount` + `sides` round-robin distribution byte-for-byte. When present,
|
|
565
|
+
* all four values are whole numbers >= 0 and their sum equals `seatCount`.
|
|
566
|
+
*/
|
|
567
|
+
seatCountsBySide?: RectTableSeatCounts;
|
|
568
|
+
/** Individual-chair semantic overrides. Grouped whole/variable tables cannot
|
|
569
|
+
* author these because their only sellable identity is the table itself. */
|
|
570
|
+
overrides?: SeatOverride[];
|
|
438
571
|
rotation: number;
|
|
439
572
|
/** Round tables. */
|
|
440
573
|
radius?: number;
|
|
@@ -449,15 +582,23 @@ interface TableObject {
|
|
|
449
582
|
width?: number;
|
|
450
583
|
height?: number;
|
|
451
584
|
categoryKey: string;
|
|
452
|
-
/**
|
|
585
|
+
/** One buyer owns the complete table at exactly `seatCount` guests. */
|
|
453
586
|
bookAsWhole?: boolean;
|
|
587
|
+
/** One buyer owns the complete table and chooses a bounded guest quantity. */
|
|
588
|
+
variableOccupancy?: boolean;
|
|
589
|
+
/** Required inclusive guest bounds when `variableOccupancy` is true. */
|
|
590
|
+
minOccupancy?: number;
|
|
591
|
+
maxOccupancy?: number;
|
|
454
592
|
referenceInventorySource?: ReferenceInventorySource;
|
|
455
593
|
}
|
|
456
594
|
/** A booth: one bookable unit rendered as a block (trade shows, VIP boxes). */
|
|
457
595
|
interface BoothObject {
|
|
458
596
|
type: 'booth';
|
|
459
597
|
id: string;
|
|
598
|
+
/** Stable technical/inventory label. */
|
|
460
599
|
label: string;
|
|
600
|
+
/** Buyer-facing booth name; technical `label` stays stable. */
|
|
601
|
+
displayLabel?: string;
|
|
461
602
|
/** Buyer-facing type word override (seats.io "Displayed type"), ≤24 chars.
|
|
462
603
|
* Absent = the default type word. Pure presentation. */
|
|
463
604
|
displayType?: string;
|
|
@@ -486,6 +627,13 @@ interface SectionObject {
|
|
|
486
627
|
* ("Entrance X"). ≤40 chars; absent = no entrance line. Pure presentation.
|
|
487
628
|
*/
|
|
488
629
|
entrance?: string;
|
|
630
|
+
/**
|
|
631
|
+
* Organizer-supplied view image inherited by buyer inventory whose owning
|
|
632
|
+
* row/table/booth sits in this logical section. Seat and row photos take
|
|
633
|
+
* precedence; multipart components are kept in sync by the shared section
|
|
634
|
+
* metadata operation.
|
|
635
|
+
*/
|
|
636
|
+
viewFromSeatUrl?: string;
|
|
489
637
|
labelPresentation?: LabelPresentation;
|
|
490
638
|
/**
|
|
491
639
|
* Stable management/inventory identity shared by disconnected visual
|
|
@@ -532,11 +680,35 @@ interface SectionObject {
|
|
|
532
680
|
* Tier height. 0 = floor (default). Higher values lift the section in the
|
|
533
681
|
* picker's isometric ("3D") view, drawn on extruded side faces. Same field a
|
|
534
682
|
* future multi-floor mode reuses — authored in 2D, never drawn by the user.
|
|
683
|
+
*
|
|
684
|
+
* This is the coarse, back-compat source for {@link height}/{@link rake}: when
|
|
685
|
+
* those are absent, {@link sectionGeometry} derives real geometry from this
|
|
686
|
+
* tier so legacy charts render pixel-identical.
|
|
535
687
|
*/
|
|
536
688
|
elevation?: number;
|
|
689
|
+
/**
|
|
690
|
+
* 3D foundations (Phase A, additive — no migration; charts are JSON blobs).
|
|
691
|
+
* Metres the section's **front edge** sits above floor 0 (a balcony/tier floor
|
|
692
|
+
* height). Absent ⇒ derived from the coarse {@link elevation} tier via
|
|
693
|
+
* {@link sectionGeometry}. Deliberately two scalars, not a foundation polygon:
|
|
694
|
+
* front-height + {@link rake} fully determine a rectangular tier's back-height.
|
|
695
|
+
*
|
|
696
|
+
* NOTE: no consumer reads this raw field directly — all callers go through
|
|
697
|
+
* {@link sectionGeometry}. Phase B consumers (iso view lift in
|
|
698
|
+
* `SeatmapRenderer`, per-seat eye-height in the `generatePanorama` 360°
|
|
699
|
+
* generator) are intentionally NOT wired in Phase A. Range 0–120 m.
|
|
700
|
+
*/
|
|
701
|
+
height?: number;
|
|
702
|
+
/**
|
|
703
|
+
* Degrees of seating incline within the section (0 = flat; typical stalls
|
|
704
|
+
* 5–15°, steep tiers 25–35°). Absent ⇒ 0. Consumed alongside {@link height}
|
|
705
|
+
* by the future Phase B iso-lift shear and 360° sightline math — never in
|
|
706
|
+
* Phase A. Range 0–45°.
|
|
707
|
+
*/
|
|
708
|
+
rake?: number;
|
|
537
709
|
/** Uniform scale about the outline centroid (1 = as drawn). Scales members too. */
|
|
538
710
|
scale?: number;
|
|
539
|
-
/** 0–
|
|
711
|
+
/** 0–100: reviewed strength last used to bend member rows toward a common fitted arc. */
|
|
540
712
|
smoothing?: number;
|
|
541
713
|
/** Degrees clockwise about the outline centroid (default 0). Rotates members too. */
|
|
542
714
|
rotation?: number;
|
|
@@ -550,23 +722,42 @@ interface ZoneDef {
|
|
|
550
722
|
id: string;
|
|
551
723
|
label: string;
|
|
552
724
|
color?: string;
|
|
725
|
+
/**
|
|
726
|
+
* Authored point this zone faces. Optional only for legacy documents: runtime
|
|
727
|
+
* consumers fall back to the active floor/chart focal, while publication of
|
|
728
|
+
* a zone-mode draft requires every used zone to carry an explicit point.
|
|
729
|
+
*/
|
|
730
|
+
focalPoint?: Point;
|
|
553
731
|
}
|
|
554
732
|
/**
|
|
555
733
|
* Selection layer — a hit-test/dim filter in the designer, NOT z-order management.
|
|
556
734
|
* Fixed set of four; derived from object type via `layerOf()` (no per-object field yet).
|
|
557
735
|
*/
|
|
558
736
|
type SelectionLayer = 'interactive' | 'background' | 'foreground' | 'surroundings';
|
|
737
|
+
/** Shape roles emitted by the curated venue-landmark palette. Keep this list in
|
|
738
|
+
* lockstep with `DECOR_PRESETS`; the selection-layer unit test fails if either
|
|
739
|
+
* vocabulary changes without an explicit routing decision. `reference-focal`
|
|
740
|
+
* is source-backed venue context rather than an authoring-palette preset. */
|
|
741
|
+
declare const SURROUNDINGS_SHAPE_ROLES: readonly ["reference-focal", "bar", "entrance", "exit", "restroom", "screen", "sound", "concession", "coat", "wall"];
|
|
559
742
|
/** Derive an object's selection layer from its type. */
|
|
560
743
|
declare function layerOf(obj: ChartObject): SelectionLayer;
|
|
561
744
|
/** Free-standing text on the chart (aisle names, door labels…). */
|
|
562
745
|
interface TextObject {
|
|
563
746
|
type: 'text';
|
|
564
747
|
id: string;
|
|
748
|
+
/** Persisted provenance for objects created from the venue-icon palette. */
|
|
749
|
+
semanticKind?: 'icon';
|
|
565
750
|
text: string;
|
|
566
751
|
position: Point;
|
|
567
752
|
fontSize: number;
|
|
753
|
+
/** Optional CSS family stack for this annotation; absent inherits ChartTheme.fontFamily. */
|
|
754
|
+
fontFamily?: string;
|
|
568
755
|
rotation: number;
|
|
569
756
|
color?: string;
|
|
757
|
+
/** Render weight (default false). Maps to Konva fontStyle bold. */
|
|
758
|
+
bold?: boolean;
|
|
759
|
+
/** Render slant (default false). Maps to Konva fontStyle italic. */
|
|
760
|
+
italic?: boolean;
|
|
570
761
|
}
|
|
571
762
|
/**
|
|
572
763
|
* A raster/vector decor graphic drawn IN the chart, beneath the seats and
|
|
@@ -590,6 +781,12 @@ interface DecorImageObject {
|
|
|
590
781
|
rotation?: number;
|
|
591
782
|
/** 0–1 (default 1). Multiplied by any chart-theme dimming at render time. */
|
|
592
783
|
opacity?: number;
|
|
784
|
+
/**
|
|
785
|
+
* Z-layer relative to the interactive seat layer. `background` (default)
|
|
786
|
+
* draws beneath the seats/sections; `foreground` draws above them (a roof
|
|
787
|
+
* canopy, an overlay graphic). Absent = background — no migration needed.
|
|
788
|
+
*/
|
|
789
|
+
layer?: 'background' | 'foreground';
|
|
593
790
|
/** Optional caption for the designer inspector / accessibility (not drawn). */
|
|
594
791
|
label?: string;
|
|
595
792
|
}
|
|
@@ -603,8 +800,25 @@ type ChartObject = RowObject | GAAreaObject | ShapeObject | TableObject | BoothO
|
|
|
603
800
|
interface Floor {
|
|
604
801
|
id: string;
|
|
605
802
|
name: string;
|
|
803
|
+
/**
|
|
804
|
+
* Absolute physical deck height in metres above the venue/stage datum.
|
|
805
|
+
* Optional for backwards compatibility; an absent value resolves to ground
|
|
806
|
+
* level (0 m). Section tiers and rakes are separate, section-local metadata.
|
|
807
|
+
* Range 0–120 m.
|
|
808
|
+
*/
|
|
809
|
+
baseHeightM?: number;
|
|
606
810
|
objects: ChartObject[];
|
|
607
811
|
focalPoint: Point;
|
|
812
|
+
/**
|
|
813
|
+
* Private organizer trace/calibration layer. This is authoring evidence and
|
|
814
|
+
* must never be served to, or rendered by, a buyer surface.
|
|
815
|
+
*/
|
|
816
|
+
referenceImage?: ChartReferenceImage;
|
|
817
|
+
/**
|
|
818
|
+
* Buyer-visible aesthetic background. Canonical documents store URL-only
|
|
819
|
+
* images here. Historical `assetId` values are interpreted as a trace layer
|
|
820
|
+
* by the background compatibility helpers.
|
|
821
|
+
*/
|
|
608
822
|
backgroundImage?: ChartDoc['backgroundImage'];
|
|
609
823
|
}
|
|
610
824
|
interface ReferenceCalibration {
|
|
@@ -618,6 +832,64 @@ interface ReferenceCalibration {
|
|
|
618
832
|
/** Derived and stored for deterministic geometry compilers. */
|
|
619
833
|
pixelsPerUnit: number;
|
|
620
834
|
}
|
|
835
|
+
/**
|
|
836
|
+
* A single human-placed seat probe: the author clicks one seat on the reference
|
|
837
|
+
* image and the server reads the surrounding seat lattice from it.
|
|
838
|
+
*
|
|
839
|
+
* COORDINATE-POLICY CARVE-OUT (owner decision 2026-07-21). The reference
|
|
840
|
+
* blueprint pipeline runs `coordinatePolicy: 'opaque-region-ids-only'` — the
|
|
841
|
+
* server is the sole source of chart coordinates and MCP clients select opaque
|
|
842
|
+
* `reg_*` ids, never points. This type is a deliberate, narrow exception on the
|
|
843
|
+
* same grounds as `ReferenceCalibration`: the point is placed by a human in the
|
|
844
|
+
* designer canvas, not proposed by a model.
|
|
845
|
+
*
|
|
846
|
+
* Therefore this is DESIGNER-ONLY and is intentionally NOT exposed over MCP.
|
|
847
|
+
* That is an accepted, documented exception to the MCP-parity rule — the
|
|
848
|
+
* server-is-sole-source guarantee for model-driven edits is worth more than
|
|
849
|
+
* parity here. Do not "fix" it by adding a seed point to an MCP tool schema.
|
|
850
|
+
*/
|
|
851
|
+
interface ReferenceSeatSeed {
|
|
852
|
+
/** Seed centre in immutable source-image pixels (never chart coordinates). */
|
|
853
|
+
source: Point;
|
|
854
|
+
/** Half-width of the author's sizing ring, in source pixels — the "this is how
|
|
855
|
+
* big one seat is" hint that replaces seats.io's zoom-until-it-matches step. */
|
|
856
|
+
radius: number;
|
|
857
|
+
/** Whether `radius` was fitted from image pixels or set by hand. Detection
|
|
858
|
+
* weights an author-set radius more heavily than one we guessed. */
|
|
859
|
+
origin: 'auto-fit' | 'manual';
|
|
860
|
+
}
|
|
861
|
+
/** One detected row in a scan proposal — a straight seat run in CHART
|
|
862
|
+
* coordinates (the server maps source pixels through referencePixelToChart;
|
|
863
|
+
* clients never see source-pixel geometry back). */
|
|
864
|
+
interface ReferenceScanRowProposal {
|
|
865
|
+
start: Point;
|
|
866
|
+
end: Point;
|
|
867
|
+
seatCount: number;
|
|
868
|
+
}
|
|
869
|
+
/** Detected rows attributed to one compiled section (or unattributed when the
|
|
870
|
+
* lattice extends outside every compiled polygon). */
|
|
871
|
+
interface ReferenceScanSectionProposal {
|
|
872
|
+
/** Id of the compiled SectionObject the rows landed in; null = unattributed. */
|
|
873
|
+
sectionId: string | null;
|
|
874
|
+
name: string;
|
|
875
|
+
rows: ReferenceScanRowProposal[];
|
|
876
|
+
seatCount: number;
|
|
877
|
+
/** 0..1 — how well this section's lattice agreed with the probe's pitch. */
|
|
878
|
+
confidence: number;
|
|
879
|
+
/** Index of the seed (multi-probe) whose pitch produced these rows. */
|
|
880
|
+
seedIndex: number;
|
|
881
|
+
}
|
|
882
|
+
/** Server response for an in-canvas reference scan. A PROPOSAL — nothing is
|
|
883
|
+
* committed until the author applies it in the designer (chartOps + undo). */
|
|
884
|
+
interface ReferenceScanProposal {
|
|
885
|
+
assetId: string;
|
|
886
|
+
/** Measured seat diameter / centre-to-centre pitch, in chart units. */
|
|
887
|
+
seatDiameter: number;
|
|
888
|
+
seatPitch: number;
|
|
889
|
+
totalSeats: number;
|
|
890
|
+
totalRows: number;
|
|
891
|
+
sections: ReferenceScanSectionProposal[];
|
|
892
|
+
}
|
|
621
893
|
/** Coordinate-free physical scale derived by server code from a confirmed
|
|
622
894
|
* semantic feature. Unlike manual two-point calibration, no source points pass
|
|
623
895
|
* through an MCP client or language model. */
|
|
@@ -669,7 +941,16 @@ interface ChartDoc {
|
|
|
669
941
|
* is kept mirroring floor 0 so single-floor readers never branch. */
|
|
670
942
|
floors?: Floor[];
|
|
671
943
|
objects: ChartObject[];
|
|
672
|
-
/**
|
|
944
|
+
/**
|
|
945
|
+
* Private floor-plan source used for tracing, calibration, scanning and
|
|
946
|
+
* reference-backed generation. Buyer projections always remove this field.
|
|
947
|
+
*/
|
|
948
|
+
referenceImage?: ChartReferenceImage;
|
|
949
|
+
/**
|
|
950
|
+
* Buyer-visible aesthetic background. Canonical values are URL-only.
|
|
951
|
+
* Compatibility: a historical value containing `assetId` is trace-only and
|
|
952
|
+
* is never rendered or exposed to buyers.
|
|
953
|
+
*/
|
|
673
954
|
backgroundImage?: ChartReferenceImage;
|
|
674
955
|
/** Brand/venue theming (colors); categories carry their own colors separately. */
|
|
675
956
|
theme?: ChartTheme;
|
|
@@ -691,6 +972,18 @@ interface ExpandedSeat {
|
|
|
691
972
|
x: number;
|
|
692
973
|
y: number;
|
|
693
974
|
rowId: string;
|
|
975
|
+
/** Owning logical section and navigation zone, resolved once at expand time. */
|
|
976
|
+
sectionId?: string;
|
|
977
|
+
zoneId?: string;
|
|
978
|
+
/** Zone focal when authored, otherwise the active floor/chart legacy fallback. */
|
|
979
|
+
focalPoint?: Point;
|
|
980
|
+
/** Buyer-facing segmented-row identity. `rowId` stays the physical owner id. */
|
|
981
|
+
logicalRowId?: string;
|
|
982
|
+
/**
|
|
983
|
+
* Seat order inside the logical row. A deliberate missing integer is inserted
|
|
984
|
+
* at every aisle boundary, so numerical adjacency cannot bridge a gap.
|
|
985
|
+
*/
|
|
986
|
+
logicalSeatIndex?: number;
|
|
694
987
|
categoryKey: string;
|
|
695
988
|
/** 'booth' units render as blocks (dimensions looked up via rowId = booth id). */
|
|
696
989
|
kind?: 'seat' | 'booth';
|
|
@@ -698,13 +991,24 @@ interface ExpandedSeat {
|
|
|
698
991
|
accessible?: boolean;
|
|
699
992
|
/** Specific accessibility accommodations (absent = none) — picker badges/filters these. */
|
|
700
993
|
accessibility?: AccessibilityType[];
|
|
994
|
+
/** Physical wheelchair provision resolved from the seat override. */
|
|
995
|
+
wheelchairSpaceType?: 'seat-present' | 'no-seat';
|
|
701
996
|
commercial?: SeatCommercialAttributes;
|
|
702
997
|
/** Organizer-supplied view-from-seat image (inherited from the row). */
|
|
703
998
|
viewUrl?: string;
|
|
704
999
|
/** Per-seat label size/color override; absent = inherit the row/theme default. */
|
|
705
1000
|
labelStyle?: LabelStyle;
|
|
1001
|
+
/**
|
|
1002
|
+
* Real-world eye height in metres above the focal/stage datum, resolved at
|
|
1003
|
+
* expand time from the owning section's `{height, rake}` + drawn depth (Phase B2).
|
|
1004
|
+
* Feeds the auto-360° generator's stage-pitch math. Absent ⇒ flat seated eye
|
|
1005
|
+
* height (legacy / seats in no section) — so old charts stay pixel-identical.
|
|
1006
|
+
*/
|
|
1007
|
+
eyeHeightM?: number;
|
|
706
1008
|
}
|
|
707
1009
|
type SeatStatus = 'free' | 'held' | 'booked' | 'not_for_sale';
|
|
1010
|
+
/** Buyer canvas projection. Perspective is a view-only projected-2.5D lane. */
|
|
1011
|
+
type RendererViewMode = 'flat' | 'isometric' | 'perspective';
|
|
708
1012
|
interface RendererCallbacks {
|
|
709
1013
|
onSelect?: (seat: ExpandedSeat) => void;
|
|
710
1014
|
onDeselect?: (seat: ExpandedSeat) => void;
|
|
@@ -779,6 +1083,11 @@ interface RenderedBookableLabelEvidence {
|
|
|
779
1083
|
seatId: string;
|
|
780
1084
|
label: string;
|
|
781
1085
|
kind: 'seat' | 'booth';
|
|
1086
|
+
/** Painted inventory silhouette. Empty wheelchair bays are deliberately
|
|
1087
|
+
* square, while physical seats retain the ordinary circular marker. */
|
|
1088
|
+
markerShape: 'circle' | 'square' | 'booth';
|
|
1089
|
+
/** Physical wheelchair provision represented by this inventory unit. */
|
|
1090
|
+
wheelchairSpaceType?: 'seat-present' | 'no-seat';
|
|
782
1091
|
categoryKey: string;
|
|
783
1092
|
sectionId?: string;
|
|
784
1093
|
zoneId?: string;
|
|
@@ -789,6 +1098,13 @@ interface RenderedBookableLabelEvidence {
|
|
|
789
1098
|
fill: string;
|
|
790
1099
|
ink: string;
|
|
791
1100
|
opacity: number;
|
|
1101
|
+
/** Buyer-visible accessibility glyph evidence. Filter emphasis uses a
|
|
1102
|
+
* screen-space minimum so wheelchair provision remains recognizable at fit. */
|
|
1103
|
+
accessibilityMarker?: {
|
|
1104
|
+
glyphVisible: boolean;
|
|
1105
|
+
glyphWidthPx: number;
|
|
1106
|
+
emphasizedByFilter: boolean;
|
|
1107
|
+
};
|
|
792
1108
|
/** Direct Konva shape bounds and the production near-miss rescue combined. */
|
|
793
1109
|
pointerTarget: {
|
|
794
1110
|
active: boolean;
|
|
@@ -869,6 +1185,15 @@ interface RendererQualityEvidence {
|
|
|
869
1185
|
width: number;
|
|
870
1186
|
height: number;
|
|
871
1187
|
};
|
|
1188
|
+
/** Runtime projection actually used for the pixels and hit graph below. */
|
|
1189
|
+
projection: RendererViewMode;
|
|
1190
|
+
/** Phase-C proof metadata. Present only in the projected-2.5D lane. */
|
|
1191
|
+
perspective?: {
|
|
1192
|
+
model: 'pinhole-exact-seat-anchors';
|
|
1193
|
+
sectionSurfaceModel: 'tangent-plane';
|
|
1194
|
+
exactSeatAnchorCount: number;
|
|
1195
|
+
depthSorted: true;
|
|
1196
|
+
};
|
|
872
1197
|
canvasBackground: string;
|
|
873
1198
|
effectiveScale: number;
|
|
874
1199
|
rung: LodRung;
|
|
@@ -1053,13 +1378,14 @@ interface ISeatmapRenderer {
|
|
|
1053
1378
|
*/
|
|
1054
1379
|
setColorblindSafe?(on: boolean): void;
|
|
1055
1380
|
/**
|
|
1056
|
-
* Switch the projection. `'flat'` = normal top-down; `'isometric'` = the
|
|
1057
|
-
*
|
|
1058
|
-
*
|
|
1381
|
+
* Switch the projection. `'flat'` = normal top-down; `'isometric'` = the
|
|
1382
|
+
* legacy affine preview; `'perspective'` = projected 2.5D with exact pinhole
|
|
1383
|
+
* seat anchors/native hit shapes and bounded per-section tangent surfaces.
|
|
1384
|
+
* Purely visual — the chart is authored flat.
|
|
1059
1385
|
*/
|
|
1060
|
-
setViewMode?(mode:
|
|
1386
|
+
setViewMode?(mode: RendererViewMode): void;
|
|
1061
1387
|
/** Current projection (defaults to 'flat' when unimplemented). */
|
|
1062
|
-
getViewMode?():
|
|
1388
|
+
getViewMode?(): RendererViewMode;
|
|
1063
1389
|
/** Multi-floor (Batch 5): switch the shown floor; list floors; read the active id. */
|
|
1064
1390
|
setActiveFloor?(floorId: string): void;
|
|
1065
1391
|
getFloors?(): {
|
|
@@ -1128,6 +1454,8 @@ declare const CHART_STORAGE_KEY = "seatmap.chart";
|
|
|
1128
1454
|
*/
|
|
1129
1455
|
/** Base (pre-override) seat centre per index — shared by expandRow + designer edit mode. */
|
|
1130
1456
|
declare function rowSeatPositions(row: RowObject): Point[];
|
|
1457
|
+
/** Sellable row slots: skipped slots are absent; empty wheelchair bays remain. */
|
|
1458
|
+
declare function rowInventoryCount(row: RowObject): number;
|
|
1131
1459
|
/**
|
|
1132
1460
|
* Every seat slot of a row INCLUDING skipped ones (designer seat-edit mode uses
|
|
1133
1461
|
* this to draw un-skip handles). Overrides (dx/dy/label/categoryKey) are applied
|
|
@@ -1143,10 +1471,17 @@ interface RowSeatSlot {
|
|
|
1143
1471
|
skipped: boolean;
|
|
1144
1472
|
accessible: boolean;
|
|
1145
1473
|
accessibility: AccessibilityType[];
|
|
1474
|
+
wheelchairSpaceType?: SeatOverride['wheelchairSpaceType'];
|
|
1146
1475
|
commercial?: RowObject['commercial'];
|
|
1147
1476
|
viewUrl?: string;
|
|
1148
1477
|
labelStyle?: LabelStyle;
|
|
1149
1478
|
}
|
|
1479
|
+
/** Every authored table-chair slot, including skipped inventory. This mirrors
|
|
1480
|
+
* row seat slots so Designer, MCP and buyer/event expansion share one semantic
|
|
1481
|
+
* source while retaining the table's stable numeric slot identity. */
|
|
1482
|
+
interface TableSeatSlot extends RowSeatSlot {
|
|
1483
|
+
side?: RectTableSide;
|
|
1484
|
+
}
|
|
1150
1485
|
/**
|
|
1151
1486
|
* The seat NUMBER part of a row seat's label (the row prefix is prepended by the
|
|
1152
1487
|
* caller). Applies the row's numbering scheme, direction, step, start and label
|
|
@@ -1163,6 +1498,15 @@ declare function expandRow(row: RowObject): ExpandedSeat[];
|
|
|
1163
1498
|
* bottom edges (split evenly, any remainder to the top), 16u outside the edge,
|
|
1164
1499
|
* the whole set rotated about the table centre.
|
|
1165
1500
|
*/
|
|
1501
|
+
/** Legacy rect tables distribute aggregate capacity round-robin across enabled
|
|
1502
|
+
* sides, then emit chairs in canonical top/bottom/left/right order. */
|
|
1503
|
+
declare function tableSeatCountsBySide(t: TableObject): RectTableSeatCounts;
|
|
1504
|
+
/** Expand every authored table chair, including skipped slots needed by the
|
|
1505
|
+
* Designer to restore inventory. */
|
|
1506
|
+
declare function expandTableSlots(t: TableObject): TableSeatSlot[];
|
|
1507
|
+
/** Sellable individual table chairs. Grouped tables own one atomic inventory
|
|
1508
|
+
* unit elsewhere and therefore retain their full authored chair capacity. */
|
|
1509
|
+
declare function tableInventoryCount(t: TableObject): number;
|
|
1166
1510
|
declare function expandTable(t: TableObject): ExpandedSeat[];
|
|
1167
1511
|
/** Expand a booth into its single bookable block unit. */
|
|
1168
1512
|
declare function expandBooth(b: BoothObject): ExpandedSeat[];
|
|
@@ -1178,6 +1522,14 @@ declare function polygonLabelPoint(outer: Point[], holes: Point[][] | undefined)
|
|
|
1178
1522
|
* shape: bbox centre; text: its position.
|
|
1179
1523
|
*/
|
|
1180
1524
|
declare function objectCenter(o: ChartObject): Point;
|
|
1525
|
+
/**
|
|
1526
|
+
* Resolve one bookable object's owning physical section using the canonical
|
|
1527
|
+
* first-match rule. Generated reference inventory may name a logical section,
|
|
1528
|
+
* but that provenance is trusted only when the stored geometry confirms it.
|
|
1529
|
+
* Keeping this primitive in layout lets section inventory, category painting,
|
|
1530
|
+
* and buyer view inheritance share one ownership decision.
|
|
1531
|
+
*/
|
|
1532
|
+
declare function owningSectionForObject(objects: ChartObject[], object: ChartObject): SectionObject | undefined;
|
|
1181
1533
|
/**
|
|
1182
1534
|
* Normalized floor list (Batch 5): a multi-floor chart's `floors`, or a synthetic
|
|
1183
1535
|
* single floor wrapping a single-floor chart's `objects`. Every consumer that needs
|
|
@@ -1195,8 +1547,15 @@ declare function allObjects(doc: ChartDoc): ChartObject[];
|
|
|
1195
1547
|
* only for the 3D overview render — 2D still shows one floor via `floorObjects`.
|
|
1196
1548
|
*/
|
|
1197
1549
|
declare function stackFloors(doc: ChartDoc, spread?: number): ChartDoc;
|
|
1198
|
-
|
|
1199
|
-
|
|
1550
|
+
interface ExpandChartOptions {
|
|
1551
|
+
/** Physical height for a single-floor projection extracted from a multi-floor
|
|
1552
|
+
* document. Full multi-floor documents resolve each floor directly. */
|
|
1553
|
+
floorBaseHeightM?: number;
|
|
1554
|
+
}
|
|
1555
|
+
/** Expand every seat-bearing object across all floors (rows, tables, booths).
|
|
1556
|
+
* Multi-floor ownership is resolved one floor at a time: local coordinates may
|
|
1557
|
+
* overlap between floors and must never assign a seat to another floor's section. */
|
|
1558
|
+
declare function expandChart(doc: ChartDoc, options?: ExpandChartOptions): ExpandedSeat[];
|
|
1200
1559
|
/** Axis-aligned bounds over every object plus the background image, with padding. */
|
|
1201
1560
|
declare function chartBounds(doc: ChartDoc): {
|
|
1202
1561
|
x: number;
|
|
@@ -1209,10 +1568,63 @@ declare const MAX_GA_CAPACITY = 100000;
|
|
|
1209
1568
|
declare const MAX_EVENT_INVENTORY = 100000;
|
|
1210
1569
|
/** Stable internal inventory label for one unit of a GA area's capacity. */
|
|
1211
1570
|
declare function gaUnitLabel(areaId: string, index: number): string;
|
|
1571
|
+
/** Strict, bounded validation for durable Join Areas inventory provenance. */
|
|
1572
|
+
declare function validGAInventorySegments(area: GAAreaObject): boolean;
|
|
1573
|
+
/** Canonical source ranges. Invalid explicit provenance intentionally yields no
|
|
1574
|
+
* labels: chart validation blocks publication instead of inventing identities. */
|
|
1575
|
+
declare function gaInventorySegments(area: GAAreaObject): GAInventorySegment[];
|
|
1212
1576
|
declare function gaUnitLabels(area: GAAreaObject): string[];
|
|
1577
|
+
/** Append-only capacity semantics for an already joined GA surface. */
|
|
1578
|
+
declare function growJoinedGAInventory(area: GAAreaObject, nextCapacity: number): GAInventorySegment[] | undefined;
|
|
1213
1579
|
declare function gaAreasOf(doc: ChartDoc): GAAreaObject[];
|
|
1214
1580
|
declare function isGaUnitLabel(label: string): boolean;
|
|
1215
1581
|
|
|
1582
|
+
/**
|
|
1583
|
+
* Real-world scale primitives — the ONE place the app fixes chart-unit ↔ metre ↔
|
|
1584
|
+
* renderer-world scale, and the section 3D-geometry resolver that rides on it.
|
|
1585
|
+
*
|
|
1586
|
+
* Everything that converts between chart units, metres, and renderer "world"
|
|
1587
|
+
* units derives from {@link METRES_PER_CHART_UNIT}. Renderer world units and
|
|
1588
|
+
* chart units are 1:1, so metres → world is exactly {@link CHART_UNITS_PER_METRE}
|
|
1589
|
+
* (the single m→world conversion constant Phase B consumers use).
|
|
1590
|
+
*
|
|
1591
|
+
* This is a leaf module (types only) so both `layout.ts` and `sections.ts` can
|
|
1592
|
+
* import it without the two forming an import cycle.
|
|
1593
|
+
*/
|
|
1594
|
+
|
|
1595
|
+
/**
|
|
1596
|
+
* Metres of front-edge height one elevation tier represents. Chosen (not guessed)
|
|
1597
|
+
* so `elevation × TIER_HEIGHT_M` metres, scaled back through
|
|
1598
|
+
* {@link CHART_UNITS_PER_METRE}, equals the legacy `elevation × LIFT_PER_STEP`
|
|
1599
|
+
* world lift exactly — an un-authored chart stays pixel-identical. ≈ 1.329 m/tier.
|
|
1600
|
+
*/
|
|
1601
|
+
declare const TIER_HEIGHT_M: number;
|
|
1602
|
+
/**
|
|
1603
|
+
* Resolve a section's real 3D geometry, applying the legacy-elevation fallback so
|
|
1604
|
+
* old charts and new charts share ONE code path. Every consumer (iso lift, 360°
|
|
1605
|
+
* eye-height, author lint, any 2D depth cue) must call this and never read the raw
|
|
1606
|
+
* {@link SectionObject.height}/{@link SectionObject.rake} fields — that is what
|
|
1607
|
+
* keeps un-authored charts rendering identically to today.
|
|
1608
|
+
*
|
|
1609
|
+
* - `height`: authored absolute metres if present, else owning-floor base height
|
|
1610
|
+
* plus `elevation × TIER_HEIGHT_M`.
|
|
1611
|
+
* - `rake`: authored degrees if present, else 0 (flat).
|
|
1612
|
+
*
|
|
1613
|
+
* Malformed values are bounded here as a last defensive barrier. Structural
|
|
1614
|
+
* validation still reports them so drafts can be repaired instead of silently
|
|
1615
|
+
* persisting a renderer-only interpretation.
|
|
1616
|
+
*
|
|
1617
|
+
* Pure — no document mutation, no side effects.
|
|
1618
|
+
*/
|
|
1619
|
+
interface SectionGeometryContext {
|
|
1620
|
+
/** Absolute physical height of the owning floor above the venue datum. */
|
|
1621
|
+
floorBaseHeightM?: number;
|
|
1622
|
+
}
|
|
1623
|
+
declare function sectionGeometry(section: Pick<SectionObject, 'elevation' | 'height' | 'rake'>, context?: SectionGeometryContext): {
|
|
1624
|
+
height: number;
|
|
1625
|
+
rake: number;
|
|
1626
|
+
};
|
|
1627
|
+
|
|
1216
1628
|
/**
|
|
1217
1629
|
* Section membership + hide/show resolution (Batch 3.3).
|
|
1218
1630
|
*
|
|
@@ -1415,8 +1827,17 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1415
1827
|
private seatLayer;
|
|
1416
1828
|
private overlayLayer;
|
|
1417
1829
|
private labelGroup;
|
|
1830
|
+
/** Per-elevated-section label containers. Keeping the labels grouped lets the
|
|
1831
|
+
* Phase-B lift move thousands of seat labels with one transform per section
|
|
1832
|
+
* instead of rewriting every label on every tween frame. */
|
|
1833
|
+
private labelLiftGroups;
|
|
1834
|
+
/** Foreground decor images — drawn on the overlay layer, ABOVE the seats. */
|
|
1835
|
+
private fgDecorGroup;
|
|
1418
1836
|
private seats;
|
|
1419
1837
|
private seatById;
|
|
1838
|
+
/** One build per chart/floor; section membership queries only inspect seats in
|
|
1839
|
+
* the section bounds instead of rescanning the full 13k venue per section. */
|
|
1840
|
+
private seatIndex;
|
|
1420
1841
|
/** Multi-floor (Batch 5): the last-set chart + which floor we're rendering. */
|
|
1421
1842
|
private chartDoc;
|
|
1422
1843
|
private activeFloorId;
|
|
@@ -1432,13 +1853,11 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1432
1853
|
private seatLabelById;
|
|
1433
1854
|
/** Coloured accommodation ring per accessible seat (few per chart). */
|
|
1434
1855
|
private accessRingById;
|
|
1435
|
-
/** Centred
|
|
1436
|
-
*
|
|
1437
|
-
*
|
|
1438
|
-
*
|
|
1856
|
+
/** Centred ♿ glyph per physical wheelchair provision. It keeps a small
|
|
1857
|
+
* screen-space floor at every LOD and grows when the Wheelchair filter is
|
|
1858
|
+
* active. Kept in a map so zoom updates touch only the handful of matching
|
|
1859
|
+
* seats, never all 13k nodes. */
|
|
1439
1860
|
private accessGlyphById;
|
|
1440
|
-
/** Whether the accessibility glyph is legible at the current camera scale. */
|
|
1441
|
-
private accessGlyphVisible;
|
|
1442
1861
|
/** Authored free-text nodes obey the same rendered-size visibility floor. */
|
|
1443
1862
|
private freeTextById;
|
|
1444
1863
|
/** Stage/rink landmarks retain a readable screen-space caption at overview. */
|
|
@@ -1464,6 +1883,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1464
1883
|
/** One selected seat being inspected before it is committed to the cart. */
|
|
1465
1884
|
private selectionFocusId;
|
|
1466
1885
|
private hoverRing;
|
|
1886
|
+
/** Seat currently owning the shared hover ring (null while not hovering). */
|
|
1887
|
+
private hoveredId;
|
|
1467
1888
|
/** Keyboard-navigation focus ring + the currently focused seat id. */
|
|
1468
1889
|
private focusRing;
|
|
1469
1890
|
private focusedId;
|
|
@@ -1482,6 +1903,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1482
1903
|
private sections;
|
|
1483
1904
|
private zones;
|
|
1484
1905
|
private seatSection;
|
|
1906
|
+
/** Seats outside every authored section retain the legacy path in one group. */
|
|
1907
|
+
private unsectionedSeatGroup;
|
|
1485
1908
|
private catPrice;
|
|
1486
1909
|
/** ISO 4217 currency for on-map "FROM …" prices (undefined ⇒ money default). */
|
|
1487
1910
|
private currency;
|
|
@@ -1496,6 +1919,9 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1496
1919
|
private focusedSectionId;
|
|
1497
1920
|
/** Light backdrop panel drawn behind the focused section (removed on clear). */
|
|
1498
1921
|
private focusBackdrop;
|
|
1922
|
+
/** Non-listening visual dim outside the focused section. One overlay replaces
|
|
1923
|
+
* descendant opacity mutations across every seat in the venue. */
|
|
1924
|
+
private focusDimOverlay;
|
|
1499
1925
|
/** Object id → floor id (multi-floor only) — resolves a deck tap in the 3D stack. */
|
|
1500
1926
|
private objectFloor;
|
|
1501
1927
|
/** Zone id → colour (drives extruded side faces in iso view). */
|
|
@@ -1507,10 +1933,33 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1507
1933
|
private isoT;
|
|
1508
1934
|
private isoTarget;
|
|
1509
1935
|
private isoRaf;
|
|
1936
|
+
/** Public view target; perspective is a separate non-affine Phase-C lane. */
|
|
1937
|
+
private viewMode;
|
|
1938
|
+
private perspectiveCamera;
|
|
1939
|
+
/** Ground-plane tangent applied once to every renderer layer. */
|
|
1940
|
+
private perspectiveBaseAffine;
|
|
1941
|
+
private perspectiveBaseInverse;
|
|
1942
|
+
/** Exact pinhole anchor expressed in the overlay tangent-layer coordinates. */
|
|
1943
|
+
private perspectiveSeatLocal;
|
|
1944
|
+
/** Exact projected point (before Stage pan/zoom), keyed by seat. */
|
|
1945
|
+
private perspectiveSeatProjected;
|
|
1946
|
+
/** Positive camera depth, used for deterministic far→near paint order. */
|
|
1947
|
+
private perspectiveSeatDepth;
|
|
1948
|
+
/** Exact pinhole size ratio at each seat anchor. */
|
|
1949
|
+
private perspectiveSeatScale;
|
|
1950
|
+
/** Seats whose native Konva nodes currently carry the exact projected pose.
|
|
1951
|
+
* Large sectioned venues apply these lazily as a section enters the live-seat
|
|
1952
|
+
* viewport; the overview rung hides the seat layer completely. */
|
|
1953
|
+
private perspectiveAppliedSeats;
|
|
1954
|
+
private perspectiveBounds;
|
|
1510
1955
|
/** Chart centre the iso projection pivots about (bounds centre). */
|
|
1511
1956
|
private isoCentre;
|
|
1512
1957
|
/** rAF for an in-flight camera glide (focusRegion / setRung); 0 = none. */
|
|
1513
1958
|
private glideRaf;
|
|
1959
|
+
/** While the camera tween is active, defer polygon label fitting/collision to
|
|
1960
|
+
* the settled frame. Geometry remains smoothly stage-scaled, while expensive
|
|
1961
|
+
* point-in-polygon text work no longer repeats at 120 Hz. */
|
|
1962
|
+
private glideInProgress;
|
|
1514
1963
|
/** Set in destroy() so an in-flight iso tween bails. */
|
|
1515
1964
|
private destroyed;
|
|
1516
1965
|
/** Cached scale the section/zone labels were last sized for (scale-compensation). */
|
|
@@ -1537,6 +1986,28 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1537
1986
|
private panStarted;
|
|
1538
1987
|
/** Maximum displacement from gesture start — suppress taps only after a real pan/pinch. */
|
|
1539
1988
|
private moved;
|
|
1989
|
+
/**
|
|
1990
|
+
* Ghost-click guard. Konva binds `_pointerup` to mouseup, touchend AND
|
|
1991
|
+
* pointerup, so `on('click tap')` is two handlers for one finger tap unless
|
|
1992
|
+
* the browser's synthesized compatibility click is suppressed. Konva only
|
|
1993
|
+
* suppresses it when the touch lands on a LISTENING SHAPE (Stage.js returns
|
|
1994
|
+
* early before its preventDefault() when `!shape || !shape.isListening()`),
|
|
1995
|
+
* so a near-miss rescued by nearestSeatToScreen used to fire `tap` (select)
|
|
1996
|
+
* then `click` (deselect) 1-3ms apart and net to nothing. With
|
|
1997
|
+
* SEAT_TAP_SLOP_PX=14 against a ~12px seat radius, that broken annulus is
|
|
1998
|
+
* ~3.7x the area of the seat itself — i.e. most successful mobile taps.
|
|
1999
|
+
* `touch-action: none` does NOT suppress compatibility mouse events.
|
|
2000
|
+
*/
|
|
2001
|
+
private lastTapAt;
|
|
2002
|
+
/**
|
|
2003
|
+
* True when this is the browser's synthesized compatibility click following a
|
|
2004
|
+
* finger tap we already handled. Discriminates on `e.type` deliberately —
|
|
2005
|
+
* `PointerEvent extends MouseEvent`, so an `instanceof MouseEvent` test
|
|
2006
|
+
* matches genuine pointer taps too. One shared timestamp across the layer and
|
|
2007
|
+
* stage handlers: a tap consumed at the layer must also suppress the ghost at
|
|
2008
|
+
* the stage, and only `click` is ever rejected, so bubbling stays intact.
|
|
2009
|
+
*/
|
|
2010
|
+
private isGhostClick;
|
|
1540
2011
|
/**
|
|
1541
2012
|
* Manage-mode rubber-band marquee (option-gated). `start`/`cur` are WORLD-space
|
|
1542
2013
|
* points (overlayLayer rides the stage transform); `rect` is the on-canvas
|
|
@@ -1551,6 +2022,9 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1551
2022
|
/** The chart to render: all floors stacked (3D overview), the active floor, or
|
|
1552
2023
|
* the whole chart for single-floor charts. */
|
|
1553
2024
|
private floorView;
|
|
2025
|
+
/** Physical floor height is authored data; the 900-unit stacked overview
|
|
2026
|
+
* spread is presentation-only and must never leak into real 3D geometry. */
|
|
2027
|
+
private floorBaseHeightMFor;
|
|
1554
2028
|
/** Toggle the 3D all-floors stacked overview (Batch 5). Re-renders; no-op on
|
|
1555
2029
|
* single-floor charts. The caller re-applies statuses + animates the iso view. */
|
|
1556
2030
|
setStacked(on: boolean): void;
|
|
@@ -1663,9 +2137,9 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1663
2137
|
* geometry stays flat, so hit-testing (Konva's own, plus the manual section
|
|
1664
2138
|
* inverse) keeps landing on the projected seats/sections.
|
|
1665
2139
|
*/
|
|
1666
|
-
setViewMode(mode:
|
|
2140
|
+
setViewMode(mode: RendererViewMode): void;
|
|
1667
2141
|
/** Current projection — reflects the tween target, not the mid-tween isoT. */
|
|
1668
|
-
getViewMode():
|
|
2142
|
+
getViewMode(): RendererViewMode;
|
|
1669
2143
|
/** Iso angle (rad) + y-squash for the current isoT. */
|
|
1670
2144
|
private isoParams;
|
|
1671
2145
|
/** Effective vertical scale = stage scale × iso squash — legibility math uses this. */
|
|
@@ -1674,14 +2148,40 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1674
2148
|
private isoForward;
|
|
1675
2149
|
/** Inverse of isoForward (iso-world → world) for screen-space hit-testing. */
|
|
1676
2150
|
private isoInverse;
|
|
2151
|
+
/** Precompute the Phase-C pinhole camera and every exact seat anchor. */
|
|
2152
|
+
private buildPerspectiveProjection;
|
|
2153
|
+
/** Apply an affine to a Konva container while keeping `pivot` fixed logically. */
|
|
2154
|
+
private setContainerAffine;
|
|
2155
|
+
private resetContainerTransform;
|
|
2156
|
+
/** Exact raked surface height used for the bounded section tangent plane. */
|
|
2157
|
+
private sectionSurfaceHeight;
|
|
2158
|
+
/** Desired perspective-space point for a section surface, before Stage pan/zoom. */
|
|
2159
|
+
private projectedSectionPoint;
|
|
2160
|
+
/** Shared-layer local point which the ground affine paints at `projected`. */
|
|
2161
|
+
private perspectiveLocalPoint;
|
|
1677
2162
|
/**
|
|
1678
2163
|
* Local-space offset that, once the layer applies the iso affine, lifts an
|
|
1679
|
-
* object straight UP in iso-world by `
|
|
1680
|
-
* (= inverse-linear of the pure vertical lift). Zero at isoT=0.
|
|
2164
|
+
* object straight UP in iso-world by `liftWorld × isoT` world units
|
|
2165
|
+
* (= inverse-linear of the pure vertical lift). Zero at isoT=0. `liftWorld` is
|
|
2166
|
+
* the section's resolved real height in world units (Phase B1).
|
|
1681
2167
|
*/
|
|
1682
2168
|
private isoLiftLocal;
|
|
1683
|
-
/** Restore
|
|
2169
|
+
/** Restore projection layers to identity (flat) — byte-for-byte the original.
|
|
2170
|
+
* `seatLayer` can be skipped when entering perspective from flat: assigning a
|
|
2171
|
+
* top-level transform invalidates all 14k descendant absolute transforms even
|
|
2172
|
+
* while the semantic overview keeps that layer fully transparent. */
|
|
1684
2173
|
private resetLayerTransforms;
|
|
2174
|
+
/** Restore section-owned containers before applying another projection. */
|
|
2175
|
+
private resetSectionProjection;
|
|
2176
|
+
/** Move native seat/booth hit shapes to or from their exact pinhole anchors. */
|
|
2177
|
+
private applyExactSeatAnchors;
|
|
2178
|
+
/**
|
|
2179
|
+
* Phase C projected 2.5D. Seat/booth anchors are exact pinhole projections;
|
|
2180
|
+
* section top surfaces use one explicitly bounded tangent plane per authored
|
|
2181
|
+
* section. Native Konva shapes move with the anchors, so direct hit testing is
|
|
2182
|
+
* the same graph that paints the buyer-visible unit.
|
|
2183
|
+
*/
|
|
2184
|
+
private applyPerspective;
|
|
1685
2185
|
/**
|
|
1686
2186
|
* Apply the current isoT to the scene: the base rotate+squash as a decomposed
|
|
1687
2187
|
* layer transform (so seats/décor/rings project together and Konva's own
|
|
@@ -1701,6 +2201,32 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1701
2201
|
* tier shifts with one offset in iso view) or the seat layer directly.
|
|
1702
2202
|
*/
|
|
1703
2203
|
private seatContainer;
|
|
2204
|
+
/** True when a section belongs to the active logical section/zone focus. */
|
|
2205
|
+
private sectionMatchesFocus;
|
|
2206
|
+
/** Visual opacity after the section-focus overlay is composed. */
|
|
2207
|
+
private focusedSeatOpacity;
|
|
2208
|
+
/** Project a section outline through elevation + the active affine view and
|
|
2209
|
+
* then into viewport pixels. The result is conservative (AABB), so a visible
|
|
2210
|
+
* section is never clipped even for rotated or isometric outlines. */
|
|
2211
|
+
private sectionScreenBounds;
|
|
2212
|
+
/** Hide only section groups wholly outside a padded viewport at the live-seat
|
|
2213
|
+
* rung. Overview caching always restores all groups first, so panning a
|
|
2214
|
+
* cached whole-venue bitmap can never reveal missing inventory. */
|
|
2215
|
+
private updateSeatGroupVisibility;
|
|
2216
|
+
/** Seats worth considering for viewport labels. Section culling is a safe
|
|
2217
|
+
* coarse index; the later screen test remains the exact filter. */
|
|
2218
|
+
private visibleSeatCandidates;
|
|
2219
|
+
private seatViewportCulled;
|
|
2220
|
+
/** Local world coordinate at which an elevated seat is actually painted for
|
|
2221
|
+
* the current iso tween. Flat seats and the 2D endpoint are unchanged. */
|
|
2222
|
+
private renderedSeatPoint;
|
|
2223
|
+
/** Overlay labels mirror the seat-layer lift without an O(seats) per-frame
|
|
2224
|
+
* rewrite. The groups are rebuilt with the zoom-dependent label set. */
|
|
2225
|
+
private seatLabelContainer;
|
|
2226
|
+
/** Shared overlay furniture is not parented to section lift groups, so keep
|
|
2227
|
+
* the small transient set aligned explicitly. Selection is capped in buyer
|
|
2228
|
+
* mode, making this constant-sized work during the iso tween. */
|
|
2229
|
+
private syncSeatOverlayPositions;
|
|
1704
2230
|
private renderSeats;
|
|
1705
2231
|
/** A booth renders as a click-selectable rounded block (dims from the doc). */
|
|
1706
2232
|
private renderBoothUnit;
|
|
@@ -1711,12 +2237,14 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1711
2237
|
*/
|
|
1712
2238
|
private buildAccessGlyph;
|
|
1713
2239
|
/**
|
|
1714
|
-
*
|
|
1715
|
-
*
|
|
1716
|
-
*
|
|
1717
|
-
* never the full node graph, so it is cheap to call on every view change.
|
|
2240
|
+
* Keep physical wheelchair provision readable in screen space at every map
|
|
2241
|
+
* LOD. The active Wheelchair filter promotes it further. Iterates the small
|
|
2242
|
+
* wheelchair-seat set, never the full node graph.
|
|
1718
2243
|
*/
|
|
1719
2244
|
private updateAccessGlyphs;
|
|
2245
|
+
/** True only for a physical wheelchair provision matching an active buyer filter. */
|
|
2246
|
+
private accessGlyphFilterEmphasized;
|
|
2247
|
+
private accessGlyphShouldShow;
|
|
1720
2248
|
/**
|
|
1721
2249
|
* Whether an accessible seat's glyph should show for its current status. It is
|
|
1722
2250
|
* hidden on seats a buyer cannot take (sold, or another buyer's hold) where the
|
|
@@ -1769,6 +2297,11 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
|
|
|
1769
2297
|
getFocusedSection(): string | null;
|
|
1770
2298
|
/** Draw (or replace) the light backdrop panel behind the focused section. */
|
|
1771
2299
|
private drawFocusBackdrop;
|
|
2300
|
+
/** Dim everything outside the active section with one paint-only shape. Group
|
|
2301
|
+
* opacity would make Konva recursively invalidate absolute-opacity caches on
|
|
2302
|
+
* all 14k descendants. The cut-out follows the live elevation offset and is
|
|
2303
|
+
* non-listening, so direct seat hit-testing is unchanged. */
|
|
2304
|
+
private drawFocusDimOverlay;
|
|
1772
2305
|
/** Repaint every seat + section block to reflect closed/focus state, then redraw. */
|
|
1773
2306
|
private repaintSectionsAndSeats;
|
|
1774
2307
|
/** The world-space rectangle currently visible in the viewport (minimap F3). */
|
|
@@ -1994,6 +2527,16 @@ interface PickerSeat {
|
|
|
1994
2527
|
/** Buyer-facing label (row `displayLabel` applied). Falls back to `label`;
|
|
1995
2528
|
* never use for booking — `label` is the inventory/booking identity. */
|
|
1996
2529
|
displayLabel?: string;
|
|
2530
|
+
/** Buyer-facing object type word authored in Designer. Pure presentation. */
|
|
2531
|
+
displayType?: string;
|
|
2532
|
+
/** @deprecated Use `displayType`; retained for source compatibility. */
|
|
2533
|
+
rowType?: string;
|
|
2534
|
+
/** Stable parent chart-object id (row/table/booth), separate from seat id. */
|
|
2535
|
+
objectId?: string;
|
|
2536
|
+
/** Buyer-facing spatial context shared by selection, hold, and hover callbacks. */
|
|
2537
|
+
sectionLabel?: string;
|
|
2538
|
+
rowLabel?: string;
|
|
2539
|
+
seatNumber?: string;
|
|
1997
2540
|
categoryKey: string;
|
|
1998
2541
|
/** Price for the chosen tier when the category has tiers, else the base price. */
|
|
1999
2542
|
price: number;
|
|
@@ -2005,6 +2548,29 @@ interface PickerSeat {
|
|
|
2005
2548
|
* note) resolved for this seat; absent when the seat carries none. Lets the
|
|
2006
2549
|
* buyer cart + confirm surface flag limited-view/premium seats. */
|
|
2007
2550
|
commercial?: SeatCommercialAttributes;
|
|
2551
|
+
/** Accessibility semantics exposed to SDK callbacks and buyer summaries. */
|
|
2552
|
+
accessibility?: AccessibilityType[];
|
|
2553
|
+
/** Explicit physical wheelchair chair/bay distinction. */
|
|
2554
|
+
wheelchairSpaceType?: 'seat-present' | 'no-seat';
|
|
2555
|
+
/** Physical/bookable source kind; booking identity remains `label`. */
|
|
2556
|
+
objectType?: 'seat' | 'booth' | 'table';
|
|
2557
|
+
/** Grouped-table booking contract; absent for normal chair inventory. */
|
|
2558
|
+
bookingMode?: 'whole' | 'variable';
|
|
2559
|
+
/** Guest quantity represented by this one atomic table line. */
|
|
2560
|
+
quantity?: number;
|
|
2561
|
+
capacity?: number;
|
|
2562
|
+
minOccupancy?: number;
|
|
2563
|
+
maxOccupancy?: number;
|
|
2564
|
+
}
|
|
2565
|
+
/** Accessible quantity/confirmation payload for one model-2 table selection. */
|
|
2566
|
+
interface TableSelectionDetails extends PickerSeat {
|
|
2567
|
+
objectType: 'table';
|
|
2568
|
+
bookingMode: 'whole' | 'variable';
|
|
2569
|
+
quantity: number;
|
|
2570
|
+
capacity: number;
|
|
2571
|
+
minOccupancy: number;
|
|
2572
|
+
maxOccupancy: number;
|
|
2573
|
+
physicalSeatIds: string[];
|
|
2008
2574
|
}
|
|
2009
2575
|
/**
|
|
2010
2576
|
* Rich hover payload for seat tooltips — the PickerSeat plus everything a
|
|
@@ -2016,13 +2582,20 @@ interface SeatHoverDetails extends PickerSeat {
|
|
|
2016
2582
|
categoryColor: string;
|
|
2017
2583
|
status: SeatStatus;
|
|
2018
2584
|
currency: string;
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2585
|
+
}
|
|
2586
|
+
interface PickerGAArea {
|
|
2587
|
+
id: string;
|
|
2588
|
+
/** Stable technical/inventory prefix. */
|
|
2589
|
+
label: string;
|
|
2590
|
+
/** Buyer-facing area name and type; absent fields use UI defaults. */
|
|
2591
|
+
displayLabel?: string;
|
|
2592
|
+
displayType?: string;
|
|
2593
|
+
capacity: number;
|
|
2594
|
+
available: number;
|
|
2595
|
+
categoryKey: string;
|
|
2596
|
+
price: number;
|
|
2597
|
+
currency: string;
|
|
2598
|
+
tiers?: CategoryTier[];
|
|
2026
2599
|
}
|
|
2027
2600
|
interface HoldConflict {
|
|
2028
2601
|
label: string;
|
|
@@ -2078,7 +2651,7 @@ interface ResumeHoldResponse extends HoldResponse {
|
|
|
2078
2651
|
interface HoldServerItem {
|
|
2079
2652
|
label: string;
|
|
2080
2653
|
objectId: string;
|
|
2081
|
-
objectType: 'seat' | 'booth' | 'ga';
|
|
2654
|
+
objectType: 'seat' | 'booth' | 'ga' | 'table';
|
|
2082
2655
|
categoryKey: string;
|
|
2083
2656
|
tierId: string | null;
|
|
2084
2657
|
unitPrice: number;
|
|
@@ -2088,6 +2661,7 @@ interface HoldServerItem {
|
|
|
2088
2661
|
interface HoldSelectionRequest {
|
|
2089
2662
|
label: string;
|
|
2090
2663
|
tierId?: string | null;
|
|
2664
|
+
quantity?: number;
|
|
2091
2665
|
}
|
|
2092
2666
|
interface BestAvailableResponse extends HoldResponse {
|
|
2093
2667
|
labels: string[];
|
|
@@ -2104,6 +2678,7 @@ interface PickerTransport {
|
|
|
2104
2678
|
startsAt?: number | null;
|
|
2105
2679
|
currency?: string;
|
|
2106
2680
|
mode?: string;
|
|
2681
|
+
inventoryModelVersion?: 1 | 2;
|
|
2107
2682
|
};
|
|
2108
2683
|
}>;
|
|
2109
2684
|
objects(key: string): Promise<{
|
|
@@ -2112,7 +2687,7 @@ interface PickerTransport {
|
|
|
2112
2687
|
closed?: string[];
|
|
2113
2688
|
}>;
|
|
2114
2689
|
hold(key: string, selections: HoldSelectionRequest[], ttlMs?: number, replaceHoldId?: string): Promise<HoldResponse>;
|
|
2115
|
-
bestAvailable(key: string, qty: number, categoryKey?: string): Promise<BestAvailableResponse>;
|
|
2690
|
+
bestAvailable(key: string, qty: number, categoryKey?: string, zoneId?: string): Promise<BestAvailableResponse>;
|
|
2116
2691
|
release(key: string, labels: string[], holdId: string): Promise<unknown>;
|
|
2117
2692
|
/** Optional capability-style lookup used to restore an active browser hold. */
|
|
2118
2693
|
resume?(key: string, holdId: string): Promise<ResumeHoldResponse>;
|
|
@@ -2129,6 +2704,8 @@ interface PickerTransport {
|
|
|
2129
2704
|
interface PickerCallbacks extends RendererCallbacks {
|
|
2130
2705
|
/** Selection changed (manual clicks or a server best-available pick). */
|
|
2131
2706
|
onSelectionChange?: (seats: PickerSeat[]) => void;
|
|
2707
|
+
/** A grouped table was selected and needs buyer confirmation/guest quantity. */
|
|
2708
|
+
onTableSelectionRequest?: (table: TableSelectionDetails) => void;
|
|
2132
2709
|
/** A hold opened (manual hold or best-available). */
|
|
2133
2710
|
onHold?: (hold: HoldInfo) => void;
|
|
2134
2711
|
/** A prior active hold was restored from its opaque hold id. */
|
|
@@ -2210,6 +2787,14 @@ declare class PickerController {
|
|
|
2210
2787
|
/** id → buyer-facing spatial metadata used by every tooltip/confirm surface. */
|
|
2211
2788
|
private seatContext;
|
|
2212
2789
|
private allIds;
|
|
2790
|
+
/** Model-2 tables are one booking unit whose chairs remain renderer geometry. */
|
|
2791
|
+
private groupedTablesByObject;
|
|
2792
|
+
private groupedTablesByLabel;
|
|
2793
|
+
private groupedTableBySeatId;
|
|
2794
|
+
private tableQuantities;
|
|
2795
|
+
/** Variable quantity is a buyer contract, never an inferred default. */
|
|
2796
|
+
private confirmedVariableTables;
|
|
2797
|
+
private groupedSelectionOverhead;
|
|
2213
2798
|
private ws;
|
|
2214
2799
|
private reconnectTimer;
|
|
2215
2800
|
private attempt;
|
|
@@ -2237,6 +2822,10 @@ declare class PickerController {
|
|
|
2237
2822
|
getRenderer(): ISeatmapRenderer | null;
|
|
2238
2823
|
seatByLabel(label: string): ExpandedSeat | undefined;
|
|
2239
2824
|
idForLabel(label: string): string | undefined;
|
|
2825
|
+
private idsForLabel;
|
|
2826
|
+
private idsForLabels;
|
|
2827
|
+
/** Resolve a physical chair id (or table inventory label) to its table unit. */
|
|
2828
|
+
tableSelection(seatIdOrLabel: string): TableSelectionDetails | null;
|
|
2240
2829
|
/** Fetch chart, build label maps, mount the renderer, seed statuses, go live. */
|
|
2241
2830
|
render(host: HTMLDivElement): Promise<{
|
|
2242
2831
|
doc: ChartDoc;
|
|
@@ -2255,6 +2844,17 @@ declare class PickerController {
|
|
|
2255
2844
|
deselect(ids: string[]): void;
|
|
2256
2845
|
setMaxSelection(maxSelection: number): void;
|
|
2257
2846
|
select(ids: string[]): PickerSeat[];
|
|
2847
|
+
/** Confirm/update the guest quantity for a selected variable table. */
|
|
2848
|
+
setTableQuantity(label: string, quantity: number): boolean;
|
|
2849
|
+
/** Atomically replace an active variable-table hold with a new guest count. */
|
|
2850
|
+
replaceTableQuantity(label: string, quantity: number): Promise<HoldInfo | null>;
|
|
2851
|
+
private rendererSelectionCap;
|
|
2852
|
+
private selectionGuestCount;
|
|
2853
|
+
private handleRendererSelect;
|
|
2854
|
+
private handleRendererDeselect;
|
|
2855
|
+
private resetUnheldTableQuantities;
|
|
2856
|
+
private resetTableQuantitiesForLabels;
|
|
2857
|
+
private tableQuantityRequest;
|
|
2258
2858
|
/**
|
|
2259
2859
|
* Hold the current selection (or a given label set). The controller does the
|
|
2260
2860
|
* renderer/hold side (409 → deselect + repaint the taken seats held) and then
|
|
@@ -2281,16 +2881,7 @@ declare class PickerController {
|
|
|
2281
2881
|
categoryAvailability(): Record<string, number>;
|
|
2282
2882
|
/** Seat ids belonging to a currently-closed section (excluded from counts). */
|
|
2283
2883
|
private closedMemberIds;
|
|
2284
|
-
getGAAreas():
|
|
2285
|
-
id: string;
|
|
2286
|
-
label: string;
|
|
2287
|
-
capacity: number;
|
|
2288
|
-
available: number;
|
|
2289
|
-
categoryKey: string;
|
|
2290
|
-
price: number;
|
|
2291
|
-
currency: string;
|
|
2292
|
-
tiers?: CategoryTier[];
|
|
2293
|
-
}[];
|
|
2884
|
+
getGAAreas(): PickerGAArea[];
|
|
2294
2885
|
/** Select a quantity from one GA area and hold it atomically. */
|
|
2295
2886
|
holdGA(areaId: string, qty: number, options?: {
|
|
2296
2887
|
tierId?: string | null;
|
|
@@ -2300,6 +2891,11 @@ declare class PickerController {
|
|
|
2300
2891
|
* flag — gates the buyer widget's "★ Best seats" premium quick-pick (chip is
|
|
2301
2892
|
* present-only, exactly like the accessibility filter chips). */
|
|
2302
2893
|
hasPremiumSeats(): boolean;
|
|
2894
|
+
/** Zones which still own visible buyer inventory, in authored order. */
|
|
2895
|
+
getBestAvailableZones(): Array<{
|
|
2896
|
+
id: string;
|
|
2897
|
+
label: string;
|
|
2898
|
+
}>;
|
|
2303
2899
|
/**
|
|
2304
2900
|
* Client-side premium pre-pass: find the best contiguous block of `qty`
|
|
2305
2901
|
* PREMIUM-flagged free seats (orphan-avoiding, closest to the focal point)
|
|
@@ -2317,6 +2913,7 @@ declare class PickerController {
|
|
|
2317
2913
|
*/
|
|
2318
2914
|
bestAvailable(qty: number, categoryKey?: string, opts?: {
|
|
2319
2915
|
preferPremium?: boolean;
|
|
2916
|
+
zoneId?: string;
|
|
2320
2917
|
}): Promise<HoldInfo | null>;
|
|
2321
2918
|
/**
|
|
2322
2919
|
* Complete a booking. Requires a transport that supports book() (the SDK
|
|
@@ -2372,9 +2969,9 @@ declare class PickerController {
|
|
|
2372
2969
|
/** Tap-a-deck-to-enter: leave the 3D stack, drop to flat 2D on `floorId`, and
|
|
2373
2970
|
* tell the host so it can sync its 2D/3D toggle + floor-switcher state. */
|
|
2374
2971
|
private handleDeckTap;
|
|
2375
|
-
/** Switch the map projection
|
|
2376
|
-
setViewMode(mode:
|
|
2377
|
-
getViewMode():
|
|
2972
|
+
/** Switch the map projection. No-op on a flat-only renderer. */
|
|
2973
|
+
setViewMode(mode: RendererViewMode): void;
|
|
2974
|
+
getViewMode(): RendererViewMode;
|
|
2378
2975
|
/** Current LOD rung (for the ZONES/SECTIONS/SEATS pill). */
|
|
2379
2976
|
getRung(): LodRung;
|
|
2380
2977
|
/** Jump to a rung; ZONES clears any focused summary (back to overview). */
|
|
@@ -2421,6 +3018,7 @@ declare class PickerController {
|
|
|
2421
3018
|
private sectionSummary;
|
|
2422
3019
|
destroy(): void;
|
|
2423
3020
|
private toSeat;
|
|
3021
|
+
private toTableSeat;
|
|
2424
3022
|
/** Tooltip payload for a hovered seat — see PickerCallbacks.onSeatHover. */
|
|
2425
3023
|
private describeSeat;
|
|
2426
3024
|
private priceFor;
|
|
@@ -2573,4 +3171,4 @@ declare function formatMoney(amount: number, currency?: string, fractionDigits?:
|
|
|
2573
3171
|
/** Bare symbol for input adornments ("€", "$", "₹"). */
|
|
2574
3172
|
declare function currencySymbol(currency?: string): string;
|
|
2575
3173
|
|
|
2576
|
-
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 ExpandedSeat, type Floor, type GAAreaObject, 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 PickerOptions, type PickerSeat, type PickerTransport, type Point, RENDERED_QUALITY_REPORT_VERSION, type ReferenceAccessibilitySource, type ReferenceCalibration, type ReferenceCategorySource, type ReferenceDerivedScale, type ReferenceInventoryExclusionSource, type ReferenceInventorySource, 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 RowObject, type RowSeatSlot, SUPPORTED_LOCALES, type SeatCommercialAttributes, type SeatHoverDetails, type SeatOverride, type SeatStatus, SeatmapRenderer, type SectionCategory, type SectionNode, type SectionObject, type SectionOutlinePath, type SectionPathSegment, type SectionSummary, type SelectionLayer, type ShapeObject, type TableObject, type TextObject, UNGROUPED_ID, type ZoneDef, accessibilityMeta, accessibilityRingColor, allObjects, applyHidden, chartBounds, computeSections, createRenderer, currencySymbol, expandBooth, expandChart, expandRow, expandRowSlots, expandTable, floorObjects, floorsOf, formatDate, formatMoney, gaAreasOf, gaUnitLabel, gaUnitLabels, generateSeatPanorama, generateSeatThumb, getLocale, hiddenObjectIds, inspectRenderedQualityEvidence, isGaUnitLabel, isSectionHidden, layerOf, loadLocale, objectCenter, pointInPolygon, pointInPolygonWithHoles, polygonLabelPoint, resolveLocale, rowSeatPositions, seatLabelPart, setLocale, setMoneyLocale, setStringOverrides, stackFloors, t, tCount };
|
|
3174
|
+
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 };
|