@seatlayer/core 0.21.1 → 0.23.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.
@@ -69,9 +69,15 @@ var de = {
69
69
  "picker.on": "AN",
70
70
  "picker.off": "AUS",
71
71
  "picker.panorama360": "360\xB0-Veranstaltungsfotos",
72
- "picker.illustrationCaption": "Illustration \xB7 \u2248 {m} m von der B\xFChne"
72
+ "picker.illustrationCaption": "Illustration \xB7 \u2248 {m} m von der B\xFChne",
73
+ "picker.restrictedView": "Eingeschr\xE4nkte Sicht",
74
+ "picker.obstructedView": "Sichtbehinderung",
75
+ "picker.premiumSeat": "Premium-Platz",
76
+ "picker.hideLimitedView": "Pl\xE4tze mit eingeschr\xE4nkter Sicht ausblenden",
77
+ "picker.bestSeatsPremium": "Beste Pl\xE4tze",
78
+ "picker.premiumFallbackNote": "Kein Premium-Block mit {count} Pl\xE4tzen \u2014 beste verf\xFCgbare werden angezeigt"
73
79
  };
74
80
  export {
75
81
  de
76
82
  };
77
- //# sourceMappingURL=de-HLJXYBWA.js.map
83
+ //# sourceMappingURL=de-DRWMZ2FV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/locales/de.ts"],"sourcesContent":["/**\n * German bundle — native-quality translations of the English reference dictionary.\n * Keys are identical to en.ts; values are translated to German (de).\n *\n * Conventions:\n * - flat dot-namespaced keys: \"<surface>.<element>\" (picker.holdSeats)\n * - {name} interpolation, {count} reserved for tCount plural keys\n * - plural keys end in \".one\" / \".other\" (Intl.PluralRules categories)\n */\n\nimport type { Dict } from '../index';\n\nexport const de: Dict = {\n // shared\n 'common.cancel': 'Abbrechen',\n 'common.close': 'Schließen',\n 'common.done': 'Fertig',\n 'common.copied': '✓ Kopiert',\n\n // buyer picker (extraction in progress — P4 of the port plan)\n 'picker.holdSeats': 'Plätze reservieren & Kasse',\n 'picker.completeBooking': 'Buchung abschließen',\n 'picker.seatsHeld': 'Plätze reserviert — {time}',\n 'picker.holdExpired': 'Ihre Reservierung ist abgelaufen — die Plätze wurden freigegeben. Bitte erneut auswählen.',\n 'picker.seatTaken': 'Platz {label} wurde gerade von einem anderen Käufer gebucht.',\n 'picker.poweredBy': 'Bereitgestellt von SeatLayer',\n 'picker.testMode': 'TESTMODUS',\n 'picker.colorblind': 'Farbenblind-freundliche Farben',\n 'picker.orphanHint': 'Dadurch bleibt ein einzelner Platz übrig — rücken Sie ggf. einen Platz weiter.',\n 'picker.seats.one': '{count} Platz',\n 'picker.seats.other': '{count} Plätze',\n\n // renderer (drawn on the Konva map — shared by the embed SDK)\n 'map.aria': 'Sitzplan. Mit Pfeiltasten zwischen Plätzen navigieren, Eingabe zum Auswählen.',\n 'map.seatsLeft': '{count} FREI',\n 'map.statusHeld': 'Reserviert',\n 'map.statusTaken': 'Vergeben',\n 'map.fromPrice': 'AB {price}',\n\n // buyer picker page (src/pages/PickerPage.tsx)\n 'picker.language': 'Sprache',\n 'picker.zoomToFit': 'Auf Größe anpassen',\n 'picker.seatCountLabel': 'Plätze',\n 'picker.capacity': 'Kapazität',\n 'picker.viewMode': 'Ansichtsmodus',\n 'picker.floor': 'Etage',\n 'picker.zoomLevel': 'Zoomstufe',\n 'picker.rungTip.zones': 'Übersicht — Bereichsgruppen wie Nordtribüne oder VIP',\n 'picker.rungTip.sections': 'Bereichs-Blöcke — Kategoriesortierung + Verfügbarkeitstönung',\n 'picker.rungTip.seats': 'Einzelne Plätze — Blöcke lösen sich zu Punkten auf',\n 'picker.rungLabel.zones': 'ZONEN',\n 'picker.rungLabel.sections': 'BEREICHE',\n 'picker.rungLabel.seats': 'PLÄTZE',\n 'picker.sectionSummaryAria': 'Bereichszusammenfassung {label}',\n 'picker.closeSectionSummary': 'Bereichszusammenfassung schließen',\n 'picker.seatsLeftInSection.one': '{count} Platz verfügbar',\n 'picker.seatsLeftInSection.other': '{count} Plätze verfügbar',\n 'picker.overview': 'Übersicht',\n 'picker.tapSeatHint': 'Tippen Sie auf einen Platz, um die Ansicht zu prüfen',\n 'picker.chartSize': 'Kartengröße',\n 'picker.custom': 'Benutzerdefiniert',\n 'picker.categories': 'Kategorien',\n 'picker.accessibility': 'Barrierefreiheit',\n 'picker.showAnyAccessible': 'Jeden barrierefreien Platz anzeigen',\n 'picker.any': 'Beliebig',\n 'picker.yourSeats': 'Ihre Plätze',\n 'picker.emptySeats': 'Tippen Sie auf die Plätze auf der Karte',\n 'picker.emptySeatsWithGa': 'Tippen Sie auf die Plätze auf der Karte · tippen Sie auf einen Stehbereich für Stehplatztickets',\n 'picker.oneFewer': 'Einen weniger',\n 'picker.oneMore': 'Einen mehr',\n 'picker.remove': '{label} entfernen',\n 'picker.ticketTierFor': 'Ticketklasse für {label}',\n 'picker.total': 'Gesamt: {amount}',\n 'picker.viewFromSeat': 'Ansicht von Platz {label}',\n 'picker.real360': 'REAL 360°',\n 'picker.preview': 'VORSCHAU',\n 'picker.open360': 'Öffnen Sie die 360°-Ansicht',\n 'picker.sightline': '≈ {m} m zur Bühne · freie Sicht',\n 'picker.bookedDemo': 'Gebucht! (Demo)',\n 'picker.bookButton.one': '{count} Ticket buchen — {amount}',\n 'picker.bookButton.other': '{count} Tickets buchen — {amount}',\n 'picker.simulateCrowd': 'Menschenmenge simulieren: {state}',\n 'picker.on': 'AN',\n 'picker.off': 'AUS',\n 'picker.panorama360': '360°-Veranstaltungsfotos',\n 'picker.illustrationCaption': 'Illustration · ≈ {m} m von der Bühne',\n};\n"],"mappings":";AAYO,IAAM,KAAW;AAAA;AAAA,EAEtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAChC;","names":[]}
1
+ {"version":3,"sources":["../src/i18n/locales/de.ts"],"sourcesContent":["/**\n * German bundle — native-quality translations of the English reference dictionary.\n * Keys are identical to en.ts; values are translated to German (de).\n *\n * Conventions:\n * - flat dot-namespaced keys: \"<surface>.<element>\" (picker.holdSeats)\n * - {name} interpolation, {count} reserved for tCount plural keys\n * - plural keys end in \".one\" / \".other\" (Intl.PluralRules categories)\n */\n\nimport type { Dict } from '../index';\n\nexport const de: Dict = {\n // shared\n 'common.cancel': 'Abbrechen',\n 'common.close': 'Schließen',\n 'common.done': 'Fertig',\n 'common.copied': '✓ Kopiert',\n\n // buyer picker (extraction in progress — P4 of the port plan)\n 'picker.holdSeats': 'Plätze reservieren & Kasse',\n 'picker.completeBooking': 'Buchung abschließen',\n 'picker.seatsHeld': 'Plätze reserviert — {time}',\n 'picker.holdExpired': 'Ihre Reservierung ist abgelaufen — die Plätze wurden freigegeben. Bitte erneut auswählen.',\n 'picker.seatTaken': 'Platz {label} wurde gerade von einem anderen Käufer gebucht.',\n 'picker.poweredBy': 'Bereitgestellt von SeatLayer',\n 'picker.testMode': 'TESTMODUS',\n 'picker.colorblind': 'Farbenblind-freundliche Farben',\n 'picker.orphanHint': 'Dadurch bleibt ein einzelner Platz übrig — rücken Sie ggf. einen Platz weiter.',\n 'picker.seats.one': '{count} Platz',\n 'picker.seats.other': '{count} Plätze',\n\n // renderer (drawn on the Konva map — shared by the embed SDK)\n 'map.aria': 'Sitzplan. Mit Pfeiltasten zwischen Plätzen navigieren, Eingabe zum Auswählen.',\n 'map.seatsLeft': '{count} FREI',\n 'map.statusHeld': 'Reserviert',\n 'map.statusTaken': 'Vergeben',\n 'map.fromPrice': 'AB {price}',\n\n // buyer picker page (src/pages/PickerPage.tsx)\n 'picker.language': 'Sprache',\n 'picker.zoomToFit': 'Auf Größe anpassen',\n 'picker.seatCountLabel': 'Plätze',\n 'picker.capacity': 'Kapazität',\n 'picker.viewMode': 'Ansichtsmodus',\n 'picker.floor': 'Etage',\n 'picker.zoomLevel': 'Zoomstufe',\n 'picker.rungTip.zones': 'Übersicht — Bereichsgruppen wie Nordtribüne oder VIP',\n 'picker.rungTip.sections': 'Bereichs-Blöcke — Kategoriesortierung + Verfügbarkeitstönung',\n 'picker.rungTip.seats': 'Einzelne Plätze — Blöcke lösen sich zu Punkten auf',\n 'picker.rungLabel.zones': 'ZONEN',\n 'picker.rungLabel.sections': 'BEREICHE',\n 'picker.rungLabel.seats': 'PLÄTZE',\n 'picker.sectionSummaryAria': 'Bereichszusammenfassung {label}',\n 'picker.closeSectionSummary': 'Bereichszusammenfassung schließen',\n 'picker.seatsLeftInSection.one': '{count} Platz verfügbar',\n 'picker.seatsLeftInSection.other': '{count} Plätze verfügbar',\n 'picker.overview': 'Übersicht',\n 'picker.tapSeatHint': 'Tippen Sie auf einen Platz, um die Ansicht zu prüfen',\n 'picker.chartSize': 'Kartengröße',\n 'picker.custom': 'Benutzerdefiniert',\n 'picker.categories': 'Kategorien',\n 'picker.accessibility': 'Barrierefreiheit',\n 'picker.showAnyAccessible': 'Jeden barrierefreien Platz anzeigen',\n 'picker.any': 'Beliebig',\n 'picker.yourSeats': 'Ihre Plätze',\n 'picker.emptySeats': 'Tippen Sie auf die Plätze auf der Karte',\n 'picker.emptySeatsWithGa': 'Tippen Sie auf die Plätze auf der Karte · tippen Sie auf einen Stehbereich für Stehplatztickets',\n 'picker.oneFewer': 'Einen weniger',\n 'picker.oneMore': 'Einen mehr',\n 'picker.remove': '{label} entfernen',\n 'picker.ticketTierFor': 'Ticketklasse für {label}',\n 'picker.total': 'Gesamt: {amount}',\n 'picker.viewFromSeat': 'Ansicht von Platz {label}',\n 'picker.real360': 'REAL 360°',\n 'picker.preview': 'VORSCHAU',\n 'picker.open360': 'Öffnen Sie die 360°-Ansicht',\n 'picker.sightline': '≈ {m} m zur Bühne · freie Sicht',\n 'picker.bookedDemo': 'Gebucht! (Demo)',\n 'picker.bookButton.one': '{count} Ticket buchen — {amount}',\n 'picker.bookButton.other': '{count} Tickets buchen — {amount}',\n 'picker.simulateCrowd': 'Menschenmenge simulieren: {state}',\n 'picker.on': 'AN',\n 'picker.off': 'AUS',\n 'picker.panorama360': '360°-Veranstaltungsfotos',\n 'picker.illustrationCaption': 'Illustration · ≈ {m} m von der Bühne',\n 'picker.restrictedView': 'Eingeschränkte Sicht',\n 'picker.obstructedView': 'Sichtbehinderung',\n 'picker.premiumSeat': 'Premium-Platz',\n 'picker.hideLimitedView': 'Plätze mit eingeschränkter Sicht ausblenden',\n 'picker.bestSeatsPremium': 'Beste Plätze',\n 'picker.premiumFallbackNote': 'Kein Premium-Block mit {count} Plätzen — beste verfügbare werden angezeigt',\n};\n"],"mappings":";AAYO,IAAM,KAAW;AAAA;AAAA,EAEtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,8BAA8B;AAChC;","names":[]}
@@ -69,9 +69,15 @@ var es = {
69
69
  "picker.on": "ACTIVADO",
70
70
  "picker.off": "DESACTIVADO",
71
71
  "picker.panorama360": "Foto de 360\xB0 del lugar",
72
- "picker.illustrationCaption": "ilustraci\xF3n \xB7 \u2248 {m} m del escenario"
72
+ "picker.illustrationCaption": "ilustraci\xF3n \xB7 \u2248 {m} m del escenario",
73
+ "picker.restrictedView": "Visibilidad restringida",
74
+ "picker.obstructedView": "Visibilidad obstruida",
75
+ "picker.premiumSeat": "Asiento premium",
76
+ "picker.hideLimitedView": "Ocultar asientos con visibilidad limitada",
77
+ "picker.bestSeatsPremium": "Mejores asientos",
78
+ "picker.premiumFallbackNote": "No hay un bloque premium de {count}: mostrando los mejores disponibles"
73
79
  };
