@salyra-ui/calendar 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/angular/Action.d.ts +13 -0
  4. package/dist/angular/CalendarNumber.d.ts +10 -0
  5. package/dist/angular/CalendarView.d.ts +16 -0
  6. package/dist/angular/Cell.d.ts +15 -0
  7. package/dist/angular/Continuous.d.ts +13 -0
  8. package/dist/angular/DateField.d.ts +15 -0
  9. package/dist/angular/DayTrigger.d.ts +15 -0
  10. package/dist/angular/Grid.d.ts +7 -0
  11. package/dist/angular/Heading.d.ts +11 -0
  12. package/dist/angular/MonthYearSelect.d.ts +11 -0
  13. package/dist/angular/PickerRoot.d.ts +51 -0
  14. package/dist/angular/TimeSegmentField.d.ts +16 -0
  15. package/dist/angular/Week.d.ts +7 -0
  16. package/dist/angular/Weekday.d.ts +15 -0
  17. package/dist/angular/index.d.ts +43 -0
  18. package/dist/angular/index.js +1 -0
  19. package/dist/astro/Action.astro +7 -0
  20. package/dist/astro/Calendar.astro +10 -0
  21. package/dist/astro/Cell.astro +13 -0
  22. package/dist/astro/Continuous.astro +9 -0
  23. package/dist/astro/DayTrigger.astro +7 -0
  24. package/dist/astro/Field.astro +11 -0
  25. package/dist/astro/Grid.astro +3 -0
  26. package/dist/astro/Heading.astro +7 -0
  27. package/dist/astro/MonthSelect.astro +13 -0
  28. package/dist/astro/Number.astro +7 -0
  29. package/dist/astro/Period.astro +10 -0
  30. package/dist/astro/Root.astro +15 -0
  31. package/dist/astro/Segment.astro +10 -0
  32. package/dist/astro/Week.astro +3 -0
  33. package/dist/astro/Weekday.astro +13 -0
  34. package/dist/astro/YearSelect.astro +13 -0
  35. package/dist/browser/calendar.js +1535 -0
  36. package/dist/browser/calendar.min.js +1 -0
  37. package/dist/core/calendar.d.ts +48 -0
  38. package/dist/core/day.d.ts +6 -0
  39. package/dist/core/dom.d.ts +50 -0
  40. package/dist/core/format.d.ts +10 -0
  41. package/dist/core/index.d.ts +9 -0
  42. package/dist/core/index.js +1 -0
  43. package/dist/core/popover.d.ts +6 -0
  44. package/dist/core/scroller.d.ts +13 -0
  45. package/dist/core/store.d.ts +107 -0
  46. package/dist/core/time.d.ts +12 -0
  47. package/dist/core/timezone.d.ts +3 -0
  48. package/dist/react/Calendar.d.ts +29 -0
  49. package/dist/react/Continuous.d.ts +5 -0
  50. package/dist/react/Fields.d.ts +25 -0
  51. package/dist/react/Root.d.ts +10 -0
  52. package/dist/react/context.d.ts +74 -0
  53. package/dist/react/index.d.ts +40 -0
  54. package/dist/react/index.js +1 -0
  55. package/dist/styles.css +115 -0
  56. package/dist/styles.min.css +1 -0
  57. package/dist/svelte/Action.svelte +12 -0
  58. package/dist/svelte/CalendarView.svelte +3 -0
  59. package/dist/svelte/Cell.svelte +5 -0
  60. package/dist/svelte/Continuous.svelte +3 -0
  61. package/dist/svelte/DateRoot.svelte +3 -0
  62. package/dist/svelte/DateTimeRoot.svelte +3 -0
  63. package/dist/svelte/DayTrigger.svelte +14 -0
  64. package/dist/svelte/Field.svelte +11 -0
  65. package/dist/svelte/Grid.svelte +5 -0
  66. package/dist/svelte/Heading.svelte +5 -0
  67. package/dist/svelte/MonthSelect.svelte +19 -0
  68. package/dist/svelte/Navigation.svelte +14 -0
  69. package/dist/svelte/Number.svelte +5 -0
  70. package/dist/svelte/Period.svelte +15 -0
  71. package/dist/svelte/Root.svelte +3 -0
  72. package/dist/svelte/Segment.svelte +14 -0
  73. package/dist/svelte/Time.svelte +12 -0
  74. package/dist/svelte/TimeRoot.svelte +3 -0
  75. package/dist/svelte/Week.svelte +5 -0
  76. package/dist/svelte/Weekday.svelte +10 -0
  77. package/dist/svelte/YearSelect.svelte +19 -0
  78. package/dist/svelte/context.ts +1 -0
  79. package/dist/svelte/index.ts +1 -0
  80. package/dist/vanilla/index.d.ts +41 -0
  81. package/dist/vanilla/index.js +1 -0
  82. package/dist/vue/Calendar.d.ts +106 -0
  83. package/dist/vue/Continuous.d.ts +9 -0
  84. package/dist/vue/Fields.d.ts +145 -0
  85. package/dist/vue/Root.d.ts +112 -0
  86. package/dist/vue/context.d.ts +40 -0
  87. package/dist/vue/index.d.ts +208 -0
  88. package/dist/vue/index.js +1 -0
  89. package/package.json +101 -0
