@stackone/malachite 2.37.1 → 2.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENTS.md +7 -2
- package/dist/assets/icons/account.svg.js +2 -2
- package/dist/assets/icons/account.svg.js.map +1 -1
- package/dist/assets/icons/building.svg.js +6 -0
- package/dist/assets/icons/building.svg.js.map +1 -0
- package/dist/assets/icons/chevrons_up_down.svg.js +6 -0
- package/dist/assets/icons/chevrons_up_down.svg.js.map +1 -0
- package/dist/assets/icons/connector.svg.js +6 -0
- package/dist/assets/icons/connector.svg.js.map +1 -0
- package/dist/assets/icons/external_link.svg.js +6 -0
- package/dist/assets/icons/external_link.svg.js.map +1 -0
- package/dist/assets/icons/field_coverage.svg.js +6 -0
- package/dist/assets/icons/field_coverage.svg.js.map +1 -0
- package/dist/assets/icons/layout.svg.js +6 -0
- package/dist/assets/icons/layout.svg.js.map +1 -0
- package/dist/assets/icons/link.svg.js +6 -0
- package/dist/assets/icons/link.svg.js.map +1 -0
- package/dist/assets/icons/playground.svg.js +6 -0
- package/dist/assets/icons/playground.svg.js.map +1 -0
- package/dist/components/ActionMenu.js +139 -170
- package/dist/components/ActionMenu.js.map +1 -1
- package/dist/components/Chat/ChatModelPicker.js +64 -60
- package/dist/components/Chat/ChatModelPicker.js.map +1 -1
- package/dist/components/CustomIcons/BuildingIcon.js +16 -0
- package/dist/components/CustomIcons/BuildingIcon.js.map +1 -0
- package/dist/components/CustomIcons/ChevronsUpDownIcon.js +16 -0
- package/dist/components/CustomIcons/ChevronsUpDownIcon.js.map +1 -0
- package/dist/components/CustomIcons/ConnectorIcon.js +16 -0
- package/dist/components/CustomIcons/ConnectorIcon.js.map +1 -0
- package/dist/components/CustomIcons/ExternalLinkIcon.js +16 -0
- package/dist/components/CustomIcons/ExternalLinkIcon.js.map +1 -0
- package/dist/components/CustomIcons/FieldCoverageIcon.js +16 -0
- package/dist/components/CustomIcons/FieldCoverageIcon.js.map +1 -0
- package/dist/components/CustomIcons/LayoutIcon.js +16 -0
- package/dist/components/CustomIcons/LayoutIcon.js.map +1 -0
- package/dist/components/CustomIcons/LinkIcon.js +16 -0
- package/dist/components/CustomIcons/LinkIcon.js.map +1 -0
- package/dist/components/CustomIcons/PlaygroundIcon.js +16 -0
- package/dist/components/CustomIcons/PlaygroundIcon.js.map +1 -0
- package/dist/components/CustomIcons/index.js +303 -279
- package/dist/components/CustomIcons/index.js.map +1 -1
- package/dist/components/NavItem.js +158 -0
- package/dist/components/NavItem.js.map +1 -0
- package/dist/components/Popover.js +262 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/PopoverParts.js +46 -0
- package/dist/components/PopoverParts.js.map +1 -0
- package/dist/components/QueryInput.js +103 -97
- package/dist/components/QueryInput.js.map +1 -1
- package/dist/components/SearchTrigger.js +37 -0
- package/dist/components/SearchTrigger.js.map +1 -0
- package/dist/components/Sidebar.js +174 -0
- package/dist/components/Sidebar.js.map +1 -0
- package/dist/components/Tooltip.js +97 -92
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/UsageCard.js +44 -0
- package/dist/components/UsageCard.js.map +1 -0
- package/dist/components/actionMenuKeyboard.js +23 -0
- package/dist/components/actionMenuKeyboard.js.map +1 -0
- package/dist/components/actionMenuStyles.js +83 -0
- package/dist/components/actionMenuStyles.js.map +1 -0
- package/dist/components/ariaState.js +5 -0
- package/dist/components/ariaState.js.map +1 -0
- package/dist/components/chromeStyles.js +6 -0
- package/dist/components/chromeStyles.js.map +1 -0
- package/dist/components/composeRefs.js +27 -0
- package/dist/components/composeRefs.js.map +1 -0
- package/dist/components/floatingMenuGeometry.js +74 -35
- package/dist/components/floatingMenuGeometry.js.map +1 -1
- package/dist/components/overlayBehaviour.js +90 -84
- package/dist/components/overlayBehaviour.js.map +1 -1
- package/dist/components/popoverTree.js +14 -0
- package/dist/components/popoverTree.js.map +1 -0
- package/dist/components/portalOverlay.js +28 -22
- package/dist/components/portalOverlay.js.map +1 -1
- package/dist/components/sidebarContext.js +9 -0
- package/dist/components/sidebarContext.js.map +1 -0
- package/dist/components/topLayer.js +18 -18
- package/dist/components/topLayer.js.map +1 -1
- package/dist/components/useActionMenuPosition.js +73 -0
- package/dist/components/useActionMenuPosition.js.map +1 -0
- package/dist/components/useHoverClose.js +18 -0
- package/dist/components/useHoverClose.js.map +1 -0
- package/dist/components/useLatestRef.js +11 -0
- package/dist/components/useLatestRef.js.map +1 -0
- package/dist/components/usePopoverPosition.js +62 -0
- package/dist/components/usePopoverPosition.js.map +1 -0
- package/dist/components/usePopoverTree.js +34 -0
- package/dist/components/usePopoverTree.js.map +1 -0
- package/dist/index.d.ts +387 -100
- package/dist/index.js +365 -335
- package/dist/index.js.map +1 -1
- package/dist/tailwind.css.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActionMenuPosition.js","sources":["../../src/components/useActionMenuPosition.ts"],"sourcesContent":["import {\n type RefObject,\n useCallback,\n useInsertionEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { ensureActionMenuStyles } from './actionMenuStyles';\nimport type { ActionMenuPlacement } from './actionMenuTypes';\nimport {\n FLOATING_OFFSET_PX,\n type FloatingOffset,\n MENU_MAX_HEIGHT_PX,\n type MenuGeometry,\n computeFloatingGeometry,\n fullPanelHeight,\n measureContentWidth,\n measureMenuGeometry,\n rectSignature,\n} from './floatingMenuGeometry';\nimport { useTopLayer } from './topLayer';\n\ninterface PositionOptions {\n minWidth?: number;\n placement: ActionMenuPlacement;\n offset?: FloatingOffset;\n}\n\nexport const useActionMenuPosition = (\n open: boolean,\n triggerRef: RefObject<HTMLElement | null>,\n menuRef: RefObject<HTMLDivElement | null>,\n { minWidth, placement, offset }: PositionOptions,\n): MenuGeometry | null => {\n const [position, setPosition] = useState<MenuGeometry | null>(null);\n const contentWidth = useRef<number | undefined>(undefined);\n const contentDirty = useRef(true);\n\n useTopLayer(menuRef, open);\n\n useInsertionEffect(() => {\n if (open) {\n ensureActionMenuStyles();\n }\n }, [open]);\n\n const update = useCallback(() => {\n const trigger = triggerRef.current;\n if (!trigger) {\n return;\n }\n const menu = menuRef.current;\n if (menu && contentDirty.current) {\n const inlineWidth = menu.style.width;\n menu.style.width = '';\n contentWidth.current = measureContentWidth(menu) ?? contentWidth.current;\n menu.style.width = inlineWidth;\n contentDirty.current = false;\n }\n const triggerRect = trigger.getBoundingClientRect();\n const geometry = measureMenuGeometry(menu, {\n triggerRect,\n preset: 'options',\n minWidth,\n contentWidth: contentWidth.current,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n if ((placement === 'bottom-end' && offset === undefined) || !menu) {\n setPosition(geometry);\n return;\n }\n const floating = computeFloatingGeometry({\n triggerRect,\n placement,\n panelWidth: geometry.width,\n panelHeight: Math.min(fullPanelHeight(menu), MENU_MAX_HEIGHT_PX),\n gap: FLOATING_OFFSET_PX[offset ?? 'small'],\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n setPosition({\n ...geometry,\n top: floating.top,\n left: floating.left,\n maxHeight: Math.min(MENU_MAX_HEIGHT_PX, floating.maxHeight),\n openUp: floating.side === 'top',\n });\n }, [triggerRef, menuRef, minWidth, placement, offset]);\n\n useLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n contentWidth.current = undefined;\n contentDirty.current = true;\n return;\n }\n contentDirty.current = true;\n update();\n let frame = 0;\n let menuResized = false;\n let lastRect = triggerRef.current\n ? rectSignature(triggerRef.current.getBoundingClientRect())\n : '';\n const followTrigger = () => {\n const trigger = triggerRef.current;\n const signature = trigger ? rectSignature(trigger.getBoundingClientRect()) : '';\n if (signature !== lastRect || menuResized) {\n lastRect = signature;\n menuResized = false;\n update();\n }\n frame = requestAnimationFrame(followTrigger);\n };\n frame = requestAnimationFrame(followTrigger);\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n const menu = menuRef.current;\n const observer =\n menu && typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => {\n menuResized = true;\n })\n : null;\n const contentWatcher =\n menu && typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n contentDirty.current = true;\n menuResized = true;\n })\n : null;\n if (menu) {\n observer?.observe(menu);\n contentWatcher?.observe(menu, { childList: true, subtree: true, characterData: true });\n }\n return () => {\n cancelAnimationFrame(frame);\n observer?.disconnect();\n contentWatcher?.disconnect();\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [open, update, triggerRef, menuRef]);\n\n return position;\n};\n"],"names":["useActionMenuPosition","open","triggerRef","menuRef","minWidth","placement","offset","position","setPosition","useState","contentWidth","useRef","contentDirty","useTopLayer","useInsertionEffect","ensureActionMenuStyles","update","useCallback","trigger","menu","inlineWidth","measureContentWidth","triggerRect","geometry","measureMenuGeometry","floating","computeFloatingGeometry","fullPanelHeight","MENU_MAX_HEIGHT_PX","FLOATING_OFFSET_PX","useLayoutEffect","frame","menuResized","lastRect","rectSignature","followTrigger","signature","observer","contentWatcher"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useRef as t, useCallback as f, useEffect as m } from "react";
|
|
2
|
+
import { HOVER_CLOSE_DELAY_MS as C } from "./popoverTree.js";
|
|
3
|
+
const T = ({ isOpenRef: c, heldByChildren: s, setOpen: n }) => {
|
|
4
|
+
const o = t(!1), u = t(!1), l = t(!1), e = t(null), r = f(() => {
|
|
5
|
+
e.current && (clearTimeout(e.current), e.current = null);
|
|
6
|
+
}, []), i = f(() => {
|
|
7
|
+
r(), e.current = setTimeout(() => {
|
|
8
|
+
e.current = null;
|
|
9
|
+
const a = s.current > 0 || o.current || u.current || l.current;
|
|
10
|
+
c.current && !a && n(!1);
|
|
11
|
+
}, C);
|
|
12
|
+
}, [r, n, c, s]);
|
|
13
|
+
return m(() => r, [r]), { pointerInside: o, focusInside: u, triggerFocused: l, cancelClose: r, scheduleClose: i };
|
|
14
|
+
};
|
|
15
|
+
export {
|
|
16
|
+
T as useHoverClose
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=useHoverClose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHoverClose.js","sources":["../../src/components/useHoverClose.ts"],"sourcesContent":["import { type MutableRefObject, useCallback, useEffect, useRef } from 'react';\nimport { HOVER_CLOSE_DELAY_MS } from './popoverTree';\n\ninterface HoverCloseOptions {\n isOpenRef: MutableRefObject<boolean>;\n heldByChildren: MutableRefObject<number>;\n setOpen: (open: boolean) => void;\n}\n\nexport const useHoverClose = ({ isOpenRef, heldByChildren, setOpen }: HoverCloseOptions) => {\n const pointerInside = useRef(false);\n const focusInside = useRef(false);\n const triggerFocused = useRef(false);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelClose = useCallback(() => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n }, []);\n\n const scheduleClose = useCallback(() => {\n cancelClose();\n closeTimer.current = setTimeout(() => {\n closeTimer.current = null;\n const stillWanted =\n heldByChildren.current > 0 ||\n pointerInside.current ||\n focusInside.current ||\n triggerFocused.current;\n if (isOpenRef.current && !stillWanted) {\n setOpen(false);\n }\n }, HOVER_CLOSE_DELAY_MS);\n }, [cancelClose, setOpen, isOpenRef, heldByChildren]);\n\n useEffect(() => cancelClose, [cancelClose]);\n\n return { pointerInside, focusInside, triggerFocused, cancelClose, scheduleClose };\n};\n"],"names":["useHoverClose","isOpenRef","heldByChildren","setOpen","pointerInside","useRef","focusInside","triggerFocused","closeTimer","cancelClose","useCallback","scheduleClose","stillWanted","HOVER_CLOSE_DELAY_MS","useEffect"],"mappings":";;AASO,MAAMA,IAAgB,CAAC,EAAE,WAAAC,GAAW,gBAAAC,GAAgB,SAAAC,QAAiC;AACxF,QAAMC,IAAgBC,EAAO,EAAK,GAC5BC,IAAcD,EAAO,EAAK,GAC1BE,IAAiBF,EAAO,EAAK,GAC7BG,IAAaH,EAA6C,IAAI,GAE9DI,IAAcC,EAAY,MAAM;AAClC,IAAIF,EAAW,YACX,aAAaA,EAAW,OAAO,GAC/BA,EAAW,UAAU;AAAA,EAE7B,GAAG,CAAA,CAAE,GAECG,IAAgBD,EAAY,MAAM;AACpC,IAAAD,EAAA,GACAD,EAAW,UAAU,WAAW,MAAM;AAClC,MAAAA,EAAW,UAAU;AACrB,YAAMI,IACFV,EAAe,UAAU,KACzBE,EAAc,WACdE,EAAY,WACZC,EAAe;AACnB,MAAIN,EAAU,WAAW,CAACW,KACtBT,EAAQ,EAAK;AAAA,IAErB,GAAGU,CAAoB;AAAA,EAC3B,GAAG,CAACJ,GAAaN,GAASF,GAAWC,CAAc,CAAC;AAEpD,SAAAY,EAAU,MAAML,GAAa,CAACA,CAAW,CAAC,GAEnC,EAAE,eAAAL,GAAe,aAAAE,GAAa,gBAAAC,GAAgB,aAAAE,GAAa,eAAAE,EAAA;AACtE;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLatestRef.js","sources":["../../src/components/useLatestRef.ts"],"sourcesContent":["import { type MutableRefObject, useLayoutEffect, useRef } from 'react';\n\nexport const useLatestRef = <T>(value: T): MutableRefObject<T> => {\n const ref = useRef(value);\n useLayoutEffect(() => {\n ref.current = value;\n });\n return ref;\n};\n"],"names":["useLatestRef","value","ref","useRef","useLayoutEffect"],"mappings":";AAEO,MAAMA,IAAe,CAAIC,MAAkC;AAC9D,QAAMC,IAAMC,EAAOF,CAAK;AACxB,SAAAG,EAAgB,MAAM;AAClB,IAAAF,EAAI,UAAUD;AAAA,EAClB,CAAC,GACMC;AACX;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { useState as F, useInsertionEffect as L, useCallback as H, useLayoutEffect as a, useEffect as h } from "react";
|
|
2
|
+
import { computeFloatingGeometry as x, fullPanelHeight as z, FLOATING_OFFSET_PX as A, rectSignature as P } from "./floatingMenuGeometry.js";
|
|
3
|
+
import { ensurePopoverStyles as W } from "./portalOverlay.js";
|
|
4
|
+
import { useTopLayer as G } from "./topLayer.js";
|
|
5
|
+
const S = (e, t) => e !== null && e.top === t.top && e.left === t.left && e.maxHeight === t.maxHeight && e.side === t.side, B = ({
|
|
6
|
+
isOpen: e,
|
|
7
|
+
panel: t,
|
|
8
|
+
hostRef: v,
|
|
9
|
+
triggerRef: c,
|
|
10
|
+
anchorRef: r,
|
|
11
|
+
placement: d,
|
|
12
|
+
width: m,
|
|
13
|
+
offset: w
|
|
14
|
+
}) => {
|
|
15
|
+
const [E, g] = F(null);
|
|
16
|
+
G(v, e && t !== null), L(() => {
|
|
17
|
+
e && W();
|
|
18
|
+
}, [e]);
|
|
19
|
+
const o = H(() => {
|
|
20
|
+
const n = (r == null ? void 0 : r.current) ?? c.current;
|
|
21
|
+
if (!n || !t)
|
|
22
|
+
return;
|
|
23
|
+
const u = n.getBoundingClientRect(), s = m === "trigger" ? `${u.width}px` : "";
|
|
24
|
+
t.style.width !== s && (t.style.width = s);
|
|
25
|
+
const l = x({
|
|
26
|
+
triggerRect: u,
|
|
27
|
+
placement: d,
|
|
28
|
+
panelWidth: t.offsetWidth,
|
|
29
|
+
panelHeight: z(t),
|
|
30
|
+
gap: A[w],
|
|
31
|
+
viewportWidth: window.innerWidth,
|
|
32
|
+
viewportHeight: window.innerHeight
|
|
33
|
+
});
|
|
34
|
+
g((i) => S(i, l) ? i : l);
|
|
35
|
+
}, [t, d, m, r, c, w]);
|
|
36
|
+
return a(() => {
|
|
37
|
+
if (!e) {
|
|
38
|
+
g(null);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
o();
|
|
42
|
+
}, [e, o]), h(() => {
|
|
43
|
+
if (!e)
|
|
44
|
+
return;
|
|
45
|
+
let n = 0, u = "", s = !1;
|
|
46
|
+
const l = () => {
|
|
47
|
+
const f = (r == null ? void 0 : r.current) ?? c.current, y = f ? P(f.getBoundingClientRect()) : "";
|
|
48
|
+
(y !== u || s) && (u = y, s = !1, o()), n = requestAnimationFrame(l);
|
|
49
|
+
};
|
|
50
|
+
n = requestAnimationFrame(l), window.addEventListener("scroll", o, !0), window.addEventListener("resize", o);
|
|
51
|
+
const i = t && typeof ResizeObserver < "u" ? new ResizeObserver(() => {
|
|
52
|
+
s = !0;
|
|
53
|
+
}) : null;
|
|
54
|
+
return t && (i == null || i.observe(t)), () => {
|
|
55
|
+
cancelAnimationFrame(n), window.removeEventListener("scroll", o, !0), window.removeEventListener("resize", o), i == null || i.disconnect();
|
|
56
|
+
};
|
|
57
|
+
}, [e, t, o, r, c]), E;
|
|
58
|
+
};
|
|
59
|
+
export {
|
|
60
|
+
B as usePopoverPosition
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=usePopoverPosition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePopoverPosition.js","sources":["../../src/components/usePopoverPosition.ts"],"sourcesContent":["import {\n type RefObject,\n useCallback,\n useEffect,\n useInsertionEffect,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n FLOATING_OFFSET_PX,\n type FloatingGeometry,\n type FloatingOffset,\n type FloatingPlacement,\n computeFloatingGeometry,\n fullPanelHeight,\n rectSignature,\n} from './floatingMenuGeometry';\nimport { ensurePopoverStyles } from './portalOverlay';\nimport { useTopLayer } from './topLayer';\n\ninterface PopoverPositionOptions {\n isOpen: boolean;\n panel: HTMLDivElement | null;\n hostRef: RefObject<HTMLDivElement | null>;\n triggerRef: RefObject<HTMLElement | null>;\n anchorRef?: RefObject<HTMLElement | null>;\n placement: FloatingPlacement;\n width: 'content' | 'trigger';\n offset: FloatingOffset;\n}\n\nconst sameGeometry = (a: FloatingGeometry | null, b: FloatingGeometry): boolean =>\n a !== null &&\n a.top === b.top &&\n a.left === b.left &&\n a.maxHeight === b.maxHeight &&\n a.side === b.side;\n\nexport const usePopoverPosition = ({\n isOpen,\n panel,\n hostRef,\n triggerRef,\n anchorRef,\n placement,\n width,\n offset,\n}: PopoverPositionOptions): FloatingGeometry | null => {\n const [geometry, setGeometry] = useState<FloatingGeometry | null>(null);\n\n useTopLayer(hostRef, isOpen && panel !== null);\n\n useInsertionEffect(() => {\n if (isOpen) {\n ensurePopoverStyles();\n }\n }, [isOpen]);\n\n const reposition = useCallback(() => {\n const anchor = anchorRef?.current ?? triggerRef.current;\n if (!anchor || !panel) {\n return;\n }\n const rect = anchor.getBoundingClientRect();\n const cssWidth = width === 'trigger' ? `${rect.width}px` : '';\n if (panel.style.width !== cssWidth) {\n panel.style.width = cssWidth;\n }\n const next = computeFloatingGeometry({\n triggerRect: rect,\n placement,\n panelWidth: panel.offsetWidth,\n panelHeight: fullPanelHeight(panel),\n gap: FLOATING_OFFSET_PX[offset],\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n });\n setGeometry((prev) => (sameGeometry(prev, next) ? prev : next));\n }, [panel, placement, width, anchorRef, triggerRef, offset]);\n\n useLayoutEffect(() => {\n if (!isOpen) {\n setGeometry(null);\n return;\n }\n reposition();\n }, [isOpen, reposition]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n let frame = 0;\n let lastRect = '';\n let panelResized = false;\n const followAnchor = () => {\n const anchor = anchorRef?.current ?? triggerRef.current;\n const signature = anchor ? rectSignature(anchor.getBoundingClientRect()) : '';\n if (signature !== lastRect || panelResized) {\n lastRect = signature;\n panelResized = false;\n reposition();\n }\n frame = requestAnimationFrame(followAnchor);\n };\n frame = requestAnimationFrame(followAnchor);\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n const observer =\n panel && typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(() => {\n panelResized = true;\n })\n : null;\n if (panel) {\n observer?.observe(panel);\n }\n return () => {\n cancelAnimationFrame(frame);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n observer?.disconnect();\n };\n }, [isOpen, panel, reposition, anchorRef, triggerRef]);\n\n return geometry;\n};\n"],"names":["sameGeometry","a","b","usePopoverPosition","isOpen","panel","hostRef","triggerRef","anchorRef","placement","width","offset","geometry","setGeometry","useState","useTopLayer","useInsertionEffect","ensurePopoverStyles","reposition","useCallback","anchor","rect","cssWidth","next","computeFloatingGeometry","fullPanelHeight","FLOATING_OFFSET_PX","prev","useLayoutEffect","useEffect","frame","lastRect","panelResized","followAnchor","signature","rectSignature","observer"],"mappings":";;;;AA+BA,MAAMA,IAAe,CAACC,GAA4BC,MAC9CD,MAAM,QACNA,EAAE,QAAQC,EAAE,OACZD,EAAE,SAASC,EAAE,QACbD,EAAE,cAAcC,EAAE,aAClBD,EAAE,SAASC,EAAE,MAEJC,IAAqB,CAAC;AAAA,EAC/B,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AACJ,MAAuD;AACnD,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAkC,IAAI;AAEtE,EAAAC,EAAYT,GAASF,KAAUC,MAAU,IAAI,GAE7CW,EAAmB,MAAM;AACrB,IAAIZ,KACAa,EAAA;AAAA,EAER,GAAG,CAACb,CAAM,CAAC;AAEX,QAAMc,IAAaC,EAAY,MAAM;AACjC,UAAMC,KAASZ,KAAA,gBAAAA,EAAW,YAAWD,EAAW;AAChD,QAAI,CAACa,KAAU,CAACf;AACZ;AAEJ,UAAMgB,IAAOD,EAAO,sBAAA,GACdE,IAAWZ,MAAU,YAAY,GAAGW,EAAK,KAAK,OAAO;AAC3D,IAAIhB,EAAM,MAAM,UAAUiB,MACtBjB,EAAM,MAAM,QAAQiB;AAExB,UAAMC,IAAOC,EAAwB;AAAA,MACjC,aAAaH;AAAA,MACb,WAAAZ;AAAA,MACA,YAAYJ,EAAM;AAAA,MAClB,aAAaoB,EAAgBpB,CAAK;AAAA,MAClC,KAAKqB,EAAmBf,CAAM;AAAA,MAC9B,eAAe,OAAO;AAAA,MACtB,gBAAgB,OAAO;AAAA,IAAA,CAC1B;AACD,IAAAE,EAAY,CAACc,MAAU3B,EAAa2B,GAAMJ,CAAI,IAAII,IAAOJ,CAAK;AAAA,EAClE,GAAG,CAAClB,GAAOI,GAAWC,GAAOF,GAAWD,GAAYI,CAAM,CAAC;AAE3D,SAAAiB,EAAgB,MAAM;AAClB,QAAI,CAACxB,GAAQ;AACT,MAAAS,EAAY,IAAI;AAChB;AAAA,IACJ;AACA,IAAAK,EAAA;AAAA,EACJ,GAAG,CAACd,GAAQc,CAAU,CAAC,GAEvBW,EAAU,MAAM;AACZ,QAAI,CAACzB;AACD;AAEJ,QAAI0B,IAAQ,GACRC,IAAW,IACXC,IAAe;AACnB,UAAMC,IAAe,MAAM;AACvB,YAAMb,KAASZ,KAAA,gBAAAA,EAAW,YAAWD,EAAW,SAC1C2B,IAAYd,IAASe,EAAcf,EAAO,sBAAA,CAAuB,IAAI;AAC3E,OAAIc,MAAcH,KAAYC,OAC1BD,IAAWG,GACXF,IAAe,IACfd,EAAA,IAEJY,IAAQ,sBAAsBG,CAAY;AAAA,IAC9C;AACA,IAAAH,IAAQ,sBAAsBG,CAAY,GAC1C,OAAO,iBAAiB,UAAUf,GAAY,EAAI,GAClD,OAAO,iBAAiB,UAAUA,CAAU;AAC5C,UAAMkB,IACF/B,KAAS,OAAO,iBAAmB,MAC7B,IAAI,eAAe,MAAM;AACrB,MAAA2B,IAAe;AAAA,IACnB,CAAC,IACD;AACV,WAAI3B,MACA+B,KAAA,QAAAA,EAAU,QAAQ/B,KAEf,MAAM;AACT,2BAAqByB,CAAK,GAC1B,OAAO,oBAAoB,UAAUZ,GAAY,EAAI,GACrD,OAAO,oBAAoB,UAAUA,CAAU,GAC/CkB,KAAA,QAAAA,EAAU;AAAA,IACd;AAAA,EACJ,GAAG,CAAChC,GAAQC,GAAOa,GAAYV,GAAWD,CAAU,CAAC,GAE9CK;AACX;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useRef as g, useMemo as v, useEffect as x } from "react";
|
|
2
|
+
const M = ({
|
|
3
|
+
parent: r,
|
|
4
|
+
isOpen: c,
|
|
5
|
+
openOn: f,
|
|
6
|
+
isOpenRef: m,
|
|
7
|
+
heldByChildren: t,
|
|
8
|
+
cancelClose: s,
|
|
9
|
+
scheduleClose: w
|
|
10
|
+
}) => {
|
|
11
|
+
const u = g(/* @__PURE__ */ new Set()), S = v(
|
|
12
|
+
() => ({
|
|
13
|
+
register: (o) => {
|
|
14
|
+
u.current.add(o);
|
|
15
|
+
const e = r == null ? void 0 : r.register(o);
|
|
16
|
+
return () => {
|
|
17
|
+
u.current.delete(o), e == null || e();
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
hold: () => (t.current += 1, s(), () => {
|
|
21
|
+
t.current -= 1, f === "hover" && t.current === 0 && m.current && w();
|
|
22
|
+
})
|
|
23
|
+
}),
|
|
24
|
+
[s, w, f, r, m, t]
|
|
25
|
+
);
|
|
26
|
+
return x(() => {
|
|
27
|
+
if (!(!c || !r))
|
|
28
|
+
return r.hold();
|
|
29
|
+
}, [c, r]), { tree: S, ownedSources: u };
|
|
30
|
+
};
|
|
31
|
+
export {
|
|
32
|
+
M as usePopoverTree
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=usePopoverTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePopoverTree.js","sources":["../../src/components/usePopoverTree.ts"],"sourcesContent":["import { type MutableRefObject, useEffect, useMemo, useRef } from 'react';\nimport type { OverlaySource, PopoverTree } from './popoverTree';\n\ninterface PopoverTreeOptions {\n parent: PopoverTree | null;\n isOpen: boolean;\n openOn: 'click' | 'hover';\n isOpenRef: MutableRefObject<boolean>;\n heldByChildren: MutableRefObject<number>;\n cancelClose: () => void;\n scheduleClose: () => void;\n}\n\nexport const usePopoverTree = ({\n parent,\n isOpen,\n openOn,\n isOpenRef,\n heldByChildren,\n cancelClose,\n scheduleClose,\n}: PopoverTreeOptions) => {\n const ownedSources = useRef(new Set<OverlaySource>());\n\n const tree = useMemo<PopoverTree>(\n () => ({\n register: (source) => {\n ownedSources.current.add(source);\n const unregisterAbove = parent?.register(source);\n return () => {\n ownedSources.current.delete(source);\n unregisterAbove?.();\n };\n },\n hold: () => {\n heldByChildren.current += 1;\n cancelClose();\n return () => {\n heldByChildren.current -= 1;\n if (openOn === 'hover' && heldByChildren.current === 0 && isOpenRef.current) {\n scheduleClose();\n }\n };\n },\n }),\n [cancelClose, scheduleClose, openOn, parent, isOpenRef, heldByChildren],\n );\n\n useEffect(() => {\n if (!isOpen || !parent) {\n return;\n }\n return parent.hold();\n }, [isOpen, parent]);\n\n return { tree, ownedSources };\n};\n"],"names":["usePopoverTree","parent","isOpen","openOn","isOpenRef","heldByChildren","cancelClose","scheduleClose","ownedSources","useRef","tree","useMemo","source","unregisterAbove","useEffect"],"mappings":";AAaO,MAAMA,IAAiB,CAAC;AAAA,EAC3B,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AACJ,MAA0B;AACtB,QAAMC,IAAeC,EAAO,oBAAI,KAAoB,GAE9CC,IAAOC;AAAA,IACT,OAAO;AAAA,MACH,UAAU,CAACC,MAAW;AAClB,QAAAJ,EAAa,QAAQ,IAAII,CAAM;AAC/B,cAAMC,IAAkBZ,KAAA,gBAAAA,EAAQ,SAASW;AACzC,eAAO,MAAM;AACT,UAAAJ,EAAa,QAAQ,OAAOI,CAAM,GAClCC,KAAA,QAAAA;AAAA,QACJ;AAAA,MACJ;AAAA,MACA,MAAM,OACFR,EAAe,WAAW,GAC1BC,EAAA,GACO,MAAM;AACT,QAAAD,EAAe,WAAW,GACtBF,MAAW,WAAWE,EAAe,YAAY,KAAKD,EAAU,WAChEG,EAAA;AAAA,MAER;AAAA,IACJ;AAAA,IAEJ,CAACD,GAAaC,GAAeJ,GAAQF,GAAQG,GAAWC,CAAc;AAAA,EAAA;AAG1E,SAAAS,EAAU,MAAM;AACZ,QAAI,GAACZ,KAAU,CAACD;AAGhB,aAAOA,EAAO,KAAA;AAAA,EAClB,GAAG,CAACC,GAAQD,CAAM,CAAC,GAEZ,EAAE,MAAAS,GAAM,cAAAF,EAAA;AACnB;"}
|