@seatlayer/core 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,6 +20,8 @@ var de = {
20
20
  // renderer (drawn on the Konva map — shared by the embed SDK)
21
21
  "map.aria": "Sitzplan. Mit Pfeiltasten zwischen Pl\xE4tzen navigieren, Eingabe zum Ausw\xE4hlen.",
22
22
  "map.seatsLeft": "{count} FREI",
23
+ "map.statusHeld": "Reserviert",
24
+ "map.statusTaken": "Vergeben",
23
25
  "map.fromPrice": "AB {price}",
24
26
  // buyer picker page (src/pages/PickerPage.tsx)
25
27
  "picker.language": "Sprache",
@@ -70,4 +72,4 @@ var de = {
70
72
  export {
71
73
  de
72
74
  };
73
- //# sourceMappingURL=de-YMAVF5S2.js.map
75
+ //# sourceMappingURL=de-DDXO5ERX.js.map
@@ -0,0 +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.viewMode': 'Ansichtsmodus',\n 'picker.floor': 'Etage',\n 'picker.zoomLevel': 'Zoomstufe',\n 'picker.rungTip.zones': 'Fernste Stufe — Zonen-Blöcke (Etage / Unteres Parterre / Oberes Parterre)',\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': '≈ {rows} Reihen von der Bühne · {angle}° seitlich versetzt',\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,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":[]}
@@ -20,6 +20,8 @@ var es = {
20
20
  // renderer (drawn on the Konva map — shared by the embed SDK)
21
21
  "map.aria": "Mapa de asientos. Usa las flechas para moverte entre asientos, Intro para seleccionar.",
22
22
  "map.seatsLeft": "{count} LIBRES",
23
+ "map.statusHeld": "En espera",
24
+ "map.statusTaken": "Ocupado",
23
25
  "map.fromPrice": "DESDE {price}",
24
26
  // buyer picker page (src/pages/PickerPage.tsx)
25
27
  "picker.language": "Idioma",
@@ -70,4 +72,4 @@ var es = {
70
72
  export {
71
73
  es
72
74
  };
73
- //# sourceMappingURL=es-MLM3IFIY.js.map
75
+ //# sourceMappingURL=es-SKJTYKLL.js.map
@@ -0,0 +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.viewMode': 'Modo de vista',\n 'picker.floor': 'Piso',\n 'picker.zoomLevel': 'Nivel de zoom',\n 'picker.rungTip.zones': 'Nivel más lejano — bloques de zona (Piso / Patio Bajo / Patio Alto)',\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': '≈ {rows} filas del escenario · {angle}° fuera del centro',\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,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":[]}
@@ -20,6 +20,8 @@ var fr = {
20
20
  // renderer (drawn on the Konva map — shared by the embed SDK)
21
21
  "map.aria": "Plan de salle. Utilisez les fl\xE8ches pour naviguer entre les si\xE8ges, Entr\xE9e pour s\xE9lectionner.",
22
22
  "map.seatsLeft": "{count} LIBRES",
23
+ "map.statusHeld": "En attente",
24
+ "map.statusTaken": "Pris",
23
25
  "map.fromPrice": "D\xC8S {price}",
24
26
  // buyer picker page (src/pages/PickerPage.tsx)
25
27
  "picker.language": "Langue",
@@ -70,4 +72,4 @@ var fr = {
70
72
  export {
71
73
  fr
72
74
  };
73
- //# sourceMappingURL=fr-N7AAVATM.js.map
75
+ //# sourceMappingURL=fr-NPIGOYCU.js.map
@@ -0,0 +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.viewMode': 'Mode d\\'affichage',\n 'picker.floor': 'Étage',\n 'picker.zoomLevel': 'Niveau de zoom',\n 'picker.rungTip.zones': 'Vue la plus large — blocs de zones (Étage / Parquet inférieur / Parquet supérieur)',\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': '≈ {rows} rangées de la scène · {angle}° décalé du centre',\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,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":[]}
package/dist/index.cjs CHANGED
@@ -50,6 +50,8 @@ var init_es = __esm({
50
50
  // renderer (drawn on the Konva map — shared by the embed SDK)
51
51
  "map.aria": "Mapa de asientos. Usa las flechas para moverte entre asientos, Intro para seleccionar.",
52
52
  "map.seatsLeft": "{count} LIBRES",
53
+ "map.statusHeld": "En espera",
54
+ "map.statusTaken": "Ocupado",
53
55
  "map.fromPrice": "DESDE {price}",
54
56
  // buyer picker page (src/pages/PickerPage.tsx)
55
57
  "picker.language": "Idioma",
@@ -130,6 +132,8 @@ var init_de = __esm({
130
132
  // renderer (drawn on the Konva map — shared by the embed SDK)
131
133
  "map.aria": "Sitzplan. Mit Pfeiltasten zwischen Pl\xE4tzen navigieren, Eingabe zum Ausw\xE4hlen.",
132
134
  "map.seatsLeft": "{count} FREI",
135
+ "map.statusHeld": "Reserviert",
136
+ "map.statusTaken": "Vergeben",
133
137
  "map.fromPrice": "AB {price}",
134
138
  // buyer picker page (src/pages/PickerPage.tsx)
135
139
  "picker.language": "Sprache",
@@ -210,6 +214,8 @@ var init_fr = __esm({
210
214
  // renderer (drawn on the Konva map — shared by the embed SDK)
211
215
  "map.aria": "Plan de salle. Utilisez les fl\xE8ches pour naviguer entre les si\xE8ges, Entr\xE9e pour s\xE9lectionner.",
212
216
  "map.seatsLeft": "{count} LIBRES",
217
+ "map.statusHeld": "En attente",
218
+ "map.statusTaken": "Pris",
213
219
  "map.fromPrice": "D\xC8S {price}",
214
220
  // buyer picker page (src/pages/PickerPage.tsx)
215
221
  "picker.language": "Langue",
@@ -840,6 +846,8 @@ var en = {
840
846
  "map.aria": "Seating map. Use arrow keys to move between seats, Enter to select.",
841
847
  "map.seatsLeft": "{count} LEFT",
842
848
  "map.fromPrice": "FROM {price}",
849
+ "map.statusHeld": "On hold",
850
+ "map.statusTaken": "Taken",
843
851
  // buyer picker page (src/pages/PickerPage.tsx)
844
852
  "picker.language": "Language",
845
853
  "picker.zoomToFit": "Zoom to fit",
@@ -966,8 +974,35 @@ function seatMatchesAccess(seat, filter) {
966
974
  }
967
975
  var DEF_SEAT_LABEL = "#0b1220";
968
976
  var DEF_SELECTION = "#ffffff";
977
+ var DEF_SELECTION_ON_LIGHT = "#0b1220";
969
978
  var DEF_DECOR_FILL = "#232c40";
970
979
  var DEF_TEXT = "#8b93a7";
980
+ function colorLuminance(color) {
981
+ const s = color.trim();
982
+ let r = NaN;
983
+ let g = NaN;
984
+ let b = NaN;
985
+ const hex = /^#([\da-f]{3}|[\da-f]{6})$/i.exec(s);
986
+ if (hex) {
987
+ const h = hex[1].length === 3 ? hex[1].split("").map((c) => c + c).join("") : hex[1];
988
+ r = parseInt(h.slice(0, 2), 16);
989
+ g = parseInt(h.slice(2, 4), 16);
990
+ b = parseInt(h.slice(4, 6), 16);
991
+ } else {
992
+ const rgb = /^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/.exec(s);
993
+ if (rgb) {
994
+ r = +rgb[1];
995
+ g = +rgb[2];
996
+ b = +rgb[3];
997
+ }
998
+ }
999
+ if (Number.isNaN(r)) return NaN;
1000
+ return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
1001
+ }
1002
+ function isLightColor(color) {
1003
+ const lum = colorLuminance(color);
1004
+ return !Number.isNaN(lum) && lum > 0.6;
1005
+ }
971
1006
  var clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
972
1007
  function seatIdOf(target) {
973
1008
  const n = target;
@@ -1053,6 +1088,8 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1053
1088
  this.statusById = /* @__PURE__ */ new Map();
1054
1089
  this.catColor = /* @__PURE__ */ new Map();
1055
1090
  this.theme = {};
1091
+ /** Effective selection/hover ring color — resolved per chart in setChart(). */
1092
+ this.effSelection = DEF_SELECTION;
1056
1093
  /** Colorblind-safe mode (Okabe-Ito hues + hollow booked seats). */
1057
1094
  this.colorblind = false;
1058
1095
  /** Category order from the doc — the stable index into the CB palette. */
@@ -1303,7 +1340,8 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1303
1340
  this.theme = doc.theme ?? {};
1304
1341
  this.seatR = clamp(this.theme.seatScale ?? 1, 0.7, 1.6) * SEAT_RADIUS;
1305
1342
  this.container.style.background = this.theme.background ?? "";
1306
- this.hoverRing.stroke(this.theme.selectionColor ?? DEF_SELECTION);
1343
+ this.effSelection = this.resolveSelectionColor();
1344
+ this.hoverRing.stroke(this.effSelection);
1307
1345
  this.hoverRing.radius(this.seatR + 2);
1308
1346
  this.catColor.clear();
1309
1347
  this.catPrice.clear();
@@ -1849,7 +1887,9 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1849
1887
  c.opacity(1);
1850
1888
  switch (status) {
1851
1889
  case "free":
1852
- c.fill(selected ? lighten(base, 0.28) : base);
1890
+ c.fill(
1891
+ selected && this.effSelection === DEF_SELECTION ? lighten(base, 0.28) : base
1892
+ );
1853
1893
  break;
1854
1894
  case "held":
1855
1895
  c.fill(HELD_FILL);
@@ -2491,6 +2531,31 @@ var _SeatmapRenderer = class _SeatmapRenderer {
2491
2531
  }
2492
2532
  this.overlayLayer.batchDraw();
2493
2533
  }
2534
+ /**
2535
+ * Selection/hover ring color. An explicit theme.selectionColor always wins;
2536
+ * otherwise auto-contrast against the effective canvas background — the
2537
+ * designer renders on dark (white ring reads), but light-themed hosts (e.g.
2538
+ * the DesiPass buyer picker on cream) made the white ring invisible and
2539
+ * selected seats looked *disabled*. theme.background is checked first, then
2540
+ * the container's computed CSS background (walking up past transparent
2541
+ * ancestors). Unknown/unparseable backgrounds keep the dark default.
2542
+ */
2543
+ resolveSelectionColor() {
2544
+ if (this.theme.selectionColor) return this.theme.selectionColor;
2545
+ let bg = this.theme.background ?? "";
2546
+ if (!bg && typeof getComputedStyle === "function") {
2547
+ let el = this.container;
2548
+ while (el) {
2549
+ const c = getComputedStyle(el).backgroundColor;
2550
+ if (c && c !== "transparent" && !/^rgba\(\s*\d+\s*,\s*\d+\s*,\s*\d+\s*,\s*0\s*\)$/.test(c)) {
2551
+ bg = c;
2552
+ break;
2553
+ }
2554
+ el = el.parentElement;
2555
+ }
2556
+ }
2557
+ return isLightColor(bg) ? DEF_SELECTION_ON_LIGHT : DEF_SELECTION;
2558
+ }
2494
2559
  setSelected(id, on, silent = false) {
2495
2560
  const c = this.circleById.get(id);
2496
2561
  if (on) {
@@ -2500,7 +2565,7 @@ var _SeatmapRenderer = class _SeatmapRenderer {
2500
2565
  x: seat.x,
2501
2566
  y: seat.y,
2502
2567
  radius: this.seatR,
2503
- stroke: this.theme.selectionColor ?? DEF_SELECTION,
2568
+ stroke: this.effSelection,
2504
2569
  strokeWidth: 3,
2505
2570
  listening: false,
2506
2571
  perfectDrawEnabled: false,
@@ -2980,7 +3045,10 @@ var PickerController = class {
2980
3045
  this.opts.onDeselect?.(seat);
2981
3046
  this.emitSelectionChange();
2982
3047
  },
2983
- onHover: this.opts.onHover,
3048
+ onHover: (seat) => {
3049
+ this.opts.onHover?.(seat);
3050
+ if (this.opts.onSeatHover) this.opts.onSeatHover(seat ? this.describeSeat(seat) : null);
3051
+ },
2984
3052
  onFocusSeat: this.opts.onFocusSeat,
2985
3053
  onViewChange: this.opts.onViewChange,
2986
3054
  onGAClick: this.opts.onGAClick,
@@ -3407,6 +3475,17 @@ var PickerController = class {
3407
3475
  tierId: chosen.id
3408
3476
  };
3409
3477
  }
3478
+ /** Tooltip payload for a hovered seat — see PickerCallbacks.onSeatHover. */
3479
+ describeSeat(s) {
3480
+ const cat = this._doc?.categories.find((c) => c.key === s.categoryKey);
3481
+ return {
3482
+ ...this.toSeat(s),
3483
+ categoryLabel: cat?.label ?? s.categoryKey,
3484
+ categoryColor: cat?.color ?? "#6e7bff",
3485
+ status: this.renderer?.getStatus(s.id) ?? "free",
3486
+ currency: this.currency
3487
+ };
3488
+ }
3410
3489
  priceFor(categoryKey) {
3411
3490
  return this._doc?.categories.find((c) => c.key === categoryKey)?.price ?? 0;
3412
3491
  }