@seatlayer/core 0.1.3 → 0.1.4

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.
@@ -11,7 +11,9 @@ var de = {
11
11
  "picker.seatsHeld": "Pl\xE4tze reserviert \u2014 {time}",
12
12
  "picker.holdExpired": "Ihre Reservierung ist abgelaufen \u2014 die Pl\xE4tze wurden freigegeben. Bitte erneut ausw\xE4hlen.",
13
13
  "picker.seatTaken": "Platz {label} wurde gerade von einem anderen K\xE4ufer gebucht.",
14
- "picker.poweredBy": "Bereitgestellt von SeatMap",
14
+ "picker.poweredBy": "Bereitgestellt von SeatLayer",
15
+ "picker.colorblind": "Farbenblind-freundliche Farben",
16
+ "picker.orphanHint": "Dadurch bleibt ein einzelner Platz \xFCbrig \u2014 r\xFCcken Sie ggf. einen Platz weiter.",
15
17
  "picker.seats.one": "{count} Platz",
16
18
  "picker.seats.other": "{count} Pl\xE4tze",
17
19
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -67,4 +69,4 @@ var de = {
67
69
  export {
68
70
  de
69
71
  };
70
- //# sourceMappingURL=de-Y3E6YTGP.js.map
72
+ //# sourceMappingURL=de-A4KJQ374.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.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.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,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,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":[]}
@@ -11,7 +11,9 @@ var es = {
11
11
  "picker.seatsHeld": "Asientos retenidos \u2014 {time}",
12
12
  "picker.holdExpired": "Tu retenci\xF3n expir\xF3 \u2014 los asientos fueron liberados. Elige de nuevo.",
13
13
  "picker.seatTaken": "El asiento {label} fue tomado por otro comprador.",
14
- "picker.poweredBy": "Con la tecnolog\xEDa de SeatMap",
14
+ "picker.poweredBy": "Con la tecnolog\xEDa de SeatLayer",
15
+ "picker.colorblind": "Colores aptos para daltonismo",
16
+ "picker.orphanHint": "Esto deja un asiento aislado \u2014 considera desplazarte un asiento.",
15
17
  "picker.seats.one": "{count} asiento",
16
18
  "picker.seats.other": "{count} asientos",
17
19
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -67,4 +69,4 @@ var es = {
67
69
  export {
68
70
  es
69
71
  };
70
- //# sourceMappingURL=es-UM4ZS357.js.map
72
+ //# sourceMappingURL=es-YNYMMP37.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.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.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,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,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":[]}
@@ -11,7 +11,9 @@ var fr = {
11
11
  "picker.seatsHeld": "Si\xE8ges r\xE9serv\xE9s \u2014 {time}",
12
12
  "picker.holdExpired": "Votre r\xE9servation a expir\xE9 \u2014 les si\xE8ges ont \xE9t\xE9 lib\xE9r\xE9s. S\xE9lectionnez \xE0 nouveau.",
13
13
  "picker.seatTaken": "Le si\xE8ge {label} vient d'\xEAtre r\xE9serv\xE9 par un autre acheteur.",
14
- "picker.poweredBy": "Propuls\xE9 par SeatMap",
14
+ "picker.poweredBy": "Propuls\xE9 par SeatLayer",
15
+ "picker.colorblind": "Couleurs adapt\xE9es au daltonisme",
16
+ "picker.orphanHint": "Cela laisse un si\xE8ge isol\xE9 \u2014 pensez \xE0 vous d\xE9caler d'un si\xE8ge.",
15
17
  "picker.seats.one": "{count} si\xE8ge",
16
18
  "picker.seats.other": "{count} si\xE8ges",
17
19
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -67,4 +69,4 @@ var fr = {
67
69
  export {
68
70
  fr
69
71
  };
70
- //# sourceMappingURL=fr-IGRD2M4W.js.map
72
+ //# sourceMappingURL=fr-DQ4KWKKF.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.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.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,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA;AAAA,EAGtB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,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
@@ -41,7 +41,9 @@ var init_es = __esm({
41
41
  "picker.seatsHeld": "Asientos retenidos \u2014 {time}",
42
42
  "picker.holdExpired": "Tu retenci\xF3n expir\xF3 \u2014 los asientos fueron liberados. Elige de nuevo.",
43
43
  "picker.seatTaken": "El asiento {label} fue tomado por otro comprador.",
44
- "picker.poweredBy": "Con la tecnolog\xEDa de SeatMap",
44
+ "picker.poweredBy": "Con la tecnolog\xEDa de SeatLayer",
45
+ "picker.colorblind": "Colores aptos para daltonismo",
46
+ "picker.orphanHint": "Esto deja un asiento aislado \u2014 considera desplazarte un asiento.",
45
47
  "picker.seats.one": "{count} asiento",
46
48
  "picker.seats.other": "{count} asientos",
47
49
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -118,7 +120,9 @@ var init_de = __esm({
118
120
  "picker.seatsHeld": "Pl\xE4tze reserviert \u2014 {time}",
119
121
  "picker.holdExpired": "Ihre Reservierung ist abgelaufen \u2014 die Pl\xE4tze wurden freigegeben. Bitte erneut ausw\xE4hlen.",
120
122
  "picker.seatTaken": "Platz {label} wurde gerade von einem anderen K\xE4ufer gebucht.",
121
- "picker.poweredBy": "Bereitgestellt von SeatMap",
123
+ "picker.poweredBy": "Bereitgestellt von SeatLayer",
124
+ "picker.colorblind": "Farbenblind-freundliche Farben",
125
+ "picker.orphanHint": "Dadurch bleibt ein einzelner Platz \xFCbrig \u2014 r\xFCcken Sie ggf. einen Platz weiter.",
122
126
  "picker.seats.one": "{count} Platz",
123
127
  "picker.seats.other": "{count} Pl\xE4tze",
124
128
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -195,7 +199,9 @@ var init_fr = __esm({
195
199
  "picker.seatsHeld": "Si\xE8ges r\xE9serv\xE9s \u2014 {time}",
196
200
  "picker.holdExpired": "Votre r\xE9servation a expir\xE9 \u2014 les si\xE8ges ont \xE9t\xE9 lib\xE9r\xE9s. S\xE9lectionnez \xE0 nouveau.",
197
201
  "picker.seatTaken": "Le si\xE8ge {label} vient d'\xEAtre r\xE9serv\xE9 par un autre acheteur.",
198
- "picker.poweredBy": "Propuls\xE9 par SeatMap",
202
+ "picker.poweredBy": "Propuls\xE9 par SeatLayer",
203
+ "picker.colorblind": "Couleurs adapt\xE9es au daltonisme",
204
+ "picker.orphanHint": "Cela laisse un si\xE8ge isol\xE9 \u2014 pensez \xE0 vous d\xE9caler d'un si\xE8ge.",
199
205
  "picker.seats.one": "{count} si\xE8ge",
200
206
  "picker.seats.other": "{count} si\xE8ges",
201
207
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -796,7 +802,9 @@ var en = {
796
802
  "picker.seatsHeld": "Seats held \u2014 {time}",
797
803
  "picker.holdExpired": "Your hold expired \u2014 the seats were released. Pick again.",
798
804
  "picker.seatTaken": "Seat {label} was just taken by another buyer.",
799
- "picker.poweredBy": "Powered by SeatMap",
805
+ "picker.poweredBy": "Powered by SeatLayer",
806
+ "picker.colorblind": "Colorblind-friendly colors",
807
+ "picker.orphanHint": "This leaves a single seat stranded \u2014 consider shifting one seat over.",
800
808
  "picker.seats.one": "{count} seat",
801
809
  "picker.seats.other": "{count} seats",
802
810
  // renderer (drawn on the Konva map — shared by the embed SDK)
@@ -913,6 +921,7 @@ var ZONE_SUB_PX = 12;
913
921
  var HELD_FILL = "#6b7280";
914
922
  var TAKEN_FILL = "#374151";
915
923
  var NFS_STROKE = "#4b5563";
924
+ var CB_PALETTE = ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7"];
916
925
  var ACCESS_RING = {
917
926
  wheelchair: "#3b82f6",
918
927
  companion: "#8b5cf6",
@@ -1015,6 +1024,10 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1015
1024
  this.statusById = /* @__PURE__ */ new Map();
1016
1025
  this.catColor = /* @__PURE__ */ new Map();
1017
1026
  this.theme = {};
1027
+ /** Colorblind-safe mode (Okabe-Ito hues + hollow booked seats). */
1028
+ this.colorblind = false;
1029
+ /** Category order from the doc — the stable index into the CB palette. */
1030
+ this.catOrder = [];
1018
1031
  this.selection = /* @__PURE__ */ new Set();
1019
1032
  this.selectionRings = /* @__PURE__ */ new Map();
1020
1033
  this.focusedId = null;
@@ -1265,6 +1278,7 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1265
1278
  this.hoverRing.radius(this.seatR + 2);
1266
1279
  this.catColor.clear();
1267
1280
  this.catPrice.clear();
1281
+ this.catOrder = doc.categories.map((c) => c.key);
1268
1282
  for (const c of doc.categories) {
1269
1283
  this.catColor.set(c.key, c.color);
1270
1284
  if (typeof c.price === "number") this.catPrice.set(c.key, c.price);
@@ -1788,12 +1802,18 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1788
1802
  this.hasBoothText = true;
1789
1803
  target.add(t2);
1790
1804
  }
1805
+ /** The category's display color — Okabe-Ito hue when colorblind-safe is on. */
1806
+ seatBaseColor(categoryKey) {
1807
+ if (!this.colorblind) return this.catColor.get(categoryKey) ?? "#6e7bff";
1808
+ const idx = this.catOrder.indexOf(categoryKey);
1809
+ return CB_PALETTE[(idx >= 0 ? idx : 0) % CB_PALETTE.length];
1810
+ }
1791
1811
  /** Apply fill/stroke/opacity for a seat's current status + selection. */
1792
1812
  paintSeat(c, id) {
1793
1813
  const seat = this.seatById.get(id);
1794
1814
  const status = this.statusById.get(id) ?? "free";
1795
1815
  const selected = this.selection.has(id);
1796
- const base = this.catColor.get(seat.categoryKey) ?? "#6e7bff";
1816
+ const base = this.seatBaseColor(seat.categoryKey);
1797
1817
  c.dash([]);
1798
1818
  c.strokeWidth(0);
1799
1819
  c.stroke("");
@@ -1806,8 +1826,15 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1806
1826
  c.fill(HELD_FILL);
1807
1827
  break;
1808
1828
  case "booked":
1809
- c.fill(TAKEN_FILL);
1810
- c.opacity(0.45);
1829
+ if (this.colorblind) {
1830
+ c.fill("rgba(0,0,0,0)");
1831
+ c.stroke(TAKEN_FILL);
1832
+ c.strokeWidth(1.5);
1833
+ c.opacity(0.9);
1834
+ } else {
1835
+ c.fill(TAKEN_FILL);
1836
+ c.opacity(0.45);
1837
+ }
1811
1838
  break;
1812
1839
  case "not_for_sale":
1813
1840
  c.fill(TAKEN_FILL);
@@ -1829,6 +1856,24 @@ var _SeatmapRenderer = class _SeatmapRenderer {
1829
1856
  }
1830
1857
  }
1831
1858
  }
1859
+ /**
1860
+ * Colorblind-safe mode: swap category hues for the Okabe-Ito palette and
1861
+ * render booked seats hollow. Off restores the exact default rendering.
1862
+ */
1863
+ setColorblindSafe(on) {
1864
+ if (on === this.colorblind) return;
1865
+ this.colorblind = on;
1866
+ for (const seat of this.seats) {
1867
+ const c = this.circleById.get(seat.id);
1868
+ if (c) this.paintSeat(c, seat.id);
1869
+ }
1870
+ if (this.cached) {
1871
+ this.seatLayer.clearCache();
1872
+ this.cacheSeatLayer();
1873
+ } else {
1874
+ this.seatLayer.batchDraw();
1875
+ }
1876
+ }
1832
1877
  /**
1833
1878
  * Dim the seats of these section/zone ids (organizer manager use) so held-back
1834
1879
  * inventory is visually distinct on the canvas without hiding it. `null`/empty
@@ -2767,6 +2812,38 @@ function createRenderer(container, opts) {
2767
2812
  return new SeatmapRenderer(container, opts);
2768
2813
  }
2769
2814
 
2815
+ // src/core/orphans.ts
2816
+ function seatIndex(id) {
2817
+ const n = Number(id.slice(id.lastIndexOf(":") + 1));
2818
+ return Number.isFinite(n) ? n : -1;
2819
+ }
2820
+ function strandedSingles(seats, statusOf, selectedIds) {
2821
+ const rows = /* @__PURE__ */ new Map();
2822
+ for (const s of seats) {
2823
+ if (s.kind === "booth") continue;
2824
+ const list = rows.get(s.rowId);
2825
+ if (list) list.push(s);
2826
+ else rows.set(s.rowId, [s]);
2827
+ }
2828
+ const unavailable = (s) => selectedIds.has(s.id) || statusOf(s.id) !== "free";
2829
+ const out = [];
2830
+ for (const list of rows.values()) {
2831
+ if (list.length < 3) continue;
2832
+ list.sort((a, b) => seatIndex(a.id) - seatIndex(b.id));
2833
+ for (let i = 1; i < list.length - 1; i++) {
2834
+ const seat = list[i];
2835
+ if (unavailable(seat)) continue;
2836
+ const left = list[i - 1];
2837
+ const right = list[i + 1];
2838
+ if (seatIndex(seat.id) - seatIndex(left.id) !== 1 || seatIndex(right.id) - seatIndex(seat.id) !== 1) continue;
2839
+ if (!unavailable(left) || !unavailable(right)) continue;
2840
+ if (!selectedIds.has(left.id) && !selectedIds.has(right.id)) continue;
2841
+ out.push(seat);
2842
+ }
2843
+ }
2844
+ return out;
2845
+ }
2846
+
2770
2847
  // src/picker/PickerController.ts
2771
2848
  var DEFAULT_MAX_SELECTION = 10;
2772
2849
  var MAX_BACKOFF_MS = 15e3;
@@ -2801,6 +2878,8 @@ var PickerController = class {
2801
2878
  // hold state
2802
2879
  this.hold_ = null;
2803
2880
  this.expiryTimer = null;
2881
+ /** Whether the last emitted hint was non-null (avoids clearing repeatedly). */
2882
+ this.hintShown = false;
2804
2883
  this.opts = options;
2805
2884
  this.api = options.transport;
2806
2885
  this.key = options.eventKey;
@@ -2896,6 +2975,7 @@ var PickerController = class {
2896
2975
  return null;
2897
2976
  }
2898
2977
  renderer.setChart(this.visibleDoc());
2978
+ if (this.opts.colorblindSafe) renderer.setColorblindSafe?.(true);
2899
2979
  if (seats) this.applySeatsMap(seats);
2900
2980
  this.connect();
2901
2981
  return {
@@ -3267,6 +3347,31 @@ var PickerController = class {
3267
3347
  }
3268
3348
  emitSelectionChange() {
3269
3349
  this.opts.onSelectionChange?.(this.getSelection());
3350
+ this.emitOrphanHint();
3351
+ }
3352
+ /**
3353
+ * Orphan-seat advice on manual selection: when the buyer's current picks
3354
+ * strand one (or more) single free seats between unavailable same-row
3355
+ * neighbors, surface a localized, non-blocking hint. Cleared (null) as soon
3356
+ * as the selection stops stranding anyone.
3357
+ */
3358
+ emitOrphanHint() {
3359
+ if (!this.opts.onHint) return;
3360
+ const r = this.renderer;
3361
+ if (!r) return;
3362
+ const selected = new Set(r.getSelection().map((s) => s.id));
3363
+ const stranded = selected.size ? strandedSingles(this.seatById.values(), (id) => r.getStatus(id), selected) : [];
3364
+ if (stranded.length > 0) {
3365
+ this.hintShown = true;
3366
+ this.opts.onHint(t("picker.orphanHint"));
3367
+ } else if (this.hintShown) {
3368
+ this.hintShown = false;
3369
+ this.opts.onHint(null);
3370
+ }
3371
+ }
3372
+ /** Toggle colorblind-safe rendering at runtime (see PickerOptions.colorblindSafe). */
3373
+ setColorblindSafe(on) {
3374
+ this.renderer?.setColorblindSafe?.(on);
3270
3375
  }
3271
3376
  emitError(err) {
3272
3377
  if (this.opts.onError) this.opts.onError(err);