74
80
  export {
75
81
  es
76
82
  };
77
- //# sourceMappingURL=es-LDI3FESI.js.map
83
+ //# sourceMappingURL=es-N73CIVTC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/locales/es.ts"],"sourcesContent":["/**\n * Spanish (es) bundle — neutral/international Spanish translation.\n * Follows the same key structure as en.ts; all placeholders and brand\n * names preserved.\n */\n\nimport type { Dict } from '../index';\n\nexport const es: Dict = {\n // shared\n 'common.cancel': 'Cancelar',\n 'common.close': 'Cerrar',\n 'common.done': 'Listo',\n 'common.copied': '✓ Copiado',\n\n // buyer picker (extraction in progress — P4 of the port plan)\n 'picker.holdSeats': 'Retener asientos y comprar',\n 'picker.completeBooking': 'Completar reserva',\n 'picker.seatsHeld': 'Asientos retenidos — {time}',\n 'picker.holdExpired': 'Tu retención expiró — los asientos fueron liberados. Elige de nuevo.',\n 'picker.seatTaken': 'El asiento {label} fue tomado por otro comprador.',\n 'picker.poweredBy': 'Con la tecnología de SeatLayer',\n 'picker.testMode': 'MODO DE PRUEBA',\n 'picker.colorblind': 'Colores aptos para daltonismo',\n 'picker.orphanHint': 'Esto deja un asiento aislado — considera desplazarte un asiento.',\n 'picker.seats.one': '{count} asiento',\n 'picker.seats.other': '{count} asientos',\n\n // renderer (drawn on the Konva map — shared by the embed SDK)\n 'map.aria': 'Mapa de asientos. Usa las flechas para moverte entre asientos, Intro para seleccionar.',\n 'map.seatsLeft': '{count} LIBRES',\n 'map.statusHeld': 'En espera',\n 'map.statusTaken': 'Ocupado',\n 'map.fromPrice': 'DESDE {price}',\n\n // buyer picker page (src/pages/PickerPage.tsx)\n 'picker.language': 'Idioma',\n 'picker.zoomToFit': 'Ajustar zoom',\n 'picker.seatCountLabel': 'asientos',\n 'picker.capacity': 'capacidad',\n 'picker.viewMode': 'Modo de vista',\n 'picker.floor': 'Piso',\n 'picker.zoomLevel': 'Nivel de zoom',\n 'picker.rungTip.zones': 'Vista general — grupos de secciones como Grada norte o VIP',\n 'picker.rungTip.sections': 'Bloques de sección — mezcla de categorías + matiz de disponibilidad',\n 'picker.rungTip.seats': 'Asientos individuales — los bloques se convierten en puntos',\n 'picker.rungLabel.zones': 'ZONAS',\n 'picker.rungLabel.sections': 'SECCIONES',\n 'picker.rungLabel.seats': 'ASIENTOS',\n 'picker.sectionSummaryAria': 'Resumen de sección {label}',\n 'picker.closeSectionSummary': 'Cerrar resumen de sección',\n 'picker.seatsLeftInSection.one': '{count} asiento disponible',\n 'picker.seatsLeftInSection.other': '{count} asientos disponibles',\n 'picker.overview': 'Descripción general',\n 'picker.tapSeatHint': 'Toca cualquier asiento para ver su vista',\n 'picker.chartSize': 'Tamaño del gráfico',\n 'picker.custom': 'Personalizado',\n 'picker.categories': 'Categorías',\n 'picker.accessibility': 'Accesibilidad',\n 'picker.showAnyAccessible': 'Mostrar cualquier asiento accesible',\n 'picker.any': 'Cualquiera',\n 'picker.yourSeats': 'Tus asientos',\n 'picker.emptySeats': 'Toca asientos en el mapa',\n 'picker.emptySeatsWithGa': 'Toca asientos en el mapa · toca un área de pie para entradas de entrada general',\n 'picker.oneFewer': 'Uno menos',\n 'picker.oneMore': 'Uno más',\n 'picker.remove': 'Eliminar {label}',\n 'picker.ticketTierFor': 'Categoría de entrada para {label}',\n 'picker.total': 'Total: {amount}',\n 'picker.viewFromSeat': 'Vista desde el asiento {label}',\n 'picker.real360': 'REAL 360°',\n 'picker.preview': 'VISTA PREVIA',\n 'picker.open360': 'Abrir vista de 360°',\n 'picker.sightline': '≈ {m} m al escenario · visión despejada',\n 'picker.bookedDemo': '¡Reservado! (demostración)',\n 'picker.bookButton.one': 'Reservar {count} entrada — {amount}',\n 'picker.bookButton.other': 'Reservar {count} entradas — {amount}',\n 'picker.simulateCrowd': 'Simular multitud: {state}',\n 'picker.on': 'ACTIVADO',\n 'picker.off': 'DESACTIVADO',\n 'picker.panorama360': 'Foto de 360° del lugar',\n 'picker.illustrationCaption': 'ilustración · ≈ {m} m del escenario',\n};\n"],"mappings":";AAQO,IAAM,KAAW;AAAA;AAAA,EAEtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAChC;","names":[]}
1
+ {"version":3,"sources":["../src/i18n/locales/es.ts"],"sourcesContent":["/**\n * Spanish (es) bundle — neutral/international Spanish translation.\n * Follows the same key structure as en.ts; all placeholders and brand\n * names preserved.\n */\n\nimport type { Dict } from '../index';\n\nexport const es: Dict = {\n // shared\n 'common.cancel': 'Cancelar',\n 'common.close': 'Cerrar',\n 'common.done': 'Listo',\n 'common.copied': '✓ Copiado',\n\n // buyer picker (extraction in progress — P4 of the port plan)\n 'picker.holdSeats': 'Retener asientos y comprar',\n 'picker.completeBooking': 'Completar reserva',\n 'picker.seatsHeld': 'Asientos retenidos — {time}',\n 'picker.holdExpired': 'Tu retención expiró — los asientos fueron liberados. Elige de nuevo.',\n 'picker.seatTaken': 'El asiento {label} fue tomado por otro comprador.',\n 'picker.poweredBy': 'Con la tecnología de SeatLayer',\n 'picker.testMode': 'MODO DE PRUEBA',\n 'picker.colorblind': 'Colores aptos para daltonismo',\n 'picker.orphanHint': 'Esto deja un asiento aislado — considera desplazarte un asiento.',\n 'picker.seats.one': '{count} asiento',\n 'picker.seats.other': '{count} asientos',\n\n // renderer (drawn on the Konva map — shared by the embed SDK)\n 'map.aria': 'Mapa de asientos. Usa las flechas para moverte entre asientos, Intro para seleccionar.',\n 'map.seatsLeft': '{count} LIBRES',\n 'map.statusHeld': 'En espera',\n 'map.statusTaken': 'Ocupado',\n 'map.fromPrice': 'DESDE {price}',\n\n // buyer picker page (src/pages/PickerPage.tsx)\n 'picker.language': 'Idioma',\n 'picker.zoomToFit': 'Ajustar zoom',\n 'picker.seatCountLabel': 'asientos',\n 'picker.capacity': 'capacidad',\n 'picker.viewMode': 'Modo de vista',\n 'picker.floor': 'Piso',\n 'picker.zoomLevel': 'Nivel de zoom',\n 'picker.rungTip.zones': 'Vista general — grupos de secciones como Grada norte o VIP',\n 'picker.rungTip.sections': 'Bloques de sección — mezcla de categorías + matiz de disponibilidad',\n 'picker.rungTip.seats': 'Asientos individuales — los bloques se convierten en puntos',\n 'picker.rungLabel.zones': 'ZONAS',\n 'picker.rungLabel.sections': 'SECCIONES',\n 'picker.rungLabel.seats': 'ASIENTOS',\n 'picker.sectionSummaryAria': 'Resumen de sección {label}',\n 'picker.closeSectionSummary': 'Cerrar resumen de sección',\n 'picker.seatsLeftInSection.one': '{count} asiento disponible',\n 'picker.seatsLeftInSection.other': '{count} asientos disponibles',\n 'picker.overview': 'Descripción general',\n 'picker.tapSeatHint': 'Toca cualquier asiento para ver su vista',\n 'picker.chartSize': 'Tamaño del gráfico',\n 'picker.custom': 'Personalizado',\n 'picker.categories': 'Categorías',\n 'picker.accessibility': 'Accesibilidad',\n 'picker.showAnyAccessible': 'Mostrar cualquier asiento accesible',\n 'picker.any': 'Cualquiera',\n 'picker.yourSeats': 'Tus asientos',\n 'picker.emptySeats': 'Toca asientos en el mapa',\n 'picker.emptySeatsWithGa': 'Toca asientos en el mapa · toca un área de pie para entradas de entrada general',\n 'picker.oneFewer': 'Uno menos',\n 'picker.oneMore': 'Uno más',\n 'picker.remove': 'Eliminar {label}',\n 'picker.ticketTierFor': 'Categoría de entrada para {label}',\n 'picker.total': 'Total: {amount}',\n 'picker.viewFromSeat': 'Vista desde el asiento {label}',\n 'picker.real360': 'REAL 360°',\n 'picker.preview': 'VISTA PREVIA',\n 'picker.open360': 'Abrir vista de 360°',\n 'picker.sightline': '≈ {m} m al escenario · visión despejada',\n 'picker.bookedDemo': '¡Reservado! (demostración)',\n 'picker.bookButton.one': 'Reservar {count} entrada — {amount}',\n 'picker.bookButton.other': 'Reservar {count} entradas — {amount}',\n 'picker.simulateCrowd': 'Simular multitud: {state}',\n 'picker.on': 'ACTIVADO',\n 'picker.off': 'DESACTIVADO',\n 'picker.panorama360': 'Foto de 360° del lugar',\n 'picker.illustrationCaption': 'ilustración · ≈ {m} m del escenario',\n 'picker.restrictedView': 'Visibilidad restringida',\n 'picker.obstructedView': 'Visibilidad obstruida',\n 'picker.premiumSeat': 'Asiento premium',\n 'picker.hideLimitedView': 'Ocultar asientos con visibilidad limitada',\n 'picker.bestSeatsPremium': 'Mejores asientos',\n 'picker.premiumFallbackNote': 'No hay un bloque premium de {count}: mostrando los mejores disponibles',\n};\n"],"mappings":";AAQO,IAAM,KAAW;AAAA;AAAA,EAEtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,8BAA8B;AAChC;","names":[]}
@@ -69,9 +69,15 @@ var fr = {
69
69
  "picker.on": "ACTIV\xC9",
70
70
  "picker.off": "D\xC9SACTIV\xC9",
71
71
  "picker.panorama360": "Photo panoramique 360\xB0 du lieu",
72
- "picker.illustrationCaption": "illustration \xB7 \u2248 {m} m de la sc\xE8ne"
72
+ "picker.illustrationCaption": "illustration \xB7 \u2248 {m} m de la sc\xE8ne",
73
+ "picker.restrictedView": "Visibilit\xE9 r\xE9duite",
74
+ "picker.obstructedView": "Vue obstru\xE9e",
75
+ "picker.premiumSeat": "Place premium",
76
+ "picker.hideLimitedView": "Masquer les places \xE0 visibilit\xE9 r\xE9duite",
77
+ "picker.bestSeatsPremium": "Meilleures places",
78
+ "picker.premiumFallbackNote": "Aucun bloc premium de {count} \u2014 affichage des meilleures places disponibles"
73
79
  };
