@seatlayer/core 0.46.0 → 0.47.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.
- package/dist/chunk-AZODENEL.js +97 -0
- package/dist/chunk-AZODENEL.js.map +1 -0
- package/dist/chunk-FVCOOLJO.js +335 -0
- package/dist/chunk-FVCOOLJO.js.map +1 -0
- package/dist/{chunk-5MRJCIZP.js → chunk-TCTAS4Z2.js} +88 -14
- package/dist/chunk-TCTAS4Z2.js.map +1 -0
- package/dist/{de-UHAOVDS3.js → de-ST4H423D.js} +6 -3
- package/dist/{de-UHAOVDS3.js.map → de-ST4H423D.js.map} +1 -1
- package/dist/{es-6TJS2L7S.js → es-WEC5NHRT.js} +6 -3
- package/dist/{es-6TJS2L7S.js.map → es-WEC5NHRT.js.map} +1 -1
- package/dist/{fr-MMSY7FPE.js → fr-SGBFNAQV.js} +6 -3
- package/dist/{fr-MMSY7FPE.js.map → fr-SGBFNAQV.js.map} +1 -1
- package/dist/index.cjs +251 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +119 -4
- package/dist/index.d.ts +119 -4
- package/dist/index.js +152 -24
- package/dist/index.js.map +1 -1
- package/dist/{types-DBnRO2hX.d.cts → types-CE63BK0j.d.cts} +88 -10
- package/dist/{types-DBnRO2hX.d.ts → types-CE63BK0j.d.ts} +88 -10
- package/dist/view/panoramaDelivery.cjs +126 -0
- package/dist/view/panoramaDelivery.cjs.map +1 -0
- package/dist/view/panoramaDelivery.d.cts +34 -0
- package/dist/view/panoramaDelivery.d.ts +34 -0
- package/dist/view/panoramaDelivery.js +17 -0
- package/dist/view/panoramaDelivery.js.map +1 -0
- package/dist/view3d/crossfade/panorama.cjs +453 -0
- package/dist/view3d/crossfade/panorama.cjs.map +1 -0
- package/dist/view3d/crossfade/panorama.d.cts +110 -0
- package/dist/view3d/crossfade/panorama.d.ts +110 -0
- package/dist/view3d/crossfade/panorama.js +30 -0
- package/dist/view3d/crossfade/panorama.js.map +1 -0
- package/dist/view3d/index.cjs +1176 -128
- package/dist/view3d/index.cjs.map +1 -1
- package/dist/view3d/index.d.cts +73 -35
- package/dist/view3d/index.d.ts +73 -35
- package/dist/view3d/index.js +960 -300
- package/dist/view3d/index.js.map +1 -1
- package/package.json +28 -1
- package/dist/chunk-5MRJCIZP.js.map +0 -1
|
@@ -117,6 +117,28 @@ declare function accessibilityMeta(key: AccessibilityType): AccessibilityMeta |
|
|
|
117
117
|
declare const ACCESSIBILITY_RING_COLOR: Record<AccessibilityType, string>;
|
|
118
118
|
/** Ring colour for a seat's accessibility set (first-listed type wins). */
|
|
119
119
|
declare function accessibilityRingColor(types: AccessibilityType[] | undefined): string;
|
|
120
|
+
type SeatViewCoverage = 'exact-seat' | 'row-representative' | 'section-representative' | 'venue-representative';
|
|
121
|
+
/** Calibration and truth metadata that travels with an organizer panorama.
|
|
122
|
+
* The URL remains separate for backward compatibility with existing charts. */
|
|
123
|
+
interface SeatViewMetadata {
|
|
124
|
+
projection?: 'equirectangular';
|
|
125
|
+
coverage?: SeatViewCoverage;
|
|
126
|
+
/** Optional lightweight first paint. `viewFromSeatUrl` remains the sharp source. */
|
|
127
|
+
previewUrl?: string;
|
|
128
|
+
previewWidth?: number;
|
|
129
|
+
previewHeight?: number;
|
|
130
|
+
/** Degrees relative to the authored focal/stage direction. */
|
|
131
|
+
initialBearingDeg?: number;
|
|
132
|
+
/** Positive looks up. The viewer clamps to its safe pitch range. */
|
|
133
|
+
initialPitchDeg?: number;
|
|
134
|
+
capturedAt?: string;
|
|
135
|
+
/** Buyer-safe provenance, e.g. "Provided by the venue". */
|
|
136
|
+
sourceLabel?: string;
|
|
137
|
+
sourceWidth?: number;
|
|
138
|
+
sourceHeight?: number;
|
|
139
|
+
captureEyeHeightM?: number;
|
|
140
|
+
eventConfigurationId?: string;
|
|
141
|
+
}
|
|
120
142
|
interface SeatOverride {
|
|
121
143
|
/** 0-based seat index within the row. */
|
|
122
144
|
index: number;
|
|
@@ -146,6 +168,8 @@ interface SeatOverride {
|
|
|
146
168
|
commercial?: SeatCommercialAttributes;
|
|
147
169
|
/** Seat-specific view photo; falls back to the row photo. */
|
|
148
170
|
viewFromSeatUrl?: string;
|
|
171
|
+
/** Calibration/truth for `viewFromSeatUrl`; ignored when the URL is absent. */
|
|
172
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
149
173
|
/** Per-seat label size/color override; falls back to the row/theme default.
|
|
150
174
|
* Size is clamped to LABEL_STYLE_MIN_SIZE..MAX_SIZE; color is passed through
|
|
151
175
|
* the shared auto-contrast rule at paint time (see {@link LabelStyle}). */
|
|
@@ -219,6 +243,19 @@ interface LabelPresentation {
|
|
|
219
243
|
*/
|
|
220
244
|
positionPreset?: 'start' | 'end' | 'both' | 'none';
|
|
221
245
|
}
|
|
246
|
+
/** Persisted authoring ergonomics that must not change buyer inventory or
|
|
247
|
+
* rendering. Buyer projections strip this object before a chart is served. */
|
|
248
|
+
interface ObjectEditorState {
|
|
249
|
+
/** Objects sharing this id select and transform as one authoring unit. */
|
|
250
|
+
groupId?: string;
|
|
251
|
+
/** Protect canvas geometry while keeping ordinary Inspector properties editable. */
|
|
252
|
+
locked?: boolean;
|
|
253
|
+
/** Remove the object from the authoring scene until Reveal hidden is used. */
|
|
254
|
+
hidden?: boolean;
|
|
255
|
+
}
|
|
256
|
+
interface AuthoringObjectState {
|
|
257
|
+
editor?: ObjectEditorState;
|
|
258
|
+
}
|
|
222
259
|
/** Brand/venue theming — applied by the renderer in both designer and picker. */
|
|
223
260
|
interface ChartTheme {
|
|
224
261
|
/** Canvas background color (default dark: #0e1117-ish radial). */
|
|
@@ -248,7 +285,7 @@ interface ChartTheme {
|
|
|
248
285
|
/** Paid-tier flag: hide the "Powered by SeatMap" badge. */
|
|
249
286
|
hideBadge?: boolean;
|
|
250
287
|
}
|
|
251
|
-
interface RowObject {
|
|
288
|
+
interface RowObject extends AuthoringObjectState {
|
|
252
289
|
type: 'row';
|
|
253
290
|
id: string;
|
|
254
291
|
/** Present when this row was materialized by the in-canvas reference scan.
|
|
@@ -338,6 +375,7 @@ interface RowObject {
|
|
|
338
375
|
displayType?: string;
|
|
339
376
|
labelPresentation?: LabelPresentation;
|
|
340
377
|
viewFromSeatUrl?: string;
|
|
378
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
341
379
|
/** Presentation intent for a continuous node-defined centreline. */
|
|
342
380
|
smoothing?: boolean;
|
|
343
381
|
};
|
|
@@ -413,10 +451,11 @@ interface RowObject {
|
|
|
413
451
|
* generates a synthetic panorama from chart geometry.
|
|
414
452
|
*/
|
|
415
453
|
viewFromSeatUrl?: string;
|
|
454
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
416
455
|
/** Default commercial attributes inherited by seats without an override. */
|
|
417
456
|
commercial?: SeatCommercialAttributes;
|
|
418
457
|
}
|
|
419
|
-
interface GAAreaObject {
|
|
458
|
+
interface GAAreaObject extends AuthoringObjectState {
|
|
420
459
|
type: 'gaArea';
|
|
421
460
|
id: string;
|
|
422
461
|
/** Stable technical/inventory label. */
|
|
@@ -514,7 +553,7 @@ type ShapeLineCap = 'butt' | 'round' | 'square';
|
|
|
514
553
|
type ShapeLineJoin = 'miter' | 'round' | 'bevel';
|
|
515
554
|
type ShapeLineEnding = 'none' | 'arrow';
|
|
516
555
|
/** Non-bookable décor: stage, walls, exits. */
|
|
517
|
-
interface ShapeObject {
|
|
556
|
+
interface ShapeObject extends AuthoringObjectState {
|
|
518
557
|
type: 'shape';
|
|
519
558
|
id: string;
|
|
520
559
|
/**
|
|
@@ -548,6 +587,14 @@ interface ShapeObject {
|
|
|
548
587
|
cornerRadius?: number;
|
|
549
588
|
/** Whole-shape opacity 0.1–1 (default 1). */
|
|
550
589
|
opacity?: number;
|
|
590
|
+
/** Optional physical extrusion height used by the 3D venue renderer. */
|
|
591
|
+
heightM?: number;
|
|
592
|
+
/**
|
|
593
|
+
* Event configurations in which this architecture is present. Absent means
|
|
594
|
+
* the shape belongs to every configuration; a scoped shape is hidden until
|
|
595
|
+
* one of these ids is active on the chart or 3D scene input.
|
|
596
|
+
*/
|
|
597
|
+
eventConfigurationIds?: string[];
|
|
551
598
|
/** Degrees clockwise about the shape's center (default 0). Applied at render time. */
|
|
552
599
|
rotation?: number;
|
|
553
600
|
/**
|
|
@@ -574,7 +621,7 @@ interface RectTableSeatCounts {
|
|
|
574
621
|
/** Seats arranged around a table. Grouped selling is activated only by an
|
|
575
622
|
* event's explicit inventory-model-2 snapshot; model-1 events continue to
|
|
576
623
|
* treat every authored chair as an independent unit. */
|
|
577
|
-
interface TableObject {
|
|
624
|
+
interface TableObject extends AuthoringObjectState {
|
|
578
625
|
type: 'table';
|
|
579
626
|
id: string;
|
|
580
627
|
/** e.g. "T1" — seat labels are `${label}-${n}`. */
|
|
@@ -623,7 +670,7 @@ interface TableObject {
|
|
|
623
670
|
referenceInventorySource?: ReferenceInventorySource;
|
|
624
671
|
}
|
|
625
672
|
/** A booth: one bookable unit rendered as a block (trade shows, VIP boxes). */
|
|
626
|
-
interface BoothObject {
|
|
673
|
+
interface BoothObject extends AuthoringObjectState {
|
|
627
674
|
type: 'booth';
|
|
628
675
|
id: string;
|
|
629
676
|
/** Stable technical/inventory label. */
|
|
@@ -657,7 +704,7 @@ interface BoothObject {
|
|
|
657
704
|
* Renderer: far zoom shows section shapes/labels instead of seats; clicking
|
|
658
705
|
* a section zooms into it.
|
|
659
706
|
*/
|
|
660
|
-
interface SectionObject {
|
|
707
|
+
interface SectionObject extends AuthoringObjectState {
|
|
661
708
|
type: 'section';
|
|
662
709
|
id: string;
|
|
663
710
|
label: string;
|
|
@@ -675,6 +722,7 @@ interface SectionObject {
|
|
|
675
722
|
* metadata operation.
|
|
676
723
|
*/
|
|
677
724
|
viewFromSeatUrl?: string;
|
|
725
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
678
726
|
labelPresentation?: LabelPresentation;
|
|
679
727
|
/**
|
|
680
728
|
* Stable management/inventory identity shared by disconnected visual
|
|
@@ -826,11 +874,21 @@ type SelectionLayer = 'interactive' | 'background' | 'foreground' | 'surrounding
|
|
|
826
874
|
* lockstep with `DECOR_PRESETS`; the selection-layer unit test fails if either
|
|
827
875
|
* vocabulary changes without an explicit routing decision. `reference-focal`
|
|
828
876
|
* is source-backed venue context rather than an authoring-palette preset. */
|
|
829
|
-
declare const SURROUNDINGS_SHAPE_ROLES: readonly ["reference-focal", "bar", "entrance", "exit", "restroom", "screen", "sound", "concession", "coat", "wall"];
|
|
877
|
+
declare const SURROUNDINGS_SHAPE_ROLES: readonly ["reference-focal", "bar", "entrance", "exit", "restroom", "screen", "sound", "concession", "coat", "wall", "rail", "suite", "obstruction"];
|
|
830
878
|
/** Derive an object's selection layer from its type. */
|
|
831
879
|
declare function layerOf(obj: ChartObject): SelectionLayer;
|
|
832
880
|
/** Free-standing text on the chart (aisle names, door labels…). */
|
|
833
|
-
|
|
881
|
+
type TextAlignment = 'left' | 'center' | 'right';
|
|
882
|
+
interface TextBackground {
|
|
883
|
+
color: string;
|
|
884
|
+
/** Space inside the background in chart units; default 6. */
|
|
885
|
+
padding?: number;
|
|
886
|
+
/** Rounded background corners in chart units; default 4. */
|
|
887
|
+
cornerRadius?: number;
|
|
888
|
+
/** Background-only opacity multiplied by the text object's overall opacity. */
|
|
889
|
+
opacity?: number;
|
|
890
|
+
}
|
|
891
|
+
interface TextObject extends AuthoringObjectState {
|
|
834
892
|
type: 'text';
|
|
835
893
|
id: string;
|
|
836
894
|
/** Persisted provenance for objects created from the venue-icon palette. */
|
|
@@ -853,6 +911,20 @@ interface TextObject {
|
|
|
853
911
|
bold?: boolean;
|
|
854
912
|
/** Render slant (default false). Maps to Konva fontStyle italic. */
|
|
855
913
|
italic?: boolean;
|
|
914
|
+
/** Fixed text-box width in chart units. Absent keeps legacy auto width. */
|
|
915
|
+
width?: number;
|
|
916
|
+
/** Horizontal alignment inside a fixed-width text box. */
|
|
917
|
+
align?: TextAlignment;
|
|
918
|
+
/** Multiplier over the font's natural line height; default 1.2. */
|
|
919
|
+
lineHeight?: number;
|
|
920
|
+
/** Added chart units between glyphs; default 0. */
|
|
921
|
+
letterSpacing?: number;
|
|
922
|
+
/** Underline decoration. Absent is off. */
|
|
923
|
+
underline?: boolean;
|
|
924
|
+
/** Whole text-object opacity; default 1. */
|
|
925
|
+
opacity?: number;
|
|
926
|
+
/** Optional padded background painted behind the exact text box. */
|
|
927
|
+
background?: TextBackground;
|
|
856
928
|
}
|
|
857
929
|
/**
|
|
858
930
|
* A raster/vector decor graphic drawn IN the chart, beneath the seats and
|
|
@@ -863,7 +935,7 @@ interface TextObject {
|
|
|
863
935
|
* caches as a single bitmap blit (zero per-frame cost). Placed by top-left
|
|
864
936
|
* (x,y) + size, rotated about its centre — the same handles a shape rect uses.
|
|
865
937
|
*/
|
|
866
|
-
interface DecorImageObject {
|
|
938
|
+
interface DecorImageObject extends AuthoringObjectState {
|
|
867
939
|
type: 'decorImage';
|
|
868
940
|
id: string;
|
|
869
941
|
/** Image or SVG data URL. */
|
|
@@ -923,6 +995,7 @@ interface Floor {
|
|
|
923
995
|
* panorama) applies.
|
|
924
996
|
*/
|
|
925
997
|
viewFromSeatUrl?: string;
|
|
998
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
926
999
|
}
|
|
927
1000
|
interface ReferenceCalibration {
|
|
928
1001
|
type: 'two-point';
|
|
@@ -1134,6 +1207,8 @@ interface ChartDoc {
|
|
|
1134
1207
|
/** The stage / point every seat looks at. Anchors seat-view + sightlines.
|
|
1135
1208
|
* Multi-floor: mirrors floor 0; each floor also carries its own focalPoint. */
|
|
1136
1209
|
focalPoint: Point;
|
|
1210
|
+
/** Active event layout used by configuration-scoped 3D architecture. */
|
|
1211
|
+
eventConfigurationId?: string;
|
|
1137
1212
|
categories: Category[];
|
|
1138
1213
|
/** Section groupings for far-zoom navigation + pricing (optional; sections reference by id). */
|
|
1139
1214
|
zones?: ZoneDef[];
|
|
@@ -1168,6 +1243,7 @@ interface ChartDoc {
|
|
|
1168
1243
|
* the picker generates a synthetic panorama.
|
|
1169
1244
|
*/
|
|
1170
1245
|
viewFromSeatUrl?: string;
|
|
1246
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
1171
1247
|
}
|
|
1172
1248
|
interface ExpandedSeat {
|
|
1173
1249
|
/** Stable id: `${rowId}:${index}` */
|
|
@@ -1203,6 +1279,8 @@ interface ExpandedSeat {
|
|
|
1203
1279
|
commercial?: SeatCommercialAttributes;
|
|
1204
1280
|
/** Organizer-supplied view-from-seat image (inherited from the row). */
|
|
1205
1281
|
viewUrl?: string;
|
|
1282
|
+
/** Calibration/truth inherited from the same scope that supplied `viewUrl`. */
|
|
1283
|
+
viewMeta?: SeatViewMetadata;
|
|
1206
1284
|
/** Per-seat label size/color override; absent = inherit the row/theme default. */
|
|
1207
1285
|
labelStyle?: LabelStyle;
|
|
1208
1286
|
/**
|
|
@@ -1643,4 +1721,4 @@ interface ISeatmapRenderer {
|
|
|
1643
1721
|
/** localStorage key the Designer writes and the Picker reads. */
|
|
1644
1722
|
declare const CHART_STORAGE_KEY = "seatmap.chart";
|
|
1645
1723
|
|
|
1646
|
-
export { type
|
|
1724
|
+
export { type ReferenceSectionTraceInput as $, type AccessibilityType as A, type BoothObject as B, type ChartDoc as C, type DecorImageObject as D, type ExpandedSeat as E, type Floor as F, type GAAreaObject as G, type LabelPresentation as H, type ISeatmapRenderer as I, type ReferenceAccessibilitySource as J, type ReferenceCalibration as K, type LabelStyle as L, type ReferenceCategorySource as M, type ReferenceDerivedScale as N, type ObjectEditorState as O, type Point as P, type ReferenceInventoryExclusionSource as Q, type RowObject as R, type SeatOverride as S, type TableObject as T, type ReferenceInventorySource as U, type ReferenceScanProposal as V, type ReferenceScanRowProposal as W, type ReferenceScanSectionProposal as X, type ReferenceSeatSeed as Y, type ReferenceSectionTraceBatchInput as Z, type ReferenceSectionTraceBatchProposal as _, type SeatViewMetadata as a, type ReferenceSectionTraceProposal as a0, type RenderedBookableLabelEvidence as a1, type RenderedGAAreaEvidence as a2, type RenderedHierarchyLabelEvidence as a3, type RenderedLabelHiddenReason as a4, SEAT_COMMERCIAL_MARKS as a5, SURROUNDINGS_SHAPE_ROLES as a6, type SeatCommercialMark as a7, type SeatCommercialMeta as a8, type SeatViewCoverage as a9, type SectionOutlinePath as aa, type SectionPathSegment as ab, type SelectionLayer as ac, type ShapeLineCap as ad, type ShapeLineEnding as ae, type ShapeLineJoin as af, type ShapeObject as ag, type TextAlignment as ah, type TextBackground as ai, type TextObject as aj, type ZoneDef as ak, accessibilityMeta as al, accessibilityRingColor as am, layerOf as an, seatCommercialMeta as ao, type RectTableSide as b, type ChartObject as c, type SectionObject as d, type RectTableSeatCounts as e, type GAInventorySegment as f, type RendererQualityEvidence as g, type RenderedFreeTextEvidence as h, type RendererOptions as i, type SeatStatus as j, type RendererViewMode as k, type LodRung as l, type CategoryTier as m, type SeatCommercialAttributes as n, type RendererCallbacks as o, ACCESSIBILITY_RING_COLOR as p, ACCESSIBILITY_TYPES as q, type AccessibilityMeta as r, type AuthoringObjectState as s, CHART_STORAGE_KEY as t, type Category as u, type ChartReferenceImage as v, type ChartTheme as w, type CubicPath as x, LABEL_STYLE_MAX_SIZE as y, LABEL_STYLE_MIN_SIZE as z };
|
|
@@ -117,6 +117,28 @@ declare function accessibilityMeta(key: AccessibilityType): AccessibilityMeta |
|
|
|
117
117
|
declare const ACCESSIBILITY_RING_COLOR: Record<AccessibilityType, string>;
|
|
118
118
|
/** Ring colour for a seat's accessibility set (first-listed type wins). */
|
|
119
119
|
declare function accessibilityRingColor(types: AccessibilityType[] | undefined): string;
|
|
120
|
+
type SeatViewCoverage = 'exact-seat' | 'row-representative' | 'section-representative' | 'venue-representative';
|
|
121
|
+
/** Calibration and truth metadata that travels with an organizer panorama.
|
|
122
|
+
* The URL remains separate for backward compatibility with existing charts. */
|
|
123
|
+
interface SeatViewMetadata {
|
|
124
|
+
projection?: 'equirectangular';
|
|
125
|
+
coverage?: SeatViewCoverage;
|
|
126
|
+
/** Optional lightweight first paint. `viewFromSeatUrl` remains the sharp source. */
|
|
127
|
+
previewUrl?: string;
|
|
128
|
+
previewWidth?: number;
|
|
129
|
+
previewHeight?: number;
|
|
130
|
+
/** Degrees relative to the authored focal/stage direction. */
|
|
131
|
+
initialBearingDeg?: number;
|
|
132
|
+
/** Positive looks up. The viewer clamps to its safe pitch range. */
|
|
133
|
+
initialPitchDeg?: number;
|
|
134
|
+
capturedAt?: string;
|
|
135
|
+
/** Buyer-safe provenance, e.g. "Provided by the venue". */
|
|
136
|
+
sourceLabel?: string;
|
|
137
|
+
sourceWidth?: number;
|
|
138
|
+
sourceHeight?: number;
|
|
139
|
+
captureEyeHeightM?: number;
|
|
140
|
+
eventConfigurationId?: string;
|
|
141
|
+
}
|
|
120
142
|
interface SeatOverride {
|
|
121
143
|
/** 0-based seat index within the row. */
|
|
122
144
|
index: number;
|
|
@@ -146,6 +168,8 @@ interface SeatOverride {
|
|
|
146
168
|
commercial?: SeatCommercialAttributes;
|
|
147
169
|
/** Seat-specific view photo; falls back to the row photo. */
|
|
148
170
|
viewFromSeatUrl?: string;
|
|
171
|
+
/** Calibration/truth for `viewFromSeatUrl`; ignored when the URL is absent. */
|
|
172
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
149
173
|
/** Per-seat label size/color override; falls back to the row/theme default.
|
|
150
174
|
* Size is clamped to LABEL_STYLE_MIN_SIZE..MAX_SIZE; color is passed through
|
|
151
175
|
* the shared auto-contrast rule at paint time (see {@link LabelStyle}). */
|
|
@@ -219,6 +243,19 @@ interface LabelPresentation {
|
|
|
219
243
|
*/
|
|
220
244
|
positionPreset?: 'start' | 'end' | 'both' | 'none';
|
|
221
245
|
}
|
|
246
|
+
/** Persisted authoring ergonomics that must not change buyer inventory or
|
|
247
|
+
* rendering. Buyer projections strip this object before a chart is served. */
|
|
248
|
+
interface ObjectEditorState {
|
|
249
|
+
/** Objects sharing this id select and transform as one authoring unit. */
|
|
250
|
+
groupId?: string;
|
|
251
|
+
/** Protect canvas geometry while keeping ordinary Inspector properties editable. */
|
|
252
|
+
locked?: boolean;
|
|
253
|
+
/** Remove the object from the authoring scene until Reveal hidden is used. */
|
|
254
|
+
hidden?: boolean;
|
|
255
|
+
}
|
|
256
|
+
interface AuthoringObjectState {
|
|
257
|
+
editor?: ObjectEditorState;
|
|
258
|
+
}
|
|
222
259
|
/** Brand/venue theming — applied by the renderer in both designer and picker. */
|
|
223
260
|
interface ChartTheme {
|
|
224
261
|
/** Canvas background color (default dark: #0e1117-ish radial). */
|
|
@@ -248,7 +285,7 @@ interface ChartTheme {
|
|
|
248
285
|
/** Paid-tier flag: hide the "Powered by SeatMap" badge. */
|
|
249
286
|
hideBadge?: boolean;
|
|
250
287
|
}
|
|
251
|
-
interface RowObject {
|
|
288
|
+
interface RowObject extends AuthoringObjectState {
|
|
252
289
|
type: 'row';
|
|
253
290
|
id: string;
|
|
254
291
|
/** Present when this row was materialized by the in-canvas reference scan.
|
|
@@ -338,6 +375,7 @@ interface RowObject {
|
|
|
338
375
|
displayType?: string;
|
|
339
376
|
labelPresentation?: LabelPresentation;
|
|
340
377
|
viewFromSeatUrl?: string;
|
|
378
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
341
379
|
/** Presentation intent for a continuous node-defined centreline. */
|
|
342
380
|
smoothing?: boolean;
|
|
343
381
|
};
|
|
@@ -413,10 +451,11 @@ interface RowObject {
|
|
|
413
451
|
* generates a synthetic panorama from chart geometry.
|
|
414
452
|
*/
|
|
415
453
|
viewFromSeatUrl?: string;
|
|
454
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
416
455
|
/** Default commercial attributes inherited by seats without an override. */
|
|
417
456
|
commercial?: SeatCommercialAttributes;
|
|
418
457
|
}
|
|
419
|
-
interface GAAreaObject {
|
|
458
|
+
interface GAAreaObject extends AuthoringObjectState {
|
|
420
459
|
type: 'gaArea';
|
|
421
460
|
id: string;
|
|
422
461
|
/** Stable technical/inventory label. */
|
|
@@ -514,7 +553,7 @@ type ShapeLineCap = 'butt' | 'round' | 'square';
|
|
|
514
553
|
type ShapeLineJoin = 'miter' | 'round' | 'bevel';
|
|
515
554
|
type ShapeLineEnding = 'none' | 'arrow';
|
|
516
555
|
/** Non-bookable décor: stage, walls, exits. */
|
|
517
|
-
interface ShapeObject {
|
|
556
|
+
interface ShapeObject extends AuthoringObjectState {
|
|
518
557
|
type: 'shape';
|
|
519
558
|
id: string;
|
|
520
559
|
/**
|
|
@@ -548,6 +587,14 @@ interface ShapeObject {
|
|
|
548
587
|
cornerRadius?: number;
|
|
549
588
|
/** Whole-shape opacity 0.1–1 (default 1). */
|
|
550
589
|
opacity?: number;
|
|
590
|
+
/** Optional physical extrusion height used by the 3D venue renderer. */
|
|
591
|
+
heightM?: number;
|
|
592
|
+
/**
|
|
593
|
+
* Event configurations in which this architecture is present. Absent means
|
|
594
|
+
* the shape belongs to every configuration; a scoped shape is hidden until
|
|
595
|
+
* one of these ids is active on the chart or 3D scene input.
|
|
596
|
+
*/
|
|
597
|
+
eventConfigurationIds?: string[];
|
|
551
598
|
/** Degrees clockwise about the shape's center (default 0). Applied at render time. */
|
|
552
599
|
rotation?: number;
|
|
553
600
|
/**
|
|
@@ -574,7 +621,7 @@ interface RectTableSeatCounts {
|
|
|
574
621
|
/** Seats arranged around a table. Grouped selling is activated only by an
|
|
575
622
|
* event's explicit inventory-model-2 snapshot; model-1 events continue to
|
|
576
623
|
* treat every authored chair as an independent unit. */
|
|
577
|
-
interface TableObject {
|
|
624
|
+
interface TableObject extends AuthoringObjectState {
|
|
578
625
|
type: 'table';
|
|
579
626
|
id: string;
|
|
580
627
|
/** e.g. "T1" — seat labels are `${label}-${n}`. */
|
|
@@ -623,7 +670,7 @@ interface TableObject {
|
|
|
623
670
|
referenceInventorySource?: ReferenceInventorySource;
|
|
624
671
|
}
|
|
625
672
|
/** A booth: one bookable unit rendered as a block (trade shows, VIP boxes). */
|
|
626
|
-
interface BoothObject {
|
|
673
|
+
interface BoothObject extends AuthoringObjectState {
|
|
627
674
|
type: 'booth';
|
|
628
675
|
id: string;
|
|
629
676
|
/** Stable technical/inventory label. */
|
|
@@ -657,7 +704,7 @@ interface BoothObject {
|
|
|
657
704
|
* Renderer: far zoom shows section shapes/labels instead of seats; clicking
|
|
658
705
|
* a section zooms into it.
|
|
659
706
|
*/
|
|
660
|
-
interface SectionObject {
|
|
707
|
+
interface SectionObject extends AuthoringObjectState {
|
|
661
708
|
type: 'section';
|
|
662
709
|
id: string;
|
|
663
710
|
label: string;
|
|
@@ -675,6 +722,7 @@ interface SectionObject {
|
|
|
675
722
|
* metadata operation.
|
|
676
723
|
*/
|
|
677
724
|
viewFromSeatUrl?: string;
|
|
725
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
678
726
|
labelPresentation?: LabelPresentation;
|
|
679
727
|
/**
|
|
680
728
|
* Stable management/inventory identity shared by disconnected visual
|
|
@@ -826,11 +874,21 @@ type SelectionLayer = 'interactive' | 'background' | 'foreground' | 'surrounding
|
|
|
826
874
|
* lockstep with `DECOR_PRESETS`; the selection-layer unit test fails if either
|
|
827
875
|
* vocabulary changes without an explicit routing decision. `reference-focal`
|
|
828
876
|
* is source-backed venue context rather than an authoring-palette preset. */
|
|
829
|
-
declare const SURROUNDINGS_SHAPE_ROLES: readonly ["reference-focal", "bar", "entrance", "exit", "restroom", "screen", "sound", "concession", "coat", "wall"];
|
|
877
|
+
declare const SURROUNDINGS_SHAPE_ROLES: readonly ["reference-focal", "bar", "entrance", "exit", "restroom", "screen", "sound", "concession", "coat", "wall", "rail", "suite", "obstruction"];
|
|
830
878
|
/** Derive an object's selection layer from its type. */
|
|
831
879
|
declare function layerOf(obj: ChartObject): SelectionLayer;
|
|
832
880
|
/** Free-standing text on the chart (aisle names, door labels…). */
|
|
833
|
-
|
|
881
|
+
type TextAlignment = 'left' | 'center' | 'right';
|
|
882
|
+
interface TextBackground {
|
|
883
|
+
color: string;
|
|
884
|
+
/** Space inside the background in chart units; default 6. */
|
|
885
|
+
padding?: number;
|
|
886
|
+
/** Rounded background corners in chart units; default 4. */
|
|
887
|
+
cornerRadius?: number;
|
|
888
|
+
/** Background-only opacity multiplied by the text object's overall opacity. */
|
|
889
|
+
opacity?: number;
|
|
890
|
+
}
|
|
891
|
+
interface TextObject extends AuthoringObjectState {
|
|
834
892
|
type: 'text';
|
|
835
893
|
id: string;
|
|
836
894
|
/** Persisted provenance for objects created from the venue-icon palette. */
|
|
@@ -853,6 +911,20 @@ interface TextObject {
|
|
|
853
911
|
bold?: boolean;
|
|
854
912
|
/** Render slant (default false). Maps to Konva fontStyle italic. */
|
|
855
913
|
italic?: boolean;
|
|
914
|
+
/** Fixed text-box width in chart units. Absent keeps legacy auto width. */
|
|
915
|
+
width?: number;
|
|
916
|
+
/** Horizontal alignment inside a fixed-width text box. */
|
|
917
|
+
align?: TextAlignment;
|
|
918
|
+
/** Multiplier over the font's natural line height; default 1.2. */
|
|
919
|
+
lineHeight?: number;
|
|
920
|
+
/** Added chart units between glyphs; default 0. */
|
|
921
|
+
letterSpacing?: number;
|
|
922
|
+
/** Underline decoration. Absent is off. */
|
|
923
|
+
underline?: boolean;
|
|
924
|
+
/** Whole text-object opacity; default 1. */
|
|
925
|
+
opacity?: number;
|
|
926
|
+
/** Optional padded background painted behind the exact text box. */
|
|
927
|
+
background?: TextBackground;
|
|
856
928
|
}
|
|
857
929
|
/**
|
|
858
930
|
* A raster/vector decor graphic drawn IN the chart, beneath the seats and
|
|
@@ -863,7 +935,7 @@ interface TextObject {
|
|
|
863
935
|
* caches as a single bitmap blit (zero per-frame cost). Placed by top-left
|
|
864
936
|
* (x,y) + size, rotated about its centre — the same handles a shape rect uses.
|
|
865
937
|
*/
|
|
866
|
-
interface DecorImageObject {
|
|
938
|
+
interface DecorImageObject extends AuthoringObjectState {
|
|
867
939
|
type: 'decorImage';
|
|
868
940
|
id: string;
|
|
869
941
|
/** Image or SVG data URL. */
|
|
@@ -923,6 +995,7 @@ interface Floor {
|
|
|
923
995
|
* panorama) applies.
|
|
924
996
|
*/
|
|
925
997
|
viewFromSeatUrl?: string;
|
|
998
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
926
999
|
}
|
|
927
1000
|
interface ReferenceCalibration {
|
|
928
1001
|
type: 'two-point';
|
|
@@ -1134,6 +1207,8 @@ interface ChartDoc {
|
|
|
1134
1207
|
/** The stage / point every seat looks at. Anchors seat-view + sightlines.
|
|
1135
1208
|
* Multi-floor: mirrors floor 0; each floor also carries its own focalPoint. */
|
|
1136
1209
|
focalPoint: Point;
|
|
1210
|
+
/** Active event layout used by configuration-scoped 3D architecture. */
|
|
1211
|
+
eventConfigurationId?: string;
|
|
1137
1212
|
categories: Category[];
|
|
1138
1213
|
/** Section groupings for far-zoom navigation + pricing (optional; sections reference by id). */
|
|
1139
1214
|
zones?: ZoneDef[];
|
|
@@ -1168,6 +1243,7 @@ interface ChartDoc {
|
|
|
1168
1243
|
* the picker generates a synthetic panorama.
|
|
1169
1244
|
*/
|
|
1170
1245
|
viewFromSeatUrl?: string;
|
|
1246
|
+
viewFromSeatMeta?: SeatViewMetadata;
|
|
1171
1247
|
}
|
|
1172
1248
|
interface ExpandedSeat {
|
|
1173
1249
|
/** Stable id: `${rowId}:${index}` */
|
|
@@ -1203,6 +1279,8 @@ interface ExpandedSeat {
|
|
|
1203
1279
|
commercial?: SeatCommercialAttributes;
|
|
1204
1280
|
/** Organizer-supplied view-from-seat image (inherited from the row). */
|
|
1205
1281
|
viewUrl?: string;
|
|
1282
|
+
/** Calibration/truth inherited from the same scope that supplied `viewUrl`. */
|
|
1283
|
+
viewMeta?: SeatViewMetadata;
|
|
1206
1284
|
/** Per-seat label size/color override; absent = inherit the row/theme default. */
|
|
1207
1285
|
labelStyle?: LabelStyle;
|
|
1208
1286
|
/**
|
|
@@ -1643,4 +1721,4 @@ interface ISeatmapRenderer {
|
|
|
1643
1721
|
/** localStorage key the Designer writes and the Picker reads. */
|
|
1644
1722
|
declare const CHART_STORAGE_KEY = "seatmap.chart";
|
|
1645
1723
|
|
|
1646
|
-
export { type
|
|
1724
|
+
export { type ReferenceSectionTraceInput as $, type AccessibilityType as A, type BoothObject as B, type ChartDoc as C, type DecorImageObject as D, type ExpandedSeat as E, type Floor as F, type GAAreaObject as G, type LabelPresentation as H, type ISeatmapRenderer as I, type ReferenceAccessibilitySource as J, type ReferenceCalibration as K, type LabelStyle as L, type ReferenceCategorySource as M, type ReferenceDerivedScale as N, type ObjectEditorState as O, type Point as P, type ReferenceInventoryExclusionSource as Q, type RowObject as R, type SeatOverride as S, type TableObject as T, type ReferenceInventorySource as U, type ReferenceScanProposal as V, type ReferenceScanRowProposal as W, type ReferenceScanSectionProposal as X, type ReferenceSeatSeed as Y, type ReferenceSectionTraceBatchInput as Z, type ReferenceSectionTraceBatchProposal as _, type SeatViewMetadata as a, type ReferenceSectionTraceProposal as a0, type RenderedBookableLabelEvidence as a1, type RenderedGAAreaEvidence as a2, type RenderedHierarchyLabelEvidence as a3, type RenderedLabelHiddenReason as a4, SEAT_COMMERCIAL_MARKS as a5, SURROUNDINGS_SHAPE_ROLES as a6, type SeatCommercialMark as a7, type SeatCommercialMeta as a8, type SeatViewCoverage as a9, type SectionOutlinePath as aa, type SectionPathSegment as ab, type SelectionLayer as ac, type ShapeLineCap as ad, type ShapeLineEnding as ae, type ShapeLineJoin as af, type ShapeObject as ag, type TextAlignment as ah, type TextBackground as ai, type TextObject as aj, type ZoneDef as ak, accessibilityMeta as al, accessibilityRingColor as am, layerOf as an, seatCommercialMeta as ao, type RectTableSide as b, type ChartObject as c, type SectionObject as d, type RectTableSeatCounts as e, type GAInventorySegment as f, type RendererQualityEvidence as g, type RenderedFreeTextEvidence as h, type RendererOptions as i, type SeatStatus as j, type RendererViewMode as k, type LodRung as l, type CategoryTier as m, type SeatCommercialAttributes as n, type RendererCallbacks as o, ACCESSIBILITY_RING_COLOR as p, ACCESSIBILITY_TYPES as q, type AccessibilityMeta as r, type AuthoringObjectState as s, CHART_STORAGE_KEY as t, type Category as u, type ChartReferenceImage as v, type ChartTheme as w, type CubicPath as x, LABEL_STYLE_MAX_SIZE as y, LABEL_STYLE_MIN_SIZE as z };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/view/panoramaDelivery.ts
|
|
21
|
+
var panoramaDelivery_exports = {};
|
|
22
|
+
__export(panoramaDelivery_exports, {
|
|
23
|
+
browserPanoramaConstraints: () => browserPanoramaConstraints,
|
|
24
|
+
estimatePanoramaTextureBytes: () => estimatePanoramaTextureBytes,
|
|
25
|
+
loadPanoramaImage: () => loadPanoramaImage,
|
|
26
|
+
panoramaTextureBudgetBytes: () => panoramaTextureBudgetBytes,
|
|
27
|
+
planPanoramaDelivery: () => planPanoramaDelivery,
|
|
28
|
+
schedulePanoramaUpgrade: () => schedulePanoramaUpgrade
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(panoramaDelivery_exports);
|
|
31
|
+
function estimatePanoramaTextureBytes(width, height) {
|
|
32
|
+
if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return 0;
|
|
33
|
+
return Math.ceil(width * height * 4 * (4 / 3));
|
|
34
|
+
}
|
|
35
|
+
function panoramaTextureBudgetBytes(deviceMemoryGb) {
|
|
36
|
+
const mib = deviceMemoryGb !== void 0 && deviceMemoryGb <= 2 ? 32 : deviceMemoryGb !== void 0 && deviceMemoryGb >= 8 ? 192 : 96;
|
|
37
|
+
return mib * 1024 * 1024;
|
|
38
|
+
}
|
|
39
|
+
function browserPanoramaConstraints(maxTextureSize) {
|
|
40
|
+
const nav = typeof navigator === "undefined" ? void 0 : navigator;
|
|
41
|
+
return {
|
|
42
|
+
saveData: nav?.connection?.saveData === true,
|
|
43
|
+
maxTextureSize,
|
|
44
|
+
maxDecodedBytes: panoramaTextureBudgetBytes(nav?.deviceMemory)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function planPanoramaDelivery(source, constraints = {}) {
|
|
48
|
+
const previewUrl = source.previewUrl?.trim();
|
|
49
|
+
if (!previewUrl || previewUrl === source.url) {
|
|
50
|
+
return {
|
|
51
|
+
initialUrl: source.url,
|
|
52
|
+
initialWidth: source.sourceWidth,
|
|
53
|
+
initialHeight: source.sourceHeight,
|
|
54
|
+
reason: "full-only"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const initial = {
|
|
58
|
+
initialUrl: previewUrl,
|
|
59
|
+
initialWidth: source.previewWidth,
|
|
60
|
+
initialHeight: source.previewHeight
|
|
61
|
+
};
|
|
62
|
+
if (constraints.saveData) return { ...initial, reason: "save-data" };
|
|
63
|
+
if (constraints.maxTextureSize !== void 0 && source.sourceWidth !== void 0 && source.sourceHeight !== void 0 && Math.max(source.sourceWidth, source.sourceHeight) > constraints.maxTextureSize) {
|
|
64
|
+
return { ...initial, reason: "texture-limit" };
|
|
65
|
+
}
|
|
66
|
+
if (constraints.maxDecodedBytes !== void 0 && source.sourceWidth !== void 0 && source.sourceHeight !== void 0 && estimatePanoramaTextureBytes(source.sourceWidth, source.sourceHeight) > constraints.maxDecodedBytes) {
|
|
67
|
+
return { ...initial, reason: "memory-limit" };
|
|
68
|
+
}
|
|
69
|
+
return { ...initial, upgradeUrl: source.url, reason: "progressive" };
|
|
70
|
+
}
|
|
71
|
+
function abortError() {
|
|
72
|
+
return new DOMException("Panorama image load aborted", "AbortError");
|
|
73
|
+
}
|
|
74
|
+
function loadPanoramaImage(url, signal) {
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
if (signal?.aborted) {
|
|
77
|
+
reject(abortError());
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const image = new Image();
|
|
81
|
+
image.crossOrigin = "anonymous";
|
|
82
|
+
let settled = false;
|
|
83
|
+
const cleanup = () => {
|
|
84
|
+
image.onload = null;
|
|
85
|
+
image.onerror = null;
|
|
86
|
+
signal?.removeEventListener("abort", onAbort);
|
|
87
|
+
};
|
|
88
|
+
const finish = (error) => {
|
|
89
|
+
if (settled) return;
|
|
90
|
+
settled = true;
|
|
91
|
+
cleanup();
|
|
92
|
+
if (error) reject(error);
|
|
93
|
+
else resolve(image);
|
|
94
|
+
};
|
|
95
|
+
const onAbort = () => {
|
|
96
|
+
image.src = "";
|
|
97
|
+
finish(abortError());
|
|
98
|
+
};
|
|
99
|
+
image.onload = () => {
|
|
100
|
+
const decoded = typeof image.decode === "function" ? image.decode() : Promise.resolve();
|
|
101
|
+
void decoded.then(() => finish(), () => finish());
|
|
102
|
+
};
|
|
103
|
+
image.onerror = () => finish(new Error("panorama_image_failed"));
|
|
104
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
105
|
+
image.src = url;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function schedulePanoramaUpgrade(work) {
|
|
109
|
+
const host = globalThis;
|
|
110
|
+
if (host.requestIdleCallback) {
|
|
111
|
+
const id2 = host.requestIdleCallback(work, { timeout: 1200 });
|
|
112
|
+
return () => host.cancelIdleCallback?.(id2);
|
|
113
|
+
}
|
|
114
|
+
const id = globalThis.setTimeout(work, 32);
|
|
115
|
+
return () => globalThis.clearTimeout(id);
|
|
116
|
+
}
|
|
117
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
118
|
+
0 && (module.exports = {
|
|
119
|
+
browserPanoramaConstraints,
|
|
120
|
+
estimatePanoramaTextureBytes,
|
|
121
|
+
loadPanoramaImage,
|
|
122
|
+
panoramaTextureBudgetBytes,
|
|
123
|
+
planPanoramaDelivery,
|
|
124
|
+
schedulePanoramaUpgrade
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=panoramaDelivery.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/view/panoramaDelivery.ts"],"sourcesContent":["/** Progressive delivery policy shared by the WebGL and DOM panorama viewers. */\n\nexport interface PanoramaDeliverySource {\n url: string;\n previewUrl?: string;\n sourceWidth?: number;\n sourceHeight?: number;\n previewWidth?: number;\n previewHeight?: number;\n}\n\nexport interface PanoramaDeliveryConstraints {\n saveData?: boolean;\n maxTextureSize?: number;\n maxDecodedBytes?: number;\n}\n\nexport interface PanoramaDeliveryPlan {\n initialUrl: string;\n upgradeUrl?: string;\n initialWidth?: number;\n initialHeight?: number;\n reason: 'full-only' | 'progressive' | 'save-data' | 'texture-limit' | 'memory-limit';\n}\n\n/** Approximate GPU allocation including a complete mip chain (4/3 overhead). */\nexport function estimatePanoramaTextureBytes(width: number, height: number): number {\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return 0;\n return Math.ceil(width * height * 4 * (4 / 3));\n}\n\n/** Conservative per-panorama budget, raised only on devices reporting ample RAM. */\nexport function panoramaTextureBudgetBytes(deviceMemoryGb?: number): number {\n const mib = deviceMemoryGb !== undefined && deviceMemoryGb <= 2\n ? 32\n : deviceMemoryGb !== undefined && deviceMemoryGb >= 8\n ? 192\n : 96;\n return mib * 1024 * 1024;\n}\n\nexport function browserPanoramaConstraints(maxTextureSize?: number): PanoramaDeliveryConstraints {\n const nav = typeof navigator === 'undefined'\n ? undefined\n : navigator as Navigator & { deviceMemory?: number; connection?: { saveData?: boolean } };\n return {\n saveData: nav?.connection?.saveData === true,\n maxTextureSize,\n maxDecodedBytes: panoramaTextureBudgetBytes(nav?.deviceMemory),\n };\n}\n\n/** Select the first image and whether a later sharp-image upgrade is safe. */\nexport function planPanoramaDelivery(\n source: PanoramaDeliverySource,\n constraints: PanoramaDeliveryConstraints = {},\n): PanoramaDeliveryPlan {\n const previewUrl = source.previewUrl?.trim();\n if (!previewUrl || previewUrl === source.url) {\n return {\n initialUrl: source.url,\n initialWidth: source.sourceWidth,\n initialHeight: source.sourceHeight,\n reason: 'full-only',\n };\n }\n\n const initial = {\n initialUrl: previewUrl,\n initialWidth: source.previewWidth,\n initialHeight: source.previewHeight,\n };\n if (constraints.saveData) return { ...initial, reason: 'save-data' };\n if (constraints.maxTextureSize !== undefined && source.sourceWidth !== undefined && source.sourceHeight !== undefined\n && Math.max(source.sourceWidth, source.sourceHeight) > constraints.maxTextureSize) {\n return { ...initial, reason: 'texture-limit' };\n }\n if (constraints.maxDecodedBytes !== undefined && source.sourceWidth !== undefined && source.sourceHeight !== undefined\n && estimatePanoramaTextureBytes(source.sourceWidth, source.sourceHeight) > constraints.maxDecodedBytes) {\n return { ...initial, reason: 'memory-limit' };\n }\n return { ...initial, upgradeUrl: source.url, reason: 'progressive' };\n}\n\nfunction abortError(): DOMException {\n return new DOMException('Panorama image load aborted', 'AbortError');\n}\n\n/** Decode before resolving so callers never upload or reveal a partial image. */\nexport function loadPanoramaImage(url: string, signal?: AbortSignal): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) { reject(abortError()); return; }\n const image = new Image();\n image.crossOrigin = 'anonymous';\n let settled = false;\n const cleanup = (): void => {\n image.onload = null;\n image.onerror = null;\n signal?.removeEventListener('abort', onAbort);\n };\n const finish = (error?: unknown): void => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error) reject(error);\n else resolve(image);\n };\n const onAbort = (): void => {\n image.src = '';\n finish(abortError());\n };\n image.onload = () => {\n const decoded = typeof image.decode === 'function' ? image.decode() : Promise.resolve();\n void decoded.then(() => finish(), () => finish());\n };\n image.onerror = () => finish(new Error('panorama_image_failed'));\n signal?.addEventListener('abort', onAbort, { once: true });\n image.src = url;\n });\n}\n\n/** Let the preview paint before starting a potentially large decode. */\nexport function schedulePanoramaUpgrade(work: () => void): () => void {\n const host = globalThis as typeof globalThis & {\n requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number;\n cancelIdleCallback?: (id: number) => void;\n };\n if (host.requestIdleCallback) {\n const id = host.requestIdleCallback(work, { timeout: 1200 });\n return () => host.cancelIdleCallback?.(id);\n }\n const id = globalThis.setTimeout(work, 32);\n return () => globalThis.clearTimeout(id);\n}\n"],"mappings":"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","names":["id"]}
|