tickera-angular-components 0.0.1-dev.37 → 0.0.1-dev.39

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.
@@ -3207,6 +3207,217 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
3207
3207
  args: [{ providedIn: 'root' }]
3208
3208
  }] });
3209
3209
 
3210
+ class TicketMapZoomService {
3211
+ currentZoom = signal(1, ...(ngDevMode ? [{ debugName: "currentZoom" }] : []));
3212
+ stage;
3213
+ bookingDataService = inject(PerformanceBookingDataService);
3214
+ defaultConfig = {
3215
+ minZoom: 0.3,
3216
+ maxZoom: 5,
3217
+ zoomStep: 0.1,
3218
+ scaleBy: 1.1,
3219
+ };
3220
+ constructor() { }
3221
+ /**
3222
+ * Set the Konva stage instance
3223
+ */
3224
+ setStage(stage) {
3225
+ this.stage = stage;
3226
+ }
3227
+ /**
3228
+ * Zoom in by one step
3229
+ */
3230
+ zoomIn() {
3231
+ if (!this.stage)
3232
+ return;
3233
+ const newScale = Math.min(this.defaultConfig.maxZoom, this.currentZoom() + this.defaultConfig.zoomStep);
3234
+ this.applyZoom(newScale);
3235
+ }
3236
+ /**
3237
+ * Zoom out by one step
3238
+ */
3239
+ zoomOut() {
3240
+ if (!this.stage)
3241
+ return;
3242
+ const newScale = Math.max(this.defaultConfig.minZoom, this.currentZoom() - this.defaultConfig.zoomStep);
3243
+ this.applyZoom(newScale);
3244
+ }
3245
+ /**
3246
+ * Reset zoom to 100%
3247
+ */
3248
+ resetZoom() {
3249
+ if (!this.stage)
3250
+ return;
3251
+ this.applyZoom(1);
3252
+ }
3253
+ /**
3254
+ * Get current zoom as percentage string
3255
+ */
3256
+ getZoomPercentage() {
3257
+ return Math.round(this.currentZoom() * 100) + '%';
3258
+ }
3259
+ /**
3260
+ * Get current zoom value
3261
+ */
3262
+ getCurrentZoom() {
3263
+ return this.currentZoom();
3264
+ }
3265
+ /**
3266
+ * Apply zoom with center point
3267
+ */
3268
+ applyZoom(newScale) {
3269
+ if (!this.stage)
3270
+ return;
3271
+ const oldScale = this.stage.scaleX();
3272
+ const stageCenter = {
3273
+ x: this.stage.width() / 2,
3274
+ y: this.stage.height() / 2,
3275
+ };
3276
+ const mousePointTo = {
3277
+ x: (stageCenter.x - this.stage.x()) / oldScale,
3278
+ y: (stageCenter.y - this.stage.y()) / oldScale,
3279
+ };
3280
+ this.applyZoomScale(newScale, stageCenter, mousePointTo);
3281
+ }
3282
+ /**
3283
+ * Apply zoom scale with specific center point
3284
+ */
3285
+ applyZoomScale(newScale, centerPoint, mousePointTo) {
3286
+ if (!this.stage)
3287
+ return;
3288
+ this.stage.scaleX(newScale);
3289
+ this.stage.scaleY(newScale);
3290
+ const newPos = {
3291
+ x: centerPoint.x - mousePointTo.x * newScale,
3292
+ y: centerPoint.y - mousePointTo.y * newScale,
3293
+ };
3294
+ this.stage.position(newPos);
3295
+ this.stage.batchDraw();
3296
+ this.currentZoom.set(newScale);
3297
+ this.bookingDataService.updateStageConfig({
3298
+ scaleX: newScale,
3299
+ scaleY: newScale,
3300
+ x: this.stage.x(),
3301
+ y: this.stage.y(),
3302
+ });
3303
+ }
3304
+ /**
3305
+ * Handle mouse wheel zoom toward the cursor position
3306
+ */
3307
+ handleWheelZoom(deltaY) {
3308
+ if (!this.stage)
3309
+ return;
3310
+ const oldScale = this.currentZoom();
3311
+ const pointer = this.stage.getPointerPosition();
3312
+ if (!pointer)
3313
+ return;
3314
+ const scaleBy = this.defaultConfig.scaleBy;
3315
+ const direction = deltaY > 0 ? -1 : 1;
3316
+ const newScale = direction > 0 ? oldScale * scaleBy : oldScale / scaleBy;
3317
+ if (newScale < this.defaultConfig.minZoom || newScale > this.defaultConfig.maxZoom)
3318
+ return;
3319
+ const mousePointTo = {
3320
+ x: (pointer.x - this.stage.x()) / oldScale,
3321
+ y: (pointer.y - this.stage.y()) / oldScale,
3322
+ };
3323
+ this.applyZoomScale(newScale, pointer, mousePointTo);
3324
+ }
3325
+ /**
3326
+ * Fit the content bounds to fill the stage container
3327
+ */
3328
+ fitToContainer(padding = 24) {
3329
+ if (!this.stage)
3330
+ return;
3331
+ const containerEl = this.stage.container().parentElement;
3332
+ if (!containerEl)
3333
+ return;
3334
+ const containerWidth = containerEl.offsetWidth;
3335
+ const containerHeight = containerEl.offsetHeight;
3336
+ if (containerWidth === 0 || containerHeight === 0)
3337
+ return;
3338
+ const renderData = this.bookingDataService.renderData();
3339
+ if (renderData.length === 0)
3340
+ return;
3341
+ let minX = Infinity, minY = Infinity;
3342
+ let maxX = -Infinity, maxY = -Infinity;
3343
+ for (const el of renderData) {
3344
+ const c = el.shapeConfig;
3345
+ if (c['x'] !== undefined) {
3346
+ minX = Math.min(minX, c['x']);
3347
+ maxX = Math.max(maxX, c['x'] + (c['width'] || 0));
3348
+ }
3349
+ if (c['y'] !== undefined) {
3350
+ minY = Math.min(minY, c['y']);
3351
+ maxY = Math.max(maxY, c['y'] + (c['height'] || 0));
3352
+ }
3353
+ }
3354
+ if (!isFinite(minX))
3355
+ return;
3356
+ const contentW = maxX - minX;
3357
+ const contentH = maxY - minY;
3358
+ if (contentW <= 0 || contentH <= 0)
3359
+ return;
3360
+ setTimeout(() => {
3361
+ if (this.stage) {
3362
+ this.fitToBounds({ x: minX, y: minY, width: contentW, height: contentH }, containerWidth, containerHeight, padding);
3363
+ }
3364
+ });
3365
+ }
3366
+ /**
3367
+ * Get current stage position
3368
+ */
3369
+ getStagePosition() {
3370
+ if (!this.stage)
3371
+ return { x: 0, y: 0 };
3372
+ return this.stage.position();
3373
+ }
3374
+ /**
3375
+ * Set stage position (useful for programmatic panning)
3376
+ */
3377
+ setStagePosition(position) {
3378
+ if (!this.stage)
3379
+ return;
3380
+ this.stage.position(position);
3381
+ this.stage.batchDraw();
3382
+ }
3383
+ /**
3384
+ * Fit the stage content bounds to the container, centering and scaling
3385
+ * to show the full content with optional padding.
3386
+ */
3387
+ fitToBounds(contentBounds, containerWidth, containerHeight, padding = 24) {
3388
+ if (!this.stage)
3389
+ return;
3390
+ const { x, y, width, height } = contentBounds;
3391
+ const contentW = Math.max(width, 1);
3392
+ const contentH = Math.max(height, 1);
3393
+ const scaleX = (containerWidth - padding * 2) / contentW;
3394
+ const scaleY = (containerHeight - padding * 2) / contentH;
3395
+ const newScale = Math.min(scaleX, scaleY);
3396
+ const offsetX = (containerWidth - contentW * newScale) / 2;
3397
+ const offsetY = (containerHeight - contentH * newScale) / 2;
3398
+ this.stage.scaleX(newScale);
3399
+ this.stage.scaleY(newScale);
3400
+ this.stage.position({
3401
+ x: offsetX - x * newScale,
3402
+ y: offsetY - y * newScale,
3403
+ });
3404
+ this.stage.batchDraw();
3405
+ this.currentZoom.set(newScale);
3406
+ this.bookingDataService.updateStageConfig({
3407
+ scaleX: newScale,
3408
+ scaleY: newScale,
3409
+ x: this.stage.x(),
3410
+ y: this.stage.y(),
3411
+ });
3412
+ }
3413
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketMapZoomService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3414
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketMapZoomService, providedIn: 'root' });
3415
+ }
3416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketMapZoomService, decorators: [{
3417
+ type: Injectable,
3418
+ args: [{ providedIn: 'root' }]
3419
+ }], ctorParameters: () => [] });
3420
+
3210
3421
  const authInterceptor = (req, next) => {
3211
3422
  const platformId = inject(PLATFORM_ID);
3212
3423
  const config = inject(TICKERA_COMPONENTS_CONFIG);
@@ -6178,7 +6389,7 @@ class ProductMultiSelectComponent {
6178
6389
  useExisting: forwardRef(() => ProductMultiSelectComponent),
6179
6390
  multi: true,
6180
6391
  },
6181
- ], ngImport: i0, template: "<div class=\"product-multi-select\">\n @if (label) {\n <label class=\"product-multi-select-label\">\n {{ label }}\n </label>\n }\n\n @if (selectedIds.length > 0) {\n <div class=\"product-multi-select-tags\">\n @for (id of selectedIds; track id) {\n @let product = getProductOption(id);\n <span class=\"product-multi-select-tag\">\n @if (product?.imageUrl) {\n <img [src]=\"product!.imageUrl\" alt=\"\" class=\"product-multi-select-tag-image\" />\n }\n {{ product?.label ?? id }}\n <button\n type=\"button\"\n class=\"product-multi-select-tag-remove\"\n (click)=\"removeProduct(id)\"\n >\n &times;\n </button>\n </span>\n }\n </div>\n }\n\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n class=\"product-multi-select-search\"\n (input)=\"onSearchChange($event)\"\n />\n\n @if (loading()) {\n <div class=\"product-multi-select-loading\">\n <div class=\"product-multi-select-spinner\"></div>\n Cargando productos...\n </div>\n }\n\n @if (!loading() && filteredProducts().length > 0) {\n <div class=\"product-multi-select-list\">\n @for (p of filteredProducts(); track p.value) {\n <label class=\"product-multi-select-option\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(p.value)\"\n (change)=\"toggleProduct(p.value)\"\n class=\"product-multi-select-checkbox\"\n />\n @if (p.imageUrl) {\n <img [src]=\"p.imageUrl\" alt=\"\" class=\"product-multi-select-option-image\" />\n } @else {\n <div class=\"product-multi-select-option-image-placeholder\">\n <i class=\"ri-image-line\"></i>\n </div>\n }\n <span class=\"product-multi-select-option-label\">{{ p.label }}</span>\n </label>\n }\n </div>\n }\n\n @if (!loading() && filteredProducts().length === 0) {\n <p class=\"product-multi-select-empty\">No se encontraron productos</p>\n }\n</div>\n", styles: [".product-multi-select{width:100%}.product-multi-select-label{display:block;font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}@media(prefers-color-scheme:dark){.product-multi-select-label{color:#d1d5db}}.product-multi-select-tags{display:flex;flex-wrap:wrap;gap:.25rem;margin-bottom:.5rem}.product-multi-select-tag{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:9999px;font-size:.75rem;font-weight:500;background-color:#dcfce7;color:#166534}.product-multi-select-tag-image{width:1rem;height:1rem;border-radius:9999px;object-fit:cover}.product-multi-select-tag-remove{margin-left:.25rem;line-height:1}.product-multi-select-tag-remove:hover{color:#16a34a}.product-multi-select-search{width:100%;padding:.5rem .75rem;border:1px solid #d1d5db;border-radius:.375rem;font-size:.875rem}.product-multi-select-search:focus{outline:none;box-shadow:0 0 0 2px #22c55e;border-color:transparent}.product-multi-select-loading{display:flex;align-items:center;gap:.5rem;margin-top:.5rem;font-size:.875rem;color:#6b7280}.product-multi-select-spinner{width:1rem;height:1rem;border:2px solid #e5e7eb;border-top-color:#22c55e;border-radius:9999px;animation:product-multi-select-spin .6s linear infinite}.product-multi-select-list{margin-top:.25rem;max-height:12rem;overflow-y:auto;border:1px solid #e5e7eb;border-radius:.375rem}.product-multi-select-list>*+*{border-top:1px solid #f3f4f6}.product-multi-select-option{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;cursor:pointer}.product-multi-select-option:hover{background-color:#f9fafb}.product-multi-select-checkbox{width:1rem;height:1rem;accent-color:#22c55e;cursor:pointer}.product-multi-select-option-image{width:1.5rem;height:1.5rem;border-radius:.125rem;object-fit:cover}.product-multi-select-option-image-placeholder{width:1.5rem;height:1.5rem;border-radius:.125rem;background-color:#e5e7eb;display:flex;align-items:center;justify-content:center}.product-multi-select-option-image-placeholder i{color:#9ca3af;font-size:.75rem}.product-multi-select-option-label{color:#374151;-webkit-user-select:none;user-select:none}.product-multi-select-empty{font-size:.875rem;color:#6b7280;margin-top:.25rem}@keyframes product-multi-select-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
6392
+ ], ngImport: i0, template: "<div class=\"product-multi-select\">\n @if (label) {\n <label class=\"product-multi-select-label\">\n {{ label }}\n </label>\n }\n\n @if (selectedIds.length > 0) {\n <div class=\"product-multi-select-tags\">\n @for (id of selectedIds; track id) {\n @let product = getProductOption(id);\n <span class=\"product-multi-select-tag\">\n @if (product?.imageUrl) {\n <img [src]=\"product!.imageUrl\" alt=\"\" class=\"product-multi-select-tag-image\" />\n }\n {{ product?.label ?? id }}\n <button type=\"button\" class=\"product-multi-select-tag-remove\" (click)=\"removeProduct(id)\">\n &times;\n </button>\n </span>\n }\n </div>\n }\n\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n class=\"product-multi-select-search\"\n (input)=\"onSearchChange($event)\"\n />\n\n @if (loading()) {\n <div class=\"product-multi-select-loading\">\n <div class=\"product-multi-select-spinner\"></div>\n Cargando productos...\n </div>\n }\n\n @if (!loading() && filteredProducts().length > 0) {\n <div class=\"product-multi-select-list\">\n @for (p of filteredProducts(); track p.value) {\n <label class=\"product-multi-select-option\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(p.value)\"\n (change)=\"toggleProduct(p.value)\"\n class=\"product-multi-select-checkbox\"\n />\n @if (p.imageUrl) {\n <img [src]=\"p.imageUrl\" alt=\"\" class=\"product-multi-select-option-image\" />\n } @else {\n <div class=\"product-multi-select-option-image-placeholder\">\n <i class=\"ri-image-line\"></i>\n </div>\n }\n <span class=\"product-multi-select-option-label\">{{ p.label }}</span>\n </label>\n }\n </div>\n }\n\n @if (!loading() && filteredProducts().length === 0) {\n <p class=\"product-multi-select-empty\">No se encontraron productos</p>\n }\n</div>\n", styles: [".product-multi-select{width:100%}.product-multi-select-label{display:block;font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}@media(prefers-color-scheme:dark){.product-multi-select-label{color:#d1d5db}}.product-multi-select-tags{display:flex;flex-wrap:wrap;gap:.25rem;margin-bottom:.5rem}.product-multi-select-tag{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:9999px;font-size:.75rem;font-weight:500;background-color:#dcfce7;color:#166534}.product-multi-select-tag-image{width:1rem;height:1rem;border-radius:9999px;object-fit:cover}.product-multi-select-tag-remove{margin-left:.25rem;line-height:1}.product-multi-select-tag-remove:hover{color:#16a34a}.product-multi-select-search{width:100%;padding:.5rem .75rem;border:1px solid #d1d5db;border-radius:.375rem;font-size:.875rem}.product-multi-select-search:focus{outline:none;box-shadow:0 0 0 2px #22c55e;border-color:transparent}.product-multi-select-loading{display:flex;align-items:center;gap:.5rem;margin-top:.5rem;font-size:.875rem;color:#6b7280}.product-multi-select-spinner{width:1rem;height:1rem;border:2px solid #e5e7eb;border-top-color:#22c55e;border-radius:9999px;animation:product-multi-select-spin .6s linear infinite}.product-multi-select-list{margin-top:.25rem;max-height:12rem;overflow-y:auto;border:1px solid #e5e7eb;border-radius:.375rem}.product-multi-select-list>*+*{border-top:1px solid #f3f4f6}.product-multi-select-option{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;cursor:pointer}.product-multi-select-option:hover{background-color:#f9fafb}.product-multi-select-checkbox{width:1rem;height:1rem;accent-color:#22c55e;cursor:pointer}.product-multi-select-option-image{width:1.5rem;height:1.5rem;border-radius:.125rem;object-fit:cover}.product-multi-select-option-image-placeholder{width:1.5rem;height:1.5rem;border-radius:.125rem;background-color:#e5e7eb;display:flex;align-items:center;justify-content:center}.product-multi-select-option-image-placeholder i{color:#9ca3af;font-size:.75rem}.product-multi-select-option-label{color:#374151;-webkit-user-select:none;user-select:none}.product-multi-select-empty{font-size:.875rem;color:#6b7280;margin-top:.25rem}@keyframes product-multi-select-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
6182
6393
  }
