@forgeroute/ui 0.4.10 → 0.4.12

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.
@@ -2965,7 +2965,7 @@ var CheckboxComponent = class CheckboxComponent {
2965
2965
  }
2966
2966
  `,
2967
2967
  isInline: true,
2968
- styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-options.cb-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.cb-field.cb-has-trailing{display:flex}.cb-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.cb-trailing{display:inline-flex;align-items:center;flex-shrink:0}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"],
2968
+ styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px;vertical-align:top}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-options.cb-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.cb-field.cb-has-trailing{display:flex}.cb-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.cb-trailing{display:inline-flex;align-items:center;flex-shrink:0}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{position:relative;vertical-align:top;display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"],
2969
2969
  dependencies: [{
2970
2970
  kind: "directive",
2971
2971
  type: NgTemplateOutlet,
@@ -3104,7 +3104,7 @@ i0.ɵɵngDeclareClassMetadata({
3104
3104
  </div>
3105
3105
  }
3106
3106
  `,
3107
- styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-options.cb-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.cb-field.cb-has-trailing{display:flex}.cb-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.cb-trailing{display:inline-flex;align-items:center;flex-shrink:0}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"]
3107
+ styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px;vertical-align:top}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-options.cb-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.cb-field.cb-has-trailing{display:flex}.cb-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.cb-trailing{display:inline-flex;align-items:center;flex-shrink:0}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{position:relative;vertical-align:top;display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"]
3108
3108
  }]
3109
3109
  }],
3110
3110
  ctorParameters: () => [],
@@ -14670,7 +14670,7 @@ var RadioComponent = class RadioComponent {
14670
14670
  </label>
14671
14671
  `,
14672
14672
  isInline: true,
14673
- styles: [":host{display:block}.rd-wrap{display:inline-flex;align-items:flex-start;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #cbd5e1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"],
14673
+ styles: [":host{display:block}.rd-wrap{position:relative;display:inline-flex;align-items:flex-start;gap:9px;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #cbd5e1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"],
14674
14674
  changeDetection: i0.ChangeDetectionStrategy.OnPush
14675
14675
  });
14676
14676
  }
@@ -14713,7 +14713,7 @@ i0.ɵɵngDeclareClassMetadata({
14713
14713
  </span>
14714
14714
  </label>
14715
14715
  `,
14716
- styles: [":host{display:block}.rd-wrap{display:inline-flex;align-items:flex-start;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #cbd5e1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"]
14716
+ styles: [":host{display:block}.rd-wrap{position:relative;display:inline-flex;align-items:flex-start;gap:9px;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #cbd5e1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"]
14717
14717
  }]
14718
14718
  }],
