@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
package/dist/index.d.ts CHANGED
@@ -1,463 +1,13 @@
1
- import { a as RowObject, A as AccessibilityType, S as SeatOverride, b as SeatViewMetadata, L as LabelStyle, c as RectTableSide, C as ChartDoc, d as ChartObject, B as BoothObject, E as ExpandedSeat, T as TableObject, P as Point, F as Floor, e as SectionObject, f as RectTableSeatCounts, G as GAAreaObject, g as GAInventorySegment, h as RendererQualityEvidence, i as RenderedFreeTextEvidence, I as ISeatmapRenderer, j as RendererOptions, k as SeatStatus, l as RendererViewMode, m as RendererMinimapSnapshot, n as LodRung, o as CategoryTier, p as SeatCommercialAttributes, q as RendererCallbacks } from './types-tLOunI-B.js';
2
- export { r as ACCESSIBILITY_RING_COLOR, s as ACCESSIBILITY_TYPES, t as AccessibilityMeta, u as AuthoringObjectState, v as CHART_STORAGE_KEY, w as Category, x as ChartLayoutConstraint, y as ChartReferenceImage, z as ChartTheme, D as CubicPath, H as DecorImageObject, J as LABEL_STYLE_MAX_SIZE, K as LABEL_STYLE_MIN_SIZE, M as LabelPresentation, O as ObjectEditorState, N as Physical3dEvidence, Q as RadialClearanceLayoutConstraint, U as ReferenceAccessibilitySource, V as ReferenceCalibration, W as ReferenceCategorySource, X as ReferenceDerivedScale, Y as ReferenceInventoryExclusionSource, Z as ReferenceInventorySource, _ as ReferenceScanProposal, $ as ReferenceScanRowProposal, a0 as ReferenceScanSectionProposal, a1 as ReferenceSeatSeed, a2 as ReferenceSectionTraceBatchInput, a3 as ReferenceSectionTraceBatchProposal, a4 as ReferenceSectionTraceInput, a5 as ReferenceSectionTraceProposal, a6 as RenderedBookableLabelEvidence, a7 as RenderedGAAreaEvidence, a8 as RenderedHierarchyLabelEvidence, a9 as RenderedLabelHiddenReason, aa as RenderedRowLabelEvidence, ab as RendererMinimapSeat, ac as RendererMinimapSection, R as ResolvedSeatConfidenceEvidence, ad as SEAT_COMMERCIAL_MARKS, ae as SURROUNDINGS_SHAPE_ROLES, af as SeatCommercialMark, ag as SeatCommercialMeta, ah as SeatConfidenceCoverage, ai as SeatConfidenceEvidence, aj as SeatConfidenceModelLevel, ak as SeatConfidenceModeledTarget, al as SeatConfidenceRealityLevel, am as SeatViewCoverage, an as SectionOutlinePath, ao as SectionPathSegment, ap as SelectionLayer, aq as ShapeLineCap, ar as ShapeLineEnding, as as ShapeLineJoin, at as ShapeObject, au as TextAlignment, av as TextBackground, aw as TextObject, ax as TicketTierApplicability, ay as TicketTierEvidence, az as TicketTierRestriction, aA as ZoneDef, aB as accessibilityMeta, aC as accessibilityRingColor, aD as layerOf, aE as seatCommercialMeta } from './types-tLOunI-B.js';
3
-
4
- /**
5
- * The segmented-row model one logical row made of several physical rows.
6
- *
7
- * A segmented row is drawn as a chain of nodes and stored as N physical
8
- * `RowObject`s tied together by `segmentedRow` metadata. Two questions have to
9
- * be answered consistently or the feature lies to somebody:
10
- *
11
- * 1. **At draft time** — given the author's nodes, exactly which components,
12
- * seat counts and pitches will be committed? (`segmentedRowComponents`)
13
- * 2. **At read time** — given stored physical rows, what is the logical row they
14
- * form, and where does each component sit inside its numbering?
15
- * (`resolveSegmentedRowGroups`)
16
- *
17
- * These lived apart — (1) in `rowDraft.ts` next to the ghost preview, (2) in
18
- * `layout.ts` next to buyer expansion — which is precisely how the canvas came
19
- * to number a segmented row `1-7` / `1-6` while buyers correctly saw
20
- * `A-1…A-13`. They are two halves of one rule, so they live in one module.
21
- *
22
- * The standing rule this module exists to enforce: **the ghost preview and the
23
- * commit share one resolver.** A preview that can lie is a bug.
24
- */
25
-
26
- /** Resolved logical placement of one physical component inside a segmented row. */
27
- interface SegmentedRowPlacement {
28
- groupId: string;
29
- /** Buyer adjacency index base (a declared aisle break costs one index). */
30
- adjacencyOffset: number;
31
- /** Continuous seat-numbering base across the whole logical row. */
32
- displayOffset: number;
33
- displayLabel: string;
34
- totalSeats: number;
35
- canonical: RowObject;
36
- viewFromSeatUrl?: string;
37
- viewFromSeatMeta?: RowObject['viewFromSeatMeta'];
38
- confidenceEvidence?: RowObject['confidenceEvidence'];
39
- }
40
-
41
- /**
42
- * Pure geometry helpers — no Konva, no DOM. Turns the parametric chart
43
- * document into concrete seat coordinates and computes bounding boxes.
44
- */
45
-
46
- /**
47
- * Expand a parametric row into seat positions.
48
- *
49
- * Straight (curve === 0): seat i sits at local (i·spacing, 0).
50
- *
51
- * Curved: seats lie on a circular arc. Per-seat angular step is
52
- * `curve/(seatCount-1)`; radius is derived so the chord between neighbours
53
- * equals seatSpacing → radius = spacing / (2·sin(step/2)). Seat 0 sits at the
54
- * bottom of the arc (local origin) with the circle centre directly above it at
55
- * (0,-radius); increasing index sweeps toward +x while the ends rise toward -y,
56
- * i.e. positive curve is concave toward -y (a row wrapping a stage above it).
57
- * Local points are then rotated by `rotation` and translated to `origin`.
58
- *
59
- * Numbering (labels only, never geometry): `seatNumbering.direction === 'rtl'`
60
- * numbers from the far physical end; `step === 2` produces odd/even numbering
61
- * (start at 1 → 1,3,5…; start at 2 → 2,4,6…).
62
- */
63
- /** Base (pre-override) seat centre per index — shared by expandRow + designer edit mode. */
64
- declare function rowSeatPositions(row: RowObject): Point[];
65
- /** Sellable row slots: skipped slots are absent; empty wheelchair bays remain. */
66
- declare function rowInventoryCount(row: RowObject): number;
67
- /**
68
- * Every seat slot of a row INCLUDING skipped ones (designer seat-edit mode uses
69
- * this to draw un-skip handles). Overrides (dx/dy/label/categoryKey) are applied
70
- * but a skipped slot is flagged, not omitted.
71
- */
72
- interface RowSeatSlot {
73
- index: number;
74
- x: number;
75
- y: number;
76
- label: string;
77
- displayLabel: string;
78
- categoryKey: string;
79
- skipped: boolean;
80
- accessible: boolean;
81
- accessibility: AccessibilityType[];
82
- wheelchairSpaceType?: SeatOverride['wheelchairSpaceType'];
83
- commercial?: RowObject['commercial'];
84
- viewUrl?: string;
85
- viewMeta?: SeatViewMetadata;
86
- labelStyle?: LabelStyle;
87
- }
88
- /** Every authored table-chair slot, including skipped inventory. This mirrors
89
- * row seat slots so Designer, MCP and buyer/event expansion share one semantic
90
- * source while retaining the table's stable numeric slot identity. */
91
- interface TableSeatSlot extends RowSeatSlot {
92
- side?: RectTableSide;
93
- }
94
- /**
95
- * Seat slots for one physical row.
96
- *
97
- * `placement` makes the slots read as part of a logical segmented row: labels
98
- * continue across components (`A-8`, not a second `A-1`) using the logical row's
99
- * numbering scheme and total seat count.
100
- */
101
- declare function expandRowSlots(row: RowObject, placement?: SegmentedRowPlacement): RowSeatSlot[];
102
- declare function expandRow(row: RowObject): ExpandedSeat[];
103
- /**
104
- * Expand a table into its perimeter seats.
105
- *
106
- * Round: seats spread evenly on a circle of radius `radius + 16`, the first at
107
- * angle `rotation` (degrees, clockwise from +x). Rect: seats line the top and
108
- * bottom edges (split evenly, any remainder to the top), 16u outside the edge,
109
- * the whole set rotated about the table centre.
110
- */
111
- /** Legacy rect tables distribute aggregate capacity round-robin across enabled
112
- * sides, then emit chairs in canonical top/bottom/left/right order. */
113
- declare function tableSeatCountsBySide(t: TableObject): RectTableSeatCounts;
114
- /** Expand every authored table chair, including skipped slots needed by the
115
- * Designer to restore inventory. */
116
- declare function expandTableSlots(t: TableObject): TableSeatSlot[];
117
- /** Sellable individual table chairs. Grouped tables own one atomic inventory
118
- * unit elsewhere and therefore retain their full authored chair capacity. */
119
- declare function tableInventoryCount(t: TableObject): number;
120
- declare function expandTable(t: TableObject): ExpandedSeat[];
121
- /** Expand a booth into its single bookable block unit. */
122
- declare function expandBooth(b: BoothObject): ExpandedSeat[];
123
- /** Ray-cast point-in-polygon test — odd crossings ⇒ inside. */
124
- declare function pointInPolygon(p: Point, poly: Point[]): boolean;
125
- declare function pointInPolygonWithHoles(p: Point, outer: Point[], holes: Point[][] | undefined): boolean;
126
- /**
127
- * Stable interior label anchor: the centre of the largest circle that fits in
128
- * the polygon (holes excluded).
129
- *
130
- * This used to return the average-of-vertices centroid whenever that happened
131
- * to be inside, and only fell back to a coarse 24×24 grid search when it was
132
- * not. "Inside" is a much weaker property than "has room": on a traced arena
133
- * the outer arc of a wedge carries dozens of sampled vertices and the radial
134
- * edges carry two, so the average is dragged onto the arc and the label pill —
135
- * far wider than a point — straddled the boundary into the next section.
136
- * Measured on the 36-section traced arena corpus, 15 of 36 anchors had under
137
- * 75% of the clearance actually available, some as little as 43%.
138
- *
139
- * `polygonInscribedAnchor` is deterministic and coordinate-free, so callers may
140
- * memoize it on geometry alone.
141
- */
142
- declare function polygonLabelPoint(outer: Point[], holes: Point[][] | undefined): Point;
143
- /**
144
- * Visual centre of any object — used for spatial section membership and for
145
- * rotating an object about its centre. Rows: centroid of expanded seats (or
146
- * origin when empty); tables/booths: centre; GA/section: polygon centroid;
147
- * shape: bbox centre; text: its position.
148
- */
149
- declare function objectCenter(o: ChartObject): Point;
150
- /**
151
- * Resolve one bookable object's owning physical section using the canonical
152
- * first-match rule. Generated reference inventory may name a logical section,
153
- * but that provenance is trusted only when the stored geometry confirms it.
154
- * Keeping this primitive in layout lets section inventory, category painting,
155
- * and buyer view inheritance share one ownership decision.
156
- */
157
- declare function owningSectionForObject(objects: ChartObject[], object: ChartObject): SectionObject | undefined;
158
- /**
159
- * Normalized floor list (Batch 5): a multi-floor chart's `floors`, or a synthetic
160
- * single floor wrapping a single-floor chart's `objects`. Every consumer that needs
161
- * to reason about floors goes through this so single-floor charts stay untouched.
162
- */
163
- declare function floorsOf(doc: ChartDoc): Floor[];
164
- /** Objects of one floor by id (defaults to the first floor). */
165
- declare function floorObjects(doc: ChartDoc, floorId?: string): ChartObject[];
166
- /** Every object across ALL floors — the whole venue (single-floor = `doc.objects`). */
167
- declare function allObjects(doc: ChartDoc): ChartObject[];
168
- /** A copy of an object translated by (dx, dy) — every coordinate field shifted. */
169
- declare function translateObject(o: ChartObject, dx: number, dy: number): ChartObject;
170
- /**
171
- * Multi-floor 3D stack (Batch 5): flatten every floor into ONE doc with floor `i`
172
- * lifted by `i * spread` in −y, so the isometric view shows the floors as stacked
173
- * decks (ground at the bottom). Returns a single-floor doc (no `floors`). Meant
174
- * only for the 3D overview render — 2D still shows one floor via `floorObjects`.
175
- */
176
- declare function stackFloors(doc: ChartDoc, spread?: number): ChartDoc;
177
- /**
178
- * Build the buyer-facing 2D overview of a multi-floor chart.
179
- *
180
- * Floors commonly reuse the same drawing origin (a balcony is authored over
181
- * the stalls it overlooks). Flattening those source coordinates makes a valid
182
- * import look corrupt because every level is painted on top of every other
183
- * level. This projection packs complete floors into a compact, content-aware
184
- * grid. Each floor receives one rigid translation: no seat, row, section,
185
- * annotation, gap, or rotation changes, and the canonical document is never
186
- * mutated.
187
- */
188
- declare function layoutFloorOverview(doc: ChartDoc): ChartDoc;
189
- /**
190
- * Rigid per-floor translations used by the buyer's complete-venue overview.
191
- *
192
- * Kept as a pure public helper so 2D and 3D can present the same non-overlapping
193
- * level arrangement without either renderer rewriting the authored chart. A
194
- * zero translation is returned for a single-floor document.
195
- */
196
- declare function floorOverviewTranslations(doc: ChartDoc): Point[];
197
- interface ExpandChartOptions {
198
- /** Physical height for a single-floor projection extracted from a multi-floor
199
- * document. Full multi-floor documents resolve each floor directly. */
200
- floorBaseHeightM?: number;
201
- /** Resolve per-seat 3D eye heights (default true). Two-dimensional consumers
202
- * such as thumbnails can disable this expensive stand-structure pass. */
203
- resolveEyeHeights?: boolean;
204
- }
205
- /** Expand every seat-bearing object across all floors (rows, tables, booths).
206
- * Multi-floor ownership is resolved one floor at a time: local coordinates may
207
- * overlap between floors and must never assign a seat to another floor's section. */
208
- declare function expandChart(doc: ChartDoc, options?: ExpandChartOptions): ExpandedSeat[];
209
- /** Axis-aligned bounds over every object plus the background image, with padding. */
210
- declare function chartBounds(doc: ChartDoc): {
211
- x: number;
212
- y: number;
213
- width: number;
214
- height: number;
215
- };
216
-
217
- declare const MAX_GA_CAPACITY = 100000;
218
- declare const MAX_EVENT_INVENTORY = 100000;
219
- /** Stable internal inventory label for one unit of a GA area's capacity. */
220
- declare function gaUnitLabel(areaId: string, index: number): string;
221
- /** Strict, bounded validation for durable Join Areas inventory provenance. */
222
- declare function validGAInventorySegments(area: GAAreaObject): boolean;
223
- /** Canonical source ranges. Invalid explicit provenance intentionally yields no
224
- * labels: chart validation blocks publication instead of inventing identities. */
225
- declare function gaInventorySegments(area: GAAreaObject): GAInventorySegment[];
226
- declare function gaUnitLabels(area: GAAreaObject): string[];
227
- /** Append-only capacity semantics for an already joined GA surface. */
228
- declare function growJoinedGAInventory(area: GAAreaObject, nextCapacity: number): GAInventorySegment[] | undefined;
229
- declare function gaAreasOf(doc: ChartDoc): GAAreaObject[];
230
- declare function isGaUnitLabel(label: string): boolean;
231
-
232
- /**
233
- * Real-world scale primitives — the ONE place the app fixes chart-unit ↔ metre ↔
234
- * renderer-world scale, and the section 3D-geometry resolver that rides on it.
235
- *
236
- * Everything that converts between chart units, metres, and renderer "world"
237
- * units derives from {@link METRES_PER_CHART_UNIT}. Renderer world units and
238
- * chart units are 1:1, so metres → world is exactly {@link CHART_UNITS_PER_METRE}
239
- * (the single m→world conversion constant Phase B consumers use).
240
- *
241
- * This is a leaf module (types only) so both `layout.ts` and `sections.ts` can
242
- * import it without the two forming an import cycle.
243
- */
244
-
245
- /**
246
- * Metres of front-edge height one elevation tier represents. Chosen (not guessed)
247
- * so `elevation × TIER_HEIGHT_M` metres, scaled back through
248
- * {@link CHART_UNITS_PER_METRE}, equals the legacy `elevation × LIFT_PER_STEP`
249
- * world lift exactly — an un-authored chart stays pixel-identical. ≈ 1.329 m/tier.
250
- */
251
- declare const TIER_HEIGHT_M: number;
252
- /**
253
- * Resolve a section's real 3D geometry, applying the legacy-elevation fallback so
254
- * old charts and new charts share ONE code path. Every consumer (iso lift, 360°
255
- * eye-height, author lint, any 2D depth cue) must call this and never read the raw
256
- * {@link SectionObject.height}/{@link SectionObject.rake} fields — that is what
257
- * keeps un-authored charts rendering identically to today.
258
- *
259
- * - `height`: authored absolute metres if present, else owning-floor base height
260
- * plus `elevation × TIER_HEIGHT_M`.
261
- * - `rake`: authored degrees if present, else 0 (flat).
262
- *
263
- * Malformed values are bounded here as a last defensive barrier. Structural
264
- * validation still reports them so drafts can be repaired instead of silently
265
- * persisting a renderer-only interpretation.
266
- *
267
- * Pure — no document mutation, no side effects.
268
- */
269
- interface SectionGeometryContext {
270
- /** Absolute physical height of the owning floor above the venue datum. */
271
- floorBaseHeightM?: number;
272
- }
273
- declare function sectionGeometry(section: Pick<SectionObject, 'elevation' | 'height' | 'rake'>, context?: SectionGeometryContext): {
274
- height: number;
275
- rake: number;
276
- };
277
-
278
- /**
279
- * Section membership + hide/show resolution (Batch 3.3).
280
- *
281
- * A `SectionObject` is a polygon drawn over existing seat objects; an object
282
- * "belongs" to a section when its visual centre (`objectCenter`) falls inside
283
- * the section outline, first section in doc order winning. This is the same
284
- * spatial notion `objectCenter`'s doc-comment describes, resolved once here so
285
- * BOTH the event manager (Sections tab counts) and the buyer picker (omit
286
- * hidden seats) agree on which seats live in which section.
287
- *
288
- * Hiding is per-EVENT (the EventDO holds the hidden id set), not a chart edit —
289
- * so a republish of the chart never disturbs it. A hidden id may be a section
290
- * id, a zone id (hides every section in the zone), or `UNGROUPED_ID` (the
291
- * catch-all bucket of seat objects that sit in no section).
292
- */
293
-
294
- /** Synthetic section id for seat objects that fall in no drawn section. */
295
- declare const UNGROUPED_ID = "__ungrouped__";
296
- /**
297
- * A per section/zone availability window (Batch 3.4). Wire-compatible with the
298
- * EventDO's own `AvailabilityRule`. Absence of a rule for an id = on sale.
299
- * 'hidden' — manual: hidden until the organizer reveals it (3.3).
300
- * 'timed' — hidden until `revealAt` (epoch ms), then auto-reveals.
301
- * 'threshold' — auto-reveals once the on-sale inventory is `thresholdPct`% sold.
302
- * 'closed' — visible to buyers but not purchasable (rendered flat grey);
303
- * unlike 'hidden', the seats stay on the map, just off sale.
304
- * `labels` are the seat labels the id governs, so a threshold's denominator can
305
- * exclude still-hidden seats.
306
- */
307
- interface AvailabilityRule {
308
- mode: 'hidden' | 'timed' | 'threshold' | 'closed';
309
- revealAt?: number;
310
- thresholdPct?: number;
311
- labels?: string[];
312
- }
313
- interface SectionNode {
314
- /** Section id (a `SectionObject.id`, or `UNGROUPED_ID`). */
315
- id: string;
316
- label: string;
317
- /** Zone id this section points at (`SectionObject.zone`), if any. */
318
- zone?: string;
319
- /** Total seats across the member objects. */
320
- seatCount: number;
321
- /** Ids of the seat-bearing objects that belong to this section. */
322
- objectIds: string[];
323
- /** Seat labels across the member objects (for availability-rule denominators). */
324
- seatLabels: string[];
325
- }
326
- /**
327
- * Resolve section membership for a chart. Returns one node per drawn section
328
- * (doc order), a synthetic "Ungrouped" node for loose seat objects (null when
329
- * every seat sits in a section), and the object→section id map.
330
- */
331
- declare function computeSections(doc: ChartDoc): {
332
- sections: SectionNode[];
333
- ungrouped: SectionNode | null;
334
- /** seat-object id → owning section id (or `UNGROUPED_ID`). */
335
- objectToSection: Map<string, string>;
336
- };
337
- /** Is a drawn section hidden under `hidden` — directly, or via its zone? */
338
- declare function isSectionHidden(s: SectionObject, hidden: ReadonlySet<string>): boolean;
339
- /**
340
- * The set of seat-object ids to omit from the buyer view for a given hidden id
341
- * set. An object is hidden when its owning section is hidden (directly or via
342
- * zone), or it is ungrouped and the catch-all bucket is hidden.
343
- */
344
- declare function hiddenObjectIds(doc: ChartDoc, hidden: ReadonlySet<string>): Set<string>;
345
- /**
346
- * A copy of the doc with hidden sections' member objects removed, plus the
347
- * hidden section overlays themselves (so no empty block renders). Returns the
348
- * SAME reference when nothing is hidden — callers can skip a re-render on `===`.
349
- */
350
- declare function applyHidden(doc: ChartDoc, hidden: ReadonlySet<string>): ChartDoc;
351
-
352
- declare const RENDERED_QUALITY_REPORT_VERSION = 3;
353
- type RenderedEvidenceState = 'overview' | 'interaction';
354
- type RenderedQualityFindingCode = 'bookable-label-undersized' | 'bookable-label-contrast-low' | 'bookable-label-collision' | 'hierarchy-label-undersized' | 'hierarchy-label-contrast-low' | 'hierarchy-label-outside-section' | 'hierarchy-label-collision' | 'hierarchy-bookable-collision' | 'overview-section-category-paint' | 'overview-category-detail-visible' | 'overview-row-hints-visible' | 'overview-availability-clutter' | 'overview-ga-detail-visible' | 'free-text-undersized' | 'free-text-contrast-low' | 'free-text-collision' | 'free-text-bookable-collision' | 'free-text-hierarchy-collision' | 'ga-contrast-low' | 'detail-rung-missing' | 'detail-inventory-not-visible' | 'pointer-target-undersized' | 'pointer-target-inactive' | 'selected-state-missing' | 'selected-state-contrast-low' | 'held-state-missing' | 'booked-state-missing' | 'status-state-indistinct' | 'section-focus-missing' | 'category-filter-missing' | 'category-filter-ineffective' | 'target-category-not-visible' | 'target-category-filter-mismatch';
355
- interface RenderedQualitySample {
356
- primaryId: string;
357
- primaryLabel: string;
358
- secondaryId?: string;
359
- secondaryLabel?: string;
360
- measured?: number;
361
- minimum?: number;
362
- }
363
- interface RenderedQualityFinding {
364
- code: RenderedQualityFindingCode;
365
- message: string;
366
- count: number;
367
- samples: RenderedQualitySample[];
368
- }
369
- interface RenderedQualityReport {
370
- version: typeof RENDERED_QUALITY_REPORT_VERSION;
371
- passed: boolean;
372
- state: RenderedEvidenceState;
373
- /** Server-selected category exercised by a category-specific detail scene. */
374
- targetCategoryKey: string | null;
375
- /** Exact overview checks discharged by this browser-rendered report. */
376
- resolvedRules: string[];
377
- viewport: {
378
- width: number;
379
- height: number;
380
- };
381
- canvasBackground: string;
382
- effectiveScale: number;
383
- rung: RendererQualityEvidence['rung'];
384
- inventory: {
385
- totalBookableUnits: number;
386
- totalLabelledBookableUnits: number;
387
- visibleBookableLabels: number;
388
- hiddenBookableLabels: number;
389
- visibleHierarchyLabels: number;
390
- visibleFreeTextLabels: number;
391
- visibleGAAreas: number;
392
- };
393
- overviewStyle?: RendererQualityEvidence['overviewStyle'];
394
- /**
395
- * Coordinate-free identity evidence from the exact buyer scene. The Worker
396
- * uses this to compare persisted reference semantics with what Chromium
397
- * actually painted, without exposing screen boxes or accepting geometry.
398
- */
399
- composition: {
400
- hierarchy: Array<{
401
- id: string;
402
- kind: 'section' | 'zone';
403
- label: string;
404
- visible: boolean;
405
- }>;
406
- labelledObjects: Array<{
407
- objectId: string;
408
- kind: RenderedFreeTextEvidence['kind'];
409
- text: string;
410
- visible: boolean;
411
- }>;
412
- gaAreas: Array<{
413
- areaId: string;
414
- label: string;
415
- categoryKey: string;
416
- sectionId?: string;
417
- visible: boolean;
418
- }>;
419
- bookableSectionIds: string[];
420
- categoryKeys: string[];
421
- /** Categories whose non-dimmed bookable paint is visible in this scene. */
422
- activeCategoryKeys: string[];
423
- };
424
- metrics: {
425
- minimumRenderedBookableLabelPx: number | null;
426
- minimumBookableLabelContrast: number | null;
427
- minimumRenderedHierarchyLabelPx: number | null;
428
- minimumHierarchyLabelContrast: number | null;
429
- minimumRenderedFreeTextPx: number | null;
430
- minimumFreeTextContrast: number | null;
431
- minimumGAContrast: number | null;
432
- minimumEffectivePointerTargetPx: number | null;
433
- selectedRingContrast: number | null;
434
- };
435
- interaction: {
436
- applicable: {
437
- detail: boolean;
438
- pointer: boolean;
439
- held: boolean;
440
- booked: boolean;
441
- sectionFocus: boolean;
442
- categoryFilter: boolean;
443
- };
444
- selectedUnits: number;
445
- heldUnits: number;
446
- bookedUnits: number;
447
- activePointerTargets: number;
448
- focusedSectionId: string | null;
449
- focusBackdropVisible: boolean;
450
- categoryFilterKeys: string[] | null;
451
- };
452
- findings: RenderedQualityFinding[];
453
- }
454
- /**
455
- * Inspect what the buyer renderer actually decided to paint at one exact
456
- * viewport. This is deliberately downstream of ChartDoc validation: screen
457
- * size, LOD visibility, fitted hierarchy text, transient paint, and label
458
- * collisions cannot be proven from stored geometry alone.
459
- */
460
- declare function inspectRenderedQualityEvidence(evidence: RendererQualityEvidence, state?: RenderedEvidenceState, targetCategoryKey?: string | null): RenderedQualityReport;
1
+ import { C as ChartDoc, P as Point, A as AccessibilityType, l as CategoryTier, f as SeatCommercialAttributes } from './types-COfJorq_.js';
2
+ export { t as ACCESSIBILITY_RING_COLOR, u as ACCESSIBILITY_TYPES, v as AccessibilityMeta, w as AuthoringObjectState, B as BoothObject, x as Category, y as ChartLayoutConstraint, c as ChartObject, m as ChartReferenceImage, z as ChartTheme, r as CubicPath, D as DecorImageObject, F as Floor, G as GAAreaObject, k as GAInventorySegment, E as LABEL_STYLE_MAX_SIZE, H as LABEL_STYLE_MIN_SIZE, I as LabelPresentation, L as LabelStyle, O as ObjectEditorState, J as Physical3dEvidence, K as RadialClearanceLayoutConstraint, e as RectTableSeatCounts, b as RectTableSide, M as ReferenceAccessibilitySource, N as ReferenceCalibration, Q as ReferenceCategorySource, U as ReferenceDerivedScale, V as ReferenceInventoryExclusionSource, W as ReferenceInventorySource, X as ReferenceScanProposal, Y as ReferenceScanRowProposal, Z as ReferenceScanSectionProposal, _ as ReferenceSeatSeed, $ as ReferenceSectionTraceBatchInput, a0 as ReferenceSectionTraceBatchProposal, a1 as ReferenceSectionTraceInput, a2 as ReferenceSectionTraceProposal, g as ResolvedSeatConfidenceEvidence, R as RowObject, a3 as SEAT_COMMERCIAL_MARKS, a4 as SURROUNDINGS_SHAPE_ROLES, a5 as SeatCommercialMark, a6 as SeatCommercialMeta, a7 as SeatConfidenceCoverage, a8 as SeatConfidenceEvidence, a9 as SeatConfidenceModelLevel, aa as SeatConfidenceModeledTarget, ab as SeatConfidenceRealityLevel, S as SeatOverride, h as SeatViewCoverage, a as SeatViewMetadata, d as SectionObject, i as SectionOutlinePath, j as SectionPathSegment, ac as SelectionLayer, n as ShapeLineCap, o as ShapeLineEnding, p as ShapeLineJoin, q as ShapeObject, T as TableObject, ad as TextAlignment, ae as TextBackground, s as TextObject, af as TicketTierApplicability, ag as TicketTierEvidence, ah as TicketTierRestriction, ai as ZoneDef, aj as accessibilityMeta, ak as accessibilityRingColor, al as layerOf, am as seatCommercialMeta } from './types-COfJorq_.js';
3
+ export { E as ExpandChartOptions, R as RowSeatSlot, T as TableSeatSlot, a as allObjects, c as chartBounds, e as expandBooth, b as expandChart, d as expandRow, f as expandRowSlots, g as expandTable, h as expandTableSlots, i as floorObjects, j as floorOverviewTranslations, k as floorsOf, l as layoutFloorOverview, o as objectCenter, m as owningSectionForObject, p as pointInPolygon, n as pointInPolygonWithHoles, q as polygonLabelPoint, r as rowInventoryCount, s as rowSeatPositions, t as stackFloors, u as tableInventoryCount, v as tableSeatCountsBySide, w as translateObject } from './layout-B5UYbwnv.js';
4
+ import { c as TicketSelectionIssue } from './ticketRestrictions-ChHJwvTq.js';
5
+ export { M as MAX_EVENT_INVENTORY, a as MAX_GA_CAPACITY, g as gaAreasOf, h as gaInventorySegments, i as gaUnitLabel, j as gaUnitLabels, k as growJoinedGAInventory, l as isGaUnitLabel, v as validGAInventorySegments } from './ticketRestrictions-ChHJwvTq.js';
6
+ export { A as AvailabilityRule, S as SectionNode, T as TIER_HEIGHT_M, U as UNGROUPED_ID, a as applyHidden, c as computeSections, h as hiddenObjectIds, i as isSectionHidden, s as sectionGeometry } from './sections-mLOZrGrI.js';
7
+ export { R as RENDERED_QUALITY_REPORT_VERSION, a as RenderedEvidenceState, b as RenderedQualityFinding, c as RenderedQualityFindingCode, d as RenderedQualityReport, e as RenderedQualitySample, i as inspectRenderedQualityEvidence } from './renderedQuality-DbZM034G.js';
8
+ import { I as ISeatmapRenderer, b as RendererOptions, S as SeatStatus, E as ExpandedSeat, c as RendererViewMode, d as RendererMinimapSnapshot, L as LodRung, R as RendererQualityEvidence, e as RendererCallbacks } from './renderer-IBi9YKWR.js';
9
+ export { C as CHART_STORAGE_KEY, f as RenderedBookableLabelEvidence, a as RenderedFreeTextEvidence, g as RenderedGAAreaEvidence, h as RenderedHierarchyLabelEvidence, i as RenderedLabelHiddenReason, j as RenderedRowLabelEvidence, k as RendererMinimapSeat, l as RendererMinimapSection } from './renderer-IBi9YKWR.js';
10
+ import './segmentedRowModel-BPTnJ7Tz.js';
461
11
 
