@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.
- package/dist/{de-HLJXYBWA.js → de-DRWMZ2FV.js} +8 -2
- package/dist/{de-HLJXYBWA.js.map → de-DRWMZ2FV.js.map} +1 -1
- package/dist/{es-LDI3FESI.js → es-N73CIVTC.js} +8 -2
- package/dist/{es-LDI3FESI.js.map → es-N73CIVTC.js.map} +1 -1
- package/dist/{fr-H4KTK4F5.js → fr-SOY2OB4P.js} +8 -2
- package/dist/{fr-H4KTK4F5.js.map → fr-SOY2OB4P.js.map} +1 -1
- package/dist/index.cjs +242 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +42 -2
- package/dist/index.d.ts +42 -2
- package/dist/index.js +224 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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-
|
|
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-
|
|
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-
|
|
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
|
|
663
|
-
if (pointInPolygonWithHoles(
|
|
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
|
|
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 ??
|
|
3388
|
-
y: obj.labelPresentation?.position?.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:
|
|
3404
|
-
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 ?? [],
|
|
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
|
-
/**
|
|
5136
|
-
|
|
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. */
|