@seatlayer/core 0.79.0 → 0.80.1

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 (111) hide show
  1. package/dist/ar-4USORDJ2.js +1 -0
  2. package/dist/be-LVIKPY6K.js +1 -0
  3. package/dist/bg-7SHLJNML.js +1 -0
  4. package/dist/ca-BGX4KCNM.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-VW5JVFLX.js +1 -0
  24. package/dist/cy-USSTUCIU.js +1 -0
  25. package/dist/da-OGGV4WBH.js +1 -0
  26. package/dist/de-PLAWZKMA.js +1 -0
  27. package/dist/el-S5RMKQHN.js +1 -0
  28. package/dist/es-3CA56GCO.js +1 -0
  29. package/dist/et-OUZBFOII.js +1 -0
  30. package/dist/fa-A5T5IY5C.js +1 -0
  31. package/dist/fi-MXJW5KTC.js +1 -0
  32. package/dist/fr-24DBNPEI.js +1 -0
  33. package/dist/he-TBD6IXSM.js +1 -0
  34. package/dist/hr-YVEOBL5P.js +1 -0
  35. package/dist/hu-ZX7D57XA.js +1 -0
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.cts +114 -80
  38. package/dist/index.d.ts +114 -80
  39. package/dist/index.js +1 -1
  40. package/dist/it-FLP5ZN7P.js +1 -0
  41. package/dist/ja-M75LXFE4.js +1 -0
  42. package/dist/ku-DMKHQWY3.js +1 -0
  43. package/dist/localeLoaders-JZGFG32X.js +1 -0
  44. package/dist/lt-5LTX5MNB.js +1 -0
  45. package/dist/lv-UXZX5BZI.js +1 -0
  46. package/dist/nl-WPC36W3G.js +1 -0
  47. package/dist/no-UIVMLJ4P.js +1 -0
  48. package/dist/pl-TUDTISCL.js +1 -0
  49. package/dist/pt-ACUXKL3R.js +1 -0
  50. package/dist/{renderedQuality-C4-5Oy6-.d.ts → renderedQuality-DpeC4FAX.d.ts} +1 -1
  51. package/dist/{renderedQuality-CHAf5J4i.d.cts → renderedQuality-twM7ALWT.d.cts} +1 -1
  52. package/dist/{renderer-CuLIU7z1.d.cts → renderer-CPiYrzQW.d.cts} +18 -4
  53. package/dist/{renderer-Bx0ucRf6.d.ts → renderer-sNijqlYf.d.ts} +18 -4
  54. package/dist/ro-NK7KQDS6.js +1 -0
  55. package/dist/ru-DESUHS6U.js +1 -0
  56. package/dist/sk-V75T3PCE.js +1 -0
  57. package/dist/sl-DCJMM2MY.js +1 -0
  58. package/dist/sr-ZJGHUZOY.js +1 -0
  59. package/dist/sv-DES67YAC.js +1 -0
  60. package/dist/{tableSizing-tDaLWj54.d.cts → tableSizing-Dcl2RqNV.d.cts} +1 -1
  61. package/dist/{tableSizing-Dr-ksQTq.d.ts → tableSizing-tLCqlt0I.d.ts} +1 -1
  62. package/dist/{ticketRestrictions-7HrT6IQM.d.ts → ticketRestrictions-Bq1uykn4.d.ts} +46 -6
  63. package/dist/{ticketRestrictions-B4eT6vEy.d.cts → ticketRestrictions-CgReCops.d.cts} +46 -6
  64. package/dist/tr-MM4XA4AF.js +1 -0
  65. package/dist/uk-M2OBRDMC.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-NI3CSKQM.js +1 -0
  71. package/dist/zh-Hant-556PQY3P.js +1 -0
  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/cy-NF6Y2W6J.js +0 -1
  81. package/dist/da-22D72GSM.js +0 -1
  82. package/dist/de-RPFLEDOZ.js +0 -1
  83. package/dist/el-FUQRGODC.js +0 -1
  84. package/dist/es-MCE7ZWGC.js +0 -1
  85. package/dist/et-GS4LQD5N.js +0 -1
  86. package/dist/fa-5MNQP3RH.js +0 -1
  87. package/dist/fi-5A22IZ6C.js +0 -1
  88. package/dist/fr-QSMP5CON.js +0 -1
  89. package/dist/he-ET4VHFSC.js +0 -1
  90. package/dist/hr-CEQPLBXQ.js +0 -1
  91. package/dist/hu-NWXXZPCO.js +0 -1
  92. package/dist/it-LJJQ32WS.js +0 -1
  93. package/dist/ja-JH7SZMXQ.js +0 -1
  94. package/dist/ku-ZEL3JYZ3.js +0 -1
  95. package/dist/localeLoaders-CG4DAMUW.js +0 -1
  96. package/dist/lt-X4GMJWOB.js +0 -1
  97. package/dist/lv-OORJZFNN.js +0 -1
  98. package/dist/nl-EIWNKXHE.js +0 -1
  99. package/dist/no-KE42FJWD.js +0 -1
  100. package/dist/pl-ATCAGIF2.js +0 -1
  101. package/dist/pt-5DSXBZNH.js +0 -1
  102. package/dist/ro-ESUBYINR.js +0 -1
  103. package/dist/ru-5SYA53AZ.js +0 -1
  104. package/dist/sk-QHQ7T2BK.js +0 -1
  105. package/dist/sl-OQHYGFQ7.js +0 -1
  106. package/dist/sr-VOVDWZBT.js +0 -1
  107. package/dist/sv-II3AGEJF.js +0 -1
  108. package/dist/tr-EZHEWRQG.js +0 -1
  109. package/dist/uk-V3LWALME.js +0 -1
  110. package/dist/zh-Hans-WG6IMHH2.js +0 -1
  111. package/dist/zh-Hant-I55RLM6N.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-Dcl2RqNV.cjs';
