kalendly 0.1.7 → 0.2.0

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.
Files changed (38) hide show
  1. package/README.md +317 -681
  2. package/dist/core/index.js +3 -3
  3. package/dist/index.d.mts +48 -602
  4. package/dist/index.d.ts +48 -602
  5. package/dist/index.js +753 -2359
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +727 -2348
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/{vanilla/index.umd.js → index.umd.js} +218 -218
  10. package/dist/index.umd.js.map +1 -0
  11. package/package.json +41 -91
  12. package/dist/react/index.d.mts +0 -251
  13. package/dist/react/index.d.ts +0 -251
  14. package/dist/react/index.js +0 -969
  15. package/dist/react/index.js.map +0 -1
  16. package/dist/react/index.mjs +0 -924
  17. package/dist/react/index.mjs.map +0 -1
  18. package/dist/react-native/index.d.mts +0 -642
  19. package/dist/react-native/index.d.ts +0 -642
  20. package/dist/react-native/index.js +0 -1649
  21. package/dist/react-native/index.js.map +0 -1
  22. package/dist/react-native/index.mjs +0 -1615
  23. package/dist/react-native/index.mjs.map +0 -1
  24. package/dist/vanilla/index.d.mts +0 -271
  25. package/dist/vanilla/index.d.ts +0 -271
  26. package/dist/vanilla/index.js +0 -1064
  27. package/dist/vanilla/index.js.map +0 -1
  28. package/dist/vanilla/index.mjs +0 -1013
  29. package/dist/vanilla/index.mjs.map +0 -1
  30. package/dist/vanilla/index.umd.js.map +0 -1
  31. package/dist/vue/components/Calendar.vue.d.ts +0 -43
  32. package/dist/vue/components/Calendar.vue.d.ts.map +0 -1
  33. package/dist/vue/index.d.ts +0 -134
  34. package/dist/vue/index.d.ts.map +0 -1
  35. package/dist/vue/index.js +0 -1
  36. package/dist/vue/index.mjs +0 -717
  37. package/dist/vue/types.d.ts +0 -21
  38. package/dist/vue/types.d.ts.map +0 -1
