kalendly 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -206,13 +206,13 @@ var Kalendly = (() => {
206
206
  function getCellClasses(calendarDate) {
207
207
  const classes = [];
208
208
  if (!calendarDate.isCurrentMonth) {
209
- classes.push("calendar-cell-other-month");
209
+ classes.push("kalendly-cell-other-month");
210
210
  }
211
211
  if (calendarDate.isToday) {
212
- classes.push("calendar-cell-today");
212
+ classes.push("kalendly-cell-today");
213
213
  }
214
214
  if (calendarDate.hasEvents) {
215
- classes.push("calendar-cell-has-event");
215
+ classes.push("kalendly-cell-has-event");
216
216
  }
217
217
  return classes;
218
218
  }
@@ -683,13 +683,25 @@ var Kalendly = (() => {
683
683
  reaction(run) {
684
684
  try {
685
685
  run();
686
+ this._initError = null;
686
687
  } catch (error) {
687
688
  this._initError = error;
689
+ this.renderError(error);
688
690
  throw error;
689
691
  }
690
692
  }
693
+ // A thrown configuration error otherwise leaves an empty element, and the
694
+ // reason only in a console nobody is watching. Say what is wrong where the
695
+ // calendar should be.
696
+ renderError(error) {
697
+ const message = error.message.replace(/^<kal-calendar>\s*/, "");
698
+ this.innerHTML = `
699
+ <div class="kalendly-error" role="alert">
700
+ <strong>kalendly</strong> ${escapeHtml(message)}
701
+ </div>`;
702
+ }
691
703
  connectedCallback() {
692
- this.classList.add("kalendly-calendar");
704
+ this.classList.add("kalendly");
693
705
  this.reaction(() => {
694
706
  this.initEngine();
695
707
  this.render();
@@ -697,7 +709,7 @@ var Kalendly = (() => {
697
709
  }
698
710
  disconnectedCallback() {
699
711
  this.cleanup();
700
- this.classList.remove("kalendly-calendar");
712
+ this.classList.remove("kalendly");
701
713
  this.innerHTML = "";
702
714
  }
703
715
  attributeChangedCallback(name, oldVal, newVal) {
@@ -714,19 +726,10 @@ var Kalendly = (() => {
714
726
  this._timeRangeEnd = null;
715
727
  this._timeRangeComplete = false;
716
728
  }
717
- this.reinit();
729
+ this.reaction(() => this.reinit());
718
730
  }
719
731
  get headingText() {
720
- const heading = this.getAttribute("heading");
721
- if (heading !== null) return heading;
722
- const title = this.getAttribute("title");
723
- if (title !== null && !_CalendarElement.titleDeprecationWarned) {
724
- _CalendarElement.titleDeprecationWarned = true;
725
- console.warn(
726
- `<kal-calendar> the title attribute is deprecated and will be removed in a future release \u2014 use heading instead. title is a global HTML attribute, so the browser also renders it as a tooltip over the whole calendar.`
727
- );
728
- }
729
- return title;
732
+ return this.getAttribute("heading");
730
733
  }
731
734
  get slotDuration() {
732
735
  const raw = this.getAttribute("slot-duration");
@@ -735,10 +738,9 @@ var Kalendly = (() => {
735
738
  if (Number.isInteger(minutes) && minutes > 0 && MINUTES_PER_DAY % minutes === 0) {
736
739
  return minutes;
737
740
  }
738
- console.warn(
739
- `<kal-calendar> slot-duration="${raw}" must be a positive whole number of minutes that divides ${MINUTES_PER_DAY} \u2014 falling back to ${DEFAULT_SLOT_DURATION}.`
741
+ throw new Error(
742
+ `<kal-calendar> slot-duration="${raw}" must be a positive whole number of minutes that divides ${MINUTES_PER_DAY}.`
740
743
  );
741
- return DEFAULT_SLOT_DURATION;
742
744
  }
743
745
  warnMissingEndTime(events) {
744
746
  for (const event of events) {
@@ -752,17 +754,37 @@ var Kalendly = (() => {
752
754
  }
753
755
  }
754
756
  get monthCount() {
755
- const requested = Number(this.getAttribute("months") ?? 1);
756
- if (!Number.isInteger(requested) || requested < 1) return 1;
757
- return Math.min(requested, 2);
757
+ const raw = this.getAttribute("months");
758
+ if (raw === null) return 1;
759
+ const requested = Number(raw);
760
+ if (!Number.isInteger(requested) || requested < 1) {
761
+ throw new Error(
762
+ `<kal-calendar> months="${raw}" must be a whole number of 1 or more.`
763
+ );
764
+ }
765
+ if (requested > _CalendarElement.MAX_MONTHS) {
766
+ throw new Error(
767
+ `<kal-calendar> months="${raw}" exceeds the maximum of ${_CalendarElement.MAX_MONTHS}.`
768
+ );
769
+ }
770
+ return requested;
771
+ }
772
+ boundaryYear(attr, fallback) {
773
+ const raw = this.getAttribute(attr);
774
+ if (raw === null || raw === "") return fallback;
775
+ const year = Number(raw);
776
+ if (!Number.isInteger(year)) {
777
+ throw new Error(
778
+ `<kal-calendar> ${attr}="${raw}" must be a whole number.`
779
+ );
780
+ }
781
+ return year;
758
782
  }
759
783
  get minYear() {
760
- const val = this.getAttribute("min-year");
761
- return val ? parseInt(val, 10) : (/* @__PURE__ */ new Date()).getFullYear() - 30;
784
+ return this.boundaryYear("min-year", (/* @__PURE__ */ new Date()).getFullYear() - 30);
762
785
  }
763
786
  get maxYear() {
764
- const val = this.getAttribute("max-year");
765
- return val ? parseInt(val, 10) : (/* @__PURE__ */ new Date()).getFullYear() + 10;
787
+ return this.boundaryYear("max-year", (/* @__PURE__ */ new Date()).getFullYear() + 10);
766
788
  }
767
789
  boundaryDate(attr) {
768
790
  const val = this.getAttribute(attr);
@@ -820,7 +842,7 @@ var Kalendly = (() => {
820
842
  });
821
843
  }
822
844
  reinit() {
823
- if (!this.engine) return;
845
+ if (!this.isConnected) return;
824
846
  this.cleanup();
825
847
  this.initEngine();
826
848
  this.scheduleRender();
@@ -872,7 +894,8 @@ var Kalendly = (() => {
872
894
  ];
873
895
  }
874
896
  get updateComplete() {
875
- return this.pendingUpdate ?? Promise.resolve();
897
+ if (this.pendingUpdate) return this.pendingUpdate;
898
+ return this._initError ? Promise.reject(this._initError) : Promise.resolve();
876
899
  }
877
900
  scheduleRender() {
878
901
  if (this.pendingUpdate) return;
@@ -880,8 +903,10 @@ var Kalendly = (() => {
880
903
  this.pendingUpdate = null;
881
904
  try {
882
905
  this.render();
906
+ this._initError = null;
883
907
  } catch (error) {
884
908
  this._initError = error;
909
+ this.renderError(error);
885
910
  throw error;
886
911
  }
887
912
  });
@@ -958,6 +983,7 @@ var Kalendly = (() => {
958
983
  }
959
984
  this.boundaryDate("min-date");
960
985
  this.boundaryDate("max-date");
986
+ void this.slotDuration;
961
987
  void this.availableDays;
962
988
  void this.availableHours;
963
989
  this.assertHorizonOrdered();
@@ -1002,72 +1028,72 @@ var Kalendly = (() => {
1002
1028
  return status ? labels[status] || status.toUpperCase() : "";
1003
1029
  };
1004
1030
  return `
1005
- <div class="event-card" style="border-left-color: ${borderColor}">
1006
- <div class="event-header">
1007
- ${event.name ? `<div class="event-title">${escapeHtml(event.name)}</div>` : ""}
1008
- <div class="event-badges">
1009
- ${event.category ? `<span class="badge category category-${slugifyToken(event.category)}">${escapeHtml(getCategoryLabel(event.category))}</span>` : ""}
1010
- ${event.priority ? `<span class="badge priority priority-${slugifyToken(event.priority)}">${escapeHtml(getPriorityLabel(event.priority))}</span>` : ""}
1011
- ${event.status && event.status !== "scheduled" ? `<span class="badge status status-${slugifyToken(event.status)}">${escapeHtml(getStatusLabel(event.status))}</span>` : ""}
1031
+ <div class="kalendly-event-card" style="border-left-color: ${borderColor}">
1032
+ <div class="kalendly-event-header">
1033
+ ${event.name ? `<div class="kalendly-event-title">${escapeHtml(event.name)}</div>` : ""}
1034
+ <div class="kalendly-event-badges">
1035
+ ${event.category ? `<span class="kalendly-badge kalendly-category-${slugifyToken(event.category)}">${escapeHtml(getCategoryLabel(event.category))}</span>` : ""}
1036
+ ${event.priority ? `<span class="kalendly-badge kalendly-priority-${slugifyToken(event.priority)}">${escapeHtml(getPriorityLabel(event.priority))}</span>` : ""}
1037
+ ${event.status && event.status !== "scheduled" ? `<span class="kalendly-badge kalendly-status-${slugifyToken(event.status)}">${escapeHtml(getStatusLabel(event.status))}</span>` : ""}
1012
1038
  </div>
1013
1039
  </div>
1014
1040
 
1015
1041
  ${timeRange ? `
1016
- <div class="event-time">
1017
- <span class="event-time-label">Time:</span>
1018
- <span class="event-time-value">${escapeHtml(timeRange)}</span>
1042
+ <div class="kalendly-event-time">
1043
+ <span class="kalendly-event-time-label">Time:</span>
1044
+ <span class="kalendly-event-time-value">${escapeHtml(timeRange)}</span>
1019
1045
  </div>
1020
1046
  ` : ""}
1021
1047
 
1022
1048
  ${event.description ? `
1023
- <div class="event-description">${escapeHtml(event.description)}</div>
1049
+ <div class="kalendly-event-description">${escapeHtml(event.description)}</div>
1024
1050
  ` : ""}
1025
1051
 
1026
1052
  ${event.location ? `
1027
- <div class="event-time">
1028
- <span class="event-time-label">Location:</span>
1029
- <span class="event-time-value">${escapeHtml(event.location)}</span>
1053
+ <div class="kalendly-event-time">
1054
+ <span class="kalendly-event-time-label">Location:</span>
1055
+ <span class="kalendly-event-time-value">${escapeHtml(event.location)}</span>
1030
1056
  </div>
1031
1057
  ` : ""}
1032
1058
 
1033
1059
  ${attendeesList ? `
1034
- <div class="event-time">
1035
- <span class="event-time-label">Attendees:</span>
1036
- <span class="event-time-value">${escapeHtml(attendeesList)}</span>
1060
+ <div class="kalendly-event-time">
1061
+ <span class="kalendly-event-time-label">Attendees:</span>
1062
+ <span class="kalendly-event-time-value">${escapeHtml(attendeesList)}</span>
1037
1063
  </div>
1038
1064
  ` : ""}
1039
1065
 
1040
1066
  ${event.organizer ? `
1041
- <div class="event-time">
1042
- <span class="event-time-label">Organizer:</span>
1043
- <span class="event-time-value">${escapeHtml(event.organizer)}</span>
1067
+ <div class="kalendly-event-time">
1068
+ <span class="kalendly-event-time-label">Organizer:</span>
1069
+ <span class="kalendly-event-time-value">${escapeHtml(event.organizer)}</span>
1044
1070
  </div>
1045
1071
  ` : ""}
1046
1072
 
1047
1073
  ${event.notes ? `
1048
- <div class="event-time">
1049
- <span class="event-time-label">Notes:</span>
1050
- <span class="event-time-value">${escapeHtml(event.notes)}</span>
1074
+ <div class="kalendly-event-time">
1075
+ <span class="kalendly-event-time-label">Notes:</span>
1076
+ <span class="kalendly-event-time-value">${escapeHtml(event.notes)}</span>
1051
1077
  </div>
1052
1078
  ` : ""}
1053
1079
 
1054
1080
  ${event.url ? `
1055
- <div class="event-time">
1056
- <a href="${escapeHtml(safeUrl(event.url))}" target="_blank" rel="noopener noreferrer" class="event-link">
1081
+ <div class="kalendly-event-time">
1082
+ <a href="${escapeHtml(safeUrl(event.url))}" target="_blank" rel="noopener noreferrer" class="kalendly-event-link">
1057
1083
  View Details \u2192
1058
1084
  </a>
1059
1085
  </div>
1060
1086
  ` : ""}
1061
1087
 
1062
1088
  ${event.tags && event.tags.length > 0 ? `
1063
- <div class="event-tags">
1064
- ${event.tags.map((tag) => `<span class="event-tag">${escapeHtml(tag)}</span>`).join("")}
1089
+ <div class="kalendly-event-tags">
1090
+ ${event.tags.map((tag) => `<span class="kalendly-event-tag">${escapeHtml(tag)}</span>`).join("")}
1065
1091
  </div>
1066
1092
  ` : ""}
1067
1093
  </div>
1068
1094
  `;
1069
1095
  };
1070
- const defaultRenderNoEvents = () => '<div class="no-events-message">No events scheduled for this day.</div>';
1096
+ const defaultRenderNoEvents = () => '<div class="kalendly-no-events-message">No events scheduled for this day.</div>';
1071
1097
  const renderEvent = this._renderEvent || defaultRenderEvent;
1072
1098
  const renderNoEvents = this._renderNoEvents || defaultRenderNoEvents;
1073
1099
  const renderTimeGrid = (date) => {
@@ -1092,29 +1118,29 @@ var Kalendly = (() => {
1092
1118
  const isRangeEnd = inTimeRange && endTime === this._timeRangeEnd;
1093
1119
  const isInRange = inTimeRange && !isRangeStart && !isRangeEnd;
1094
1120
  const slotClasses = [
1095
- "time-grid-slot",
1096
- offered ? "" : "time-grid-slot-out-of-range",
1097
- isBooked ? "time-grid-slot-blocked" : "time-grid-slot-open",
1098
- isRangeStart ? "time-grid-slot-range-start" : "",
1099
- isRangeEnd ? "time-grid-slot-range-end" : "",
1100
- isInRange ? "time-grid-slot-in-range" : ""
1121
+ "kalendly-time-grid-slot",
1122
+ offered ? "" : "kalendly-time-grid-slot-out-of-range",
1123
+ isBooked ? "kalendly-time-grid-slot-blocked" : "kalendly-time-grid-slot-open",
1124
+ isRangeStart ? "kalendly-time-grid-slot-range-start" : "",
1125
+ isRangeEnd ? "kalendly-time-grid-slot-range-end" : "",
1126
+ isInRange ? "kalendly-time-grid-slot-in-range" : ""
1101
1127
  ].filter(Boolean).join(" ");
1102
1128
  const slotAttrs = `${offered ? 'data-action="select-slot" ' : ""}data-start-time="${startTime}" data-end-time="${endTime}" data-date="${date.toISOString()}" data-booked="${isBooked}"`;
1103
1129
  const status = !offered ? "Closed" : isBooked ? "Booked" : "Available";
1104
1130
  return `
1105
1131
  <div class="${slotClasses}" ${slotAttrs}>
1106
- <span class="time-grid-label">${startTime}</span>
1107
- <span class="time-grid-status">${status}</span>
1132
+ <span class="kalendly-time-grid-label">${startTime}</span>
1133
+ <span class="kalendly-time-grid-status">${status}</span>
1108
1134
  </div>`;
1109
1135
  });
1110
- const gridClasses = selectable ? "time-grid time-grid-selectable" : "time-grid";
1136
+ const gridClasses = selectable ? "kalendly-time-grid kalendly-time-grid-selectable" : "kalendly-time-grid";
1111
1137
  return `<div class="${gridClasses}">${slots.join("")}</div>`;
1112
1138
  };
1113
1139
  const multiMonth = viewModel.panes.length > 1;
1114
1140
  const renderPane = (pane) => `
1115
- <div class="calendar-pane">
1116
- ${multiMonth ? `<div class="calendar-pane-caption">${escapeHtml(pane.monthAndYearText)}</div>` : ""}
1117
- <table class="calendar-table calendar-table-bordered">
1141
+ <div class="kalendly-pane">
1142
+ ${multiMonth ? `<div class="kalendly-pane-caption">${escapeHtml(pane.monthAndYearText)}</div>` : ""}
1143
+ <table class="kalendly-table kalendly-table-bordered">
1118
1144
  <thead>
1119
1145
  <tr>
1120
1146
  ${viewModel.days.map((day) => `<th>${day.slice(0, 3)}</th>`).join("")}
@@ -1125,7 +1151,7 @@ var Kalendly = (() => {
1125
1151
  { length: 6 },
1126
1152
  () => `<tr>${Array.from(
1127
1153
  { length: 7 },
1128
- () => `<td class="calendar-skeleton" aria-hidden="true"></td>`
1154
+ () => `<td class="kalendly-skeleton" aria-hidden="true"></td>`
1129
1155
  ).join("")}</tr>`
1130
1156
  ).join("") : pane.calendarDates.map(
1131
1157
  (week) => `
@@ -1137,7 +1163,7 @@ var Kalendly = (() => {
1137
1163
  calendarDate.date,
1138
1164
  viewModel.selectedDate
1139
1165
  )) {
1140
- classes.push("calendar-cell-selected");
1166
+ classes.push("kalendly-cell-selected");
1141
1167
  }
1142
1168
  if (availabilityMode) {
1143
1169
  const bucket = this.resolveBucket(
@@ -1145,16 +1171,16 @@ var Kalendly = (() => {
1145
1171
  );
1146
1172
  const custom = (this._availabilityColors ?? {})[bucket];
1147
1173
  classes.push(
1148
- `availability-${slugifyToken(bucket)}`
1174
+ `kalendly-availability-${slugifyToken(bucket)}`
1149
1175
  );
1150
1176
  if (custom) {
1151
- classes.push("availability-status");
1177
+ classes.push("kalendly-availability-status");
1152
1178
  cellAttrs.push(
1153
- `style="--availability-color: ${escapeHtml(safeColor(custom))}"`
1179
+ `style="--kalendly-availability-color: ${escapeHtml(safeColor(custom))}"`
1154
1180
  );
1155
1181
  }
1156
1182
  if (!this.isDateSelectable(calendarDate.date)) {
1157
- classes.push("availability-unselectable");
1183
+ classes.push("kalendly-availability-unselectable");
1158
1184
  }
1159
1185
  cellAttrs.push(
1160
1186
  `aria-label="${escapeHtml(bucket)}"`
@@ -1163,12 +1189,12 @@ var Kalendly = (() => {
1163
1189
  if (availabilityMode === "day" && selectable) {
1164
1190
  const d = calendarDate.date;
1165
1191
  if (this._rangeStart && isSameDay2(d, this._rangeStart))
1166
- classes.push("availability-range-start");
1192
+ classes.push("kalendly-availability-range-start");
1167
1193
  if (this._rangeEnd && isSameDay2(d, this._rangeEnd))
1168
- classes.push("availability-range-end");
1194
+ classes.push("kalendly-availability-range-end");
1169
1195
  if (this._rangeStart && this._rangeEnd) {
1170
1196
  if (d > this._rangeStart && d < this._rangeEnd)
1171
- classes.push("availability-in-range");
1197
+ classes.push("kalendly-availability-in-range");
1172
1198
  }
1173
1199
  }
1174
1200
  const dateString = calendarDate.date.toISOString();
@@ -1176,7 +1202,7 @@ var Kalendly = (() => {
1176
1202
  calendarDate.date
1177
1203
  );
1178
1204
  if (!offered) {
1179
- classes.push("calendar-cell-out-of-range");
1205
+ classes.push("kalendly-cell-out-of-range");
1180
1206
  }
1181
1207
  return `
1182
1208
  <td
@@ -1199,64 +1225,64 @@ var Kalendly = (() => {
1199
1225
  `;
1200
1226
  const html = `
1201
1227
  ${title ? `
1202
- <div class="calendar-title">
1228
+ <div class="kalendly-title">
1203
1229
  <h1>${escapeHtml(title)}</h1>
1204
1230
  </div>
1205
1231
  ` : ""}
1206
1232
 
1207
- <div class="calendar-content">
1208
- <div class="calendar-card">
1209
- <div class="calendar-nav-header">
1210
- <button type="button" class="calendar-nav-arrow" data-action="previous" aria-label="Previous month">
1233
+ <div class="kalendly-content">
1234
+ <div class="kalendly-card">
1235
+ <div class="kalendly-nav-header">
1236
+ <button type="button" class="kalendly-nav-arrow" data-action="previous" aria-label="Previous month">
1211
1237
  &#8249;
1212
1238
  </button>
1213
1239
 
1214
- <div class="calendar-picker-container" data-picker-container>
1240
+ <div class="kalendly-picker-container" data-picker-container>
1215
1241
  <button
1216
1242
  type="button"
1217
- class="calendar-picker-btn"
1243
+ class="kalendly-picker-btn"
1218
1244
  data-action="toggle-picker"
1219
1245
  aria-expanded="${this.pickerOpen ? "true" : "false"}"
1220
1246
  aria-haspopup="true"
1221
1247
  >
1222
1248
  ${useShortMonths ? `${MONTHS[viewModel.currentMonth]} ${viewModel.currentYear}` : viewModel.monthAndYearText}
1223
- <span class="calendar-picker-chevron">&#9662;</span>
1249
+ <span class="kalendly-picker-chevron">&#9662;</span>
1224
1250
  </button>
1225
1251
 
1226
1252
  ${this.pickerOpen ? `
1227
- <div class="calendar-picker-dropdown">
1228
- <div class="calendar-picker-year-row">
1253
+ <div class="kalendly-picker-dropdown">
1254
+ <div class="kalendly-picker-year-row">
1229
1255
  <button
1230
1256
  type="button"
1231
- class="calendar-picker-year-arrow"
1257
+ class="kalendly-picker-year-arrow"
1232
1258
  data-action="year-prev"
1233
1259
  ${viewModel.currentYear <= minYear ? "disabled" : ""}
1234
1260
  aria-label="Previous year"
1235
1261
  >&#8249;</button>
1236
1262
  <input
1237
1263
  type="text"
1238
- class="calendar-picker-year-input${!this.yearInputValid ? " invalid" : ""}"
1264
+ class="kalendly-picker-year-input${!this.yearInputValid ? " kalendly-invalid" : ""}"
1239
1265
  value="${escapeHtml(this.yearInput || viewModel.currentYear)}"
1240
1266
  data-year-input
1241
1267
  aria-label="Year"
1242
1268
  />
1243
1269
  <button
1244
1270
  type="button"
1245
- class="calendar-picker-year-arrow"
1271
+ class="kalendly-picker-year-arrow"
1246
1272
  data-action="year-next"
1247
1273
  ${viewModel.currentYear >= maxYear ? "disabled" : ""}
1248
1274
  aria-label="Next year"
1249
1275
  >&#8250;</button>
1250
1276
  </div>
1251
1277
 
1252
- <div class="calendar-picker-months">
1278
+ <div class="kalendly-picker-months">
1253
1279
  ${(useShortMonths ? MONTHS : MONTHS_FULL).map((month, index) => {
1254
1280
  const isSelected = index === viewModel.currentMonth;
1255
1281
  const isCurrent = index === todayMonth && viewModel.currentYear === todayYear;
1256
1282
  return `
1257
1283
  <button
1258
1284
  type="button"
1259
- class="calendar-picker-month${isSelected ? " selected" : ""}${isCurrent ? " current-month" : ""}"
1285
+ class="kalendly-picker-month${isSelected ? " kalendly-selected" : ""}${isCurrent ? " kalendly-current-month" : ""}"
1260
1286
  data-action="select-month"
1261
1287
  data-month="${index}"
1262
1288
  >${month}</button>
@@ -1269,34 +1295,34 @@ var Kalendly = (() => {
1269
1295
 
1270
1296
  <button
1271
1297
  type="button"
1272
- class="calendar-today-btn"
1298
+ class="kalendly-today-btn"
1273
1299
  data-action="today"
1274
1300
  ${isCurrentMonth ? "disabled" : ""}
1275
1301
  >Today</button>
1276
1302
 
1277
- <button type="button" class="calendar-nav-arrow" data-action="next" aria-label="Next month">
1303
+ <button type="button" class="kalendly-nav-arrow" data-action="next" aria-label="Next month">
1278
1304
  &#8250;
1279
1305
  </button>
1280
1306
  </div>
1281
1307
 
1282
- <div class="calendar-panes">
1308
+ <div class="kalendly-panes">
1283
1309
  ${viewModel.panes.map(renderPane).join("")}
1284
1310
  </div>
1285
1311
 
1286
1312
  ${!isLoading && availabilityMode !== "day" && viewModel.selectedDate ? `
1287
- <div class="date-popup">
1288
- <div class="popup-header">
1313
+ <div class="kalendly-popup">
1314
+ <div class="kalendly-popup-header">
1289
1315
  <h2>${viewModel.scheduleDay}</h2>
1290
- <button type="button" class="popup-close" data-action="close-popup" aria-label="Close">\u2715</button>
1316
+ <button type="button" class="kalendly-popup-close" data-action="close-popup" aria-label="Close">\u2715</button>
1291
1317
  </div>
1292
1318
 
1293
1319
  ${showScrollHint ? `
1294
- <div class="scroll-hint">
1320
+ <div class="kalendly-scroll-hint">
1295
1321
  \u2193 Scroll to see more events \u2193
1296
1322
  </div>
1297
1323
  ` : ""}
1298
1324
 
1299
- <div class="events-container">
1325
+ <div class="kalendly-events-container">
1300
1326
  ${availabilityMode === "time" ? renderTimeGrid(viewModel.selectedDate) : viewModel.tasks.length > 0 ? viewModel.tasks.map((event) => renderEvent(event)).join("") : renderNoEvents()}
1301
1327
  </div>
1302
1328
  </div>
@@ -1512,7 +1538,7 @@ var Kalendly = (() => {
1512
1538
  this.yearInput = value;
1513
1539
  const year = parseInt(value, 10);
1514
1540
  this.yearInputValid = value === "" || year >= minYear && year <= maxYear;
1515
- target.classList.toggle("invalid", !this.yearInputValid);
1541
+ target.classList.toggle("kalendly-invalid", !this.yearInputValid);
1516
1542
  }
1517
1543
  };
1518
1544
  this.delegatedBlurHandler = (e) => {
@@ -1524,7 +1550,7 @@ var Kalendly = (() => {
1524
1550
  this.yearInput = String(vm.currentYear);
1525
1551
  this.yearInputValid = true;
1526
1552
  target.value = this.yearInput;
1527
- target.classList.remove("invalid");
1553
+ target.classList.remove("kalendly-invalid");
1528
1554
  } else if (year !== vm.currentYear) {
1529
1555
  this.dispatchMonthChange(year, vm.currentMonth);
1530
1556
  this.actions.jump(year, vm.currentMonth);
@@ -1547,7 +1573,7 @@ var Kalendly = (() => {
1547
1573
  this.render();
1548
1574
  return;
1549
1575
  }
1550
- const popup = this.querySelector(".date-popup");
1576
+ const popup = this.querySelector(".kalendly-popup");
1551
1577
  if (popup) {
1552
1578
  this.engine.clearSelection();
1553
1579
  }
@@ -1617,72 +1643,71 @@ var Kalendly = (() => {
1617
1643
  "heading",
1618
1644
  "months",
1619
1645
  "slot-duration",
1620
- "title",
1621
1646
  "use-short-month-names",
1622
1647
  "availability-mode",
1623
1648
  "selectable",
1624
1649
  "loading"
1625
1650
  ];
1626
1651
  _CalendarElement.themeMap = {
1627
- primary: "--calendar-primary-color",
1628
- secondary: "--calendar-secondary-color",
1629
- tertiary: "--calendar-tertiary-color",
1630
- textColor: "--calendar-text-color",
1631
- textLight: "--calendar-text-light",
1632
- background: "--calendar-background",
1633
- cellHover: "--calendar-cell-hover",
1634
- borderColor: "--calendar-border-color",
1635
- todayOutline: "--calendar-today-outline",
1636
- selectedBg: "--calendar-selected-bg",
1637
- outOfRangeBg: "--calendar-out-of-range-bg",
1638
- outOfRangeFg: "--calendar-out-of-range-fg",
1639
- navArrowFg: "--calendar-nav-arrow-fg",
1640
- navArrowBg: "--calendar-nav-arrow-bg",
1641
- navArrowBorder: "--calendar-nav-arrow-border",
1642
- navArrowHoverFg: "--calendar-nav-arrow-hover-fg",
1643
- navArrowHoverBg: "--calendar-nav-arrow-hover-bg",
1644
- inputInvalidBg: "--calendar-input-invalid-bg",
1645
- popupHeaderFg: "--calendar-popup-header-fg",
1646
- popupCloseFg: "--calendar-popup-close-fg",
1647
- popupCloseBg: "--calendar-popup-close-bg",
1648
- popupCloseHoverBg: "--calendar-popup-close-hover-bg",
1649
- headerBg: "--calendar-header-bg",
1650
- popupBg: "--calendar-popup-bg",
1651
- pickerBg: "--calendar-picker-bg",
1652
- pickerShadow: "--calendar-picker-shadow",
1653
- eventIndicator: "--calendar-event-indicator",
1654
- onAccent: "--calendar-on-accent",
1655
- link: "--calendar-link",
1656
- openBg: "--calendar-open-bg",
1657
- openFg: "--calendar-open-fg",
1658
- conditionalBg: "--calendar-conditional-bg",
1659
- conditionalFg: "--calendar-conditional-fg",
1660
- blockedBg: "--calendar-blocked-bg",
1661
- blockedFg: "--calendar-blocked-fg",
1662
- rangeBg: "--calendar-range-bg",
1663
- rangeOutline: "--calendar-range-outline",
1664
- inRangeBg: "--calendar-in-range-bg",
1665
- inRangeOutline: "--calendar-in-range-outline",
1666
- badgeBg: "--calendar-badge-bg",
1667
- badgeText: "--calendar-badge-text",
1668
- badgeSuccessBg: "--calendar-badge-success-bg",
1669
- badgeSuccessText: "--calendar-badge-success-text",
1670
- badgeInfoBg: "--calendar-badge-info-bg",
1671
- badgeInfoText: "--calendar-badge-info-text",
1672
- badgeWarningBg: "--calendar-badge-warning-bg",
1673
- badgeWarningText: "--calendar-badge-warning-text",
1674
- badgeDangerBg: "--calendar-badge-danger-bg",
1675
- badgeDangerText: "--calendar-badge-danger-text",
1676
- badgeNeutralBg: "--calendar-badge-neutral-bg",
1677
- badgeNeutralText: "--calendar-badge-neutral-text",
1678
- badgePositiveBg: "--calendar-badge-positive-bg",
1679
- badgePositiveText: "--calendar-badge-positive-text",
1680
- badgeTentativeBg: "--calendar-badge-tentative-bg",
1681
- badgeTentativeText: "--calendar-badge-tentative-text"
1652
+ primary: "--kalendly-primary-color",
1653
+ secondary: "--kalendly-secondary-color",
1654
+ tertiary: "--kalendly-tertiary-color",
1655
+ textColor: "--kalendly-text-color",
1656
+ textLight: "--kalendly-text-light",
1657
+ background: "--kalendly-background",
1658
+ cellHover: "--kalendly-cell-hover",
1659
+ borderColor: "--kalendly-border-color",
1660
+ todayOutline: "--kalendly-today-outline",
1661
+ selectedBg: "--kalendly-selected-bg",
1662
+ outOfRangeBg: "--kalendly-out-of-range-bg",
1663
+ outOfRangeFg: "--kalendly-out-of-range-fg",
1664
+ navArrowFg: "--kalendly-nav-arrow-fg",
1665
+ navArrowBg: "--kalendly-nav-arrow-bg",
1666
+ navArrowBorder: "--kalendly-nav-arrow-border",
1667
+ navArrowHoverFg: "--kalendly-nav-arrow-hover-fg",
1668
+ navArrowHoverBg: "--kalendly-nav-arrow-hover-bg",
1669
+ inputInvalidBg: "--kalendly-input-invalid-bg",
1670
+ popupHeaderFg: "--kalendly-popup-header-fg",
1671
+ popupCloseFg: "--kalendly-popup-close-fg",
1672
+ popupCloseBg: "--kalendly-popup-close-bg",
1673
+ popupCloseHoverBg: "--kalendly-popup-close-hover-bg",
1674
+ headerBg: "--kalendly-header-bg",
1675
+ popupBg: "--kalendly-popup-bg",
1676
+ pickerBg: "--kalendly-picker-bg",
1677
+ pickerShadow: "--kalendly-picker-shadow",
1678
+ eventIndicator: "--kalendly-event-indicator",
1679
+ onAccent: "--kalendly-on-accent",
1680
+ link: "--kalendly-link",
1681
+ openBg: "--kalendly-open-bg",
1682
+ openFg: "--kalendly-open-fg",
1683
+ conditionalBg: "--kalendly-conditional-bg",
1684
+ conditionalFg: "--kalendly-conditional-fg",
1685
+ blockedBg: "--kalendly-blocked-bg",
1686
+ blockedFg: "--kalendly-blocked-fg",
1687
+ rangeBg: "--kalendly-range-bg",
1688
+ rangeOutline: "--kalendly-range-outline",
1689
+ inRangeBg: "--kalendly-in-range-bg",
1690
+ inRangeOutline: "--kalendly-in-range-outline",
1691
+ badgeBg: "--kalendly-badge-bg",
1692
+ badgeText: "--kalendly-badge-text",
1693
+ badgeSuccessBg: "--kalendly-badge-success-bg",
1694
+ badgeSuccessText: "--kalendly-badge-success-text",
1695
+ badgeInfoBg: "--kalendly-badge-info-bg",
1696
+ badgeInfoText: "--kalendly-badge-info-text",
1697
+ badgeWarningBg: "--kalendly-badge-warning-bg",
1698
+ badgeWarningText: "--kalendly-badge-warning-text",
1699
+ badgeDangerBg: "--kalendly-badge-danger-bg",
1700
+ badgeDangerText: "--kalendly-badge-danger-text",
1701
+ badgeNeutralBg: "--kalendly-badge-neutral-bg",
1702
+ badgeNeutralText: "--kalendly-badge-neutral-text",
1703
+ badgePositiveBg: "--kalendly-badge-positive-bg",
1704
+ badgePositiveText: "--kalendly-badge-positive-text",
1705
+ badgeTentativeBg: "--kalendly-badge-tentative-bg",
1706
+ badgeTentativeText: "--kalendly-badge-tentative-text"
1682
1707
  };
1683
1708
  _CalendarElement.warnedMissingEnd = /* @__PURE__ */ new Set();
1709
+ _CalendarElement.MAX_MONTHS = 2;
1684
1710
  _CalendarElement.BUILT_IN_BUCKETS = ["blocked", "conditional", "open"];
1685
- _CalendarElement.titleDeprecationWarned = false;
1686
1711
  var CalendarElement = _CalendarElement;
1687
1712
  function defineCalendarElement(tagName = "kal-calendar") {
1688
1713
  if (typeof customElements !== "undefined" && !customElements.get(tagName)) {