@glatam/calendar-ui 1.0.4 → 1.0.6

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.
@@ -1,9 +1,9 @@
1
- import { css as E, LitElement as O, html as d } from "lit";
2
- import { property as s, customElement as T, state as u } from "lit/decorators.js";
3
- import { isTimeBlocked as I, formatISODate as _, generateMonthDays as A, generateWeekDays as j } from "@glatam/calendar-core";
4
- import { formatISODate as nt, isTimeBlocked as dt, parseISODate as ct } from "@glatam/calendar-core";
5
- import { classMap as N } from "lit/directives/class-map.js";
6
- const P = E`
1
+ import { css as M, LitElement as T, html as c } from "lit";
2
+ import { property as l, customElement as O, state as m } from "lit/decorators.js";
3
+ import { formatISODate as z, parseISODate as P, isTimeBlocked as _, generateMonthDays as Y, generateWeekDays as L } from "@glatam/calendar-core";
4
+ import { formatISODate as yt, isTimeBlocked as xt, parseISODate as wt } from "@glatam/calendar-core";
5
+ import { classMap as A } from "lit/directives/class-map.js";
6
+ const q = M`
7
7
  :host {
8
8
  /* Fonts */
9
9
  --glatam-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
@@ -91,7 +91,7 @@ const P = E`
91
91
  --glatam-padding: 24px;
92
92
  font-size: 1.1rem;
93
93
  }
94
- `, W = E`
94
+ `, G = M`
95
95
  :host {
96
96
  display: grid;
97
97
  min-width: 0;
@@ -348,9 +348,9 @@ const P = E`
348
348
  }
349
349
  }
350
350
  `;
351
- function C(e, t, a) {
351
+ function B(e, t, a) {
352
352
  if (t === a) return 0;
353
- const i = (r, l) => {
353
+ const r = (i, s) => {
354
354
  const o = {
355
355
  year: "numeric",
356
356
  month: "numeric",
@@ -360,55 +360,71 @@ function C(e, t, a) {
360
360
  second: "numeric",
361
361
  hour12: !1
362
362
  };
363
- l !== "local" && (o.timeZone = l);
364
- const n = new Intl.DateTimeFormat("en-US", o).formatToParts(r), c = new Map(n.map(($) => [$.type, $.value])), m = Number(c.get("hour")), y = m === 24 ? 0 : m;
363
+ s !== "local" && (o.timeZone = s);
364
+ const n = new Intl.DateTimeFormat("en-US", o).formatToParts(i), d = new Map(n.map((f) => [f.type, f.value])), h = Number(d.get("hour")), y = h === 24 ? 0 : h;
365
365
  return new Date(
366
- Number(c.get("year")),
367
- Number(c.get("month")) - 1,
368
- Number(c.get("day")),
366
+ Number(d.get("year")),
367
+ Number(d.get("month")) - 1,
368
+ Number(d.get("day")),
369
369
  y,
370
- Number(c.get("minute")),
371
- Number(c.get("second"))
370
+ Number(d.get("minute")),
371
+ Number(d.get("second"))
372
372
  );
373
373
  };
374
374
  try {
375
- const r = i(e, t);
376
- return (i(e, a).getTime() - r.getTime()) / (60 * 1e3);
375
+ const i = r(e, t);
376
+ return (r(e, a).getTime() - i.getTime()) / (60 * 1e3);
377
377
  } catch {
378
378
  return 0;
379
379
  }
380
380
  }
381
- function U(e, t) {
381
+ function H(e, t) {
382
382
  if (t === 0)
383
383
  return { start: e.start, end: e.end, dayShift: 0 };
384
- const a = (c) => {
385
- const [m, y] = c.split(":").map(Number);
386
- return m * 60 + y;
387
- }, i = (c) => {
388
- let m = c % 1440;
389
- m < 0 && (m += 1440);
390
- const y = String(Math.floor(m / 60)).padStart(2, "0"), $ = String(m % 60).padStart(2, "0");
391
- return `${y}:${$}`;
392
- }, r = a(e.start), l = a(e.end), o = r + t, p = l + t;
384
+ const a = (d) => {
385
+ const [h, y] = d.split(":").map(Number);
386
+ return h * 60 + y;
387
+ }, r = (d) => {
388
+ let h = d % 1440;
389
+ h < 0 && (h += 1440);
390
+ const y = String(Math.floor(h / 60)).padStart(2, "0"), f = String(h % 60).padStart(2, "0");
391
+ return `${y}:${f}`;
392
+ }, i = a(e.start), s = a(e.end), o = i + t, u = s + t;
393
393
  let n = 0;
394
394
  return o < 0 ? n = -1 : o >= 1440 && (n = 1), {
395
- start: i(o),
396
- end: i(p),
395
+ start: r(o),
396
+ end: r(u),
397
397
  dayShift: n
398
398
  };
399
399
  }
400
- var L = Object.defineProperty, F = Object.getOwnPropertyDescriptor, D = (e, t, a, i) => {
401
- for (var r = i > 1 ? void 0 : i ? F(t, a) : t, l = e.length - 1, o; l >= 0; l--)
402
- (o = e[l]) && (r = (i ? o(t, a, r) : o(r)) || r);
403
- return i && r && L(t, a, r), r;
400
+ function V(e, t, a) {
401
+ let r = null;
402
+ return { updatedRules: e.map((s) => {
403
+ if (s.id !== t) return s;
404
+ r = s;
405
+ const o = s.exceptions || [], u = o.includes(a) ? o : [...o, a];
406
+ return {
407
+ ...s,
408
+ exceptions: u
409
+ };
410
+ }), targetRule: r };
411
+ }
412
+ function F(e, t) {
413
+ const a = e.find((i) => i.id === t) || null;
414
+ return { updatedRules: e.filter((i) => i.id !== t), targetRule: a };
415
+ }
416
+ var X = Object.defineProperty, Z = Object.getOwnPropertyDescriptor, $ = (e, t, a, r) => {
417
+ for (var i = r > 1 ? void 0 : r ? Z(t, a) : t, s = e.length - 1, o; s >= 0; s--)
418
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
419
+ return r && i && X(t, a, i), i;
404
420
  };
405
- let f = class extends O {
421
+ let w = class extends T {
406
422
  constructor() {
407
423
  super(...arguments), this.days = [], this.locale = "es", this.startOfWeekDay = 0, this.selectedDates = [], this.role = "provider", this.size = "medium", this.minDate = "", this.maxDate = "", this.showNeighboringMonth = !0, this.tileClassName = null;
408
424
  }
409
425
  getWeekdayNames() {
410
426
  const e = [], t = new Date(2026, 6, 12 + this.startOfWeekDay), a = new Intl.DateTimeFormat(this.locale, { weekday: "short" });
411
- for (let i = 0; i < 7; i++)
427
+ for (let r = 0; r < 7; r++)
412
428
  e.push(a.format(t)), t.setDate(t.getDate() + 1);
413
429
  return e;
414
430
  }
@@ -422,23 +438,23 @@ let f = class extends O {
422
438
  }
423
439
  render() {
424
440
  const e = this.getWeekdayNames();
425
- return d`
426
- ${e.map((t) => d`<div class="weekday">${t}</div>`)}
441
+ return c`
442
+ ${e.map((t) => c`<div class="weekday">${t}</div>`)}
427
443
 
428
444
  ${this.days.map((t) => {
429
- var p;
445
+ var u;
430
446
  if (!t.isCurrentMonth && !this.showNeighboringMonth)
431
- return d`<div class="day-cell empty"></div>`;
432
- const a = t.dateString === (/* @__PURE__ */ new Date()).toISOString().split("T")[0], i = this.selectedDates.includes(t.dateString), r = t.slots.filter((n) => n.isBlocked), l = this.minDate && t.dateString < this.minDate || this.maxDate && t.dateString > this.maxDate, o = this.tileClassName ? this.tileClassName({ date: t.date, dateString: t.dateString }) : "";
433
- return d`
447
+ return c`<div class="day-cell empty"></div>`;
448
+ const a = t.dateString === z(/* @__PURE__ */ new Date()), r = this.selectedDates.includes(t.dateString), i = t.slots.filter((n) => n.isBlocked), s = this.minDate && t.dateString < this.minDate || this.maxDate && t.dateString > this.maxDate, o = this.tileClassName ? this.tileClassName({ date: t.date, dateString: t.dateString }) : "";
449
+ return c`
434
450
  <div
435
- class=${N({
451
+ class=${A({
436
452
  "day-cell": !0,
437
453
  padding: !t.isCurrentMonth,
438
454
  blocked: t.isBlocked,
439
455
  today: a,
440
- selected: i,
441
- disabled: !!l,
456
+ selected: r,
457
+ disabled: !!s,
442
458
  [o]: !!o
443
459
  })}
444
460
  part="day-cell ${o}"
@@ -447,15 +463,15 @@ let f = class extends O {
447
463
  <div class="day-number">${t.dayNumber}</div>
448
464
 
449
465
  <div class="slot-indicator">
450
- ${t.isBlocked ? d`<div class="badge blocked-day">${((p = t.rule) == null ? void 0 : p.description) || "Bloqueado"}</div>` : r.slice(0, 2).map((n) => {
451
- var c, m;
452
- return d`
453
- <div class="badge blocked-slot" title=${((c = n.rule) == null ? void 0 : c.description) || ""}>
454
- 🚫 ${((m = n.rule) == null ? void 0 : m.description) || n.start}
466
+ ${t.isBlocked ? c`<div class="badge blocked-day">${((u = t.rule) == null ? void 0 : u.description) || "Bloqueado"}</div>` : i.slice(0, 2).map((n) => {
467
+ var d, h;
468
+ return c`
469
+ <div class="badge blocked-slot" title=${((d = n.rule) == null ? void 0 : d.description) || ""}>
470
+ 🚫 ${((h = n.rule) == null ? void 0 : h.description) || n.start}
455
471
  </div>
456
472
  `;
457
473
  })}
458
- ${!t.isBlocked && r.length > 2 ? d`<div style="text-align: center; font-size: 0.65rem; color: var(--glatam-text-secondary);">+${r.length - 2} tareas</div>` : ""}
474
+ ${!t.isBlocked && i.length > 2 ? c`<div style="text-align: center; font-size: 0.65rem; color: var(--glatam-text-secondary);">+${i.length - 2} tareas</div>` : ""}
459
475
  </div>
460
476
  </div>
461
477
  `;
@@ -463,7 +479,7 @@ let f = class extends O {
463
479
  `;
464
480
  }
465
481
  };
466
- f.styles = E`
482
+ w.styles = M`
467
483
  :host { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; width: 100%; }
468
484
  .weekday { font-size: 0.75rem; font-weight: 600; color: var(--glatam-text-secondary); text-transform: uppercase; text-align: center; padding: 8px 0; letter-spacing: 0.05em; }