@@ -18,34 +18,11 @@ var Kalendly = (() => {
18
18
  };
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
 
21
- // src/vanilla/index.ts
22
- var index_exports = {};
23
- __export(index_exports, {
24
- CalendarEngine: () => CalendarEngine,
25
- DAYS: () => DAYS,
26
- DEFAULT_CATEGORY_COLORS: () => DEFAULT_CATEGORY_COLORS,
27
- MONTHS: () => MONTHS,
28
- MONTHS_FULL: () => MONTHS_FULL,
29
- VanillaCalendar: () => VanillaCalendar,
30
- createCalendar: () => createCalendar,
31
- formatAttendees: () => formatAttendees,
32
- formatDateForDisplay: () => formatDateForDisplay,
33
- formatTimeRange: () => formatTimeRange,
34
- generateCalendarDates: () => generateCalendarDates,
35
- generateYears: () => generateYears,
36
- getCategoryColor: () => getCategoryColor,
37
- getCellClasses: () => getCellClasses,
38
- getDefaultEventColor: () => getDefaultEventColor,
39
- getEventsForDate: () => getEventsForDate,
40
- getMonthYearText: () => getMonthYearText,
41
- getPopupPositionClass: () => getPopupPositionClass,
42
- hasEvents: () => hasEvents,
43
- isSameDay: () => isSameDay,
44
- isToday: () => isToday,
45
- isValidHexColor: () => isValidHexColor,
46
- mergeCategoryColors: () => mergeCategoryColors,
47
- normalizeDate: () => normalizeDate,
48
- sortEventsByTime: () => sortEventsByTime
21
+ // src/web-components/CalendarElement.ts
22
+ var CalendarElement_exports = {};
23
+ __export(CalendarElement_exports, {
24
+ CalendarElement: () => CalendarElement,
25
+ defineCalendarElement: () => defineCalendarElement
49
26
  });
50
27
 
51
28
  // src/core/utils.ts
@@ -108,9 +85,6 @@ var Kalendly = (() => {
108
85
  return eventDate.getTime() === normalizedTargetDate.getTime();
109
86
  });
110
87
  }
111
- function hasEvents(events, date) {
112
- return getEventsForDate(events, date).length > 0;
113
- }
114
88
  function generateCalendarDates(year, month, events = [], weekStartsOn = 0) {
115
89
  const firstDay = new Date(year, month, 1);
116
90
  const lastDay = new Date(year, month + 1, 0);
@@ -212,16 +186,6 @@ var Kalendly = (() => {
212
186
  if (attendees.length === 2) return attendees.join(" and ");
213
187
  return `${attendees.slice(0, -1).join(", ")}, and ${attendees[attendees.length - 1]}`;
214
188
  }
215
- function sortEventsByTime(events) {
216
- return [...events].sort((a, b) => {
217
- const aAllDay = a.allDay || !a.startTime && !a.endTime;
218
- const bAllDay = b.allDay || !b.startTime && !b.endTime;
219
- if (aAllDay && !bAllDay) return -1;
220
- if (!aAllDay && bAllDay) return 1;
221
- if (!a.startTime || !b.startTime) return 0;
222
- return a.startTime.localeCompare(b.startTime);
223
- });
224
- }
225
189
  var DEFAULT_CATEGORY_COLORS = {
226
190
  work: "#3b82f6",
227
191
  personal: "#8b5cf6",
@@ -230,13 +194,6 @@ var Kalendly = (() => {
230
194
  appointment: "#f59e0b",
231
195
  other: "#6b7280"
232
196
  };
233
- function getDefaultEventColor(category, customColors) {
234
- const colorMap = customColors || DEFAULT_CATEGORY_COLORS;
235
- if (category && colorMap[category]) {
236
- return colorMap[category];
237
- }
238
- return "#fc8917";
239
- }
240
197
  function mergeCategoryColors(customColors) {
241
198
  return {
242
199
  ...DEFAULT_CATEGORY_COLORS,
@@ -480,83 +437,174 @@ var Kalendly = (() => {
480
437
  }
481
438
  };
482
439
 
483
- // src/vanilla/Calendar.ts
484
- var VanillaCalendar = class {
485
- constructor(props) {
440
+ // src/web-components/CalendarElement.ts
441
+ var CalendarElement = class extends HTMLElement {
442
+ constructor() {
443
+ super(...arguments);
444
+ this.engine = null;
486
445
  this.unsubscribe = null;
446
+ this.actions = null;
487
447
  this.pickerOpen = false;
488
448
  this.yearInput = "";
489
449
  this.yearInputValid = true;
450
+ this.listenersAttached = false;
490
451
  this.clickOutsideHandler = null;
491
452
  this.delegatedClickHandler = null;
492
453
  this.delegatedInputHandler = null;
493
454
  this.delegatedBlurHandler = null;
494
455
  this.delegatedKeydownHandler = null;
495
- this.listenersAttached = false;
496
- this.props = props;
497
- if (typeof props.container === "string") {
498
- const element = document.querySelector(props.container);
499
- if (!element) {
500
- throw new Error(`Container element "${props.container}" not found`);
501
- }
502
- this.container = element;
503
- } else {
504
- this.container = props.container;
456
+ // Rich property backing fields
457
+ this._events = [];
458
+ this._theme = null;
459
+ this._categoryColors = null;
460
+ this._renderEvent = null;
461
+ this._renderNoEvents = null;
462
+ }
463
+ get events() {
464
+ return this._events;
465
+ }
466
+ set events(val) {
467
+ this._events = val;
468
+ if (this.engine) {
469
+ this.engine.updateEvents(val);
505
470
  }
506
- this.engine = new CalendarEngine({
507
- events: props.events,
508
- initialDate: props.initialDate,
509
- minYear: props.minYear,
510
- maxYear: props.maxYear,
511
- weekStartsOn: props.weekStartsOn
512
- });
513
- this.actions = this.engine.getActions();
471
+ }
472
+ set theme(val) {
473
+ this._theme = val;
514
474
  this.applyTheme();
515
- this.init();
516
475
  }
517
- applyTheme() {
518
- if (this.props.theme) {
519
- const root = document.documentElement;
520
- const theme = this.props.theme;
521
- if (theme.primary)
522
- root.style.setProperty("--calendar-primary-color", theme.primary);
523
- if (theme.secondary)
524
- root.style.setProperty("--calendar-secondary-color", theme.secondary);
525
- if (theme.tertiary)
526
- root.style.setProperty("--calendar-tertiary-color", theme.tertiary);
527
- if (theme.textColor)
528
- root.style.setProperty("--calendar-text-color", theme.textColor);
529
- if (theme.textLight)
530
- root.style.setProperty("--calendar-text-light", theme.textLight);
531
- if (theme.background)
532
- root.style.setProperty("--calendar-background", theme.background);
533
- if (theme.cellHover)
534
- root.style.setProperty("--calendar-cell-hover", theme.cellHover);
535
- if (theme.borderColor)
536
- root.style.setProperty("--calendar-border-color", theme.borderColor);
537
- if (theme.todayOutline)
538
- root.style.setProperty("--calendar-today-outline", theme.todayOutline);
539
- if (theme.selectedBg)
540
- root.style.setProperty("--calendar-selected-bg", theme.selectedBg);
541
- if (theme.eventIndicator)
542
- root.style.setProperty(
543
- "--calendar-event-indicator",
544
- theme.eventIndicator
545
- );
476
+ set categoryColors(val) {
477
+ this._categoryColors = val;
478
+ if (this.engine) {
479
+ this.engine.updateCategoryColors(val);
546
480
  }
547
481
  }
548
- init() {
549
- this.container.classList.add("kalendly-calendar");
550
- if (this.props.className) {
551
- this.container.classList.add(this.props.className);
552
- }
482
+ set renderEvent(val) {
483
+ this._renderEvent = val;
484
+ if (this.engine) this.render();
485
+ }
486
+ set renderNoEvents(val) {
487
+ this._renderNoEvents = val;
488
+ if (this.engine) this.render();
489
+ }
490
+ connectedCallback() {
491
+ this.classList.add("kalendly-calendar");
492
+ this.initEngine();
493
+ this.render();
494
+ }
495
+ disconnectedCallback() {
496
+ this.cleanup();
497
+ this.classList.remove("kalendly-calendar");
498
+ this.innerHTML = "";
499
+ }
500
+ attributeChangedCallback(_name, oldVal, newVal) {
501
+ if (oldVal === newVal) return;
502
+ this.reinit();
503
+ }
504
+ get minYear() {
505
+ const val = this.getAttribute("min-year");
506
+ return val ? parseInt(val, 10) : (/* @__PURE__ */ new Date()).getFullYear() - 30;
507
+ }
508
+ get maxYear() {
509
+ const val = this.getAttribute("max-year");
510
+ return val ? parseInt(val, 10) : (/* @__PURE__ */ new Date()).getFullYear() + 10;
511
+ }
512
+ initEngine() {
513
+ const initialDateAttr = this.getAttribute("initial-date");
514
+ const initialDate = initialDateAttr ? new Date(initialDateAttr) : void 0;
515
+ const weekStartsOnAttr = this.getAttribute("week-starts-on");
516
+ const weekStartsOn = weekStartsOnAttr === "1" ? 1 : 0;
517
+ this.engine = new CalendarEngine({
518
+ events: this._events,
519
+ initialDate,
520
+ minYear: this.minYear,
521
+ maxYear: this.maxYear,
522
+ weekStartsOn,
523
+ categoryColors: this._categoryColors ?? void 0
524
+ });
525
+ this.actions = this.engine.getActions();
526
+ this.applyTheme();
553
527
  this.unsubscribe = this.engine.subscribe(() => {
554
528
  this.render();
555
529
  });
530
+ }
531
+ reinit() {
532
+ if (!this.engine) return;
533
+ this.cleanup();
534
+ this.initEngine();
556
535
  this.render();
557
536
  }
537
+ cleanup() {
538
+ if (this.unsubscribe) {
539
+ this.unsubscribe();
540
+ this.unsubscribe = null;
541
+ }
542
+ if (this.delegatedClickHandler) {
543
+ this.removeEventListener("click", this.delegatedClickHandler);
544
+ this.delegatedClickHandler = null;
545
+ }
546
+ if (this.delegatedInputHandler) {
547
+ this.removeEventListener("input", this.delegatedInputHandler);
548
+ this.delegatedInputHandler = null;
549
+ }
550
+ if (this.delegatedBlurHandler) {
551
+ this.removeEventListener("blur", this.delegatedBlurHandler, true);
552
+ this.delegatedBlurHandler = null;
553
+ }
554
+ if (this.delegatedKeydownHandler) {
555
+ this.removeEventListener("keydown", this.delegatedKeydownHandler);
556
+ this.delegatedKeydownHandler = null;
557
+ }
558
+ if (this.clickOutsideHandler) {
559
+ document.removeEventListener("click", this.clickOutsideHandler);
560
+ this.clickOutsideHandler = null;
561
+ }
562
+ this.listenersAttached = false;
563
+ if (this.engine) {
564
+ this.engine.destroy();
565
+ this.engine = null;
566
+ }
567
+ this.actions = null;
568
+ }
569
+ applyTheme() {
570
+ if (!this._theme) return;
571
+ const root = document.documentElement;
572
+ const t = this._theme;
573
+ if (t.primary)
574
+ root.style.setProperty("--calendar-primary-color", t.primary);
575
+ if (t.secondary)
576
+ root.style.setProperty("--calendar-secondary-color", t.secondary);
577
+ if (t.tertiary)
578
+ root.style.setProperty("--calendar-tertiary-color", t.tertiary);
579
+ if (t.textColor)
580
+ root.style.setProperty("--calendar-text-color", t.textColor);
581
+ if (t.textLight)
582
+ root.style.setProperty("--calendar-text-light", t.textLight);
583
+ if (t.background)
584
+ root.style.setProperty("--calendar-background", t.background);
585
+ if (t.cellHover)
586
+ root.style.setProperty("--calendar-cell-hover", t.cellHover);
587
+ if (t.borderColor)
588
+ root.style.setProperty("--calendar-border-color", t.borderColor);
589
+ if (t.todayOutline)
590
+ root.style.setProperty("--calendar-today-outline", t.todayOutline);
591
+ if (t.selectedBg)
592
+ root.style.setProperty("--calendar-selected-bg", t.selectedBg);
593
+ if (t.eventIndicator)
594
+ root.style.setProperty("--calendar-event-indicator", t.eventIndicator);
595
+ }
558
596
  render() {
597
+ if (!this.engine) return;
559
598
  const viewModel = this.engine.getViewModel();
599
+ const useShortMonths = this.hasAttribute("use-short-month-names");
600
+ const title = this.getAttribute("title");
601
+ const minYear = this.minYear;
602
+ const maxYear = this.maxYear;
603
+ const today = /* @__PURE__ */ new Date();
604
+ const todayMonth = today.getMonth();
605
+ const todayYear = today.getFullYear();
606
+ const isCurrentMonth = viewModel.currentYear === todayYear && viewModel.currentMonth === todayMonth;
607
+ const showScrollHint = viewModel.tasks.length > 3;
560
608
  const defaultRenderEvent = (event) => {
561
609
  const timeRange = formatTimeRange(event);
562
610
  const attendeesList = formatAttendees(event.attendees);
@@ -602,46 +650,46 @@ var Kalendly = (() => {
602
650
  ${event.status && event.status !== "scheduled" ? `<span class="badge status-${event.status}">${getStatusLabel(event.status)}</span>` : ""}
603
651
  </div>
604
652
  </div>
605
-
653
+
606
654
  ${timeRange ? `
607
655
  <div class="event-time">
608
656
  <span class="event-time-label">Time:</span>
609
657
  <span class="event-time-value">${timeRange}</span>
610
658
  </div>
611
659
  ` : ""}
612
-
660
+
613
661
  ${event.description ? `
614
662
  <div class="event-description">${event.description}</div>
615
663
  ` : ""}
616
-
664
+
617
665
  ${event.location ? `
618
666
  <div class="event-time">
619
667
  <span class="event-time-label">Location:</span>
620
668
  <span class="event-time-value">${event.location}</span>
621
669
  </div>
622
670
  ` : ""}
623
-
671
+
624
672
  ${attendeesList ? `
625
673
  <div class="event-time">
626
674
  <span class="event-time-label">Attendees:</span>
627
675
  <span class="event-time-value">${attendeesList}</span>
628
676
  </div>
629
677
  ` : ""}
630
-
678
+
631
679
  ${event.organizer ? `
632
680
  <div class="event-time">
633
681
  <span class="event-time-label">Organizer:</span>
634
682
  <span class="event-time-value">${event.organizer}</span>
635
683
  </div>
636
684
  ` : ""}
637
-
685
+
638
686
  ${event.notes ? `
639
687
  <div class="event-time">
640
688
  <span class="event-time-label">Notes:</span>
641
689
  <span class="event-time-value">${event.notes}</span>
642
690
  </div>
643
691
  ` : ""}
644
-
692
+
645
693
  ${event.url ? `
646
694
  <div class="event-time">
647
695
  <a href="${event.url}" target="_blank" rel="noopener noreferrer" class="event-link">
@@ -649,7 +697,7 @@ var Kalendly = (() => {
649
697
  </a>
650
698
  </div>
651
699
  ` : ""}
652
-
700
+
653
701
  ${event.tags && event.tags.length > 0 ? `
654
702
  <div class="event-tags">
655
703
  ${event.tags.map((tag) => `<span class="event-tag">${tag}</span>`).join("")}
@@ -659,25 +707,17 @@ var Kalendly = (() => {
659
707
  `;
660
708
  };
661
709
  const defaultRenderNoEvents = () => '<div class="no-events-message">No events scheduled for this day.</div>';
662
- const renderEvent = this.props.renderEvent || defaultRenderEvent;
663
- const renderNoEvents = this.props.renderNoEvents || defaultRenderNoEvents;
664
- const showScrollHint = viewModel.tasks.length > 3;
665
- const today = /* @__PURE__ */ new Date();
666
- const todayMonth = today.getMonth();
667
- const todayYear = today.getFullYear();
668
- const minYear = this.props.minYear ?? todayYear - 30;
669
- const maxYear = this.props.maxYear ?? todayYear + 10;
670
- const isCurrentMonth = viewModel.currentYear === todayYear && viewModel.currentMonth === todayMonth;
710
+ const renderEvent = this._renderEvent || defaultRenderEvent;
711
+ const renderNoEvents = this._renderNoEvents || defaultRenderNoEvents;
671
712
  const html = `
672
- ${this.props.title ? `
673
- <div class="page--title">
674
- <h1>${this.props.title}</h1>
675
- </div>
713
+ ${title ? `
714
+ <div class="page--title">
715
+ <h1>${title}</h1>
716
+ </div>
676
717
  ` : ""}
677
718
 
678
719
  <div class="calendar--content">
679
720
  <div class="calendar--card">
680
- <!-- Navigation Header -->
681
721
  <div class="calendar--nav-header">
682
722
  <button type="button" class="calendar--nav-arrow" data-action="previous" aria-label="Previous month">
683
723
  &#8249;
@@ -691,7 +731,7 @@ var Kalendly = (() => {
691
731
  aria-expanded="${this.pickerOpen ? "true" : "false"}"
692
732
  aria-haspopup="true"
693
733
  >
694
- ${this.props.useShortMonthNames ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}` : viewModel.monthAndYearText}
734
+ ${useShortMonths ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}` : viewModel.monthAndYearText}
695
735
  <span class="calendar--picker-chevron">&#9662;</span>
696
736
  </button>
697
737
 
@@ -722,7 +762,7 @@ var Kalendly = (() => {
722
762
  </div>
723
763
 
724
764
  <div class="calendar--picker-months">
725
- ${(this.props.useShortMonthNames ? MONTHS : MONTHS_FULL).map((month, index) => {
765
+ ${(useShortMonths ? MONTHS : MONTHS_FULL).map((month, index) => {
726
766
  const isSelected = index === viewModel.currentMonth;
727
767
  const isCurrent = index === todayMonth && viewModel.currentYear === todayYear;
728
768
  return `
@@ -795,26 +835,21 @@ var Kalendly = (() => {
795
835
  ` : ""}
796
836
 
797
837
  <div class="events-container">
798
- ${viewModel.tasks.length > 0 ? `
799
- ${viewModel.tasks.map((event) => renderEvent(event)).join("")}
800
- ` : renderNoEvents()}
838
+ ${viewModel.tasks.length > 0 ? viewModel.tasks.map((event) => renderEvent(event)).join("") : renderNoEvents()}
801
839
  </div>
802
840
  </div>
803
841
  ` : ""}
804
842
  </div>
805
843
  </div>
806
844
  `;
807
- this.container.innerHTML = html;
845
+ this.innerHTML = html;
808
846
  this.attachEventListeners();
809
847
  }
810
848
  attachEventListeners() {
811
849
  if (this.listenersAttached) return;
812
850
  this.listenersAttached = true;
813
- const today = /* @__PURE__ */ new Date();
814
- const todayYear = today.getFullYear();
815
- const todayMonth = today.getMonth();
816
- const minYear = this.props.minYear ?? todayYear - 30;
817
- const maxYear = this.props.maxYear ?? todayYear + 10;
851
+ const minYear = this.minYear;
852
+ const maxYear = this.maxYear;
818
853
  this.delegatedClickHandler = (e) => {
819
854
  const target = e.target;
820
855
  const cell = target.closest('td[data-clickable="true"]');
@@ -823,8 +858,12 @@ var Kalendly = (() => {
823
858
  const date = new Date(cell.dataset.date);
824
859
  const dayIndex = parseInt(cell.dataset.dayIndex || "0");
825
860
  this.engine.handleDateClick(date, dayIndex);
826
- this.container.dispatchEvent(
827
- new CustomEvent("dateSelect", { detail: { date, dayIndex } })
861
+ this.dispatchEvent(
862
+ new CustomEvent("cal-date-select", {
863
+ bubbles: true,
864
+ composed: true,
865
+ detail: { date, events: this.engine.getEventsForDate(date) }
866
+ })
828
867
  );
829
868
  return;
830
869
  }
@@ -844,11 +883,7 @@ var Kalendly = (() => {
844
883
  case "today":
845
884
  this.actions.goToToday();
846
885
  this.pickerOpen = false;
847
- this.container.dispatchEvent(
848
- new CustomEvent("monthChange", {
849
- detail: { year: todayYear, month: todayMonth }
850
- })
851
- );
886
+ this.dispatchMonthChange();
852
887
  break;
853
888
  case "toggle-picker":
854
889
  this.pickerOpen = !this.pickerOpen;
@@ -921,118 +956,83 @@ var Kalendly = (() => {
921
956
  this.delegatedKeydownHandler = (e) => {
922
957
  const target = e.target;
923
958
  if (!target.matches("[data-year-input]")) return;
924
- if (e.key === "Enter") {
925
- target.blur();
926
- }
959
+ if (e.key === "Enter") target.blur();
927
960
  };
928
- this.container.addEventListener("click", this.delegatedClickHandler);
929
- this.container.addEventListener("input", this.delegatedInputHandler);
930
- this.container.addEventListener("blur", this.delegatedBlurHandler, true);
931
- this.container.addEventListener("keydown", this.delegatedKeydownHandler);
961
+ this.addEventListener("click", this.delegatedClickHandler);
962
+ this.addEventListener("input", this.delegatedInputHandler);
963
+ this.addEventListener("blur", this.delegatedBlurHandler, true);
964
+ this.addEventListener("keydown", this.delegatedKeydownHandler);
932
965
  this.clickOutsideHandler = (e) => {
933
966
  const target = e.target;
934
- if (this.container.contains(target)) return;
967
+ if (this.contains(target)) return;
935
968
  if (this.pickerOpen) {
936
969
  this.pickerOpen = false;
937
970
  this.render();
938
971
  return;
939
972
  }
940
- const popup = this.container.querySelector(".date-popup");
973
+ const popup = this.querySelector(".date-popup");
941
974
  if (popup) {
942
975
  this.engine.clearSelection();
943
976
  }
944
977
  };
945
978
  document.addEventListener("click", this.clickOutsideHandler);
946
979
  }
947
- // Targeted update for picker year - avoids full DOM rebuild
948
980
  updatePickerYear(year) {
949
- const input = this.container.querySelector(
950
- "[data-year-input]"
951
- );
952
- if (input) {
953
- input.value = String(year);
954
- }
955
- const today = /* @__PURE__ */ new Date();
956
- const todayYear = today.getFullYear();
957
- const minYear = this.props.minYear ?? todayYear - 30;
958
- const maxYear = this.props.maxYear ?? todayYear + 10;
959
- const prevBtn = this.container.querySelector(
981
+ const input = this.querySelector("[data-year-input]");
982
+ if (input) input.value = String(year);
983
+ const prevBtn = this.querySelector(
960
984
  '[data-action="year-prev"]'
961
985
  );
962
- const nextBtn = this.container.querySelector(
986
+ const nextBtn = this.querySelector(
963
987
  '[data-action="year-next"]'
964
988
  );
965
- if (prevBtn) prevBtn.disabled = year <= minYear;
966
- if (nextBtn) nextBtn.disabled = year >= maxYear;
989
+ if (prevBtn) prevBtn.disabled = year <= this.minYear;
990
+ if (nextBtn) nextBtn.disabled = year >= this.maxYear;
967
991
  }
968
992
  dispatchMonthChange() {
993
+ if (!this.engine) return;
969
994
  const vm = this.engine.getViewModel();
970
- this.container.dispatchEvent(
971
- new CustomEvent("monthChange", {
995
+ this.dispatchEvent(
996
+ new CustomEvent("cal-month-change", {
997
+ bubbles: true,
998
+ composed: true,
972
999
  detail: { year: vm.currentYear, month: vm.currentMonth }
973
1000
  })
974
1001
  );
975
1002
  }
1003
+ // Public API
976
1004
  updateEvents(events) {
977
- this.engine.updateEvents(events);
1005
+ this.events = events;
978
1006
  }
979
1007
  updateTheme(theme) {
980
- this.props.theme = theme;
981
- this.applyTheme();
1008
+ this.theme = theme;
982
1009
  }
983
1010
  getCurrentDate() {
984
- return this.engine.getViewModel().selectedDate;
1011
+ return this.engine?.getViewModel().selectedDate ?? null;
985
1012
  }
986
1013
  goToDate(date) {
987
- this.actions.jump(date.getFullYear(), date.getMonth());
1014
+ this.actions?.jump(date.getFullYear(), date.getMonth());
988
1015
  }
989
1016
  getEngine() {
1017
+ if (!this.engine)
1018
+ throw new Error("CalendarElement is not connected to the DOM");
990
1019
  return this.engine;
991
1020
  }
992
- destroy() {
993
- if (this.unsubscribe) {
994
- this.unsubscribe();
995
- this.unsubscribe = null;
996
- }
997
- if (this.delegatedClickHandler) {
998
- this.container.removeEventListener("click", this.delegatedClickHandler);
999
- this.delegatedClickHandler = null;
1000
- }
1001
- if (this.delegatedInputHandler) {
1002
- this.container.removeEventListener("input", this.delegatedInputHandler);
1003
- this.delegatedInputHandler = null;
1004
- }
1005
- if (this.delegatedBlurHandler) {
1006
- this.container.removeEventListener(
1007
- "blur",
1008
- this.delegatedBlurHandler,
1009
- true
1010
- );
1011
- this.delegatedBlurHandler = null;
1012
- }
1013
- if (this.delegatedKeydownHandler) {
1014
- this.container.removeEventListener(
1015
- "keydown",
1016
- this.delegatedKeydownHandler
1017
- );
1018
- this.delegatedKeydownHandler = null;
1019
- }
1020
- if (this.clickOutsideHandler) {
1021
- document.removeEventListener("click", this.clickOutsideHandler);
1022
- this.clickOutsideHandler = null;
1023
- }
1024
- this.listenersAttached = false;
1025
- this.engine.destroy();
1026
- this.container.innerHTML = "";
1027
- this.container.classList.remove("kalendly-calendar");
1028
- if (this.props.className) {
1029
- this.container.classList.remove(this.props.className);
1030
- }
1031
- }
1032
1021
  };
1033
- function createCalendar(props) {
1034
- return new VanillaCalendar(props);
1022
+ CalendarElement.observedAttributes = [
1023
+ "initial-date",
1024
+ "min-year",
1025
+ "max-year",
1026
+ "week-starts-on",
1027
+ "title",
1028
+ "use-short-month-names"
1029
+ ];
1030
+ function defineCalendarElement(tagName = "kal-calendar") {
1031
+ if (typeof customElements !== "undefined" && !customElements.get(tagName)) {
1032
+ customElements.define(tagName, CalendarElement);
1033
+ }
1035
1034
  }
1036
- return __toCommonJS(index_exports);
1035
+ return __toCommonJS(CalendarElement_exports);
1037
1036
  })();
1037
+ if (typeof customElements !== 'undefined' && !customElements.get('kal-calendar')) { customElements.define('kal-calendar', Kalendly.CalendarElement); }
1038
1038
  //# sourceMappingURL=index.umd.js.map