6
+ import { g as TicketSelectionIssue, b as GroupedTableInventoryUnit } from './ticketRestrictions-CgReCops.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-CgReCops.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-twM7ALWT.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-CPiYrzQW.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-CPiYrzQW.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
@@ -273,8 +277,14 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
273
277
  /** Non-listening visual dim outside the focused section. One overlay replaces
274
278
  * descendant opacity mutations across every seat in the venue. */
275
279
  private focusDimOverlay;
276
- /** Does entering a section draw the entrance dim + backdrop? Off for narrow
277
- * (phone) layouts — see {@link setSectionFocusDim}. */
280
+ /** Does entering a section draw the entrance dim + backdrop?
281
+ *
282
+ * `null` — the default — means "nobody has said", and the answer is derived
283
+ * from the stage: a narrow (phone-sized) stage gets no dim, a wide one does.
284
+ * A host that calls {@link setSectionFocusDim} pins it to a boolean and its
285
+ * answer wins from then on. The tri-state exists because the ONLY caller was
286
+ * `SeatPicker`, which is never mounted on the native bridge — so every
287
+ * native SDK got the desktop dim on a phone-sized stage. */
278
288
  private sectionFocusDim;
279
289
  /** How many camera moves the BUYER has made — see {@link getCameraGestureCount}. */
280
290
  private cameraGestures;
@@ -347,10 +357,7 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
347
357
  private cached;
348
358
  private dpr;
349
359
  /** Current chart's buyer-visible image work. Failures are retained until ready(). */
350
- private assetGeneration;
351
- private assetPromises;
352
- private assetErrors;
353
- private assetCancels;
360
+ private readonly assets;
354
361
  /**
355
362
  * Progressive reveal: what a big chart does instead of appearing all at once.
356
363
  *
@@ -413,6 +420,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
413
420
  * frame loop.
414
421
  */
415
422
  private get breath();
423
+ /** The hover card. One element, reused; the camera decides what it says. */
424
+ private get hoverCard();
416
425
  /**
417
426
  * The selection beacons. Built on first use, like every other overlay family:
418
427
  * a map nobody has picked a seat on allocates nothing and appends no DOM.
@@ -609,7 +618,13 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
609
618
  private framingViewport;
610
619
  /** The visible band in world space — what "where the buyer is looking" means. */
611
620
  private framingWorldRect;
621
+ /** Frame the whole venue. The fit it lands on is render/camera's `fitScale`,
622
+ * which every zoom bound in this renderer is read from. */
612
623
  zoomToFit(): void;