6183
6394
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ProductMultiSelectComponent, decorators: [{
6184
6395
  type: Component,
@@ -6188,7 +6399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6188
6399
  useExisting: forwardRef(() => ProductMultiSelectComponent),
6189
6400
  multi: true,
6190
6401
  },
6191
- ], template: "<div class=\"product-multi-select\">\n @if (label) {\n <label class=\"product-multi-select-label\">\n {{ label }}\n </label>\n }\n\n @if (selectedIds.length > 0) {\n <div class=\"product-multi-select-tags\">\n @for (id of selectedIds; track id) {\n @let product = getProductOption(id);\n <span class=\"product-multi-select-tag\">\n @if (product?.imageUrl) {\n <img [src]=\"product!.imageUrl\" alt=\"\" class=\"product-multi-select-tag-image\" />\n }\n {{ product?.label ?? id }}\n <button\n type=\"button\"\n class=\"product-multi-select-tag-remove\"\n (click)=\"removeProduct(id)\"\n >\n &times;\n </button>\n </span>\n }\n </div>\n }\n\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n class=\"product-multi-select-search\"\n (input)=\"onSearchChange($event)\"\n />\n\n @if (loading()) {\n <div class=\"product-multi-select-loading\">\n <div class=\"product-multi-select-spinner\"></div>\n Cargando productos...\n </div>\n }\n\n @if (!loading() && filteredProducts().length > 0) {\n <div class=\"product-multi-select-list\">\n @for (p of filteredProducts(); track p.value) {\n <label class=\"product-multi-select-option\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(p.value)\"\n (change)=\"toggleProduct(p.value)\"\n class=\"product-multi-select-checkbox\"\n />\n @if (p.imageUrl) {\n <img [src]=\"p.imageUrl\" alt=\"\" class=\"product-multi-select-option-image\" />\n } @else {\n <div class=\"product-multi-select-option-image-placeholder\">\n <i class=\"ri-image-line\"></i>\n </div>\n }\n <span class=\"product-multi-select-option-label\">{{ p.label }}</span>\n </label>\n }\n </div>\n }\n\n @if (!loading() && filteredProducts().length === 0) {\n <p class=\"product-multi-select-empty\">No se encontraron productos</p>\n }\n</div>\n", styles: [".product-multi-select{width:100%}.product-multi-select-label{display:block;font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}@media(prefers-color-scheme:dark){.product-multi-select-label{color:#d1d5db}}.product-multi-select-tags{display:flex;flex-wrap:wrap;gap:.25rem;margin-bottom:.5rem}.product-multi-select-tag{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:9999px;font-size:.75rem;font-weight:500;background-color:#dcfce7;color:#166534}.product-multi-select-tag-image{width:1rem;height:1rem;border-radius:9999px;object-fit:cover}.product-multi-select-tag-remove{margin-left:.25rem;line-height:1}.product-multi-select-tag-remove:hover{color:#16a34a}.product-multi-select-search{width:100%;padding:.5rem .75rem;border:1px solid #d1d5db;border-radius:.375rem;font-size:.875rem}.product-multi-select-search:focus{outline:none;box-shadow:0 0 0 2px #22c55e;border-color:transparent}.product-multi-select-loading{display:flex;align-items:center;gap:.5rem;margin-top:.5rem;font-size:.875rem;color:#6b7280}.product-multi-select-spinner{width:1rem;height:1rem;border:2px solid #e5e7eb;border-top-color:#22c55e;border-radius:9999px;animation:product-multi-select-spin .6s linear infinite}.product-multi-select-list{margin-top:.25rem;max-height:12rem;overflow-y:auto;border:1px solid #e5e7eb;border-radius:.375rem}.product-multi-select-list>*+*{border-top:1px solid #f3f4f6}.product-multi-select-option{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;cursor:pointer}.product-multi-select-option:hover{background-color:#f9fafb}.product-multi-select-checkbox{width:1rem;height:1rem;accent-color:#22c55e;cursor:pointer}.product-multi-select-option-image{width:1.5rem;height:1.5rem;border-radius:.125rem;object-fit:cover}.product-multi-select-option-image-placeholder{width:1.5rem;height:1.5rem;border-radius:.125rem;background-color:#e5e7eb;display:flex;align-items:center;justify-content:center}.product-multi-select-option-image-placeholder i{color:#9ca3af;font-size:.75rem}.product-multi-select-option-label{color:#374151;-webkit-user-select:none;user-select:none}.product-multi-select-empty{font-size:.875rem;color:#6b7280;margin-top:.25rem}@keyframes product-multi-select-spin{to{transform:rotate(360deg)}}\n"] }]
6402
+ ], template: "<div class=\"product-multi-select\">\n @if (label) {\n <label class=\"product-multi-select-label\">\n {{ label }}\n </label>\n }\n\n @if (selectedIds.length > 0) {\n <div class=\"product-multi-select-tags\">\n @for (id of selectedIds; track id) {\n @let product = getProductOption(id);\n <span class=\"product-multi-select-tag\">\n @if (product?.imageUrl) {\n <img [src]=\"product!.imageUrl\" alt=\"\" class=\"product-multi-select-tag-image\" />\n }\n {{ product?.label ?? id }}\n <button type=\"button\" class=\"product-multi-select-tag-remove\" (click)=\"removeProduct(id)\">\n &times;\n </button>\n </span>\n }\n </div>\n }\n\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n class=\"product-multi-select-search\"\n (input)=\"onSearchChange($event)\"\n />\n\n @if (loading()) {\n <div class=\"product-multi-select-loading\">\n <div class=\"product-multi-select-spinner\"></div>\n Cargando productos...\n </div>\n }\n\n @if (!loading() && filteredProducts().length > 0) {\n <div class=\"product-multi-select-list\">\n @for (p of filteredProducts(); track p.value) {\n <label class=\"product-multi-select-option\">\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(p.value)\"\n (change)=\"toggleProduct(p.value)\"\n class=\"product-multi-select-checkbox\"\n />\n @if (p.imageUrl) {\n <img [src]=\"p.imageUrl\" alt=\"\" class=\"product-multi-select-option-image\" />\n } @else {\n <div class=\"product-multi-select-option-image-placeholder\">\n <i class=\"ri-image-line\"></i>\n </div>\n }\n <span class=\"product-multi-select-option-label\">{{ p.label }}</span>\n </label>\n }\n </div>\n }\n\n @if (!loading() && filteredProducts().length === 0) {\n <p class=\"product-multi-select-empty\">No se encontraron productos</p>\n }\n</div>\n", styles: [".product-multi-select{width:100%}.product-multi-select-label{display:block;font-size:.875rem;font-weight:500;color:#374151;margin-bottom:.25rem}@media(prefers-color-scheme:dark){.product-multi-select-label{color:#d1d5db}}.product-multi-select-tags{display:flex;flex-wrap:wrap;gap:.25rem;margin-bottom:.5rem}.product-multi-select-tag{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:9999px;font-size:.75rem;font-weight:500;background-color:#dcfce7;color:#166534}.product-multi-select-tag-image{width:1rem;height:1rem;border-radius:9999px;object-fit:cover}.product-multi-select-tag-remove{margin-left:.25rem;line-height:1}.product-multi-select-tag-remove:hover{color:#16a34a}.product-multi-select-search{width:100%;padding:.5rem .75rem;border:1px solid #d1d5db;border-radius:.375rem;font-size:.875rem}.product-multi-select-search:focus{outline:none;box-shadow:0 0 0 2px #22c55e;border-color:transparent}.product-multi-select-loading{display:flex;align-items:center;gap:.5rem;margin-top:.5rem;font-size:.875rem;color:#6b7280}.product-multi-select-spinner{width:1rem;height:1rem;border:2px solid #e5e7eb;border-top-color:#22c55e;border-radius:9999px;animation:product-multi-select-spin .6s linear infinite}.product-multi-select-list{margin-top:.25rem;max-height:12rem;overflow-y:auto;border:1px solid #e5e7eb;border-radius:.375rem}.product-multi-select-list>*+*{border-top:1px solid #f3f4f6}.product-multi-select-option{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;cursor:pointer}.product-multi-select-option:hover{background-color:#f9fafb}.product-multi-select-checkbox{width:1rem;height:1rem;accent-color:#22c55e;cursor:pointer}.product-multi-select-option-image{width:1.5rem;height:1.5rem;border-radius:.125rem;object-fit:cover}.product-multi-select-option-image-placeholder{width:1.5rem;height:1.5rem;border-radius:.125rem;background-color:#e5e7eb;display:flex;align-items:center;justify-content:center}.product-multi-select-option-image-placeholder i{color:#9ca3af;font-size:.75rem}.product-multi-select-option-label{color:#374151;-webkit-user-select:none;user-select:none}.product-multi-select-empty{font-size:.875rem;color:#6b7280;margin-top:.25rem}@keyframes product-multi-select-spin{to{transform:rotate(360deg)}}\n"] }]
6192
6403
  }], ctorParameters: () => [{ type: undefined, decorators: [{
6193
6404
  type: Inject,
6194
6405
  args: [PLATFORM_ID]
@@ -6813,11 +7024,11 @@ class ShowsFilterComponent {
6813
7024
  this.listEventService.setSelectedPerformance(null);
6814
7025
  }
6815
7026
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowsFilterComponent, deps: [{ token: PLATFORM_ID }, { token: ShowService }, { token: PerformancesListEventsService }, { token: ToastService }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component });
6816
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: ShowsFilterComponent, isStandalone: true, selector: "shows-filter", ngImport: i0, template: "<div class=\"shows-filter\">\n @if (shows().length > 0) {\n <p class=\"shows-filter-heading\">Filtrar por evento</p>\n }\n\n @if (loadingData()) {\n @for (i of [1, 2, 3]; track $index) {\n <div class=\"shows-filter-skeleton\"></div>\n }\n }\n\n @for (show of shows(); track $index) {\n <div class=\"shows-filter-item\" [class.shows-filter-item--active]=\"isActive(show.id)\">\n <div class=\"shows-filter-item-info\">\n <span class=\"shows-filter-item-image\">\n @if (show.images.length > 0) {\n <img [src]=\"show.images[0].full_url\" class=\"shows-filter-item-image-img\" />\n } @else {\n <span class=\"shows-filter-item-image-placeholder\"></span>\n }\n </span>\n\n <div>\n <div class=\"shows-filter-item-title\">{{ show.title }}</div>\n @if (show.performances_quantity && show.performances_quantity > 0) {\n <div class=\"shows-filter-item-count\">\n {{ show.performances_quantity }} funciones\n </div>\n }\n </div>\n </div>\n\n <div class=\"shows-filter-item-actions\">\n @if (isActive(show.id)) {\n <app-button\n variant=\"tertiary\"\n icon=\"ri-close-line\"\n size=\"xs\"\n (clicked)=\"onFilter(show)\"\n />\n } @else {\n <app-button variant=\"primary\" text=\"Filtrar\" size=\"xs\" (clicked)=\"onFilter(show)\" />\n }\n </div>\n </div>\n }\n</div>\n", styles: [".shows-filter{display:flex;flex-direction:column;gap:.5rem;width:100%}.shows-filter-heading{font-size:11px;font-weight:600;letter-spacing:.25em;color:#6b7280;text-transform:uppercase}.shows-filter-skeleton{height:3.75rem;width:100%;border-radius:.75rem;border:1px solid #e5e7eb;background-color:#f3f4f6;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media(prefers-color-scheme:dark){.shows-filter-skeleton{border-color:#6b72801a;background-color:#6b728008}}.shows-filter-item{display:flex;align-items:center;justify-content:space-between;border-radius:.75rem;border:1px solid rgba(107,114,128,.1);background-color:#6b728005;padding:.75rem;width:100%}.shows-filter-item--active{box-shadow:0 0 0 1px #ef444480,0 0 16px #ef444459}.shows-filter-item-info{display:flex;align-items:center;gap:.75rem}.shows-filter-item-image{height:2.5rem;width:2.5rem;border-radius:.125rem;overflow:hidden}.shows-filter-item-image-img{object-fit:contain;object-position:center;max-height:100%;max-width:100%;margin-left:auto;margin-right:auto}.shows-filter-item-image-placeholder{display:flex;background-color:#e5e7eb;height:100%;width:100%;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.shows-filter-item-title{font-size:.875rem;font-weight:600;color:#6b7280}.shows-filter-item-count{font-size:11px;color:#6b7280}.shows-filter-item-actions{font-size:.875rem;font-weight:700;color:#6b7280}@keyframes shows-filter-pulse{0%,to{opacity:1}50%{opacity:.5}}\n"], dependencies: [{ kind: "component", type: AppButtonComponent, selector: "app-button", inputs: ["disabled", "loading", "type", "variant", "text", "size", "loadingText", "icon"], outputs: ["clicked"] }, { kind: "ngmodule", type: CommonModule }] });
7027
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: ShowsFilterComponent, isStandalone: true, selector: "shows-filter", ngImport: i0, template: "<div class=\"shows-filter\">\n @if (shows().length > 0) {\n <p class=\"shows-filter-heading\">Filtrar por evento</p>\n }\n\n @if (loadingData()) {\n @for (i of [1, 2, 3]; track $index) {\n <div class=\"shows-filter-skeleton\"></div>\n }\n }\n\n @for (show of shows(); track $index) {\n <div class=\"shows-filter-item\" [class.shows-filter-item--active]=\"isActive(show.id)\">\n <div class=\"shows-filter-item-info\">\n <span class=\"shows-filter-item-image\">\n @if (show.images.length > 0) {\n <img [src]=\"show.images[0].full_url\" class=\"shows-filter-item-image-img\" />\n } @else {\n <span class=\"shows-filter-item-image-placeholder\"></span>\n }\n </span>\n\n <div>\n <div class=\"shows-filter-item-title\">{{ show.title }}</div>\n @if (show.performances_quantity && show.performances_quantity > 0) {\n <div class=\"shows-filter-item-count\">{{ show.performances_quantity }} funciones</div>\n }\n </div>\n </div>\n\n <div class=\"shows-filter-item-actions\">\n @if (isActive(show.id)) {\n <app-button\n variant=\"tertiary\"\n icon=\"ri-close-line\"\n size=\"xs\"\n (clicked)=\"onFilter(show)\"\n />\n } @else {\n <app-button variant=\"primary\" text=\"Filtrar\" size=\"xs\" (clicked)=\"onFilter(show)\" />\n }\n </div>\n </div>\n }\n</div>\n", styles: [".shows-filter{display:flex;flex-direction:column;gap:.5rem;width:100%}.shows-filter-heading{font-size:11px;font-weight:600;letter-spacing:.25em;color:#6b7280;text-transform:uppercase}.shows-filter-skeleton{height:3.75rem;width:100%;border-radius:.75rem;border:1px solid #e5e7eb;background-color:#f3f4f6;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media(prefers-color-scheme:dark){.shows-filter-skeleton{border-color:#6b72801a;background-color:#6b728008}}.shows-filter-item{display:flex;align-items:center;justify-content:space-between;border-radius:.75rem;border:1px solid rgba(107,114,128,.1);background-color:#6b728005;padding:.75rem;width:100%}.shows-filter-item--active{box-shadow:0 0 0 1px #ef444480,0 0 16px #ef444459}.shows-filter-item-info{display:flex;align-items:center;gap:.75rem}.shows-filter-item-image{height:2.5rem;width:2.5rem;border-radius:.125rem;overflow:hidden}.shows-filter-item-image-img{object-fit:contain;object-position:center;max-height:100%;max-width:100%;margin-left:auto;margin-right:auto}.shows-filter-item-image-placeholder{display:flex;background-color:#e5e7eb;height:100%;width:100%;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.shows-filter-item-title{font-size:.875rem;font-weight:600;color:#6b7280}.shows-filter-item-count{font-size:11px;color:#6b7280}.shows-filter-item-actions{font-size:.875rem;font-weight:700;color:#6b7280}@keyframes shows-filter-pulse{0%,to{opacity:1}50%{opacity:.5}}\n"], dependencies: [{ kind: "component", type: AppButtonComponent, selector: "app-button", inputs: ["disabled", "loading", "type", "variant", "text", "size", "loadingText", "icon"], outputs: ["clicked"] }, { kind: "ngmodule", type: CommonModule }] });
6817
7028
  }
