@seatlayer/core 0.52.0 → 0.54.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.
Files changed (110) hide show
  1. package/LICENSE +16 -17
  2. package/README.md +8 -18
  3. package/dist/categoryInventory-B4xo7hE2.d.ts +109 -0
  4. package/dist/categoryInventory-lRtu3VjD.d.cts +109 -0
  5. package/dist/chunk-3QLFGEQY.js +1 -0
  6. package/dist/chunk-55NOSZK5.js +1 -0
  7. package/dist/chunk-6LIPQU4G.js +1 -0
  8. package/dist/chunk-6VTTBC5F.js +1 -0
  9. package/dist/chunk-7PT7OQUO.js +1 -0
  10. package/dist/chunk-AQKYUJBX.js +1 -0
  11. package/dist/chunk-CXF32VPG.js +1 -0
  12. package/dist/chunk-DDE7IOFT.js +1 -0
  13. package/dist/chunk-EQM4FFN5.js +1 -0
  14. package/dist/chunk-EYROIZGQ.js +1 -0
  15. package/dist/chunk-IJI4WU57.js +1 -0
  16. package/dist/chunk-QUKWJQLR.js +1 -0
  17. package/dist/chunk-VDZ24QVV.js +1 -0
  18. package/dist/chunk-XPPT3OGQ.js +1 -0
  19. package/dist/core/chart-ops/index.cjs +1 -0
  20. package/dist/core/chart-ops/index.d.cts +1235 -0
  21. package/dist/core/chart-ops/index.d.ts +1235 -0
  22. package/dist/core/chart-ops/index.js +1 -0
  23. package/dist/core/color.cjs +1 -0
  24. package/dist/core/color.d.cts +192 -0
  25. package/dist/core/color.d.ts +192 -0
  26. package/dist/core/color.js +1 -0
  27. package/dist/core/inventory/index.cjs +1 -0
  28. package/dist/core/inventory/index.d.cts +209 -0
  29. package/dist/core/inventory/index.d.ts +209 -0
  30. package/dist/core/inventory/index.js +1 -0
  31. package/dist/core/layout/index.cjs +1 -0
  32. package/dist/core/layout/index.d.cts +376 -0
  33. package/dist/core/layout/index.d.ts +376 -0
  34. package/dist/core/layout/index.js +1 -0
  35. package/dist/core/quality/index.cjs +1 -0
  36. package/dist/core/quality/index.d.cts +132 -0
  37. package/dist/core/quality/index.d.ts +132 -0
  38. package/dist/core/quality/index.js +1 -0
  39. package/dist/core/render-assets/index.cjs +1 -0
  40. package/dist/core/render-assets/index.d.cts +99 -0
  41. package/dist/core/render-assets/index.d.ts +99 -0
  42. package/dist/core/render-assets/index.js +1 -0
  43. package/dist/core/seatConfidence.cjs +1 -76
  44. package/dist/core/seatConfidence.d.cts +1 -1
  45. package/dist/core/seatConfidence.d.ts +1 -1
  46. package/dist/core/seatConfidence.js +1 -51
  47. package/dist/core/sections/index.cjs +1 -0
  48. package/dist/core/sections/index.d.cts +346 -0
  49. package/dist/core/sections/index.d.ts +346 -0
  50. package/dist/core/sections/index.js +1 -0
  51. package/dist/de-75NWRKC5.js +1 -0
  52. package/dist/es-BM7EJ7PW.js +1 -0
  53. package/dist/fr-HPXQHIB4.js +1 -0
  54. package/dist/index.cjs +1 -12717
  55. package/dist/index.d.cts +71 -580
  56. package/dist/index.d.ts +71 -580
  57. package/dist/index.js +1 -10235
  58. package/dist/labeling-CsPt1mC_.d.cts +90 -0
  59. package/dist/labeling-w8bl86cb.d.ts +90 -0
  60. package/dist/layout-B5UYbwnv.d.ts +181 -0
  61. package/dist/layout-YFmuxw_M.d.cts +181 -0
  62. package/dist/picker/minimapGeometry.cjs +1 -80
  63. package/dist/picker/minimapGeometry.js +1 -52
  64. package/dist/renderedQuality-CugJarFp.d.cts +113 -0
  65. package/dist/renderedQuality-DbZM034G.d.ts +113 -0
  66. package/dist/renderer-DhUHFtsI.d.cts +531 -0
  67. package/dist/renderer-IBi9YKWR.d.ts +531 -0
  68. package/dist/sections-B7cDF0Nq.d.cts +123 -0
  69. package/dist/sections-mLOZrGrI.d.ts +123 -0
  70. package/dist/segmentedRowModel-BPTnJ7Tz.d.ts +75 -0
  71. package/dist/segmentedRowModel-CGoH684F.d.cts +75 -0
  72. package/dist/ticketRestrictions-BwAebpSK.d.cts +72 -0
  73. package/dist/ticketRestrictions-ChHJwvTq.d.ts +72 -0
  74. package/dist/{types-tLOunI-B.d.cts → types-COfJorq_.d.cts} +233 -757
  75. package/dist/{types-tLOunI-B.d.ts → types-COfJorq_.d.ts} +233 -757
  76. package/dist/view/panoramaDelivery.cjs +1 -126
  77. package/dist/view/panoramaDelivery.js +1 -17
  78. package/dist/view3d/crossfade/panorama.cjs +1 -459
  79. package/dist/view3d/crossfade/panorama.d.cts +2 -4
  80. package/dist/view3d/crossfade/panorama.d.ts +2 -4
  81. package/dist/view3d/crossfade/panorama.js +1 -30
  82. package/dist/view3d/index.cjs +27 -7929
  83. package/dist/view3d/index.d.cts +64 -22
  84. package/dist/view3d/index.d.ts +64 -22
  85. package/dist/view3d/index.js +27 -7062
  86. package/package.json +95 -11
  87. package/dist/chunk-AZODENEL.js +0 -97
  88. package/dist/chunk-AZODENEL.js.map +0 -1
  89. package/dist/chunk-BE3F7CT3.js +0 -341
  90. package/dist/chunk-BE3F7CT3.js.map +0 -1
  91. package/dist/chunk-UID7KN44.js +0 -1569
  92. package/dist/chunk-UID7KN44.js.map +0 -1
  93. package/dist/core/seatConfidence.cjs.map +0 -1
  94. package/dist/core/seatConfidence.js.map +0 -1
  95. package/dist/de-YGODYJ3E.js +0 -292
  96. package/dist/de-YGODYJ3E.js.map +0 -1
  97. package/dist/es-VMBTGVFQ.js +0 -292
  98. package/dist/es-VMBTGVFQ.js.map +0 -1
  99. package/dist/fr-SLBE2ULB.js +0 -292
  100. package/dist/fr-SLBE2ULB.js.map +0 -1
  101. package/dist/index.cjs.map +0 -1
  102. package/dist/index.js.map +0 -1
  103. package/dist/picker/minimapGeometry.cjs.map +0 -1
  104. package/dist/picker/minimapGeometry.js.map +0 -1
  105. package/dist/view/panoramaDelivery.cjs.map +0 -1
  106. package/dist/view/panoramaDelivery.js.map +0 -1
  107. package/dist/view3d/crossfade/panorama.cjs.map +0 -1
  108. package/dist/view3d/crossfade/panorama.js.map +0 -1
  109. package/dist/view3d/index.cjs.map +0 -1
  110. package/dist/view3d/index.js.map +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;