462
12
  declare class SeatmapRenderer implements ISeatmapRenderer {
463
13
  private container;
@@ -635,35 +185,18 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
635
185
  private resizeObs;
636
186
  /** Coalesces bursty view-change sources (pointermove, wheel) into ≤1 callback/frame. */
637
187
  private viewChangeRaf;
638
- private pointers;
639
- private pinch;
640
- private panLast;
641
- private panStart;
642
- private panStarted;
643
- /** Maximum displacement from gesture start — suppress taps only after a real pan/pinch. */
644
- private moved;
645
- /**
646
- * Ghost-click guard. Konva binds `_pointerup` to mouseup, touchend AND
647
- * pointerup, so `on('click tap')` is two handlers for one finger tap unless
648
- * the browser's synthesized compatibility click is suppressed. Konva only
649
- * suppresses it when the touch lands on a LISTENING SHAPE (Stage.js returns
650
- * early before its preventDefault() when `!shape || !shape.isListening()`),
651
- * so a near-miss rescued by nearestSeatToScreen used to fire `tap` (select)
652
- * then `click` (deselect) 1-3ms apart and net to nothing. With
653
- * SEAT_TAP_SLOP_PX=14 against a ~12px seat radius, that broken annulus is
654
- * ~3.7x the area of the seat itself — i.e. most successful mobile taps.
655
- * `touch-action: none` does NOT suppress compatibility mouse events.
656
- */
657
- private lastTapAt;
658
- /**
659
- * True when this is the browser's synthesized compatibility click following a
660
- * finger tap we already handled. Discriminates on `e.type` deliberately —
661
- * `PointerEvent extends MouseEvent`, so an `instanceof MouseEvent` test
662
- * matches genuine pointer taps too. One shared timestamp across the layer and
663
- * stage handlers: a tap consumed at the layer must also suppress the ghost at
664
- * the stage, and only `click` is ever rejected, so bubbling stays intact.
188
+ /**
189
+ * Pan/pinch state machine (`render/interaction/pointer`). Raw pointer events
190
+ * on the container, not Konva stage dragging — its touch pipeline proved
191
+ * unreliable for multi-touch on real devices. Also owns the ghost-click
192
+ * timestamp shared by the layer and stage tap handlers.
665
193
  */
194
+ private gestures;
195
+ /** Displacement of the current gesture — a tap must stay under the slop. */
196
+ private get moved();
666
197
  private isGhostClick;
198
+ /** Behavioural surface the gesture machine calls back into. */
199
+ private get pointerHost();
667
200
  /**
668
201
  * Manage-mode rubber-band marquee (option-gated). `start`/`cur` are WORLD-space
669
202
  * points (overlayLayer rides the stage transform); `rect` is the on-canvas
@@ -806,6 +339,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
806
339
  setViewMode(mode: RendererViewMode): void;
807
340
  /** Current projection — reflects the tween target, not the mid-tween isoT. */
808
341
  getViewMode(): RendererViewMode;
342
+ /** Live ISO projection state handed to the `render/projection` free functions. */
343
+ private get isoState();
809
344
  /** Iso angle (rad) + y-squash for the current isoT. */
810
345
  private isoParams;
811
346
  /** Effective vertical scale = stage scale × iso squash — legibility math uses this. */
@@ -839,6 +374,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
839
374
  private resetLayerTransforms;
840
375
  /** Restore section-owned containers before applying another projection. */
841
376
  private resetSectionProjection;
377
+ /** Node/cache context the shared seat-anchor pass reads and updates. */
378
+ private get seatAnchorContext();
842
379
  /** Move native seat/booth hit shapes to or from their exact pinhole anchors. */
843
380
  private applyExactSeatAnchors;
844
381
  /**
@@ -1020,12 +557,12 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1020
557
  * single drawImage per frame, and it rides the same layer cache — effectively
1021
558
  * zero per-frame cost. Never listens, so it can't intercept a seat click.
1022
559
  */
560
+ /** Node/registry surface the `render/objectDrawing` factories draw into. */
561
+ private get objectDrawContext();
1023
562
  private renderDecorImage;
1024
563
  private renderTable;
1025
564
  private renderText;
1026
565
  private renderShape;
1027
- /** Prominent stage caption: uppercase, letter-spaced, larger, softly dimmed. */
1028
- private addStageLabel;
1029
566
  private renderGA;
1030
567
  /**
1031
568
  * A section renders in three coordinated layers driven by the LOD melt:
@@ -1037,62 +574,17 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1037
574
  */
1038
575
  private renderSection;
1039
576
  private refreshSectionHeat;
1040
- /** Recompute a section's availability shading + retained availability text. */
1041
577
  private refreshSectionFill;
1042
- /** True when a section/zone is currently in the `closed` event-state. */
1043
578
  private isSectionClosed;
1044
- /** Resolve the four-bucket overview availability state for a section (OV-69).
1045
- * `closed` (operator) outranks live availability; the availability buckets
1046
- * only apply to seated sections (GA-only shells have no seat capacity here). */
1047
579
  private sectionAvailabilityState;
1048
- /** Overview shells stay neutral except for the bounded availability shading
1049
- * (nearly-gone / sold-out) and the operator `closed` slab — never category
1050
- * or price paint, which is deferred to section focus/seat detail. */
1051
580
  private sectionBlockFill;
581
+ private get sectionLodPaintContext();
1052
582
  /**
1053
583
  * Zone rung: one giant screen-constant label per zone (+ optional "FROM $n"),
1054
584
  * shown at the farthest zoom in place of per-section detail. Skipped entirely
1055
585
  * when the doc declares no zones — sections then stay the far rung (graceful).
1056
586
  */
1057
587
  private renderZones;
1058
- /**
1059
- * THE MELT — a continuous, scale-driven cross-fade across the three rungs:
1060
- * seats ⇄ section blocks ⇄ zone blocks.
1061
- * `blockT` ramps 0→1 as scale falls through [SECTION_PROMINENT, CACHE_THRESHOLD]
1062
- * so the solid fill is fully present exactly as seats become the cached bitmap
1063
- * and fade out; `zoneT` ramps 0→1 across [ZONE_PROMINENT, SECTION_PROMINENT] so
1064
- * per-section detail hands off to giant zone labels. Reduced-motion hard-swaps.
1065
- * Section/zone labels are scale-compensated to hold a roughly constant screen size.
1066
- */
1067
- private applySectionLod;
1068
- /** One semantic section gets one overview label, even across split contours. */
1069
- private dedupeLogicalSectionLabels;
1070
- /**
1071
- * Keep transitional zone pills from covering section names, and keep section
1072
- * names off each other.
1073
- *
1074
- * This used to assume section labels "do not collide by construction",
1075
- * because each is proven to fit inside its own shell. That holds only while
1076
- * shells are disjoint. Hand-traced and imported plans routinely produce
1077
- * shells that touch or overlap slightly along a shared edge, and a label
1078
- * fitted into one can then land under its neighbour's — which is exactly the
1079
- * unreadable smear a 36-section arena showed. Section labels now block each
1080
- * other too, largest shell first so the big stands keep their names.
1081
- */
1082
- private decollideRungLabels;
1083
- /** Set a centred label's world fontSize (for a target screen px) and re-anchor it. */
1084
- private sizeLabel;
1085
- /** Fit one centred section name, rotating narrow shells like the target chart. */
1086
- private fitSectionRungLabels;
1087
- /**
1088
- * Screen-constant chrome must still respect the screen it is constant on:
1089
- * an 18px zone cap sized for a 900px designer canvas eats a 360px phone map
1090
- * (owner report, 2026-08-14). Scales the fixed-px chrome down to 66% on the
1091
- * smallest containers; never up.
1092
- */
1093
- private uiScale;
1094
- /** Size one screen-constant zone name/price pill around its shared anchor. */
1095
- private sizeZonePill;
1096
588
  /**
1097
589
  * Map a container-relative screen point back to world coords. Inverts the
1098
590
  * stage (scale/pos) and, in iso view, the iso affine — so screen-space taps
@@ -1106,7 +598,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1106
598
  }): string | null;
1107
599
  /** Seat ids belonging to a section (Slice 5 section-summary card). */
1108
600
  sectionMembers(id: string): string[];
1109
- private addCentredLabel;
1110
601
  private isSelectable;
1111
602
  private toggleSeat;
1112
603
  /**
@@ -1159,10 +650,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1159
650
  * so within-floor elevation offsets don't affect the result. Null if none.
1160
651
  */
1161
652
  private deckFloorAt;
1162
- private toLocal;
1163
- private onPointerDown;
1164
- private onPointerMove;
1165
- private onPointerEnd;
1166
653
  /**
1167
654
  * Min is chart-relative (never lose the room); max is absolute so seats
1168
655
  * reach a readable size on any chart, however large the venue.
@@ -1193,6 +680,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1193
680
  private cancelGlide;
1194
681
  /** Current LOD rung derived from effective zoom — drives the ZONES/SECTIONS/SEATS pill. */
1195
682
  getRung(): LodRung;
683
+ /** Explicit view of this renderer as the evidence pass's declared surface. */
684
+ private get renderedQualityContext();
1196
685
  getRenderedQualityEvidence(): RendererQualityEvidence;
1197
686
  /** Jump the camera to a rung's zoom band (glided). */
1198
687
  setRung(rung: LodRung): void;
@@ -1208,6 +697,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1208
697
  private afterViewChange;
1209
698
  /** rAF-coalesced `onViewChange` — at most one host callback per animation frame. */
1210
699
  private scheduleViewChange;
700
+ /** Keep focal labels centred while their world font size tracks camera scale. */
701
+ private sizeLabel;
1211
702
  private updateLOD;
1212
703
  /** Rebuild the seat-layer bitmap synchronously (no paint). Shared by the
1213
704
  * debounced cacheSeatLayer() and the synchronous forceDraw() catch-up. */
@@ -1260,46 +751,30 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1260
751
  /** Geometric association only: importer data remains unchanged. */
1261
752
  private nodeBelongsToFocusedSection;
1262
753
  /** OV-45(a): resolve authored row-letter labels for the buyer/preview map, in
1263
- * world space, matching the Designer's placement contract (start/end/both/none
1264
- * preset, a free-drag `position` that wins over the preset, rotation, and
1265
- * labelStyle colour/size fed through the same auto-contrast guard). Segmented
1266
- * rows keep their own logical-label handling and are resolved by their owner. */
754
+ * world space (see `render/rowLabelPlan`). */
1267
755
  private buildRowLabelPlan;
1268
756
  /** Axis-aligned world bounds of a centred, potentially rotated row label. */
1269
757
  private rowLabelBox;
1270
- /**
1271
- * Keep an automatic start/end label out of seat markers and already-painted
1272
- * text. The authored point is never altered. Candidates are deliberately
1273
- * bounded and deterministic: the closest clear offset wins; if a chart is so
1274
- * dense that none is clear, the least-colliding candidate wins so the required
1275
- * row label remains present rather than being silently dropped.
1276
- */
758
+ /** Keep an automatic start/end label out of seats and already-painted text. */
1277
759
  private resolveAutomaticRowLabelPosition;
1278
760
  /** Row labels never carry status; the buyer just dims them under the same
1279
761
  * category/price filters that dim their seats. */
1280
762
  private objectFilteredOut;
1281
763
  private updateLabels;
764
+ private get viewportLabelContext();
1282
765
  private handleResize;
1283
766
  private startFpsLoop;
1284
767
  }