6818
7029
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: ShowsFilterComponent, decorators: [{
6819
7030
  type: Component,
6820
- args: [{ selector: 'shows-filter', standalone: true, imports: [AppButtonComponent, CommonModule], template: "<div class=\"shows-filter\">\n @if (shows().length > 0) {\n <p class=\"shows-filter-heading\">Filtrar por evento</p>\n }\n\n @if (loadingData()) {\n @for (i of [1, 2, 3]; track $index) {\n <div class=\"shows-filter-skeleton\"></div>\n }\n }\n\n @for (show of shows(); track $index) {\n <div class=\"shows-filter-item\" [class.shows-filter-item--active]=\"isActive(show.id)\">\n <div class=\"shows-filter-item-info\">\n <span class=\"shows-filter-item-image\">\n @if (show.images.length > 0) {\n <img [src]=\"show.images[0].full_url\" class=\"shows-filter-item-image-img\" />\n } @else {\n <span class=\"shows-filter-item-image-placeholder\"></span>\n }\n </span>\n\n <div>\n <div class=\"shows-filter-item-title\">{{ show.title }}</div>\n @if (show.performances_quantity && show.performances_quantity > 0) {\n <div class=\"shows-filter-item-count\">\n {{ show.performances_quantity }} funciones\n </div>\n }\n </div>\n </div>\n\n <div class=\"shows-filter-item-actions\">\n @if (isActive(show.id)) {\n <app-button\n variant=\"tertiary\"\n icon=\"ri-close-line\"\n size=\"xs\"\n (clicked)=\"onFilter(show)\"\n />\n } @else {\n <app-button variant=\"primary\" text=\"Filtrar\" size=\"xs\" (clicked)=\"onFilter(show)\" />\n }\n </div>\n </div>\n }\n</div>\n", styles: [".shows-filter{display:flex;flex-direction:column;gap:.5rem;width:100%}.shows-filter-heading{font-size:11px;font-weight:600;letter-spacing:.25em;color:#6b7280;text-transform:uppercase}.shows-filter-skeleton{height:3.75rem;width:100%;border-radius:.75rem;border:1px solid #e5e7eb;background-color:#f3f4f6;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media(prefers-color-scheme:dark){.shows-filter-skeleton{border-color:#6b72801a;background-color:#6b728008}}.shows-filter-item{display:flex;align-items:center;justify-content:space-between;border-radius:.75rem;border:1px solid rgba(107,114,128,.1);background-color:#6b728005;padding:.75rem;width:100%}.shows-filter-item--active{box-shadow:0 0 0 1px #ef444480,0 0 16px #ef444459}.shows-filter-item-info{display:flex;align-items:center;gap:.75rem}.shows-filter-item-image{height:2.5rem;width:2.5rem;border-radius:.125rem;overflow:hidden}.shows-filter-item-image-img{object-fit:contain;object-position:center;max-height:100%;max-width:100%;margin-left:auto;margin-right:auto}.shows-filter-item-image-placeholder{display:flex;background-color:#e5e7eb;height:100%;width:100%;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.shows-filter-item-title{font-size:.875rem;font-weight:600;color:#6b7280}.shows-filter-item-count{font-size:11px;color:#6b7280}.shows-filter-item-actions{font-size:.875rem;font-weight:700;color:#6b7280}@keyframes shows-filter-pulse{0%,to{opacity:1}50%{opacity:.5}}\n"] }]
7031
+ args: [{ selector: 'shows-filter', standalone: true, imports: [AppButtonComponent, CommonModule], template: "<div class=\"shows-filter\">\n @if (shows().length > 0) {\n <p class=\"shows-filter-heading\">Filtrar por evento</p>\n }\n\n @if (loadingData()) {\n @for (i of [1, 2, 3]; track $index) {\n <div class=\"shows-filter-skeleton\"></div>\n }\n }\n\n @for (show of shows(); track $index) {\n <div class=\"shows-filter-item\" [class.shows-filter-item--active]=\"isActive(show.id)\">\n <div class=\"shows-filter-item-info\">\n <span class=\"shows-filter-item-image\">\n @if (show.images.length > 0) {\n <img [src]=\"show.images[0].full_url\" class=\"shows-filter-item-image-img\" />\n } @else {\n <span class=\"shows-filter-item-image-placeholder\"></span>\n }\n </span>\n\n <div>\n <div class=\"shows-filter-item-title\">{{ show.title }}</div>\n @if (show.performances_quantity && show.performances_quantity > 0) {\n <div class=\"shows-filter-item-count\">{{ show.performances_quantity }} funciones</div>\n }\n </div>\n </div>\n\n <div class=\"shows-filter-item-actions\">\n @if (isActive(show.id)) {\n <app-button\n variant=\"tertiary\"\n icon=\"ri-close-line\"\n size=\"xs\"\n (clicked)=\"onFilter(show)\"\n />\n } @else {\n <app-button variant=\"primary\" text=\"Filtrar\" size=\"xs\" (clicked)=\"onFilter(show)\" />\n }\n </div>\n </div>\n }\n</div>\n", styles: [".shows-filter{display:flex;flex-direction:column;gap:.5rem;width:100%}.shows-filter-heading{font-size:11px;font-weight:600;letter-spacing:.25em;color:#6b7280;text-transform:uppercase}.shows-filter-skeleton{height:3.75rem;width:100%;border-radius:.75rem;border:1px solid #e5e7eb;background-color:#f3f4f6;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media(prefers-color-scheme:dark){.shows-filter-skeleton{border-color:#6b72801a;background-color:#6b728008}}.shows-filter-item{display:flex;align-items:center;justify-content:space-between;border-radius:.75rem;border:1px solid rgba(107,114,128,.1);background-color:#6b728005;padding:.75rem;width:100%}.shows-filter-item--active{box-shadow:0 0 0 1px #ef444480,0 0 16px #ef444459}.shows-filter-item-info{display:flex;align-items:center;gap:.75rem}.shows-filter-item-image{height:2.5rem;width:2.5rem;border-radius:.125rem;overflow:hidden}.shows-filter-item-image-img{object-fit:contain;object-position:center;max-height:100%;max-width:100%;margin-left:auto;margin-right:auto}.shows-filter-item-image-placeholder{display:flex;background-color:#e5e7eb;height:100%;width:100%;animation:shows-filter-pulse 2s cubic-bezier(.4,0,.6,1) infinite}.shows-filter-item-title{font-size:.875rem;font-weight:600;color:#6b7280}.shows-filter-item-count{font-size:11px;color:#6b7280}.shows-filter-item-actions{font-size:.875rem;font-weight:700;color:#6b7280}@keyframes shows-filter-pulse{0%,to{opacity:1}50%{opacity:.5}}\n"] }]
6821
7032
  }], ctorParameters: () => [{ type: undefined, decorators: [{
6822
7033
  type: Inject,
6823
7034
  args: [PLATFORM_ID]
@@ -6870,11 +7081,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
6870
7081
  type: Input
6871
7082
  }] } });
