@seatlayer/core 0.35.0 → 0.36.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.
@@ -328,6 +328,44 @@ function transformSectionOutlinePath(path, transform, radiusScale = 1, reflected
328
328
  }
329
329
  var SAGITTA_TO_CONTROL = 4 / 3;
330
330
 
331
+ // src/core/segmentedRowModel.ts
332
+ function resolveSegmentedRowGroups(objects) {
333
+ const segmented = /* @__PURE__ */ new Map();
334
+ const grouped = /* @__PURE__ */ new Map();
335
+ for (const object of objects) {
336
+ if (object.type !== "row" || !object.segmentedRow) continue;
337
+ const list = grouped.get(object.segmentedRow.groupId) ?? [];
338
+ list.push(object);
339
+ grouped.set(object.segmentedRow.groupId, list);
340
+ }
341
+ for (const [groupId, members] of grouped) {
342
+ const ordered = members.slice().sort((left, right) => left.segmentedRow.componentIndex - right.segmentedRow.componentIndex);
343
+ const expectedCount = ordered[0]?.segmentedRow?.componentCount ?? 0;
344
+ const first = ordered[0]?.segmentedRow;
345
+ if (!first) continue;
346
+ const valid = expectedCount >= 2 && ordered.length === expectedCount && first?.boundaryBefore === "start" && ordered.every((row, index) => row.segmentedRow?.kind === "segmented-row-v1" && row.segmentedRow.groupId === groupId && row.segmentedRow.componentCount === expectedCount && row.segmentedRow.componentIndex === index && (index === 0 ? row.segmentedRow.boundaryBefore === "start" : row.segmentedRow.boundaryBefore !== "start") && row.segmentedRow.displayLabel === first.displayLabel);
347
+ if (!valid) continue;
348
+ const totalSeats = ordered.reduce((sum, row) => sum + row.seatCount, 0);
349
+ let adjacencyOffset = 0;
350
+ let displayOffset = 0;
351
+ for (const row of ordered) {
352
+ if (row.segmentedRow.boundaryBefore === "break") adjacencyOffset += 1;
353
+ segmented.set(row.id, {
354
+ groupId,
355
+ adjacencyOffset,
356
+ displayOffset,
357
+ displayLabel: first.displayLabel,
358
+ totalSeats,
359
+ canonical: ordered[0],
360
+ viewFromSeatUrl: first.viewFromSeatUrl
361
+ });
362
+ adjacencyOffset += row.seatCount;
363
+ displayOffset += row.seatCount;
364
+ }
365
+ }
366
+ return segmented;
367
+ }
368
+
331
369
  // src/core/labeling.ts
332
370
  var FULL_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
333
371
  var LOWER_ALPHABET = "abcdefghijklmnopqrstuvwxyz";
@@ -375,6 +413,78 @@ function toRoman(value) {
375
413
  return out;
376
414
  }
377
415
 
416
+ // src/core/seatNumbering.ts
417
+ function centerRank(n) {
418
+ const rank = new Array(n);
419
+ Array.from({ length: n }, (_, i) => i).sort((a, b) => Math.abs(2 * a - (n - 1)) - Math.abs(2 * b - (n - 1)) || a - b).forEach((idx, k) => rank[idx] = k);
420
+ return rank;
421
+ }
422
+ function seatLabelPart(row, i) {
423
+ const rawStart = row.seatLabelStart ?? 1;
424
+ const dir = row.seatNumbering?.direction ?? "ltr";
425
+ const step = row.seatNumbering?.step ?? 1;
426
+ const scheme = row.seatNumbering?.scheme ?? "decimal";
427
+ const prefix = row.seatNumbering?.prefix ?? "";
428
+ const endAt = row.seatNumbering?.endAt;
429
+ const n = row.seatCount;
430
+ if (scheme === "updown" || scheme === "updown-descending") {
431
+ const half = Math.ceil(n / 2);
432
+ const core2 = scheme === "updown" ? i < half ? rawStart + 2 * i : rawStart - 1 + 2 * (n - i) : i < half ? rawStart + 2 * (half - 1 - i) : rawStart + 1 + 2 * (i - half);
433
+ return `${prefix}${core2}`;
434
+ }
435
+ const effStep = scheme === "odd" || scheme === "even" ? 2 : step;
436
+ const start = endAt != null && Number.isFinite(endAt) ? endAt - (n - 1) * effStep : rawStart;
437
+ const p = dir === "center" ? centerRank(n)[i] : dir === "rtl" ? n - 1 - i : i;
438
+ let core;
439
+ switch (scheme) {
440
+ case "odd": {
441
+ const firstOdd = start % 2 === 1 ? start : start + 1;
442
+ core = String(firstOdd + p * 2);
443
+ break;
444
+ }
445
+ case "even": {
446
+ const firstEven = start % 2 === 0 ? start : start + 1;
447
+ core = String(firstEven + p * 2);
448
+ break;
449
+ }
450
+ case "roman":
451
+ core = toRoman(start + p * step);
452
+ break;
453
+ case "letters-upper":
454
+ core = toLetters(start + p * step, false);
455
+ break;
456
+ case "letters-lower":
457
+ core = toLetters(start + p * step, true);
458
+ break;
459
+ case "decimal":
460
+ default:
461
+ core = String(start + p * step);
462
+ break;
463
+ }
464
+ return `${prefix}${core}`;
465
+ }
466
+ function logicalNumberingRow(placement) {
467
+ return {
468
+ ...placement.canonical,
469
+ seatCount: placement.totalSeats,
470
+ label: placement.displayLabel,
471
+ displayLabel: placement.displayLabel
472
+ };
473
+ }
474
+ function seatInventoryLabel(row, physicalIndex, override) {
475
+ return override?.label ?? `${row.label}-${seatLabelPart(row, physicalIndex)}`;
476
+ }
477
+ function seatDisplayLabel(row, physicalIndex, placement, override) {
478
+ if (override?.displayLabel) return override.displayLabel;
479
+ if (!placement) {
480
+ const prefix = row.displayLabel ?? row.label;
481
+ return `${prefix}-${seatLabelPart(row, physicalIndex)}`;
482
+ }
483
+ const numberingRow = logicalNumberingRow(placement);
484
+ const ordinal = placement.displayOffset + physicalIndex;
485
+ return `${placement.displayLabel}-${seatLabelPart(numberingRow, ordinal)}`;
486
+ }
487
+
378
488
  // src/core/venueStructure.ts