74
80
  export {
75
81
  fr
76
82
  };
77
- //# sourceMappingURL=fr-H4KTK4F5.js.map
83
+ //# sourceMappingURL=fr-SOY2OB4P.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/locales/fr.ts"],"sourcesContent":["/**\n * French (fr) bundle — native French translation.\n * Follows the same key structure as en.ts; all placeholders and brand\n * names preserved.\n */\n\nimport type { Dict } from '../index';\n\nexport const fr: Dict = {\n // shared\n 'common.cancel': 'Annuler',\n 'common.close': 'Fermer',\n 'common.done': 'Terminé',\n 'common.copied': '✓ Copié',\n\n // buyer picker (extraction in progress — P4 of the port plan)\n 'picker.holdSeats': 'Réserver les sièges et valider',\n 'picker.completeBooking': 'Terminer la réservation',\n 'picker.seatsHeld': 'Sièges réservés — {time}',\n 'picker.holdExpired': 'Votre réservation a expiré — les sièges ont été libérés. Sélectionnez à nouveau.',\n 'picker.seatTaken': 'Le siège {label} vient d\\'être réservé par un autre acheteur.',\n 'picker.poweredBy': 'Propulsé par SeatLayer',\n 'picker.testMode': 'MODE TEST',\n 'picker.colorblind': 'Couleurs adaptées au daltonisme',\n 'picker.orphanHint': \"Cela laisse un siège isolé — pensez à vous décaler d'un siège.\",\n 'picker.seats.one': '{count} siège',\n 'picker.seats.other': '{count} sièges',\n\n // renderer (drawn on the Konva map — shared by the embed SDK)\n 'map.aria': 'Plan de salle. Utilisez les flèches pour naviguer entre les sièges, Entrée pour sélectionner.',\n 'map.seatsLeft': '{count} LIBRES',\n 'map.statusHeld': 'En attente',\n 'map.statusTaken': 'Pris',\n 'map.fromPrice': 'DÈS {price}',\n\n // buyer picker page (src/pages/PickerPage.tsx)\n 'picker.language': 'Langue',\n 'picker.zoomToFit': 'Ajuster le zoom',\n 'picker.seatCountLabel': 'sièges',\n 'picker.capacity': 'capacité',\n 'picker.viewMode': 'Mode d\\'affichage',\n 'picker.floor': 'Étage',\n 'picker.zoomLevel': 'Niveau de zoom',\n 'picker.rungTip.zones': 'Vue générale — groupes de sections comme Tribune nord ou VIP',\n 'picker.rungTip.sections': 'Blocs de sections — mélange de catégories + teinte de disponibilité',\n 'picker.rungTip.seats': 'Sièges individuels — les blocs se transforment en points',\n 'picker.rungLabel.zones': 'ZONES',\n 'picker.rungLabel.sections': 'SECTIONS',\n 'picker.rungLabel.seats': 'SIÈGES',\n 'picker.sectionSummaryAria': 'Résumé de la section {label}',\n 'picker.closeSectionSummary': 'Fermer le résumé de la section',\n 'picker.seatsLeftInSection.one': '{count} siège restant',\n 'picker.seatsLeftInSection.other': '{count} sièges restants',\n 'picker.overview': 'Vue d\\'ensemble',\n 'picker.tapSeatHint': 'Appuyez sur un siège pour vérifier sa vue',\n 'picker.chartSize': 'Taille du plan',\n 'picker.custom': 'Personnalisé',\n 'picker.categories': 'Catégories',\n 'picker.accessibility': 'Accessibilité',\n 'picker.showAnyAccessible': 'Afficher un siège accessible',\n 'picker.any': 'N\\'importe quel',\n 'picker.yourSeats': 'Vos sièges',\n 'picker.emptySeats': 'Appuyez sur les sièges sur le plan',\n 'picker.emptySeatsWithGa': 'Appuyez sur les sièges sur le plan · appuyez sur une zone debout pour les billets GA',\n 'picker.oneFewer': 'Un de moins',\n 'picker.oneMore': 'Un de plus',\n 'picker.remove': 'Supprimer {label}',\n 'picker.ticketTierFor': 'Catégorie de billet pour {label}',\n 'picker.total': 'Total : {amount}',\n 'picker.viewFromSeat': 'Vue depuis le siège {label}',\n 'picker.real360': 'VRAI 360°',\n 'picker.preview': 'APERÇU',\n 'picker.open360': 'Ouvrir la vue à 360°',\n 'picker.sightline': '≈ {m} m de la scène · vue dégagée',\n 'picker.bookedDemo': 'Réservé ! (démo)',\n 'picker.bookButton.one': 'Réserver {count} billet — {amount}',\n 'picker.bookButton.other': 'Réserver {count} billets — {amount}',\n 'picker.simulateCrowd': 'Simuler la foule : {state}',\n 'picker.on': 'ACTIVÉ',\n 'picker.off': 'DÉSACTIVÉ',\n 'picker.panorama360': 'Photo panoramique 360° du lieu',\n 'picker.illustrationCaption': 'illustration · ≈ {m} m de la scène',\n};\n"],"mappings":";AAQO,IAAM,KAAW;AAAA;AAAA,EAEtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAChC;","names":[]}
1
+ {"version":3,"sources":["../src/i18n/locales/fr.ts"],"sourcesContent":["/**\n * French (fr) bundle — native French translation.\n * Follows the same key structure as en.ts; all placeholders and brand\n * names preserved.\n */\n\nimport type { Dict } from '../index';\n\nexport const fr: Dict = {\n // shared\n 'common.cancel': 'Annuler',\n 'common.close': 'Fermer',\n 'common.done': 'Terminé',\n 'common.copied': '✓ Copié',\n\n // buyer picker (extraction in progress — P4 of the port plan)\n 'picker.holdSeats': 'Réserver les sièges et valider',\n 'picker.completeBooking': 'Terminer la réservation',\n 'picker.seatsHeld': 'Sièges réservés — {time}',\n 'picker.holdExpired': 'Votre réservation a expiré — les sièges ont été libérés. Sélectionnez à nouveau.',\n 'picker.seatTaken': 'Le siège {label} vient d\\'être réservé par un autre acheteur.',\n 'picker.poweredBy': 'Propulsé par SeatLayer',\n 'picker.testMode': 'MODE TEST',\n 'picker.colorblind': 'Couleurs adaptées au daltonisme',\n 'picker.orphanHint': \"Cela laisse un siège isolé — pensez à vous décaler d'un siège.\",\n 'picker.seats.one': '{count} siège',\n 'picker.seats.other': '{count} sièges',\n\n // renderer (drawn on the Konva map — shared by the embed SDK)\n 'map.aria': 'Plan de salle. Utilisez les flèches pour naviguer entre les sièges, Entrée pour sélectionner.',\n 'map.seatsLeft': '{count} LIBRES',\n 'map.statusHeld': 'En attente',\n 'map.statusTaken': 'Pris',\n 'map.fromPrice': 'DÈS {price}',\n\n // buyer picker page (src/pages/PickerPage.tsx)\n 'picker.language': 'Langue',\n 'picker.zoomToFit': 'Ajuster le zoom',\n 'picker.seatCountLabel': 'sièges',\n 'picker.capacity': 'capacité',\n 'picker.viewMode': 'Mode d\\'affichage',\n 'picker.floor': 'Étage',\n 'picker.zoomLevel': 'Niveau de zoom',\n 'picker.rungTip.zones': 'Vue générale — groupes de sections comme Tribune nord ou VIP',\n 'picker.rungTip.sections': 'Blocs de sections — mélange de catégories + teinte de disponibilité',\n 'picker.rungTip.seats': 'Sièges individuels — les blocs se transforment en points',\n 'picker.rungLabel.zones': 'ZONES',\n 'picker.rungLabel.sections': 'SECTIONS',\n 'picker.rungLabel.seats': 'SIÈGES',\n 'picker.sectionSummaryAria': 'Résumé de la section {label}',\n 'picker.closeSectionSummary': 'Fermer le résumé de la section',\n 'picker.seatsLeftInSection.one': '{count} siège restant',\n 'picker.seatsLeftInSection.other': '{count} sièges restants',\n 'picker.overview': 'Vue d\\'ensemble',\n 'picker.tapSeatHint': 'Appuyez sur un siège pour vérifier sa vue',\n 'picker.chartSize': 'Taille du plan',\n 'picker.custom': 'Personnalisé',\n 'picker.categories': 'Catégories',\n 'picker.accessibility': 'Accessibilité',\n 'picker.showAnyAccessible': 'Afficher un siège accessible',\n 'picker.any': 'N\\'importe quel',\n 'picker.yourSeats': 'Vos sièges',\n 'picker.emptySeats': 'Appuyez sur les sièges sur le plan',\n 'picker.emptySeatsWithGa': 'Appuyez sur les sièges sur le plan · appuyez sur une zone debout pour les billets GA',\n 'picker.oneFewer': 'Un de moins',\n 'picker.oneMore': 'Un de plus',\n 'picker.remove': 'Supprimer {label}',\n 'picker.ticketTierFor': 'Catégorie de billet pour {label}',\n 'picker.total': 'Total : {amount}',\n 'picker.viewFromSeat': 'Vue depuis le siège {label}',\n 'picker.real360': 'VRAI 360°',\n 'picker.preview': 'APERÇU',\n 'picker.open360': 'Ouvrir la vue à 360°',\n 'picker.sightline': '≈ {m} m de la scène · vue dégagée',\n 'picker.bookedDemo': 'Réservé ! (démo)',\n 'picker.bookButton.one': 'Réserver {count} billet — {amount}',\n 'picker.bookButton.other': 'Réserver {count} billets — {amount}',\n 'picker.simulateCrowd': 'Simuler la foule : {state}',\n 'picker.on': 'ACTIVÉ',\n 'picker.off': 'DÉSACTIVÉ',\n 'picker.panorama360': 'Photo panoramique 360° du lieu',\n 'picker.illustrationCaption': 'illustration · ≈ {m} m de la scène',\n 'picker.restrictedView': 'Visibilité réduite',\n 'picker.obstructedView': 'Vue obstruée',\n 'picker.premiumSeat': 'Place premium',\n 'picker.hideLimitedView': 'Masquer les places à visibilité réduite',\n 'picker.bestSeatsPremium': 'Meilleures places',\n 'picker.premiumFallbackNote': 'Aucun bloc premium de {count} — affichage des meilleures places disponibles',\n};\n"],"mappings":";AAQO,IAAM,KAAW;AAAA;AAAA,EAEtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,8BAA8B;AAChC;","names":[]}
package/dist/index.cjs CHANGED
@@ -104,7 +104,13 @@ var init_es = __esm({
104
104
  "picker.on": "ACTIVADO",
105
105
  "picker.off": "DESACTIVADO",
106
106
  "picker.panorama360": "Foto de 360\xB0 del lugar",
107
- "picker.illustrationCaption": "ilustraci\xF3n \xB7 \u2248 {m} m del escenario"
107
+ "picker.illustrationCaption": "ilustraci\xF3n \xB7 \u2248 {m} m del escenario",
108
+ "picker.restrictedView": "Visibilidad restringida",
109
+ "picker.obstructedView": "Visibilidad obstruida",
110
+ "picker.premiumSeat": "Asiento premium",
111
+ "picker.hideLimitedView": "Ocultar asientos con visibilidad limitada",
112
+ "picker.bestSeatsPremium": "Mejores asientos",
113
+ "picker.premiumFallbackNote": "No hay un bloque premium de {count}: mostrando los mejores disponibles"
108
114
  };
109
115
  }