469
485
  .day-cell {
@@ -496,55 +512,55 @@ f.styles = E`
496
512
  .day-number { margin-bottom: 0; font-size: 0.8rem; }
497
513
  }
498
514
  `;
499
- D([
500
- s({ type: Array })
501
- ], f.prototype, "days", 2);
502
- D([
503
- s({ type: String })
504
- ], f.prototype, "locale", 2);
505
- D([
506
- s({ type: Number })
507
- ], f.prototype, "startOfWeekDay", 2);
508
- D([
509
- s({ type: Array })
510
- ], f.prototype, "selectedDates", 2);
511
- D([
512
- s({ type: String })
513
- ], f.prototype, "role", 2);
514
- D([
515
- s({ type: String, reflect: !0 })
516
- ], f.prototype, "size", 2);
517
- D([
518
- s({ type: String })
519
- ], f.prototype, "minDate", 2);
520
- D([
521
- s({ type: String })
522
- ], f.prototype, "maxDate", 2);
523
- D([
524
- s({ type: Boolean })
525
- ], f.prototype, "showNeighboringMonth", 2);
526
- D([
527
- s({ attribute: !1 })
528
- ], f.prototype, "tileClassName", 2);
529
- f = D([
530
- T("glatam-calendar-month-view")
531
- ], f);
532
- var H = Object.defineProperty, q = Object.getOwnPropertyDescriptor, R = (e, t, a, i) => {
533
- for (var r = i > 1 ? void 0 : i ? q(t, a) : t, l = e.length - 1, o; l >= 0; l--)
534
- (o = e[l]) && (r = (i ? o(t, a, r) : o(r)) || r);
535
- return i && r && H(t, a, r), r;
515
+ $([
516
+ l({ type: Array })
517
+ ], w.prototype, "days", 2);
518
+ $([
519
+ l({ type: String })
520
+ ], w.prototype, "locale", 2);
521
+ $([
522
+ l({ type: Number })
523
+ ], w.prototype, "startOfWeekDay", 2);
524
+ $([
525
+ l({ type: Array })
526
+ ], w.prototype, "selectedDates", 2);
527
+ $([
528
+ l({ type: String })
529
+ ], w.prototype, "role", 2);
530
+ $([
531
+ l({ type: String, reflect: !0 })
532
+ ], w.prototype, "size", 2);
533
+ $([
534
+ l({ type: String })
535
+ ], w.prototype, "minDate", 2);
536
+ $([
537
+ l({ type: String })
538
+ ], w.prototype, "maxDate", 2);
539
+ $([
540
+ l({ type: Boolean })
541
+ ], w.prototype, "showNeighboringMonth", 2);
542
+ $([
543
+ l({ attribute: !1 })
544
+ ], w.prototype, "tileClassName", 2);
545
+ w = $([
546
+ O("glatam-calendar-month-view")
547
+ ], w);
548
+ var J = Object.defineProperty, K = Object.getOwnPropertyDescriptor, k = (e, t, a, r) => {
549
+ for (var i = r > 1 ? void 0 : r ? K(t, a) : t, s = e.length - 1, o; s >= 0; s--)
550
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
551
+ return r && i && J(t, a, i), i;
536
552
  };
537
- let w = class extends O {
553
+ let x = class extends T {
538
554
  constructor() {
539
- super(...arguments), this.days = [], this.slots = [], this.locale = "es", this.selectedRange = null, this.role = "provider", this.isDragging = !1, this.dragDayIndex = null, this.dragStartSlotIndex = null, this.dragEndSlotIndex = null, this.handleMouseUp = () => {
555
+ super(...arguments), this.days = [], this.slots = [], this.locale = "es", this.selectedRange = null, this.role = "provider", this.minDate = "", this.maxDate = "", this.isDragging = !1, this.dragDayIndex = null, this.dragStartSlotIndex = null, this.dragEndSlotIndex = null, this.handleMouseUp = () => {
540
556
  if (!this.isDragging || this.dragDayIndex === null || this.dragStartSlotIndex === null || this.dragEndSlotIndex === null) {
541
557
  this.isDragging = !1;
542
558
  return;
543
559
  }
544
560
  this.isDragging = !1;
545
- const e = Math.min(this.dragStartSlotIndex, this.dragEndSlotIndex), t = Math.max(this.dragStartSlotIndex, this.dragEndSlotIndex), a = this.days[this.dragDayIndex], i = a.slots.slice(e, t + 1);
546
- i.some((r) => r.isBlocked) || this.dispatchEvent(new CustomEvent("range-select", {
547
- detail: { dateString: a.dateString, start: i[0].start, end: i[i.length - 1].end },
561
+ const e = Math.min(this.dragStartSlotIndex, this.dragEndSlotIndex), t = Math.max(this.dragStartSlotIndex, this.dragEndSlotIndex), a = this.days[this.dragDayIndex], r = a.slots.slice(e, t + 1);
562
+ r.some((i) => i.isBlocked) || this.dispatchEvent(new CustomEvent("range-select", {
563
+ detail: { dateString: a.dateString, start: r[0].start, end: r[r.length - 1].end },
548
564
  bubbles: !0,
549
565
  composed: !0
550
566
  })), this.dragDayIndex = null, this.dragStartSlotIndex = null, this.dragEndSlotIndex = null;
@@ -557,16 +573,20 @@ let w = class extends O {
557
573
  window.removeEventListener("mouseup", this.handleMouseUp), super.disconnectedCallback();
558
574
  }
559
575
  handleMouseDown(e, t, a) {
560
- if (a) {
561
- if (this.role === "buyer") return;
562
- this.dispatchEvent(new CustomEvent("slot-click", {
563
- detail: { dateString: this.days[e].dateString, slot: this.days[e].slots[t], isBlocked: !0 },
564
- bubbles: !0,
565
- composed: !0
566
- }));
567
- return;
576
+ var s;
577
+ const r = (s = this.days[e]) == null ? void 0 : s.dateString;
578
+ if (!(this.minDate && r < this.minDate || this.maxDate && r > this.maxDate)) {
579
+ if (a) {
580
+ if (this.role === "buyer") return;
581
+ this.dispatchEvent(new CustomEvent("slot-click", {
582
+ detail: { dateString: this.days[e].dateString, slot: this.days[e].slots[t], isBlocked: !0 },
583
+ bubbles: !0,
584
+ composed: !0
585
+ }));
586
+ return;
587
+ }
588
+ this.isDragging = !0, this.dragDayIndex = e, this.dragStartSlotIndex = t, this.dragEndSlotIndex = t;
568
589
  }
569
- this.isDragging = !0, this.dragDayIndex = e, this.dragStartSlotIndex = t, this.dragEndSlotIndex = t;
570
590
  }
571
591
  handleMouseEnter(e, t, a) {
572
592
  this.isDragging && e === this.dragDayIndex && !a && (this.dragEndSlotIndex = t);
@@ -576,43 +596,44 @@ let w = class extends O {
576
596
  }
577
597
  isSlotDragSelecting(e, t) {
578
598
  if (!this.isDragging || e !== this.dragDayIndex) return !1;
579
- const a = Math.min(this.dragStartSlotIndex, this.dragEndSlotIndex), i = Math.max(this.dragStartSlotIndex, this.dragEndSlotIndex);
580
- return t >= a && t <= i;
599
+ const a = Math.min(this.dragStartSlotIndex, this.dragEndSlotIndex), r = Math.max(this.dragStartSlotIndex, this.dragEndSlotIndex);
600
+ return t >= a && t <= r;
581
601
  }
582
602
  render() {
583
- const e = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
584
- return d`
603
+ const e = z(/* @__PURE__ */ new Date());
604
+ return c`
585
605
  <div class="time-col">
586
606
  <div class="header-cell">Hora</div>
587
- ${this.slots.map((t) => d`<div class="slot-cell time-slot-label">${t.start}</div>`)}
607
+ ${this.slots.map((t) => c`<div class="slot-cell time-slot-label">${t.start}</div>`)}
588
608
  </div>
589
609
 
590
610
  ${this.days.map((t, a) => {
591
- const i = t.dateString === e, r = new Intl.DateTimeFormat(this.locale, { weekday: "short" }).format(t.date);
592
- return d`
611
+ const r = t.dateString === e, i = new Intl.DateTimeFormat(this.locale, { weekday: "short" }).format(t.date), s = this.minDate && t.dateString < this.minDate || this.maxDate && t.dateString > this.maxDate;
612
+ return c`
593
613
  <div class="day-col">
594
- <div class="header-cell ${i ? "today" : ""}">
595
- <div>${r}</div>
614
+ <div class="header-cell ${r ? "today" : ""}">
615
+ <div>${i}</div>
596
616
  <div class="day-num">${t.dayNumber}</div>
597
617
  </div>
598
618
 
599
- ${t.slots.map((l, o) => {
600
- var m, y;
601
- const p = l.isBlocked, n = this.isSlotSelected(t.dateString, l), c = this.isSlotDragSelecting(a, o);
602
- return d`
619
+ ${t.slots.map((o, u) => {
620
+ var y, f;
621
+ const n = o.isBlocked, d = this.isSlotSelected(t.dateString, o), h = this.isSlotDragSelecting(a, u);
622
+ return c`
603
623
  <div
604
- class=${N({
624
+ class=${A({
605
625
  "slot-cell": !0,
606
- available: !p,
607
- blocked: p,
608
- selected: n,
609
- "drag-selecting": c
626
+ available: !n && !s,
627
+ blocked: n,
628
+ selected: d,
629
+ "drag-selecting": h,
630
+ disabled: s
610
631
  })}
611
- @mousedown=${() => this.handleMouseDown(a, o, p)}
612
- @mouseenter=${() => this.handleMouseEnter(a, o, p)}
613
- title=${p && ((m = l.rule) != null && m.description) ? l.rule.description : ""}
632
+ @mousedown=${() => this.handleMouseDown(a, u, n)}
633
+ @mouseenter=${() => this.handleMouseEnter(a, u, n)}
634
+ title=${n && ((y = o.rule) != null && y.description) ? o.rule.description : ""}
614
635
  >
615
- ${p ? ((y = l.rule) == null ? void 0 : y.description) || "Ocupado" : n ? "Reservado" : ""}
636
+ ${n ? ((f = o.rule) == null ? void 0 : f.description) || "Ocupado" : d ? "Reservado" : ""}
616
637
  </div>
617
638
  `;
618
639
  })}
@@ -622,7 +643,7 @@ let w = class extends O {
622
643
  `;
623
644
  }
624
645
  };
625
- w.styles = E`
646
+ x.styles = M`
626
647
  :host {
627
648
  display: grid; grid-template-columns: var(--glatam-time-col-width) repeat(7, 1fr); gap: 2px;
628
649
  width: 100%; background-color: var(--glatam-border); border: 1px solid var(--glatam-border);
@@ -674,52 +695,59 @@ w.styles = E`
674
695
  }
675
696
  .slot-cell.selected { background-color: var(--glatam-selection-bg); border-left: 3px solid var(--glatam-selection-border); }
676
697
  .slot-cell.drag-selecting { background-color: var(--glatam-primary-light); }
698
+ .slot-cell.disabled { opacity: 0.35; cursor: not-allowed; background-color: var(--glatam-surface); pointer-events: none; }
677
699
  `;
678
- R([
679
- s({ type: Array })
680
- ], w.prototype, "days", 2);
681
- R([
682
- s({ type: Array })
683
- ], w.prototype, "slots", 2);
684
- R([
685
- s({ type: String })
686
- ], w.prototype, "locale", 2);
687
- R([
688
- s({ type: Object })
689
- ], w.prototype, "selectedRange", 2);
690
- R([
691
- s({ type: String })
692
- ], w.prototype, "role", 2);
693
- R([
694
- u()
695
- ], w.prototype, "isDragging", 2);
696
- R([
697
- u()
698
- ], w.prototype, "dragDayIndex", 2);
699
- R([
700
- u()
701
- ], w.prototype, "dragStartSlotIndex", 2);
702
- R([
703
- u()
704
- ], w.prototype, "dragEndSlotIndex", 2);
705
- w = R([
706
- T("glatam-calendar-week-view")
707
- ], w);
708
- var G = Object.defineProperty, V = Object.getOwnPropertyDescriptor, z = (e, t, a, i) => {
709
- for (var r = i > 1 ? void 0 : i ? V(t, a) : t, l = e.length - 1, o; l >= 0; l--)
710
- (o = e[l]) && (r = (i ? o(t, a, r) : o(r)) || r);
711
- return i && r && G(t, a, r), r;
700
+ k([
701
+ l({ type: Array })
702
+ ], x.prototype, "days", 2);
703
+ k([
704
+ l({ type: Array })
705
+ ], x.prototype, "slots", 2);
706
+ k([
707
+ l({ type: String })
708
+ ], x.prototype, "locale", 2);
709
+ k([
710
+ l({ type: Object })
711
+ ], x.prototype, "selectedRange", 2);
712
+ k([
713
+ l({ type: String })
714
+ ], x.prototype, "role", 2);
715
+ k([
716
+ l({ type: String })
717
+ ], x.prototype, "minDate", 2);
718
+ k([
719
+ l({ type: String })
720
+ ], x.prototype, "maxDate", 2);
721
+ k([
722
+ m()
723
+ ], x.prototype, "isDragging", 2);
724
+ k([
725
+ m()
726
+ ], x.prototype, "dragDayIndex", 2);
727
+ k([
728
+ m()
729
+ ], x.prototype, "dragStartSlotIndex", 2);
730
+ k([
731
+ m()
732
+ ], x.prototype, "dragEndSlotIndex", 2);
733
+ x = k([
734
+ O("glatam-calendar-week-view")
735
+ ], x);
736
+ var Q = Object.defineProperty, tt = Object.getOwnPropertyDescriptor, R = (e, t, a, r) => {
737
+ for (var i = r > 1 ? void 0 : r ? tt(t, a) : t, s = e.length - 1, o; s >= 0; s--)
738
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
739
+ return r && i && Q(t, a, i), i;
712
740
  };
713
- let S = class extends O {
741
+ let S = class extends T {
714
742
  constructor() {
715
- super(...arguments), this.day = null, this.slots = [], this.locale = "es", this.selectedRange = null, this.role = "provider", this.isDragging = !1, this.dragStartSlotIndex = null, this.dragEndSlotIndex = null, this.handleMouseUp = () => {
743
+ super(...arguments), this.day = null, this.slots = [], this.locale = "es", this.selectedRange = null, this.role = "provider", this.minDate = "", this.maxDate = "", this.isDragging = !1, this.dragStartSlotIndex = null, this.dragEndSlotIndex = null, this.handleMouseUp = () => {
716
744
  if (!this.isDragging || !this.day || this.dragStartSlotIndex === null || this.dragEndSlotIndex === null) {
717
745
  this.isDragging = !1;
718
746
  return;
719
747
  }
720
748
  this.isDragging = !1;
721
749
  const e = Math.min(this.dragStartSlotIndex, this.dragEndSlotIndex), t = Math.max(this.dragStartSlotIndex, this.dragEndSlotIndex), a = this.day.slots.slice(e, t + 1);
722
- a.some((i) => i.isBlocked) || this.dispatchEvent(new CustomEvent("range-select", {
750
+ a.some((r) => r.isBlocked) || this.dispatchEvent(new CustomEvent("range-select", {
723
751
  detail: { dateString: this.day.dateString, start: a[0].start, end: a[a.length - 1].end },
724
752
  bubbles: !0,
725
753
  composed: !0
@@ -733,16 +761,20 @@ let S = class extends O {
733
761
  window.removeEventListener("mouseup", this.handleMouseUp), super.disconnectedCallback();
734
762
  }
735
763
  handleMouseDown(e, t) {
736
- if (t && this.day) {
737
- if (this.role === "buyer") return;
738
- this.dispatchEvent(new CustomEvent("slot-click", {
739
- detail: { dateString: this.day.dateString, slot: this.day.slots[e], isBlocked: !0 },
740
- bubbles: !0,
741
- composed: !0
742
- }));
743
- return;
764
+ if (!this.day) return;
765
+ const a = this.day.dateString;
766
+ if (!(this.minDate && a < this.minDate || this.maxDate && a > this.maxDate)) {
767
+ if (t) {
768
+ if (this.role === "buyer") return;
769
+ this.dispatchEvent(new CustomEvent("slot-click", {
770
+ detail: { dateString: this.day.dateString, slot: this.day.slots[e], isBlocked: !0 },
771
+ bubbles: !0,
772
+ composed: !0
773
+ }));
774
+ return;
775
+ }
776
+ this.isDragging = !0, this.dragStartSlotIndex = e, this.dragEndSlotIndex = e;
744
777
  }
745
- this.isDragging = !0, this.dragStartSlotIndex = e, this.dragEndSlotIndex = e;
746
778
  }
747
779
  handleMouseEnter(e, t) {
748
780
  this.isDragging && !t && (this.dragEndSlotIndex = e);
@@ -756,36 +788,37 @@ let S = class extends O {
756
788
  return e >= t && e <= a;
757
789
  }
758
790
  render() {
759
- if (!this.day) return d`<div>Cargando...</div>`;
760
- const e = this.day.dateString === (/* @__PURE__ */ new Date()).toISOString().split("T")[0], t = new Intl.DateTimeFormat(this.locale, { weekday: "long", day: "numeric", month: "long" }).format(this.day.date);
761
- return d`
791
+ if (!this.day) return c`<div>Cargando...</div>`;
792
+ const e = this.day.dateString === z(/* @__PURE__ */ new Date()), t = this.minDate && this.day.dateString < this.minDate || this.maxDate && this.day.dateString > this.maxDate, a = new Intl.DateTimeFormat(this.locale, { weekday: "long", day: "numeric", month: "long" }).format(this.day.date);
793
+ return c`
762
794
  <div class="time-col">
763
795
  <div class="header-cell">Hora</div>
764
- ${this.slots.map((a) => d`<div class="slot-cell time-slot-label">${a.start}</div>`)}
796
+ ${this.slots.map((r) => c`<div class="slot-cell time-slot-label">${r.start}</div>`)}
765
797
  </div>
766
798
 
767
799
  <div class="day-col">
768
800
  <div class="header-cell ${e ? "today" : ""}">
769
- <div style="text-transform: capitalize;">${t}</div>
801
+ <div style="text-transform: capitalize;">${a}</div>
770
802
  </div>
771
803
 
772
- ${this.day.slots.map((a, i) => {
773
- var p, n;
774
- const r = a.isBlocked, l = this.isSlotSelected(a), o = this.isSlotDragSelecting(i);
775
- return d`
804
+ ${this.day.slots.map((r, i) => {
805
+ var n, d;
806
+ const s = r.isBlocked, o = this.isSlotSelected(r), u = this.isSlotDragSelecting(i);
807
+ return c`
776
808
  <div
777
- class=${N({
809
+ class=${A({
778
810
  "slot-cell": !0,
779
- available: !r,
780
- blocked: r,
781
- selected: l,
782
- "drag-selecting": o
811
+ available: !s && !t,
812
+ blocked: s,
813
+ selected: o,
814
+ "drag-selecting": u,
815
+ disabled: t
783
816
  })}
784
- @mousedown=${() => this.handleMouseDown(i, r)}
785
- @mouseenter=${() => this.handleMouseEnter(i, r)}
786
- title=${r && ((p = a.rule) != null && p.description) ? a.rule.description : ""}
817
+ @mousedown=${() => this.handleMouseDown(i, s)}
818
+ @mouseenter=${() => this.handleMouseEnter(i, s)}
819
+ title=${s && ((n = r.rule) != null && n.description) ? r.rule.description : ""}
787
820
  >
788
- ${r ? ((n = a.rule) == null ? void 0 : n.description) || "Ocupado" : l ? "Reservado" : ""}
821
+ ${s ? ((d = r.rule) == null ? void 0 : d.description) || "Ocupado" : o ? "Reservado" : ""}
789
822
  </div>
790
823
  `;
791
824
  })}
@@ -793,7 +826,7 @@ let S = class extends O {
793
826
  `;
794
827
  }
795
828
  };
796
- S.styles = E`
829
+ S.styles = M`
797
830
  :host {
798
831
  display: grid; grid-template-columns: var(--glatam-time-col-width) 1fr; gap: 2px;
799
832
  width: 100%; background-color: var(--glatam-border); border: 1px solid var(--glatam-border);
@@ -822,35 +855,42 @@ S.styles = E`
822
855
  }
823
856
  .slot-cell.selected { background-color: var(--glatam-selection-bg); border-left: 3px solid var(--glatam-selection-border); }
824
857
  .slot-cell.drag-selecting { background-color: var(--glatam-primary-light); }
858
+ .slot-cell.disabled { opacity: 0.35; cursor: not-allowed; background-color: var(--glatam-surface); pointer-events: none; }
825
859
  `;
826
- z([
827
- s({ type: Object })
860
+ R([
861
+ l({ type: Object })
828
862
  ], S.prototype, "day", 2);
829
- z([
830
- s({ type: Array })
863
+ R([
864
+ l({ type: Array })
831
865
  ], S.prototype, "slots", 2);
832
- z([
833
- s({ type: String })
866
+ R([
867
+ l({ type: String })
834
868
  ], S.prototype, "locale", 2);
835
- z([
836
- s({ type: Object })
869
+ R([
870
+ l({ type: Object })
837
871
  ], S.prototype, "selectedRange", 2);
838
- z([
839
- s({ type: String })
872
+ R([
873
+ l({ type: String })
840
874
  ], S.prototype, "role", 2);
841
- z([
842
- u()
875
+ R([
876
+ l({ type: String })
877
+ ], S.prototype, "minDate", 2);
878
+ R([
879
+ l({ type: String })
880
+ ], S.prototype, "maxDate", 2);
881
+ R([
882
+ m()
843
883
  ], S.prototype, "isDragging", 2);
844
- z([
845
- u()
884
+ R([
885
+ m()
846
886
  ], S.prototype, "dragStartSlotIndex", 2);
847
- z([
848
- u()
887
+ R([
888
+ m()
849
889
  ], S.prototype, "dragEndSlotIndex", 2);
850
- S = z([
851
- T("glatam-calendar-day-view")
890
+ S = R([
891
+ O("glatam-calendar-day-view")
852
892
  ], S);
853
- const Y = E`
893
+ const et = M`
854
894
  dialog {
855
895
  background: transparent;
856
896
  border: none;
@@ -1006,17 +1046,24 @@ const Y = E`
1006
1046
  background: rgba(255, 69, 58, 0.18);
1007
1047
  }
1008
1048
  `;
1009
- var Z = Object.defineProperty, J = Object.getOwnPropertyDescriptor, k = (e, t, a, i) => {
1010
- for (var r = i > 1 ? void 0 : i ? J(t, a) : t, l = e.length - 1, o; l >= 0; l--)
1011
- (o = e[l]) && (r = (i ? o(t, a, r) : o(r)) || r);
1012
- return i && r && Z(t, a, r), r;
1049
+ var at = Object.defineProperty, it = Object.getOwnPropertyDescriptor, E = (e, t, a, r) => {
1050
+ for (var i = r > 1 ? void 0 : r ? it(t, a) : t, s = e.length - 1, o; s >= 0; s--)
1051
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
1052
+ return r && i && at(t, a, i), i;
1013
1053
  };
1014
- let x = class extends O {
1054
+ let D = class extends T {
1015
1055
  constructor() {
1016
1056
  super(...arguments), this.open = !1, this.dateString = "", this.startTime = "", this.endTime = "", this.isRange = !1, this.existingRule = null, this.description = "", this.blockAllDay = !0, this.isRecurring = !1, this.selectedDays = [];
1017
1057
  }
1018
1058
  willUpdate(e) {
1019
- e.has("open") && this.open && (this.existingRule ? (this.description = "Bloqueo", this.blockAllDay = !this.existingRule.slots || this.existingRule.slots.length === 0, this.isRecurring = this.existingRule.type === "weekly", this.selectedDays = this.existingRule.daysOfWeek || []) : (this.description = "", this.blockAllDay = !this.isRange, this.isRecurring = !1, this.selectedDays = [(/* @__PURE__ */ new Date(this.dateString + "T00:00:00")).getDay()]));
1059
+ if (e.has("open") && this.open)
1060
+ if (this.existingRule)
1061
+ this.description = this.existingRule.description || "", this.blockAllDay = !this.existingRule.slots || this.existingRule.slots.length === 0, this.isRecurring = this.existingRule.type === "weekly", this.selectedDays = this.existingRule.daysOfWeek || [], this.existingRule.slots && this.existingRule.slots.length > 0 && (this.startTime = this.existingRule.slots[0].start, this.endTime = this.existingRule.slots[0].end);
1062
+ else {
1063
+ this.description = "", this.blockAllDay = !this.isRange, this.isRecurring = !1;
1064
+ const t = P(this.dateString);
1065
+ this.selectedDays = [t.getDay()];
1066
+ }
1020
1067
  }
1021
1068
  updated(e) {
1022
1069
  var t;
@@ -1034,7 +1081,7 @@ let x = class extends O {
1034
1081
  }
1035
1082
  handleSave() {
1036
1083
  const e = {
1037
- title: this.description || "Bloqueo",
1084
+ title: this.description.trim(),
1038
1085
  blockAllDay: this.blockAllDay,
1039
1086
  isRecurring: this.isRecurring,
1040
1087
  selectedDays: this.selectedDays,
@@ -1046,14 +1093,14 @@ let x = class extends O {
1046
1093
  }
1047
1094
  handleDelete() {
1048
1095
  this.existingRule && this.dispatchEvent(new CustomEvent("delete-rule", {
1049
- detail: { id: this.existingRule.id },
1096
+ detail: { id: this.existingRule.id, dateString: this.dateString, rule: this.existingRule },
1050
1097
  bubbles: !0,
1051
1098
  composed: !0
1052
1099
  }));
1053
1100
  }
1054
1101
  render() {
1055
1102
  const e = ["D", "L", "M", "M", "J", "V", "S"], t = this.isRange ? `${this.dateString} (${this.startTime} - ${this.endTime})` : this.dateString;
1056
- return d`
1103
+ return c`
1057
1104
  <dialog id="booking-dialog" @close=${this.handleDialogClose}>
1058
1105
  <div class="modal-content">
1059
1106
  <h3>${this.existingRule ? "Gestionar Bloqueo" : "Crear Bloqueo"}</h3>
@@ -1096,12 +1143,13 @@ let x = class extends O {
1096
1143
  </label>
1097
1144
  </div>
1098
1145
 
1099
- ${this.isRecurring ? d`
1146
+ ${this.isRecurring ? c`
1100
1147
  <div class="form-group">
1101
1148
  <label>Repetir los días</label>
1102
1149
  <div class="days-grid">
1103
- ${[1, 2, 3, 4, 5, 6, 0].map((a) => d`
1150
+ ${[1, 2, 3, 4, 5, 6, 0].map((a) => c`
1104
1151
  <button
1152
+ type="button"
1105
1153
  class="day-btn ${this.selectedDays.includes(a) ? "selected" : ""}"
1106
1154
  @click=${() => this.toggleDay(a)}
1107
1155
  >
@@ -1113,55 +1161,303 @@ let x = class extends O {
1113
1161
  ` : ""}
1114
1162
 
1115
1163
  <div class="btn-actions">
1116
- ${this.existingRule ? d`<button class="btn btn-danger" @click=${this.handleDelete}>Eliminar</button>` : ""}
1117
- <button class="btn btn-cancel" @click=${() => this.dispatchEvent(new CustomEvent("close"))}>Cancelar</button>
1118
- <button class="btn btn-save" @click=${this.handleSave}>Guardar</button>
1164
+ ${this.existingRule ? c`<button type="button" class="btn btn-danger" @click=${this.handleDelete}>Eliminar</button>` : ""}
1165
+ <button type="button" class="btn btn-cancel" @click=${() => this.dispatchEvent(new CustomEvent("close"))}>Cancelar</button>
1166
+ <button type="button" class="btn btn-save" @click=${this.handleSave}>Guardar</button>
1119
1167
  </div>
1120
1168
  </div>
1121
1169
  </dialog>
1122
1170
  `;
1123
1171
  }
1124
1172
  };
1125
- x.styles = Y;
1126
- k([
1127
- s({ type: Boolean })
1128
- ], x.prototype, "open", 2);
1129
- k([
1130
- s({ type: String })
1131
- ], x.prototype, "dateString", 2);
1132
- k([
1133
- s({ type: String })
1134
- ], x.prototype, "startTime", 2);
1135
- k([
1136
- s({ type: String })
1137
- ], x.prototype, "endTime", 2);
1138
- k([
1139
- s({ type: Boolean })
1140
- ], x.prototype, "isRange", 2);
1141
- k([
1142
- s({ type: Object })
1143
- ], x.prototype, "existingRule", 2);
1144
- k([
1145
- u()
1146
- ], x.prototype, "description", 2);
1147
- k([
1148
- u()
1149
- ], x.prototype, "blockAllDay", 2);
1150
- k([
1151
- u()
1152
- ], x.prototype, "isRecurring", 2);
1153
- k([
1154
- u()
1155
- ], x.prototype, "selectedDays", 2);
1156
- x = k([
1157
- T("glatam-calendar-modal")
1158
- ], x);
1159
- var X = Object.defineProperty, K = Object.getOwnPropertyDescriptor, h = (e, t, a, i) => {
1160
- for (var r = i > 1 ? void 0 : i ? K(t, a) : t, l = e.length - 1, o; l >= 0; l--)
1161
- (o = e[l]) && (r = (i ? o(t, a, r) : o(r)) || r);
1162
- return i && r && X(t, a, r), r;
1173
+ D.styles = et;
1174
+ E([
1175
+ l({ type: Boolean })
1176
+ ], D.prototype, "open", 2);
1177
+ E([
1178
+ l({ type: String })
1179
+ ], D.prototype, "dateString", 2);
1180
+ E([
1181
+ l({ type: String })
1182
+ ], D.prototype, "startTime", 2);
1183
+ E([
1184
+ l({ type: String })
1185
+ ], D.prototype, "endTime", 2);
1186
+ E([
1187
+ l({ type: Boolean })
1188
+ ], D.prototype, "isRange", 2);
1189
+ E([
1190
+ l({ type: Object })
1191
+ ], D.prototype, "existingRule", 2);
1192
+ E([
1193
+ m()
1194
+ ], D.prototype, "description", 2);
1195
+ E([
1196
+ m()
1197
+ ], D.prototype, "blockAllDay", 2);
1198
+ E([
1199
+ m()
1200
+ ], D.prototype, "isRecurring", 2);
1201
+ E([
1202
+ m()
1203
+ ], D.prototype, "selectedDays", 2);
1204
+ D = E([
1205
+ O("glatam-calendar-modal")
1206
+ ], D);
1207
+ const rt = M`
1208
+ :host {
1209
+ display: contents;
1210
+ font-family: var(--glatam-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);
1211
+ }
1212
+
1213
+ dialog {
1214
+ border: none;
1215
+ border-radius: var(--glatam-border-radius, 16px);
1216
+ padding: 0;
1217
+ background: var(--glatam-bg, #ffffff);
1218
+ color: var(--glatam-text, #1d1d1f);
1219
+ max-width: 440px;
1220
+ width: 90vw;
1221
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
1222
+ overflow: hidden;
1223
+ }
1224
+
1225
+ dialog::backdrop {
1226
+ background: rgba(0, 0, 0, 0.4);
1227
+ backdrop-filter: blur(8px);
1228
+ -webkit-backdrop-filter: blur(8px);
1229
+ }
1230
+
1231
+ .confirmation-container {
1232
+ padding: 24px;
1233
+ display: flex;
1234
+ flex-direction: column;
1235
+ gap: 18px;
1236
+ }
1237
+
1238
+ .header {
1239
+ display: flex;
1240
+ flex-direction: column;
1241
+ gap: 6px;
1242
+ }
1243
+
1244
+ .title {
1245
+ font-size: 1.15rem;
1246
+ font-weight: 600;
1247
+ margin: 0;
1248
+ color: var(--glatam-text, #1d1d1f);
1249
+ line-height: 1.3;
1250
+ }
1251
+
1252
+ .subtitle {
1253
+ font-size: 0.88rem;
1254
+ color: var(--glatam-text-secondary, #86868b);
1255
+ margin: 0;
1256
+ line-height: 1.4;
1257
+ }
1258
+
1259
+ .rule-badge {
1260
+ display: inline-flex;
1261
+ align-items: center;
1262
+ gap: 6px;
1263
+ padding: 6px 12px;
1264
+ background: var(--glatam-surface, #f5f5f7);
1265
+ border-radius: 8px;
1266
+ font-size: 0.82rem;
1267
+ font-weight: 500;
1268
+ color: var(--glatam-text, #1d1d1f);
1269
+ }
1270
+
1271
+ .options-group {
1272
+ display: flex;
1273
+ flex-direction: column;
1274
+ gap: 10px;
1275
+ }
1276
+
1277
+ .option-card {
1278
+ display: flex;
1279
+ align-items: flex-start;
1280
+ gap: 12px;
1281
+ padding: 14px 16px;
1282
+ border: 1.5px solid var(--glatam-border, #e5e5ea);
1283
+ border-radius: 12px;
1284
+ background: var(--glatam-bg, #ffffff);
1285
+ cursor: pointer;
1286
+ text-align: left;
1287
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
1288
+ width: 100%;
1289
+ box-sizing: border-box;
1290
+ }
1291
+
1292
+ .option-card:hover {
1293
+ border-color: var(--glatam-primary, #5856d6);
1294
+ background: var(--glatam-primary-light, rgba(88, 86, 214, 0.06));
1295
+ transform: translateY(-1px);
1296
+ }
1297
+
1298
+ .option-card:active {
1299
+ transform: scale(0.99);
1300
+ }
1301
+
1302
+ .option-icon {
1303
+ font-size: 1.25rem;
1304
+ line-height: 1;
1305
+ margin-top: 2px;
1306
+ }
1307
+
1308
+ .option-text {
1309
+ display: flex;
1310
+ flex-direction: column;
1311
+ gap: 3px;
1312
+ }
1313
+
1314
+ .option-title {
1315
+ font-size: 0.92rem;
1316
+ font-weight: 600;
1317
+ color: var(--glatam-text, #1d1d1f);
1318
+ }
1319
+
1320
+ .option-desc {
1321
+ font-size: 0.8rem;
1322
+ color: var(--glatam-text-secondary, #86868b);
1323
+ line-height: 1.35;
1324
+ }
1325
+
1326
+ .actions {
1327
+ display: flex;
1328
+ justify-content: flex-end;
1329
+ margin-top: 4px;
1330
+ }
1331
+
1332
+ .btn-cancel {
1333
+ padding: 10px 18px;
1334
+ border-radius: 10px;
1335
+ border: 1px solid var(--glatam-border, #e5e5ea);
1336
+ background: var(--glatam-surface, #f5f5f7);
1337
+ color: var(--glatam-text, #1d1d1f);
1338
+ font-weight: 500;
1339
+ font-size: 0.88rem;
1340
+ cursor: pointer;
1341
+ transition: background 0.15s ease;
1342
+ }
1343
+
1344
+ .btn-cancel:hover {
1345
+ background: var(--glatam-border, #e5e5ea);
1346
+ }
1347
+ `;
1348
+ var ot = Object.defineProperty, st = Object.getOwnPropertyDescriptor, N = (e, t, a, r) => {
1349
+ for (var i = r > 1 ? void 0 : r ? st(t, a) : t, s = e.length - 1, o; s >= 0; s--)
1350
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
1351
+ return r && i && ot(t, a, i), i;
1352
+ };
1353
+ let C = class extends T {
1354
+ constructor() {
1355
+ super(...arguments), this.open = !1, this.dateString = "", this.targetRule = null;
1356
+ }
1357
+ updated(e) {
1358
+ var t;
1359
+ if (e.has("open")) {
1360
+ const a = (t = this.shadowRoot) == null ? void 0 : t.getElementById("series-dialog");
1361
+ a && (this.open ? a.open || a.showModal() : a.open && a.close());
1362
+ }
1363
+ }
1364
+ handleDialogClose() {
1365
+ this.open && this.dispatchEvent(new CustomEvent("close", { bubbles: !0, composed: !0 }));
1366
+ }
1367
+ handleSelectOption(e) {
1368
+ this.targetRule && this.dispatchEvent(
1369
+ new CustomEvent("confirm-action", {
1370
+ detail: {
1371
+ actionType: e,
1372
+ dateString: this.dateString,
1373
+ targetRule: this.targetRule
1374
+ },
1375
+ bubbles: !0,
1376
+ composed: !0
1377
+ })
1378
+ );
1379
+ }
1380
+ render() {
1381
+ var t;
1382
+ const e = ((t = this.targetRule) == null ? void 0 : t.description) || "Bloqueo recurrente";
1383
+ return c`
1384
+ <dialog id="series-dialog" @close=${this.handleDialogClose}>
1385
+ <div class="confirmation-container">
1386
+ <div class="header">
1387
+ <h3 class="title">¿Eliminar bloqueo recurrente?</h3>
1388
+ <p class="subtitle">
1389
+ Este horario pertenece a una regla con patrón de repetición semanal.
1390
+ </p>
1391
+ <div class="rule-badge">
1392
+ <span>📅 ${this.dateString}</span> • <span>${e}</span>
1393
+ </div>
1394
+ </div>
1395
+
1396
+ <div class="options-group">
1397
+ <button
1398
+ type="button"
1399
+ class="option-card"
1400
+ @click=${() => this.handleSelectOption("delete_instance")}
1401
+ title="Anular la regla solo en esta fecha"
1402
+ >
1403
+ <span class="option-icon">🗓️</span>
1404
+ <div class="option-text">
1405
+ <span class="option-title">Eliminar / Liberar solo este día</span>
1406
+ <span class="option-desc">
1407
+ Libera el horario exclusivamente para el ${this.dateString}. El resto de semanas continuarán bloqueadas.
1408
+ </span>
1409
+ </div>
1410
+ </button>
1411
+
1412
+ <button
1413
+ type="button"
1414
+ class="option-card"
1415
+ @click=${() => this.handleSelectOption("delete_series")}
1416
+ title="Eliminar la regla semanal completa"
1417
+ >
1418
+ <span class="option-icon">🔄</span>
1419
+ <div class="option-text">
1420
+ <span class="option-title">Eliminar toda la serie recurrente</span>
1421
+ <span class="option-desc">
1422
+ Remueve la regla semanal completa, liberando este horario para todas las semanas pasadas y futuras.
1423
+ </span>
1424
+ </div>
1425
+ </button>
1426
+ </div>
1427
+
1428
+ <div class="actions">
1429
+ <button
1430
+ type="button"
1431
+ class="btn-cancel"
1432
+ @click=${() => this.dispatchEvent(new CustomEvent("close", { bubbles: !0, composed: !0 }))}
1433
+ >
1434
+ Cancelar
1435
+ </button>
1436
+ </div>
1437
+ </div>
1438
+ </dialog>
1439
+ `;
1440
+ }
1441
+ };
1442
+ C.styles = rt;
1443
+ N([
1444
+ l({ type: Boolean })
1445
+ ], C.prototype, "open", 2);
1446
+ N([
1447
+ l({ type: String })
1448
+ ], C.prototype, "dateString", 2);
1449
+ N([
1450
+ l({ type: Object })
1451
+ ], C.prototype, "targetRule", 2);
1452
+ C = N([
1453
+ O("glatam-series-confirmation-modal")
1454
+ ], C);
1455
+ var lt = Object.defineProperty, nt = Object.getOwnPropertyDescriptor, p = (e, t, a, r) => {
1456
+ for (var i = r > 1 ? void 0 : r ? nt(t, a) : t, s = e.length - 1, o; s >= 0; s--)
1457
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
1458
+ return r && i && lt(t, a, i), i;
1163
1459
  };
1164
- const Q = [
1460
+ const dt = [
1165
1461
  { start: "09:00", end: "10:00" },
1166
1462
  { start: "10:00", end: "11:00" },
1167
1463
  { start: "11:00", end: "12:00" },
@@ -1172,15 +1468,15 @@ const Q = [
1172
1468
  { start: "16:00", end: "17:00" },
1173
1469
  { start: "17:00", end: "18:00" }
1174
1470
  ];
1175
- let g = class extends O {
1471
+ let g = class extends T {
1176
1472
  constructor() {
1177
- super(...arguments), this.role = "provider", this.size = "medium", this.view = "month", this.locale = "es", this.startOfWeekDay = 0, this.rules = [], this.selectedDates = [], this.selectedRange = null, this.hostTimezone = "America/Bogota", this.activeTimezone = "local", this.slots = Q, this.minDate = "", this.maxDate = "", this.showNeighboringMonth = !0, this.tileClassName = null, this.activeDate = /* @__PURE__ */ new Date(), this.localRules = [], this.darkMode = !1, this.modalOpen = !1, this.modalDateString = "", this.modalStartTime = "", this.modalEndTime = "", this.modalIsRange = !1, this.modalExistingRule = null;
1473
+ super(...arguments), this.role = "provider", this.size = "medium", this.view = "month", this.locale = "es", this.startOfWeekDay = 0, this.rules = [], this.selectedDates = [], this.selectedRange = null, this.hostTimezone = "America/Bogota", this.activeTimezone = "local", this.slots = dt, this.minDate = "", this.maxDate = "", this.showNeighboringMonth = !0, this.tileClassName = null, this.enableSeriesConfirmation = !1, this.activeDate = /* @__PURE__ */ new Date(), this.localRules = [], this.darkMode = !1, this.modalOpen = !1, this.modalDateString = "", this.modalStartTime = "", this.modalEndTime = "", this.modalIsRange = !1, this.modalExistingRule = null, this.seriesModalOpen = !1, this.seriesTargetRule = null, this.seriesTargetDateString = "";
1178
1474
  }
1179
1475
  firstUpdated() {
1180
1476
  this.darkMode = window.matchMedia("(prefers-color-scheme: dark)").matches, this.localRules = [...this.rules];
1181
1477
  }
1182
1478
  willUpdate(e) {
1183
- e.has("rules") && (this.localRules = [...this.rules || []]);
1479
+ e.has("rules") && this.rules !== this.localRules && (this.localRules = [...this.rules || []]);
1184
1480
  }
1185
1481
  updated(e) {
1186
1482
  e.has("darkMode") && this.classList.toggle("dark-mode", this.darkMode);
@@ -1199,65 +1495,85 @@ let g = class extends O {
1199
1495
  }
1200
1496
  handleDaySelect(e) {
1201
1497
  const { dateString: t, isBlocked: a } = e.detail;
1202
- this.role === "buyer" && a || (this.activeDate = /* @__PURE__ */ new Date(t + "T00:00:00"), this.view = "day", this.dispatchEvent(new CustomEvent("date-selected", { detail: { dateString: t }, bubbles: !0, composed: !0 })));
1498
+ this.role === "buyer" && a || (this.activeDate = P(t), this.view = "day", this.dispatchEvent(new CustomEvent("date-selected", { detail: { dateString: t }, bubbles: !0, composed: !0 })));
1203
1499
  }
1204
1500
  handleRangeSelect(e) {
1205
- var $, M;
1206
- const { dateString: t, start: a, end: i } = e.detail, r = this.activeTimezone === "local" ? C(this.activeDate, this.hostTimezone, "local") : 0, l = (/* @__PURE__ */ new Date()).toISOString().split("T")[0], o = this.minDate || (this.role === "buyer" ? l : "");
1207
- if (this.role === "buyer" && o && t < o) return;
1208
- const p = this.getDisplaySlots(r), n = p.findIndex((B) => B.start === a), c = p.findIndex((B) => B.end === i), m = (($ = this.slots[n]) == null ? void 0 : $.start) || a, y = ((M = this.slots[c]) == null ? void 0 : M.end) || i;
1501
+ var W, U;
1502
+ const { dateString: t, start: a, end: r } = e.detail, i = this.activeTimezone === "local" ? B(this.activeDate, this.hostTimezone, "local") : 0, s = z(/* @__PURE__ */ new Date()), o = this.minDate || (this.role === "buyer" ? s : "");
1503
+ if (this.role === "buyer" && (o && t < o || this.maxDate && t > this.maxDate)) return;
1504
+ const u = this.getDisplaySlots(i), n = a.split(" ")[0], d = r.split(" ")[0], h = u.findIndex((j) => j.start.startsWith(n)), y = u.findIndex((j) => j.end.startsWith(d)), f = ((W = this.slots[h]) == null ? void 0 : W.start) || n, I = ((U = this.slots[y]) == null ? void 0 : U.end) || d;
1209
1505
  if (this.role === "buyer") {
1210
- this.selectedRange = { dateString: t, start: a, end: i }, this.dispatchEvent(new CustomEvent("booking-selected", { detail: { dateString: t, start: a, end: i, hostStart: m, hostEnd: y }, bubbles: !0, composed: !0 }));
1506
+ this.selectedRange = { dateString: t, start: n, end: d }, this.dispatchEvent(new CustomEvent("booking-selected", { detail: { dateString: t, start: n, end: d, hostStart: f, hostEnd: I }, bubbles: !0, composed: !0 }));
1211
1507
  return;
1212
1508
  }
1213
- this.openModal(t, m, y, !0, null);
1509
+ this.openModal(t, f, I, !0, null);
1214
1510
  }
1215
1511
  handleSlotClick(e) {
1216
- const { dateString: t, slot: a } = e.detail, i = /* @__PURE__ */ new Date(t + "T00:00:00"), r = this.activeTimezone === "local" ? C(this.activeDate, this.hostTimezone, "local") : 0, l = (/* @__PURE__ */ new Date()).toISOString().split("T")[0], o = this.minDate || (this.role === "buyer" ? l : "");
1217
- if (this.role === "buyer" && (a.isBlocked || o && t < o)) return;
1218
- const p = this.getDisplaySlots(r), n = p.findIndex((y) => y.start === a.start), c = this.slots[n] || a;
1512
+ const { dateString: t, slot: a } = e.detail, r = P(t), i = this.activeTimezone === "local" ? B(this.activeDate, this.hostTimezone, "local") : 0, s = z(/* @__PURE__ */ new Date()), o = this.minDate || (this.role === "buyer" ? s : "");
1513
+ if (this.role === "buyer" && (a.isBlocked || o && t < o || this.maxDate && t > this.maxDate)) return;
1514
+ const u = this.getDisplaySlots(i), n = a.start.split(" ")[0], d = u.findIndex((f) => f.start.startsWith(n)), h = this.slots[d] || a;
1219
1515
  if (this.role === "buyer") {
1220
- this.selectedRange = { dateString: t, start: a.start, end: a.end }, this.dispatchEvent(new CustomEvent("booking-selected", { detail: { dateString: t, start: a.start, end: a.end, hostStart: c.start, hostEnd: c.end }, bubbles: !0, composed: !0 }));
1516
+ this.selectedRange = { dateString: t, start: a.start, end: a.end }, this.dispatchEvent(new CustomEvent("booking-selected", { detail: { dateString: t, start: a.start, end: a.end, hostStart: h.start, hostEnd: h.end }, bubbles: !0, composed: !0 }));
1221
1517
  return;
1222
1518
  }
1223
- const m = this.localRules.find((y) => I(i, c, [y]));
1224
- this.openModal(t, c.start, c.end, !0, m || null);
1519
+ const y = this.localRules.find((f) => _(r, h, [f]));
1520
+ this.openModal(t, h.start, h.end, !0, y || null);
1225
1521
  }
1226
1522
  handleBlockDayAction() {
1227
- const e = _(this.activeDate), t = this.localRules.find((a) => I(this.activeDate, void 0, [a]));
1523
+ const e = z(this.activeDate), t = this.localRules.find((a) => _(this.activeDate, void 0, [a]));
1228
1524
  this.openModal(e, "", "", !1, t || null);
1229
1525
  }
1230
- openModal(e, t, a, i, r) {
1231
- this.modalDateString = e, this.modalStartTime = t, this.modalEndTime = a, this.modalIsRange = i, this.modalExistingRule = r, this.modalOpen = !0;
1526
+ openModal(e, t, a, r, i) {
1527
+ this.modalDateString = e, this.modalStartTime = t, this.modalEndTime = a, this.modalIsRange = r, this.modalExistingRule = i, this.modalOpen = !0;
1232
1528
  }
1233
1529
  handleSaveRule(e) {
1234
- const t = e.detail, a = this.modalExistingRule ? this.modalExistingRule.id : `rule-${Date.now()}`, i = {
1530
+ var s;
1531
+ const t = e.detail, a = this.modalExistingRule ? this.modalExistingRule.id : `rule-${Date.now()}`, r = {
1235
1532
  id: a,
1236
1533
  type: t.isRecurring ? "weekly" : "date-range",
1237
1534
  slots: t.blockAllDay ? void 0 : [{ start: t.startTime, end: t.endTime }],
1238
1535
  daysOfWeek: t.isRecurring ? t.selectedDays : void 0,
1239
1536
  startDate: t.isRecurring ? void 0 : t.dateString,
1240
1537
  endDate: t.isRecurring ? void 0 : t.dateString,
1241
- description: t.title
1242
- };
1243
- this.localRules = this.modalExistingRule ? this.localRules.map((r) => r.id === a ? i : r) : [...this.localRules, i], this.modalOpen = !1, this.dispatchEvent(new CustomEvent("rules-changed", { detail: { rules: this.localRules }, bubbles: !0, composed: !0 }));
1538
+ description: t.title,
1539
+ exceptions: (s = this.modalExistingRule) == null ? void 0 : s.exceptions
1540
+ }, i = this.modalExistingRule ? this.localRules.map((o) => o.id === a ? r : o) : [...this.localRules, r];
1541
+ this.localRules = i, this.rules = i, this.modalOpen = !1, this.dispatchEvent(new CustomEvent("rules-changed", { detail: { rules: i }, bubbles: !0, composed: !0 }));
1244
1542
  }
1245
1543
  handleDeleteRule(e) {
1246
- this.localRules = this.localRules.filter((t) => t.id !== e.detail.id), this.modalOpen = !1, this.dispatchEvent(new CustomEvent("rules-changed", { detail: { rules: this.localRules }, bubbles: !0, composed: !0 }));
1544
+ const t = e.detail.rule || this.localRules.find((s) => s.id === e.detail.id), a = e.detail.dateString || this.modalDateString;
1545
+ if (this.enableSeriesConfirmation && t && t.type === "weekly") {
1546
+ this.modalOpen = !1, this.seriesTargetRule = t, this.seriesTargetDateString = a, this.seriesModalOpen = !0;
1547
+ return;
1548
+ }
1549
+ const { updatedRules: r, targetRule: i } = F(this.localRules, e.detail.id);
1550
+ if (this.localRules = r, this.rules = r, this.modalOpen = !1, i) {
1551
+ const s = { actionType: "delete_series", targetRule: i, dateString: a, updatedRules: r };
1552
+ this.dispatchEvent(new CustomEvent("rule-action-triggered", { detail: s, bubbles: !0, composed: !0 }));
1553
+ }
1554
+ this.dispatchEvent(new CustomEvent("rules-changed", { detail: { rules: r }, bubbles: !0, composed: !0 }));
1555
+ }
1556
+ handleConfirmSeriesAction(e) {
1557
+ const { actionType: t, dateString: a, targetRule: r } = e.detail, { updatedRules: i, targetRule: s } = t === "delete_instance" ? V(this.localRules, r.id, a) : F(this.localRules, r.id);
1558
+ if (this.localRules = i, this.rules = i, this.seriesModalOpen = !1, s) {
1559
+ const o = { actionType: t, targetRule: s, dateString: a, updatedRules: i };
1560
+ this.dispatchEvent(new CustomEvent("rule-action-triggered", { detail: o, bubbles: !0, composed: !0 }));
1561
+ }
1562
+ this.dispatchEvent(new CustomEvent("rules-changed", { detail: { rules: i }, bubbles: !0, composed: !0 }));
1247
1563
  }
1248
1564
  getDisplaySlots(e) {
1249
1565
  return e === 0 ? this.slots : this.slots.map((t) => {
1250
- const a = U(t, e), i = a.dayShift > 0 ? " (+1d)" : a.dayShift < 0 ? " (-1d)" : "";
1251
- return { start: a.start + i, end: a.end + i };
1566
+ const a = H(t, e), r = a.dayShift > 0 ? " (+1d)" : a.dayShift < 0 ? " (-1d)" : "";
1567
+ return { start: a.start + r, end: a.end + r };
1252
1568
  });
1253
1569
  }
1254
1570
  render() {
1255
- var p;
1256
- const e = this.activeDate.getFullYear(), t = this.activeDate.getMonth(), a = I(this.activeDate, void 0, this.localRules), i = this.activeTimezone === "local" ? C(this.activeDate, this.hostTimezone, "local") : 0, r = this.getDisplaySlots(i), l = (n) => n.map((c) => ({ ...c, slots: c.slots.map((m, y) => {
1257
- var $, M;
1258
- return { ...m, start: (($ = r[y]) == null ? void 0 : $.start) || m.start, end: ((M = r[y]) == null ? void 0 : M.end) || m.end };
1259
- }) })), o = ((p = this.hostTimezone.split("/").pop()) == null ? void 0 : p.replace("_", " ")) || "Anfitrión";
1260
- return d`
1571
+ var u;
1572
+ const e = this.activeDate.getFullYear(), t = this.activeDate.getMonth(), a = _(this.activeDate, void 0, this.localRules), r = this.activeTimezone === "local" ? B(this.activeDate, this.hostTimezone, "local") : 0, i = this.getDisplaySlots(r), s = (n) => n.map((d) => ({ ...d, slots: d.slots.map((h, y) => {
1573
+ var f, I;
1574
+ return { ...h, start: ((f = i[y]) == null ? void 0 : f.start) || h.start, end: ((I = i[y]) == null ? void 0 : I.end) || h.end };
1575
+ }) })), o = ((u = this.hostTimezone.split("/").pop()) == null ? void 0 : u.replace("_", " ")) || "Anfitrión";
1576
+ return c`
1261
1577
  <div class="calendar-header">
1262
1578
  <div class="nav-group">
1263
1579
  <button class="btn" @click=${() => this.activeDate = /* @__PURE__ */ new Date()}>Hoy</button>
@@ -1267,7 +1583,7 @@ let g = class extends O {
1267
1583
  </div>
1268
1584
 
1269
1585
  <div class="view-group">
1270
- ${this.role === "provider" ? d`
1586
+ ${this.role === "provider" ? c`
1271
1587
  <div class="timezone-badge">
1272
1588
  🌐 Zona:
1273
1589
  <select class="timezone-select" @change=${(n) => this.activeTimezone = n.target.value}>
@@ -1276,7 +1592,7 @@ let g = class extends O {
1276
1592
  </select>
1277
1593
  </div>
1278
1594
  ` : ""}
1279
- ${this.role === "provider" && this.view === "day" ? d`<button class="btn btn-primary" @click=${this.handleBlockDayAction} style="margin-right: 8px;">${a ? "Liberar Día" : "Bloquear Día"}</button>` : ""}
1595
+ ${this.role === "provider" && this.view === "day" ? c`<button class="btn btn-primary" @click=${this.handleBlockDayAction} style="margin-right: 8px;">${a ? "Liberar Día" : "Bloquear Día"}</button>` : ""}
1280
1596
  <button class="btn" @click=${() => this.darkMode = !this.darkMode} style="margin-right: 8px;">${this.darkMode ? "☀️" : "🌙"}</button>
1281
1597
  <div class="btn-group">
1282
1598
  <button class="btn ${this.view === "month" ? "active" : ""}" @click=${() => this.view = "month"}>Mes</button>
@@ -1287,7 +1603,7 @@ let g = class extends O {
1287
1603
  </div>
1288
1604
 
1289
1605
  <div class="calendar-body">
1290
- ${this.view === "month" ? d`<glatam-calendar-month-view .days=${A(e, t, this.localRules, this.slots, this.startOfWeekDay)} .locale=${this.locale} .startOfWeekDay=${this.startOfWeekDay} .role=${this.role} .size=${this.size} .minDate=${this.minDate || (this.role === "buyer" ? (/* @__PURE__ */ new Date()).toISOString().split("T")[0] : "")} .maxDate=${this.maxDate} .showNeighboringMonth=${this.showNeighboringMonth} .tileClassName=${this.tileClassName} @day-select=${this.handleDaySelect}></glatam-calendar-month-view>` : this.view === "week" ? d`<glatam-calendar-week-view .days=${l(j(this.activeDate, this.localRules, this.slots, this.startOfWeekDay))} .slots=${r} .locale=${this.locale} .selectedRange=${this.selectedRange} .role=${this.role} @range-select=${this.handleRangeSelect} @slot-click=${this.handleSlotClick}></glatam-calendar-week-view>` : d`<glatam-calendar-day-view .day=${l(j(this.activeDate, this.localRules, this.slots, this.startOfWeekDay)).find((n) => n.dateString === _(this.activeDate)) || null} .slots=${r} .locale=${this.locale} .selectedRange=${this.selectedRange} .role=${this.role} @range-select=${this.handleRangeSelect} @slot-click=${this.handleSlotClick}></glatam-calendar-day-view>`}
1606
+ ${this.view === "month" ? c`<glatam-calendar-month-view .days=${Y(e, t, this.localRules, this.slots, this.startOfWeekDay)} .locale=${this.locale} .startOfWeekDay=${this.startOfWeekDay} .role=${this.role} .size=${this.size} .minDate=${this.minDate || (this.role === "buyer" ? z(/* @__PURE__ */ new Date()) : "")} .maxDate=${this.maxDate} .showNeighboringMonth=${this.showNeighboringMonth} .tileClassName=${this.tileClassName} @day-select=${this.handleDaySelect}></glatam-calendar-month-view>` : this.view === "week" ? c`<glatam-calendar-week-view .days=${s(L(this.activeDate, this.localRules, this.slots, this.startOfWeekDay))} .slots=${i} .locale=${this.locale} .selectedRange=${this.selectedRange} .role=${this.role} .minDate=${this.minDate || (this.role === "buyer" ? z(/* @__PURE__ */ new Date()) : "")} .maxDate=${this.maxDate} @range-select=${this.handleRangeSelect} @slot-click=${this.handleSlotClick}></glatam-calendar-week-view>` : c`<glatam-calendar-day-view .day=${s(L(this.activeDate, this.localRules, this.slots, this.startOfWeekDay)).find((n) => n.dateString === z(this.activeDate)) || null} .slots=${i} .locale=${this.locale} .selectedRange=${this.selectedRange} .role=${this.role} .minDate=${this.minDate || (this.role === "buyer" ? z(/* @__PURE__ */ new Date()) : "")} .maxDate=${this.maxDate} @range-select=${this.handleRangeSelect} @slot-click=${this.handleSlotClick}></glatam-calendar-day-view>`}
1291
1607
  </div>
1292
1608
 
1293
1609
  <glatam-calendar-modal
@@ -1295,91 +1611,159 @@ let g = class extends O {
1295
1611
  .isRange=${this.modalIsRange} .existingRule=${this.modalExistingRule} @save-rule=${this.handleSaveRule}
1296
1612
  @delete-rule=${this.handleDeleteRule} @close=${() => this.modalOpen = !1}
1297
1613
  ></glatam-calendar-modal>
1614
+
1615
+ <glatam-series-confirmation-modal
1616
+ .open=${this.seriesModalOpen} .dateString=${this.seriesTargetDateString} .targetRule=${this.seriesTargetRule}
1617
+ @confirm-action=${this.handleConfirmSeriesAction} @close=${() => this.seriesModalOpen = !1}
1618
+ ></glatam-series-confirmation-modal>
1298
1619
  `;
1299
1620
  }
1300
1621
  };
1301
- g.styles = [P, W];
1302
- h([
1303
- s({ type: String })
1622
+ g.styles = [q, G];
1623
+ p([
1624
+ l({ type: String })
1304
1625
  ], g.prototype, "role", 2);
1305
- h([
1306
- s({ type: String, reflect: !0 })
1626
+ p([
1627
+ l({ type: String, reflect: !0 })
1307
1628
  ], g.prototype, "size", 2);
1308
- h([
1309
- s({ type: String })
1629
+ p([
1630
+ l({ type: String })
1310
1631
  ], g.prototype, "view", 2);
1311
- h([
1312
- s({ type: String })
1632
+ p([
1633
+ l({ type: String })
1313
1634
  ], g.prototype, "locale", 2);
1314
- h([
1315
- s({ type: Number })
1635
+ p([
1636
+ l({ type: Number })
1316
1637
  ], g.prototype, "startOfWeekDay", 2);
1317
- h([
1318
- s({ type: Array })
1638
+ p([
1639
+ l({ type: Array })
1319
1640
  ], g.prototype, "rules", 2);
1320
- h([
1321
- s({ type: Array })
1641
+ p([
1642
+ l({ type: Array })
1322
1643
  ], g.prototype, "selectedDates", 2);
1323
- h([
1324
- s({ type: Object })
1644
+ p([
1645
+ l({ type: Object })
1325
1646
  ], g.prototype, "selectedRange", 2);
1326
- h([
1327
- s({ type: String })
1647
+ p([
1648
+ l({ type: String })
1328
1649
  ], g.prototype, "hostTimezone", 2);
1329
- h([
1330
- s({ type: String })
1650
+ p([
1651
+ l({ type: String })
1331
1652
  ], g.prototype, "activeTimezone", 2);
1332
- h([
1333
- s({ type: Array })
1653
+ p([
1654
+ l({ type: Array })
1334
1655
  ], g.prototype, "slots", 2);
1335
- h([
1336
- s({ type: String })
1656
+ p([
1657
+ l({ type: String })
1337
1658
  ], g.prototype, "minDate", 2);
1338
- h([
1339
- s({ type: String })
1659
+ p([
1660
+ l({ type: String })
1340
1661
  ], g.prototype, "maxDate", 2);
1341
- h([
1342
- s({ type: Boolean })
1662
+ p([
1663
+ l({ type: Boolean })
1343
1664
  ], g.prototype, "showNeighboringMonth", 2);
1344
- h([
1345
- s({ attribute: !1 })
1665
+ p([
1666
+ l({ attribute: !1 })
1346
1667
  ], g.prototype, "tileClassName", 2);
1347
- h([
1348
- u()
1668
+ p([
1669
+ l({ type: Boolean, attribute: "enable-series-confirmation" })
1670
+ ], g.prototype, "enableSeriesConfirmation", 2);
1671
+ p([
1672
+ m()
1349
1673
  ], g.prototype, "activeDate", 2);
1350
- h([
1351
- u()
1674
+ p([
1675
+ m()
1352
1676
  ], g.prototype, "localRules", 2);
1353
- h([
1354
- u()
1677
+ p([
1678
+ m()
1355
1679
  ], g.prototype, "darkMode", 2);
1356
- h([
1357
- u()
1680
+ p([
1681
+ m()
1358
1682
  ], g.prototype, "modalOpen", 2);
1359
- h([
1360
- u()
1683
+ p([
1684
+ m()
1361
1685
  ], g.prototype, "modalDateString", 2);
1362
- h([
1363
- u()
1686
+ p([
1687
+ m()
1364
1688
  ], g.prototype, "modalStartTime", 2);
1365
- h([
1366
- u()
1689
+ p([
1690
+ m()
1367
1691
  ], g.prototype, "modalEndTime", 2);
1368
- h([
1369
- u()
1692
+ p([
1693
+ m()
1370
1694
  ], g.prototype, "modalIsRange", 2);
1371
- h([
1372
- u()
1695
+ p([
1696
+ m()
1373
1697
  ], g.prototype, "modalExistingRule", 2);
1374
- g = h([
1375
- T("glatam-calendar")
1698
+ p([
1699
+ m()
1700
+ ], g.prototype, "seriesModalOpen", 2);
1701
+ p([
1702
+ m()
1703
+ ], g.prototype, "seriesTargetRule", 2);
1704
+ p([
1705
+ m()
1706
+ ], g.prototype, "seriesTargetDateString", 2);
1707
+ g = p([
1708
+ O("glatam-calendar")
1376
1709
  ], g);
1377
- var tt = Object.defineProperty, et = Object.getOwnPropertyDescriptor, v = (e, t, a, i) => {
1378
- for (var r = i > 1 ? void 0 : i ? et(t, a) : t, l = e.length - 1, o; l >= 0; l--)
1379
- (o = e[l]) && (r = (i ? o(t, a, r) : o(r)) || r);
1380
- return i && r && tt(t, a, r), r;
1710
+ const ct = M`
1711
+ :host {
1712
+ display: inline-block;
1713
+ background: transparent;
1714
+ border: none;
1715
+ padding: 0;
1716
+ box-shadow: none;
1717
+ width: 100%;
1718
+ }
1719
+
1720
+ .mini-calendar-header {
1721
+ display: flex;
1722
+ justify-content: space-between;
1723
+ align-items: center;
1724
+ padding: 4px 8px;
1725
+ margin-bottom: 8px;
1726
+ user-select: none;
1727
+ }
1728
+
1729
+ .mini-month-title {
1730
+ font-size: 0.875rem;
1731
+ font-weight: 600;
1732
+ color: var(--glatam-text);
1733
+ text-transform: capitalize;
1734
+ letter-spacing: -0.01em;
1735
+ }
1736
+
1737
+ .mini-nav-btn {
1738
+ background: transparent;
1739
+ border: 1px solid var(--glatam-border);
1740
+ border-radius: 8px;
1741
+ color: var(--glatam-text);
1742
+ width: 28px;
1743
+ height: 28px;
1744
+ display: flex;
1745
+ align-items: center;
1746
+ justify-content: center;
1747
+ cursor: pointer;
1748
+ font-size: 0.75rem;
1749
+ transition: background-color var(--glatam-transition-fast), border-color var(--glatam-transition-fast), transform var(--glatam-transition-fast);
1750
+ }
1751
+
1752
+ .mini-nav-btn:hover:not(:disabled) {
1753
+ background-color: var(--glatam-surface);
1754
+ border-color: var(--glatam-text-secondary);
1755
+ }
1756
+
1757
+ .mini-nav-btn:active:not(:disabled) {
1758
+ transform: scale(0.95);
1759
+ }
1760
+ `;
1761
+ var gt = Object.defineProperty, pt = Object.getOwnPropertyDescriptor, v = (e, t, a, r) => {
1762
+ for (var i = r > 1 ? void 0 : r ? pt(t, a) : t, s = e.length - 1, o; s >= 0; s--)
1763
+ (o = e[s]) && (i = (r ? o(t, a, i) : o(i)) || i);
1764
+ return r && i && gt(t, a, i), i;
1381
1765
  };
1382
- let b = class extends O {
1766
+ let b = class extends T {
1383
1767
  constructor() {
1384
1768
  super(...arguments), this.role = "buyer", this.locale = "es", this.startOfWeekDay = 0, this.rules = [], this.selectedRange = null, this.size = "medium", this.hostTimezone = "America/Bogota", this.activeTimezone = "local", this.minDate = "", this.maxDate = "", this.showNeighboringMonth = !0, this.tileClassName = null, this.slots = [
1385
1769
  { start: "09:00", end: "10:00" },
@@ -1391,7 +1775,30 @@ let b = class extends O {
1391
1775
  { start: "15:00", end: "16:00" },
1392
1776
  { start: "16:00", end: "17:00" },
1393
1777
  { start: "17:00", end: "18:00" }
1394
- ], this.activeDate = /* @__PURE__ */ new Date(), this.dropdownOpen = !1, this.dropdownSelectedDateString = "";
1778
+ ], this.activeDate = /* @__PURE__ */ new Date(), this.dropdownOpen = !1, this.dropdownSelectedDateString = "", this.touchStartX = 0, this.touchStartY = 0;
1779
+ }
1780
+ handlePrevMonth(e) {
1781
+ e.stopPropagation();
1782
+ const t = new Date(this.activeDate);
1783
+ t.setMonth(t.getMonth() - 1), this.activeDate = t;
1784
+ }
1785
+ handleNextMonth(e) {
1786
+ e.stopPropagation();
1787
+ const t = new Date(this.activeDate);
1788
+ t.setMonth(t.getMonth() + 1), this.activeDate = t;
1789
+ }
1790
+ handleTouchStart(e) {
1791
+ e.touches && e.touches.length > 0 && (this.touchStartX = e.touches[0].clientX, this.touchStartY = e.touches[0].clientY);
1792
+ }
1793
+ handleTouchEnd(e) {
1794
+ if (e.changedTouches && e.changedTouches.length > 0) {
1795
+ const t = this.touchStartX - e.changedTouches[0].clientX, a = this.touchStartY - e.changedTouches[0].clientY;
1796
+ Math.abs(t) > 50 && Math.abs(t) > Math.abs(a) && (t > 0 ? this.handleNextMonth(e) : this.handlePrevMonth(e));
1797
+ }
1798
+ }
1799
+ getFormattedMonthTitle() {
1800
+ const e = this.activeDate.toLocaleDateString(this.locale || "es", { month: "long", year: "numeric" });
1801
+ return e.charAt(0).toUpperCase() + e.slice(1);
1395
1802
  }
1396
1803
  handleDropdownDaySelect(e) {
1397
1804
  this.dropdownSelectedDateString = e.detail.dateString;
@@ -1407,135 +1814,116 @@ let b = class extends O {
1407
1814
  this.selectedRange = { dateString: this.dropdownSelectedDateString, start: e.displayStart, end: e.displayEnd }, this.dispatchEvent(new CustomEvent("booking-selected", { detail: t, bubbles: !0, composed: !0 })), this.dropdownOpen = !1, this.dropdownSelectedDateString = "";
1408
1815
  }
1409
1816
  render() {
1410
- const e = this.selectedRange ? `Reserva: ${this.selectedRange.dateString} (${this.selectedRange.start} - ${this.selectedRange.end})` : "Seleccionar Fecha y Hora", t = this.activeDate.getFullYear(), a = this.activeDate.getMonth(), i = this.dropdownSelectedDateString ? /* @__PURE__ */ new Date(this.dropdownSelectedDateString + "T00:00:00") : null, r = i && this.activeTimezone === "local" ? C(i, this.hostTimezone, "local") : 0, l = i ? this.slots.map((o) => {
1411
- const p = I(i, o, this.rules), n = U(o, r), c = n.dayShift > 0 ? " (+1d)" : n.dayShift < 0 ? " (-1d)" : "";
1412
- return {
1413
- ...o,
1414
- displayStart: n.start + c,
1415
- displayEnd: n.end + c,
1416
- isBlocked: p
1417
- };
1817
+ const e = this.selectedRange ? `Reserva: ${this.selectedRange.dateString} (${this.selectedRange.start} - ${this.selectedRange.end})` : "Seleccionar Fecha y Hora", t = this.activeDate.getFullYear(), a = this.activeDate.getMonth(), r = this.dropdownSelectedDateString ? /* @__PURE__ */ new Date(this.dropdownSelectedDateString + "T00:00:00") : null, i = r && this.activeTimezone === "local" ? B(r, this.hostTimezone, "local") : 0, s = r ? this.slots.map((o) => {
1818
+ const u = _(r, o, this.rules), n = H(o, i), d = n.dayShift > 0 ? " (+1d)" : n.dayShift < 0 ? " (-1d)" : "";
1819
+ return { ...o, displayStart: n.start + d, displayEnd: n.end + d, isBlocked: u };
1418
1820
  }) : [];
1419
- return d`
1821
+ return c`
1420
1822
  <div class="dropdown-container">
1421
1823
  <button class="btn btn-primary dropdown-toggle" @click=${() => this.dropdownOpen = !this.dropdownOpen}>
1422
1824
  <span>${e}</span> <span>${this.dropdownOpen ? "▲" : "▼"}</span>
1423
1825
  </button>
1424
1826
 
1425
- ${this.dropdownOpen ? d`
1426
- <div class="dropdown-card" style="--glatam-day-min-height: 38px;">
1427
- ${this.dropdownSelectedDateString ? d`
1428
- <div style="display:flex; justify-content:space-between; align-items:center; border-bottom: 1px solid var(--glatam-border); padding-bottom:8px;">
1429
- <button class="btn" style="height:28px; padding:0 8px; font-size:0.75rem;" @click=${() => this.dropdownSelectedDateString = ""}>&lt; Volver</button>
1430
- <span style="font-size:0.8rem; font-weight:600; color: var(--glatam-text);">${this.dropdownSelectedDateString}</span>
1431
- </div>
1432
- <div class="slot-list">
1433
- ${l.map((o) => d`
1434
- <button
1435
- class="slot-btn ${o.isBlocked ? "blocked" : ""}"
1436
- ?disabled=${o.isBlocked}
1437
- @click=${() => this.selectDropdownSlot(o)}
1438
- >
1439
- ${o.displayStart} - ${o.displayEnd} ${o.isBlocked ? "(Ocupado)" : ""}
1440
- </button>
1441
- `)}
1442
- </div>
1443
- ` : d`
1444
- <div style="font-weight:600; font-size:0.9rem; text-align:center; color: var(--glatam-text);">Selecciona un Día</div>
1445
- <glatam-calendar-month-view
1446
- .days=${A(t, a, this.rules, this.slots, this.startOfWeekDay)}
1447
- .locale=${this.locale}
1448
- .startOfWeekDay=${this.startOfWeekDay}
1449
- .role=${this.role}
1450
- size="small"
1451
- .minDate=${this.minDate}
1452
- .maxDate=${this.maxDate}
1453
- .showNeighboringMonth=${this.showNeighboringMonth}
1454
- .tileClassName=${this.tileClassName}
1455
- @day-select=${this.handleDropdownDaySelect}
1456
- ></glatam-calendar-month-view>
1457
- `}
1827
+ ${this.dropdownOpen ? c`
1828
+ <div class="dropdown-card" style="--glatam-day-min-height: 38px;">
1829
+ ${this.dropdownSelectedDateString ? c`
1830
+ <div style="display:flex; justify-space-between; align-items:center; border-bottom: 1px solid var(--glatam-border); padding-bottom:8px;">
1831
+ <button class="btn" style="height:28px; padding:0 8px; font-size:0.75rem;" @click=${() => this.dropdownSelectedDateString = ""}>&lt; Volver</button>
1832
+ <span style="font-size:0.8rem; font-weight:600; color: var(--glatam-text);">${this.dropdownSelectedDateString}</span>
1833
+ </div>
1834
+ <div class="slot-list">
1835
+ ${s.map((o) => c`
1836
+ <button class="slot-btn ${o.isBlocked ? "blocked" : ""}" ?disabled=${o.isBlocked} @click=${() => this.selectDropdownSlot(o)}>
1837
+ ${o.displayStart} - ${o.displayEnd} ${o.isBlocked ? "(Ocupado)" : ""}
1838
+ </button>
1839
+ `)}
1458
1840
  </div>
1459
- ` : ""}
1841
+ ` : c`
1842
+ <div class="mini-calendar-header">
1843
+ <button type="button" class="mini-nav-btn" aria-label="Mes anterior" @click=${this.handlePrevMonth}>&lt;</button>
1844
+ <span class="mini-month-title">${this.getFormattedMonthTitle()}</span>
1845
+ <button type="button" class="mini-nav-btn" aria-label="Mes siguiente" @click=${this.handleNextMonth}>&gt;</button>
1846
+ </div>
1847
+ <div class="mini-calendar-touch-wrapper" @touchstart=${this.handleTouchStart} @touchend=${this.handleTouchEnd}>
1848
+ <glatam-calendar-month-view
1849
+ .days=${Y(t, a, this.rules, this.slots, this.startOfWeekDay)}
1850
+ .locale=${this.locale} .startOfWeekDay=${this.startOfWeekDay} .role=${this.role} size="small"
1851
+ .minDate=${this.minDate} .maxDate=${this.maxDate} .showNeighboringMonth=${this.showNeighboringMonth}
1852
+ .tileClassName=${this.tileClassName} @day-select=${this.handleDropdownDaySelect}
1853
+ ></glatam-calendar-month-view>
1854
+ </div>
1855
+ `}
1856
+ </div>
1857
+ ` : ""}
1460
1858
  </div>
1461
1859
  `;
1462
1860
  }
1463
1861
  };
1464
- b.styles = [
1465
- P,
1466
- W,
1467
- E`
1468
- :host {
1469
- display: inline-block;
1470
- background: transparent;
1471
- border: none;
1472
- padding: 0;
1473
- box-shadow: none;
1474
- width: 100%;
1475
- }
1476
- `
1477
- ];
1862
+ b.styles = [q, G, ct];
1478
1863
  v([
1479
- s({ type: String })
1864
+ l({ type: String })
1480
1865
  ], b.prototype, "role", 2);
1481
1866
  v([
1482
- s({ type: String })
1867
+ l({ type: String })
1483
1868
  ], b.prototype, "locale", 2);
1484
1869
  v([
1485
- s({ type: Number })
1870
+ l({ type: Number })
1486
1871
  ], b.prototype, "startOfWeekDay", 2);
1487
1872
  v([
1488
- s({ type: Array })
1873
+ l({ type: Array })
1489
1874
  ], b.prototype, "rules", 2);
1490
1875
  v([
1491
- s({ type: Object })
1876
+ l({ type: Object })
1492
1877
  ], b.prototype, "selectedRange", 2);
1493
1878
  v([
1494
- s({ type: String, reflect: !0 })
1879
+ l({ type: String, reflect: !0 })
1495
1880
  ], b.prototype, "size", 2);
1496
1881
  v([
1497
- s({ type: String })
1882
+ l({ type: String })
1498
1883
  ], b.prototype, "hostTimezone", 2);
1499
1884
  v([
1500
- s({ type: String })
1885
+ l({ type: String })
1501
1886
  ], b.prototype, "activeTimezone", 2);
1502
1887
  v([
1503
- s({ type: String })
1888
+ l({ type: String })
1504
1889
  ], b.prototype, "minDate", 2);
1505
1890
  v([
1506
- s({ type: String })
1891
+ l({ type: String })
1507
1892
  ], b.prototype, "maxDate", 2);
1508
1893
  v([
1509
- s({ type: Boolean })
1894
+ l({ type: Boolean })
1510
1895
  ], b.prototype, "showNeighboringMonth", 2);
1511
1896
  v([
1512
- s({ attribute: !1 })
1897
+ l({ attribute: !1 })
1513
1898
  ], b.prototype, "tileClassName", 2);
1514
1899
  v([
1515
- s({ type: Array })
1900
+ l({ type: Array })
1516
1901
  ], b.prototype, "slots", 2);
1517
1902
  v([
1518
- u()
1903
+ m()
1519
1904
  ], b.prototype, "activeDate", 2);
1520
1905
  v([
1521
- u()
1906
+ m()
1522
1907
  ], b.prototype, "dropdownOpen", 2);
1523
1908
  v([
1524
- u()
1909
+ m()
1525
1910
  ], b.prototype, "dropdownSelectedDateString", 2);
1526
1911
  b = v([
1527
- T("glatam-calendar-mini")
1912
+ O("glatam-calendar-mini")
1528
1913
  ], b);
1529
1914
  export {
1530
1915
  g as GlatamCalendar,
1531
1916
  S as GlatamCalendarDayView,
1532
1917
  b as GlatamCalendarMini,
1533
- x as GlatamCalendarModal,
1534
- f as GlatamCalendarMonthView,
1535
- w as GlatamCalendarWeekView,
1536
- W as calendarStyles,
1537
- nt as formatISODate,
1538
- dt as isTimeBlocked,
1539
- ct as parseISODate,
1540
- P as variablesStyles
1918
+ D as GlatamCalendarModal,
1919
+ w as GlatamCalendarMonthView,
1920
+ x as GlatamCalendarWeekView,
1921
+ C as GlatamSeriesConfirmationModal,
1922
+ G as calendarStyles,
1923
+ F as deleteSeries,
1924
+ V as deleteSingleInstance,
1925
+ yt as formatISODate,
1926
+ xt as isTimeBlocked,
1927
+ wt as parseISODate,
1928
+ q as variablesStyles
1541
1929
  };