379
489
  var BLOCK_LINK_RATIO = 1.8;
380
490
  function probesOf(pts) {
@@ -766,70 +876,19 @@ function rowInventoryCount(row) {
766
876
  const skipped = new Set((row.overrides ?? []).filter((override) => override.skip && Number.isInteger(override.index) && override.index >= 0 && override.index < row.seatCount).map((override) => override.index));
767
877
  return Math.max(0, row.seatCount - skipped.size);
768
878
  }
769
- function centerRank(n) {
770
- const rank = new Array(n);
771
- Array.from({ length: n }, (_, i) => i).sort((a, b) => Math.abs(2 * a - (n - 1)) - Math.abs(2 * b - (n - 1)) || a - b).forEach((idx, k) => rank[idx] = k);
772
- return rank;
773
- }
774
- function seatLabelPart(row, i) {
775
- const rawStart = row.seatLabelStart ?? 1;
776
- const dir = row.seatNumbering?.direction ?? "ltr";
777
- const step = row.seatNumbering?.step ?? 1;
778
- const scheme = row.seatNumbering?.scheme ?? "decimal";
779
- const prefix = row.seatNumbering?.prefix ?? "";
780
- const endAt = row.seatNumbering?.endAt;
781
- const n = row.seatCount;
782
- if (scheme === "updown" || scheme === "updown-descending") {
783
- const half = Math.ceil(n / 2);
784
- const core2 = scheme === "updown" ? i < half ? rawStart + 2 * i : rawStart - 1 + 2 * (n - i) : i < half ? rawStart + 2 * (half - 1 - i) : rawStart + 1 + 2 * (i - half);
785
- return `${prefix}${core2}`;
786
- }
787
- const effStep = scheme === "odd" || scheme === "even" ? 2 : step;
788
- const start = endAt != null && Number.isFinite(endAt) ? endAt - (n - 1) * effStep : rawStart;
789
- const p = dir === "center" ? centerRank(n)[i] : dir === "rtl" ? n - 1 - i : i;
790
- let core;
791
- switch (scheme) {
792
- case "odd": {
793
- const firstOdd = start % 2 === 1 ? start : start + 1;
794
- core = String(firstOdd + p * 2);
795
- break;
796
- }
797
- case "even": {
798
- const firstEven = start % 2 === 0 ? start : start + 1;
799
- core = String(firstEven + p * 2);
800
- break;
801
- }
802
- case "roman":
803
- core = toRoman(start + p * step);
804
- break;
805
- case "letters-upper":
806
- core = toLetters(start + p * step, false);
807
- break;
808
- case "letters-lower":
809
- core = toLetters(start + p * step, true);
810
- break;
811
- case "decimal":
812
- default:
813
- core = String(start + p * step);
814
- break;
815
- }
816
- return `${prefix}${core}`;
817
- }
818
- function expandRowSlots(row) {
879
+ function expandRowSlots(row, placement) {
819
880
  const ov = overrideMap(row);
820
881
  return rowSeatPositions(row).map((p, i) => {
821
882
  const o = ov.get(i);
822
883
  const accessibility = overrideAccessibility(o);
823
- const part = seatLabelPart(row, i);
824
- const inventoryLabel = o?.label ?? `${row.label}-${part}`;
825
- const displayPrefix = row.displayLabel ?? row.label;
884
+ const inventoryLabel = seatInventoryLabel(row, i, o);
826
885
  const commercial = { ...row.commercial, ...o?.commercial };
827
886
  return {
828
887
  index: i,
829
888
  x: p.x + (o?.dx ?? 0),
830
889
  y: p.y + (o?.dy ?? 0),
831
890
  label: inventoryLabel,
832
- displayLabel: o?.displayLabel ?? `${displayPrefix}-${part}`,
891
+ displayLabel: seatDisplayLabel(row, i, placement, o),
833
892
  categoryKey: o?.categoryKey ?? row.categoryKey,
834
893
  skipped: !!o?.skip,
835
894
  accessible: accessibility.length > 0,
@@ -1130,39 +1189,7 @@ function stackFloors(doc, spread = 900) {
1130
1189
  }
1131
1190
  function expandFloorObjects(objects, zones, fallbackFocal, viewFallback) {
1132
1191
  const out = [];
1133
- const segmented = /* @__PURE__ */ new Map();
1134
- const grouped = /* @__PURE__ */ new Map();
1135
- for (const object of objects) {
1136
- if (object.type !== "row" || !object.segmentedRow) continue;
1137
- const list = grouped.get(object.segmentedRow.groupId) ?? [];
1138
- list.push(object);
1139
- grouped.set(object.segmentedRow.groupId, list);
1140
- }
1141
- for (const [groupId, members] of grouped) {
1142
- const ordered = members.slice().sort((left, right) => left.segmentedRow.componentIndex - right.segmentedRow.componentIndex);
1143
- const expectedCount = ordered[0]?.segmentedRow?.componentCount ?? 0;
1144
- const first = ordered[0]?.segmentedRow;
1145
- if (!first) continue;
1146
- const valid = expectedCount >= 2 && ordered.length === expectedCount && first?.boundaryBefore === "start" && ordered.every((row, index) => row.segmentedRow?.kind === "segmented-row-v1" && row.segmentedRow.groupId === groupId && row.segmentedRow.componentCount === expectedCount && row.segmentedRow.componentIndex === index && (index === 0 ? row.segmentedRow.boundaryBefore === "start" : row.segmentedRow.boundaryBefore !== "start") && row.segmentedRow.displayLabel === first.displayLabel);
1147
- if (!valid) continue;
1148
- const totalSeats = ordered.reduce((sum, row) => sum + row.seatCount, 0);
1149
- let adjacencyOffset = 0;
1150
- let displayOffset = 0;
1151
- for (const row of ordered) {
1152
- if (row.segmentedRow.boundaryBefore === "break") adjacencyOffset += 1;
1153
- segmented.set(row.id, {
1154
- groupId,
1155
- adjacencyOffset,
1156
- displayOffset,
1157
- displayLabel: first.displayLabel,
1158
- totalSeats,
1159
- canonical: ordered[0],
1160
- viewFromSeatUrl: first.viewFromSeatUrl
1161
- });
1162
- adjacencyOffset += row.seatCount;
1163
- displayOffset += row.seatCount;
1164
- }
1165
- }
1192
+ const segmented = resolveSegmentedRowGroups(objects);
1166
1193
  for (const obj of objects) {
1167
1194
  let seats = [];
1168
1195
  if (obj.type === "row") seats = expandRow(obj);
@@ -1176,17 +1203,10 @@ function expandFloorObjects(objects, zones, fallbackFocal, viewFallback) {
1176
1203
  for (const seat of seats) {
1177
1204
  const physicalIndex = Number(seat.id.slice(seat.id.lastIndexOf(":") + 1));
1178
1205
  if (!Number.isInteger(physicalIndex)) continue;
1179
- const displayOrdinal = logical.displayOffset + physicalIndex;
1180
1206
  seat.logicalRowId = logical.groupId;
1181
1207
  seat.logicalSeatIndex = logical.adjacencyOffset + physicalIndex;
1182
1208
  if (!overrides.get(physicalIndex)?.displayLabel) {
1183
- const numberingRow = {
1184
- ...logical.canonical,
1185
- seatCount: logical.totalSeats,
1186
- label: logical.displayLabel,
1187
- displayLabel: logical.displayLabel
1188
- };
1189
- seat.displayLabel = `${logical.displayLabel}-${seatLabelPart(numberingRow, displayOrdinal)}`;
1209
+ seat.displayLabel = seatDisplayLabel(obj, physicalIndex, logical);
1190
1210
  }
1191
1211
  seat.viewUrl ??= logical.viewFromSeatUrl;
1192
1212
  }
@@ -1352,7 +1372,6 @@ export {
1352
1372
  resolveSection,
1353
1373
  rowSeatPositions,
1354
1374
  rowInventoryCount,
1355
- seatLabelPart,
1356
1375
  expandRowSlots,
1357
1376
  expandRow,
1358
1377
  tableSeatCountsBySide,
@@ -1372,4 +1391,4 @@ export {
1372
1391
  expandChart,
1373
1392
  chartBounds
1374
1393
  };
1375
- //# sourceMappingURL=chunk-MGC5BVAD.js.map
1394
+ //# sourceMappingURL=chunk-5MRJCIZP.js.map