@seatlayer/core 0.53.0 → 0.55.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.
- package/README.md +2 -2
- package/dist/categoryInventory-BwarniiK.d.ts +109 -0
- package/dist/categoryInventory-D3qPwfKz.d.cts +109 -0
- package/dist/chunk-55NOSZK5.js +1 -0
- package/dist/chunk-6VTTBC5F.js +1 -0
- package/dist/chunk-6XJN4REG.js +1 -0
- package/dist/chunk-7PT7OQUO.js +1 -0
- package/dist/chunk-AQKYUJBX.js +1 -0
- package/dist/chunk-CXF32VPG.js +1 -0
- package/dist/chunk-DNGP2HDT.js +1 -0
- package/dist/chunk-EQM4FFN5.js +1 -0
- package/dist/chunk-HHM3PB66.js +1 -0
- package/dist/chunk-PXWKSYCK.js +1 -0
- package/dist/chunk-VDZ24QVV.js +1 -0
- package/dist/chunk-VI2CLV3Y.js +1 -0
- package/dist/core/chart-ops/index.cjs +1 -0
- package/dist/core/chart-ops/index.d.cts +1235 -0
- package/dist/core/chart-ops/index.d.ts +1235 -0
- package/dist/core/chart-ops/index.js +1 -0
- package/dist/core/color.cjs +1 -0
- package/dist/core/color.d.cts +192 -0
- package/dist/core/color.d.ts +192 -0
- package/dist/core/color.js +1 -0
- package/dist/core/inventory/index.cjs +1 -0
- package/dist/core/inventory/index.d.cts +209 -0
- package/dist/core/inventory/index.d.ts +209 -0
- package/dist/core/inventory/index.js +1 -0
- package/dist/core/layout/index.cjs +1 -0
- package/dist/core/layout/index.d.cts +376 -0
- package/dist/core/layout/index.d.ts +376 -0
- package/dist/core/layout/index.js +1 -0
- package/dist/core/quality/index.cjs +1 -0
- package/dist/core/quality/index.d.cts +132 -0
- package/dist/core/quality/index.d.ts +132 -0
- package/dist/core/quality/index.js +1 -0
- package/dist/core/render-assets/index.cjs +1 -0
- package/dist/core/render-assets/index.d.cts +99 -0
- package/dist/core/render-assets/index.d.ts +99 -0
- package/dist/core/render-assets/index.js +1 -0
- package/dist/core/seatConfidence.cjs +1 -1
- package/dist/core/seatConfidence.d.cts +1 -1
- package/dist/core/seatConfidence.d.ts +1 -1
- package/dist/core/seatConfidence.js +1 -1
- package/dist/core/sections/index.cjs +1 -0
- package/dist/core/sections/index.d.cts +346 -0
- package/dist/core/sections/index.d.ts +346 -0
- package/dist/core/sections/index.js +1 -0
- package/dist/{de-75NWRKC5.js → de-WPX4D3SY.js} +1 -1
- package/dist/{es-BM7EJ7PW.js → es-6KAJQVVX.js} +1 -1
- package/dist/{fr-HPXQHIB4.js → fr-5DTMRBN5.js} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +85 -534
- package/dist/index.d.ts +85 -534
- package/dist/index.js +1 -1
- package/dist/labeling-BmCzW50y.d.ts +90 -0
- package/dist/labeling-VfJBEOn0.d.cts +90 -0
- package/dist/layout-ClQkmixY.d.ts +181 -0
- package/dist/layout-Dlv5bIf2.d.cts +181 -0
- package/dist/renderedQuality-B3jgdgPO.d.ts +113 -0
- package/dist/renderedQuality-bDkUOyBL.d.cts +113 -0
- package/dist/renderer-B_g-W_QB.d.ts +534 -0
- package/dist/renderer-DySMcKAR.d.cts +534 -0
- package/dist/sections-DIzgtDjF.d.ts +123 -0
- package/dist/sections-Dna1nZgR.d.cts +123 -0
- package/dist/segmentedRowModel-BNXEUeHp.d.cts +75 -0
- package/dist/segmentedRowModel-COXw4GCh.d.ts +75 -0
- package/dist/ticketRestrictions-CzchbX_o.d.cts +72 -0
- package/dist/ticketRestrictions-DaYOCpEw.d.ts +72 -0
- package/dist/{types-tLOunI-B.d.cts → types-DTSG6_Hq.d.cts} +238 -761
- package/dist/{types-tLOunI-B.d.ts → types-DTSG6_Hq.d.ts} +238 -761
- package/dist/view3d/crossfade/panorama.d.cts +1 -1
- package/dist/view3d/crossfade/panorama.d.ts +1 -1
- package/dist/view3d/index.cjs +27 -27
- package/dist/view3d/index.d.cts +109 -2
- package/dist/view3d/index.d.ts +109 -2
- package/dist/view3d/index.js +26 -26
- package/package.json +94 -5
- package/dist/chunk-54A7LIL5.js +0 -1
|
@@ -0,0 +1,1235 @@
|
|
|
1
|
+
import { a as SeatViewMetadata, d as SectionObject, ai as ZoneDef, C as ChartDoc, P as Point, r as CubicPath, x as Category, l as CategoryTier, z as ChartTheme, R as RowObject, X as ReferenceScanProposal, B as BoothObject, G as GAAreaObject, q as ShapeObject, T as TableObject, s as TextObject, ae as TextBackground, A as AccessibilityType, S as SeatOverride, c as ChartObject } from '../../types-DTSG6_Hq.js';
|
|
2
|
+
import { e as CategoryInventoryObjectType } from '../../categoryInventory-BwarniiK.js';
|
|
3
|
+
import { R as RelabelOptions } from '../../labeling-BmCzW50y.js';
|
|
4
|
+
export { D as DEFAULT_SECTION_CORNER_SMOOTHING } from '../../labeling-BmCzW50y.js';
|
|
5
|
+
|
|
6
|
+
type ChartObjectIdFactory = (prefix: string) => string;
|
|
7
|
+
type AutomaticPlacement = 'auto' | 'front' | 'rear' | 'left' | 'right';
|
|
8
|
+
declare class ChartOperationError extends Error {
|
|
9
|
+
readonly code: 'floor_not_found' | 'category_not_found' | 'category_in_use' | 'duplicate_category_label' | 'reference_category_protected' | 'object_not_found' | 'invalid_operation' | 'id_generation_failed';
|
|
10
|
+
readonly details: Record<string, unknown>;
|
|
11
|
+
constructor(code: 'floor_not_found' | 'category_not_found' | 'category_in_use' | 'duplicate_category_label' | 'reference_category_protected' | 'object_not_found' | 'invalid_operation' | 'id_generation_failed', message: string, details?: Record<string, unknown>);
|
|
12
|
+
}
|
|
13
|
+
/** Restore the canonical floor-zero mirror before persistence outside Designer. */
|
|
14
|
+
interface LabelStylePatch {
|
|
15
|
+
size?: number | null;
|
|
16
|
+
color?: string | null;
|
|
17
|
+
visible?: boolean;
|
|
18
|
+
}
|
|
19
|
+
type SharedSectionMetadataPatch = {
|
|
20
|
+
label?: string;
|
|
21
|
+
displayLabel?: string | null;
|
|
22
|
+
/** Buyer-facing entrance hint (≤40 chars). null/empty clears it. */
|
|
23
|
+
entrance?: string | null;
|
|
24
|
+
/** Buyer view image inherited below seat/row overrides. null clears it. */
|
|
25
|
+
viewFromSeatUrl?: string | null;
|
|
26
|
+
/** Calibration and buyer disclosure paired with the section image. */
|
|
27
|
+
viewFromSeatMeta?: SeatViewMetadata | null;
|
|
28
|
+
labelPresentation?: SectionObject['labelPresentation'] | null;
|
|
29
|
+
/** Merge per-section label size/color/visibility (see LabelStylePatch). */
|
|
30
|
+
labelStyle?: LabelStylePatch;
|
|
31
|
+
zone?: string | null;
|
|
32
|
+
elevation?: number;
|
|
33
|
+
/** 3D-foundations front-edge height in metres (0–120). `null` clears it back to the elevation-tier fallback. */
|
|
34
|
+
height?: number | null;
|
|
35
|
+
/** 3D-foundations seating rake in degrees (0–45). `null` clears it back to 0 (flat). */
|
|
36
|
+
rake?: number | null;
|
|
37
|
+
/** Per-section 3D deck-surface correction (`flat` | `rakedRows`). `null`
|
|
38
|
+
* clears back to the shared scene compiler's automatic inference. */
|
|
39
|
+
surfaceKind?: SectionObject['surfaceKind'] | null;
|
|
40
|
+
color?: string | null;
|
|
41
|
+
};
|
|
42
|
+
interface SectionInventorySelectionSummary {
|
|
43
|
+
floorId: string;
|
|
44
|
+
sectionIds: string[];
|
|
45
|
+
logicalSectionIds: string[];
|
|
46
|
+
objectIds: string[];
|
|
47
|
+
/** Category can be painted only when every selected logical section owns inventory. */
|
|
48
|
+
categoryApplicable: boolean;
|
|
49
|
+
categoryKey?: string;
|
|
50
|
+
categoryMixed: boolean;
|
|
51
|
+
/** Section view inheritance is meaningful only when every logical section owns
|
|
52
|
+
* at least one row/table/booth seat that can open the buyer view. */
|
|
53
|
+
viewApplicable: boolean;
|
|
54
|
+
}
|
|
55
|
+
type SharedZonePatch = Partial<Pick<ZoneDef, 'label' | 'color' | 'focalPoint'>>;
|
|
56
|
+
|
|
57
|
+
declare function mirrorFirstFloor(doc: ChartDoc): ChartDoc;
|
|
58
|
+
declare const MAX_FLOOR_BASE_HEIGHT_M = 120;
|
|
59
|
+
declare const DEFAULT_FLOOR_HEIGHT_STEP_M = 4;
|
|
60
|
+
declare function addChartFloor(doc: ChartDoc, input: {
|
|
61
|
+
name?: string;
|
|
62
|
+
idFactory: ChartObjectIdFactory;
|
|
63
|
+
}): {
|
|
64
|
+
changed: true;
|
|
65
|
+
floorId: string;
|
|
66
|
+
floorCount: number;
|
|
67
|
+
baseHeightM: number;
|
|
68
|
+
};
|
|
69
|
+
declare function renameChartFloor(doc: ChartDoc, input: {
|
|
70
|
+
floorId: string;
|
|
71
|
+
name: string;
|
|
72
|
+
}): {
|
|
73
|
+
changed: boolean;
|
|
74
|
+
floorId: string;
|
|
75
|
+
floorName: string;
|
|
76
|
+
};
|
|
77
|
+
/** Update one persisted physical floor's absolute deck height. */
|
|
78
|
+
declare function updateChartFloorBaseHeight(doc: ChartDoc, input: {
|
|
79
|
+
floorId: string;
|
|
80
|
+
baseHeightM: number;
|
|
81
|
+
}): {
|
|
82
|
+
changed: boolean;
|
|
83
|
+
floorId: string;
|
|
84
|
+
baseHeightM: number;
|
|
85
|
+
};
|
|
86
|
+
declare function removeChartFloor(doc: ChartDoc, input: {
|
|
87
|
+
floorId: string;
|
|
88
|
+
}): {
|
|
89
|
+
changed: true;
|
|
90
|
+
floorId: string;
|
|
91
|
+
removedObjects: number;
|
|
92
|
+
floorCount: number;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
declare function addChartZone(doc: ChartDoc, input: {
|
|
96
|
+
label: string;
|
|
97
|
+
color: string;
|
|
98
|
+
focalPoint?: Point;
|
|
99
|
+
idFactory: ChartObjectIdFactory;
|
|
100
|
+
}): {
|
|
101
|
+
changed: true;
|
|
102
|
+
zone: ZoneDef;
|
|
103
|
+
};
|
|
104
|
+
/** Rename or recolor stable zones atomically; section assignments are untouched. */
|
|
105
|
+
declare function updateChartZones(doc: ChartDoc, input: {
|
|
106
|
+
updates: Array<{
|
|
107
|
+
zoneId: string;
|
|
108
|
+
patch: SharedZonePatch;
|
|
109
|
+
}>;
|
|
110
|
+
}): {
|
|
111
|
+
changed: boolean;
|
|
112
|
+
zoneIds: string[];
|
|
113
|
+
zones: ZoneDef[];
|
|
114
|
+
};
|
|
115
|
+
/** Remove a stable zone; assigned sections require an explicit clearing opt-in. */
|
|
116
|
+
declare function removeChartZone(doc: ChartDoc, input: {
|
|
117
|
+
zoneId: string;
|
|
118
|
+
clearSectionAssignments?: boolean;
|
|
119
|
+
}): {
|
|
120
|
+
changed: true;
|
|
121
|
+
zoneId: string;
|
|
122
|
+
clearedSectionIds: string[];
|
|
123
|
+
zoneCount: number;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Inspect buyer inventory beneath a section selection without mutating it.
|
|
128
|
+
* Multipart components collapse to logical sections and membership comes from
|
|
129
|
+
* the same canonical resolver used by event inventory and the picker.
|
|
130
|
+
*/
|
|
131
|
+
declare function sectionInventorySelectionSummary(doc: ChartDoc, input: {
|
|
132
|
+
floorId?: string;
|
|
133
|
+
sectionIds: string[];
|
|
134
|
+
}): SectionInventorySelectionSummary;
|
|
135
|
+
/**
|
|
136
|
+
* Paint every buyer-bookable object owned by the selected logical sections.
|
|
137
|
+
* Seat/chair-level category exceptions are cleared (and only that key is
|
|
138
|
+
* cleared), so every current and subsequently unskipped seat inherits the new
|
|
139
|
+
* object category. Stable labels, ids, logical ids, geometry, and unrelated
|
|
140
|
+
* overrides remain byte-for-byte untouched.
|
|
141
|
+
*/
|
|
142
|
+
declare function assignSectionInventoryCategory(doc: ChartDoc, input: {
|
|
143
|
+
floorId?: string;
|
|
144
|
+
sectionIds: string[];
|
|
145
|
+
categoryKey: string;
|
|
146
|
+
}): SectionInventorySelectionSummary & {
|
|
147
|
+
changed: boolean;
|
|
148
|
+
clearedSeatOverrideCount: number;
|
|
149
|
+
};
|
|
150
|
+
/** Update coordinate-free section metadata while preserving every outline and member position. */
|
|
151
|
+
declare function updateSectionMetadata(doc: ChartDoc, input: {
|
|
152
|
+
floorId?: string;
|
|
153
|
+
sectionIds: string[];
|
|
154
|
+
patch: SharedSectionMetadataPatch;
|
|
155
|
+
}): {
|
|
156
|
+
floorId: string;
|
|
157
|
+
changed: boolean;
|
|
158
|
+
sectionIds: string[];
|
|
159
|
+
affectedSectionIds: string[];
|
|
160
|
+
};
|
|
161
|
+
interface GeneratedSectionPolygonConversionPreview {
|
|
162
|
+
floorId: string;
|
|
163
|
+
sectionId: string;
|
|
164
|
+
sectionLabel: string;
|
|
165
|
+
source: {
|
|
166
|
+
representation: 'generated-polygon';
|
|
167
|
+
generator: NonNullable<SectionObject['geometry']>;
|
|
168
|
+
};
|
|
169
|
+
target: {
|
|
170
|
+
representation: 'manual-polygon';
|
|
171
|
+
};
|
|
172
|
+
geometryChanged: false;
|
|
173
|
+
preserved: {
|
|
174
|
+
stableId: true;
|
|
175
|
+
outlineVertexCount: number;
|
|
176
|
+
holeCount: number;
|
|
177
|
+
memberObjectIds: string[];
|
|
178
|
+
inventoryUnits: number;
|
|
179
|
+
durableReferenceSource: boolean;
|
|
180
|
+
inventoryExclusionEvidence: boolean;
|
|
181
|
+
};
|
|
182
|
+
removedFields: ['geometry'];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Describe the exact generated-polygon → manual-polygon conversion without
|
|
186
|
+
* mutating the chart. Exact path-backed sections are deliberately rejected:
|
|
187
|
+
* sampling a line/arc/Bézier path is a different, lossy conversion.
|
|
188
|
+
*/
|
|
189
|
+
declare function previewGeneratedSectionPolygonConversion(doc: ChartDoc, input: {
|
|
190
|
+
floorId?: string;
|
|
191
|
+
sectionId: string;
|
|
192
|
+
}): GeneratedSectionPolygonConversionPreview;
|
|
193
|
+
/** Remove generator provenance only; polygon, holes, ids and inventory stay byte-equivalent. */
|
|
194
|
+
declare function convertGeneratedSectionToPolygon(doc: ChartDoc, input: {
|
|
195
|
+
floorId?: string;
|
|
196
|
+
sectionId: string;
|
|
197
|
+
}): GeneratedSectionPolygonConversionPreview & {
|
|
198
|
+
changed: true;
|
|
199
|
+
};
|
|
200
|
+
type SectionBoundaryTransform = {
|
|
201
|
+
kind: 'translate';
|
|
202
|
+
dx: number;
|
|
203
|
+
dy: number;
|
|
204
|
+
} | {
|
|
205
|
+
kind: 'scale';
|
|
206
|
+
factor: number;
|
|
207
|
+
} | {
|
|
208
|
+
kind: 'rotate';
|
|
209
|
+
degrees: number;
|
|
210
|
+
} | {
|
|
211
|
+
kind: 'reflect';
|
|
212
|
+
axis: 'h' | 'v';
|
|
213
|
+
coordinate: number;
|
|
214
|
+
};
|
|
215
|
+
interface SectionBoundaryTransformResult {
|
|
216
|
+
changed: boolean;
|
|
217
|
+
sectionId: string;
|
|
218
|
+
representation: 'exact-path' | 'polygon';
|
|
219
|
+
outlineVertexCount: number;
|
|
220
|
+
holeCount: number;
|
|
221
|
+
pathSegmentKinds: Array<'line' | 'arc' | 'bezier'>;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Transform every representation of one section boundary together. This is
|
|
225
|
+
* deliberately independent of React/Konva and does not infer or move section
|
|
226
|
+
* members; callers own membership policy, while this operation guarantees the
|
|
227
|
+
* outline, exact path and holes can never drift from one another.
|
|
228
|
+
*/
|
|
229
|
+
declare function transformSectionBoundaryObject(section: SectionObject, transform: SectionBoundaryTransform): SectionBoundaryTransformResult;
|
|
230
|
+
/** Chart-scoped wrapper for server/shared-operation callers. */
|
|
231
|
+
declare function transformSectionBoundary(doc: ChartDoc, input: {
|
|
232
|
+
floorId?: string;
|
|
233
|
+
sectionId: string;
|
|
234
|
+
transform: SectionBoundaryTransform;
|
|
235
|
+
}): SectionBoundaryTransformResult & {
|
|
236
|
+
floorId: string;
|
|
237
|
+
};
|
|
238
|
+
/** Replace an exact section path atomically and regenerate only its deterministic
|
|
239
|
+
* polygon fallback. Stable identity, holes, inventory and durable reference
|
|
240
|
+
* links remain; obsolete hand-smoothing derivation state is discarded. */
|
|
241
|
+
declare function updateSectionExactPath(doc: ChartDoc, input: {
|
|
242
|
+
floorId?: string;
|
|
243
|
+
sectionId: string;
|
|
244
|
+
path: NonNullable<SectionObject['outlinePath']>;
|
|
245
|
+
}): {
|
|
246
|
+
floorId: string;
|
|
247
|
+
sectionId: string;
|
|
248
|
+
changed: boolean;
|
|
249
|
+
segmentKinds: Array<'line' | 'arc' | 'bezier'>;
|
|
250
|
+
sampledVertexCount: number;
|
|
251
|
+
holeCount: number;
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Round the wide corners of hand-drawn polygon sections to a coordinate-free
|
|
255
|
+
* strength (0–100). The clicked polygon stays authoritative in `sourceOutline`;
|
|
256
|
+
* smoothing writes a curved `outlinePath` and re-samples `outline` from it, per
|
|
257
|
+
* the model contract. Strength 0 restores the exact clicked corners. This is the
|
|
258
|
+
* single shared implementation used by both the Designer slider and the MCP
|
|
259
|
+
* `update_sections` tool, so the two can never drift.
|
|
260
|
+
*/
|
|
261
|
+
declare function applySectionCornerSmoothing(doc: ChartDoc, input: {
|
|
262
|
+
floorId?: string;
|
|
263
|
+
sectionIds: string[];
|
|
264
|
+
strength: number;
|
|
265
|
+
}): {
|
|
266
|
+
floorId: string;
|
|
267
|
+
changed: boolean;
|
|
268
|
+
sectionIds: string[];
|
|
269
|
+
affectedSectionIds: string[];
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Shape a hand-drawn section's rendered outline from coordinate-free inputs:
|
|
273
|
+
* corner smoothing (0–100) and/or per-edge curvature (-100..100 per clicked
|
|
274
|
+
* edge). The clicked polygon stays authoritative in `sourceOutline`; shaping
|
|
275
|
+
* writes a curved `outlinePath` and re-samples `outline` from it. Clearing all
|
|
276
|
+
* shaping restores the exact clicked corners.
|
|
277
|
+
*
|
|
278
|
+
* Omitted inputs are LEFT AS THEY ARE, so setting curvature never silently
|
|
279
|
+
* discards a section's smoothing (or the reverse). Pass `null` to clear one.
|
|
280
|
+
*/
|
|
281
|
+
declare function applySectionOutlineShaping(doc: ChartDoc, input: {
|
|
282
|
+
floorId?: string;
|
|
283
|
+
sectionIds: string[];
|
|
284
|
+
cornerSmoothing?: number;
|
|
285
|
+
edgeCurvature?: readonly number[] | null;
|
|
286
|
+
}): {
|
|
287
|
+
floorId: string;
|
|
288
|
+
changed: boolean;
|
|
289
|
+
sectionIds: string[];
|
|
290
|
+
affectedSectionIds: string[];
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
interface RowCubicPathPreview {
|
|
294
|
+
floorId: string;
|
|
295
|
+
rowId: string;
|
|
296
|
+
seatCount: number;
|
|
297
|
+
pathLength: number;
|
|
298
|
+
averageSeatMovement: number;
|
|
299
|
+
maxSeatMovement: number;
|
|
300
|
+
convertingFromParametric: boolean;
|
|
301
|
+
changed: boolean;
|
|
302
|
+
preservesStableId: true;
|
|
303
|
+
preservesSeatMetadata: true;
|
|
304
|
+
preservesInventoryUnits: number;
|
|
305
|
+
}
|
|
306
|
+
/** Validate and measure an exact cubic row centreline without changing identity,
|
|
307
|
+
* seat inventory, labels, categories, overrides, or reference source links. */
|
|
308
|
+
declare function previewRowCubicPath(doc: ChartDoc, input: {
|
|
309
|
+
floorId?: string;
|
|
310
|
+
rowId: string;
|
|
311
|
+
path: CubicPath;
|
|
312
|
+
}): RowCubicPathPreview;
|
|
313
|
+
declare function updateRowCubicPath(doc: ChartDoc, input: {
|
|
314
|
+
floorId?: string;
|
|
315
|
+
rowId: string;
|
|
316
|
+
path: CubicPath;
|
|
317
|
+
}): RowCubicPathPreview;
|
|
318
|
+
interface SectionRowFitInput {
|
|
319
|
+
floorId?: string;
|
|
320
|
+
sectionId: string;
|
|
321
|
+
mode: 'focal' | 'outline';
|
|
322
|
+
/** Required only when a caller wants a focal other than the floor/chart focal point. */
|
|
323
|
+
focalPoint?: Point;
|
|
324
|
+
strength?: number;
|
|
325
|
+
}
|
|
326
|
+
interface SectionRowFitPreview {
|
|
327
|
+
floorId: string;
|
|
328
|
+
sectionId: string;
|
|
329
|
+
mode: 'focal' | 'outline';
|
|
330
|
+
fitCenter: Point;
|
|
331
|
+
strength: number;
|
|
332
|
+
rows: Array<{
|
|
333
|
+
rowId: string;
|
|
334
|
+
fromCurve: number;
|
|
335
|
+
targetCurve: number;
|
|
336
|
+
resultCurve: number;
|
|
337
|
+
fromRotation: number;
|
|
338
|
+
resultRotation: number;
|
|
339
|
+
rmsMovement: number;
|
|
340
|
+
maxMovement: number;
|
|
341
|
+
}>;
|
|
342
|
+
skippedPathRowIds: string[];
|
|
343
|
+
skippedInvalidRowIds: string[];
|
|
344
|
+
averageMovement: number;
|
|
345
|
+
maxMovement: number;
|
|
346
|
+
}
|
|
347
|
+
/** Preview a measured circular fit without changing rows or flattening paths. */
|
|
348
|
+
declare function previewSectionRowFit(doc: ChartDoc, input: SectionRowFitInput): SectionRowFitPreview;
|
|
349
|
+
/** Apply exactly the reviewed fit; stable row ids and seat metadata remain. */
|
|
350
|
+
declare function applySectionRowFit(doc: ChartDoc, input: SectionRowFitInput): SectionRowFitPreview & {
|
|
351
|
+
changed: boolean;
|
|
352
|
+
};
|
|
353
|
+
interface PolygonHolePreview {
|
|
354
|
+
floorId: string;
|
|
355
|
+
objectId: string;
|
|
356
|
+
objectType: 'section' | 'gaArea';
|
|
357
|
+
holeIndex: number;
|
|
358
|
+
vertexCount: number;
|
|
359
|
+
excludedObjectIds: string[];
|
|
360
|
+
excludedInventoryUnits: number;
|
|
361
|
+
preservesExactOuterPath: boolean;
|
|
362
|
+
}
|
|
363
|
+
/** Validate and measure a new or replacement hole without mutating the chart. */
|
|
364
|
+
declare function previewPolygonHole(doc: ChartDoc, input: {
|
|
365
|
+
floorId?: string;
|
|
366
|
+
objectId: string;
|
|
367
|
+
points: Point[];
|
|
368
|
+
holeIndex?: number;
|
|
369
|
+
}): PolygonHolePreview;
|
|
370
|
+
declare function applyPolygonHole(doc: ChartDoc, input: {
|
|
371
|
+
floorId?: string;
|
|
372
|
+
objectId: string;
|
|
373
|
+
points: Point[];
|
|
374
|
+
holeIndex?: number;
|
|
375
|
+
}): PolygonHolePreview & {
|
|
376
|
+
changed: true;
|
|
377
|
+
};
|
|
378
|
+
declare function previewRemovePolygonHole(doc: ChartDoc, input: {
|
|
379
|
+
floorId?: string;
|
|
380
|
+
objectId: string;
|
|
381
|
+
holeIndex: number;
|
|
382
|
+
}): PolygonHolePreview;
|
|
383
|
+
declare function removePolygonHole(doc: ChartDoc, input: {
|
|
384
|
+
floorId?: string;
|
|
385
|
+
objectId: string;
|
|
386
|
+
holeIndex: number;
|
|
387
|
+
}): PolygonHolePreview & {
|
|
388
|
+
changed: true;
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
type SharedCategoryPatch = Partial<Pick<Category, 'label' | 'color' | 'price' | 'notForSale'>> & {
|
|
392
|
+
tiers?: CategoryTier[] | null;
|
|
393
|
+
};
|
|
394
|
+
declare function updateCategoryDefinitions(doc: ChartDoc, input: {
|
|
395
|
+
updates: Array<{
|
|
396
|
+
categoryKey: string;
|
|
397
|
+
patch: SharedCategoryPatch;
|
|
398
|
+
}>;
|
|
399
|
+
}): {
|
|
400
|
+
changed: boolean;
|
|
401
|
+
categoryKeys: string[];
|
|
402
|
+
categories: Category[];
|
|
403
|
+
};
|
|
404
|
+
/**
|
|
405
|
+
* Replace category document order without changing any stable category key or
|
|
406
|
+
* category payload. Document order is buyer-visible legend/filter priority and
|
|
407
|
+
* is also the deterministic input to colorblind-preview mapping, so it must be
|
|
408
|
+
* an explicit shared operation rather than an array splice hidden in Designer.
|
|
409
|
+
*/
|
|
410
|
+
declare function reorderChartCategories(doc: ChartDoc, input: {
|
|
411
|
+
categoryKeys: string[];
|
|
412
|
+
}): {
|
|
413
|
+
changed: boolean;
|
|
414
|
+
categoryKeys: string[];
|
|
415
|
+
categories: Category[];
|
|
416
|
+
};
|
|
417
|
+
/** Okabe-Ito colorblind-safe hues (black dropped — unreadable on dark charts).
|
|
418
|
+
* Single source of truth for the colorblind-safe palette. The author-time
|
|
419
|
+
* preview, the new-category seed, the reassign op below, and SeatmapRenderer's
|
|
420
|
+
* colorblind mode all key off THIS array by category document order, so a
|
|
421
|
+
* reassigned chart reads identically with colorblind mode on or off. */
|
|
422
|
+
declare const COLORBLIND_SAFE_PALETTE: readonly ["#e69f00", "#56b4e9", "#009e73", "#f0e442", "#0072b2", "#d55e00", "#cc79a7"];
|
|
423
|
+
/**
|
|
424
|
+
* First Okabe-Ito hue that stays distinct from every color already in use, so
|
|
425
|
+
* the next category seeds a colorblind-safe hue. Falls back to indexing into the
|
|
426
|
+
* palette (then a rotated tint) when every safe hue is already taken, so a new
|
|
427
|
+
* category always gets *some* color. Callers may still override the color.
|
|
428
|
+
*/
|
|
429
|
+
declare function pickColorblindSafeCategoryColor(usedColors: string[], seedIndex: number, palette?: readonly string[]): string;
|
|
430
|
+
interface ReassignColorblindSafeResult {
|
|
431
|
+
changed: Array<{
|
|
432
|
+
key: string;
|
|
433
|
+
from: string;
|
|
434
|
+
to: string;
|
|
435
|
+
}>;
|
|
436
|
+
categories: Category[];
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Remap every category color onto a distinct Okabe-Ito colorblind-safe hue,
|
|
440
|
+
* assigned by category document order (the same order the author-time preview
|
|
441
|
+
* and SeatmapRenderer's colorblind mode key off). Colors only — labels, prices,
|
|
442
|
+
* tiers, keys and reference provenance are untouched. Deterministic: the same
|
|
443
|
+
* document in yields the same colors out. Returns the per-category before/after
|
|
444
|
+
* for every color that actually moved (empty when the palette is already
|
|
445
|
+
* applied). Mutates `doc.categories` in place (through the shared category-patch
|
|
446
|
+
* op, so the six-digit-hex/label/tier catalog invariants still hold).
|
|
447
|
+
*/
|
|
448
|
+
declare function reassignColorblindSafeCategoryColors(doc: ChartDoc, opts?: {
|
|
449
|
+
palette?: readonly string[];
|
|
450
|
+
}): ReassignColorblindSafeResult;
|
|
451
|
+
/**
|
|
452
|
+
* Record an organizer-confirmed screen/reference color without invalidating
|
|
453
|
+
* immutable source provenance. Non-reference categories simply receive the
|
|
454
|
+
* same validated color update.
|
|
455
|
+
*/
|
|
456
|
+
declare function confirmReferenceCategoryOutputColor(doc: ChartDoc, input: {
|
|
457
|
+
categoryKey: string;
|
|
458
|
+
color: string;
|
|
459
|
+
sourceDescription: string;
|
|
460
|
+
}): {
|
|
461
|
+
changed: boolean;
|
|
462
|
+
category: Category;
|
|
463
|
+
categories: Category[];
|
|
464
|
+
};
|
|
465
|
+
declare function addChartCategory(doc: ChartDoc, input: {
|
|
466
|
+
label: string;
|
|
467
|
+
color: string;
|
|
468
|
+
price?: number;
|
|
469
|
+
tiers?: CategoryTier[];
|
|
470
|
+
idFactory: ChartObjectIdFactory;
|
|
471
|
+
}): {
|
|
472
|
+
changed: true;
|
|
473
|
+
category: Category;
|
|
474
|
+
categories: Category[];
|
|
475
|
+
};
|
|
476
|
+
/** Plain-language derived name for a family sibling, e.g. “Standard – Tables”.
|
|
477
|
+
* Any family suffix already on the base is stripped first so the words never
|
|
478
|
+
* stack (“Standard – Tables” + booth → “Standard – Booths”). */
|
|
479
|
+
declare function familyCategoryLabel(baseLabel: string, objectType: CategoryInventoryObjectType): string;
|
|
480
|
+
interface ResolveCreationCategoryOptions {
|
|
481
|
+
idFactory: ChartObjectIdFactory;
|
|
482
|
+
palette?: readonly string[];
|
|
483
|
+
/** Fallback color chooser when every palette hue is already used. */
|
|
484
|
+
suggestColor?: (usedColors: string[]) => string;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Resolve the category a NEW object of `objectType` should be created with so
|
|
488
|
+
* the default authoring path never manufactures a category-inventory-family
|
|
489
|
+
* conflict (OV-76). A category prices exactly one inventory family, so drawing
|
|
490
|
+
* e.g. a table with the active row category — the two most obvious actions on a
|
|
491
|
+
* blank chart — would otherwise create a publish-blocking error. Resolution:
|
|
492
|
+
* 1. keep the active category when it stays within this family (the common
|
|
493
|
+
* case: a blank chart's first object stays on “Standard”);
|
|
494
|
+
* 2. else, with NO active category, reuse the category this family is already
|
|
495
|
+
* priced by. Without this step a blank chart's second table minted a
|
|
496
|
+
* redundant “Tables – Tables” beside the “Tables” its first table had just
|
|
497
|
+
* created, because a from-scratch doc starts with `categories: []` and the
|
|
498
|
+
* designer's active key stays empty through that first mint;
|
|
499
|
+
* 3. else reuse an existing, still family-safe sibling with the derived name
|
|
500
|
+
* (e.g. “Standard – Tables”) if one already exists;
|
|
501
|
+
* 4. else mint a sibling from the base category — same price and ticket tiers,
|
|
502
|
+
* a plain “<Base> – Tables/Booths/Standing/Seats” name, and a distinct
|
|
503
|
+
* colorblind-safe color so no contrast/CVD warning appears. With no active
|
|
504
|
+
* category there is no author intent to inherit, so the mint is a plain
|
|
505
|
+
* “Tables”/“Seats”/“Booths”/“Standing” rather than a name derived from
|
|
506
|
+
* whichever unrelated category happens to sit first in the document.
|
|
507
|
+
* Mints are appended to `doc.categories` in place; the resolved key is returned.
|
|
508
|
+
* This covers CREATION defaults only — a later deliberate cross-family paint
|
|
509
|
+
* still surfaces the family error and its safe split.
|
|
510
|
+
*/
|
|
511
|
+
declare function resolveCreationCategory(doc: ChartDoc, activeCategoryKey: string, objectType: CategoryInventoryObjectType, options: ResolveCreationCategoryOptions): string;
|
|
512
|
+
declare function removeChartCategory(doc: ChartDoc, input: {
|
|
513
|
+
categoryKey: string;
|
|
514
|
+
}): {
|
|
515
|
+
changed: true;
|
|
516
|
+
categoryKey: string;
|
|
517
|
+
categories: Category[];
|
|
518
|
+
};
|
|
519
|
+
|
|
520
|
+
type SharedThemePatch = {
|
|
521
|
+
background?: string | null;
|
|
522
|
+
seatLabelColor?: string | null;
|
|
523
|
+
rowLabelColor?: string | null;
|
|
524
|
+
selectionColor?: string | null;
|
|
525
|
+
decorFill?: string | null;
|
|
526
|
+
textColor?: string | null;
|
|
527
|
+
accent?: string | null;
|
|
528
|
+
accentInk?: string | null;
|
|
529
|
+
fontFamily?: string | null;
|
|
530
|
+
seatScale?: number | null;
|
|
531
|
+
logoUrl?: string | null;
|
|
532
|
+
brandName?: string | null;
|
|
533
|
+
hideBadge?: boolean | null;
|
|
534
|
+
};
|
|
535
|
+
/**
|
|
536
|
+
* Merge chart-wide theme + white-label branding through the same field-level
|
|
537
|
+
* semantics as the Designer Theme tab. Colors run through the shared six-digit
|
|
538
|
+
* hex rule, seatScale is clamped to the renderer's 0.7–1.6 band, and logoUrl
|
|
539
|
+
* accepts only a data:image or https reference. `hideBadge` is stored verbatim;
|
|
540
|
+
* its paid-tier entitlement is enforced separately at buyer-serve time, exactly
|
|
541
|
+
* as a Designer toggle is (any organizer may set the stored flag).
|
|
542
|
+
*/
|
|
543
|
+
declare function updateChartTheme(doc: ChartDoc, input: {
|
|
544
|
+
patch: SharedThemePatch;
|
|
545
|
+
}): {
|
|
546
|
+
changed: boolean;
|
|
547
|
+
theme: ChartTheme | null;
|
|
548
|
+
};
|
|
549
|
+
/**
|
|
550
|
+
* Set/clear the view-from-seat fallback at venue (chart) or floor scope — the
|
|
551
|
+
* two lowest-priority tiers below any seat/row/section photo. `floorId`
|
|
552
|
+
* undefined targets the venue default (`doc.viewFromSeatUrl`); a floor id sets
|
|
553
|
+
* that floor's override. `url` null clears the slot. Accepts only https or
|
|
554
|
+
* data:image references, exactly like section and seat view photos.
|
|
555
|
+
*/
|
|
556
|
+
declare function updateViewFromSeatFallback(doc: ChartDoc, input: {
|
|
557
|
+
floorId?: string;
|
|
558
|
+
url: string | null;
|
|
559
|
+
metadata?: SeatViewMetadata | null;
|
|
560
|
+
}): {
|
|
561
|
+
changed: boolean;
|
|
562
|
+
scope: 'venue' | 'floor';
|
|
563
|
+
floorId?: string;
|
|
564
|
+
url: string | null;
|
|
565
|
+
};
|
|
566
|
+
/** Server-owned placement for coordinate-free callers. */
|
|
567
|
+
declare function automaticPlacementCenter(doc: ChartDoc, input: {
|
|
568
|
+
floorId?: string;
|
|
569
|
+
width: number;
|
|
570
|
+
height: number;
|
|
571
|
+
placement?: AutomaticPlacement;
|
|
572
|
+
}): Point;
|
|
573
|
+
|
|
574
|
+
interface ArcFanRowsInput {
|
|
575
|
+
floorId?: string;
|
|
576
|
+
center: Point;
|
|
577
|
+
innerRadius: number;
|
|
578
|
+
rowCount: number;
|
|
579
|
+
rowGap: number;
|
|
580
|
+
startAngle: number;
|
|
581
|
+
endAngle: number;
|
|
582
|
+
seatPitch: number;
|
|
583
|
+
fit?: 'seat-pitch' | 'fixed-count';
|
|
584
|
+
seatsPerRow?: number;
|
|
585
|
+
facing?: 'inward' | 'outward';
|
|
586
|
+
/** Positive values narrow outer rows symmetrically, in degrees. */
|
|
587
|
+
taperDegrees?: number;
|
|
588
|
+
/** Clockwise bearing shift from the first row to the last, in degrees. */
|
|
589
|
+
skewDegrees?: number;
|
|
590
|
+
/** Physical aisle widths in chart units at quarter/centre/three-quarter span. */
|
|
591
|
+
aisleGaps?: Partial<Record<'left' | 'center' | 'right', number>>;
|
|
592
|
+
categoryKey: string;
|
|
593
|
+
rowLabelStart?: number;
|
|
594
|
+
seatLabelStart?: number;
|
|
595
|
+
sectionLabel?: string;
|
|
596
|
+
}
|
|
597
|
+
interface ArcFanRowsPreview {
|
|
598
|
+
floorId: string;
|
|
599
|
+
rows: RowObject[];
|
|
600
|
+
logicalRowCount: number;
|
|
601
|
+
rowSegmentCount: number;
|
|
602
|
+
totalSeats: number;
|
|
603
|
+
innerRadius: number;
|
|
604
|
+
outerRadius: number;
|
|
605
|
+
minSeatSpacing: number;
|
|
606
|
+
maxSeatSpacing: number;
|
|
607
|
+
maxPitchDeviation: number;
|
|
608
|
+
aisleCount: number;
|
|
609
|
+
warnings: string[];
|
|
610
|
+
}
|
|
611
|
+
/** Build a measured Arc/Fan preview without mutating the chart or consuming ids. */
|
|
612
|
+
declare function previewArcFanRows(doc: ChartDoc, input: ArcFanRowsInput): ArcFanRowsPreview;
|
|
613
|
+
/** Apply the exact measured preview as stable rows, optionally wrapped in a section. */
|
|
614
|
+
declare function addArcFanRows(doc: ChartDoc, input: ArcFanRowsInput & {
|
|
615
|
+
idFactory: ChartObjectIdFactory;
|
|
616
|
+
}): Omit<ArcFanRowsPreview, 'rows'> & {
|
|
617
|
+
rowIds: string[];
|
|
618
|
+
sectionId: string | null;
|
|
619
|
+
groupId: string;
|
|
620
|
+
};
|
|
621
|
+
/** Recover one coherent semantic specification for reopening a generated fan. */
|
|
622
|
+
declare function arcFanInputForGroup(doc: ChartDoc, input: {
|
|
623
|
+
floorId?: string;
|
|
624
|
+
groupId: string;
|
|
625
|
+
}): ArcFanRowsInput;
|
|
626
|
+
/** Regenerate one coherent fan while preserving matching row and section ids. */
|
|
627
|
+
declare function replaceArcFanRows(doc: ChartDoc, input: ArcFanRowsInput & {
|
|
628
|
+
groupId: string;
|
|
629
|
+
idFactory: ChartObjectIdFactory;
|
|
630
|
+
}): Omit<ArcFanRowsPreview, 'rows'> & {
|
|
631
|
+
rowIds: string[];
|
|
632
|
+
sectionId: string | null;
|
|
633
|
+
groupId: string;
|
|
634
|
+
};
|
|
635
|
+
|
|
636
|
+
interface AddRowBlockInput {
|
|
637
|
+
floorId?: string;
|
|
638
|
+
origin: Point;
|
|
639
|
+
rowCount: number;
|
|
640
|
+
seatsPerRow: number;
|
|
641
|
+
categoryKey: string;
|
|
642
|
+
idFactory: ChartObjectIdFactory;
|
|
643
|
+
rowGap?: number;
|
|
644
|
+
seatSpacing?: number;
|
|
645
|
+
curve?: number;
|
|
646
|
+
/** Row direction in degrees (0 = seats run left→right). Applies to every row;
|
|
647
|
+
* later rows stack along the normal so the whole block shares one rake. */
|
|
648
|
+
rotation?: number;
|
|
649
|
+
sectionLabel?: string;
|
|
650
|
+
/** Explicit block generator style. Absent preserves the legacy ungrouped output. */
|
|
651
|
+
style?: 'multiple' | 'intertwined';
|
|
652
|
+
}
|
|
653
|
+
declare function addRowBlock(doc: ChartDoc, input: AddRowBlockInput): {
|
|
654
|
+
floorId: string;
|
|
655
|
+
rowIds: string[];
|
|
656
|
+
sectionId: string | null;
|
|
657
|
+
createdIds: string[];
|
|
658
|
+
};
|
|
659
|
+
/** Footprint (width/height) for a GA rectangle of the given capacity. */
|
|
660
|
+
declare function gaAreaFootprint(capacity: number): {
|
|
661
|
+
width: number;
|
|
662
|
+
height: number;
|
|
663
|
+
};
|
|
664
|
+
interface AddGAAreaInput {
|
|
665
|
+
floorId?: string;
|
|
666
|
+
/** Rectangle center in chart units — derived by the caller's placement policy. */
|
|
667
|
+
center: Point;
|
|
668
|
+
capacity: number;
|
|
669
|
+
categoryKey: string;
|
|
670
|
+
label?: string;
|
|
671
|
+
displayLabel?: string;
|
|
672
|
+
idFactory: ChartObjectIdFactory;
|
|
673
|
+
}
|
|
674
|
+
/**
|
|
675
|
+
* Add one rectangular GA standing area to an existing chart. The server owns
|
|
676
|
+
* the polygon: a rectangle sized from capacity at the catalog standing
|
|
677
|
+
* density, centered where the caller's placement policy chose. Additive and
|
|
678
|
+
* individually removable; nothing else on the chart moves.
|
|
679
|
+
*/
|
|
680
|
+
declare function addGAArea(doc: ChartDoc, input: AddGAAreaInput): {
|
|
681
|
+
floorId: string;
|
|
682
|
+
gaAreaId: string;
|
|
683
|
+
label: string;
|
|
684
|
+
createdIds: string[];
|
|
685
|
+
};
|
|
686
|
+
interface AddTableArrayInput {
|
|
687
|
+
floorId?: string;
|
|
688
|
+
/** Grid center in chart units — derived by the caller's placement policy. */
|
|
689
|
+
center: Point;
|
|
690
|
+
tableRows: number;
|
|
691
|
+
tableColumns: number;
|
|
692
|
+
seatsPerTable: number;
|
|
693
|
+
shape: 'round' | 'rect';
|
|
694
|
+
categoryKey: string;
|
|
695
|
+
idFactory: ChartObjectIdFactory;
|
|
696
|
+
gapX?: number;
|
|
697
|
+
gapY?: number;
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Add a grid of identical tables to an existing chart, labelled `T{n}` from
|
|
701
|
+
* the first free number chart-wide. Geometry constants are the catalog table
|
|
702
|
+
* archetype's own (round radius 46, grid pitch 155×150), so an added banquet
|
|
703
|
+
* block matches a compiled one seat for seat.
|
|
704
|
+
*/
|
|
705
|
+
declare function addTableArray(doc: ChartDoc, input: AddTableArrayInput): {
|
|
706
|
+
floorId: string;
|
|
707
|
+
tableIds: string[];
|
|
708
|
+
createdIds: string[];
|
|
709
|
+
};
|
|
710
|
+
interface AddBoothArrayInput {
|
|
711
|
+
floorId?: string;
|
|
712
|
+
/** Grid center in chart units — derived by the caller's placement policy. */
|
|
713
|
+
center: Point;
|
|
714
|
+
boothRows: number;
|
|
715
|
+
boothColumns: number;
|
|
716
|
+
categoryKey: string;
|
|
717
|
+
idFactory: ChartObjectIdFactory;
|
|
718
|
+
gapX?: number;
|
|
719
|
+
gapY?: number;
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Add a grid of booths to an existing chart, labelled `B{n}` from the first
|
|
723
|
+
* free number chart-wide. Booth footprint and pitch are the catalog expo
|
|
724
|
+
* archetype's constants (62×52 at 88×82).
|
|
725
|
+
*/
|
|
726
|
+
declare function addBoothArray(doc: ChartDoc, input: AddBoothArrayInput): {
|
|
727
|
+
floorId: string;
|
|
728
|
+
boothIds: string[];
|
|
729
|
+
createdIds: string[];
|
|
730
|
+
};
|
|
731
|
+
interface SegmentedRowGroupResult {
|
|
732
|
+
floorId: string;
|
|
733
|
+
groupId: string;
|
|
734
|
+
rowIds: string[];
|
|
735
|
+
changed: boolean;
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* Link existing physical rows into one buyer-facing segmented row without
|
|
739
|
+
* deleting/re-indexing any inventory. `boundaries[i]` describes the boundary
|
|
740
|
+
* before component i+1 and is mandatory so an aisle can never be inferred as
|
|
741
|
+
* continuous by accident.
|
|
742
|
+
*/
|
|
743
|
+
declare function groupRowsAsSegmented(doc: ChartDoc, input: {
|
|
744
|
+
floorId?: string;
|
|
745
|
+
rowIds: string[];
|
|
746
|
+
boundaries: Array<'continuous' | 'break'>;
|
|
747
|
+
displayLabel?: string;
|
|
748
|
+
idFactory: ChartObjectIdFactory;
|
|
749
|
+
}): SegmentedRowGroupResult;
|
|
750
|
+
/** Remove only logical grouping metadata; all physical row/seat bytes survive. */
|
|
751
|
+
declare function ungroupSegmentedRow(doc: ChartDoc, input: {
|
|
752
|
+
floorId?: string;
|
|
753
|
+
groupId?: string;
|
|
754
|
+
rowId?: string;
|
|
755
|
+
}): SegmentedRowGroupResult;
|
|
756
|
+
/** Fan a safe logical-row presentation/boundary edit to every component. */
|
|
757
|
+
declare function updateSegmentedRow(doc: ChartDoc, input: {
|
|
758
|
+
floorId?: string;
|
|
759
|
+
groupId: string;
|
|
760
|
+
displayLabel?: string;
|
|
761
|
+
boundaries?: Array<'continuous' | 'break'>;
|
|
762
|
+
smoothing?: boolean;
|
|
763
|
+
viewFromSeatUrl?: string | null;
|
|
764
|
+
viewFromSeatMeta?: SeatViewMetadata | null;
|
|
765
|
+
}): SegmentedRowGroupResult;
|
|
766
|
+
interface ReplaceRowBlockInput {
|
|
767
|
+
floorId?: string;
|
|
768
|
+
groupId: string;
|
|
769
|
+
style?: 'multiple' | 'intertwined';
|
|
770
|
+
rowCount?: number;
|
|
771
|
+
seatsPerRow?: number;
|
|
772
|
+
rowGap?: number;
|
|
773
|
+
seatSpacing?: number;
|
|
774
|
+
curve?: number;
|
|
775
|
+
rotation?: number;
|
|
776
|
+
origin?: Point;
|
|
777
|
+
idFactory: ChartObjectIdFactory;
|
|
778
|
+
}
|
|
779
|
+
interface ReplaceRowBlockResult {
|
|
780
|
+
floorId: string;
|
|
781
|
+
groupId: string;
|
|
782
|
+
rowIds: string[];
|
|
783
|
+
createdRowIds: string[];
|
|
784
|
+
removedRowIds: string[];
|
|
785
|
+
changed: boolean;
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Reopen an intact multiple/intertwined generator and regenerate it while
|
|
789
|
+
* preserving every row id by row index and every surviving slot id. If any
|
|
790
|
+
* member lost provenance through a manual edit, the whole operation fails
|
|
791
|
+
* closed instead of overwriting that work.
|
|
792
|
+
*/
|
|
793
|
+
declare function replaceRowBlock(doc: ChartDoc, input: ReplaceRowBlockInput): ReplaceRowBlockResult;
|
|
794
|
+
|
|
795
|
+
interface ReferenceScanRowsOptions {
|
|
796
|
+
floorId?: string;
|
|
797
|
+
/** Category assigned to every materialized row — bookables require one. */
|
|
798
|
+
categoryKey: string;
|
|
799
|
+
idFactory: ChartObjectIdFactory;
|
|
800
|
+
}
|
|
801
|
+
/** A targeted section left untouched because it still holds inventory the scan
|
|
802
|
+
* may not overwrite (hand-authored, or from a different reference). */
|
|
803
|
+
interface ReferenceScanSkippedSection {
|
|
804
|
+
sectionId: string;
|
|
805
|
+
name: string;
|
|
806
|
+
reason: 'section_not_empty';
|
|
807
|
+
objectIds: string[];
|
|
808
|
+
}
|
|
809
|
+
interface ReferenceScanSectionOutcome {
|
|
810
|
+
sectionId: string | null;
|
|
811
|
+
name: string;
|
|
812
|
+
seats: number;
|
|
813
|
+
rows: number;
|
|
814
|
+
}
|
|
815
|
+
interface ReferenceScanPreview {
|
|
816
|
+
totalSeats: number;
|
|
817
|
+
perSection: ReferenceScanSectionOutcome[];
|
|
818
|
+
skipped: ReferenceScanSkippedSection[];
|
|
819
|
+
}
|
|
820
|
+
interface ReferenceScanApplyResult extends ReferenceScanPreview {
|
|
821
|
+
floorId: string;
|
|
822
|
+
assetId: string;
|
|
823
|
+
createdRowIds: string[];
|
|
824
|
+
removedRowIds: string[];
|
|
825
|
+
}
|
|
826
|
+
declare function applyReferenceScanRows(doc: ChartDoc, proposal: ReferenceScanProposal, opts: ReferenceScanRowsOptions): ReferenceScanApplyResult;
|
|
827
|
+
|
|
828
|
+
type SharedRowPatch = Partial<Omit<RowObject, 'type' | 'id' | 'arcFanGeneration' | 'segmentedRow' | 'rowBlockGeneration'>> & {
|
|
829
|
+
/**
|
|
830
|
+
* Coordinate-free label size/color/visibility merge directive. Applied on top
|
|
831
|
+
* of any `labelPresentation` in the same patch and, unlike a geometry edit,
|
|
832
|
+
* never invalidates a row's Arc/Fan generation provenance.
|
|
833
|
+
*/
|
|
834
|
+
labelStyle?: LabelStylePatch;
|
|
835
|
+
/**
|
|
836
|
+
* Row-label end-position preset merge directive (start/end/both/none). Merges
|
|
837
|
+
* into `labelPresentation.positionPreset`, keeps `visible` coherent (none ⇒
|
|
838
|
+
* hidden), and clears any free-drag `position` so the label snaps back to an
|
|
839
|
+
* end. Pure presentation — never invalidates Arc/Fan provenance.
|
|
840
|
+
*/
|
|
841
|
+
labelPosition?: 'start' | 'end' | 'both' | 'none';
|
|
842
|
+
/**
|
|
843
|
+
* Row-label rotation merge directive, degrees [-180,180], merged into
|
|
844
|
+
* `labelPresentation.rotation`. null resets it to 0. Pure presentation.
|
|
845
|
+
*/
|
|
846
|
+
labelRotation?: number | null;
|
|
847
|
+
/**
|
|
848
|
+
* Row-label chrome style merge directive (plain text or a pill), merged into
|
|
849
|
+
* `labelPresentation.style`. Pure presentation.
|
|
850
|
+
*/
|
|
851
|
+
labelStyleShape?: 'plain' | 'pill';
|
|
852
|
+
};
|
|
853
|
+
type SharedTablePatch = Partial<Pick<TableObject, 'label' | 'displayLabel' | 'displayType' | 'shape' | 'seatCount' | 'sides' | 'seatCountsBySide' | 'rotation' | 'radius' | 'seatArc' | 'width' | 'height' | 'categoryKey' | 'bookAsWhole' | 'variableOccupancy' | 'minOccupancy' | 'maxOccupancy'>>;
|
|
854
|
+
type SharedBoothPatch = Partial<Pick<BoothObject, 'label' | 'displayLabel' | 'displayType' | 'width' | 'height' | 'rotation' | 'categoryKey'>> & {
|
|
855
|
+
/** Custom booth outline (closed polygon, local coordinates relative to the
|
|
856
|
+
* booth centre). `null` clears it, restoring the rectangle. */
|
|
857
|
+
points?: Point[] | null;
|
|
858
|
+
};
|
|
859
|
+
type SharedGAAreaPatch = Partial<Pick<GAAreaObject, 'label' | 'displayLabel' | 'displayType' | 'capacity' | 'categoryKey' | 'cornerRadius'>>;
|
|
860
|
+
type SharedShapePatch = Partial<Pick<ShapeObject, 'kind'>> & {
|
|
861
|
+
label?: string | null;
|
|
862
|
+
fill?: string | null;
|
|
863
|
+
/** null clears the outline. `width` is clamped to 0.5–40 chart units. */
|
|
864
|
+
stroke?: {
|
|
865
|
+
color: string;
|
|
866
|
+
width: number;
|
|
867
|
+
} | null;
|
|
868
|
+
/** null clears rounding. Clamped to half the shape's short side (rect only). */
|
|
869
|
+
cornerRadius?: number | null;
|
|
870
|
+
/** Whole-shape opacity, clamped to 0.1–1. null resets to fully opaque. */
|
|
871
|
+
opacity?: number | null;
|
|
872
|
+
/** Physical 3D extrusion in metres. null restores the semantic-role default. */
|
|
873
|
+
heightM?: number | null;
|
|
874
|
+
/** Event layouts that include this structure. null makes it common to all. */
|
|
875
|
+
eventConfigurationIds?: string[] | null;
|
|
876
|
+
/** Open line/polyline only. null restores the legacy round cap. */
|
|
877
|
+
lineCap?: ShapeObject['lineCap'] | null;
|
|
878
|
+
/** Open line/polyline only. null restores the legacy round join. */
|
|
879
|
+
lineJoin?: ShapeObject['lineJoin'] | null;
|
|
880
|
+
/** Open line/polyline only. null restores the legacy undecorated start/end. */
|
|
881
|
+
startEnding?: ShapeObject['startEnding'] | null;
|
|
882
|
+
endEnding?: ShapeObject['endEnding'] | null;
|
|
883
|
+
};
|
|
884
|
+
type SharedTextPatch = Partial<Pick<TextObject, 'text' | 'fontSize' | 'rotation' | 'bold' | 'italic' | 'align' | 'lineHeight' | 'letterSpacing' | 'underline' | 'opacity'>> & {
|
|
885
|
+
/** null clears the per-object override and restores chart-theme inheritance. */
|
|
886
|
+
fontFamily?: string | null;
|
|
887
|
+
color?: string | null;
|
|
888
|
+
width?: number | null;
|
|
889
|
+
background?: TextBackground | null;
|
|
890
|
+
/**
|
|
891
|
+
* Swap a venue icon's vector symbol. Must be a known registry key (fail-closed).
|
|
892
|
+
* Only valid on `semanticKind:'icon'` objects.
|
|
893
|
+
*/
|
|
894
|
+
iconKey?: string;
|
|
895
|
+
};
|
|
896
|
+
|
|
897
|
+
interface BookableGridArrayInput {
|
|
898
|
+
floorId?: string;
|
|
899
|
+
objectIds: string[];
|
|
900
|
+
rows: number;
|
|
901
|
+
columns: number;
|
|
902
|
+
stepX: number;
|
|
903
|
+
stepY: number;
|
|
904
|
+
}
|
|
905
|
+
interface BookableGridArrayPreview {
|
|
906
|
+
floorId: string;
|
|
907
|
+
kind: 'table' | 'booth';
|
|
908
|
+
sourceIds: string[];
|
|
909
|
+
sourceCount: number;
|
|
910
|
+
cells: number;
|
|
911
|
+
createdCount: number;
|
|
912
|
+
addedInventory: number;
|
|
913
|
+
resultingInventory: number;
|
|
914
|
+
provenanceRemovedCount: number;
|
|
915
|
+
}
|
|
916
|
+
declare function previewBookableGridArray(doc: ChartDoc, input: BookableGridArrayInput): BookableGridArrayPreview;
|
|
917
|
+
declare function addBookableGridArray(doc: ChartDoc, input: BookableGridArrayInput & {
|
|
918
|
+
idFactory: ChartObjectIdFactory;
|
|
919
|
+
}): BookableGridArrayPreview & {
|
|
920
|
+
createdIds: string[];
|
|
921
|
+
};
|
|
922
|
+
|
|
923
|
+
interface SeatRef {
|
|
924
|
+
rowId: string;
|
|
925
|
+
index: number;
|
|
926
|
+
}
|
|
927
|
+
/** Semantic fields shared by Designer bulk editing and coordinate-free callers. */
|
|
928
|
+
interface SharedSeatOverridePatch {
|
|
929
|
+
skip?: boolean | null;
|
|
930
|
+
label?: string | null;
|
|
931
|
+
displayLabel?: string | null;
|
|
932
|
+
categoryKey?: string | null;
|
|
933
|
+
accessibility?: AccessibilityType[] | null;
|
|
934
|
+
wheelchairSpaceType?: SeatOverride['wheelchairSpaceType'] | null;
|
|
935
|
+
commercial?: SeatOverride['commercial'] | null;
|
|
936
|
+
viewFromSeatUrl?: string | null;
|
|
937
|
+
viewFromSeatMeta?: SeatViewMetadata | null;
|
|
938
|
+
/** Merge per-seat label size/color (see LabelStylePatch); null clears it. */
|
|
939
|
+
labelStyle?: LabelStylePatch | null;
|
|
940
|
+
/** Designer-only geometry nudges. MCP wrappers deliberately do not expose these. */
|
|
941
|
+
dx?: number | null;
|
|
942
|
+
dy?: number | null;
|
|
943
|
+
}
|
|
944
|
+
/** Stable seat identity is its row/table owner plus immutable numeric slot. The
|
|
945
|
+
* historical `rowId` property name remains wire-compatible for row callers. */
|
|
946
|
+
declare function seatRefId(ref: SeatRef): string;
|
|
947
|
+
declare function parseSeatRefId(seatId: string): SeatRef;
|
|
948
|
+
/**
|
|
949
|
+
* Apply one atomic seat override edit. A literal non-empty label is single-seat
|
|
950
|
+
* only; bulk callers use labelPrefix so generated labels stay unique.
|
|
951
|
+
*/
|
|
952
|
+
declare function updateSeatOverrides(doc: ChartDoc, input: {
|
|
953
|
+
floorId?: string;
|
|
954
|
+
seats: SeatRef[];
|
|
955
|
+
patch: SharedSeatOverridePatch;
|
|
956
|
+
labelPrefix?: string;
|
|
957
|
+
displayLabelPrefix?: string;
|
|
958
|
+
}): {
|
|
959
|
+
floorId: string;
|
|
960
|
+
changed: boolean;
|
|
961
|
+
seatIds: string[];
|
|
962
|
+
};
|
|
963
|
+
/** Remove every override from the requested seats as one atomic operation. */
|
|
964
|
+
declare function resetSeatOverrides(doc: ChartDoc, input: {
|
|
965
|
+
floorId?: string;
|
|
966
|
+
seats: SeatRef[];
|
|
967
|
+
}): {
|
|
968
|
+
floorId: string;
|
|
969
|
+
changed: boolean;
|
|
970
|
+
seatIds: string[];
|
|
971
|
+
};
|
|
972
|
+
|
|
973
|
+
declare function updateRows(doc: ChartDoc, input: {
|
|
974
|
+
floorId?: string;
|
|
975
|
+
rowIds: string[];
|
|
976
|
+
patch: SharedRowPatch;
|
|
977
|
+
preserveCenterOnSeatCountChange?: boolean;
|
|
978
|
+
}): {
|
|
979
|
+
floorId: string;
|
|
980
|
+
changed: boolean;
|
|
981
|
+
rowIds: string[];
|
|
982
|
+
};
|
|
983
|
+
interface MergeRowsResult {
|
|
984
|
+
floorId: string;
|
|
985
|
+
changed: true;
|
|
986
|
+
rowId: string;
|
|
987
|
+
removedRowIds: string[];
|
|
988
|
+
seatCount: number;
|
|
989
|
+
}
|
|
990
|
+
/**
|
|
991
|
+
* Merge 2+ roughly-collinear straight rows into one row, concatenating their seat
|
|
992
|
+
* runs. The geometrically first (lowest-projection) row survives and keeps its
|
|
993
|
+
* identity/label/category/numbering; the merged run is laid uniformly from its
|
|
994
|
+
* seat 0 at its own spacing. Overrides from every row are re-based onto the
|
|
995
|
+
* combined seat index. Refuses when a row is bent/path, the rows aren't parallel,
|
|
996
|
+
* they don't lie on one line, or the merged run would exceed 300 seats.
|
|
997
|
+
*/
|
|
998
|
+
declare function mergeRows(doc: ChartDoc, input: {
|
|
999
|
+
floorId?: string;
|
|
1000
|
+
rowIds: string[];
|
|
1001
|
+
}): MergeRowsResult;
|
|
1002
|
+
interface SplitRowResult {
|
|
1003
|
+
floorId: string;
|
|
1004
|
+
changed: true;
|
|
1005
|
+
rowId: string;
|
|
1006
|
+
newRowId: string;
|
|
1007
|
+
firstSeatCount: number;
|
|
1008
|
+
secondSeatCount: number;
|
|
1009
|
+
newLabel: string;
|
|
1010
|
+
}
|
|
1011
|
+
/**
|
|
1012
|
+
* Split one row into two at a seat position (1..seatCount-1): the first row keeps
|
|
1013
|
+
* seats [0, index) and its identity; a new row takes seats [index, seatCount) with
|
|
1014
|
+
* a derived free label. Seat positions are reproduced exactly — for a circular-arc
|
|
1015
|
+
* row the second row's origin/rotation/curve are recomputed so its seats land on
|
|
1016
|
+
* the originals. Per-seat overrides move with their physical seat (re-based on the
|
|
1017
|
+
* second row). Refuses on a free-form (exact-path) row.
|
|
1018
|
+
*/
|
|
1019
|
+
declare function splitRow(doc: ChartDoc, input: {
|
|
1020
|
+
floorId?: string;
|
|
1021
|
+
rowId: string;
|
|
1022
|
+
index: number;
|
|
1023
|
+
idFactory: ChartObjectIdFactory;
|
|
1024
|
+
}): SplitRowResult;
|
|
1025
|
+
interface RowBlockSpacingResult {
|
|
1026
|
+
floorId: string;
|
|
1027
|
+
changed: boolean;
|
|
1028
|
+
rowIds: string[];
|
|
1029
|
+
gap: number;
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* Set a uniform perpendicular gap between 2+ selected rows, repositioning them
|
|
1033
|
+
* along their common normal while preserving each row's position along the shared
|
|
1034
|
+
* row direction. The lowest-projection row stays put; the rest snap to
|
|
1035
|
+
* base + rank·gap. One logical op.
|
|
1036
|
+
*/
|
|
1037
|
+
declare function setRowBlockSpacing(doc: ChartDoc, input: {
|
|
1038
|
+
floorId?: string;
|
|
1039
|
+
rowIds: string[];
|
|
1040
|
+
gap: number;
|
|
1041
|
+
}): RowBlockSpacingResult;
|
|
1042
|
+
interface StraightenAndSpaceResult {
|
|
1043
|
+
floorId: string;
|
|
1044
|
+
changed: boolean;
|
|
1045
|
+
rowIds: string[];
|
|
1046
|
+
gap: number;
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* One-shot tidy for 2+ selected rows: (a) straighten every row (curve→0, exact
|
|
1050
|
+
* path dropped), (b) align them parallel to the selection's average heading, and
|
|
1051
|
+
* (c) distribute them at a uniform gap equal to the current mean row gap. One
|
|
1052
|
+
* logical op. Overrides are untouched (seat counts and their order are preserved).
|
|
1053
|
+
*/
|
|
1054
|
+
declare function straightenAndSpaceRows(doc: ChartDoc, input: {
|
|
1055
|
+
floorId?: string;
|
|
1056
|
+
rowIds: string[];
|
|
1057
|
+
}): StraightenAndSpaceResult;
|
|
1058
|
+
|
|
1059
|
+
interface JoinGAAreasPreview {
|
|
1060
|
+
floorId: string;
|
|
1061
|
+
areaId: string;
|
|
1062
|
+
survivorLabel: string;
|
|
1063
|
+
removedAreaIds: string[];
|
|
1064
|
+
sourceAreaCount: number;
|
|
1065
|
+
capacity: number;
|
|
1066
|
+
inventorySegmentCount: number;
|
|
1067
|
+
outerVertexCount: number;
|
|
1068
|
+
holeCount: number;
|
|
1069
|
+
sectionId: string;
|
|
1070
|
+
/** Computed geometry is returned for a non-mutating canvas preview and is
|
|
1071
|
+
* regenerated by the apply path rather than trusted as client input. */
|
|
1072
|
+
points: Point[];
|
|
1073
|
+
holes?: Point[][];
|
|
1074
|
+
}
|
|
1075
|
+
/** Non-mutating, deterministic Join Areas preview. No client coordinates are accepted. */
|
|
1076
|
+
declare function previewJoinGAAreas(doc: ChartDoc, input: {
|
|
1077
|
+
floorId?: string;
|
|
1078
|
+
gaAreaIds: string[];
|
|
1079
|
+
}): JoinGAAreasPreview;
|
|
1080
|
+
/** Join 2+ compatible same-floor GA polygons as one atomic document mutation. */
|
|
1081
|
+
declare function joinGAAreas(doc: ChartDoc, input: {
|
|
1082
|
+
floorId?: string;
|
|
1083
|
+
gaAreaIds: string[];
|
|
1084
|
+
}): JoinGAAreasPreview & {
|
|
1085
|
+
changed: true;
|
|
1086
|
+
};
|
|
1087
|
+
|
|
1088
|
+
/**
|
|
1089
|
+
* Stage geometry — turns a compact `StageSpec` into a closed polygon the
|
|
1090
|
+
* renderer can draw with its existing polygon path (`renderShape` → Konva
|
|
1091
|
+
* `Line{closed:true}`). This is deliberately dependency-free geometry: every
|
|
1092
|
+
* stage kind (even the curved ones) is emitted as a sampled `Point[]`, so a
|
|
1093
|
+
* stage renders TODAY as a `ShapeObject{kind:'polygon'}` with zero renderer
|
|
1094
|
+
* changes. The Batch-C renderer upgrade (gradient fill, styled label, stage
|
|
1095
|
+
* role) is then a pure enhancement on top of correct geometry.
|
|
1096
|
+
*
|
|
1097
|
+
* Convention (matches the venue layout): the AUDIENCE sits on the +y side, so
|
|
1098
|
+
* a stage's "front" edge is its +y (bottom) edge and curved/thrust stages bulge
|
|
1099
|
+
* toward +y. `rotation` is in degrees clockwise (same as RowObject.rotation),
|
|
1100
|
+
* applied about the stage center — so a stage can face any direction.
|
|
1101
|
+
*/
|
|
1102
|
+
|
|
1103
|
+
type StageKind = 'rect' | 'rounded' | 'arc' | 'thrust' | 'runway' | 'round';
|
|
1104
|
+
|
|
1105
|
+
declare function updateShapes(doc: ChartDoc, input: {
|
|
1106
|
+
floorId?: string;
|
|
1107
|
+
shapeIds: string[];
|
|
1108
|
+
patch: SharedShapePatch;
|
|
1109
|
+
}): {
|
|
1110
|
+
floorId: string;
|
|
1111
|
+
changed: boolean;
|
|
1112
|
+
shapeIds: string[];
|
|
1113
|
+
};
|
|
1114
|
+
/** Resize non-bookable décor around its current visual centre. This is the
|
|
1115
|
+
* shared semantic counterpart to Designer size sliders: callers choose the
|
|
1116
|
+
* resulting size without handling x/y coordinates or individual vertices. */
|
|
1117
|
+
declare function resizeShapes(doc: ChartDoc, input: {
|
|
1118
|
+
floorId?: string;
|
|
1119
|
+
updates: Array<{
|
|
1120
|
+
shapeId: string;
|
|
1121
|
+
width: number;
|
|
1122
|
+
height: number;
|
|
1123
|
+
}>;
|
|
1124
|
+
}): {
|
|
1125
|
+
floorId: string;
|
|
1126
|
+
changed: boolean;
|
|
1127
|
+
shapes: Array<{
|
|
1128
|
+
id: string;
|
|
1129
|
+
width: number;
|
|
1130
|
+
height: number;
|
|
1131
|
+
}>;
|
|
1132
|
+
};
|
|
1133
|
+
/** Regenerate first-class stage polygons from stable ids and semantic kind enums. */
|
|
1134
|
+
declare function updateStageKinds(doc: ChartDoc, input: {
|
|
1135
|
+
floorId?: string;
|
|
1136
|
+
updates: Array<{
|
|
1137
|
+
stageId: string;
|
|
1138
|
+
stageKind: StageKind;
|
|
1139
|
+
}>;
|
|
1140
|
+
}): {
|
|
1141
|
+
floorId: string;
|
|
1142
|
+
changed: boolean;
|
|
1143
|
+
stages: Array<{
|
|
1144
|
+
id: string;
|
|
1145
|
+
stageKind: StageKind;
|
|
1146
|
+
}>;
|
|
1147
|
+
};
|
|
1148
|
+
|
|
1149
|
+
declare function updateTables(doc: ChartDoc, input: {
|
|
1150
|
+
floorId?: string;
|
|
1151
|
+
tableIds: string[];
|
|
1152
|
+
patch: SharedTablePatch;
|
|
1153
|
+
}): {
|
|
1154
|
+
floorId: string;
|
|
1155
|
+
changed: boolean;
|
|
1156
|
+
tableIds: string[];
|
|
1157
|
+
};
|
|
1158
|
+
declare function updateBooths(doc: ChartDoc, input: {
|
|
1159
|
+
floorId?: string;
|
|
1160
|
+
boothIds: string[];
|
|
1161
|
+
patch: SharedBoothPatch;
|
|
1162
|
+
}): {
|
|
1163
|
+
floorId: string;
|
|
1164
|
+
changed: boolean;
|
|
1165
|
+
boothIds: string[];
|
|
1166
|
+
};
|
|
1167
|
+
declare function updateGAAreas(doc: ChartDoc, input: {
|
|
1168
|
+
floorId?: string;
|
|
1169
|
+
gaAreaIds: string[];
|
|
1170
|
+
patch: SharedGAAreaPatch;
|
|
1171
|
+
}): {
|
|
1172
|
+
floorId: string;
|
|
1173
|
+
changed: boolean;
|
|
1174
|
+
gaAreaIds: string[];
|
|
1175
|
+
};
|
|
1176
|
+
/** Update non-bookable shape presentation. MCP wrappers expose label/fill only. */
|
|
1177
|
+
/**
|
|
1178
|
+
* How much bookable inventory an opening (hole) at `polygon` would move out of
|
|
1179
|
+
* its section under today's whole-object, centre-based ownership rule. A row or
|
|
1180
|
+
* table whose centre enters the opening contributes every real unskipped chair;
|
|
1181
|
+
* a crossing object whose centre stays outside contributes none. GA areas retain
|
|
1182
|
+
* aggregate capacity and booths remain atomic. This keeps the warning aligned
|
|
1183
|
+
* with actual Section membership rather than implying unsupported seat-level
|
|
1184
|
+
* ownership. Sections and décor are not inventory, so they never count.
|
|
1185
|
+
*/
|
|
1186
|
+
declare function countCoveredInventory(objects: ChartObject[], polygon: Point[]): number;
|
|
1187
|
+
/** Remove existing top-level chart objects by stable id, preserving every unselected object exactly. */
|
|
1188
|
+
declare function removeChartObjects(doc: ChartDoc, input: {
|
|
1189
|
+
floorId?: string;
|
|
1190
|
+
objectIds: string[];
|
|
1191
|
+
}): {
|
|
1192
|
+
floorId: string;
|
|
1193
|
+
changed: true;
|
|
1194
|
+
removedObjects: Array<{
|
|
1195
|
+
id: string;
|
|
1196
|
+
type: ChartObject['type'];
|
|
1197
|
+
}>;
|
|
1198
|
+
removedInventory: number;
|
|
1199
|
+
remainingObjectCount: number;
|
|
1200
|
+
};
|
|
1201
|
+
/** Update free-text presentation while preserving its stable position. */
|
|
1202
|
+
declare function updateTextObjects(doc: ChartDoc, input: {
|
|
1203
|
+
floorId?: string;
|
|
1204
|
+
textIds: string[];
|
|
1205
|
+
patch: SharedTextPatch;
|
|
1206
|
+
}): {
|
|
1207
|
+
floorId: string;
|
|
1208
|
+
changed: boolean;
|
|
1209
|
+
textIds: string[];
|
|
1210
|
+
};
|
|
1211
|
+
declare function relabelChartRows(doc: ChartDoc, input: {
|
|
1212
|
+
floorId?: string;
|
|
1213
|
+
rowIds: string[];
|
|
1214
|
+
options: RelabelOptions;
|
|
1215
|
+
}): {
|
|
1216
|
+
floorId: string;
|
|
1217
|
+
changed: boolean;
|
|
1218
|
+
rows: Array<{
|
|
1219
|
+
id: string;
|
|
1220
|
+
label: string;
|
|
1221
|
+
}>;
|
|
1222
|
+
};
|
|
1223
|
+
declare function insertSeatingBlock(doc: ChartDoc, input: {
|
|
1224
|
+
floorId?: string;
|
|
1225
|
+
blockKey: string;
|
|
1226
|
+
center: Point;
|
|
1227
|
+
idFactory: ChartObjectIdFactory;
|
|
1228
|
+
}): {
|
|
1229
|
+
floorId: string;
|
|
1230
|
+
blockKey: string;
|
|
1231
|
+
createdIds: string[];
|
|
1232
|
+
sectionId: string | null;
|
|
1233
|
+
};
|
|
1234
|
+
|
|
1235
|
+
export { type AddBoothArrayInput, type AddGAAreaInput, type AddRowBlockInput, type AddTableArrayInput, type ArcFanRowsInput, type ArcFanRowsPreview, type AutomaticPlacement, type BookableGridArrayInput, type BookableGridArrayPreview, COLORBLIND_SAFE_PALETTE, type ChartObjectIdFactory, ChartOperationError, DEFAULT_FLOOR_HEIGHT_STEP_M, type GeneratedSectionPolygonConversionPreview, type JoinGAAreasPreview, type LabelStylePatch, MAX_FLOOR_BASE_HEIGHT_M, type MergeRowsResult, type PolygonHolePreview, type ReassignColorblindSafeResult, type ReferenceScanApplyResult, type ReferenceScanPreview, type ReferenceScanRowsOptions, type ReferenceScanSectionOutcome, type ReferenceScanSkippedSection, type ReplaceRowBlockInput, type ReplaceRowBlockResult, type ResolveCreationCategoryOptions, type RowBlockSpacingResult, type RowCubicPathPreview, type SeatRef, type SectionBoundaryTransform, type SectionBoundaryTransformResult, type SectionInventorySelectionSummary, type SectionRowFitInput, type SectionRowFitPreview, type SegmentedRowGroupResult, type SharedBoothPatch, type SharedCategoryPatch, type SharedGAAreaPatch, type SharedRowPatch, type SharedSeatOverridePatch, type SharedSectionMetadataPatch, type SharedShapePatch, type SharedTablePatch, type SharedTextPatch, type SharedThemePatch, type SharedZonePatch, type SplitRowResult, type StraightenAndSpaceResult, addArcFanRows, addBookableGridArray, addBoothArray, addChartCategory, addChartFloor, addChartZone, addGAArea, addRowBlock, addTableArray, applyPolygonHole, applyReferenceScanRows, applySectionCornerSmoothing, applySectionOutlineShaping, applySectionRowFit, arcFanInputForGroup, assignSectionInventoryCategory, automaticPlacementCenter, confirmReferenceCategoryOutputColor, convertGeneratedSectionToPolygon, countCoveredInventory, familyCategoryLabel, gaAreaFootprint, groupRowsAsSegmented, insertSeatingBlock, joinGAAreas, mergeRows, mirrorFirstFloor, parseSeatRefId, pickColorblindSafeCategoryColor, previewArcFanRows, previewBookableGridArray, previewGeneratedSectionPolygonConversion, previewJoinGAAreas, previewPolygonHole, previewRemovePolygonHole, previewRowCubicPath, previewSectionRowFit, reassignColorblindSafeCategoryColors, relabelChartRows, removeChartCategory, removeChartFloor, removeChartObjects, removeChartZone, removePolygonHole, renameChartFloor, reorderChartCategories, replaceArcFanRows, replaceRowBlock, resetSeatOverrides, resizeShapes, resolveCreationCategory, seatRefId, sectionInventorySelectionSummary, setRowBlockSpacing, splitRow, straightenAndSpaceRows, transformSectionBoundary, transformSectionBoundaryObject, ungroupSegmentedRow, updateBooths, updateCategoryDefinitions, updateChartFloorBaseHeight, updateChartTheme, updateChartZones, updateGAAreas, updateRowCubicPath, updateRows, updateSeatOverrides, updateSectionExactPath, updateSectionMetadata, updateSegmentedRow, updateShapes, updateStageKinds, updateTables, updateTextObjects, updateViewFromSeatFallback };
|