@seatlayer/core 0.79.0 → 0.80.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 (106) hide show
  1. package/dist/ar-EZLC3TID.js +1 -0
  2. package/dist/be-PNW4HSCT.js +1 -0
  3. package/dist/bg-WWTVMKHN.js +1 -0
  4. package/dist/ca-7CQTBZHV.js +1 -0
  5. package/dist/chunk-7LMW7QTP.js +1 -0
  6. package/dist/chunk-C7MR6CFC.js +1 -0
  7. package/dist/{chunk-SGYNM3SG.js → chunk-GQLJAU75.js} +1 -1
  8. package/dist/{chunk-SSBMTFAV.js → chunk-SKMHD76O.js} +1 -1
  9. package/dist/{chunk-FGMGDTMR.js → chunk-YXOSJLK7.js} +1 -1
  10. package/dist/core/chart-ops/index.js +1 -1
  11. package/dist/core/inventory/index.cjs +1 -1
  12. package/dist/core/inventory/index.d.cts +2 -2
  13. package/dist/core/inventory/index.d.ts +2 -2
  14. package/dist/core/inventory/index.js +1 -1
  15. package/dist/core/layout/index.d.cts +2 -2
  16. package/dist/core/layout/index.d.ts +2 -2
  17. package/dist/core/quality/index.cjs +1 -1
  18. package/dist/core/quality/index.d.cts +34 -3
  19. package/dist/core/quality/index.d.ts +34 -3
  20. package/dist/core/quality/index.js +1 -1
  21. package/dist/core/sections/index.d.cts +1 -1
  22. package/dist/core/sections/index.d.ts +1 -1
  23. package/dist/cs-CO6IPOND.js +1 -0
  24. package/dist/{cy-NF6Y2W6J.js → cy-JSKIEF7V.js} +1 -1
  25. package/dist/da-XNN2TLET.js +1 -0
  26. package/dist/de-T7S7DY4P.js +1 -0
  27. package/dist/el-SQNQJ6N5.js +1 -0
  28. package/dist/es-WIEMVIPM.js +1 -0
  29. package/dist/et-AJ666JLF.js +1 -0
  30. package/dist/fa-PA22MNZD.js +1 -0
  31. package/dist/fi-OIKV7BZB.js +1 -0
  32. package/dist/fr-K2BPY3ZG.js +1 -0
  33. package/dist/he-NB5S5QOD.js +1 -0
  34. package/dist/hr-HB2ZBWCL.js +1 -0
  35. package/dist/hu-DXONGHET.js +1 -0
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.cts +58 -78
  38. package/dist/index.d.ts +58 -78
  39. package/dist/index.js +1 -1
  40. package/dist/it-7YYWICOD.js +1 -0
  41. package/dist/ja-ROSYSJVY.js +1 -0
  42. package/dist/ku-3VHLRVJY.js +1 -0
  43. package/dist/localeLoaders-42CYOXB5.js +1 -0
  44. package/dist/lt-KOUZG2YJ.js +1 -0
  45. package/dist/{lv-OORJZFNN.js → lv-JOK7LYAH.js} +1 -1
  46. package/dist/nl-H7NAUHTK.js +1 -0
  47. package/dist/no-OJ35WOND.js +1 -0
  48. package/dist/pl-FD5NFT6Y.js +1 -0
  49. package/dist/{pt-5DSXBZNH.js → pt-BOCUN4SZ.js} +1 -1
  50. package/dist/{renderedQuality-C4-5Oy6-.d.ts → renderedQuality-DObXwisG.d.ts} +1 -1
  51. package/dist/{renderedQuality-CHAf5J4i.d.cts → renderedQuality-Dz-WTrRc.d.cts} +1 -1
  52. package/dist/{renderer-CuLIU7z1.d.cts → renderer-BjuHQ0bx.d.cts} +11 -1
  53. package/dist/{renderer-Bx0ucRf6.d.ts → renderer-i_mthe5Z.d.ts} +11 -1
  54. package/dist/ro-Z44LTOXH.js +1 -0
  55. package/dist/ru-J4XWPJR6.js +1 -0
  56. package/dist/sk-4O4XNGR6.js +1 -0
  57. package/dist/sl-AHDPSHB6.js +1 -0
  58. package/dist/sr-B5PADXMB.js +1 -0
  59. package/dist/sv-KZCOVO3R.js +1 -0
  60. package/dist/{tableSizing-Dr-ksQTq.d.ts → tableSizing-BpRvVdXK.d.ts} +1 -1
  61. package/dist/{tableSizing-tDaLWj54.d.cts → tableSizing-DnSAiaXL.d.cts} +1 -1
  62. package/dist/{ticketRestrictions-7HrT6IQM.d.ts → ticketRestrictions-BijtF-Lw.d.ts} +46 -6
  63. package/dist/{ticketRestrictions-B4eT6vEy.d.cts → ticketRestrictions-CvaHRHti.d.cts} +46 -6
  64. package/dist/tr-E5X266RM.js +1 -0
  65. package/dist/uk-6RR5RHIY.js +1 -0
  66. package/dist/view3d/index.d.cts +1 -1
  67. package/dist/view3d/index.d.ts +1 -1
  68. package/dist/view3d/index.js +1 -1
  69. package/dist/view3d/scene/scene.worker.js +1 -1
  70. package/dist/{zh-Hans-WG6IMHH2.js → zh-Hans-GQWICG2Q.js} +1 -1
  71. package/dist/{zh-Hant-I55RLM6N.js → zh-Hant-DTRJKLTS.js} +1 -1
  72. package/package.json +1 -1
  73. package/dist/ar-MBXKQCHF.js +0 -1
  74. package/dist/be-ZUVYQYAI.js +0 -1
  75. package/dist/bg-62YMMGP4.js +0 -1
  76. package/dist/ca-6CX2TCFE.js +0 -1
  77. package/dist/chunk-O5UH442K.js +0 -1
  78. package/dist/chunk-XD2P4ZS4.js +0 -1
  79. package/dist/cs-HPMCEWCG.js +0 -1
  80. package/dist/da-22D72GSM.js +0 -1
  81. package/dist/de-RPFLEDOZ.js +0 -1
  82. package/dist/el-FUQRGODC.js +0 -1
  83. package/dist/es-MCE7ZWGC.js +0 -1
  84. package/dist/et-GS4LQD5N.js +0 -1
  85. package/dist/fa-5MNQP3RH.js +0 -1
  86. package/dist/fi-5A22IZ6C.js +0 -1
  87. package/dist/fr-QSMP5CON.js +0 -1
  88. package/dist/he-ET4VHFSC.js +0 -1
  89. package/dist/hr-CEQPLBXQ.js +0 -1
  90. package/dist/hu-NWXXZPCO.js +0 -1
  91. package/dist/it-LJJQ32WS.js +0 -1
  92. package/dist/ja-JH7SZMXQ.js +0 -1
  93. package/dist/ku-ZEL3JYZ3.js +0 -1
  94. package/dist/localeLoaders-CG4DAMUW.js +0 -1
  95. package/dist/lt-X4GMJWOB.js +0 -1
  96. package/dist/nl-EIWNKXHE.js +0 -1
  97. package/dist/no-KE42FJWD.js +0 -1
  98. package/dist/pl-ATCAGIF2.js +0 -1
  99. package/dist/ro-ESUBYINR.js +0 -1
  100. package/dist/ru-5SYA53AZ.js +0 -1
  101. package/dist/sk-QHQ7T2BK.js +0 -1
  102. package/dist/sl-OQHYGFQ7.js +0 -1
  103. package/dist/sr-VOVDWZBT.js +0 -1
  104. package/dist/sv-II3AGEJF.js +0 -1
  105. package/dist/tr-EZHEWRQG.js +0 -1
  106. package/dist/uk-V3LWALME.js +0 -1
