venuekit 0.10.0 → 0.10.2

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/react.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as Layout, S as SellableUnit, f as LockViolation, r as PieceKind, w as PlanSummary, v as PlaceTypeOption } from './place-types-CeTjPHTF.cjs';
1
+ import { a as Layout, S as SellableUnit, f as LockViolation, w as PieceKind, F as PlanSummary, A as PlaceTypeOption } from './place-types-Dc0eabAi.cjs';
2
2
  import { CSSProperties, ReactElement, ReactNode } from 'react';
3
3
  import 'zod';
4
4
 
@@ -35,6 +35,10 @@ type Messages = {
35
35
  mapLabel: string;
36
36
  zoomIn: string;
37
37
  zoomOut: string;
38
+ /** Con demasiados lugares a la vista no hay un botón por lugar: uno solo acerca el mapa. */
39
+ zoomToChoose: string;
40
+ /** Mapa embebido: la rueda sola hace scroll de la página; para acercar hace falta Ctrl. */
41
+ wheelHint: string;
38
42
  overviewMapLabel: string;
39
43
  overviewList: string;
40
44
  soldOut: string;
@@ -145,7 +149,7 @@ declare function selectionSummary(units: SellableUnit[], ids: readonly string[],
145
149
  * las lee `<VenueCanvas>` con `getComputedStyle` y se las pasa al render, así
146
150
  * que el mapa sigue al tema igual que el resto.
147
151
  */
148
- declare const PICKER_CSS = "\n:where(.vk-root){\n --vk-fg:#0f172a;\n --vk-muted:#64748b;\n --vk-line:#e2e8f0;\n --vk-bg:#ffffff;\n --vk-surface:#f8fafc;\n --vk-accent:#0f172a;\n --vk-accent-fg:#ffffff;\n --vk-radius:8px;\n --vk-radius-lg:12px;\n --vk-font:14px/1.45 system-ui,-apple-system,sans-serif;\n /* S\u00F3lo las dibuja el lienzo (y la leyenda). */\n --vk-taken:#cbd5e1;\n --vk-taken-stroke:#94a3b8;\n --vk-held-stroke:#b45309;\n --vk-shape:#94a3b8;\n --vk-shape-fill:#e2e8f0;\n --vk-unassigned:#9ca3af;\n --vk-zone-alpha:38;\n /* Mapa del comprador: tuya, vendida, numero sobre la butaca y referencias. */\n --vk-zone-alpha-selected:66;\n --vk-mine:#ffffff;\n --vk-sold:#2a2a31;\n --vk-sold-stroke:#3a3a44;\n --vk-sold-fg:#6a6a74;\n --vk-unit-fg:#0b0b0d;\n --vk-landmark:#23232a;\n --vk-landmark-stroke:#34343c;\n --vk-landmark-fg:#d6d6dc;\n}\n.vk-root{display:flex;flex-direction:column;gap:12px;font:var(--vk-font);\n color:var(--vk-fg);background:var(--vk-bg);position:relative;box-sizing:border-box;\n /* Sin alto propio: embebido en la pagina de un host, mide lo que mide su\n contenido. El alto de pantalla completa esta detras de data-fill.\n (Sin acentos graves en este comentario: vive adentro de un template literal\n de TypeScript y cada uno lo cortaria al medio.) */\n }\n.vk-root[data-fill=\"true\"]{height:100vh;height:100dvh;max-height:100dvh}\n.vk-root *{box-sizing:border-box}\n/* El alto sale de la proporcion del plano (--vk-plan-ratio, lo pone el\n componente), acotado para que un plano muy alto no empuje la barra fuera\n de la pantalla ni uno muy apaisado quede en una tira. */\n.vk-map{position:relative;flex:none;width:100%;aspect-ratio:var(--vk-plan-ratio, 3 / 2);\n min-height:300px;max-height:70vh;background:var(--vk-surface);\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);overflow:hidden;touch-action:none}\n.vk-root[data-fill=\"true\"] .vk-map{flex:1;aspect-ratio:auto;min-height:0;max-height:none}\n.vk-canvas{display:block;width:100%;height:100%}\n.vk-a11y{position:absolute;inset:0;pointer-events:none}\n.vk-seat{position:absolute;transform:translate(-50%,-50%);padding:0;margin:0;border:0;background:transparent;\n border-radius:50%;cursor:pointer;color:transparent;overflow:hidden}\n.vk-seat:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-zoom{position:absolute;right:8px;bottom:8px;display:flex;flex-direction:column;gap:4px}\n.vk-zoom button{width:36px;height:36px;border:1px solid var(--vk-line);background:var(--vk-bg);\n color:var(--vk-fg);border-radius:var(--vk-radius);font-size:16px;line-height:1;cursor:pointer}\n.vk-type{margin:0;display:flex;align-items:center;gap:8px;font-weight:600}\n.vk-legend{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px 16px;\n color:var(--vk-muted);font-size:13px}\n.vk-legend li{display:flex;align-items:center;gap:6px}\n.vk-dot{width:14px;height:14px;border-radius:50%;flex:none;box-sizing:border-box}\n.vk-dot[data-state=\"selected\"]{background:var(--vk-mine);border:3px solid var(--vk-accent)}\n.vk-dot[data-state=\"taken\"]{background:var(--vk-sold);border:1px solid var(--vk-sold-stroke)}\n.vk-cta{border:1px solid var(--vk-accent);background:var(--vk-accent);color:var(--vk-accent-fg);\n border-radius:var(--vk-radius);padding:10px 16px;cursor:pointer;font-size:14px;font-weight:600;min-height:44px}\n.vk-cta:disabled{opacity:.5;cursor:default}\n.vk-bar{flex:none;display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);background:var(--vk-bg)}\n.vk-bar-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.vk-bar-summary{font-weight:600}\n.vk-bar-total{font-variant-numeric:tabular-nums}\n.vk-bar-hold{color:var(--vk-muted);font-size:13px}\n.vk-notice{margin:0;padding:8px 12px;border-radius:var(--vk-radius);background:var(--vk-surface);\n border:1px solid var(--vk-line);color:var(--vk-fg);font-size:13px}\n.vk-notice:empty{display:none}\n.vk-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n/* El mapa entero: debajo, un boton por entrada (lo que usa el teclado y el lector). */\n.vk-types{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.vk-type-btn{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:10px 14px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius);background:var(--vk-bg);color:var(--vk-fg);\n font:inherit;text-align:left;cursor:pointer}\n.vk-type-btn:hover{border-color:var(--vk-accent)}\n.vk-type-btn:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-type-btn[aria-disabled=\"true\"]{cursor:default;opacity:.55}\n.vk-type-btn[aria-disabled=\"true\"]:hover{border-color:var(--vk-line)}\n.vk-type-name{flex:1;min-width:0;font-weight:600;overflow-wrap:anywhere}\n.vk-type-price{flex:none;font-variant-numeric:tabular-nums;color:var(--vk-muted)}\n.vk-type-out{flex:none;font-size:13px;font-weight:600;color:var(--vk-muted)}\n/* Embebido en una tarjeta del host: sin borde propio, encabezado arriba y leyenda abajo. */\n.vk-root[data-embedded=\"true\"]{gap:0}\n.vk-root[data-embedded=\"true\"] .vk-map{border:0;border-radius:0}\n.vk-root[data-embedded=\"true\"] .vk-legend{padding:12px 16px;border-top:1px solid var(--vk-line)}\n.vk-root[data-embedded=\"true\"] .vk-notice{margin:8px 14px 0}\n.vk-head{margin:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;min-height:52px;padding:8px 14px;\n border-bottom:1px solid var(--vk-line)}\n.vk-back{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:1px solid var(--vk-line);\n border-radius:var(--vk-radius);background:transparent;color:var(--vk-fg);font:inherit;cursor:pointer}\n.vk-back:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-head-title{display:inline-flex;align-items:center;gap:8px;min-width:0;font-weight:700;overflow-wrap:anywhere}\n.vk-head-hint{min-width:0;color:var(--vk-muted);font-size:13px}\n/* Con hideList la lista sigue para el teclado y el lector, oculta hasta que un boton toma el foco. */\n.vk-types[data-hidden=\"true\"]:not(:focus-within){position:absolute;width:1px;height:1px;margin:-1px;padding:0;\n overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.vk-types[data-hidden=\"true\"]:focus-within{padding:12px 14px;border-top:1px solid var(--vk-line)}\n.vk-type-btn[data-selected=\"true\"]{border-color:var(--vk-accent)}\n";
152
+ declare const PICKER_CSS = "\n:where(.vk-root){\n --vk-fg:#0f172a;\n --vk-muted:#64748b;\n --vk-line:#e2e8f0;\n --vk-bg:#ffffff;\n --vk-surface:#f8fafc;\n --vk-accent:#0f172a;\n --vk-accent-fg:#ffffff;\n --vk-radius:8px;\n --vk-radius-lg:12px;\n --vk-font:14px/1.45 system-ui,-apple-system,sans-serif;\n /* S\u00F3lo las dibuja el lienzo (y la leyenda). */\n --vk-taken:#cbd5e1;\n --vk-taken-stroke:#94a3b8;\n --vk-held-stroke:#b45309;\n --vk-shape:#94a3b8;\n --vk-shape-fill:#e2e8f0;\n --vk-unassigned:#9ca3af;\n --vk-zone-alpha:38;\n /* Mapa del comprador: tuya, vendida, numero sobre la butaca y referencias. */\n --vk-zone-alpha-selected:66;\n --vk-mine:#ffffff;\n --vk-sold:#2a2a31;\n --vk-sold-stroke:#3a3a44;\n --vk-sold-fg:#6a6a74;\n --vk-unit-fg:#0b0b0d;\n --vk-landmark:#23232a;\n --vk-landmark-stroke:#34343c;\n --vk-landmark-fg:#d6d6dc;\n}\n.vk-root{display:flex;flex-direction:column;gap:12px;font:var(--vk-font);\n color:var(--vk-fg);background:var(--vk-bg);position:relative;box-sizing:border-box;\n /* Sin alto propio: embebido en la pagina de un host, mide lo que mide su\n contenido. El alto de pantalla completa esta detras de data-fill.\n (Sin acentos graves en este comentario: vive adentro de un template literal\n de TypeScript y cada uno lo cortaria al medio.) */\n }\n.vk-root[data-fill=\"true\"]{height:100vh;height:100dvh;max-height:100dvh}\n.vk-root *{box-sizing:border-box}\n/* El alto sale de la proporcion del plano (--vk-plan-ratio, lo pone el\n componente), acotado para que un plano muy alto no empuje la barra fuera\n de la pantalla ni uno muy apaisado quede en una tira. */\n.vk-map{position:relative;flex:none;width:100%;aspect-ratio:var(--vk-plan-ratio, 3 / 2);\n min-height:300px;max-height:70vh;background:var(--vk-surface);\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);overflow:hidden;touch-action:none}\n.vk-root[data-fill=\"true\"] .vk-map{flex:1;aspect-ratio:auto;min-height:0;max-height:none}\n.vk-map[data-cooperative=\"true\"]{touch-action:pan-y}\n.vk-canvas{display:block;width:100%;height:100%}\n.vk-a11y{position:absolute;inset:0;pointer-events:none}\n.vk-seat{position:absolute;transform:translate(-50%,-50%);padding:0;margin:0;border:0;background:transparent;\n border-radius:50%;cursor:pointer;color:transparent;overflow:hidden}\n.vk-seat:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-choose{position:absolute;left:8px;top:8px;max-width:calc(100% - 64px);min-height:44px;padding:8px 12px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius);background:var(--vk-bg);color:var(--vk-fg);\n font:inherit;font-size:14px;text-align:left;cursor:pointer;opacity:0}\n.vk-choose:focus{opacity:1;pointer-events:auto;outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-map-hint{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;max-width:calc(100% - 32px);\n padding:8px 12px;border-radius:var(--vk-radius);background:rgba(0,0,0,.72);color:#fff;font-size:14px;\n text-align:center;pointer-events:none}\n.vk-zoom{position:absolute;right:8px;bottom:8px;display:flex;flex-direction:column;gap:4px}\n.vk-zoom button{width:36px;height:36px;border:1px solid var(--vk-line);background:var(--vk-bg);\n color:var(--vk-fg);border-radius:var(--vk-radius);font-size:16px;line-height:1;cursor:pointer}\n.vk-type{margin:0;display:flex;align-items:center;gap:8px;font-weight:600}\n.vk-legend{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px 16px;\n color:var(--vk-muted);font-size:13px}\n.vk-legend li{display:flex;align-items:center;gap:6px}\n.vk-dot{width:14px;height:14px;border-radius:50%;flex:none;box-sizing:border-box}\n.vk-dot[data-state=\"selected\"]{background:var(--vk-mine);border:3px solid var(--vk-accent)}\n.vk-dot[data-state=\"taken\"]{background:var(--vk-sold);border:1px solid var(--vk-sold-stroke)}\n.vk-cta{border:1px solid var(--vk-accent);background:var(--vk-accent);color:var(--vk-accent-fg);\n border-radius:var(--vk-radius);padding:10px 16px;cursor:pointer;font-size:14px;font-weight:600;min-height:44px}\n.vk-cta:disabled{opacity:.5;cursor:default}\n.vk-bar{flex:none;display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);background:var(--vk-bg)}\n.vk-bar-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.vk-bar-summary{font-weight:600}\n.vk-bar-total{font-variant-numeric:tabular-nums}\n.vk-bar-hold{color:var(--vk-muted);font-size:13px}\n.vk-notice{margin:0;padding:8px 12px;border-radius:var(--vk-radius);background:var(--vk-surface);\n border:1px solid var(--vk-line);color:var(--vk-fg);font-size:13px}\n.vk-notice:empty{display:none}\n.vk-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n/* El mapa entero: debajo, un boton por entrada (lo que usa el teclado y el lector). */\n.vk-types{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.vk-type-btn{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:10px 14px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius);background:var(--vk-bg);color:var(--vk-fg);\n font:inherit;text-align:left;cursor:pointer}\n.vk-type-btn:hover{border-color:var(--vk-accent)}\n.vk-type-btn:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-type-btn[aria-disabled=\"true\"]{cursor:default;opacity:.55}\n.vk-type-btn[aria-disabled=\"true\"]:hover{border-color:var(--vk-line)}\n.vk-type-name{flex:1;min-width:0;font-weight:600;overflow-wrap:anywhere}\n.vk-type-price{flex:none;font-variant-numeric:tabular-nums;color:var(--vk-muted)}\n.vk-type-out{flex:none;font-size:13px;font-weight:600;color:var(--vk-muted)}\n/* Embebido en una tarjeta del host: sin borde propio, encabezado arriba y leyenda abajo. */\n.vk-root[data-embedded=\"true\"]{gap:0}\n.vk-root[data-embedded=\"true\"] .vk-map{border:0;border-radius:0}\n.vk-root[data-embedded=\"true\"] .vk-legend{padding:12px 16px;border-top:1px solid var(--vk-line)}\n.vk-root[data-embedded=\"true\"] .vk-notice{margin:8px 14px 0}\n.vk-head{margin:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;min-height:52px;padding:8px 14px;\n border-bottom:1px solid var(--vk-line)}\n.vk-back{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:1px solid var(--vk-line);\n border-radius:var(--vk-radius);background:transparent;color:var(--vk-fg);font:inherit;cursor:pointer}\n.vk-back:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-head-title{display:inline-flex;align-items:center;gap:8px;min-width:0;font-weight:700;overflow-wrap:anywhere}\n.vk-head-hint{min-width:0;color:var(--vk-muted);font-size:13px}\n/* Con hideList la lista sigue para el teclado y el lector, oculta hasta que un boton toma el foco. */\n.vk-types[data-hidden=\"true\"]:not(:focus-within){position:absolute;width:1px;height:1px;margin:-1px;padding:0;\n overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.vk-types[data-hidden=\"true\"]:focus-within{padding:12px 14px;border-top:1px solid var(--vk-line)}\n.vk-type-btn[data-selected=\"true\"]{border-color:var(--vk-accent)}\n";
149
153
 
150
154
  type VenueOverviewPlaceType = {
151
155
  ref: string;
@@ -376,6 +380,10 @@ type DesignerMessages = {
376
380
  trimToCapacityLabel: string;
377
381
  trimPartial: string;
378
382
  rejectCapacity: string;
383
+ /** El cambio dejaría el plano fuera de los topes del esquema (una pieza demasiado grande, coordenadas absurdas). */
384
+ rejectInvalid: string;
385
+ /** El cambio pasaría el máximo de lugares de un plano (`MAX_UNITS`). */
386
+ rejectTooManyUnits: string;
379
387
  zonesTitle: string;
380
388
  zonesHint: string;
381
389
  acceptsZone: string;
@@ -434,10 +442,14 @@ type CapacityRejection = {
434
442
  capacity: number;
435
443
  placed: number;
436
444
  };
437
- /** Por qué no se aplicó un cambio: lo vendido (`violations`) o el cupo de una entrada (`capacity`). */
445
+ /**
446
+ * Por qué no se aplicó un cambio: lo vendido (`violations`), el cupo de una entrada
447
+ * (`capacity`) o un plano que quedaría inválido (`invalid`, el detalle del esquema, para el host).
448
+ */
438
449
  type DesignerRejection = {
439
450
  violations: LockViolation[];
440
451
  capacity?: CapacityRejection[];
452
+ invalid?: string;
441
453
  };
442
454
 
443
455
  /**
@@ -579,6 +591,6 @@ type UseImageResult = {
579
591
  */
580
592
  declare function useImage(src: string | null): UseImageResult;
581
593
 
582
- declare const VERSION = "0.10.0";
594
+ declare const VERSION = "0.10.2";
583
595
 
584
596
  export { type CapacityRejection, DESIGNER_CSS, type DesignerHostApi, type DesignerMessages, type DesignerOverrides, type DesignerRejection, type MessageOverrides, type Messages, PICKER_CSS, type PlacedCount, SeatMap, type SeatMapPlaceType, type SeatMapProps, type UseImageResult, VERSION, VenueDesigner, type VenueDesignerProps, VenueOverview, type VenueOverviewPlaceType, type VenueOverviewProps, designerEn, designerEs, en, es, format, mergeDesignerMessages, mergeMessages, selectionSummary, useImage };
package/dist/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as Layout, S as SellableUnit, f as LockViolation, r as PieceKind, w as PlanSummary, v as PlaceTypeOption } from './place-types-CeTjPHTF.js';
1
+ import { a as Layout, S as SellableUnit, f as LockViolation, w as PieceKind, F as PlanSummary, A as PlaceTypeOption } from './place-types-Dc0eabAi.js';
2
2
  import { CSSProperties, ReactElement, ReactNode } from 'react';
3
3
  import 'zod';
4
4
 
@@ -35,6 +35,10 @@ type Messages = {
35
35
  mapLabel: string;
36
36
  zoomIn: string;
37
37
  zoomOut: string;
38
+ /** Con demasiados lugares a la vista no hay un botón por lugar: uno solo acerca el mapa. */
39
+ zoomToChoose: string;
40
+ /** Mapa embebido: la rueda sola hace scroll de la página; para acercar hace falta Ctrl. */
41
+ wheelHint: string;
38
42
  overviewMapLabel: string;
39
43
  overviewList: string;
40
44
  soldOut: string;
@@ -145,7 +149,7 @@ declare function selectionSummary(units: SellableUnit[], ids: readonly string[],
145
149
  * las lee `<VenueCanvas>` con `getComputedStyle` y se las pasa al render, así
146
150
  * que el mapa sigue al tema igual que el resto.
147
151
  */
148
- declare const PICKER_CSS = "\n:where(.vk-root){\n --vk-fg:#0f172a;\n --vk-muted:#64748b;\n --vk-line:#e2e8f0;\n --vk-bg:#ffffff;\n --vk-surface:#f8fafc;\n --vk-accent:#0f172a;\n --vk-accent-fg:#ffffff;\n --vk-radius:8px;\n --vk-radius-lg:12px;\n --vk-font:14px/1.45 system-ui,-apple-system,sans-serif;\n /* S\u00F3lo las dibuja el lienzo (y la leyenda). */\n --vk-taken:#cbd5e1;\n --vk-taken-stroke:#94a3b8;\n --vk-held-stroke:#b45309;\n --vk-shape:#94a3b8;\n --vk-shape-fill:#e2e8f0;\n --vk-unassigned:#9ca3af;\n --vk-zone-alpha:38;\n /* Mapa del comprador: tuya, vendida, numero sobre la butaca y referencias. */\n --vk-zone-alpha-selected:66;\n --vk-mine:#ffffff;\n --vk-sold:#2a2a31;\n --vk-sold-stroke:#3a3a44;\n --vk-sold-fg:#6a6a74;\n --vk-unit-fg:#0b0b0d;\n --vk-landmark:#23232a;\n --vk-landmark-stroke:#34343c;\n --vk-landmark-fg:#d6d6dc;\n}\n.vk-root{display:flex;flex-direction:column;gap:12px;font:var(--vk-font);\n color:var(--vk-fg);background:var(--vk-bg);position:relative;box-sizing:border-box;\n /* Sin alto propio: embebido en la pagina de un host, mide lo que mide su\n contenido. El alto de pantalla completa esta detras de data-fill.\n (Sin acentos graves en este comentario: vive adentro de un template literal\n de TypeScript y cada uno lo cortaria al medio.) */\n }\n.vk-root[data-fill=\"true\"]{height:100vh;height:100dvh;max-height:100dvh}\n.vk-root *{box-sizing:border-box}\n/* El alto sale de la proporcion del plano (--vk-plan-ratio, lo pone el\n componente), acotado para que un plano muy alto no empuje la barra fuera\n de la pantalla ni uno muy apaisado quede en una tira. */\n.vk-map{position:relative;flex:none;width:100%;aspect-ratio:var(--vk-plan-ratio, 3 / 2);\n min-height:300px;max-height:70vh;background:var(--vk-surface);\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);overflow:hidden;touch-action:none}\n.vk-root[data-fill=\"true\"] .vk-map{flex:1;aspect-ratio:auto;min-height:0;max-height:none}\n.vk-canvas{display:block;width:100%;height:100%}\n.vk-a11y{position:absolute;inset:0;pointer-events:none}\n.vk-seat{position:absolute;transform:translate(-50%,-50%);padding:0;margin:0;border:0;background:transparent;\n border-radius:50%;cursor:pointer;color:transparent;overflow:hidden}\n.vk-seat:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-zoom{position:absolute;right:8px;bottom:8px;display:flex;flex-direction:column;gap:4px}\n.vk-zoom button{width:36px;height:36px;border:1px solid var(--vk-line);background:var(--vk-bg);\n color:var(--vk-fg);border-radius:var(--vk-radius);font-size:16px;line-height:1;cursor:pointer}\n.vk-type{margin:0;display:flex;align-items:center;gap:8px;font-weight:600}\n.vk-legend{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px 16px;\n color:var(--vk-muted);font-size:13px}\n.vk-legend li{display:flex;align-items:center;gap:6px}\n.vk-dot{width:14px;height:14px;border-radius:50%;flex:none;box-sizing:border-box}\n.vk-dot[data-state=\"selected\"]{background:var(--vk-mine);border:3px solid var(--vk-accent)}\n.vk-dot[data-state=\"taken\"]{background:var(--vk-sold);border:1px solid var(--vk-sold-stroke)}\n.vk-cta{border:1px solid var(--vk-accent);background:var(--vk-accent);color:var(--vk-accent-fg);\n border-radius:var(--vk-radius);padding:10px 16px;cursor:pointer;font-size:14px;font-weight:600;min-height:44px}\n.vk-cta:disabled{opacity:.5;cursor:default}\n.vk-bar{flex:none;display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);background:var(--vk-bg)}\n.vk-bar-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.vk-bar-summary{font-weight:600}\n.vk-bar-total{font-variant-numeric:tabular-nums}\n.vk-bar-hold{color:var(--vk-muted);font-size:13px}\n.vk-notice{margin:0;padding:8px 12px;border-radius:var(--vk-radius);background:var(--vk-surface);\n border:1px solid var(--vk-line);color:var(--vk-fg);font-size:13px}\n.vk-notice:empty{display:none}\n.vk-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n/* El mapa entero: debajo, un boton por entrada (lo que usa el teclado y el lector). */\n.vk-types{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.vk-type-btn{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:10px 14px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius);background:var(--vk-bg);color:var(--vk-fg);\n font:inherit;text-align:left;cursor:pointer}\n.vk-type-btn:hover{border-color:var(--vk-accent)}\n.vk-type-btn:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-type-btn[aria-disabled=\"true\"]{cursor:default;opacity:.55}\n.vk-type-btn[aria-disabled=\"true\"]:hover{border-color:var(--vk-line)}\n.vk-type-name{flex:1;min-width:0;font-weight:600;overflow-wrap:anywhere}\n.vk-type-price{flex:none;font-variant-numeric:tabular-nums;color:var(--vk-muted)}\n.vk-type-out{flex:none;font-size:13px;font-weight:600;color:var(--vk-muted)}\n/* Embebido en una tarjeta del host: sin borde propio, encabezado arriba y leyenda abajo. */\n.vk-root[data-embedded=\"true\"]{gap:0}\n.vk-root[data-embedded=\"true\"] .vk-map{border:0;border-radius:0}\n.vk-root[data-embedded=\"true\"] .vk-legend{padding:12px 16px;border-top:1px solid var(--vk-line)}\n.vk-root[data-embedded=\"true\"] .vk-notice{margin:8px 14px 0}\n.vk-head{margin:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;min-height:52px;padding:8px 14px;\n border-bottom:1px solid var(--vk-line)}\n.vk-back{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:1px solid var(--vk-line);\n border-radius:var(--vk-radius);background:transparent;color:var(--vk-fg);font:inherit;cursor:pointer}\n.vk-back:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-head-title{display:inline-flex;align-items:center;gap:8px;min-width:0;font-weight:700;overflow-wrap:anywhere}\n.vk-head-hint{min-width:0;color:var(--vk-muted);font-size:13px}\n/* Con hideList la lista sigue para el teclado y el lector, oculta hasta que un boton toma el foco. */\n.vk-types[data-hidden=\"true\"]:not(:focus-within){position:absolute;width:1px;height:1px;margin:-1px;padding:0;\n overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.vk-types[data-hidden=\"true\"]:focus-within{padding:12px 14px;border-top:1px solid var(--vk-line)}\n.vk-type-btn[data-selected=\"true\"]{border-color:var(--vk-accent)}\n";
152
+ declare const PICKER_CSS = "\n:where(.vk-root){\n --vk-fg:#0f172a;\n --vk-muted:#64748b;\n --vk-line:#e2e8f0;\n --vk-bg:#ffffff;\n --vk-surface:#f8fafc;\n --vk-accent:#0f172a;\n --vk-accent-fg:#ffffff;\n --vk-radius:8px;\n --vk-radius-lg:12px;\n --vk-font:14px/1.45 system-ui,-apple-system,sans-serif;\n /* S\u00F3lo las dibuja el lienzo (y la leyenda). */\n --vk-taken:#cbd5e1;\n --vk-taken-stroke:#94a3b8;\n --vk-held-stroke:#b45309;\n --vk-shape:#94a3b8;\n --vk-shape-fill:#e2e8f0;\n --vk-unassigned:#9ca3af;\n --vk-zone-alpha:38;\n /* Mapa del comprador: tuya, vendida, numero sobre la butaca y referencias. */\n --vk-zone-alpha-selected:66;\n --vk-mine:#ffffff;\n --vk-sold:#2a2a31;\n --vk-sold-stroke:#3a3a44;\n --vk-sold-fg:#6a6a74;\n --vk-unit-fg:#0b0b0d;\n --vk-landmark:#23232a;\n --vk-landmark-stroke:#34343c;\n --vk-landmark-fg:#d6d6dc;\n}\n.vk-root{display:flex;flex-direction:column;gap:12px;font:var(--vk-font);\n color:var(--vk-fg);background:var(--vk-bg);position:relative;box-sizing:border-box;\n /* Sin alto propio: embebido en la pagina de un host, mide lo que mide su\n contenido. El alto de pantalla completa esta detras de data-fill.\n (Sin acentos graves en este comentario: vive adentro de un template literal\n de TypeScript y cada uno lo cortaria al medio.) */\n }\n.vk-root[data-fill=\"true\"]{height:100vh;height:100dvh;max-height:100dvh}\n.vk-root *{box-sizing:border-box}\n/* El alto sale de la proporcion del plano (--vk-plan-ratio, lo pone el\n componente), acotado para que un plano muy alto no empuje la barra fuera\n de la pantalla ni uno muy apaisado quede en una tira. */\n.vk-map{position:relative;flex:none;width:100%;aspect-ratio:var(--vk-plan-ratio, 3 / 2);\n min-height:300px;max-height:70vh;background:var(--vk-surface);\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);overflow:hidden;touch-action:none}\n.vk-root[data-fill=\"true\"] .vk-map{flex:1;aspect-ratio:auto;min-height:0;max-height:none}\n.vk-map[data-cooperative=\"true\"]{touch-action:pan-y}\n.vk-canvas{display:block;width:100%;height:100%}\n.vk-a11y{position:absolute;inset:0;pointer-events:none}\n.vk-seat{position:absolute;transform:translate(-50%,-50%);padding:0;margin:0;border:0;background:transparent;\n border-radius:50%;cursor:pointer;color:transparent;overflow:hidden}\n.vk-seat:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-choose{position:absolute;left:8px;top:8px;max-width:calc(100% - 64px);min-height:44px;padding:8px 12px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius);background:var(--vk-bg);color:var(--vk-fg);\n font:inherit;font-size:14px;text-align:left;cursor:pointer;opacity:0}\n.vk-choose:focus{opacity:1;pointer-events:auto;outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-map-hint{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;max-width:calc(100% - 32px);\n padding:8px 12px;border-radius:var(--vk-radius);background:rgba(0,0,0,.72);color:#fff;font-size:14px;\n text-align:center;pointer-events:none}\n.vk-zoom{position:absolute;right:8px;bottom:8px;display:flex;flex-direction:column;gap:4px}\n.vk-zoom button{width:36px;height:36px;border:1px solid var(--vk-line);background:var(--vk-bg);\n color:var(--vk-fg);border-radius:var(--vk-radius);font-size:16px;line-height:1;cursor:pointer}\n.vk-type{margin:0;display:flex;align-items:center;gap:8px;font-weight:600}\n.vk-legend{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:6px 16px;\n color:var(--vk-muted);font-size:13px}\n.vk-legend li{display:flex;align-items:center;gap:6px}\n.vk-dot{width:14px;height:14px;border-radius:50%;flex:none;box-sizing:border-box}\n.vk-dot[data-state=\"selected\"]{background:var(--vk-mine);border:3px solid var(--vk-accent)}\n.vk-dot[data-state=\"taken\"]{background:var(--vk-sold);border:1px solid var(--vk-sold-stroke)}\n.vk-cta{border:1px solid var(--vk-accent);background:var(--vk-accent);color:var(--vk-accent-fg);\n border-radius:var(--vk-radius);padding:10px 16px;cursor:pointer;font-size:14px;font-weight:600;min-height:44px}\n.vk-cta:disabled{opacity:.5;cursor:default}\n.vk-bar{flex:none;display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius-lg);background:var(--vk-bg)}\n.vk-bar-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.vk-bar-summary{font-weight:600}\n.vk-bar-total{font-variant-numeric:tabular-nums}\n.vk-bar-hold{color:var(--vk-muted);font-size:13px}\n.vk-notice{margin:0;padding:8px 12px;border-radius:var(--vk-radius);background:var(--vk-surface);\n border:1px solid var(--vk-line);color:var(--vk-fg);font-size:13px}\n.vk-notice:empty{display:none}\n.vk-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n/* El mapa entero: debajo, un boton por entrada (lo que usa el teclado y el lector). */\n.vk-types{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.vk-type-btn{display:flex;align-items:center;gap:10px;width:100%;min-height:48px;padding:10px 14px;\n border:1px solid var(--vk-line);border-radius:var(--vk-radius);background:var(--vk-bg);color:var(--vk-fg);\n font:inherit;text-align:left;cursor:pointer}\n.vk-type-btn:hover{border-color:var(--vk-accent)}\n.vk-type-btn:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-type-btn[aria-disabled=\"true\"]{cursor:default;opacity:.55}\n.vk-type-btn[aria-disabled=\"true\"]:hover{border-color:var(--vk-line)}\n.vk-type-name{flex:1;min-width:0;font-weight:600;overflow-wrap:anywhere}\n.vk-type-price{flex:none;font-variant-numeric:tabular-nums;color:var(--vk-muted)}\n.vk-type-out{flex:none;font-size:13px;font-weight:600;color:var(--vk-muted)}\n/* Embebido en una tarjeta del host: sin borde propio, encabezado arriba y leyenda abajo. */\n.vk-root[data-embedded=\"true\"]{gap:0}\n.vk-root[data-embedded=\"true\"] .vk-map{border:0;border-radius:0}\n.vk-root[data-embedded=\"true\"] .vk-legend{padding:12px 16px;border-top:1px solid var(--vk-line)}\n.vk-root[data-embedded=\"true\"] .vk-notice{margin:8px 14px 0}\n.vk-head{margin:0;display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;min-height:52px;padding:8px 14px;\n border-bottom:1px solid var(--vk-line)}\n.vk-back{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:1px solid var(--vk-line);\n border-radius:var(--vk-radius);background:transparent;color:var(--vk-fg);font:inherit;cursor:pointer}\n.vk-back:focus-visible{outline:3px solid var(--vk-accent);outline-offset:2px}\n.vk-head-title{display:inline-flex;align-items:center;gap:8px;min-width:0;font-weight:700;overflow-wrap:anywhere}\n.vk-head-hint{min-width:0;color:var(--vk-muted);font-size:13px}\n/* Con hideList la lista sigue para el teclado y el lector, oculta hasta que un boton toma el foco. */\n.vk-types[data-hidden=\"true\"]:not(:focus-within){position:absolute;width:1px;height:1px;margin:-1px;padding:0;\n overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.vk-types[data-hidden=\"true\"]:focus-within{padding:12px 14px;border-top:1px solid var(--vk-line)}\n.vk-type-btn[data-selected=\"true\"]{border-color:var(--vk-accent)}\n";
149
153
 
150
154
  type VenueOverviewPlaceType = {
151
155
  ref: string;
@@ -376,6 +380,10 @@ type DesignerMessages = {
376
380
  trimToCapacityLabel: string;
377
381
  trimPartial: string;
378
382
  rejectCapacity: string;
383
+ /** El cambio dejaría el plano fuera de los topes del esquema (una pieza demasiado grande, coordenadas absurdas). */
384
+ rejectInvalid: string;
385
+ /** El cambio pasaría el máximo de lugares de un plano (`MAX_UNITS`). */
386
+ rejectTooManyUnits: string;
379
387
  zonesTitle: string;
380
388
  zonesHint: string;
381
389
  acceptsZone: string;
@@ -434,10 +442,14 @@ type CapacityRejection = {
434
442
  capacity: number;
435
443
  placed: number;
436
444
  };
437
- /** Por qué no se aplicó un cambio: lo vendido (`violations`) o el cupo de una entrada (`capacity`). */
445
+ /**
446
+ * Por qué no se aplicó un cambio: lo vendido (`violations`), el cupo de una entrada
447
+ * (`capacity`) o un plano que quedaría inválido (`invalid`, el detalle del esquema, para el host).
448
+ */
438
449
  type DesignerRejection = {
439
450
  violations: LockViolation[];
440
451
  capacity?: CapacityRejection[];
452
+ invalid?: string;
441
453
  };
442
454
 
443
455
  /**
@@ -579,6 +591,6 @@ type UseImageResult = {
579
591
  */
580
592
  declare function useImage(src: string | null): UseImageResult;
581
593
 
582
- declare const VERSION = "0.10.0";
594
+ declare const VERSION = "0.10.2";
583
595
 
584
596
  export { type CapacityRejection, DESIGNER_CSS, type DesignerHostApi, type DesignerMessages, type DesignerOverrides, type DesignerRejection, type MessageOverrides, type Messages, PICKER_CSS, type PlacedCount, SeatMap, type SeatMapPlaceType, type SeatMapProps, type UseImageResult, VERSION, VenueDesigner, type VenueDesignerProps, VenueOverview, type VenueOverviewPlaceType, type VenueOverviewProps, designerEn, designerEs, en, es, format, mergeDesignerMessages, mergeMessages, selectionSummary, useImage };