6872
7083
 
7084
+ class TicketMapZoomControlsComponent {
7085
+ zoomService;
7086
+ currentZoom = computed(() => this.zoomService.currentZoom(), ...(ngDevMode ? [{ debugName: "currentZoom" }] : []));
7087
+ zoomPercentage = computed(() => this.zoomService.getZoomPercentage(), ...(ngDevMode ? [{ debugName: "zoomPercentage" }] : []));
7088
+ constructor(zoomService) {
7089
+ this.zoomService = zoomService;
7090
+ }
7091
+ zoomIn() {
7092
+ this.zoomService.zoomIn();
7093
+ }
7094
+ zoomOut() {
7095
+ this.zoomService.zoomOut();
7096
+ }
7097
+ resetZoom() {
7098
+ this.zoomService.resetZoom();
7099
+ }
7100
+ fitToContainer() {
7101
+ this.zoomService.fitToContainer();
7102
+ }
7103
+ handleZoomAction(action) {
7104
+ switch (action) {
7105
+ case 'ZOOM_IN':
7106
+ this.zoomIn();
7107
+ break;
7108
+ case 'ZOOM_OUT':
7109
+ this.zoomOut();
7110
+ break;
7111
+ case 'ZOOM_RESET':
7112
+ this.resetZoom();
7113
+ break;
7114
+ }
7115
+ }
7116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketMapZoomControlsComponent, deps: [{ token: TicketMapZoomService }], target: i0.ɵɵFactoryTarget.Component });
7117
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.25", type: TicketMapZoomControlsComponent, isStandalone: true, selector: "ticket-map-zoom-controls", ngImport: i0, template: "<div class=\"ticket-map-zoom-controls\">\n <button (click)=\"zoomOut()\" class=\"canvas-button\" title=\"Zoom -\">\n <i class=\"ri-zoom-out-line text-sm\"></i>\n </button>\n\n <span class=\"zoom-percentage\">{{ zoomPercentage() }}</span>\n\n <button (click)=\"zoomIn()\" class=\"canvas-button\" title=\"Zoom +\">\n <i class=\"ri-zoom-in-line\"></i>\n </button>\n\n <button (click)=\"resetZoom()\" class=\"canvas-button\" title=\"Reset\">\n <i class=\"ri-refresh-line\"></i>\n </button>\n\n <button (click)=\"fitToContainer()\" class=\"canvas-button\" title=\"Ajustar al espacio\">\n <i class=\"ri-fullscreen-line\"></i>\n </button>\n</div>\n", styles: [".ticket-map-zoom-controls{display:flex;flex-direction:row;align-items:center;gap:.5rem;font-size:.75rem}.ticket-map-zoom-controls .canvas-button{align-items:center;background-color:#f3f4f6;border:none;border-radius:.125rem;cursor:pointer;display:flex;flex-direction:column;height:2rem;justify-content:center;transition:all .2s;width:2rem}.ticket-map-zoom-controls .canvas-button:hover{background-color:#d1d5db}.ticket-map-zoom-controls .zoom-percentage{color:#6b7280;font-weight:600;text-align:center;width:2rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
7118
+ }
7119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: TicketMapZoomControlsComponent, decorators: [{
7120
+ type: Component,
7121
+ args: [{ selector: 'ticket-map-zoom-controls', standalone: true, imports: [CommonModule], template: "<div class=\"ticket-map-zoom-controls\">\n <button (click)=\"zoomOut()\" class=\"canvas-button\" title=\"Zoom -\">\n <i class=\"ri-zoom-out-line text-sm\"></i>\n </button>\n\n <span class=\"zoom-percentage\">{{ zoomPercentage() }}</span>\n\n <button (click)=\"zoomIn()\" class=\"canvas-button\" title=\"Zoom +\">\n <i class=\"ri-zoom-in-line\"></i>\n </button>\n\n <button (click)=\"resetZoom()\" class=\"canvas-button\" title=\"Reset\">\n <i class=\"ri-refresh-line\"></i>\n </button>\n\n <button (click)=\"fitToContainer()\" class=\"canvas-button\" title=\"Ajustar al espacio\">\n <i class=\"ri-fullscreen-line\"></i>\n </button>\n</div>\n", styles: [".ticket-map-zoom-controls{display:flex;flex-direction:row;align-items:center;gap:.5rem;font-size:.75rem}.ticket-map-zoom-controls .canvas-button{align-items:center;background-color:#f3f4f6;border:none;border-radius:.125rem;cursor:pointer;display:flex;flex-direction:column;height:2rem;justify-content:center;transition:all .2s;width:2rem}.ticket-map-zoom-controls .canvas-button:hover{background-color:#d1d5db}.ticket-map-zoom-controls .zoom-percentage{color:#6b7280;font-weight:600;text-align:center;width:2rem}\n"] }]
7122
+ }], ctorParameters: () => [{ type: TicketMapZoomService }] });
7123
+
6873
7124
  // Config