package/dist/index.d.cts CHANGED
@@ -2,13 +2,13 @@ import { C as ChartDoc, F as FloorLabelStyle, P as Point, A as AccessibilityType
2
2
  export { x as ACCESSIBILITY_RING_COLOR, y as ACCESSIBILITY_TYPES, z as AccessibilityMeta, D as AuthoringObjectState, B as BoothObject, p as Category, E as ChartLayoutConstraint, a as ChartObject, o as ChartReferenceImage, H as ChartTheme, I as ConfidenceEvidenceScope, u as CubicPath, J as DecorImageObject, m as Floor, G as GAAreaObject, i as GAInventorySegment, K as LABEL_STYLE_MAX_SIZE, M as LABEL_STYLE_MIN_SIZE, N as LabelPresentation, L as LabelStyle, O as ObjectEditorState, Q as Physical3dEvidence, U as RadialClearanceLayoutConstraint, n as RectTableSeatCounts, l as RectTableSide, V as ReferenceAccessibilitySource, W as ReferenceCalibration, X as ReferenceCategorySource, Y as ReferenceDerivedScale, Z as ReferenceDirectAnnotationSource, _ as ReferenceDirectLandmarkCandidate, $ as ReferenceDirectLandmarkDisposition, a0 as ReferenceDirectLandmarkRole, a1 as ReferenceDirectLandmarkSource, a2 as ReferenceDirectSeatGroup, a3 as ReferenceDirectSeatImportSource, a4 as ReferenceDirectSeatPlan, a5 as ReferenceDirectStageSource, a6 as ReferenceEnrichmentStatus, a7 as ReferenceExtractEmptyReason, a8 as ReferenceExtractEnrichment, a9 as ReferenceExtractInput, aa as ReferenceExtractProposal, ab as ReferenceExtractRegionSeats, ac as ReferenceInventoryExclusionSource, ad as ReferenceInventorySource, ae as ReferenceMatchReport, af as ReferenceScanProposal, ag as ReferenceScanRowProposal, ah as ReferenceScanSectionProposal, ai as ReferenceSeatSeed, aj as ReferenceSectionTraceBatchInput, ak as ReferenceSectionTraceBatchProposal, al as ReferenceSectionTraceInput, am as ReferenceSectionTraceProposal, c as ResolvedSeatConfidenceEvidence, R as RowObject, an as SEAT_COMMERCIAL_MARKS, ao as STAGE_LABEL_STYLE_MAX_SIZE, ap as SURROUNDINGS_SHAPE_ROLES, aq as SeatCommercialMark, ar as SeatCommercialMeta, as as SeatConfidenceCoverage, at as SeatConfidenceEvidence, au as SeatConfidenceModelLevel, av as SeatConfidenceModeledTarget, aw as SeatConfidenceRealityLevel, d as SeatGlyphKind, k as SeatOverride, e as SeatViewCoverage, b as SeatViewMetadata, ax as SeatViewVariant, h as SectionObject, f as SectionOutlinePath, g as SectionPathSegment, ay as SelectionLayer, q as ShapeLineCap, r as ShapeLineEnding, s as ShapeLineJoin, t as ShapeObject, az as StageLabelStyle, T as TableObject, aA as TextAlignment, aB as TextBackground, v as TextObject, aC as TicketTierApplicability, aD as TicketTierEvidence, aE as TicketTierRestriction, aF as Venue3DMaterialPalette, aG as VenueSurveyRegistrationEvidence, aH as ZoneDef, aI as accessibilityMeta, aJ as accessibilityRingColor, aK as layerOf, aL as seatCommercialMeta } from './types-eVmh2-Yn.cjs';
3
3
  import { c as EventConfigurationRef, b as EventConfigurationVersion } from './eventConfigurations-OVlni2ym.cjs';
4
4
  export { d as EVENT_CONFIGURATION_EXPORT_SCHEMA, e as EVENT_CONFIGURATION_SCHEMA, f as EventConfigurationBaseVenue, g as EventConfigurationCompatibilityIssue, h as EventConfigurationCompatibilityIssueCode, i as EventConfigurationCompatibilityResult, j as EventConfigurationExportEnvelope, k as EventConfigurationLifecycleStatus, a as EventConfigurationOcclusion, l as EventConfigurationOverlay, m as EventConfigurationParseIssue, n as EventConfigurationParseIssueCode, o as EventConfigurationParseResult, p as EventConfigurationProductionElement, E as EventConfigurationProductionElementKind, q as EventConfigurationVenueSnapshot, r as EventConfigurationVersionParseResult, s as EventConfigurationVersionSummary, L as LegacyEventConfigurationMigrationResult, t as canTransitionEventConfiguration, u as canonicalEventConfigurationJson, v as inspectEventConfigurationCompatibility, w as migrateLegacyEventConfigurations, x as parseEventConfigurationExport, y as parseEventConfigurationVersion, z as resolveEventConfigurationRollback } from './eventConfigurations-OVlni2ym.cjs';
5
- export { A as AUTOMATIC_ROUND_TABLE_RADIUS_MAX, a as AUTOMATIC_ROUND_TABLE_RADIUS_MIN, C as ChartBoundsOptions, E as ExpandChartOptions, F as FLOOR_STACK_GAP_RATIO, b as FLOOR_STACK_MIN_SURFACE_PX, c as FloorStackOptions, d as FloorStackPlacement, R as RowSeatSlot, T as TABLE_SEAT_OFFSET, e as TableSeatSlot, f as allObjects, g as automaticRoundTableRadius, h as chartBounds, i as expandBooth, j as expandChart, k as expandRow, l as expandRowSlots, m as expandTable, n as expandTableSlots, o as floorObjects, p as floorStackPlacements, q as floorsOf, r as initialFloorMode, s as layoutFloorStack, t as mainFloorId, u as objectCenter, v as owningSectionForObject, w as pointInPolygon, x as pointInPolygonWithHoles, y as polygonLabelPoint, z as rowInventoryCount, B as rowSeatPositions, D as stackFloors, G as tableInventoryCount, H as tableSeatCountsBySide, I as translateObject } from './tableSizing-tDaLWj54.cjs';
6
- import { f as TicketSelectionIssue, b as GroupedTableInventoryUnit } from './ticketRestrictions-B4eT6vEy.cjs';
7
- export { M as MAX_EVENT_INVENTORY, d as MAX_GA_CAPACITY, j as gaAreasOf, k as gaInventorySegments, l as gaUnitLabel, m as gaUnitLabels, o as growJoinedGAInventory, p as isGaUnitLabel, v as validGAInventorySegments } from './ticketRestrictions-B4eT6vEy.cjs';
5
+ export { A as AUTOMATIC_ROUND_TABLE_RADIUS_MAX, a as AUTOMATIC_ROUND_TABLE_RADIUS_MIN, C as ChartBoundsOptions, E as ExpandChartOptions, F as FLOOR_STACK_GAP_RATIO, b as FLOOR_STACK_MIN_SURFACE_PX, c as FloorStackOptions, d as FloorStackPlacement, R as RowSeatSlot, T as TABLE_SEAT_OFFSET, e as TableSeatSlot, f as allObjects, g as automaticRoundTableRadius, h as chartBounds, i as expandBooth, j as expandChart, k as expandRow, l as expandRowSlots, m as expandTable, n as expandTableSlots, o as floorObjects, p as floorStackPlacements, q as floorsOf, r as initialFloorMode, s as layoutFloorStack, t as mainFloorId, u as objectCenter, v as owningSectionForObject, w as pointInPolygon, x as pointInPolygonWithHoles, y as polygonLabelPoint, z as rowInventoryCount, B as rowSeatPositions, D as stackFloors, G as tableInventoryCount, H as tableSeatCountsBySide, I as translateObject } from './tableSizing-DnSAiaXL.cjs';
6
+ import { g as TicketSelectionIssue, b as GroupedTableInventoryUnit } from './ticketRestrictions-CvaHRHti.cjs';
7
+ export { M as MAX_EVENT_INVENTORY, d as MAX_GA_CAPACITY, l as gaAreasOf, m as gaInventorySegments, n as gaUnitLabel, o as gaUnitLabels, q as growJoinedGAInventory, s as isGaUnitLabel, x as validGAInventorySegments } from './ticketRestrictions-CvaHRHti.cjs';
8
8
  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-DUG5M-hF.cjs';
9
- export { M as MIN_POINTER_TARGET_PX, 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-CHAf5J4i.cjs';
10
- import { I as ISeatmapRenderer, b as RendererOptions, S as SeatStatus, c as SeatMark, E as ExpandedSeat, G as GAAreaState, d as RendererViewMode, e as RendererMinimapSnapshot, L as LodRung, R as RendererQualityEvidence, f as RendererCallbacks } from './renderer-CuLIU7z1.cjs';
11
- export { C as CHART_STORAGE_KEY, g as RenderedBookableLabelEvidence, a as RenderedFreeTextEvidence, h as RenderedGAAreaEvidence, i as RenderedHierarchyLabelEvidence, j as RenderedLabelHiddenReason, k as RenderedRowLabelEvidence, l as RendererHoverDetails, m as RendererMinimapSeat, n as RendererMinimapSection, o as SeatMarkKind } from './renderer-CuLIU7z1.cjs';
9
+ export { M as MIN_POINTER_TARGET_PX, 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-Dz-WTrRc.cjs';
10
+ import { I as ISeatmapRenderer, b as RendererOptions, S as SeatStatus, c as SeatMark, E as ExpandedSeat, G as GAAreaState, d as RendererViewMode, e as RendererMinimapSnapshot, L as LodRung, R as RendererQualityEvidence, f as RendererCallbacks } from './renderer-BjuHQ0bx.cjs';
11
+ export { C as CHART_STORAGE_KEY, g as RenderedBookableLabelEvidence, a as RenderedFreeTextEvidence, h as RenderedGAAreaEvidence, i as RenderedHierarchyLabelEvidence, j as RenderedLabelHiddenReason, k as RenderedRowLabelEvidence, l as RendererHoverDetails, m as RendererMinimapSeat, n as RendererMinimapSection, o as SeatMarkKind } from './renderer-BjuHQ0bx.cjs';
12
12
  import './segmentedRowModel-BYSxfsqX.cjs';
13
13
 
14
14
  /**
@@ -210,9 +210,13 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
210
210
  private ownedCache;
211
211
  /** The pressable "your seats are in here" marks below the seats rung. */
212
212
  private beaconsCache;
213
+ /** Desktop hover card — see render/hoverCard. Mouse only; built on attach. */
214
+ private hoverCardCache;
213
215
  /** Held by this picker instance, not by another buyer. */
214
216
  private ownedHold;
215
217
  private seatMarks;
218
+ /** Built on first paint and kept for the renderer's life — see seatPaintContext. */
219
+ private seatPaintCache;
216
220
  /** One selected seat being inspected before it is committed to the cart. */
217
221
  private selectionFocusId;
218
222
  /** Seats that keep full ink while the confirm card is open — see
@@ -347,10 +351,7 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
347
351
  private cached;
348
352
  private dpr;
349
353
  /** Current chart's buyer-visible image work. Failures are retained until ready(). */
350
- private assetGeneration;
351
- private assetPromises;
352
- private assetErrors;
353
- private assetCancels;
354
+ private readonly assets;
354
355
  /**
355
356
  * Progressive reveal: what a big chart does instead of appearing all at once.
356
357
  *
@@ -413,6 +414,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
413
414
  * frame loop.
414
415
  */
415
416
  private get breath();
417
+ /** The hover card. One element, reused; the camera decides what it says. */
418
+ private get hoverCard();
416
419
  /**
417
420
  * The selection beacons. Built on first use, like every other overlay family:
418
421
  * a map nobody has picked a seat on allocates nothing and appends no DOM.
@@ -609,7 +612,13 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
609
612
  private framingViewport;
610
613
  /** The visible band in world space — what "where the buyer is looking" means. */
611
614
  private framingWorldRect;
615
+ /** Frame the whole venue. The fit it lands on is render/camera's `fitScale`,
616
+ * which every zoom bound in this renderer is read from. */
612
617
  zoomToFit(): void;
618
+ /** Everything render/camera reads and writes here. Built once: `focusRegion`
619
+ * runs a per-frame tween, and a host per frame is a per-frame allocation. */
620
+ private get cameraHost();
621
+ private cameraHostCache;
613
622
  /**
614
623
  * Reframe after a host/layout resize without throwing away section context.
615
624
  * The stage already represents the usable map area (the picker side panel is
@@ -696,8 +705,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
696
705
  getViewMode(): RendererViewMode;
697
706
  /** Live ISO projection state handed to the `render/projection` free functions. */
698
707
  private get isoState();
699
- /** Iso angle (rad) + y-squash for the current isoT. */
700
- private isoParams;
701
708
  /** Effective vertical scale = stage scale × iso squash — legibility math uses this. */
702
709
  private effScale;
703
710
  /** Project a world point through the iso affine about the chart centre (→ iso-world). */
@@ -706,11 +713,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
706
713
  private isoInverse;
707
714
  /** Precompute the Phase-C pinhole camera and every exact seat anchor. */
708
715
  private buildPerspectiveProjection;
709
- /** Apply an affine to a Konva container while keeping `pivot` fixed logically. */
710
- private setContainerAffine;
711
- private resetContainerTransform;
712
- /** Exact raked surface height used for the bounded section tangent plane. */
713
- private sectionSurfaceHeight;
714
716
  /** Desired perspective-space point for a section surface, before Stage pan/zoom. */
715
717
  private projectedSectionPoint;
716
718
  /** Shared-layer local point which the ground affine paints at `projected`. */
@@ -722,13 +724,10 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
722
724
  * the section's resolved real height in world units (Phase B1).
723
725
  */
724
726
  private isoLiftLocal;
725
- /** Restore projection layers to identity (flat)byte-for-byte the original.
726
- * `seatLayer` can be skipped when entering perspective from flat: assigning a
727
- * top-level transform invalidates all 14k descendant absolute transforms even
728
- * while the semantic overview keeps that layer fully transparent. */
727
+ /** The scene-graph half of a projection change see render/projectionApply. */
728
+ private get projectionHost();
729
+ private projectionHostCache;
729
730
  private resetLayerTransforms;
730
- /** Restore section-owned containers before applying another projection. */
731
- private resetSectionProjection;
732
731
  /** Node/cache context the shared seat-anchor pass reads and updates. */
733
732
  /** Cached, unlike its siblings, because it holds only stable references and
734
733
  * no camera reading that could go stale; setChart (which reassigns `seats`)
@@ -739,18 +738,10 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
739
738
  /** Move native seat/booth hit shapes to or from their exact pinhole anchors. */
740
739
  private applyExactSeatAnchors;
741
740
  /**
742
- * Phase C projected 2.5D. Seat/booth anchors are exact pinhole projections;
743
- * section top surfaces use one explicitly bounded tangent plane per authored
744
- * section. Native Konva shapes move with the anchors, so direct hit testing is
745
- * the same graph that paints the buyer-visible unit.
741
+ * Phase C projected 2.5D, and the isometric tilt both live in
742
+ * render/projectionApply, together with the resets they open with.
746
743
  */
747
744
  private applyPerspective;
748
- /**
749
- * Apply the current isoT to the scene: the base rotate+squash as a decomposed
750
- * layer transform (so seats/décor/rings project together and Konva's own
751
- * hit-testing follows), upright counter-transforms on text, and the elevation
752
- * lift + extruded side faces on elevated sections.
753
- */
754
745
  private applyIso;
755
746
  /** Counter-skew every visible label so it renders upright at its projected anchor. */
756
747
  private applyUprightLabels;
@@ -842,7 +833,16 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
842
833
  /** Preserve an explicit seat-number swatch exactly; only Automatic follows
843
834
  * the state-aware contrast fallback as seat paint changes. */
844
835
  private seatLabelInk;
845
- /** Apply fill/stroke/opacity for a seat's current status + selection. */
836
+ /**
837
+ * The per-seat paint context. Built once and kept: `paintSeat` runs per seat
838
+ * per repaint — up to 53k times — so a host per call would be paid for on
839
+ * exactly the device that can least afford it. Every field is an accessor,
840
+ * because the maps and scalars behind them are replaced by `setChart` and by
841
+ * theme changes while this object stays.
842
+ */
843
+ private get seatPaintContext();
844
+ /** Apply fill/stroke/opacity for a seat's current status + selection.
845
+ * The ordering of every rule that decides it lives in render/seatPaint. */
846
846
  private paintSeat;
847
847
  /** True when a seat sits in a section/zone currently marked `closed`. */
848
848
  private seatInClosedSection;
@@ -1001,7 +1001,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1001
1001
  * turns the retained failures into one actionable error.
1002
1002
  */
1003
1003
  private trackAssetImage;
1004
- /** Cancel and release every image retained by the previous chart/export. */
1005
1004
  private cancelAssetLoads;
1006
1005
  /** Organizer floor-plan photo, dimmed, at the very bottom of the bg layer. */
1007
1006
  private renderBackgroundImage;
@@ -1095,66 +1094,33 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1095
1094
  */
1096
1095
  private sectionBounds;
1097
1096
  private sectionFrameScale;
1098
- /**
1099
- * Resolve a seat tap: honour the 3D deck-drill and the AXS seat-pick gate,
1100
- * then toggle. The gate (§4) redirects small on-screen seats to section-focus
1101
- * to avoid blind mis-picks at overview scales — but ONLY when focusing would
1102
- * zoom the seat up to a safe size. If we're already focused on the section, or
1103
- * the section already fills the viewport (a narrow — OR even a wide — container
1104
- * frames a big section BELOW LABEL_SCALE), redirecting is a no-op that would
1105
- * leave the seat permanently unpickable (§5 `picking-gate-unreachable`), so we
1106
- * fall through and PICK. This is the invariant: seats are never unpickable.
1107
- */
1108
- private handleSeatTap;
1109
1097
  /** Deck under the pointer in the 3D stacked overview — see screenPicking. */
1110
1098
  private deckFloorAt;
1111
1099
  /** Nearest selectable seat within `slopPx` of a screen point, or null. */
1112
1100
  private nearestSeatToScreen;
1113
1101
  private get screenPickingHost();
1114
1102
  /**
1115
- * How strongly this seat should advertise itself under the mouse.
1116
- *
1117
- * The hover ring and the `pointer` cursor are a promise that a click does
1118
- * something. Offering both over a SOLD seat and only then answering "Sold" in
1119
- * the popover is a false affordance (owner, 2026-09-02), so:
1120
- *
1121
- * - `full` — a click can take (or give back) this seat: ring + pointer.
1122
- * - `muted` — someone else's hold. It may come back, so it stays legible as
1123
- * a seat: a dimmed, dashed ring, but the default cursor.
1124
- * - `none` — sold, not-for-sale, closed section, filtered out: no ring, no
1125
- * pointer. The tooltip still fires, so the buyer learns why.
1103
+ * Register the stage/seat-layer listeners. The routing they perform — and the
1104
+ * report behind each rung of it — lives in render/interaction/stageInteraction.
1126
1105
  */
1127
- private hoverAffordance;
1128
1106
  private wireInteraction;
1107
+ /** Resolve a seat tap — see render/interaction/stageInteraction. Kept as a
1108
+ * method because the tap ladder calls it through the host, which is the seam
1109
+ * the marker-tap tests spy on. */
1110
+ private handleSeatTap;
1111
+ private interactionHostCache;
1112
+ private get interactionHost();
1129
1113
  /**
1130
1114
  * Min is chart-relative (never lose the room); max is absolute so seats
1131
1115
  * reach a readable size on any chart, however large the venue.
1132
1116
  */
1133
1117
  private zoomBounds;
1134
- /**
1135
- * Zoom so `clientPoint` (stage-relative px) stays fixed under the cursor.
1136
- *
1137
- * `settle: 'frame'` is the wheel/trackpad path. A fling delivers dozens of
1138
- * events between two paints and each one ran the whole `afterViewChange`
1139
- * cascade — retarget, cull, LOD, free text, labels — for a camera the buyer
1140
- * never saw. It now defers exactly the way the pinch path does: cull and draw
1141
- * per event (cheap, and required for a correct frame), one settle per frame,
1142
- * last event wins. The zoom maths and the onViewChange contract are unchanged
1143
- * — `scheduleViewChange` was already rAF-coalesced.
1144
- */
1145
1118
  private zoomAbout;
1146
- /** One `afterViewChange` per animation frame for a burst of wheel events. */
1147
- private scheduleZoomSettle;
1148
1119
  /** Drop a wheel settle that a newer, authoritative view pass supersedes. */
1149
1120
  private cancelZoomSettle;
1150
- /** Zoom + pan so world-rect `b` fills the viewport (with a small margin). */
1151
- private zoomToBounds;
1152
1121
  /**
1153
- * Smoothly glide the camera to frame a section (by id) or a world-space bounds
1154
- * rect — the Slice 5 "glide in". Pan+zoom tween over a calm easeInOutCubic; the
1155
- * melt/LOD rides the camera every frame. `prefers-reduced-motion` (or
1156
- * `opts.animate === false`) snaps via zoomToBounds. A grab (pointer-down) or a
1157
- * newer glide cancels an in-flight one.
1122
+ * Glide the camera to frame a section (by id) or a world-space bounds rect —
1123
+ * the Slice 5 "glide in". See render/camera for the tween and its rules.
1158
1124
  */
1159
1125
  focusRegion(target: string | {
1160
1126
  x: number;
@@ -1188,6 +1154,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1188
1154
  /** The camera scale every seat label needs to clear the legible floor.
1189
1155
  * Derivation in ./render/seatLabelTargetScale. */
1190
1156
  private seatLabelTargetScale;
1157
+ /** The buyer pinched back out to the venue: the section focus is over. */
1158
+ private releaseFocusOnPullBack;
1191
1159
  /** Recompute LOD (cache/labels) after any pan/zoom settles. */
1192
1160
  private afterViewChange;
1193
1161
  /**
@@ -1812,6 +1780,15 @@ interface PickerCallbacks extends RendererCallbacks {
1812
1780
  * overview() / zoom-to-zones) so the host can show/hide the summary card.
1813
1781
  */
1814
1782
  onSectionFocus?: (summary: SectionSummary | null) => void;
1783
+ /**
1784
+ * Does the HOST have its own card open about the seat under the cursor?
1785
+ *
1786
+ * The map draws one hover card. A host that keeps its own — the widget's
1787
+ * pinned card for a seat that cannot be taken, or its confirm card — answers
1788
+ * true while that card is up, and the map's card stands down rather than
1789
+ * saying the same thing beside it.
1790
+ */
1791
+ hostCardOpen?: () => boolean;
1815
1792
  /** A deck was tapped in the 3D all-floors overview — host enters that floor in 2D. */
1816
1793
  onDeckTap?: (floorId: string) => void;
1817
1794
  /**
@@ -2384,6 +2361,9 @@ declare class PickerController {
2384
2361
  /** The camera a price band took from the buyer — see
2385
2362
  * {@link PickerFocusContext.bandReturnPose}. */
2386
2363
  private bandReturnPose;
2364
+ /** The section a price band took the buyer out of — see
2365
+ * {@link PickerFocusContext.bandReturnSection}. */
2366
+ private bandReturnSection;
2387
2367
  /**
2388
2368
  * The state the filter-driven camera rules read and change — see
2389
2369
  * ./pickerFocus. Rebuilt per call; the accessor pair keeps the controller
package/dist/index.d.ts CHANGED
@@ -2,13 +2,13 @@ import { C as ChartDoc, F as FloorLabelStyle, P as Point, A as AccessibilityType
2
2
  export { x as ACCESSIBILITY_RING_COLOR, y as ACCESSIBILITY_TYPES, z as AccessibilityMeta, D as AuthoringObjectState, B as BoothObject, p as Category, E as ChartLayoutConstraint, a as ChartObject, o as ChartReferenceImage, H as ChartTheme, I as ConfidenceEvidenceScope, u as CubicPath, J as DecorImageObject, m as Floor, G as GAAreaObject, i as GAInventorySegment, K as LABEL_STYLE_MAX_SIZE, M as LABEL_STYLE_MIN_SIZE, N as LabelPresentation, L as LabelStyle, O as ObjectEditorState, Q as Physical3dEvidence, U as RadialClearanceLayoutConstraint, n as RectTableSeatCounts, l as RectTableSide, V as ReferenceAccessibilitySource, W as ReferenceCalibration, X as ReferenceCategorySource, Y as ReferenceDerivedScale, Z as ReferenceDirectAnnotationSource, _ as ReferenceDirectLandmarkCandidate, $ as ReferenceDirectLandmarkDisposition, a0 as ReferenceDirectLandmarkRole, a1 as ReferenceDirectLandmarkSource, a2 as ReferenceDirectSeatGroup, a3 as ReferenceDirectSeatImportSource, a4 as ReferenceDirectSeatPlan, a5 as ReferenceDirectStageSource, a6 as ReferenceEnrichmentStatus, a7 as ReferenceExtractEmptyReason, a8 as ReferenceExtractEnrichment, a9 as ReferenceExtractInput, aa as ReferenceExtractProposal, ab as ReferenceExtractRegionSeats, ac as ReferenceInventoryExclusionSource, ad as ReferenceInventorySource, ae as ReferenceMatchReport, af as ReferenceScanProposal, ag as ReferenceScanRowProposal, ah as ReferenceScanSectionProposal, ai as ReferenceSeatSeed, aj as ReferenceSectionTraceBatchInput, ak as ReferenceSectionTraceBatchProposal, al as ReferenceSectionTraceInput, am as ReferenceSectionTraceProposal, c as ResolvedSeatConfidenceEvidence, R as RowObject, an as SEAT_COMMERCIAL_MARKS, ao as STAGE_LABEL_STYLE_MAX_SIZE, ap as SURROUNDINGS_SHAPE_ROLES, aq as SeatCommercialMark, ar as SeatCommercialMeta, as as SeatConfidenceCoverage, at as SeatConfidenceEvidence, au as SeatConfidenceModelLevel, av as SeatConfidenceModeledTarget, aw as SeatConfidenceRealityLevel, d as SeatGlyphKind, k as SeatOverride, e as SeatViewCoverage, b as SeatViewMetadata, ax as SeatViewVariant, h as SectionObject, f as SectionOutlinePath, g as SectionPathSegment, ay as SelectionLayer, q as ShapeLineCap, r as ShapeLineEnding, s as ShapeLineJoin, t as ShapeObject, az as StageLabelStyle, T as TableObject, aA as TextAlignment, aB as TextBackground, v as TextObject, aC as TicketTierApplicability, aD as TicketTierEvidence, aE as TicketTierRestriction, aF as Venue3DMaterialPalette, aG as VenueSurveyRegistrationEvidence, aH as ZoneDef, aI as accessibilityMeta, aJ as accessibilityRingColor, aK as layerOf, aL as seatCommercialMeta } from './types-eVmh2-Yn.js';
3
3
  import { c as EventConfigurationRef, b as EventConfigurationVersion } from './eventConfigurations-DhGEe6fT.js';
4
4
  export { d as EVENT_CONFIGURATION_EXPORT_SCHEMA, e as EVENT_CONFIGURATION_SCHEMA, f as EventConfigurationBaseVenue, g as EventConfigurationCompatibilityIssue, h as EventConfigurationCompatibilityIssueCode, i as EventConfigurationCompatibilityResult, j as EventConfigurationExportEnvelope, k as EventConfigurationLifecycleStatus, a as EventConfigurationOcclusion, l as EventConfigurationOverlay, m as EventConfigurationParseIssue, n as EventConfigurationParseIssueCode, o as EventConfigurationParseResult, p as EventConfigurationProductionElement, E as EventConfigurationProductionElementKind, q as EventConfigurationVenueSnapshot, r as EventConfigurationVersionParseResult, s as EventConfigurationVersionSummary, L as LegacyEventConfigurationMigrationResult, t as canTransitionEventConfiguration, u as canonicalEventConfigurationJson, v as inspectEventConfigurationCompatibility, w as migrateLegacyEventConfigurations, x as parseEventConfigurationExport, y as parseEventConfigurationVersion, z as resolveEventConfigurationRollback } from './eventConfigurations-DhGEe6fT.js';
5
- export { A as AUTOMATIC_ROUND_TABLE_RADIUS_MAX, a as AUTOMATIC_ROUND_TABLE_RADIUS_MIN, C as ChartBoundsOptions, E as ExpandChartOptions, F as FLOOR_STACK_GAP_RATIO, b as FLOOR_STACK_MIN_SURFACE_PX, c as FloorStackOptions, d as FloorStackPlacement, R as RowSeatSlot, T as TABLE_SEAT_OFFSET, e as TableSeatSlot, f as allObjects, g as automaticRoundTableRadius, h as chartBounds, i as expandBooth, j as expandChart, k as expandRow, l as expandRowSlots, m as expandTable, n as expandTableSlots, o as floorObjects, p as floorStackPlacements, q as floorsOf, r as initialFloorMode, s as layoutFloorStack, t as mainFloorId, u as objectCenter, v as owningSectionForObject, w as pointInPolygon, x as pointInPolygonWithHoles, y as polygonLabelPoint, z as rowInventoryCount, B as rowSeatPositions, D as stackFloors, G as tableInventoryCount, H as tableSeatCountsBySide, I as translateObject } from './tableSizing-Dr-ksQTq.js';
6
- import { f as TicketSelectionIssue, b as GroupedTableInventoryUnit } from './ticketRestrictions-7HrT6IQM.js';
7
- export { M as MAX_EVENT_INVENTORY, d as MAX_GA_CAPACITY, j as gaAreasOf, k as gaInventorySegments, l as gaUnitLabel, m as gaUnitLabels, o as growJoinedGAInventory, p as isGaUnitLabel, v as validGAInventorySegments } from './ticketRestrictions-7HrT6IQM.js';
5
+ export { A as AUTOMATIC_ROUND_TABLE_RADIUS_MAX, a as AUTOMATIC_ROUND_TABLE_RADIUS_MIN, C as ChartBoundsOptions, E as ExpandChartOptions, F as FLOOR_STACK_GAP_RATIO, b as FLOOR_STACK_MIN_SURFACE_PX, c as FloorStackOptions, d as FloorStackPlacement, R as RowSeatSlot, T as TABLE_SEAT_OFFSET, e as TableSeatSlot, f as allObjects, g as automaticRoundTableRadius, h as chartBounds, i as expandBooth, j as expandChart, k as expandRow, l as expandRowSlots, m as expandTable, n as expandTableSlots, o as floorObjects, p as floorStackPlacements, q as floorsOf, r as initialFloorMode, s as layoutFloorStack, t as mainFloorId, u as objectCenter, v as owningSectionForObject, w as pointInPolygon, x as pointInPolygonWithHoles, y as polygonLabelPoint, z as rowInventoryCount, B as rowSeatPositions, D as stackFloors, G as tableInventoryCount, H as tableSeatCountsBySide, I as translateObject } from './tableSizing-BpRvVdXK.js';
6
+ import { g as TicketSelectionIssue, b as GroupedTableInventoryUnit } from './ticketRestrictions-BijtF-Lw.js';
7
+ export { M as MAX_EVENT_INVENTORY, d as MAX_GA_CAPACITY, l as gaAreasOf, m as gaInventorySegments, n as gaUnitLabel, o as gaUnitLabels, q as growJoinedGAInventory, s as isGaUnitLabel, x as validGAInventorySegments } from './ticketRestrictions-BijtF-Lw.js';
8
8
  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-Du9QkrCf.js';
9
- export { M as MIN_POINTER_TARGET_PX, 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-C4-5Oy6-.js';
10
- import { I as ISeatmapRenderer, b as RendererOptions, S as SeatStatus, c as SeatMark, E as ExpandedSeat, G as GAAreaState, d as RendererViewMode, e as RendererMinimapSnapshot, L as LodRung, R as RendererQualityEvidence, f as RendererCallbacks } from './renderer-Bx0ucRf6.js';
11
- export { C as CHART_STORAGE_KEY, g as RenderedBookableLabelEvidence, a as RenderedFreeTextEvidence, h as RenderedGAAreaEvidence, i as RenderedHierarchyLabelEvidence, j as RenderedLabelHiddenReason, k as RenderedRowLabelEvidence, l as RendererHoverDetails, m as RendererMinimapSeat, n as RendererMinimapSection, o as SeatMarkKind } from './renderer-Bx0ucRf6.js';
9
+ export { M as MIN_POINTER_TARGET_PX, 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-DObXwisG.js';
10
+ import { I as ISeatmapRenderer, b as RendererOptions, S as SeatStatus, c as SeatMark, E as ExpandedSeat, G as GAAreaState, d as RendererViewMode, e as RendererMinimapSnapshot, L as LodRung, R as RendererQualityEvidence, f as RendererCallbacks } from './renderer-i_mthe5Z.js';
11
+ export { C as CHART_STORAGE_KEY, g as RenderedBookableLabelEvidence, a as RenderedFreeTextEvidence, h as RenderedGAAreaEvidence, i as RenderedHierarchyLabelEvidence, j as RenderedLabelHiddenReason, k as RenderedRowLabelEvidence, l as RendererHoverDetails, m as RendererMinimapSeat, n as RendererMinimapSection, o as SeatMarkKind } from './renderer-i_mthe5Z.js';
12
12
  import './segmentedRowModel-N9Z0rnKY.js';
13
13
 
14
14
  /**
@@ -210,9 +210,13 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
210
210
  private ownedCache;
211
211
  /** The pressable "your seats are in here" marks below the seats rung. */
212
212
  private beaconsCache;
213
+ /** Desktop hover card — see render/hoverCard. Mouse only; built on attach. */
214
+ private hoverCardCache;
213
215
  /** Held by this picker instance, not by another buyer. */
214
216
  private ownedHold;
215
217
  private seatMarks;
218
+ /** Built on first paint and kept for the renderer's life — see seatPaintContext. */
219
+ private seatPaintCache;
216
220
  /** One selected seat being inspected before it is committed to the cart. */
217
221
  private selectionFocusId;
218
222
  /** Seats that keep full ink while the confirm card is open — see
@@ -347,10 +351,7 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
347
351
  private cached;
348
352
  private dpr;
349
353
  /** Current chart's buyer-visible image work. Failures are retained until ready(). */
350
- private assetGeneration;
351
- private assetPromises;
352
- private assetErrors;
353
- private assetCancels;
354
+ private readonly assets;
354
355
  /**
355
356
  * Progressive reveal: what a big chart does instead of appearing all at once.
356
357
  *
@@ -413,6 +414,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
413
414
  * frame loop.
414
415
  */
415
416
  private get breath();
417
+ /** The hover card. One element, reused; the camera decides what it says. */
418
+ private get hoverCard();
416
419
  /**
417
420
  * The selection beacons. Built on first use, like every other overlay family:
418
421
  * a map nobody has picked a seat on allocates nothing and appends no DOM.
@@ -609,7 +612,13 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
609
612
  private framingViewport;
610
613
  /** The visible band in world space — what "where the buyer is looking" means. */
611
614
  private framingWorldRect;
615
+ /** Frame the whole venue. The fit it lands on is render/camera's `fitScale`,
616
+ * which every zoom bound in this renderer is read from. */
612
617
  zoomToFit(): void;
618
+ /** Everything render/camera reads and writes here. Built once: `focusRegion`
619
+ * runs a per-frame tween, and a host per frame is a per-frame allocation. */
620
+ private get cameraHost();
621
+ private cameraHostCache;
613
622
  /**
614
623
  * Reframe after a host/layout resize without throwing away section context.
615
624
  * The stage already represents the usable map area (the picker side panel is
@@ -696,8 +705,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
696
705
  getViewMode(): RendererViewMode;
697
706
  /** Live ISO projection state handed to the `render/projection` free functions. */
698
707
  private get isoState();
699
- /** Iso angle (rad) + y-squash for the current isoT. */
700
- private isoParams;
701
708
  /** Effective vertical scale = stage scale × iso squash — legibility math uses this. */
702
709
  private effScale;
703
710
  /** Project a world point through the iso affine about the chart centre (→ iso-world). */
@@ -706,11 +713,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
706
713
  private isoInverse;
707
714
  /** Precompute the Phase-C pinhole camera and every exact seat anchor. */
708
715
  private buildPerspectiveProjection;
709
- /** Apply an affine to a Konva container while keeping `pivot` fixed logically. */
710
- private setContainerAffine;
711
- private resetContainerTransform;
712
- /** Exact raked surface height used for the bounded section tangent plane. */
713
- private sectionSurfaceHeight;
714
716
  /** Desired perspective-space point for a section surface, before Stage pan/zoom. */
715
717
  private projectedSectionPoint;
716
718
  /** Shared-layer local point which the ground affine paints at `projected`. */
@@ -722,13 +724,10 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
722
724
  * the section's resolved real height in world units (Phase B1).
723
725
  */
724
726
  private isoLiftLocal;
725
- /** Restore projection layers to identity (flat)byte-for-byte the original.
726
- * `seatLayer` can be skipped when entering perspective from flat: assigning a
727
- * top-level transform invalidates all 14k descendant absolute transforms even
728
- * while the semantic overview keeps that layer fully transparent. */
727
+ /** The scene-graph half of a projection change see render/projectionApply. */
728
+ private get projectionHost();
729
+ private projectionHostCache;
729
730
  private resetLayerTransforms;
730
- /** Restore section-owned containers before applying another projection. */
731
- private resetSectionProjection;
732
731
  /** Node/cache context the shared seat-anchor pass reads and updates. */
733
732
  /** Cached, unlike its siblings, because it holds only stable references and
734
733
  * no camera reading that could go stale; setChart (which reassigns `seats`)
@@ -739,18 +738,10 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
739
738
  /** Move native seat/booth hit shapes to or from their exact pinhole anchors. */
740
739
  private applyExactSeatAnchors;
741
740
  /**
742
- * Phase C projected 2.5D. Seat/booth anchors are exact pinhole projections;
743
- * section top surfaces use one explicitly bounded tangent plane per authored
744
- * section. Native Konva shapes move with the anchors, so direct hit testing is
745
- * the same graph that paints the buyer-visible unit.
741
+ * Phase C projected 2.5D, and the isometric tilt both live in
742
+ * render/projectionApply, together with the resets they open with.
746
743
  */
747
744
  private applyPerspective;
748
- /**
749
- * Apply the current isoT to the scene: the base rotate+squash as a decomposed
750
- * layer transform (so seats/décor/rings project together and Konva's own
751
- * hit-testing follows), upright counter-transforms on text, and the elevation
752
- * lift + extruded side faces on elevated sections.
753
- */
754
745
  private applyIso;
755
746
  /** Counter-skew every visible label so it renders upright at its projected anchor. */
756
747
  private applyUprightLabels;
@@ -842,7 +833,16 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
842
833
  /** Preserve an explicit seat-number swatch exactly; only Automatic follows
843
834
  * the state-aware contrast fallback as seat paint changes. */
844
835
  private seatLabelInk;
845
- /** Apply fill/stroke/opacity for a seat's current status + selection. */
836
+ /**
837
+ * The per-seat paint context. Built once and kept: `paintSeat` runs per seat
838
+ * per repaint — up to 53k times — so a host per call would be paid for on
839
+ * exactly the device that can least afford it. Every field is an accessor,
840
+ * because the maps and scalars behind them are replaced by `setChart` and by
841
+ * theme changes while this object stays.
842
+ */
843
+ private get seatPaintContext();
844
+ /** Apply fill/stroke/opacity for a seat's current status + selection.
845
+ * The ordering of every rule that decides it lives in render/seatPaint. */
846
846
  private paintSeat;
847
847
  /** True when a seat sits in a section/zone currently marked `closed`. */
848
848
  private seatInClosedSection;
@@ -1001,7 +1001,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1001
1001
  * turns the retained failures into one actionable error.
1002
1002
  */
1003
1003
  private trackAssetImage;
1004
- /** Cancel and release every image retained by the previous chart/export. */
1005
1004
  private cancelAssetLoads;
1006
1005
  /** Organizer floor-plan photo, dimmed, at the very bottom of the bg layer. */
1007
1006
  private renderBackgroundImage;
@@ -1095,66 +1094,33 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1095
1094
  */
1096
1095
  private sectionBounds;
1097
1096
  private sectionFrameScale;
1098
- /**
1099
- * Resolve a seat tap: honour the 3D deck-drill and the AXS seat-pick gate,
1100
- * then toggle. The gate (§4) redirects small on-screen seats to section-focus
1101
- * to avoid blind mis-picks at overview scales — but ONLY when focusing would
1102
- * zoom the seat up to a safe size. If we're already focused on the section, or
1103
- * the section already fills the viewport (a narrow — OR even a wide — container
1104
- * frames a big section BELOW LABEL_SCALE), redirecting is a no-op that would
1105
- * leave the seat permanently unpickable (§5 `picking-gate-unreachable`), so we
1106
- * fall through and PICK. This is the invariant: seats are never unpickable.
1107
- */
1108
- private handleSeatTap;
1109
1097
  /** Deck under the pointer in the 3D stacked overview — see screenPicking. */
1110
1098
  private deckFloorAt;
1111
1099
  /** Nearest selectable seat within `slopPx` of a screen point, or null. */
1112
1100
  private nearestSeatToScreen;
1113
1101
  private get screenPickingHost();
1114
1102
  /**
1115
- * How strongly this seat should advertise itself under the mouse.
1116
- *
1117
- * The hover ring and the `pointer` cursor are a promise that a click does
1118
- * something. Offering both over a SOLD seat and only then answering "Sold" in
1119
- * the popover is a false affordance (owner, 2026-09-02), so:
1120
- *
1121
- * - `full` — a click can take (or give back) this seat: ring + pointer.
1122
- * - `muted` — someone else's hold. It may come back, so it stays legible as
1123
- * a seat: a dimmed, dashed ring, but the default cursor.
1124
- * - `none` — sold, not-for-sale, closed section, filtered out: no ring, no
1125
- * pointer. The tooltip still fires, so the buyer learns why.
1103
+ * Register the stage/seat-layer listeners. The routing they perform — and the
1104
+ * report behind each rung of it — lives in render/interaction/stageInteraction.
1126
1105
  */
1127
- private hoverAffordance;
1128
1106
  private wireInteraction;
1107
+ /** Resolve a seat tap — see render/interaction/stageInteraction. Kept as a
1108
+ * method because the tap ladder calls it through the host, which is the seam
1109
+ * the marker-tap tests spy on. */
1110
+ private handleSeatTap;
1111
+ private interactionHostCache;
1112
+ private get interactionHost();
1129
1113
  /**
1130
1114
  * Min is chart-relative (never lose the room); max is absolute so seats
1131
1115
  * reach a readable size on any chart, however large the venue.
1132
1116
  */
1133
1117
  private zoomBounds;
1134
- /**
1135
- * Zoom so `clientPoint` (stage-relative px) stays fixed under the cursor.
1136
- *
1137
- * `settle: 'frame'` is the wheel/trackpad path. A fling delivers dozens of
1138
- * events between two paints and each one ran the whole `afterViewChange`
1139
- * cascade — retarget, cull, LOD, free text, labels — for a camera the buyer
1140
- * never saw. It now defers exactly the way the pinch path does: cull and draw
1141
- * per event (cheap, and required for a correct frame), one settle per frame,
1142
- * last event wins. The zoom maths and the onViewChange contract are unchanged
1143
- * — `scheduleViewChange` was already rAF-coalesced.
1144
- */
1145
1118
  private zoomAbout;
1146
- /** One `afterViewChange` per animation frame for a burst of wheel events. */
1147
- private scheduleZoomSettle;
1148
1119
  /** Drop a wheel settle that a newer, authoritative view pass supersedes. */
1149
1120
  private cancelZoomSettle;
1150
- /** Zoom + pan so world-rect `b` fills the viewport (with a small margin). */
1151
- private zoomToBounds;
1152
1121
  /**
1153
- * Smoothly glide the camera to frame a section (by id) or a world-space bounds
1154
- * rect — the Slice 5 "glide in". Pan+zoom tween over a calm easeInOutCubic; the
1155
- * melt/LOD rides the camera every frame. `prefers-reduced-motion` (or
1156
- * `opts.animate === false`) snaps via zoomToBounds. A grab (pointer-down) or a
1157
- * newer glide cancels an in-flight one.
1122
+ * Glide the camera to frame a section (by id) or a world-space bounds rect —
1123
+ * the Slice 5 "glide in". See render/camera for the tween and its rules.
1158
1124
  */
1159
1125
  focusRegion(target: string | {
1160
1126
  x: number;
@@ -1188,6 +1154,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1188
1154
  /** The camera scale every seat label needs to clear the legible floor.
1189
1155
  * Derivation in ./render/seatLabelTargetScale. */
1190
1156
  private seatLabelTargetScale;
1157
+ /** The buyer pinched back out to the venue: the section focus is over. */
1158
+ private releaseFocusOnPullBack;
1191
1159
  /** Recompute LOD (cache/labels) after any pan/zoom settles. */
1192
1160
  private afterViewChange;
1193
1161
  /**
@@ -1812,6 +1780,15 @@ interface PickerCallbacks extends RendererCallbacks {
1812
1780
  * overview() / zoom-to-zones) so the host can show/hide the summary card.
1813
1781
  */
1814
1782
  onSectionFocus?: (summary: SectionSummary | null) => void;
1783
+ /**
1784
+ * Does the HOST have its own card open about the seat under the cursor?
1785
+ *
1786
+ * The map draws one hover card. A host that keeps its own — the widget's
1787
+ * pinned card for a seat that cannot be taken, or its confirm card — answers
1788
+ * true while that card is up, and the map's card stands down rather than
1789
+ * saying the same thing beside it.
1790
+ */
1791
+ hostCardOpen?: () => boolean;
1815
1792
  /** A deck was tapped in the 3D all-floors overview — host enters that floor in 2D. */
1816
1793
  onDeckTap?: (floorId: string) => void;
1817
1794
  /**
@@ -2384,6 +2361,9 @@ declare class PickerController {
2384
2361
  /** The camera a price band took from the buyer — see
2385
2362
  * {@link PickerFocusContext.bandReturnPose}. */
2386
2363
  private bandReturnPose;
2364
+ /** The section a price band took the buyer out of — see
2365
+ * {@link PickerFocusContext.bandReturnSection}. */
2366
+ private bandReturnSection;
2387
2367
  /**
2388
2368
  * The state the filter-driven camera rules read and change — see
2389
2369
  * ./pickerFocus. Rebuilt per call; the accessor pair keeps the controller