14719
14719
  propDecorators: {
@@ -34273,6 +34273,11 @@ function toDateStr(d) {
34273
34273
  function fromDateStr(dateStr) {
34274
34274
  return /* @__PURE__ */ new Date(dateStr + "T00:00");
34275
34275
  }
34276
+ function isValidDateStr(dateStr) {
34277
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return false;
34278
+ const d = fromDateStr(dateStr);
34279
+ return !isNaN(d.getTime()) && toDateStr(d) === dateStr;
34280
+ }
34276
34281
  function buildMonthCells(anchor, todayStr) {
34277
34282
  const y = anchor.getFullYear();
34278
34283
  const m = anchor.getMonth();
@@ -34450,6 +34455,7 @@ var CalendarComponent = class CalendarComponent {
34450
34455
  this.showFilterCounts = input(false, ...ngDevMode ? [{ debugName: "showFilterCounts" }] : /* istanbul ignore next */ []);
34451
34456
  this.canCreate = input(false, ...ngDevMode ? [{ debugName: "canCreate" }] : /* istanbul ignore next */ []);
34452
34457
  this.disablePast = input(false, ...ngDevMode ? [{ debugName: "disablePast" }] : /* istanbul ignore next */ []);
34458
+ this.today = input(null, ...ngDevMode ? [{ debugName: "today" }] : /* istanbul ignore next */ []);
34453
34459
  this.maxVisible = input(3, ...ngDevMode ? [{ debugName: "maxVisible" }] : /* istanbul ignore next */ []);
34454
34460
  this.chipLayout = input("inline", ...ngDevMode ? [{ debugName: "chipLayout" }] : /* istanbul ignore next */ []);
34455
34461
  this.sortByTime = input(true, ...ngDevMode ? [{ debugName: "sortByTime" }] : /* istanbul ignore next */ []);
@@ -34475,9 +34481,14 @@ var CalendarComponent = class CalendarComponent {
34475
34481
  ];
34476
34482
  this.skeletonCells = Array.from({ length: 42 }, (_, i) => i);
34477
34483
  this.formatHour = formatHour;
34478
- this.todayStr = signal(toDateStr(/* @__PURE__ */ new Date()), ...ngDevMode ? [{ debugName: "todayStr" }] : /* istanbul ignore next */ []);
34484
+ this.clockToday = signal(toDateStr(/* @__PURE__ */ new Date()), ...ngDevMode ? [{ debugName: "clockToday" }] : /* istanbul ignore next */ []);
34485
+ this.todayStr = computed(() => {
34486
+ const t = this.today();
34487
+ return t && isValidDateStr(t) ? t : this.clockToday();
34488
+ }, ...ngDevMode ? [{ debugName: "todayStr" }] : /* istanbul ignore next */ []);
34479
34489
  this.focusedDate = signal(null, ...ngDevMode ? [{ debugName: "focusedDate" }] : /* istanbul ignore next */ []);
34480
34490
  this.lastRangeKey = "";
34491
+ this.injector = inject(Injector);
34481
34492
  this.hours = computed(() => Array.from({ length: Math.max(1, this.endHour() - this.startHour() + 1) }, (_, i) => i + this.startHour()), ...ngDevMode ? [{ debugName: "hours" }] : /* istanbul ignore next */ []);
34482
34493
  this.monthCells = computed(() => buildMonthCells(this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "monthCells" }] : /* istanbul ignore next */ []);
34483
34494
  this.weekDays = computed(() => buildWeekDays(this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "weekDays" }] : /* istanbul ignore next */ []);
@@ -34581,7 +34592,7 @@ var CalendarComponent = class CalendarComponent {
34581
34592
  const zone = inject(NgZone);
34582
34593
  const doc = inject(DOCUMENT);
34583
34594
  let timer;
34584
- const refreshToday = () => zone.run(() => this.todayStr.set(toDateStr(/* @__PURE__ */ new Date())));
34595
+ const refreshToday = () => zone.run(() => this.clockToday.set(toDateStr(/* @__PURE__ */ new Date())));
34585
34596
  const schedule = () => {
34586
34597
  const now = /* @__PURE__ */ new Date();
34587
34598
  const next = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 1);
@@ -34626,8 +34637,8 @@ var CalendarComponent = class CalendarComponent {
34626
34637
  }
34627
34638
  goToday() {
34628
34639
  this.focusedDate.set(null);
34629
- this.todayStr.set(toDateStr(/* @__PURE__ */ new Date()));
34630
- this.anchorDate.set(/* @__PURE__ */ new Date());
34640
+ this.clockToday.set(toDateStr(/* @__PURE__ */ new Date()));
34641
+ this.anchorDate.set(fromDateStr(this.todayStr()));
34631
34642
  }
34632
34643
  dowLabel(dateStr) {
34633
34644
  return WEEK_DAY_LABELS[fromDateStr(dateStr).getDay()];
@@ -34671,6 +34682,11 @@ var CalendarComponent = class CalendarComponent {
34671
34682
  return;
34672
34683
  }
34673
34684
  const d = fromDateStr(dateStr);
34685
+ if (event.key === "PageUp" || event.key === "PageDown") {
34686
+ event.preventDefault();
34687
+ this.jumpMonths(d, (event.key === "PageUp" ? -1 : 1) * (event.shiftKey ? 12 : 1));
34688
+ return;
34689
+ }
34674
34690
  const step = {
34675
34691
  ArrowLeft: -1,
34676
34692
  ArrowRight: 1,
@@ -34686,6 +34702,15 @@ var CalendarComponent = class CalendarComponent {
34686
34702
  this.focusedDate.set(target);
34687
34703
  this.host.nativeElement.querySelector(`.month-cell[data-date="${target}"]`)?.focus();
34688
34704
  }
34705
+ jumpMonths(from, months) {
34706
+ const y = from.getFullYear();
34707
+ const m = from.getMonth() + months;
34708
+ const target = new Date(y, m, Math.min(from.getDate(), new Date(y, m + 1, 0).getDate()));
34709
+ const targetStr = toDateStr(target);
34710
+ this.focusedDate.set(targetStr);
34711
+ this.anchorDate.set(target);
34712
+ afterNextRender(() => this.host.nativeElement.querySelector(`.month-cell[data-date="${targetStr}"]`)?.focus(), { injector: this.injector });
34713
+ }
34689
34714
  onAddAllDay(dateStr, event) {
34690
34715
  event.stopPropagation();
34691
34716
  this.onDateClick(dateStr);
@@ -34819,6 +34844,13 @@ var CalendarComponent = class CalendarComponent {
34819
34844
  isRequired: false,
34820
34845
  transformFunction: null
34821
34846
  },
34847
+ today: {
34848
+ classPropertyName: "today",
34849
+ publicName: "today",
34850
+ isSignal: true,
34851
+ isRequired: false,
34852
+ transformFunction: null
34853
+ },
34822
34854
  maxVisible: {
34823
34855
  classPropertyName: "maxVisible",
34824
34856
  publicName: "maxVisible",
@@ -34907,7 +34939,7 @@ var CalendarComponent = class CalendarComponent {
34907
34939
  <div class="mobile-summary"><ng-content select="[calendar-summary-mobile]" /></div>
34908
34940
  }
34909
34941
 
34910
- @if (filters().length && !loading()) {
34942
+ @if (filters().length) {
34911
34943
  <div class="filter-bar">
34912
34944
  @if (filterLabel()) { <div class="filter-bar-label">{{ filterLabel() }}</div> }
34913
34945
  <div class="filter-chips" role="group" [attr.aria-label]="filterLabel() || 'Filter'">
@@ -34975,7 +35007,7 @@ var CalendarComponent = class CalendarComponent {
34975
35007
  <div class="cell-events">
34976
35008
  @for (e of c.visible; track e.id) {
34977
35009
  <button type="button" class="event-chip" [class.stacked]="chipLayout() === 'stacked'" [class.has-head]="!!(e.iconPath || chipTime(e))" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
34978
- [attr.aria-label]="itemLabel(e)" [title]="e.title"
35010
+ [attr.aria-label]="itemLabel(e)" [title]="e.tooltip || e.title"
34979
35011
  (click)="onItemClick(e, $event)">
34980
35012
  <span class="chip-head">
34981
35013
  @if (e.iconPath) {
@@ -35018,7 +35050,7 @@ var CalendarComponent = class CalendarComponent {
35018
35050
  }
35019
35051
  @for (e of col.allDay; track e.id) {
35020
35052
  <button type="button" class="allday-chip" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
35021
- [attr.aria-label]="itemLabel(e)" (click)="onItemClick(e, $event)">{{ e.title }}</button>
35053
+ [attr.aria-label]="itemLabel(e)" [attr.title]="e.tooltip || null" (click)="onItemClick(e, $event)">{{ e.title }}</button>
35022
35054
  }
35023
35055
  </div>
35024
35056
  }
@@ -35039,7 +35071,7 @@ var CalendarComponent = class CalendarComponent {
35039
35071
  [style.left]="'calc(' + (t.lane.lane / t.lane.lanes * 100) + '% + 2px)'"
35040
35072
  [style.width]="'calc(' + (100 / t.lane.lanes) + '% - 4px)'"
35041
35073
  [style.background]="t.item.bgColor" [style.borderLeftColor]="t.item.color"
35042
- [attr.aria-label]="itemLabel(t.item)" (click)="onItemClick(t.item, $event)">
35074
+ [attr.aria-label]="itemLabel(t.item)" [attr.title]="t.item.tooltip || null" (click)="onItemClick(t.item, $event)">
35043
35075
  <span class="te-title" [class.strike]="t.item.strike">{{ t.item.title }}</span>
35044
35076
  @if (t.item.startTime) { <span class="te-time">{{ t.item.timeLabel || timeRange(t.item) }}</span> }
35045
35077
  </button>
@@ -35063,7 +35095,7 @@ var CalendarComponent = class CalendarComponent {
35063
35095
  </div>
35064
35096
  <div class="agenda-events">
35065
35097
  @for (e of group.items; track e.id) {
35066
- <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" (click)="onItemClick(e, $event)">
35098
+ <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" [attr.title]="e.tooltip || null" (click)="onItemClick(e, $event)">
35067
35099
  <span class="ae-color-bar" [style.background]="e.color"></span>
35068
35100
  <span class="ae-body">
35069
35101
  <span class="ae-top">
@@ -35186,7 +35218,7 @@ i0.ɵɵngDeclareClassMetadata({
35186
35218
  <div class="mobile-summary"><ng-content select="[calendar-summary-mobile]" /></div>
35187
35219
  }
35188
35220
 
35189
- @if (filters().length && !loading()) {
35221
+ @if (filters().length) {
35190
35222
  <div class="filter-bar">
35191
35223
  @if (filterLabel()) { <div class="filter-bar-label">{{ filterLabel() }}</div> }
35192
35224
  <div class="filter-chips" role="group" [attr.aria-label]="filterLabel() || 'Filter'">
@@ -35254,7 +35286,7 @@ i0.ɵɵngDeclareClassMetadata({
35254
35286
  <div class="cell-events">
35255
35287
  @for (e of c.visible; track e.id) {
35256
35288
  <button type="button" class="event-chip" [class.stacked]="chipLayout() === 'stacked'" [class.has-head]="!!(e.iconPath || chipTime(e))" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
35257
- [attr.aria-label]="itemLabel(e)" [title]="e.title"
35289
+ [attr.aria-label]="itemLabel(e)" [title]="e.tooltip || e.title"
35258
35290
  (click)="onItemClick(e, $event)">
35259
35291
  <span class="chip-head">
35260
35292
  @if (e.iconPath) {
@@ -35297,7 +35329,7 @@ i0.ɵɵngDeclareClassMetadata({
35297
35329
  }
35298
35330
  @for (e of col.allDay; track e.id) {
35299
35331
  <button type="button" class="allday-chip" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
35300
- [attr.aria-label]="itemLabel(e)" (click)="onItemClick(e, $event)">{{ e.title }}</button>
35332
+ [attr.aria-label]="itemLabel(e)" [attr.title]="e.tooltip || null" (click)="onItemClick(e, $event)">{{ e.title }}</button>
35301
35333
  }
35302
35334
  </div>
35303
35335
  }
@@ -35318,7 +35350,7 @@ i0.ɵɵngDeclareClassMetadata({
35318
35350
  [style.left]="'calc(' + (t.lane.lane / t.lane.lanes * 100) + '% + 2px)'"
35319
35351
  [style.width]="'calc(' + (100 / t.lane.lanes) + '% - 4px)'"
35320
35352
  [style.background]="t.item.bgColor" [style.borderLeftColor]="t.item.color"
35321
- [attr.aria-label]="itemLabel(t.item)" (click)="onItemClick(t.item, $event)">
35353
+ [attr.aria-label]="itemLabel(t.item)" [attr.title]="t.item.tooltip || null" (click)="onItemClick(t.item, $event)">
35322
35354
  <span class="te-title" [class.strike]="t.item.strike">{{ t.item.title }}</span>
35323
35355
  @if (t.item.startTime) { <span class="te-time">{{ t.item.timeLabel || timeRange(t.item) }}</span> }
35324
35356
  </button>
@@ -35342,7 +35374,7 @@ i0.ɵɵngDeclareClassMetadata({
35342
35374
  </div>
35343
35375
  <div class="agenda-events">
35344
35376
  @for (e of group.items; track e.id) {
35345
- <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" (click)="onItemClick(e, $event)">
35377
+ <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" [attr.title]="e.tooltip || null" (click)="onItemClick(e, $event)">
35346
35378
  <span class="ae-color-bar" [style.background]="e.color"></span>
35347
35379
  <span class="ae-body">
35348
35380
  <span class="ae-top">
@@ -35476,6 +35508,14 @@ i0.ɵɵngDeclareClassMetadata({
35476
35508
  required: false
35477
35509
  }]
35478
35510
  }],
35511
+ today: [{
35512
+ type: i0.Input,
35513
+ args: [{
35514
+ isSignal: true,
35515
+ alias: "today",
35516
+ required: false
35517
+ }]
35518
+ }],
35479
35519
  maxVisible: [{
35480
35520
  type: i0.Input,
35481
35521
  args: [{