@seatlayer/core 0.53.0 → 0.55.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/README.md +2 -2
- package/dist/categoryInventory-BwarniiK.d.ts +109 -0
- package/dist/categoryInventory-D3qPwfKz.d.cts +109 -0
- package/dist/chunk-55NOSZK5.js +1 -0
- package/dist/chunk-6VTTBC5F.js +1 -0
- package/dist/chunk-6XJN4REG.js +1 -0
- package/dist/chunk-7PT7OQUO.js +1 -0
- package/dist/chunk-AQKYUJBX.js +1 -0
- package/dist/chunk-CXF32VPG.js +1 -0
- package/dist/chunk-DNGP2HDT.js +1 -0
- package/dist/chunk-EQM4FFN5.js +1 -0
- package/dist/chunk-HHM3PB66.js +1 -0
- package/dist/chunk-PXWKSYCK.js +1 -0
- package/dist/chunk-VDZ24QVV.js +1 -0
- package/dist/chunk-VI2CLV3Y.js +1 -0
- package/dist/core/chart-ops/index.cjs +1 -0
- package/dist/core/chart-ops/index.d.cts +1235 -0
- package/dist/core/chart-ops/index.d.ts +1235 -0
- package/dist/core/chart-ops/index.js +1 -0
- package/dist/core/color.cjs +1 -0
- package/dist/core/color.d.cts +192 -0
- package/dist/core/color.d.ts +192 -0
- package/dist/core/color.js +1 -0
- package/dist/core/inventory/index.cjs +1 -0
- package/dist/core/inventory/index.d.cts +209 -0
- package/dist/core/inventory/index.d.ts +209 -0
- package/dist/core/inventory/index.js +1 -0
- package/dist/core/layout/index.cjs +1 -0
- package/dist/core/layout/index.d.cts +376 -0
- package/dist/core/layout/index.d.ts +376 -0
- package/dist/core/layout/index.js +1 -0
- package/dist/core/quality/index.cjs +1 -0
- package/dist/core/quality/index.d.cts +132 -0
- package/dist/core/quality/index.d.ts +132 -0
- package/dist/core/quality/index.js +1 -0
- package/dist/core/render-assets/index.cjs +1 -0
- package/dist/core/render-assets/index.d.cts +99 -0
- package/dist/core/render-assets/index.d.ts +99 -0
- package/dist/core/render-assets/index.js +1 -0
- package/dist/core/seatConfidence.cjs +1 -1
- package/dist/core/seatConfidence.d.cts +1 -1
- package/dist/core/seatConfidence.d.ts +1 -1
- package/dist/core/seatConfidence.js +1 -1
- package/dist/core/sections/index.cjs +1 -0
- package/dist/core/sections/index.d.cts +346 -0
- package/dist/core/sections/index.d.ts +346 -0
- package/dist/core/sections/index.js +1 -0
- package/dist/{de-75NWRKC5.js → de-WPX4D3SY.js} +1 -1
- package/dist/{es-BM7EJ7PW.js → es-6KAJQVVX.js} +1 -1
- package/dist/{fr-HPXQHIB4.js → fr-5DTMRBN5.js} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +85 -534
- package/dist/index.d.ts +85 -534
- package/dist/index.js +1 -1
- package/dist/labeling-BmCzW50y.d.ts +90 -0
- package/dist/labeling-VfJBEOn0.d.cts +90 -0
- package/dist/layout-ClQkmixY.d.ts +181 -0
- package/dist/layout-Dlv5bIf2.d.cts +181 -0
- package/dist/renderedQuality-B3jgdgPO.d.ts +113 -0
- package/dist/renderedQuality-bDkUOyBL.d.cts +113 -0
- package/dist/renderer-B_g-W_QB.d.ts +534 -0
- package/dist/renderer-DySMcKAR.d.cts +534 -0
- package/dist/sections-DIzgtDjF.d.ts +123 -0
- package/dist/sections-Dna1nZgR.d.cts +123 -0
- package/dist/segmentedRowModel-BNXEUeHp.d.cts +75 -0
- package/dist/segmentedRowModel-COXw4GCh.d.ts +75 -0
- package/dist/ticketRestrictions-CzchbX_o.d.cts +72 -0
- package/dist/ticketRestrictions-DaYOCpEw.d.ts +72 -0
- package/dist/{types-tLOunI-B.d.cts → types-DTSG6_Hq.d.cts} +238 -761
- package/dist/{types-tLOunI-B.d.ts → types-DTSG6_Hq.d.ts} +238 -761
- package/dist/view3d/crossfade/panorama.d.cts +1 -1
- package/dist/view3d/crossfade/panorama.d.ts +1 -1
- package/dist/view3d/index.cjs +27 -27
- package/dist/view3d/index.d.cts +109 -2
- package/dist/view3d/index.d.ts +109 -2
- package/dist/view3d/index.js +26 -26
- package/package.json +94 -5
- package/dist/chunk-54A7LIL5.js +0 -1
|
@@ -1,3 +1,233 @@
|
|
|
1
|
+
/** Durable publishing-review evidence for an editable physical 3D property. */
|
|
2
|
+
interface Physical3dEvidence {
|
|
3
|
+
status: 'inferred' | 'confirmed';
|
|
4
|
+
source: 'public-2d-topology' | 'user-review';
|
|
5
|
+
note: string;
|
|
6
|
+
}
|
|
7
|
+
interface ReferenceCalibration {
|
|
8
|
+
type: 'two-point';
|
|
9
|
+
/** Points in immutable source-image pixels, selected by a human or trusted detector. */
|
|
10
|
+
sourceA: Point;
|
|
11
|
+
sourceB: Point;
|
|
12
|
+
/** Verified real-world distance between the two source points. */
|
|
13
|
+
distance: number;
|
|
14
|
+
unit: 'm' | 'ft' | 'chart-unit';
|
|
15
|
+
/** Derived and stored for deterministic geometry compilers. */
|
|
16
|
+
pixelsPerUnit: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A single human-placed seat probe: the author clicks one seat on the reference
|
|
20
|
+
* image and the server reads the surrounding seat lattice from it.
|
|
21
|
+
*
|
|
22
|
+
* COORDINATE-POLICY CARVE-OUT (owner decision 2026-07-21). The reference
|
|
23
|
+
* blueprint pipeline runs `coordinatePolicy: 'opaque-region-ids-only'` — the
|
|
24
|
+
* server is the sole source of chart coordinates and MCP clients select opaque
|
|
25
|
+
* `reg_*` ids, never points. This type is a deliberate, narrow exception on the
|
|
26
|
+
* same grounds as `ReferenceCalibration`: the point is placed by a human in the
|
|
27
|
+
* designer canvas, not proposed by a model.
|
|
28
|
+
*
|
|
29
|
+
* Therefore this is DESIGNER-ONLY and is intentionally NOT exposed over MCP.
|
|
30
|
+
* That is an accepted, documented exception to the MCP-parity rule — the
|
|
31
|
+
* server-is-sole-source guarantee for model-driven edits is worth more than
|
|
32
|
+
* parity here. Do not "fix" it by adding a seed point to an MCP tool schema.
|
|
33
|
+
*/
|
|
34
|
+
interface ReferenceSeatSeed {
|
|
35
|
+
/** Seed centre in immutable source-image pixels (never chart coordinates). */
|
|
36
|
+
source: Point;
|
|
37
|
+
/** Half-width of the author's sizing ring, in source pixels — the "this is how
|
|
38
|
+
* big one seat is" hint that replaces seats.io's zoom-until-it-matches step. */
|
|
39
|
+
radius: number;
|
|
40
|
+
/** Whether `radius` was fitted from image pixels or set by hand. Detection
|
|
41
|
+
* weights an author-set radius more heavily than one we guessed. */
|
|
42
|
+
origin: 'auto-fit' | 'manual';
|
|
43
|
+
}
|
|
44
|
+
/** One detected row in a scan proposal — a straight seat run in CHART
|
|
45
|
+
* coordinates (the server maps source pixels through referencePixelToChart;
|
|
46
|
+
* clients never see source-pixel geometry back). */
|
|
47
|
+
interface ReferenceScanRowProposal {
|
|
48
|
+
start: Point;
|
|
49
|
+
end: Point;
|
|
50
|
+
seatCount: number;
|
|
51
|
+
}
|
|
52
|
+
/** Detected rows attributed to one compiled section (or unattributed when the
|
|
53
|
+
* lattice extends outside every compiled polygon). */
|
|
54
|
+
interface ReferenceScanSectionProposal {
|
|
55
|
+
/** Id of the compiled SectionObject the rows landed in; null = unattributed. */
|
|
56
|
+
sectionId: string | null;
|
|
57
|
+
name: string;
|
|
58
|
+
rows: ReferenceScanRowProposal[];
|
|
59
|
+
seatCount: number;
|
|
60
|
+
/** 0..1 — how well this section's lattice agreed with the probe's pitch. */
|
|
61
|
+
confidence: number;
|
|
62
|
+
/** Index of the seed (multi-probe) whose pitch produced these rows. */
|
|
63
|
+
seedIndex: number;
|
|
64
|
+
}
|
|
65
|
+
/** Server response for an in-canvas reference scan. A PROPOSAL — nothing is
|
|
66
|
+
* committed until the author applies it in the designer (chartOps + undo). */
|
|
67
|
+
interface ReferenceScanProposal {
|
|
68
|
+
assetId: string;
|
|
69
|
+
/** Measured seat diameter / centre-to-centre pitch, in chart units. */
|
|
70
|
+
seatDiameter: number;
|
|
71
|
+
seatPitch: number;
|
|
72
|
+
totalSeats: number;
|
|
73
|
+
totalRows: number;
|
|
74
|
+
sections: ReferenceScanSectionProposal[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Human-only Magic Trace request. `source` is one click in immutable
|
|
78
|
+
* source-image pixels; it is accepted only by the browser Designer HTTP
|
|
79
|
+
* surfaces and must never be added to an MCP schema.
|
|
80
|
+
*/
|
|
81
|
+
interface ReferenceSectionTraceInput {
|
|
82
|
+
assetId: string;
|
|
83
|
+
floorId?: string;
|
|
84
|
+
expectedUpdatedAt: number;
|
|
85
|
+
source: Point;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Whole-reference Magic Trace request. Unlike the one-region request this
|
|
89
|
+
* carries no source coordinates: the server returns every persisted closed
|
|
90
|
+
* region as an ID-free proposal for explicit browser review.
|
|
91
|
+
*/
|
|
92
|
+
interface ReferenceSectionTraceBatchInput {
|
|
93
|
+
assetId: string;
|
|
94
|
+
floorId?: string;
|
|
95
|
+
expectedUpdatedAt: number;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Read-only Magic Trace result. This is deliberately not a SectionObject:
|
|
99
|
+
* there is no object id or label until the author accepts the proposal through
|
|
100
|
+
* the normal Designer command/undo boundary.
|
|
101
|
+
*
|
|
102
|
+
* All geometry is in chart coordinates. Source pixels, private contour
|
|
103
|
+
* vertices and reference bounds are never returned.
|
|
104
|
+
*/
|
|
105
|
+
interface ReferenceSectionTraceProposal {
|
|
106
|
+
assetId: string;
|
|
107
|
+
floorId: string;
|
|
108
|
+
outline: Point[];
|
|
109
|
+
/** Required exact fitted line/arc/cubic boundary. */
|
|
110
|
+
outlinePath: SectionOutlinePath;
|
|
111
|
+
/** Only structural source voids; printed labels/icons are filtered out. */
|
|
112
|
+
holes: Point[][];
|
|
113
|
+
/**
|
|
114
|
+
* Optional, and the tracer deliberately omits it. The colour a section is
|
|
115
|
+
* drawn in belongs to the CHART, not to the screenshot it was traced from —
|
|
116
|
+
* see the note in `referenceSectionTrace.ts`. The sampled value lives on the
|
|
117
|
+
* region row as `sampled_color`. Consumers fall back to zone/theme colour.
|
|
118
|
+
*/
|
|
119
|
+
color?: string;
|
|
120
|
+
referenceSource: {
|
|
121
|
+
assetId: string;
|
|
122
|
+
regionId: string;
|
|
123
|
+
};
|
|
124
|
+
geometry: {
|
|
125
|
+
kind: 'contour';
|
|
126
|
+
sourceRegionId: string;
|
|
127
|
+
contourMethod: 'shared-edge-vector-fit-v1';
|
|
128
|
+
simplificationTolerancePx: number;
|
|
129
|
+
vectorFitErrorPx: number;
|
|
130
|
+
sharedEdgeCount: number;
|
|
131
|
+
};
|
|
132
|
+
provenance: {
|
|
133
|
+
regionId: string;
|
|
134
|
+
analysisVersion: number;
|
|
135
|
+
vectorTopologyVersion: number;
|
|
136
|
+
selection: 'human-source-pixel-seed' | 'human-bulk-reference-review';
|
|
137
|
+
registration: 'persisted-reference-registration-v1';
|
|
138
|
+
};
|
|
139
|
+
/** Coordinate-free evidence suitable for an author-facing confirmation. */
|
|
140
|
+
diagnostics: {
|
|
141
|
+
regionMarker: string;
|
|
142
|
+
structuralHoleCount: number;
|
|
143
|
+
fittedComponentCount: number;
|
|
144
|
+
sharedBoundaryCount: number;
|
|
145
|
+
maximumAllowedVectorErrorPx: number;
|
|
146
|
+
measuredVectorErrorPx: number;
|
|
147
|
+
/** Source component footprint, as a percentage of the analyzed image. */
|
|
148
|
+
sourceAreaPercent?: number;
|
|
149
|
+
/**
|
|
150
|
+
* The name already printed on the plan for this region, when one has been
|
|
151
|
+
* read. The review proposes it instead of a generated number — a venue plan
|
|
152
|
+
* names its own sections, and retyping forty of them is work the author
|
|
153
|
+
* should never have to do. Absent means fall back to numbering.
|
|
154
|
+
*/
|
|
155
|
+
visibleLabel?: string;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Read-only whole-reference proposal. The author may approve each proposal or
|
|
159
|
+
* all proposals; the Designer then materializes the accepted set atomically. */
|
|
160
|
+
interface ReferenceSectionTraceBatchProposal {
|
|
161
|
+
assetId: string;
|
|
162
|
+
floorId: string;
|
|
163
|
+
proposals: ReferenceSectionTraceProposal[];
|
|
164
|
+
diagnostics: {
|
|
165
|
+
analyzedRegionCount: number;
|
|
166
|
+
proposalCount: number;
|
|
167
|
+
alreadyTracedCount: number;
|
|
168
|
+
withinToleranceCount: number;
|
|
169
|
+
/** Regions that could not be traced into a usable boundary and were left
|
|
170
|
+
* out. One unusable region must not cost the author the rest of the plan. */
|
|
171
|
+
unusableRegionCount?: number;
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/** Coordinate-free physical scale derived by server code from a confirmed
|
|
175
|
+
* semantic feature. Unlike manual two-point calibration, no source points pass
|
|
176
|
+
* through an MCP client or language model. */
|
|
177
|
+
interface ReferenceDerivedScale {
|
|
178
|
+
method: 'confirmed-focal-axis-v1';
|
|
179
|
+
feature: 'focal-long-axis' | 'focal-short-axis';
|
|
180
|
+
distance: number;
|
|
181
|
+
unit: 'm' | 'ft';
|
|
182
|
+
evidence: 'user-confirmed' | 'authoritative-source';
|
|
183
|
+
sourceDescription: string;
|
|
184
|
+
chartUnitsPerUnit: number;
|
|
185
|
+
}
|
|
186
|
+
interface ChartReferenceImage {
|
|
187
|
+
/** Stable private reference asset. New cloud-authored charts use this. */
|
|
188
|
+
assetId?: string;
|
|
189
|
+
/** Legacy/self-contained source. Optional when assetId is present. */
|
|
190
|
+
url?: string;
|
|
191
|
+
center: Point;
|
|
192
|
+
/** Rendered width in chart units (height follows the cropped image aspect). */
|
|
193
|
+
width: number;
|
|
194
|
+
opacity: number;
|
|
195
|
+
rotation?: number;
|
|
196
|
+
visible?: boolean;
|
|
197
|
+
layer?: 'below' | 'above';
|
|
198
|
+
locked?: boolean;
|
|
199
|
+
/** Normalized source crop; defaults to the full image. */
|
|
200
|
+
crop?: {
|
|
201
|
+
x: number;
|
|
202
|
+
y: number;
|
|
203
|
+
width: number;
|
|
204
|
+
height: number;
|
|
205
|
+
};
|
|
206
|
+
calibration?: ReferenceCalibration;
|
|
207
|
+
/** Server-derived semantic calibration without source-image coordinates. */
|
|
208
|
+
derivedScale?: ReferenceDerivedScale;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Durable responsive-layout rule for a venue arranged around a focal object.
|
|
212
|
+
* Sections are rigid groups: their internal rows/seats never scale or deform;
|
|
213
|
+
* only each group's anchor moves radially when the focal footprint needs more
|
|
214
|
+
* room. Importers and authoring tools can rerun the same rule after a pitch,
|
|
215
|
+
* stage or court changes size, even for very large section counts.
|
|
216
|
+
*/
|
|
217
|
+
interface RadialClearanceLayoutConstraint {
|
|
218
|
+
id: string;
|
|
219
|
+
kind: 'radial-clearance-v1';
|
|
220
|
+
focalObjectIds: string[];
|
|
221
|
+
sectionIds: string[];
|
|
222
|
+
clearance: number;
|
|
223
|
+
movement: 'rigid-section-groups';
|
|
224
|
+
/** Last solved proportional expansion, retained as useful audit evidence. */
|
|
225
|
+
resolvedExpansion: number;
|
|
226
|
+
/** Focal center used for the last solve, allowing the authored ring to be reconstructed after edits. */
|
|
227
|
+
resolvedFocalCenter?: Point;
|
|
228
|
+
}
|
|
229
|
+
type ChartLayoutConstraint = RadialClearanceLayoutConstraint;
|
|
230
|
+
|
|
1
231
|
/**
|
|
2
232
|
* SeatMap chart document — the single source of truth shared by the
|
|
3
233
|
* Designer (authoring) and the Renderer (buyer picker).
|
|
@@ -7,6 +237,7 @@
|
|
|
7
237
|
* Rows are PARAMETRIC (origin + count + spacing + curve + rotation) — never
|
|
8
238
|
* store per-seat coordinates in the document; expansion happens in layout.ts.
|
|
9
239
|
*/
|
|
240
|
+
|
|
10
241
|
interface Point {
|
|
11
242
|
x: number;
|
|
12
243
|
y: number;
|
|
@@ -125,11 +356,12 @@ interface TicketTierEvidence {
|
|
|
125
356
|
}
|
|
126
357
|
type TicketTierRestriction = 'companion' | 'child' | 'senior' | 'student' | 'membership' | 'custom';
|
|
127
358
|
/**
|
|
128
|
-
* Accessibility accommodations a seat can carry.
|
|
129
|
-
* venues
|
|
130
|
-
* and organizers can mark seats precisely.
|
|
359
|
+
* Accessibility accommodations a seat can carry. Covers the major seating and
|
|
360
|
+
* viewing provisions exposed by venues and ticketing platforms so buyers can
|
|
361
|
+
* filter for exactly what they need and organizers can mark seats precisely.
|
|
362
|
+
* `wheelchair` is the legacy default.
|
|
131
363
|
*/
|
|
132
|
-
type AccessibilityType = 'wheelchair' | 'companion' | 'semi-ambulatory' | 'hearing' | 'cart' | 'sign-language' | 'plus-size' | 'lift-armrest';
|
|
364
|
+
type AccessibilityType = 'wheelchair' | 'companion' | 'semi-ambulatory' | 'designated-aisle' | 'step-free' | 'hearing' | 'cart' | 'sign-language' | 'low-vision' | 'sensory-friendly' | 'plus-size' | 'lift-armrest';
|
|
133
365
|
interface AccessibilityMeta {
|
|
134
366
|
key: AccessibilityType;
|
|
135
367
|
/** Full descriptive label (designer checkbox, picker legend). */
|
|
@@ -1102,235 +1334,7 @@ interface Floor {
|
|
|
1102
1334
|
/** Floor-scoped confidence evidence inherited before the venue default. */
|
|
1103
1335
|
confidenceEvidence?: SeatConfidenceEvidence;
|
|
1104
1336
|
}
|
|
1105
|
-
|
|
1106
|
-
interface Physical3dEvidence {
|
|
1107
|
-
status: 'inferred' | 'confirmed';
|
|
1108
|
-
source: 'public-2d-topology' | 'user-review';
|
|
1109
|
-
note: string;
|
|
1110
|
-
}
|
|
1111
|
-
interface ReferenceCalibration {
|
|
1112
|
-
type: 'two-point';
|
|
1113
|
-
/** Points in immutable source-image pixels, selected by a human or trusted detector. */
|
|
1114
|
-
sourceA: Point;
|
|
1115
|
-
sourceB: Point;
|
|
1116
|
-
/** Verified real-world distance between the two source points. */
|
|
1117
|
-
distance: number;
|
|
1118
|
-
unit: 'm' | 'ft' | 'chart-unit';
|
|
1119
|
-
/** Derived and stored for deterministic geometry compilers. */
|
|
1120
|
-
pixelsPerUnit: number;
|
|
1121
|
-
}
|
|
1122
|
-
/**
|
|
1123
|
-
* A single human-placed seat probe: the author clicks one seat on the reference
|
|
1124
|
-
* image and the server reads the surrounding seat lattice from it.
|
|
1125
|
-
*
|
|
1126
|
-
* COORDINATE-POLICY CARVE-OUT (owner decision 2026-07-21). The reference
|
|
1127
|
-
* blueprint pipeline runs `coordinatePolicy: 'opaque-region-ids-only'` — the
|
|
1128
|
-
* server is the sole source of chart coordinates and MCP clients select opaque
|
|
1129
|
-
* `reg_*` ids, never points. This type is a deliberate, narrow exception on the
|
|
1130
|
-
* same grounds as `ReferenceCalibration`: the point is placed by a human in the
|
|
1131
|
-
* designer canvas, not proposed by a model.
|
|
1132
|
-
*
|
|
1133
|
-
* Therefore this is DESIGNER-ONLY and is intentionally NOT exposed over MCP.
|
|
1134
|
-
* That is an accepted, documented exception to the MCP-parity rule — the
|
|
1135
|
-
* server-is-sole-source guarantee for model-driven edits is worth more than
|
|
1136
|
-
* parity here. Do not "fix" it by adding a seed point to an MCP tool schema.
|
|
1137
|
-
*/
|
|
1138
|
-
interface ReferenceSeatSeed {
|
|
1139
|
-
/** Seed centre in immutable source-image pixels (never chart coordinates). */
|
|
1140
|
-
source: Point;
|
|
1141
|
-
/** Half-width of the author's sizing ring, in source pixels — the "this is how
|
|
1142
|
-
* big one seat is" hint that replaces seats.io's zoom-until-it-matches step. */
|
|
1143
|
-
radius: number;
|
|
1144
|
-
/** Whether `radius` was fitted from image pixels or set by hand. Detection
|
|
1145
|
-
* weights an author-set radius more heavily than one we guessed. */
|
|
1146
|
-
origin: 'auto-fit' | 'manual';
|
|
1147
|
-
}
|
|
1148
|
-
/** One detected row in a scan proposal — a straight seat run in CHART
|
|
1149
|
-
* coordinates (the server maps source pixels through referencePixelToChart;
|
|
1150
|
-
* clients never see source-pixel geometry back). */
|
|
1151
|
-
interface ReferenceScanRowProposal {
|
|
1152
|
-
start: Point;
|
|
1153
|
-
end: Point;
|
|
1154
|
-
seatCount: number;
|
|
1155
|
-
}
|
|
1156
|
-
/** Detected rows attributed to one compiled section (or unattributed when the
|
|
1157
|
-
* lattice extends outside every compiled polygon). */
|
|
1158
|
-
interface ReferenceScanSectionProposal {
|
|
1159
|
-
/** Id of the compiled SectionObject the rows landed in; null = unattributed. */
|
|
1160
|
-
sectionId: string | null;
|
|
1161
|
-
name: string;
|
|
1162
|
-
rows: ReferenceScanRowProposal[];
|
|
1163
|
-
seatCount: number;
|
|
1164
|
-
/** 0..1 — how well this section's lattice agreed with the probe's pitch. */
|
|
1165
|
-
confidence: number;
|
|
1166
|
-
/** Index of the seed (multi-probe) whose pitch produced these rows. */
|
|
1167
|
-
seedIndex: number;
|
|
1168
|
-
}
|
|
1169
|
-
/** Server response for an in-canvas reference scan. A PROPOSAL — nothing is
|
|
1170
|
-
* committed until the author applies it in the designer (chartOps + undo). */
|
|
1171
|
-
interface ReferenceScanProposal {
|
|
1172
|
-
assetId: string;
|
|
1173
|
-
/** Measured seat diameter / centre-to-centre pitch, in chart units. */
|
|
1174
|
-
seatDiameter: number;
|
|
1175
|
-
seatPitch: number;
|
|
1176
|
-
totalSeats: number;
|
|
1177
|
-
totalRows: number;
|
|
1178
|
-
sections: ReferenceScanSectionProposal[];
|
|
1179
|
-
}
|
|
1180
|
-
/**
|
|
1181
|
-
* Human-only Magic Trace request. `source` is one click in immutable
|
|
1182
|
-
* source-image pixels; it is accepted only by the browser Designer HTTP
|
|
1183
|
-
* surfaces and must never be added to an MCP schema.
|
|
1184
|
-
*/
|
|
1185
|
-
interface ReferenceSectionTraceInput {
|
|
1186
|
-
assetId: string;
|
|
1187
|
-
floorId?: string;
|
|
1188
|
-
expectedUpdatedAt: number;
|
|
1189
|
-
source: Point;
|
|
1190
|
-
}
|
|
1191
|
-
/**
|
|
1192
|
-
* Whole-reference Magic Trace request. Unlike the one-region request this
|
|
1193
|
-
* carries no source coordinates: the server returns every persisted closed
|
|
1194
|
-
* region as an ID-free proposal for explicit browser review.
|
|
1195
|
-
*/
|
|
1196
|
-
interface ReferenceSectionTraceBatchInput {
|
|
1197
|
-
assetId: string;
|
|
1198
|
-
floorId?: string;
|
|
1199
|
-
expectedUpdatedAt: number;
|
|
1200
|
-
}
|
|
1201
|
-
/**
|
|
1202
|
-
* Read-only Magic Trace result. This is deliberately not a SectionObject:
|
|
1203
|
-
* there is no object id or label until the author accepts the proposal through
|
|
1204
|
-
* the normal Designer command/undo boundary.
|
|
1205
|
-
*
|
|
1206
|
-
* All geometry is in chart coordinates. Source pixels, private contour
|
|
1207
|
-
* vertices and reference bounds are never returned.
|
|
1208
|
-
*/
|
|
1209
|
-
interface ReferenceSectionTraceProposal {
|
|
1210
|
-
assetId: string;
|
|
1211
|
-
floorId: string;
|
|
1212
|
-
outline: Point[];
|
|
1213
|
-
/** Required exact fitted line/arc/cubic boundary. */
|
|
1214
|
-
outlinePath: SectionOutlinePath;
|
|
1215
|
-
/** Only structural source voids; printed labels/icons are filtered out. */
|
|
1216
|
-
holes: Point[][];
|
|
1217
|
-
/**
|
|
1218
|
-
* Optional, and the tracer deliberately omits it. The colour a section is
|
|
1219
|
-
* drawn in belongs to the CHART, not to the screenshot it was traced from —
|
|
1220
|
-
* see the note in `referenceSectionTrace.ts`. The sampled value lives on the
|
|
1221
|
-
* region row as `sampled_color`. Consumers fall back to zone/theme colour.
|
|
1222
|
-
*/
|
|
1223
|
-
color?: string;
|
|
1224
|
-
referenceSource: {
|
|
1225
|
-
assetId: string;
|
|
1226
|
-
regionId: string;
|
|
1227
|
-
};
|
|
1228
|
-
geometry: {
|
|
1229
|
-
kind: 'contour';
|
|
1230
|
-
sourceRegionId: string;
|
|
1231
|
-
contourMethod: 'shared-edge-vector-fit-v1';
|
|
1232
|
-
simplificationTolerancePx: number;
|
|
1233
|
-
vectorFitErrorPx: number;
|
|
1234
|
-
sharedEdgeCount: number;
|
|
1235
|
-
};
|
|
1236
|
-
provenance: {
|
|
1237
|
-
regionId: string;
|
|
1238
|
-
analysisVersion: number;
|
|
1239
|
-
vectorTopologyVersion: number;
|
|
1240
|
-
selection: 'human-source-pixel-seed' | 'human-bulk-reference-review';
|
|
1241
|
-
registration: 'persisted-reference-registration-v1';
|
|
1242
|
-
};
|
|
1243
|
-
/** Coordinate-free evidence suitable for an author-facing confirmation. */
|
|
1244
|
-
diagnostics: {
|
|
1245
|
-
regionMarker: string;
|
|
1246
|
-
structuralHoleCount: number;
|
|
1247
|
-
fittedComponentCount: number;
|
|
1248
|
-
sharedBoundaryCount: number;
|
|
1249
|
-
maximumAllowedVectorErrorPx: number;
|
|
1250
|
-
measuredVectorErrorPx: number;
|
|
1251
|
-
/** Source component footprint, as a percentage of the analyzed image. */
|
|
1252
|
-
sourceAreaPercent?: number;
|
|
1253
|
-
/**
|
|
1254
|
-
* The name already printed on the plan for this region, when one has been
|
|
1255
|
-
* read. The review proposes it instead of a generated number — a venue plan
|
|
1256
|
-
* names its own sections, and retyping forty of them is work the author
|
|
1257
|
-
* should never have to do. Absent means fall back to numbering.
|
|
1258
|
-
*/
|
|
1259
|
-
visibleLabel?: string;
|
|
1260
|
-
};
|
|
1261
|
-
}
|
|
1262
|
-
/** Read-only whole-reference proposal. The author may approve each proposal or
|
|
1263
|
-
* all proposals; the Designer then materializes the accepted set atomically. */
|
|
1264
|
-
interface ReferenceSectionTraceBatchProposal {
|
|
1265
|
-
assetId: string;
|
|
1266
|
-
floorId: string;
|
|
1267
|
-
proposals: ReferenceSectionTraceProposal[];
|
|
1268
|
-
diagnostics: {
|
|
1269
|
-
analyzedRegionCount: number;
|
|
1270
|
-
proposalCount: number;
|
|
1271
|
-
alreadyTracedCount: number;
|
|
1272
|
-
withinToleranceCount: number;
|
|
1273
|
-
/** Regions that could not be traced into a usable boundary and were left
|
|
1274
|
-
* out. One unusable region must not cost the author the rest of the plan. */
|
|
1275
|
-
unusableRegionCount?: number;
|
|
1276
|
-
};
|
|
1277
|
-
}
|
|
1278
|
-
/** Coordinate-free physical scale derived by server code from a confirmed
|
|
1279
|
-
* semantic feature. Unlike manual two-point calibration, no source points pass
|
|
1280
|
-
* through an MCP client or language model. */
|
|
1281
|
-
interface ReferenceDerivedScale {
|
|
1282
|
-
method: 'confirmed-focal-axis-v1';
|
|
1283
|
-
feature: 'focal-long-axis' | 'focal-short-axis';
|
|
1284
|
-
distance: number;
|
|
1285
|
-
unit: 'm' | 'ft';
|
|
1286
|
-
evidence: 'user-confirmed' | 'authoritative-source';
|
|
1287
|
-
sourceDescription: string;
|
|
1288
|
-
chartUnitsPerUnit: number;
|
|
1289
|
-
}
|
|
1290
|
-
interface ChartReferenceImage {
|
|
1291
|
-
/** Stable private reference asset. New cloud-authored charts use this. */
|
|
1292
|
-
assetId?: string;
|
|
1293
|
-
/** Legacy/self-contained source. Optional when assetId is present. */
|
|
1294
|
-
url?: string;
|
|
1295
|
-
center: Point;
|
|
1296
|
-
/** Rendered width in chart units (height follows the cropped image aspect). */
|
|
1297
|
-
width: number;
|
|
1298
|
-
opacity: number;
|
|
1299
|
-
rotation?: number;
|
|
1300
|
-
visible?: boolean;
|
|
1301
|
-
layer?: 'below' | 'above';
|
|
1302
|
-
locked?: boolean;
|
|
1303
|
-
/** Normalized source crop; defaults to the full image. */
|
|
1304
|
-
crop?: {
|
|
1305
|
-
x: number;
|
|
1306
|
-
y: number;
|
|
1307
|
-
width: number;
|
|
1308
|
-
height: number;
|
|
1309
|
-
};
|
|
1310
|
-
calibration?: ReferenceCalibration;
|
|
1311
|
-
/** Server-derived semantic calibration without source-image coordinates. */
|
|
1312
|
-
derivedScale?: ReferenceDerivedScale;
|
|
1313
|
-
}
|
|
1314
|
-
/**
|
|
1315
|
-
* Durable responsive-layout rule for a venue arranged around a focal object.
|
|
1316
|
-
* Sections are rigid groups: their internal rows/seats never scale or deform;
|
|
1317
|
-
* only each group's anchor moves radially when the focal footprint needs more
|
|
1318
|
-
* room. Importers and authoring tools can rerun the same rule after a pitch,
|
|
1319
|
-
* stage or court changes size, even for very large section counts.
|
|
1320
|
-
*/
|
|
1321
|
-
interface RadialClearanceLayoutConstraint {
|
|
1322
|
-
id: string;
|
|
1323
|
-
kind: 'radial-clearance-v1';
|
|
1324
|
-
focalObjectIds: string[];
|
|
1325
|
-
sectionIds: string[];
|
|
1326
|
-
clearance: number;
|
|
1327
|
-
movement: 'rigid-section-groups';
|
|
1328
|
-
/** Last solved proportional expansion, retained as useful audit evidence. */
|
|
1329
|
-
resolvedExpansion: number;
|
|
1330
|
-
/** Focal center used for the last solve, allowing the authored ring to be reconstructed after edits. */
|
|
1331
|
-
resolvedFocalCenter?: Point;
|
|
1332
|
-
}
|
|
1333
|
-
type ChartLayoutConstraint = RadialClearanceLayoutConstraint;
|
|
1337
|
+
|
|
1334
1338
|
interface ChartDoc {
|
|
1335
1339
|
version: 1;
|
|
1336
1340
|
name: string;
|
|
@@ -1380,532 +1384,5 @@ interface ChartDoc {
|
|
|
1380
1384
|
/** Venue-scoped confidence evidence. It does not require panorama media. */
|
|
1381
1385
|
confidenceEvidence?: SeatConfidenceEvidence;
|
|
1382
1386
|
}
|
|
1383
|
-
interface ExpandedSeat {
|
|
1384
|
-
/** Stable id: `${rowId}:${index}` */
|
|
1385
|
-
id: string;
|
|
1386
|
-
/** Public label: `${rowLabel}-${seatNumber}` */
|
|
1387
|
-
label: string;
|
|
1388
|
-
/** Buyer-facing copy; absent on legacy charts, where `label` is displayed. */
|
|
1389
|
-
displayLabel?: string;
|
|
1390
|
-
x: number;
|
|
1391
|
-
y: number;
|
|
1392
|
-
rowId: string;
|
|
1393
|
-
/** Owning logical section and navigation zone, resolved once at expand time. */
|
|
1394
|
-
sectionId?: string;
|
|
1395
|
-
zoneId?: string;
|
|
1396
|
-
/** Zone focal when authored, otherwise the active floor/chart legacy fallback. */
|
|
1397
|
-
focalPoint?: Point;
|
|
1398
|
-
/** Buyer-facing segmented-row identity. `rowId` stays the physical owner id. */
|
|
1399
|
-
logicalRowId?: string;
|
|
1400
|
-
/**
|
|
1401
|
-
* Seat order inside the logical row. A deliberate missing integer is inserted
|
|
1402
|
-
* at every aisle boundary, so numerical adjacency cannot bridge a gap.
|
|
1403
|
-
*/
|
|
1404
|
-
logicalSeatIndex?: number;
|
|
1405
|
-
categoryKey: string;
|
|
1406
|
-
/** 'booth' units render as blocks (dimensions looked up via rowId = booth id). */
|
|
1407
|
-
kind?: 'seat' | 'booth';
|
|
1408
|
-
/** True when the seat has any accessibility accommodation — renderer rings/dims these. */
|
|
1409
|
-
accessible?: boolean;
|
|
1410
|
-
/** Specific accessibility accommodations (absent = none) — picker badges/filters these. */
|
|
1411
|
-
accessibility?: AccessibilityType[];
|
|
1412
|
-
/** Physical wheelchair provision resolved from the seat override. */
|
|
1413
|
-
wheelchairSpaceType?: 'seat-present' | 'no-seat';
|
|
1414
|
-
commercial?: SeatCommercialAttributes;
|
|
1415
|
-
/** Organizer-supplied view-from-seat image (inherited from the row). */
|
|
1416
|
-
viewUrl?: string;
|
|
1417
|
-
/** Calibration/truth inherited from the same scope that supplied `viewUrl`. */
|
|
1418
|
-
viewMeta?: SeatViewMetadata;
|
|
1419
|
-
/** Closest configuration-valid evidence plus its engine-resolved coverage. */
|
|
1420
|
-
confidenceEvidence?: ResolvedSeatConfidenceEvidence;
|
|
1421
|
-
/** Per-seat label size/color override; absent = inherit the row/theme default. */
|
|
1422
|
-
labelStyle?: LabelStyle;
|
|
1423
|
-
/**
|
|
1424
|
-
* Real-world eye height in metres above the focal/stage datum, resolved at
|
|
1425
|
-
* expand time from the owning section's `{height, rake}` + drawn depth (Phase B2).
|
|
1426
|
-
* Feeds the auto-360° generator's stage-pitch math. Absent ⇒ flat seated eye
|
|
1427
|
-
* height (legacy / seats in no section) — so old charts stay pixel-identical.
|
|
1428
|
-
*/
|
|
1429
|
-
eyeHeightM?: number;
|
|
1430
|
-
}
|
|
1431
|
-
type SeatStatus = 'free' | 'held' | 'booked' | 'not_for_sale';
|
|
1432
|
-
/** Buyer canvas projection. Perspective is a view-only projected-2.5D lane. */
|
|
1433
|
-
type RendererViewMode = 'flat' | 'isometric' | 'perspective';
|
|
1434
|
-
interface RendererCallbacks {
|
|
1435
|
-
onSelect?: (seat: ExpandedSeat) => void;
|
|
1436
|
-
onDeselect?: (seat: ExpandedSeat) => void;
|
|
1437
|
-
/** Buyer tried to add a seat after the active selection cap was reached. */
|
|
1438
|
-
onSelectionLimit?: (maxSelection: number) => void;
|
|
1439
|
-
/** seat is null when the pointer leaves any seat. */
|
|
1440
|
-
onHover?: (seat: ExpandedSeat | null) => void;
|
|
1441
|
-
/** Keyboard focus moved to a seat (arrow-key navigation) — for screen-reader announcements. */
|
|
1442
|
-
onFocusSeat?: (seat: ExpandedSeat | null) => void;
|
|
1443
|
-
/** Called ~1×/sec with the measured frames-per-second. */
|
|
1444
|
-
onFps?: (fps: number) => void;
|
|
1445
|
-
/** Fired when a GA area is clicked (quantity picking is UI-side). */
|
|
1446
|
-
onGAClick?: (areaId: string) => void;
|
|
1447
|
-
/**
|
|
1448
|
-
* Fired when a tap lands on a section outline while seats are NOT the active
|
|
1449
|
-
* rung (i.e. zoomed out, section/zone LOD). The host glides in + shows a
|
|
1450
|
-
* section-summary card instead of trying to select a 4px seat (Slice 5).
|
|
1451
|
-
*/
|
|
1452
|
-
onSectionTap?: (sectionId: string) => void;
|
|
1453
|
-
/**
|
|
1454
|
-
* Fired when a seat/deck is tapped in the 3D all-floors stacked overview — the
|
|
1455
|
-
* host drops back to the flat 2D map on that floor ("tap a deck to enter").
|
|
1456
|
-
*/
|
|
1457
|
-
onDeckTap?: (floorId: string) => void;
|
|
1458
|
-
/** Fired after any pan/zoom/resize settles — re-anchor screen-space overlays. */
|
|
1459
|
-
onViewChange?: () => void;
|
|
1460
|
-
/**
|
|
1461
|
-
* Organizer manage-mode only (`manageMode` + `marqueeSelect`): fired on
|
|
1462
|
-
* pointer-UP after a rubber-band marquee drag, or a ⌘A/Escape bulk shortcut,
|
|
1463
|
-
* with the FULL current selection (selectable seats only). The host toolbar
|
|
1464
|
-
* reads this to drive bulk block/unblock. Never fires when manageMode is off.
|
|
1465
|
-
*/
|
|
1466
|
-
onMarquee?: (seats: ExpandedSeat[]) => void;
|
|
1467
|
-
}
|
|
1468
|
-
/** Far-zoom level-of-detail rung: whole zones → section blocks → individual seats. */
|
|
1469
|
-
type LodRung = 'zones' | 'sections' | 'seats';
|
|
1470
|
-
interface RendererOptions extends RendererCallbacks {
|
|
1471
|
-
/**
|
|
1472
|
-
* Internal fixed-output mode used by the free maker's PNG/PDF pipeline.
|
|
1473
|
-
* It disables interaction, ResizeObserver, animation/FPS work and overview
|
|
1474
|
-
* bitmap caching while keeping the ordinary buyer renderer unchanged.
|
|
1475
|
-
*/
|
|
1476
|
-
exportMode?: boolean;
|
|
1477
|
-
/** Max seats selectable at once (default 10). */
|
|
1478
|
-
maxSelection?: number;
|
|
1479
|
-
/**
|
|
1480
|
-
* Buyer-surface fit refinement: on containers much taller than the venue's
|
|
1481
|
-
* projection (phones in portrait), zoomToFit may zoom past the strict
|
|
1482
|
-
* width-contain by a bounded amount (≤30%) so the venue is not a thin band
|
|
1483
|
-
* in a dark field. The overflow crops equally on both sides and the buyer
|
|
1484
|
-
* pans freely. Off for the designer and export pipeline, which must always
|
|
1485
|
-
* show the complete chart.
|
|
1486
|
-
*/
|
|
1487
|
-
portraitFitCrop?: boolean;
|
|
1488
|
-
/** Only these statuses are clickable (default ['free']). */
|
|
1489
|
-
selectableStatuses?: SeatStatus[];
|
|
1490
|
-
/**
|
|
1491
|
-
* Opt-in host behaviour flag — the renderer's own click/selection logic is
|
|
1492
|
-
* unchanged (it still selects + fires `onSelect` immediately, so the seat
|
|
1493
|
-
* highlights right away). When true, the host (e.g. PublicEventPage) treats
|
|
1494
|
-
* that `onSelect` as a pending candidate and shows a confirm card instead of
|
|
1495
|
-
* pushing straight into the cart; `deselect([seat.id])` on Cancel un-highlights.
|
|
1496
|
-
*/
|
|
1497
|
-
confirmSelection?: boolean;
|
|
1498
|
-
/** ISO 4217 currency for on-map prices ("FROM …"); defaults to money.DEFAULT_CURRENCY.
|
|
1499
|
-
* Locale for grouping/symbol placement comes from the active i18n locale. */
|
|
1500
|
-
currency?: string;
|
|
1501
|
-
/**
|
|
1502
|
-
* Organizer manage surface (SDK SeatManager). Opt-in — enables the manage-mode
|
|
1503
|
-
* gestures (marquee, ⌘A/Escape) and the bulk-selection helpers. Buyer pan /
|
|
1504
|
-
* pinch / tap and every existing code path are byte-identical when this is
|
|
1505
|
-
* false (every manage branch is gated on it). Default false.
|
|
1506
|
-
*/
|
|
1507
|
-
manageMode?: boolean;
|
|
1508
|
-
/**
|
|
1509
|
-
* When `manageMode` is on, a mouse/pen primary-button drag at the seats rung
|
|
1510
|
-
* draws a rubber-band marquee that bulk-selects the seats it covers (emitting
|
|
1511
|
-
* `onMarquee` on pointer-up) instead of panning. Touch keeps single-finger
|
|
1512
|
-
* pan (pinch to zoom); a middle-button drag pans with a mouse. Disabled below
|
|
1513
|
-
* the seats rung (zoom in first). No effect unless `manageMode` is also set.
|
|
1514
|
-
*/
|
|
1515
|
-
marqueeSelect?: boolean;
|
|
1516
|
-
}
|
|
1517
|
-
type RenderedLabelHiddenReason = 'below-minimum-size' | 'outside-viewport' | 'dimmed-or-unavailable' | 'clutter-or-fit' | 'renderer-hidden';
|
|
1518
|
-
/** Browser-renderer evidence used by visual QA and catalog release gates. */
|
|
1519
|
-
interface RenderedBookableLabelEvidence {
|
|
1520
|
-
seatId: string;
|
|
1521
|
-
label: string;
|
|
1522
|
-
kind: 'seat' | 'booth';
|
|
1523
|
-
/** Painted inventory silhouette. Empty wheelchair bays are deliberately
|
|
1524
|
-
* square, while physical seats retain the ordinary circular marker. */
|
|
1525
|
-
markerShape: 'circle' | 'square' | 'booth';
|
|
1526
|
-
/** Physical wheelchair provision represented by this inventory unit. */
|
|
1527
|
-
wheelchairSpaceType?: 'seat-present' | 'no-seat';
|
|
1528
|
-
categoryKey: string;
|
|
1529
|
-
sectionId?: string;
|
|
1530
|
-
zoneId?: string;
|
|
1531
|
-
status: SeatStatus;
|
|
1532
|
-
selected: boolean;
|
|
1533
|
-
visible: boolean;
|
|
1534
|
-
renderedFontPx: number;
|
|
1535
|
-
fill: string;
|
|
1536
|
-
ink: string;
|
|
1537
|
-
opacity: number;
|
|
1538
|
-
/** Buyer-visible accessibility glyph evidence. Filter emphasis uses a
|
|
1539
|
-
* screen-space minimum so wheelchair provision remains recognizable at fit. */
|
|
1540
|
-
accessibilityMarker?: {
|
|
1541
|
-
glyphVisible: boolean;
|
|
1542
|
-
glyphWidthPx: number;
|
|
1543
|
-
emphasizedByFilter: boolean;
|
|
1544
|
-
};
|
|
1545
|
-
/** Direct Konva shape bounds and the production near-miss rescue combined. */
|
|
1546
|
-
pointerTarget: {
|
|
1547
|
-
active: boolean;
|
|
1548
|
-
directWidthPx: number;
|
|
1549
|
-
directHeightPx: number;
|
|
1550
|
-
effectiveMinimumPx: number;
|
|
1551
|
-
};
|
|
1552
|
-
/** Centre of the painted unit, even when its text is intentionally hidden. */
|
|
1553
|
-
screenCenter: {
|
|
1554
|
-
x: number;
|
|
1555
|
-
y: number;
|
|
1556
|
-
};
|
|
1557
|
-
screenBox?: {
|
|
1558
|
-
x: number;
|
|
1559
|
-
y: number;
|
|
1560
|
-
width: number;
|
|
1561
|
-
height: number;
|
|
1562
|
-
};
|
|
1563
|
-
hiddenReason?: RenderedLabelHiddenReason;
|
|
1564
|
-
}
|
|
1565
|
-
interface RenderedHierarchyLabelEvidence {
|
|
1566
|
-
id: string;
|
|
1567
|
-
kind: 'section' | 'zone';
|
|
1568
|
-
role: 'name' | 'availability' | 'price';
|
|
1569
|
-
label: string;
|
|
1570
|
-
visible: boolean;
|
|
1571
|
-
renderedFontPx: number;
|
|
1572
|
-
opacity: number;
|
|
1573
|
-
fill: string;
|
|
1574
|
-
ink: string;
|
|
1575
|
-
/** Independent geometric containment check for section-owned text. */
|
|
1576
|
-
fitsContainer?: boolean;
|
|
1577
|
-
screenBox?: {
|
|
1578
|
-
x: number;
|
|
1579
|
-
y: number;
|
|
1580
|
-
width: number;
|
|
1581
|
-
height: number;
|
|
1582
|
-
};
|
|
1583
|
-
}
|
|
1584
|
-
interface RenderedFreeTextEvidence {
|
|
1585
|
-
objectId: string;
|
|
1586
|
-
kind: 'free-text' | 'stage' | 'table' | 'decor' | 'ga-label' | 'ga-capacity';
|
|
1587
|
-
text: string;
|
|
1588
|
-
visible: boolean;
|
|
1589
|
-
renderedFontPx: number;
|
|
1590
|
-
ink: string;
|
|
1591
|
-
background: string;
|
|
1592
|
-
opacity: number;
|
|
1593
|
-
screenBox?: {
|
|
1594
|
-
x: number;
|
|
1595
|
-
y: number;
|
|
1596
|
-
width: number;
|
|
1597
|
-
height: number;
|
|
1598
|
-
};
|
|
1599
|
-
hiddenReason?: 'below-minimum-size' | 'outside-viewport' | 'renderer-hidden';
|
|
1600
|
-
}
|
|
1601
|
-
interface RenderedRowLabelEvidence {
|
|
1602
|
-
text: string;
|
|
1603
|
-
visible: boolean;
|
|
1604
|
-
renderedFontPx: number;
|
|
1605
|
-
ink: string;
|
|
1606
|
-
screenBox?: {
|
|
1607
|
-
x: number;
|
|
1608
|
-
y: number;
|
|
1609
|
-
width: number;
|
|
1610
|
-
height: number;
|
|
1611
|
-
};
|
|
1612
|
-
}
|
|
1613
|
-
interface RenderedGAAreaEvidence {
|
|
1614
|
-
areaId: string;
|
|
1615
|
-
label: string;
|
|
1616
|
-
capacity: number;
|
|
1617
|
-
categoryKey: string;
|
|
1618
|
-
/** Owning logical section when the rendered GA surface is section-contained. */
|
|
1619
|
-
sectionId?: string;
|
|
1620
|
-
visible: boolean;
|
|
1621
|
-
interactive: boolean;
|
|
1622
|
-
opacity: number;
|
|
1623
|
-
fill: string;
|
|
1624
|
-
effectiveBackground: string;
|
|
1625
|
-
screenBox?: {
|
|
1626
|
-
x: number;
|
|
1627
|
-
y: number;
|
|
1628
|
-
width: number;
|
|
1629
|
-
height: number;
|
|
1630
|
-
};
|
|
1631
|
-
}
|
|
1632
|
-
interface RendererQualityEvidence {
|
|
1633
|
-
viewport: {
|
|
1634
|
-
width: number;
|
|
1635
|
-
height: number;
|
|
1636
|
-
};
|
|
1637
|
-
/** Runtime projection actually used for the pixels and hit graph below. */
|
|
1638
|
-
projection: RendererViewMode;
|
|
1639
|
-
/** Phase-C proof metadata. Present only in the projected-2.5D lane. */
|
|
1640
|
-
perspective?: {
|
|
1641
|
-
model: 'pinhole-exact-seat-anchors';
|
|
1642
|
-
sectionSurfaceModel: 'tangent-plane';
|
|
1643
|
-
exactSeatAnchorCount: number;
|
|
1644
|
-
depthSorted: true;
|
|
1645
|
-
};
|
|
1646
|
-
canvasBackground: string;
|
|
1647
|
-
effectiveScale: number;
|
|
1648
|
-
rung: LodRung;
|
|
1649
|
-
minimumVisibleLabelPx: number;
|
|
1650
|
-
totalLabelledBookableUnits: number;
|
|
1651
|
-
visibleLabels: number;
|
|
1652
|
-
hiddenLabels: number;
|
|
1653
|
-
/** Seats/table-seats/booths plus the full GA capacity. */
|
|
1654
|
-
totalBookableUnits: number;
|
|
1655
|
-
selectionRingSeatIds: string[];
|
|
1656
|
-
selectionRingColor: string;
|
|
1657
|
-
focusedSectionId: string | null;
|
|
1658
|
-
focusBackdropVisible: boolean;
|
|
1659
|
-
categoryFilterKeys: string[] | null;
|
|
1660
|
-
/** Exact scene-graph proof for the clean section-first overview contract. */
|
|
1661
|
-
overviewStyle: {
|
|
1662
|
-
visibleSectionShells: number;
|
|
1663
|
-
categoryPaintedSectionShells: number;
|
|
1664
|
-
visibleCategoryDetailOutlines: number;
|
|
1665
|
-
visibleSectionRowHints: number;
|
|
1666
|
-
visibleSectionAvailabilityLabels: number;
|
|
1667
|
-
visibleSectionGADetails: number;
|
|
1668
|
-
};
|
|
1669
|
-
labels: RenderedBookableLabelEvidence[];
|
|
1670
|
-
gaAreas: RenderedGAAreaEvidence[];
|
|
1671
|
-
hierarchyLabels: RenderedHierarchyLabelEvidence[];
|
|
1672
|
-
freeTextLabels: RenderedFreeTextEvidence[];
|
|
1673
|
-
rowLabels: RenderedRowLabelEvidence[];
|
|
1674
|
-
}
|
|
1675
|
-
interface ISeatmapRenderer {
|
|
1676
|
-
/** Replace the chart. Resets selection and statuses, zooms to fit.
|
|
1677
|
-
* `opts.floorId` picks which floor to render on a multi-floor chart (Batch 5). */
|
|
1678
|
-
setChart(doc: ChartDoc, opts?: {
|
|
1679
|
-
floorId?: string;
|
|
1680
|
-
}): void;
|
|
1681
|
-
/** Bulk status update; re-renders affected seats only. */
|
|
1682
|
-
setStatus(seatIds: string[], status: SeatStatus): void;
|
|
1683
|
-
/**
|
|
1684
|
-
* Mark the active buyer's own held seats. They remain server-status `held`,
|
|
1685
|
-
* but render with the buyer selection treatment instead of the anonymous
|
|
1686
|
-
* unavailable treatment used for another buyer's hold.
|
|
1687
|
-
*/
|
|
1688
|
-
setOwnedHold?(seatIds: string[] | null): void;
|
|
1689
|
-
/**
|
|
1690
|
-
* Mark one selected seat as the buyer's pending confirmation candidate.
|
|
1691
|
-
* The candidate receives a strong focus halo while unrelated seats recede;
|
|
1692
|
-
* pass null after Select/Cancel. This is visual only and never mutates the
|
|
1693
|
-
* renderer selection.
|
|
1694
|
-
*/
|
|
1695
|
-
setSelectionFocus?(seatId: string | null): void;
|
|
1696
|
-
/**
|
|
1697
|
-
* SYNCHRONOUS repaint that bypasses requestAnimationFrame. Konva's batchDraw()
|
|
1698
|
-
* (used by setStatus and friends) schedules the actual paint on the next rAF
|
|
1699
|
-
* tick, which Chrome throttles/pauses on hidden, backgrounded, or occluded
|
|
1700
|
-
* tabs — so a seat-status delta updates the scene graph but the pixels never
|
|
1701
|
-
* change until the tab is foregrounded again. forceDraw() paints the affected
|
|
1702
|
-
* layers immediately (Layer.draw() is synchronous) and flushes any pending
|
|
1703
|
-
* cache-debounce, so a caller (visibilitychange catch-up, or an opted-in
|
|
1704
|
-
* always-live board) can guarantee the canvas reflects current state
|
|
1705
|
-
* regardless of tab visibility. No-op difference in the foreground.
|
|
1706
|
-
*/
|
|
1707
|
-
forceDraw(): void;
|
|
1708
|
-
getStatus(seatId: string): SeatStatus;
|
|
1709
|
-
getSelection(): ExpandedSeat[];
|
|
1710
|
-
clearSelection(): void;
|
|
1711
|
-
/** Update the buyer selection cap without rebuilding the chart or camera. */
|
|
1712
|
-
setMaxSelection?(maxSelection: number): void;
|
|
1713
|
-
/**
|
|
1714
|
-
* Programmatically restore free seats (for example an Undo action). Added
|
|
1715
|
-
* seats respect the active cap and do not reopen a confirmation popover.
|
|
1716
|
-
*/
|
|
1717
|
-
select?(seatIds: string[]): ExpandedSeat[];
|
|
1718
|
-
/**
|
|
1719
|
-
* Dynamically update organizer-only interaction without rebuilding the
|
|
1720
|
-
* renderer. No buyer surface calls this; every behavior remains gated by
|
|
1721
|
-
* `manageMode` exactly as it is at construction time.
|
|
1722
|
-
*/
|
|
1723
|
-
setManageInteraction?(options: {
|
|
1724
|
-
manageMode: boolean;
|
|
1725
|
-
marqueeSelect: boolean;
|
|
1726
|
-
selectableStatuses: SeatStatus[];
|
|
1727
|
-
maxSelection?: number;
|
|
1728
|
-
}): void;
|
|
1729
|
-
/** Organizer-only section heat overlay. Values are normalized 0..1. */
|
|
1730
|
-
setSectionHeat?(scores: Record<string, number> | null): void;
|
|
1731
|
-
/**
|
|
1732
|
-
* Manage-mode bulk selection helpers (no-op / empty unless `manageMode`).
|
|
1733
|
-
* They select the matching SELECTABLE seats (respecting `selectableStatuses`
|
|
1734
|
-
* + closed sections), union with the current selection, and return the seats
|
|
1735
|
-
* they added — the SDK SeatManager expands category/row/section picks to
|
|
1736
|
-
* labels and drives one batched block/unblock from them.
|
|
1737
|
-
*/
|
|
1738
|
-
selectAllSelectable?(): ExpandedSeat[];
|
|
1739
|
-
selectByLabels?(labels: string[]): ExpandedSeat[];
|
|
1740
|
-
/** Exact-render QA only: select one server-chosen unit without label ambiguity. */
|
|
1741
|
-
setEvidenceSelection?(seatId: string): boolean;
|
|
1742
|
-
/** Selectable seats belonging to a section OR zone id (no selection side-effect). */
|
|
1743
|
-
getSelectableInSection?(sectionId: string): ExpandedSeat[];
|
|
1744
|
-
/** Programmatic deselect of specific seats (e.g. chip × in the cart). */
|
|
1745
|
-
deselect(seatIds: string[]): void;
|
|
1746
|
-
/**
|
|
1747
|
-
* Brief attention pulse on a seat (a ring that expands + fades once) — used to
|
|
1748
|
-
* signal live activity, e.g. a seat "just taken" by another buyer via a WS
|
|
1749
|
-
* delta. Purely visual; no state change. `color` overrides the default.
|
|
1750
|
-
*/
|
|
1751
|
-
flashSeat(seatId: string, color?: string): void;
|
|
1752
|
-
/**
|
|
1753
|
-
* Brief organizer attention pulse around a whole section. This is a visual
|
|
1754
|
-
* overlay only: it never changes section geometry, hit targets, selection, or
|
|
1755
|
-
* the active camera. Useful for grouped realtime operations at venue overview.
|
|
1756
|
-
*/
|
|
1757
|
-
flashSection?(sectionId: string, color?: string): void;
|
|
1758
|
-
zoomToFit(): void;
|
|
1759
|
-
/** Refit the active section when focused; otherwise frame the current floor/view. */
|
|
1760
|
-
refitCurrentView?(): void;
|
|
1761
|
-
/** Zoom in one step about the viewport center, clamped to the usual zoom bounds. */
|
|
1762
|
-
zoomIn(): void;
|
|
1763
|
-
/** Zoom out one step about the viewport center, clamped to the usual zoom bounds. */
|
|
1764
|
-
zoomOut(): void;
|
|
1765
|
-
/** Individually status-managed seats/table-seats/booths; excludes GA capacity. */
|
|
1766
|
-
seatCount(): number;
|
|
1767
|
-
/** Seats/table-seats/booths plus the full capacity of rendered GA areas. */
|
|
1768
|
-
bookableCount(): number;
|
|
1769
|
-
/**
|
|
1770
|
-
* Maps a chart-space point (or a seat, by its x/y) to container-relative
|
|
1771
|
-
* screen pixels, using the current stage scale/position. Lets host UI anchor
|
|
1772
|
-
* DOM overlays (confirm card, tooltip) over a live seat and re-anchor them
|
|
1773
|
-
* on `onViewChange`.
|
|
1774
|
-
*/
|
|
1775
|
-
worldToScreen(point: Point): {
|
|
1776
|
-
x: number;
|
|
1777
|
-
y: number;
|
|
1778
|
-
};
|
|
1779
|
-
/** When on, dim non-accessible free seats so accessible seats stand out. */
|
|
1780
|
-
setAccessibleFilter(on: boolean): void;
|
|
1781
|
-
/**
|
|
1782
|
-
* Dim free seats that lack ANY of these accessibility types. `null` clears the
|
|
1783
|
-
* filter; `[]` means "any accessible seat" (same as setAccessibleFilter(true)).
|
|
1784
|
-
*/
|
|
1785
|
-
setAccessibilityFilter(types: AccessibilityType[] | null): void;
|
|
1786
|
-
/** Legend hover-highlight: dim free seats of other categories (null clears). */
|
|
1787
|
-
setCategoryHighlight?(key: string | null): void;
|
|
1788
|
-
/** Price-band filter (F4): dim free seats whose category is NOT in `keys`
|
|
1789
|
-
* (null clears). The widget resolves which categories fall in the band. */
|
|
1790
|
-
setCategoryFilter?(keys: string[] | null): void;
|
|
1791
|
-
/** Smoothly frame the currently available seats in these categories. `null`
|
|
1792
|
-
* returns to the full chart. Used after an explicit buyer price-filter action. */
|
|
1793
|
-
focusCategories?(keys: string[] | null): void;
|
|
1794
|
-
/** Dim the seats of these section/zone ids (organizer manager: held-back inventory). */
|
|
1795
|
-
setDimmedSections?(ids: string[] | null): void;
|
|
1796
|
-
/**
|
|
1797
|
-
* Phase 2 event-level section states: mark these section/zone ids `closed` —
|
|
1798
|
-
* flat grey block, seats greyed + not pickable, section stays rendered.
|
|
1799
|
-
* `null`/empty clears. (Distinct from the buyer's applyHidden seat-strip.)
|
|
1800
|
-
*/
|
|
1801
|
-
setClosedSections?(ids: string[] | null): void;
|
|
1802
|
-
/**
|
|
1803
|
-
* AXS section-focus: dim + desaturate every other section, draw a calm backdrop
|
|
1804
|
-
* behind this section, and glide the camera to frame it. Seat-picking is gated
|
|
1805
|
-
* until seats are large enough on screen (≥ LABEL_SCALE). Slice 5 / Phase 2 §4.
|
|
1806
|
-
*/
|
|
1807
|
-
focusSection?(id: string): void;
|
|
1808
|
-
/** Clear an AXS section focus (restore full-bowl brightness + drop backdrop). */
|
|
1809
|
-
clearSectionFocus?(): void;
|
|
1810
|
-
/** The currently AXS-focused section id, or null. */
|
|
1811
|
-
getFocusedSection?(): string | null;
|
|
1812
|
-
/** World-space rect currently visible in the viewport (minimap viewport frame). */
|
|
1813
|
-
getVisibleWorldRect?(): {
|
|
1814
|
-
x: number;
|
|
1815
|
-
y: number;
|
|
1816
|
-
width: number;
|
|
1817
|
-
height: number;
|
|
1818
|
-
};
|
|
1819
|
-
/** Axis-aligned world bounds of all seats + section outlines (minimap frame). */
|
|
1820
|
-
getWorldBounds?(): {
|
|
1821
|
-
x: number;
|
|
1822
|
-
y: number;
|
|
1823
|
-
width: number;
|
|
1824
|
-
height: number;
|
|
1825
|
-
};
|
|
1826
|
-
/** Current rendered (not raw-source) geometry for an interactive overview.
|
|
1827
|
-
* Multi-floor overview transforms are already applied to these coordinates. */
|
|
1828
|
-
getMinimapSnapshot?(): RendererMinimapSnapshot;
|
|
1829
|
-
/** Pan without changing zoom so `point` becomes the viewport centre. */
|
|
1830
|
-
panToWorld?(point: Point): void;
|
|
1831
|
-
/**
|
|
1832
|
-
* Colorblind-safe mode: category hues switch to an Okabe-Ito palette and
|
|
1833
|
-
* booked seats render hollow (a non-color cue), so seat state never relies
|
|
1834
|
-
* on hue alone. Off (the default) renders exactly as before.
|
|
1835
|
-
*/
|
|
1836
|
-
setColorblindSafe?(on: boolean): void;
|
|
1837
|
-
/**
|
|
1838
|
-
* Switch the projection. `'flat'` = normal top-down; `'isometric'` = the
|
|
1839
|
-
* legacy affine preview; `'perspective'` = projected 2.5D with exact pinhole
|
|
1840
|
-
* seat anchors/native hit shapes and bounded per-section tangent surfaces.
|
|
1841
|
-
* Purely visual — the chart is authored flat.
|
|
1842
|
-
*/
|
|
1843
|
-
setViewMode?(mode: RendererViewMode): void;
|
|
1844
|
-
/** Current projection (defaults to 'flat' when unimplemented). */
|
|
1845
|
-
getViewMode?(): RendererViewMode;
|
|
1846
|
-
/** Multi-floor (Batch 5): switch the shown floor; list floors; read the active id. */
|
|
1847
|
-
setActiveFloor?(floorId: string): void;
|
|
1848
|
-
getFloors?(): {
|
|
1849
|
-
id: string;
|
|
1850
|
-
name: string;
|
|
1851
|
-
}[];
|
|
1852
|
-
getActiveFloorId?(): string;
|
|
1853
|
-
/** Render all floors stacked (3D overview) vs the active floor. No-op single-floor. */
|
|
1854
|
-
setStacked?(on: boolean): void;
|
|
1855
|
-
isStacked?(): boolean;
|
|
1856
|
-
/** Render every floor in its authored 2D coordinates so the buyer can choose a level. */
|
|
1857
|
-
setFloorOverview?(on: boolean): void;
|
|
1858
|
-
isFloorOverview?(): boolean;
|
|
1859
|
-
/**
|
|
1860
|
-
* Section id whose outline contains a container-relative screen point (or null).
|
|
1861
|
-
* Feeds the far-zoom "tap a section to zoom in" flow (Slice 5).
|
|
1862
|
-
*/
|
|
1863
|
-
sectionAt?(clientPoint: Point): string | null;
|
|
1864
|
-
/** Seat ids belonging to a section — for the section-summary card (Slice 5). */
|
|
1865
|
-
sectionMembers?(id: string): string[];
|
|
1866
|
-
/**
|
|
1867
|
-
* Smoothly glide (pan+zoom) the camera to frame a section (by id) or a world-
|
|
1868
|
-
* space bounds rect over a calm easeInOutCubic glide. `prefers-reduced-motion` snaps.
|
|
1869
|
-
* A pointer-down (grab/pan) cancels an in-flight glide. Slice 5 "glide in".
|
|
1870
|
-
*/
|
|
1871
|
-
focusRegion?(target: string | {
|
|
1872
|
-
x: number;
|
|
1873
|
-
y: number;
|
|
1874
|
-
width: number;
|
|
1875
|
-
height: number;
|
|
1876
|
-
}, opts?: {
|
|
1877
|
-
animate?: boolean;
|
|
1878
|
-
minScale?: number;
|
|
1879
|
-
durationMs?: number;
|
|
1880
|
-
}): void;
|
|
1881
|
-
/** Current LOD rung derived from zoom (for the ZONES/SECTIONS/SEATS pill). */
|
|
1882
|
-
getRung?(): LodRung;
|
|
1883
|
-
/** Jump the camera to a rung's zoom band, centred on the chart (glided). */
|
|
1884
|
-
setRung?(rung: LodRung): void;
|
|
1885
|
-
/** Read actual browser-rendered label visibility, size, fill, ink and state.
|
|
1886
|
-
* Pure diagnostic: it never changes chart or renderer state. */
|
|
1887
|
-
getRenderedQualityEvidence(): RendererQualityEvidence;
|
|
1888
|
-
destroy(): void;
|
|
1889
|
-
}
|
|
1890
|
-
interface RendererMinimapSection {
|
|
1891
|
-
id: string;
|
|
1892
|
-
label: string;
|
|
1893
|
-
outline: Point[];
|
|
1894
|
-
floorId?: string;
|
|
1895
|
-
state: 'selected' | 'available' | 'inactive';
|
|
1896
|
-
active: boolean;
|
|
1897
|
-
}
|
|
1898
|
-
interface RendererMinimapSeat {
|
|
1899
|
-
x: number;
|
|
1900
|
-
y: number;
|
|
1901
|
-
categoryKey: string;
|
|
1902
|
-
state: 'selected' | 'available' | 'inactive';
|
|
1903
|
-
}
|
|
1904
|
-
interface RendererMinimapSnapshot {
|
|
1905
|
-
sections: RendererMinimapSection[];
|
|
1906
|
-
seats: RendererMinimapSeat[];
|
|
1907
|
-
}
|
|
1908
|
-
/** localStorage key the Designer writes and the Picker reads. */
|
|
1909
|
-
declare const CHART_STORAGE_KEY = "seatmap.chart";
|
|
1910
1387
|
|
|
1911
|
-
export { type
|
|
1388
|
+
export { type ReferenceSectionTraceBatchInput as $, type AccessibilityType as A, type BoothObject as B, type ChartDoc as C, type DecorImageObject as D, LABEL_STYLE_MAX_SIZE as E, type Floor as F, type GAAreaObject as G, LABEL_STYLE_MIN_SIZE as H, type LabelPresentation as I, type Physical3dEvidence as J, type RadialClearanceLayoutConstraint as K, type LabelStyle as L, type ReferenceAccessibilitySource as M, type ReferenceCalibration as N, type ObjectEditorState as O, type Point as P, type ReferenceCategorySource as Q, type RowObject as R, type SeatOverride as S, type TableObject as T, type ReferenceDerivedScale as U, type ReferenceInventoryExclusionSource as V, type ReferenceInventorySource as W, type ReferenceScanProposal as X, type ReferenceScanRowProposal as Y, type ReferenceScanSectionProposal as Z, type ReferenceSeatSeed as _, type SeatViewMetadata as a, type ReferenceSectionTraceBatchProposal as a0, type ReferenceSectionTraceInput as a1, type ReferenceSectionTraceProposal as a2, SEAT_COMMERCIAL_MARKS as a3, SURROUNDINGS_SHAPE_ROLES as a4, type SeatCommercialMark as a5, type SeatCommercialMeta as a6, type SeatConfidenceCoverage as a7, type SeatConfidenceEvidence as a8, type SeatConfidenceModelLevel as a9, type SeatConfidenceModeledTarget as aa, type SeatConfidenceRealityLevel as ab, type SelectionLayer as ac, type TextAlignment as ad, type TextBackground as ae, type TicketTierApplicability as af, type TicketTierEvidence as ag, type TicketTierRestriction as ah, type ZoneDef as ai, accessibilityMeta as aj, accessibilityRingColor as ak, layerOf as al, seatCommercialMeta as am, type RectTableSide as b, type ChartObject as c, type SectionObject as d, type RectTableSeatCounts as e, type SeatCommercialAttributes as f, type ResolvedSeatConfidenceEvidence as g, type SeatViewCoverage as h, type SectionOutlinePath as i, type SectionPathSegment as j, type GAInventorySegment as k, type CategoryTier as l, type ChartReferenceImage as m, type ShapeLineCap as n, type ShapeLineEnding as o, type ShapeLineJoin as p, type ShapeObject as q, type CubicPath as r, type TextObject as s, ACCESSIBILITY_RING_COLOR as t, ACCESSIBILITY_TYPES as u, type AccessibilityMeta as v, type AuthoringObjectState as w, type Category as x, type ChartLayoutConstraint as y, type ChartTheme as z };
|