@@ -1102,235 +1333,7 @@ interface Floor {
1102
1333
  /** Floor-scoped confidence evidence inherited before the venue default. */
1103
1334
  confidenceEvidence?: SeatConfidenceEvidence;
1104
1335
  }
1105
- /** Durable publishing-review evidence for an editable physical 3D property. */
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;
1336
+
1334
1337
  interface ChartDoc {
1335
1338
  version: 1;
1336
1339
  name: string;
@@ -1380,532 +1383,5 @@ interface ChartDoc {
1380
1383
  /** Venue-scoped confidence evidence. It does not require panorama media. */
1381
1384
  confidenceEvidence?: SeatConfidenceEvidence;
1382
1385
  }
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
1386
 
1911
- export { type ReferenceScanRowProposal as $, type AccessibilityType as A, type BoothObject as B, type ChartDoc as C, type CubicPath as D, type ExpandedSeat as E, type Floor as F, type GAAreaObject as G, type DecorImageObject as H, type ISeatmapRenderer as I, LABEL_STYLE_MAX_SIZE as J, LABEL_STYLE_MIN_SIZE as K, type LabelStyle as L, type LabelPresentation as M, type Physical3dEvidence as N, type ObjectEditorState as O, type Point as P, type RadialClearanceLayoutConstraint as Q, type ResolvedSeatConfidenceEvidence as R, type SeatOverride as S, type TableObject as T, type ReferenceAccessibilitySource as U, type ReferenceCalibration as V, type ReferenceCategorySource as W, type ReferenceDerivedScale as X, type ReferenceInventoryExclusionSource as Y, type ReferenceInventorySource as Z, type ReferenceScanProposal as _, type RowObject as a, type ReferenceScanSectionProposal as a0, type ReferenceSeatSeed as a1, type ReferenceSectionTraceBatchInput as a2, type ReferenceSectionTraceBatchProposal as a3, type ReferenceSectionTraceInput as a4, type ReferenceSectionTraceProposal as a5, type RenderedBookableLabelEvidence as a6, type RenderedGAAreaEvidence as a7, type RenderedHierarchyLabelEvidence as a8, type RenderedLabelHiddenReason as a9, type ZoneDef as aA, accessibilityMeta as aB, accessibilityRingColor as aC, layerOf as aD, seatCommercialMeta as aE, type RenderedRowLabelEvidence as aa, type RendererMinimapSeat as ab, type RendererMinimapSection as ac, SEAT_COMMERCIAL_MARKS as ad, SURROUNDINGS_SHAPE_ROLES as ae, type SeatCommercialMark as af, type SeatCommercialMeta as ag, type SeatConfidenceCoverage as ah, type SeatConfidenceEvidence as ai, type SeatConfidenceModelLevel as aj, type SeatConfidenceModeledTarget as ak, type SeatConfidenceRealityLevel as al, type SeatViewCoverage as am, type SectionOutlinePath as an, type SectionPathSegment as ao, type SelectionLayer as ap, type ShapeLineCap as aq, type ShapeLineEnding as ar, type ShapeLineJoin as as, type ShapeObject as at, type TextAlignment as au, type TextBackground as av, type TextObject as aw, type TicketTierApplicability as ax, type TicketTierEvidence as ay, type TicketTierRestriction as az, type SeatViewMetadata as b, type RectTableSide as c, type ChartObject as d, type SectionObject as e, type RectTableSeatCounts as f, type GAInventorySegment as g, type RendererQualityEvidence as h, type RenderedFreeTextEvidence as i, type RendererOptions as j, type SeatStatus as k, type RendererViewMode as l, type RendererMinimapSnapshot as m, type LodRung as n, type CategoryTier as o, type SeatCommercialAttributes as p, type RendererCallbacks as q, ACCESSIBILITY_RING_COLOR as r, ACCESSIBILITY_TYPES as s, type AccessibilityMeta as t, type AuthoringObjectState as u, CHART_STORAGE_KEY as v, type Category as w, type ChartLayoutConstraint as x, type ChartReferenceImage as y, type ChartTheme as z };
1387
+ 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 };