snice 7.8.0 → 7.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/adapters/react/SniceProvider.js +1 -1
- package/adapters/react/SniceRouter.js +1 -1
- package/adapters/react/matchRoute.js +1 -1
- package/adapters/react/table.d.ts +1 -0
- package/adapters/react/table.d.ts.map +1 -1
- package/adapters/react/table.js +1 -1
- package/adapters/react/table.js.map +1 -1
- package/adapters/react/table.tsx +2 -1
- package/adapters/react/useRequestHandler.js +1 -1
- package/bin/analyzer-contracts.js +17 -1
- package/custom-elements.json +57 -3
- package/dist/cdn/accordion/snice-accordion.js +1 -1
- package/dist/cdn/action-bar/snice-action-bar.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
- package/dist/cdn/alert/snice-alert.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
- package/dist/cdn/availability/snice-availability.js +1 -1
- package/dist/cdn/avatar/snice-avatar.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
- package/dist/cdn/badge/snice-badge.js +1 -1
- package/dist/cdn/banner/snice-banner.js +1 -1
- package/dist/cdn/binpack/snice-binpack.js +1 -1
- package/dist/cdn/book/snice-book.js +1 -1
- package/dist/cdn/booking/snice-booking.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/cdn/button/snice-button.js +1 -1
- package/dist/cdn/calendar/README.md +2 -2
- package/dist/cdn/calendar/snice-calendar.js +537 -44
- package/dist/cdn/calendar/snice-calendar.js.map +1 -1
- package/dist/cdn/calendar/snice-calendar.min.js +2 -2
- package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
- package/dist/cdn/camera/snice-camera.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.js +1 -1
- package/dist/cdn/card/snice-card.js +1 -1
- package/dist/cdn/carousel/snice-carousel.js +1 -1
- package/dist/cdn/cart/snice-cart.js +1 -1
- package/dist/cdn/chart/snice-chart.js +1 -1
- package/dist/cdn/chat/snice-chat.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.js +1 -1
- package/dist/cdn/chip/snice-chip.js +1 -1
- package/dist/cdn/code-block/README.md +2 -2
- package/dist/cdn/code-block/snice-code-block.js +177 -167
- package/dist/cdn/code-block/snice-code-block.js.map +1 -1
- package/dist/cdn/code-block/snice-code-block.min.js +2 -2
- package/dist/cdn/code-block/snice-code-block.min.js.map +1 -1
- package/dist/cdn/color-display/snice-color-display.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.js +1 -1
- package/dist/cdn/command-palette/README.md +1 -1
- package/dist/cdn/command-palette/snice-command-palette.js +2 -2
- package/dist/cdn/command-palette/snice-command-palette.js.map +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js.map +1 -1
- package/dist/cdn/comments/snice-comments.js +1 -1
- package/dist/cdn/countdown/snice-countdown.js +1 -1
- package/dist/cdn/cropper/snice-cropper.js +1 -1
- package/dist/cdn/data-card/snice-data-card.js +1 -1
- package/dist/cdn/date-picker/snice-date-picker.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/cdn/diff/snice-diff.js +1 -1
- package/dist/cdn/divider/snice-divider.js +1 -1
- package/dist/cdn/doc/snice-doc.js +1 -1
- package/dist/cdn/draw/snice-draw.js +1 -1
- package/dist/cdn/drawer/snice-drawer.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.js +1 -1
- package/dist/cdn/estimate/snice-estimate.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.js +1 -1
- package/dist/cdn/flow/snice-flow.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.js +1 -1
- package/dist/cdn/funnel/snice-funnel.js +1 -1
- package/dist/cdn/gantt/snice-gantt.js +1 -1
- package/dist/cdn/gauge/snice-gauge.js +1 -1
- package/dist/cdn/grid/snice-grid.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.js +1 -1
- package/dist/cdn/image/snice-image.js +1 -1
- package/dist/cdn/input/snice-input.js +1 -1
- package/dist/cdn/invoice/snice-invoice.js +1 -1
- package/dist/cdn/kanban/snice-kanban.js +1 -1
- package/dist/cdn/key-value/snice-key-value.js +1 -1
- package/dist/cdn/kpi/snice-kpi.js +1 -1
- package/dist/cdn/layout/snice-layout.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
- package/dist/cdn/link/snice-link.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.js +1 -1
- package/dist/cdn/list/snice-list.js +1 -1
- package/dist/cdn/location/snice-location.js +1 -1
- package/dist/cdn/login/snice-login.js +1 -1
- package/dist/cdn/map/snice-map.js +1 -1
- package/dist/cdn/markdown/snice-markdown.js +1 -1
- package/dist/cdn/masonry/snice-masonry.js +1 -1
- package/dist/cdn/menu/snice-menu.js +1 -1
- package/dist/cdn/message-strip/snice-message-strip.js +1 -1
- package/dist/cdn/modal/snice-modal.js +1 -1
- package/dist/cdn/music-player/snice-music-player.js +1 -1
- package/dist/cdn/nav/snice-nav.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.js +1 -1
- package/dist/cdn/pagination/snice-pagination.js +1 -1
- package/dist/cdn/paint/snice-paint.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
- package/dist/cdn/popover/snice-popover.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
- package/dist/cdn/product-card/snice-product-card.js +1 -1
- package/dist/cdn/progress/snice-progress.js +2 -2
- package/dist/cdn/progress/snice-progress.js.map +1 -1
- package/dist/cdn/progress/snice-progress.min.js +1 -1
- package/dist/cdn/progress/snice-progress.min.js.map +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
- package/dist/cdn/qr-code/README.md +2 -2
- package/dist/cdn/qr-code/snice-qr-code.js +19 -3
- package/dist/cdn/qr-code/snice-qr-code.js.map +1 -1
- package/dist/cdn/qr-code/snice-qr-code.min.js +2 -2
- package/dist/cdn/qr-code/snice-qr-code.min.js.map +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
- package/dist/cdn/radio/snice-radio.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.js +1 -1
- package/dist/cdn/rating/snice-rating.js +1 -1
- package/dist/cdn/receipt/snice-receipt.js +5 -2
- package/dist/cdn/receipt/snice-receipt.js.map +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js.map +1 -1
- package/dist/cdn/recipe/snice-recipe.js +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.js +4 -4
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +4 -4
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
- package/dist/cdn/select/README.md +2 -2
- package/dist/cdn/select/snice-select.js +6 -9
- package/dist/cdn/select/snice-select.js.map +1 -1
- package/dist/cdn/select/snice-select.min.js +2 -2
- package/dist/cdn/select/snice-select.min.js.map +1 -1
- package/dist/cdn/skeleton/snice-skeleton.js +1 -1
- package/dist/cdn/slider/snice-slider.js +1 -1
- package/dist/cdn/sortable/snice-sortable.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.js +1 -1
- package/dist/cdn/spinner/snice-spinner.js +1 -1
- package/dist/cdn/split-button/snice-split-button.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.js +1 -1
- package/dist/cdn/step-input/snice-step-input.js +1 -1
- package/dist/cdn/stepper/snice-stepper.js +1 -1
- package/dist/cdn/switch/snice-switch.js +1 -1
- package/dist/cdn/table/README.md +2 -2
- package/dist/cdn/table/snice-table.esm.js +1940 -407
- package/dist/cdn/table/snice-table.esm.js.map +1 -1
- package/dist/cdn/table/snice-table.esm.min.js +242 -53
- package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
- package/dist/cdn/table/snice-table.js +1940 -407
- package/dist/cdn/table/snice-table.js.map +1 -1
- package/dist/cdn/table/snice-table.min.js +234 -45
- package/dist/cdn/table/snice-table.min.js.map +1 -1
- package/dist/cdn/tabs/snice-tabs.js +1 -1
- package/dist/cdn/tag/snice-tag.js +1 -1
- package/dist/cdn/tag-input/snice-tag-input.js +1 -1
- package/dist/cdn/terminal/snice-terminal.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.js +1 -1
- package/dist/cdn/textarea/snice-textarea.js +1 -1
- package/dist/cdn/time-picker/snice-time-picker.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
- package/dist/cdn/timeline/snice-timeline.js +1 -1
- package/dist/cdn/timer/snice-timer.js +1 -1
- package/dist/cdn/toast/snice-toast.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.js +1 -1
- package/dist/cdn/tree/snice-tree.js +1 -1
- package/dist/cdn/treemap/snice-treemap.js +1 -1
- package/dist/cdn/user-card/snice-user-card.js +1 -1
- package/dist/cdn/video-player/snice-video-player.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.js +1 -1
- package/dist/cdn/weather/snice-weather.js +1 -1
- package/dist/cdn/work-order/snice-work-order.js +1 -1
- package/dist/components/calendar/snice-calendar.d.ts +187 -5
- package/dist/components/calendar/snice-calendar.js +537 -44
- package/dist/components/calendar/snice-calendar.js.map +1 -1
- package/dist/components/calendar/snice-calendar.types.d.ts +2 -1
- package/dist/components/code-block/formatter.d.ts +6 -0
- package/dist/components/code-block/formatter.js +174 -164
- package/dist/components/code-block/formatter.js.map +1 -1
- package/dist/components/code-block/grammars/snice.json +1 -1
- package/dist/components/code-block/grammars/typescript.json +1 -1
- package/dist/components/command-palette/snice-command-palette.js +1 -1
- package/dist/components/command-palette/snice-command-palette.js.map +1 -1
- package/dist/components/progress/snice-progress.js +1 -1
- package/dist/components/progress/snice-progress.js.map +1 -1
- package/dist/components/qr-code/qrcode.d.ts +1 -1
- package/dist/components/qr-code/qrcode.js +18 -2
- package/dist/components/qr-code/qrcode.js.map +1 -1
- package/dist/components/receipt/snice-receipt.js +4 -1
- package/dist/components/receipt/snice-receipt.js.map +1 -1
- package/dist/components/select/snice-select.d.ts +1 -1
- package/dist/components/select/snice-select.js +5 -8
- package/dist/components/select/snice-select.js.map +1 -1
- package/dist/components/table/snice-cell-actions.js +1 -1
- package/dist/components/table/snice-cell-actions.js.map +1 -1
- package/dist/components/table/snice-cell-color.js +1 -1
- package/dist/components/table/snice-cell-color.js.map +1 -1
- package/dist/components/table/snice-cell-date.js +20 -8
- package/dist/components/table/snice-cell-date.js.map +1 -1
- package/dist/components/table/snice-cell-email.js +1 -1
- package/dist/components/table/snice-cell-email.js.map +1 -1
- package/dist/components/table/snice-cell-image.js +1 -1
- package/dist/components/table/snice-cell-image.js.map +1 -1
- package/dist/components/table/snice-cell-json.js +1 -1
- package/dist/components/table/snice-cell-json.js.map +1 -1
- package/dist/components/table/snice-cell-link.js +1 -1
- package/dist/components/table/snice-cell-link.js.map +1 -1
- package/dist/components/table/snice-cell-location.js +1 -1
- package/dist/components/table/snice-cell-location.js.map +1 -1
- package/dist/components/table/snice-cell-phone.js +1 -1
- package/dist/components/table/snice-cell-phone.js.map +1 -1
- package/dist/components/table/snice-cell-status.js +1 -1
- package/dist/components/table/snice-cell-status.js.map +1 -1
- package/dist/components/table/snice-cell.d.ts +10 -0
- package/dist/components/table/snice-cell.js +59 -13
- package/dist/components/table/snice-cell.js.map +1 -1
- package/dist/components/table/snice-row.d.ts +0 -1
- package/dist/components/table/snice-row.js +4 -10
- package/dist/components/table/snice-row.js.map +1 -1
- package/dist/components/table/snice-table.d.ts +170 -2
- package/dist/components/table/snice-table.js +868 -189
- package/dist/components/table/snice-table.js.map +1 -1
- package/dist/components/table/snice-table.types.d.ts +17 -0
- package/dist/components/table/table-cell-presentation.d.ts +17 -4
- package/dist/components/table/table-cell-presentation.js +37 -11
- package/dist/components/table/table-cell-presentation.js.map +1 -1
- package/dist/components/table/table-column-manager.d.ts +153 -2
- package/dist/components/table/table-column-manager.js +364 -43
- package/dist/components/table/table-column-manager.js.map +1 -1
- package/dist/components/table/table-date.d.ts +29 -0
- package/dist/components/table/table-date.js +78 -0
- package/dist/components/table/table-date.js.map +1 -0
- package/dist/components/table/table-export.js +6 -2
- package/dist/components/table/table-export.js.map +1 -1
- package/dist/components/table/table-filter-engine.d.ts +9 -0
- package/dist/components/table/table-filter-engine.js +58 -14
- package/dist/components/table/table-filter-engine.js.map +1 -1
- package/dist/components/table/table-keyboard.d.ts +8 -0
- package/dist/components/table/table-keyboard.js +14 -3
- package/dist/components/table/table-keyboard.js.map +1 -1
- package/dist/components/table/table-toolbar.js +1 -0
- package/dist/components/table/table-toolbar.js.map +1 -1
- package/dist/components/table/table-tree-data.d.ts +2 -0
- package/dist/components/table/table-tree-data.js +35 -9
- package/dist/components/table/table-tree-data.js.map +1 -1
- package/dist/components/table/table-virtualizer.d.ts +44 -7
- package/dist/components/table/table-virtualizer.js +101 -54
- package/dist/components/table/table-virtualizer.js.map +1 -1
- package/dist/components/theme/theme.css +9 -0
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +1 -1
- package/dist/react/SniceProvider.js +1 -1
- package/dist/react/SniceRouter.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/matchRoute.js +1 -1
- package/dist/react/useRequestHandler.js +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/testing-dom.cjs +1 -1
- package/dist/testing-dom.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/DEVELOPMENT.md +93 -2
- package/docs/ai/components/calendar.md +113 -10
- package/docs/ai/components/code-block.md +4 -0
- package/docs/ai/components/doc.md +1 -1
- package/docs/ai/components/progress.md +1 -0
- package/docs/ai/components/receipt.md +1 -1
- package/docs/ai/components/table.md +29 -30
- package/docs/ai/components/theme.md +1 -0
- package/docs/ai/events.md +30 -0
- package/docs/ai/theme.md +1 -0
- package/docs/components/calendar.md +171 -11
- package/docs/components/code-block.md +2 -0
- package/docs/components/doc.md +1 -1
- package/docs/components/progress.md +13 -0
- package/docs/components/receipt.md +1 -0
- package/docs/components/table.md +274 -15
- package/docs/components/theme.md +5 -0
- package/docs/events.md +49 -0
- package/docs/plans/2026-03-06-date-range-picker-plan.md +4 -4
- package/docs/plans/2026-03-07-table-mui-parity-design.md +1 -1
- package/docs/plans/2026-03-09-action-bar-plan.md +11 -11
- package/docs/superpowers/specs/2026-07-09-table-incredible-design.md +1 -1
- package/docs/superpowers/specs/2026-07-09-table-phase0-implementation.md +2 -2
- package/package.json +3 -1
- package/vscode.html-custom-data.json +13 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
void 0===globalThis.Snice&&console.warn("[snice] snice-runtime.min.js must be loaded before snice-calendar.min.js");var SniceCalendar=function(e,t){"use strict";function a(e,t,a,r,i,n){function s(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var o,l=r.kind,c="getter"===l?"get":"setter"===l?"set":"value",d=!t&&e?r.static?e:e.prototype:null,h=t||(d?Object.getOwnPropertyDescriptor(d,r.name):{}),p=!1,
|
|
1
|
+
void 0===globalThis.Snice&&console.warn("[snice] snice-runtime.min.js must be loaded before snice-calendar.min.js");var SniceCalendar=function(e,t){"use strict";function a(e,t,a,r,i,n){function s(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var o,l=r.kind,c="getter"===l?"get":"setter"===l?"set":"value",d=!t&&e?r.static?e:e.prototype:null,h=t||(d?Object.getOwnPropertyDescriptor(d,r.name):{}),p=!1,u=a.length-1;u>=0;u--){var m={};for(var v in r)m[v]="access"===v?{}:r[v];for(var v in r.access)m.access[v]=r.access[v];m.addInitializer=function(e){if(p)throw new TypeError("Cannot add initializers after decoration has completed");n.push(s(e||null))};var g=(0,a[u])("accessor"===l?{get:h.get,set:h.set}:h[c],m);if("accessor"===l){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw new TypeError("Object expected");(o=s(g.get))&&(h.get=o),(o=s(g.set))&&(h.set=o),(o=s(g.init))&&i.unshift(o)}else(o=s(g))&&("field"===l?i.unshift(o):h[c]=o)}d&&Object.defineProperty(d,r.name,h),p=!0}function r(e,t,a){for(var r=arguments.length>2,i=0;i<t.length;i++)a=r?t[i].call(e,a):t[i].call(e);return r?a:void 0}"function"==typeof SuppressedError&&SuppressedError,(()=>{let e,i,n,s,o,l,c,d,h,p,u,m,v,g,b,f=[t.element("snice-avatar")],y=[],w=HTMLElement,k=[],_=[],E=[],x=[],D=[],C=[],A=[],M=[],S=[],z=[],T=[],N=[],P=[],R=[],O=[],L=[],B=[],F=[],I=[],W=[],$=[],H=[],Y=[];(class extends w{static{i=this}constructor(){super(...arguments),this.src=(r(this,k),r(this,_,"")),this.alt=(r(this,E),r(this,x,"")),this.name=(r(this,D),r(this,C,"")),this.size=(r(this,A),r(this,M,"medium")),this.shape=(r(this,S),r(this,z,"circle")),this.loading=(r(this,T),r(this,N,"lazy")),this.fallbackColor=(r(this,P),r(this,R,"#ffffff")),this.fallbackBackground=(r(this,O),r(this,L,"")),this.imageElement=(r(this,B),r(this,F,void 0)),this.fallbackElement=(r(this,I),r(this,W,void 0)),this.imageError=(r(this,$),r(this,H,!1)),this.handleImageLoad=(r(this,Y),()=>{this.imageError=!1}),this.handleImageError=()=>{this.imageError=!0}}static{const V="function"==typeof Symbol&&Symbol.metadata?Object.create(w[Symbol.metadata]??null):void 0;n=[t.property({})],s=[t.property({})],o=[t.property({})],l=[t.property({})],c=[t.property({})],d=[t.property({})],h=[t.property({attribute:"fallback-color"})],p=[t.property({attribute:"fallback-background"})],u=[t.query(".avatar-image")],m=[t.query(".avatar-fallback")],v=[t.property({type:Boolean,attribute:!1})],g=[t.render()],b=[t.styles()],a(this,null,g,{kind:"method",name:"render",static:!1,private:!1,access:{has:e=>"render"in e,get:e=>e.render},metadata:V},null,k),a(this,null,b,{kind:"method",name:"styles",static:!1,private:!1,access:{has:e=>"styles"in e,get:e=>e.styles},metadata:V},null,k),a(null,null,n,{kind:"field",name:"src",static:!1,private:!1,access:{has:e=>"src"in e,get:e=>e.src,set:(e,t)=>{e.src=t}},metadata:V},_,E),a(null,null,s,{kind:"field",name:"alt",static:!1,private:!1,access:{has:e=>"alt"in e,get:e=>e.alt,set:(e,t)=>{e.alt=t}},metadata:V},x,D),a(null,null,o,{kind:"field",name:"name",static:!1,private:!1,access:{has:e=>"name"in e,get:e=>e.name,set:(e,t)=>{e.name=t}},metadata:V},C,A),a(null,null,l,{kind:"field",name:"size",static:!1,private:!1,access:{has:e=>"size"in e,get:e=>e.size,set:(e,t)=>{e.size=t}},metadata:V},M,S),a(null,null,c,{kind:"field",name:"shape",static:!1,private:!1,access:{has:e=>"shape"in e,get:e=>e.shape,set:(e,t)=>{e.shape=t}},metadata:V},z,T),a(null,null,d,{kind:"field",name:"loading",static:!1,private:!1,access:{has:e=>"loading"in e,get:e=>e.loading,set:(e,t)=>{e.loading=t}},metadata:V},N,P),a(null,null,h,{kind:"field",name:"fallbackColor",static:!1,private:!1,access:{has:e=>"fallbackColor"in e,get:e=>e.fallbackColor,set:(e,t)=>{e.fallbackColor=t}},metadata:V},R,O),a(null,null,p,{kind:"field",name:"fallbackBackground",static:!1,private:!1,access:{has:e=>"fallbackBackground"in e,get:e=>e.fallbackBackground,set:(e,t)=>{e.fallbackBackground=t}},metadata:V},L,B),a(null,null,u,{kind:"field",name:"imageElement",static:!1,private:!1,access:{has:e=>"imageElement"in e,get:e=>e.imageElement,set:(e,t)=>{e.imageElement=t}},metadata:V},F,I),a(null,null,m,{kind:"field",name:"fallbackElement",static:!1,private:!1,access:{has:e=>"fallbackElement"in e,get:e=>e.fallbackElement,set:(e,t)=>{e.fallbackElement=t}},metadata:V},W,$),a(null,null,v,{kind:"field",name:"imageError",static:!1,private:!1,access:{has:e=>"imageError"in e,get:e=>e.imageError,set:(e,t)=>{e.imageError=t}},metadata:V},H,Y),a(null,e={value:i},f,{kind:"class",name:i.name,metadata:V},null,y),i=e.value,V&&Object.defineProperty(i,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:V}),r(i,y)}render(){const e=this.fallbackBackground?"":this.getColorClass(this.name),a=this.fallbackBackground?`--avatar-bg: ${this.fallbackBackground}; --avatar-color: ${this.fallbackColor}`:"",r=this.getInitials(this.name),i=["avatar",e].filter(Boolean).join(" "),n=["avatar-image",this.imageError?"avatar-image--error":""].filter(Boolean).join(" "),s=["avatar-fallback",!this.src||this.imageError?"avatar-fallback--visible":""].filter(Boolean).join(" ");return t.html`
|
|
2
2
|
<div part="base" class="${i}" style="${a}">
|
|
3
3
|
<if ${this.src}>
|
|
4
4
|
<img part="image" class="${n}"
|
|
@@ -25,5 +25,5 @@ void 0===globalThis.Snice&&console.warn("[snice] snice-runtime.min.js must be lo
|
|
|
25
25
|
<svg class="avatar-icon" viewBox="0 0 24 24" fill="currentColor">
|
|
26
26
|
<path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/>
|
|
27
27
|
</svg>
|
|
28
|
-
`}})})();let i=(()=>{let e,i,n,s,o,l,c,d,h,p,v,u,g,m,b,f,y,k,w,_,D,x,E,C,S,z=[t.element("snice-calendar")],M=[],A=HTMLElement,T=[],P=[],N=[],B=[],I=[],$=[],L=[],F=[],O=[],W=[],j=[],q=[],V=[],Y=[],R=[],U=[],H=[],G=[],X=[],K=[],J=[],Q=[],Z=[],ee=[],te=[],ae=[],re=[],ie=[],ne=[];var se=class extends A{static{i=this}constructor(){super(...arguments),this.value=(r(this,T),r(this,P,new Date)),this.view=(r(this,N),r(this,B,"month")),this.events=(r(this,I),r(this,$,[])),this.minDate=(r(this,L),r(this,F,"")),this.maxDate=(r(this,O),r(this,W,"")),this.disabledDates=(r(this,j),r(this,q,[])),this.highlightToday=(r(this,V),r(this,Y,!0)),this.showWeekNumbers=(r(this,R),r(this,U,!1)),this.firstDayOfWeek=(r(this,H),r(this,G,0)),this.locale=(r(this,X),r(this,K,"en-US")),this.noDaySelect=(r(this,J),r(this,Q,!1)),this.cellSizing=(r(this,Z),r(this,ee,"square")),this.eventTooltip=(r(this,te),r(this,ae,null)),this.eventPopover=(r(this,re),r(this,ie,null)),this.displayDate=(r(this,ne),new Date),this.tooltipToken=0,this.tooltipBar=null,this.popoverToken=0,this.popoverBar=null,this.boundPopoverEscape=e=>{"Escape"===e.key&&this.popoverBar&&this.closeEventPopover()},this.boundPopoverOutside=e=>{this.popoverBar&&(e.composedPath().includes(this.popoverEl)||this.closeEventPopover({returnFocus:!1}))},this.dayCells=[],this.focusedDate=null,this.handleGridKeydown=e=>{const t=e.target.__date;if(!t)return;let a=null,r=null;switch(e.key){case"ArrowLeft":a=-1;break;case"ArrowRight":a=1;break;case"ArrowUp":a=-7;break;case"ArrowDown":a=7;break;case"Home":a=-t.getDay();break;case"End":a=6-t.getDay();break;case"PageUp":r=-1;break;case"PageDown":r=1;break;case"Enter":case" ":return e.preventDefault(),void this.handleDayClick(t);default:return}e.preventDefault();const i=new Date(t);null!==a&&i.setDate(t.getDate()+a),null!==r&&i.setMonth(t.getMonth()+r),i.getMonth()===this.displayDate.getMonth()&&i.getFullYear()===this.displayDate.getFullYear()||(this.displayDate=new Date(i.getFullYear(),i.getMonth(),1)),this.focusedDate=i,this.updateView(),requestAnimationFrame(()=>{const e=this.dayCells.find(e=>{return a=i,(t=e.__date).getFullYear()===a.getFullYear()&&t.getMonth()===a.getMonth()&&t.getDate()===a.getDate();var t,a});e?.focus()})}}static{const r="function"==typeof Symbol&&Symbol.metadata?Object.create(A[Symbol.metadata]??null):void 0;n=[t.property({type:Date})],s=[t.property({attribute:"view"})],o=[t.property({type:Array,attribute:!1})],l=[t.property({type:Date,attribute:"min-date"})],c=[t.property({type:Date,attribute:"max-date"})],d=[t.property({type:Array,attribute:!1})],h=[t.property({type:Boolean,attribute:"highlight-today"})],p=[t.property({type:Boolean,attribute:"show-week-numbers"})],v=[t.property({type:Number,attribute:"first-day-of-week"})],u=[t.property({attribute:"locale"})],g=[t.property({type:Boolean,attribute:"no-day-select"})],m=[t.property({attribute:"cell-sizing"})],b=[t.property({attribute:!1})],f=[t.property({attribute:!1})],y=[t.dispatch("calendar-change",{bubbles:!0,composed:!0})],k=[t.dispatch("calendar-event-click",{bubbles:!0,composed:!0})],w=[t.dispatch("calendar-more-click",{bubbles:!0,composed:!0})],_=[t.styles()],D=[t.ready()],x=[t.request("calendar/event-popover")],E=[t.dispose()],C=[t.watch("value"),t.watch("events"),t.watch("eventTooltip"),t.watch("noDaySelect"),t.watch("cellSizing")],S=[t.watch("locale"),t.watch("firstDayOfWeek")],a(this,null,y,{kind:"method",name:"dispatchChange",static:!1,private:!1,access:{has:e=>"dispatchChange"in e,get:e=>e.dispatchChange},metadata:r},null,T),a(this,null,k,{kind:"method",name:"dispatchEventClick",static:!1,private:!1,access:{has:e=>"dispatchEventClick"in e,get:e=>e.dispatchEventClick},metadata:r},null,T),a(this,null,w,{kind:"method",name:"dispatchMoreClick",static:!1,private:!1,access:{has:e=>"dispatchMoreClick"in e,get:e=>e.dispatchMoreClick},metadata:r},null,T),a(this,null,_,{kind:"method",name:"styles",static:!1,private:!1,access:{has:e=>"styles"in e,get:e=>e.styles},metadata:r},null,T),a(this,null,D,{kind:"method",name:"initialize",static:!1,private:!1,access:{has:e=>"initialize"in e,get:e=>e.initialize},metadata:r},null,T),a(this,null,x,{kind:"method",name:"requestEventPopoverContent",static:!1,private:!1,access:{has:e=>"requestEventPopoverContent"in e,get:e=>e.requestEventPopoverContent},metadata:r},null,T),a(this,null,E,{kind:"method",name:"cleanupPopover",static:!1,private:!1,access:{has:e=>"cleanupPopover"in e,get:e=>e.cleanupPopover},metadata:r},null,T),a(this,null,C,{kind:"method",name:"handlePropertyChange",static:!1,private:!1,access:{has:e=>"handlePropertyChange"in e,get:e=>e.handlePropertyChange},metadata:r},null,T),a(this,null,S,{kind:"method",name:"handleWeekdayInputsChange",static:!1,private:!1,access:{has:e=>"handleWeekdayInputsChange"in e,get:e=>e.handleWeekdayInputsChange},metadata:r},null,T),a(null,null,n,{kind:"field",name:"value",static:!1,private:!1,access:{has:e=>"value"in e,get:e=>e.value,set:(e,t)=>{e.value=t}},metadata:r},P,N),a(null,null,s,{kind:"field",name:"view",static:!1,private:!1,access:{has:e=>"view"in e,get:e=>e.view,set:(e,t)=>{e.view=t}},metadata:r},B,I),a(null,null,o,{kind:"field",name:"events",static:!1,private:!1,access:{has:e=>"events"in e,get:e=>e.events,set:(e,t)=>{e.events=t}},metadata:r},$,L),a(null,null,l,{kind:"field",name:"minDate",static:!1,private:!1,access:{has:e=>"minDate"in e,get:e=>e.minDate,set:(e,t)=>{e.minDate=t}},metadata:r},F,O),a(null,null,c,{kind:"field",name:"maxDate",static:!1,private:!1,access:{has:e=>"maxDate"in e,get:e=>e.maxDate,set:(e,t)=>{e.maxDate=t}},metadata:r},W,j),a(null,null,d,{kind:"field",name:"disabledDates",static:!1,private:!1,access:{has:e=>"disabledDates"in e,get:e=>e.disabledDates,set:(e,t)=>{e.disabledDates=t}},metadata:r},q,V),a(null,null,h,{kind:"field",name:"highlightToday",static:!1,private:!1,access:{has:e=>"highlightToday"in e,get:e=>e.highlightToday,set:(e,t)=>{e.highlightToday=t}},metadata:r},Y,R),a(null,null,p,{kind:"field",name:"showWeekNumbers",static:!1,private:!1,access:{has:e=>"showWeekNumbers"in e,get:e=>e.showWeekNumbers,set:(e,t)=>{e.showWeekNumbers=t}},metadata:r},U,H),a(null,null,v,{kind:"field",name:"firstDayOfWeek",static:!1,private:!1,access:{has:e=>"firstDayOfWeek"in e,get:e=>e.firstDayOfWeek,set:(e,t)=>{e.firstDayOfWeek=t}},metadata:r},G,X),a(null,null,u,{kind:"field",name:"locale",static:!1,private:!1,access:{has:e=>"locale"in e,get:e=>e.locale,set:(e,t)=>{e.locale=t}},metadata:r},K,J),a(null,null,g,{kind:"field",name:"noDaySelect",static:!1,private:!1,access:{has:e=>"noDaySelect"in e,get:e=>e.noDaySelect,set:(e,t)=>{e.noDaySelect=t}},metadata:r},Q,Z),a(null,null,m,{kind:"field",name:"cellSizing",static:!1,private:!1,access:{has:e=>"cellSizing"in e,get:e=>e.cellSizing,set:(e,t)=>{e.cellSizing=t}},metadata:r},ee,te),a(null,null,b,{kind:"field",name:"eventTooltip",static:!1,private:!1,access:{has:e=>"eventTooltip"in e,get:e=>e.eventTooltip,set:(e,t)=>{e.eventTooltip=t}},metadata:r},ae,re),a(null,null,f,{kind:"field",name:"eventPopover",static:!1,private:!1,access:{has:e=>"eventPopover"in e,get:e=>e.eventPopover,set:(e,t)=>{e.eventPopover=t}},metadata:r},ie,ne),a(null,e={value:i},z,{kind:"class",name:i.name,metadata:r},null,M),se=i=e.value,r&&Object.defineProperty(i,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:r})}computeRovingIndex(e){const t=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate();if(this.focusedDate){const a=e.findIndex(e=>t(e,this.focusedDate));if(a>=0)return a}if(this.value){const a=this.value instanceof Date?this.value:new Date(this.value);if(!isNaN(a.getTime())){const r=e.findIndex(e=>t(e,a));if(r>=0)return r}}const a=new Date,r=e.findIndex(e=>t(e,a));return r>=0?r:e.findIndex(e=>e.getMonth()===this.displayDate.getMonth())}dispatchChange(){return{value:this.value,calendar:this}}dispatchEventClick(e){return{event:e,calendar:this}}dispatchMoreClick(e,t){return{date:e,count:t,calendar:this}}styles(){return t.css`${":host([hidden]){display:none}:host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);contain:layout style}.calendar{width:100%;max-width:37.5rem}.calendar__header{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);display:flex;align-items:center;justify-content:space-between;padding:var(--snice-spacing-md,1rem);background:var(--snice-color-surface,rgb(255 255 255));border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar__title{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-size:var(--snice-heading-md, 1.125rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23))}.calendar__nav{display:flex;gap:var(--snice-spacing-xs,.5rem)}.calendar__nav-button{padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);border:1px solid var(--snice-color-border,rgb(226 226 226));background:var(--snice-color-surface,rgb(255 255 255));border-radius:var(--snice-border-radius-md,.25rem);cursor:pointer;transition:background-color var(--snice-transition-fast, 150ms) ease,border-color var(--snice-transition-fast, 150ms) ease;font-size:var(--snice-font-size-sm, .875rem);color:var(--snice-color-text,rgb(23 23 23));font-family:inherit}.calendar__nav-button:hover{background:var(--snice-color-surface-container-low,rgb(250 250 250));border-color:var(--snice-color-border-hover,rgb(204 204 204))}.calendar__nav-button:focus-visible{outline:0;box-shadow:0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__grid{display:grid;grid-template-columns:repeat(7,1fr);background:var(--snice-color-surface,rgb(255 255 255));container-type:inline-size}.calendar__weekday{padding:var(--snice-spacing-sm,.75rem);text-align:center;font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-secondary,rgb(82 82 82));text-transform:uppercase;letter-spacing:var(--snice-tracking-widest, .1em);border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar__day{box-sizing:border-box;min-width:0;min-height:max(calc(100cqw / 7),3rem,calc(2.125rem + var(--calendar-week-lanes,0) * 1.375rem + var(--calendar-week-more,0rem)));padding:var(--snice-spacing-xs,.5rem);border:1px solid var(--snice-color-border,rgb(226 226 226));border-top:none;border-left:none;cursor:pointer;transition:background-color var(--snice-transition-fast, 150ms) ease;position:relative;background:var(--snice-color-surface,rgb(255 255 255));color:var(--snice-color-text,rgb(23 23 23));overflow:hidden}.calendar__day:hover{background:var(--snice-color-surface-container-low,rgb(250 250 250))}.calendar__day:focus-visible{outline:0;box-shadow:inset 0 0 0 2px var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__day:nth-child(7n+1){border-left:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar__day--stretch{min-height:max(3rem,calc(2.125rem + var(--calendar-week-lanes,0) * 1.375rem + var(--calendar-week-more,0rem)))}.calendar__day--static{cursor:default}.calendar__day--static:hover{background:var(--snice-color-surface,rgb(255 255 255))}.calendar__day--static.calendar__day--today:hover{background:var(--snice-color-primary-subtle,rgb(239 246 255))}.calendar__day--other-month{background:var(--snice-color-surface,rgb(255 255 255));color:var(--snice-color-text-tertiary,rgb(115 115 115));opacity:.5}.calendar__day--other-month:hover{opacity:.7}.calendar__day--today{background:var(--snice-color-primary-subtle,rgb(239 246 255))}.calendar__day--today:hover{background:var(--snice-color-primary-subtle-hover,rgb(219 234 254))}.calendar__day--selected{background:var(--snice-color-primary,rgb(37 99 235));color:var(--snice-color-text-inverse,rgb(250 250 250))}.calendar__day--selected:hover{background:var(--snice-color-primary-hover,rgb(29 78 216))}.calendar__day--disabled{background:var(--snice-color-surface-container,rgb(241 241 241));color:var(--snice-color-text-tertiary,rgb(115 115 115));opacity:.5;cursor:not-allowed}.calendar__day--disabled:hover{background:var(--snice-color-surface-container,rgb(241 241 241))}.calendar__day-number{font-size:var(--snice-font-size-sm, .875rem);font-weight:var(--snice-font-weight-medium,500);margin-bottom:var(--snice-spacing-2xs,.25rem)}.calendar__day--selected .calendar__day-number{color:var(--snice-color-text-inverse,rgb(250 250 250))}.calendar__event-bar{display:flex;align-items:center;gap:var(--snice-spacing-3xs,.125rem);align-self:start;margin-top:calc(1.875rem + var(--calendar-event-lane,0) * 1.375rem);margin-inline:var(--snice-spacing-3xs,0.125rem);height:1.125rem;line-height:1.125rem;font-size:var(--snice-font-size-2xs, .625rem);padding:0 var(--snice-spacing-2xs,.25rem);border-radius:var(--snice-border-radius-sm,.125rem);background:var(--snice-color-primary,rgb(37 99 235));color:var(--snice-color-text-inverse,rgb(250 250 250));white-space:nowrap;overflow:hidden;cursor:pointer;z-index:1;transition:opacity var(--snice-transition-fast, 150ms) ease}.calendar__event-title{overflow:hidden;text-overflow:ellipsis;min-width:0}.calendar__event-avatar{flex:none;--avatar-size:0.875rem;font-size:.375rem;border-radius:50%;overflow:hidden}.calendar__popover{position:fixed;z-index:var(--snice-z-floating,1000);min-width:14rem;max-width:22rem;padding:var(--snice-spacing-sm,.75rem);border:1px solid var(--snice-color-border,rgb(226 226 226));border-radius:var(--snice-border-radius-md,.25rem);background:var(--snice-color-surface,rgb(255 255 255));color:var(--snice-color-text,rgb(23 23 23));font-size:var(--snice-font-size-sm, .875rem);line-height:1.5;box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1))}.calendar__popover:focus-visible{outline:0;box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1)),0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__popover-loading{color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-xs, .75rem)}.calendar__tooltip{position:fixed;z-index:var(--snice-z-floating,1000);max-width:18rem;padding:var(--snice-spacing-2xs,.25rem) var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,.25rem);background:var(--snice-tooltip-bg,rgb(51 51 51));color:var(--snice-color-text-inverse,rgb(250 250 250));font-size:var(--snice-font-size-xs, .75rem);line-height:1.4;box-shadow:var(--snice-shadow-md,0 4px 6px -1px rgb(0 0 0 / .1));pointer-events:none}.calendar__event-bar:hover{opacity:.8}.calendar__event-bar--continues-left{border-top-left-radius:0;border-bottom-left-radius:0;margin-inline-start:0}.calendar__event-bar--continues-right{border-top-right-radius:0;border-bottom-right-radius:0;margin-inline-end:0}.calendar__more{position:absolute;bottom:var(--snice-spacing-3xs,.125rem);left:var(--snice-spacing-2xs,.25rem);font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-medium,500);color:var(--snice-color-text,rgb(23 23 23));cursor:pointer}.calendar__more:hover{text-decoration:underline}.calendar__more:focus-visible{outline:0;box-shadow:0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__week-number{padding:var(--snice-spacing-sm,.75rem) var(--snice-spacing-xs,.5rem);text-align:center;font-size:var(--snice-font-size-xs, .75rem);color:var(--snice-color-text-tertiary,rgb(115 115 115));background:var(--snice-color-surface-container-low,rgb(250 250 250));border-right:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar--week .calendar__grid{grid-template-columns:repeat(7,1fr)}.calendar--week .calendar__day{min-height:7.5rem}.calendar--day .calendar__grid{grid-template-columns:1fr}.calendar--day .calendar__day{min-height:25rem}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}"}`}initialize(){this.createDOM(),this.updateView()}createDOM(){const e=this.shadowRoot;this.container=document.createElement("div"),this.container.className=`calendar calendar--${this.view}`,this.container.setAttribute("part","base"),this.header=document.createElement("div"),this.header.className="calendar__header",this.header.setAttribute("part","header");const t=document.createElement("div");t.className="calendar__title";const a=document.createElement("div");a.className="calendar__nav";const r=document.createElement("button");r.className="calendar__nav-button",r.textContent="Today",r.onclick=()=>this.goToToday();const i=document.createElement("button");i.className="calendar__nav-button",i.textContent="‹",i.onclick=()=>this.previousMonth();const n=document.createElement("button");n.className="calendar__nav-button",n.textContent="›",n.onclick=()=>this.nextMonth(),a.appendChild(r),a.appendChild(i),a.appendChild(n),this.header.appendChild(t),this.header.appendChild(a),this.grid=document.createElement("div"),this.grid.className="calendar__grid",this.grid.setAttribute("part","grid"),this.getWeekdays().forEach((e,t)=>{const a=document.createElement("div");a.className="calendar__weekday",a.textContent=e,a.style.gridRow="1",a.style.gridColumn=String(t+1),this.grid.appendChild(a)}),this.grid.setAttribute("role","grid"),this.grid.setAttribute("aria-label","Calendar"),this.grid.addEventListener("keydown",this.handleGridKeydown);for(let e=0;e<42;e++){const t=document.createElement("div");t.className="calendar__day",t.setAttribute("role","gridcell"),t.setAttribute("tabindex",0===e?"0":"-1"),t.style.gridRow=String(Math.floor(e/7)+2),t.style.gridColumn=String(e%7+1);const a=document.createElement("div");a.className="calendar__day-number",t.appendChild(a),this.grid.appendChild(t),this.dayCells.push(t)}this.tooltipEl=document.createElement("div"),this.tooltipEl.className="calendar__tooltip",this.tooltipEl.setAttribute("part","event-tooltip"),this.tooltipEl.setAttribute("role","tooltip"),this.tooltipEl.id="calendar-event-tooltip",this.tooltipEl.hidden=!0,this.popoverEl=document.createElement("div"),this.popoverEl.className="calendar__popover",this.popoverEl.setAttribute("part","event-popover"),this.popoverEl.setAttribute("role","dialog"),this.popoverEl.setAttribute("aria-label","Event details"),this.popoverEl.tabIndex=-1,this.popoverEl.hidden=!0,this.container.appendChild(this.header),this.container.appendChild(this.grid),this.container.appendChild(this.tooltipEl),this.container.appendChild(this.popoverEl),e.appendChild(this.container)}async*requestEventPopoverContent(e){return await(yield{event:e})}async openEventPopover(e,t){const a=++this.popoverToken;this.hideEventTooltip(),this.popoverBar=e,this.popoverEl.replaceChildren();const r=document.createElement("div");let i;r.className="calendar__popover-loading",r.textContent="Loading…",this.popoverEl.appendChild(r),this.popoverEl.hidden=!1,this.positionPopover(e),document.addEventListener("keydown",this.boundPopoverEscape,!0),document.addEventListener("mousedown",this.boundPopoverOutside,!0);try{i=!0!==t.popover&&t.popover?"function"==typeof t.popover?t.popover():t.popover:this.eventPopover?await this.eventPopover(t):await this.requestEventPopoverContent(t)}catch{i=void 0}if(a===this.popoverToken){if(null==i)return console.warn(`[snice-calendar] event "${String(t.id)}" enables a popover but no content was provided — set eventPopover, event.popover content, or a @respond('calendar/event-popover') handler.`),void this.closeEventPopover({returnFocus:!1});"string"==typeof i?this.popoverEl.textContent=i:this.popoverEl.replaceChildren(i),this.positionPopover(e),this.popoverEl.focus()}}positionPopover(e){const t=e.getBoundingClientRect();this.popoverEl.style.left=`${Math.max(4,t.left)}px`,this.popoverEl.style.top=`${t.bottom+6}px`}closeEventPopover(e={}){if(!this.popoverBar)return;this.popoverToken++;const t=this.popoverBar;this.popoverBar=null,this.popoverEl.hidden=!0,this.popoverEl.replaceChildren(),document.removeEventListener("keydown",this.boundPopoverEscape,!0),document.removeEventListener("mousedown",this.boundPopoverOutside,!0),!1!==e.returnFocus&&t.isConnected&&t.focus()}cleanupPopover(){document.removeEventListener("keydown",this.boundPopoverEscape,!0),document.removeEventListener("mousedown",this.boundPopoverOutside,!0)}async showEventTooltip(e,t){const a=++this.tooltipToken,r=this.eventTooltip;let i;if(r)try{i=await r(t)}catch{i=t.tooltip}else i=t.tooltip;if(a!==this.tooltipToken||null==i)return;"string"==typeof i?this.tooltipEl.textContent=i:this.tooltipEl.replaceChildren(i),this.tooltipEl.hidden=!1,this.tooltipBar=e,e.setAttribute("aria-describedby",this.tooltipEl.id);const n=e.getBoundingClientRect();this.tooltipEl.style.left=`${Math.max(4,n.left)}px`,this.tooltipEl.style.top=`${Math.max(4,n.top-this.tooltipEl.offsetHeight-6)}px`}hideEventTooltip(){this.tooltipToken++,this.tooltipEl.hidden=!0,this.tooltipBar?.removeAttribute("aria-describedby"),this.tooltipBar=null}updateView(){const e=this.displayDate.toLocaleDateString(this.locale,{month:"long",year:"numeric"}),t=this.header.querySelector(".calendar__title");t&&(t.textContent=e);const a=this.getMonthDays(),r=this.displayDate.getMonth(),i=this.computeRovingIndex(a);a.forEach((e,t)=>{const a=this.dayCells[t];if(!a)return;const n=e.getMonth()!==r,s=this.highlightToday&&this.isToday(e),o=!this.noDaySelect&&this.isSelected(e),l=this.isDisabled(e);a.className="calendar__day",n&&a.classList.add("calendar__day--other-month"),s&&a.classList.add("calendar__day--today"),o&&a.classList.add("calendar__day--selected"),l&&a.classList.add("calendar__day--disabled"),this.noDaySelect&&a.classList.add("calendar__day--static"),"stretch"===this.cellSizing&&a.classList.add("calendar__day--stretch"),a.setAttribute("role","gridcell"),a.setAttribute("aria-selected",o?"true":"false"),a.setAttribute("aria-disabled",l?"true":"false"),a.setAttribute("aria-current",s&&!n?"date":"false"),a.setAttribute("tabindex",t===i?"0":"-1"),a.setAttribute("aria-label",e.toLocaleDateString(this.locale,{dateStyle:"full"})),a.__date=e;const c=a.querySelector(".calendar__day-number");c&&(c.textContent=String(e.getDate())),a.onclick=()=>this.handleDayClick(e)}),this.renderEventStripes(a)}static{this.MAX_EVENT_LANES=3}renderEventStripes(e){if(this.closeEventPopover({returnFocus:!1}),this.grid.querySelectorAll(".calendar__event-bar").forEach(e=>e.remove()),this.dayCells.forEach(e=>{e.querySelector(".calendar__more")?.remove(),e.style.removeProperty("--calendar-week-lanes"),e.style.removeProperty("--calendar-week-more")}),!this.events||0===this.events.length)return;const t=e.map(e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()),a=new Map(t.map((e,t)=>[e,t])),r=t[0],i=t[t.length-1],n=e=>{const t="string"==typeof e?new Date(e):e;return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()},s=[];this.events.forEach((e,o)=>{if(!e.start)return;const l=n(e.start);if(isNaN(l))return;const c=e.end?Math.max(n(e.end),l):l;if(isNaN(c)||c<r||l>i)return;const d=l<r,h=c>i,p=d?0:a.get(l),v=h?t.length-1:a.get(c);s.push({event:e,startIdx:p,endIdx:v,startsBeforeGrid:d,endsAfterGrid:h,startTime:l,duration:c-l,order:o})}),s.sort((e,t)=>e.startTime-t.startTime||t.duration-e.duration||e.order-t.order);const o=new Array(t.length).fill(0),l=Math.floor(t.length/7),c=new Array(l).fill(0);for(let e=0;e<l;e++){const t=7*e,a=t+6,r=[];for(const i of s){if(i.endIdx<t||i.startIdx>a)continue;const n=Math.max(i.startIdx,t),s=Math.min(i.endIdx,a),l=n-t,d=s-t;let h=0;for(;r[h]?.some(([e,t])=>l<=t&&d>=e);)h++;if((r[h]??=[]).push([l,d]),c[e]=Math.min(Math.max(c[e],h+1),se.MAX_EVENT_LANES),h>=se.MAX_EVENT_LANES){for(let e=n;e<=s;e++)o[e]++;continue}const p=n>i.startIdx||n===i.startIdx&&i.startsBeforeGrid,v=s<i.endIdx||s===i.endIdx&&i.endsAfterGrid,u=document.createElement("div");u.className="calendar__event-bar",p&&u.classList.add("calendar__event-bar--continues-left"),v&&u.classList.add("calendar__event-bar--continues-right");const g=i.event.className?i.event.className.split(/\s+/).filter(Boolean):[];if(u.classList.add(...g),u.setAttribute("part",["event-bar",...g].join(" ")),u.setAttribute("data-event-id",String(i.event.id)),u.setAttribute("data-lane",String(h)),u.style.gridRow=String(e+2),u.style.gridColumn=`${l+1} / ${d+2}`,u.style.setProperty("--calendar-event-lane",String(h)),i.event.color&&(u.style.background=i.event.color),i.event.avatar){const e="string"==typeof i.event.avatar?{src:i.event.avatar}:i.event.avatar,t=document.createElement("snice-avatar");t.className="calendar__event-avatar",t.setAttribute("part","event-avatar"),t.setAttribute("size","xs"),t.setAttribute("shape","circle"),t.setAttribute("loading","eager"),e.src&&(t.src=e.src),e.name&&(t.name=e.name),e.alt&&(t.alt=e.alt),u.appendChild(t)}const m=document.createElement("span");m.className="calendar__event-title",m.textContent=i.event.title,u.appendChild(m),i.event.tooltip||this.eventTooltip?(u.onmouseenter=()=>this.showEventTooltip(u,i.event),u.onmouseleave=()=>this.hideEventTooltip()):u.title=i.event.title,i.event.popover?(u.setAttribute("role","button"),u.setAttribute("tabindex","0"),u.setAttribute("aria-haspopup","dialog"),u.onkeydown=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),e.stopPropagation(),this.openEventPopover(u,i.event))},u.onclick=e=>{this.handleEventClick(i.event,e),this.openEventPopover(u,i.event)}):u.onclick=e=>this.handleEventClick(i.event,e),this.grid.appendChild(u)}}o.forEach((t,a)=>{if(0===t)return;const r=this.dayCells[a];if(!r)return;const i=e[a],n=document.createElement("div");n.className="calendar__more",n.setAttribute("part","more-chip"),n.textContent=`+${t} more`,n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-label",`${t} more event${1===t?"":"s"} on ${i.toLocaleDateString(this.locale,{dateStyle:"full"})}`),n.onclick=e=>this.handleMoreClick(i,t,e),n.onkeydown=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.handleMoreClick(i,t,e))},r.appendChild(n)});for(let e=0;e<l;e++){if(0===c[e])continue;const t=o.slice(7*e,7*e+7).some(e=>e>0);for(let a=7*e;a<7*e+7;a++){const r=this.dayCells[a];r&&(r.style.setProperty("--calendar-week-lanes",String(c[e])),t&&r.style.setProperty("--calendar-week-more","1rem"))}}}goToToday(){this.displayDate=new Date,this.value=new Date,this.updateView(),this.dispatchChange()}goToDate(e){this.displayDate="string"==typeof e?new Date(e):e,this.value=this.displayDate,this.updateView(),this.dispatchChange()}previousMonth(){this.displayDate=new Date(this.displayDate.getFullYear(),this.displayDate.getMonth()-1),this.updateView()}nextMonth(){this.displayDate=new Date(this.displayDate.getFullYear(),this.displayDate.getMonth()+1),this.updateView()}previousWeek(){this.displayDate=new Date(this.displayDate.getTime()-6048e5),this.updateView()}nextWeek(){this.displayDate=new Date(this.displayDate.getTime()+6048e5),this.updateView()}previousDay(){this.displayDate=new Date(this.displayDate.getTime()-864e5),this.updateView()}nextDay(){this.displayDate=new Date(this.displayDate.getTime()+864e5),this.updateView()}getDisplayedMonth(){return{month:this.displayDate.getMonth(),year:this.displayDate.getFullYear()}}getEventsForDate(e){const t="string"==typeof e?new Date(e):e,a=t.getTime();return this.events.filter(e=>{if(!e.start)return!1;const r="string"==typeof e.start?new Date(e.start):e.start,i=new Date(r.getFullYear(),r.getMonth(),r.getDate()).getTime();if(!e.end)return this.isSameDay(t,r);const n="string"==typeof e.end?new Date(e.end):e.end,s=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime();return a>=i&&a<=s})}formatDate(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}isSameDay(e,t){return this.formatDate(e)===this.formatDate(t)}isToday(e){return this.isSameDay(e,new Date)}isSelected(e){const t="string"==typeof this.value?new Date(this.value):this.value;return this.isSameDay(e,t)}isDisabled(e){if(this.minDate){const t="string"==typeof this.minDate?new Date(this.minDate):this.minDate;if(e<t)return!0}if(this.maxDate){const t="string"==typeof this.maxDate?new Date(this.maxDate):this.maxDate;if(e>t)return!0}return this.disabledDates.some(t=>{const a="string"==typeof t?new Date(t):t;return this.isSameDay(e,a)})}handleDayClick(e){this.noDaySelect||this.isDisabled(e)||(this.value=e,this.updateView(),this.dispatchChange())}handleEventClick(e,t){t.stopPropagation(),this.dispatchEventClick(e)}handleMoreClick(e,t,a){a.stopPropagation(),this.dispatchMoreClick(e,t)}getMonthDays(){const e=this.displayDate.getFullYear(),t=this.displayDate.getMonth(),a=new Date(e,t,1).getDay(),r=new Date(e,t,1-(a-this.firstDayOfWeek+7)%7),i=[];for(let e=0;e<42;e++)i.push(new Date(r.getFullYear(),r.getMonth(),r.getDate()+e));return i}getWeekdays(){const e=[],t=new Date(2024,0,this.firstDayOfWeek);for(let a=0;a<7;a++){const r=new Date(t);r.setDate(t.getDate()+a),e.push(r.toLocaleDateString(this.locale,{weekday:"short"}))}return e}handlePropertyChange(){this.grid&&this.updateView()}handleWeekdayInputsChange(){this.grid&&(this.grid.querySelectorAll(".calendar__weekday").forEach(e=>e.remove()),this.getWeekdays().forEach((e,t)=>{const a=document.createElement("div");a.className="calendar__weekday",a.textContent=e,a.style.gridRow="1",a.style.gridColumn=String(t+1),this.grid.insertBefore(a,this.grid.children[t]||null)}),this.updateView())}static{r(i,M)}};return se=i})();return e.SniceCalendar=i,e}({},Snice);
|
|
28
|
+
`}})})();let i=(()=>{let e,i,n,s,o,l,c,d,h,p,u,m,v,g,b,f,y,w,k,_,E,x,D,C,A,M=[t.element("snice-calendar")],S=[],z=HTMLElement,T=[],N=[],P=[],R=[],O=[],L=[],B=[],F=[],I=[],W=[],$=[],H=[],Y=[],V=[],q=[],j=[],G=[],U=[],K=[],X=[],J=[],Q=[],Z=[],ee=[],te=[],ae=[],re=[],ie=[],ne=[];var se=class extends z{static{i=this}constructor(){super(...arguments),this.value=(r(this,T),r(this,N,null)),this.view=(r(this,P),r(this,R,"month")),this.events=(r(this,O),r(this,L,[])),this.minDate=(r(this,B),r(this,F,"")),this.maxDate=(r(this,I),r(this,W,"")),this.disabledDates=(r(this,$),r(this,H,[])),this.highlightToday=(r(this,Y),r(this,V,!0)),this.showWeekNumbers=(r(this,q),r(this,j,!1)),this.firstDayOfWeek=(r(this,G),r(this,U,0)),this.locale=(r(this,K),r(this,X,"en-US")),this.noDaySelect=(r(this,J),r(this,Q,!1)),this.cellSizing=(r(this,Z),r(this,ee,"square")),this.eventTooltip=(r(this,te),r(this,ae,null)),this.eventPopover=(r(this,re),r(this,ie,null)),this.displayDate=(r(this,ne),new Date),this.tooltipToken=0,this.tooltipBar=null,this.popoverToken=0,this.popoverBar=null,this.boundPopoverEscape=e=>{"Escape"===e.key&&this.popoverBar&&this.closeEventPopover()},this.boundPopoverOutside=e=>{this.popoverBar&&(e.composedPath().includes(this.popoverEl)||this.closeEventPopover({returnFocus:!1}))},this.dayCells=[],this.weekNumberCells=[],this.focusedDate=null,this.handleGridKeydown=e=>{const t=e.target.__date;if(!t)return;let a=null,r=null;switch(e.key){case"ArrowLeft":a=-1;break;case"ArrowRight":a=1;break;case"ArrowUp":a=-7;break;case"ArrowDown":a=7;break;case"Home":a=-t.getDay();break;case"End":a=6-t.getDay();break;case"PageUp":r=-1;break;case"PageDown":r=1;break;case"Enter":case" ":return e.preventDefault(),void this.handleDayClick(t);default:return}e.preventDefault();const i=new Date(t);null!==a&&i.setDate(t.getDate()+a),null!==r&&i.setMonth(t.getMonth()+r),i.getMonth()===this.displayDate.getMonth()&&i.getFullYear()===this.displayDate.getFullYear()||(this.displayDate=new Date(i.getFullYear(),i.getMonth(),1)),this.focusedDate=i,this.updateView(),requestAnimationFrame(()=>{const e=this.dayCells.find(e=>{return a=i,(t=e.__date).getFullYear()===a.getFullYear()&&t.getMonth()===a.getMonth()&&t.getDate()===a.getDate();var t,a});e?.focus()})},this.rowCapped=!1,this.laidOutFor=""}static{const r="function"==typeof Symbol&&Symbol.metadata?Object.create(z[Symbol.metadata]??null):void 0;n=[t.property({type:Date})],s=[t.property({attribute:"view"})],o=[t.property({type:Array,attribute:!1})],l=[t.property({type:Date,attribute:"min-date"})],c=[t.property({type:Date,attribute:"max-date"})],d=[t.property({type:Array,attribute:!1})],h=[t.property({type:Boolean,attribute:"highlight-today"})],p=[t.property({type:Boolean,attribute:"show-week-numbers"})],u=[t.property({type:Number,attribute:"first-day-of-week"})],m=[t.property({attribute:"locale"})],v=[t.property({type:Boolean,attribute:"no-day-select"})],g=[t.property({attribute:"cell-sizing"})],b=[t.property({attribute:!1})],f=[t.property({attribute:!1})],y=[t.dispatch("calendar-change",{bubbles:!0,composed:!0})],w=[t.dispatch("calendar-event-click",{bubbles:!0,composed:!0})],k=[t.styles()],_=[t.ready()],E=[t.request("calendar/event-popover")],x=[t.dispose()],D=[t.watch("value"),t.watch("events"),t.watch("eventTooltip"),t.watch("noDaySelect"),t.watch("cellSizing"),t.watch("showWeekNumbers"),t.watch("highlightToday")],C=[t.observe("resize",{throttle:100})],A=[t.watch("locale"),t.watch("firstDayOfWeek")],a(this,null,y,{kind:"method",name:"dispatchChange",static:!1,private:!1,access:{has:e=>"dispatchChange"in e,get:e=>e.dispatchChange},metadata:r},null,T),a(this,null,w,{kind:"method",name:"dispatchEventClick",static:!1,private:!1,access:{has:e=>"dispatchEventClick"in e,get:e=>e.dispatchEventClick},metadata:r},null,T),a(this,null,k,{kind:"method",name:"styles",static:!1,private:!1,access:{has:e=>"styles"in e,get:e=>e.styles},metadata:r},null,T),a(this,null,_,{kind:"method",name:"initialize",static:!1,private:!1,access:{has:e=>"initialize"in e,get:e=>e.initialize},metadata:r},null,T),a(this,null,E,{kind:"method",name:"requestEventPopoverContent",static:!1,private:!1,access:{has:e=>"requestEventPopoverContent"in e,get:e=>e.requestEventPopoverContent},metadata:r},null,T),a(this,null,x,{kind:"method",name:"cleanupPopover",static:!1,private:!1,access:{has:e=>"cleanupPopover"in e,get:e=>e.cleanupPopover},metadata:r},null,T),a(this,null,D,{kind:"method",name:"handlePropertyChange",static:!1,private:!1,access:{has:e=>"handlePropertyChange"in e,get:e=>e.handlePropertyChange},metadata:r},null,T),a(this,null,C,{kind:"method",name:"handleCalendarResize",static:!1,private:!1,access:{has:e=>"handleCalendarResize"in e,get:e=>e.handleCalendarResize},metadata:r},null,T),a(this,null,A,{kind:"method",name:"handleWeekdayInputsChange",static:!1,private:!1,access:{has:e=>"handleWeekdayInputsChange"in e,get:e=>e.handleWeekdayInputsChange},metadata:r},null,T),a(null,null,n,{kind:"field",name:"value",static:!1,private:!1,access:{has:e=>"value"in e,get:e=>e.value,set:(e,t)=>{e.value=t}},metadata:r},N,P),a(null,null,s,{kind:"field",name:"view",static:!1,private:!1,access:{has:e=>"view"in e,get:e=>e.view,set:(e,t)=>{e.view=t}},metadata:r},R,O),a(null,null,o,{kind:"field",name:"events",static:!1,private:!1,access:{has:e=>"events"in e,get:e=>e.events,set:(e,t)=>{e.events=t}},metadata:r},L,B),a(null,null,l,{kind:"field",name:"minDate",static:!1,private:!1,access:{has:e=>"minDate"in e,get:e=>e.minDate,set:(e,t)=>{e.minDate=t}},metadata:r},F,I),a(null,null,c,{kind:"field",name:"maxDate",static:!1,private:!1,access:{has:e=>"maxDate"in e,get:e=>e.maxDate,set:(e,t)=>{e.maxDate=t}},metadata:r},W,$),a(null,null,d,{kind:"field",name:"disabledDates",static:!1,private:!1,access:{has:e=>"disabledDates"in e,get:e=>e.disabledDates,set:(e,t)=>{e.disabledDates=t}},metadata:r},H,Y),a(null,null,h,{kind:"field",name:"highlightToday",static:!1,private:!1,access:{has:e=>"highlightToday"in e,get:e=>e.highlightToday,set:(e,t)=>{e.highlightToday=t}},metadata:r},V,q),a(null,null,p,{kind:"field",name:"showWeekNumbers",static:!1,private:!1,access:{has:e=>"showWeekNumbers"in e,get:e=>e.showWeekNumbers,set:(e,t)=>{e.showWeekNumbers=t}},metadata:r},j,G),a(null,null,u,{kind:"field",name:"firstDayOfWeek",static:!1,private:!1,access:{has:e=>"firstDayOfWeek"in e,get:e=>e.firstDayOfWeek,set:(e,t)=>{e.firstDayOfWeek=t}},metadata:r},U,K),a(null,null,m,{kind:"field",name:"locale",static:!1,private:!1,access:{has:e=>"locale"in e,get:e=>e.locale,set:(e,t)=>{e.locale=t}},metadata:r},X,J),a(null,null,v,{kind:"field",name:"noDaySelect",static:!1,private:!1,access:{has:e=>"noDaySelect"in e,get:e=>e.noDaySelect,set:(e,t)=>{e.noDaySelect=t}},metadata:r},Q,Z),a(null,null,g,{kind:"field",name:"cellSizing",static:!1,private:!1,access:{has:e=>"cellSizing"in e,get:e=>e.cellSizing,set:(e,t)=>{e.cellSizing=t}},metadata:r},ee,te),a(null,null,b,{kind:"field",name:"eventTooltip",static:!1,private:!1,access:{has:e=>"eventTooltip"in e,get:e=>e.eventTooltip,set:(e,t)=>{e.eventTooltip=t}},metadata:r},ae,re),a(null,null,f,{kind:"field",name:"eventPopover",static:!1,private:!1,access:{has:e=>"eventPopover"in e,get:e=>e.eventPopover,set:(e,t)=>{e.eventPopover=t}},metadata:r},ie,ne),a(null,e={value:i},M,{kind:"class",name:i.name,metadata:r},null,S),se=i=e.value,r&&Object.defineProperty(i,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:r})}get columnOffset(){return this.showWeekNumbers?1:0}computeRovingIndex(e){const t=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate();if(this.focusedDate){const a=e.findIndex(e=>t(e,this.focusedDate));if(a>=0)return a}if(this.value){const a=this.value instanceof Date?this.value:new Date(this.value);if(!isNaN(a.getTime())){const r=e.findIndex(e=>t(e,a));if(r>=0)return r}}const a=new Date,r=e.findIndex(e=>t(e,a));return r>=0?r:e.findIndex(e=>e.getMonth()===this.displayDate.getMonth())}dispatchChange(){return{value:this.value,calendar:this}}dispatchEventClick(e){return{event:e,calendar:this}}dispatchMoreClick(e,t){return this.dispatchEvent(new CustomEvent("calendar-more-click",{detail:{date:e,count:t,calendar:this},bubbles:!0,composed:!0,cancelable:!0}))}styles(){return t.css`${":host([hidden]){display:none}:host{display:block;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);contain:layout style}:host([overlay-open]){position:relative;z-index:var(--snice-z-floating,1000)}.calendar{width:100%;max-width:37.5rem;position:relative;height:100%;display:flex;flex-direction:column}.calendar__header{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);display:flex;align-items:center;justify-content:space-between;padding:var(--snice-spacing-md,1rem);background:var(--snice-color-surface,rgb(255 255 255));border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar__title{font-family:var(--snice-font-family-display, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);font-size:var(--snice-heading-md, 1.125rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text,rgb(23 23 23))}.calendar__nav{display:flex;gap:var(--snice-spacing-xs,.5rem)}.calendar__nav-button{padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-sm,.75rem);border:1px solid var(--snice-color-border,rgb(226 226 226));background:var(--snice-color-surface,rgb(255 255 255));border-radius:var(--snice-border-radius-md,.25rem);cursor:pointer;transition:background-color var(--snice-transition-fast, 150ms) ease,border-color var(--snice-transition-fast, 150ms) ease;font-size:var(--snice-font-size-sm, .875rem);color:var(--snice-color-text,rgb(23 23 23));font-family:inherit}.calendar__nav-button:hover{background:var(--snice-color-surface-container-low,rgb(250 250 250));border-color:var(--snice-color-border-hover,rgb(204 204 204))}.calendar__nav-button:focus-visible{outline:0;box-shadow:0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-template-rows:min-content repeat(6,var(--calendar-row-cap,auto));flex:1 1 auto;position:relative;background:var(--snice-color-surface,rgb(255 255 255));container-type:inline-size}.calendar__weekday{box-sizing:border-box;min-width:0;overflow:hidden;padding:var(--snice-spacing-sm,.75rem);text-align:center;font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-secondary,rgb(82 82 82));text-transform:uppercase;letter-spacing:var(--snice-tracking-widest, .1em);border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar__day{box-sizing:border-box;min-width:0;min-height:min(max(calc(100cqw / 7),3rem,calc(2.125rem + var(--calendar-week-lanes,0) * 1.375rem + var(--calendar-week-more,0rem))),var(--calendar-row-cap,100000px));padding:var(--snice-spacing-xs,.5rem);border:1px solid var(--snice-color-border,rgb(226 226 226));border-top:none;border-left:none;cursor:pointer;transition:background-color var(--snice-transition-fast, 150ms) ease;position:relative;background:var(--snice-color-surface,rgb(255 255 255));color:var(--snice-color-text,rgb(23 23 23));overflow:hidden}.calendar__day:hover{background:var(--snice-color-surface-container-low,rgb(250 250 250))}.calendar__day:focus-visible{outline:0;box-shadow:inset 0 0 0 2px var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__day--week-start{border-left:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar--week-numbers .calendar__day--week-start{border-left:none}.calendar__day--stretch{min-height:min(max(3rem,calc(2.125rem + var(--calendar-week-lanes,0) * 1.375rem + var(--calendar-week-more,0rem))),var(--calendar-row-cap,100000px))}.calendar__day--static{cursor:default}.calendar__day--static:hover{background:var(--snice-color-surface,rgb(255 255 255))}.calendar__day--static.calendar__day--today:hover{background:var(--snice-color-primary-subtle,rgb(239 246 255))}.calendar__day--other-month{background:var(--snice-color-surface,rgb(255 255 255));color:var(--snice-color-text-tertiary,rgb(115 115 115));opacity:.5}.calendar__day--other-month:hover{opacity:.7}.calendar__day--today{background:var(--snice-color-primary-subtle,rgb(239 246 255))}.calendar__day--today:hover{background:var(--snice-color-primary-subtle-hover,rgb(219 234 254))}.calendar__day--selected{background:var(--snice-color-primary,rgb(37 99 235));color:var(--snice-color-text-inverse,rgb(250 250 250))}.calendar__day--selected:hover{background:var(--snice-color-primary-hover,rgb(29 78 216))}.calendar__day--disabled{background:var(--snice-color-surface-container,rgb(241 241 241));color:var(--snice-color-text-tertiary,rgb(115 115 115));opacity:.5;cursor:not-allowed}.calendar__day--disabled:hover{background:var(--snice-color-surface-container,rgb(241 241 241))}.calendar__day-number{font-size:var(--snice-font-size-sm, .875rem);font-weight:var(--snice-font-weight-medium,500);margin-bottom:var(--snice-spacing-2xs,.25rem)}.calendar__day--selected .calendar__day-number{color:var(--snice-color-text-inverse,rgb(250 250 250))}.calendar__event-bar{display:flex;align-items:center;gap:var(--snice-spacing-3xs,.125rem);position:absolute;inset:0 0 auto 0;margin-top:calc(1.875rem + var(--calendar-event-lane,0) * 1.375rem);margin-inline:var(--snice-spacing-3xs,0.125rem);height:1.125rem;line-height:1.125rem;font-size:var(--snice-font-size-2xs, .625rem);padding:0 var(--snice-spacing-2xs,.25rem);border-radius:var(--snice-border-radius-sm,.125rem);background:var(--snice-color-primary,rgb(37 99 235));color:var(--snice-color-text-inverse,rgb(250 250 250));white-space:nowrap;overflow:hidden;cursor:pointer;z-index:1;transition:opacity var(--snice-transition-fast, 150ms) ease}.calendar__event-bar--compact{padding-inline:var(--snice-spacing-3xs,0.125rem)}.calendar__event-title{overflow:hidden;text-overflow:ellipsis;min-width:0}.calendar__event-avatar{flex:none;--avatar-size:0.875rem;font-size:.375rem;border-radius:50%;overflow:hidden}.calendar__popover{position:absolute;z-index:var(--snice-z-floating,1000);min-width:14rem;max-width:22rem;padding:var(--snice-spacing-sm,.75rem);border:1px solid var(--snice-color-border,rgb(226 226 226));border-radius:var(--snice-border-radius-md,.25rem);background:var(--snice-color-surface,rgb(255 255 255));color:var(--snice-color-text,rgb(23 23 23));font-size:var(--snice-font-size-sm, .875rem);line-height:1.5;box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1))}.calendar__popover:focus-visible{outline:0;box-shadow:var(--snice-shadow-lg,0 10px 15px -3px rgb(0 0 0 / .1)),0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__popover-loading{color:var(--snice-color-text-secondary,rgb(82 82 82));font-size:var(--snice-font-size-xs, .75rem)}.calendar__more-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--snice-spacing-3xs,.125rem);max-height:15rem;overflow-y:auto}.calendar__more-item{display:flex;align-items:center;gap:var(--snice-spacing-xs,.5rem);width:100%;padding:var(--snice-spacing-2xs,.25rem) var(--snice-spacing-xs,.5rem);border:none;border-radius:var(--snice-border-radius-sm,.125rem);background:0 0;color:var(--snice-color-text,rgb(23 23 23));font-family:inherit;font-size:var(--snice-font-size-sm, .875rem);text-align:start;cursor:pointer;transition:background-color var(--snice-transition-fast, 150ms) ease}.calendar__more-item:hover{background:var(--snice-color-surface-container-low,rgb(250 250 250))}.calendar__more-item:focus-visible{outline:0;box-shadow:0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar__more-dot{flex:none;width:.5rem;height:.5rem;border-radius:50%;background:var(--snice-color-primary,rgb(37 99 235))}.calendar__more-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.calendar__more-date{margin:0 0 var(--snice-spacing-2xs,.25rem);font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-semibold,600);color:var(--snice-color-text-secondary,rgb(82 82 82))}.calendar__tooltip{position:absolute;z-index:var(--snice-z-floating,1000);max-width:18rem;padding:var(--snice-spacing-2xs,.25rem) var(--snice-spacing-xs,.5rem);border-radius:var(--snice-border-radius-md,.25rem);background:var(--snice-tooltip-bg,rgb(51 51 51));color:var(--snice-tooltip-color,rgb(255 255 255));font-size:var(--snice-font-size-xs, .75rem);line-height:1.4;box-shadow:var(--snice-shadow-md,0 4px 6px -1px rgb(0 0 0 / .1));pointer-events:none}.calendar__event-bar:hover{opacity:.8}.calendar__event-bar--continues-left{border-top-left-radius:0;border-bottom-left-radius:0;margin-inline-start:0}.calendar__event-bar--continues-right{border-top-right-radius:0;border-bottom-right-radius:0;margin-inline-end:0}.calendar__more{position:absolute;bottom:var(--snice-spacing-3xs,.125rem);left:var(--snice-spacing-2xs,.25rem);font-size:var(--snice-font-size-xs, .75rem);font-weight:var(--snice-font-weight-medium,500);color:var(--snice-color-text,rgb(23 23 23));cursor:pointer}.calendar__more:hover{text-decoration:underline}.calendar__more:focus-visible{outline:0;box-shadow:0 0 0 var(--snice-focus-ring-width,2px) var(--snice-focus-ring-color,rgb(59 130 246 / .5))}.calendar--week-numbers .calendar__grid{grid-template-columns:var(--calendar-week-number-width,2.25rem) repeat(7,minmax(0,1fr))}.calendar--week-numbers .calendar__weekday{padding-inline:var(--snice-spacing-2xs,0.25rem)}.calendar--week-numbers .calendar__day{min-height:min(max(calc((100cqw - var(--calendar-week-number-width,2.25rem))/ 7),3rem,calc(2.125rem + var(--calendar-week-lanes,0) * 1.375rem + var(--calendar-week-more,0rem))),var(--calendar-row-cap,100000px))}.calendar__week-number{box-sizing:border-box;display:flex;align-items:flex-start;justify-content:center;padding:var(--snice-spacing-xs,.5rem) var(--snice-spacing-2xs,.25rem);text-align:center;font-size:var(--snice-font-size-xs, .75rem);font-variant-numeric:tabular-nums;color:var(--snice-color-text-tertiary,rgb(115 115 115));background:var(--snice-color-surface-container-low,rgb(250 250 250));border:1px solid var(--snice-color-border,rgb(226 226 226));border-top:none}.calendar__week-number--header{background:var(--snice-color-surface,rgb(255 255 255));border:none;border-bottom:1px solid var(--snice-color-border,rgb(226 226 226))}.calendar--week .calendar__grid{grid-template-columns:repeat(7,1fr)}.calendar--week .calendar__day{min-height:7.5rem}.calendar--day .calendar__grid{grid-template-columns:1fr}.calendar--day .calendar__day{min-height:25rem}@media (prefers-reduced-motion:reduce){*{transition-duration:0s!important;animation-duration:0s!important}}"}`}initialize(){this.createDOM(),this.updateView()}createDOM(){const e=this.shadowRoot;this.container=document.createElement("div"),this.container.className=`calendar calendar--${this.view}`,this.container.setAttribute("part","base"),this.header=document.createElement("div"),this.header.className="calendar__header",this.header.setAttribute("part","header");const t=document.createElement("div");t.className="calendar__title";const a=document.createElement("div");a.className="calendar__nav";const r=document.createElement("button");r.className="calendar__nav-button",r.textContent="Today",r.onclick=()=>this.goToToday();const i=document.createElement("button");i.className="calendar__nav-button",i.textContent="‹",i.onclick=()=>this.previousMonth();const n=document.createElement("button");n.className="calendar__nav-button",n.textContent="›",n.onclick=()=>this.nextMonth(),a.appendChild(r),a.appendChild(i),a.appendChild(n),this.header.appendChild(t),this.header.appendChild(a),this.grid=document.createElement("div"),this.grid.className="calendar__grid",this.grid.setAttribute("part","grid"),this.getWeekdays().forEach((e,t)=>{const a=document.createElement("div");a.className="calendar__weekday",a.textContent=e,a.style.gridRow="1",a.style.gridColumn=String(t+1+this.columnOffset),this.grid.appendChild(a)}),this.grid.setAttribute("role","grid"),this.grid.setAttribute("aria-label","Calendar"),this.grid.addEventListener("keydown",this.handleGridKeydown);for(let e=0;e<42;e++){const t=document.createElement("div");t.className="calendar__day",t.setAttribute("role","gridcell"),t.setAttribute("tabindex",0===e?"0":"-1"),t.style.gridRow=String(Math.floor(e/7)+2),t.style.gridColumn=String(e%7+1+this.columnOffset);const a=document.createElement("div");a.className="calendar__day-number",t.appendChild(a),this.grid.appendChild(t),this.dayCells.push(t)}this.weekNumberHeader=document.createElement("div"),this.weekNumberHeader.className="calendar__week-number calendar__week-number--header",this.weekNumberHeader.setAttribute("part","week-number-header"),this.weekNumberHeader.setAttribute("aria-hidden","true"),this.weekNumberHeader.style.gridRow="1",this.weekNumberHeader.style.gridColumn="1";for(let e=0;e<6;e++){const t=document.createElement("div");t.className="calendar__week-number",t.setAttribute("part","week-number"),t.setAttribute("role","rowheader"),t.style.gridRow=String(e+2),t.style.gridColumn="1",this.weekNumberCells.push(t)}this.tooltipEl=document.createElement("div"),this.tooltipEl.className="calendar__tooltip",this.tooltipEl.setAttribute("part","event-tooltip"),this.tooltipEl.setAttribute("role","tooltip"),this.tooltipEl.id="calendar-event-tooltip",this.tooltipEl.hidden=!0,this.popoverEl=document.createElement("div"),this.popoverEl.className="calendar__popover",this.popoverEl.setAttribute("part","event-popover"),this.popoverEl.setAttribute("role","dialog"),this.popoverEl.setAttribute("aria-label","Event details"),this.popoverEl.tabIndex=-1,this.popoverEl.hidden=!0,this.container.appendChild(this.header),this.container.appendChild(this.grid),this.container.appendChild(this.tooltipEl),this.container.appendChild(this.popoverEl),e.appendChild(this.container)}async*requestEventPopoverContent(e){return await(yield{event:e})}beginPopover(e,t){const a=++this.popoverToken;return this.hideEventTooltip(),this.setAnchorExpanded(this.popoverBar,!1),this.setAnchorExpanded(e,!0),this.popoverBar=e,this.popoverEl.setAttribute("aria-label",t),this.popoverEl.replaceChildren(),this.popoverEl.hidden=!1,this.syncOverlayLift(),document.addEventListener("keydown",this.boundPopoverEscape,!0),document.addEventListener("mousedown",this.boundPopoverOutside,!0),a}async openEventPopover(e,t){const a=this.beginPopover(e,t.title||"Event details"),r=document.createElement("div");let i;r.className="calendar__popover-loading",r.textContent="Loading…",this.popoverEl.appendChild(r),this.positionPopover(e);try{i=!0!==t.popover&&t.popover?"function"==typeof t.popover?t.popover():t.popover:this.eventPopover?await this.eventPopover(t):await this.requestEventPopoverContent(t)}catch{i=void 0}if(a===this.popoverToken){if(null==i)return console.warn(`[snice-calendar] event "${String(t.id)}" enables a popover but no content was provided — set eventPopover, event.popover content, or a @respond('calendar/event-popover') handler.`),void this.closeEventPopover({returnFocus:!1});"string"==typeof i?this.popoverEl.textContent=i:this.popoverEl.replaceChildren(i),this.positionPopover(e),this.popoverEl.focus()}}openMorePanel(e,t,a){const r=t.toLocaleDateString(this.locale,{dateStyle:"full"});this.beginPopover(e,`${a.length} more event${1===a.length?"":"s"} on ${r}`);const i=document.createElement("p");i.className="calendar__more-date",i.setAttribute("part","more-panel-date"),i.textContent=r;const n=document.createElement("ul");n.className="calendar__more-list",n.setAttribute("part","more-list"),n.setAttribute("role","list");for(const t of a){const a=document.createElement("li"),r=document.createElement("button");r.type="button",r.className="calendar__more-item",r.setAttribute("part","more-item");const i=document.createElement("span");i.className="calendar__more-dot",i.setAttribute("part","more-dot"),i.setAttribute("aria-hidden","true"),t.color&&(i.style.background=t.color);const s=document.createElement("span");s.className="calendar__more-title",s.textContent=t.title,r.append(i,s),r.onclick=a=>this.handleMorePanelEntry(e,t,a),a.appendChild(r),n.appendChild(a)}this.popoverEl.append(i,n),this.positionPopover(e),this.popoverEl.focus()}handleMorePanelEntry(e,t,a){this.handleEventClick(t,a),t.popover?this.openEventPopover(e,t):this.closeEventPopover()}placeOverlay(e,t,a){const r=this.container.getBoundingClientRect();e.style.left=t-r.left-this.container.clientLeft+"px",e.style.top=a-r.top-this.container.clientTop+"px"}static{this.OVERLAY_GAP=6}static{this.OVERLAY_EDGE=4}clampOverlayX(e,t){const a=se.OVERLAY_EDGE,r=window.innerWidth||0;return Math.max(a,r>0?Math.min(e,r-t-a):e)}positionPopover(e){const t=e.getBoundingClientRect(),a=this.popoverEl.offsetWidth,r=this.popoverEl.offsetHeight,i=se.OVERLAY_GAP,n=se.OVERLAY_EDGE,s=window.innerHeight||0;let o=t.bottom+i;if(s>0&&o+r>s-n){const e=t.top-i-r;o=e>=n?e:Math.max(n,s-r-n)}this.placeOverlay(this.popoverEl,this.clampOverlayX(t.left,a),o)}closeEventPopover(e={}){if(!this.popoverBar)return;this.popoverToken++;const t=this.popoverBar;this.setAnchorExpanded(t,!1),this.popoverBar=null,this.popoverEl.hidden=!0,this.popoverEl.replaceChildren(),this.syncOverlayLift(),document.removeEventListener("keydown",this.boundPopoverEscape,!0),document.removeEventListener("mousedown",this.boundPopoverOutside,!0),!1!==e.returnFocus&&t.isConnected&&t.focus()}setAnchorExpanded(e,t){e?.hasAttribute("aria-haspopup")&&e.setAttribute("aria-expanded",String(t))}cleanupPopover(){document.removeEventListener("keydown",this.boundPopoverEscape,!0),document.removeEventListener("mousedown",this.boundPopoverOutside,!0)}async showEventTooltip(e,t){const a=++this.tooltipToken,r=this.eventTooltip;let i;if(r)try{i=await r(t)}catch{i=t.tooltip}else i=t.tooltip;a===this.tooltipToken&&null!=i&&("string"==typeof i?this.tooltipEl.textContent=i:this.tooltipEl.replaceChildren(i),this.tooltipEl.hidden=!1,this.tooltipBar=e,e.setAttribute("aria-describedby",this.tooltipEl.id),this.syncOverlayLift(),this.positionTooltip(e))}positionTooltip(e){const t=e.getBoundingClientRect(),a=se.OVERLAY_GAP;let r=t.top-this.tooltipEl.offsetHeight-a;r<se.OVERLAY_EDGE&&(r=t.bottom+a),this.placeOverlay(this.tooltipEl,this.clampOverlayX(t.left,this.tooltipEl.offsetWidth),r)}hideEventTooltip(){this.tooltipToken++,this.tooltipEl.hidden=!0,this.tooltipBar?.removeAttribute("aria-describedby"),this.tooltipBar=null,this.syncOverlayLift()}syncOverlayLift(){this.toggleAttribute("overlay-open",!!this.popoverBar||!!this.tooltipBar)}updateView(){const e=this.displayDate.toLocaleDateString(this.locale,{month:"long",year:"numeric"}),t=this.header.querySelector(".calendar__title");t&&(t.textContent=e);const a=this.getMonthDays(),r=this.displayDate.getMonth();this.syncWeekNumberColumn(a);const i=this.computeRovingIndex(a);a.forEach((e,t)=>{const a=this.dayCells[t];if(!a)return;const n=e.getMonth()!==r,s=this.highlightToday&&this.isToday(e),o=!this.noDaySelect&&this.isSelected(e),l=this.isDisabled(e);a.className="calendar__day",t%7==0&&a.classList.add("calendar__day--week-start"),n&&a.classList.add("calendar__day--other-month"),s&&a.classList.add("calendar__day--today"),o&&a.classList.add("calendar__day--selected"),l&&a.classList.add("calendar__day--disabled"),this.noDaySelect&&a.classList.add("calendar__day--static"),"stretch"===this.cellSizing&&a.classList.add("calendar__day--stretch"),a.setAttribute("role","gridcell"),a.setAttribute("aria-selected",o?"true":"false"),a.setAttribute("aria-disabled",l?"true":"false"),a.setAttribute("aria-current",s&&!n?"date":"false"),a.setAttribute("tabindex",t===i?"0":"-1"),a.setAttribute("aria-label",e.toLocaleDateString(this.locale,{dateStyle:"full"})),a.__date=e;const c=a.querySelector(".calendar__day-number");c&&(c.textContent=String(e.getDate())),a.onclick=()=>this.handleDayClick(e)}),this.renderEventStripes(a)}syncWeekNumberColumn(e){const t=this.showWeekNumbers;this.container.classList.toggle("calendar--week-numbers",t),t?(this.weekNumberHeader.isConnected||this.grid.insertBefore(this.weekNumberHeader,this.grid.firstChild),this.weekNumberCells.forEach((t,a)=>{t.isConnected||this.grid.insertBefore(t,this.dayCells[7*a]);const r=this.getWeekNumber(e[7*a]);t.textContent=String(r),t.setAttribute("aria-label",`Week ${r}`)})):(this.weekNumberHeader.remove(),this.weekNumberCells.forEach(e=>e.remove()));const a=this.columnOffset;this.grid.querySelectorAll(".calendar__weekday").forEach((e,t)=>{e.style.gridColumn=String(t+1+a)}),this.dayCells.forEach((e,t)=>{e.style.gridColumn=String(t%7+1+a)})}getWeekNumber(e){const t=6048e5,a=(e,t,a)=>new Date(e,t,a).getTime();if(1===this.firstDayOfWeek){const r=new Date(e.getFullYear(),e.getMonth(),e.getDate()+3),i=r.getFullYear(),n=a(i,0,4-(new Date(i,0,4).getDay()+6)%7);return 1+Math.round((r.getTime()-n)/t)}const r=new Date(e.getFullYear(),e.getMonth(),e.getDate()+6).getFullYear(),i=a(r,0,1-(new Date(r,0,1).getDay()-this.firstDayOfWeek+7)%7);return 1+Math.round((a(e.getFullYear(),e.getMonth(),e.getDate())-i)/t)}static{this.LANE_HEIGHT_REM=1.375}static{this.LANE_STACK_TOP_REM=2.125}static{this.MORE_CHIP_REM=1}static{this.STRETCH_FLOOR_REM=3}static{this.DEFAULT_EVENT_LANES=3}static{this.LANE_MIN_FIT_REM=3}static{this.MORE_CHIP_FIT_REM=1.125}static{this.AVATAR_MIN_SEGMENT_REM=4.5}laneBudget(){const e=parseFloat(getComputedStyle(document.documentElement).fontSize)||16,t=this.dayCells[0]?.getBoundingClientRect().height??0;if(!t){const t=se.DEFAULT_EVENT_LANES;return{fit:t,withMore:t,height:0,rem:e}}if("stretch"===this.cellSizing&&!this.rowCapped&&t<=se.STRETCH_FLOOR_REM*e+1)return{fit:1/0,withMore:1/0,height:t,rem:e};const a=a=>{const r=Math.floor((t/e-se.LANE_STACK_TOP_REM-a)/se.LANE_HEIGHT_REM);return r>=1?r:this.rowCapped?t/e>=se.LANE_MIN_FIT_REM+(a>0?se.MORE_CHIP_FIT_REM:0)?1:0:1};return{fit:a(0),withMore:a(se.MORE_CHIP_REM),height:t,rem:e}}syncRowCap(){if(this.grid.style.removeProperty("--calendar-row-cap"),this.rowCapped=!1,"month"!==this.view)return;const e=getComputedStyle(this),t=this.clientHeight-parseFloat(e.paddingTop)-parseFloat(e.paddingBottom),a=Math.min(this.container.clientHeight,t)-this.header.getBoundingClientRect().height,r=this.grid.getBoundingClientRect().height;if(!(a>0)||!(r>0)||r<=a+.5)return;const i=this.grid.querySelector(".calendar__weekday")?.getBoundingClientRect().height??0,n=this.dayCells[0],s=n?getComputedStyle(n):null,o=s?parseFloat(s.paddingTop)+parseFloat(s.paddingBottom)+parseFloat(s.borderTopWidth)+parseFloat(s.borderBottomWidth):0,l=Math.max((a-i)/se.WEEK_ROWS,o);l>0&&(this.rowCapped=!0,this.grid.style.setProperty("--calendar-row-cap",`${l}px`))}static{this.WEEK_ROWS=6}renderEventStripes(e){if(this.closeEventPopover({returnFocus:!1}),this.grid.querySelectorAll(".calendar__event-bar").forEach(e=>e.remove()),this.dayCells.forEach(e=>{e.querySelector(".calendar__more")?.remove(),e.style.removeProperty("--calendar-week-lanes"),e.style.removeProperty("--calendar-week-more")}),this.syncRowCap(),!this.events||0===this.events.length)return;const t=e.map(e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()),a=new Map(t.map((e,t)=>[e,t])),r=t[0],i=t[t.length-1],n=e=>{const t="string"==typeof e?new Date(e):e;return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()},s=[];this.events.forEach((e,o)=>{if(!e.start)return;const l=n(e.start);if(isNaN(l))return;const c=e.end?Math.max(n(e.end),l):l;if(isNaN(c)||c<r||l>i)return;const d=l<r,h=c>i,p=d?0:a.get(l),u=h?t.length-1:a.get(c);s.push({event:e,startIdx:p,endIdx:u,startsBeforeGrid:d,endsAfterGrid:h,startTime:l,duration:c-l,order:o})}),s.sort((e,t)=>e.startTime-t.startTime||t.duration-e.duration||e.order-t.order);const o=Array.from({length:t.length},()=>[]),l=Math.floor(t.length/7),c=new Array(l).fill(0),d=this.laneBudget(),h=this.dayCells[0]?.getBoundingClientRect().width??0,p=se.AVATAR_MIN_SEGMENT_REM*d.rem;for(let e=0;e<l;e++){const t=7*e,a=t+6,r=[],i=[];let n=0;for(const e of s){if(e.endIdx<t||e.startIdx>a)continue;const s=Math.max(e.startIdx,t),o=Math.min(e.endIdx,a),l=s-t,c=o-t;let d=0;for(;r[d]?.some(([e,t])=>l<=t&&c>=e);)d++;(r[d]??=[]).push([l,c]),i.push({item:e,lane:d,segStart:s,segEnd:o}),n=Math.max(n,d+1)}const l=n<=d.fit?n:d.withMore;c[e]=Math.min(n,l);for(const{item:a,lane:r,segStart:n,segEnd:s}of i){if(r>=l){for(let e=n;e<=s;e++)o[e].push(a.event);continue}const i=n-t,c=s-t,d=n>a.startIdx||n===a.startIdx&&a.startsBeforeGrid,u=s<a.endIdx||s===a.endIdx&&a.endsAfterGrid,m=h>0&&h*(c-i+1)<p,v=document.createElement("div");v.className="calendar__event-bar",d&&v.classList.add("calendar__event-bar--continues-left"),u&&v.classList.add("calendar__event-bar--continues-right"),m&&v.classList.add("calendar__event-bar--compact");const g=a.event.className?a.event.className.split(/\s+/).filter(Boolean):[];if(v.classList.add(...g),v.setAttribute("part",["event-bar",...g].join(" ")),v.setAttribute("data-event-id",String(a.event.id)),v.setAttribute("data-lane",String(r)),v.style.gridRow=String(e+2),v.style.gridColumn=`${i+1+this.columnOffset} / ${c+2+this.columnOffset}`,v.style.setProperty("--calendar-event-lane",String(r)),a.event.color&&(v.style.background=a.event.color),a.event.avatar&&!m){const e="string"==typeof a.event.avatar?{src:a.event.avatar}:a.event.avatar,t=document.createElement("snice-avatar");t.className="calendar__event-avatar",t.setAttribute("part","event-avatar"),t.setAttribute("size","xs"),t.setAttribute("shape","circle"),t.setAttribute("loading","eager"),e.src&&(t.src=e.src),e.name&&(t.name=e.name),e.alt&&(t.alt=e.alt),v.appendChild(t)}const b=document.createElement("span");b.className="calendar__event-title",b.textContent=a.event.title,v.appendChild(b),a.event.tooltip||this.eventTooltip?(v.onmouseenter=()=>this.showEventTooltip(v,a.event),v.onmouseleave=()=>this.hideEventTooltip()):v.title=a.event.title,a.event.popover?(v.setAttribute("role","button"),v.setAttribute("tabindex","0"),v.setAttribute("aria-haspopup","dialog"),v.onkeydown=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),e.stopPropagation(),this.openEventPopover(v,a.event))},v.onclick=e=>{this.handleEventClick(a.event,e),this.openEventPopover(v,a.event)}):v.onclick=e=>this.handleEventClick(a.event,e),this.grid.appendChild(v)}}o.forEach((t,a)=>{const r=t.length;if(0===r)return;const i=this.dayCells[a];if(!i)return;const n=e[a],s=document.createElement("div");s.className="calendar__more",s.setAttribute("part","more-chip"),s.textContent=`+${r} more`,s.setAttribute("role","button"),s.setAttribute("tabindex","0"),s.setAttribute("aria-haspopup","dialog"),s.setAttribute("aria-expanded","false"),s.setAttribute("aria-label",`${r} more event${1===r?"":"s"} on ${n.toLocaleDateString(this.locale,{dateStyle:"full"})}`),s.onclick=e=>this.handleMoreClick(n,s,t,e),s.onkeydown=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.handleMoreClick(n,s,t,e))},i.appendChild(s)});for(let e=0;e<l;e++){if(0===c[e])continue;const t=o.slice(7*e,7*e+7).some(e=>e.length>0);if(!(d.height&&(se.LANE_STACK_TOP_REM+c[e]*se.LANE_HEIGHT_REM+(t?se.MORE_CHIP_REM:0))*d.rem<=d.height+.5))for(let a=7*e;a<7*e+7;a++){const r=this.dayCells[a];r&&(r.style.setProperty("--calendar-week-lanes",String(c[e])),t&&r.style.setProperty("--calendar-week-more",`${se.MORE_CHIP_REM}rem`))}}}goToToday(){this.displayDate=new Date,this.value=new Date,this.updateView(),this.dispatchChange()}goToDate(e){this.displayDate="string"==typeof e?new Date(e):e,this.value=this.displayDate,this.updateView(),this.dispatchChange()}previousMonth(){this.displayDate=new Date(this.displayDate.getFullYear(),this.displayDate.getMonth()-1),this.updateView()}nextMonth(){this.displayDate=new Date(this.displayDate.getFullYear(),this.displayDate.getMonth()+1),this.updateView()}previousWeek(){this.displayDate=new Date(this.displayDate.getTime()-6048e5),this.updateView()}nextWeek(){this.displayDate=new Date(this.displayDate.getTime()+6048e5),this.updateView()}previousDay(){this.displayDate=new Date(this.displayDate.getTime()-864e5),this.updateView()}nextDay(){this.displayDate=new Date(this.displayDate.getTime()+864e5),this.updateView()}getDisplayedMonth(){return{month:this.displayDate.getMonth(),year:this.displayDate.getFullYear()}}getEventsForDate(e){const t="string"==typeof e?new Date(e):e,a=t.getTime();return this.events.filter(e=>{if(!e.start)return!1;const r="string"==typeof e.start?new Date(e.start):e.start,i=new Date(r.getFullYear(),r.getMonth(),r.getDate()).getTime();if(!e.end)return this.isSameDay(t,r);const n="string"==typeof e.end?new Date(e.end):e.end,s=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime();return a>=i&&a<=s})}formatDate(e){return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}isSameDay(e,t){return this.formatDate(e)===this.formatDate(t)}isToday(e){return this.isSameDay(e,new Date)}isSelected(e){if(!this.value)return!1;const t="string"==typeof this.value?new Date(this.value):this.value;return t instanceof Date&&!isNaN(t.getTime())&&this.isSameDay(e,t)}isDisabled(e){if(this.minDate){const t="string"==typeof this.minDate?new Date(this.minDate):this.minDate;if(e<t)return!0}if(this.maxDate){const t="string"==typeof this.maxDate?new Date(this.maxDate):this.maxDate;if(e>t)return!0}return this.disabledDates.some(t=>{const a="string"==typeof t?new Date(t):t;return this.isSameDay(e,a)})}handleDayClick(e){this.noDaySelect||this.isDisabled(e)||(this.value=e,this.updateView(),this.dispatchChange())}handleEventClick(e,t){t.stopPropagation(),this.dispatchEventClick(e)}handleMoreClick(e,t,a,r){r.stopPropagation(),this.dispatchMoreClick(e,a.length)&&this.openMorePanel(t,e,a)}getMonthDays(){const e=this.displayDate.getFullYear(),t=this.displayDate.getMonth(),a=new Date(e,t,1).getDay(),r=new Date(e,t,1-(a-this.firstDayOfWeek+7)%7),i=[];for(let e=0;e<42;e++)i.push(new Date(r.getFullYear(),r.getMonth(),r.getDate()+e));return i}getWeekdays(){const e=[],t=new Date(2024,0,this.firstDayOfWeek);for(let a=0;a<7;a++){const r=new Date(t);r.setDate(t.getDate()+a),e.push(r.toLocaleDateString(this.locale,{weekday:"short"}))}return e}handlePropertyChange(){this.grid&&this.updateView()}handleCalendarResize(e){if(!this.grid)return;const t=`${Math.round(e.contentRect.width)}x${Math.round(e.contentRect.height)}`;t!==this.laidOutFor&&(this.laidOutFor=t,this.updateView())}handleWeekdayInputsChange(){if(!this.grid)return;this.grid.querySelectorAll(".calendar__weekday").forEach(e=>e.remove());const e=this.getWeekdays(),t=(this.weekNumberCells[0]?.isConnected?this.weekNumberCells[0]:this.dayCells[0])??null;e.forEach((e,a)=>{const r=document.createElement("div");r.className="calendar__weekday",r.textContent=e,r.style.gridRow="1",r.style.gridColumn=String(a+1+this.columnOffset),this.grid.insertBefore(r,t)}),this.updateView()}static{r(i,S)}};return se=i})();return e.SniceCalendar=i,e}({},Snice);
|
|
29
29
|
//# sourceMappingURL=snice-calendar.min.js.map
|