simple-calendar-js 3.0.11 → 3.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * SimpleCalendarJs v3.0.11 — simple-calendar-js.css
2
+ * SimpleCalendarJs v3.0.13 — simple-calendar-js.css
3
3
  * A clean, modern, and feature-rich JavaScript calendar component with zero dependencies
4
4
  *
5
5
  * @author Pedro Lopes <simplecalendarjs@gmail.com>
@@ -9,4 +9,4 @@
9
9
  * All styles scoped under .uc-calendar to prevent leaking.
10
10
  * Override any --cal-* variable in :root or on .uc-calendar.
11
11
  */
12
- :root{--cal-bg:#ffffff;--cal-bg-secondary:#f9fafb;--cal-text:#111827;--cal-text-subtle:#6b7280;--cal-text-muted:#9ca3af;--cal-border:#e5e7eb;--cal-border-strong:#d1d5db;--cal-primary:#4f46e5;--cal-primary-dark:#4338ca;--cal-primary-light:#eef2ff;--cal-event-bg:var(--cal-primary);--cal-event-text:#ffffff;--cal-event-border-radius:3px;--cal-today-bg:#eef2ff;--cal-today-text:var(--cal-primary);--cal-hover:#f9fafb;--cal-hover-strong:#f3f4f6;--cal-selected-bg:#ede9fe;--cal-font-family:inherit;--cal-font-size:13px;--cal-time-col-width:64px;--cal-hour-height:60px;--cal-event-height:22px;--cal-event-gap:2px;--cal-header-day-height:30px;--cal-day-name-height:36px;--cal-now-color:#ef4444;--cal-toolbar-bg:var(--cal-bg);--cal-radius:8px;--cal-shadow:0 1px 3px rgba(0,0,0,.08),0 1px 2px rgba(0,0,0,.06);--cal-transition:150ms ease;--cal-tooltip-bg:#1f2937;--cal-tooltip-text:#f9fafb;--cal-tooltip-border:#374151;--cal-tooltip-shadow:0 4px 12px rgba(0, 0, 0, 0.15);--cal-tooltip-max-width:250px;--cal-tooltip-padding:8px 12px;--cal-tooltip-radius:6px;--cal-tooltip-font-size:12px;--cal-tooltip-offset:8px;--cal-loading-bg:rgba(255, 255, 255, 0.7)}.uc-calendar{font-family:var(--cal-font-family);font-size:var(--cal-font-size);color:var(--cal-text);background:var(--cal-bg);border:1px solid var(--cal-border);border-radius:var(--cal-radius);overflow-x:visible;overflow-y:hidden;display:flex;flex-direction:column;height:100%;position:relative;-webkit-font-smoothing:antialiased}.uc-calendar *,.uc-calendar ::after,.uc-calendar ::before{box-sizing:border-box;margin:0;padding:0}.uc-toolbar{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1fr);align-items:center;gap:8px;padding:8px 10px;background:var(--cal-toolbar-bg);border-bottom:1px solid var(--cal-border);border-radius:var(--cal-radius) var(--cal-radius) 0 0;flex-shrink:0}.uc-toolbar-section{display:flex;align-items:center;gap:4px}.uc-toolbar-left{justify-self:start;min-width:0}.uc-toolbar-right{justify-self:end;min-width:0}.uc-toolbar-center{justify-self:center;min-width:0;overflow:visible;position:relative}.uc-title{font-size:14px;font-weight:600;color:var(--cal-text);white-space:nowrap;letter-spacing:-.01em;display:inline-flex;align-items:baseline;gap:4px;min-width:0;max-width:100%}.uc-title-main{text-transform:capitalize;overflow:hidden;text-overflow:ellipsis;flex-shrink:1}.uc-year-btn{background:0 0;border:none;font:inherit;font-weight:600;font-size:14px;color:var(--cal-primary);cursor:pointer;padding:1px 4px;border-radius:4px;line-height:inherit;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px;transition:background var(--cal-transition),color var(--cal-transition);flex-shrink:0}.uc-year-btn.uc-open,.uc-year-btn:hover{background:var(--cal-primary-light);text-decoration:none}.uc-year-picker{position:absolute;top:calc(100% + 8px);left:50%;transform:translateX(-50%);background:var(--cal-bg);border:1px solid var(--cal-border);border-radius:10px;box-shadow:0 4px 24px rgba(0,0,0,.12);padding:10px;z-index:200;min-width:210px}.uc-year-picker-nav{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.uc-year-range{font-size:12px;font-weight:600;color:var(--cal-text-subtle)}.uc-year-nav-btn{background:0 0;border:none;font-size:18px;line-height:1;color:var(--cal-text);cursor:pointer;padding:2px 7px;border-radius:5px;font-family:inherit;transition:background var(--cal-transition)}.uc-year-nav-btn:hover{background:var(--cal-hover-strong)}.uc-year-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:4px}.uc-year-item{background:0 0;border:none;border-radius:6px;font-size:13px;font-weight:500;font-family:inherit;color:var(--cal-text);cursor:pointer;padding:7px 4px;text-align:center;transition:background var(--cal-transition),color var(--cal-transition)}.uc-year-item:hover{background:var(--cal-hover-strong)}.uc-year-item.uc-today-year{color:var(--cal-primary);font-weight:700}.uc-year-item.uc-active{background:var(--cal-primary);color:#fff;font-weight:700}.uc-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;border:1px solid var(--cal-border);background:var(--cal-bg);color:var(--cal-text);border-radius:6px;padding:4px 6px;font-size:12px;font-family:inherit;font-weight:500;cursor:pointer;white-space:nowrap;line-height:1.4;transition:background var(--cal-transition),border-color var(--cal-transition),color var(--cal-transition);user-select:none}.uc-btn:hover{background:var(--cal-hover-strong);border-color:var(--cal-border-strong)}.uc-btn:active{background:var(--cal-selected-bg)}.uc-btn:focus-visible{outline:2px solid var(--cal-primary);outline-offset:2px}.uc-btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.uc-nav-btn{font-size:18px;padding:4px 6px;line-height:1;border-color:transparent;background:0 0}.uc-nav-btn:hover{border-color:var(--cal-border)}.uc-today-btn{padding:4px 6px}.uc-today-btn.uc-active{background:var(--cal-primary-light);color:var(--cal-primary);font-weight:600;border-color:transparent}.uc-view-switcher{display:flex;border:1px solid var(--cal-border);border-radius:6px;overflow:hidden}.uc-view-btn{border:none;border-radius:0;border-right:1px solid var(--cal-border);background:0 0;color:var(--cal-text-subtle);font-weight:500;padding:4px 6px;font-size:12px}.uc-view-btn:last-child{border-right:none}.uc-view-btn:hover{background:var(--cal-hover-strong);color:var(--cal-text);border-color:transparent}.uc-view-btn.uc-active{background:var(--cal-primary-light);color:var(--cal-primary);font-weight:600}.uc-view-dropdown{display:none;position:relative}.uc-view-dropdown-btn{display:flex;align-items:center;justify-content:center;padding:4px 8px;font-size:16px}.uc-view-icon{line-height:1}.uc-dropdown-menu{display:none;position:absolute;top:calc(100% + 4px);right:0;background:var(--cal-bg);border:1px solid var(--cal-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);z-index:1000;min-width:120px;overflow:hidden}.uc-view-dropdown.uc-open .uc-dropdown-menu{display:block}.uc-dropdown-item{display:block;width:100%;padding:8px 12px;background:0 0;border:none;color:var(--cal-text);font-size:13px;font-family:inherit;text-align:left;cursor:pointer;transition:background var(--cal-transition)}.uc-dropdown-item:hover{background:var(--cal-hover-strong)}.uc-dropdown-item.uc-active{background:var(--cal-primary-light);color:var(--cal-primary);font-weight:600}.uc-dropdown-item:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.uc-dropdown-separator{height:1px;background:var(--cal-border);margin:4px 0}@media (min-width:641px){.uc-view-switcher{display:flex}.uc-view-dropdown{display:none}}@media (max-width:640px){.uc-view-switcher{display:none}.uc-view-dropdown{display:block}.uc-today-btn{display:none}}.uc-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--cal-loading-bg);z-index:100;pointer-events:none}.uc-spinner{width:28px;height:28px;border:3px solid var(--cal-border);border-top-color:var(--cal-primary);border-radius:50%;animation:uc-spin .6s linear infinite}@keyframes uc-spin{to{transform:rotate(360deg)}}.uc-view-container{flex:1;min-height:0;overflow:visible;display:flex;flex-direction:column}.uc-view-container:first-child .uc-month-header,.uc-view-container:first-child .uc-week-header{border-radius:var(--cal-radius) var(--cal-radius) 0 0}.uc-month-view{display:flex;flex-direction:column;flex:1;min-height:0;overflow-x:clip;overflow-y:visible;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-calendar[data-height-constrained=true] .uc-month-body,.uc-calendar[data-height-constrained=true] .uc-month-view{overflow-y:hidden;overflow-x:clip}.uc-month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid var(--cal-border);flex-shrink:0}.uc-month-day-name{height:var(--cal-day-name-height,36px);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--cal-text-subtle);user-select:none}.uc-month-body{flex:1;display:flex;flex-direction:column;min-height:0;overflow-x:clip;overflow-y:visible}.uc-week-row{flex:1;position:relative;min-height:0;overflow:visible;border-bottom:1px solid var(--cal-border)}.uc-week-row:last-child{border-bottom:none;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-week-cells{position:absolute;inset:0;display:grid;grid-template-columns:repeat(7,1fr);z-index:1;overflow:visible}.uc-day-cell{border-right:1px solid var(--cal-border);padding:4px 6px 4px 6px;cursor:pointer;transition:background var(--cal-transition)}.uc-day-cell:last-child{border-right:none}.uc-day-cell:hover{background:var(--cal-hover)}.uc-day-cell.uc-today{background:var(--cal-today-bg)}.uc-day-cell.uc-other-month .uc-day-number{color:var(--cal-text-muted)}.uc-day-cell.uc-day-align-center{text-align:center}.uc-day-cell.uc-day-align-right{text-align:right}.uc-day-number{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;font-size:13px;font-weight:500;border-radius:50%;color:var(--cal-text);cursor:pointer;transition:background var(--cal-transition),color var(--cal-transition);line-height:1}.uc-day-number:hover{background:var(--cal-hover-strong)}.uc-today .uc-day-number{background:var(--cal-primary);color:#fff;font-weight:700}.uc-today .uc-day-number:hover{background:var(--cal-primary-dark)}.uc-week-events{position:absolute;inset:0;z-index:2;pointer-events:none;overflow:visible}.uc-event-bar{position:absolute;height:var(--cal-event-height);background:var(--cal-event-bg);color:var(--cal-event-text);border-radius:var(--cal-event-border-radius);display:flex;align-items:center;gap:4px;padding:0 6px;cursor:pointer;pointer-events:auto;white-space:nowrap;font-size:12px;font-weight:500;transition:filter var(--cal-transition),opacity var(--cal-transition);z-index:3}.uc-event-bar:hover{filter:brightness(.92);z-index:1000}.uc-event-bar:active{filter:brightness(.85)}.uc-event-bar.uc-continues-left{border-top-left-radius:0;border-bottom-left-radius:0}.uc-event-bar.uc-continues-right{border-top-right-radius:0;border-bottom-right-radius:0}.uc-event-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.uc-event-time{font-size:11px;opacity:.85;flex-shrink:0}.uc-more-link{position:absolute;height:16px;display:flex;align-items:center;padding:0 6px;font-size:10px;font-weight:600;color:var(--cal-text-subtle);cursor:pointer;pointer-events:auto;border-radius:var(--cal-event-border-radius);white-space:nowrap;transition:background var(--cal-transition),color var(--cal-transition);z-index:3}.uc-more-link:hover{background:var(--cal-hover-strong);color:var(--cal-text)}.uc-day-view,.uc-week-view{display:flex;flex-direction:column;flex:1;min-height:0;overflow-x:clip;overflow-y:visible;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-calendar:not([data-height-constrained=true]) .uc-day-view,.uc-calendar:not([data-height-constrained=true]) .uc-week-view{max-height:650px}.uc-week-header{display:flex;border-bottom:1px solid var(--cal-border);flex-shrink:0;background:var(--cal-bg)}.uc-time-gutter-spacer{width:var(--cal-time-col-width);flex-shrink:0;border-right:1px solid var(--cal-border)}.uc-all-day-label{display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--cal-text-muted);white-space:nowrap}.uc-week-day-headers{flex:1;display:grid;grid-template-columns:repeat(7,1fr)}.uc-week-day-headers.uc-day-header-single{grid-template-columns:1fr}.uc-week-day-header{padding:8px 4px;display:flex;flex-direction:column;align-items:center;gap:2px;border-right:1px solid var(--cal-border);cursor:default}.uc-week-day-header:last-child{border-right:none}.uc-week-day-name{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--cal-text-subtle);user-select:none}.uc-week-day-num{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;font-size:16px;font-weight:600;border-radius:50%;color:var(--cal-text);cursor:pointer;transition:background var(--cal-transition),color var(--cal-transition)}.uc-week-day-num:hover{background:var(--cal-hover-strong)}.uc-week-day-header.uc-today .uc-week-day-name{color:var(--cal-primary)}.uc-week-day-header.uc-today .uc-week-day-num{background:var(--cal-primary);color:#fff}.uc-week-day-header.uc-today .uc-week-day-num:hover{background:var(--cal-primary-dark)}.uc-all-day-section{display:flex;border-bottom:1px solid var(--cal-border);flex-shrink:0;background:var(--cal-bg)}.uc-all-day-events{flex:1;position:relative;min-height:calc(var(--cal-event-height) + 6px);padding:2px 0}.uc-time-body{flex:1;min-height:0;overflow-y:auto;overflow-x:clip;position:relative;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-time-body::-webkit-scrollbar{width:6px}.uc-time-body::-webkit-scrollbar-track{background:0 0}.uc-time-body::-webkit-scrollbar-thumb{background:var(--cal-border-strong);border-radius:3px}.uc-time-grid-inner{display:flex;flex-direction:row;height:calc(24 * var(--cal-hour-height));position:relative;max-width:100%}.uc-time-gutter{width:var(--cal-time-col-width);flex-shrink:0;border-right:1px solid var(--cal-border);position:relative}.uc-hour-cell{height:var(--cal-hour-height);position:relative;display:flex;align-items:flex-start;justify-content:flex-end;padding-right:8px}.uc-hour-label{font-size:11px;font-weight:500;color:var(--cal-text-subtle);user-select:none;pointer-events:none;white-space:nowrap;transform:translateY(-50%);margin-top:1px}.uc-time-columns{flex:1;display:grid;grid-template-columns:repeat(var(--uc-col-count,7),1fr);position:relative}.uc-time-col{position:relative;border-right:1px solid var(--cal-border);height:calc(24 * var(--cal-hour-height));cursor:pointer}.uc-time-col:last-child{border-right:none}.uc-time-col.uc-today{background:var(--cal-today-bg)}.uc-hour-row{height:var(--cal-hour-height);border-bottom:1px solid var(--cal-border);position:relative;pointer-events:none}.uc-half-hour-line{position:absolute;top:50%;left:0;right:0;border-top:1px dashed var(--cal-border);pointer-events:none}.uc-timed-event{position:absolute;background:var(--cal-event-bg);color:var(--cal-event-text);border-radius:var(--cal-event-border-radius);padding:3px 6px;cursor:pointer;display:flex;flex-direction:column;gap:1px;font-size:12px;font-weight:500;border-left:3px solid rgba(0,0,0,.15);transition:filter var(--cal-transition),box-shadow var(--cal-transition);z-index:2;min-height:18px}.uc-timed-event:hover{filter:brightness(.92);box-shadow:0 2px 8px rgba(0,0,0,.15);z-index:1000}.uc-timed-event .uc-event-title{font-weight:600;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-timed-event .uc-event-time{font-size:11px;opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-timed-event--short{flex-direction:row;align-items:center;gap:4px}.uc-timed-event--short .uc-event-time{flex-shrink:0}.uc-timed-event--short .uc-event-title{flex:1;min-width:0}.uc-now-indicator{position:absolute;left:0;right:0;pointer-events:none;z-index:10;display:flex;align-items:center}.uc-now-dot{width:10px;height:10px;border-radius:50%;background:var(--cal-now-color);flex-shrink:0;margin-left:-5px}.uc-now-line{flex:1;height:2px;background:var(--cal-now-color)}.uc-list-view{padding:0;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-calendar:not([data-height-constrained=true]) .uc-list-view{max-height:650px}.uc-list-view::-webkit-scrollbar{width:6px}.uc-list-view::-webkit-scrollbar-track{background:0 0}.uc-list-view::-webkit-scrollbar-thumb{background:var(--cal-border-strong);border-radius:3px}.uc-list-empty{display:flex;align-items:center;justify-content:center;min-height:300px;color:var(--cal-text-muted);font-size:14px}.uc-list-date-group{margin-bottom:24px;overflow:visible}.uc-list-date-group:last-child{margin-bottom:0}.uc-list-events{background:var(--cal-bg);overflow:visible}.uc-list-event{display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-bottom:1px solid var(--cal-border);cursor:pointer;transition:background var(--cal-transition);position:relative;overflow:visible}.uc-list-date-header{font-size:14px;font-weight:600;color:var(--cal-text);padding:12px 16px;background:var(--cal-bg-secondary);border-bottom:1px solid var(--cal-border);position:sticky;top:0;z-index:1;overflow:visible}.uc-list-event:hover{background:var(--cal-hover)}.uc-list-event:last-child{border-bottom:none}.uc-list-event-indicator{width:8px;height:8px;border-radius:50%;margin-top:4px;flex-shrink:0}.uc-list-event-time{font-size:13px;font-weight:500;color:var(--cal-text-secondary);min-width:80px;flex-shrink:0}.uc-list-event-content{flex:1;min-width:0}.uc-list-event-title{font-size:14px;font-weight:500;color:var(--cal-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-tooltip-container{position:fixed;z-index:99999;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;pointer-events:none}.uc-tooltip-content{background:var(--tooltip-bg,var(--cal-tooltip-bg));color:var(--tooltip-text,var(--cal-tooltip-text));border:1px solid var(--cal-tooltip-border);box-shadow:var(--cal-tooltip-shadow);padding:var(--cal-tooltip-padding);border-radius:var(--cal-tooltip-radius);font-size:var(--cal-tooltip-font-size);font-weight:500;line-height:1.4;max-width:var(--tooltip-max-width,var(--cal-tooltip-max-width));white-space:pre-wrap;word-wrap:break-word;text-align:left}.uc-tooltip-content a{color:var(--cal-primary-light);text-decoration:underline;cursor:pointer}.uc-tooltip-content a:hover{color:var(--cal-primary)}.uc-tooltip-content b,.uc-tooltip-content strong{font-weight:700}.uc-tooltip-content em,.uc-tooltip-content i{font-style:italic}.uc-tooltip-arrow{position:absolute;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid var(--tooltip-bg,var(--cal-tooltip-bg));bottom:-6px;left:50%;transform:translateX(-50%)}.uc-tooltip-container.uc-tooltip-position-bottom .uc-tooltip-arrow{bottom:auto;top:-6px;border-top:none;border-bottom:6px solid var(--tooltip-bg,var(--cal-tooltip-bg))}@media (max-width:768px){.uc-view-btn{padding:5px 8px;font-size:12px}:root{--cal-time-col-width:52px;--cal-hour-height:52px;--cal-event-height:20px}.uc-week-day-num{width:24px;height:24px;font-size:13px}.uc-week-day-name{font-size:10px}.uc-hour-cell:nth-child(odd) .uc-hour-label{visibility:hidden}}.uc-calendar.uc-no-grid .uc-day-cell,.uc-calendar.uc-no-grid .uc-day-header-row,.uc-calendar.uc-no-grid .uc-day-name-row,.uc-calendar.uc-no-grid .uc-grid-line,.uc-calendar.uc-no-grid .uc-hour-cell,.uc-calendar.uc-no-grid .uc-time-col,.uc-calendar.uc-no-grid .uc-time-gutter,.uc-calendar.uc-no-grid .uc-week-day-header,.uc-calendar.uc-no-grid .uc-week-row{border:none!important}.uc-calendar.uc-no-grid .uc-all-day-section{border-top:none!important;border-left:none!important;border-right:none!important}.uc-calendar.uc-no-border{border:none!important}.uc-calendar.uc-dark,.uc-dark .uc-calendar{--cal-bg:#1f2937;--cal-bg-secondary:#111827;--cal-text:#f9fafb;--cal-text-subtle:#9ca3af;--cal-text-muted:#6b7280;--cal-border:#374151;--cal-border-strong:#4b5563;--cal-hover:#374151;--cal-hover-strong:#4b5563;--cal-selected-bg:#78716c;--cal-today-bg:#57534e;--cal-primary-light:#57534e;--cal-toolbar-bg:#111827;--cal-tooltip-bg:#374151;--cal-tooltip-text:#f9fafb;--cal-tooltip-border:#4b5563;--cal-loading-bg:rgba(31, 41, 55, 0.7)}.uc-calendar.uc-dragging{cursor:grabbing!important;user-select:none;-webkit-user-select:none}.uc-calendar.uc-dragging *{cursor:grabbing!important}.uc-dragging-element{opacity:.8;box-shadow:0 4px 12px rgba(0,0,0,.3);transition:none!important}.uc-calendar[data-drag-enabled] .uc-event-bar,.uc-calendar[data-drag-enabled] .uc-timed-event{cursor:grab}.uc-calendar[data-drag-enabled] .uc-event-bar:active,.uc-calendar[data-drag-enabled] .uc-timed-event:active{cursor:grabbing}.uc-calendar.uc-dark .uc-dragging-element{box-shadow:0 4px 12px rgba(0,0,0,.6)}.uc-resize-handle{position:absolute;bottom:0;left:0;right:0;height:8px;cursor:ns-resize;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s}.uc-resize-handle::after{content:'';width:24px;height:3px;background:rgba(255,255,255,.6);border-radius:2px}.uc-timed-event:hover .uc-resize-handle{opacity:1}.uc-calendar.uc-dragging .uc-resize-handle{cursor:ns-resize!important}.uc-resize-handle-right{position:absolute;top:2px;bottom:2px;right:2px;width:6px;cursor:ew-resize;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s}.uc-resize-handle-right::after{content:'';width:2px;height:12px;background:rgba(255,255,255,.6);border-radius:1px}.uc-event-bar:hover .uc-resize-handle-right{opacity:1}.uc-calendar.uc-dragging .uc-resize-handle-right{cursor:ew-resize!important}.uc-event-bar--list{display:flex;align-items:center;gap:6px;padding:2px 6px;background:0 0!important;overflow:hidden}.uc-event-dot{flex-shrink:0;width:8px;height:8px;border-radius:50%}.uc-event-bar--list .uc-event-time{flex-shrink:0;font-size:11px;font-weight:500;color:var(--cal-text);opacity:.8}.uc-event-bar--list .uc-event-title{flex:1;font-size:12px;color:var(--cal-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-calendar[data-drag-enabled] .uc-event-bar--list{cursor:grab}.uc-calendar[data-drag-enabled] .uc-event-bar--list:active{cursor:grabbing}@media print{.uc-toolbar{display:none}.uc-time-body{overflow:visible}.uc-calendar{border:none}}
12
+ :root{--cal-bg:#ffffff;--cal-bg-secondary:#f9fafb;--cal-text:#111827;--cal-text-subtle:#6b7280;--cal-text-muted:#9ca3af;--cal-border:#e5e7eb;--cal-border-strong:#d1d5db;--cal-primary:#4f46e5;--cal-primary-dark:#4338ca;--cal-primary-light:#eef2ff;--cal-event-bg:var(--cal-primary);--cal-event-text:#ffffff;--cal-event-border-radius:3px;--cal-today-bg:#eef2ff;--cal-today-text:var(--cal-primary);--cal-hover:#f9fafb;--cal-hover-strong:#f3f4f6;--cal-selected-bg:#ede9fe;--cal-font-family:inherit;--cal-font-size:13px;--cal-time-col-width:64px;--cal-hour-height:60px;--cal-event-height:22px;--cal-event-gap:2px;--cal-header-day-height:30px;--cal-day-name-height:36px;--cal-now-color:#ef4444;--cal-toolbar-bg:var(--cal-bg);--cal-radius:8px;--cal-shadow:0 1px 3px rgba(0,0,0,.08),0 1px 2px rgba(0,0,0,.06);--cal-transition:150ms ease;--cal-tooltip-bg:#1f2937;--cal-tooltip-text:#f9fafb;--cal-tooltip-border:#374151;--cal-tooltip-shadow:0 4px 12px rgba(0, 0, 0, 0.15);--cal-tooltip-max-width:250px;--cal-tooltip-padding:8px 12px;--cal-tooltip-radius:6px;--cal-tooltip-font-size:12px;--cal-tooltip-offset:8px;--cal-loading-bg:rgba(255, 255, 255, 0.7)}.uc-calendar{font-family:var(--cal-font-family);font-size:var(--cal-font-size);color:var(--cal-text);background:var(--cal-bg);border:1px solid var(--cal-border);border-radius:var(--cal-radius);overflow-x:visible;overflow-y:hidden;display:flex;flex-direction:column;height:100%;position:relative;-webkit-font-smoothing:antialiased}.uc-calendar *,.uc-calendar ::after,.uc-calendar ::before{box-sizing:border-box;margin:0;padding:0}.uc-toolbar{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1fr);align-items:center;gap:8px;padding:8px 10px;background:var(--cal-toolbar-bg);border-bottom:1px solid var(--cal-border);border-radius:var(--cal-radius) var(--cal-radius) 0 0;flex-shrink:0}.uc-toolbar-section{display:flex;align-items:center;gap:4px}.uc-toolbar-left{justify-self:start;min-width:0}.uc-toolbar-right{justify-self:end;min-width:0}.uc-toolbar-center{justify-self:center;min-width:0;overflow:visible;position:relative}.uc-title{font-size:14px;font-weight:600;color:var(--cal-text);white-space:nowrap;letter-spacing:-.01em;display:inline-flex;align-items:baseline;gap:4px;min-width:0;max-width:100%}.uc-title-main{text-transform:capitalize;overflow:hidden;text-overflow:ellipsis;flex-shrink:1}.uc-year-btn{background:0 0;border:none;font:inherit;font-weight:600;font-size:14px;color:var(--cal-primary);cursor:pointer;padding:1px 4px;border-radius:4px;line-height:inherit;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px;transition:background var(--cal-transition),color var(--cal-transition);flex-shrink:0}.uc-year-btn.uc-open,.uc-year-btn:hover{background:var(--cal-primary-light);text-decoration:none}.uc-year-picker{position:absolute;top:calc(100% + 8px);left:50%;transform:translateX(-50%);background:var(--cal-bg);border:1px solid var(--cal-border);border-radius:10px;box-shadow:0 4px 24px rgba(0,0,0,.12);padding:10px;z-index:200;min-width:210px}.uc-year-picker-nav{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.uc-year-range{font-size:12px;font-weight:600;color:var(--cal-text-subtle)}.uc-year-nav-btn{background:0 0;border:none;font-size:18px;line-height:1;color:var(--cal-text);cursor:pointer;padding:2px 7px;border-radius:5px;font-family:inherit;transition:background var(--cal-transition)}.uc-year-nav-btn:hover{background:var(--cal-hover-strong)}.uc-year-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:4px}.uc-year-item{background:0 0;border:none;border-radius:6px;font-size:13px;font-weight:500;font-family:inherit;color:var(--cal-text);cursor:pointer;padding:7px 4px;text-align:center;transition:background var(--cal-transition),color var(--cal-transition)}.uc-year-item:hover{background:var(--cal-hover-strong)}.uc-year-item.uc-today-year{color:var(--cal-primary);font-weight:700}.uc-year-item.uc-active{background:var(--cal-primary);color:#fff;font-weight:700}.uc-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;border:1px solid var(--cal-border);background:var(--cal-bg);color:var(--cal-text);border-radius:6px;padding:4px 6px;font-size:12px;font-family:inherit;font-weight:500;cursor:pointer;white-space:nowrap;line-height:1.4;transition:background var(--cal-transition),border-color var(--cal-transition),color var(--cal-transition);user-select:none}.uc-btn:hover{background:var(--cal-hover-strong);border-color:var(--cal-border-strong)}.uc-btn:active{background:var(--cal-selected-bg)}.uc-btn:focus-visible{outline:2px solid var(--cal-primary);outline-offset:2px}.uc-btn:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.uc-nav-btn{font-size:18px;padding:4px 6px;line-height:1;border-color:transparent;background:0 0}.uc-nav-btn:hover{border-color:var(--cal-border)}.uc-today-btn{padding:4px 6px}.uc-today-btn.uc-active{background:var(--cal-primary-light);color:var(--cal-primary);font-weight:600;border-color:transparent}.uc-view-switcher{display:flex;border:1px solid var(--cal-border);border-radius:6px;overflow:hidden}.uc-view-btn{border:none;border-radius:0;border-right:1px solid var(--cal-border);background:0 0;color:var(--cal-text-subtle);font-weight:500;padding:4px 6px;font-size:12px}.uc-view-btn:last-child{border-right:none}.uc-view-btn:hover{background:var(--cal-hover-strong);color:var(--cal-text);border-color:transparent}.uc-view-btn.uc-active{background:var(--cal-primary-light);color:var(--cal-primary);font-weight:600}.uc-view-dropdown{display:none;position:relative}.uc-view-dropdown-btn{display:flex;align-items:center;justify-content:center;padding:4px 8px;font-size:16px}.uc-view-icon{line-height:1}.uc-dropdown-menu{display:none;position:absolute;top:calc(100% + 4px);right:0;background:var(--cal-bg);border:1px solid var(--cal-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);z-index:1000;min-width:120px;overflow:hidden}.uc-view-dropdown.uc-open .uc-dropdown-menu{display:block}.uc-dropdown-item{display:block;width:100%;padding:8px 12px;background:0 0;border:none;color:var(--cal-text);font-size:13px;font-family:inherit;text-align:left;cursor:pointer;transition:background var(--cal-transition)}.uc-dropdown-item:hover{background:var(--cal-hover-strong)}.uc-dropdown-item.uc-active{background:var(--cal-primary-light);color:var(--cal-primary);font-weight:600}.uc-dropdown-item:disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.uc-dropdown-separator{height:1px;background:var(--cal-border);margin:4px 0}@media (min-width:641px){.uc-view-switcher{display:flex}.uc-view-dropdown{display:none}}@media (max-width:640px){.uc-view-switcher{display:none}.uc-view-dropdown{display:block}.uc-today-btn{display:none}}.uc-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--cal-loading-bg);z-index:100;pointer-events:none}.uc-spinner{width:28px;height:28px;border:3px solid var(--cal-border);border-top-color:var(--cal-primary);border-radius:50%;animation:uc-spin .6s linear infinite}@keyframes uc-spin{to{transform:rotate(360deg)}}.uc-view-container{flex:1;min-height:0;overflow:visible;display:flex;flex-direction:column}.uc-view-container:first-child .uc-month-header,.uc-view-container:first-child .uc-week-header{border-radius:var(--cal-radius) var(--cal-radius) 0 0}.uc-month-view{display:flex;flex-direction:column;flex:1;min-height:0;overflow-x:clip;overflow-y:visible;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-calendar[data-height-constrained=true] .uc-month-body,.uc-calendar[data-height-constrained=true] .uc-month-view{overflow-y:hidden;overflow-x:clip}.uc-month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid var(--cal-border);flex-shrink:0}.uc-month-day-name{height:var(--cal-day-name-height,36px);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--cal-text-subtle);user-select:none}.uc-month-body{flex:1;display:flex;flex-direction:column;min-height:0;overflow-x:clip;overflow-y:visible}.uc-week-row{flex:1;position:relative;min-height:0;overflow:visible;border-bottom:1px solid var(--cal-border)}.uc-week-row:last-child{border-bottom:none;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-week-cells{position:absolute;inset:0;display:grid;grid-template-columns:repeat(7,1fr);z-index:1;overflow:visible}.uc-day-cell{border-right:1px solid var(--cal-border);padding:4px 6px 4px 6px;cursor:pointer;transition:background var(--cal-transition)}.uc-day-cell:last-child{border-right:none}.uc-day-cell:hover{background:var(--cal-hover)}.uc-day-cell.uc-today{background:var(--cal-today-bg)}.uc-day-cell.uc-other-month .uc-day-number{color:var(--cal-text-muted)}.uc-day-cell.uc-day-align-center{text-align:center}.uc-day-cell.uc-day-align-right{text-align:right}.uc-day-cell.uc-day-align-center-picker{display:flex;align-items:center;justify-content:center;text-align:center}.uc-day-number{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;font-size:13px;font-weight:500;border-radius:50%;color:var(--cal-text);cursor:pointer;transition:background var(--cal-transition),color var(--cal-transition);line-height:1}.uc-day-number:hover{background:var(--cal-hover-strong)}.uc-today .uc-day-number{background:var(--cal-primary);color:#fff;font-weight:700}.uc-today .uc-day-number:hover{background:var(--cal-primary-dark)}.uc-day-cell.uc-selected{background:var(--cal-selected-bg)}.uc-day-cell.uc-selected .uc-day-number{background:var(--cal-primary);color:#fff;font-weight:700}.uc-day-cell.uc-selected .uc-day-number:hover{background:var(--cal-primary-dark)}.uc-day-cell.uc-in-range{background:var(--cal-primary-light)}.uc-day-cell.uc-range-end,.uc-day-cell.uc-range-start{background:var(--cal-selected-bg)}.uc-day-cell.uc-range-end .uc-day-number,.uc-day-cell.uc-range-start .uc-day-number{background:var(--cal-primary);color:#fff;font-weight:700}.uc-day-cell.uc-range-end .uc-day-number:hover,.uc-day-cell.uc-range-start .uc-day-number:hover{background:var(--cal-primary-dark)}.uc-week-events{position:absolute;inset:0;z-index:2;pointer-events:none;overflow:visible}.uc-event-bar{position:absolute;height:var(--cal-event-height);background:var(--cal-event-bg);color:var(--cal-event-text);border-radius:var(--cal-event-border-radius);display:flex;align-items:center;gap:4px;padding:0 6px;cursor:pointer;pointer-events:auto;white-space:nowrap;font-size:12px;font-weight:500;transition:filter var(--cal-transition),opacity var(--cal-transition);z-index:3}.uc-event-bar:hover{filter:brightness(.92);z-index:1000}.uc-event-bar:active{filter:brightness(.85)}.uc-event-bar.uc-continues-left{border-top-left-radius:0;border-bottom-left-radius:0}.uc-event-bar.uc-continues-right{border-top-right-radius:0;border-bottom-right-radius:0}.uc-event-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.uc-event-time{font-size:11px;opacity:.85;flex-shrink:0}.uc-more-link{position:absolute;height:16px;display:flex;align-items:center;padding:0 6px;font-size:10px;font-weight:600;color:var(--cal-text-subtle);cursor:pointer;pointer-events:auto;border-radius:var(--cal-event-border-radius);white-space:nowrap;transition:background var(--cal-transition),color var(--cal-transition);z-index:3}.uc-more-link:hover{background:var(--cal-hover-strong);color:var(--cal-text)}.uc-day-view,.uc-week-view{display:flex;flex-direction:column;flex:1;min-height:0;overflow-x:clip;overflow-y:visible;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-calendar:not([data-height-constrained=true]) .uc-day-view,.uc-calendar:not([data-height-constrained=true]) .uc-week-view{max-height:650px}.uc-week-header{display:flex;border-bottom:1px solid var(--cal-border);flex-shrink:0;background:var(--cal-bg)}.uc-time-gutter-spacer{width:var(--cal-time-col-width);flex-shrink:0;border-right:1px solid var(--cal-border)}.uc-all-day-label{display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--cal-text-muted);white-space:nowrap}.uc-week-day-headers{flex:1;display:grid;grid-template-columns:repeat(7,1fr)}.uc-week-day-headers.uc-day-header-single{grid-template-columns:1fr}.uc-week-day-header{padding:8px 4px;display:flex;flex-direction:column;align-items:center;gap:2px;border-right:1px solid var(--cal-border);cursor:default}.uc-week-day-header:last-child{border-right:none}.uc-week-day-name{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--cal-text-subtle);user-select:none}.uc-week-day-num{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;font-size:16px;font-weight:600;border-radius:50%;color:var(--cal-text);cursor:pointer;transition:background var(--cal-transition),color var(--cal-transition)}.uc-week-day-num:hover{background:var(--cal-hover-strong)}.uc-week-day-header.uc-today .uc-week-day-name{color:var(--cal-primary)}.uc-week-day-header.uc-today .uc-week-day-num{background:var(--cal-primary);color:#fff}.uc-week-day-header.uc-today .uc-week-day-num:hover{background:var(--cal-primary-dark)}.uc-all-day-section{display:flex;border-bottom:1px solid var(--cal-border);flex-shrink:0;background:var(--cal-bg)}.uc-all-day-events{flex:1;position:relative;min-height:calc(var(--cal-event-height) + 6px);padding:2px 0}.uc-time-body{flex:1;min-height:0;overflow-y:auto;overflow-x:clip;position:relative;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-time-body::-webkit-scrollbar{width:6px}.uc-time-body::-webkit-scrollbar-track{background:0 0}.uc-time-body::-webkit-scrollbar-thumb{background:var(--cal-border-strong);border-radius:3px}.uc-time-grid-inner{display:flex;flex-direction:row;height:calc(24 * var(--cal-hour-height));position:relative;max-width:100%}.uc-time-gutter{width:var(--cal-time-col-width);flex-shrink:0;border-right:1px solid var(--cal-border);position:relative}.uc-hour-cell{height:var(--cal-hour-height);position:relative;display:flex;align-items:flex-start;justify-content:flex-end;padding-right:8px}.uc-hour-label{font-size:11px;font-weight:500;color:var(--cal-text-subtle);user-select:none;pointer-events:none;white-space:nowrap;transform:translateY(-50%);margin-top:1px}.uc-time-columns{flex:1;display:grid;grid-template-columns:repeat(var(--uc-col-count,7),1fr);position:relative}.uc-time-col{position:relative;border-right:1px solid var(--cal-border);height:calc(24 * var(--cal-hour-height));cursor:pointer}.uc-time-col:last-child{border-right:none}.uc-time-col.uc-today{background:var(--cal-today-bg)}.uc-hour-row{height:var(--cal-hour-height);border-bottom:1px solid var(--cal-border);position:relative;pointer-events:none}.uc-half-hour-line{position:absolute;top:50%;left:0;right:0;border-top:1px dashed var(--cal-border);pointer-events:none}.uc-timed-event{position:absolute;background:var(--cal-event-bg);color:var(--cal-event-text);border-radius:var(--cal-event-border-radius);padding:3px 6px;cursor:pointer;display:flex;flex-direction:column;gap:1px;font-size:12px;font-weight:500;border-left:3px solid rgba(0,0,0,.15);transition:filter var(--cal-transition),box-shadow var(--cal-transition);z-index:2;min-height:18px}.uc-timed-event:hover{filter:brightness(.92);box-shadow:0 2px 8px rgba(0,0,0,.15);z-index:1000}.uc-timed-event .uc-event-title{font-weight:600;line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-timed-event .uc-event-time{font-size:11px;opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-timed-event--short{flex-direction:row;align-items:center;gap:4px}.uc-timed-event--short .uc-event-time{flex-shrink:0}.uc-timed-event--short .uc-event-title{flex:1;min-width:0}.uc-now-indicator{position:absolute;left:0;right:0;pointer-events:none;z-index:10;display:flex;align-items:center}.uc-now-dot{width:10px;height:10px;border-radius:50%;background:var(--cal-now-color);flex-shrink:0;margin-left:-5px}.uc-now-line{flex:1;height:2px;background:var(--cal-now-color)}.uc-list-view{padding:0;flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;border-radius:0 0 var(--cal-radius) var(--cal-radius)}.uc-calendar:not([data-height-constrained=true]) .uc-list-view{max-height:650px}.uc-list-view::-webkit-scrollbar{width:6px}.uc-list-view::-webkit-scrollbar-track{background:0 0}.uc-list-view::-webkit-scrollbar-thumb{background:var(--cal-border-strong);border-radius:3px}.uc-list-empty{display:flex;align-items:center;justify-content:center;min-height:300px;color:var(--cal-text-muted);font-size:14px}.uc-list-date-group{margin-bottom:24px;overflow:visible}.uc-list-date-group:last-child{margin-bottom:0}.uc-list-events{background:var(--cal-bg);overflow:visible}.uc-list-event{display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-bottom:1px solid var(--cal-border);cursor:pointer;transition:background var(--cal-transition);position:relative;overflow:visible}.uc-list-date-header{font-size:14px;font-weight:600;color:var(--cal-text);padding:12px 16px;background:var(--cal-bg-secondary);border-bottom:1px solid var(--cal-border);position:sticky;top:0;z-index:1;overflow:visible}.uc-list-event:hover{background:var(--cal-hover)}.uc-list-event:last-child{border-bottom:none}.uc-list-event-indicator{width:8px;height:8px;border-radius:50%;margin-top:4px;flex-shrink:0}.uc-list-event-time{font-size:13px;font-weight:500;color:var(--cal-text-secondary);min-width:80px;flex-shrink:0}.uc-list-event-content{flex:1;min-width:0}.uc-list-event-title{font-size:14px;font-weight:500;color:var(--cal-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-tooltip-container{position:fixed;z-index:99999;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;pointer-events:none}.uc-tooltip-content{background:var(--tooltip-bg,var(--cal-tooltip-bg));color:var(--tooltip-text,var(--cal-tooltip-text));border:1px solid var(--cal-tooltip-border);box-shadow:var(--cal-tooltip-shadow);padding:var(--cal-tooltip-padding);border-radius:var(--cal-tooltip-radius);font-size:var(--cal-tooltip-font-size);font-weight:500;line-height:1.4;max-width:var(--tooltip-max-width,var(--cal-tooltip-max-width));white-space:pre-wrap;word-wrap:break-word;text-align:left}.uc-tooltip-content a{color:var(--cal-primary-light);text-decoration:underline;cursor:pointer}.uc-tooltip-content a:hover{color:var(--cal-primary)}.uc-tooltip-content b,.uc-tooltip-content strong{font-weight:700}.uc-tooltip-content em,.uc-tooltip-content i{font-style:italic}.uc-tooltip-arrow{position:absolute;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid var(--tooltip-bg,var(--cal-tooltip-bg));bottom:-6px;left:50%;transform:translateX(-50%)}.uc-tooltip-container.uc-tooltip-position-bottom .uc-tooltip-arrow{bottom:auto;top:-6px;border-top:none;border-bottom:6px solid var(--tooltip-bg,var(--cal-tooltip-bg))}@media (max-width:768px){.uc-view-btn{padding:5px 8px;font-size:12px}:root{--cal-time-col-width:52px;--cal-hour-height:52px;--cal-event-height:20px}.uc-week-day-num{width:24px;height:24px;font-size:13px}.uc-week-day-name{font-size:10px}.uc-hour-cell:nth-child(odd) .uc-hour-label{visibility:hidden}}.uc-calendar.uc-no-grid .uc-day-cell,.uc-calendar.uc-no-grid .uc-day-header-row,.uc-calendar.uc-no-grid .uc-day-name-row,.uc-calendar.uc-no-grid .uc-grid-line,.uc-calendar.uc-no-grid .uc-hour-cell,.uc-calendar.uc-no-grid .uc-time-col,.uc-calendar.uc-no-grid .uc-time-gutter,.uc-calendar.uc-no-grid .uc-week-day-header,.uc-calendar.uc-no-grid .uc-week-row{border:none!important}.uc-calendar.uc-no-grid .uc-all-day-section{border-top:none!important;border-left:none!important;border-right:none!important}.uc-calendar.uc-no-border{border:none!important}.uc-calendar.uc-dark,.uc-dark .uc-calendar{--cal-bg:#1f2937;--cal-bg-secondary:#111827;--cal-text:#f9fafb;--cal-text-subtle:#9ca3af;--cal-text-muted:#6b7280;--cal-border:#374151;--cal-border-strong:#4b5563;--cal-hover:#374151;--cal-hover-strong:#4b5563;--cal-selected-bg:#78716c;--cal-today-bg:#57534e;--cal-primary-light:#57534e;--cal-toolbar-bg:#111827;--cal-tooltip-bg:#374151;--cal-tooltip-text:#f9fafb;--cal-tooltip-border:#4b5563;--cal-loading-bg:rgba(31, 41, 55, 0.7)}.uc-calendar.uc-dragging{cursor:grabbing!important;user-select:none;-webkit-user-select:none}.uc-calendar.uc-dragging *{cursor:grabbing!important}.uc-dragging-element{opacity:.8;box-shadow:0 4px 12px rgba(0,0,0,.3);transition:none!important}.uc-calendar[data-drag-enabled] .uc-event-bar,.uc-calendar[data-drag-enabled] .uc-timed-event{cursor:grab}.uc-calendar[data-drag-enabled] .uc-event-bar:active,.uc-calendar[data-drag-enabled] .uc-timed-event:active{cursor:grabbing}.uc-calendar.uc-dark .uc-dragging-element{box-shadow:0 4px 12px rgba(0,0,0,.6)}.uc-resize-handle{position:absolute;bottom:0;left:0;right:0;height:8px;cursor:ns-resize;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s}.uc-resize-handle::after{content:'';width:24px;height:3px;background:rgba(255,255,255,.6);border-radius:2px}.uc-timed-event:hover .uc-resize-handle{opacity:1}.uc-calendar.uc-dragging .uc-resize-handle{cursor:ns-resize!important}.uc-resize-handle-right{position:absolute;top:2px;bottom:2px;right:2px;width:6px;cursor:ew-resize;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s}.uc-resize-handle-right::after{content:'';width:2px;height:12px;background:rgba(255,255,255,.6);border-radius:1px}.uc-event-bar:hover .uc-resize-handle-right{opacity:1}.uc-calendar.uc-dragging .uc-resize-handle-right{cursor:ew-resize!important}.uc-event-bar--list{display:flex;align-items:center;gap:6px;padding:2px 6px;background:0 0!important;overflow:hidden}.uc-event-dot{flex-shrink:0;width:8px;height:8px;border-radius:50%}.uc-event-bar--list .uc-event-time{flex-shrink:0;font-size:11px;font-weight:500;color:var(--cal-text);opacity:.8}.uc-event-bar--list .uc-event-title{flex:1;font-size:12px;color:var(--cal-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.uc-calendar[data-drag-enabled] .uc-event-bar--list{cursor:grab}.uc-calendar[data-drag-enabled] .uc-event-bar--list:active{cursor:grabbing}@media print{.uc-toolbar{display:none}.uc-time-body{overflow:visible}.uc-calendar{border:none}}
@@ -1,14 +1,14 @@
1
1
  /**
2
- * SimpleCalendarJs v3.0.11
2
+ * SimpleCalendarJs v3.0.13
3
3
  * A clean, modern, and feature-rich JavaScript calendar component with zero dependencies
4
4
  *
5
5
  * @author Pedro Lopes <simplecalendarjs@gmail.com>
6
6
  * @homepage https://www.simplecalendarjs.com
7
7
  * @license SEE LICENSE IN LICENSE
8
8
  */
9
- !function(t,e){"undefined"!=typeof module&&module.exports?module.exports=e():"function"==typeof define&&define.amd?define([],e):t.SimpleCalendarJs=e()}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:this,function(){"use strict";function t(t){const e=new Date(t);return e.setHours(0,0,0,0),e}function e(t){const e=new Date(t);return e.setHours(23,59,59,999),e}function s(t,e){const s=new Date(t);return s.setDate(s.getDate()+e),s}function i(t,e){return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()}function n(t){return i(t,new Date)}function o(e,s){return Math.floor((t(s)-t(e))/864e5)}function a(t){return t instanceof Date?t:new Date(t)}function r(e,i){const n=e.getDay(),o=t(s(e,-((n-i+7)%7)));return Array.from({length:7},(t,e)=>s(o,e))}function l(t,e,i){const n=new Date(t,e,1),o=new Date(t,e+1,0),a=(n.getDay()-i+7)%7,r=7*Math.ceil((a+o.getDate())/7),l=s(n,-a);return Array.from({length:r},(t,e)=>s(l,e))}function c(t,e,s){const i={hour:"numeric",hour12:!s};return 0!==t.getMinutes()&&(i.minute="2-digit"),new Intl.DateTimeFormat(e,i).format(t)}function d(t,e,s){return Array.from({length:7},(i,n)=>{const o=new Date(2025,0,5+(e+n)%7);return new Intl.DateTimeFormat(t,{weekday:s}).format(o)})}function h(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function u(t){if(!t)return"";const e=document.createElement("div");e.innerHTML=t;const s=["B","I","STRONG","EM","SPAN","BR","A"];return function t(e){if(1===e.nodeType){if(!s.includes(e.nodeName)){const t=document.createTextNode(e.textContent||"");return void e.parentNode?.replaceChild(t,e)}const t=["class"];"A"===e.nodeName&&t.push("href"),"SPAN"===e.nodeName&&t.push("style");if(Array.from(e.attributes).forEach(s=>{t.includes(s.name)||e.removeAttribute(s.name)}),e.hasAttribute("class")){const t=(e.getAttribute("class")||"").replace(/[^a-zA-Z0-9\s\-_]/g,"");t?e.setAttribute("class",t):e.removeAttribute("class")}if("A"===e.nodeName&&e.hasAttribute("href")){const t=function(t){if(!t)return"#";const e=t.trim().toLowerCase();return["javascript:","data:","vbscript:","file:","about:"].some(t=>e.includes(t))?"#":["http://","https://","mailto:","tel:"].some(t=>e.startsWith(t))||e.startsWith("/")||e.startsWith("#")?t:"#"}(e.getAttribute("href")||"");e.setAttribute("href",t)}if("SPAN"===e.nodeName&&e.hasAttribute("style")){const t=function(t){if(!t)return"";const e=["color","background-color"];return t.split(";").filter(t=>{if(!t.trim())return!1;const s=t.indexOf(":");if(-1===s)return!1;const i=t.substring(0,s).trim().toLowerCase(),n=t.substring(s+1).trim();return!!e.includes(i)&&!/expression|url\(|import|@/i.test(n)}).join(";")}(e.getAttribute("style")||"");t?e.setAttribute("style",t):e.removeAttribute("style")}}Array.from(e.childNodes).forEach(e=>t(e))}(e),e.innerHTML}function p(t,e,s){if(!t)return"";return(void 0!==s?s:e)?u(t):h(t)}function _(t){return t=t.replace("#",""),{r:parseInt(t.substr(0,2),16),g:parseInt(t.substr(2,2),16),b:parseInt(t.substr(4,2),16)}}function v(t,e,s){t/=255,e/=255,s/=255;const i=Math.max(t,e,s),n=Math.min(t,e,s);let o,a,r=(i+n)/2;if(i===n)o=a=0;else{const l=i-n;switch(a=r>.5?l/(2-i-n):l/(i+n),i){case t:o=((e-s)/l+(e<s?6:0))/6;break;case e:o=((s-t)/l+2)/6;break;case s:o=((t-e)/l+4)/6}}return{h:360*o,s:100*a,l:100*r}}function g(t,e,s){let i,n,o;if(t/=360,s/=100,0===(e/=100))i=n=o=s;else{const a=(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t),r=s<.5?s*(1+e):s+e-s*e,l=2*s-r;i=a(l,r,t+1/3),n=a(l,r,t),o=a(l,r,t-1/3)}return{r:Math.round(255*i),g:Math.round(255*n),b:Math.round(255*o)}}function m(t,e,s){const i=t=>{const e=Math.max(0,Math.min(255,t)).toString(16);return 1===e.length?"0"+e:e};return"#"+i(t)+i(e)+i(s)}function y(t,e="high"){if(!t||t.startsWith("var(")||!t.match(/^#?[0-9A-Fa-f]{6}$/))return"var(--cal-event-text)";const s=_(t="#"+(t=t.replace("#",""))),i=(.299*s.r+.587*s.g+.114*s.b)/255>.5;if("high"===e)return i?"#000000":"#ffffff";const n=v(s.r,s.g,s.b);"medium"===e?(n.l=i?Math.max(10,n.l-50):Math.min(90,n.l+50),n.s=Math.min(100,n.s+10)):"low"===e&&(n.l=i?Math.max(15,n.l-30):Math.min(85,n.l+30),n.s=Math.min(100,n.s+5));const o=g(n.h,n.s,n.l);return m(o.r,o.g,o.b)}function w(t,e=25){if(!t||t.startsWith("var(")||!t.match(/^#?[0-9A-Fa-f]{6}$/))return"#4a5568";const s=_(t="#"+(t=t.replace("#",""))),i=v(s.r,s.g,s.b);let n;n=i.l>70?50:i.l>50?35:25,i.l=Math.max(0,i.l-n),i.s=Math.min(100,i.s+10);const o=g(i.h,i.s,i.l);return m(o.r,o.g,o.b)}const f={"en-US":{today:"Today",month:"Month",week:"Week",day:"Day",list:"List",allDay:"All-Day"},"en-GB":{today:"Today",month:"Month",week:"Week",day:"Day",list:"List",allDay:"All-Day"},"es-ES":{today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Lista",allDay:"Todo el día"},"es-MX":{today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Lista",allDay:"Todo el día"},"fr-FR":{today:"Aujourd'hui",month:"Mois",week:"Semaine",day:"Jour",list:"Liste",allDay:"Toute la journée"},"fr-CA":{today:"Aujourd'hui",month:"Mois",week:"Semaine",day:"Jour",list:"Liste",allDay:"Toute la journée"},"de-DE":{today:"Heute",month:"Monat",week:"Woche",day:"Tag",list:"Liste",allDay:"Ganztägig"},"it-IT":{today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Elenco",allDay:"Tutto il giorno"},"pt-PT":{today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista",allDay:"Dia todo"},"pt-BR":{today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista",allDay:"Dia todo"},"nl-NL":{today:"Vandaag",month:"Maand",week:"Week",day:"Dag",list:"Lijst",allDay:"Hele dag"},"pl-PL":{today:"Dzisiaj",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Lista",allDay:"Cały dzień"},"ru-RU":{today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Список",allDay:"Весь день"},"tr-TR":{today:"Bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Liste",allDay:"Tüm gün"},"sv-SE":{today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Lista",allDay:"Heldag"},"da-DK":{today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Liste",allDay:"Hele dagen"},"fi-FI":{today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Lista",allDay:"Koko päivä"},"no-NO":{today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Liste",allDay:"Hele dagen"},"cs-CZ":{today:"Dnes",month:"Měsíc",week:"Týden",day:"Den",list:"Seznam",allDay:"Celý den"},"hu-HU":{today:"Ma",month:"Hónap",week:"Hét",day:"Nap",list:"Lista",allDay:"Egész nap"},"ro-RO":{today:"Astăzi",month:"Lună",week:"Săptămână",day:"Zi",list:"Listă",allDay:"Toată ziua"},"el-GR":{today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Λίστα",allDay:"Ολοήμερο"},"ja-JP":{today:"今日",month:"月",week:"週",day:"日",list:"リスト",allDay:"終日"},"ko-KR":{today:"오늘",month:"월",week:"주",day:"일",list:"목록",allDay:"종일"},"zh-CN":{today:"今天",month:"月",week:"周",day:"日",list:"列表",allDay:"全天"},"zh-TW":{today:"今天",month:"月",week:"週",day:"日",list:"列表",allDay:"全天"},"ar-SA":{today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"قائمة",allDay:"طوال اليوم"},"he-IL":{today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"רשימה",allDay:"כל היום"},"hi-IN":{today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"सूची",allDay:"पूरे दिन"},"th-TH":{today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"รายการ",allDay:"ตลอดวัน"},"vi-VN":{today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Danh sách",allDay:"Cả ngày"},"id-ID":{today:"Hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Daftar",allDay:"Sepanjang hari"},"ms-MY":{today:"Hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Senarai",allDay:"Sepanjang hari"},"uk-UA":{today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Список",allDay:"Весь день"}};function b(t,e){const s=t.split("-")[0];return(f[t]||f[s]||f["en-US"])[e]}function D(t){return!!t.allDay||!i(t.start,t.end)}function $(s,n){const a=t(n[0]),r=e(n[n.length-1]),l=s.filter(t=>t.start<=r&&t.end>=a).map(s=>({...s,_visStart:new Date(Math.max(s.start.getTime(),a.getTime())),_visEnd:new Date(Math.min(s.end.getTime(),r.getTime())),_isStart:t(s.start)>=a,_isEnd:e(s.end)<=r}));l.sort((t,e)=>{const s=t.start-e.start;if(0!==s)return s;const i=o(t._visStart,t._visEnd);return o(e._visStart,e._visEnd)-i||(t._origStart||t.start)-(e._origStart||e.start)});const c=[],d=[];for(const t of l){const e=n.findIndex(e=>i(e,t._visStart)),s=n.findIndex(e=>i(e,t._visEnd)),o=-1===e?0:e,a=-1===s?n.length-1:s;let r=c.findIndex(t=>t<=o);-1===r?(r=c.length,c.push(a+1)):c[r]=a+1,d.push({event:t,startCol:o,endCol:a,slot:r,isStart:t._isStart,isEnd:t._isEnd})}return d}
9
+ !function(t,e){"undefined"!=typeof module&&module.exports?module.exports=e():"function"==typeof define&&define.amd?define([],e):t.SimpleCalendarJs=e()}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:this,function(){"use strict";function t(t){const e=new Date(t);return e.setHours(0,0,0,0),e}function e(t){const e=new Date(t);return e.setHours(23,59,59,999),e}function s(t,e){const s=new Date(t);return s.setDate(s.getDate()+e),s}function i(t,e){return t.getFullYear()===e.getFullYear()&&t.getMonth()===e.getMonth()&&t.getDate()===e.getDate()}function n(t){return i(t,new Date)}function a(e,s){return Math.floor((t(s)-t(e))/864e5)}function o(t){return t instanceof Date?t:new Date(t)}function r(e,i){const n=e.getDay(),a=t(s(e,-((n-i+7)%7)));return Array.from({length:7},(t,e)=>s(a,e))}function l(t,e,i){const n=new Date(t,e,1),a=new Date(t,e+1,0),o=(n.getDay()-i+7)%7,r=7*Math.ceil((o+a.getDate())/7),l=s(n,-o);return Array.from({length:r},(t,e)=>s(l,e))}function c(t,e,s){const i={hour:"numeric",hour12:!s};return 0!==t.getMinutes()&&(i.minute="2-digit"),new Intl.DateTimeFormat(e,i).format(t)}function d(t,e,s){return Array.from({length:7},(i,n)=>{const a=new Date(2025,0,5+(e+n)%7);return new Intl.DateTimeFormat(t,{weekday:s}).format(a)})}function h(t){return String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function u(t){if(!t)return"";const e=document.createElement("div");e.innerHTML=t;const s=["B","I","STRONG","EM","SPAN","BR","A"];return function t(e){if(1===e.nodeType){if(!s.includes(e.nodeName)){const t=document.createTextNode(e.textContent||"");return void e.parentNode?.replaceChild(t,e)}const t=["class"];"A"===e.nodeName&&t.push("href"),"SPAN"===e.nodeName&&t.push("style");if(Array.from(e.attributes).forEach(s=>{t.includes(s.name)||e.removeAttribute(s.name)}),e.hasAttribute("class")){const t=(e.getAttribute("class")||"").replace(/[^a-zA-Z0-9\s\-_]/g,"");t?e.setAttribute("class",t):e.removeAttribute("class")}if("A"===e.nodeName&&e.hasAttribute("href")){const t=function(t){if(!t)return"#";const e=t.trim().toLowerCase();return["javascript:","data:","vbscript:","file:","about:"].some(t=>e.includes(t))?"#":["http://","https://","mailto:","tel:"].some(t=>e.startsWith(t))||e.startsWith("/")||e.startsWith("#")?t:"#"}(e.getAttribute("href")||"");e.setAttribute("href",t)}if("SPAN"===e.nodeName&&e.hasAttribute("style")){const t=function(t){if(!t)return"";const e=["color","background-color"];return t.split(";").filter(t=>{if(!t.trim())return!1;const s=t.indexOf(":");if(-1===s)return!1;const i=t.substring(0,s).trim().toLowerCase(),n=t.substring(s+1).trim();return!!e.includes(i)&&!/expression|url\(|import|@/i.test(n)}).join(";")}(e.getAttribute("style")||"");t?e.setAttribute("style",t):e.removeAttribute("style")}}Array.from(e.childNodes).forEach(e=>t(e))}(e),e.innerHTML}function p(t,e,s){if(!t)return"";return(void 0!==s?s:e)?u(t):h(t)}function _(t){return t=t.replace("#",""),{r:parseInt(t.substr(0,2),16),g:parseInt(t.substr(2,2),16),b:parseInt(t.substr(4,2),16)}}function v(t,e,s){t/=255,e/=255,s/=255;const i=Math.max(t,e,s),n=Math.min(t,e,s);let a,o,r=(i+n)/2;if(i===n)a=o=0;else{const l=i-n;switch(o=r>.5?l/(2-i-n):l/(i+n),i){case t:a=((e-s)/l+(e<s?6:0))/6;break;case e:a=((s-t)/l+2)/6;break;case s:a=((t-e)/l+4)/6}}return{h:360*a,s:100*o,l:100*r}}function g(t,e,s){let i,n,a;if(t/=360,s/=100,0===(e/=100))i=n=a=s;else{const o=(t,e,s)=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+(e-t)*(2/3-s)*6:t),r=s<.5?s*(1+e):s+e-s*e,l=2*s-r;i=o(l,r,t+1/3),n=o(l,r,t),a=o(l,r,t-1/3)}return{r:Math.round(255*i),g:Math.round(255*n),b:Math.round(255*a)}}function m(t,e,s){const i=t=>{const e=Math.max(0,Math.min(255,t)).toString(16);return 1===e.length?"0"+e:e};return"#"+i(t)+i(e)+i(s)}function y(t,e="high"){if(!t||t.startsWith("var(")||!t.match(/^#?[0-9A-Fa-f]{6}$/))return"var(--cal-event-text)";const s=_(t="#"+(t=t.replace("#",""))),i=(.299*s.r+.587*s.g+.114*s.b)/255>.5;if("high"===e)return i?"#000000":"#ffffff";const n=v(s.r,s.g,s.b);"medium"===e?(n.l=i?Math.max(10,n.l-50):Math.min(90,n.l+50),n.s=Math.min(100,n.s+10)):"low"===e&&(n.l=i?Math.max(15,n.l-30):Math.min(85,n.l+30),n.s=Math.min(100,n.s+5));const a=g(n.h,n.s,n.l);return m(a.r,a.g,a.b)}function w(t,e=25){if(!t||t.startsWith("var(")||!t.match(/^#?[0-9A-Fa-f]{6}$/))return"#4a5568";const s=_(t="#"+(t=t.replace("#",""))),i=v(s.r,s.g,s.b);let n;n=i.l>70?50:i.l>50?35:25,i.l=Math.max(0,i.l-n),i.s=Math.min(100,i.s+10);const a=g(i.h,i.s,i.l);return m(a.r,a.g,a.b)}const f={"en-US":{today:"Today",month:"Month",week:"Week",day:"Day",list:"List",allDay:"All-Day"},"en-GB":{today:"Today",month:"Month",week:"Week",day:"Day",list:"List",allDay:"All-Day"},"es-ES":{today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Lista",allDay:"Todo el día"},"es-MX":{today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Lista",allDay:"Todo el día"},"fr-FR":{today:"Aujourd'hui",month:"Mois",week:"Semaine",day:"Jour",list:"Liste",allDay:"Toute la journée"},"fr-CA":{today:"Aujourd'hui",month:"Mois",week:"Semaine",day:"Jour",list:"Liste",allDay:"Toute la journée"},"de-DE":{today:"Heute",month:"Monat",week:"Woche",day:"Tag",list:"Liste",allDay:"Ganztägig"},"it-IT":{today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Elenco",allDay:"Tutto il giorno"},"pt-PT":{today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista",allDay:"Dia todo"},"pt-BR":{today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista",allDay:"Dia todo"},"nl-NL":{today:"Vandaag",month:"Maand",week:"Week",day:"Dag",list:"Lijst",allDay:"Hele dag"},"pl-PL":{today:"Dzisiaj",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Lista",allDay:"Cały dzień"},"ru-RU":{today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Список",allDay:"Весь день"},"tr-TR":{today:"Bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Liste",allDay:"Tüm gün"},"sv-SE":{today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Lista",allDay:"Heldag"},"da-DK":{today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Liste",allDay:"Hele dagen"},"fi-FI":{today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Lista",allDay:"Koko päivä"},"no-NO":{today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Liste",allDay:"Hele dagen"},"cs-CZ":{today:"Dnes",month:"Měsíc",week:"Týden",day:"Den",list:"Seznam",allDay:"Celý den"},"hu-HU":{today:"Ma",month:"Hónap",week:"Hét",day:"Nap",list:"Lista",allDay:"Egész nap"},"ro-RO":{today:"Astăzi",month:"Lună",week:"Săptămână",day:"Zi",list:"Listă",allDay:"Toată ziua"},"el-GR":{today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Λίστα",allDay:"Ολοήμερο"},"ja-JP":{today:"今日",month:"月",week:"週",day:"日",list:"リスト",allDay:"終日"},"ko-KR":{today:"오늘",month:"월",week:"주",day:"일",list:"목록",allDay:"종일"},"zh-CN":{today:"今天",month:"月",week:"周",day:"日",list:"列表",allDay:"全天"},"zh-TW":{today:"今天",month:"月",week:"週",day:"日",list:"列表",allDay:"全天"},"ar-SA":{today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"قائمة",allDay:"طوال اليوم"},"he-IL":{today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"רשימה",allDay:"כל היום"},"hi-IN":{today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"सूची",allDay:"पूरे दिन"},"th-TH":{today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"รายการ",allDay:"ตลอดวัน"},"vi-VN":{today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Danh sách",allDay:"Cả ngày"},"id-ID":{today:"Hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Daftar",allDay:"Sepanjang hari"},"ms-MY":{today:"Hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Senarai",allDay:"Sepanjang hari"},"uk-UA":{today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Список",allDay:"Весь день"}};function b(t,e){const s=t.split("-")[0];return(f[t]||f[s]||f["en-US"])[e]}function D(t){return!!t.allDay||!i(t.start,t.end)}function S(s,n){const o=t(n[0]),r=e(n[n.length-1]),l=s.filter(t=>t.start<=r&&t.end>=o).map(s=>({...s,_visStart:new Date(Math.max(s.start.getTime(),o.getTime())),_visEnd:new Date(Math.min(s.end.getTime(),r.getTime())),_isStart:t(s.start)>=o,_isEnd:e(s.end)<=r}));l.sort((t,e)=>{const s=t.start-e.start;if(0!==s)return s;const i=a(t._visStart,t._visEnd);return a(e._visStart,e._visEnd)-i||(t._origStart||t.start)-(e._origStart||e.start)});const c=[],d=[];for(const t of l){const e=n.findIndex(e=>i(e,t._visStart)),s=n.findIndex(e=>i(e,t._visEnd)),a=-1===e?0:e,o=-1===s?n.length-1:s;let r=c.findIndex(t=>t<=a);-1===r?(r=c.length,c.push(o+1)):c[r]=o+1,d.push({event:t,startCol:a,endCol:o,slot:r,isStart:t._isStart,isEnd:t._isEnd})}return d}
10
10
  /* ============================================================
11
11
  ES MODULE EXPORT
12
12
  Also available as window.SimpleCalendarJs via the IIFE wrapper.
13
13
  ============================================================ */
14
- return class{constructor(e,s={}){if("string"==typeof e){if(this._el=document.querySelector(e),!this._el)throw new Error(`SimpleCalendarJs: no element for "${e}"`)}else this._el=e;this._opts=Object.assign({defaultView:"month",defaultDate:null,weekStartsOn:0,locale:"default",weekdayFormat:"short",use24Hour:!1,showTimeInItems:!0,showGridLines:!0,monthTimedEventStyle:"list",monthDayNumberAlign:"left",showToolbar:!0,showTodayButton:!0,showNavigation:!0,showTitle:!0,showYearPicker:!0,showViewSwitcher:!0,showTooltips:!0,tooltipBgColor:null,tooltipTextColor:null,tooltipMaxWidth:250,tooltipDelay:400,tooltipAllowHtml:!0,showBorder:!0,listDaysForward:30,enabledViews:["month","week","day"],enableDragDrop:!1,enableResize:!1,autoContrastText:!1,contrastLevel:"high",allowHtmlInEvents:!0,showEventBorder:!1,fetchEvents:null,onEventClick:null,onSlotClick:null,onViewChange:null,onNavigate:null,onEventDrop:null},s),this._view=this._opts.defaultView,this._date=t(this._opts.defaultDate||new Date),this._events=[],this._cachedRange=null,this._cachedEvents=[],this._nowInterval=null,this._yearPickerOpen=!1,this._yearPickerBase=0,this._yearOutsideHandler=null,this._dragState=null,this._clickSuppressed=!1,this._tooltipElement=null,this._tooltipTimeout=null,this._currentTooltipTarget=null,this._root=document.createElement("div"),this._root.className="uc-calendar",this._opts.showGridLines||this._root.classList.add("uc-no-grid"),this._opts.showBorder||this._root.classList.add("uc-no-border"),this._el.appendChild(this._root),this._onClick=this._handleClick.bind(this),this._root.addEventListener("click",this._onClick),this._onMouseOver=this._handleTooltipHover.bind(this),this._onMouseOut=this._handleTooltipMouseOut.bind(this),this._root.addEventListener("mouseover",this._onMouseOver),this._root.addEventListener("mouseout",this._onMouseOut),(this._opts.enableDragDrop||this._opts.enableResize)&&(this._onMouseDown=this._handleDragStart.bind(this),this._onMouseMoveGlobal=this._handleDragMove.bind(this),this._onMouseUp=this._handleDragEnd.bind(this),this._onTouchStart=this._handleDragStart.bind(this),this._onTouchMove=this._handleDragMove.bind(this),this._onTouchEnd=this._handleDragEnd.bind(this),this._onKeyDown=this._handleDragKeyDown.bind(this),this._root.addEventListener("mousedown",this._onMouseDown),document.addEventListener("mousemove",this._onMouseMoveGlobal),document.addEventListener("mouseup",this._onMouseUp),this._root.addEventListener("touchstart",this._onTouchStart,{passive:!0}),document.addEventListener("touchmove",this._onTouchMove,{passive:!1}),document.addEventListener("touchend",this._onTouchEnd),document.addEventListener("keydown",this._onKeyDown),this._opts.enableDragDrop&&this._root.setAttribute("data-drag-enabled","true"),this._opts.enableResize&&this._root.setAttribute("data-resize-enabled","true")),this._root.innerHTML=this._buildShell(),this._resizeObserver=new ResizeObserver(()=>{this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._renderView()},100)}),this._resizeObserver.observe(this._root),this._fetchAndRender(),this._startNowUpdater()}setView(t){t!==this._view&&(this._view=t,this._opts.onViewChange&&this._opts.onViewChange(t),this._fetchAndRender())}navigate(t){const e=new Date(this._date);"month"===this._view?(e.setMonth(e.getMonth()+t),e.setDate(1)):"week"===this._view?e.setDate(e.getDate()+7*t):e.setDate(e.getDate()+t),this._date=e;const s=this._getRange();this._opts.onNavigate&&this._opts.onNavigate(s.start,s.end),this._fetchAndRender()}goToToday(){this._date=t(new Date);const e=this._getRange();this._opts.onNavigate&&this._opts.onNavigate(e.start,e.end),this._fetchAndRender()}goToDate(e){this._date=t(a(e)),this._fetchAndRender()}refresh(){this._cachedRange=null,this._cachedEvents=[],this._fetchAndRender()}destroy(){this._nowInterval&&clearInterval(this._nowInterval),this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeObserver&&this._resizeObserver.disconnect(),this._yearOutsideHandler&&document.removeEventListener("click",this._yearOutsideHandler),this._root.removeEventListener("click",this._onClick),this._root.removeEventListener("mouseover",this._onMouseOver),this._root.removeEventListener("mouseout",this._onMouseOut),this._tooltipElement&&(this._tooltipElement.remove(),this._tooltipElement=null),this._tooltipTimeout&&(clearTimeout(this._tooltipTimeout),this._tooltipTimeout=null),(this._opts.enableDragDrop||this._opts.enableResize)&&(this._root.removeEventListener("mousedown",this._onMouseDown),document.removeEventListener("mousemove",this._onMouseMoveGlobal),document.removeEventListener("mouseup",this._onMouseUp),this._root.removeEventListener("touchstart",this._onTouchStart),document.removeEventListener("touchmove",this._onTouchMove),document.removeEventListener("touchend",this._onTouchEnd),document.removeEventListener("keydown",this._onKeyDown)),this._root.remove()}_getRange(){if("month"===this._view){const s=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn);return{start:t(s[0]),end:e(s[s.length-1])}}if("week"===this._view){const s=r(this._date,this._opts.weekStartsOn);return{start:t(s[0]),end:e(s[6])}}if("list"===this._view){const t=new Date,e=new Date(t);return e.setDate(e.getDate()+this._opts.listDaysForward),{start:t,end:e}}return{start:t(this._date),end:e(this._date)}}_getMonthGridRange(){const s=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn);return{start:t(s[0]),end:e(s[s.length-1])}}async _fetchAndRender(){if(this._updateToolbar(),!this._opts.fetchEvents)return void this._renderView();const t=this._getRange();if(this._cachedRange&&this._cachedRange.start<=t.start&&this._cachedRange.end>=t.end)return this._events=this._cachedEvents.filter(e=>e.end>=t.start&&e.start<=t.end),void this._renderView();const e=this._root.querySelector(".uc-loading");e&&(e.style.display="flex");try{let e;e="list"===this._view?t:this._getMonthGridRange();const s=(await this._opts.fetchEvents(e.start,e.end)||[]).map(t=>({...t,start:a(t.start),end:a(t.end)}));this._cachedRange={start:e.start,end:e.end},this._cachedEvents=s,this._events=s.filter(e=>e.end>=t.start&&e.start<=t.end)}catch(t){this._events=[]}e&&(e.style.display="none"),this._renderView()}_renderView(){const t=this._root.querySelector(".uc-view-container");if(!t)return;const e=this._root.parentElement;if(e&&e.style.height&&"auto"!==e.style.height&&""!==e.style.height?this._root.setAttribute("data-height-constrained","true"):this._root.removeAttribute("data-height-constrained"),"month"===this._view)t.innerHTML=this._buildMonthView();else if("week"===this._view){const e=r(this._date,this._opts.weekStartsOn);t.innerHTML=this._buildWeekOrDayView(e),this._scrollToBusinessHours(t)}else"list"===this._view?t.innerHTML=this._buildListView():(t.innerHTML=this._buildWeekOrDayView([this._date]),this._scrollToBusinessHours(t))}_scrollToBusinessHours(t){requestAnimationFrame(()=>{const e=t.querySelector(".uc-time-body");if(!e)return;const s=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60;e.scrollTop=7*s})}_renderToolbar(){const t=this._root.querySelector(".uc-toolbar");if(!t)return;const e=document.createElement("div");e.innerHTML=this._buildToolbar(),this._root.replaceChild(e.firstElementChild,t)}_buildShell(){return`\n ${this._buildToolbar()}\n <div class="uc-loading" style="display:none">\n <div class="uc-spinner"></div>\n </div>\n <div class="uc-view-container"></div>\n `}_updateToolbar(){const t=this._root.querySelector(".uc-toolbar");if(t){const e=document.createElement("div");e.innerHTML=this._buildToolbar();const s=e.firstElementChild;s&&t.replaceWith(s)}}_buildToolbar(){if(!this._opts.showToolbar)return"";const t=this._date.getFullYear(),e=(new Date).getFullYear();let s,n=!0;if("month"===this._view)s=new Intl.DateTimeFormat(this._opts.locale,{month:"long"}).format(this._date);else if("week"===this._view){const t=r(this._date,this._opts.weekStartsOn);s=function(t,e,s){if(t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear())return`${new Intl.DateTimeFormat(s,{month:"long"}).format(t)} ${t.getDate()}–${e.getDate()}`;const i=t=>new Intl.DateTimeFormat(s,{month:"short",day:"numeric"}).format(t);return`${i(t)} – ${i(e)}`}(t[0],t[6],this._opts.locale)}else if("list"===this._view){const t=new Date,e=new Date(t);e.setDate(e.getDate()+this._opts.listDaysForward),s=function(t,e,s){if(t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear())return`${new Intl.DateTimeFormat(s,{month:"long"}).format(t)} ${t.getDate()}–${e.getDate()}, ${t.getFullYear()}`;const i=t=>new Intl.DateTimeFormat(s,{month:"short",day:"numeric"}).format(t);return`${i(t)} – ${i(e)}, ${e.getFullYear()}`}(t,e,this._opts.locale),n=!1}else s=new Intl.DateTimeFormat(this._opts.locale,{weekday:"long",month:"long",day:"numeric"}).format(this._date);let o="";if(this._opts.showYearPicker&&this._yearPickerOpen){const s=this._yearPickerBase,i=Array.from({length:12},(i,n)=>{const o=s+n,a=o===t;return`<button class="${"uc-year-item"+(a?" uc-active":"")+(o===e&&!a?" uc-today-year":"")}" data-action="select-year" data-year="${o}">${o}</button>`}).join("");o=`\n <div class="uc-year-picker">\n <div class="uc-year-picker-nav">\n <button class="uc-year-nav-btn" data-action="year-prev" aria-label="Previous years">&#8249;</button>\n <span class="uc-year-range">${s} – ${s+11}</span>\n <button class="uc-year-nav-btn" data-action="year-next" aria-label="Next years">&#8250;</button>\n </div>\n <div class="uc-year-grid">${i}</div>\n </div>`}const a=this._opts.locale,l=b(a,"today"),c=b(a,"month"),d=b(a,"week"),u=b(a,"day"),p=b(a,"list");let _="";if(this._opts.showNavigation||this._opts.showTodayButton){const t="list"===this._view?" disabled":"",e=this._opts.showNavigation?`<button class="uc-btn uc-nav-btn" data-action="prev" aria-label="Previous"${t}>&#8249;</button>`:"",s=new Date,n=i(this._date,s)?" uc-active":"";_=`\n <div class="uc-toolbar-section uc-toolbar-left">\n ${e}${this._opts.showTodayButton?`<button class="uc-btn uc-today-btn${n}" data-action="today"${t}>${h(l)}</button>`:""}${this._opts.showNavigation?`<button class="uc-btn uc-nav-btn" data-action="next" aria-label="Next"${t}>&#8250;</button>`:""}\n </div>`}let v="";if(this._opts.showTitle){const e=n?this._opts.showYearPicker?`<button class="uc-year-btn${this._yearPickerOpen?" uc-open":""}" data-action="year-pick" aria-label="Select year">${t}</button>`:t:"";v=`\n <div class="uc-toolbar-section uc-toolbar-center">\n <h2 class="uc-title">\n <span class="uc-title-main">${h(s)}</span>\n ${e}\n </h2>\n ${o}\n </div>`}let g="";if(this._opts.showViewSwitcher){const t=this._opts.enabledViews,e=[],s=[];if(t.includes("month")&&(e.push(`<button class="uc-btn uc-view-btn${"month"===this._view?" uc-active":""}" data-view="month">${h(c)}</button>`),s.push(`<button class="uc-dropdown-item${"month"===this._view?" uc-active":""}" data-view="month">${h(c)}</button>`)),t.includes("week")&&(e.push(`<button class="uc-btn uc-view-btn${"week"===this._view?" uc-active":""}" data-view="week">${h(d)}</button>`),s.push(`<button class="uc-dropdown-item${"week"===this._view?" uc-active":""}" data-view="week">${h(d)}</button>`)),t.includes("day")&&(e.push(`<button class="uc-btn uc-view-btn${"day"===this._view?" uc-active":""}" data-view="day">${h(u)}</button>`),s.push(`<button class="uc-dropdown-item${"day"===this._view?" uc-active":""}" data-view="day">${h(u)}</button>`)),t.includes("list")&&(e.push(`<button class="uc-btn uc-view-btn${"list"===this._view?" uc-active":""}" data-view="list">${h(p)}</button>`),s.push(`<button class="uc-dropdown-item${"list"===this._view?" uc-active":""}" data-view="list">${h(p)}</button>`)),e.length>0){const t=b(a,"today"),n=i(this._date,new Date)?" uc-active":"",o="list"===this._view?" disabled":"";s.push('<div class="uc-dropdown-separator"></div>'),s.push(`<button class="uc-dropdown-item${n}" data-action="today"${o}>${h(t)}</button>`),g=`\n <div class="uc-toolbar-section uc-toolbar-right">\n <div class="uc-view-switcher">\n ${e.join("")}\n </div>\n <div class="uc-view-dropdown">\n <button class="uc-btn uc-view-dropdown-btn" aria-label="View options">\n <span class="uc-view-icon">⊞</span>\n </button>\n <div class="uc-dropdown-menu">\n ${s.join("")}\n </div>\n </div>\n </div>`}}return`\n <div class="uc-toolbar">\n ${_}${v}${g}\n </div>\n `}_buildMonthView(){const{locale:s,weekStartsOn:i}=this._opts,n=l(this._date.getFullYear(),this._date.getMonth(),i),o=d(s,i,this._opts.weekdayFormat),a=this._events.map(s=>({...s,_origStart:s.start,start:D(s)?t(s.start):s.start,end:D(s)?e(s.end):s.end})),r=o.map(t=>`<div class="uc-month-day-name">${h(t)}</div>`).join(""),c=[];for(let t=0;t<n.length;t+=7)c.push(n.slice(t,t+7));let u;const p=this._root.parentElement,_=p&&p.style.height&&"auto"!==p.style.height&&""!==p.style.height;if(_){const t=p.clientHeight,e=this._root.querySelector(".uc-toolbar"),s=this._root.querySelector(".uc-month-header"),i=t-(e?e.offsetHeight:50)-(s?s.offsetHeight:36)-2,n=c.length,o=Math.floor(i/n),a=Math.floor((o-30-28)/24);u=Math.max(0,a)}else u=1/0;const v=_?Math.floor((p.clientHeight-(this._root.querySelector(".uc-toolbar")?.offsetHeight||50)-(this._root.querySelector(".uc-month-header")?.offsetHeight||36)-2)/c.length):null;return`\n <div class="uc-month-view">\n <div class="uc-month-header">${r}</div>\n <div class="uc-month-body">${c.map(t=>this._buildWeekRow(t,a,u,v)).join("")}</div>\n </div>\n `}_buildWeekRow(t,e,s,o=null){const a=this._date.getMonth(),r=e.filter(D),l=e.filter(t=>!D(t)),d=$(r,t),u=Array.from({length:7},()=>new Set);for(const{startCol:t,endCol:e,slot:s}of d)for(let i=t;i<=e;i++)u[i].add(s);const _=t.map(t=>l.filter(e=>i(e.start,t)).sort((t,e)=>t.start-e.start)),v="center"===this._opts.monthDayNumberAlign?" uc-day-align-center":"right"===this._opts.monthDayNumberAlign?" uc-day-align-right":"",g=t.map((t,e)=>`\n <div class="uc-day-cell${n(t)?" uc-today":""}${t.getMonth()!==a?" uc-other-month":""}${v}" data-date="${t.toISOString()}" data-action="day-click">\n <span class="uc-day-number" data-action="day-number" data-date="${t.toISOString()}">${t.getDate()}</span>\n </div>`).join("");let m="";for(const{event:t,startCol:e,endCol:i,slot:n,isStart:o,isEnd:a}of d){if(s!==1/0&&n>=s)continue;const r=100/7,l=e*r,c=(i-e+1)*r,d=`calc(var(--cal-header-day-height) + ${n} * (var(--cal-event-height) + var(--cal-event-gap)) + 4px)`,u=t.color||"var(--cal-event-bg)",_=t.textColor||(this._opts.autoContrastText?y(u,this._opts.contrastLevel):"var(--cal-event-text)"),v=t.borderColor||(this._opts.showEventBorder?w(u,25):"transparent"),g=this._opts.showEventBorder?`border:1px solid ${h(v)};`:"",f=o?"var(--cal-event-border-radius)":"0",b=a?"var(--cal-event-border-radius)":"0",D=o?"":" uc-continues-left",$=a?"":" uc-continues-right",S=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"",k=this._opts.enableResize&&a?'<div class="uc-resize-handle-right" data-action="resize-handle"></div>':"";m+=`\n <div class="uc-event-bar${D}${$}"\n style="left:calc(${l}% + 2px);width:calc(${c}% - 4px);top:${d};background:${h(u)};color:${h(_)};${g}border-radius:${f} ${b} ${b} ${f};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${S}>\n ${o?`<span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>`:"&nbsp;"}\n ${k}\n </div>`}let f=-1;for(let e=0;e<7;e++){const i=100/7,n=e*i,o=t[e],a=[...u[e]],r=a.length>0?Math.max(...a)+1:0,l=_[e];if(s===1/0)l.forEach((t,e)=>{const s=r+e;f=Math.max(f,s);const o=`calc(var(--cal-header-day-height) + ${s} * (var(--cal-event-height) + var(--cal-event-gap)) + 4px)`,a=t.color||"var(--cal-event-bg)",l=t.textColor||(this._opts.autoContrastText?y(a,this._opts.contrastLevel):"var(--cal-event-text)"),d=c(t.start,this._opts.locale,this._opts.use24Hour),u=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"";if("list"===this._opts.monthTimedEventStyle){const e=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";m+=`\n <div class="uc-event-bar uc-event-bar--list"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${o};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n <span class="uc-event-dot" style="background:${h(a)};"></span>\n ${e}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}else{const e=t.borderColor||(this._opts.showEventBorder?w(a,25):"transparent"),s=this._opts.showEventBorder?`border:1px solid ${h(e)};`:"",r=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";m+=`\n <div class="uc-event-bar"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${o};background:${h(a)};color:${h(l)};${s}"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n ${r}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}});else{const t=[...u[e]].filter(t=>t>=s).length,a=[];for(let t=r;t<s;t++)a.push(t);let d=t;if(l.forEach((t,e)=>{if(e<a.length){const s=a[e];f=Math.max(f,s);const o=`calc(var(--cal-header-day-height) + ${s} * (var(--cal-event-height) + var(--cal-event-gap)) + 4px)`,r=t.color||"var(--cal-event-bg)",l=t.textColor||(this._opts.autoContrastText?y(r,this._opts.contrastLevel):"var(--cal-event-text)"),d=c(t.start,this._opts.locale,this._opts.use24Hour),u=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"";if("list"===this._opts.monthTimedEventStyle){const e=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";m+=`\n <div class="uc-event-bar uc-event-bar--list"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${o};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n <span class="uc-event-dot" style="background:${h(r)};"></span>\n ${e}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}else{const e=t.borderColor||(this._opts.showEventBorder?w(r,25):"transparent"),s=this._opts.showEventBorder?`border:1px solid ${h(e)};`:"",a=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";m+=`\n <div class="uc-event-bar"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${o};background:${h(r)};color:${h(l)};${s}"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n ${a}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}}else d++}),d>0){m+=`\n <div class="uc-more-link"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${`calc(var(--cal-header-day-height) + ${s} * (var(--cal-event-height) + var(--cal-event-gap)) + 2px)`};"\n data-date="${o.toISOString()}" data-action="more-click">\n +${d} more\n </div>`}}}for(const{slot:t}of d)(s===1/0||t<s)&&(f=Math.max(f,t));let b="";if(null!==o)b=` style="height: ${o}px;"`;else if(s===1/0){b=` style="min-height: ${f>=0?`calc(var(--cal-header-day-height) + ${f+1} * (var(--cal-event-height) + var(--cal-event-gap)) + 8px)`:"80px"};"`}return`\n <div class="uc-week-row"${b}>\n <div class="uc-week-cells">${g}</div>\n <div class="uc-week-events">${m}</div>\n </div>`}_buildWeekOrDayView(s){const{locale:o,weekStartsOn:a,use24Hour:r}=this._opts,l=1===s.length,u=l?" uc-day-header-single":"",_=l?[new Intl.DateTimeFormat(o,{weekday:this._opts.weekdayFormat}).format(s[0])]:d(o,a,this._opts.weekdayFormat),v=t(s[0]),g=e(s[s.length-1]),m=this._events.filter(t=>D(t)&&t.start<=g&&e(t.end)>=v).map(s=>({...s,start:t(s.start),end:e(s.end)})),f=this._events.filter(t=>!D(t)&&t.start>=v&&t.start<=g),S=s.map((t,e)=>{const s=n(t)?" uc-today":"",i=t.getDate();return`\n <div class="uc-week-day-header${s}">\n <span class="uc-week-day-name">${h(_[e])}</span>\n <span class="uc-week-day-num" data-action="day-number" data-date="${t.toISOString()}">${i}</span>\n </div>`}).join(""),k=l?m.map((t,e)=>({event:t,startCol:0,endCol:0,slot:e,isStart:!0,isEnd:!0})):$(m,s),E=k.length?Math.max(...k.map(t=>t.slot))+1:0;let T="";for(const{event:t,startCol:e,endCol:i,slot:n,isStart:o,isEnd:a}of k){const r=100/s.length,l=e*r,c=(i-e+1)*r,d=`calc(${n} * (var(--cal-event-height) + 3px) + 2px)`,u=t.color||"var(--cal-event-bg)",_=t.textColor||(this._opts.autoContrastText?y(u,this._opts.contrastLevel):"var(--cal-event-text)"),v=t.borderColor||(this._opts.showEventBorder?w(u,25):"transparent"),g=this._opts.showEventBorder?`border:1px solid ${h(v)};`:"",m=o?"var(--cal-event-border-radius)":"0",f=a?"var(--cal-event-border-radius)":"0",b=o?"":" uc-continues-left",D=a?"":" uc-continues-right",$=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"",S=this._opts.enableResize&&a?'<div class="uc-resize-handle-right" data-action="resize-handle"></div>':"";T+=`\n <div class="uc-event-bar${b}${D}"\n style="left:calc(${l}% + 2px);width:calc(${c}% - 4px);top:${d};background:${h(u)};color:${h(_)};${g}border-radius:${m} ${f} ${f} ${m};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${$}>\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n ${S}\n </div>`}const M=`calc(${Math.max(1,E)} * (var(--cal-event-height) + 3px) + 6px)`,x=new Date,C=60*x.getHours()+x.getMinutes(),H=s.length,L=Array.from({length:24},(t,e)=>`<div class="uc-hour-cell"><span class="uc-hour-label">${h(0===e?"":c(new Date(2e3,0,1,e),"en-US",r))}</span></div>`).join(""),A=s.map(t=>{const e=n(t)?" uc-today":"",s=Array.from({length:24},()=>'<div class="uc-hour-row"><div class="uc-half-hour-line"></div></div>').join(""),a=function(t){if(!t.length)return[];const e=[...t].sort((t,e)=>t.start-e.start||e.end-t.end),s=[],i=[];for(const t of e){let e=s.findIndex(e=>e<=t.start);-1===e?(e=s.length,s.push(t.end)):s[e]=t.end,i.push({event:t,col:e})}return i.map(t=>{const e=i.filter(e=>e.event.start<t.event.end&&e.event.end>t.event.start),s=Math.max(...e.map(t=>t.col))+1;return{...t,totalCols:s}})}(f.filter(e=>i(e.start,t))).map(({event:t,col:e,totalCols:s})=>{const i=60*t.start.getHours()+t.start.getMinutes(),n=60*t.end.getHours()+t.end.getMinutes(),a=`calc(${i} / 60 * var(--cal-hour-height))`,l=`calc(${Math.max(n-i,30)} / 60 * var(--cal-hour-height))`,d=100/s,u=`calc(${e*d}% + 1px)`,_=`calc(${d}% - 2px)`,v=t.color||"var(--cal-event-bg)",g=t.textColor||(this._opts.autoContrastText?y(v,this._opts.contrastLevel):"var(--cal-event-text)"),m=t.borderColor||(this._opts.showEventBorder?w(v,25):"transparent"),f=this._opts.showEventBorder?`border:1px solid ${h(m)};`:"",b=c(t.start,o,r),D=n-i<=60?" uc-timed-event--short":"",$=this._opts.showTimeInItems?`<span class="uc-event-time">${h(b)}</span>`:"",S=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"",k=this._opts.enableResize?'<div class="uc-resize-handle" data-action="resize-handle"></div>':"";return`\n <div class="uc-timed-event${D}"\n style="top:${a};height:${l};left:${u};width:${_};background:${h(v)};color:${h(g)};${f}"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${S}>\n ${$}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n ${k}\n </div>`}).join(""),l=n(t)?`<div class="uc-now-indicator" style="top:calc(${C} / 60 * var(--cal-hour-height));">\n <span class="uc-now-dot"></span>\n <span class="uc-now-line"></span>\n </div>`:"";return`<div class="uc-time-col${e}" data-date="${t.toISOString()}" data-action="slot-col">\n ${s}${a}${l}\n </div>`}).join("");return`\n <div class="${l?"uc-day-view":"uc-week-view"}">\n <div class="uc-week-header">\n <div class="uc-time-gutter-spacer"></div>\n <div class="uc-week-day-headers${u}">${S}</div>\n </div>\n <div class="uc-all-day-section">\n <div class="uc-time-gutter-spacer uc-all-day-label">${b(this._opts.locale,"allDay")}</div>\n <div class="uc-all-day-events" style="min-height:${M}">${T}</div>\n </div>\n <div class="uc-time-body">\n <div class="uc-time-grid-inner">\n <div class="uc-time-gutter">${L}</div>\n <div class="uc-time-columns" style="--uc-col-count:${H}">${A}</div>\n </div>\n </div>\n </div>`}_buildListView(){const e=new Date,s=t(e),i=new Date(s);i.setDate(i.getDate()+this._opts.listDaysForward);const n=this._events.filter(t=>t.end>=e&&t.start<=i);n.sort((e,i)=>{const n=(e.start<s?s:t(e.start))-(i.start<s?s:t(i.start));return 0!==n?n:e.start-i.start});const o=new Map;if(n.forEach(e=>{const i=e.start<s?s:t(e.start),n=`${(a=i).getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`;var a;o.has(n)||o.set(n,[]),o.get(n).push(e)}),0===o.size)return'\n <div class="uc-list-view">\n <div class="uc-list-empty">\n <p>No upcoming events</p>\n </div>\n </div>';let r="";return o.forEach((t,e)=>{const s=a(e),i=new Intl.DateTimeFormat(this._opts.locale,{weekday:"long",year:"numeric",month:"long",day:"numeric"}).format(s),n=t.map(t=>{const e=D(t)?"All day":c(t.start,this._opts.locale,this._opts.use24Hour),s=t.color||"var(--cal-event-bg)",i=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||"")}"`:"";return`\n <div class="uc-list-event" data-event-id="${h(t.id)}" data-action="event-click" ${i}>\n <div class="uc-list-event-indicator" style="background: ${h(s)};"></div>\n <div class="uc-list-event-time">${h(e)}</div>\n <div class="uc-list-event-content">\n <div class="uc-list-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</div>\n </div>\n </div>`}).join("");r+=`\n <div class="uc-list-date-group">\n <div class="uc-list-date-header">${h(i)}</div>\n <div class="uc-list-events">${n}</div>\n </div>`}),`<div class="uc-list-view">${r}</div>`}_closeYearPicker(){this._yearOutsideHandler&&(document.removeEventListener("click",this._yearOutsideHandler),this._yearOutsideHandler=null),this._yearPickerOpen=!1,this._renderToolbar()}_handleClick(e){if(this._clickSuppressed)return void(this._clickSuppressed=!1);const s=e.target.closest(".uc-view-dropdown-btn");if(s){e.stopPropagation();const t=s.parentElement,i=t.classList.contains("uc-open");return this._root.querySelectorAll(".uc-view-dropdown.uc-open").forEach(t=>t.classList.remove("uc-open")),void(i||(t.classList.add("uc-open"),this._dropdownOutsideHandler=e=>{e.target.closest(".uc-view-dropdown")||(t.classList.remove("uc-open"),document.removeEventListener("click",this._dropdownOutsideHandler))},setTimeout(()=>document.addEventListener("click",this._dropdownOutsideHandler),0)))}const i=e.target.closest("[data-view]");if(i)return this.setView(i.dataset.view),void this._root.querySelectorAll(".uc-view-dropdown.uc-open").forEach(t=>t.classList.remove("uc-open"));const n=e.target.closest("[data-action]");if(!n)return;switch(n.dataset.action){case"prev":this.navigate(-1);break;case"next":this.navigate(1);break;case"today":this.goToToday(),this._root.querySelectorAll(".uc-view-dropdown.uc-open").forEach(t=>t.classList.remove("uc-open"));break;case"year-pick":e.stopPropagation(),this._yearPickerOpen?this._closeYearPicker():(this._yearPickerOpen=!0,this._yearPickerBase=this._date.getFullYear()-4,this._renderToolbar(),this._yearOutsideHandler=t=>{t.target.closest(".uc-year-picker")||t.target.closest('[data-action="year-pick"]')||this._closeYearPicker()},setTimeout(()=>document.addEventListener("click",this._yearOutsideHandler),0));break;case"year-prev":e.stopPropagation(),this._yearPickerBase-=12,this._renderToolbar();break;case"year-next":e.stopPropagation(),this._yearPickerBase+=12,this._renderToolbar();break;case"select-year":{e.stopPropagation();const t=parseInt(n.dataset.year,10);this._date=new Date(this._date.getFullYear()!==t?new Date(this._date).setFullYear(t):this._date),this._closeYearPicker();const s=this._getRange();this._opts.onNavigate&&this._opts.onNavigate(s.start,s.end),this._fetchAndRender();break}case"event-click":{e.stopPropagation();const t=n.dataset.eventId,s=this._events.find(e=>String(e.id)===String(t));s&&this._opts.onEventClick&&this._opts.onEventClick(s,e);break}case"day-click":{if(e.target.closest('[data-action="day-number"]'))break;if(e.target.closest('[data-action="event-click"]'))break;const t=new Date(n.dataset.date);this._opts.onSlotClick&&this._opts.onSlotClick(t,e);break}case"day-number":{if(e.stopPropagation(),!this._opts.enabledViews.includes("day"))break;const s=new Date(n.dataset.date);this._date=t(s),this._view="day",this._opts.onViewChange&&this._opts.onViewChange("day"),this._fetchAndRender();break}case"more-click":{if(e.stopPropagation(),!this._opts.enabledViews.includes("day"))break;const s=new Date(n.dataset.date);this._date=t(s),this._view="day",this._opts.onViewChange&&this._opts.onViewChange("day"),this._fetchAndRender();break}case"slot-col":if(e.target.closest('[data-action="event-click"]'))break;if(this._opts.onSlotClick){const t=n,s=t.getBoundingClientRect(),i=e.clientY-s.top,o=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60,a=Math.max(0,Math.floor(i/o*60)),r=Math.floor(a/60)%24,l=15*Math.round(a%60/15),c=new Date(t.dataset.date);c.setHours(r,l,0,0),this._opts.onSlotClick(c,e)}}}_handleTooltipHover(t){const e=t.target.closest("[data-tooltip]");if(!e)return;const s=e.dataset.tooltip;if(!s||!s.trim())return;const i="true"===e.dataset.tooltipHtml||this._opts.tooltipAllowHtml;this._showTooltip(e,s,i)}_handleTooltipMouseOut(t){const e=t.target.closest("[data-tooltip]");e&&(t.relatedTarget&&e.contains(t.relatedTarget)||this._hideTooltip())}_createTooltipElement(){if(this._tooltipElement)return this._tooltipElement;const t=document.createElement("div");return t.className="uc-tooltip-container",t.innerHTML='<div class="uc-tooltip-content"></div><div class="uc-tooltip-arrow"></div>',this._opts.tooltipBgColor&&t.style.setProperty("--tooltip-bg",this._opts.tooltipBgColor),this._opts.tooltipTextColor&&t.style.setProperty("--tooltip-text",this._opts.tooltipTextColor),this._opts.tooltipMaxWidth&&t.style.setProperty("--tooltip-max-width",this._opts.tooltipMaxWidth+"px"),document.body.appendChild(t),this._tooltipElement=t,t}_showTooltip(t,e,s){this._opts.showTooltips&&e&&(this._tooltipTimeout&&clearTimeout(this._tooltipTimeout),this._tooltipTimeout=setTimeout(()=>{this._tooltipElement||this._createTooltipElement();const i=this._tooltipElement.querySelector(".uc-tooltip-content");s?(i.innerHTML=u(e),i.querySelectorAll("a").forEach(t=>{t.setAttribute("target","_blank"),t.setAttribute("rel","noopener noreferrer")})):i.textContent=e,this._positionTooltipFixed(t),this._tooltipElement.style.opacity="1",this._tooltipElement.style.visibility="visible",this._currentTooltipTarget=t},this._opts.tooltipDelay))}_hideTooltip(){this._tooltipTimeout&&(clearTimeout(this._tooltipTimeout),this._tooltipTimeout=null),this._tooltipElement&&(this._tooltipElement.style.opacity="0",this._tooltipElement.style.visibility="hidden"),this._currentTooltipTarget=null}_positionTooltipFixed(t){if(!this._tooltipElement)return;const e=t.getBoundingClientRect(),s=this._tooltipElement.getBoundingClientRect();let i=e.top-s.height-8,n=e.left+e.width/2-s.width/2;n+s.width>window.innerWidth-10&&(n=window.innerWidth-s.width-10),n<10&&(n=10),i<10?(i=e.bottom+8,this._tooltipElement.classList.add("uc-tooltip-position-bottom")):this._tooltipElement.classList.remove("uc-tooltip-position-bottom"),this._tooltipElement.style.top=i+"px",this._tooltipElement.style.left=n+"px";const o=e.left+e.width/2-n,a=this._tooltipElement.querySelector(".uc-tooltip-arrow");a&&(a.style.left=o+"px")}_handleDragStart(t){if("list"===this._view)return;const e=t.target.closest('[data-action="resize-handle"]'),s=!!e,i=e&&e.classList.contains("uc-resize-handle-right"),n=e&&e.classList.contains("uc-resize-handle"),o=t.target.closest('[data-event-id][data-action="event-click"]');if(!o)return;if(t.target.closest('.uc-year-picker, [data-action="year-pick"], .uc-toolbar'))return;const a=o.dataset.eventId,r=this._events.find(t=>String(t.id)===String(a));if(!r)return;const l=r.allDay||!1;if(s&&!this._opts.enableResize)return;if(!s&&!this._opts.enableDragDrop)return;if(n&&(l||"week"!==this._view&&"day"!==this._view))return;if(i&&!l)return;const c=this._getEventPosition(t),d=o.getBoundingClientRect(),h=c.x-d.left,u=c.y-d.top;this._dragState={mode:s?"resize":"move",resizeDirection:i?"horizontal":n?"vertical":null,eventId:a,originalEvent:{...r,start:new Date(r.start),end:new Date(r.end)},dragElement:null,startX:c.x,startY:c.y,currentX:c.x,currentY:c.y,offsetX:h,offsetY:u,originalView:this._view,isAllDay:l,hasMoved:!1,startTime:Date.now(),originalElement:o}}_handleDragMove(t){if(!this._dragState)return;const e=this._getEventPosition(t);this._dragState.currentX=e.x,this._dragState.currentY=e.y;const s=e.x-this._dragState.startX,i=e.y-this._dragState.startY,n=Math.sqrt(s*s+i*i);if(!this._dragState.hasMoved){const t=Date.now()-this._dragState.startTime;if(!(n>5||t>150))return;this._dragState.hasMoved=!0,this._createDragElement(),this._root.classList.add("uc-dragging")}if(t.type.startsWith("touch")&&t.preventDefault(),this._dragState.dragElement)if("resize"===this._dragState.mode&&"vertical"===this._dragState.resizeDirection)this._updateResizePreview(e.x,e.y);else if("resize"===this._dragState.mode&&"horizontal"===this._dragState.resizeDirection)this._updateHorizontalResizePreview(e.x);else{const t=this._getSnappedPosition(e.x,e.y);t?(this._dragState.dragElement.style.left=t.x+"px",this._dragState.dragElement.style.top=t.y+"px"):(this._dragState.dragElement.style.left=e.x-this._dragState.offsetX+"px",this._dragState.dragElement.style.top=e.y-this._dragState.offsetY+"px")}}_getSnappedPosition(t,e){if("week"!==this._view&&"day"!==this._view)return null;const s=this._calculateDropPosition(t,e);if(!s)return null;const i=this._dragState.dragElement;if(!i)return null;if(!s.isAllDay){const e=this._root.querySelector(".uc-time-columns");if(!e)return null;const n=e.querySelectorAll(".uc-time-col");let o=null;for(const e of n){const s=e.getBoundingClientRect();if(t>=s.left&&t<s.right){o=e;break}}if(!o)return null;const a=o.getBoundingClientRect(),r=(60*s.date.getHours()+s.date.getMinutes())/60*(parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60),l=i.querySelector(".uc-event-time");if(l){const t=c(s.date,this._opts.locale,this._opts.use24Hour);l.textContent=t}return{x:a.left+4,y:a.top+r}}if(s.isAllDay){const e=this._root.querySelector(".uc-all-day-events");if(!e)return null;const s=e.getBoundingClientRect(),i="day"===this._view?[this._date]:r(this._date,this._opts.weekStartsOn),n=s.width/i.length,o=t-s.left,a=Math.floor(o/n);return a<0||a>=i.length?null:{x:s.left+a*n+4,y:s.top+4}}return null}_updateResizePreview(t,e){const s=this._dragState.dragElement,i=this._dragState.originalEvent,n=this._root.querySelector(".uc-time-columns");if(!n)return;const o=n.querySelectorAll(".uc-time-col");let a=null;for(const e of o){const s=e.getBoundingClientRect();if(t>=s.left&&t<s.right){a=e;break}}if(!a)return;const r=a.getBoundingClientRect(),l=Math.max(0,e-r.top),d=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60,h=Math.floor(l/d*60),u=Math.floor(h/60)%24,p=15*Math.round(h%60/15),_=new Date(i.start);_.setHours(u,p,0,0),_<=i.start&&_.setTime(i.start.getTime()+9e5);const v=(_-i.start)/6e4/60*d;s.style.height=v+"px";const g=s.querySelector(".uc-event-time");if(g){const t=c(i.start,this._opts.locale,this._opts.use24Hour),e=c(_,this._opts.locale,this._opts.use24Hour);g.textContent=`${t} - ${e}`}this._dragState.newEndTime=_}_updateHorizontalResizePreview(t){const s=this._dragState.dragElement,i=this._dragState.originalEvent,n=this._dragState.originalElement;if(!n)return;const o=n.getBoundingClientRect(),a=t-o.left;let c;if("month"===this._view){const s=this._root.querySelector(".uc-month-body");if(!s)return;const i=s.getBoundingClientRect(),n=i.width/7,a=t-i.left,r=Math.floor(a/n),d=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn),h=o.top-i.top,u=i.height/Math.ceil(d.length/7),p=7*Math.floor(h/u)+r;p>=0&&p<d.length&&(c=e(d[p]))}else{const s="day"===this._view?[this._date]:r(this._date,this._opts.weekStartsOn),i=this._root.querySelector(".uc-all-day-events");if(!i)return;const n=i.getBoundingClientRect(),o=n.width/s.length,a=t-n.left,l=Math.floor(a/o);l>=0&&l<s.length&&(c=e(s[l]))}if(!c)return;c<i.start&&(c=e(i.start));const d=a+20;s.style.width=Math.max(d,60)+"px",this._dragState.newEndDate=c}_handleDragEnd(t){if(!this._dragState)return;if(this._dragState.hasMoved){if(t.preventDefault(),t.stopPropagation(),this._clickSuppressed=!0,setTimeout(()=>{this._clickSuppressed=!1},10),"resize"===this._dragState.mode&&"vertical"===this._dragState.resizeDirection)this._dragState.newEndTime&&this._performResize(this._dragState.newEndTime);else if("resize"===this._dragState.mode&&"horizontal"===this._dragState.resizeDirection)this._dragState.newEndDate&&this._performHorizontalResize(this._dragState.newEndDate);else{const e=this._getEventPosition(t),s=this._calculateDropPosition(e.x,e.y);s&&this._performDrop(s)}this._cleanupDrag()}else this._dragState=null}_handleDragKeyDown(t){this._dragState&&this._dragState.hasMoved&&"Escape"===t.key&&this._cleanupDrag()}_getEventPosition(t){if(t.type.startsWith("touch")){const e=t.touches[0]||t.changedTouches[0];return{x:e.clientX,y:e.clientY}}return{x:t.clientX,y:t.clientY}}_createDragElement(){const t=this._root.querySelector(`[data-event-id="${this._dragState.eventId}"]`);if(!t)return;const e=t.cloneNode(!0);e.classList.add("uc-dragging-element");const s=t.getBoundingClientRect();e.style.position="fixed",e.style.pointerEvents="none",e.style.zIndex="10000",e.style.opacity="0.8",e.style.width=t.offsetWidth+"px","resize"===this._dragState.mode?(e.style.left=s.left+"px",e.style.top=s.top+"px",e.style.height=t.offsetHeight+"px"):(e.style.left=this._dragState.currentX-this._dragState.offsetX+"px",e.style.top=this._dragState.currentY-this._dragState.offsetY+"px"),document.body.appendChild(e),this._dragState.dragElement=e}_cleanupDrag(){this._dragState&&this._dragState.dragElement&&this._dragState.dragElement.remove(),this._root.classList.remove("uc-dragging"),this._dragState=null}_calculateDropPosition(t,e){if("week"===this._view||"day"===this._view){const s=this._calculateAllDayDropPosition(t,e);if(s)return s;const i=this._calculateTimedDropPosition(t,e);if(i)return i}return"month"===this._view?this._calculateMonthDropPosition(t,e):null}_calculateMonthDropPosition(t,e){const s=this._root.querySelector(".uc-month-body");if(!s)return null;const i=s.getBoundingClientRect(),n=t-i.left,o=e-i.top,a=i.width/7,r=s.querySelectorAll(".uc-week-row").length,c=i.height/r,d=Math.floor(n/a),h=Math.floor(o/c),u=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn),p=7*h+d;return d<0||d>=7||p<0||p>=u.length?null:{date:u[p],isMonthView:!0}}_calculateTimedDropPosition(t,e){const s=this._root.querySelector(".uc-time-columns");if(!s)return null;const i=s.querySelectorAll(".uc-time-col");let n=null;for(const e of i){const s=e.getBoundingClientRect();if(t>=s.left&&t<s.right){n=e;break}}if(!n)return null;const o=n.getBoundingClientRect(),a=Math.max(0,e-o.top),r=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60,l=Math.floor(a/r*60),c=Math.floor(l/60)%24,d=15*Math.round(l%60/15),h=n.dataset.date;if(!h)return null;const u=new Date(h);return u.setHours(c,d,0,0),{date:u,isAllDay:!1}}_calculateAllDayDropPosition(e,s){const i=this._root.querySelector(".uc-all-day-events");if(!i)return null;const n=i.getBoundingClientRect();if(s<n.top||s>n.bottom)return null;const o="day"===this._view?[this._date]:r(this._date,this._opts.weekStartsOn),a=n.width/o.length,l=e-n.left,c=Math.floor(l/a);return c<0||c>=o.length?null:{date:t(o[c]),isAllDay:!0}}_performDrop(i){const n=this._dragState.originalEvent,a=new Date(n.start),r=new Date(n.end);let l,c,d;const h=n.allDay||this._dragState.isAllDay;if(i.isMonthView)if(h){const n=o(a,r);l=t(i.date),c=e(s(i.date,Math.max(0,n))),d=!0}else{const t=r-a;l=new Date(i.date),l.setHours(a.getHours(),a.getMinutes(),a.getSeconds(),a.getMilliseconds()),c=new Date(l.getTime()+t),d=!1}else if(i.isAllDay){const n=Math.max(0,Math.ceil((r-a)/864e5));l=t(i.date),c=e(s(i.date,n)),d=!0}else{if(l=i.date,h)c=new Date(l.getTime()+36e5);else{const t=r-a;c=new Date(l.getTime()+t)}d=!1}const u=this._events.findIndex(t=>String(t.id)===String(this._dragState.eventId));u>=0&&(this._events[u].start=l,this._events[u].end=c,this._events[u].allDay=d);const p=this._cachedEvents.findIndex(t=>String(t.id)===String(this._dragState.eventId));p>=0&&(this._cachedEvents[p].start=l,this._cachedEvents[p].end=c,this._cachedEvents[p].allDay=d),this._opts.onEventDrop&&this._opts.onEventDrop(u>=0?this._events[u]:null,a,r,l,c),this._renderView()}_performResize(t){const e=this._dragState.originalEvent,s=new Date(e.start),i=new Date(e.end),n=s,o=this._events.findIndex(t=>String(t.id)===String(this._dragState.eventId));o>=0&&(this._events[o].end=t);const a=this._cachedEvents.findIndex(t=>String(t.id)===String(this._dragState.eventId));a>=0&&(this._cachedEvents[a].end=t),this._opts.onEventDrop&&this._opts.onEventDrop(o>=0?this._events[o]:null,s,i,n,t),this._renderView()}_performHorizontalResize(t){const e=this._dragState.originalEvent,s=new Date(e.start),i=new Date(e.end),n=s,o=this._events.findIndex(t=>String(t.id)===String(this._dragState.eventId));o>=0&&(this._events[o].end=t);const a=this._cachedEvents.findIndex(t=>String(t.id)===String(this._dragState.eventId));a>=0&&(this._cachedEvents[a].end=t),this._opts.onEventDrop&&this._opts.onEventDrop(o>=0?this._events[o]:null,s,i,n,t),this._renderView()}_startNowUpdater(){this._nowInterval=setInterval(()=>{const t=this._root.querySelectorAll(".uc-now-indicator");if(!t.length)return;const e=new Date,s=`calc(${60*e.getHours()+e.getMinutes()} / 60 * var(--cal-hour-height))`;t.forEach(t=>t.style.top=s)},6e4)}}});
14
+ return class{constructor(e,s={}){if("string"==typeof e){if(this._el=document.querySelector(e),!this._el)throw new Error(`SimpleCalendarJs: no element for "${e}"`)}else this._el=e;this._opts=Object.assign({mode:"calendar",defaultView:"month",defaultDate:null,weekStartsOn:0,locale:"default",weekdayFormat:"short",use24Hour:!1,showTimeInItems:!0,showGridLines:!0,monthTimedEventStyle:"list",monthDayNumberAlign:"left",showToolbar:!0,showTodayButton:!0,showNavigation:!0,showTitle:!0,showYearPicker:!0,showViewSwitcher:!0,showTooltips:!0,tooltipBgColor:null,tooltipTextColor:null,tooltipMaxWidth:250,tooltipDelay:400,tooltipAllowHtml:!0,showBorder:!0,listDaysForward:30,enabledViews:["month","week","day"],enableDragDrop:!1,enableResize:!1,autoContrastText:!1,contrastLevel:"high",allowHtmlInEvents:!0,showEventBorder:!1,fetchEvents:null,onEventClick:null,onSlotClick:null,onDateSelect:null,onRangeSelect:null,onViewChange:null,onNavigate:null,onEventDrop:null},s),this._view=this._opts.defaultView,this._date=t(this._opts.defaultDate||new Date),this._events=[],this._cachedRange=null,this._cachedEvents=[],this._nowInterval=null,this._yearPickerOpen=!1,this._yearPickerBase=0,this._selectedDate=null,this._selectedRange={start:null,end:null},this._yearOutsideHandler=null,this._dragState=null,this._clickSuppressed=!1,this._tooltipElement=null,this._tooltipTimeout=null,this._currentTooltipTarget=null,this._root=document.createElement("div"),this._root.className="uc-calendar",this._opts.showGridLines||this._root.classList.add("uc-no-grid"),this._opts.showBorder||this._root.classList.add("uc-no-border"),this._el.appendChild(this._root),this._onClick=this._handleClick.bind(this),this._root.addEventListener("click",this._onClick),this._onMouseOver=this._handleTooltipHover.bind(this),this._onMouseOut=this._handleTooltipMouseOut.bind(this),this._root.addEventListener("mouseover",this._onMouseOver),this._root.addEventListener("mouseout",this._onMouseOut),(this._opts.enableDragDrop||this._opts.enableResize)&&(this._onMouseDown=this._handleDragStart.bind(this),this._onMouseMoveGlobal=this._handleDragMove.bind(this),this._onMouseUp=this._handleDragEnd.bind(this),this._onTouchStart=this._handleDragStart.bind(this),this._onTouchMove=this._handleDragMove.bind(this),this._onTouchEnd=this._handleDragEnd.bind(this),this._onKeyDown=this._handleDragKeyDown.bind(this),this._root.addEventListener("mousedown",this._onMouseDown),document.addEventListener("mousemove",this._onMouseMoveGlobal),document.addEventListener("mouseup",this._onMouseUp),this._root.addEventListener("touchstart",this._onTouchStart,{passive:!0}),document.addEventListener("touchmove",this._onTouchMove,{passive:!1}),document.addEventListener("touchend",this._onTouchEnd),document.addEventListener("keydown",this._onKeyDown),this._opts.enableDragDrop&&this._root.setAttribute("data-drag-enabled","true"),this._opts.enableResize&&this._root.setAttribute("data-resize-enabled","true")),this._root.innerHTML=this._buildShell(),this._resizeObserver=new ResizeObserver(()=>{this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeTimeout=setTimeout(()=>{this._renderView()},100)}),this._resizeObserver.observe(this._root),this._fetchAndRender(),this._startNowUpdater()}setView(t){t!==this._view&&(this._view=t,this._opts.onViewChange&&this._opts.onViewChange(t),this._fetchAndRender())}navigate(t){const e=new Date(this._date);"month"===this._view?(e.setMonth(e.getMonth()+t),e.setDate(1)):"week"===this._view?e.setDate(e.getDate()+7*t):e.setDate(e.getDate()+t),this._date=e;const s=this._getRange();this._opts.onNavigate&&this._opts.onNavigate(s.start,s.end),this._fetchAndRender()}goToToday(){this._date=t(new Date);const e=this._getRange();this._opts.onNavigate&&this._opts.onNavigate(e.start,e.end),this._fetchAndRender()}goToDate(e){this._date=t(o(e)),this._fetchAndRender()}refresh(){this._cachedRange=null,this._cachedEvents=[],this._fetchAndRender()}getSelectedDate(){return this._selectedDate}setSelectedDate(e){"date-picker"===this._opts.mode&&(this._selectedDate=e?t(e):null,this._renderView())}getSelectedRange(){return{...this._selectedRange}}setSelectedRange(e,s=null){"range-picker"===this._opts.mode&&(this._selectedRange={start:e?t(e):null,end:s?t(s):null},this._renderView())}clearSelection(){this._selectedDate=null,this._selectedRange={start:null,end:null},this._renderView()}destroy(){this._nowInterval&&clearInterval(this._nowInterval),this._resizeTimeout&&clearTimeout(this._resizeTimeout),this._resizeObserver&&this._resizeObserver.disconnect(),this._yearOutsideHandler&&document.removeEventListener("click",this._yearOutsideHandler),this._root.removeEventListener("click",this._onClick),this._root.removeEventListener("mouseover",this._onMouseOver),this._root.removeEventListener("mouseout",this._onMouseOut),this._tooltipElement&&(this._tooltipElement.remove(),this._tooltipElement=null),this._tooltipTimeout&&(clearTimeout(this._tooltipTimeout),this._tooltipTimeout=null),(this._opts.enableDragDrop||this._opts.enableResize)&&(this._root.removeEventListener("mousedown",this._onMouseDown),document.removeEventListener("mousemove",this._onMouseMoveGlobal),document.removeEventListener("mouseup",this._onMouseUp),this._root.removeEventListener("touchstart",this._onTouchStart),document.removeEventListener("touchmove",this._onTouchMove),document.removeEventListener("touchend",this._onTouchEnd),document.removeEventListener("keydown",this._onKeyDown)),this._root.remove()}_getRange(){if("month"===this._view){const s=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn);return{start:t(s[0]),end:e(s[s.length-1])}}if("week"===this._view){const s=r(this._date,this._opts.weekStartsOn);return{start:t(s[0]),end:e(s[6])}}if("list"===this._view){const t=new Date,e=new Date(t);return e.setDate(e.getDate()+this._opts.listDaysForward),{start:t,end:e}}return{start:t(this._date),end:e(this._date)}}_getMonthGridRange(){const s=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn);return{start:t(s[0]),end:e(s[s.length-1])}}async _fetchAndRender(){this._updateToolbar();const t="date-picker"===this._opts.mode||"range-picker"===this._opts.mode;if(!this._opts.fetchEvents||t)return void this._renderView();const e=this._getRange();if(this._cachedRange&&this._cachedRange.start<=e.start&&this._cachedRange.end>=e.end)return this._events=this._cachedEvents.filter(t=>t.end>=e.start&&t.start<=e.end),void this._renderView();const s=this._root.querySelector(".uc-loading");s&&(s.style.display="flex");try{let t;t="list"===this._view?e:this._getMonthGridRange();const s=(await this._opts.fetchEvents(t.start,t.end)||[]).map(t=>({...t,start:o(t.start),end:o(t.end)}));this._cachedRange={start:t.start,end:t.end},this._cachedEvents=s,this._events=s.filter(t=>t.end>=e.start&&t.start<=e.end)}catch(t){this._events=[]}s&&(s.style.display="none"),this._renderView()}_renderView(){const t=this._root.querySelector(".uc-view-container");if(!t)return;const e=this._root.parentElement;if(e&&e.style.height&&"auto"!==e.style.height&&""!==e.style.height?this._root.setAttribute("data-height-constrained","true"):this._root.removeAttribute("data-height-constrained"),"month"===this._view)t.innerHTML=this._buildMonthView();else if("week"===this._view){const e=r(this._date,this._opts.weekStartsOn);t.innerHTML=this._buildWeekOrDayView(e),this._scrollToBusinessHours(t)}else"list"===this._view?t.innerHTML=this._buildListView():(t.innerHTML=this._buildWeekOrDayView([this._date]),this._scrollToBusinessHours(t))}_scrollToBusinessHours(t){requestAnimationFrame(()=>{const e=t.querySelector(".uc-time-body");if(!e)return;const s=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60;e.scrollTop=7*s})}_renderToolbar(){const t=this._root.querySelector(".uc-toolbar");if(!t)return;const e=document.createElement("div");e.innerHTML=this._buildToolbar(),this._root.replaceChild(e.firstElementChild,t)}_buildShell(){return`\n ${this._buildToolbar()}\n <div class="uc-loading" style="display:none">\n <div class="uc-spinner"></div>\n </div>\n <div class="uc-view-container"></div>\n `}_updateToolbar(){const t=this._root.querySelector(".uc-toolbar");if(t){const e=document.createElement("div");e.innerHTML=this._buildToolbar();const s=e.firstElementChild;s&&t.replaceWith(s)}}_buildToolbar(){if(!this._opts.showToolbar)return"";const t=this._date.getFullYear(),e=(new Date).getFullYear();let s,n=!0;if("month"===this._view)s=new Intl.DateTimeFormat(this._opts.locale,{month:"long"}).format(this._date);else if("week"===this._view){const t=r(this._date,this._opts.weekStartsOn);s=function(t,e,s){if(t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear())return`${new Intl.DateTimeFormat(s,{month:"long"}).format(t)} ${t.getDate()}–${e.getDate()}`;const i=t=>new Intl.DateTimeFormat(s,{month:"short",day:"numeric"}).format(t);return`${i(t)} – ${i(e)}`}(t[0],t[6],this._opts.locale)}else if("list"===this._view){const t=new Date,e=new Date(t);e.setDate(e.getDate()+this._opts.listDaysForward),s=function(t,e,s){if(t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear())return`${new Intl.DateTimeFormat(s,{month:"long"}).format(t)} ${t.getDate()}–${e.getDate()}, ${t.getFullYear()}`;const i=t=>new Intl.DateTimeFormat(s,{month:"short",day:"numeric"}).format(t);return`${i(t)} – ${i(e)}, ${e.getFullYear()}`}(t,e,this._opts.locale),n=!1}else s=new Intl.DateTimeFormat(this._opts.locale,{weekday:"long",month:"long",day:"numeric"}).format(this._date);let a="";if(this._opts.showYearPicker&&this._yearPickerOpen){const s=this._yearPickerBase,i=Array.from({length:12},(i,n)=>{const a=s+n,o=a===t;return`<button class="${"uc-year-item"+(o?" uc-active":"")+(a===e&&!o?" uc-today-year":"")}" data-action="select-year" data-year="${a}">${a}</button>`}).join("");a=`\n <div class="uc-year-picker">\n <div class="uc-year-picker-nav">\n <button class="uc-year-nav-btn" data-action="year-prev" aria-label="Previous years">&#8249;</button>\n <span class="uc-year-range">${s} – ${s+11}</span>\n <button class="uc-year-nav-btn" data-action="year-next" aria-label="Next years">&#8250;</button>\n </div>\n <div class="uc-year-grid">${i}</div>\n </div>`}const o=this._opts.locale,l=b(o,"today"),c=b(o,"month"),d=b(o,"week"),u=b(o,"day"),p=b(o,"list");let _="";if(this._opts.showNavigation||this._opts.showTodayButton){const t="list"===this._view?" disabled":"",e=this._opts.showNavigation?`<button class="uc-btn uc-nav-btn" data-action="prev" aria-label="Previous"${t}>&#8249;</button>`:"",s=new Date,n=i(this._date,s)?" uc-active":"";_=`\n <div class="uc-toolbar-section uc-toolbar-left">\n ${e}${this._opts.showTodayButton?`<button class="uc-btn uc-today-btn${n}" data-action="today"${t}>${h(l)}</button>`:""}${this._opts.showNavigation?`<button class="uc-btn uc-nav-btn" data-action="next" aria-label="Next"${t}>&#8250;</button>`:""}\n </div>`}let v="";if(this._opts.showTitle){const e=n?this._opts.showYearPicker?`<button class="uc-year-btn${this._yearPickerOpen?" uc-open":""}" data-action="year-pick" aria-label="Select year">${t}</button>`:t:"";v=`\n <div class="uc-toolbar-section uc-toolbar-center">\n <h2 class="uc-title">\n <span class="uc-title-main">${h(s)}</span>\n ${e}\n </h2>\n ${a}\n </div>`}let g="";const m="date-picker"===this._opts.mode||"range-picker"===this._opts.mode;if(this._opts.showViewSwitcher&&!m){const t=this._opts.enabledViews,e=[],s=[];if(t.includes("month")&&(e.push(`<button class="uc-btn uc-view-btn${"month"===this._view?" uc-active":""}" data-view="month">${h(c)}</button>`),s.push(`<button class="uc-dropdown-item${"month"===this._view?" uc-active":""}" data-view="month">${h(c)}</button>`)),t.includes("week")&&(e.push(`<button class="uc-btn uc-view-btn${"week"===this._view?" uc-active":""}" data-view="week">${h(d)}</button>`),s.push(`<button class="uc-dropdown-item${"week"===this._view?" uc-active":""}" data-view="week">${h(d)}</button>`)),t.includes("day")&&(e.push(`<button class="uc-btn uc-view-btn${"day"===this._view?" uc-active":""}" data-view="day">${h(u)}</button>`),s.push(`<button class="uc-dropdown-item${"day"===this._view?" uc-active":""}" data-view="day">${h(u)}</button>`)),t.includes("list")&&(e.push(`<button class="uc-btn uc-view-btn${"list"===this._view?" uc-active":""}" data-view="list">${h(p)}</button>`),s.push(`<button class="uc-dropdown-item${"list"===this._view?" uc-active":""}" data-view="list">${h(p)}</button>`)),e.length>0){const t=b(o,"today"),n=i(this._date,new Date)?" uc-active":"",a="list"===this._view?" disabled":"";s.push('<div class="uc-dropdown-separator"></div>'),s.push(`<button class="uc-dropdown-item${n}" data-action="today"${a}>${h(t)}</button>`),g=`\n <div class="uc-toolbar-section uc-toolbar-right">\n <div class="uc-view-switcher">\n ${e.join("")}\n </div>\n <div class="uc-view-dropdown">\n <button class="uc-btn uc-view-dropdown-btn" aria-label="View options">\n <span class="uc-view-icon">⊞</span>\n </button>\n <div class="uc-dropdown-menu">\n ${s.join("")}\n </div>\n </div>\n </div>`}}return`\n <div class="uc-toolbar">\n ${_}${v}${g}\n </div>\n `}_buildMonthView(){const{locale:s,weekStartsOn:i}=this._opts,n=l(this._date.getFullYear(),this._date.getMonth(),i),a=d(s,i,this._opts.weekdayFormat),o=this._events.map(s=>({...s,_origStart:s.start,start:D(s)?t(s.start):s.start,end:D(s)?e(s.end):s.end})),r=a.map(t=>`<div class="uc-month-day-name">${h(t)}</div>`).join(""),c=[];for(let t=0;t<n.length;t+=7)c.push(n.slice(t,t+7));let u;const p=this._root.parentElement,_=p&&p.style.height&&"auto"!==p.style.height&&""!==p.style.height;if(_){const t=p.clientHeight,e=this._root.querySelector(".uc-toolbar"),s=this._root.querySelector(".uc-month-header"),i=t-(e?e.offsetHeight:50)-(s?s.offsetHeight:36)-2,n=c.length,a=Math.floor(i/n),o=Math.floor((a-30-28)/24);u=Math.max(0,o)}else u=1/0;const v=_?Math.floor((p.clientHeight-(this._root.querySelector(".uc-toolbar")?.offsetHeight||50)-(this._root.querySelector(".uc-month-header")?.offsetHeight||36)-2)/c.length):null;return`\n <div class="uc-month-view">\n <div class="uc-month-header">${r}</div>\n <div class="uc-month-body">${c.map(t=>this._buildWeekRow(t,o,u,v)).join("")}</div>\n </div>\n `}_buildWeekRow(t,e,s,a=null){const o=this._date.getMonth(),r=e.filter(D),l=e.filter(t=>!D(t)),d=S(r,t),u=Array.from({length:7},()=>new Set);for(const{startCol:t,endCol:e,slot:s}of d)for(let i=t;i<=e;i++)u[i].add(s);const _=t.map(t=>l.filter(e=>i(e.start,t)).sort((t,e)=>t.start-e.start)),v="date-picker"===this._opts.mode||"range-picker"===this._opts.mode,g=v?" uc-day-align-center-picker":"center"===this._opts.monthDayNumberAlign?" uc-day-align-center":"right"===this._opts.monthDayNumberAlign?" uc-day-align-right":"",m=t.map((t,e)=>{const s=!v&&n(t)?" uc-today":"",a=t.getMonth()!==o?" uc-other-month":"";let r="";if("date-picker"===this._opts.mode&&this._selectedDate)r=i(t,this._selectedDate)?" uc-selected":"";else if("range-picker"===this._opts.mode&&this._selectedRange.start)if(this._selectedRange.end){r=t>=this._selectedRange.start&&t<=this._selectedRange.end?" uc-in-range":"",i(t,this._selectedRange.start)&&(r+=" uc-range-start"),i(t,this._selectedRange.end)&&(r+=" uc-range-end")}else r=i(t,this._selectedRange.start)?" uc-range-start":"";return`\n <div class="uc-day-cell${s}${a}${r}${g}" data-date="${t.toISOString()}" data-action="day-click">\n <span class="uc-day-number" data-action="day-number" data-date="${t.toISOString()}">${t.getDate()}</span>\n </div>`}).join("");let f="";for(const{event:t,startCol:e,endCol:i,slot:n,isStart:a,isEnd:o}of d){if(s!==1/0&&n>=s)continue;const r=100/7,l=e*r,c=(i-e+1)*r,d=`calc(var(--cal-header-day-height) + ${n} * (var(--cal-event-height) + var(--cal-event-gap)) + 4px)`,u=t.color||"var(--cal-event-bg)",_=t.textColor||(this._opts.autoContrastText?y(u,this._opts.contrastLevel):"var(--cal-event-text)"),v=t.borderColor||(this._opts.showEventBorder?w(u,25):"transparent"),g=this._opts.showEventBorder?`border:1px solid ${h(v)};`:"",m=a?"var(--cal-event-border-radius)":"0",b=o?"var(--cal-event-border-radius)":"0",D=a?"":" uc-continues-left",S=o?"":" uc-continues-right",$=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"",k=this._opts.enableResize&&o?'<div class="uc-resize-handle-right" data-action="resize-handle"></div>':"";f+=`\n <div class="uc-event-bar${D}${S}"\n style="left:calc(${l}% + 2px);width:calc(${c}% - 4px);top:${d};background:${h(u)};color:${h(_)};${g}border-radius:${m} ${b} ${b} ${m};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${$}>\n ${a?`<span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>`:"&nbsp;"}\n ${k}\n </div>`}let b=-1;for(let e=0;e<7;e++){const i=100/7,n=e*i,a=t[e],o=[...u[e]],r=o.length>0?Math.max(...o)+1:0,l=_[e];if(s===1/0)l.forEach((t,e)=>{const s=r+e;b=Math.max(b,s);const a=`calc(var(--cal-header-day-height) + ${s} * (var(--cal-event-height) + var(--cal-event-gap)) + 4px)`,o=t.color||"var(--cal-event-bg)",l=t.textColor||(this._opts.autoContrastText?y(o,this._opts.contrastLevel):"var(--cal-event-text)"),d=c(t.start,this._opts.locale,this._opts.use24Hour),u=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"";if("list"===this._opts.monthTimedEventStyle){const e=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";f+=`\n <div class="uc-event-bar uc-event-bar--list"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${a};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n <span class="uc-event-dot" style="background:${h(o)};"></span>\n ${e}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}else{const e=t.borderColor||(this._opts.showEventBorder?w(o,25):"transparent"),s=this._opts.showEventBorder?`border:1px solid ${h(e)};`:"",r=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";f+=`\n <div class="uc-event-bar"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${a};background:${h(o)};color:${h(l)};${s}"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n ${r}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}});else{const t=[...u[e]].filter(t=>t>=s).length,o=[];for(let t=r;t<s;t++)o.push(t);let d=t;if(l.forEach((t,e)=>{if(e<o.length){const s=o[e];b=Math.max(b,s);const a=`calc(var(--cal-header-day-height) + ${s} * (var(--cal-event-height) + var(--cal-event-gap)) + 4px)`,r=t.color||"var(--cal-event-bg)",l=t.textColor||(this._opts.autoContrastText?y(r,this._opts.contrastLevel):"var(--cal-event-text)"),d=c(t.start,this._opts.locale,this._opts.use24Hour),u=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"";if("list"===this._opts.monthTimedEventStyle){const e=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";f+=`\n <div class="uc-event-bar uc-event-bar--list"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${a};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n <span class="uc-event-dot" style="background:${h(r)};"></span>\n ${e}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}else{const e=t.borderColor||(this._opts.showEventBorder?w(r,25):"transparent"),s=this._opts.showEventBorder?`border:1px solid ${h(e)};`:"",o=this._opts.showTimeInItems?`<span class="uc-event-time">${h(d)}</span>`:"";f+=`\n <div class="uc-event-bar"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${a};background:${h(r)};color:${h(l)};${s}"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${u}>\n ${o}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n </div>`}}else d++}),d>0){f+=`\n <div class="uc-more-link"\n style="left:calc(${n}% + 2px);width:calc(${i}% - 4px);top:${`calc(var(--cal-header-day-height) + ${s} * (var(--cal-event-height) + var(--cal-event-gap)) + 2px)`};"\n data-date="${a.toISOString()}" data-action="more-click">\n +${d} more\n </div>`}}}for(const{slot:t}of d)(s===1/0||t<s)&&(b=Math.max(b,t));let $="";if(null!==a)$=` style="height: ${a}px;"`;else if(s===1/0){$=` style="min-height: ${b>=0?`calc(var(--cal-header-day-height) + ${b+1} * (var(--cal-event-height) + var(--cal-event-gap)) + 8px)`:"80px"};"`}return`\n <div class="uc-week-row"${$}>\n <div class="uc-week-cells">${m}</div>\n <div class="uc-week-events">${f}</div>\n </div>`}_buildWeekOrDayView(s){const{locale:a,weekStartsOn:o,use24Hour:r}=this._opts,l=1===s.length,u=l?" uc-day-header-single":"",_=l?[new Intl.DateTimeFormat(a,{weekday:this._opts.weekdayFormat}).format(s[0])]:d(a,o,this._opts.weekdayFormat),v=t(s[0]),g=e(s[s.length-1]),m=this._events.filter(t=>D(t)&&t.start<=g&&e(t.end)>=v).map(s=>({...s,start:t(s.start),end:e(s.end)})),f=this._events.filter(t=>!D(t)&&t.start>=v&&t.start<=g),$=s.map((t,e)=>{const s=n(t)?" uc-today":"",i=t.getDate();return`\n <div class="uc-week-day-header${s}">\n <span class="uc-week-day-name">${h(_[e])}</span>\n <span class="uc-week-day-num" data-action="day-number" data-date="${t.toISOString()}">${i}</span>\n </div>`}).join(""),k=l?m.map((t,e)=>({event:t,startCol:0,endCol:0,slot:e,isStart:!0,isEnd:!0})):S(m,s),E=k.length?Math.max(...k.map(t=>t.slot))+1:0;let T="";for(const{event:t,startCol:e,endCol:i,slot:n,isStart:a,isEnd:o}of k){const r=100/s.length,l=e*r,c=(i-e+1)*r,d=`calc(${n} * (var(--cal-event-height) + 3px) + 2px)`,u=t.color||"var(--cal-event-bg)",_=t.textColor||(this._opts.autoContrastText?y(u,this._opts.contrastLevel):"var(--cal-event-text)"),v=t.borderColor||(this._opts.showEventBorder?w(u,25):"transparent"),g=this._opts.showEventBorder?`border:1px solid ${h(v)};`:"",m=a?"var(--cal-event-border-radius)":"0",f=o?"var(--cal-event-border-radius)":"0",b=a?"":" uc-continues-left",D=o?"":" uc-continues-right",S=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"",$=this._opts.enableResize&&o?'<div class="uc-resize-handle-right" data-action="resize-handle"></div>':"";T+=`\n <div class="uc-event-bar${b}${D}"\n style="left:calc(${l}% + 2px);width:calc(${c}% - 4px);top:${d};background:${h(u)};color:${h(_)};${g}border-radius:${m} ${f} ${f} ${m};"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${S}>\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n ${$}\n </div>`}const M=`calc(${Math.max(1,E)} * (var(--cal-event-height) + 3px) + 6px)`,x=new Date,C=60*x.getHours()+x.getMinutes(),H=s.length,R=Array.from({length:24},(t,e)=>`<div class="uc-hour-cell"><span class="uc-hour-label">${h(0===e?"":c(new Date(2e3,0,1,e),"en-US",r))}</span></div>`).join(""),L=s.map(t=>{const e=n(t)?" uc-today":"",s=Array.from({length:24},()=>'<div class="uc-hour-row"><div class="uc-half-hour-line"></div></div>').join(""),o=function(t){if(!t.length)return[];const e=[...t].sort((t,e)=>t.start-e.start||e.end-t.end),s=[],i=[];for(const t of e){let e=s.findIndex(e=>e<=t.start);-1===e?(e=s.length,s.push(t.end)):s[e]=t.end,i.push({event:t,col:e})}return i.map(t=>{const e=i.filter(e=>e.event.start<t.event.end&&e.event.end>t.event.start),s=Math.max(...e.map(t=>t.col))+1;return{...t,totalCols:s}})}(f.filter(e=>i(e.start,t))).map(({event:t,col:e,totalCols:s})=>{const i=60*t.start.getHours()+t.start.getMinutes(),n=60*t.end.getHours()+t.end.getMinutes(),o=`calc(${i} / 60 * var(--cal-hour-height))`,l=`calc(${Math.max(n-i,30)} / 60 * var(--cal-hour-height))`,d=100/s,u=`calc(${e*d}% + 1px)`,_=`calc(${d}% - 2px)`,v=t.color||"var(--cal-event-bg)",g=t.textColor||(this._opts.autoContrastText?y(v,this._opts.contrastLevel):"var(--cal-event-text)"),m=t.borderColor||(this._opts.showEventBorder?w(v,25):"transparent"),f=this._opts.showEventBorder?`border:1px solid ${h(m)};`:"",b=c(t.start,a,r),D=n-i<=60?" uc-timed-event--short":"",S=this._opts.showTimeInItems?`<span class="uc-event-time">${h(b)}</span>`:"",$=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||t.title)}"`:"",k=this._opts.enableResize?'<div class="uc-resize-handle" data-action="resize-handle"></div>':"";return`\n <div class="uc-timed-event${D}"\n style="top:${o};height:${l};left:${u};width:${_};background:${h(v)};color:${h(g)};${f}"\n data-event-id="${h(t.id)}" data-action="event-click"\n ${$}>\n ${S}\n <span class="uc-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</span>\n ${k}\n </div>`}).join(""),l=n(t)?`<div class="uc-now-indicator" style="top:calc(${C} / 60 * var(--cal-hour-height));">\n <span class="uc-now-dot"></span>\n <span class="uc-now-line"></span>\n </div>`:"";return`<div class="uc-time-col${e}" data-date="${t.toISOString()}" data-action="slot-col">\n ${s}${o}${l}\n </div>`}).join("");return`\n <div class="${l?"uc-day-view":"uc-week-view"}">\n <div class="uc-week-header">\n <div class="uc-time-gutter-spacer"></div>\n <div class="uc-week-day-headers${u}">${$}</div>\n </div>\n <div class="uc-all-day-section">\n <div class="uc-time-gutter-spacer uc-all-day-label">${b(this._opts.locale,"allDay")}</div>\n <div class="uc-all-day-events" style="min-height:${M}">${T}</div>\n </div>\n <div class="uc-time-body">\n <div class="uc-time-grid-inner">\n <div class="uc-time-gutter">${R}</div>\n <div class="uc-time-columns" style="--uc-col-count:${H}">${L}</div>\n </div>\n </div>\n </div>`}_buildListView(){const e=new Date,s=t(e),i=new Date(s);i.setDate(i.getDate()+this._opts.listDaysForward);const n=this._events.filter(t=>t.end>=e&&t.start<=i);n.sort((e,i)=>{const n=(e.start<s?s:t(e.start))-(i.start<s?s:t(i.start));return 0!==n?n:e.start-i.start});const a=new Map;if(n.forEach(e=>{const i=e.start<s?s:t(e.start),n=`${(o=i).getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")}`;var o;a.has(n)||a.set(n,[]),a.get(n).push(e)}),0===a.size)return'\n <div class="uc-list-view">\n <div class="uc-list-empty">\n <p>No upcoming events</p>\n </div>\n </div>';let r="";return a.forEach((t,e)=>{const s=o(e),i=new Intl.DateTimeFormat(this._opts.locale,{weekday:"long",year:"numeric",month:"long",day:"numeric"}).format(s),n=t.map(t=>{const e=D(t)?"All day":c(t.start,this._opts.locale,this._opts.use24Hour),s=t.color||"var(--cal-event-bg)",i=this._opts.showTooltips?`data-tooltip="${h(t.tooltip||t.description||"")}"`:"";return`\n <div class="uc-list-event" data-event-id="${h(t.id)}" data-action="event-click" ${i}>\n <div class="uc-list-event-indicator" style="background: ${h(s)};"></div>\n <div class="uc-list-event-time">${h(e)}</div>\n <div class="uc-list-event-content">\n <div class="uc-list-event-title">${p(t.title,this._opts.allowHtmlInEvents,t.allowHtml)}</div>\n </div>\n </div>`}).join("");r+=`\n <div class="uc-list-date-group">\n <div class="uc-list-date-header">${h(i)}</div>\n <div class="uc-list-events">${n}</div>\n </div>`}),`<div class="uc-list-view">${r}</div>`}_closeYearPicker(){this._yearOutsideHandler&&(document.removeEventListener("click",this._yearOutsideHandler),this._yearOutsideHandler=null),this._yearPickerOpen=!1,this._renderToolbar()}_handleClick(e){if(this._clickSuppressed)return void(this._clickSuppressed=!1);const s=e.target.closest(".uc-view-dropdown-btn");if(s){e.stopPropagation();const t=s.parentElement,i=t.classList.contains("uc-open");return this._root.querySelectorAll(".uc-view-dropdown.uc-open").forEach(t=>t.classList.remove("uc-open")),void(i||(t.classList.add("uc-open"),this._dropdownOutsideHandler=e=>{e.target.closest(".uc-view-dropdown")||(t.classList.remove("uc-open"),document.removeEventListener("click",this._dropdownOutsideHandler))},setTimeout(()=>document.addEventListener("click",this._dropdownOutsideHandler),0)))}const i=e.target.closest("[data-view]");if(i)return this.setView(i.dataset.view),void this._root.querySelectorAll(".uc-view-dropdown.uc-open").forEach(t=>t.classList.remove("uc-open"));const n=e.target.closest("[data-action]");if(!n)return;switch(n.dataset.action){case"prev":this.navigate(-1);break;case"next":this.navigate(1);break;case"today":this.goToToday(),this._root.querySelectorAll(".uc-view-dropdown.uc-open").forEach(t=>t.classList.remove("uc-open"));break;case"year-pick":e.stopPropagation(),this._yearPickerOpen?this._closeYearPicker():(this._yearPickerOpen=!0,this._yearPickerBase=this._date.getFullYear()-4,this._renderToolbar(),this._yearOutsideHandler=t=>{t.target.closest(".uc-year-picker")||t.target.closest('[data-action="year-pick"]')||this._closeYearPicker()},setTimeout(()=>document.addEventListener("click",this._yearOutsideHandler),0));break;case"year-prev":e.stopPropagation(),this._yearPickerBase-=12,this._renderToolbar();break;case"year-next":e.stopPropagation(),this._yearPickerBase+=12,this._renderToolbar();break;case"select-year":{e.stopPropagation();const t=parseInt(n.dataset.year,10);this._date=new Date(this._date.getFullYear()!==t?new Date(this._date).setFullYear(t):this._date),this._closeYearPicker();const s=this._getRange();this._opts.onNavigate&&this._opts.onNavigate(s.start,s.end),this._fetchAndRender();break}case"event-click":{e.stopPropagation();const t=n.dataset.eventId,s=this._events.find(e=>String(e.id)===String(t));s&&this._opts.onEventClick&&this._opts.onEventClick(s,e);break}case"day-click":{if(e.target.closest('[data-action="day-number"]'))break;if(e.target.closest('[data-action="event-click"]'))break;const t=new Date(n.dataset.date);"date-picker"===this._opts.mode?this._handleDateSelection(t):"range-picker"===this._opts.mode?this._handleRangeSelection(t):this._opts.onSlotClick&&this._opts.onSlotClick(t,e);break}case"day-number":{e.stopPropagation();const s=new Date(n.dataset.date);if("date-picker"===this._opts.mode)this._handleDateSelection(s);else if("range-picker"===this._opts.mode)this._handleRangeSelection(s);else{if(!this._opts.enabledViews.includes("day"))break;this._date=t(s),this._view="day",this._opts.onViewChange&&this._opts.onViewChange("day"),this._fetchAndRender()}break}case"more-click":{if(e.stopPropagation(),!this._opts.enabledViews.includes("day"))break;const s=new Date(n.dataset.date);this._date=t(s),this._view="day",this._opts.onViewChange&&this._opts.onViewChange("day"),this._fetchAndRender();break}case"slot-col":if(e.target.closest('[data-action="event-click"]'))break;if(this._opts.onSlotClick){const t=n,s=t.getBoundingClientRect(),i=e.clientY-s.top,a=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60,o=Math.max(0,Math.floor(i/a*60)),r=Math.floor(o/60)%24,l=15*Math.round(o%60/15),c=new Date(t.dataset.date);c.setHours(r,l,0,0),this._opts.onSlotClick(c,e)}}}_handleDateSelection(e){const s=t(e);this._selectedDate=s,this._renderView(),this._opts.onDateSelect&&this._opts.onDateSelect(s)}_handleRangeSelection(e){const s=t(e);!this._selectedRange.start||this._selectedRange.start&&this._selectedRange.end?this._selectedRange={start:s,end:null}:(s<this._selectedRange.start?this._selectedRange={start:s,end:this._selectedRange.start}:this._selectedRange.end=s,this._opts.onRangeSelect&&this._opts.onRangeSelect(this._selectedRange.start,this._selectedRange.end)),this._renderView()}_handleTooltipHover(t){const e=t.target.closest("[data-tooltip]");if(!e)return;const s=e.dataset.tooltip;if(!s||!s.trim())return;const i="true"===e.dataset.tooltipHtml||this._opts.tooltipAllowHtml;this._showTooltip(e,s,i)}_handleTooltipMouseOut(t){const e=t.target.closest("[data-tooltip]");e&&(t.relatedTarget&&e.contains(t.relatedTarget)||this._hideTooltip())}_createTooltipElement(){if(this._tooltipElement)return this._tooltipElement;const t=document.createElement("div");return t.className="uc-tooltip-container",t.innerHTML='<div class="uc-tooltip-content"></div><div class="uc-tooltip-arrow"></div>',this._opts.tooltipBgColor&&t.style.setProperty("--tooltip-bg",this._opts.tooltipBgColor),this._opts.tooltipTextColor&&t.style.setProperty("--tooltip-text",this._opts.tooltipTextColor),this._opts.tooltipMaxWidth&&t.style.setProperty("--tooltip-max-width",this._opts.tooltipMaxWidth+"px"),document.body.appendChild(t),this._tooltipElement=t,t}_showTooltip(t,e,s){this._opts.showTooltips&&e&&(this._tooltipTimeout&&clearTimeout(this._tooltipTimeout),this._tooltipTimeout=setTimeout(()=>{this._tooltipElement||this._createTooltipElement();const i=this._tooltipElement.querySelector(".uc-tooltip-content");s?(i.innerHTML=u(e),i.querySelectorAll("a").forEach(t=>{t.setAttribute("target","_blank"),t.setAttribute("rel","noopener noreferrer")})):i.textContent=e,this._positionTooltipFixed(t),this._tooltipElement.style.opacity="1",this._tooltipElement.style.visibility="visible",this._currentTooltipTarget=t},this._opts.tooltipDelay))}_hideTooltip(){this._tooltipTimeout&&(clearTimeout(this._tooltipTimeout),this._tooltipTimeout=null),this._tooltipElement&&(this._tooltipElement.style.opacity="0",this._tooltipElement.style.visibility="hidden"),this._currentTooltipTarget=null}_positionTooltipFixed(t){if(!this._tooltipElement)return;const e=t.getBoundingClientRect(),s=this._tooltipElement.getBoundingClientRect();let i=e.top-s.height-8,n=e.left+e.width/2-s.width/2;n+s.width>window.innerWidth-10&&(n=window.innerWidth-s.width-10),n<10&&(n=10),i<10?(i=e.bottom+8,this._tooltipElement.classList.add("uc-tooltip-position-bottom")):this._tooltipElement.classList.remove("uc-tooltip-position-bottom"),this._tooltipElement.style.top=i+"px",this._tooltipElement.style.left=n+"px";const a=e.left+e.width/2-n,o=this._tooltipElement.querySelector(".uc-tooltip-arrow");o&&(o.style.left=a+"px")}_handleDragStart(t){if("list"===this._view)return;const e=t.target.closest('[data-action="resize-handle"]'),s=!!e,i=e&&e.classList.contains("uc-resize-handle-right"),n=e&&e.classList.contains("uc-resize-handle"),a=t.target.closest('[data-event-id][data-action="event-click"]');if(!a)return;if(t.target.closest('.uc-year-picker, [data-action="year-pick"], .uc-toolbar'))return;const o=a.dataset.eventId,r=this._events.find(t=>String(t.id)===String(o));if(!r)return;const l=r.allDay||!1;if(s&&!this._opts.enableResize)return;if(!s&&!this._opts.enableDragDrop)return;if(n&&(l||"week"!==this._view&&"day"!==this._view))return;if(i&&!l)return;const c=this._getEventPosition(t),d=a.getBoundingClientRect(),h=c.x-d.left,u=c.y-d.top;this._dragState={mode:s?"resize":"move",resizeDirection:i?"horizontal":n?"vertical":null,eventId:o,originalEvent:{...r,start:new Date(r.start),end:new Date(r.end)},dragElement:null,startX:c.x,startY:c.y,currentX:c.x,currentY:c.y,offsetX:h,offsetY:u,originalView:this._view,isAllDay:l,hasMoved:!1,startTime:Date.now(),originalElement:a}}_handleDragMove(t){if(!this._dragState)return;const e=this._getEventPosition(t);this._dragState.currentX=e.x,this._dragState.currentY=e.y;const s=e.x-this._dragState.startX,i=e.y-this._dragState.startY,n=Math.sqrt(s*s+i*i);if(!this._dragState.hasMoved){const t=Date.now()-this._dragState.startTime;if(!(n>5||t>150))return;this._dragState.hasMoved=!0,this._createDragElement(),this._root.classList.add("uc-dragging")}if(t.type.startsWith("touch")&&t.preventDefault(),this._dragState.dragElement)if("resize"===this._dragState.mode&&"vertical"===this._dragState.resizeDirection)this._updateResizePreview(e.x,e.y);else if("resize"===this._dragState.mode&&"horizontal"===this._dragState.resizeDirection)this._updateHorizontalResizePreview(e.x);else{const t=this._getSnappedPosition(e.x,e.y);t?(this._dragState.dragElement.style.left=t.x+"px",this._dragState.dragElement.style.top=t.y+"px"):(this._dragState.dragElement.style.left=e.x-this._dragState.offsetX+"px",this._dragState.dragElement.style.top=e.y-this._dragState.offsetY+"px")}}_getSnappedPosition(t,e){if("week"!==this._view&&"day"!==this._view)return null;const s=this._calculateDropPosition(t,e);if(!s)return null;const i=this._dragState.dragElement;if(!i)return null;if(!s.isAllDay){const e=this._root.querySelector(".uc-time-columns");if(!e)return null;const n=e.querySelectorAll(".uc-time-col");let a=null;for(const e of n){const s=e.getBoundingClientRect();if(t>=s.left&&t<s.right){a=e;break}}if(!a)return null;const o=a.getBoundingClientRect(),r=(60*s.date.getHours()+s.date.getMinutes())/60*(parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60),l=i.querySelector(".uc-event-time");if(l){const t=c(s.date,this._opts.locale,this._opts.use24Hour);l.textContent=t}return{x:o.left+4,y:o.top+r}}if(s.isAllDay){const e=this._root.querySelector(".uc-all-day-events");if(!e)return null;const s=e.getBoundingClientRect(),i="day"===this._view?[this._date]:r(this._date,this._opts.weekStartsOn),n=s.width/i.length,a=t-s.left,o=Math.floor(a/n);return o<0||o>=i.length?null:{x:s.left+o*n+4,y:s.top+4}}return null}_updateResizePreview(t,e){const s=this._dragState.dragElement,i=this._dragState.originalEvent,n=this._root.querySelector(".uc-time-columns");if(!n)return;const a=n.querySelectorAll(".uc-time-col");let o=null;for(const e of a){const s=e.getBoundingClientRect();if(t>=s.left&&t<s.right){o=e;break}}if(!o)return;const r=o.getBoundingClientRect(),l=Math.max(0,e-r.top),d=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60,h=Math.floor(l/d*60),u=Math.floor(h/60)%24,p=15*Math.round(h%60/15),_=new Date(i.start);_.setHours(u,p,0,0),_<=i.start&&_.setTime(i.start.getTime()+9e5);const v=(_-i.start)/6e4/60*d;s.style.height=v+"px";const g=s.querySelector(".uc-event-time");if(g){const t=c(i.start,this._opts.locale,this._opts.use24Hour),e=c(_,this._opts.locale,this._opts.use24Hour);g.textContent=`${t} - ${e}`}this._dragState.newEndTime=_}_updateHorizontalResizePreview(t){const s=this._dragState.dragElement,i=this._dragState.originalEvent,n=this._dragState.originalElement;if(!n)return;const a=n.getBoundingClientRect(),o=t-a.left;let c;if("month"===this._view){const s=this._root.querySelector(".uc-month-body");if(!s)return;const i=s.getBoundingClientRect(),n=i.width/7,o=t-i.left,r=Math.floor(o/n),d=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn),h=a.top-i.top,u=i.height/Math.ceil(d.length/7),p=7*Math.floor(h/u)+r;p>=0&&p<d.length&&(c=e(d[p]))}else{const s="day"===this._view?[this._date]:r(this._date,this._opts.weekStartsOn),i=this._root.querySelector(".uc-all-day-events");if(!i)return;const n=i.getBoundingClientRect(),a=n.width/s.length,o=t-n.left,l=Math.floor(o/a);l>=0&&l<s.length&&(c=e(s[l]))}if(!c)return;c<i.start&&(c=e(i.start));const d=o+20;s.style.width=Math.max(d,60)+"px",this._dragState.newEndDate=c}_handleDragEnd(t){if(!this._dragState)return;if(this._dragState.hasMoved){if(t.preventDefault(),t.stopPropagation(),this._clickSuppressed=!0,setTimeout(()=>{this._clickSuppressed=!1},10),"resize"===this._dragState.mode&&"vertical"===this._dragState.resizeDirection)this._dragState.newEndTime&&this._performResize(this._dragState.newEndTime);else if("resize"===this._dragState.mode&&"horizontal"===this._dragState.resizeDirection)this._dragState.newEndDate&&this._performHorizontalResize(this._dragState.newEndDate);else{const e=this._getEventPosition(t),s=this._calculateDropPosition(e.x,e.y);s&&this._performDrop(s)}this._cleanupDrag()}else this._dragState=null}_handleDragKeyDown(t){this._dragState&&this._dragState.hasMoved&&"Escape"===t.key&&this._cleanupDrag()}_getEventPosition(t){if(t.type.startsWith("touch")){const e=t.touches[0]||t.changedTouches[0];return{x:e.clientX,y:e.clientY}}return{x:t.clientX,y:t.clientY}}_createDragElement(){const t=this._root.querySelector(`[data-event-id="${this._dragState.eventId}"]`);if(!t)return;const e=t.cloneNode(!0);e.classList.add("uc-dragging-element");const s=t.getBoundingClientRect();e.style.position="fixed",e.style.pointerEvents="none",e.style.zIndex="10000",e.style.opacity="0.8",e.style.width=t.offsetWidth+"px","resize"===this._dragState.mode?(e.style.left=s.left+"px",e.style.top=s.top+"px",e.style.height=t.offsetHeight+"px"):(e.style.left=this._dragState.currentX-this._dragState.offsetX+"px",e.style.top=this._dragState.currentY-this._dragState.offsetY+"px"),document.body.appendChild(e),this._dragState.dragElement=e}_cleanupDrag(){this._dragState&&this._dragState.dragElement&&this._dragState.dragElement.remove(),this._root.classList.remove("uc-dragging"),this._dragState=null}_calculateDropPosition(t,e){if("week"===this._view||"day"===this._view){const s=this._calculateAllDayDropPosition(t,e);if(s)return s;const i=this._calculateTimedDropPosition(t,e);if(i)return i}return"month"===this._view?this._calculateMonthDropPosition(t,e):null}_calculateMonthDropPosition(t,e){const s=this._root.querySelector(".uc-month-body");if(!s)return null;const i=s.getBoundingClientRect(),n=t-i.left,a=e-i.top,o=i.width/7,r=s.querySelectorAll(".uc-week-row").length,c=i.height/r,d=Math.floor(n/o),h=Math.floor(a/c),u=l(this._date.getFullYear(),this._date.getMonth(),this._opts.weekStartsOn),p=7*h+d;return d<0||d>=7||p<0||p>=u.length?null:{date:u[p],isMonthView:!0}}_calculateTimedDropPosition(t,e){const s=this._root.querySelector(".uc-time-columns");if(!s)return null;const i=s.querySelectorAll(".uc-time-col");let n=null;for(const e of i){const s=e.getBoundingClientRect();if(t>=s.left&&t<s.right){n=e;break}}if(!n)return null;const a=n.getBoundingClientRect(),o=Math.max(0,e-a.top),r=parseFloat(getComputedStyle(this._root).getPropertyValue("--cal-hour-height"))||60,l=Math.floor(o/r*60),c=Math.floor(l/60)%24,d=15*Math.round(l%60/15),h=n.dataset.date;if(!h)return null;const u=new Date(h);return u.setHours(c,d,0,0),{date:u,isAllDay:!1}}_calculateAllDayDropPosition(e,s){const i=this._root.querySelector(".uc-all-day-events");if(!i)return null;const n=i.getBoundingClientRect();if(s<n.top||s>n.bottom)return null;const a="day"===this._view?[this._date]:r(this._date,this._opts.weekStartsOn),o=n.width/a.length,l=e-n.left,c=Math.floor(l/o);return c<0||c>=a.length?null:{date:t(a[c]),isAllDay:!0}}_performDrop(i){const n=this._dragState.originalEvent,o=new Date(n.start),r=new Date(n.end);let l,c,d;const h=n.allDay||this._dragState.isAllDay;if(i.isMonthView)if(h){const n=a(o,r);l=t(i.date),c=e(s(i.date,Math.max(0,n))),d=!0}else{const t=r-o;l=new Date(i.date),l.setHours(o.getHours(),o.getMinutes(),o.getSeconds(),o.getMilliseconds()),c=new Date(l.getTime()+t),d=!1}else if(i.isAllDay){const n=Math.max(0,Math.ceil((r-o)/864e5));l=t(i.date),c=e(s(i.date,n)),d=!0}else{if(l=i.date,h)c=new Date(l.getTime()+36e5);else{const t=r-o;c=new Date(l.getTime()+t)}d=!1}const u=this._events.findIndex(t=>String(t.id)===String(this._dragState.eventId));u>=0&&(this._events[u].start=l,this._events[u].end=c,this._events[u].allDay=d);const p=this._cachedEvents.findIndex(t=>String(t.id)===String(this._dragState.eventId));p>=0&&(this._cachedEvents[p].start=l,this._cachedEvents[p].end=c,this._cachedEvents[p].allDay=d),this._opts.onEventDrop&&this._opts.onEventDrop(u>=0?this._events[u]:null,o,r,l,c),this._renderView()}_performResize(t){const e=this._dragState.originalEvent,s=new Date(e.start),i=new Date(e.end),n=s,a=this._events.findIndex(t=>String(t.id)===String(this._dragState.eventId));a>=0&&(this._events[a].end=t);const o=this._cachedEvents.findIndex(t=>String(t.id)===String(this._dragState.eventId));o>=0&&(this._cachedEvents[o].end=t),this._opts.onEventDrop&&this._opts.onEventDrop(a>=0?this._events[a]:null,s,i,n,t),this._renderView()}_performHorizontalResize(t){const e=this._dragState.originalEvent,s=new Date(e.start),i=new Date(e.end),n=s,a=this._events.findIndex(t=>String(t.id)===String(this._dragState.eventId));a>=0&&(this._events[a].end=t);const o=this._cachedEvents.findIndex(t=>String(t.id)===String(this._dragState.eventId));o>=0&&(this._cachedEvents[o].end=t),this._opts.onEventDrop&&this._opts.onEventDrop(a>=0?this._events[a]:null,s,i,n,t),this._renderView()}_startNowUpdater(){this._nowInterval=setInterval(()=>{const t=this._root.querySelectorAll(".uc-now-indicator");if(!t.length)return;const e=new Date,s=`calc(${60*e.getHours()+e.getMinutes()} / 60 * var(--cal-hour-height))`;t.forEach(t=>t.style.top=s)},6e4)}}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simple-calendar-js",
3
- "version": "3.0.11",
3
+ "version": "3.0.13",
4
4
  "description": "A clean, modern, and feature-rich JavaScript calendar component with zero dependencies. Responsive design and intuitive navigation.",
5
5
  "main": "dist/simple-calendar-js.min.js",
6
6
  "style": "dist/simple-calendar-js.min.css",
@@ -9,7 +9,8 @@
9
9
  "frameworks/",
10
10
  "LICENSE",
11
11
  "README.md",
12
- "CHANGELOG.md"
12
+ "CHANGELOG.md",
13
+ "CONTRIBUTING.md"
13
14
  ],
14
15
  "scripts": {
15
16
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -26,9 +27,12 @@
26
27
  "events",
27
28
  "scheduler",
28
29
  "datepicker",
30
+ "date-picker",
31
+ "range-picker",
29
32
  "month-view",
30
33
  "week-view",
31
34
  "day-view",
35
+ "list-view",
32
36
  "dark-mode",
33
37
  "ui-component",
34
38
  "framework-agnostic",
@@ -38,8 +42,12 @@
38
42
  ],
39
43
  "author": "Pedro Lopes <simplecalendarjs@gmail.com> (https://www.simplecalendarjs.com)",
40
44
  "license": "SEE LICENSE IN LICENSE",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/pclslopes/SimpleCalendarJs.git"
48
+ },
41
49
  "bugs": {
42
- "url": "https://www.simplecalendarjs.com",
50
+ "url": "https://github.com/pclslopes/SimpleCalendarJs/issues",
43
51
  "email": "simplecalendarjs@gmail.com"
44
52
  },
45
53
  "homepage": "https://www.simplecalendarjs.com",