@activecollab/components 2.0.504 → 2.0.505
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/cjs/components/DockedCard/useDockedCard.js +21 -4
- package/dist/cjs/components/DockedCard/useDockedCard.js.map +1 -1
- package/dist/esm/components/DockedCard/useDockedCard.d.ts.map +1 -1
- package/dist/esm/components/DockedCard/useDockedCard.js +16 -2
- package/dist/esm/components/DockedCard/useDockedCard.js.map +1 -1
- package/dist/index.js +21 -4
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -133,7 +133,7 @@ var useDockedCard = exports.useDockedCard = function useDockedCard(_ref) {
|
|
|
133
133
|
return observer.disconnect();
|
|
134
134
|
};
|
|
135
135
|
}, [findScroller]);
|
|
136
|
-
(0, _react.
|
|
136
|
+
var measureTopLimit = (0, _react.useCallback)(function () {
|
|
137
137
|
var _latest$current$getTo, _latest$current;
|
|
138
138
|
var scroller = findScroller();
|
|
139
139
|
var limit = (_latest$current$getTo = (_latest$current = latest.current).getTopLimit) === null || _latest$current$getTo === void 0 ? void 0 : _latest$current$getTo.call(_latest$current);
|
|
@@ -143,7 +143,24 @@ var useDockedCard = exports.useDockedCard = function useDockedCard(_ref) {
|
|
|
143
143
|
}
|
|
144
144
|
var scrollerTop = scroller === getDocumentScroller() ? 0 : scroller.getBoundingClientRect().top;
|
|
145
145
|
setTopLimit(Math.max(0, Math.round(limit.getBoundingClientRect().bottom - scrollerTop)));
|
|
146
|
-
}, [
|
|
146
|
+
}, [enabled, findScroller]);
|
|
147
|
+
(0, _react.useLayoutEffect)(measureTopLimit, [open, viewHeight, measureTopLimit]);
|
|
148
|
+
|
|
149
|
+
// The limit element can grow after the first measure, such as a title that wraps to a second line.
|
|
150
|
+
(0, _react.useEffect)(function () {
|
|
151
|
+
var _latest$current$getTo2, _latest$current2;
|
|
152
|
+
var limit = enabled ? (_latest$current$getTo2 = (_latest$current2 = latest.current).getTopLimit) === null || _latest$current$getTo2 === void 0 ? void 0 : _latest$current$getTo2.call(_latest$current2) : null;
|
|
153
|
+
if (!limit || typeof ResizeObserver === "undefined") {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// eslint-disable-next-line compat/compat
|
|
158
|
+
var observer = new ResizeObserver(measureTopLimit);
|
|
159
|
+
observer.observe(limit);
|
|
160
|
+
return function () {
|
|
161
|
+
return observer.disconnect();
|
|
162
|
+
};
|
|
163
|
+
}, [enabled, open, measureTopLimit]);
|
|
147
164
|
|
|
148
165
|
// A menu, a list or a dialog above the card takes its own Escape.
|
|
149
166
|
(0, _react.useEffect)(function () {
|
|
@@ -151,11 +168,11 @@ var useDockedCard = exports.useDockedCard = function useDockedCard(_ref) {
|
|
|
151
168
|
return undefined;
|
|
152
169
|
}
|
|
153
170
|
var handleKeyDown = function handleKeyDown(event) {
|
|
154
|
-
var _target$closest, _latest$current$isBus, _latest$current$isBus2, _latest$
|
|
171
|
+
var _target$closest, _latest$current$isBus, _latest$current$isBus2, _latest$current3;
|
|
155
172
|
var card = cardRef.current;
|
|
156
173
|
var target = event.target;
|
|
157
174
|
var isOwn = target === document.body || ((_target$closest = target.closest) === null || _target$closest === void 0 ? void 0 : _target$closest.call(target, ".c-window")) === (card === null || card === void 0 ? void 0 : card.closest(".c-window"));
|
|
158
|
-
var busy = card ? (_latest$current$isBus = (_latest$current$isBus2 = (_latest$
|
|
175
|
+
var busy = card ? (_latest$current$isBus = (_latest$current$isBus2 = (_latest$current3 = latest.current).isBusy) === null || _latest$current$isBus2 === void 0 ? void 0 : _latest$current$isBus2.call(_latest$current3, card)) !== null && _latest$current$isBus !== void 0 ? _latest$current$isBus : false : false;
|
|
159
176
|
if (event.key === "Escape" && !event.defaultPrevented && isOwn && !busy) {
|
|
160
177
|
var _latest$current$onEsc;
|
|
161
178
|
event.preventDefault();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDockedCard.js","names":["_react","require","_reactDom","_slicedToArray","r","e","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","t","toString","call","slice","constructor","name","Array","from","test","length","n","l","Symbol","iterator","i","u","f","o","next","Object","done","push","value","return","isArray","getDocumentScroller","document","scrollingElement","documentElement","getScrollParent","exports","node","element","parentElement","body","_window$getComputedSt","window","getComputedStyle","overflowY","isDocumentScroller","useDockedCard","_ref","cardRef","open","onOpenChange","_ref$enabled","enabled","_ref$duration","duration","_ref$peek","peek","getTopLimit","onEscape","isBusy","scrollerRef","useRef","dimNodeRef","timerRef","_useState","useState","_useState2","viewHeight","setViewHeight","_useState3","_useState4","cardHeight","setCardHeight","_useState5","_useState6","topLimit","setTopLimit","_useState7","_useState8","moving","setMoving","latest","current","findScroller","useCallback","_scrollerRef$current","setOpen","_dimNodeRef$current","_dimNodeRef$current$a","animate","opacity","fill","clearTimeout","setTimeout","useEffect","scroller","isDocument","measure","innerHeight","clientHeight","ResizeObserver","undefined","observer","observe","disconnect","useLayoutEffect","_latest$current$getTo","_latest$current","limit","scrollerTop","getBoundingClientRect","top","Math","max","round","bottom","handleKeyDown","event","_target$closest","_latest$current$isBus","_latest$current$isBus2","_latest$current2","card","target","isOwn","closest","busy","key","defaultPrevented","_latest$current$onEsc","preventDefault","stopPropagation","addEventListener","removeEventListener","dimRef","_node$animate","_cardRef$current$offs","_cardRef$current","offsetHeight","flushSync","frozen","previous","style","overflow","lifted","offset"],"sources":["../../../../src/components/DockedCard/useDockedCard.ts"],"sourcesContent":["import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\nconst getDocumentScroller = () =>\n (document.scrollingElement || document.documentElement) as HTMLElement;\n\n/** The closest ancestor that scrolls. The full page scrolls the document. */\nexport const getScrollParent = (node?: Element | null): HTMLElement => {\n let element = node?.parentElement;\n\n while (element && element !== document.body) {\n const { overflowY } = window.getComputedStyle(element);\n\n if (overflowY === \"auto\" || overflowY === \"scroll\") {\n return element;\n }\n\n element = element.parentElement;\n }\n\n return getDocumentScroller();\n};\n\nconst isDocumentScroller = (element: HTMLElement) =>\n element === document.scrollingElement || element === document.documentElement;\n\nexport interface UseDockedCardOptions {\n cardRef: RefObject<HTMLElement>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Set to false where the card is not docked. It then never opens and has no top limit. */\n enabled?: boolean;\n /** The time of the move, in milliseconds. */\n duration?: number;\n /** The height of the closed card that stays above the edge, in pixels. */\n peek?: number;\n /** The element whose bottom edge the open card must not pass. */\n getTopLimit?: () => Element | null | undefined;\n /** Called on Escape while the card is open. Without it Escape closes the card. */\n onEscape?: () => void;\n /** True while something in the card, such as an open menu, must take Escape itself. */\n isBusy?: (card: HTMLElement) => boolean;\n}\n\n/** The moves of a docked card: its offset, its open state, the dim, the Escape key and the frozen scroll. */\nexport const useDockedCard = ({\n cardRef,\n open,\n onOpenChange,\n enabled = true,\n duration = 200,\n peek = 0,\n getTopLimit,\n onEscape,\n isBusy,\n}: UseDockedCardOptions) => {\n const scrollerRef = useRef<HTMLElement | null>(null);\n const dimNodeRef = useRef<HTMLElement | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const [viewHeight, setViewHeight] = useState(0);\n const [cardHeight, setCardHeight] = useState(0);\n const [topLimit, setTopLimit] = useState(0);\n const [moving, setMoving] = useState(false);\n const latest = useRef({\n enabled,\n onOpenChange,\n onEscape,\n isBusy,\n getTopLimit,\n });\n\n latest.current = { enabled, onOpenChange, onEscape, isBusy, getTopLimit };\n\n // Found once: a frozen scroller has no scroll in its style, so a later search would miss it.\n const findScroller = useCallback(() => {\n scrollerRef.current =\n scrollerRef.current ?? getScrollParent(cardRef.current);\n\n return scrollerRef.current;\n }, [cardRef]);\n\n // The card moves with a transition only when it opens or closes, not when its content changes its height.\n const setOpen = useCallback(\n (next: boolean) => {\n if (!latest.current.enabled) {\n return;\n }\n\n if (!next) {\n dimNodeRef.current?.animate?.([{ opacity: 1 }, { opacity: 0 }], {\n duration,\n fill: \"forwards\",\n });\n }\n\n clearTimeout(timerRef.current);\n setMoving(true);\n latest.current.onOpenChange(next);\n timerRef.current = setTimeout(() => setMoving(false), duration + 50);\n },\n [duration]\n );\n\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n useEffect(() => {\n const scroller = findScroller();\n const isDocument = isDocumentScroller(scroller);\n const measure = () =>\n setViewHeight(isDocument ? window.innerHeight : scroller.clientHeight);\n\n measure();\n\n if (typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(measure);\n\n observer.observe(isDocument ? document.documentElement : scroller);\n\n return () => observer.disconnect();\n }, [findScroller]);\n\n useLayoutEffect(() => {\n const scroller = findScroller();\n const limit = latest.current.getTopLimit?.();\n\n if (!enabled || !scroller || !limit) {\n setTopLimit(0);\n\n return;\n }\n\n const scrollerTop =\n scroller === getDocumentScroller()\n ? 0\n : scroller.getBoundingClientRect().top;\n\n setTopLimit(\n Math.max(\n 0,\n Math.round(limit.getBoundingClientRect().bottom - scrollerTop)\n )\n );\n }, [open, enabled, viewHeight, findScroller]);\n\n // A menu, a list or a dialog above the card takes its own Escape.\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const card = cardRef.current;\n const target = event.target as Element;\n const isOwn =\n target === document.body ||\n target.closest?.(\".c-window\") === card?.closest(\".c-window\");\n const busy = card ? latest.current.isBusy?.(card) ?? false : false;\n\n if (event.key === \"Escape\" && !event.defaultPrevented && isOwn && !busy) {\n event.preventDefault();\n event.stopPropagation();\n (latest.current.onEscape ?? (() => setOpen(false)))();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [open, cardRef, setOpen]);\n\n const dimRef = useCallback(\n (node: HTMLElement | null) => {\n dimNodeRef.current = node;\n node?.animate?.([{ opacity: 0 }, { opacity: 1 }], duration);\n },\n [duration]\n );\n\n // The height places the card, so each render reads it before the paint. The observer covers what comes in later.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n setCardHeight(cardRef.current?.offsetHeight ?? 0);\n });\n\n useLayoutEffect(() => {\n const card = cardRef.current;\n\n if (!card || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(() =>\n flushSync(() => setCardHeight(card.offsetHeight))\n );\n\n observer.observe(card);\n\n return () => observer.disconnect();\n }, [cardRef]);\n\n // The page does not scroll under the open card.\n const frozen = open || moving;\n\n useEffect(() => {\n if (!frozen) {\n return undefined;\n }\n\n const scroller = findScroller();\n const previous = scroller.style.overflow;\n\n scroller.style.overflow = \"hidden\";\n\n return () => {\n scroller.style.overflow = previous;\n };\n }, [frozen, findScroller]);\n\n return {\n setOpen,\n moving,\n /** The card and its dim cover the page while the card is open or on its way. */\n lifted: frozen,\n /** The height of the scroll container. */\n viewHeight,\n /** The bottom edge of the limit element, from the top of the scroll container. Zero with no limit. */\n topLimit,\n cardHeight,\n /** How far the closed card stands under the edge. */\n offset: Math.max(0, cardHeight - peek),\n dimRef,\n findScroller,\n };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAQA,IAAAC,SAAA,GAAAD,OAAA;AAAsC,SAAAE,eAAAC,CAAA,EAAAC,CAAA,WAAAC,eAAA,CAAAF,CAAA,KAAAG,qBAAA,CAAAH,CAAA,EAAAC,CAAA,KAAAG,2BAAA,CAAAJ,CAAA,EAAAC,CAAA,KAAAI,gBAAA;AAAA,SAAAA,iBAAA,cAAAC,SAAA;AAAA,SAAAF,4BAAAJ,CAAA,EAAAO,CAAA,QAAAP,CAAA,2BAAAA,CAAA,SAAAQ,iBAAA,CAAAR,CAAA,EAAAO,CAAA,OAAAE,CAAA,MAAAC,QAAA,CAAAC,IAAA,CAAAX,CAAA,EAAAY,KAAA,6BAAAH,CAAA,IAAAT,CAAA,CAAAa,WAAA,KAAAJ,CAAA,GAAAT,CAAA,CAAAa,WAAA,CAAAC,IAAA,aAAAL,CAAA,cAAAA,CAAA,GAAAM,KAAA,CAAAC,IAAA,CAAAhB,CAAA,oBAAAS,CAAA,+CAAAQ,IAAA,CAAAR,CAAA,IAAAD,iBAAA,CAAAR,CAAA,EAAAO,CAAA;AAAA,SAAAC,kBAAAR,CAAA,EAAAO,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAP,CAAA,CAAAkB,MAAA,MAAAX,CAAA,GAAAP,CAAA,CAAAkB,MAAA,YAAAjB,CAAA,MAAAkB,CAAA,GAAAJ,KAAA,CAAAR,CAAA,GAAAN,CAAA,GAAAM,CAAA,EAAAN,CAAA,IAAAkB,CAAA,CAAAlB,CAAA,IAAAD,CAAA,CAAAC,CAAA,UAAAkB,CAAA;AAAA,SAAAhB,sBAAAH,CAAA,EAAAoB,CAAA,QAAAX,CAAA,WAAAT,CAAA,gCAAAqB,MAAA,IAAArB,CAAA,CAAAqB,MAAA,CAAAC,QAAA,KAAAtB,CAAA,4BAAAS,CAAA,QAAAR,CAAA,EAAAkB,CAAA,EAAAI,CAAA,EAAAC,CAAA,EAAAjB,CAAA,OAAAkB,CAAA,OAAAC,CAAA,iBAAAH,CAAA,IAAAd,CAAA,GAAAA,CAAA,CAAAE,IAAA,CAAAX,CAAA,GAAA2B,IAAA,QAAAP,CAAA,QAAAQ,MAAA,CAAAnB,CAAA,MAAAA,CAAA,UAAAgB,CAAA,uBAAAA,CAAA,IAAAxB,CAAA,GAAAsB,CAAA,CAAAZ,IAAA,CAAAF,CAAA,GAAAoB,IAAA,MAAAtB,CAAA,CAAAuB,IAAA,CAAA7B,CAAA,CAAA8B,KAAA,GAAAxB,CAAA,CAAAW,MAAA,KAAAE,CAAA,GAAAK,CAAA,iBAAAzB,CAAA,IAAA0B,CAAA,OAAAP,CAAA,GAAAnB,CAAA,yBAAAyB,CAAA,YAAAhB,CAAA,CAAAuB,MAAA,KAAAR,CAAA,GAAAf,CAAA,CAAAuB,MAAA,IAAAJ,MAAA,CAAAJ,CAAA,MAAAA,CAAA,2BAAAE,CAAA,QAAAP,CAAA,aAAAZ,CAAA;AAAA,SAAAL,gBAAAF,CAAA,QAAAe,KAAA,CAAAkB,OAAA,CAAAjC,CAAA,UAAAA,CAAA;AAEtC,IAAMkC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAA;EAAA,OACtBC,QAAQ,CAACC,gBAAgB,IAAID,QAAQ,CAACE,eAAe;AAAA,CAAgB;;AAExE;AACO,IAAMC,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG,SAAlBA,eAAeA,CAAIE,IAAqB,EAAkB;EACrE,IAAIC,OAAO,GAAGD,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEE,aAAa;EAEjC,OAAOD,OAAO,IAAIA,OAAO,KAAKN,QAAQ,CAACQ,IAAI,EAAE;IAC3C,IAAAC,qBAAA,GAAsBC,MAAM,CAACC,gBAAgB,CAACL,OAAO,CAAC;MAA9CM,SAAS,GAAAH,qBAAA,CAATG,SAAS;IAEjB,IAAIA,SAAS,KAAK,MAAM,IAAIA,SAAS,KAAK,QAAQ,EAAE;MAClD,OAAON,OAAO;IAChB;IAEAA,OAAO,GAAGA,OAAO,CAACC,aAAa;EACjC;EAEA,OAAOR,mBAAmB,CAAC,CAAC;AAC9B,CAAC;AAED,IAAMc,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAIP,OAAoB;EAAA,OAC9CA,OAAO,KAAKN,QAAQ,CAACC,gBAAgB,IAAIK,OAAO,KAAKN,QAAQ,CAACE,eAAe;AAAA;AAoB/E;AACO,IAAMY,aAAa,GAAAV,OAAA,CAAAU,aAAA,GAAG,SAAhBA,aAAaA,CAAAC,IAAA,EAUE;EAAA,IAT1BC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IACJC,YAAY,GAAAH,IAAA,CAAZG,YAAY;IAAAC,YAAA,GAAAJ,IAAA,CACZK,OAAO;IAAPA,OAAO,GAAAD,YAAA,cAAG,IAAI,GAAAA,YAAA;IAAAE,aAAA,GAAAN,IAAA,CACdO,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAG,GAAG,GAAAA,aAAA;IAAAE,SAAA,GAAAR,IAAA,CACdS,IAAI;IAAJA,IAAI,GAAAD,SAAA,cAAG,CAAC,GAAAA,SAAA;IACRE,WAAW,GAAAV,IAAA,CAAXU,WAAW;IACXC,QAAQ,GAAAX,IAAA,CAARW,QAAQ;IACRC,MAAM,GAAAZ,IAAA,CAANY,MAAM;EAEN,IAAMC,WAAW,GAAG,IAAAC,aAAM,EAAqB,IAAI,CAAC;EACpD,IAAMC,UAAU,GAAG,IAAAD,aAAM,EAAqB,IAAI,CAAC;EACnD,IAAME,QAAQ,GAAG,IAAAF,aAAM,EAAgC,CAAC;EACxD,IAAAG,SAAA,GAAoC,IAAAC,eAAQ,EAAC,CAAC,CAAC;IAAAC,UAAA,GAAAtE,cAAA,CAAAoE,SAAA;IAAxCG,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,IAAAG,UAAA,GAAoC,IAAAJ,eAAQ,EAAC,CAAC,CAAC;IAAAK,UAAA,GAAA1E,cAAA,CAAAyE,UAAA;IAAxCE,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,IAAAG,UAAA,GAAgC,IAAAR,eAAQ,EAAC,CAAC,CAAC;IAAAS,UAAA,GAAA9E,cAAA,CAAA6E,UAAA;IAApCE,QAAQ,GAAAD,UAAA;IAAEE,WAAW,GAAAF,UAAA;EAC5B,IAAAG,UAAA,GAA4B,IAAAZ,eAAQ,EAAC,KAAK,CAAC;IAAAa,UAAA,GAAAlF,cAAA,CAAAiF,UAAA;IAApCE,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EACxB,IAAMG,MAAM,GAAG,IAAApB,aAAM,EAAC;IACpBT,OAAO;IACPF,YAAY;IACZQ,QAAQ;IACRC,MAAM;IACNF;EACF,CAAC,CAAC;EAEFwB,MAAM,CAACC,OAAO,GAAG;IAAE9B,OAAO;IAAEF,YAAY;IAAEQ,QAAQ;IAAEC,MAAM;IAAEF;EAAY,CAAC;;EAEzE;EACA,IAAM0B,YAAY,GAAG,IAAAC,kBAAW,EAAC,YAAM;IAAA,IAAAC,oBAAA;IACrCzB,WAAW,CAACsB,OAAO,IAAAG,oBAAA,GACjBzB,WAAW,CAACsB,OAAO,cAAAG,oBAAA,cAAAA,oBAAA,GAAIlD,eAAe,CAACa,OAAO,CAACkC,OAAO,CAAC;IAEzD,OAAOtB,WAAW,CAACsB,OAAO;EAC5B,CAAC,EAAE,CAAClC,OAAO,CAAC,CAAC;;EAEb;EACA,IAAMsC,OAAO,GAAG,IAAAF,kBAAW,EACzB,UAAC5D,IAAa,EAAK;IACjB,IAAI,CAACyD,MAAM,CAACC,OAAO,CAAC9B,OAAO,EAAE;MAC3B;IACF;IAEA,IAAI,CAAC5B,IAAI,EAAE;MAAA,IAAA+D,mBAAA,EAAAC,qBAAA;MACT,CAAAD,mBAAA,GAAAzB,UAAU,CAACoB,OAAO,cAAAK,mBAAA,gBAAAC,qBAAA,GAAlBD,mBAAA,CAAoBE,OAAO,cAAAD,qBAAA,eAA3BA,qBAAA,CAAAhF,IAAA,CAAA+E,mBAAA,EAA8B,CAAC;QAAEG,OAAO,EAAE;MAAE,CAAC,EAAE;QAAEA,OAAO,EAAE;MAAE,CAAC,CAAC,EAAE;QAC9DpC,QAAQ;QACRqC,IAAI,EAAE;MACR,CAAC,CAAC;IACJ;IAEAC,YAAY,CAAC7B,QAAQ,CAACmB,OAAO,CAAC;IAC9BF,SAAS,CAAC,IAAI,CAAC;IACfC,MAAM,CAACC,OAAO,CAAChC,YAAY,CAAC1B,IAAI,CAAC;IACjCuC,QAAQ,CAACmB,OAAO,GAAGW,UAAU,CAAC;MAAA,OAAMb,SAAS,CAAC,KAAK,CAAC;IAAA,GAAE1B,QAAQ,GAAG,EAAE,CAAC;EACtE,CAAC,EACD,CAACA,QAAQ,CACX,CAAC;EAED,IAAAwC,gBAAS,EAAC;IAAA,OAAM;MAAA,OAAMF,YAAY,CAAC7B,QAAQ,CAACmB,OAAO,CAAC;IAAA;EAAA,GAAE,EAAE,CAAC;EAEzD,IAAAY,gBAAS,EAAC,YAAM;IACd,IAAMC,QAAQ,GAAGZ,YAAY,CAAC,CAAC;IAC/B,IAAMa,UAAU,GAAGnD,kBAAkB,CAACkD,QAAQ,CAAC;IAC/C,IAAME,OAAO,GAAG,SAAVA,OAAOA,CAAA;MAAA,OACX7B,aAAa,CAAC4B,UAAU,GAAGtD,MAAM,CAACwD,WAAW,GAAGH,QAAQ,CAACI,YAAY,CAAC;IAAA;IAExEF,OAAO,CAAC,CAAC;IAET,IAAI,OAAOG,cAAc,KAAK,WAAW,EAAE;MACzC,OAAOC,SAAS;IAClB;;IAEA;IACA,IAAMC,QAAQ,GAAG,IAAIF,cAAc,CAACH,OAAO,CAAC;IAE5CK,QAAQ,CAACC,OAAO,CAACP,UAAU,GAAGhE,QAAQ,CAACE,eAAe,GAAG6D,QAAQ,CAAC;IAElE,OAAO;MAAA,OAAMO,QAAQ,CAACE,UAAU,CAAC,CAAC;IAAA;EACpC,CAAC,EAAE,CAACrB,YAAY,CAAC,CAAC;EAElB,IAAAsB,sBAAe,EAAC,YAAM;IAAA,IAAAC,qBAAA,EAAAC,eAAA;IACpB,IAAMZ,QAAQ,GAAGZ,YAAY,CAAC,CAAC;IAC/B,IAAMyB,KAAK,IAAAF,qBAAA,GAAG,CAAAC,eAAA,GAAA1B,MAAM,CAACC,OAAO,EAACzB,WAAW,cAAAiD,qBAAA,uBAA1BA,qBAAA,CAAAlG,IAAA,CAAAmG,eAA6B,CAAC;IAE5C,IAAI,CAACvD,OAAO,IAAI,CAAC2C,QAAQ,IAAI,CAACa,KAAK,EAAE;MACnChC,WAAW,CAAC,CAAC,CAAC;MAEd;IACF;IAEA,IAAMiC,WAAW,GACfd,QAAQ,KAAKhE,mBAAmB,CAAC,CAAC,GAC9B,CAAC,GACDgE,QAAQ,CAACe,qBAAqB,CAAC,CAAC,CAACC,GAAG;IAE1CnC,WAAW,CACToC,IAAI,CAACC,GAAG,CACN,CAAC,EACDD,IAAI,CAACE,KAAK,CAACN,KAAK,CAACE,qBAAqB,CAAC,CAAC,CAACK,MAAM,GAAGN,WAAW,CAC/D,CACF,CAAC;EACH,CAAC,EAAE,CAAC5D,IAAI,EAAEG,OAAO,EAAEe,UAAU,EAAEgB,YAAY,CAAC,CAAC;;EAE7C;EACA,IAAAW,gBAAS,EAAC,YAAM;IACd,IAAI,CAAC7C,IAAI,EAAE;MACT,OAAOoD,SAAS;IAClB;IAEA,IAAMe,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAoB,EAAK;MAAA,IAAAC,eAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,gBAAA;MAC9C,IAAMC,IAAI,GAAG1E,OAAO,CAACkC,OAAO;MAC5B,IAAMyC,MAAM,GAAGN,KAAK,CAACM,MAAiB;MACtC,IAAMC,KAAK,GACTD,MAAM,KAAK3F,QAAQ,CAACQ,IAAI,IACxB,EAAA8E,eAAA,GAAAK,MAAM,CAACE,OAAO,cAAAP,eAAA,uBAAdA,eAAA,CAAA9G,IAAA,CAAAmH,MAAM,EAAW,WAAW,CAAC,OAAKD,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEG,OAAO,CAAC,WAAW,CAAC;MAC9D,IAAMC,IAAI,GAAGJ,IAAI,IAAAH,qBAAA,IAAAC,sBAAA,GAAG,CAAAC,gBAAA,GAAAxC,MAAM,CAACC,OAAO,EAACvB,MAAM,cAAA6D,sBAAA,uBAArBA,sBAAA,CAAAhH,IAAA,CAAAiH,gBAAA,EAAwBC,IAAI,CAAC,cAAAH,qBAAA,cAAAA,qBAAA,GAAI,KAAK,GAAG,KAAK;MAElE,IAAIF,KAAK,CAACU,GAAG,KAAK,QAAQ,IAAI,CAACV,KAAK,CAACW,gBAAgB,IAAIJ,KAAK,IAAI,CAACE,IAAI,EAAE;QAAA,IAAAG,qBAAA;QACvEZ,KAAK,CAACa,cAAc,CAAC,CAAC;QACtBb,KAAK,CAACc,eAAe,CAAC,CAAC;QACvB,EAAAF,qBAAA,GAAChD,MAAM,CAACC,OAAO,CAACxB,QAAQ,cAAAuE,qBAAA,cAAAA,qBAAA,GAAK;UAAA,OAAM3C,OAAO,CAAC,KAAK,CAAC;QAAA,GAAG,CAAC;MACvD;IACF,CAAC;IAEDtD,QAAQ,CAACoG,gBAAgB,CAAC,SAAS,EAAEhB,aAAa,EAAE,IAAI,CAAC;IAEzD,OAAO;MAAA,OAAMpF,QAAQ,CAACqG,mBAAmB,CAAC,SAAS,EAAEjB,aAAa,EAAE,IAAI,CAAC;IAAA;EAC3E,CAAC,EAAE,CAACnE,IAAI,EAAED,OAAO,EAAEsC,OAAO,CAAC,CAAC;EAE5B,IAAMgD,MAAM,GAAG,IAAAlD,kBAAW,EACxB,UAAC/C,IAAwB,EAAK;IAAA,IAAAkG,aAAA;IAC5BzE,UAAU,CAACoB,OAAO,GAAG7C,IAAI;IACzBA,IAAI,aAAJA,IAAI,gBAAAkG,aAAA,GAAJlG,IAAI,CAAEoD,OAAO,cAAA8C,aAAA,eAAbA,aAAA,CAAA/H,IAAA,CAAA6B,IAAI,EAAY,CAAC;MAAEqD,OAAO,EAAE;IAAE,CAAC,EAAE;MAAEA,OAAO,EAAE;IAAE,CAAC,CAAC,EAAEpC,QAAQ,CAAC;EAC7D,CAAC,EACD,CAACA,QAAQ,CACX,CAAC;;EAED;EACA;EACA,IAAAmD,sBAAe,EAAC,YAAM;IAAA,IAAA+B,qBAAA,EAAAC,gBAAA;IACpBjE,aAAa,EAAAgE,qBAAA,IAAAC,gBAAA,GAACzF,OAAO,CAACkC,OAAO,cAAAuD,gBAAA,uBAAfA,gBAAA,CAAiBC,YAAY,cAAAF,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC;EACnD,CAAC,CAAC;EAEF,IAAA/B,sBAAe,EAAC,YAAM;IACpB,IAAMiB,IAAI,GAAG1E,OAAO,CAACkC,OAAO;IAE5B,IAAI,CAACwC,IAAI,IAAI,OAAOtB,cAAc,KAAK,WAAW,EAAE;MAClD,OAAOC,SAAS;IAClB;;IAEA;IACA,IAAMC,QAAQ,GAAG,IAAIF,cAAc,CAAC;MAAA,OAClC,IAAAuC,mBAAS,EAAC;QAAA,OAAMnE,aAAa,CAACkD,IAAI,CAACgB,YAAY,CAAC;MAAA,EAAC;IAAA,CACnD,CAAC;IAEDpC,QAAQ,CAACC,OAAO,CAACmB,IAAI,CAAC;IAEtB,OAAO;MAAA,OAAMpB,QAAQ,CAACE,UAAU,CAAC,CAAC;IAAA;EACpC,CAAC,EAAE,CAACxD,OAAO,CAAC,CAAC;;EAEb;EACA,IAAM4F,MAAM,GAAG3F,IAAI,IAAI8B,MAAM;EAE7B,IAAAe,gBAAS,EAAC,YAAM;IACd,IAAI,CAAC8C,MAAM,EAAE;MACX,OAAOvC,SAAS;IAClB;IAEA,IAAMN,QAAQ,GAAGZ,YAAY,CAAC,CAAC;IAC/B,IAAM0D,QAAQ,GAAG9C,QAAQ,CAAC+C,KAAK,CAACC,QAAQ;IAExChD,QAAQ,CAAC+C,KAAK,CAACC,QAAQ,GAAG,QAAQ;IAElC,OAAO,YAAM;MACXhD,QAAQ,CAAC+C,KAAK,CAACC,QAAQ,GAAGF,QAAQ;IACpC,CAAC;EACH,CAAC,EAAE,CAACD,MAAM,EAAEzD,YAAY,CAAC,CAAC;EAE1B,OAAO;IACLG,OAAO;IACPP,MAAM;IACN;IACAiE,MAAM,EAAEJ,MAAM;IACd;IACAzE,UAAU;IACV;IACAQ,QAAQ;IACRJ,UAAU;IACV;IACA0E,MAAM,EAAEjC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE1C,UAAU,GAAGf,IAAI,CAAC;IACtC8E,MAAM;IACNnD;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useDockedCard.js","names":["_react","require","_reactDom","_slicedToArray","r","e","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","t","toString","call","slice","constructor","name","Array","from","test","length","n","l","Symbol","iterator","i","u","f","o","next","Object","done","push","value","return","isArray","getDocumentScroller","document","scrollingElement","documentElement","getScrollParent","exports","node","element","parentElement","body","_window$getComputedSt","window","getComputedStyle","overflowY","isDocumentScroller","useDockedCard","_ref","cardRef","open","onOpenChange","_ref$enabled","enabled","_ref$duration","duration","_ref$peek","peek","getTopLimit","onEscape","isBusy","scrollerRef","useRef","dimNodeRef","timerRef","_useState","useState","_useState2","viewHeight","setViewHeight","_useState3","_useState4","cardHeight","setCardHeight","_useState5","_useState6","topLimit","setTopLimit","_useState7","_useState8","moving","setMoving","latest","current","findScroller","useCallback","_scrollerRef$current","setOpen","_dimNodeRef$current","_dimNodeRef$current$a","animate","opacity","fill","clearTimeout","setTimeout","useEffect","scroller","isDocument","measure","innerHeight","clientHeight","ResizeObserver","undefined","observer","observe","disconnect","measureTopLimit","_latest$current$getTo","_latest$current","limit","scrollerTop","getBoundingClientRect","top","Math","max","round","bottom","useLayoutEffect","_latest$current$getTo2","_latest$current2","handleKeyDown","event","_target$closest","_latest$current$isBus","_latest$current$isBus2","_latest$current3","card","target","isOwn","closest","busy","key","defaultPrevented","_latest$current$onEsc","preventDefault","stopPropagation","addEventListener","removeEventListener","dimRef","_node$animate","_cardRef$current$offs","_cardRef$current","offsetHeight","flushSync","frozen","previous","style","overflow","lifted","offset"],"sources":["../../../../src/components/DockedCard/useDockedCard.ts"],"sourcesContent":["import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\nconst getDocumentScroller = () =>\n (document.scrollingElement || document.documentElement) as HTMLElement;\n\n/** The closest ancestor that scrolls. The full page scrolls the document. */\nexport const getScrollParent = (node?: Element | null): HTMLElement => {\n let element = node?.parentElement;\n\n while (element && element !== document.body) {\n const { overflowY } = window.getComputedStyle(element);\n\n if (overflowY === \"auto\" || overflowY === \"scroll\") {\n return element;\n }\n\n element = element.parentElement;\n }\n\n return getDocumentScroller();\n};\n\nconst isDocumentScroller = (element: HTMLElement) =>\n element === document.scrollingElement || element === document.documentElement;\n\nexport interface UseDockedCardOptions {\n cardRef: RefObject<HTMLElement>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Set to false where the card is not docked. It then never opens and has no top limit. */\n enabled?: boolean;\n /** The time of the move, in milliseconds. */\n duration?: number;\n /** The height of the closed card that stays above the edge, in pixels. */\n peek?: number;\n /** The element whose bottom edge the open card must not pass. */\n getTopLimit?: () => Element | null | undefined;\n /** Called on Escape while the card is open. Without it Escape closes the card. */\n onEscape?: () => void;\n /** True while something in the card, such as an open menu, must take Escape itself. */\n isBusy?: (card: HTMLElement) => boolean;\n}\n\n/** The moves of a docked card: its offset, its open state, the dim, the Escape key and the frozen scroll. */\nexport const useDockedCard = ({\n cardRef,\n open,\n onOpenChange,\n enabled = true,\n duration = 200,\n peek = 0,\n getTopLimit,\n onEscape,\n isBusy,\n}: UseDockedCardOptions) => {\n const scrollerRef = useRef<HTMLElement | null>(null);\n const dimNodeRef = useRef<HTMLElement | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const [viewHeight, setViewHeight] = useState(0);\n const [cardHeight, setCardHeight] = useState(0);\n const [topLimit, setTopLimit] = useState(0);\n const [moving, setMoving] = useState(false);\n const latest = useRef({\n enabled,\n onOpenChange,\n onEscape,\n isBusy,\n getTopLimit,\n });\n\n latest.current = { enabled, onOpenChange, onEscape, isBusy, getTopLimit };\n\n // Found once: a frozen scroller has no scroll in its style, so a later search would miss it.\n const findScroller = useCallback(() => {\n scrollerRef.current =\n scrollerRef.current ?? getScrollParent(cardRef.current);\n\n return scrollerRef.current;\n }, [cardRef]);\n\n // The card moves with a transition only when it opens or closes, not when its content changes its height.\n const setOpen = useCallback(\n (next: boolean) => {\n if (!latest.current.enabled) {\n return;\n }\n\n if (!next) {\n dimNodeRef.current?.animate?.([{ opacity: 1 }, { opacity: 0 }], {\n duration,\n fill: \"forwards\",\n });\n }\n\n clearTimeout(timerRef.current);\n setMoving(true);\n latest.current.onOpenChange(next);\n timerRef.current = setTimeout(() => setMoving(false), duration + 50);\n },\n [duration]\n );\n\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n useEffect(() => {\n const scroller = findScroller();\n const isDocument = isDocumentScroller(scroller);\n const measure = () =>\n setViewHeight(isDocument ? window.innerHeight : scroller.clientHeight);\n\n measure();\n\n if (typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(measure);\n\n observer.observe(isDocument ? document.documentElement : scroller);\n\n return () => observer.disconnect();\n }, [findScroller]);\n\n const measureTopLimit = useCallback(() => {\n const scroller = findScroller();\n const limit = latest.current.getTopLimit?.();\n\n if (!enabled || !scroller || !limit) {\n setTopLimit(0);\n\n return;\n }\n\n const scrollerTop =\n scroller === getDocumentScroller()\n ? 0\n : scroller.getBoundingClientRect().top;\n\n setTopLimit(\n Math.max(\n 0,\n Math.round(limit.getBoundingClientRect().bottom - scrollerTop)\n )\n );\n }, [enabled, findScroller]);\n\n useLayoutEffect(measureTopLimit, [open, viewHeight, measureTopLimit]);\n\n // The limit element can grow after the first measure, such as a title that wraps to a second line.\n useEffect(() => {\n const limit = enabled ? latest.current.getTopLimit?.() : null;\n\n if (!limit || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(measureTopLimit);\n\n observer.observe(limit);\n\n return () => observer.disconnect();\n }, [enabled, open, measureTopLimit]);\n\n // A menu, a list or a dialog above the card takes its own Escape.\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const card = cardRef.current;\n const target = event.target as Element;\n const isOwn =\n target === document.body ||\n target.closest?.(\".c-window\") === card?.closest(\".c-window\");\n const busy = card ? latest.current.isBusy?.(card) ?? false : false;\n\n if (event.key === \"Escape\" && !event.defaultPrevented && isOwn && !busy) {\n event.preventDefault();\n event.stopPropagation();\n (latest.current.onEscape ?? (() => setOpen(false)))();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [open, cardRef, setOpen]);\n\n const dimRef = useCallback(\n (node: HTMLElement | null) => {\n dimNodeRef.current = node;\n node?.animate?.([{ opacity: 0 }, { opacity: 1 }], duration);\n },\n [duration]\n );\n\n // The height places the card, so each render reads it before the paint. The observer covers what comes in later.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n setCardHeight(cardRef.current?.offsetHeight ?? 0);\n });\n\n useLayoutEffect(() => {\n const card = cardRef.current;\n\n if (!card || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(() =>\n flushSync(() => setCardHeight(card.offsetHeight))\n );\n\n observer.observe(card);\n\n return () => observer.disconnect();\n }, [cardRef]);\n\n // The page does not scroll under the open card.\n const frozen = open || moving;\n\n useEffect(() => {\n if (!frozen) {\n return undefined;\n }\n\n const scroller = findScroller();\n const previous = scroller.style.overflow;\n\n scroller.style.overflow = \"hidden\";\n\n return () => {\n scroller.style.overflow = previous;\n };\n }, [frozen, findScroller]);\n\n return {\n setOpen,\n moving,\n /** The card and its dim cover the page while the card is open or on its way. */\n lifted: frozen,\n /** The height of the scroll container. */\n viewHeight,\n /** The bottom edge of the limit element, from the top of the scroll container. Zero with no limit. */\n topLimit,\n cardHeight,\n /** How far the closed card stands under the edge. */\n offset: Math.max(0, cardHeight - peek),\n dimRef,\n findScroller,\n };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAQA,IAAAC,SAAA,GAAAD,OAAA;AAAsC,SAAAE,eAAAC,CAAA,EAAAC,CAAA,WAAAC,eAAA,CAAAF,CAAA,KAAAG,qBAAA,CAAAH,CAAA,EAAAC,CAAA,KAAAG,2BAAA,CAAAJ,CAAA,EAAAC,CAAA,KAAAI,gBAAA;AAAA,SAAAA,iBAAA,cAAAC,SAAA;AAAA,SAAAF,4BAAAJ,CAAA,EAAAO,CAAA,QAAAP,CAAA,2BAAAA,CAAA,SAAAQ,iBAAA,CAAAR,CAAA,EAAAO,CAAA,OAAAE,CAAA,MAAAC,QAAA,CAAAC,IAAA,CAAAX,CAAA,EAAAY,KAAA,6BAAAH,CAAA,IAAAT,CAAA,CAAAa,WAAA,KAAAJ,CAAA,GAAAT,CAAA,CAAAa,WAAA,CAAAC,IAAA,aAAAL,CAAA,cAAAA,CAAA,GAAAM,KAAA,CAAAC,IAAA,CAAAhB,CAAA,oBAAAS,CAAA,+CAAAQ,IAAA,CAAAR,CAAA,IAAAD,iBAAA,CAAAR,CAAA,EAAAO,CAAA;AAAA,SAAAC,kBAAAR,CAAA,EAAAO,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAP,CAAA,CAAAkB,MAAA,MAAAX,CAAA,GAAAP,CAAA,CAAAkB,MAAA,YAAAjB,CAAA,MAAAkB,CAAA,GAAAJ,KAAA,CAAAR,CAAA,GAAAN,CAAA,GAAAM,CAAA,EAAAN,CAAA,IAAAkB,CAAA,CAAAlB,CAAA,IAAAD,CAAA,CAAAC,CAAA,UAAAkB,CAAA;AAAA,SAAAhB,sBAAAH,CAAA,EAAAoB,CAAA,QAAAX,CAAA,WAAAT,CAAA,gCAAAqB,MAAA,IAAArB,CAAA,CAAAqB,MAAA,CAAAC,QAAA,KAAAtB,CAAA,4BAAAS,CAAA,QAAAR,CAAA,EAAAkB,CAAA,EAAAI,CAAA,EAAAC,CAAA,EAAAjB,CAAA,OAAAkB,CAAA,OAAAC,CAAA,iBAAAH,CAAA,IAAAd,CAAA,GAAAA,CAAA,CAAAE,IAAA,CAAAX,CAAA,GAAA2B,IAAA,QAAAP,CAAA,QAAAQ,MAAA,CAAAnB,CAAA,MAAAA,CAAA,UAAAgB,CAAA,uBAAAA,CAAA,IAAAxB,CAAA,GAAAsB,CAAA,CAAAZ,IAAA,CAAAF,CAAA,GAAAoB,IAAA,MAAAtB,CAAA,CAAAuB,IAAA,CAAA7B,CAAA,CAAA8B,KAAA,GAAAxB,CAAA,CAAAW,MAAA,KAAAE,CAAA,GAAAK,CAAA,iBAAAzB,CAAA,IAAA0B,CAAA,OAAAP,CAAA,GAAAnB,CAAA,yBAAAyB,CAAA,YAAAhB,CAAA,CAAAuB,MAAA,KAAAR,CAAA,GAAAf,CAAA,CAAAuB,MAAA,IAAAJ,MAAA,CAAAJ,CAAA,MAAAA,CAAA,2BAAAE,CAAA,QAAAP,CAAA,aAAAZ,CAAA;AAAA,SAAAL,gBAAAF,CAAA,QAAAe,KAAA,CAAAkB,OAAA,CAAAjC,CAAA,UAAAA,CAAA;AAEtC,IAAMkC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAA;EAAA,OACtBC,QAAQ,CAACC,gBAAgB,IAAID,QAAQ,CAACE,eAAe;AAAA,CAAgB;;AAExE;AACO,IAAMC,eAAe,GAAAC,OAAA,CAAAD,eAAA,GAAG,SAAlBA,eAAeA,CAAIE,IAAqB,EAAkB;EACrE,IAAIC,OAAO,GAAGD,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEE,aAAa;EAEjC,OAAOD,OAAO,IAAIA,OAAO,KAAKN,QAAQ,CAACQ,IAAI,EAAE;IAC3C,IAAAC,qBAAA,GAAsBC,MAAM,CAACC,gBAAgB,CAACL,OAAO,CAAC;MAA9CM,SAAS,GAAAH,qBAAA,CAATG,SAAS;IAEjB,IAAIA,SAAS,KAAK,MAAM,IAAIA,SAAS,KAAK,QAAQ,EAAE;MAClD,OAAON,OAAO;IAChB;IAEAA,OAAO,GAAGA,OAAO,CAACC,aAAa;EACjC;EAEA,OAAOR,mBAAmB,CAAC,CAAC;AAC9B,CAAC;AAED,IAAMc,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAIP,OAAoB;EAAA,OAC9CA,OAAO,KAAKN,QAAQ,CAACC,gBAAgB,IAAIK,OAAO,KAAKN,QAAQ,CAACE,eAAe;AAAA;AAoB/E;AACO,IAAMY,aAAa,GAAAV,OAAA,CAAAU,aAAA,GAAG,SAAhBA,aAAaA,CAAAC,IAAA,EAUE;EAAA,IAT1BC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,IAAI,GAAAF,IAAA,CAAJE,IAAI;IACJC,YAAY,GAAAH,IAAA,CAAZG,YAAY;IAAAC,YAAA,GAAAJ,IAAA,CACZK,OAAO;IAAPA,OAAO,GAAAD,YAAA,cAAG,IAAI,GAAAA,YAAA;IAAAE,aAAA,GAAAN,IAAA,CACdO,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAG,GAAG,GAAAA,aAAA;IAAAE,SAAA,GAAAR,IAAA,CACdS,IAAI;IAAJA,IAAI,GAAAD,SAAA,cAAG,CAAC,GAAAA,SAAA;IACRE,WAAW,GAAAV,IAAA,CAAXU,WAAW;IACXC,QAAQ,GAAAX,IAAA,CAARW,QAAQ;IACRC,MAAM,GAAAZ,IAAA,CAANY,MAAM;EAEN,IAAMC,WAAW,GAAG,IAAAC,aAAM,EAAqB,IAAI,CAAC;EACpD,IAAMC,UAAU,GAAG,IAAAD,aAAM,EAAqB,IAAI,CAAC;EACnD,IAAME,QAAQ,GAAG,IAAAF,aAAM,EAAgC,CAAC;EACxD,IAAAG,SAAA,GAAoC,IAAAC,eAAQ,EAAC,CAAC,CAAC;IAAAC,UAAA,GAAAtE,cAAA,CAAAoE,SAAA;IAAxCG,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,IAAAG,UAAA,GAAoC,IAAAJ,eAAQ,EAAC,CAAC,CAAC;IAAAK,UAAA,GAAA1E,cAAA,CAAAyE,UAAA;IAAxCE,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,IAAAG,UAAA,GAAgC,IAAAR,eAAQ,EAAC,CAAC,CAAC;IAAAS,UAAA,GAAA9E,cAAA,CAAA6E,UAAA;IAApCE,QAAQ,GAAAD,UAAA;IAAEE,WAAW,GAAAF,UAAA;EAC5B,IAAAG,UAAA,GAA4B,IAAAZ,eAAQ,EAAC,KAAK,CAAC;IAAAa,UAAA,GAAAlF,cAAA,CAAAiF,UAAA;IAApCE,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EACxB,IAAMG,MAAM,GAAG,IAAApB,aAAM,EAAC;IACpBT,OAAO;IACPF,YAAY;IACZQ,QAAQ;IACRC,MAAM;IACNF;EACF,CAAC,CAAC;EAEFwB,MAAM,CAACC,OAAO,GAAG;IAAE9B,OAAO;IAAEF,YAAY;IAAEQ,QAAQ;IAAEC,MAAM;IAAEF;EAAY,CAAC;;EAEzE;EACA,IAAM0B,YAAY,GAAG,IAAAC,kBAAW,EAAC,YAAM;IAAA,IAAAC,oBAAA;IACrCzB,WAAW,CAACsB,OAAO,IAAAG,oBAAA,GACjBzB,WAAW,CAACsB,OAAO,cAAAG,oBAAA,cAAAA,oBAAA,GAAIlD,eAAe,CAACa,OAAO,CAACkC,OAAO,CAAC;IAEzD,OAAOtB,WAAW,CAACsB,OAAO;EAC5B,CAAC,EAAE,CAAClC,OAAO,CAAC,CAAC;;EAEb;EACA,IAAMsC,OAAO,GAAG,IAAAF,kBAAW,EACzB,UAAC5D,IAAa,EAAK;IACjB,IAAI,CAACyD,MAAM,CAACC,OAAO,CAAC9B,OAAO,EAAE;MAC3B;IACF;IAEA,IAAI,CAAC5B,IAAI,EAAE;MAAA,IAAA+D,mBAAA,EAAAC,qBAAA;MACT,CAAAD,mBAAA,GAAAzB,UAAU,CAACoB,OAAO,cAAAK,mBAAA,gBAAAC,qBAAA,GAAlBD,mBAAA,CAAoBE,OAAO,cAAAD,qBAAA,eAA3BA,qBAAA,CAAAhF,IAAA,CAAA+E,mBAAA,EAA8B,CAAC;QAAEG,OAAO,EAAE;MAAE,CAAC,EAAE;QAAEA,OAAO,EAAE;MAAE,CAAC,CAAC,EAAE;QAC9DpC,QAAQ;QACRqC,IAAI,EAAE;MACR,CAAC,CAAC;IACJ;IAEAC,YAAY,CAAC7B,QAAQ,CAACmB,OAAO,CAAC;IAC9BF,SAAS,CAAC,IAAI,CAAC;IACfC,MAAM,CAACC,OAAO,CAAChC,YAAY,CAAC1B,IAAI,CAAC;IACjCuC,QAAQ,CAACmB,OAAO,GAAGW,UAAU,CAAC;MAAA,OAAMb,SAAS,CAAC,KAAK,CAAC;IAAA,GAAE1B,QAAQ,GAAG,EAAE,CAAC;EACtE,CAAC,EACD,CAACA,QAAQ,CACX,CAAC;EAED,IAAAwC,gBAAS,EAAC;IAAA,OAAM;MAAA,OAAMF,YAAY,CAAC7B,QAAQ,CAACmB,OAAO,CAAC;IAAA;EAAA,GAAE,EAAE,CAAC;EAEzD,IAAAY,gBAAS,EAAC,YAAM;IACd,IAAMC,QAAQ,GAAGZ,YAAY,CAAC,CAAC;IAC/B,IAAMa,UAAU,GAAGnD,kBAAkB,CAACkD,QAAQ,CAAC;IAC/C,IAAME,OAAO,GAAG,SAAVA,OAAOA,CAAA;MAAA,OACX7B,aAAa,CAAC4B,UAAU,GAAGtD,MAAM,CAACwD,WAAW,GAAGH,QAAQ,CAACI,YAAY,CAAC;IAAA;IAExEF,OAAO,CAAC,CAAC;IAET,IAAI,OAAOG,cAAc,KAAK,WAAW,EAAE;MACzC,OAAOC,SAAS;IAClB;;IAEA;IACA,IAAMC,QAAQ,GAAG,IAAIF,cAAc,CAACH,OAAO,CAAC;IAE5CK,QAAQ,CAACC,OAAO,CAACP,UAAU,GAAGhE,QAAQ,CAACE,eAAe,GAAG6D,QAAQ,CAAC;IAElE,OAAO;MAAA,OAAMO,QAAQ,CAACE,UAAU,CAAC,CAAC;IAAA;EACpC,CAAC,EAAE,CAACrB,YAAY,CAAC,CAAC;EAElB,IAAMsB,eAAe,GAAG,IAAArB,kBAAW,EAAC,YAAM;IAAA,IAAAsB,qBAAA,EAAAC,eAAA;IACxC,IAAMZ,QAAQ,GAAGZ,YAAY,CAAC,CAAC;IAC/B,IAAMyB,KAAK,IAAAF,qBAAA,GAAG,CAAAC,eAAA,GAAA1B,MAAM,CAACC,OAAO,EAACzB,WAAW,cAAAiD,qBAAA,uBAA1BA,qBAAA,CAAAlG,IAAA,CAAAmG,eAA6B,CAAC;IAE5C,IAAI,CAACvD,OAAO,IAAI,CAAC2C,QAAQ,IAAI,CAACa,KAAK,EAAE;MACnChC,WAAW,CAAC,CAAC,CAAC;MAEd;IACF;IAEA,IAAMiC,WAAW,GACfd,QAAQ,KAAKhE,mBAAmB,CAAC,CAAC,GAC9B,CAAC,GACDgE,QAAQ,CAACe,qBAAqB,CAAC,CAAC,CAACC,GAAG;IAE1CnC,WAAW,CACToC,IAAI,CAACC,GAAG,CACN,CAAC,EACDD,IAAI,CAACE,KAAK,CAACN,KAAK,CAACE,qBAAqB,CAAC,CAAC,CAACK,MAAM,GAAGN,WAAW,CAC/D,CACF,CAAC;EACH,CAAC,EAAE,CAACzD,OAAO,EAAE+B,YAAY,CAAC,CAAC;EAE3B,IAAAiC,sBAAe,EAACX,eAAe,EAAE,CAACxD,IAAI,EAAEkB,UAAU,EAAEsC,eAAe,CAAC,CAAC;;EAErE;EACA,IAAAX,gBAAS,EAAC,YAAM;IAAA,IAAAuB,sBAAA,EAAAC,gBAAA;IACd,IAAMV,KAAK,GAAGxD,OAAO,IAAAiE,sBAAA,GAAG,CAAAC,gBAAA,GAAArC,MAAM,CAACC,OAAO,EAACzB,WAAW,cAAA4D,sBAAA,uBAA1BA,sBAAA,CAAA7G,IAAA,CAAA8G,gBAA6B,CAAC,GAAG,IAAI;IAE7D,IAAI,CAACV,KAAK,IAAI,OAAOR,cAAc,KAAK,WAAW,EAAE;MACnD,OAAOC,SAAS;IAClB;;IAEA;IACA,IAAMC,QAAQ,GAAG,IAAIF,cAAc,CAACK,eAAe,CAAC;IAEpDH,QAAQ,CAACC,OAAO,CAACK,KAAK,CAAC;IAEvB,OAAO;MAAA,OAAMN,QAAQ,CAACE,UAAU,CAAC,CAAC;IAAA;EACpC,CAAC,EAAE,CAACpD,OAAO,EAAEH,IAAI,EAAEwD,eAAe,CAAC,CAAC;;EAEpC;EACA,IAAAX,gBAAS,EAAC,YAAM;IACd,IAAI,CAAC7C,IAAI,EAAE;MACT,OAAOoD,SAAS;IAClB;IAEA,IAAMkB,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAoB,EAAK;MAAA,IAAAC,eAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,gBAAA;MAC9C,IAAMC,IAAI,GAAG7E,OAAO,CAACkC,OAAO;MAC5B,IAAM4C,MAAM,GAAGN,KAAK,CAACM,MAAiB;MACtC,IAAMC,KAAK,GACTD,MAAM,KAAK9F,QAAQ,CAACQ,IAAI,IACxB,EAAAiF,eAAA,GAAAK,MAAM,CAACE,OAAO,cAAAP,eAAA,uBAAdA,eAAA,CAAAjH,IAAA,CAAAsH,MAAM,EAAW,WAAW,CAAC,OAAKD,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEG,OAAO,CAAC,WAAW,CAAC;MAC9D,IAAMC,IAAI,GAAGJ,IAAI,IAAAH,qBAAA,IAAAC,sBAAA,GAAG,CAAAC,gBAAA,GAAA3C,MAAM,CAACC,OAAO,EAACvB,MAAM,cAAAgE,sBAAA,uBAArBA,sBAAA,CAAAnH,IAAA,CAAAoH,gBAAA,EAAwBC,IAAI,CAAC,cAAAH,qBAAA,cAAAA,qBAAA,GAAI,KAAK,GAAG,KAAK;MAElE,IAAIF,KAAK,CAACU,GAAG,KAAK,QAAQ,IAAI,CAACV,KAAK,CAACW,gBAAgB,IAAIJ,KAAK,IAAI,CAACE,IAAI,EAAE;QAAA,IAAAG,qBAAA;QACvEZ,KAAK,CAACa,cAAc,CAAC,CAAC;QACtBb,KAAK,CAACc,eAAe,CAAC,CAAC;QACvB,EAAAF,qBAAA,GAACnD,MAAM,CAACC,OAAO,CAACxB,QAAQ,cAAA0E,qBAAA,cAAAA,qBAAA,GAAK;UAAA,OAAM9C,OAAO,CAAC,KAAK,CAAC;QAAA,GAAG,CAAC;MACvD;IACF,CAAC;IAEDtD,QAAQ,CAACuG,gBAAgB,CAAC,SAAS,EAAEhB,aAAa,EAAE,IAAI,CAAC;IAEzD,OAAO;MAAA,OAAMvF,QAAQ,CAACwG,mBAAmB,CAAC,SAAS,EAAEjB,aAAa,EAAE,IAAI,CAAC;IAAA;EAC3E,CAAC,EAAE,CAACtE,IAAI,EAAED,OAAO,EAAEsC,OAAO,CAAC,CAAC;EAE5B,IAAMmD,MAAM,GAAG,IAAArD,kBAAW,EACxB,UAAC/C,IAAwB,EAAK;IAAA,IAAAqG,aAAA;IAC5B5E,UAAU,CAACoB,OAAO,GAAG7C,IAAI;IACzBA,IAAI,aAAJA,IAAI,gBAAAqG,aAAA,GAAJrG,IAAI,CAAEoD,OAAO,cAAAiD,aAAA,eAAbA,aAAA,CAAAlI,IAAA,CAAA6B,IAAI,EAAY,CAAC;MAAEqD,OAAO,EAAE;IAAE,CAAC,EAAE;MAAEA,OAAO,EAAE;IAAE,CAAC,CAAC,EAAEpC,QAAQ,CAAC;EAC7D,CAAC,EACD,CAACA,QAAQ,CACX,CAAC;;EAED;EACA;EACA,IAAA8D,sBAAe,EAAC,YAAM;IAAA,IAAAuB,qBAAA,EAAAC,gBAAA;IACpBpE,aAAa,EAAAmE,qBAAA,IAAAC,gBAAA,GAAC5F,OAAO,CAACkC,OAAO,cAAA0D,gBAAA,uBAAfA,gBAAA,CAAiBC,YAAY,cAAAF,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC;EACnD,CAAC,CAAC;EAEF,IAAAvB,sBAAe,EAAC,YAAM;IACpB,IAAMS,IAAI,GAAG7E,OAAO,CAACkC,OAAO;IAE5B,IAAI,CAAC2C,IAAI,IAAI,OAAOzB,cAAc,KAAK,WAAW,EAAE;MAClD,OAAOC,SAAS;IAClB;;IAEA;IACA,IAAMC,QAAQ,GAAG,IAAIF,cAAc,CAAC;MAAA,OAClC,IAAA0C,mBAAS,EAAC;QAAA,OAAMtE,aAAa,CAACqD,IAAI,CAACgB,YAAY,CAAC;MAAA,EAAC;IAAA,CACnD,CAAC;IAEDvC,QAAQ,CAACC,OAAO,CAACsB,IAAI,CAAC;IAEtB,OAAO;MAAA,OAAMvB,QAAQ,CAACE,UAAU,CAAC,CAAC;IAAA;EACpC,CAAC,EAAE,CAACxD,OAAO,CAAC,CAAC;;EAEb;EACA,IAAM+F,MAAM,GAAG9F,IAAI,IAAI8B,MAAM;EAE7B,IAAAe,gBAAS,EAAC,YAAM;IACd,IAAI,CAACiD,MAAM,EAAE;MACX,OAAO1C,SAAS;IAClB;IAEA,IAAMN,QAAQ,GAAGZ,YAAY,CAAC,CAAC;IAC/B,IAAM6D,QAAQ,GAAGjD,QAAQ,CAACkD,KAAK,CAACC,QAAQ;IAExCnD,QAAQ,CAACkD,KAAK,CAACC,QAAQ,GAAG,QAAQ;IAElC,OAAO,YAAM;MACXnD,QAAQ,CAACkD,KAAK,CAACC,QAAQ,GAAGF,QAAQ;IACpC,CAAC;EACH,CAAC,EAAE,CAACD,MAAM,EAAE5D,YAAY,CAAC,CAAC;EAE1B,OAAO;IACLG,OAAO;IACPP,MAAM;IACN;IACAoE,MAAM,EAAEJ,MAAM;IACd;IACA5E,UAAU;IACV;IACAQ,QAAQ;IACRJ,UAAU;IACV;IACA6E,MAAM,EAAEpC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE1C,UAAU,GAAGf,IAAI,CAAC;IACtCiF,MAAM;IACNtD;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDockedCard.d.ts","sourceRoot":"","sources":["../../../../src/components/DockedCard/useDockedCard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAMV,MAAM,OAAO,CAAC;AAMf,6EAA6E;AAC7E,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,GAAG,IAAI,KAAG,WAcvD,CAAC;AAKF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uFAAuF;IACvF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;CACzC;AAED,6GAA6G;AAC7G,eAAO,MAAM,aAAa,GAAI,0FAU3B,oBAAoB;oBA4BZ,OAAO;;
|
|
1
|
+
{"version":3,"file":"useDockedCard.d.ts","sourceRoot":"","sources":["../../../../src/components/DockedCard/useDockedCard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAMV,MAAM,OAAO,CAAC;AAMf,6EAA6E;AAC7E,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,GAAG,IAAI,KAAG,WAcvD,CAAC;AAKF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uFAAuF;IACvF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;CACzC;AAED,6GAA6G;AAC7G,eAAO,MAAM,aAAa,GAAI,0FAU3B,oBAAoB;oBA4BZ,OAAO;;IAiKd,gFAAgF;;IAEhF,0CAA0C;;IAE1C,sGAAsG;;;IAGtG,qDAAqD;;mBA1D9C,WAAW,GAAG,IAAI;;CA+D5B,CAAC"}
|
|
@@ -103,7 +103,7 @@ export const useDockedCard = _ref => {
|
|
|
103
103
|
observer.observe(isDocument ? document.documentElement : scroller);
|
|
104
104
|
return () => observer.disconnect();
|
|
105
105
|
}, [findScroller]);
|
|
106
|
-
|
|
106
|
+
const measureTopLimit = useCallback(() => {
|
|
107
107
|
const scroller = findScroller();
|
|
108
108
|
const limit = latest.current.getTopLimit == null ? void 0 : latest.current.getTopLimit();
|
|
109
109
|
if (!enabled || !scroller || !limit) {
|
|
@@ -112,7 +112,21 @@ export const useDockedCard = _ref => {
|
|
|
112
112
|
}
|
|
113
113
|
const scrollerTop = scroller === getDocumentScroller() ? 0 : scroller.getBoundingClientRect().top;
|
|
114
114
|
setTopLimit(Math.max(0, Math.round(limit.getBoundingClientRect().bottom - scrollerTop)));
|
|
115
|
-
}, [
|
|
115
|
+
}, [enabled, findScroller]);
|
|
116
|
+
useLayoutEffect(measureTopLimit, [open, viewHeight, measureTopLimit]);
|
|
117
|
+
|
|
118
|
+
// The limit element can grow after the first measure, such as a title that wraps to a second line.
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
const limit = enabled ? latest.current.getTopLimit == null ? void 0 : latest.current.getTopLimit() : null;
|
|
121
|
+
if (!limit || typeof ResizeObserver === "undefined") {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// eslint-disable-next-line compat/compat
|
|
126
|
+
const observer = new ResizeObserver(measureTopLimit);
|
|
127
|
+
observer.observe(limit);
|
|
128
|
+
return () => observer.disconnect();
|
|
129
|
+
}, [enabled, open, measureTopLimit]);
|
|
116
130
|
|
|
117
131
|
// A menu, a list or a dialog above the card takes its own Escape.
|
|
118
132
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDockedCard.js","names":["useCallback","useEffect","useLayoutEffect","useRef","useState","flushSync","getDocumentScroller","document","scrollingElement","documentElement","getScrollParent","node","element","parentElement","body","_window$getComputedSt","window","getComputedStyle","overflowY","isDocumentScroller","useDockedCard","_ref","cardRef","open","onOpenChange","_ref$enabled","enabled","_ref$duration","duration","_ref$peek","peek","getTopLimit","onEscape","isBusy","scrollerRef","dimNodeRef","timerRef","_useState","viewHeight","setViewHeight","_useState2","cardHeight","setCardHeight","_useState3","topLimit","setTopLimit","_useState4","moving","setMoving","latest","current","findScroller","_scrollerRef$current","setOpen","next","_dimNodeRef$current","animate","opacity","fill","clearTimeout","setTimeout","scroller","isDocument","measure","innerHeight","clientHeight","ResizeObserver","undefined","observer","observe","disconnect","limit","scrollerTop","getBoundingClientRect","top","Math","max","round","bottom","handleKeyDown","event","_latest$current$isBus","card","target","isOwn","closest","busy","key","defaultPrevented","_latest$current$onEsc","preventDefault","stopPropagation","addEventListener","removeEventListener","dimRef","_cardRef$current$offs","_cardRef$current","offsetHeight","frozen","previous","style","overflow","lifted","offset"],"sources":["../../../../src/components/DockedCard/useDockedCard.ts"],"sourcesContent":["import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\nconst getDocumentScroller = () =>\n (document.scrollingElement || document.documentElement) as HTMLElement;\n\n/** The closest ancestor that scrolls. The full page scrolls the document. */\nexport const getScrollParent = (node?: Element | null): HTMLElement => {\n let element = node?.parentElement;\n\n while (element && element !== document.body) {\n const { overflowY } = window.getComputedStyle(element);\n\n if (overflowY === \"auto\" || overflowY === \"scroll\") {\n return element;\n }\n\n element = element.parentElement;\n }\n\n return getDocumentScroller();\n};\n\nconst isDocumentScroller = (element: HTMLElement) =>\n element === document.scrollingElement || element === document.documentElement;\n\nexport interface UseDockedCardOptions {\n cardRef: RefObject<HTMLElement>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Set to false where the card is not docked. It then never opens and has no top limit. */\n enabled?: boolean;\n /** The time of the move, in milliseconds. */\n duration?: number;\n /** The height of the closed card that stays above the edge, in pixels. */\n peek?: number;\n /** The element whose bottom edge the open card must not pass. */\n getTopLimit?: () => Element | null | undefined;\n /** Called on Escape while the card is open. Without it Escape closes the card. */\n onEscape?: () => void;\n /** True while something in the card, such as an open menu, must take Escape itself. */\n isBusy?: (card: HTMLElement) => boolean;\n}\n\n/** The moves of a docked card: its offset, its open state, the dim, the Escape key and the frozen scroll. */\nexport const useDockedCard = ({\n cardRef,\n open,\n onOpenChange,\n enabled = true,\n duration = 200,\n peek = 0,\n getTopLimit,\n onEscape,\n isBusy,\n}: UseDockedCardOptions) => {\n const scrollerRef = useRef<HTMLElement | null>(null);\n const dimNodeRef = useRef<HTMLElement | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const [viewHeight, setViewHeight] = useState(0);\n const [cardHeight, setCardHeight] = useState(0);\n const [topLimit, setTopLimit] = useState(0);\n const [moving, setMoving] = useState(false);\n const latest = useRef({\n enabled,\n onOpenChange,\n onEscape,\n isBusy,\n getTopLimit,\n });\n\n latest.current = { enabled, onOpenChange, onEscape, isBusy, getTopLimit };\n\n // Found once: a frozen scroller has no scroll in its style, so a later search would miss it.\n const findScroller = useCallback(() => {\n scrollerRef.current =\n scrollerRef.current ?? getScrollParent(cardRef.current);\n\n return scrollerRef.current;\n }, [cardRef]);\n\n // The card moves with a transition only when it opens or closes, not when its content changes its height.\n const setOpen = useCallback(\n (next: boolean) => {\n if (!latest.current.enabled) {\n return;\n }\n\n if (!next) {\n dimNodeRef.current?.animate?.([{ opacity: 1 }, { opacity: 0 }], {\n duration,\n fill: \"forwards\",\n });\n }\n\n clearTimeout(timerRef.current);\n setMoving(true);\n latest.current.onOpenChange(next);\n timerRef.current = setTimeout(() => setMoving(false), duration + 50);\n },\n [duration]\n );\n\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n useEffect(() => {\n const scroller = findScroller();\n const isDocument = isDocumentScroller(scroller);\n const measure = () =>\n setViewHeight(isDocument ? window.innerHeight : scroller.clientHeight);\n\n measure();\n\n if (typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(measure);\n\n observer.observe(isDocument ? document.documentElement : scroller);\n\n return () => observer.disconnect();\n }, [findScroller]);\n\n useLayoutEffect(() => {\n const scroller = findScroller();\n const limit = latest.current.getTopLimit?.();\n\n if (!enabled || !scroller || !limit) {\n setTopLimit(0);\n\n return;\n }\n\n const scrollerTop =\n scroller === getDocumentScroller()\n ? 0\n : scroller.getBoundingClientRect().top;\n\n setTopLimit(\n Math.max(\n 0,\n Math.round(limit.getBoundingClientRect().bottom - scrollerTop)\n )\n );\n }, [open, enabled, viewHeight, findScroller]);\n\n // A menu, a list or a dialog above the card takes its own Escape.\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const card = cardRef.current;\n const target = event.target as Element;\n const isOwn =\n target === document.body ||\n target.closest?.(\".c-window\") === card?.closest(\".c-window\");\n const busy = card ? latest.current.isBusy?.(card) ?? false : false;\n\n if (event.key === \"Escape\" && !event.defaultPrevented && isOwn && !busy) {\n event.preventDefault();\n event.stopPropagation();\n (latest.current.onEscape ?? (() => setOpen(false)))();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [open, cardRef, setOpen]);\n\n const dimRef = useCallback(\n (node: HTMLElement | null) => {\n dimNodeRef.current = node;\n node?.animate?.([{ opacity: 0 }, { opacity: 1 }], duration);\n },\n [duration]\n );\n\n // The height places the card, so each render reads it before the paint. The observer covers what comes in later.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n setCardHeight(cardRef.current?.offsetHeight ?? 0);\n });\n\n useLayoutEffect(() => {\n const card = cardRef.current;\n\n if (!card || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(() =>\n flushSync(() => setCardHeight(card.offsetHeight))\n );\n\n observer.observe(card);\n\n return () => observer.disconnect();\n }, [cardRef]);\n\n // The page does not scroll under the open card.\n const frozen = open || moving;\n\n useEffect(() => {\n if (!frozen) {\n return undefined;\n }\n\n const scroller = findScroller();\n const previous = scroller.style.overflow;\n\n scroller.style.overflow = \"hidden\";\n\n return () => {\n scroller.style.overflow = previous;\n };\n }, [frozen, findScroller]);\n\n return {\n setOpen,\n moving,\n /** The card and its dim cover the page while the card is open or on its way. */\n lifted: frozen,\n /** The height of the scroll container. */\n viewHeight,\n /** The bottom edge of the limit element, from the top of the scroll container. Zero with no limit. */\n topLimit,\n cardHeight,\n /** How far the closed card stands under the edge. */\n offset: Math.max(0, cardHeight - peek),\n dimRef,\n findScroller,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useDockedCard.js","names":["useCallback","useEffect","useLayoutEffect","useRef","useState","flushSync","getDocumentScroller","document","scrollingElement","documentElement","getScrollParent","node","element","parentElement","body","_window$getComputedSt","window","getComputedStyle","overflowY","isDocumentScroller","useDockedCard","_ref","cardRef","open","onOpenChange","_ref$enabled","enabled","_ref$duration","duration","_ref$peek","peek","getTopLimit","onEscape","isBusy","scrollerRef","dimNodeRef","timerRef","_useState","viewHeight","setViewHeight","_useState2","cardHeight","setCardHeight","_useState3","topLimit","setTopLimit","_useState4","moving","setMoving","latest","current","findScroller","_scrollerRef$current","setOpen","next","_dimNodeRef$current","animate","opacity","fill","clearTimeout","setTimeout","scroller","isDocument","measure","innerHeight","clientHeight","ResizeObserver","undefined","observer","observe","disconnect","measureTopLimit","limit","scrollerTop","getBoundingClientRect","top","Math","max","round","bottom","handleKeyDown","event","_latest$current$isBus","card","target","isOwn","closest","busy","key","defaultPrevented","_latest$current$onEsc","preventDefault","stopPropagation","addEventListener","removeEventListener","dimRef","_cardRef$current$offs","_cardRef$current","offsetHeight","frozen","previous","style","overflow","lifted","offset"],"sources":["../../../../src/components/DockedCard/useDockedCard.ts"],"sourcesContent":["import {\n RefObject,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\n\nconst getDocumentScroller = () =>\n (document.scrollingElement || document.documentElement) as HTMLElement;\n\n/** The closest ancestor that scrolls. The full page scrolls the document. */\nexport const getScrollParent = (node?: Element | null): HTMLElement => {\n let element = node?.parentElement;\n\n while (element && element !== document.body) {\n const { overflowY } = window.getComputedStyle(element);\n\n if (overflowY === \"auto\" || overflowY === \"scroll\") {\n return element;\n }\n\n element = element.parentElement;\n }\n\n return getDocumentScroller();\n};\n\nconst isDocumentScroller = (element: HTMLElement) =>\n element === document.scrollingElement || element === document.documentElement;\n\nexport interface UseDockedCardOptions {\n cardRef: RefObject<HTMLElement>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Set to false where the card is not docked. It then never opens and has no top limit. */\n enabled?: boolean;\n /** The time of the move, in milliseconds. */\n duration?: number;\n /** The height of the closed card that stays above the edge, in pixels. */\n peek?: number;\n /** The element whose bottom edge the open card must not pass. */\n getTopLimit?: () => Element | null | undefined;\n /** Called on Escape while the card is open. Without it Escape closes the card. */\n onEscape?: () => void;\n /** True while something in the card, such as an open menu, must take Escape itself. */\n isBusy?: (card: HTMLElement) => boolean;\n}\n\n/** The moves of a docked card: its offset, its open state, the dim, the Escape key and the frozen scroll. */\nexport const useDockedCard = ({\n cardRef,\n open,\n onOpenChange,\n enabled = true,\n duration = 200,\n peek = 0,\n getTopLimit,\n onEscape,\n isBusy,\n}: UseDockedCardOptions) => {\n const scrollerRef = useRef<HTMLElement | null>(null);\n const dimNodeRef = useRef<HTMLElement | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout>>();\n const [viewHeight, setViewHeight] = useState(0);\n const [cardHeight, setCardHeight] = useState(0);\n const [topLimit, setTopLimit] = useState(0);\n const [moving, setMoving] = useState(false);\n const latest = useRef({\n enabled,\n onOpenChange,\n onEscape,\n isBusy,\n getTopLimit,\n });\n\n latest.current = { enabled, onOpenChange, onEscape, isBusy, getTopLimit };\n\n // Found once: a frozen scroller has no scroll in its style, so a later search would miss it.\n const findScroller = useCallback(() => {\n scrollerRef.current =\n scrollerRef.current ?? getScrollParent(cardRef.current);\n\n return scrollerRef.current;\n }, [cardRef]);\n\n // The card moves with a transition only when it opens or closes, not when its content changes its height.\n const setOpen = useCallback(\n (next: boolean) => {\n if (!latest.current.enabled) {\n return;\n }\n\n if (!next) {\n dimNodeRef.current?.animate?.([{ opacity: 1 }, { opacity: 0 }], {\n duration,\n fill: \"forwards\",\n });\n }\n\n clearTimeout(timerRef.current);\n setMoving(true);\n latest.current.onOpenChange(next);\n timerRef.current = setTimeout(() => setMoving(false), duration + 50);\n },\n [duration]\n );\n\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n useEffect(() => {\n const scroller = findScroller();\n const isDocument = isDocumentScroller(scroller);\n const measure = () =>\n setViewHeight(isDocument ? window.innerHeight : scroller.clientHeight);\n\n measure();\n\n if (typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(measure);\n\n observer.observe(isDocument ? document.documentElement : scroller);\n\n return () => observer.disconnect();\n }, [findScroller]);\n\n const measureTopLimit = useCallback(() => {\n const scroller = findScroller();\n const limit = latest.current.getTopLimit?.();\n\n if (!enabled || !scroller || !limit) {\n setTopLimit(0);\n\n return;\n }\n\n const scrollerTop =\n scroller === getDocumentScroller()\n ? 0\n : scroller.getBoundingClientRect().top;\n\n setTopLimit(\n Math.max(\n 0,\n Math.round(limit.getBoundingClientRect().bottom - scrollerTop)\n )\n );\n }, [enabled, findScroller]);\n\n useLayoutEffect(measureTopLimit, [open, viewHeight, measureTopLimit]);\n\n // The limit element can grow after the first measure, such as a title that wraps to a second line.\n useEffect(() => {\n const limit = enabled ? latest.current.getTopLimit?.() : null;\n\n if (!limit || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(measureTopLimit);\n\n observer.observe(limit);\n\n return () => observer.disconnect();\n }, [enabled, open, measureTopLimit]);\n\n // A menu, a list or a dialog above the card takes its own Escape.\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const card = cardRef.current;\n const target = event.target as Element;\n const isOwn =\n target === document.body ||\n target.closest?.(\".c-window\") === card?.closest(\".c-window\");\n const busy = card ? latest.current.isBusy?.(card) ?? false : false;\n\n if (event.key === \"Escape\" && !event.defaultPrevented && isOwn && !busy) {\n event.preventDefault();\n event.stopPropagation();\n (latest.current.onEscape ?? (() => setOpen(false)))();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true);\n\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [open, cardRef, setOpen]);\n\n const dimRef = useCallback(\n (node: HTMLElement | null) => {\n dimNodeRef.current = node;\n node?.animate?.([{ opacity: 0 }, { opacity: 1 }], duration);\n },\n [duration]\n );\n\n // The height places the card, so each render reads it before the paint. The observer covers what comes in later.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n setCardHeight(cardRef.current?.offsetHeight ?? 0);\n });\n\n useLayoutEffect(() => {\n const card = cardRef.current;\n\n if (!card || typeof ResizeObserver === \"undefined\") {\n return undefined;\n }\n\n // eslint-disable-next-line compat/compat\n const observer = new ResizeObserver(() =>\n flushSync(() => setCardHeight(card.offsetHeight))\n );\n\n observer.observe(card);\n\n return () => observer.disconnect();\n }, [cardRef]);\n\n // The page does not scroll under the open card.\n const frozen = open || moving;\n\n useEffect(() => {\n if (!frozen) {\n return undefined;\n }\n\n const scroller = findScroller();\n const previous = scroller.style.overflow;\n\n scroller.style.overflow = \"hidden\";\n\n return () => {\n scroller.style.overflow = previous;\n };\n }, [frozen, findScroller]);\n\n return {\n setOpen,\n moving,\n /** The card and its dim cover the page while the card is open or on its way. */\n lifted: frozen,\n /** The height of the scroll container. */\n viewHeight,\n /** The bottom edge of the limit element, from the top of the scroll container. Zero with no limit. */\n topLimit,\n cardHeight,\n /** How far the closed card stands under the edge. */\n offset: Math.max(0, cardHeight - peek),\n dimRef,\n findScroller,\n };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/dist/index.js
CHANGED
|
@@ -35837,7 +35837,7 @@
|
|
|
35837
35837
|
return observer.disconnect();
|
|
35838
35838
|
};
|
|
35839
35839
|
}, [findScroller]);
|
|
35840
|
-
React.
|
|
35840
|
+
var measureTopLimit = React.useCallback(function () {
|
|
35841
35841
|
var _latest$current$getTo, _latest$current;
|
|
35842
35842
|
var scroller = findScroller();
|
|
35843
35843
|
var limit = (_latest$current$getTo = (_latest$current = latest.current).getTopLimit) === null || _latest$current$getTo === void 0 ? void 0 : _latest$current$getTo.call(_latest$current);
|
|
@@ -35847,7 +35847,24 @@
|
|
|
35847
35847
|
}
|
|
35848
35848
|
var scrollerTop = scroller === getDocumentScroller() ? 0 : scroller.getBoundingClientRect().top;
|
|
35849
35849
|
setTopLimit(Math.max(0, Math.round(limit.getBoundingClientRect().bottom - scrollerTop)));
|
|
35850
|
-
}, [
|
|
35850
|
+
}, [enabled, findScroller]);
|
|
35851
|
+
React.useLayoutEffect(measureTopLimit, [open, viewHeight, measureTopLimit]);
|
|
35852
|
+
|
|
35853
|
+
// The limit element can grow after the first measure, such as a title that wraps to a second line.
|
|
35854
|
+
React.useEffect(function () {
|
|
35855
|
+
var _latest$current$getTo2, _latest$current2;
|
|
35856
|
+
var limit = enabled ? (_latest$current$getTo2 = (_latest$current2 = latest.current).getTopLimit) === null || _latest$current$getTo2 === void 0 ? void 0 : _latest$current$getTo2.call(_latest$current2) : null;
|
|
35857
|
+
if (!limit || typeof ResizeObserver === "undefined") {
|
|
35858
|
+
return undefined;
|
|
35859
|
+
}
|
|
35860
|
+
|
|
35861
|
+
// eslint-disable-next-line compat/compat
|
|
35862
|
+
var observer = new ResizeObserver(measureTopLimit);
|
|
35863
|
+
observer.observe(limit);
|
|
35864
|
+
return function () {
|
|
35865
|
+
return observer.disconnect();
|
|
35866
|
+
};
|
|
35867
|
+
}, [enabled, open, measureTopLimit]);
|
|
35851
35868
|
|
|
35852
35869
|
// A menu, a list or a dialog above the card takes its own Escape.
|
|
35853
35870
|
React.useEffect(function () {
|
|
@@ -35855,11 +35872,11 @@
|
|
|
35855
35872
|
return undefined;
|
|
35856
35873
|
}
|
|
35857
35874
|
var handleKeyDown = function handleKeyDown(event) {
|
|
35858
|
-
var _target$closest, _latest$current$isBus, _latest$current$isBus2, _latest$
|
|
35875
|
+
var _target$closest, _latest$current$isBus, _latest$current$isBus2, _latest$current3;
|
|
35859
35876
|
var card = cardRef.current;
|
|
35860
35877
|
var target = event.target;
|
|
35861
35878
|
var isOwn = target === document.body || ((_target$closest = target.closest) === null || _target$closest === void 0 ? void 0 : _target$closest.call(target, ".c-window")) === (card === null || card === void 0 ? void 0 : card.closest(".c-window"));
|
|
35862
|
-
var busy = card ? (_latest$current$isBus = (_latest$current$isBus2 = (_latest$
|
|
35879
|
+
var busy = card ? (_latest$current$isBus = (_latest$current$isBus2 = (_latest$current3 = latest.current).isBusy) === null || _latest$current$isBus2 === void 0 ? void 0 : _latest$current$isBus2.call(_latest$current3, card)) !== null && _latest$current$isBus !== void 0 ? _latest$current$isBus : false : false;
|
|
35863
35880
|
if (event.key === "Escape" && !event.defaultPrevented && isOwn && !busy) {
|
|
35864
35881
|
var _latest$current$onEsc;
|
|
35865
35882
|
event.preventDefault();
|