@flux-ui/internals 3.0.0-next.61 → 3.0.0-next.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/composable/index.d.ts +1 -1
- package/dist/composable/index.js +1 -1
- package/dist/{composable-Cp0PgZry.js → composable-DaZozn_3.js} +2 -2
- package/dist/composable-DaZozn_3.js.map +1 -0
- package/dist/{index-4qwf2pQQ.d.ts → index-7w0u9Q_D.d.ts} +3 -1
- package/dist/{index-4qwf2pQQ.d.ts.map → index-7w0u9Q_D.d.ts.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
- package/src/composable/useScrollEdges.ts +10 -2
- package/dist/composable-Cp0PgZry.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as export_default$5, c as export_default$11, d as defaultAnnounce, f as useKeyboardGrab, g as export_default, h as export_default$1, i as export_default$6, l as export_default$10, m as export_default$2, n as export_default$8, o as export_default$13, p as export_default$3, r as export_default$7, s as export_default$12, t as export_default$9, u as export_default$4 } from "../index-
|
|
1
|
+
import { a as export_default$5, c as export_default$11, d as defaultAnnounce, f as useKeyboardGrab, g as export_default, h as export_default$1, i as export_default$6, l as export_default$10, m as export_default$2, n as export_default$8, o as export_default$13, p as export_default$3, r as export_default$7, s as export_default$12, t as export_default$9, u as export_default$4 } from "../index-7w0u9Q_D.js";
|
|
2
2
|
export { defaultAnnounce as defaultKeyboardGrabAnnounce, export_default as useCalendar, export_default$1 as useCalendarMonthSwitcher, export_default$2 as useCalendarTimeGrid, export_default$3 as useCalendarYearSwitcher, export_default$4 as useEventListener, export_default$5 as useFocusTrap, export_default$6 as useFocusTrapLock, export_default$7 as useFocusTrapReturn, export_default$8 as useFocusTrapSubscription, export_default$9 as useFocusZone, export_default$10 as useInView, useKeyboardGrab, export_default$11 as useRemembered, export_default$12 as useScrollEdges, export_default$13 as useScrollPosition };
|
package/dist/composable/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"../composable-
|
|
1
|
+
import{a as e,c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"../composable-DaZozn_3.js";export{n as defaultKeyboardGrabAnnounce,i as useCalendar,a as useCalendarMonthSwitcher,c as useCalendarTimeGrid,d as useCalendarYearSwitcher,h as useEventListener,f as useFocusTrap,e as useFocusTrapLock,o as useFocusTrapReturn,l as useFocusTrapSubscription,m as useFocusZone,s as useInView,r as useKeyboardGrab,t as useRemembered,p as useScrollEdges,u as useScrollPosition};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,d as t,f as n,n as r,r as i,s as a,t as o}from"./util-CwaOsSvo.js";import{computed as s,onMounted as c,onUnmounted as l,ref as u,toValue as d,unref as f,watch as p}from"vue";import{DateTime as m}from"luxon";import{unwrapElement as h,useMutationObserver as g}from"@basmilius/common";function _(e,t){let n=u(!1),r=u(e),i=s(()=>{let e=[],t=f(r).month,n=f(r).startOf(`month`);do e.push(n),n=n.plus({day:1});while(n.month===t);let i=e[0],a=e[e.length-1];for(let t=1;t<i.weekday;++t)e.unshift(i.minus({day:t}));for(let t=a.weekday+1;t<=7;++t)e.push(a.plus({day:t-a.weekday}));for(;e.length/7<6;){let t=e[e.length-1];for(let n=1;n<=7;++n)e.push(t.plus({day:n}))}return e}),a=s(()=>f(i).slice(0,7).map(e=>e.toLocaleString({weekday:t?.weekDayLength??`short`}))),o=s(()=>f(r).plus({month:1})),c=s(()=>f(r).minus({month:1})),l=s(()=>f(r).toLocaleString({month:t?.monthLength??`long`})),d=s(()=>f(r).year.toString());function p(e){n.value=r.value>e,r.value=e}function m(){p(f(r).plus({month:1}))}function h(){p(f(r).minus({month:1}))}return{isTransitioningToPast:n,viewDate:r,viewDateNext:o,viewDatePrevious:c,viewMonth:l,viewYear:d,dates:i,days:a,setViewDate:p,nextMonth:m,previousMonth:h}}function v(e,t){return{months:s(()=>{let n=[],r=f(e),i=r.startOf(`year`);for(;i.month<=12&&i.year===r.year;)n.push({date:i,label:i.toLocaleString({month:t})}),i=i.plus({months:1});return n})}}function y(e,t){return t===7?e.startOf(`week`):e.startOf(`day`)}function b(e){return e===7?{week:1}:e===2?{day:2}:{day:1}}function x(e,t){let n=u(!1),r=u(y(e,d(t)));p(()=>d(t),e=>{r.value=y(f(r),e)});let i=s(()=>{let e=f(r),n=d(t),i=[];for(let t=0;t<n;++t)i.push(e.plus({day:t}));return i}),a=s(()=>{let e=f(i),n=e[0],r=e[e.length-1];if(d(t)===1)return n.toLocaleString({weekday:`long`,day:`numeric`,month:`long`,year:`numeric`});let a=n.month===r.month,o=n.year===r.year;return`${n.toLocaleString(a&&o?{weekday:`short`,day:`numeric`}:{weekday:`short`,day:`numeric`,month:`short`})} – ${r.toLocaleString({weekday:`short`,day:`numeric`,month:`short`,year:o?void 0:`numeric`})}`});function o(e){let i=y(e,d(t));n.value=f(r)>i,r.value=i}function c(){o(f(r).plus(b(d(t))))}function l(){o(f(r).minus(b(d(t))))}return{isTransitioningToPast:n,viewDate:r,viewDates:i,rangeLabel:a,setViewDate:o,next:c,previous:l}}function S(e,t=10){let n=u(0),r=s(()=>{let r=f(e).year,i=[],a=r-r%t+f(n)*t;for(let e=0;e<t;++e)i.push(a+e);return i});function i(){++n.value}function a(){--n.value}return p(e,()=>n.value=0),{years:r,next:i,previous:a}}let C=null;function w(){if(C)return C;if(typeof document>`u`)return null;let e=document.createElement(`div`);return e.setAttribute(`role`,`status`),e.setAttribute(`aria-live`,`polite`),e.setAttribute(`aria-atomic`,`true`),e.style.cssText=`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,document.body.appendChild(e),C=e,e}function T(e){let t=w();t&&(t.textContent=``,requestAnimationFrame(()=>{t.textContent=e}))}function E(e){let t=u(null);e.announce;let n=s(()=>{let t=f(e.itemId),n=f(e.grabbedId);return t!=null&&n===t});function r(){t.value=null}function i(r){if(f(e.isDraggable)&&f(e.itemId)!=null){if(!n.value){(r.key===` `||r.key===`Enter`)&&(r.preventDefault(),t.value=e.onGrab());return}switch(r.key){case`ArrowUp`:r.preventDefault(),e.onMove(`up`);break;case`ArrowDown`:r.preventDefault(),e.onMove(`down`);break;case`ArrowLeft`:r.preventDefault(),e.onMove(`left`);break;case`ArrowRight`:r.preventDefault(),e.onMove(`right`);break;case` `:case`Enter`:{r.preventDefault();let n=t.value;t.value=null,n!==null&&e.onCommit(n);break}case`Escape`:{r.preventDefault();let n=t.value;t.value=null,n!==null&&e.onCancel(n);break}}}}return{isGrabbed:n,handleKeyDown:i,release:r}}function D(e,t,n,r={passive:!0}){p(e,(e,i,a)=>{e&&(e.addEventListener(t,n,r),a(()=>e.removeEventListener(t,n)))},{immediate:!0})}function O(t,n={}){let r=u(n.initial??!1);return p(t,(i,a,o)=>{let s=e(t);if(!s)return;let c=new IntersectionObserver(e=>r.value=e[0]?.isIntersecting??!1,n);c.observe(s),o(()=>c.disconnect())},{immediate:!0}),r}function k(e,t){let n=`flux/${e}`,r=u(i()??t);function i(){if(n in localStorage){let e=JSON.parse(localStorage.getItem(n));return Array.isArray(e)&&e[0]===`DateTime`&&(e=m.fromISO(e[1])),e}return null}return p(r,e=>{let t=e;m.isDateTime(e)&&(t=[`DateTime`,e.toISO({includeOffset:!0,extendedZone:!0})]),localStorage.setItem(n,JSON.stringify(t))}),r}function A(t){let n=u(!0),r=u(!0);return p(t,(
|
|
2
|
-
//# sourceMappingURL=composable-
|
|
1
|
+
import{a as e,d as t,f as n,n as r,r as i,s as a,t as o}from"./util-CwaOsSvo.js";import{computed as s,onMounted as c,onUnmounted as l,ref as u,toValue as d,unref as f,watch as p}from"vue";import{DateTime as m}from"luxon";import{unwrapElement as h,useMutationObserver as g}from"@basmilius/common";function _(e,t){let n=u(!1),r=u(e),i=s(()=>{let e=[],t=f(r).month,n=f(r).startOf(`month`);do e.push(n),n=n.plus({day:1});while(n.month===t);let i=e[0],a=e[e.length-1];for(let t=1;t<i.weekday;++t)e.unshift(i.minus({day:t}));for(let t=a.weekday+1;t<=7;++t)e.push(a.plus({day:t-a.weekday}));for(;e.length/7<6;){let t=e[e.length-1];for(let n=1;n<=7;++n)e.push(t.plus({day:n}))}return e}),a=s(()=>f(i).slice(0,7).map(e=>e.toLocaleString({weekday:t?.weekDayLength??`short`}))),o=s(()=>f(r).plus({month:1})),c=s(()=>f(r).minus({month:1})),l=s(()=>f(r).toLocaleString({month:t?.monthLength??`long`})),d=s(()=>f(r).year.toString());function p(e){n.value=r.value>e,r.value=e}function m(){p(f(r).plus({month:1}))}function h(){p(f(r).minus({month:1}))}return{isTransitioningToPast:n,viewDate:r,viewDateNext:o,viewDatePrevious:c,viewMonth:l,viewYear:d,dates:i,days:a,setViewDate:p,nextMonth:m,previousMonth:h}}function v(e,t){return{months:s(()=>{let n=[],r=f(e),i=r.startOf(`year`);for(;i.month<=12&&i.year===r.year;)n.push({date:i,label:i.toLocaleString({month:t})}),i=i.plus({months:1});return n})}}function y(e,t){return t===7?e.startOf(`week`):e.startOf(`day`)}function b(e){return e===7?{week:1}:e===2?{day:2}:{day:1}}function x(e,t){let n=u(!1),r=u(y(e,d(t)));p(()=>d(t),e=>{r.value=y(f(r),e)});let i=s(()=>{let e=f(r),n=d(t),i=[];for(let t=0;t<n;++t)i.push(e.plus({day:t}));return i}),a=s(()=>{let e=f(i),n=e[0],r=e[e.length-1];if(d(t)===1)return n.toLocaleString({weekday:`long`,day:`numeric`,month:`long`,year:`numeric`});let a=n.month===r.month,o=n.year===r.year;return`${n.toLocaleString(a&&o?{weekday:`short`,day:`numeric`}:{weekday:`short`,day:`numeric`,month:`short`})} – ${r.toLocaleString({weekday:`short`,day:`numeric`,month:`short`,year:o?void 0:`numeric`})}`});function o(e){let i=y(e,d(t));n.value=f(r)>i,r.value=i}function c(){o(f(r).plus(b(d(t))))}function l(){o(f(r).minus(b(d(t))))}return{isTransitioningToPast:n,viewDate:r,viewDates:i,rangeLabel:a,setViewDate:o,next:c,previous:l}}function S(e,t=10){let n=u(0),r=s(()=>{let r=f(e).year,i=[],a=r-r%t+f(n)*t;for(let e=0;e<t;++e)i.push(a+e);return i});function i(){++n.value}function a(){--n.value}return p(e,()=>n.value=0),{years:r,next:i,previous:a}}let C=null;function w(){if(C)return C;if(typeof document>`u`)return null;let e=document.createElement(`div`);return e.setAttribute(`role`,`status`),e.setAttribute(`aria-live`,`polite`),e.setAttribute(`aria-atomic`,`true`),e.style.cssText=`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,document.body.appendChild(e),C=e,e}function T(e){let t=w();t&&(t.textContent=``,requestAnimationFrame(()=>{t.textContent=e}))}function E(e){let t=u(null);e.announce;let n=s(()=>{let t=f(e.itemId),n=f(e.grabbedId);return t!=null&&n===t});function r(){t.value=null}function i(r){if(f(e.isDraggable)&&f(e.itemId)!=null){if(!n.value){(r.key===` `||r.key===`Enter`)&&(r.preventDefault(),t.value=e.onGrab());return}switch(r.key){case`ArrowUp`:r.preventDefault(),e.onMove(`up`);break;case`ArrowDown`:r.preventDefault(),e.onMove(`down`);break;case`ArrowLeft`:r.preventDefault(),e.onMove(`left`);break;case`ArrowRight`:r.preventDefault(),e.onMove(`right`);break;case` `:case`Enter`:{r.preventDefault();let n=t.value;t.value=null,n!==null&&e.onCommit(n);break}case`Escape`:{r.preventDefault();let n=t.value;t.value=null,n!==null&&e.onCancel(n);break}}}}return{isGrabbed:n,handleKeyDown:i,release:r}}function D(e,t,n,r={passive:!0}){p(e,(e,i,a)=>{e&&(e.addEventListener(t,n,r),a(()=>e.removeEventListener(t,n)))},{immediate:!0})}function O(t,n={}){let r=u(n.initial??!1);return p(t,(i,a,o)=>{let s=e(t);if(!s)return;let c=new IntersectionObserver(e=>r.value=e[0]?.isIntersecting??!1,n);c.observe(s),o(()=>c.disconnect())},{immediate:!0}),r}function k(e,t){let n=`flux/${e}`,r=u(i()??t);function i(){if(n in localStorage){let e=JSON.parse(localStorage.getItem(n));return Array.isArray(e)&&e[0]===`DateTime`&&(e=m.fromISO(e[1])),e}return null}return p(r,e=>{let t=e;m.isDateTime(e)&&(t=[`DateTime`,e.toISO({includeOffset:!0,extendedZone:!0})]),localStorage.setItem(n,JSON.stringify(t))}),r}function A(t){let n=u(!0),r=u(!0),i=u(!0),a=u(!0);return p(t,(o,s,c)=>{let l=e(t);if(!l)return;let u=()=>{let{scrollTop:e,scrollHeight:t,clientHeight:o,scrollLeft:s,scrollWidth:c,clientWidth:u}=l;n.value=e<=0,r.value=Math.ceil(e+o)>=t,i.value=s<=0,a.value=Math.ceil(s+u)>=c},d=new ResizeObserver(u);d.observe(l);for(let e of Array.from(l.children))d.observe(e);let f=new MutationObserver(e=>{for(let t of e){for(let e of Array.from(t.addedNodes))e instanceof Element&&d.observe(e);for(let e of Array.from(t.removedNodes))e instanceof Element&&d.unobserve(e)}u()});f.observe(l,{childList:!0}),l.addEventListener(`scroll`,u,{passive:!0}),u(),c(()=>{l.removeEventListener(`scroll`,u),d.disconnect(),f.disconnect()})},{immediate:!0}),{isAtStart:n,isAtEnd:r,isAtLeft:i,isAtRight:a}}function j(e){let t=u(0),n=u(0);return e||=u(document),D(e,`scroll`,()=>{let r=f(e);r instanceof Document&&(r=r.scrollingElement),t.value=r?.scrollLeft??0,n.value=r?.scrollTop??0}),{x:t,y:n}}let M=0;function N(e=!1){let t=u(`focus-trap-${++M}`),n=u(!1);return c(()=>r.add(f(t),e=>n.value=e,e)),l(()=>r.remove(f(t))),n}function P(t,n){p(t,(r,i,a)=>{if(!e(t)||f(n))return;let o=document.activeElement;a(()=>{requestAnimationFrame(()=>o?.focus())})})}function F(t,r={}){if(o)return;let{disable:a=u(!1),disableReturn:s=u(!1),attachTo:c=null}=r,l=N(!a);P(t,s),p(t,(r,a,o)=>{let s=e(t),u=c||document;l.value&&s&&document.activeElement&&!s.contains(document.activeElement)&&!s.querySelector(`[autofocus]`)&&i(s,document.activeElement,!0);function d(e){if(!l.value||!s)return;let t=e.target||document.body;s.contains(t)||(e.preventDefault(),e.stopImmediatePropagation(),i(s,t))}function f(e){if(!l.value||!s)return;(!e.relatedTarget||e.relatedTarget===document.body)&&(e.preventDefault(),s.focus());let t=e.target||document.body;s.contains(t)||i(s,t)}if(u.addEventListener(`focusin`,d,{capture:!0}),u.addEventListener(`focusout`,f,{capture:!0}),s){let e=n(s),t=e.findIndex(e=>e.classList.contains(`is-active`)),r=e.findIndex(e=>!e.hasAttribute(`aria-disabled`)),i=e[0];t>-1&&(i=e[t]),r>-1&&(i=e[r]),i&&i.focus()}o(()=>{u.removeEventListener(`focusin`,d),u.removeEventListener(`focusout`,f)})},{immediate:!0}),p(()=>a,()=>{let r=e(t);if(l.value=!a,a||!r)return;let i=n(r);i.includes(document.activeElement)||i[0]?.focus()},{immediate:!0})}function I(e){let t=u(null);c(()=>t.value=r.subscribe(e)),l(()=>t.value?.())}function L(e,{cycle:t=!0,direction:r=`bidirectional`}={}){g(e,()=>a(i(),!1));function i(){let t=n(h(e)),r=t.findIndex(e=>e.classList.contains(`is-active`)),i=t.findIndex(e=>!e.hasAttribute(`aria-disabled`));return r>-1?r:i>-1?i:0}function a(t,r=!0){let i=n(h(e));i.forEach((e,n)=>e.tabIndex=n===t?0:-1),r&&i[t]?.focus()}function o(i){let o=h(e),s=n(o);if(![`Enter`,` `].includes(i.key))switch(r){case`bidirectional`:R(i,o,s,a);break;case`horizontal`:case`vertical`:z(i,o,t,r,s,a);break}}p(e,(t,n,r)=>{let s=h(e);s&&(s.addEventListener(`keydown`,o),a(i(),!1),r(()=>s.removeEventListener(`keydown`,o)))},{immediate:!0})}function R(e,n,r,i){let a;switch(e.key){case`ArrowUp`:a=`up`;break;case`ArrowDown`:a=`down`;break;case`ArrowLeft`:a=`left`;break;case`ArrowRight`:a=`right`;break;default:return}let o=t(n,document.activeElement,a);o&&i(r.indexOf(o)),e.preventDefault()}function z(e,t,n,r,i,o){let s;if(e.key===(r===`horizontal`?`ArrowLeft`:`ArrowUp`))s=-1;else if(e.key===(r===`horizontal`?`ArrowRight`:`ArrowDown`))s=1;else return;let c=a(t,s);c?o(i.indexOf(c)):n&&o(s===1?0:i.length-1),e.preventDefault()}export{N as a,k as c,T as d,E as f,_ as g,v as h,P as i,O as l,x as m,I as n,j as o,S as p,F as r,A as s,L as t,D as u};
|
|
2
|
+
//# sourceMappingURL=composable-DaZozn_3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composable-DaZozn_3.js","names":["unrefTemplateElement","unrefTemplateElement","FOCUS_TRAP_LOCKS","unrefTemplateElement","useFocusTrapLock","unrefTemplateElement","getFocusableElements","FOCUS_TRAP_LOCKS","getFocusableElements","getBidirectionalFocusElement","getFocusableElement"],"sources":["../src/composable/useCalendar.ts","../src/composable/useCalendarMonthSwitcher.ts","../src/composable/useCalendarTimeGrid.ts","../src/composable/useCalendarYearSwitcher.ts","../src/composable/useKeyboardGrab.ts","../src/composable/useEventListener.ts","../src/composable/useInView.ts","../src/composable/useRemembered.ts","../src/composable/useScrollEdges.ts","../src/composable/useScrollPosition.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrap.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"sourcesContent":["import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref } from 'vue';\n\nexport default function (initialDate: DateTime, options?: UseCalendarOptions): UseCalendarReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref(initialDate);\n\n const dates = computed<DateTime[]>(() => {\n const dates: DateTime[] = [];\n const month = unref(viewDate).month;\n let current = unref(viewDate).startOf('month');\n\n do {\n dates.push(current);\n current = current.plus({day: 1});\n } while (current.month === month);\n\n const first = dates[0];\n const last = dates[dates.length - 1];\n\n for (let i = 1; i < first.weekday; ++i) {\n dates.unshift(first.minus({day: i}));\n }\n\n for (let i = last.weekday + 1; i <= 7; ++i) {\n dates.push(last.plus({day: i - last.weekday}));\n }\n\n while (dates.length / 7 < 6) {\n const last = dates[dates.length - 1];\n\n for (let i = 1; i <= 7; ++i) {\n dates.push(last.plus({day: i}));\n }\n }\n\n return dates;\n });\n\n const days = computed(() => unref(dates)\n .slice(0, 7)\n .map(d => d.toLocaleString({weekday: options?.weekDayLength ?? 'short'})));\n\n const viewDateNext = computed(() => unref(viewDate).plus({month: 1}));\n const viewDatePrevious = computed(() => unref(viewDate).minus({month: 1}));\n const viewMonth = computed(() => unref(viewDate).toLocaleString({month: options?.monthLength ?? 'long'}));\n const viewYear = computed(() => unref(viewDate).year.toString());\n\n function setViewDate(date: DateTime): void {\n isTransitioningToPast.value = viewDate.value > date;\n viewDate.value = date;\n }\n\n function nextMonth(): void {\n setViewDate(unref(viewDate).plus({month: 1}));\n }\n\n function previousMonth(): void {\n setViewDate(unref(viewDate).minus({month: 1}));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDateNext,\n viewDatePrevious,\n viewMonth,\n viewYear,\n dates,\n days,\n setViewDate,\n nextMonth,\n previousMonth\n };\n}\n\ntype UseCalendarOptions = {\n readonly monthLength?: 'short' | 'long';\n readonly weekDayLength?: 'short' | 'long';\n};\n\ntype UseCalendarReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDateNext: Ref<DateTime>;\n readonly viewDatePrevious: Ref<DateTime>;\n readonly viewMonth: Ref<string>;\n readonly viewYear: Ref<string>;\n readonly dates: Ref<DateTime[]>;\n readonly days: Ref<string[]>;\n\n setViewDate(date: DateTime): void;\n nextMonth(): void;\n previousMonth(): void;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type Ref, unref } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, displayLength: 'short' | 'long'): UseCalendarMonthSwitcherReturn {\n const months = computed(() => {\n const months: MonthEntry[] = [];\n const now = unref(currentDate);\n let current = now.startOf('year');\n\n while (current.month <= 12 && current.year === now.year) {\n months.push({\n date: current,\n label: current.toLocaleString({month: displayLength})\n });\n current = current.plus({months: 1});\n }\n\n return months;\n });\n\n return {\n months\n };\n}\n\ntype MonthEntry = {\n readonly date: DateTime;\n readonly label: string;\n};\n\ntype UseCalendarMonthSwitcherReturn = {\n readonly months: Ref<MonthEntry[]>;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type ComputedRef, type MaybeRefOrGetter, ref, type Ref, toValue, unref, watch } from 'vue';\n\nexport type UseCalendarTimeGridDayCount = 1 | 2 | 7;\n\nexport type UseCalendarTimeGridReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDates: ComputedRef<DateTime[]>;\n readonly rangeLabel: ComputedRef<string>;\n\n setViewDate(date: DateTime): void;\n next(): void;\n previous(): void;\n};\n\nfunction getAnchor(date: DateTime, dayCount: UseCalendarTimeGridDayCount): DateTime {\n return dayCount === 7 ? date.startOf('week') : date.startOf('day');\n}\n\nfunction stepDuration(dayCount: UseCalendarTimeGridDayCount): { day?: number; week?: number } {\n if (dayCount === 7) {\n return {week: 1};\n }\n\n if (dayCount === 2) {\n return {day: 2};\n }\n\n return {day: 1};\n}\n\nexport default function (\n initialDate: DateTime,\n dayCount: MaybeRefOrGetter<UseCalendarTimeGridDayCount>\n): UseCalendarTimeGridReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref<DateTime>(getAnchor(initialDate, toValue(dayCount)));\n\n // Re-anchor on dayCount change (e.g. switching from week to two-days view).\n watch(() => toValue(dayCount), (count) => {\n viewDate.value = getAnchor(unref(viewDate), count);\n });\n\n const viewDates = computed<DateTime[]>(() => {\n const anchor = unref(viewDate);\n const count = toValue(dayCount);\n const out: DateTime[] = [];\n\n for (let i = 0; i < count; ++i) {\n out.push(anchor.plus({day: i}));\n }\n\n return out;\n });\n\n const rangeLabel = computed<string>(() => {\n const dates = unref(viewDates);\n const first = dates[0];\n const last = dates[dates.length - 1];\n const count = toValue(dayCount);\n\n if (count === 1) {\n return first.toLocaleString({weekday: 'long', day: 'numeric', month: 'long', year: 'numeric'});\n }\n\n const sameMonth = first.month === last.month;\n const sameYear = first.year === last.year;\n\n const firstFmt = first.toLocaleString(\n sameMonth && sameYear\n ? {weekday: 'short', day: 'numeric'}\n : {weekday: 'short', day: 'numeric', month: 'short'}\n );\n const lastFmt = last.toLocaleString({weekday: 'short', day: 'numeric', month: 'short', year: sameYear ? undefined : 'numeric'});\n\n return `${firstFmt} – ${lastFmt}`;\n });\n\n function setViewDate(date: DateTime): void {\n const anchor = getAnchor(date, toValue(dayCount));\n isTransitioningToPast.value = unref(viewDate) > anchor;\n viewDate.value = anchor;\n }\n\n function next(): void {\n setViewDate(unref(viewDate).plus(stepDuration(toValue(dayCount))));\n }\n\n function previous(): void {\n setViewDate(unref(viewDate).minus(stepDuration(toValue(dayCount))));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDates,\n rangeLabel,\n setViewDate,\n next,\n previous\n };\n}\n","import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref, watch } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, limit: number = 10): UseCalendarYearSwitcherReturn {\n const index = ref(0);\n\n const years = computed(() => {\n const year = unref(currentDate).year;\n const years: number[] = [];\n const start = year - (year % limit) + unref(index) * limit;\n\n for (let i = 0; i < limit; ++i) {\n years.push(start + i);\n }\n\n return years;\n });\n\n function next(): void {\n ++index.value;\n }\n\n function previous(): void {\n --index.value;\n }\n\n watch(currentDate, () => index.value = 0);\n\n return {\n years,\n\n next,\n previous\n };\n}\n\ntype UseCalendarYearSwitcherReturn = {\n readonly years: Ref<number[]>;\n\n next(): void;\n previous(): void;\n};\n","import { computed, type ComputedRef, ref, type Ref, unref } from 'vue';\n\nexport type KeyboardGrabDirection = 'up' | 'down' | 'left' | 'right';\n\nexport type UseKeyboardGrabOptions<TPos> = {\n readonly isDraggable: Ref<boolean>;\n readonly itemId: Ref<string | number | null | undefined>;\n readonly grabbedId: Ref<string | number | null>;\n onGrab(): TPos;\n onMove(direction: KeyboardGrabDirection): void;\n onCommit(origin: TPos): void;\n onCancel(origin: TPos): void;\n announce?(message: string): void;\n};\n\nexport type UseKeyboardGrabReturn = {\n readonly isGrabbed: ComputedRef<boolean>;\n handleKeyDown(evt: KeyboardEvent): void;\n release(): void;\n};\n\nlet liveRegion: HTMLElement | null = null;\n\nfunction ensureLiveRegion(): HTMLElement {\n if (liveRegion) {\n return liveRegion;\n }\n\n if (typeof document === 'undefined') {\n return null as unknown as HTMLElement;\n }\n\n const region = document.createElement('div');\n region.setAttribute('role', 'status');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.style.cssText = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n document.body.appendChild(region);\n liveRegion = region;\n return region;\n}\n\nexport function defaultAnnounce(message: string): void {\n const region = ensureLiveRegion();\n\n if (!region) {\n return;\n }\n\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n}\n\n/**\n * Generic keyboard-grab state machine. Maps Space/Enter/Escape/Arrow keys\n * onto grab/commit/cancel/move callbacks. The actual movement logic is\n * delegated to `onMove` since it depends on the host component's topology.\n */\nexport default function useKeyboardGrab<TPos>(options: UseKeyboardGrabOptions<TPos>): UseKeyboardGrabReturn {\n const origin = ref<TPos | null>(null);\n const announce = options.announce ?? defaultAnnounce;\n\n const isGrabbed = computed<boolean>(() => {\n const id = unref(options.itemId);\n const grabbed = unref(options.grabbedId);\n\n return id != null && grabbed === id;\n });\n\n function release(): void {\n origin.value = null;\n }\n\n function handleKeyDown(evt: KeyboardEvent): void {\n if (!unref(options.isDraggable)) {\n return;\n }\n\n const id = unref(options.itemId);\n\n if (id == null) {\n return;\n }\n\n if (!isGrabbed.value) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n origin.value = options.onGrab() as TPos;\n }\n\n return;\n }\n\n switch (evt.key) {\n case 'ArrowUp':\n evt.preventDefault();\n options.onMove('up');\n break;\n\n case 'ArrowDown':\n evt.preventDefault();\n options.onMove('down');\n break;\n\n case 'ArrowLeft':\n evt.preventDefault();\n options.onMove('left');\n break;\n\n case 'ArrowRight':\n evt.preventDefault();\n options.onMove('right');\n break;\n\n case ' ':\n case 'Enter': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCommit(o);\n }\n\n break;\n }\n\n case 'Escape': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCancel(o);\n }\n\n break;\n }\n }\n\n // Suppress unused-warning when announce is unused inside the function.\n void announce;\n }\n\n return {\n isGrabbed,\n handleKeyDown,\n release\n };\n}\n","import { watch } from 'vue';\nimport type { TemplateRef } from '../util';\n\nexport default function <K extends keyof HTMLElementEventMap>(elementRef: TemplateRef<HTMLElement>, eventName: K, listener: (evt: HTMLElementEventMap[K]) => any, options: AddEventListenerOptions = {passive: true}): void {\n watch(elementRef, (element: HTMLElement, _, onCleanup) => {\n if (!element) {\n return;\n }\n\n element.addEventListener(eventName, listener, options);\n\n onCleanup(() => element.removeEventListener(eventName, listener));\n }, {immediate: true});\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(containerRef: TemplateRef<TElement>, options: UseInViewOptions = {}): Ref<boolean> {\n const inView = ref(options.initial ?? false);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container) {\n return;\n }\n\n const observer = new IntersectionObserver(entries => inView.value = entries[0]?.isIntersecting ?? false, options);\n observer.observe(container);\n\n onCleanup(() => observer.disconnect());\n }, {immediate: true});\n\n return inView;\n}\n\ntype UseInViewOptions = IntersectionObserverInit & {\n readonly initial?: boolean;\n};\n","import { DateTime } from 'luxon';\nimport { ref, type Ref, watch } from 'vue';\n\nexport default function <T>(key: string, initialValue: T): Ref<T> {\n const realKey = `flux/${key}`;\n const value = ref<T>(get() ?? initialValue);\n\n function get(): T | null {\n if (realKey in localStorage) {\n let storageValue = JSON.parse(localStorage.getItem(realKey)!);\n\n if (Array.isArray(storageValue) && storageValue[0] === 'DateTime') {\n storageValue = DateTime.fromISO(storageValue[1]);\n }\n\n return storageValue;\n }\n\n return null;\n }\n\n watch(value, value => {\n let _value: T = value as T;\n\n if (DateTime.isDateTime(value)) {\n _value = ['DateTime', value.toISO({\n includeOffset: true,\n extendedZone: true\n })] as unknown as T;\n }\n\n localStorage.setItem(realKey, JSON.stringify(_value));\n });\n\n return value as Ref<T>;\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(elementRef: TemplateRef<TElement>): UseScrollEdgesReturn {\n const isAtStart = ref(true);\n const isAtEnd = ref(true);\n const isAtLeft = ref(true);\n const isAtRight = ref(true);\n\n watch(elementRef, (_, __, onCleanup) => {\n const element = unrefTemplateElement(elementRef);\n\n if (!element) {\n return;\n }\n\n const update = (): void => {\n const {scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth} = element;\n\n isAtStart.value = scrollTop <= 0;\n isAtEnd.value = Math.ceil(scrollTop + clientHeight) >= scrollHeight;\n isAtLeft.value = scrollLeft <= 0;\n isAtRight.value = Math.ceil(scrollLeft + clientWidth) >= scrollWidth;\n };\n\n const resizeObserver = new ResizeObserver(update);\n resizeObserver.observe(element);\n\n for (const child of Array.from(element.children)) {\n resizeObserver.observe(child);\n }\n\n const mutationObserver = new MutationObserver(mutations => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node instanceof Element) {\n resizeObserver.observe(node);\n }\n }\n\n for (const node of Array.from(mutation.removedNodes)) {\n if (node instanceof Element) {\n resizeObserver.unobserve(node);\n }\n }\n }\n\n update();\n });\n\n mutationObserver.observe(element, {childList: true});\n element.addEventListener('scroll', update, {passive: true});\n\n update();\n\n onCleanup(() => {\n element.removeEventListener('scroll', update);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n });\n }, {immediate: true});\n\n return {\n isAtStart,\n isAtEnd,\n isAtLeft,\n isAtRight\n };\n}\n\nexport type UseScrollEdgesReturn = {\n readonly isAtStart: Ref<boolean>;\n readonly isAtEnd: Ref<boolean>;\n readonly isAtLeft: Ref<boolean>;\n readonly isAtRight: Ref<boolean>;\n};\n","import { ref, type Ref, unref } from 'vue';\nimport type { TemplateRef } from '../util';\nimport useEventListener from './useEventListener';\n\nexport default function <TElement extends HTMLElement>(elementRef?: TemplateRef<TElement>): UseScrollPositionReturn {\n const x = ref(0);\n const y = ref(0);\n\n if (!elementRef) {\n elementRef = ref(document);\n }\n\n useEventListener(elementRef, 'scroll', () => {\n let element = unref(elementRef);\n\n if (element instanceof Document) {\n element = element.scrollingElement;\n }\n\n x.value = element?.scrollLeft ?? 0;\n y.value = element?.scrollTop ?? 0;\n });\n\n return {\n x,\n y\n };\n}\n\nexport type UseScrollPositionReturn = {\n readonly x: Ref<number>;\n readonly y: Ref<number>;\n};\n","import { onMounted, onUnmounted, ref, type Ref, unref } from 'vue';\nimport { FOCUS_TRAP_LOCKS } from '../util';\n\nlet lockId = 0;\n\nexport default function (autoFocus: boolean = false): Ref<boolean> {\n const id = ref(`focus-trap-${++lockId}`);\n const enabled = ref(false);\n\n onMounted(() => FOCUS_TRAP_LOCKS.add(unref(id), isEnabled => enabled.value = isEnabled, autoFocus));\n onUnmounted(() => FOCUS_TRAP_LOCKS.remove(unref(id)));\n\n return enabled;\n}\n","import { type Ref, unref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, disabled: Ref<boolean>): void {\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container || unref(disabled)) {\n return;\n }\n\n const previousTarget = document.activeElement as HTMLElement | null;\n\n onCleanup(() => {\n requestAnimationFrame(() => previousTarget?.focus());\n });\n });\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { getFocusableElements, isSSR, type TemplateRef, unrefTemplateElement, wrapFocus } from '../util';\nimport useFocusTrapLock from './useFocusTrapLock';\nimport useFocusTrapReturn from './useFocusTrapReturn';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, options: UseFocusTrapOptions = {}): void {\n if (isSSR) {\n return;\n }\n\n const {disable = ref(false), disableReturn = ref(false), attachTo = null} = options;\n const enabled = useFocusTrapLock(!disable);\n\n useFocusTrapReturn(containerRef, disableReturn);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n const attach = attachTo || document;\n\n if (enabled.value && container && document.activeElement && !container.contains(document.activeElement) && !container.querySelector('[autofocus]')) {\n wrapFocus(container, document.activeElement, true);\n }\n\n function onFocusIn(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n evt.preventDefault();\n evt.stopImmediatePropagation();\n\n wrapFocus(container, newFocusElement);\n }\n\n function onFocusOut(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n if (!evt.relatedTarget || evt.relatedTarget === document.body) {\n evt.preventDefault();\n container.focus();\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n wrapFocus(container, newFocusElement);\n }\n\n attach.addEventListener('focusin', onFocusIn as EventListener, {capture: true});\n attach.addEventListener('focusout', onFocusOut as EventListener, {capture: true});\n\n if (container) {\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.hasAttribute('aria-disabled'));\n let element = elements[0];\n\n if (isActiveIndex > -1) {\n element = elements[isActiveIndex];\n }\n\n if (notDisabledIndex > -1) {\n element = elements[notDisabledIndex];\n }\n\n if (element) {\n element.focus();\n }\n }\n\n onCleanup(() => {\n attach.removeEventListener('focusin', onFocusIn as EventListener);\n attach.removeEventListener('focusout', onFocusOut as EventListener);\n });\n }, {immediate: true});\n\n watch(() => disable, () => {\n const container = unrefTemplateElement(containerRef);\n enabled.value = !disable;\n\n if (disable || !container) {\n return;\n }\n\n const elements = getFocusableElements(container as HTMLElement);\n\n if (elements.includes(document.activeElement as HTMLElement)) {\n return;\n }\n\n elements[0]?.focus();\n }, {immediate: true});\n}\n\ntype UseFocusTrapOptions = {\n attachTo?: HTMLElement | Document;\n disable?: Ref<boolean>;\n disableReturn?: Ref<boolean>;\n};\n","import { onMounted, onUnmounted, ref } from 'vue';\nimport { FOCUS_TRAP_LOCKS, type FocusTrapListener } from '../util';\n\nexport default function (listener: FocusTrapListener): void {\n const unsubscribe = ref<Function | null>(null);\n\n onMounted(() => unsubscribe.value = FOCUS_TRAP_LOCKS.subscribe(listener));\n onUnmounted(() => unsubscribe.value?.());\n}\n","import { unwrapElement, useMutationObserver } from '@basmilius/common';\nimport { type ComponentPublicInstance, type Ref, watch } from 'vue';\nimport { getBidirectionalFocusElement, getFocusableElement, getFocusableElements } from '../util';\n\ntype EligibleElement = ComponentPublicInstance | HTMLElement;\n\nexport default function <TElement extends EligibleElement>(containerRef: Ref<TElement>, {cycle = true, direction = 'bidirectional'}: UseFocusZoneOptions = {}): void {\n useMutationObserver(containerRef, () => updateFocus(findInitialIndex(), false));\n\n function findInitialIndex(): number {\n const container = unwrapElement(containerRef);\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.hasAttribute('aria-disabled'));\n\n if (isActiveIndex > -1) {\n return isActiveIndex;\n }\n\n if (notDisabledIndex > -1) {\n return notDisabledIndex;\n }\n\n return 0;\n }\n\n function updateFocus(elementIndex: number, doFocus: boolean = true): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n elements.forEach((elm, index) => elm.tabIndex = index === elementIndex ? 0 : -1);\n\n doFocus && elements[elementIndex]?.focus();\n }\n\n function onKeyDown(evt: KeyboardEvent): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n\n if (['Enter', ' '].includes(evt.key)) {\n return;\n }\n\n switch (direction) {\n case 'bidirectional':\n handleBidirectionalFocus(evt, container, elements, updateFocus);\n break;\n\n case 'horizontal':\n case 'vertical':\n handleDirectionalFocus(evt, container, cycle, direction, elements, updateFocus);\n break;\n }\n }\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unwrapElement(containerRef);\n\n if (!container) {\n return;\n }\n\n container.addEventListener('keydown', onKeyDown);\n\n updateFocus(findInitialIndex(), false);\n\n onCleanup(() => container.removeEventListener('keydown', onKeyDown));\n }, {immediate: true});\n}\n\nfunction handleBidirectionalFocus(evt: KeyboardEvent, container: HTMLElement, elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: 'up' | 'down' | 'left' | 'right';\n\n switch (evt.key) {\n case 'ArrowUp':\n dir = 'up';\n break;\n\n case 'ArrowDown':\n dir = 'down';\n break;\n\n case 'ArrowLeft':\n dir = 'left';\n break;\n\n case 'ArrowRight':\n dir = 'right';\n break;\n\n default:\n return;\n }\n\n const element = getBidirectionalFocusElement(container, document.activeElement as HTMLElement, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n }\n\n evt.preventDefault();\n}\n\nfunction handleDirectionalFocus(evt: KeyboardEvent, container: HTMLElement, cycle: boolean, direction: 'horizontal' | 'vertical', elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: number;\n\n if (evt.key === (direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp')) {\n dir = -1;\n } else if (evt.key === (direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown')) {\n dir = 1;\n } else {\n return;\n }\n\n const element = getFocusableElement(container, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n } else if (cycle) {\n updateFocus(dir === 1 ? 0 : elements.length - 1);\n }\n\n evt.preventDefault();\n}\n\ntype UseFocusZoneOptions = {\n readonly cycle?: boolean;\n readonly direction?: 'bidirectional' | 'horizontal' | 'vertical';\n};\n"],"mappings":"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"}
|
|
@@ -95,6 +95,8 @@ declare function export_default$6<TElement extends HTMLElement>(elementRef: Temp
|
|
|
95
95
|
type UseScrollEdgesReturn = {
|
|
96
96
|
readonly isAtStart: Ref<boolean>;
|
|
97
97
|
readonly isAtEnd: Ref<boolean>;
|
|
98
|
+
readonly isAtLeft: Ref<boolean>;
|
|
99
|
+
readonly isAtRight: Ref<boolean>;
|
|
98
100
|
};
|
|
99
101
|
//#endregion
|
|
100
102
|
//#region src/composable/useScrollPosition.d.ts
|
|
@@ -133,4 +135,4 @@ type UseFocusZoneOptions = {
|
|
|
133
135
|
};
|
|
134
136
|
//#endregion
|
|
135
137
|
export { export_default$4 as a, export_default$7 as c, defaultAnnounce as d, useKeyboardGrab as f, export_default$13 as g, export_default$12 as h, export_default$3 as i, export_default$8 as l, export_default$11 as m, export_default$1 as n, export_default$5 as o, export_default$10 as p, export_default$2 as r, export_default$6 as s, export_default as t, export_default$9 as u };
|
|
136
|
-
//# sourceMappingURL=index-
|
|
138
|
+
//# sourceMappingURL=index-7w0u9Q_D.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-7w0u9Q_D.d.ts","names":[],"sources":["../src/composable/useCalendar.ts","../src/composable/useCalendarMonthSwitcher.ts","../src/composable/useCalendarTimeGrid.ts","../src/composable/useCalendarYearSwitcher.ts","../src/composable/useKeyboardGrab.ts","../src/composable/useEventListener.ts","../src/composable/useInView.ts","../src/composable/useRemembered.ts","../src/composable/useScrollEdges.ts","../src/composable/useScrollPosition.ts","../src/composable/useFocusTrap.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as export_default$15, c as export_default$21, d as defaultAnnounce, f as useKeyboardGrab, g as export_default$10, h as export_default$11, i as export_default$16, l as export_default$20, m as export_default$12, n as export_default$18, o as export_default$23, p as export_default$13, r as export_default$17, s as export_default$22, t as export_default$19, u as export_default$14 } from "./index-
|
|
1
|
+
import { a as export_default$15, c as export_default$21, d as defaultAnnounce, f as useKeyboardGrab, g as export_default$10, h as export_default$11, i as export_default$16, l as export_default$20, m as export_default$12, n as export_default$18, o as export_default$23, p as export_default$13, r as export_default$17, s as export_default$22, t as export_default$19, u as export_default$14 } from "./index-7w0u9Q_D.js";
|
|
2
2
|
import { _ as export_default, a as export_default$24, c as export_default$9, d as export_default$6, f as export_default$5, g as export_default$1, h as export_default$2, i as export_default$25, l as export_default$8, m as export_default$3, n as FocusTrapListener, o as TemplateElement, p as export_default$4, r as _default, s as TemplateRef, t as isSSR, u as export_default$7 } from "./index-B79OP5Th.js";
|
|
3
3
|
import { amber100, amber200, amber300, amber400, amber50, amber500, amber600, amber700, amber800, amber900, amber950, blue100, blue200, blue300, blue400, blue50, blue500, blue600, blue700, blue800, blue900, blue950, cyan100, cyan200, cyan300, cyan400, cyan50, cyan500, cyan600, cyan700, cyan800, cyan900, cyan950, emerald100, emerald200, emerald300, emerald400, emerald50, emerald500, emerald600, emerald700, emerald800, emerald900, emerald950, fuchsia100, fuchsia200, fuchsia300, fuchsia400, fuchsia50, fuchsia500, fuchsia600, fuchsia700, fuchsia800, fuchsia900, fuchsia950, gray100, gray200, gray300, gray400, gray50, gray500, gray600, gray700, gray800, gray900, gray950, green100, green200, green300, green400, green50, green500, green600, green700, green800, green900, green950, indigo100, indigo200, indigo300, indigo400, indigo50, indigo500, indigo600, indigo700, indigo800, indigo900, indigo950, lime100, lime200, lime300, lime400, lime50, lime500, lime600, lime700, lime800, lime900, lime950, neutral100, neutral200, neutral300, neutral400, neutral50, neutral500, neutral600, neutral700, neutral800, neutral900, neutral950, orange100, orange200, orange300, orange400, orange50, orange500, orange600, orange700, orange800, orange900, orange950, pink100, pink200, pink300, pink400, pink50, pink500, pink600, pink700, pink800, pink900, pink950, purple100, purple200, purple300, purple400, purple50, purple500, purple600, purple700, purple800, purple900, purple950, red100, red200, red300, red400, red50, red500, red600, red700, red800, red900, red950, rose100, rose200, rose300, rose400, rose50, rose500, rose600, rose700, rose800, rose900, rose950, sky100, sky200, sky300, sky400, sky50, sky500, sky600, sky700, sky800, sky900, sky950, slate100, slate200, slate300, slate400, slate50, slate500, slate600, slate700, slate800, slate900, slate950, stone100, stone200, stone300, stone400, stone50, stone500, stone600, stone700, stone800, stone900, stone950, teal100, teal200, teal300, teal400, teal50, teal500, teal600, teal700, teal800, teal900, teal950, violet100, violet200, violet300, violet400, violet50, violet500, violet600, violet700, violet800, violet900, violet950, yellow100, yellow200, yellow300, yellow400, yellow50, yellow500, yellow600, yellow700, yellow800, yellow900, yellow950, zinc100, zinc200, zinc300, zinc400, zinc50, zinc500, zinc600, zinc700, zinc800, zinc900, zinc950 } from "./data/index.js";
|
|
4
4
|
import { n as _default$1, t as _default$2 } from "./index-BRS2s2tX.js";
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"./composable-
|
|
1
|
+
import{a as e,c as t,d as n,f as r,g as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"./composable-DaZozn_3.js";import{a as g,c as _,d as v,f as y,i as b,l as x,m as S,n as C,o as w,p as T,r as E,s as D,t as O,u as k}from"./util-CwaOsSvo.js";import{amber100 as A,amber200 as j,amber300 as M,amber400 as N,amber50 as P,amber500 as F,amber600 as I,amber700 as L,amber800 as R,amber900 as z,amber950 as B,blue100 as V,blue200 as H,blue300 as U,blue400 as W,blue50 as G,blue500 as K,blue600 as q,blue700 as J,blue800 as Y,blue900 as X,blue950 as Z,cyan100 as Q,cyan200 as $,cyan300 as ee,cyan400 as te,cyan50 as ne,cyan500 as re,cyan600 as ie,cyan700 as ae,cyan800 as oe,cyan900 as se,cyan950 as ce,emerald100 as le,emerald200 as ue,emerald300 as de,emerald400 as fe,emerald50 as pe,emerald500 as me,emerald600 as he,emerald700 as ge,emerald800 as _e,emerald900 as ve,emerald950 as ye,fuchsia100 as be,fuchsia200 as xe,fuchsia300 as Se,fuchsia400 as Ce,fuchsia50 as we,fuchsia500 as Te,fuchsia600 as Ee,fuchsia700 as De,fuchsia800 as Oe,fuchsia900 as ke,fuchsia950 as Ae,gray100 as je,gray200 as Me,gray300 as Ne,gray400 as Pe,gray50 as Fe,gray500 as Ie,gray600 as Le,gray700 as Re,gray800 as ze,gray900 as Be,gray950 as Ve,green100 as He,green200 as Ue,green300 as We,green400 as Ge,green50 as Ke,green500 as qe,green600 as Je,green700 as Ye,green800 as Xe,green900 as Ze,green950 as Qe,indigo100 as $e,indigo200 as et,indigo300 as tt,indigo400 as nt,indigo50 as rt,indigo500 as it,indigo600 as at,indigo700 as ot,indigo800 as st,indigo900 as ct,indigo950 as lt,lime100 as ut,lime200 as dt,lime300 as ft,lime400 as pt,lime50 as mt,lime500 as ht,lime600 as gt,lime700 as _t,lime800 as vt,lime900 as yt,lime950 as bt,neutral100 as xt,neutral200 as St,neutral300 as Ct,neutral400 as wt,neutral50 as Tt,neutral500 as Et,neutral600 as Dt,neutral700 as Ot,neutral800 as kt,neutral900 as At,neutral950 as jt,orange100 as Mt,orange200 as Nt,orange300 as Pt,orange400 as Ft,orange50 as It,orange500 as Lt,orange600 as Rt,orange700 as zt,orange800 as Bt,orange900 as Vt,orange950 as Ht,pink100 as Ut,pink200 as Wt,pink300 as Gt,pink400 as Kt,pink50 as qt,pink500 as Jt,pink600 as Yt,pink700 as Xt,pink800 as Zt,pink900 as Qt,pink950 as $t,purple100 as en,purple200 as tn,purple300 as nn,purple400 as rn,purple50 as an,purple500 as on,purple600 as sn,purple700 as cn,purple800 as ln,purple900 as un,purple950 as dn,red100 as fn,red200 as pn,red300 as mn,red400 as hn,red50 as gn,red500 as _n,red600 as vn,red700 as yn,red800 as bn,red900 as xn,red950 as Sn,rose100 as Cn,rose200 as wn,rose300 as Tn,rose400 as En,rose50 as Dn,rose500 as On,rose600 as kn,rose700 as An,rose800 as jn,rose900 as Mn,rose950 as Nn,sky100 as Pn,sky200 as Fn,sky300 as In,sky400 as Ln,sky50 as Rn,sky500 as zn,sky600 as Bn,sky700 as Vn,sky800 as Hn,sky900 as Un,sky950 as Wn,slate100 as Gn,slate200 as Kn,slate300 as qn,slate400 as Jn,slate50 as Yn,slate500 as Xn,slate600 as Zn,slate700 as Qn,slate800 as $n,slate900 as er,slate950 as tr,stone100 as nr,stone200 as rr,stone300 as ir,stone400 as ar,stone50 as or,stone500 as sr,stone600 as cr,stone700 as lr,stone800 as ur,stone900 as dr,stone950 as fr,teal100 as pr,teal200 as mr,teal300 as hr,teal400 as gr,teal50 as _r,teal500 as vr,teal600 as yr,teal700 as br,teal800 as xr,teal900 as Sr,teal950 as Cr,violet100 as wr,violet200 as Tr,violet300 as Er,violet400 as Dr,violet50 as Or,violet500 as kr,violet600 as Ar,violet700 as jr,violet800 as Mr,violet900 as Nr,violet950 as Pr,yellow100 as Fr,yellow200 as Ir,yellow300 as Lr,yellow400 as Rr,yellow50 as zr,yellow500 as Br,yellow600 as Vr,yellow700 as Hr,yellow800 as Ur,yellow900 as Wr,yellow950 as Gr,zinc100 as Kr,zinc200 as qr,zinc300 as Jr,zinc400 as Yr,zinc50 as Xr,zinc500 as Zr,zinc600 as Qr,zinc700 as $r,zinc800 as ei,zinc900 as ti,zinc950 as ni}from"./data/index.js";import{n as ri,t as ii}from"./directive-Dprka-AO.js";export{C as FOCUS_TRAP_LOCKS,A as amber100,j as amber200,M as amber300,N as amber400,P as amber50,F as amber500,I as amber600,L as amber700,R as amber800,z as amber900,B as amber950,S as animationFrameDebounce,V as blue100,H as blue200,U as blue300,W as blue400,G as blue50,K as blue500,q as blue600,J as blue700,Y as blue800,X as blue900,Z as blue950,Q as cyan100,$ as cyan200,ee as cyan300,te as cyan400,ne as cyan50,re as cyan500,ie as cyan600,ae as cyan700,oe as cyan800,se as cyan900,ce as cyan950,n as defaultKeyboardGrabAnnounce,le as emerald100,ue as emerald200,de as emerald300,fe as emerald400,pe as emerald50,me as emerald500,he as emerald600,ge as emerald700,_e as emerald800,ve as emerald900,ye as emerald950,T as flattenVNodeTree,be as fuchsia100,xe as fuchsia200,Se as fuchsia300,Ce as fuchsia400,we as fuchsia50,Te as fuchsia500,Ee as fuchsia600,De as fuchsia700,Oe as fuchsia800,ke as fuchsia900,Ae as fuchsia950,v as getBidirectionalFocusElement,k as getComponentName,x as getComponentProps,_ as getExposedRef,D as getFocusableElement,y as getFocusableElements,w as getKeyboardFocusableElements,je as gray100,Me as gray200,Ne as gray300,Pe as gray400,Fe as gray50,Ie as gray500,Le as gray600,Re as gray700,ze as gray800,Be as gray900,Ve as gray950,He as green100,Ue as green200,We as green300,Ge as green400,Ke as green50,qe as green500,Je as green600,Ye as green700,Xe as green800,Ze as green900,Qe as green950,$e as indigo100,et as indigo200,tt as indigo300,nt as indigo400,rt as indigo50,it as indigo500,at as indigo600,ot as indigo700,st as indigo800,ct as indigo900,lt as indigo950,O as isSSR,ut as lime100,dt as lime200,ft as lime300,pt as lime400,mt as lime50,ht as lime500,gt as lime600,_t as lime700,vt as lime800,yt as lime900,bt as lime950,xt as neutral100,St as neutral200,Ct as neutral300,wt as neutral400,Tt as neutral50,Et as neutral500,Dt as neutral600,Ot as neutral700,kt as neutral800,At as neutral900,jt as neutral950,Mt as orange100,Nt as orange200,Pt as orange300,Ft as orange400,It as orange50,Lt as orange500,Rt as orange600,zt as orange700,Bt as orange800,Vt as orange900,Ht as orange950,Ut as pink100,Wt as pink200,Gt as pink300,Kt as pink400,qt as pink50,Jt as pink500,Yt as pink600,Xt as pink700,Zt as pink800,Qt as pink900,$t as pink950,en as purple100,tn as purple200,nn as purple300,rn as purple400,an as purple50,on as purple500,sn as purple600,cn as purple700,ln as purple800,un as purple900,dn as purple950,fn as red100,pn as red200,mn as red300,hn as red400,gn as red50,_n as red500,vn as red600,yn as red700,bn as red800,xn as red900,Sn as red950,Cn as rose100,wn as rose200,Tn as rose300,En as rose400,Dn as rose50,On as rose500,kn as rose600,An as rose700,jn as rose800,Mn as rose900,Nn as rose950,Pn as sky100,Fn as sky200,In as sky300,Ln as sky400,Rn as sky50,zn as sky500,Bn as sky600,Vn as sky700,Hn as sky800,Un as sky900,Wn as sky950,Gn as slate100,Kn as slate200,qn as slate300,Jn as slate400,Yn as slate50,Xn as slate500,Zn as slate600,Qn as slate700,$n as slate800,er as slate900,tr as slate950,nr as stone100,rr as stone200,ir as stone300,ar as stone400,or as stone50,sr as stone500,cr as stone600,lr as stone700,ur as stone800,dr as stone900,fr as stone950,pr as teal100,mr as teal200,hr as teal300,gr as teal400,_r as teal50,vr as teal500,yr as teal600,br as teal700,xr as teal800,Sr as teal900,Cr as teal950,g as unrefTemplateElement,i as useCalendar,a as useCalendarMonthSwitcher,c as useCalendarTimeGrid,d as useCalendarYearSwitcher,h as useEventListener,f as useFocusTrap,e as useFocusTrapLock,o as useFocusTrapReturn,l as useFocusTrapSubscription,m as useFocusZone,s as useInView,r as useKeyboardGrab,t as useRemembered,p as useScrollEdges,u as useScrollPosition,ri as vFocusTrap,ii as vHeightTransition,wr as violet100,Tr as violet200,Er as violet300,Dr as violet400,Or as violet50,kr as violet500,Ar as violet600,jr as violet700,Mr as violet800,Nr as violet900,Pr as violet950,b as warn,E as wrapFocus,Fr as yellow100,Ir as yellow200,Lr as yellow300,Rr as yellow400,zr as yellow50,Br as yellow500,Vr as yellow600,Hr as yellow700,Ur as yellow800,Wr as yellow900,Gr as yellow950,Kr as zinc100,qr as zinc200,Jr as zinc300,Yr as zinc400,Xr as zinc50,Zr as zinc500,Qr as zinc600,$r as zinc700,ei as zinc800,ti as zinc900,ni as zinc950};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flux-ui/internals",
|
|
3
3
|
"description": "Contains internal workings of Flux UI packages.",
|
|
4
|
-
"version": "3.0.0-next.
|
|
4
|
+
"version": "3.0.0-next.64",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"funding": "https://github.com/sponsors/basmilius",
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
}
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@basmilius/common": "^3.
|
|
63
|
-
"@basmilius/utils": "^3.
|
|
64
|
-
"@flux-ui/types": "3.0.0-next.
|
|
62
|
+
"@basmilius/common": "^3.25.0",
|
|
63
|
+
"@basmilius/utils": "^3.25.0",
|
|
64
|
+
"@flux-ui/types": "3.0.0-next.64",
|
|
65
65
|
"lodash-es": "^4.18.1"
|
|
66
66
|
},
|
|
67
67
|
"peerDependencies": {
|
|
@@ -4,6 +4,8 @@ import { type TemplateRef, unrefTemplateElement } from '../util';
|
|
|
4
4
|
export default function <TElement extends HTMLElement>(elementRef: TemplateRef<TElement>): UseScrollEdgesReturn {
|
|
5
5
|
const isAtStart = ref(true);
|
|
6
6
|
const isAtEnd = ref(true);
|
|
7
|
+
const isAtLeft = ref(true);
|
|
8
|
+
const isAtRight = ref(true);
|
|
7
9
|
|
|
8
10
|
watch(elementRef, (_, __, onCleanup) => {
|
|
9
11
|
const element = unrefTemplateElement(elementRef);
|
|
@@ -13,10 +15,12 @@ export default function <TElement extends HTMLElement>(elementRef: TemplateRef<T
|
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
const update = (): void => {
|
|
16
|
-
const {scrollTop, scrollHeight, clientHeight} = element;
|
|
18
|
+
const {scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth} = element;
|
|
17
19
|
|
|
18
20
|
isAtStart.value = scrollTop <= 0;
|
|
19
21
|
isAtEnd.value = Math.ceil(scrollTop + clientHeight) >= scrollHeight;
|
|
22
|
+
isAtLeft.value = scrollLeft <= 0;
|
|
23
|
+
isAtRight.value = Math.ceil(scrollLeft + clientWidth) >= scrollWidth;
|
|
20
24
|
};
|
|
21
25
|
|
|
22
26
|
const resizeObserver = new ResizeObserver(update);
|
|
@@ -58,11 +62,15 @@ export default function <TElement extends HTMLElement>(elementRef: TemplateRef<T
|
|
|
58
62
|
|
|
59
63
|
return {
|
|
60
64
|
isAtStart,
|
|
61
|
-
isAtEnd
|
|
65
|
+
isAtEnd,
|
|
66
|
+
isAtLeft,
|
|
67
|
+
isAtRight
|
|
62
68
|
};
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
export type UseScrollEdgesReturn = {
|
|
66
72
|
readonly isAtStart: Ref<boolean>;
|
|
67
73
|
readonly isAtEnd: Ref<boolean>;
|
|
74
|
+
readonly isAtLeft: Ref<boolean>;
|
|
75
|
+
readonly isAtRight: Ref<boolean>;
|
|
68
76
|
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"composable-Cp0PgZry.js","names":["unrefTemplateElement","unrefTemplateElement","FOCUS_TRAP_LOCKS","unrefTemplateElement","useFocusTrapLock","unrefTemplateElement","getFocusableElements","FOCUS_TRAP_LOCKS","getFocusableElements","getBidirectionalFocusElement","getFocusableElement"],"sources":["../src/composable/useCalendar.ts","../src/composable/useCalendarMonthSwitcher.ts","../src/composable/useCalendarTimeGrid.ts","../src/composable/useCalendarYearSwitcher.ts","../src/composable/useKeyboardGrab.ts","../src/composable/useEventListener.ts","../src/composable/useInView.ts","../src/composable/useRemembered.ts","../src/composable/useScrollEdges.ts","../src/composable/useScrollPosition.ts","../src/composable/useFocusTrapLock.ts","../src/composable/useFocusTrapReturn.ts","../src/composable/useFocusTrap.ts","../src/composable/useFocusTrapSubscription.ts","../src/composable/useFocusZone.ts"],"sourcesContent":["import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref } from 'vue';\n\nexport default function (initialDate: DateTime, options?: UseCalendarOptions): UseCalendarReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref(initialDate);\n\n const dates = computed<DateTime[]>(() => {\n const dates: DateTime[] = [];\n const month = unref(viewDate).month;\n let current = unref(viewDate).startOf('month');\n\n do {\n dates.push(current);\n current = current.plus({day: 1});\n } while (current.month === month);\n\n const first = dates[0];\n const last = dates[dates.length - 1];\n\n for (let i = 1; i < first.weekday; ++i) {\n dates.unshift(first.minus({day: i}));\n }\n\n for (let i = last.weekday + 1; i <= 7; ++i) {\n dates.push(last.plus({day: i - last.weekday}));\n }\n\n while (dates.length / 7 < 6) {\n const last = dates[dates.length - 1];\n\n for (let i = 1; i <= 7; ++i) {\n dates.push(last.plus({day: i}));\n }\n }\n\n return dates;\n });\n\n const days = computed(() => unref(dates)\n .slice(0, 7)\n .map(d => d.toLocaleString({weekday: options?.weekDayLength ?? 'short'})));\n\n const viewDateNext = computed(() => unref(viewDate).plus({month: 1}));\n const viewDatePrevious = computed(() => unref(viewDate).minus({month: 1}));\n const viewMonth = computed(() => unref(viewDate).toLocaleString({month: options?.monthLength ?? 'long'}));\n const viewYear = computed(() => unref(viewDate).year.toString());\n\n function setViewDate(date: DateTime): void {\n isTransitioningToPast.value = viewDate.value > date;\n viewDate.value = date;\n }\n\n function nextMonth(): void {\n setViewDate(unref(viewDate).plus({month: 1}));\n }\n\n function previousMonth(): void {\n setViewDate(unref(viewDate).minus({month: 1}));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDateNext,\n viewDatePrevious,\n viewMonth,\n viewYear,\n dates,\n days,\n setViewDate,\n nextMonth,\n previousMonth\n };\n}\n\ntype UseCalendarOptions = {\n readonly monthLength?: 'short' | 'long';\n readonly weekDayLength?: 'short' | 'long';\n};\n\ntype UseCalendarReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDateNext: Ref<DateTime>;\n readonly viewDatePrevious: Ref<DateTime>;\n readonly viewMonth: Ref<string>;\n readonly viewYear: Ref<string>;\n readonly dates: Ref<DateTime[]>;\n readonly days: Ref<string[]>;\n\n setViewDate(date: DateTime): void;\n nextMonth(): void;\n previousMonth(): void;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type Ref, unref } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, displayLength: 'short' | 'long'): UseCalendarMonthSwitcherReturn {\n const months = computed(() => {\n const months: MonthEntry[] = [];\n const now = unref(currentDate);\n let current = now.startOf('year');\n\n while (current.month <= 12 && current.year === now.year) {\n months.push({\n date: current,\n label: current.toLocaleString({month: displayLength})\n });\n current = current.plus({months: 1});\n }\n\n return months;\n });\n\n return {\n months\n };\n}\n\ntype MonthEntry = {\n readonly date: DateTime;\n readonly label: string;\n};\n\ntype UseCalendarMonthSwitcherReturn = {\n readonly months: Ref<MonthEntry[]>;\n};\n","import type { DateTime } from 'luxon';\nimport { computed, type ComputedRef, type MaybeRefOrGetter, ref, type Ref, toValue, unref, watch } from 'vue';\n\nexport type UseCalendarTimeGridDayCount = 1 | 2 | 7;\n\nexport type UseCalendarTimeGridReturn = {\n readonly isTransitioningToPast: Ref<boolean>;\n readonly viewDate: Ref<DateTime>;\n readonly viewDates: ComputedRef<DateTime[]>;\n readonly rangeLabel: ComputedRef<string>;\n\n setViewDate(date: DateTime): void;\n next(): void;\n previous(): void;\n};\n\nfunction getAnchor(date: DateTime, dayCount: UseCalendarTimeGridDayCount): DateTime {\n return dayCount === 7 ? date.startOf('week') : date.startOf('day');\n}\n\nfunction stepDuration(dayCount: UseCalendarTimeGridDayCount): { day?: number; week?: number } {\n if (dayCount === 7) {\n return {week: 1};\n }\n\n if (dayCount === 2) {\n return {day: 2};\n }\n\n return {day: 1};\n}\n\nexport default function (\n initialDate: DateTime,\n dayCount: MaybeRefOrGetter<UseCalendarTimeGridDayCount>\n): UseCalendarTimeGridReturn {\n const isTransitioningToPast = ref(false);\n const viewDate = ref<DateTime>(getAnchor(initialDate, toValue(dayCount)));\n\n // Re-anchor on dayCount change (e.g. switching from week to two-days view).\n watch(() => toValue(dayCount), (count) => {\n viewDate.value = getAnchor(unref(viewDate), count);\n });\n\n const viewDates = computed<DateTime[]>(() => {\n const anchor = unref(viewDate);\n const count = toValue(dayCount);\n const out: DateTime[] = [];\n\n for (let i = 0; i < count; ++i) {\n out.push(anchor.plus({day: i}));\n }\n\n return out;\n });\n\n const rangeLabel = computed<string>(() => {\n const dates = unref(viewDates);\n const first = dates[0];\n const last = dates[dates.length - 1];\n const count = toValue(dayCount);\n\n if (count === 1) {\n return first.toLocaleString({weekday: 'long', day: 'numeric', month: 'long', year: 'numeric'});\n }\n\n const sameMonth = first.month === last.month;\n const sameYear = first.year === last.year;\n\n const firstFmt = first.toLocaleString(\n sameMonth && sameYear\n ? {weekday: 'short', day: 'numeric'}\n : {weekday: 'short', day: 'numeric', month: 'short'}\n );\n const lastFmt = last.toLocaleString({weekday: 'short', day: 'numeric', month: 'short', year: sameYear ? undefined : 'numeric'});\n\n return `${firstFmt} – ${lastFmt}`;\n });\n\n function setViewDate(date: DateTime): void {\n const anchor = getAnchor(date, toValue(dayCount));\n isTransitioningToPast.value = unref(viewDate) > anchor;\n viewDate.value = anchor;\n }\n\n function next(): void {\n setViewDate(unref(viewDate).plus(stepDuration(toValue(dayCount))));\n }\n\n function previous(): void {\n setViewDate(unref(viewDate).minus(stepDuration(toValue(dayCount))));\n }\n\n return {\n isTransitioningToPast,\n viewDate,\n viewDates,\n rangeLabel,\n setViewDate,\n next,\n previous\n };\n}\n","import type { DateTime } from 'luxon';\nimport { computed, ref, type Ref, unref, watch } from 'vue';\n\nexport default function (currentDate: Ref<DateTime>, limit: number = 10): UseCalendarYearSwitcherReturn {\n const index = ref(0);\n\n const years = computed(() => {\n const year = unref(currentDate).year;\n const years: number[] = [];\n const start = year - (year % limit) + unref(index) * limit;\n\n for (let i = 0; i < limit; ++i) {\n years.push(start + i);\n }\n\n return years;\n });\n\n function next(): void {\n ++index.value;\n }\n\n function previous(): void {\n --index.value;\n }\n\n watch(currentDate, () => index.value = 0);\n\n return {\n years,\n\n next,\n previous\n };\n}\n\ntype UseCalendarYearSwitcherReturn = {\n readonly years: Ref<number[]>;\n\n next(): void;\n previous(): void;\n};\n","import { computed, type ComputedRef, ref, type Ref, unref } from 'vue';\n\nexport type KeyboardGrabDirection = 'up' | 'down' | 'left' | 'right';\n\nexport type UseKeyboardGrabOptions<TPos> = {\n readonly isDraggable: Ref<boolean>;\n readonly itemId: Ref<string | number | null | undefined>;\n readonly grabbedId: Ref<string | number | null>;\n onGrab(): TPos;\n onMove(direction: KeyboardGrabDirection): void;\n onCommit(origin: TPos): void;\n onCancel(origin: TPos): void;\n announce?(message: string): void;\n};\n\nexport type UseKeyboardGrabReturn = {\n readonly isGrabbed: ComputedRef<boolean>;\n handleKeyDown(evt: KeyboardEvent): void;\n release(): void;\n};\n\nlet liveRegion: HTMLElement | null = null;\n\nfunction ensureLiveRegion(): HTMLElement {\n if (liveRegion) {\n return liveRegion;\n }\n\n if (typeof document === 'undefined') {\n return null as unknown as HTMLElement;\n }\n\n const region = document.createElement('div');\n region.setAttribute('role', 'status');\n region.setAttribute('aria-live', 'polite');\n region.setAttribute('aria-atomic', 'true');\n region.style.cssText = 'position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n document.body.appendChild(region);\n liveRegion = region;\n return region;\n}\n\nexport function defaultAnnounce(message: string): void {\n const region = ensureLiveRegion();\n\n if (!region) {\n return;\n }\n\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n}\n\n/**\n * Generic keyboard-grab state machine. Maps Space/Enter/Escape/Arrow keys\n * onto grab/commit/cancel/move callbacks. The actual movement logic is\n * delegated to `onMove` since it depends on the host component's topology.\n */\nexport default function useKeyboardGrab<TPos>(options: UseKeyboardGrabOptions<TPos>): UseKeyboardGrabReturn {\n const origin = ref<TPos | null>(null);\n const announce = options.announce ?? defaultAnnounce;\n\n const isGrabbed = computed<boolean>(() => {\n const id = unref(options.itemId);\n const grabbed = unref(options.grabbedId);\n\n return id != null && grabbed === id;\n });\n\n function release(): void {\n origin.value = null;\n }\n\n function handleKeyDown(evt: KeyboardEvent): void {\n if (!unref(options.isDraggable)) {\n return;\n }\n\n const id = unref(options.itemId);\n\n if (id == null) {\n return;\n }\n\n if (!isGrabbed.value) {\n if (evt.key === ' ' || evt.key === 'Enter') {\n evt.preventDefault();\n origin.value = options.onGrab() as TPos;\n }\n\n return;\n }\n\n switch (evt.key) {\n case 'ArrowUp':\n evt.preventDefault();\n options.onMove('up');\n break;\n\n case 'ArrowDown':\n evt.preventDefault();\n options.onMove('down');\n break;\n\n case 'ArrowLeft':\n evt.preventDefault();\n options.onMove('left');\n break;\n\n case 'ArrowRight':\n evt.preventDefault();\n options.onMove('right');\n break;\n\n case ' ':\n case 'Enter': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCommit(o);\n }\n\n break;\n }\n\n case 'Escape': {\n evt.preventDefault();\n const o = origin.value;\n origin.value = null;\n\n if (o !== null) {\n options.onCancel(o);\n }\n\n break;\n }\n }\n\n // Suppress unused-warning when announce is unused inside the function.\n void announce;\n }\n\n return {\n isGrabbed,\n handleKeyDown,\n release\n };\n}\n","import { watch } from 'vue';\nimport type { TemplateRef } from '../util';\n\nexport default function <K extends keyof HTMLElementEventMap>(elementRef: TemplateRef<HTMLElement>, eventName: K, listener: (evt: HTMLElementEventMap[K]) => any, options: AddEventListenerOptions = {passive: true}): void {\n watch(elementRef, (element: HTMLElement, _, onCleanup) => {\n if (!element) {\n return;\n }\n\n element.addEventListener(eventName, listener, options);\n\n onCleanup(() => element.removeEventListener(eventName, listener));\n }, {immediate: true});\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(containerRef: TemplateRef<TElement>, options: UseInViewOptions = {}): Ref<boolean> {\n const inView = ref(options.initial ?? false);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container) {\n return;\n }\n\n const observer = new IntersectionObserver(entries => inView.value = entries[0]?.isIntersecting ?? false, options);\n observer.observe(container);\n\n onCleanup(() => observer.disconnect());\n }, {immediate: true});\n\n return inView;\n}\n\ntype UseInViewOptions = IntersectionObserverInit & {\n readonly initial?: boolean;\n};\n","import { DateTime } from 'luxon';\nimport { ref, type Ref, watch } from 'vue';\n\nexport default function <T>(key: string, initialValue: T): Ref<T> {\n const realKey = `flux/${key}`;\n const value = ref<T>(get() ?? initialValue);\n\n function get(): T | null {\n if (realKey in localStorage) {\n let storageValue = JSON.parse(localStorage.getItem(realKey)!);\n\n if (Array.isArray(storageValue) && storageValue[0] === 'DateTime') {\n storageValue = DateTime.fromISO(storageValue[1]);\n }\n\n return storageValue;\n }\n\n return null;\n }\n\n watch(value, value => {\n let _value: T = value as T;\n\n if (DateTime.isDateTime(value)) {\n _value = ['DateTime', value.toISO({\n includeOffset: true,\n extendedZone: true\n })] as unknown as T;\n }\n\n localStorage.setItem(realKey, JSON.stringify(_value));\n });\n\n return value as Ref<T>;\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function <TElement extends HTMLElement>(elementRef: TemplateRef<TElement>): UseScrollEdgesReturn {\n const isAtStart = ref(true);\n const isAtEnd = ref(true);\n\n watch(elementRef, (_, __, onCleanup) => {\n const element = unrefTemplateElement(elementRef);\n\n if (!element) {\n return;\n }\n\n const update = (): void => {\n const {scrollTop, scrollHeight, clientHeight} = element;\n\n isAtStart.value = scrollTop <= 0;\n isAtEnd.value = Math.ceil(scrollTop + clientHeight) >= scrollHeight;\n };\n\n const resizeObserver = new ResizeObserver(update);\n resizeObserver.observe(element);\n\n for (const child of Array.from(element.children)) {\n resizeObserver.observe(child);\n }\n\n const mutationObserver = new MutationObserver(mutations => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node instanceof Element) {\n resizeObserver.observe(node);\n }\n }\n\n for (const node of Array.from(mutation.removedNodes)) {\n if (node instanceof Element) {\n resizeObserver.unobserve(node);\n }\n }\n }\n\n update();\n });\n\n mutationObserver.observe(element, {childList: true});\n element.addEventListener('scroll', update, {passive: true});\n\n update();\n\n onCleanup(() => {\n element.removeEventListener('scroll', update);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n });\n }, {immediate: true});\n\n return {\n isAtStart,\n isAtEnd\n };\n}\n\nexport type UseScrollEdgesReturn = {\n readonly isAtStart: Ref<boolean>;\n readonly isAtEnd: Ref<boolean>;\n};\n","import { ref, type Ref, unref } from 'vue';\nimport type { TemplateRef } from '../util';\nimport useEventListener from './useEventListener';\n\nexport default function <TElement extends HTMLElement>(elementRef?: TemplateRef<TElement>): UseScrollPositionReturn {\n const x = ref(0);\n const y = ref(0);\n\n if (!elementRef) {\n elementRef = ref(document);\n }\n\n useEventListener(elementRef, 'scroll', () => {\n let element = unref(elementRef);\n\n if (element instanceof Document) {\n element = element.scrollingElement;\n }\n\n x.value = element?.scrollLeft ?? 0;\n y.value = element?.scrollTop ?? 0;\n });\n\n return {\n x,\n y\n };\n}\n\nexport type UseScrollPositionReturn = {\n readonly x: Ref<number>;\n readonly y: Ref<number>;\n};\n","import { onMounted, onUnmounted, ref, type Ref, unref } from 'vue';\nimport { FOCUS_TRAP_LOCKS } from '../util';\n\nlet lockId = 0;\n\nexport default function (autoFocus: boolean = false): Ref<boolean> {\n const id = ref(`focus-trap-${++lockId}`);\n const enabled = ref(false);\n\n onMounted(() => FOCUS_TRAP_LOCKS.add(unref(id), isEnabled => enabled.value = isEnabled, autoFocus));\n onUnmounted(() => FOCUS_TRAP_LOCKS.remove(unref(id)));\n\n return enabled;\n}\n","import { type Ref, unref, watch } from 'vue';\nimport { type TemplateRef, unrefTemplateElement } from '../util';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, disabled: Ref<boolean>): void {\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n\n if (!container || unref(disabled)) {\n return;\n }\n\n const previousTarget = document.activeElement as HTMLElement | null;\n\n onCleanup(() => {\n requestAnimationFrame(() => previousTarget?.focus());\n });\n });\n}\n","import { ref, type Ref, watch } from 'vue';\nimport { getFocusableElements, isSSR, type TemplateRef, unrefTemplateElement, wrapFocus } from '../util';\nimport useFocusTrapLock from './useFocusTrapLock';\nimport useFocusTrapReturn from './useFocusTrapReturn';\n\nexport default function (containerRef: TemplateRef<HTMLElement>, options: UseFocusTrapOptions = {}): void {\n if (isSSR) {\n return;\n }\n\n const {disable = ref(false), disableReturn = ref(false), attachTo = null} = options;\n const enabled = useFocusTrapLock(!disable);\n\n useFocusTrapReturn(containerRef, disableReturn);\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unrefTemplateElement(containerRef);\n const attach = attachTo || document;\n\n if (enabled.value && container && document.activeElement && !container.contains(document.activeElement) && !container.querySelector('[autofocus]')) {\n wrapFocus(container, document.activeElement, true);\n }\n\n function onFocusIn(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n evt.preventDefault();\n evt.stopImmediatePropagation();\n\n wrapFocus(container, newFocusElement);\n }\n\n function onFocusOut(evt: FocusEvent): void {\n if (!enabled.value || !container) {\n return;\n }\n\n if (!evt.relatedTarget || evt.relatedTarget === document.body) {\n evt.preventDefault();\n container.focus();\n }\n\n const newFocusElement = (evt.target as HTMLElement | null) || document.body;\n\n if (container.contains(newFocusElement)) {\n return;\n }\n\n wrapFocus(container, newFocusElement);\n }\n\n attach.addEventListener('focusin', onFocusIn as EventListener, {capture: true});\n attach.addEventListener('focusout', onFocusOut as EventListener, {capture: true});\n\n if (container) {\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.hasAttribute('aria-disabled'));\n let element = elements[0];\n\n if (isActiveIndex > -1) {\n element = elements[isActiveIndex];\n }\n\n if (notDisabledIndex > -1) {\n element = elements[notDisabledIndex];\n }\n\n if (element) {\n element.focus();\n }\n }\n\n onCleanup(() => {\n attach.removeEventListener('focusin', onFocusIn as EventListener);\n attach.removeEventListener('focusout', onFocusOut as EventListener);\n });\n }, {immediate: true});\n\n watch(() => disable, () => {\n const container = unrefTemplateElement(containerRef);\n enabled.value = !disable;\n\n if (disable || !container) {\n return;\n }\n\n const elements = getFocusableElements(container as HTMLElement);\n\n if (elements.includes(document.activeElement as HTMLElement)) {\n return;\n }\n\n elements[0]?.focus();\n }, {immediate: true});\n}\n\ntype UseFocusTrapOptions = {\n attachTo?: HTMLElement | Document;\n disable?: Ref<boolean>;\n disableReturn?: Ref<boolean>;\n};\n","import { onMounted, onUnmounted, ref } from 'vue';\nimport { FOCUS_TRAP_LOCKS, type FocusTrapListener } from '../util';\n\nexport default function (listener: FocusTrapListener): void {\n const unsubscribe = ref<Function | null>(null);\n\n onMounted(() => unsubscribe.value = FOCUS_TRAP_LOCKS.subscribe(listener));\n onUnmounted(() => unsubscribe.value?.());\n}\n","import { unwrapElement, useMutationObserver } from '@basmilius/common';\nimport { type ComponentPublicInstance, type Ref, watch } from 'vue';\nimport { getBidirectionalFocusElement, getFocusableElement, getFocusableElements } from '../util';\n\ntype EligibleElement = ComponentPublicInstance | HTMLElement;\n\nexport default function <TElement extends EligibleElement>(containerRef: Ref<TElement>, {cycle = true, direction = 'bidirectional'}: UseFocusZoneOptions = {}): void {\n useMutationObserver(containerRef, () => updateFocus(findInitialIndex(), false));\n\n function findInitialIndex(): number {\n const container = unwrapElement(containerRef);\n const elements = getFocusableElements(container);\n const isActiveIndex = elements.findIndex(e => e.classList.contains('is-active'));\n const notDisabledIndex = elements.findIndex(e => !e.hasAttribute('aria-disabled'));\n\n if (isActiveIndex > -1) {\n return isActiveIndex;\n }\n\n if (notDisabledIndex > -1) {\n return notDisabledIndex;\n }\n\n return 0;\n }\n\n function updateFocus(elementIndex: number, doFocus: boolean = true): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n elements.forEach((elm, index) => elm.tabIndex = index === elementIndex ? 0 : -1);\n\n doFocus && elements[elementIndex]?.focus();\n }\n\n function onKeyDown(evt: KeyboardEvent): void {\n const container = unwrapElement(containerRef)!;\n const elements = getFocusableElements(container);\n\n if (['Enter', ' '].includes(evt.key)) {\n return;\n }\n\n switch (direction) {\n case 'bidirectional':\n handleBidirectionalFocus(evt, container, elements, updateFocus);\n break;\n\n case 'horizontal':\n case 'vertical':\n handleDirectionalFocus(evt, container, cycle, direction, elements, updateFocus);\n break;\n }\n }\n\n watch(containerRef, (_, __, onCleanup) => {\n const container = unwrapElement(containerRef);\n\n if (!container) {\n return;\n }\n\n container.addEventListener('keydown', onKeyDown);\n\n updateFocus(findInitialIndex(), false);\n\n onCleanup(() => container.removeEventListener('keydown', onKeyDown));\n }, {immediate: true});\n}\n\nfunction handleBidirectionalFocus(evt: KeyboardEvent, container: HTMLElement, elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: 'up' | 'down' | 'left' | 'right';\n\n switch (evt.key) {\n case 'ArrowUp':\n dir = 'up';\n break;\n\n case 'ArrowDown':\n dir = 'down';\n break;\n\n case 'ArrowLeft':\n dir = 'left';\n break;\n\n case 'ArrowRight':\n dir = 'right';\n break;\n\n default:\n return;\n }\n\n const element = getBidirectionalFocusElement(container, document.activeElement as HTMLElement, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n }\n\n evt.preventDefault();\n}\n\nfunction handleDirectionalFocus(evt: KeyboardEvent, container: HTMLElement, cycle: boolean, direction: 'horizontal' | 'vertical', elements: HTMLElement[], updateFocus: (index: number) => void): void {\n let dir: number;\n\n if (evt.key === (direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp')) {\n dir = -1;\n } else if (evt.key === (direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown')) {\n dir = 1;\n } else {\n return;\n }\n\n const element = getFocusableElement(container, dir);\n\n if (element) {\n updateFocus(elements.indexOf(element));\n } else if (cycle) {\n updateFocus(dir === 1 ? 0 : elements.length - 1);\n }\n\n evt.preventDefault();\n}\n\ntype UseFocusZoneOptions = {\n readonly cycle?: boolean;\n readonly direction?: 'bidirectional' | 'horizontal' | 'vertical';\n};\n"],"mappings":"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"}
|