624
+ /** Everything render/camera reads and writes here. Built once: `focusRegion`
625
+ * runs a per-frame tween, and a host per frame is a per-frame allocation. */
626
+ private get cameraHost();
627
+ private cameraHostCache;
613
628
  /**
614
629
  * Reframe after a host/layout resize without throwing away section context.
615
630
  * The stage already represents the usable map area (the picker side panel is
@@ -696,8 +711,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
696
711
  getViewMode(): RendererViewMode;
697
712
  /** Live ISO projection state handed to the `render/projection` free functions. */
698
713
  private get isoState();
699
- /** Iso angle (rad) + y-squash for the current isoT. */
700
- private isoParams;
701
714
  /** Effective vertical scale = stage scale × iso squash — legibility math uses this. */
702
715
  private effScale;
703
716
  /** Project a world point through the iso affine about the chart centre (→ iso-world). */
@@ -706,11 +719,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
706
719
  private isoInverse;
707
720
  /** Precompute the Phase-C pinhole camera and every exact seat anchor. */
708
721
  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
722
  /** Desired perspective-space point for a section surface, before Stage pan/zoom. */
715
723
  private projectedSectionPoint;
716
724
  /** Shared-layer local point which the ground affine paints at `projected`. */
@@ -722,13 +730,10 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
722
730
  * the section's resolved real height in world units (Phase B1).
723
731
  */
724
732
  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. */
733
+ /** The scene-graph half of a projection change — see render/projectionApply. */
734
+ private get projectionHost();
735
+ private projectionHostCache;
729
736
  private resetLayerTransforms;
730
- /** Restore section-owned containers before applying another projection. */
731
- private resetSectionProjection;
732
737
  /** Node/cache context the shared seat-anchor pass reads and updates. */
733
738
  /** Cached, unlike its siblings, because it holds only stable references and
734
739
  * no camera reading that could go stale; setChart (which reassigns `seats`)
@@ -739,18 +744,10 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
739
744
  /** Move native seat/booth hit shapes to or from their exact pinhole anchors. */
740
745
  private applyExactSeatAnchors;
741
746
  /**
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.
747
+ * Phase C projected 2.5D, and the isometric tilt — both live in
748
+ * render/projectionApply, together with the resets they open with.
746
749
  */
747
750
  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
751
  private applyIso;
755
752
  /** Counter-skew every visible label so it renders upright at its projected anchor. */
756
753
  private applyUprightLabels;
@@ -842,7 +839,16 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
842
839
  /** Preserve an explicit seat-number swatch exactly; only Automatic follows
843
840
  * the state-aware contrast fallback as seat paint changes. */
844
841
  private seatLabelInk;
845
- /** Apply fill/stroke/opacity for a seat's current status + selection. */
842
+ /**
843
+ * The per-seat paint context. Built once and kept: `paintSeat` runs per seat
844
+ * per repaint — up to 53k times — so a host per call would be paid for on
845
+ * exactly the device that can least afford it. Every field is an accessor,
846
+ * because the maps and scalars behind them are replaced by `setChart` and by
847
+ * theme changes while this object stays.
848
+ */
849
+ private get seatPaintContext();
850
+ /** Apply fill/stroke/opacity for a seat's current status + selection.
851
+ * The ordering of every rule that decides it lives in render/seatPaint. */
846
852
  private paintSeat;
847
853
  /** True when a seat sits in a section/zone currently marked `closed`. */
848
854
  private seatInClosedSection;
@@ -916,6 +922,13 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
916
922
  * `focusedSeatOpacity` is already gated on the overlay existing, so seats and
917
923
  * their labels simply stay at full brightness.
918
924
  */
925
+ /**
926
+ * The answer in force right now: an explicit {@link setSectionFocusDim} when
927
+ * a host gave one, otherwise the stage's own width. Narrow stages (phones,
928
+ * and every native WebView, which mounts no DOM chrome to call the setter)
929
+ * resolve to no dim.
930
+ */
931
+ private sectionDimEnabled;
919
932
  setSectionFocusDim(enabled: boolean): void;
920
933
  /** Clear an AXS section focus — restore full-bowl brightness + drop the backdrop. */
921
934
  clearSectionFocus(): void;
@@ -1001,7 +1014,6 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1001
1014
  * turns the retained failures into one actionable error.
1002
1015
  */
1003
1016
  private trackAssetImage;
