calkit 0.1.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.
@@ -0,0 +1,888 @@
1
+ (function(Y,$){typeof exports=="object"&&typeof module<"u"?$(exports):typeof define=="function"&&define.amd?define(["exports"],$):(Y=typeof globalThis<"u"?globalThis:Y||self,$(Y.CalBooking={}))})(this,(function(Y){"use strict";class $ extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}),this._initialized=!1}static get styles(){return[]}connectedCallback(){this._initialized||(this._adoptStyles(),this._initialized=!0),this.render()}_adoptStyles(){const e=this.constructor.styles;if(e.length)if("adoptedStyleSheets"in this.shadowRoot)this.shadowRoot.adoptedStyleSheets=e.map(a=>{if(a instanceof CSSStyleSheet)return a;const t=new CSSStyleSheet;return t.replaceSync(a),t});else for(const a of e){const t=document.createElement("style");t.textContent=a instanceof CSSStyleSheet?"":a,this.shadowRoot.prepend(t)}}render(){}emit(e,a={}){this.dispatchEvent(new CustomEvent(e,{detail:a,bubbles:!0,composed:!0}))}showStatus(e,a,t={}){if(!this._store)return;const{autoDismiss:n,dismissible:i=!0}=t;clearTimeout(this._statusTimer),this._store.set({statusType:e,statusMessage:a,statusDismissible:i}),this.emit("cal:status",{type:e,message:a}),n&&n>0&&(this._statusTimer=setTimeout(()=>this.clearStatus(),n))}clearStatus(){this._store&&(clearTimeout(this._statusTimer),this._store.set({statusType:null,statusMessage:null,statusDismissible:!0}),this.emit("cal:status",{type:null,message:null}))}$(e){return this.shadowRoot.querySelector(e)}$$(e){return this.shadowRoot.querySelectorAll(e)}}function ce(s){let e={...s};const a=new Set;return{get(t){return e[t]},set(t){const n=e;e={...e,...t};let i=!1;for(const o of Object.keys(t))if(n[o]!==e[o]){i=!0;break}if(i)for(const o of a)o(e,n)},getState(){return e},subscribe(t){return a.add(t),()=>a.delete(t)}}}const K=["January","February","March","April","May","June","July","August","September","October","November","December"],de=["Su","Mo","Tu","We","Th","Fr","Sa"];function ue(s=0){const e=[];for(let a=0;a<7;a++)e.push(de[(s+a)%7]);return e}function W(s,e){return new Date(s,e+1,0).getDate()}function ge(s,e){return new Date(s,e,1).getDay()}function C(s){if(typeof s=="string")return s;const e=s instanceof Date?s:new Date(s.year,s.month,s.day),a=e.getFullYear(),t=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return`${a}-${t}-${n}`}function E(s){if(!s)return null;if(s instanceof Date)return s;if(typeof s=="string"){const[e,a,t]=s.split("-").map(Number);return!e||!a||!t?null:new Date(e,a-1,t)}return null}function z(s,e){if(!s||!e)return!1;const a=E(s),t=E(e);return!a||!t?!1:a.getFullYear()===t.getFullYear()&&a.getMonth()===t.getMonth()&&a.getDate()===t.getDate()}function he(s,e,a){if(!s||!e||!a)return!1;const t=E(s),n=E(e),i=E(a);if(!t||!n||!i)return!1;const o=t.getTime(),r=Math.min(n.getTime(),i.getTime()),l=Math.max(n.getTime(),i.getTime());return o>=r&&o<=l}function V(){return C(new Date)}function B(s,e,a){const t=new Date(s,e+a,1);return{year:t.getFullYear(),month:t.getMonth()}}function be(s,e,a=0){const t=W(s,e),i=(ge(s,e)-a+7)%7,o=[],r=V(),l=B(s,e,-1),u=W(l.year,l.month);for(let c=i-1;c>=0;c--){const d=u-c,b=C({year:l.year,month:l.month,day:d});o.push({year:l.year,month:l.month,day:d,dateString:b,isCurrentMonth:!1,isToday:b===r})}for(let c=1;c<=t;c++){const d=C({year:s,month:e,day:c});o.push({year:s,month:e,day:c,dateString:d,isCurrentMonth:!0,isToday:d===r})}const m=B(s,e,1);let g=1;for(;o.length<42;){const c=C({year:m.year,month:m.month,day:g});o.push({year:m.year,month:m.month,day:g,dateString:c,isCurrentMonth:!1,isToday:c===r}),g++}return o}function R(s){if(!s||typeof s!="string")return null;const e=s.trim().toUpperCase(),a=e.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/);if(a){let n=parseInt(a[1],10);const i=parseInt(a[2],10),o=a[3];return o==="AM"&&n===12&&(n=0),o==="PM"&&n!==12&&(n+=12),{hours:n,minutes:i}}const t=e.match(/^(\d{1,2}):(\d{2})$/);return t?{hours:parseInt(t[1],10),minutes:parseInt(t[2],10)}:null}function X(s,e,a="24h"){const t=String(e).padStart(2,"0");if(a==="12h"){const n=s>=12?"PM":"AM";return`${s%12||12}:${t} ${n}`}return`${String(s).padStart(2,"0")}:${t}`}function T(s){const e=R(s);return e?e.hours*60+e.minutes:0}function q(s){const e=Math.floor(s/60)%24,a=s%60;return`${String(e).padStart(2,"0")}:${String(a).padStart(2,"0")}`}function me(s,e,a){const t=[],n=T(s),i=T(e);for(let o=n;o<=i;o+=a)t.push(q(o));return t}function fe(s,e,a,t="24h"){const n=[],i=T(s),o=T(e);for(let r=i;r<=o;r+=a){const l=q(r),u=r+a,m=q(Math.min(u,o+a)),g=R(l),c=R(m),d=g?X(g.hours,g.minutes,t):l,b=c?X(c.hours,c.minutes,t):m;n.push({time:l,displayText:`${d}–${b}`})}return n}function Q(s,e,a){const t=T(s),n=T(e),i=T(a),o=Math.min(n,i),r=Math.max(n,i);return t>=o&&t<=r}const pe=`
2
+ :host {
3
+ /* Light theme (default) */
4
+ --cal-bg: 0 0% 100%;
5
+ --cal-bg-muted: 240 5% 96%;
6
+ --cal-fg: 240 6% 10%;
7
+ --cal-fg-muted: 240 4% 46%;
8
+ --cal-border: 240 6% 90%;
9
+ --cal-accent: 240 6% 10%;
10
+ --cal-accent-fg: 0 0% 100%;
11
+ --cal-accent-subtle: 240 5% 96%;
12
+ --cal-hover: 240 5% 93%;
13
+ --cal-ring: 240 6% 10%;
14
+ --cal-radius: 8px;
15
+ --cal-radius-sm: 6px;
16
+ --cal-cell-size: 36px;
17
+ --cal-transition: 150ms ease;
18
+
19
+ /* Booking color palette (softer / less saturated) */
20
+ --cal-booking-blue-bg: 217 55% 94%;
21
+ --cal-booking-blue-fg: 217 60% 35%;
22
+ --cal-booking-green-bg: 152 45% 93%;
23
+ --cal-booking-green-fg: 152 55% 28%;
24
+ --cal-booking-red-bg: 4 50% 94%;
25
+ --cal-booking-red-fg: 4 55% 40%;
26
+ --cal-booking-orange-bg: 30 55% 93%;
27
+ --cal-booking-orange-fg: 30 60% 35%;
28
+ --cal-booking-gray-bg: 240 8% 94%;
29
+ --cal-booking-gray-fg: 240 8% 38%;
30
+
31
+ /* Booking hover tokens */
32
+ --cal-booking-blue-hover: 217 55% 88%;
33
+ --cal-booking-green-hover: 152 45% 87%;
34
+ --cal-booking-red-hover: 4 50% 88%;
35
+ --cal-booking-orange-hover: 30 55% 87%;
36
+ --cal-booking-gray-hover: 240 8% 88%;
37
+
38
+ /* Scheduler tokens */
39
+ --cal-sched-grid-line: 240 6% 94%;
40
+ --cal-sched-now-line: 4 70% 55%;
41
+ --cal-sched-slot-hover: 240 5% 97%;
42
+ --cal-sched-header-bg: 240 5% 98%;
43
+
44
+ /* Status tokens */
45
+ --cal-status-error-bg: 4 50% 95%;
46
+ --cal-status-error-fg: 4 55% 40%;
47
+ --cal-status-error-border: 4 50% 85%;
48
+ --cal-status-warning-bg: 40 55% 95%;
49
+ --cal-status-warning-fg: 40 60% 35%;
50
+ --cal-status-warning-border: 40 50% 85%;
51
+ --cal-status-info-bg: 217 55% 95%;
52
+ --cal-status-info-fg: 217 60% 35%;
53
+ --cal-status-info-border: 217 50% 85%;
54
+ --cal-status-success-bg: 152 45% 95%;
55
+ --cal-status-success-fg: 152 55% 28%;
56
+ --cal-status-success-border: 152 45% 85%;
57
+ }
58
+
59
+ :host([theme="dark"]) {
60
+ --cal-bg: 240 6% 10%;
61
+ --cal-bg-muted: 240 4% 16%;
62
+ --cal-fg: 0 0% 98%;
63
+ --cal-fg-muted: 240 4% 54%;
64
+ --cal-border: 240 4% 20%;
65
+ --cal-accent: 0 0% 98%;
66
+ --cal-accent-fg: 240 6% 10%;
67
+ --cal-accent-subtle: 240 4% 16%;
68
+ --cal-hover: 240 4% 20%;
69
+ --cal-ring: 0 0% 98%;
70
+
71
+ --cal-booking-blue-bg: 217 50% 25%;
72
+ --cal-booking-blue-fg: 217 80% 75%;
73
+ --cal-booking-green-bg: 142 40% 22%;
74
+ --cal-booking-green-fg: 142 70% 70%;
75
+ --cal-booking-red-bg: 4 45% 25%;
76
+ --cal-booking-red-fg: 4 70% 75%;
77
+ --cal-booking-orange-bg: 30 45% 25%;
78
+ --cal-booking-orange-fg: 30 80% 75%;
79
+ --cal-booking-gray-bg: 240 5% 22%;
80
+ --cal-booking-gray-fg: 240 5% 65%;
81
+
82
+ --cal-booking-blue-hover: 217 50% 30%;
83
+ --cal-booking-green-hover: 142 40% 27%;
84
+ --cal-booking-red-hover: 4 45% 30%;
85
+ --cal-booking-orange-hover: 30 45% 30%;
86
+ --cal-booking-gray-hover: 240 5% 27%;
87
+
88
+ --cal-sched-grid-line: 240 4% 18%;
89
+ --cal-sched-now-line: 4 55% 55%;
90
+ --cal-sched-slot-hover: 240 4% 14%;
91
+ --cal-sched-header-bg: 240 5% 12%;
92
+
93
+ --cal-status-error-bg: 4 45% 20%;
94
+ --cal-status-error-fg: 4 70% 75%;
95
+ --cal-status-error-border: 4 45% 30%;
96
+ --cal-status-warning-bg: 40 45% 20%;
97
+ --cal-status-warning-fg: 40 80% 75%;
98
+ --cal-status-warning-border: 40 45% 30%;
99
+ --cal-status-info-bg: 217 50% 20%;
100
+ --cal-status-info-fg: 217 80% 75%;
101
+ --cal-status-info-border: 217 50% 30%;
102
+ --cal-status-success-bg: 152 40% 18%;
103
+ --cal-status-success-fg: 152 70% 70%;
104
+ --cal-status-success-border: 152 40% 28%;
105
+ }
106
+
107
+ :host([theme="auto"]) {
108
+ --cal-bg: 0 0% 100%;
109
+ --cal-bg-muted: 240 5% 96%;
110
+ --cal-fg: 240 6% 10%;
111
+ --cal-fg-muted: 240 4% 46%;
112
+ --cal-border: 240 6% 90%;
113
+ --cal-accent: 240 6% 10%;
114
+ --cal-accent-fg: 0 0% 100%;
115
+ --cal-accent-subtle: 240 5% 96%;
116
+ --cal-hover: 240 5% 93%;
117
+ --cal-ring: 240 6% 10%;
118
+ }
119
+
120
+ @media (prefers-color-scheme: dark) {
121
+ :host([theme="auto"]) {
122
+ --cal-bg: 240 6% 10%;
123
+ --cal-bg-muted: 240 4% 16%;
124
+ --cal-fg: 0 0% 98%;
125
+ --cal-fg-muted: 240 4% 54%;
126
+ --cal-border: 240 4% 20%;
127
+ --cal-accent: 0 0% 98%;
128
+ --cal-accent-fg: 240 6% 10%;
129
+ --cal-accent-subtle: 240 4% 16%;
130
+ --cal-hover: 240 4% 20%;
131
+ --cal-ring: 0 0% 98%;
132
+
133
+ --cal-booking-blue-bg: 217 50% 25%;
134
+ --cal-booking-blue-fg: 217 80% 75%;
135
+ --cal-booking-green-bg: 142 40% 22%;
136
+ --cal-booking-green-fg: 142 70% 70%;
137
+ --cal-booking-red-bg: 4 45% 25%;
138
+ --cal-booking-red-fg: 4 70% 75%;
139
+ --cal-booking-orange-bg: 30 45% 25%;
140
+ --cal-booking-orange-fg: 30 80% 75%;
141
+ --cal-booking-gray-bg: 240 5% 22%;
142
+ --cal-booking-gray-fg: 240 5% 65%;
143
+
144
+ --cal-booking-blue-hover: 217 50% 30%;
145
+ --cal-booking-green-hover: 142 40% 27%;
146
+ --cal-booking-red-hover: 4 45% 30%;
147
+ --cal-booking-orange-hover: 30 45% 30%;
148
+ --cal-booking-gray-hover: 240 5% 27%;
149
+
150
+ --cal-sched-grid-line: 240 4% 18%;
151
+ --cal-sched-now-line: 4 55% 55%;
152
+ --cal-sched-slot-hover: 240 4% 14%;
153
+ --cal-sched-header-bg: 240 5% 12%;
154
+
155
+ --cal-status-error-bg: 4 45% 20%;
156
+ --cal-status-error-fg: 4 70% 75%;
157
+ --cal-status-error-border: 4 45% 30%;
158
+ --cal-status-warning-bg: 40 45% 20%;
159
+ --cal-status-warning-fg: 40 80% 75%;
160
+ --cal-status-warning-border: 40 45% 30%;
161
+ --cal-status-info-bg: 217 50% 20%;
162
+ --cal-status-info-fg: 217 80% 75%;
163
+ --cal-status-info-border: 217 50% 30%;
164
+ --cal-status-success-bg: 152 40% 18%;
165
+ --cal-status-success-fg: 152 70% 70%;
166
+ --cal-status-success-border: 152 40% 28%;
167
+ }
168
+ }
169
+ `,ve=`
170
+ :host {
171
+ display: inline-block;
172
+ font-family: inherit;
173
+ font-size: 14px;
174
+ line-height: 1.5;
175
+ color: hsl(var(--cal-fg));
176
+ -webkit-font-smoothing: antialiased;
177
+ -moz-osx-font-smoothing: grayscale;
178
+ }
179
+
180
+ :host([display="inline"]) {
181
+ display: inline-block;
182
+ }
183
+
184
+ *,
185
+ *::before,
186
+ *::after {
187
+ box-sizing: border-box;
188
+ }
189
+
190
+ button {
191
+ font: inherit;
192
+ color: inherit;
193
+ background: none;
194
+ border: none;
195
+ padding: 0;
196
+ margin: 0;
197
+ cursor: pointer;
198
+ -webkit-tap-highlight-color: transparent;
199
+ }
200
+
201
+ button:focus-visible {
202
+ outline: 2px solid hsl(var(--cal-ring));
203
+ outline-offset: 2px;
204
+ border-radius: var(--cal-radius-sm);
205
+ }
206
+
207
+ [hidden] {
208
+ display: none !important;
209
+ }
210
+ `,ye=`
211
+ @keyframes cal-fade-in {
212
+ from { opacity: 0; }
213
+ to { opacity: 1; }
214
+ }
215
+
216
+ @keyframes cal-slide-up {
217
+ from {
218
+ opacity: 0;
219
+ transform: translateY(4px);
220
+ }
221
+ to {
222
+ opacity: 1;
223
+ transform: translateY(0);
224
+ }
225
+ }
226
+
227
+ @keyframes cal-slide-left {
228
+ from {
229
+ opacity: 0;
230
+ transform: translateX(16px);
231
+ }
232
+ to {
233
+ opacity: 1;
234
+ transform: translateX(0);
235
+ }
236
+ }
237
+
238
+ @keyframes cal-slide-right {
239
+ from {
240
+ opacity: 0;
241
+ transform: translateX(-16px);
242
+ }
243
+ to {
244
+ opacity: 1;
245
+ transform: translateX(0);
246
+ }
247
+ }
248
+
249
+ .cal-animate-fade { animation: cal-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1); }
250
+ .cal-animate-slide-up { animation: cal-slide-up 200ms cubic-bezier(0.16, 1, 0.3, 1); }
251
+ .cal-animate-slide-left { animation: cal-slide-left 200ms cubic-bezier(0.16, 1, 0.3, 1); }
252
+ .cal-animate-slide-right { animation: cal-slide-right 200ms cubic-bezier(0.16, 1, 0.3, 1); }
253
+
254
+ @keyframes cal-shimmer {
255
+ 0% { background-position: -200% 0; }
256
+ 100% { background-position: 200% 0; }
257
+ }
258
+
259
+ .cal-skeleton {
260
+ background: linear-gradient(
261
+ 90deg,
262
+ hsl(var(--cal-bg-muted)) 25%,
263
+ hsl(var(--cal-hover)) 50%,
264
+ hsl(var(--cal-bg-muted)) 75%
265
+ );
266
+ background-size: 200% 100%;
267
+ animation: cal-shimmer 1.5s infinite ease-in-out;
268
+ border-radius: 999px;
269
+ }
270
+
271
+ .cal-skeleton--rect {
272
+ border-radius: var(--cal-radius-sm);
273
+ }
274
+ `,Z='<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10 12L6 8l4-4"/></svg>',ee='<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4l4 4-4 4"/></svg>';function te({year:s,month:e,onPrev:a,onNext:t,onTitleClick:n}){const i=document.createElement("div");i.classList.add("cal-nav");const o=document.createElement("button");o.classList.add("cal-nav__btn","cal-nav__btn--prev"),o.innerHTML=Z,o.setAttribute("aria-label","Previous month"),o.addEventListener("click",a);const r=n?"button":"div",l=document.createElement(r);l.classList.add("cal-nav__title"),n&&(l.classList.add("cal-nav__title--interactive"),l.setAttribute("aria-label",`Select month and year, currently ${K[e]} ${s}`),l.addEventListener("click",n)),l.setAttribute("aria-live","polite"),l.textContent=`${K[e]} ${s}`;const u=document.createElement("button");return u.classList.add("cal-nav__btn","cal-nav__btn--next"),u.innerHTML=ee,u.setAttribute("aria-label","Next month"),u.addEventListener("click",t),i.appendChild(o),i.appendChild(l),i.appendChild(u),i}const ke=`
275
+ .cal-nav {
276
+ display: flex;
277
+ align-items: center;
278
+ justify-content: space-between;
279
+ padding: 0 4px;
280
+ margin-bottom: 8px;
281
+ }
282
+
283
+ .cal-nav__btn {
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: center;
287
+ width: 28px;
288
+ height: 28px;
289
+ border-radius: var(--cal-radius-sm);
290
+ color: hsl(var(--cal-fg));
291
+ transition: background var(--cal-transition);
292
+ }
293
+
294
+ .cal-nav__btn:hover {
295
+ background: hsl(var(--cal-hover));
296
+ }
297
+
298
+ .cal-nav__title {
299
+ font-size: 14px;
300
+ font-weight: 600;
301
+ color: hsl(var(--cal-fg));
302
+ user-select: none;
303
+ }
304
+
305
+ .cal-nav__title--interactive {
306
+ cursor: pointer;
307
+ padding: 2px 8px;
308
+ border-radius: var(--cal-radius-sm);
309
+ transition: background var(--cal-transition);
310
+ }
311
+
312
+ .cal-nav__title--interactive:hover {
313
+ background: hsl(var(--cal-hover));
314
+ }
315
+ `,_e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function xe({pickerYear:s,viewMonth:e,viewYear:a,onMonthSelect:t,onYearPrev:n,onYearNext:i,onClose:o}){const r=document.createElement("div");r.classList.add("cal-myp","cal-animate-fade");const l=document.createElement("div");l.classList.add("cal-myp__year-nav");const u=document.createElement("button");u.classList.add("cal-nav__btn"),u.innerHTML=Z,u.setAttribute("aria-label","Previous year"),u.addEventListener("click",n);const m=document.createElement("div");m.classList.add("cal-myp__year-label"),m.textContent=s;const g=document.createElement("button");g.classList.add("cal-nav__btn"),g.innerHTML=ee,g.setAttribute("aria-label","Next year"),g.addEventListener("click",i),l.appendChild(u),l.appendChild(m),l.appendChild(g),r.appendChild(l);const c=document.createElement("div");c.classList.add("cal-myp__grid");const d=new Date,b=d.getMonth(),D=d.getFullYear();for(let v=0;v<12;v++){const x=document.createElement("button");x.classList.add("cal-myp__cell"),x.textContent=_e[v],v===e&&s===a&&x.classList.add("cal-myp__cell--active"),v===b&&s===D&&x.classList.add("cal-myp__cell--today"),x.addEventListener("click",()=>t(v,s)),c.appendChild(x)}return r.appendChild(c),r.addEventListener("keydown",v=>{v.key==="Escape"&&(v.stopPropagation(),o())}),r}const we=`
316
+ .cal-myp {
317
+ width: calc(7 * var(--cal-cell-size));
318
+ }
319
+
320
+ .cal-myp__year-nav {
321
+ display: flex;
322
+ align-items: center;
323
+ justify-content: space-between;
324
+ padding: 0 4px;
325
+ margin-bottom: 8px;
326
+ }
327
+
328
+ .cal-myp__year-label {
329
+ font-size: 14px;
330
+ font-weight: 600;
331
+ color: hsl(var(--cal-fg));
332
+ user-select: none;
333
+ }
334
+
335
+ .cal-myp__grid {
336
+ display: grid;
337
+ grid-template-columns: repeat(3, 1fr);
338
+ gap: 4px;
339
+ }
340
+
341
+ .cal-myp__cell {
342
+ display: flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ height: calc(var(--cal-cell-size) * 1.5);
346
+ font-size: 13px;
347
+ font-weight: 500;
348
+ color: hsl(var(--cal-fg));
349
+ border-radius: var(--cal-radius-sm);
350
+ cursor: pointer;
351
+ transition: background var(--cal-transition);
352
+ user-select: none;
353
+ }
354
+
355
+ .cal-myp__cell:hover {
356
+ background: hsl(var(--cal-hover));
357
+ }
358
+
359
+ .cal-myp__cell--active {
360
+ background: hsl(var(--cal-accent));
361
+ color: hsl(var(--cal-accent-fg));
362
+ font-weight: 600;
363
+ }
364
+
365
+ .cal-myp__cell--active:hover {
366
+ background: hsl(var(--cal-accent));
367
+ }
368
+
369
+ .cal-myp__cell--today:not(.cal-myp__cell--active) {
370
+ border: 1px solid hsl(var(--cal-border));
371
+ font-weight: 600;
372
+ }
373
+ `;function Se({trigger:s,content:e,onClose:a}){const t=document.createElement("div");t.classList.add("cal-popover"),t.setAttribute("role","dialog"),t.setAttribute("aria-modal","false"),t.style.display="none",t.appendChild(e);let n=!1;function i(){t.classList.remove("cal-popover--above");const g=s.getBoundingClientRect(),c=t.offsetHeight,d=window.innerHeight-g.bottom,b=g.top;d<c+8&&b>d?(t.classList.add("cal-popover--above"),t.style.top="auto",t.style.bottom="100%",t.style.marginBottom="4px",t.style.marginTop="0"):(t.style.top="100%",t.style.bottom="auto",t.style.marginTop="4px",t.style.marginBottom="0")}function o(){n||(n=!0,t.style.display="",t.classList.add("cal-animate-slide-up"),requestAnimationFrame(()=>i()),document.addEventListener("click",l,!0),document.addEventListener("keydown",u,!0))}function r(){n&&(n=!1,t.style.display="none",t.classList.remove("cal-animate-slide-up"),document.removeEventListener("click",l,!0),document.removeEventListener("keydown",u,!0),a==null||a())}function l(g){var d;const c=(d=s.getRootNode())==null?void 0:d.host;c&&!c.contains(g.target)&&g.target!==c&&r()}function u(g){g.key==="Escape"&&(g.stopPropagation(),r())}function m(){n&&(n=!1,t.style.display="none",t.classList.remove("cal-animate-slide-up")),document.removeEventListener("click",l,!0),document.removeEventListener("keydown",u,!0)}return{panel:t,open:o,close:r,destroy:m,get isOpen(){return n}}}const Le=`
374
+ .cal-popover-wrapper {
375
+ position: relative;
376
+ display: inline-block;
377
+ }
378
+
379
+ .cal-popover {
380
+ position: absolute;
381
+ left: 0;
382
+ z-index: 50;
383
+ background: hsl(var(--cal-bg));
384
+ border: 1px solid hsl(var(--cal-border));
385
+ border-radius: var(--cal-radius);
386
+ box-shadow: 0 4px 16px -2px rgba(0, 0, 0, 0.08), 0 2px 6px -2px rgba(0, 0, 0, 0.04);
387
+ padding: 12px;
388
+ }
389
+
390
+ .cal-trigger {
391
+ display: inline-flex;
392
+ align-items: center;
393
+ gap: 8px;
394
+ height: 36px;
395
+ padding: 0 12px;
396
+ font-size: 14px;
397
+ border: 1px solid hsl(var(--cal-border));
398
+ border-radius: var(--cal-radius-sm);
399
+ background: hsl(var(--cal-bg));
400
+ color: hsl(var(--cal-fg));
401
+ cursor: pointer;
402
+ transition: border-color var(--cal-transition);
403
+ white-space: nowrap;
404
+ }
405
+
406
+ .cal-trigger:hover {
407
+ border-color: hsl(var(--cal-fg-muted));
408
+ }
409
+
410
+ .cal-trigger--placeholder {
411
+ color: hsl(var(--cal-fg-muted));
412
+ }
413
+
414
+ .cal-trigger__icon {
415
+ display: flex;
416
+ color: hsl(var(--cal-fg-muted));
417
+ }
418
+ `,ae={blue:{bg:"var(--cal-booking-blue-bg)",fg:"var(--cal-booking-blue-fg)",hover:"var(--cal-booking-blue-hover)"},green:{bg:"var(--cal-booking-green-bg)",fg:"var(--cal-booking-green-fg)",hover:"var(--cal-booking-green-hover)"},red:{bg:"var(--cal-booking-red-bg)",fg:"var(--cal-booking-red-fg)",hover:"var(--cal-booking-red-hover)"},orange:{bg:"var(--cal-booking-orange-bg)",fg:"var(--cal-booking-orange-fg)",hover:"var(--cal-booking-orange-hover)"},gray:{bg:"var(--cal-booking-gray-bg)",fg:"var(--cal-booking-gray-fg)",hover:"var(--cal-booking-gray-hover)"}},P="blue";function O(s){return ae[s]||ae[P]}function Ee(s,e=[],a={},t=null){const n=e.find(b=>b.end===s),i=e.find(b=>b.start===s),o=e.find(b=>b.start<s&&b.end>s);let r="available",l=null,u=!1,m=null,g=null,c=null;n&&i?(r="half-day",u=!0,m=O(n.color||P),g=O(i.color||P)):o?(r="booked",c=O(o.color||P)):i&&!n?(r="checkin-only",g=O(i.color||P)):n&&!i&&(r="checkout-only",m=O(n.color||P));const d=a[s];if(d&&(d.status&&(r=d.status),d.label!==void 0&&(l=d.label)),t){const b=t(s);b&&(b.status&&(r=b.status),b.label!==void 0&&(l=b.label))}return{status:r,label:l,checkoutBooking:n,checkinBooking:i,halfDay:u,colorOut:m,colorIn:g,colorFull:c}}function ne(s,e,a=[]){if(!s||!e)return!0;const t=s<e?s:e,n=s<e?e:s;for(const i of a)if(t<i.end&&n>i.start)return!1;return!0}function De(s,e,a=[]){return!s||!e?!1:!ne(s,e,a)}function Me(s){const{year:e,month:a,firstDay:t=0,selectedDates:n=[],rangeStart:i,rangeEnd:o,hoverDate:r,minDate:l,maxDate:u,disabledDates:m=[],mode:g="single",focusedDate:c,onSelect:d,onHover:b,bookings:D=null,dayData:v=null,labelFormula:x=null,showLabelsOnHover:oe=!1}=s,y=D!==null,_=document.createElement("div");_.setAttribute("role","grid"),_.classList.add("cal-grid");const S=document.createElement("div");S.setAttribute("role","row"),S.classList.add("cal-weekdays");for(const w of ue(t)){const A=document.createElement("div");A.setAttribute("role","columnheader"),A.setAttribute("aria-label",w),A.classList.add("cal-weekday"),A.textContent=w,S.appendChild(A)}_.appendChild(S);const He=be(e,a,t),U=g==="range"&&i&&!o&&r||y&&i&&!o&&r?r:o,Ne=y?De(i,r,D):!1;let F;return He.forEach((w,A)=>{A%7===0&&(F=document.createElement("div"),F.setAttribute("role","row"),F.classList.add("cal-row"),_.appendChild(F));const h=document.createElement("button");h.setAttribute("role","gridcell"),h.setAttribute("part","day"),h.classList.add("cal-day");const f=w.dateString;h.dataset.date=f;const Ge=new Date(w.year,w.month,w.day);h.setAttribute("aria-label",Ge.toLocaleDateString("en-US",{weekday:"long",year:"numeric",month:"long",day:"numeric"})),w.isCurrentMonth||h.classList.add("cal-day--outside"),w.isToday&&h.classList.add("cal-day--today");let k=null,I=!1;if(y){k=Ee(f,D,v||{},x);const{status:p,label:L,halfDay:j,colorOut:H,colorIn:N,colorFull:G}=k;if(p==="booked"&&(h.classList.add("cal-day--booked"),G&&(h.style.setProperty("--booking-bg",`hsl(${G.bg})`),h.style.setProperty("--booking-fg",`hsl(${G.fg})`),h.style.setProperty("--booking-hover",`hsl(${G.hover})`)),I=!0),p==="blocked"&&(h.classList.add("cal-day--blocked"),I=!0),j&&(h.classList.add("cal-day--half-day"),H&&h.style.setProperty("--half-day-color-out",`hsl(${H.bg})`),N&&h.style.setProperty("--half-day-color-in",`hsl(${N.bg})`),I=!0),p==="checkout-only"&&(h.classList.add("cal-day--checkout-only"),H&&h.style.setProperty("--half-day-color-out",`hsl(${H.bg})`)),p==="checkin-only"&&(h.classList.add("cal-day--checkin-only"),N&&h.style.setProperty("--half-day-color-in",`hsl(${N.bg})`)),oe){let M=null;if(j&&k.checkoutBooking&&k.checkinBooking)M=`${k.checkoutBooking.label||""} / ${k.checkinBooking.label||""}`;else if(p==="booked"){const J=D.find(le=>le.start<=f&&le.end>f);J&&(M=J.label)}else p==="checkout-only"&&k.checkoutBooking?M=k.checkoutBooking.label:p==="checkin-only"&&k.checkinBooking&&(M=k.checkinBooking.label);M&&h.setAttribute("data-booking-label",M)}if(Ne&&i&&!o&&r){const M=i<r?i:r,J=i<r?r:i;f>=M&&f<=J&&h.classList.add("cal-day--invalid-range")}}if(y?i&&o&&(z(f,i)||z(f,o))?(h.classList.add("cal-day--selected"),h.setAttribute("aria-selected","true")):h.setAttribute("aria-selected","false"):n.some(L=>z(L,f))?(h.classList.add("cal-day--selected"),h.setAttribute("aria-selected","true")):h.setAttribute("aria-selected","false"),(g==="range"||y)&&i&&U){const p=z(f,i),L=z(f,U),j=he(f,i,U);p&&h.classList.add("cal-day--range-start"),L&&h.classList.add("cal-day--range-end"),j&&!p&&!L&&h.classList.add("cal-day--in-range")}const re=Ce(f,l,u,m)||I;if(re&&(h.classList.add("cal-day--disabled"),h.disabled=!0,h.setAttribute("aria-disabled","true")),c&&z(f,c)?h.setAttribute("tabindex","0"):h.setAttribute("tabindex","-1"),y&&k&&k.label!=null){h.classList.add("cal-day--with-label");const p=document.createElement("span");p.classList.add("cal-day__number"),p.textContent=w.day,h.appendChild(p);const L=document.createElement("span");L.classList.add("cal-day__label"),L.textContent=k.label,h.appendChild(L)}else h.textContent=w.day;re?y&&h.addEventListener("mouseenter",()=>b==null?void 0:b(f)):(h.addEventListener("click",()=>d==null?void 0:d(f)),h.addEventListener("mouseenter",()=>b==null?void 0:b(f))),F.appendChild(h)}),_.addEventListener("mouseleave",()=>b==null?void 0:b(null)),_}function Ce(s,e,a,t){return!!(t.includes(s)||e&&s<e||a&&s>a)}const Te=`
419
+ .cal-grid {
420
+ display: flex;
421
+ flex-direction: column;
422
+ gap: 2px;
423
+ }
424
+
425
+ .cal-weekdays {
426
+ display: grid;
427
+ grid-template-columns: repeat(7, var(--cal-cell-size));
428
+ gap: 0;
429
+ margin-bottom: 4px;
430
+ }
431
+
432
+ .cal-weekday {
433
+ display: flex;
434
+ align-items: center;
435
+ justify-content: center;
436
+ height: var(--cal-cell-size);
437
+ font-size: 12px;
438
+ font-weight: 500;
439
+ color: hsl(var(--cal-fg-muted));
440
+ user-select: none;
441
+ }
442
+
443
+ .cal-row {
444
+ display: grid;
445
+ grid-template-columns: repeat(7, var(--cal-cell-size));
446
+ gap: 0;
447
+ }
448
+
449
+ .cal-day {
450
+ display: flex;
451
+ align-items: center;
452
+ justify-content: center;
453
+ width: var(--cal-cell-size);
454
+ height: var(--cal-cell-size);
455
+ font-size: 14px;
456
+ border-radius: var(--cal-radius-sm);
457
+ transition: background var(--cal-transition), color var(--cal-transition);
458
+ position: relative;
459
+ user-select: none;
460
+ }
461
+
462
+ .cal-day:not(.cal-day--disabled):not(.cal-day--selected):not(.cal-day--booked):not(.cal-day--half-day):not(.cal-day--blocked):not(.cal-day--checkout-only):not(.cal-day--checkin-only):hover {
463
+ background: hsl(var(--cal-hover));
464
+ }
465
+
466
+ .cal-day--outside {
467
+ color: hsl(var(--cal-fg-muted));
468
+ opacity: 0.4;
469
+ }
470
+
471
+ .cal-day--today:not(.cal-day--selected):not(.cal-day--booked):not(.cal-day--half-day):not(.cal-day--checkout-only):not(.cal-day--checkin-only) {
472
+ border: 1px solid hsl(var(--cal-border));
473
+ font-weight: 600;
474
+ }
475
+
476
+ .cal-day--selected {
477
+ background: hsl(var(--cal-accent));
478
+ color: hsl(var(--cal-accent-fg));
479
+ font-weight: 600;
480
+ }
481
+
482
+ .cal-day--range-start {
483
+ background: hsl(var(--cal-accent));
484
+ color: hsl(var(--cal-accent-fg));
485
+ font-weight: 600;
486
+ border-radius: var(--cal-radius-sm) 0 0 var(--cal-radius-sm);
487
+ }
488
+
489
+ .cal-day--range-end {
490
+ background: hsl(var(--cal-accent));
491
+ color: hsl(var(--cal-accent-fg));
492
+ font-weight: 600;
493
+ border-radius: 0 var(--cal-radius-sm) var(--cal-radius-sm) 0;
494
+ }
495
+
496
+ .cal-day--range-start.cal-day--range-end {
497
+ border-radius: var(--cal-radius-sm);
498
+ }
499
+
500
+ .cal-day--in-range {
501
+ background: hsl(var(--cal-accent-subtle));
502
+ border-radius: 0;
503
+ }
504
+
505
+ .cal-day--in-range:hover {
506
+ background: hsl(var(--cal-accent-subtle)) !important;
507
+ }
508
+
509
+ .cal-day--disabled {
510
+ opacity: 0.3;
511
+ cursor: not-allowed;
512
+ }
513
+
514
+ /* ── Booking-specific styles ── */
515
+
516
+ /* Booked (fully occupied) */
517
+ .cal-day--booked {
518
+ background: var(--booking-bg, hsl(var(--cal-booking-blue-bg)));
519
+ color: var(--booking-fg, hsl(var(--cal-booking-blue-fg)));
520
+ cursor: not-allowed;
521
+ }
522
+
523
+ .cal-day--booked:hover {
524
+ background: var(--booking-hover, hsl(var(--cal-booking-blue-hover)));
525
+ }
526
+
527
+ /* Blocked */
528
+ .cal-day--blocked {
529
+ background: hsl(var(--cal-bg-muted));
530
+ opacity: 0.4;
531
+ cursor: not-allowed;
532
+ }
533
+
534
+ /* Half-day diagonal (checkout + checkin on same day) */
535
+ .cal-day--half-day {
536
+ background: linear-gradient(135deg,
537
+ var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,
538
+ hsl(var(--cal-bg)) 49.5%, hsl(var(--cal-bg)) 50.5%,
539
+ var(--half-day-color-in, hsl(var(--cal-booking-green-bg))) 50.5%);
540
+ cursor: not-allowed;
541
+ }
542
+
543
+ /* Checkout-only (last day of a booking — outgoing triangle) */
544
+ .cal-day--checkout-only {
545
+ background: linear-gradient(135deg,
546
+ var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,
547
+ hsl(var(--cal-bg)) 49.5%);
548
+ }
549
+
550
+ /* Checkin-only (first day of a booking — incoming triangle) */
551
+ .cal-day--checkin-only {
552
+ background: linear-gradient(135deg,
553
+ hsl(var(--cal-bg)) 50.5%,
554
+ var(--half-day-color-in, hsl(var(--cal-booking-blue-bg))) 50.5%);
555
+ }
556
+
557
+ /* Diagonal cells: standard text color for clean contrast */
558
+ .cal-day--half-day,
559
+ .cal-day--checkout-only,
560
+ .cal-day--checkin-only {
561
+ color: hsl(var(--cal-fg));
562
+ }
563
+
564
+ /* ── Diagonal + selection compounds ── */
565
+
566
+ /* Checkout-only — range boundary: accent-subtle fill + refined ring */
567
+ .cal-day--checkout-only.cal-day--range-start,
568
+ .cal-day--checkout-only.cal-day--range-end,
569
+ .cal-day--checkout-only.cal-day--selected {
570
+ background: linear-gradient(135deg,
571
+ var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,
572
+ hsl(var(--cal-accent-subtle)) 50.5%);
573
+ color: hsl(var(--cal-fg));
574
+ box-shadow: inset 0 0 0 1.5px hsl(var(--cal-accent) / 0.3);
575
+ }
576
+
577
+ /* Checkout-only — in range: accent-subtle fill */
578
+ .cal-day--checkout-only.cal-day--in-range {
579
+ background: linear-gradient(135deg,
580
+ var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,
581
+ hsl(var(--cal-accent-subtle)) 50.5%);
582
+ }
583
+
584
+ /* Checkin-only — range boundary: accent-subtle fill + refined ring */
585
+ .cal-day--checkin-only.cal-day--range-start,
586
+ .cal-day--checkin-only.cal-day--range-end,
587
+ .cal-day--checkin-only.cal-day--selected {
588
+ background: linear-gradient(135deg,
589
+ hsl(var(--cal-accent-subtle)) 49.5%,
590
+ var(--half-day-color-in, hsl(var(--cal-booking-blue-bg))) 50.5%);
591
+ color: hsl(var(--cal-fg));
592
+ box-shadow: inset 0 0 0 1.5px hsl(var(--cal-accent) / 0.3);
593
+ }
594
+
595
+ /* Checkin-only — in range: accent-subtle fill */
596
+ .cal-day--checkin-only.cal-day--in-range {
597
+ background: linear-gradient(135deg,
598
+ hsl(var(--cal-accent-subtle)) 49.5%,
599
+ var(--half-day-color-in, hsl(var(--cal-booking-blue-bg))) 50.5%);
600
+ }
601
+
602
+ /* Half-day in range — accent-subtle stripe between booking triangles */
603
+ .cal-day--half-day.cal-day--in-range {
604
+ background: linear-gradient(135deg,
605
+ var(--half-day-color-out, hsl(var(--cal-booking-blue-bg))) 49.5%,
606
+ hsl(var(--cal-accent-subtle)) 49.5%, hsl(var(--cal-accent-subtle)) 50.5%,
607
+ var(--half-day-color-in, hsl(var(--cal-booking-green-bg))) 50.5%);
608
+ }
609
+
610
+ /* Invalid range preview (crosses a booking) */
611
+ .cal-day--invalid-range {
612
+ background: hsl(var(--cal-booking-red-bg));
613
+ border-radius: 0;
614
+ }
615
+
616
+ /* Booked/half-day/diagonal cells stay opaque even when disabled */
617
+ .cal-day--disabled.cal-day--booked,
618
+ .cal-day--disabled.cal-day--half-day,
619
+ .cal-day--disabled.cal-day--checkout-only,
620
+ .cal-day--disabled.cal-day--checkin-only {
621
+ opacity: 1;
622
+ }
623
+
624
+ /* Sublabel spans */
625
+ .cal-day__number {
626
+ font-size: 13px;
627
+ font-weight: 500;
628
+ line-height: 1;
629
+ }
630
+
631
+ .cal-day__label {
632
+ font-size: 9px;
633
+ font-weight: 500;
634
+ line-height: 1;
635
+ opacity: 0.8;
636
+ }
637
+
638
+ .cal-day--with-label {
639
+ flex-direction: column;
640
+ gap: 1px;
641
+ }
642
+
643
+ /* CSS Tooltip */
644
+ .cal-day[data-booking-label] {
645
+ overflow: visible;
646
+ }
647
+
648
+ .cal-day[data-booking-label]:hover::after {
649
+ content: attr(data-booking-label);
650
+ position: absolute;
651
+ bottom: calc(100% + 6px);
652
+ left: 50%;
653
+ transform: translateX(-50%);
654
+ padding: 4px 8px;
655
+ font-size: 11px;
656
+ font-weight: 500;
657
+ white-space: nowrap;
658
+ color: hsl(var(--cal-accent-fg));
659
+ background: hsl(var(--cal-accent));
660
+ border-radius: 4px;
661
+ pointer-events: none;
662
+ z-index: 10;
663
+ }
664
+
665
+ .cal-day[data-booking-label]:hover::before {
666
+ content: '';
667
+ position: absolute;
668
+ bottom: calc(100% + 2px);
669
+ left: 50%;
670
+ transform: translateX(-50%);
671
+ border: 4px solid transparent;
672
+ border-top-color: hsl(var(--cal-accent));
673
+ pointer-events: none;
674
+ z-index: 10;
675
+ }
676
+ `;function Ae(s){const{slots:e=[],mode:a="single",format:t="24h",selected:n,hoverTime:i,rangeStart:o,unavailableTimes:r=[],onSelect:l,onHover:u,durationLabels:m=!1}=s,g=document.createElement("div");g.classList.add("cal-time-grid"),m&&g.classList.add("cal-time-grid--duration"),g.setAttribute("role","listbox"),a==="multi"&&g.setAttribute("aria-multiselectable","true");for(const c of e){const d=document.createElement("button");d.classList.add("cal-time-slot"),d.setAttribute("role","option"),d.dataset.time=c.time;const b=R(c.time),D=c.displayText?c.displayText:b?X(b.hours,b.minutes,t):c.time,v=document.createElement("span");if(v.classList.add("cal-time-slot__time"),v.textContent=D,d.appendChild(v),c.label){const y=document.createElement("span");y.classList.add("cal-time-slot__label"),y.textContent=c.label,d.appendChild(y)}const x=c.available===!1||r.includes(c.time);if(x&&(d.classList.add("cal-time-slot--unavailable"),d.disabled=!0,d.setAttribute("aria-disabled","true")),Ye(c.time,n,a)?(d.classList.add("cal-time-slot--selected"),d.setAttribute("aria-selected","true")):d.setAttribute("aria-selected","false"),a==="range"&&o&&!ze(n)&&i){const y=Q(c.time,o,i),_=c.time===o,S=c.time===i;y&&!_&&!S&&d.classList.add("cal-time-slot--in-range"),_&&d.classList.add("cal-time-slot--range-start"),S&&d.classList.add("cal-time-slot--range-end")}else if(a==="range"&&n&&typeof n=="object"&&n.start&&n.end){const y=Q(c.time,n.start,n.end),_=c.time===n.start,S=c.time===n.end;_&&d.classList.add("cal-time-slot--range-start","cal-time-slot--selected"),S&&d.classList.add("cal-time-slot--range-end","cal-time-slot--selected"),y&&!_&&!S&&d.classList.add("cal-time-slot--in-range")}x||(d.addEventListener("click",()=>l==null?void 0:l(c.time)),d.addEventListener("mouseenter",()=>u==null?void 0:u(c.time))),g.appendChild(d)}return g.addEventListener("mouseleave",()=>u==null?void 0:u(null)),g}function Ye(s,e,a){return e?a==="single"?e===s:a==="multi"?Array.isArray(e)&&e.includes(s):a==="range"&&typeof e=="object"&&e.start&&e.end?e.start===s||e.end===s:!1:!1}function ze(s){return s&&typeof s=="object"&&s.start&&s.end}const Pe=`
677
+ .cal-time-grid {
678
+ display: grid;
679
+ grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
680
+ gap: 6px;
681
+ max-height: 280px;
682
+ overflow-y: auto;
683
+ padding: 4px;
684
+ }
685
+
686
+ .cal-time-grid::-webkit-scrollbar {
687
+ width: 6px;
688
+ }
689
+
690
+ .cal-time-grid::-webkit-scrollbar-track {
691
+ background: transparent;
692
+ }
693
+
694
+ .cal-time-grid::-webkit-scrollbar-thumb {
695
+ background: hsl(var(--cal-border));
696
+ border-radius: 3px;
697
+ }
698
+
699
+ .cal-time-slot {
700
+ display: flex;
701
+ flex-direction: column;
702
+ align-items: center;
703
+ justify-content: center;
704
+ height: 40px;
705
+ padding: 0 8px;
706
+ border-radius: 999px;
707
+ font-size: 13px;
708
+ background: hsl(var(--cal-bg-muted));
709
+ color: hsl(var(--cal-fg));
710
+ transition: background var(--cal-transition), color var(--cal-transition);
711
+ gap: 1px;
712
+ }
713
+
714
+ .cal-time-slot:not(.cal-time-slot--unavailable):not(.cal-time-slot--selected):hover {
715
+ background: hsl(var(--cal-hover));
716
+ }
717
+
718
+ .cal-time-slot__time {
719
+ font-weight: 500;
720
+ line-height: 1;
721
+ }
722
+
723
+ .cal-time-slot__label {
724
+ font-size: 9px;
725
+ opacity: 0.7;
726
+ line-height: 1;
727
+ }
728
+
729
+ .cal-time-slot--selected {
730
+ background: hsl(var(--cal-accent));
731
+ color: hsl(var(--cal-accent-fg));
732
+ font-weight: 600;
733
+ }
734
+
735
+ .cal-time-slot--in-range {
736
+ background: hsl(var(--cal-accent-subtle));
737
+ }
738
+
739
+ .cal-time-slot--range-start,
740
+ .cal-time-slot--range-end {
741
+ background: hsl(var(--cal-accent));
742
+ color: hsl(var(--cal-accent-fg));
743
+ font-weight: 600;
744
+ }
745
+
746
+ .cal-time-slot--unavailable {
747
+ opacity: 0.3;
748
+ cursor: not-allowed;
749
+ }
750
+
751
+ .cal-time-grid--duration {
752
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
753
+ }
754
+
755
+ .cal-time-grid--duration .cal-time-slot {
756
+ font-size: 12px;
757
+ }
758
+ `;function $e({columns:s=3,rows:e=4,durationLabels:a=!1}={}){const t=document.createElement("div");t.setAttribute("role","status"),t.setAttribute("aria-label","Loading..."),t.classList.add("cal-skeleton-time-grid"),a&&t.classList.add("cal-skeleton-time-grid--duration");const n=s*e;for(let i=0;i<n;i++){const o=document.createElement("div");o.classList.add("cal-skeleton"),t.appendChild(o)}return t}function Be({rows:s=5}={}){const e=document.createElement("div");e.setAttribute("role","status"),e.setAttribute("aria-label","Loading..."),e.classList.add("cal-skeleton-calendar-grid");for(let t=0;t<7;t++){const n=document.createElement("div");n.classList.add("cal-skeleton","cal-skeleton-calendar-grid__header"),e.appendChild(n)}const a=7*s;for(let t=0;t<a;t++){const n=document.createElement("div");n.classList.add("cal-skeleton","cal-skeleton-calendar-grid__day"),e.appendChild(n)}return e}const Oe=`
759
+ .cal-skeleton-time-grid {
760
+ display: grid;
761
+ grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
762
+ gap: 6px;
763
+ padding: 4px;
764
+ }
765
+
766
+ .cal-skeleton-time-grid--duration {
767
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
768
+ }
769
+
770
+ .cal-skeleton-time-grid .cal-skeleton {
771
+ height: 40px;
772
+ }
773
+
774
+ .cal-skeleton-calendar-grid {
775
+ display: grid;
776
+ grid-template-columns: repeat(7, 1fr);
777
+ gap: 2px;
778
+ padding: 4px;
779
+ }
780
+
781
+ .cal-skeleton-calendar-grid__header {
782
+ height: 20px;
783
+ margin-bottom: 4px;
784
+ }
785
+
786
+ .cal-skeleton-calendar-grid__day {
787
+ height: var(--cal-cell-size, 36px);
788
+ aspect-ratio: 1;
789
+ border-radius: var(--cal-radius-sm) !important;
790
+ }
791
+ `,se={error:'<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="7" cy="7" r="6"/><path d="M7 4v3M7 9.5v.01"/></svg>',warning:'<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M7 1.5L1 12.5h12L7 1.5zM7 6v2.5M7 10.5v.01"/></svg>',info:'<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="7" cy="7" r="6"/><path d="M7 6.5V10M7 4.5v.01"/></svg>',success:'<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="7" cy="7" r="6"/><path d="M4.5 7l2 2L9.5 5"/></svg>'};function Fe({type:s="info",message:e,dismissible:a=!0,onDismiss:t}){const n=document.createElement("div");n.classList.add("cal-status",`cal-status--${s}`,"cal-animate-slide-up"),n.setAttribute("role",s==="error"?"alert":"status"),n.setAttribute("aria-live",s==="error"?"assertive":"polite");const i=document.createElement("span");i.classList.add("cal-status__icon"),i.innerHTML=se[s]||se.info,n.appendChild(i);const o=document.createElement("span");if(o.classList.add("cal-status__text"),o.textContent=e,n.appendChild(o),a){const r=document.createElement("button");r.classList.add("cal-status__close"),r.setAttribute("aria-label","Dismiss"),r.innerHTML='<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M3 3l6 6M9 3l-6 6"/></svg>',r.addEventListener("click",()=>t==null?void 0:t()),n.appendChild(r)}return n}const Re=`
792
+ .cal-status {
793
+ display: flex;
794
+ align-items: center;
795
+ gap: 8px;
796
+ padding: 8px 12px;
797
+ border-radius: var(--cal-radius-sm);
798
+ font-size: 12px;
799
+ line-height: 1.4;
800
+ margin-bottom: 8px;
801
+ }
802
+
803
+ .cal-status__icon {
804
+ flex-shrink: 0;
805
+ display: flex;
806
+ }
807
+
808
+ .cal-status__text {
809
+ flex: 1;
810
+ min-width: 0;
811
+ }
812
+
813
+ .cal-status__close {
814
+ flex-shrink: 0;
815
+ display: flex;
816
+ align-items: center;
817
+ justify-content: center;
818
+ width: 20px;
819
+ height: 20px;
820
+ border-radius: 4px;
821
+ cursor: pointer;
822
+ opacity: 0.7;
823
+ transition: opacity var(--cal-transition);
824
+ }
825
+
826
+ .cal-status__close:hover {
827
+ opacity: 1;
828
+ }
829
+
830
+ .cal-status--error {
831
+ background: hsl(var(--cal-status-error-bg));
832
+ color: hsl(var(--cal-status-error-fg));
833
+ border: 1px solid hsl(var(--cal-status-error-border));
834
+ }
835
+
836
+ .cal-status--warning {
837
+ background: hsl(var(--cal-status-warning-bg));
838
+ color: hsl(var(--cal-status-warning-fg));
839
+ border: 1px solid hsl(var(--cal-status-warning-border));
840
+ }
841
+
842
+ .cal-status--info {
843
+ background: hsl(var(--cal-status-info-bg));
844
+ color: hsl(var(--cal-status-info-fg));
845
+ border: 1px solid hsl(var(--cal-status-info-border));
846
+ }
847
+
848
+ .cal-status--success {
849
+ background: hsl(var(--cal-status-success-bg));
850
+ color: hsl(var(--cal-status-success-fg));
851
+ border: 1px solid hsl(var(--cal-status-success-border));
852
+ }
853
+ `,Ie='<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="12" height="11" rx="2"/><path d="M5 1v3M11 1v3M2 7h12"/></svg>',je=`
854
+ .cal-picker {
855
+ background: hsl(var(--cal-bg));
856
+ border-radius: var(--cal-radius);
857
+ user-select: none;
858
+ }
859
+
860
+ :host([display="inline"]) .cal-picker {
861
+ border: 1px solid hsl(var(--cal-border));
862
+ padding: 12px;
863
+ }
864
+
865
+ .cal-months {
866
+ display: flex;
867
+ gap: 16px;
868
+ }
869
+
870
+ .cal-month {
871
+ flex: 0 0 auto;
872
+ }
873
+
874
+ /* Time section */
875
+ .cal-booking-time-section {
876
+ margin-top: 12px;
877
+ padding-top: 12px;
878
+ border-top: 1px solid hsl(var(--cal-border));
879
+ }
880
+
881
+ .cal-booking-time-header {
882
+ font-size: 13px;
883
+ font-weight: 600;
884
+ color: hsl(var(--cal-fg));
885
+ margin-bottom: 8px;
886
+ }
887
+ `;class ie extends ${static get styles(){return[pe,ve,ye,Te,Pe,ke,we,Le,Oe,Re,je]}static get observedAttributes(){return["theme","display","min-date","max-date","first-day","placeholder","dual","show-labels-on-hover","time-slots","time-start","time-end","time-interval","time-format","duration-labels","loading"]}constructor(){super();const e=new Date;this._store=ce({viewYear:e.getFullYear(),viewMonth:e.getMonth(),rangeStart:null,rangeEnd:null,hoverDate:null,isOpen:!1,focusedDate:V(),navDirection:null,pickingMonth:!1,pickerYear:e.getFullYear(),startTime:null,endTime:null,timeSelectPhase:null,statusType:null,statusMessage:null,statusDismissible:!0}),this._bookings=[],this._dayData={},this._labelFormula=null,this._timeSlots=null,this._popover=null,this._unsubscribe=null,this._rendering=!1}get display(){return this.getAttribute("display")||"inline"}get placeholder(){return this.getAttribute("placeholder")||"Select dates"}get firstDay(){return parseInt(this.getAttribute("first-day")||"0",10)}get minDate(){return this.getAttribute("min-date")||null}get maxDate(){return this.getAttribute("max-date")||null}get showLabelsOnHover(){return this.hasAttribute("show-labels-on-hover")}get timeSlotsEnabled(){return this.hasAttribute("time-slots")}get timeStartTime(){return this.getAttribute("time-start")||"09:00"}get timeEndTime(){return this.getAttribute("time-end")||"17:00"}get timeInterval(){return parseInt(this.getAttribute("time-interval")||"60",10)}get timeFormat(){return this.getAttribute("time-format")||"24h"}get durationLabels(){return this.hasAttribute("duration-labels")}get loading(){return this.hasAttribute("loading")}set loading(e){e?this.setAttribute("loading",""):this.removeAttribute("loading")}get bookings(){return this._bookings}set bookings(e){this._bookings=Array.isArray(e)?e:[],this._initialized&&this.render()}get dayData(){return this._dayData}set dayData(e){this._dayData=e&&typeof e=="object"?e:{},this._initialized&&this.render()}get labelFormula(){return this._labelFormula}set labelFormula(e){this._labelFormula=typeof e=="function"?e:null,this._initialized&&this.render()}get timeSlots(){return this._timeSlots}set timeSlots(e){this._timeSlots=Array.isArray(e)?e:null,this._initialized&&this.render()}get value(){const e=this._store.getState();if(!e.rangeStart||!e.rangeEnd)return null;const a={start:e.rangeStart,end:e.rangeEnd};return this.timeSlotsEnabled&&(e.startTime&&(a.startTime=e.startTime),e.endTime&&(a.endTime=e.endTime)),a}set value(e){if(e&&typeof e=="object"&&e.start&&e.end){const a=typeof e.start=="string"?e.start:C(e.start),t=typeof e.end=="string"?e.end:C(e.end),n={rangeStart:a,rangeEnd:t};e.startTime&&(n.startTime=e.startTime),e.endTime&&(n.endTime=e.endTime),this._store.set(n),this._navigateToDate(a)}else this._store.set({rangeStart:null,rangeEnd:null,startTime:null,endTime:null,timeSelectPhase:null})}_navigateToDate(e){const a=E(e);a&&this._store.set({viewYear:a.getFullYear(),viewMonth:a.getMonth()})}connectedCallback(){super.connectedCallback(),this._unsubscribe=this._store.subscribe((a,t)=>{if(this._rendering)return;a.hoverDate!==t.hoverDate&&a.viewYear===t.viewYear&&a.viewMonth===t.viewMonth&&a.rangeStart===t.rangeStart&&a.rangeEnd===t.rangeEnd&&a.isOpen===t.isOpen&&a.navDirection===t.navDirection&&a.pickingMonth===t.pickingMonth&&a.pickerYear===t.pickerYear&&a.timeSelectPhase===t.timeSelectPhase?this._updateGridHighlight(a):this.render()});const e=this.getAttribute("bookings");if(e&&!this._bookings.length)try{this._bookings=JSON.parse(e)}catch{}}disconnectedCallback(){var e,a;(e=this._unsubscribe)==null||e.call(this),(a=this._popover)==null||a.destroy(),clearTimeout(this._statusTimer)}attributeChangedCallback(e,a,t){a!==t&&this._initialized&&this.render()}_handleSelect(e){const a=this._store.getState();if(!a.rangeStart||a.rangeEnd)this._store.set({rangeStart:e,rangeEnd:null,hoverDate:null,focusedDate:e,startTime:null,endTime:null,timeSelectPhase:null});else{let t=a.rangeStart,n=e;if(t>n&&([t,n]=[n,t]),!ne(t,n,this._bookings)){this.emit("cal:selection-invalid",{start:t,end:n}),this._store.set({rangeStart:null,rangeEnd:null,hoverDate:null,startTime:null,endTime:null,timeSelectPhase:null}),this.showStatus("error","Selection overlaps an existing booking",{autoDismiss:4e3});return}this.timeSlotsEnabled?this._store.set({rangeStart:t,rangeEnd:n,hoverDate:null,focusedDate:n,timeSelectPhase:"start"}):(this._store.set({rangeStart:t,rangeEnd:n,hoverDate:null,focusedDate:n}),this.emit("cal:change",{value:{start:t,end:n}}),this.display==="popover"&&this.close())}}_handleTimeSelect(e){const a=this._store.getState();if(a.timeSelectPhase==="start")this._store.set({startTime:e,timeSelectPhase:"end"});else if(a.timeSelectPhase==="end"){this._store.set({endTime:e,timeSelectPhase:null});const t={start:a.rangeStart,end:a.rangeEnd,startTime:a.startTime,endTime:e};this.emit("cal:change",{value:t}),this.display==="popover"&&this.close()}}_handleHover(e){this._store.set({hoverDate:e})}_updateGridHighlight(e){const a=this.$$(".cal-day"),{rangeStart:t,hoverDate:n}=e,i=t&&!e.rangeEnd&&n?n:e.rangeEnd;let o=!1;if(t&&!e.rangeEnd&&n){const r=t<n?t:n,l=t<n?n:t;for(const u of this._bookings)if(r<u.end&&l>u.start){o=!0;break}}for(const r of a){const l=r.dataset.date;if(!l)continue;const u=l===t&&!!i,m=l===i&&!!i;let g=!1;if(t&&i){const d=t<i?t:i,b=t<i?i:t;g=l>=d&&l<=b&&!u&&!m}const c=o&&t&&!e.rangeEnd&&n&&(()=>{const d=t<n?t:n,b=t<n?n:t;return l>=d&&l<=b})();r.classList.toggle("cal-day--range-start",u),r.classList.toggle("cal-day--range-end",m),r.classList.toggle("cal-day--in-range",g),r.classList.toggle("cal-day--invalid-range",!!c)}}_prevMonth(){const{viewYear:e,viewMonth:a}=this._store.getState(),{year:t,month:n}=B(e,a,-1);this._store.set({viewYear:t,viewMonth:n,navDirection:"prev"}),this.emit("cal:month-change",{year:t,month:n})}_nextMonth(){const{viewYear:e,viewMonth:a}=this._store.getState(),{year:t,month:n}=B(e,a,1);this._store.set({viewYear:t,viewMonth:n,navDirection:"next"}),this.emit("cal:month-change",{year:t,month:n})}_toggleMonthPicker(){const e=this._store.getState();this._store.set({pickingMonth:!e.pickingMonth,pickerYear:e.viewYear})}_selectMonthFromPicker(e,a){this._store.set({viewYear:a,viewMonth:e,pickingMonth:!1}),this.emit("cal:month-change",{year:a,month:e})}_handleKeydown(e){if(e.key==="Escape"&&this._store.get("pickingMonth")){e.stopPropagation(),this._store.set({pickingMonth:!1});return}const a=this._store.getState(),t=E(a.focusedDate);if(!t)return;let n=null;switch(e.key){case"ArrowLeft":n=new Date(t),n.setDate(t.getDate()-1);break;case"ArrowRight":n=new Date(t),n.setDate(t.getDate()+1);break;case"ArrowUp":n=new Date(t),n.setDate(t.getDate()-7);break;case"ArrowDown":n=new Date(t),n.setDate(t.getDate()+7);break;case"Enter":case" ":e.preventDefault(),this._handleSelect(a.focusedDate);return;case"Escape":this.display==="popover"&&this.close();return;default:return}if(n){e.preventDefault();const i=C(n);n.getMonth()!==a.viewMonth||n.getFullYear()!==a.viewYear?this._store.set({viewYear:n.getFullYear(),viewMonth:n.getMonth(),focusedDate:i,navDirection:n>t?"next":"prev"}):this._store.set({focusedDate:i}),requestAnimationFrame(()=>{const o=this.$(`[data-date="${i}"]`);o==null||o.focus()})}}open(){this._popover&&(this._popover.open(),this._store.set({isOpen:!0}),this.emit("cal:open"))}close(){this._popover&&(this._popover.close(),this._store.set({isOpen:!1}),this.emit("cal:close"))}goToMonth(e,a){this._store.set({viewYear:a,viewMonth:e})}_getTimeSlotArray(){return this._timeSlots?this._timeSlots:this.durationLabels?fe(this.timeStartTime,this.timeEndTime,this.timeInterval,this.timeFormat).map(a=>({...a,available:!0})):me(this.timeStartTime,this.timeEndTime,this.timeInterval).map(a=>({time:a,available:!0}))}_renderCalendarContent(){const e=this._store.getState(),a=document.createElement("div");if(a.classList.add("cal-picker"),e.statusType&&e.statusMessage&&a.appendChild(Fe({type:e.statusType,message:e.statusMessage,dismissible:e.statusDismissible,onDismiss:()=>this.clearStatus()})),this.loading){const o=document.createElement("div");o.classList.add("cal-months");const r=document.createElement("div");if(r.classList.add("cal-month"),r.appendChild(Be()),o.appendChild(r),a.appendChild(o),this.timeSlotsEnabled){const l=document.createElement("div");l.classList.add("cal-booking-time-section"),l.appendChild($e({durationLabels:this.durationLabels})),a.appendChild(l)}return a.addEventListener("keydown",l=>this._handleKeydown(l)),a}const t=document.createElement("div");t.classList.add("cal-months");const n=this.hasAttribute("dual"),i=n?2:1;for(let o=0;o<i;o++){const{year:r,month:l}=o===0?{year:e.viewYear,month:e.viewMonth}:B(e.viewYear,e.viewMonth,1),u=document.createElement("div");if(u.classList.add("cal-month"),o===0&&u.appendChild(te({year:r,month:l,onPrev:e.pickingMonth?()=>{}:()=>this._prevMonth(),onNext:e.pickingMonth?()=>{}:()=>{n||this._nextMonth()},onTitleClick:()=>this._toggleMonthPicker()})),o===1&&u.appendChild(te({year:r,month:l,onPrev:()=>{},onNext:()=>this._nextMonth()})),e.pickingMonth&&o===0){const m=xe({pickerYear:e.pickerYear,viewMonth:e.viewMonth,viewYear:e.viewYear,onMonthSelect:(g,c)=>this._selectMonthFromPicker(g,c),onYearPrev:()=>this._store.set({pickerYear:e.pickerYear-1}),onYearNext:()=>this._store.set({pickerYear:e.pickerYear+1}),onClose:()=>this._store.set({pickingMonth:!1})});u.appendChild(m)}else{const m=e.navDirection==="next"?"cal-animate-slide-left":e.navDirection==="prev"?"cal-animate-slide-right":"",g=Me({year:r,month:l,firstDay:this.firstDay,rangeStart:e.rangeStart,rangeEnd:e.rangeEnd,hoverDate:e.hoverDate,minDate:this.minDate,maxDate:this.maxDate,focusedDate:e.focusedDate,mode:"range",onSelect:c=>this._handleSelect(c),onHover:c=>this._handleHover(c),bookings:this._bookings,dayData:this._dayData,labelFormula:this._labelFormula,showLabelsOnHover:this.showLabelsOnHover});m&&g.classList.add(m),u.appendChild(g)}t.appendChild(u)}if(a.appendChild(t),this.timeSlotsEnabled&&e.timeSelectPhase&&!e.pickingMonth){const o=document.createElement("div");o.classList.add("cal-booking-time-section");const r=document.createElement("div");r.classList.add("cal-booking-time-header"),r.textContent=e.timeSelectPhase==="start"?"Select check-in time":"Select check-out time",o.appendChild(r);const l=this._getTimeSlotArray(),u=Ae({slots:l,mode:"single",format:this.timeFormat,selected:e.timeSelectPhase==="end"?e.startTime:null,onSelect:m=>this._handleTimeSelect(m),onHover:()=>{},durationLabels:this.durationLabels});o.appendChild(u),a.appendChild(o)}return a.addEventListener("keydown",o=>this._handleKeydown(o)),a}_formatTriggerText(){const e=this._store.getState();if(e.rangeStart&&e.rangeEnd){let a=`${this._formatShortDate(e.rangeStart)} – ${this._formatShortDate(e.rangeEnd)}`;return e.startTime&&e.endTime&&(a+=` (${e.startTime} – ${e.endTime})`),a}return null}_formatShortDate(e){const a=E(e);return a?`${K[a.getMonth()].slice(0,3)} ${a.getDate()}, ${a.getFullYear()}`:e}render(){var t;if(this._rendering)return;this._rendering=!0;const e=this.shadowRoot,a=[...e.childNodes];for(const n of a)n.nodeName!=="STYLE"&&!(n instanceof CSSStyleSheet)&&e.removeChild(n);if((t=this._popover)==null||t.destroy(),this._popover=null,this.display==="popover"){const n=document.createElement("div");n.classList.add("cal-popover-wrapper");const i=document.createElement("button");i.classList.add("cal-trigger");const o=document.createElement("span");o.classList.add("cal-trigger__icon"),o.innerHTML=Ie,i.appendChild(o);const r=this._formatTriggerText(),l=document.createElement("span");r?l.textContent=r:(l.textContent=this.placeholder,l.classList.add("cal-trigger--placeholder")),i.appendChild(l),n.appendChild(i);const u=this._renderCalendarContent(),m=Se({trigger:i,content:u,onClose:()=>{this._store.set({isOpen:!1}),this.emit("cal:close")}});n.appendChild(m.panel),e.appendChild(n),i.addEventListener("click",g=>{g.stopPropagation(),m.isOpen?this.close():this.open()}),this._popover=m,this._store.get("isOpen")&&m.open()}else e.appendChild(this._renderCalendarContent());this._store.set({navDirection:null}),this._rendering=!1}}customElements.get("cal-booking")||customElements.define("cal-booking",ie),Y.CalBooking=ie,Object.defineProperty(Y,Symbol.toStringTag,{value:"Module"})}));
888
+ //# sourceMappingURL=booking.umd.js.map