110
116
  });
@@ -188,7 +194,13 @@ var init_de = __esm({
188
194
  "picker.on": "AN",
189
195
  "picker.off": "AUS",
190
196
  "picker.panorama360": "360\xB0-Veranstaltungsfotos",
191
- "picker.illustrationCaption": "Illustration \xB7 \u2248 {m} m von der B\xFChne"
197
+ "picker.illustrationCaption": "Illustration \xB7 \u2248 {m} m von der B\xFChne",
198
+ "picker.restrictedView": "Eingeschr\xE4nkte Sicht",
199
+ "picker.obstructedView": "Sichtbehinderung",
200
+ "picker.premiumSeat": "Premium-Platz",
201
+ "picker.hideLimitedView": "Pl\xE4tze mit eingeschr\xE4nkter Sicht ausblenden",
202
+ "picker.bestSeatsPremium": "Beste Pl\xE4tze",
203
+ "picker.premiumFallbackNote": "Kein Premium-Block mit {count} Pl\xE4tzen \u2014 beste verf\xFCgbare werden angezeigt"
192
204
  };
193
205
  }
194
206
  });
@@ -272,7 +284,13 @@ var init_fr = __esm({
272
284
  "picker.on": "ACTIV\xC9",
273
285
  "picker.off": "D\xC9SACTIV\xC9",
274
286
  "picker.panorama360": "Photo panoramique 360\xB0 du lieu",
275
- "picker.illustrationCaption": "illustration \xB7 \u2248 {m} m de la sc\xE8ne"
287
+ "picker.illustrationCaption": "illustration \xB7 \u2248 {m} m de la sc\xE8ne",
288
+ "picker.restrictedView": "Visibilit\xE9 r\xE9duite",
289
+ "picker.obstructedView": "Vue obstru\xE9e",
290
+ "picker.premiumSeat": "Place premium",
291
+ "picker.hideLimitedView": "Masquer les places \xE0 visibilit\xE9 r\xE9duite",
292
+ "picker.bestSeatsPremium": "Meilleures places",
293
+ "picker.premiumFallbackNote": "Aucun bloc premium de {count} \u2014 affichage des meilleures places disponibles"
276
294
  };
277
295
  }