1004
- /** Cancel and release every image retained by the previous chart/export. */
1005
1017
  private cancelAssetLoads;
1006
1018
  /** Organizer floor-plan photo, dimmed, at the very bottom of the bg layer. */
1007
1019
  private renderBackgroundImage;
@@ -1095,66 +1107,33 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1095
1107
  */
1096
1108
  private sectionBounds;
1097
1109
  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
1110
  /** Deck under the pointer in the 3D stacked overview — see screenPicking. */
1110
1111
  private deckFloorAt;
1111
1112
  /** Nearest selectable seat within `slopPx` of a screen point, or null. */
1112
1113
  private nearestSeatToScreen;
1113
1114
  private get screenPickingHost();
1114
1115
  /**
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.
1116
+ * Register the stage/seat-layer listeners. The routing they perform — and the
1117
+ * report behind each rung of it — lives in render/interaction/stageInteraction.
1126
1118
  */
1127
- private hoverAffordance;
1128
1119
  private wireInteraction;
1120
+ /** Resolve a seat tap — see render/interaction/stageInteraction. Kept as a
1121
+ * method because the tap ladder calls it through the host, which is the seam
1122
+ * the marker-tap tests spy on. */
1123
+ private handleSeatTap;
1124
+ private interactionHostCache;
1125
+ private get interactionHost();
1129
1126
  /**
1130
1127
  * Min is chart-relative (never lose the room); max is absolute so seats
1131
1128
  * reach a readable size on any chart, however large the venue.
1132
1129
  */
1133
1130
  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
1131
  private zoomAbout;
1146
- /** One `afterViewChange` per animation frame for a burst of wheel events. */
1147
- private scheduleZoomSettle;
1148
1132
  /** Drop a wheel settle that a newer, authoritative view pass supersedes. */
1149
1133
  private cancelZoomSettle;
1150
- /** Zoom + pan so world-rect `b` fills the viewport (with a small margin). */
1151
- private zoomToBounds;
1152
1134
  /**
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.
1135
+ * Glide the camera to frame a section (by id) or a world-space bounds rect —
1136
+ * the Slice 5 "glide in". See render/camera for the tween and its rules.
1158
1137
  */
