@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.
@@ -133,7 +133,7 @@ var useDockedCard = exports.useDockedCard = function useDockedCard(_ref) {
133
133
  return observer.disconnect();
134
134
  };
135
135
  }, [findScroller]);
136
- (0, _react.useLayoutEffect)(function () {
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
- }, [open, enabled, viewHeight, findScroller]);
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$current2;
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$current2 = latest.current).isBusy) === null || _latest$current$isBus2 === void 0 ? void 0 : _latest$current$isBus2.call(_latest$current2, card)) !== null && _latest$current$isBus !== void 0 ? _latest$current$isBus : false : false;
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":"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","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":"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","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;;IA+Id,gFAAgF;;IAEhF,0CAA0C;;IAE1C,sGAAsG;;;IAGtG,qDAAqD;;mBA1D9C,WAAW,GAAG,IAAI;;CA+D5B,CAAC"}
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
- useLayoutEffect(() => {
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
- }, [open, enabled, viewHeight, findScroller]);
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":"AAAA,SAEEA,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SAASC,SAAS,QAAQ,WAAW;AAErC,MAAMC,mBAAmB,GAAGA,CAAA,KACzBC,QAAQ,CAACC,gBAAgB,IAAID,QAAQ,CAACE,eAA+B;;AAExE;AACA,OAAO,MAAMC,eAAe,GAAIC,IAAqB,IAAkB;EACrE,IAAIC,OAAO,GAAGD,IAAI,oBAAJA,IAAI,CAAEE,aAAa;EAEjC,OAAOD,OAAO,IAAIA,OAAO,KAAKL,QAAQ,CAACO,IAAI,EAAE;IAC3C,MAAAC,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,OAAOP,mBAAmB,CAAC,CAAC;AAC9B,CAAC;AAED,MAAMa,kBAAkB,GAAIP,OAAoB,IAC9CA,OAAO,KAAKL,QAAQ,CAACC,gBAAgB,IAAII,OAAO,KAAKL,QAAQ,CAACE,eAAe;AAoB/E;AACA,OAAO,MAAMW,aAAa,GAAGC,IAAA,IAUD;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,MAAMC,WAAW,GAAG/B,MAAM,CAAqB,IAAI,CAAC;EACpD,MAAMgC,UAAU,GAAGhC,MAAM,CAAqB,IAAI,CAAC;EACnD,MAAMiC,QAAQ,GAAGjC,MAAM,CAAgC,CAAC;EACxD,MAAAkC,SAAA,GAAoCjC,QAAQ,CAAC,CAAC,CAAC;IAAxCkC,UAAU,GAAAD,SAAA;IAAEE,aAAa,GAAAF,SAAA;EAChC,MAAAG,UAAA,GAAoCpC,QAAQ,CAAC,CAAC,CAAC;IAAxCqC,UAAU,GAAAD,UAAA;IAAEE,aAAa,GAAAF,UAAA;EAChC,MAAAG,UAAA,GAAgCvC,QAAQ,CAAC,CAAC,CAAC;IAApCwC,QAAQ,GAAAD,UAAA;IAAEE,WAAW,GAAAF,UAAA;EAC5B,MAAAG,UAAA,GAA4B1C,QAAQ,CAAC,KAAK,CAAC;IAApC2C,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EACxB,MAAMG,MAAM,GAAG9C,MAAM,CAAC;IACpBuB,OAAO;IACPF,YAAY;IACZQ,QAAQ;IACRC,MAAM;IACNF;EACF,CAAC,CAAC;EAEFkB,MAAM,CAACC,OAAO,GAAG;IAAExB,OAAO;IAAEF,YAAY;IAAEQ,QAAQ;IAAEC,MAAM;IAAEF;EAAY,CAAC;;EAEzE;EACA,MAAMoB,YAAY,GAAGnD,WAAW,CAAC,MAAM;IAAA,IAAAoD,oBAAA;IACrClB,WAAW,CAACgB,OAAO,IAAAE,oBAAA,GACjBlB,WAAW,CAACgB,OAAO,YAAAE,oBAAA,GAAI1C,eAAe,CAACY,OAAO,CAAC4B,OAAO,CAAC;IAEzD,OAAOhB,WAAW,CAACgB,OAAO;EAC5B,CAAC,EAAE,CAAC5B,OAAO,CAAC,CAAC;;EAEb;EACA,MAAM+B,OAAO,GAAGrD,WAAW,CACxBsD,IAAa,IAAK;IACjB,IAAI,CAACL,MAAM,CAACC,OAAO,CAACxB,OAAO,EAAE;MAC3B;IACF;IAEA,IAAI,CAAC4B,IAAI,EAAE;MAAA,IAAAC,mBAAA;MACT,CAAAA,mBAAA,GAAApB,UAAU,CAACe,OAAO,aAAlBK,mBAAA,CAAoBC,OAAO,YAA3BD,mBAAA,CAAoBC,OAAO,CAAG,CAAC;QAAEC,OAAO,EAAE;MAAE,CAAC,EAAE;QAAEA,OAAO,EAAE;MAAE,CAAC,CAAC,EAAE;QAC9D7B,QAAQ;QACR8B,IAAI,EAAE;MACR,CAAC,CAAC;IACJ;IAEAC,YAAY,CAACvB,QAAQ,CAACc,OAAO,CAAC;IAC9BF,SAAS,CAAC,IAAI,CAAC;IACfC,MAAM,CAACC,OAAO,CAAC1B,YAAY,CAAC8B,IAAI,CAAC;IACjClB,QAAQ,CAACc,OAAO,GAAGU,UAAU,CAAC,MAAMZ,SAAS,CAAC,KAAK,CAAC,EAAEpB,QAAQ,GAAG,EAAE,CAAC;EACtE,CAAC,EACD,CAACA,QAAQ,CACX,CAAC;EAED3B,SAAS,CAAC,MAAM,MAAM0D,YAAY,CAACvB,QAAQ,CAACc,OAAO,CAAC,EAAE,EAAE,CAAC;EAEzDjD,SAAS,CAAC,MAAM;IACd,MAAM4D,QAAQ,GAAGV,YAAY,CAAC,CAAC;IAC/B,MAAMW,UAAU,GAAG3C,kBAAkB,CAAC0C,QAAQ,CAAC;IAC/C,MAAME,OAAO,GAAGA,CAAA,KACdxB,aAAa,CAACuB,UAAU,GAAG9C,MAAM,CAACgD,WAAW,GAAGH,QAAQ,CAACI,YAAY,CAAC;IAExEF,OAAO,CAAC,CAAC;IAET,IAAI,OAAOG,cAAc,KAAK,WAAW,EAAE;MACzC,OAAOC,SAAS;IAClB;;IAEA;IACA,MAAMC,QAAQ,GAAG,IAAIF,cAAc,CAACH,OAAO,CAAC;IAE5CK,QAAQ,CAACC,OAAO,CAACP,UAAU,GAAGvD,QAAQ,CAACE,eAAe,GAAGoD,QAAQ,CAAC;IAElE,OAAO,MAAMO,QAAQ,CAACE,UAAU,CAAC,CAAC;EACpC,CAAC,EAAE,CAACnB,YAAY,CAAC,CAAC;EAElB,MAAMoB,eAAe,GAAGvE,WAAW,CAAC,MAAM;IACxC,MAAM6D,QAAQ,GAAGV,YAAY,CAAC,CAAC;IAC/B,MAAMqB,KAAK,GAAGvB,MAAM,CAACC,OAAO,CAACnB,WAAW,oBAA1BkB,MAAM,CAACC,OAAO,CAACnB,WAAW,CAAG,CAAC;IAE5C,IAAI,CAACL,OAAO,IAAI,CAACmC,QAAQ,IAAI,CAACW,KAAK,EAAE;MACnC3B,WAAW,CAAC,CAAC,CAAC;MAEd;IACF;IAEA,MAAM4B,WAAW,GACfZ,QAAQ,KAAKvD,mBAAmB,CAAC,CAAC,GAC9B,CAAC,GACDuD,QAAQ,CAACa,qBAAqB,CAAC,CAAC,CAACC,GAAG;IAE1C9B,WAAW,CACT+B,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,CAAC/C,OAAO,EAAEyB,YAAY,CAAC,CAAC;EAE3BjD,eAAe,CAACqE,eAAe,EAAE,CAAChD,IAAI,EAAEe,UAAU,EAAEiC,eAAe,CAAC,CAAC;;EAErE;EACAtE,SAAS,CAAC,MAAM;IACd,MAAMuE,KAAK,GAAG9C,OAAO,GAAGuB,MAAM,CAACC,OAAO,CAACnB,WAAW,oBAA1BkB,MAAM,CAACC,OAAO,CAACnB,WAAW,CAAG,CAAC,GAAG,IAAI;IAE7D,IAAI,CAACyC,KAAK,IAAI,OAAON,cAAc,KAAK,WAAW,EAAE;MACnD,OAAOC,SAAS;IAClB;;IAEA;IACA,MAAMC,QAAQ,GAAG,IAAIF,cAAc,CAACK,eAAe,CAAC;IAEpDH,QAAQ,CAACC,OAAO,CAACG,KAAK,CAAC;IAEvB,OAAO,MAAMJ,QAAQ,CAACE,UAAU,CAAC,CAAC;EACpC,CAAC,EAAE,CAAC5C,OAAO,EAAEH,IAAI,EAAEgD,eAAe,CAAC,CAAC;;EAEpC;EACAtE,SAAS,CAAC,MAAM;IACd,IAAI,CAACsB,IAAI,EAAE;MACT,OAAO4C,SAAS;IAClB;IAEA,MAAMa,aAAa,GAAIC,KAAoB,IAAK;MAAA,IAAAC,qBAAA;MAC9C,MAAMC,IAAI,GAAG7D,OAAO,CAAC4B,OAAO;MAC5B,MAAMkC,MAAM,GAAGH,KAAK,CAACG,MAAiB;MACtC,MAAMC,KAAK,GACTD,MAAM,KAAK7E,QAAQ,CAACO,IAAI,IACxB,CAAAsE,MAAM,CAACE,OAAO,oBAAdF,MAAM,CAACE,OAAO,CAAG,WAAW,CAAC,OAAKH,IAAI,oBAAJA,IAAI,CAAEG,OAAO,CAAC,WAAW,CAAC;MAC9D,MAAMC,IAAI,GAAGJ,IAAI,IAAAD,qBAAA,GAAGjC,MAAM,CAACC,OAAO,CAACjB,MAAM,oBAArBgB,MAAM,CAACC,OAAO,CAACjB,MAAM,CAAGkD,IAAI,CAAC,YAAAD,qBAAA,GAAI,KAAK,GAAG,KAAK;MAElE,IAAID,KAAK,CAACO,GAAG,KAAK,QAAQ,IAAI,CAACP,KAAK,CAACQ,gBAAgB,IAAIJ,KAAK,IAAI,CAACE,IAAI,EAAE;QAAA,IAAAG,qBAAA;QACvET,KAAK,CAACU,cAAc,CAAC,CAAC;QACtBV,KAAK,CAACW,eAAe,CAAC,CAAC;QACvB,EAAAF,qBAAA,GAACzC,MAAM,CAACC,OAAO,CAAClB,QAAQ,YAAA0D,qBAAA,GAAK,MAAMrC,OAAO,CAAC,KAAK,CAAC,EAAG,CAAC;MACvD;IACF,CAAC;IAED9C,QAAQ,CAACsF,gBAAgB,CAAC,SAAS,EAAEb,aAAa,EAAE,IAAI,CAAC;IAEzD,OAAO,MAAMzE,QAAQ,CAACuF,mBAAmB,CAAC,SAAS,EAAEd,aAAa,EAAE,IAAI,CAAC;EAC3E,CAAC,EAAE,CAACzD,IAAI,EAAED,OAAO,EAAE+B,OAAO,CAAC,CAAC;EAE5B,MAAM0C,MAAM,GAAG/F,WAAW,CACvBW,IAAwB,IAAK;IAC5BwB,UAAU,CAACe,OAAO,GAAGvC,IAAI;IACzBA,IAAI,YAAJA,IAAI,CAAE6C,OAAO,YAAb7C,IAAI,CAAE6C,OAAO,CAAG,CAAC;MAAEC,OAAO,EAAE;IAAE,CAAC,EAAE;MAAEA,OAAO,EAAE;IAAE,CAAC,CAAC,EAAE7B,QAAQ,CAAC;EAC7D,CAAC,EACD,CAACA,QAAQ,CACX,CAAC;;EAED;EACA;EACA1B,eAAe,CAAC,MAAM;IAAA,IAAA8F,qBAAA,EAAAC,gBAAA;IACpBvD,aAAa,EAAAsD,qBAAA,IAAAC,gBAAA,GAAC3E,OAAO,CAAC4B,OAAO,qBAAf+C,gBAAA,CAAiBC,YAAY,YAAAF,qBAAA,GAAI,CAAC,CAAC;EACnD,CAAC,CAAC;EAEF9F,eAAe,CAAC,MAAM;IACpB,MAAMiF,IAAI,GAAG7D,OAAO,CAAC4B,OAAO;IAE5B,IAAI,CAACiC,IAAI,IAAI,OAAOjB,cAAc,KAAK,WAAW,EAAE;MAClD,OAAOC,SAAS;IAClB;;IAEA;IACA,MAAMC,QAAQ,GAAG,IAAIF,cAAc,CAAC,MAClC7D,SAAS,CAAC,MAAMqC,aAAa,CAACyC,IAAI,CAACe,YAAY,CAAC,CAClD,CAAC;IAED9B,QAAQ,CAACC,OAAO,CAACc,IAAI,CAAC;IAEtB,OAAO,MAAMf,QAAQ,CAACE,UAAU,CAAC,CAAC;EACpC,CAAC,EAAE,CAAChD,OAAO,CAAC,CAAC;;EAEb;EACA,MAAM6E,MAAM,GAAG5E,IAAI,IAAIwB,MAAM;EAE7B9C,SAAS,CAAC,MAAM;IACd,IAAI,CAACkG,MAAM,EAAE;MACX,OAAOhC,SAAS;IAClB;IAEA,MAAMN,QAAQ,GAAGV,YAAY,CAAC,CAAC;IAC/B,MAAMiD,QAAQ,GAAGvC,QAAQ,CAACwC,KAAK,CAACC,QAAQ;IAExCzC,QAAQ,CAACwC,KAAK,CAACC,QAAQ,GAAG,QAAQ;IAElC,OAAO,MAAM;MACXzC,QAAQ,CAACwC,KAAK,CAACC,QAAQ,GAAGF,QAAQ;IACpC,CAAC;EACH,CAAC,EAAE,CAACD,MAAM,EAAEhD,YAAY,CAAC,CAAC;EAE1B,OAAO;IACLE,OAAO;IACPN,MAAM;IACN;IACAwD,MAAM,EAAEJ,MAAM;IACd;IACA7D,UAAU;IACV;IACAM,QAAQ;IACRH,UAAU;IACV;IACA+D,MAAM,EAAE5B,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEpC,UAAU,GAAGX,IAAI,CAAC;IACtCiE,MAAM;IACN5C;EACF,CAAC;AACH,CAAC","ignoreList":[]}
package/dist/index.js CHANGED
@@ -35837,7 +35837,7 @@
35837
35837
  return observer.disconnect();
35838
35838
  };
35839
35839
  }, [findScroller]);
35840
- React.useLayoutEffect(function () {
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
- }, [open, enabled, viewHeight, findScroller]);
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$current2;
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$current2 = latest.current).isBusy) === null || _latest$current$isBus2 === void 0 ? void 0 : _latest$current$isBus2.call(_latest$current2, card)) !== null && _latest$current$isBus !== void 0 ? _latest$current$isBus : false : false;
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();