278
296
  });
@@ -659,8 +677,8 @@ function polygonLabelPoint(outer, holes) {
659
677
  const xs = outer.map((point) => point.x);
660
678
  const ys = outer.map((point) => point.y);
661
679
  const bounds = { minX: Math.min(...xs), maxX: Math.max(...xs), minY: Math.min(...ys), maxY: Math.max(...ys) };
662
- const centroid = polygonCentroid(outer);
663
- if (pointInPolygonWithHoles(centroid, outer, holes)) return centroid;
680
+ const centroid2 = polygonCentroid(outer);
681
+ if (pointInPolygonWithHoles(centroid2, outer, holes)) return centroid2;
664
682
  let best = outer[0];
665
683
  let bestScore = -Infinity;
666
684
  const rings = [outer, ...holes ?? []];
@@ -1142,7 +1160,13 @@ var en = {
1142
1160
  "picker.on": "ON",
1143
1161
  "picker.off": "OFF",
1144
1162
  "picker.panorama360": "360\xB0 venue photo",
1145
- "picker.illustrationCaption": "illustration \xB7 \u2248 {m} m from stage"
1163
+ "picker.illustrationCaption": "illustration \xB7 \u2248 {m} m from stage",
1164
+ "picker.restrictedView": "Restricted view",
1165
+ "picker.obstructedView": "Obstructed view",
1166
+ "picker.premiumSeat": "Premium seat",
1167
+ "picker.hideLimitedView": "Hide limited-view seats",
1168
+ "picker.bestSeatsPremium": "Best seats",
1169
+ "picker.premiumFallbackNote": "No premium block of {count} \u2014 showing best overall"
1146
1170
  };
1147
1171
 
1148
1172
  // src/i18n/index.ts
@@ -1516,6 +1540,9 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1516
1540
  this.categoryHighlight = null;
1517
1541
  /** Price-band filter (F4): dim free seats whose category is NOT in this set. */
1518
1542
  this.categoryFilter = null;
1543
+ /** Commercial "hide limited-view seats" toggle: dim free seats flagged
1544
+ * restrictedView/obstructedView. Parallel to the accessibility filter. */
1545
+ this.commercialLimitedFilter = false;
1519
1546
  // Section/zone overlays (bgLayer) — the 3-rung LOD: seats → section blocks →
1520
1547
  // zone blocks. Kept for the melt restyle and for hit-testing a zoomed-out tap.
1521
1548
  this.sections = [];
@@ -2379,6 +2406,26 @@ var _SeatmapRenderer = class _SeatmapRenderer {
2379
2406
  if (cur === null || next === null) return cur === next;
2380
2407
  return cur.length === next.length && cur.every((t2, i) => t2 === next[i]);
2381
2408
  }
2409
+ /**
2410
+ * "Hide limited-view seats" toggle (commercial): when on, dim free, unselected
2411
+ * seats flagged restrictedView or obstructedView — the same visual dimming the
2412
+ * accessibility filter uses, just keyed off the seat's commercial attributes.
2413
+ */
2414
+ setCommercialLimitedFilter(on) {
2415
+ if (this.commercialLimitedFilter === on) return;
2416
+ this.commercialLimitedFilter = on;
2417
+ for (const seat of this.seats) {
2418
+ const c = this.circleById.get(seat.id);
2419
+ if (c) this.paintSeat(c, seat.id);
2420
+ }
2421
+ this.updateLabels();
2422
+ if (this.cached) {
2423
+ this.seatLayer.clearCache();
2424
+ this.cacheSeatLayer();
2425
+ } else {
2426
+ this.seatLayer.batchDraw();
2427
+ }
2428
+ }
2382
2429
  /**
2383
2430
  * Price-band filter (F4): dim free, unselected seats whose category key is NOT
2384
2431
  * in `keys`. `null` clears the filter (all categories fully visible). The
@@ -2818,6 +2865,9 @@ var _SeatmapRenderer = class _SeatmapRenderer {
2818
2865
  if (this.categoryFilter && status === "free" && !selected && !this.categoryFilter.has(seat.categoryKey)) {
2819
2866
  c.opacity(0.22);
2820
2867
  }
2868
+ if (this.commercialLimitedFilter && status === "free" && !selected && (seat.commercial?.restrictedView || seat.commercial?.obstructedView)) {
2869
+ c.opacity(0.22);
2870
+ }
2821
2871
  if (this.dimmedSections.size) {
2822
2872
  const sec = this.seatSection.get(id);
2823
2873
  if (sec && (this.dimmedSections.has(sec.id) || this.dimmedSections.has(sec.logicalId) || sec.zone != null && this.dimmedSections.has(sec.zone))) {
@@ -3322,7 +3372,7 @@ var _SeatmapRenderer = class _SeatmapRenderer {
3322
3372
  * Membership and category mix are still precomputed for the detailed state.
3323
3373
  */
3324
3374
  renderSection(obj) {
3325
- const centroid = polygonLabelPoint(obj.outline, obj.holes);
3375
+ const centroid2 = polygonLabelPoint(obj.outline, obj.holes);
3326
3376
  const palette = overviewPalette(this.canvasBackground);
3327
3377
  const memberIds = [];
3328
3378
  const catCounts = /* @__PURE__ */ new Map();
@@ -3384,8 +3434,8 @@ var _SeatmapRenderer = class _SeatmapRenderer {
3384
3434
  const preferredInk = labelStyle?.color ?? palette.sectionInk;
3385
3435
  const labelScale = (labelStyle?.size ?? 18) / 18;
3386
3436
  const nameLabel = new import_Text.Text({
3387
- x: obj.labelPresentation?.position?.x ?? centroid.x,
3388
- y: obj.labelPresentation?.position?.y ?? centroid.y,
3437
+ x: obj.labelPresentation?.position?.x ?? centroid2.x,
3438
+ y: obj.labelPresentation?.position?.y ?? centroid2.y,
3389
3439
  text: obj.displayLabel ?? obj.label,
3390
3440
  rotation: obj.labelPresentation?.rotation ?? 0,
3391
3441
  visible: obj.labelPresentation?.visible !== false,
@@ -3400,8 +3450,8 @@ var _SeatmapRenderer = class _SeatmapRenderer {
3400
3450
  nameLabel.offsetY(nameLabel.height() / 2);
3401
3451
  bgTarget.add(nameLabel);
3402
3452
  const subLabel = new import_Text.Text({
3403
- x: centroid.x,
3404
- y: centroid.y,
3453
+ x: centroid2.x,
3454
+ y: centroid2.y,
3405
3455
  text: t("map.seatsLeft", { count: free }),
3406
3456
  fontSize: 12,
3407
3457
  fontStyle: "700",
@@ -3420,8 +3470,8 @@ var _SeatmapRenderer = class _SeatmapRenderer {
3420
3470
  outline: obj.outline,
3421
3471
  ...obj.outlinePath ? { outlinePath: obj.outlinePath } : {},
3422
3472
  holes: obj.holes ?? [],
3423
- centroid,
3424
- labelAnchors: polygonLabelCandidates(obj.outline, obj.holes ?? [], centroid),
3473
+ centroid: centroid2,
3474
+ labelAnchors: polygonLabelCandidates(obj.outline, obj.holes ?? [], centroid2),
3425
3475
  zone: obj.zone,
3426
3476
  memberIds,
3427
3477
  total: memberIds.length,
@@ -4781,6 +4831,103 @@ function strandedSingles(seats, statusOf, selectedIds) {
4781
4831
  return out;
4782
4832
  }
4783
4833
 
4834
+ // src/core/bestAvailable.ts
4835
+ function seatIndex2(seat, fallback) {
4836
+ const i = seat.id.lastIndexOf(":");
4837
+ if (i < 0) return fallback;
4838
+ const n = Number(seat.id.slice(i + 1));
4839
+ return Number.isFinite(n) ? n : fallback;
4840
+ }
4841
+ function dist2(a, b) {
4842
+ const dx = a.x - b.x;
4843
+ const dy = a.y - b.y;
4844
+ return dx * dx + dy * dy;
4845
+ }
4846
+ function centroid(seats) {
4847
+ let x = 0;
4848
+ let y = 0;
4849
+ for (const s of seats) {
4850
+ x += s.x;
4851
+ y += s.y;
4852
+ }
4853
+ return { x: x / seats.length, y: y / seats.length };
4854
+ }
4855
+ function isPremium(seat) {
4856
+ return seat.commercial?.premium === true;
4857
+ }
4858
+ function pickBestAvailable(seats, available, opts) {
4859
+ const qty = Math.floor(opts.qty);
4860
+ if (!Number.isFinite(qty) || qty <= 0) return { labels: [], reason: "sold_out" };
4861
+ const { categoryKey, focal, preferPremium } = opts;
4862
+ const rows = /* @__PURE__ */ new Map();
4863
+ const eligibleAll = [];
4864
+ seats.forEach((seat, i) => {
4865
+ const elig = available.has(seat.label) && (!categoryKey || seat.categoryKey === categoryKey);
4866
+ let arr = rows.get(seat.rowId);
4867
+ if (!arr) {
4868
+ arr = [];
4869
+ rows.set(seat.rowId, arr);
4870
+ }
4871
+ arr.push({ seat, index: seatIndex2(seat, i), elig });
4872
+ if (elig) eligibleAll.push(seat);
4873
+ });
4874
+ if (eligibleAll.length === 0) return { labels: [], reason: "sold_out" };
4875
+ let best = null;
4876
+ const better = (c) => {
4877
+ if (!best) return true;
4878
+ if (preferPremium && c.nonPremium !== best.nonPremium) return c.nonPremium < best.nonPremium;
4879
+ if (c.orphan !== best.orphan) return c.orphan < best.orphan;
4880
+ if (c.d2 !== best.d2) return c.d2 < best.d2;
4881
+ const r = c.rowId.localeCompare(best.rowId);
4882
+ if (r !== 0) return r < 0;
4883
+ return c.startIndex < best.startIndex;
4884
+ };
4885
+ for (const [rowId, slotsUnsorted] of rows) {
4886
+ const slots = [...slotsUnsorted].sort((a, b) => a.index - b.index);
4887
+ let i = 0;
4888
+ while (i < slots.length) {
4889
+ if (!slots[i].elig) {
4890
+ i++;
4891
+ continue;
4892
+ }
4893
+ let j = i;
4894
+ while (j < slots.length && slots[j].elig) j++;
4895
+ const segLen = j - i;
4896
+ for (let p = 0; p + qty <= segLen; p++) {
4897
+ const leftRem = p;
4898
+ const rightRem = segLen - (p + qty);
4899
+ const orphan = leftRem === 1 || rightRem === 1 ? 1 : 0;
4900
+ const runSeats = slots.slice(i + p, i + p + qty).map((s) => s.seat);
4901
+ const c = {
4902
+ labels: runSeats.map((s) => s.label),
4903
+ seats: runSeats,
4904
+ rowId,
4905
+ startIndex: slots[i + p].index,
4906
+ orphan,
4907
+ nonPremium: preferPremium ? runSeats.reduce((n, s) => n + (isPremium(s) ? 0 : 1), 0) : 0,
4908
+ d2: dist2(centroid(runSeats), focal)
4909
+ };
4910
+ if (better(c)) best = c;
4911
+ }
4912
+ i = j;
4913
+ }
4914
+ }
4915
+ if (best) return { labels: best.labels };
4916
+ if (eligibleAll.length < qty) return { labels: [], reason: "not_enough_together" };
4917
+ const ranked = eligibleAll.map((seat, i) => ({ seat, i, d2: dist2(seat, focal) })).sort((a, b) => {
4918
+ if (preferPremium) {
4919
+ const pa = isPremium(a.seat) ? 0 : 1;
4920
+ const pb = isPremium(b.seat) ? 0 : 1;
4921
+ if (pa !== pb) return pa - pb;
4922
+ }
4923
+ if (a.d2 !== b.d2) return a.d2 - b.d2;
4924
+ const r = a.seat.rowId.localeCompare(b.seat.rowId);
4925
+ if (r !== 0) return r;
4926
+ return seatIndex2(a.seat, a.i) - seatIndex2(b.seat, b.i);
4927
+ });
4928
+ return { labels: ranked.slice(0, qty).map((r) => r.seat.label) };
4929
+ }
4930
+
4784
4931
  // src/picker/PickerController.ts
4785
4932
  var DEFAULT_MAX_SELECTION = 10;
4786
4933
  var MAX_BACKOFF_MS = 15e3;
@@ -5132,10 +5279,77 @@ var PickerController = class {
5132
5279
  this.setHold({ holdId: result.holdId, labels: combined.map((s) => s.label), expiresAt: result.expiresAt, items: result.items });
5133
5280
  return this.hold_;
5134
5281
  }
5135
- /** Server-picks `qty` best free seats and holds them atomically. Throws on failure. */
5136
- async bestAvailable(qty, categoryKey) {
5282
+ /** True when any seat on the visible chart carries the `premium` commercial
5283
+ * flag — gates the buyer widget's "★ Best seats" premium quick-pick (chip is
5284
+ * present-only, exactly like the accessibility filter chips). */
5285
+ hasPremiumSeats() {
5286
+ for (const seat of this.labelToSeat.values()) {
5287
+ if (seat.commercial?.premium) return true;
5288
+ }
5289
+ return false;
5290
+ }
5291
+ /**
5292
+ * Client-side premium pre-pass: find the best contiguous block of `qty`
5293
+ * PREMIUM-flagged free seats (orphan-avoiding, closest to the focal point)
5294
+ * using the local seat geometry + live availability, mirroring the server's
5295
+ * held-back exclusion via the visible (hidden-stripped) chart and current
5296
+ * seat status. Returns a FULL premium block of `qty`, or null when none
5297
+ * exists (the caller then falls back to the normal server pick).
5298
+ */
5299
+ pickPremiumBlock(qty, categoryKey) {
5300
+ const doc = this.visibleDoc();
5301
+ if (!doc?.objects?.length) return null;
5302
+ const focal = doc.focalPoint ?? { x: 0, y: 0 };
5303
+ const seats = expandChart(doc);
5304
+ const held = new Set(this.hold_?.labels ?? []);
5305
+ const available = /* @__PURE__ */ new Set();
5306
+ for (const seat of seats) {
5307
+ if (held.has(seat.label)) continue;
5308
+ const id = this.labelToId.get(seat.label);
5309
+ const status = id ? this.getStatus(id) : void 0;
5310
+ if ((status ?? "free") === "free") available.add(seat.label);
5311
+ }
5312
+ const pick = pickBestAvailable(seats, available, { qty, categoryKey, focal, preferPremium: true });
5313
+ if (pick.labels.length !== qty) return null;
5314
+ const allPremium = pick.labels.every((l) => this.labelToSeat.get(l)?.commercial?.premium);
5315
+ return allPremium ? [...pick.labels] : null;
5316
+ }
5317
+ /**
5318
+ * Server-picks `qty` best free seats and holds them atomically. Throws on
5319
+ * failure. With `preferPremium`, first tries to hold the best PREMIUM block
5320
+ * locally; when none matches the requested quantity it falls back to the
5321
+ * normal server pick (the widget surfaces a subtle note on that fallback).
5322
+ */
5323
+ async bestAvailable(qty, categoryKey, opts = {}) {
5137
5324
  const r = this.renderer;
5138
5325
  if (!r) return null;
5326
+ if (opts.preferPremium) {
5327
+ const block = this.pickPremiumBlock(qty, categoryKey);
5328
+ if (block) {
5329
+ if (this.hold_ && !await this.release()) return null;
5330
+ try {
5331
+ const selection = block.map((label) => {
5332
+ const seat = this.labelToSeat.get(label);
5333
+ const resolved = seat ? this.toSeat(seat) : null;
5334
+ return { label, ...resolved?.tierId ? { tierId: resolved.tierId } : {} };
5335
+ });
5336
+ const result = await this.api.hold(this.key, selection);
5337
+ r.clearSelection();
5338
+ const ids = block.map((l) => this.labelToId.get(l)).filter((v) => !!v);
5339
+ if (ids.length) r.setStatus(ids, "held");
5340
+ this.setHold({ holdId: result.holdId, labels: [...block], expiresAt: result.expiresAt, items: result.items });
5341
+ const seats = block.map((l) => this.labelToSeat.get(l)).filter((s) => !!s).map((s) => this.toSeat(s));
5342
+ this.opts.onSelectionChange?.(seats);
5343
+ return this.hold_;
5344
+ } catch (err) {
5345
+ const { status, reason } = errInfo(err);
5346
+ if (status === 409 && reason === "event_closed") {
5347
+ this.opts.onSalesClosed?.();
5348
+ throw err;
5349
+ }
5350
+ }
5351
+ }
5352
+ }
5139
5353
  if (this.hold_ && !await this.release()) return null;
5140
5354
  try {
5141
5355
  const result = await this.api.bestAvailable(this.key, qty, categoryKey);
@@ -5305,6 +5519,15 @@ var PickerController = class {
5305
5519
  setAccessibilityFilter(types) {
5306
5520
  this.renderer?.setAccessibilityFilter?.(types);
5307
5521
  }
5522
+ /**
5523
+ * "Hide limited-view seats" toggle — dims free seats flagged
5524
+ * restricted/obstructed view. Additive commercial parallel to the
5525
+ * accessibility filter; called via the concrete renderer (not on the shared
5526
+ * ISeatmapRenderer interface).
5527
+ */
5528
+ setCommercialLimitedFilter(on) {
5529
+ this.renderer?.setCommercialLimitedFilter?.(on);
5530
+ }
5308
5531
  // ---- multi-floor (Batch 5) ------------------------------------------------
5309
5532
  /** Floors for the buyer's switcher (>1 ⇒ show it). Single-floor ⇒ one entry. */
5310
5533
  getFloors() {
@@ -5498,9 +5721,10 @@ var PickerController = class {
5498
5721
  }
5499
5722
  // ---- internals ------------------------------------------------------------
5500
5723
  toSeat(s) {
5724
+ const commercial = s.commercial ? { commercial: s.commercial } : void 0;
5501
5725
  const tiers = this.tiersFor(s.categoryKey);
5502
5726
  if (!tiers) {
5503
- return { id: s.id, label: s.label, categoryKey: s.categoryKey, price: this.priceFor(s.categoryKey) };
5727
+ return { id: s.id, label: s.label, categoryKey: s.categoryKey, price: this.priceFor(s.categoryKey), ...commercial };
5504
5728
  }
5505
5729
  const chosen = tiers.find((t2) => t2.id === this.seatTiers.get(s.id)) ?? tiers[0];
5506
5730
  return {
@@ -5509,7 +5733,8 @@ var PickerController = class {
5509
5733
  categoryKey: s.categoryKey,
5510
5734
  price: chosen.price,
5511
5735
  tiers,
5512
- tierId: chosen.id
5736
+ tierId: chosen.id,
5737
+ ...commercial
5513
5738
  };
5514
5739
  }
5515
5740
  /** Tooltip payload for a hovered seat — see PickerCallbacks.onSeatHover. */