1285
768
  declare function createRenderer(container: HTMLDivElement, opts?: RendererOptions): ISeatmapRenderer;
1286
769
 
1287
- interface CompanionSelectionIssue {
1288
- code: 'companion_pair_required';
1289
- labels: string[];
1290
- message: string;
1291
- }
1292
- interface TicketOptionApplicabilityIssue {
1293
- code: 'ticket_option_not_applicable';
1294
- labels: string[];
1295
- message: string;
1296
- }
1297
- interface NotForSaleSelectionIssue {
1298
- code: 'not_for_sale';
1299
- labels: string[];
1300
- message: string;
1301
- }
1302
- type TicketSelectionIssue = CompanionSelectionIssue | TicketOptionApplicabilityIssue | NotForSaleSelectionIssue;
770
+ /**
771
+ * Public host contracts for the framework-agnostic buyer picker.
772
+ *
773
+ * Kept separate from `PickerController` so SDK and application consumers can
774
+ * find the integration surface without wading through controller state and
775
+ * transport orchestration. `PickerController` re-exports these names for
776
+ * source compatibility.
777
+ */
1303
778
 
1304
779
  interface PickerSeat {
1305
780
  id: string;
@@ -1680,6 +1155,7 @@ interface PickerMapTheme {
1680
1155
  /** Selection / hover ring. */
1681
1156
  selectionColor?: string;
1682
1157
  }
1158
+
1683
1159
  declare class PickerController {
1684
1160
  private readonly opts;
1685
1161
  private readonly api;
@@ -2120,11 +1596,8 @@ declare class PickerController {
2120
1596
  private connect;
2121
1597
  /**
2122
1598
  * Backoff for the PLAIN-socket fallback (a transport with no v1 client of its
2123
- * own). Full jitter, for the same reason BuyerRealtimeClient uses it: a
2124
- * deterministic `2**attempt` schedule brings every browser that lost the same
2125
- * socket back in the same millisecond, and an on-sale crowd reconnecting in
2126
- * lockstep turns one blip into a thundering herd. The ceiling still doubles,
2127
- * so a sustained outage still backs off.
1599
+ * own). Full jitter, for the same reason BuyerRealtimeClient uses it — see
1600
+ * `core/backoff`, which now owns that rationale and the schedule.
2128
1601
  */
2129
1602
  private scheduleReconnect;
2130
1603
  }
@@ -2212,6 +1685,14 @@ declare function setStringOverrides(next: Dict): void;
2212
1685
  declare function t(key: string, vars?: Record<string, string | number>): string;
2213
1686
  /** "1 seat" / "3 seats" without hand-rolled concatenation. */
2214
1687
  declare function tCount(key: string, count: number, vars?: Record<string, string | number>): string;
1688
+ /**
1689
+ * Kept for the SDK surface that imports dates from here. It is a thin pass to
1690
+ * `core/datetime`, which owns every date shape in the app and caches its
1691
+ * formatters per (locale, shape) — the defaults below are the same ones it
1692
+ * uses, so the two were already interchangeable and are now literally the same
1693
+ * code. `active` is passed explicitly so this cannot drift from `t()` even if
1694
+ * something calls `setDateTimeLocale` on its own.
1695
+ */
2215
1696
  declare function formatDate(value: number | Date, opts?: Intl.DateTimeFormatOptions): string;
2216
1697
 
2217
1698
  /**
@@ -2252,12 +1733,22 @@ declare const DEFAULT_CURRENCY = "USD";
2252
1733
  * express create forms so the two can never offer different lists. */
2253
1734
  declare const CURRENCY_CHOICES: string[];
2254
1735
  declare function setMoneyLocale(locale: string | undefined): void;
2255
- /**
2256
- * "€45" / "$1,500" / "45 €" (locale-dependent placement).
2257
- * Whole amounts render without ".00" (design shows "$45", "$120"); pass
2258
- * `fractionDigits` for fixed precision (e.g. 3 for "$0.045 / credit").
2259
- */
2260
- declare function formatMoney(amount: number, currency?: string, fractionDigits?: number): string;
1736
+ interface MoneyFormatOptions {
1737
+ /** BCP 47 locale for this value; takes precedence over `setMoneyLocale`. */
1738
+ locale?: string;
1739
+ /** Leave unset to use the currency's standard exponent (`$45.00`, `¥45`). */
1740
+ minimumFractionDigits?: number;
1741
+ /** Leave unset to use the currency's standard exponent (`$45.00`, `¥45`). */
1742
+ maximumFractionDigits?: number;
1743
+ /**
1744
+ * Rendering for invalid/unknown currency input. Required by buyer SDK
1745
+ * surfaces that must remain usable even when a host supplies a bad code.
1746
+ * Without one, the original `Intl.NumberFormat` error is rethrown.
1747
+ */
1748
+ fallback?: (amount: number, currency: string) => string;
1749
+ }
1750
+ declare function formatMoney(amount: number, currency: string, options: MoneyFormatOptions): string;
1751
+ declare function formatMoney(amount: number, currency?: string, fractionDigits?: number, locale?: string): string;
2261
1752
  /**
2262
1753
  * How many decimal places a currency has — 2 for USD/EUR, 0 for JPY/KRW/VND,
2263
1754
  * 3 for KWD/BHD/JOD.
@@ -2281,8 +1772,8 @@ declare function currencyExponent(currency?: string): number;
2281
1772
  */
2282
1773
  declare function fromMinorUnits(minor: number, currency?: string): number;
2283
1774
  /** "$90" / "¥9,000" — a minor-unit integer rendered for display. */
2284
- declare function formatMinor(minor: number, currency?: string): string;
1775
+ declare function formatMinor(minor: number, currency?: string, locale?: string): string;
2285
1776
  /** Bare symbol for input adornments ("€", "$", "₹"). */
2286
1777
  declare function currencySymbol(currency?: string): string;
2287
1778
 
2288
- export { AccessibilityType, type AvailabilityRule, BoothObject, CURRENCY_CHOICES, CategoryTier, ChartDoc, ChartObject, DEFAULT_CURRENCY, type Dict, type ExpandChartOptions, ExpandedSeat, Floor, GAAreaObject, GAInventorySegment, type HoldConflict, type HoldInfo, type HoldSelectionRequest, type HoldServerItem, ISeatmapRenderer, LabelStyle, type Locale, LodRung, MAX_EVENT_INVENTORY, MAX_GA_CAPACITY, type PanoramaResult, type PickerCallbacks, PickerController, type PickerGAArea, type PickerMapTheme, type PickerOptions, type PickerRealtimeConnection, type PickerRealtimeSink, type PickerRenderPerformanceProfile, type PickerSeat, PickerSelectionError, type PickerStatusChange, type PickerTransport, Point, RENDERED_QUALITY_REPORT_VERSION, RectTableSeatCounts, RectTableSide, type RenderedEvidenceState, RenderedFreeTextEvidence, type RenderedQualityFinding, type RenderedQualityFindingCode, type RenderedQualityReport, type RenderedQualitySample, RendererCallbacks, RendererMinimapSnapshot, RendererOptions, RendererQualityEvidence, RendererViewMode, RowObject, type RowSeatSlot, SUPPORTED_LOCALES, SeatCommercialAttributes, type SeatHoverDetails, SeatOverride, SeatStatus, SeatViewMetadata, SeatmapRenderer, type SectionCategory, type SectionNode, SectionObject, type SectionSummary, TIER_HEIGHT_M, TableObject, type TableSeatSlot, type TableSelectionDetails, UNGROUPED_ID, allObjects, applyHidden, chartBounds, computeSections, createRenderer, currencyExponent, currencySymbol, expandBooth, expandChart, expandRow, expandRowSlots, expandTable, expandTableSlots, floorObjects, floorOverviewTranslations, floorsOf, formatDate, formatMinor, formatMoney, fromMinorUnits, gaAreasOf, gaInventorySegments, gaUnitLabel, gaUnitLabels, generateSeatPanorama, generateSeatThumb, getLocale, growJoinedGAInventory, hiddenObjectIds, inspectRenderedQualityEvidence, isGaUnitLabel, isSectionHidden, layoutFloorOverview, loadLocale, objectCenter, owningSectionForObject, pointInPolygon, pointInPolygonWithHoles, polygonLabelPoint, resolveLocale, rowInventoryCount, rowSeatPositions, sectionGeometry, setLocale, setMoneyLocale, setStringOverrides, stackFloors, t, tCount, tableInventoryCount, tableSeatCountsBySide, translateObject, validGAInventorySegments };
1779
+ export { AccessibilityType, CURRENCY_CHOICES, CategoryTier, ChartDoc, DEFAULT_CURRENCY, type Dict, ExpandedSeat, type HoldConflict, type HoldInfo, type HoldSelectionRequest, type HoldServerItem, ISeatmapRenderer, type Locale, LodRung, type MoneyFormatOptions, type PanoramaResult, type PickerCallbacks, PickerController, type PickerGAArea, type PickerMapTheme, type PickerOptions, type PickerRealtimeConnection, type PickerRealtimeSink, type PickerRenderPerformanceProfile, type PickerSeat, PickerSelectionError, type PickerStatusChange, type PickerTransport, Point, RendererCallbacks, RendererMinimapSnapshot, RendererOptions, RendererQualityEvidence, RendererViewMode, SUPPORTED_LOCALES, SeatCommercialAttributes, type SeatHoverDetails, SeatStatus, SeatmapRenderer, type SectionCategory, type SectionSummary, type TableSelectionDetails, createRenderer, currencyExponent, currencySymbol, formatDate, formatMinor, formatMoney, fromMinorUnits, generateSeatPanorama, generateSeatThumb, getLocale, loadLocale, resolveLocale, setLocale, setMoneyLocale, setStringOverrides, t, tCount };