6874
7125
 
6875
7126
  /**
6876
7127
  * Generated bundle index. Do not edit.
6877
7128
  */
6878
7129
 
6879
- export { ADMIN_API_ROUTES, ALERT_ICONS, AdminSelectComponent, AdminService, ApiService, AppAlertComponent, AppButtonComponent, AppLinkButtonComponent, AppModalComponent, AsyncSelectComponent, AuditInformationComponent, BASE_BUTTON_CLASSES, BASE_INPUT_CLASSES, BUTTON_SIZES_CLASSES, BUTTON_VARIANT_CLASSES, BaseModalService, CITY_API_ENDPOINTS, COUNTRY_API_ENDPOINTS, CUSTOMERS_API_ROUTES, ChangePasswordFormComponent, ChangePasswordFormService, CitiesService, CitySelectComponent, ColorPickerComponent, CorporateBondStatus, CountrySelectComponent, CountryService, CouponApplicability, CouponDiscountType, CouponStatus, CustomerSelectComponent, CustomerService, DEFAULT_STAGE_CONFIG, DOCUMENT_TYPES_OPTIONS, DateInputComponent, DateService, DaySelectorGridComponent, DeleteConfirmationComponent, DeleteConfirmationService, DynamicTableComponent, ERROR_INPUT_CLASSES, EndDateGreaterThanStartValidator, FORM_ERROR_MESSAGES, FeedbackModalComponent, FeedbackModalService, FileType, FileUploadComponent, FileUploadPreviewComponent, FormEditorComponent, FormInputComponent, FormSelectComponent, FormTextareaComponent, GiftBondStatus, KONVA_SHAPE_MAPPINGS, LanguageSwitcherComponent, MinTodayValidator, MustMatchValidator, OrderItemType, OrderStatus, PAYMENT_METHODS_OPTIONS, PERFORMANCES_API_ROUTES, PRICE_ZONES_API_ROUTES, PRODUCTS_API_ROUTES, PRODUCT_CATEGORIES_API_ROUTES, PRODUCT_TAGS_API_ROUTES, PRODUCT_TYPES_API_ROUTES, PerformanceBookingDataService, PerformanceCardComponent, PerformanceCardListComponent, PerformanceMultiSelectComponent, PerformanceSelectComponent, PerformanceService, PerformanceStatus, PerformanceStepperComponent, PerformanceTicketStatus, PerformancesListEventsService, PriceZoneEventService, PriceZoneFormModalService, PriceZoneSelectComponent, PriceZoneService, ProductCategoryService, ProductMultiSelectComponent, ProductSelectComponent, ProductService, ProductTagService, ProductTypeService, RoomMapElementOrientation, RoomMapElementType, SHOWS_API_ROUTES, STATE_API_ENDPOINTS, SelectedDiscountCardType, ShowMultiSelectComponent, ShowSelectComponent, ShowService, ShowsFilterComponent, StateSelectComponent, StatesService, TICKERA_COMPONENTS_CONFIG, TICKET_ELEMENT_TYPES, TICKET_MAP_GRID_SIZE, TICKET_MAP_TITLE_HEIGHT, TICKET_STATUS_COLORS, TICKET_STATUS_FILLS, TICKET_STATUS_LABELS, TickeraTranslocoLoader, TicketMapWidgetComponent, TicketMapWidgetHeaderComponent, TicketSelectionDetailsService, TicketSelectionDiscountService, TicketSelectionService, TicketSelectionTotalsService, ToastService, ToggleSwitchComponent, VENUES_API_ROUTES, ZonePriceItemComponent, ZonePriceListComponent, authInterceptor, drawChairIcon$1 as drawChairIcon, drawHappyFace, drawRoundedRect, drawWheelchairIcon, findElementAtPosition, findTicketAtPosition, formatCitiesResponseToSelect, generateExitScene, generateHallwayScene, generateProductionAreaScene, generateSeatBlockScene, generateSeatBlockTicketScene, generateStageScene, generateStairScene, generateTableScene, generateTableTicketScene, generateUnavailableSpaceScene, generateZoneScene, getBrowserLanguage, getCustomerFullname, getItemTypeIcon, getStoredLanguage, numberToLetter$1 as numberToLetter, parseJsonToFormDataAdvanced, processElementsToRenderData, provideTickeraComponents, resolveLanguage, setStoredLanguage, tintColor, transformImageToFile };
7130
+ export { ADMIN_API_ROUTES, ALERT_ICONS, AdminSelectComponent, AdminService, ApiService, AppAlertComponent, AppButtonComponent, AppLinkButtonComponent, AppModalComponent, AsyncSelectComponent, AuditInformationComponent, BASE_BUTTON_CLASSES, BASE_INPUT_CLASSES, BUTTON_SIZES_CLASSES, BUTTON_VARIANT_CLASSES, BaseModalService, CITY_API_ENDPOINTS, COUNTRY_API_ENDPOINTS, CUSTOMERS_API_ROUTES, ChangePasswordFormComponent, ChangePasswordFormService, CitiesService, CitySelectComponent, ColorPickerComponent, CorporateBondStatus, CountrySelectComponent, CountryService, CouponApplicability, CouponDiscountType, CouponStatus, CustomerSelectComponent, CustomerService, DEFAULT_STAGE_CONFIG, DOCUMENT_TYPES_OPTIONS, DateInputComponent, DateService, DaySelectorGridComponent, DeleteConfirmationComponent, DeleteConfirmationService, DynamicTableComponent, ERROR_INPUT_CLASSES, EndDateGreaterThanStartValidator, FORM_ERROR_MESSAGES, FeedbackModalComponent, FeedbackModalService, FileType, FileUploadComponent, FileUploadPreviewComponent, FormEditorComponent, FormInputComponent, FormSelectComponent, FormTextareaComponent, GiftBondStatus, KONVA_SHAPE_MAPPINGS, LanguageSwitcherComponent, MinTodayValidator, MustMatchValidator, OrderItemType, OrderStatus, PAYMENT_METHODS_OPTIONS, PERFORMANCES_API_ROUTES, PRICE_ZONES_API_ROUTES, PRODUCTS_API_ROUTES, PRODUCT_CATEGORIES_API_ROUTES, PRODUCT_TAGS_API_ROUTES, PRODUCT_TYPES_API_ROUTES, PerformanceBookingDataService, PerformanceCardComponent, PerformanceCardListComponent, PerformanceMultiSelectComponent, PerformanceSelectComponent, PerformanceService, PerformanceStatus, PerformanceStepperComponent, PerformanceTicketStatus, PerformancesListEventsService, PriceZoneEventService, PriceZoneFormModalService, PriceZoneSelectComponent, PriceZoneService, ProductCategoryService, ProductMultiSelectComponent, ProductSelectComponent, ProductService, ProductTagService, ProductTypeService, RoomMapElementOrientation, RoomMapElementType, SHOWS_API_ROUTES, STATE_API_ENDPOINTS, SelectedDiscountCardType, ShowMultiSelectComponent, ShowSelectComponent, ShowService, ShowsFilterComponent, StateSelectComponent, StatesService, TICKERA_COMPONENTS_CONFIG, TICKET_ELEMENT_TYPES, TICKET_MAP_GRID_SIZE, TICKET_MAP_TITLE_HEIGHT, TICKET_STATUS_COLORS, TICKET_STATUS_FILLS, TICKET_STATUS_LABELS, TickeraTranslocoLoader, TicketMapWidgetComponent, TicketMapWidgetHeaderComponent, TicketMapZoomControlsComponent, TicketMapZoomService, TicketSelectionDetailsService, TicketSelectionDiscountService, TicketSelectionService, TicketSelectionTotalsService, ToastService, ToggleSwitchComponent, VENUES_API_ROUTES, ZonePriceItemComponent, ZonePriceListComponent, authInterceptor, drawChairIcon$1 as drawChairIcon, drawHappyFace, drawRoundedRect, drawWheelchairIcon, findElementAtPosition, findTicketAtPosition, formatCitiesResponseToSelect, generateExitScene, generateHallwayScene, generateProductionAreaScene, generateSeatBlockScene, generateSeatBlockTicketScene, generateStageScene, generateStairScene, generateTableScene, generateTableTicketScene, generateUnavailableSpaceScene, generateZoneScene, getBrowserLanguage, getCustomerFullname, getItemTypeIcon, getStoredLanguage, numberToLetter$1 as numberToLetter, parseJsonToFormDataAdvanced, processElementsToRenderData, provideTickeraComponents, resolveLanguage, setStoredLanguage, tintColor, transformImageToFile };
6880
7131
  //# sourceMappingURL=tickera-angular-components.mjs.map