react-photo-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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +220 -0
  3. package/dist/PhotoCalendar.d.ts +98 -0
  4. package/dist/PhotoCalendar.d.ts.map +1 -0
  5. package/dist/components/CalendarBanner.d.ts +17 -0
  6. package/dist/components/CalendarBanner.d.ts.map +1 -0
  7. package/dist/components/PhotoCalendarScrollView.d.ts +24 -0
  8. package/dist/components/PhotoCalendarScrollView.d.ts.map +1 -0
  9. package/dist/context/PhotoCalendarContext.d.ts +9 -0
  10. package/dist/context/PhotoCalendarContext.d.ts.map +1 -0
  11. package/dist/hooks/useCalendarActiveMonthTracking.d.ts +14 -0
  12. package/dist/hooks/useCalendarActiveMonthTracking.d.ts.map +1 -0
  13. package/dist/hooks/useCalendarMonthVisibility.d.ts +18 -0
  14. package/dist/hooks/useCalendarMonthVisibility.d.ts.map +1 -0
  15. package/dist/hooks/useCalendarMonthWindow.d.ts +18 -0
  16. package/dist/hooks/useCalendarMonthWindow.d.ts.map +1 -0
  17. package/dist/hooks/useCalendarWindowExpansionObserver.d.ts +17 -0
  18. package/dist/hooks/useCalendarWindowExpansionObserver.d.ts.map +1 -0
  19. package/dist/hooks/usePhotoCalendarState.d.ts +73 -0
  20. package/dist/hooks/usePhotoCalendarState.d.ts.map +1 -0
  21. package/dist/index.d.ts +11 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/photo-calendar.cjs +22 -0
  24. package/dist/photo-calendar.css +1 -0
  25. package/dist/photo-calendar.mjs +1099 -0
  26. package/dist/primitives/PhotoCalendarDay.d.ts +7 -0
  27. package/dist/primitives/PhotoCalendarDay.d.ts.map +1 -0
  28. package/dist/primitives/PhotoCalendarMonthGrid.d.ts +17 -0
  29. package/dist/primitives/PhotoCalendarMonthGrid.d.ts.map +1 -0
  30. package/dist/primitives/PhotoCalendarNavigation.d.ts +17 -0
  31. package/dist/primitives/PhotoCalendarNavigation.d.ts.map +1 -0
  32. package/dist/primitives/PhotoCalendarRoot.d.ts +7 -0
  33. package/dist/primitives/PhotoCalendarRoot.d.ts.map +1 -0
  34. package/dist/primitives/PhotoCalendarWeekdays.d.ts +15 -0
  35. package/dist/primitives/PhotoCalendarWeekdays.d.ts.map +1 -0
  36. package/dist/types/calendar.d.ts +25 -0
  37. package/dist/types/calendar.d.ts.map +1 -0
  38. package/dist/types/photo.d.ts +15 -0
  39. package/dist/types/photo.d.ts.map +1 -0
  40. package/dist/utils/calendar.d.ts +15 -0
  41. package/dist/utils/calendar.d.ts.map +1 -0
  42. package/dist/utils/photos.d.ts +6 -0
  43. package/dist/utils/photos.d.ts.map +1 -0
  44. package/package.json +89 -0