1159
1138
  focusRegion(target: string | {
1160
1139
  x: number;
@@ -1188,6 +1167,8 @@ declare class SeatmapRenderer implements ISeatmapRenderer {
1188
1167
  /** The camera scale every seat label needs to clear the legible floor.
1189
1168
  * Derivation in ./render/seatLabelTargetScale. */
1190
1169
  private seatLabelTargetScale;
1170
+ /** The buyer pinched back out to the venue: the section focus is over. */
1171
+ private releaseFocusOnPullBack;
1191
1172
  /** Recompute LOD (cache/labels) after any pan/zoom settles. */
1192
1173
  private afterViewChange;
1193
1174
  /**
@@ -1768,6 +1749,28 @@ interface PickerCallbacks extends RendererCallbacks {
1768
1749
  onSelectionInvalid?: (state: PickerSelectionValidity) => void;
1769
1750
  /** A grouped table was selected and needs buyer confirmation/guest quantity. */
1770
1751
  onTableSelectionRequest?: (table: TableSelectionDetails) => void;
1752
+ /**
1753
+ * A second tap landed on a plain seat that is ALREADY in the selection, and
1754
+ * {@link PickerOptions.retapKeepsSelection} kept it there.
1755
+ *
1756
+ * The renderer's own click logic toggles: it deselects and fires `onDeselect`
1757
+ * immediately. `SeatPicker` answers that itself — it puts the seat back and
1758
+ * raises its confirm card in `'remove'` mode (20c670c6) — but SeatPicker is
1759
+ * DOM chrome and is never mounted on the native bridge, where `startBridge`
1760
+ * builds a bare `SeatingChart`. So on every native SDK the second tap emptied
1761
+ * the cart in silence, with no card and nothing to undo (reproduced on
1762
+ * device, 2026-09-04).
1763
+ *
1764
+ * With the option on, the controller re-selects the seat and calls this
1765
+ * INSTEAD of `onDeselect`, so a host that draws its own chrome can ask the
1766
+ * buyer the opposite question. The seat is still selected when this fires;
1767
+ * removing it is the host's own `deselect([seat.id])`.
1768
+ *
1769
+ * Only plain, locally-selected seats reach here. A server-held unit, a
1770
+ * grouped table, and a seat that is no longer selectable all take the
1771
+ * unchanged `onDeselect` path.
1772
+ */
1773
+ onSeatRetap?: (seat: PickerSeat) => void;
1771
1774
  /** A hold opened (manual hold or best-available). */
1772
1775
  onHold?: (hold: HoldInfo) => void;
1773
1776
  /** A prior active hold was restored from its opaque hold id. */
@@ -1812,6 +1815,15 @@ interface PickerCallbacks extends RendererCallbacks {
1812
1815
  * overview() / zoom-to-zones) so the host can show/hide the summary card.
1813
1816
  */
1814
1817
  onSectionFocus?: (summary: SectionSummary | null) => void;
1818
+ /**
1819
+ * Does the HOST have its own card open about the seat under the cursor?
1820
+ *
1821
+ * The map draws one hover card. A host that keeps its own — the widget's
1822
+ * pinned card for a seat that cannot be taken, or its confirm card — answers
1823
+ * true while that card is up, and the map's card stands down rather than
1824
+ * saying the same thing beside it.
1825
+ */
1826
+ hostCardOpen?: () => boolean;
1815
1827
  /** A deck was tapped in the 3D all-floors overview — host enters that floor in 2D. */
1816
1828
  onDeckTap?: (floorId: string) => void;
1817
1829
  /**
@@ -1843,6 +1855,16 @@ interface PickerOptions extends PickerCallbacks {
1843
1855
  selectionValidators?: PickerSelectionValidator[];
1844
1856
  /** Renderer confirm-card mode (host shows a confirm popover instead of instant cart add). */
1845
1857
  confirmSelection?: boolean;
1858
+ /**
1859
+ * Opt-in: a second tap on a plain seat already in the selection KEEPS it and
1860
+ * reports {@link PickerCallbacks.onSeatRetap} instead of dropping it.
1861
+ *
1862
+ * Default false — the toggle is unchanged, which is what `SeatPicker` needs
1863
+ * because it already answers the second tap with its own confirm card. Hosts
1864
+ * that draw their own chrome (`SeatingChart`, and through it every native
1865
+ * bridge surface) turn it on so a tap can never silently empty the cart.
1866
+ */
1867
+ retapKeepsSelection?: boolean;
1846
1868
  /** ISO 4217 currency for on-map prices (default from money.DEFAULT_CURRENCY). */
1847
1869
  currency?: string;
1848
1870
  /** Flash a pulse when a seat we didn't touch goes free→taken (live-activity cue). */
@@ -2384,6 +2406,9 @@ declare class PickerController {
2384
2406
  /** The camera a price band took from the buyer — see
2385
2407
  * {@link PickerFocusContext.bandReturnPose}. */
2386
2408
  private bandReturnPose;
2409
+ /** The section a price band took the buyer out of — see
2410
+ * {@link PickerFocusContext.bandReturnSection}. */
2411
+ private bandReturnSection;
2387
2412
  /**
2388
2413
  * The state the filter-driven camera rules read and change — see
2389
2414
  * ./pickerFocus. Rebuilt per call; the accessor pair keeps the controller
@@ -2534,6 +2559,15 @@ declare class PickerController {
2534
2559
  private emitOrphanHint;
2535
2560
  /** Toggle colorblind-safe rendering at runtime (see PickerOptions.colorblindSafe). */
2536
2561
  setColorblindSafe(on: boolean): void;
2562
+ /**
2563
+ * Pin whether entering a section dims the rest of the venue.
2564
+ *
2565
+ * Left alone the renderer answers from its own stage width (no dim on a
2566
+ * phone-sized stage), which is what an embedding host with no DOM chrome of
2567
+ * its own — every native WebView — wants. `SeatPicker` calls this because it
2568
+ * knows its own layout breakpoint and wants the answer pinned to it.
2569
+ */
2570
+ setSectionFocusDim(enabled: boolean): void;
2537
2571
  /** @internal */ emitError(err: unknown): void;
2538
2572
  /** @internal */ holdCovers(labels: string[]): boolean;
2539
2573
  /** 409 conflict → deselect the taken labels and repaint them held. */