@@ -0,0 +1 @@
1
+ "use strict";var SalyraCalendar=(()=>{var _=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var ve=Object.getOwnPropertyNames;var ke=Object.prototype.hasOwnProperty;var we=(e,t)=>{for(var n in t)_(e,n,{get:t[n],enumerable:!0})},Se=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of ve(t))!ke.call(e,l)&&l!==n&&_(e,l,{get:()=>t[l],enumerable:!(a=pe(t,l))||a.enumerable});return e};var De=e=>Se(_({},"__esModule",{value:!0}),e);var Re={};we(Re,{addDays:()=>q,addMonths:()=>P,attribute:()=>w,bindCalendar:()=>K,bindDateField:()=>de,bindDayTrigger:()=>ue,bindMonthScroller:()=>fe,bindPickerForm:()=>Pe,bindPickerPopover:()=>Te,bindTimeSegment:()=>ce,calendarMarkup:()=>Y,createCalendarEngine:()=>z,createPickerStore:()=>se,dateFormatter:()=>X,dateString:()=>C,dayAttributes:()=>U,dayNumber:()=>O,dayTriggerAttributes:()=>le,daysInMonth:()=>R,escapeHTML:()=>$,formatDate:()=>I,formatMonth:()=>F,fromDayNumber:()=>G,isRange:()=>V,leapYear:()=>me,monthScrollerMarkup:()=>Oe,mountPicker:()=>Le,parseDate:()=>S,pointFor:()=>E,resolveZonedDateTime:()=>xe,shiftDateMonths:()=>Q,timeParts:()=>re,timeSeconds:()=>M,timeSegmentValue:()=>ie,timeSlots:()=>Me,timeString:()=>ne,today:()=>te,updateTime:()=>ae,utcDate:()=>ee,validateWeekStart:()=>W,weekNumber:()=>Ee,weekday:()=>N,weekdayLabels:()=>J});function me(e){return e%4===0&&(e%100!==0||e%400===0)}function R(e,t){if(!Number.isInteger(e)||e<1||e>9999||!Number.isInteger(t)||t<1||t>12)throw new RangeError("Calendar supports Gregorian years 1\u20139999 and months 1\u201312");return t===2?me(e)?29:28:[4,6,9,11].includes(t)?30:31}function S(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)throw new RangeError("Use YYYY-MM-DD");let[,n,a,l]=t,i={year:Number(n),month:Number(a),day:Number(l)};if(i.day<1||i.day>R(i.year,i.month))throw new RangeError("Invalid calendar date");return i}function C(e){if(!Number.isInteger(e.day)||e.day<1||e.day>R(e.year,e.month))throw new RangeError("Invalid calendar date");return`${String(e.year).padStart(4,"0")}-${String(e.month).padStart(2,"0")}-${String(e.day).padStart(2,"0")}`}function O(e){let t=S(typeof e=="string"?e:C(e)),n=t.year-(t.month<=2?1:0),a=Math.floor(n/400),l=n-a*400,i=t.month+(t.month>2?-3:9),f=Math.floor((153*i+2)/5)+t.day-1;return a*146097+l*365+Math.floor(l/4)-Math.floor(l/100)+f-719468}function G(e){if(!Number.isInteger(e))throw new RangeError("Day number must be an integer");let t=e+719468,n=Math.floor(t/146097),a=t-n*146097,l=Math.floor((a-Math.floor(a/1460)+Math.floor(a/36524)-Math.floor(a/146096))/365),i=l+n*400,f=a-(365*l+Math.floor(l/4)-Math.floor(l/100)),g=Math.floor((5*f+2)/153),y=f-Math.floor((153*g+2)/5)+1,d=g+(g<10?3:-9);i+=d<=2?1:0;let o={year:i,month:d,day:y};return C(o),o}function q(e,t){return C(G(O(e)+t))}function N(e){return((O(e)+4)%7+7)%7}function P(e,t){if(R(e.year,e.month),!Number.isInteger(t))throw new RangeError("Month offset must be an integer");let n=(e.year-1)*12+e.month-1+t,a={year:Math.floor(n/12)+1,month:(n%12+12)%12+1};return R(a.year,a.month),a}function Q(e,t){let n=S(e),a=P(n,t);return C({...a,day:Math.min(n.day,R(a.year,a.month))})}function Ee(e){let t=O(e),n=(N(e)+6)%7,a=G(t+3-n),l=`${String(a.year).padStart(4,"0")}-01-04`,i=O(l)-(N(l)+6)%7;return{year:a.year,week:Math.floor((t-i)/7)+1}}function W(e){if(!Number.isInteger(e)||e<0||e>6)throw new RangeError("weekStartsOn must be 0\u20136");return e}function z(e=48){if(!Number.isInteger(e)||e<1)throw new RangeError("Cache capacity must be positive");let t=new Map;return{month(n,a,l={}){R(n,a);let i=W(l.weekStartsOn??1),f=`${n}:${a}:${i}:${!!l.fixedWeeks}:${l.outsideDays??"visible"}`,g=t.get(f);if(g)return t.delete(f),t.set(f,g),g;let y=C({year:n,month:a,day:1}),d=(N(y)-i+7)%7,o=O(y),p=O("0001-01-01"),s=O("9999-12-31"),b=l.fixedWeeks?42:Math.ceil((d+R(n,a))/7)*7,m=[];for(let c=0;c<b/7;c++){let u=[];for(let h=0;h<7;h++){let v=o-d+c*7+h;if(v<p||v>s){u.push(Object.freeze({date:"",day:0,weekday:(i+h)%7,outside:!0,hidden:!0}));continue}let D=G(v),T=D.month!==a;u.push(Object.freeze({date:C(D),day:D.day,weekday:(i+h)%7,outside:T,hidden:T&&l.outsideDays==="hidden"}))}m.push(Object.freeze(u))}let r=Object.freeze({year:n,month:a,weeks:Object.freeze(m)});return t.set(f,r),t.size>e&&t.delete(t.keys().next().value),r},clear(){t.clear()},get cacheSize(){return t.size}}}var B=new Map;function X(e,t){let n=JSON.stringify([e,t]),a=B.get(n);return a||(a=new Intl.DateTimeFormat(e,{...t,calendar:"gregory",timeZone:"UTC"}),B.set(n,a),B.size>32&&B.delete(B.keys().next().value)),a}function ee(e){let{year:t,month:n,day:a}=S(e),l=new Date(0);return l.setUTCFullYear(t,n-1,a),l.setUTCHours(12,0,0,0),l}function I(e,t="en-GB",n={dateStyle:"long"}){return X(t,n).format(ee(e))}function F(e,t="en-GB"){return I(`${String(e.year).padStart(4,"0")}-${String(e.month).padStart(2,"0")}-01`,t,{month:"long",year:"numeric"})}function J(e,t,n="short"){let a=X(e,{weekday:n});return Array.from({length:7},(l,i)=>{let f=(t+i)%7;return{weekday:f,label:a.format(ee(`2023-01-${String(f+1).padStart(2,"0")}`))}})}function te(e="UTC",t=new Date){let n=new Intl.DateTimeFormat("en-CA",{timeZone:e,calendar:"gregory",year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(t),a=l=>n.find(i=>i.type===l).value;return`${a("year").padStart(4,"0")}-${a("month")}-${a("day")}`}function M(e){let t=/^(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(e);if(!t||Number(t[1])>23||Number(t[2])>59||Number(t[3]??0)>59)throw new RangeError("Use HH:mm or HH:mm:ss");return Number(t[1])*3600+Number(t[2])*60+Number(t[3]??0)}function ne(e,t=!1){if(!Number.isInteger(e)||e<0||e>86399)throw new RangeError("Time must fit within a day");let n=[Math.floor(e/3600),Math.floor(e/60)%60];return t&&n.push(e%60),n.map(a=>String(a).padStart(2,"0")).join(":")}function re(e,t=24){let n=M(e),a=Math.floor(n/3600);return{hour:t===12?a%12||12:a,minute:Math.floor(n/60)%60,second:n%60,period:a<12?"AM":"PM"}}function ae(e,t,n,a=24,l=!1){let i=re(e,24),f=i.hour,g=i.minute,y=i.second;if(t==="period"){if(n!=="AM"&&n!=="PM")throw new RangeError("Use AM or PM");f=f%12+(n==="PM"?12:0)}else{let d=Number(n),o=t==="hour"?a===12?12:23:59,p=t==="hour"&&a===12?1:0;if(!Number.isInteger(d)||d<p||d>o)throw new RangeError("Invalid time segment");t==="hour"&&(f=a===12?d%12+(i.period==="PM"?12:0):d),t==="minute"&&(g=d),t==="second"&&(y=d)}return ne(f*3600+g*60+y,l)}function Me(e=30,t="00:00",n="23:59"){if(!Number.isInteger(e)||e<1||e>1440)throw new RangeError("Time step must be 1\u20131440 minutes");let a=[],l=M(t),i=M(n),f=t.length===8||n.length===8;if(l>i)throw new RangeError("Time slot bounds must be ordered within one day");for(let g=l;g<=i;g+=e*60)a.push(ne(g,f));return Object.freeze(a)}function ie(e,t,n=24){return!e&&t!=="period"?"":String(re(e??"00:00",n)[t])}function V(e){return e!==null&&"start"in e}function E(e,t="start"){return V(e)?e[t]:t==="start"?e:null}var he=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function ge(e){if(e.kind&&!["date","time","datetime"].includes(e.kind))throw new RangeError("Invalid picker kind");if(e.selection&&!["single","range","none"].includes(e.selection))throw new RangeError("Invalid selection");if(e.hourCycle!==void 0&&e.hourCycle!==12&&e.hourCycle!==24)throw new RangeError("hourCycle must be 12 or 24");let t=e.referenceDate??te(e.timeZone??"UTC");S(t);let n=e.months??1,a=e.minuteStep??1;if(!Number.isInteger(n)||n<1||n>12)throw new RangeError("months must be 1\u201312");if(!Number.isInteger(a)||a<1||a>60)throw new RangeError("minuteStep must be 1\u201360");if(e.minDate&&S(e.minDate),e.maxDate&&S(e.maxDate),e.minDate&&e.maxDate&&e.minDate>e.maxDate)throw new RangeError("minDate must precede maxDate");if(e.minTime&&M(e.minTime),e.maxTime&&M(e.maxTime),e.minTime&&e.maxTime&&M(e.minTime)>M(e.maxTime))throw new RangeError("minTime must precede maxTime");for(let f of[e.minDuration,e.maxDuration])if(f!==void 0&&(!Number.isFinite(f)||f<0))throw new RangeError("Duration must be nonnegative");if(e.minDuration!==void 0&&e.maxDuration!==void 0&&e.minDuration>e.maxDuration)throw new RangeError("minDuration must not exceed maxDuration");let l=Object.freeze([...e.weekend??[0,6]]);l.forEach(W);let i=e.timeZone??"UTC";return new Intl.DateTimeFormat("en",{timeZone:i}),Object.freeze({...e,kind:e.kind??"date",selection:e.selection??"single",referenceDate:t,locale:e.locale??"en-GB",timeZone:i,weekStartsOn:W(e.weekStartsOn??1),months:n,weekend:l,hourCycle:e.hourCycle??24,minuteStep:a})}function oe(e,t){if(!e)return null;let n={};if(t.kind!=="time"){if(!e.date)throw new RangeError("Date is required");S(e.date),n.date=e.date}else e.date&&(S(e.date),n.date=e.date);if(t.kind!=="date"&&(e.time&&(M(e.time),n.time=e.time),e.dayOffset!==void 0)){if(n.date)throw new RangeError("Use date or dayOffset, not both");if(!Number.isInteger(e.dayOffset)||e.dayOffset<0)throw new RangeError("dayOffset must be nonnegative");n.dayOffset=e.dayOffset}return Object.freeze(n)}function Z(e,t){if(!e)return t.selection==="range"?Object.freeze({start:null,end:null}):null;if(t.selection==="range"){if(!V(e))throw new RangeError("A range requires start and end");return Object.freeze({start:oe(e.start,t),end:oe(e.end,t)})}if(V(e))throw new RangeError("Single selection expects one point");return oe(e,t)}function ye(e){return(e.date?O(e.date):e.dayOffset??0)*86400+(e.time?M(e.time):0)}function se(e={}){let t=ge(e),n=Z(e.value===void 0?e.defaultValue??null:e.value,t),a=z(),l=e.month??S(E(n)?.date??t.referenceDate);P(l,t.months-1);let i=Object.freeze({options:t,value:n,draft:n,visibleMonth:Object.freeze({year:l.year,month:l.month}),focusedDate:E(n)?.date??t.referenceDate,hoverDate:null,activeEndpoint:"start",open:!1,error:null}),f=new Set,g=new Set,y=r=>{let c=i;Object.entries(r).every(([u,h])=>u==="options"?c.options===h:he(c[u],h))||(i=Object.freeze({...i,...r}),f.forEach(u=>u()),he(c.value,i.value)||(g.forEach(u=>u(i.value)),t.onValueChange?.(i.value)))},d=r=>!!(t.minDate&&r<t.minDate||t.maxDate&&r>t.maxDate||t.isDateUnavailable?.(r));function o(r,c=!1){let u=V(r)?[r.start,r.end]:[r];if(u.every(h=>h===null))return null;for(let h of u){if(!h){if(c)return"Choose a complete value";continue}if(h.date&&d(h.date))return"This date is unavailable";if(t.kind!=="date"){if(!h.time){if(c)return"Choose a time";continue}let v=M(h.time);if(t.minTime&&v<M(t.minTime)||t.maxTime&&v>M(t.maxTime)||t.isTimeUnavailable?.(h.time,h))return"This time is unavailable"}}if(V(r)&&r.start&&r.end&&(t.kind==="date"||r.start.time&&r.end.time)){if(t.kind==="time"&&!!r.start.date!=!!r.end.date)return"Both endpoints need dates, or neither";let h=ye(r.end)-ye(r.start);if(h<0)return"The end must follow the start";let v=t.kind==="date"?h/86400+1:h;if(t.minDuration!==void 0&&v<t.minDuration)return"The interval is too short";if(t.maxDuration!==void 0&&v>t.maxDuration)return"The interval is too long";if(t.isRangeUnavailable?.(r.start,r.end))return"This interval is unavailable"}return null}function p(r,c=i.activeEndpoint,u=!1){let h=Z(r,t),v=o(h);if(v)return y(u?{draft:h,error:v,activeEndpoint:c}:{error:v}),!1;let D=o(h,!0)===null;return y({draft:h,error:null,activeEndpoint:c,...t.commit!=="explicit"&&D?{value:h}:{}}),!0}function s(r,c){return p(t.selection==="range"?{start:E(i.draft,"start"),end:E(i.draft,"end"),[c]:r}:r,c,!0)}let b={getSnapshot:()=>i,subscribe(r){return f.add(r),()=>{f.delete(r)}},subscribeValue(r){return g.add(r),()=>{g.delete(r)}},getMonth(r=0){let c=P(i.visibleMonth,r);return a.month(c.year,c.month,t)},getDay(r){if(!r)return{selected:!1,rangeStart:!1,rangeEnd:!1,inRange:!1,preview:!1,disabled:!0,today:!1,weekend:!1,focused:!1};let c=i.draft,u=E(c)?.date,h=V(c)?c.end?.date:void 0,v=!h&&u?i.hoverDate:null,D=v&&v<u?v:u,T=v&&v<u?u:v??h;return{selected:r===u||r===h,rangeStart:r===u,rangeEnd:r===h,inRange:!!(D&&T&&r>=D&&r<=T),preview:!!v,disabled:!!t.disabled||d(r),today:r===t.referenceDate,weekend:t.weekend.includes(N(r)),focused:r===i.focusedDate}},setVisibleMonth(r){P(r,t.months-1),y({visibleMonth:Object.freeze({year:r.year,month:r.month}),hoverDate:null})},navigate(r){b.setVisibleMonth(P(i.visibleMonth,r))},focus(r){S(r),y({focusedDate:r});let c=S(r),u=C({...i.visibleMonth,day:1}),h=P(i.visibleMonth,t.months-1);if(r<u||r>C({...h,day:R(h.year,h.month)})){let v=P({year:9999,month:12},-(t.months-1));b.setVisibleMonth(c.year>v.year||c.year===v.year&&c.month>v.month?v:c)}},moveFocus(r,c=!1){let u=i.focusedDate,h={ArrowLeft:-1,ArrowRight:1,ArrowUp:-7,ArrowDown:7};if(r in h)u=q(u,h[r]);else if(r==="Home")u=q(u,-((N(u)-t.weekStartsOn+7)%7));else if(r==="End")u=q(u,6-(N(u)-t.weekStartsOn+7)%7);else if(r==="PageUp"||r==="PageDown")u=Q(u,(r==="PageUp"?-1:1)*(c?12:1));else return!1;return b.focus(u),!0},hover(r){r&&S(r),t.selection==="range"&&E(i.draft)?.date&&!E(i.draft,"end")&&y({hoverDate:r})},selectDate(r){if(S(r),t.disabled||t.readOnly||d(r))return!1;if(t.selection==="none")return t.onSelect?.(r),!0;if(t.kind==="time")return b.setDate(r,i.activeEndpoint);let c=E(i.draft,i.activeEndpoint),u={date:r,...t.kind==="datetime"&&c?.time?{time:c.time}:{}},h=u,v="start";if(t.selection==="range"){let T=E(i.draft),k=E(i.draft,"end");!T||k?(h={start:u,end:null},v="end"):(h=r<T.date?{start:u,end:T}:{start:T,end:u},v="end")}let D=p(h,v);return D&&(y({focusedDate:r,hoverDate:null}),t.onSelect?.(r)),D},setDate(r,c="start"){if(S(r),t.disabled||t.readOnly)return!1;let u=E(i.draft,c);return s({date:r,...t.kind!=="date"&&u?.time?{time:u.time}:{}},c)},setTime(r,c="start"){if(M(r),t.disabled||t.readOnly||t.kind==="date")return!1;let u=E(i.draft,c);return s({...u,time:r,...t.kind==="datetime"&&!u?.date?{date:t.referenceDate}:{}},c)},setDayOffset(r,c="end"){if(!Number.isInteger(r)||r<0)throw new RangeError("Day offset must be nonnegative");if(t.disabled||t.readOnly||t.kind!=="time")return!1;let u=E(i.draft,c);return s({...u,date:void 0,dayOffset:r},c)},setEndpoint(r){if(r==="end"&&t.selection!=="range")throw new RangeError("End is available only for a range");y({activeEndpoint:r})},setValue(r){let c=Z(r,t),u=o(c);if(u)throw new RangeError(u);y({value:c,draft:c,error:null,hoverDate:null})},apply(){if(t.disabled||t.readOnly)return!1;let r=o(i.draft,!0);return r?(y({error:r}),!1):(y({value:i.draft,error:null,open:!1}),!0)},cancel(){y({draft:i.value,error:null,hoverDate:null,open:!1})},clear(){if(t.disabled||t.readOnly)return;let r=Z(null,t);y({draft:r,value:t.commit==="explicit"?i.value:r,error:null,hoverDate:null,activeEndpoint:"start"})},setOpen(r){r&&t.disabled||y({open:r})},setOptions(r){if(Object.entries(r).every(([u,h])=>Object.is(t[u],h)))return;if(r.kind&&r.kind!==t.kind||r.selection&&r.selection!==t.selection)throw new RangeError("Create a new store to change kind or selection");let c=ge({...t,...r});P(i.visibleMonth,c.months-1),t=c,y({options:c,error:o(i.draft)})},validate:()=>o(i.draft,!0),destroy(){f.clear(),g.clear(),a.clear()},get cacheSize(){return a.cacheSize}},m=o(n);if(m)throw new RangeError(m);return b}function xe(e,t,n="reject"){if(!e.date||!e.time)throw new RangeError("Date and time are required");S(e.date);let a=O(e.date)*864e5+M(e.time)*1e3,l=new Intl.DateTimeFormat("en-CA",{timeZone:t,calendar:"gregory",numberingSystem:"latn",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),i=o=>{let p=l.formatToParts(new Date(o)),s=b=>p.find(m=>m.type===b).value;return O(`${s("year").padStart(4,"0")}-${s("month")}-${s("day")}`)*864e5+M(`${s("hour")}:${s("minute")}:${s("second")}`)*1e3},f=new Set;for(let o of[-48,-24,-12,0,12,24,48]){let p=a+o*36e5;f.add(i(p)-p)}let g=[...f].map(o=>a-o).sort((o,p)=>o-p),y=g.filter(o=>i(o)===a);if(y.length===1)return new Date(y[0]);if(n==="reject")throw new RangeError(y.length?"This local time occurs twice":"This local time does not exist");let d=y.length?y:g;return new Date(n==="earlier"?d[0]:d[d.length-1])}function $(e){return String(e??"").replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t])}function w(e,t,n){if(n===!1||n==null)e.hasAttribute(t)&&e.removeAttribute(t);else{let a=n===!0?"":n;e.getAttribute(t)!==a&&e.setAttribute(t,a)}}function U(e,t,n=!1){let a=e.getDay(t),l=e.getSnapshot().options;return{"data-date":t,"data-selected":a.selected?"":void 0,"data-range-start":a.rangeStart?"":void 0,"data-range-end":a.rangeEnd?"":void 0,"data-in-range":a.inRange?"":void 0,"data-preview":a.preview&&a.inRange?"":void 0,"data-weekend":a.weekend?"":void 0,"data-outside":n?"":void 0,"data-today":a.today?"":void 0,"aria-selected":a.selected||a.inRange&&!a.preview?"true":"false"}}function le(e,t,n=!1){let{"aria-selected":a,...l}=U(e,t,n);return l}function Y(e,t={}){let{options:n,focusedDate:a}=e.getSnapshot(),l=J(n.locale,n.weekStartsOn),i=J(n.locale,n.weekStartsOn,"long"),f=Array.from({length:n.months},(d,o)=>e.getMonth(o)),g=f.flatMap(d=>d.weeks.flat()).filter(d=>!d.hidden&&!d.outside),y=g.some(d=>d.date===a&&!e.getDay(d.date).disabled)?a:g.find(d=>!e.getDay(d.date).disabled)?.date;return Array.from({length:n.months},(d,o)=>{let p=f[o],s=l.map(b=>{let m=t.weekdays?.[b.weekday],r=m?.label??b.label,c=m?.ariaLabel??(m?.label||i.find(u=>u.weekday===b.weekday).label);return`<th scope="col" data-part="weekday" data-weekday="${b.weekday}" class="${$(m?.class??"")}" ${n.weekend.includes(b.weekday)?"data-weekend":""} aria-label="${$(c)}">${t.renderWeekday?.(b.weekday,r)??$(r)}</th>`}).join("");return`<section class="sp-month" data-part="month"><h3 data-part="month-title" aria-live="polite">${$(F(p,n.locale))}</h3><table role="grid" aria-readonly="${!!n.readOnly}" aria-multiselectable="${n.selection==="range"}" aria-label="${$(F(p,n.locale))}" class="sp-grid"><thead><tr>${s}</tr></thead><tbody>${p.weeks.map(b=>`<tr>${b.map(m=>{if(m.hidden)return'<td role="gridcell" aria-disabled="true"></td>';let r=e.getDay(m.date),c=r.disabled||m.outside&&n.outsideSelectable===!1,u=Object.entries(U(e,m.date,m.outside)).map(([v,D])=>D==null?"":`${v}="${$(D)}"`).join(" "),h=t.renderCell?.(m,r)??`<button type="button" data-day-trigger data-date="${m.date}" aria-label="${$(I(m.date,n.locale))}" ${c?"disabled":""} tabindex="${m.date===y&&!m.outside?"0":"-1"}"><span data-part="number">${m.day}</span></button>`;return`<td role="gridcell" data-part="cell" ${u}>${h}</td>`}).join("")}</tr>`).join("")}</tbody></table></section>`}).join("")}function K(e,t,n={}){let a="",l=!0,i=new Set,f=()=>{let{options:s,visibleMonth:b,focusedDate:m}=t.getSnapshot(),r=JSON.stringify([b,s.months,s.weekStartsOn,s.outsideDays,s.fixedWeeks,s.locale,s.weekend,n.weekdays]),c=e.contains(e.ownerDocument.activeElement);r!==a&&(e.innerHTML=Y(t,n),a=r);let u;for(let h of e.querySelectorAll('[data-part="cell"]')){let v=h.dataset.date,D=h.hasAttribute("data-outside"),T=t.getDay(v);for(let[j,H]of Object.entries(U(t,v,D)))w(h,j,H);let k=h.querySelector("[data-day-trigger]");k&&(k.disabled=T.disabled||D&&s.outsideSelectable===!1,k.hasAttribute("aria-label")||w(k,"aria-label",I(v,s.locale)),w(k,"aria-current",T.today?"date":null),k.tabIndex=-1,!k.disabled&&!D&&(!u||v===m)&&(u=k))}u&&(u.tabIndex=0),c&&u&&m===u.dataset.date&&e.ownerDocument.activeElement!==u&&u.focus();for(let h of e.querySelectorAll('[role="grid"]'))w(h,"aria-readonly",String(!!s.readOnly)),w(h,"aria-multiselectable",String(s.selection==="range"))},g=s=>{let b=s.target.closest("[data-day-trigger]");if(!b||!e.contains(b)||b.disabled)return;let m=b.dataset.date;n.onDayClick?.(m,s);let r=setTimeout(()=>{i.delete(r),l&&e.isConnected&&!s.defaultPrevented&&t.selectDate(m)&&n.onSelect?.(m)},0);i.add(r)},y=s=>{if(s.pointerType==="touch")return;let b=s.target.closest("[data-day-trigger]");b&&!b.hasAttribute("disabled")&&t.hover(b.dataset.date)},d=()=>t.hover(null),o=s=>{let b=s.target.closest("[data-day-trigger]");if(b){if(s.key==="Escape"){t.cancel(),s.preventDefault();return}if(s.key==="ArrowLeft"||s.key==="ArrowRight"||s.key==="ArrowUp"||s.key==="ArrowDown"||s.key==="Home"||s.key==="End"||s.key==="PageUp"||s.key==="PageDown"){s.preventDefault(),t.focus(b.dataset.date);let m=getComputedStyle(e).direction==="rtl",r=m&&s.key==="ArrowLeft"?"ArrowRight":m&&s.key==="ArrowRight"?"ArrowLeft":s.key;try{t.moveFocus(r,s.shiftKey)}catch(c){if(!(c instanceof RangeError))throw c}}}};f();let p=t.subscribe(f);return e.addEventListener("click",g),e.addEventListener("pointerover",y),e.addEventListener("pointerleave",d),e.addEventListener("keydown",o),()=>{l=!1;for(let s of i)clearTimeout(s);i.clear(),p(),e.removeEventListener("click",g),e.removeEventListener("pointerover",y),e.removeEventListener("pointerleave",d),e.removeEventListener("keydown",o)}}function de(e,t,n="start"){let a=e.value,l=e.disabled,i=e.readOnly,f=()=>{let o=t.getSnapshot();e.disabled=l||!!o.options.disabled,e.readOnly=i||!!o.options.readOnly,e.ownerDocument.activeElement!==e&&(e.value=E(o.draft,n)?.date??"",w(e,"aria-invalid",String(!!o.error)))},g=()=>{try{S(e.value);let o=t.setDate(e.value,n);w(e,"aria-invalid",String(!o))}catch{w(e,"aria-invalid","true")}},y=()=>{e.value=E(t.getSnapshot().draft,n)?.date??"",w(e,"aria-invalid",String(!!t.getSnapshot().error))};f();let d=t.subscribe(f);return e.addEventListener("input",g),e.addEventListener("blur",y),()=>{d(),e.removeEventListener("input",g),e.removeEventListener("blur",y),e.value=a}}function ce(e,t,n,a="start"){let l=!1,i=e.disabled,f=e instanceof e.ownerDocument.defaultView.HTMLInputElement&&e.readOnly,g=()=>ie(E(t.getSnapshot().draft,a)?.time,n,t.getSnapshot().options.hourCycle),y=()=>{let s=t.getSnapshot();e.disabled=i||!!s.options.disabled,e instanceof e.ownerDocument.defaultView.HTMLInputElement?(e.readOnly=f||!!s.options.readOnly,e.min=n==="hour"&&s.options.hourCycle===12?"1":"0",e.max=n==="hour"?s.options.hourCycle===12?"12":"23":"59",e.step=n==="minute"?String(s.options.minuteStep):"1"):e.disabled=i||!!s.options.disabled||!!s.options.readOnly,(e.ownerDocument.activeElement!==e||!l)&&(e.value=g(),s.error||(l=!1)),w(e,"aria-invalid",String(l||!!s.error))},d=()=>{if(e.value.trim()===""){l=!0,w(e,"aria-invalid","true");return}try{let s=t.getSnapshot(),b=E(s.draft,a)?.time??"00:00";if(n==="minute"&&Number(e.value)%s.options.minuteStep!==0)throw new RangeError("Minute must match the configured step");let m=ae(b,n,e.value,s.options.hourCycle,!!s.options.seconds||b.length===8||n==="second");l=!t.setTime(m,a),w(e,"aria-invalid",String(l))}catch{l=!0,w(e,"aria-invalid","true")}},o=()=>{l=!1,e.value=g(),w(e,"aria-invalid",String(!!t.getSnapshot().error))};y();let p=t.subscribe(y);return e.addEventListener("input",d),e.addEventListener("blur",o),()=>{p(),e.removeEventListener("input",d),e.removeEventListener("blur",o)}}function Pe(e,t,{name:n="date",required:a=!1}={}){let l=e.ownerDocument.createElement("input");l.type="hidden",l.name=n,e.append(l);let i=t.getSnapshot().value,f=()=>{l.disabled=!!t.getSnapshot().options.disabled,l.value=JSON.stringify(t.getSnapshot().value)},g=o=>{if(l.disabled)return;let p=t.getSnapshot().value,s=!p||"start"in p&&!p.start&&!p.end;s&&!a||(a&&s||t.validate())&&(o.preventDefault(),e.dispatchEvent(new CustomEvent("picker-invalid",{detail:t.validate()??"Choose a value"})))},y=()=>queueMicrotask(()=>t.setValue(i));f();let d=t.subscribe(f);return e.addEventListener("submit",g),e.addEventListener("reset",y),()=>{d(),l.remove(),e.removeEventListener("submit",g),e.removeEventListener("reset",y)}}function ue(e,t,n,{outside:a=!1,onSelect:l,disabled:i}={}){let f=!0,g=new Set,y=i??e.disabled,d=e.getAttribute("aria-label"),o=()=>{let r=t.getSnapshot(),c=t.getDay(n);for(let[h,v]of Object.entries(le(t,n,a)))w(e,h,v);e.disabled=y||c.disabled||a&&r.options.outsideSelectable===!1,e.tabIndex=c.focused&&!a?0:-1,w(e,"data-day-trigger",!0),w(e,"aria-current",c.today?"date":null),w(e,"aria-label",d??I(n,r.options.locale));let u=e.ownerDocument.activeElement;c.focused&&!a&&u!==e&&u?.matches("[data-day-trigger]")&&u.closest('[role="grid"]')===e.closest('[role="grid"]')&&e.focus()},p=r=>{let c=setTimeout(()=>{g.delete(c),f&&e.isConnected&&!e.disabled&&!r.defaultPrevented&&!(a&&t.getSnapshot().options.outsideSelectable===!1)&&t.selectDate(n)&&l?.(n)},0);g.add(c)},s=r=>{r.pointerType!=="touch"&&!e.disabled&&t.hover(n)},b=r=>{if(!r.defaultPrevented)try{if(r.key==="Escape"){t.cancel(),r.preventDefault();return}t.focus(n);let c=getComputedStyle(e).direction==="rtl",u=c&&r.key==="ArrowLeft"?"ArrowRight":c&&r.key==="ArrowRight"?"ArrowLeft":r.key;t.moveFocus(u,r.shiftKey)&&r.preventDefault()}catch(c){if(!(c instanceof RangeError))throw c}};o();let m=t.subscribe(o);return e.addEventListener("click",p),e.addEventListener("pointerenter",s),e.addEventListener("keydown",b),()=>{f=!1;for(let r of g)clearTimeout(r);g.clear(),m(),e.removeEventListener("click",p),e.removeEventListener("pointerenter",s),e.removeEventListener("keydown",b)}}function Te(e,t,n,{modal:a=!1,label:l="Choose a date"}={}){let i=t.ownerDocument,f=t.hidden,g=e.disabled;t.setAttribute("role","dialog"),t.setAttribute("aria-label",t.getAttribute("aria-label")??l),a&&t.setAttribute("aria-modal","true"),e.setAttribute("aria-haspopup","dialog");let y=n.getSnapshot().open,d=()=>{let m=n.getSnapshot();t.hidden=!m.open,e.disabled=g||!!m.options.disabled,e.setAttribute("aria-expanded",String(m.open)),m.open&&!y&&queueMicrotask(()=>{n.getSnapshot().open&&(t.querySelector('[data-day-trigger][tabindex="0"],input:not(:disabled),button:not(:disabled)')??t).focus()}),!m.open&&y&&e.focus(),y=m.open},o=m=>{m.defaultPrevented||(n.getSnapshot().open?n.cancel():n.setOpen(!0))},p=m=>{n.getSnapshot().open&&!t.contains(m.target)&&!e.contains(m.target)&&n.cancel()},s=m=>{if(n.getSnapshot().open&&(m.key==="Escape"&&(m.preventDefault(),n.cancel()),a&&m.key==="Tab")){let r=[...t.querySelectorAll('button:not(:disabled),input:not(:disabled),select:not(:disabled),a[href],[tabindex="0"]')].filter(h=>h.tabIndex>=0&&!h.hidden&&h.getClientRects().length),c=r[0],u=r.at(-1);c?m.shiftKey&&i.activeElement===c?(m.preventDefault(),u.focus()):!m.shiftKey&&i.activeElement===u&&(m.preventDefault(),c.focus()):(m.preventDefault(),t.focus())}};d();let b=n.subscribe(d);return e.addEventListener("click",o),i.addEventListener("pointerdown",p),i.addEventListener("keydown",s),()=>{b(),t.hidden=f,e.removeEventListener("click",o),i.removeEventListener("pointerdown",p),i.removeEventListener("keydown",s)}}function Oe(e,t={}){let n=e.getSnapshot(),a=z(1),l=t.from??{year:1900,month:1},i=t.to??{year:2100,month:12},f=d=>d.year*12+d.month,g=f(n.visibleMonth)<f(l)?l:f(n.visibleMonth)>f(i)?i:n.visibleMonth,y={...e,getSnapshot:()=>({...n,visibleMonth:g,options:{...n.options,months:1,fixedWeeks:!0}}),getMonth:(d=0)=>{let o=P(g,d);return a.month(o.year,o.month,{...n.options,fixedWeeks:!0})}};return Y(y,t)}function fe(e,t,n={}){let a=n.from??{year:1900,month:1},l=n.to??{year:2100,month:12};P(a,0),P(l,0);let i=k=>(k.year-a.year)*12+k.month-a.month,f=i(l)+1,g=n.monthHeight??340,y=n.overscan??1;if(f<1||f>1e4||g<280||!Number.isFinite(g)||!Number.isInteger(y)||y<0||y>4)throw new RangeError("Invalid scrolling window or month geometry");let d=e.ownerDocument,o=d.createElement("div");o.style.height=`${f*g}px`,o.style.position="relative",e.replaceChildren(o);let p=z(12),s=new Map,b=0,m=!1,r=k=>{let j,H;return{...t,getSnapshot(){let A=t.getSnapshot();return A!==j&&(j=A,H=Object.freeze({...A,visibleMonth:k,options:Object.freeze({...A.options,months:1,fixedWeeks:!0})})),H},getMonth(A=0){let x=P(k,A);return p.month(x.year,x.month,{...t.getSnapshot().options,fixedWeeks:!0})}}},c=()=>{let k=Math.max(0,Math.min(f-1,Math.floor(e.scrollTop/g))),j=Math.ceil((e.clientHeight||g)/g),H=Math.max(0,k-y),A=Math.min(f-1,k+j+y);for(let[x,L]of s)(x<H||x>A)&&(L.stop(),L.element.remove(),s.delete(x));for(let x=H;x<=A;x++)if(!s.has(x)){let L=d.createElement("div");L.className="sp-scroll-month",L.style.cssText=`position:absolute;top:${x*g}px;left:0;right:0;height:${g}px;overflow:hidden`,o.append(L);let be=P(a,x);s.set(x,{element:L,stop:K(L,r(be),n)})}if(!m){let x=P(a,k),L=t.getSnapshot();(x.year!==L.visibleMonth.year||x.month!==L.visibleMonth.month)&&(m=!0,t.setVisibleMonth(x),m=!1)}},u=()=>{b||(b=e.ownerDocument.defaultView.requestAnimationFrame(()=>{b=0,c()}))},h=()=>{if(m)return;let k=i(t.getSnapshot().visibleMonth);k<0||k>=f||Math.floor(e.scrollTop/g)!==k&&(e.scrollTop=k*g,c())};e.scrollTop=Math.max(0,Math.min(f-1,i(t.getSnapshot().visibleMonth)))*g,c();let v=t.subscribe(h);e.addEventListener("scroll",u,{passive:!0});let D=e.ownerDocument.defaultView?.ResizeObserver,T=D?new D(u):void 0;return T?.observe(e),()=>{T?.disconnect(),v(),e.removeEventListener("scroll",u),b&&e.ownerDocument.defaultView.cancelAnimationFrame(b);for(let k of s.values())k.stop();s.clear(),p.clear(),o.remove()}}function Le(e,t={}){let n="getSnapshot"in t,a=n?t:se(t),l=[],i=d=>[...e.querySelectorAll(d)].filter(o=>!o.parentElement?.closest("[data-picker-root]")||o.parentElement.closest("[data-picker-root]")===e);w(e,"data-picker-root",!0);for(let d of i("[data-continuous]"))l.push(fe(d,a,JSON.parse(d.dataset.continuous??"{}")));for(let d of i("[data-calendar]"))l.push(K(d,a,JSON.parse(d.dataset.calendarOptions??"{}")));for(let d of i("[data-day-trigger]"))d.closest("[data-calendar]")||l.push(ue(d,a,d.dataset.date));for(let d of i("[data-date-field]"))l.push(de(d,a,d.dataset.endpoint??"start"));for(let d of i("[data-time-segment]"))l.push(ce(d,a,d.dataset.timeSegment,d.dataset.endpoint??"start"));let f=d=>{if(d.defaultPrevented)return;let o=d.target.closest("[data-picker-action]");if(!o||!e.contains(o)||o.closest("[data-picker-root]")!==e||a.getSnapshot().options.disabled)return;let s=o.dataset.pickerAction;try{s==="previous"?a.navigate(-1):s==="next"?a.navigate(1):s==="open"?a.setOpen(!0):(s==="cancel"||s==="apply"||s==="clear")&&a[s]()}catch(b){if(!(b instanceof RangeError))throw b}},g=d=>{let o=d.target;if(!(o.closest("[data-picker-root]")!==e||a.getSnapshot().options.disabled))try{o.hasAttribute("data-month-select")&&a.setVisibleMonth({...a.getSnapshot().visibleMonth,month:Number(o.value)}),o.hasAttribute("data-year-select")&&a.setVisibleMonth({...a.getSnapshot().visibleMonth,year:Number(o.value)}),o.hasAttribute("data-day-offset")&&a.setDayOffset(Number(o.value),o.dataset.endpoint??"end")}catch(p){if(!(p instanceof RangeError))throw p}},y=()=>{let d=a.getSnapshot();for(let o of i("[data-calendar-cell]"))for(let[p,s]of Object.entries(U(a,o.dataset.date,o.hasAttribute("data-outside"))))w(o,p,s);for(let o of i("[data-picker-output]"))o.textContent=JSON.stringify(d.value,null,2);for(let o of i("[data-picker-error]"))o.textContent=d.error??"",o.hidden=!d.error;for(let o of i("[data-month-heading]"))o.textContent=F(d.visibleMonth,d.options.locale);for(let o of i("[data-month-select]"))o.value=String(d.visibleMonth.month);for(let o of i("[data-year-select]"))o.value=String(d.visibleMonth.year);for(let o of i("[data-picker-action], [data-month-select], [data-year-select], [data-day-offset]"))o.disabled=!!d.options.disabled};return y(),l.push(a.subscribe(y)),e.addEventListener("click",f),e.addEventListener("change",g),{store:a,destroy(){l.forEach(d=>d()),e.removeEventListener("click",f),e.removeEventListener("change",g),n||a.destroy()}}}return De(Re);})();
@@ -0,0 +1,48 @@
1
+ export interface CalendarDate {
2
+ year: number;
3
+ month: number;
4
+ day: number;
5
+ }
6
+ export type DateString = string;
7
+ export interface Month {
8
+ year: number;
9
+ month: number;
10
+ }
11
+ export interface CalendarGridOptions {
12
+ weekStartsOn?: number;
13
+ fixedWeeks?: boolean;
14
+ outsideDays?: "visible" | "hidden";
15
+ }
16
+ export interface CalendarDay {
17
+ readonly date: DateString;
18
+ readonly day: number;
19
+ readonly weekday: number;
20
+ readonly outside: boolean;
21
+ readonly hidden: boolean;
22
+ }
23
+ export interface CalendarMonth {
24
+ readonly year: number;
25
+ readonly month: number;
26
+ readonly weeks: readonly (readonly CalendarDay[])[];
27
+ }
28
+ export declare function leapYear(year: number): boolean;
29
+ export declare function daysInMonth(year: number, month: number): number;
30
+ export declare function parseDate(value: string): CalendarDate;
31
+ export declare function dateString(date: CalendarDate): string;
32
+ /** Integer civil-day arithmetic, independent of local time zones and DST. */
33
+ export declare function dayNumber(input: CalendarDate | string): number;
34
+ export declare function fromDayNumber(n: number): CalendarDate;
35
+ export declare function addDays(date: string, count: number): string;
36
+ export declare function weekday(date: string): number;
37
+ export declare function addMonths(month: Month, count: number): Month;
38
+ export declare function shiftDateMonths(value: string, count: number): string;
39
+ export declare function weekNumber(value: string): {
40
+ year: number;
41
+ week: number;
42
+ };
43
+ export declare function validateWeekStart(value: number): number;
44
+ export declare function createCalendarEngine(capacity?: number): {
45
+ month(year: number, month: number, options?: CalendarGridOptions): CalendarMonth;
46
+ clear(): void;
47
+ readonly cacheSize: number;
48
+ };
@@ -0,0 +1,6 @@
1
+ import type { PickerStore } from "./store";
2
+ export declare function bindDayTrigger(button: HTMLButtonElement, store: PickerStore, date: string, { outside, onSelect, disabled, }?: {
3
+ outside?: boolean;
4
+ disabled?: boolean;
5
+ onSelect?: (date: string) => void;
6
+ }): () => void;
@@ -0,0 +1,50 @@
1
+ import { type PickerStore, type Endpoint } from "./store";
2
+ import { type CalendarDay } from "./calendar";
3
+ export declare function escapeHTML(value: unknown): string;
4
+ export declare function attribute(el: Element, name: string, value: string | boolean | null | undefined): void;
5
+ export interface WeekdayPresentation {
6
+ label?: string;
7
+ class?: string;
8
+ ariaLabel?: string;
9
+ }
10
+ export interface CalendarRenderOptions {
11
+ /** Per actual weekday, Sunday=0. Independent of column order or weekend flags. */
12
+ weekdays?: Partial<Record<number, WeekdayPresentation>>;
13
+ renderCell?: (day: CalendarDay, state: ReturnType<PickerStore["getDay"]>) => string;
14
+ renderWeekday?: (weekday: number, label: string) => string;
15
+ onDayClick?: (date: string, event: MouseEvent) => void;
16
+ onSelect?: (date: string) => void;
17
+ }
18
+ export declare function dayAttributes(store: PickerStore, date: string, outside?: boolean): {
19
+ "data-date": string;
20
+ "data-selected": string | undefined;
21
+ "data-range-start": string | undefined;
22
+ "data-range-end": string | undefined;
23
+ "data-in-range": string | undefined;
24
+ "data-preview": string | undefined;
25
+ "data-weekend": string | undefined;
26
+ "data-outside": string | undefined;
27
+ "data-today": string | undefined;
28
+ "aria-selected": "true" | "false";
29
+ };
30
+ export declare function dayTriggerAttributes(store: PickerStore, date: string, outside?: boolean): {
31
+ "data-date": string;
32
+ "data-selected": string | undefined;
33
+ "data-range-start": string | undefined;
34
+ "data-range-end": string | undefined;
35
+ "data-in-range": string | undefined;
36
+ "data-preview": string | undefined;
37
+ "data-weekend": string | undefined;
38
+ "data-outside": string | undefined;
39
+ "data-today": string | undefined;
40
+ };
41
+ export declare function calendarMarkup(store: PickerStore, render?: CalendarRenderOptions): string;
42
+ /** Attach to app-owned markup. Month rendering happens only when its grid changes. */
43
+ export declare function bindCalendar(root: HTMLElement, store: PickerStore, render?: CalendarRenderOptions): () => void;
44
+ export declare function bindDateField(input: HTMLInputElement, store: PickerStore, endpoint?: Endpoint): () => void;
45
+ export type TimeSegment = "hour" | "minute" | "second" | "period";
46
+ export declare function bindTimeSegment(input: HTMLInputElement | HTMLSelectElement, store: PickerStore, part: TimeSegment, endpoint?: Endpoint): () => void;
47
+ export declare function bindPickerForm(form: HTMLFormElement, store: PickerStore, { name, required, }?: {
48
+ name?: string;
49
+ required?: boolean;
50
+ }): () => void;
@@ -0,0 +1,10 @@
1
+ import { type Month } from "./calendar";
2
+ export declare function dateFormatter(locale: string, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat;
3
+ export declare function utcDate(value: string): Date;
4
+ export declare function formatDate(value: string, locale?: string, options?: Intl.DateTimeFormatOptions): string;
5
+ export declare function formatMonth(month: Month, locale?: string): string;
6
+ export declare function weekdayLabels(locale: string, weekStartsOn: number, width?: "short" | "long" | "narrow"): {
7
+ weekday: number;
8
+ label: string;
9
+ }[];
10
+ export declare function today(timeZone?: string, now?: Date): string;
@@ -0,0 +1,9 @@
1
+ export * from "./calendar";
2
+ export * from "./format";
3
+ export * from "./time";
4
+ export * from "./store";
5
+ export * from "./timezone";
6
+ export * from "./dom";
7
+ export * from "./day";
8
+ export * from "./popover";
9
+ export * from "./scroller";
@@ -0,0 +1 @@
1
+ function ue(e){return e%4===0&&(e%100!==0||e%400===0)}function C(e,t){if(!Number.isInteger(e)||e<1||e>9999||!Number.isInteger(t)||t<1||t>12)throw new RangeError("Calendar supports Gregorian years 1\u20139999 and months 1\u201312");return t===2?ue(e)?29:28:[4,6,9,11].includes(t)?30:31}function D(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)throw new RangeError("Use YYYY-MM-DD");let[,r,a,d]=t,i={year:Number(r),month:Number(a),day:Number(d)};if(i.day<1||i.day>C(i.year,i.month))throw new RangeError("Invalid calendar date");return i}function A(e){if(!Number.isInteger(e.day)||e.day<1||e.day>C(e.year,e.month))throw new RangeError("Invalid calendar date");return`${String(e.year).padStart(4,"0")}-${String(e.month).padStart(2,"0")}-${String(e.day).padStart(2,"0")}`}function T(e){let t=D(typeof e=="string"?e:A(e)),r=t.year-(t.month<=2?1:0),a=Math.floor(r/400),d=r-a*400,i=t.month+(t.month>2?-3:9),f=Math.floor((153*i+2)/5)+t.day-1;return a*146097+d*365+Math.floor(d/4)-Math.floor(d/100)+f-719468}function K(e){if(!Number.isInteger(e))throw new RangeError("Day number must be an integer");let t=e+719468,r=Math.floor(t/146097),a=t-r*146097,d=Math.floor((a-Math.floor(a/1460)+Math.floor(a/36524)-Math.floor(a/146096))/365),i=d+r*400,f=a-(365*d+Math.floor(d/4)-Math.floor(d/100)),m=Math.floor((5*f+2)/153),g=f-Math.floor((153*m+2)/5)+1,y=m+(m<10?3:-9);i+=y<=2?1:0;let h={year:i,month:y,day:g};return A(h),h}function U(e,t){return A(K(T(e)+t))}function N(e){return((T(e)+4)%7+7)%7}function O(e,t){if(C(e.year,e.month),!Number.isInteger(t))throw new RangeError("Month offset must be an integer");let r=(e.year-1)*12+e.month-1+t,a={year:Math.floor(r/12)+1,month:(r%12+12)%12+1};return C(a.year,a.month),a}function _(e,t){let r=D(e),a=O(r,t);return A({...a,day:Math.min(r.day,C(a.year,a.month))})}function fe(e){let t=T(e),r=(N(e)+6)%7,a=K(t+3-r),d=`${String(a.year).padStart(4,"0")}-01-04`,i=T(d)-(N(d)+6)%7;return{year:a.year,week:Math.floor((t-i)/7)+1}}function W(e){if(!Number.isInteger(e)||e<0||e>6)throw new RangeError("weekStartsOn must be 0\u20136");return e}function z(e=48){if(!Number.isInteger(e)||e<1)throw new RangeError("Cache capacity must be positive");let t=new Map;return{month(r,a,d={}){C(r,a);let i=W(d.weekStartsOn??1),f=`${r}:${a}:${i}:${!!d.fixedWeeks}:${d.outsideDays??"visible"}`,m=t.get(f);if(m)return t.delete(f),t.set(f,m),m;let g=A({year:r,month:a,day:1}),y=(N(g)-i+7)%7,h=T(g),w=T("0001-01-01"),o=T("9999-12-31"),b=d.fixedWeeks?42:Math.ceil((y+C(r,a))/7)*7,c=[];for(let s=0;s<b/7;s++){let l=[];for(let u=0;u<7;u++){let p=h-y+s*7+u;if(p<w||p>o){l.push(Object.freeze({date:"",day:0,weekday:(i+u)%7,outside:!0,hidden:!0}));continue}let k=K(p),P=k.month!==a;l.push(Object.freeze({date:A(k),day:k.day,weekday:(i+u)%7,outside:P,hidden:P&&d.outsideDays==="hidden"}))}c.push(Object.freeze(l))}let n=Object.freeze({year:r,month:a,weeks:Object.freeze(c)});return t.set(f,n),t.size>e&&t.delete(t.keys().next().value),n},clear(){t.clear()},get cacheSize(){return t.size}}}var F=new Map;function Q(e,t){let r=JSON.stringify([e,t]),a=F.get(r);return a||(a=new Intl.DateTimeFormat(e,{...t,calendar:"gregory",timeZone:"UTC"}),F.set(r,a),F.size>32&&F.delete(F.keys().next().value)),a}function X(e){let{year:t,month:r,day:a}=D(e),d=new Date(0);return d.setUTCFullYear(t,r-1,a),d.setUTCHours(12,0,0,0),d}function j(e,t="en-GB",r={dateStyle:"long"}){return Q(t,r).format(X(e))}function B(e,t="en-GB"){return j(`${String(e.year).padStart(4,"0")}-${String(e.month).padStart(2,"0")}-01`,t,{month:"long",year:"numeric"})}function G(e,t,r="short"){let a=Q(e,{weekday:r});return Array.from({length:7},(d,i)=>{let f=(t+i)%7;return{weekday:f,label:a.format(X(`2023-01-${String(f+1).padStart(2,"0")}`))}})}function ee(e="UTC",t=new Date){let r=new Intl.DateTimeFormat("en-CA",{timeZone:e,calendar:"gregory",year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(t),a=d=>r.find(i=>i.type===d).value;return`${a("year").padStart(4,"0")}-${a("month")}-${a("day")}`}function M(e){let t=/^(\d{2}):(\d{2})(?::(\d{2}))?$/.exec(e);if(!t||Number(t[1])>23||Number(t[2])>59||Number(t[3]??0)>59)throw new RangeError("Use HH:mm or HH:mm:ss");return Number(t[1])*3600+Number(t[2])*60+Number(t[3]??0)}function te(e,t=!1){if(!Number.isInteger(e)||e<0||e>86399)throw new RangeError("Time must fit within a day");let r=[Math.floor(e/3600),Math.floor(e/60)%60];return t&&r.push(e%60),r.map(a=>String(a).padStart(2,"0")).join(":")}function ne(e,t=24){let r=M(e),a=Math.floor(r/3600);return{hour:t===12?a%12||12:a,minute:Math.floor(r/60)%60,second:r%60,period:a<12?"AM":"PM"}}function re(e,t,r,a=24,d=!1){let i=ne(e,24),f=i.hour,m=i.minute,g=i.second;if(t==="period"){if(r!=="AM"&&r!=="PM")throw new RangeError("Use AM or PM");f=f%12+(r==="PM"?12:0)}else{let y=Number(r),h=t==="hour"?a===12?12:23:59,w=t==="hour"&&a===12?1:0;if(!Number.isInteger(y)||y<w||y>h)throw new RangeError("Invalid time segment");t==="hour"&&(f=a===12?y%12+(i.period==="PM"?12:0):y),t==="minute"&&(m=y),t==="second"&&(g=y)}return te(f*3600+m*60+g,d)}function ye(e=30,t="00:00",r="23:59"){if(!Number.isInteger(e)||e<1||e>1440)throw new RangeError("Time step must be 1\u20131440 minutes");let a=[],d=M(t),i=M(r),f=t.length===8||r.length===8;if(d>i)throw new RangeError("Time slot bounds must be ordered within one day");for(let m=d;m<=i;m+=e*60)a.push(te(m,f));return Object.freeze(a)}function ae(e,t,r=24){return!e&&t!=="period"?"":String(ne(e??"00:00",r)[t])}function H(e){return e!==null&&"start"in e}function E(e,t="start"){return H(e)?e[t]:t==="start"?e:null}var ie=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function oe(e){if(e.kind&&!["date","time","datetime"].includes(e.kind))throw new RangeError("Invalid picker kind");if(e.selection&&!["single","range","none"].includes(e.selection))throw new RangeError("Invalid selection");if(e.hourCycle!==void 0&&e.hourCycle!==12&&e.hourCycle!==24)throw new RangeError("hourCycle must be 12 or 24");let t=e.referenceDate??ee(e.timeZone??"UTC");D(t);let r=e.months??1,a=e.minuteStep??1;if(!Number.isInteger(r)||r<1||r>12)throw new RangeError("months must be 1\u201312");if(!Number.isInteger(a)||a<1||a>60)throw new RangeError("minuteStep must be 1\u201360");if(e.minDate&&D(e.minDate),e.maxDate&&D(e.maxDate),e.minDate&&e.maxDate&&e.minDate>e.maxDate)throw new RangeError("minDate must precede maxDate");if(e.minTime&&M(e.minTime),e.maxTime&&M(e.maxTime),e.minTime&&e.maxTime&&M(e.minTime)>M(e.maxTime))throw new RangeError("minTime must precede maxTime");for(let f of[e.minDuration,e.maxDuration])if(f!==void 0&&(!Number.isFinite(f)||f<0))throw new RangeError("Duration must be nonnegative");if(e.minDuration!==void 0&&e.maxDuration!==void 0&&e.minDuration>e.maxDuration)throw new RangeError("minDuration must not exceed maxDuration");let d=Object.freeze([...e.weekend??[0,6]]);d.forEach(W);let i=e.timeZone??"UTC";return new Intl.DateTimeFormat("en",{timeZone:i}),Object.freeze({...e,kind:e.kind??"date",selection:e.selection??"single",referenceDate:t,locale:e.locale??"en-GB",timeZone:i,weekStartsOn:W(e.weekStartsOn??1),months:r,weekend:d,hourCycle:e.hourCycle??24,minuteStep:a})}function Z(e,t){if(!e)return null;let r={};if(t.kind!=="time"){if(!e.date)throw new RangeError("Date is required");D(e.date),r.date=e.date}else e.date&&(D(e.date),r.date=e.date);if(t.kind!=="date"&&(e.time&&(M(e.time),r.time=e.time),e.dayOffset!==void 0)){if(r.date)throw new RangeError("Use date or dayOffset, not both");if(!Number.isInteger(e.dayOffset)||e.dayOffset<0)throw new RangeError("dayOffset must be nonnegative");r.dayOffset=e.dayOffset}return Object.freeze(r)}function q(e,t){if(!e)return t.selection==="range"?Object.freeze({start:null,end:null}):null;if(t.selection==="range"){if(!H(e))throw new RangeError("A range requires start and end");return Object.freeze({start:Z(e.start,t),end:Z(e.end,t)})}if(H(e))throw new RangeError("Single selection expects one point");return Z(e,t)}function se(e){return(e.date?T(e.date):e.dayOffset??0)*86400+(e.time?M(e.time):0)}function ke(e={}){let t=oe(e),r=q(e.value===void 0?e.defaultValue??null:e.value,t),a=z(),d=e.month??D(E(r)?.date??t.referenceDate);O(d,t.months-1);let i=Object.freeze({options:t,value:r,draft:r,visibleMonth:Object.freeze({year:d.year,month:d.month}),focusedDate:E(r)?.date??t.referenceDate,hoverDate:null,activeEndpoint:"start",open:!1,error:null}),f=new Set,m=new Set,g=n=>{let s=i;Object.entries(n).every(([l,u])=>l==="options"?s.options===u:ie(s[l],u))||(i=Object.freeze({...i,...n}),f.forEach(l=>l()),ie(s.value,i.value)||(m.forEach(l=>l(i.value)),t.onValueChange?.(i.value)))},y=n=>!!(t.minDate&&n<t.minDate||t.maxDate&&n>t.maxDate||t.isDateUnavailable?.(n));function h(n,s=!1){let l=H(n)?[n.start,n.end]:[n];if(l.every(u=>u===null))return null;for(let u of l){if(!u){if(s)return"Choose a complete value";continue}if(u.date&&y(u.date))return"This date is unavailable";if(t.kind!=="date"){if(!u.time){if(s)return"Choose a time";continue}let p=M(u.time);if(t.minTime&&p<M(t.minTime)||t.maxTime&&p>M(t.maxTime)||t.isTimeUnavailable?.(u.time,u))return"This time is unavailable"}}if(H(n)&&n.start&&n.end&&(t.kind==="date"||n.start.time&&n.end.time)){if(t.kind==="time"&&!!n.start.date!=!!n.end.date)return"Both endpoints need dates, or neither";let u=se(n.end)-se(n.start);if(u<0)return"The end must follow the start";let p=t.kind==="date"?u/86400+1:u;if(t.minDuration!==void 0&&p<t.minDuration)return"The interval is too short";if(t.maxDuration!==void 0&&p>t.maxDuration)return"The interval is too long";if(t.isRangeUnavailable?.(n.start,n.end))return"This interval is unavailable"}return null}function w(n,s=i.activeEndpoint,l=!1){let u=q(n,t),p=h(u);if(p)return g(l?{draft:u,error:p,activeEndpoint:s}:{error:p}),!1;let k=h(u,!0)===null;return g({draft:u,error:null,activeEndpoint:s,...t.commit!=="explicit"&&k?{value:u}:{}}),!0}function o(n,s){return w(t.selection==="range"?{start:E(i.draft,"start"),end:E(i.draft,"end"),[s]:n}:n,s,!0)}let b={getSnapshot:()=>i,subscribe(n){return f.add(n),()=>{f.delete(n)}},subscribeValue(n){return m.add(n),()=>{m.delete(n)}},getMonth(n=0){let s=O(i.visibleMonth,n);return a.month(s.year,s.month,t)},getDay(n){if(!n)return{selected:!1,rangeStart:!1,rangeEnd:!1,inRange:!1,preview:!1,disabled:!0,today:!1,weekend:!1,focused:!1};let s=i.draft,l=E(s)?.date,u=H(s)?s.end?.date:void 0,p=!u&&l?i.hoverDate:null,k=p&&p<l?p:l,P=p&&p<l?l:p??u;return{selected:n===l||n===u,rangeStart:n===l,rangeEnd:n===u,inRange:!!(k&&P&&n>=k&&n<=P),preview:!!p,disabled:!!t.disabled||y(n),today:n===t.referenceDate,weekend:t.weekend.includes(N(n)),focused:n===i.focusedDate}},setVisibleMonth(n){O(n,t.months-1),g({visibleMonth:Object.freeze({year:n.year,month:n.month}),hoverDate:null})},navigate(n){b.setVisibleMonth(O(i.visibleMonth,n))},focus(n){D(n),g({focusedDate:n});let s=D(n),l=A({...i.visibleMonth,day:1}),u=O(i.visibleMonth,t.months-1);if(n<l||n>A({...u,day:C(u.year,u.month)})){let p=O({year:9999,month:12},-(t.months-1));b.setVisibleMonth(s.year>p.year||s.year===p.year&&s.month>p.month?p:s)}},moveFocus(n,s=!1){let l=i.focusedDate,u={ArrowLeft:-1,ArrowRight:1,ArrowUp:-7,ArrowDown:7};if(n in u)l=U(l,u[n]);else if(n==="Home")l=U(l,-((N(l)-t.weekStartsOn+7)%7));else if(n==="End")l=U(l,6-(N(l)-t.weekStartsOn+7)%7);else if(n==="PageUp"||n==="PageDown")l=_(l,(n==="PageUp"?-1:1)*(s?12:1));else return!1;return b.focus(l),!0},hover(n){n&&D(n),t.selection==="range"&&E(i.draft)?.date&&!E(i.draft,"end")&&g({hoverDate:n})},selectDate(n){if(D(n),t.disabled||t.readOnly||y(n))return!1;if(t.selection==="none")return t.onSelect?.(n),!0;if(t.kind==="time")return b.setDate(n,i.activeEndpoint);let s=E(i.draft,i.activeEndpoint),l={date:n,...t.kind==="datetime"&&s?.time?{time:s.time}:{}},u=l,p="start";if(t.selection==="range"){let P=E(i.draft),v=E(i.draft,"end");!P||v?(u={start:l,end:null},p="end"):(u=n<P.date?{start:l,end:P}:{start:P,end:l},p="end")}let k=w(u,p);return k&&(g({focusedDate:n,hoverDate:null}),t.onSelect?.(n)),k},setDate(n,s="start"){if(D(n),t.disabled||t.readOnly)return!1;let l=E(i.draft,s);return o({date:n,...t.kind!=="date"&&l?.time?{time:l.time}:{}},s)},setTime(n,s="start"){if(M(n),t.disabled||t.readOnly||t.kind==="date")return!1;let l=E(i.draft,s);return o({...l,time:n,...t.kind==="datetime"&&!l?.date?{date:t.referenceDate}:{}},s)},setDayOffset(n,s="end"){if(!Number.isInteger(n)||n<0)throw new RangeError("Day offset must be nonnegative");if(t.disabled||t.readOnly||t.kind!=="time")return!1;let l=E(i.draft,s);return o({...l,date:void 0,dayOffset:n},s)},setEndpoint(n){if(n==="end"&&t.selection!=="range")throw new RangeError("End is available only for a range");g({activeEndpoint:n})},setValue(n){let s=q(n,t),l=h(s);if(l)throw new RangeError(l);g({value:s,draft:s,error:null,hoverDate:null})},apply(){if(t.disabled||t.readOnly)return!1;let n=h(i.draft,!0);return n?(g({error:n}),!1):(g({value:i.draft,error:null,open:!1}),!0)},cancel(){g({draft:i.value,error:null,hoverDate:null,open:!1})},clear(){if(t.disabled||t.readOnly)return;let n=q(null,t);g({draft:n,value:t.commit==="explicit"?i.value:n,error:null,hoverDate:null,activeEndpoint:"start"})},setOpen(n){n&&t.disabled||g({open:n})},setOptions(n){if(Object.entries(n).every(([l,u])=>Object.is(t[l],u)))return;if(n.kind&&n.kind!==t.kind||n.selection&&n.selection!==t.selection)throw new RangeError("Create a new store to change kind or selection");let s=oe({...t,...n});O(i.visibleMonth,s.months-1),t=s,g({options:s,error:h(i.draft)})},validate:()=>h(i.draft,!0),destroy(){f.clear(),m.clear(),a.clear()},get cacheSize(){return a.cacheSize}},c=h(r);if(c)throw new RangeError(c);return b}function xe(e,t,r="reject"){if(!e.date||!e.time)throw new RangeError("Date and time are required");D(e.date);let a=T(e.date)*864e5+M(e.time)*1e3,d=new Intl.DateTimeFormat("en-CA",{timeZone:t,calendar:"gregory",numberingSystem:"latn",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),i=h=>{let w=d.formatToParts(new Date(h)),o=b=>w.find(c=>c.type===b).value;return T(`${o("year").padStart(4,"0")}-${o("month")}-${o("day")}`)*864e5+M(`${o("hour")}:${o("minute")}:${o("second")}`)*1e3},f=new Set;for(let h of[-48,-24,-12,0,12,24,48]){let w=a+h*36e5;f.add(i(w)-w)}let m=[...f].map(h=>a-h).sort((h,w)=>h-w),g=m.filter(h=>i(h)===a);if(g.length===1)return new Date(g[0]);if(r==="reject")throw new RangeError(g.length?"This local time occurs twice":"This local time does not exist");let y=g.length?g:m;return new Date(r==="earlier"?y[0]:y[y.length-1])}function I(e){return String(e??"").replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t])}function S(e,t,r){if(r===!1||r==null)e.hasAttribute(t)&&e.removeAttribute(t);else{let a=r===!0?"":r;e.getAttribute(t)!==a&&e.setAttribute(t,a)}}function Y(e,t,r=!1){let a=e.getDay(t),d=e.getSnapshot().options;return{"data-date":t,"data-selected":a.selected?"":void 0,"data-range-start":a.rangeStart?"":void 0,"data-range-end":a.rangeEnd?"":void 0,"data-in-range":a.inRange?"":void 0,"data-preview":a.preview&&a.inRange?"":void 0,"data-weekend":a.weekend?"":void 0,"data-outside":r?"":void 0,"data-today":a.today?"":void 0,"aria-selected":a.selected||a.inRange&&!a.preview?"true":"false"}}function le(e,t,r=!1){let{"aria-selected":a,...d}=Y(e,t,r);return d}function J(e,t={}){let{options:r,focusedDate:a}=e.getSnapshot(),d=G(r.locale,r.weekStartsOn),i=G(r.locale,r.weekStartsOn,"long"),f=Array.from({length:r.months},(y,h)=>e.getMonth(h)),m=f.flatMap(y=>y.weeks.flat()).filter(y=>!y.hidden&&!y.outside),g=m.some(y=>y.date===a&&!e.getDay(y.date).disabled)?a:m.find(y=>!e.getDay(y.date).disabled)?.date;return Array.from({length:r.months},(y,h)=>{let w=f[h],o=d.map(b=>{let c=t.weekdays?.[b.weekday],n=c?.label??b.label,s=c?.ariaLabel??(c?.label||i.find(l=>l.weekday===b.weekday).label);return`<th scope="col" data-part="weekday" data-weekday="${b.weekday}" class="${I(c?.class??"")}" ${r.weekend.includes(b.weekday)?"data-weekend":""} aria-label="${I(s)}">${t.renderWeekday?.(b.weekday,n)??I(n)}</th>`}).join("");return`<section class="sp-month" data-part="month"><h3 data-part="month-title" aria-live="polite">${I(B(w,r.locale))}</h3><table role="grid" aria-readonly="${!!r.readOnly}" aria-multiselectable="${r.selection==="range"}" aria-label="${I(B(w,r.locale))}" class="sp-grid"><thead><tr>${o}</tr></thead><tbody>${w.weeks.map(b=>`<tr>${b.map(c=>{if(c.hidden)return'<td role="gridcell" aria-disabled="true"></td>';let n=e.getDay(c.date),s=n.disabled||c.outside&&r.outsideSelectable===!1,l=Object.entries(Y(e,c.date,c.outside)).map(([p,k])=>k==null?"":`${p}="${I(k)}"`).join(" "),u=t.renderCell?.(c,n)??`<button type="button" data-day-trigger data-date="${c.date}" aria-label="${I(j(c.date,r.locale))}" ${s?"disabled":""} tabindex="${c.date===g&&!c.outside?"0":"-1"}"><span data-part="number">${c.day}</span></button>`;return`<td role="gridcell" data-part="cell" ${l}>${u}</td>`}).join("")}</tr>`).join("")}</tbody></table></section>`}).join("")}function de(e,t,r={}){let a="",d=!0,i=new Set,f=()=>{let{options:o,visibleMonth:b,focusedDate:c}=t.getSnapshot(),n=JSON.stringify([b,o.months,o.weekStartsOn,o.outsideDays,o.fixedWeeks,o.locale,o.weekend,r.weekdays]),s=e.contains(e.ownerDocument.activeElement);n!==a&&(e.innerHTML=J(t,r),a=n);let l;for(let u of e.querySelectorAll('[data-part="cell"]')){let p=u.dataset.date,k=u.hasAttribute("data-outside"),P=t.getDay(p);for(let[V,$]of Object.entries(Y(t,p,k)))S(u,V,$);let v=u.querySelector("[data-day-trigger]");v&&(v.disabled=P.disabled||k&&o.outsideSelectable===!1,v.hasAttribute("aria-label")||S(v,"aria-label",j(p,o.locale)),S(v,"aria-current",P.today?"date":null),v.tabIndex=-1,!v.disabled&&!k&&(!l||p===c)&&(l=v))}l&&(l.tabIndex=0),s&&l&&c===l.dataset.date&&e.ownerDocument.activeElement!==l&&l.focus();for(let u of e.querySelectorAll('[role="grid"]'))S(u,"aria-readonly",String(!!o.readOnly)),S(u,"aria-multiselectable",String(o.selection==="range"))},m=o=>{let b=o.target.closest("[data-day-trigger]");if(!b||!e.contains(b)||b.disabled)return;let c=b.dataset.date;r.onDayClick?.(c,o);let n=setTimeout(()=>{i.delete(n),d&&e.isConnected&&!o.defaultPrevented&&t.selectDate(c)&&r.onSelect?.(c)},0);i.add(n)},g=o=>{if(o.pointerType==="touch")return;let b=o.target.closest("[data-day-trigger]");b&&!b.hasAttribute("disabled")&&t.hover(b.dataset.date)},y=()=>t.hover(null),h=o=>{let b=o.target.closest("[data-day-trigger]");if(b){if(o.key==="Escape"){t.cancel(),o.preventDefault();return}if(o.key==="ArrowLeft"||o.key==="ArrowRight"||o.key==="ArrowUp"||o.key==="ArrowDown"||o.key==="Home"||o.key==="End"||o.key==="PageUp"||o.key==="PageDown"){o.preventDefault(),t.focus(b.dataset.date);let c=getComputedStyle(e).direction==="rtl",n=c&&o.key==="ArrowLeft"?"ArrowRight":c&&o.key==="ArrowRight"?"ArrowLeft":o.key;try{t.moveFocus(n,o.shiftKey)}catch(s){if(!(s instanceof RangeError))throw s}}}};f();let w=t.subscribe(f);return e.addEventListener("click",m),e.addEventListener("pointerover",g),e.addEventListener("pointerleave",y),e.addEventListener("keydown",h),()=>{d=!1;for(let o of i)clearTimeout(o);i.clear(),w(),e.removeEventListener("click",m),e.removeEventListener("pointerover",g),e.removeEventListener("pointerleave",y),e.removeEventListener("keydown",h)}}function Le(e,t,r="start"){let a=e.value,d=e.disabled,i=e.readOnly,f=()=>{let h=t.getSnapshot();e.disabled=d||!!h.options.disabled,e.readOnly=i||!!h.options.readOnly,e.ownerDocument.activeElement!==e&&(e.value=E(h.draft,r)?.date??"",S(e,"aria-invalid",String(!!h.error)))},m=()=>{try{D(e.value);let h=t.setDate(e.value,r);S(e,"aria-invalid",String(!h))}catch{S(e,"aria-invalid","true")}},g=()=>{e.value=E(t.getSnapshot().draft,r)?.date??"",S(e,"aria-invalid",String(!!t.getSnapshot().error))};f();let y=t.subscribe(f);return e.addEventListener("input",m),e.addEventListener("blur",g),()=>{y(),e.removeEventListener("input",m),e.removeEventListener("blur",g),e.value=a}}function Ce(e,t,r,a="start"){let d=!1,i=e.disabled,f=e instanceof e.ownerDocument.defaultView.HTMLInputElement&&e.readOnly,m=()=>ae(E(t.getSnapshot().draft,a)?.time,r,t.getSnapshot().options.hourCycle),g=()=>{let o=t.getSnapshot();e.disabled=i||!!o.options.disabled,e instanceof e.ownerDocument.defaultView.HTMLInputElement?(e.readOnly=f||!!o.options.readOnly,e.min=r==="hour"&&o.options.hourCycle===12?"1":"0",e.max=r==="hour"?o.options.hourCycle===12?"12":"23":"59",e.step=r==="minute"?String(o.options.minuteStep):"1"):e.disabled=i||!!o.options.disabled||!!o.options.readOnly,(e.ownerDocument.activeElement!==e||!d)&&(e.value=m(),o.error||(d=!1)),S(e,"aria-invalid",String(d||!!o.error))},y=()=>{if(e.value.trim()===""){d=!0,S(e,"aria-invalid","true");return}try{let o=t.getSnapshot(),b=E(o.draft,a)?.time??"00:00";if(r==="minute"&&Number(e.value)%o.options.minuteStep!==0)throw new RangeError("Minute must match the configured step");let c=re(b,r,e.value,o.options.hourCycle,!!o.options.seconds||b.length===8||r==="second");d=!t.setTime(c,a),S(e,"aria-invalid",String(d))}catch{d=!0,S(e,"aria-invalid","true")}},h=()=>{d=!1,e.value=m(),S(e,"aria-invalid",String(!!t.getSnapshot().error))};g();let w=t.subscribe(g);return e.addEventListener("input",y),e.addEventListener("blur",h),()=>{w(),e.removeEventListener("input",y),e.removeEventListener("blur",h)}}function Ae(e,t,{name:r="date",required:a=!1}={}){let d=e.ownerDocument.createElement("input");d.type="hidden",d.name=r,e.append(d);let i=t.getSnapshot().value,f=()=>{d.disabled=!!t.getSnapshot().options.disabled,d.value=JSON.stringify(t.getSnapshot().value)},m=h=>{if(d.disabled)return;let w=t.getSnapshot().value,o=!w||"start"in w&&!w.start&&!w.end;o&&!a||(a&&o||t.validate())&&(h.preventDefault(),e.dispatchEvent(new CustomEvent("picker-invalid",{detail:t.validate()??"Choose a value"})))},g=()=>queueMicrotask(()=>t.setValue(i));f();let y=t.subscribe(f);return e.addEventListener("submit",m),e.addEventListener("reset",g),()=>{y(),d.remove(),e.removeEventListener("submit",m),e.removeEventListener("reset",g)}}function Ve(e,t,r,{outside:a=!1,onSelect:d,disabled:i}={}){let f=!0,m=new Set,g=i??e.disabled,y=e.getAttribute("aria-label"),h=()=>{let n=t.getSnapshot(),s=t.getDay(r);for(let[u,p]of Object.entries(le(t,r,a)))S(e,u,p);e.disabled=g||s.disabled||a&&n.options.outsideSelectable===!1,e.tabIndex=s.focused&&!a?0:-1,S(e,"data-day-trigger",!0),S(e,"aria-current",s.today?"date":null),S(e,"aria-label",y??j(r,n.options.locale));let l=e.ownerDocument.activeElement;s.focused&&!a&&l!==e&&l?.matches("[data-day-trigger]")&&l.closest('[role="grid"]')===e.closest('[role="grid"]')&&e.focus()},w=n=>{let s=setTimeout(()=>{m.delete(s),f&&e.isConnected&&!e.disabled&&!n.defaultPrevented&&!(a&&t.getSnapshot().options.outsideSelectable===!1)&&t.selectDate(r)&&d?.(r)},0);m.add(s)},o=n=>{n.pointerType!=="touch"&&!e.disabled&&t.hover(r)},b=n=>{if(!n.defaultPrevented)try{if(n.key==="Escape"){t.cancel(),n.preventDefault();return}t.focus(r);let s=getComputedStyle(e).direction==="rtl",l=s&&n.key==="ArrowLeft"?"ArrowRight":s&&n.key==="ArrowRight"?"ArrowLeft":n.key;t.moveFocus(l,n.shiftKey)&&n.preventDefault()}catch(s){if(!(s instanceof RangeError))throw s}};h();let c=t.subscribe(h);return e.addEventListener("click",w),e.addEventListener("pointerenter",o),e.addEventListener("keydown",b),()=>{f=!1;for(let n of m)clearTimeout(n);m.clear(),c(),e.removeEventListener("click",w),e.removeEventListener("pointerenter",o),e.removeEventListener("keydown",b)}}function He(e,t,r,{modal:a=!1,label:d="Choose a date"}={}){let i=t.ownerDocument,f=t.hidden,m=e.disabled;t.setAttribute("role","dialog"),t.setAttribute("aria-label",t.getAttribute("aria-label")??d),a&&t.setAttribute("aria-modal","true"),e.setAttribute("aria-haspopup","dialog");let g=r.getSnapshot().open,y=()=>{let c=r.getSnapshot();t.hidden=!c.open,e.disabled=m||!!c.options.disabled,e.setAttribute("aria-expanded",String(c.open)),c.open&&!g&&queueMicrotask(()=>{r.getSnapshot().open&&(t.querySelector('[data-day-trigger][tabindex="0"],input:not(:disabled),button:not(:disabled)')??t).focus()}),!c.open&&g&&e.focus(),g=c.open},h=c=>{c.defaultPrevented||(r.getSnapshot().open?r.cancel():r.setOpen(!0))},w=c=>{r.getSnapshot().open&&!t.contains(c.target)&&!e.contains(c.target)&&r.cancel()},o=c=>{if(r.getSnapshot().open&&(c.key==="Escape"&&(c.preventDefault(),r.cancel()),a&&c.key==="Tab")){let n=[...t.querySelectorAll('button:not(:disabled),input:not(:disabled),select:not(:disabled),a[href],[tabindex="0"]')].filter(u=>u.tabIndex>=0&&!u.hidden&&u.getClientRects().length),s=n[0],l=n.at(-1);s?c.shiftKey&&i.activeElement===s?(c.preventDefault(),l.focus()):!c.shiftKey&&i.activeElement===l&&(c.preventDefault(),s.focus()):(c.preventDefault(),t.focus())}};y();let b=r.subscribe(y);return e.addEventListener("click",h),i.addEventListener("pointerdown",w),i.addEventListener("keydown",o),()=>{b(),t.hidden=f,e.removeEventListener("click",h),i.removeEventListener("pointerdown",w),i.removeEventListener("keydown",o)}}function We(e,t={}){let r=e.getSnapshot(),a=z(1),d=t.from??{year:1900,month:1},i=t.to??{year:2100,month:12},f=y=>y.year*12+y.month,m=f(r.visibleMonth)<f(d)?d:f(r.visibleMonth)>f(i)?i:r.visibleMonth,g={...e,getSnapshot:()=>({...r,visibleMonth:m,options:{...r.options,months:1,fixedWeeks:!0}}),getMonth:(y=0)=>{let h=O(m,y);return a.month(h.year,h.month,{...r.options,fixedWeeks:!0})}};return J(g,t)}function qe(e,t,r={}){let a=r.from??{year:1900,month:1},d=r.to??{year:2100,month:12};O(a,0),O(d,0);let i=v=>(v.year-a.year)*12+v.month-a.month,f=i(d)+1,m=r.monthHeight??340,g=r.overscan??1;if(f<1||f>1e4||m<280||!Number.isFinite(m)||!Number.isInteger(g)||g<0||g>4)throw new RangeError("Invalid scrolling window or month geometry");let y=e.ownerDocument,h=y.createElement("div");h.style.height=`${f*m}px`,h.style.position="relative",e.replaceChildren(h);let w=z(12),o=new Map,b=0,c=!1,n=v=>{let V,$;return{...t,getSnapshot(){let L=t.getSnapshot();return L!==V&&(V=L,$=Object.freeze({...L,visibleMonth:v,options:Object.freeze({...L.options,months:1,fixedWeeks:!0})})),$},getMonth(L=0){let x=O(v,L);return w.month(x.year,x.month,{...t.getSnapshot().options,fixedWeeks:!0})}}},s=()=>{let v=Math.max(0,Math.min(f-1,Math.floor(e.scrollTop/m))),V=Math.ceil((e.clientHeight||m)/m),$=Math.max(0,v-g),L=Math.min(f-1,v+V+g);for(let[x,R]of o)(x<$||x>L)&&(R.stop(),R.element.remove(),o.delete(x));for(let x=$;x<=L;x++)if(!o.has(x)){let R=y.createElement("div");R.className="sp-scroll-month",R.style.cssText=`position:absolute;top:${x*m}px;left:0;right:0;height:${m}px;overflow:hidden`,h.append(R);let ce=O(a,x);o.set(x,{element:R,stop:de(R,n(ce),r)})}if(!c){let x=O(a,v),R=t.getSnapshot();(x.year!==R.visibleMonth.year||x.month!==R.visibleMonth.month)&&(c=!0,t.setVisibleMonth(x),c=!1)}},l=()=>{b||(b=e.ownerDocument.defaultView.requestAnimationFrame(()=>{b=0,s()}))},u=()=>{if(c)return;let v=i(t.getSnapshot().visibleMonth);v<0||v>=f||Math.floor(e.scrollTop/m)!==v&&(e.scrollTop=v*m,s())};e.scrollTop=Math.max(0,Math.min(f-1,i(t.getSnapshot().visibleMonth)))*m,s();let p=t.subscribe(u);e.addEventListener("scroll",l,{passive:!0});let k=e.ownerDocument.defaultView?.ResizeObserver,P=k?new k(l):void 0;return P?.observe(e),()=>{P?.disconnect(),p(),e.removeEventListener("scroll",l),b&&e.ownerDocument.defaultView.cancelAnimationFrame(b);for(let v of o.values())v.stop();o.clear(),w.clear(),h.remove()}}export{U as addDays,O as addMonths,S as attribute,de as bindCalendar,Le as bindDateField,Ve as bindDayTrigger,qe as bindMonthScroller,Ae as bindPickerForm,He as bindPickerPopover,Ce as bindTimeSegment,J as calendarMarkup,z as createCalendarEngine,ke as createPickerStore,Q as dateFormatter,A as dateString,Y as dayAttributes,T as dayNumber,le as dayTriggerAttributes,C as daysInMonth,I as escapeHTML,j as formatDate,B as formatMonth,K as fromDayNumber,H as isRange,ue as leapYear,We as monthScrollerMarkup,D as parseDate,E as pointFor,xe as resolveZonedDateTime,_ as shiftDateMonths,ne as timeParts,M as timeSeconds,ae as timeSegmentValue,ye as timeSlots,te as timeString,ee as today,re as updateTime,X as utcDate,W as validateWeekStart,fe as weekNumber,N as weekday,G as weekdayLabels};
@@ -0,0 +1,6 @@
1
+ import type { PickerStore } from "./store";
2
+ /** Popup behavior for app-owned containers. The trigger and content can live anywhere. */
3
+ export declare function bindPickerPopover(trigger: HTMLButtonElement, content: HTMLElement, store: PickerStore, { modal, label, }?: {
4
+ modal?: boolean;
5
+ label?: string;
6
+ }): () => void;
@@ -0,0 +1,13 @@
1
+ import { type Month } from "./calendar";
2
+ import { type CalendarRenderOptions } from "./dom";
3
+ import type { PickerStore } from "./store";
4
+ export interface MonthScrollerOptions extends CalendarRenderOptions {
5
+ from?: Month;
6
+ to?: Month;
7
+ monthHeight?: number;
8
+ overscan?: number;
9
+ }
10
+ /** Static first month for SSR. The client replaces it with a bounded scroll window. */
11
+ export declare function monthScrollerMarkup(store: PickerStore, options?: MonthScrollerOptions): string;
12
+ /** Render a small window of months inside an app-owned scrolling element. */
13
+ export declare function bindMonthScroller(root: HTMLElement, store: PickerStore, options?: MonthScrollerOptions): () => void;
@@ -0,0 +1,107 @@
1
+ import { type Month, type CalendarGridOptions } from "./calendar";
2
+ export type PickerKind = "date" | "time" | "datetime";
3
+ export type Endpoint = "start" | "end";
4
+ export interface DatePoint {
5
+ readonly date?: string;
6
+ readonly time?: string;
7
+ readonly dayOffset?: number;
8
+ }
9
+ export interface DateRange {
10
+ readonly start: DatePoint | null;
11
+ readonly end: DatePoint | null;
12
+ }
13
+ export type PickerValue = DatePoint | DateRange | null;
14
+ export interface PickerOptions extends CalendarGridOptions {
15
+ kind?: PickerKind;
16
+ selection?: "single" | "range" | "none";
17
+ value?: PickerValue;
18
+ defaultValue?: PickerValue;
19
+ month?: Month;
20
+ /** Supply the same reference date on the server and client for deterministic SSR. */
21
+ referenceDate?: string;
22
+ locale?: string;
23
+ timeZone?: string;
24
+ months?: number;
25
+ weekend?: readonly number[];
26
+ outsideSelectable?: boolean;
27
+ disabled?: boolean;
28
+ readOnly?: boolean;
29
+ commit?: "immediate" | "explicit";
30
+ minDate?: string;
31
+ maxDate?: string;
32
+ minTime?: string;
33
+ maxTime?: string;
34
+ hourCycle?: 12 | 24;
35
+ seconds?: boolean;
36
+ minuteStep?: number;
37
+ minDuration?: number;
38
+ maxDuration?: number;
39
+ /** Duration is inclusive days for date ranges and wall-clock seconds for time/datetime. */
40
+ isDateUnavailable?: (date: string) => boolean;
41
+ isTimeUnavailable?: (time: string, point: DatePoint) => boolean;
42
+ isRangeUnavailable?: (start: DatePoint, end: DatePoint) => boolean;
43
+ onValueChange?: (value: PickerValue) => void;
44
+ onSelect?: (date: string) => void;
45
+ }
46
+ export interface ResolvedPickerOptions extends PickerOptions {
47
+ readonly kind: PickerKind;
48
+ readonly selection: "single" | "range" | "none";
49
+ readonly referenceDate: string;
50
+ readonly locale: string;
51
+ readonly timeZone: string;
52
+ readonly weekStartsOn: number;
53
+ readonly months: number;
54
+ readonly weekend: readonly number[];
55
+ readonly hourCycle: 12 | 24;
56
+ readonly minuteStep: number;
57
+ }
58
+ export interface PickerSnapshot {
59
+ readonly options: Readonly<ResolvedPickerOptions>;
60
+ readonly value: PickerValue;
61
+ readonly draft: PickerValue;
62
+ readonly visibleMonth: Readonly<Month>;
63
+ readonly focusedDate: string;
64
+ readonly hoverDate: string | null;
65
+ readonly activeEndpoint: Endpoint;
66
+ readonly open: boolean;
67
+ readonly error: string | null;
68
+ }
69
+ export declare function isRange(value: PickerValue): value is DateRange;
70
+ export declare function pointFor(value: PickerValue, endpoint?: Endpoint): DatePoint | null;
71
+ export declare function createPickerStore(input?: PickerOptions): {
72
+ getSnapshot: () => PickerSnapshot;
73
+ subscribe(fn: () => void): () => void;
74
+ subscribeValue(fn: (v: PickerValue) => void): () => void;
75
+ getMonth(offset?: number): import("./calendar").CalendarMonth;
76
+ getDay(date: string): {
77
+ selected: boolean;
78
+ rangeStart: boolean;
79
+ rangeEnd: boolean;
80
+ inRange: boolean;
81
+ preview: boolean;
82
+ disabled: boolean;
83
+ today: boolean;
84
+ weekend: boolean;
85
+ focused: boolean;
86
+ };
87
+ setVisibleMonth(next: Month): void;
88
+ navigate(count: number): void;
89
+ focus(date: string): void;
90
+ moveFocus(key: string, shift?: boolean): boolean;
91
+ hover(date: string | null): void;
92
+ selectDate(date: string): boolean;
93
+ setDate(date: string, endpoint?: Endpoint): boolean;
94
+ setTime(time: string, endpoint?: Endpoint): boolean;
95
+ setDayOffset(offset: number, endpoint?: Endpoint): boolean;
96
+ setEndpoint(endpoint: Endpoint): void;
97
+ setValue(value: PickerValue): void;
98
+ apply(): boolean;
99
+ cancel(): void;
100
+ clear(): void;
101
+ setOpen(open: boolean): void;
102
+ setOptions(patch: Partial<PickerOptions>): void;
103
+ validate: () => string | null;
104
+ destroy(): void;
105
+ readonly cacheSize: number;
106
+ };
107
+ export type PickerStore = ReturnType<typeof createPickerStore>;
@@ -0,0 +1,12 @@
1
+ export declare function timeSeconds(value: string): number;
2
+ export declare function timeString(seconds: number, withSeconds?: boolean): string;
3
+ export declare function timeParts(value: string, hourCycle?: 12 | 24): {
4
+ readonly hour: number;
5
+ readonly minute: number;
6
+ readonly second: number;
7
+ readonly period: "AM" | "PM";
8
+ };
9
+ export declare function updateTime(value: string, part: "hour" | "minute" | "second" | "period", next: number | string, hourCycle?: 12 | 24, seconds?: boolean): string;
10
+ export declare function timeSlots(stepMinutes?: number, min?: string, max?: string): readonly string[];
11
+ /** Preserve an empty segment until a time has actually been chosen. */
12
+ export declare function timeSegmentValue(time: string | undefined, part: keyof ReturnType<typeof timeParts>, hourCycle?: 12 | 24): string;
@@ -0,0 +1,3 @@
1
+ import type { DatePoint } from "./store";
2
+ /** Resolve an explicit wall date/time. Ambiguous or missing DST times reject by default. */
3
+ export declare function resolveZonedDateTime(point: DatePoint, timeZone: string, disambiguation?: "reject" | "earlier" | "later"): Date;
@@ -0,0 +1,29 @@
1
+ import React, { type HTMLAttributes, type ButtonHTMLAttributes } from "react";
2
+ import { type CalendarRenderOptions } from "../core";
3
+ export interface CalendarProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSelect">, CalendarRenderOptions {
4
+ }
5
+ /** Complete calendar surface. Use Grid/Cell/DayTrigger for app-owned cell content. */
6
+ export declare const CalendarView: React.ForwardRefExoticComponent<CalendarProps & React.RefAttributes<HTMLDivElement>>;
7
+ export declare const Grid: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
8
+ export declare const Week: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
9
+ export declare const Cell: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
10
+ date: string;
11
+ outside?: boolean;
12
+ } & React.RefAttributes<HTMLDivElement>>;
13
+ export declare const Number: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & {
14
+ date: string;
15
+ } & React.RefAttributes<HTMLSpanElement>>;
16
+ export declare const DayTrigger: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onSelect"> & {
17
+ date: string;
18
+ outside?: boolean;
19
+ onSelect?: (date: string) => void;
20
+ } & React.RefAttributes<HTMLButtonElement>>;
21
+ export declare const Heading: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & {
22
+ offset?: number;
23
+ } & React.RefAttributes<HTMLHeadingElement>>;
24
+ export declare const Weekday: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & {
25
+ day: number;
26
+ } & React.RefAttributes<HTMLSpanElement>>;
27
+ export declare function Navigation({ direction, children, ...props }: ButtonHTMLAttributes<HTMLButtonElement> & {
28
+ direction: -1 | 1;
29
+ }): React.JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React, { type HTMLAttributes } from "react";
2
+ import { type MonthScrollerOptions } from "../core";
3
+ export declare function Continuous({ options, ...attributes }: HTMLAttributes<HTMLDivElement> & {
4
+ options?: MonthScrollerOptions;
5
+ }): React.JSX.Element;
@@ -0,0 +1,25 @@
1
+ import React, { type SelectHTMLAttributes, type ButtonHTMLAttributes } from "react";
2
+ import { type Endpoint, type TimeSegment } from "../core";
3
+ export declare const Field: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & {
4
+ endpoint?: Endpoint;
5
+ } & React.RefAttributes<HTMLInputElement>>;
6
+ export declare const Segment: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & {
7
+ part: Exclude<TimeSegment, "period">;
8
+ endpoint?: Endpoint;
9
+ } & React.RefAttributes<HTMLInputElement>>;
10
+ export declare const Period: React.ForwardRefExoticComponent<React.SelectHTMLAttributes<HTMLSelectElement> & {
11
+ endpoint?: Endpoint;
12
+ } & React.RefAttributes<HTMLSelectElement>>;
13
+ export declare function Time({ endpoint, className, labels, ...attributes }: React.HTMLAttributes<HTMLDivElement> & {
14
+ endpoint?: Endpoint;
15
+ labels?: Partial<Record<TimeSegment, string>>;
16
+ }): React.JSX.Element;
17
+ export declare function Action({ action, children, ...props }: ButtonHTMLAttributes<HTMLButtonElement> & {
18
+ action: "apply" | "cancel" | "clear";
19
+ }): React.JSX.Element;
20
+ export declare function MonthSelect(props: SelectHTMLAttributes<HTMLSelectElement>): React.JSX.Element;
21
+ export declare function YearSelect({ from, to, ...props }: SelectHTMLAttributes<HTMLSelectElement> & {
22
+ from?: number;
23
+ to?: number;
24
+ }): React.JSX.Element;
25
+ export declare function Output(props: React.HTMLAttributes<HTMLOutputElement>): React.JSX.Element;
@@ -0,0 +1,10 @@
1
+ import React, { type ReactNode } from "react";
2
+ import { type PickerOptions, type PickerStore } from "../core";
3
+ export interface RootProps extends PickerOptions {
4
+ store?: PickerStore;
5
+ children: ReactNode;
6
+ }
7
+ export declare function Root({ store: provided, children, value, onValueChange, ...options }: RootProps): React.JSX.Element;
8
+ export declare const DateRoot: (props: RootProps) => React.JSX.Element;
9
+ export declare const TimeRoot: (props: RootProps) => React.JSX.Element;
10
+ export declare const DateTimeRoot: (props: RootProps) => React.JSX.Element;
@@ -0,0 +1,74 @@
1
+ export declare const PickerContext: import("react").Context<{
2
+ getSnapshot: () => import(".").PickerSnapshot;
3
+ subscribe(fn: () => void): () => void;
4
+ subscribeValue(fn: (v: import(".").PickerValue) => void): () => void;
5
+ getMonth(offset?: number): import(".").CalendarMonth;
6
+ getDay(date: string): {
7
+ selected: boolean;
8
+ rangeStart: boolean;
9
+ rangeEnd: boolean;
10
+ inRange: boolean;
11
+ preview: boolean;
12
+ disabled: boolean;
13
+ today: boolean;
14
+ weekend: boolean;
15
+ focused: boolean;
16
+ };
17
+ setVisibleMonth(next: import(".").Month): void;
18
+ navigate(count: number): void;
19
+ focus(date: string): void;
20
+ moveFocus(key: string, shift?: boolean): boolean;
21
+ hover(date: string | null): void;
22
+ selectDate(date: string): boolean;
23
+ setDate(date: string, endpoint?: import(".").Endpoint): boolean;
24
+ setTime(time: string, endpoint?: import(".").Endpoint): boolean;
25
+ setDayOffset(offset: number, endpoint?: import(".").Endpoint): boolean;
26
+ setEndpoint(endpoint: import(".").Endpoint): void;
27
+ setValue(value: import(".").PickerValue): void;
28
+ apply(): boolean;
29
+ cancel(): void;
30
+ clear(): void;
31
+ setOpen(open: boolean): void;
32
+ setOptions(patch: Partial<import(".").PickerOptions>): void;
33
+ validate: () => string | null;
34
+ destroy(): void;
35
+ readonly cacheSize: number;
36
+ } | null>;
37
+ export declare function usePickerStore(): {
38
+ getSnapshot: () => import(".").PickerSnapshot;
39
+ subscribe(fn: () => void): () => void;
40
+ subscribeValue(fn: (v: import(".").PickerValue) => void): () => void;
41
+ getMonth(offset?: number): import(".").CalendarMonth;
42
+ getDay(date: string): {
43
+ selected: boolean;
44
+ rangeStart: boolean;
45
+ rangeEnd: boolean;
46
+ inRange: boolean;
47
+ preview: boolean;
48
+ disabled: boolean;
49
+ today: boolean;
50
+ weekend: boolean;
51
+ focused: boolean;
52
+ };
53
+ setVisibleMonth(next: import(".").Month): void;
54
+ navigate(count: number): void;
55
+ focus(date: string): void;
56
+ moveFocus(key: string, shift?: boolean): boolean;
57
+ hover(date: string | null): void;
58
+ selectDate(date: string): boolean;
59
+ setDate(date: string, endpoint?: import(".").Endpoint): boolean;
60
+ setTime(time: string, endpoint?: import(".").Endpoint): boolean;
61
+ setDayOffset(offset: number, endpoint?: import(".").Endpoint): boolean;
62
+ setEndpoint(endpoint: import(".").Endpoint): void;
63
+ setValue(value: import(".").PickerValue): void;
64
+ apply(): boolean;
65
+ cancel(): void;
66
+ clear(): void;
67
+ setOpen(open: boolean): void;
68
+ setOptions(patch: Partial<import(".").PickerOptions>): void;
69
+ validate: () => string | null;
70
+ destroy(): void;
71
+ readonly cacheSize: number;
72
+ };
73
+ export declare function usePicker(): import(".").PickerSnapshot;
74
+ export declare function useCalendarMonth(offset?: number): import(".").CalendarMonth;
@@ -0,0 +1,40 @@
1
+ export * from "../core";
2
+ export * from "./context";
3
+ export * from "./Root";
4
+ export * from "./Calendar";
5
+ export * from "./Fields";
6
+ import { Root } from "./Root";
7
+ import { Navigation } from "./Calendar";
8
+ import { Action, MonthSelect, YearSelect, Output } from "./Fields";
9
+ import { Continuous } from "./Continuous";
10
+ export declare const Calendar: {
11
+ View: import("react").ForwardRefExoticComponent<import("./Calendar").CalendarProps & import("react").RefAttributes<HTMLDivElement>>;
12
+ Continuous: typeof Continuous;
13
+ Action: typeof Action;
14
+ MonthSelect: typeof MonthSelect;
15
+ YearSelect: typeof YearSelect;
16
+ Output: typeof Output;
17
+ Grid: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
18
+ Week: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
19
+ Cell: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & {
20
+ date: string;
21
+ outside?: boolean;
22
+ } & import("react").RefAttributes<HTMLDivElement>>;
23
+ Number: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLSpanElement> & {
24
+ date: string;
25
+ } & import("react").RefAttributes<HTMLSpanElement>>;
26
+ DayTrigger: import("react").ForwardRefExoticComponent<Omit<import("react").ButtonHTMLAttributes<HTMLButtonElement>, "onSelect"> & {
27
+ date: string;
28
+ outside?: boolean;
29
+ onSelect?: (date: string) => void;
30
+ } & import("react").RefAttributes<HTMLButtonElement>>;
31
+ Heading: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLHeadingElement> & {
32
+ offset?: number;
33
+ } & import("react").RefAttributes<HTMLHeadingElement>>;
34
+ Weekday: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLSpanElement> & {
35
+ day: number;
36
+ } & import("react").RefAttributes<HTMLSpanElement>>;
37
+ Navigation: typeof Navigation;
38
+ Root: typeof Root;
39
+ };
40
+ export { Continuous } from "./Continuous";