@@ -0,0 +1,22 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react");var de={exports:{}},ce={};/**
2
+ * @license React
3
+ * react-jsx-runtime.production.js
4
+ *
5
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */var Ae;function st(){if(Ae)return ce;Ae=1;var t=Symbol.for("react.transitional.element"),o=Symbol.for("react.fragment");function l(h,u,f){var m=null;if(f!==void 0&&(m=""+f),u.key!==void 0&&(m=""+u.key),"key"in u){f={};for(var C in u)C!=="key"&&(f[C]=u[C])}else f=u;return u=f.ref,{$$typeof:t,type:h,key:m,ref:u!==void 0?u:null,props:f}}return ce.Fragment=o,ce.jsx=l,ce.jsxs=l,ce}var le={};/**
10
+ * @license React
11
+ * react-jsx-runtime.development.js
12
+ *
13
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
14
+ *
15
+ * This source code is licensed under the MIT license found in the
16
+ * LICENSE file in the root directory of this source tree.
17
+ */var Oe;function ct(){return Oe||(Oe=1,process.env.NODE_ENV!=="production"&&(function(){function t(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===q?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case S:return"Fragment";case Y:return"Profiler";case k:return"StrictMode";case j:return"Suspense";case B:return"SuspenseList";case Z:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case F:return"Portal";case O:return e.displayName||"Context";case I:return(e._context.displayName||"Context")+".Consumer";case U:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case E:return n=e.displayName||null,n!==null?n:t(e.type)||"Memo";case P:n=e._payload,e=e._init;try{return t(e(n))}catch{}}return null}function o(e){return""+e}function l(e){try{o(e);var n=!1}catch{n=!0}if(n){n=console;var s=n.error,i=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return s.call(n,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",i),o(e)}}function h(e){if(e===S)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===P)return"<...>";try{var n=t(e);return n?"<"+n+">":"<...>"}catch{return"<...>"}}function u(){var e=V.A;return e===null?null:e.getOwner()}function f(){return Error("react-stack-top-frame")}function m(e){if(z.call(e,"key")){var n=Object.getOwnPropertyDescriptor(e,"key").get;if(n&&n.isReactWarning)return!1}return e.key!==void 0}function C(e,n){function s(){ae||(ae=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",n))}s.isReactWarning=!0,Object.defineProperty(e,"key",{get:s,configurable:!0})}function M(){var e=t(this.type);return Q[e]||(Q[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function w(e,n,s,i,T,d){var g=s.ref;return e={$$typeof:R,type:e,key:n,props:s,_owner:i},(g!==void 0?g:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:M}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:T}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:d}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function p(e,n,s,i,T,d){var g=n.children;if(g!==void 0)if(i)if(se(g)){for(i=0;i<g.length;i++)v(g[i]);Object.freeze&&Object.freeze(g)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else v(g);if(z.call(n,"key")){g=t(e);var D=Object.keys(n).filter(function(K){return K!=="key"});i=0<D.length?"{key: someKey, "+D.join(": ..., ")+": ...}":"{key: someKey}",ne[g+i]||(D=0<D.length?"{"+D.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
18
+ let props = %s;
19
+ <%s {...props} />
20
+ React keys must be passed directly to JSX without using spread:
21
+ let props = %s;
22
+ <%s key={someKey} {...props} />`,i,g,D,g),ne[g+i]=!0)}if(g=null,s!==void 0&&(l(s),g=""+s),m(n)&&(l(n.key),g=""+n.key),"key"in n){s={};for(var _ in n)_!=="key"&&(s[_]=n[_])}else s=n;return g&&C(s,typeof e=="function"?e.displayName||e.name||"Unknown":e),w(e,g,s,u(),T,d)}function v(e){x(e)?e._store&&(e._store.validated=1):typeof e=="object"&&e!==null&&e.$$typeof===P&&(e._payload.status==="fulfilled"?x(e._payload.value)&&e._payload.value._store&&(e._payload.value._store.validated=1):e._store&&(e._store.validated=1))}function x(e){return typeof e=="object"&&e!==null&&e.$$typeof===R}var N=a,R=Symbol.for("react.transitional.element"),F=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),k=Symbol.for("react.strict_mode"),Y=Symbol.for("react.profiler"),I=Symbol.for("react.consumer"),O=Symbol.for("react.context"),U=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),B=Symbol.for("react.suspense_list"),E=Symbol.for("react.memo"),P=Symbol.for("react.lazy"),Z=Symbol.for("react.activity"),q=Symbol.for("react.client.reference"),V=N.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,z=Object.prototype.hasOwnProperty,se=Array.isArray,H=console.createTask?console.createTask:function(){return null};N={react_stack_bottom_frame:function(e){return e()}};var ae,Q={},ee=N.react_stack_bottom_frame.bind(N,f)(),te=H(h(f)),ne={};le.Fragment=S,le.jsx=function(e,n,s){var i=1e4>V.recentlyCreatedOwnerStacks++;return p(e,n,s,!1,i?Error("react-stack-top-frame"):ee,i?H(h(e)):te)},le.jsxs=function(e,n,s){var i=1e4>V.recentlyCreatedOwnerStacks++;return p(e,n,s,!0,i?Error("react-stack-top-frame"):ee,i?H(h(e)):te)}})()),le}var Ue;function lt(){return Ue||(Ue=1,process.env.NODE_ENV==="production"?de.exports=st():de.exports=ct()),de.exports}var r=lt();const Ie=a.createContext(null);function $e({value:t,children:o}){return r.jsx(Ie.Provider,{value:t,children:o})}function J(t="usePhotoCalendarContext"){const o=a.useContext(Ie);if(!o)throw new Error(`${t} must be used within a <PhotoCalendarRoot> or <PhotoCalendarContextProvider>.`);return o}function G(t){if(!t){const f=new Date;return new Date(Date.UTC(f.getUTCFullYear(),f.getUTCMonth(),1))}const[o="",l=""]=t.split("-"),h=Number(o),u=Number(l)-1;if(Number.isNaN(h)||Number.isNaN(u)||u<0||u>11){const f=new Date;return new Date(Date.UTC(f.getUTCFullYear(),f.getUTCMonth(),1))}return new Date(Date.UTC(h,u,1))}function it(t){return t.toISOString().slice(0,10)}function ut(t,o){const l=t.getUTCFullYear(),h=t.getUTCMonth(),m=(new Date(Date.UTC(l,h,1)).getUTCDay()-o+7)%7,C=new Date(Date.UTC(l,h+1,0)).getUTCDate(),M=Math.ceil((m+C)/7)*7,w=new Date(Date.UTC(l,h,1-m)),p=[];for(let v=0;v<M;v+=1){const x=new Date(Date.UTC(w.getUTCFullYear(),w.getUTCMonth(),w.getUTCDate()+v));p.push({date:x,isoDate:it(x),day:x.getUTCDate(),inCurrentMonth:x.getUTCMonth()===h})}return p}function re(t){const o=`${t.getUTCMonth()+1}`.padStart(2,"0");return`${t.getUTCFullYear()}-${o}`}function Fe(t,o){return new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+o,1))}function dt(t){if(t.length===0)return null;const o=t[0].date,l=t[t.length-1].date;return{start:new Date(o.getTime()),end:new Date(l.getTime())}}function ht(t){return!t||t.length===0?{}:t.reduce((o,l)=>{if(l.photos.length>0){const h=l.datetime.slice(0,10),u=o[h]??[];o[h]=u.concat(l.photos)}return o},{})}function Le({monthKey:t,defaultMonthKey:o,onMonthChange:l,onDaySelect:h,firstDayOfWeek:u=0,entries:f,maxThumbnailsPerDay:m=1,minMonthKey:C,maxMonthKey:M,onRangeChange:w,onVisibleMonthChange:p,locale:v,timeZone:x}={}){const N=t!==void 0,[R,F]=a.useState(()=>re(G(o))),S=N?t:R,k=a.useMemo(()=>G(S),[S]),Y=a.useMemo(()=>C?G(C):void 0,[C]),I=a.useMemo(()=>M?G(M):void 0,[M]),O=k.getUTCFullYear(),U=k.getUTCMonth(),j=v??void 0,B=x??"UTC",E=a.useMemo(()=>({timeZone:B}),[B]),P=a.useMemo(()=>new Intl.DateTimeFormat(j,{month:"long",year:"numeric",...E}),[j,E]),Z=a.useMemo(()=>new Intl.DateTimeFormat(j,{day:"numeric",month:"long",year:"numeric",...E}),[j,E]),q=a.useMemo(()=>new Intl.DateTimeFormat(j,{weekday:"short",...E}),[j,E]),V=a.useMemo(()=>new Intl.DateTimeFormat(j,{weekday:"long",...E}),[j,E]),z=a.useMemo(()=>new Intl.DateTimeFormat(j,{month:"short",...E}),[j,E]),se=a.useMemo(()=>Array.from({length:12},(c,b)=>z.format(new Date(Date.UTC(2021,b,1)))),[z]),H=a.useMemo(()=>ht(f),[f]),ae=a.useMemo(()=>{const c=Array.from({length:7},($,me)=>new Date(Date.UTC(2021,7,me+1))),b=c.map($=>q.format($)),y=c.map($=>V.format($)),X=$=>$.slice(u).concat($.slice(0,u));return{short:X(b),long:X(y)}},[u,q,V]),Q=Math.max(1,m),ee=a.useMemo(()=>new Date().toISOString().slice(0,10),[]),te=a.useCallback(c=>{h==null||h({isoDate:c.isoDate,date:c.date})},[h]),ne=a.useCallback(c=>{const b=dt(c);return b?{start:b.start,end:b.end,startIso:b.start.toISOString().slice(0,10),endIso:b.end.toISOString().slice(0,10)}:null},[]),e=a.useCallback(c=>{const b=ut(c,u),y=ne(b),X=re(c),$=P.format(c),me=b.map(W=>{const ue=H[W.isoDate]??[],ke=ue.slice(0,Q),nt=Math.max(0,ue.length-ke.length),at=W.isoDate===ee,_e=W.inCurrentMonth,rt={date:W.date,isoDate:W.isoDate,day:W.day,isCurrentMonth:W.inCurrentMonth,isToday:at,photos:ue,visibleThumbnails:ke,overflow:nt,selectDay:()=>{_e&&te(W)}},be=ue.length,ot=be===0?"No photos":`${be} ${be===1?"photo":"photos"}`;return{cell:W,context:rt,ariaLabel:`${Z.format(W.date)}. ${ot}`,isSelectable:_e}});return{monthKey:X,monthDate:new Date(c.getTime()),monthLabel:$,visibleRange:y,dayStates:me}},[ne,Z,u,te,Q,P,H,ee]),n=a.useMemo(()=>e(k),[e,k]),{monthLabel:s,visibleRange:i,dayStates:T}=n;a.useEffect(()=>{!w||!i||w(i)},[w,i]),a.useEffect(()=>{p&&p(S)},[S,p]);const d=a.useCallback(c=>c.getUTCFullYear()*12+c.getUTCMonth(),[]),g=a.useMemo(()=>Y?d(Y):null,[Y,d]),D=a.useMemo(()=>I?d(I):null,[I,d]),_=a.useMemo(()=>d(k),[k,d]),K=a.useCallback(c=>{const b=d(c);return!(g!==null&&b<g||D!==null&&b>D)},[D,g,d]),A=a.useCallback(c=>Y&&d(c)<g?Y:I&&d(c)>D?I:c,[I,D,Y,g,d]),L=a.useCallback(c=>{const b=re(c);b!==S&&(l==null||l(b),N||F(b))},[S,N,l]),pe=a.useCallback(c=>{const b=new Date(Date.UTC(O,c,1));if(!K(b)){const y=A(b);if(d(y)===_)return;L(y);return}L(b)},[A,L,_,O,K,d]),Te=a.useCallback(c=>{const b=Fe(k,c),y=A(b);d(y)!==_&&L(y)},[A,L,_,k,d]),Ne=a.useCallback(c=>{const b=new Date(Date.UTC(O+c,U,1)),y=A(b);d(y)!==_&&L(y)},[A,L,U,_,O,d]),ye=a.useCallback(()=>{const c=new Date,b=new Date(Date.UTC(c.getUTCFullYear(),c.getUTCMonth(),1)),y=A(b);d(y)!==_&&L(y)},[A,L,_,d]),ie=a.useCallback(c=>re(A(G(c))),[A]),Pe=a.useCallback(c=>{const b=G(c),y=A(b);return e(y)},[e,A]),Me=a.useCallback((c,b)=>{if(b===0)return ie(c);const y=G(c),X=Fe(y,b);if(!K(X)){const $=A(X);return d($)===d(y)?null:re($)}return re(X)},[ie,A,K,d]),je=a.useCallback(c=>K(G(c)),[K]),we=a.useCallback(c=>{const b=G(c),y=A(b);L(y)},[A,L]),Re=a.useCallback(c=>{const b=new Date(Date.UTC(O,c,1));return!K(b)},[O,K]),Ee=a.useMemo(()=>{const c=new Date,b=new Date(Date.UTC(c.getUTCFullYear(),c.getUTCMonth(),1)),y=A(b);return d(y)===_},[A,_,d]),he=a.useMemo(()=>g===null||_>g,[_,g]),fe=a.useMemo(()=>D===null||_<D,[_,D]),De=he,Se=fe,et=a.useMemo(()=>({canNavigatePrevMonth:he,canNavigateNextMonth:fe,canNavigatePrevYear:De,canNavigateNextYear:Se,isTodayDisabled:Ee,navigateMonth:Te,navigateYear:Ne,navigateToMonth:pe,goToToday:ye,isMonthDisabled:Re}),[he,fe,De,Se,ye,Re,Ee,Te,pe,Ne]),tt=a.useMemo(()=>({getMonthSnapshot:Pe,getAdjacentMonthKey:Me,clampMonthKey:ie,isMonthWithinBounds:je,syncVisibleMonth:we}),[ie,Me,Pe,je,we]);return{currentYear:O,currentMonth:U,monthDate:k,monthKey:S,monthLabel:s,monthNames:se,weekdayLabels:ae,visibleRange:i,dayStates:T,navigation:et,scroll:tt,isControlled:N}}function ve({children:t,...o}){const l=Le(o),h=typeof t=="function"?t(l):t;return r.jsx($e,{value:l,children:h})}function Be({children:t}){return r.jsx("div",{className:"calendar-banner",children:t})}function Ve(){const{currentYear:t}=J("PhotoCalendarNavigationYearHeading");return r.jsx("div",{className:"calendar-year-row",children:r.jsx("strong",{className:"calendar-year",children:t})})}function Ke({children:t}){return r.jsx("div",{className:"month-chips-row",children:t})}const oe=t=>{const{navigation:o}=J(t);return o};function We(){const t=oe("PhotoCalendarNavigationPrevYearButton");return r.jsxs("button",{type:"button",className:"nav-button nav-button--prev nav-button--year","aria-label":"Previous year",onClick:()=>t.navigateYear(-1),disabled:!t.canNavigatePrevYear,children:[r.jsx("span",{"aria-hidden":"true",className:"nav-button-icon",children:"‹"}),r.jsx("span",{className:"nav-button-label",children:"Previous year"})]})}function qe(){const t=oe("PhotoCalendarNavigationNextYearButton");return r.jsxs("button",{type:"button",className:"nav-button nav-button--next nav-button--year","aria-label":"Next year",onClick:()=>t.navigateYear(1),disabled:!t.canNavigateNextYear,children:[r.jsx("span",{"aria-hidden":"true",className:"nav-button-icon",children:"›"}),r.jsx("span",{className:"nav-button-label",children:"Next year"})]})}function Ge(){const t=oe("PhotoCalendarNavigationPrevMonthButton");return r.jsxs("button",{type:"button",className:"nav-button nav-button--prev nav-button--month","aria-label":"Previous month",onClick:()=>t.navigateMonth(-1),disabled:!t.canNavigatePrevMonth,children:[r.jsx("span",{"aria-hidden":"true",className:"nav-button-icon",children:"‹"}),r.jsx("span",{className:"nav-button-label",children:"Previous month"})]})}function Je(){const t=oe("PhotoCalendarNavigationNextMonthButton");return r.jsxs("button",{type:"button",className:"nav-button nav-button--next nav-button--month","aria-label":"Next month",onClick:()=>t.navigateMonth(1),disabled:!t.canNavigateNextMonth,children:[r.jsx("span",{"aria-hidden":"true",className:"nav-button-icon",children:"›"}),r.jsx("span",{className:"nav-button-label",children:"Next month"})]})}function ze(){const{currentYear:t,currentMonth:o,monthNames:l}=J("PhotoCalendarNavigationMonthChips"),h=oe("PhotoCalendarNavigationMonthChips");return r.jsx("div",{className:"month-chips",children:l.map((u,f)=>r.jsx("button",{type:"button",className:`month-chip ${f===o?"month-chip--active":""}`,"aria-label":`Go to ${u} ${t}`,"aria-current":f===o?"date":void 0,onClick:()=>h.navigateToMonth(f),disabled:h.isMonthDisabled(f),children:u},u))})}function He(){const{monthLabel:t}=J("PhotoCalendarNavigationMonthLabelMobile");return r.jsx("div",{className:"month-label-mobile",children:r.jsx("strong",{children:t})})}function Xe(){const t=oe("PhotoCalendarNavigationTodayButton");return r.jsx("button",{type:"button",className:"today-button-icon","aria-label":"Go to current month",onClick:t.goToToday,disabled:t.isTodayDisabled,children:r.jsx("span",{"aria-hidden":"true",children:"📅"})})}function ft(){return r.jsxs(Be,{children:[r.jsx(Ve,{}),r.jsxs(Ke,{children:[r.jsx(We,{}),r.jsx(Ge,{}),r.jsx(ze,{}),r.jsx(He,{}),r.jsx(qe,{}),r.jsx(Je,{}),r.jsx(Xe,{})]})]})}function Ze({children:t}){const{currentYear:o,currentMonth:l,monthLabel:h,monthNames:u,navigation:f}=J("PhotoCalendarNavigation"),m={...f,currentYear:o,currentMonth:l,monthLabel:h,monthNames:u};return t?r.jsx(r.Fragment,{children:t(m)}):r.jsx(ft,{})}function ge({className:t="calendar-weekdays",children:o}){const{weekdayLabels:l}=J("PhotoCalendarWeekdays"),h={shortLabels:l.short,longLabels:l.long};return o?r.jsx(r.Fragment,{children:o(h)}):r.jsx("div",{className:t,role:"row",children:l.short.map((u,f)=>r.jsx("span",{className:"calendar-weekday",role:"columnheader","aria-label":l.long[f],children:u},`${u}-${f}`))})}function Ce({day:t,className:o}){const{defaultContent:l,ariaLabel:h,isSelectable:u,isCurrentMonth:f,isToday:m,visibleThumbnails:C,selectDay:M}=t,w=["calendar-cell",f?"":"calendar-cell--placeholder",m?"calendar-cell--today":"",C.length>0?"calendar-cell--has-photo":"",o??""].filter(Boolean).join(" ");return r.jsx("button",{type:"button",className:w,role:"gridcell","aria-label":h,"aria-disabled":!u,disabled:!u,onClick:M,children:l})}function xe({className:t="calendar-grid",renderDay:o,dayStates:l}){const{dayStates:h}=J("PhotoCalendarMonthGrid"),u=l??h;return r.jsx("div",{className:t,children:u.map((f,m)=>{const{cell:C,context:M,ariaLabel:w,isSelectable:p}=f,{visibleThumbnails:v,overflow:x}=M,N=r.jsxs(r.Fragment,{children:[v.length>0&&r.jsxs("div",{className:"calendar-cell-thumbnails","data-count":v.length,children:[v.map((F,S)=>r.jsx("img",{src:F,alt:"",loading:"lazy",decoding:"async",className:"calendar-cell-image"},`${C.isoDate}-${S}`)),x>0&&r.jsxs("span",{className:"calendar-cell-overflow",children:["+",x]})]}),r.jsx("span",{className:"cell-label",children:C.day})]}),R={...M,defaultContent:N,ariaLabel:w,isSelectable:p};return o?r.jsx(a.Fragment,{children:o(R)},`calendar-cell-${m}`):r.jsx(Ce,{day:R},`calendar-cell-${m}`)})})}function mt({containerRef:t,monthRefs:o,monthKeys:l,threshold:h=.01,rootMargin:u}){const[f,m]=a.useState(new Set),C=a.useRef(null),M=p=>m(v=>v.has(p)?v:new Set([...v,p])),w=p=>m(v=>{if(!v.has(p))return v;const x=new Set(v);return x.delete(p),x});return a.useEffect(()=>{const p=t.current;if(!p||typeof IntersectionObserver>"u")return;const v=new IntersectionObserver(x=>{x.forEach(N=>{const F=N.target.getAttribute("data-month-key");F&&(N.isIntersecting?M(F):w(F))})},{root:p,threshold:h,rootMargin:u});return C.current=v,l.forEach(x=>{const N=o.current.get(x);N&&v.observe(N)}),()=>{v.disconnect(),C.current=null}},[t,o,l,h,u]),a.useEffect(()=>{const p=C.current;p&&l.forEach(v=>{const x=o.current.get(v);x&&p.observe(x)})},[o,l]),a.useMemo(()=>f,[f])}const bt=7;function Ye(t,o){return o?`${t} ${o}`:t}function Qe({renderDay:t,renderWeekdays:o,children:l,maxRenderedMonths:h=bt,className:u,...f}){const{monthKey:m,scroll:C}=J("PhotoCalendarScrollView"),M=a.useRef(null),w=a.useRef(null),p=a.useRef(null),v=a.useRef(new Map),x=Math.max(1,h),N=a.useCallback((e,n)=>{const s=[e];let i=e,T=e;for(;s.length<n;){const d=C.getAdjacentMonthKey(i,-1),g=C.getAdjacentMonthKey(T,1);if(d&&!s.includes(d)&&(s.unshift(d),i=d),s.length>=n||(g&&!s.includes(g)&&(s.push(g),T=g),!d&&!g))break}return s},[C]),[R,F]=a.useState(()=>N(m,Math.min(3,x)));a.useEffect(()=>{v.current.forEach((e,n)=>{R.includes(n)||v.current.delete(n)})},[R]);const S=a.useCallback(e=>n=>{if(!n){v.current.delete(e);return}v.current.set(e,n)},[]),k=a.useCallback(e=>{F(n=>{if(n.length===0)return n;const s=e==="prev"?n[0]:n[n.length-1],i=e==="prev"?-1:1,T=C.getAdjacentMonthKey(s,i);if(!T||n.includes(T))return n;const d=e==="prev"?[T,...n]:[...n,T];return d.length<=x?d:e==="prev"?d.slice(0,x):d.slice(d.length-x)})},[x,C]),Y=a.useCallback(e=>{F(n=>n.includes(e)?n:N(e,x))},[N,x]),[I,O]=a.useState(m),U=a.useRef(I),j=a.useRef(!1),B=a.useRef(!1),E=a.useRef(null),P=a.useRef(null),Z=a.useRef(new Map),q=a.useCallback((e,n="smooth")=>{const s=v.current.get(e),i=M.current;if(!(!s||!i))if(typeof s.scrollIntoView=="function")s.scrollIntoView({block:"start",behavior:n});else{const T=s.offsetTop-i.offsetTop;i.scrollTop=T}},[]);a.useEffect(()=>{if(Y(m),B.current)return;const e=requestAnimationFrame(()=>{B.current=!0,U.current!==m&&(U.current=m,O(m)),j.current=!0,q(m,"auto"),requestAnimationFrame(()=>{j.current=!1})});return()=>cancelAnimationFrame(e)},[Y,m,q]),a.useEffect(()=>{if(E.current===m){E.current=null;return}U.current!==m&&(U.current=m,O(m)),B.current&&(Y(m),j.current=!0,q(m),requestAnimationFrame(()=>{j.current=!1}))},[Y,m,q]);const V=mt({containerRef:M,monthRefs:v,monthKeys:R,threshold:.01});a.useEffect(()=>{V.forEach(e=>{const n=v.current.get(e);if(!n)return;const s=n.getBoundingClientRect();s.height>0&&Z.current.set(e,s.height)})},[V,v]),a.useEffect(()=>{const e=M.current,n=w.current,s=p.current;if(!e||!n||!s||typeof IntersectionObserver>"u")return;let i=null,T=null;return i=requestAnimationFrame(()=>{T=new IntersectionObserver(g=>{g.forEach(D=>{if(D.isIntersecting)if(D.target===n){if(e.scrollTop===0)return;k("prev")}else D.target===s&&k("next")})},{root:e,threshold:.1}),T.observe(n),T.observe(s)}),()=>{i&&cancelAnimationFrame(i),T==null||T.disconnect()}},[k]),a.useEffect(()=>{const e=M.current;if(!e)return;const n=()=>{j.current||(P.current!==null&&cancelAnimationFrame(P.current),P.current=requestAnimationFrame(()=>{P.current=null;const s=e.getBoundingClientRect().top;let i=R[0]??U.current;for(const T of R){const d=v.current.get(T);if(!d)continue;if(d.getBoundingClientRect().top-s<=2)i=T;else break}i!==U.current&&(U.current=i,O(i),i!==m&&(E.current=i,C.syncVisibleMonth(i)))}))};return e.addEventListener("scroll",n,{passive:!0}),n(),()=>{e.removeEventListener("scroll",n),P.current!==null&&cancelAnimationFrame(P.current)}},[R,m,C]);const z=a.useMemo(()=>R.map(e=>C.getMonthSnapshot(e)),[R,C]),se=z.find(e=>e.monthKey===I)??C.getMonthSnapshot(I),{role:H,["aria-label"]:ae,...Q}=f,ee=H??"grid",te=ae??`Photo calendar timeline – currently viewing ${se.monthLabel}`,ne=Ye("calendar-scroll-container",u);return r.jsx("div",{className:"calendar-scroll-view",children:r.jsxs("div",{...Q,role:ee,"aria-label":te,className:ne,ref:M,children:[r.jsx("div",{ref:w,"aria-hidden":"true",className:"calendar-scroll-sentinel"}),z.map(e=>{const n=e.monthKey===I,s=`calendar-month-${e.monthKey}`,i=V.has(e.monthKey);return r.jsxs("section",{className:"calendar-month-section","data-month-key":e.monthKey,"aria-labelledby":`${s}-header`,ref:S(e.monthKey),children:[r.jsx("div",{id:`${s}-header`,className:Ye("calendar-month-header",n?"calendar-month-header--active":void 0),"aria-current":n?"date":void 0,children:r.jsx("strong",{children:e.monthLabel})}),i?r.jsxs(r.Fragment,{children:[r.jsx(ge,{children:o}),r.jsx(xe,{renderDay:t,dayStates:e.dayStates})]}):r.jsx("div",{"aria-hidden":"true",style:{height:Z.current.get(e.monthKey)??480}})]},e.monthKey)}),r.jsx("div",{ref:p,"aria-hidden":"true",className:"calendar-scroll-sentinel"}),l]})})}function vt({monthKey:t,defaultMonthKey:o,onMonthChange:l,onDaySelect:h,firstDayOfWeek:u=0,entries:f,maxThumbnailsPerDay:m=1,minMonthKey:C,maxMonthKey:M,onRangeChange:w,onVisibleMonthChange:p,locale:v,timeZone:x,renderDayContent:N,renderDay:R,renderNavigation:F,renderWeekdays:S,children:k,navigationMode:Y="controls",scrollMaxRenderedMonths:I,...O}){const U={monthKey:t,defaultMonthKey:o,onMonthChange:l,onDaySelect:h,firstDayOfWeek:u,entries:f,maxThumbnailsPerDay:m,minMonthKey:C,maxMonthKey:M,onRangeChange:w,onVisibleMonthChange:p,locale:v,timeZone:x},j=R||(N?P=>r.jsx(Ce,{day:{...P,defaultContent:N(P)??P.defaultContent}}):void 0),B=F?P=>F(P):void 0,E=S?P=>S(P):void 0;return Y==="scroll"?r.jsx(ve,{...U,children:()=>r.jsx(Qe,{...O,renderDay:j,renderWeekdays:E,maxRenderedMonths:I,children:k})}):r.jsx(ve,{...U,children:P=>r.jsxs("div",{role:"grid","aria-label":`Photo calendar for ${P.monthLabel}`,"data-view":"calendar",...O,children:[r.jsx(Ze,{children:B}),r.jsx(ge,{children:E}),r.jsx(xe,{renderDay:j}),k]})})}exports.PhotoCalendar=vt;exports.PhotoCalendarContextProvider=$e;exports.PhotoCalendarDay=Ce;exports.PhotoCalendarMonthGrid=xe;exports.PhotoCalendarNavigation=Ze;exports.PhotoCalendarNavigationControls=Ke;exports.PhotoCalendarNavigationLayout=Be;exports.PhotoCalendarNavigationMonthChips=ze;exports.PhotoCalendarNavigationMonthLabelMobile=He;exports.PhotoCalendarNavigationNextMonthButton=Je;exports.PhotoCalendarNavigationNextYearButton=qe;exports.PhotoCalendarNavigationPrevMonthButton=Ge;exports.PhotoCalendarNavigationPrevYearButton=We;exports.PhotoCalendarNavigationTodayButton=Xe;exports.PhotoCalendarNavigationYearHeading=Ve;exports.PhotoCalendarRoot=ve;exports.PhotoCalendarScrollView=Qe;exports.PhotoCalendarWeekdays=ge;exports.usePhotoCalendarContext=J;exports.usePhotoCalendarState=Le;
@@ -0,0 +1 @@
1
+ :root{--calendar-color-surface: #ffffff;--calendar-color-surface-muted: #f4f4f5;--calendar-color-text: #111827;--calendar-color-text-muted: rgba(17, 24, 39, .6);--calendar-color-accent: #007bff;--calendar-color-accent-soft: rgba(0, 123, 255, .15);--calendar-color-chip-bg: rgba(0, 0, 0, .08);--calendar-color-chip-active-bg: rgba(0, 123, 255, .12);--calendar-color-chip-active-text: #0051a8;--calendar-color-day-label-bg: rgba(0, 0, 0, .4);--calendar-color-overflow-bg: rgba(0, 0, 0, .7);--calendar-radius-day: 8px;--calendar-radius-chip: 16px;--calendar-radius-button: 6px;--calendar-shadow-today: 0 0 0 2px var(--calendar-color-accent-soft);--calendar-spacing-gap: .1rem;--calendar-font-size-weekday: .75rem;--calendar-font-size-day: .85rem}.calendar-banner{display:flex;flex-direction:column;align-items:center;gap:1rem;padding:1.5rem 1rem}.calendar-scroll-view{display:flex;flex-direction:column;height:100%;position:relative}.calendar-scroll-container{display:flex;flex-direction:column;gap:1.5rem;overflow-y:auto;padding:0 1rem 2rem;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;background:var(--calendar-color-surface)}.calendar-scroll-sentinel{width:100%;height:1px}.calendar-month-section{display:flex;flex-direction:column;gap:.75rem}.calendar-month-header{position:sticky;top:0;z-index:10;padding:.75rem 1rem;margin:0 -1rem;background:var(--calendar-color-day-label-bg);color:#fff;font-size:1.1rem;box-shadow:0 2px 6px #0003}.calendar-month-header--active{background:var(--calendar-color-accent);color:#fff}.calendar-year-row{display:none;align-items:center;gap:1rem}.calendar-year{font-size:1.5rem;margin:0;color:var(--calendar-color-text)}.today-button-icon:disabled{opacity:.5;cursor:not-allowed}.today-button-icon{display:flex;align-items:center;justify-content:center;font-size:1.5rem;padding:.5rem;border-radius:var(--calendar-radius-button);transition:background .2s;background:var(--calendar-color-surface-muted)}.month-chips-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;width:100%}.month-chips{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:center;flex:1}.month-label-mobile{display:flex;justify-content:center;align-items:center;flex:1;font-size:1.25rem;text-align:center;color:var(--calendar-color-text)}.month-chip{padding:.4rem .75rem;font-size:.875rem;border-radius:var(--calendar-radius-chip);font-weight:500;transition:all .2s;white-space:nowrap;background:var(--calendar-color-chip-bg);color:var(--calendar-color-text)}.month-chip:focus-visible{outline:2px solid var(--calendar-color-accent);outline-offset:2px}.month-chip[disabled]{opacity:.4;cursor:not-allowed}.nav-button{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;flex-shrink:0;font-size:.8rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;border-radius:var(--calendar-radius-button);background:var(--calendar-color-surface-muted)}.nav-button-icon{font-size:1.5rem;line-height:1}.nav-button-label{line-height:1.1}.nav-button:focus-visible{outline:2px solid currentColor;outline-offset:2px;color:var(--calendar-color-accent)}.nav-button:disabled{opacity:.4;cursor:not-allowed}.nav-button--month{display:flex}.nav-button--year,.month-chips{display:none}@media(min-width:875px){.calendar-year-row{display:flex}.month-label-mobile{display:none}.month-chips-row{justify-content:center}.nav-button--month{display:none}.nav-button--year,.month-chips{display:flex}}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:var(--calendar-spacing-gap);margin-bottom:.4rem}.calendar-weekday{text-transform:uppercase;font-size:var(--calendar-font-size-weekday);letter-spacing:.1em;text-align:center;padding:.25rem 0;color:var(--calendar-color-text-muted)}.calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:var(--calendar-spacing-gap)}.calendar-cell{aspect-ratio:1 / 1;border-radius:var(--calendar-radius-day);display:flex;justify-content:center;align-items:center;font-size:var(--calendar-font-size-day);text-transform:uppercase;letter-spacing:.04em;position:relative;overflow:hidden;padding:0;border:1px solid transparent}.cell-label{pointer-events:none;position:absolute;top:.5rem;right:.5rem;z-index:2;padding:.2rem .45rem;border-radius:4px;font-weight:600;font-size:1rem;background:var(--calendar-color-day-label-bg);color:#fff}@media(max-width:600px){.cell-label{top:.25rem;right:.25rem;padding:.1rem .225rem;border-radius:2px;font-size:.5rem}}.calendar-cell-thumbnails{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(50%,1fr));grid-auto-rows:1fr;z-index:1;gap:1px}.calendar-cell-thumbnails[data-count="1"]{grid-template-columns:1fr}.calendar-cell-image{width:100%;height:100%;object-fit:cover;object-position:center;border-radius:var(--calendar-radius-day)}.calendar-cell-overflow{position:absolute;bottom:.5rem;right:.5rem;z-index:2;padding:.25rem .45rem;border-radius:999px;font-weight:600;color:#fff;background:var(--calendar-color-overflow-bg)}.calendar-cell--placeholder{opacity:.45}.calendar-cell--today{border-color:var(--calendar-color-accent);box-shadow:var(--calendar-shadow-today)}