UNPKG

react-aria

Version:
1 lines 5.8 kB
{"mappings":";;;;;AAAA;;;;;;;;;;CAUC;;;;AA6BM,SAAS,0CACd,KAAgC,EAChC,KAAyB,EACzB,GAAuC;IAEvC,IAAI,kBAAC,iBAAiB,UAAU,GAAG,YAAW,GAAG;IACjD,IAAI,MAAM,CAAA,GAAA,yCAAc,EAAE,YAAY;IAEtC,6EAA6E;IAC7E,iDAAiD;IACjD,iDAAiD;IACjD,iFAAiF;IACjF,gFAAgF;IAChF,iEAAiE;IACjE,IAAI,iBAAiB,CAAA,GAAA,aAAK,EAAE;IAC5B,IAAI,YAAY,CAAA,GAAA,aAAK,EAAE,OAAO,WAAW,cAAc,SAAS;IAChE,CAAA,GAAA,yCAAO,EAAE,WAAW,eAAe,CAAA;QACjC,eAAe,OAAO,GAAG,EAAE,KAAK,KAAK,KAAK,EAAE,MAAM,KAAK;IACzD;IAEA,MAAM,wBAAwB;QAC5B,OAAO,IAAM,MAAM,cAAc;QACjC,OAAO,IAAM,MAAM,aAAa,CAAC;QACjC,QAAQ,IAAM,MAAM,eAAe;IACrC;IAEA,mHAAmH;IACnH,sEAAsE;IACtE,IAAI,cAAc,CAAC;QACjB,IAAI,eAAe,OAAO,EAAE;YAC1B,eAAe,OAAO,GAAG;YACzB;QACF;QAEA,MAAM,WAAW,CAAC;QAClB,IAAI,CAAC,MAAM,UAAU,EACnB;QAGF,IAAI,SAAS,EAAE,MAAM;QACrB,IACE,IAAI,OAAO,IACX,CAAA,GAAA,yCAAY,EAAE,IAAI,OAAO,KACxB,CAAA,CAAC,CAAA,GAAA,yCAAW,EAAE,IAAI,OAAO,EAAE,WAAW,CAAC,OAAO,OAAO,CAAC,0BAAyB,GAEhF,qBAAqB,CAAC,eAAe;IAEzC;IAEA,CAAA,GAAA,yCAAO,EAAE,WAAW,aAAa;IAEjC,iEAAiE;IACjE,uCAAuC;IACvC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAA;QACzB,IAAI,CAAC,IAAI,OAAO,EACd;QAGF,IAAI,AAAC,CAAA,CAAC,EAAE,aAAa,IAAI,CAAC,CAAA,GAAA,yCAAW,EAAE,IAAI,OAAO,EAAE,EAAE,aAAa,CAAA,KAAM,MAAM,UAAU,EACvF,qBAAqB,CAAC,eAAe;IAEzC;IAEA,yCAAyC;IACzC,CAAA,GAAA,yCAAO,EACL,KACA,aACA,CAAA;QACE,IAAI,MAAM,UAAU,EAClB,EAAE,cAAc;IAEpB,GACA;QAAC,SAAS;QAAO,SAAS;IAAI;IAGhC,OAAO;AACT","sources":["packages/react-aria/src/calendar/useRangeCalendar.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {AriaLabelingProps, DOMProps, FocusableElement, RefObject} from '@react-types/shared';\nimport {CalendarAria, useCalendarBase} from './useCalendarBase';\nimport {DateValue, RangeCalendarState} from 'react-stately/useRangeCalendarState';\nimport {isFocusWithin, nodeContains} from '../utils/shadowdom/DOMFunctions';\nimport {RangeCalendarProps} from 'react-stately/useRangeCalendarState';\nimport {useEvent} from '../utils/useEvent';\nimport {useRef} from 'react';\n\nexport interface AriaRangeCalendarProps<T extends DateValue>\n extends RangeCalendarProps<T>, DOMProps, AriaLabelingProps {\n /**\n * Controls the behavior when a pointer is released outside the calendar or a blur occurs mid\n * selection:\n *\n * - `clear`: clear the currently selected range of dates.\n * - `reset`: reset the selection to the previously selected range of dates.\n * - `select`: select the currently hovered range of dates.\n *\n * @default 'select'\n */\n commitBehavior?: 'clear' | 'reset' | 'select';\n}\n\n/**\n * Provides the behavior and accessibility implementation for a range calendar component. A range\n * calendar displays one or more date grids and allows users to select a contiguous range of dates.\n */\nexport function useRangeCalendar<T extends DateValue>(\n props: AriaRangeCalendarProps<T>,\n state: RangeCalendarState,\n ref: RefObject<FocusableElement | null>\n): CalendarAria {\n let {commitBehavior = 'select', ...otherProps} = props;\n let res = useCalendarBase(otherProps, state);\n\n // We need to ignore virtual pointer events from VoiceOver due to these bugs.\n // https://bugs.webkit.org/show_bug.cgi?id=222627\n // https://bugs.webkit.org/show_bug.cgi?id=223202\n // usePress also does this and waits for the following click event before firing.\n // We need to match that here otherwise this will fire before the press event in\n // useCalendarCell, causing range selection to not work properly.\n let isVirtualClick = useRef(false);\n let windowRef = useRef(typeof window !== 'undefined' ? window : null);\n useEvent(windowRef, 'pointerdown', e => {\n isVirtualClick.current = e.width === 0 && e.height === 0;\n });\n\n const commitBehaviorMapping = {\n clear: () => state.clearSelection(),\n reset: () => state.setAnchorDate(null),\n select: () => state.commitSelection()\n };\n\n // Execute method corresponding to `commitBehavior` when pressing or releasing a pointer outside the calendar body,\n // except when pressing the next or previous buttons to switch months.\n let endDragging = (e: PointerEvent) => {\n if (isVirtualClick.current) {\n isVirtualClick.current = false;\n return;\n }\n\n state.setDragging(false);\n if (!state.anchorDate) {\n return;\n }\n\n let target = e.target as Element;\n if (\n ref.current &&\n isFocusWithin(ref.current) &&\n (!nodeContains(ref.current, target) || !target.closest('button, [role=\"button\"]'))\n ) {\n commitBehaviorMapping[commitBehavior]();\n }\n };\n\n useEvent(windowRef, 'pointerup', endDragging);\n\n // Also execute method corresponding to `commitBehavior` on blur,\n // e.g. tabbing away from the calendar.\n res.calendarProps.onBlur = e => {\n if (!ref.current) {\n return;\n }\n\n if ((!e.relatedTarget || !nodeContains(ref.current, e.relatedTarget)) && state.anchorDate) {\n commitBehaviorMapping[commitBehavior]();\n }\n };\n\n // Prevent touch scrolling while dragging\n useEvent(\n ref,\n 'touchmove',\n e => {\n if (state.isDragging) {\n e.preventDefault();\n }\n },\n {passive: false, capture: true}\n );\n\n return res;\n}\n"],"names":[],"version":3,"file":"useRangeCalendar.mjs.map"}