@xanui/ui 1.1.7 → 1.1.9

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.
Files changed (45) hide show
  1. package/ClickOutside/index.d.ts +4 -3
  2. package/ClickOutside/index.js +4 -5
  3. package/ClickOutside/index.js.map +1 -1
  4. package/ClickOutside/index.mjs +4 -5
  5. package/ClickOutside/index.mjs.map +1 -1
  6. package/Collaps/index.js +2 -2
  7. package/Collaps/index.js.map +1 -1
  8. package/Collaps/index.mjs +2 -2
  9. package/Collaps/index.mjs.map +1 -1
  10. package/Drawer/index.js +2 -2
  11. package/Drawer/index.js.map +1 -1
  12. package/Drawer/index.mjs +2 -2
  13. package/Drawer/index.mjs.map +1 -1
  14. package/Input/index.js +7 -2
  15. package/Input/index.js.map +1 -1
  16. package/Input/index.mjs +7 -2
  17. package/Input/index.mjs.map +1 -1
  18. package/Layer/index.js +5 -4
  19. package/Layer/index.js.map +1 -1
  20. package/Layer/index.mjs +5 -4
  21. package/Layer/index.mjs.map +1 -1
  22. package/Menu/index.d.ts +4 -4
  23. package/Menu/index.js +114 -28
  24. package/Menu/index.js.map +1 -1
  25. package/Menu/index.mjs +114 -28
  26. package/Menu/index.mjs.map +1 -1
  27. package/Portal/index.d.ts +1 -2
  28. package/Portal/index.js +8 -11
  29. package/Portal/index.js.map +1 -1
  30. package/Portal/index.mjs +9 -12
  31. package/Portal/index.mjs.map +1 -1
  32. package/Scrollbar/index.js +1 -1
  33. package/Scrollbar/index.js.map +1 -1
  34. package/Scrollbar/index.mjs +1 -1
  35. package/Scrollbar/index.mjs.map +1 -1
  36. package/package.json +3 -3
  37. package/Menu/getOrigin.js +0 -42
  38. package/Menu/getOrigin.js.map +0 -1
  39. package/Menu/getOrigin.mjs +0 -42
  40. package/Menu/getOrigin.mjs.map +0 -1
  41. package/Menu/placedMenu.d.ts +0 -5
  42. package/Menu/placedMenu.js +0 -95
  43. package/Menu/placedMenu.js.map +0 -1
  44. package/Menu/placedMenu.mjs +0 -95
  45. package/Menu/placedMenu.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/Layer/index.tsx"],"sourcesContent":["import { ReactNode, useEffect, useState } from 'react'\nimport { Tag, TagProps, useBreakpointProps, useBreakpointPropsType, useInterface, TransitionProps, Transition } from \"@xanui/core\"\nimport useBlurCss from '../useBlurCss';\nimport { Renderar } from \"@xanui/core\";\nimport ClickOutside, { ClickOutsideProps } from '../ClickOutside';\n\nexport type LayerProps = {\n open: boolean;\n children: ReactNode;\n transition?: TransitionProps['variant'];\n zIndex?: number;\n blur?: useBreakpointPropsType<number>\n blurMode?: useBreakpointPropsType<\"blur\" | \"transparent\">\n onClickOutside?: () => void;\n onOpen?: Function;\n onOpened?: Function;\n onClose?: Function;\n onClosed?: Function;\n slotProps?: {\n root?: Omit<TagProps<\"div\">, \"children\">;\n transition?: Omit<TransitionProps, \"children\" | \"open\" | \"variant\" | \"onClose\" | \"onClosed\" | \"onOpen\" | \"onOpened\">;\n content?: Omit<TagProps<\"div\">, \"children\">;\n clickOutside?: Omit<ClickOutsideProps, \"children\">;\n }\n}\n\nconst Layer = ({ children, open, ...props }: LayerProps) => {\n let [{\n onClickOutside,\n placement,\n transition,\n zIndex,\n blur,\n blurMode,\n onOpen,\n onOpened,\n onClose,\n onClosed,\n slotProps\n }] = useInterface<any>(\"Layer\", props, {})\n\n const _p: any = {}\n if (blur) _p.blur = blur\n if (blurMode) _p.blurMode = blurMode\n const p: any = useBreakpointProps(_p)\n\n blur = p.blur\n blurMode = p.blurMode\n\n const [closed, setClosed] = useState(!open)\n placement = placement || \"bottom-left\"\n const blurCss = blur ? useBlurCss(blur, blurMode) : {}\n\n useEffect(() => {\n if (closed && open) {\n setClosed(false)\n }\n }, [open])\n\n if (closed) return <></>\n let duration = slotProps?.transition?.duration || 300\n let delay = slotProps?.transition?.delay || 0\n\n return (\n <Transition\n duration={duration}\n delay={delay}\n easing=\"easeOut\"\n variant={\"fade\"}\n open={open}\n >\n <Tag\n baseClass=\"layer\"\n {...slotProps?.root}\n sxr={{\n ...slotProps?.root?.sx,\n position: \"fixed\",\n zIndex: 1500 + (zIndex || 0),\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...blurCss\n }}\n >\n <ClickOutside\n {...slotProps?.clickOutside}\n onClickOutside={onClickOutside || (() => { })}\n >\n <Transition\n duration={duration}\n delay={delay}\n easing=\"easeOut\"\n variant={transition || \"zoomOver\"}\n {...slotProps?.transition}\n open={open}\n onOpen={onOpen}\n onOpened={onOpened}\n onClose={onClose}\n onClosed={() => {\n setClosed(true)\n onClosed && onClosed()\n }}\n >\n {children}\n </Transition>\n </ClickOutside>\n </Tag>\n </Transition>\n )\n}\n\n\nLayer.open = (children: LayerProps['children'], props?: Partial<Omit<LayerProps, 'children'>>) => {\n const l = Renderar.render(Layer as any, {\n open: true,\n ...props,\n children,\n onClosed: () => {\n Renderar.unrender(Layer as any)\n if (props?.onClosed) {\n props.onClosed()\n }\n }\n })\n return {\n open: () => {\n l.updateProps({ open: true })\n },\n close: () => {\n l.updateProps({ open: false })\n },\n }\n}\nLayer.close = () => {\n Renderar.unrender(Layer as any)\n}\nexport default Layer"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/Layer/index.tsx"],"sourcesContent":["import { ReactNode, useEffect, useState } from 'react'\nimport { Tag, TagProps, useBreakpointProps, useBreakpointPropsType, useInterface, TransitionProps, Transition } from \"@xanui/core\"\nimport useBlurCss from '../useBlurCss';\nimport { Renderar } from \"@xanui/core\";\nimport ClickOutside, { ClickOutsideProps } from '../ClickOutside';\n\nexport type LayerProps = {\n open: boolean;\n children: ReactNode;\n transition?: TransitionProps['variant'];\n zIndex?: number;\n blur?: useBreakpointPropsType<number>\n blurMode?: useBreakpointPropsType<\"blur\" | \"transparent\">\n onClickOutside?: () => void;\n onOpen?: Function;\n onOpened?: Function;\n onClose?: Function;\n onClosed?: Function;\n slotProps?: {\n root?: Omit<TagProps<\"div\">, \"children\">;\n transition?: Omit<TransitionProps, \"children\" | \"open\" | \"variant\" | \"onClose\" | \"onClosed\" | \"onOpen\" | \"onOpened\">;\n content?: Omit<TagProps<\"div\">, \"children\">;\n clickOutside?: Omit<ClickOutsideProps, \"children\">;\n }\n}\n\nconst Layer = ({ children, open, ...props }: LayerProps) => {\n let [{\n onClickOutside,\n placement,\n transition,\n zIndex,\n blur,\n blurMode,\n onOpen,\n onOpened,\n onClose,\n onClosed,\n slotProps\n }] = useInterface<any>(\"Layer\", props, {})\n\n const _p: any = {}\n if (blur) _p.blur = blur\n if (blurMode) _p.blurMode = blurMode\n const p: any = useBreakpointProps(_p)\n\n blur = p.blur\n blurMode = p.blurMode\n\n const [closed, setClosed] = useState(!open)\n placement = placement || \"bottom-left\"\n const blurCss = blur ? useBlurCss(blur, blurMode) : {}\n\n useEffect(() => {\n if (closed && open) {\n setClosed(false)\n }\n }, [open])\n\n if (closed) return <></>\n let duration = slotProps?.transition?.duration || 300\n let delay = slotProps?.transition?.delay || 0\n\n let content = <Transition\n duration={duration}\n delay={delay}\n easing=\"standard\"\n variant={transition || \"zoomOver\"}\n {...slotProps?.transition}\n open={open}\n onOpen={onOpen}\n onOpened={onOpened}\n onClose={onClose}\n onClosed={() => {\n setClosed(true)\n onClosed && onClosed()\n }}\n >\n {children}\n </Transition>\n\n return (\n <Transition\n duration={duration}\n delay={delay}\n easing=\"smooth\"\n variant={\"fade\"}\n open={open}\n >\n <Tag\n baseClass=\"layer\"\n {...slotProps?.root}\n sxr={{\n ...slotProps?.root?.sx,\n position: \"fixed\",\n zIndex: 1500 + (zIndex || 0),\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n width: \"100%\",\n height: \"100%\",\n ...blurCss\n }}\n >\n {\n onClickOutside ? <ClickOutside\n {...slotProps?.clickOutside}\n onClickOutside={onClickOutside || (() => { })}\n >\n {content}\n </ClickOutside> : content\n }\n </Tag>\n </Transition>\n )\n}\n\n\nLayer.open = (children: LayerProps['children'], props?: Partial<Omit<LayerProps, 'children'>>) => {\n const l = Renderar.render(Layer as any, {\n open: true,\n ...props,\n children,\n onClosed: () => {\n Renderar.unrender(Layer as any)\n if (props?.onClosed) {\n props.onClosed()\n }\n }\n })\n return {\n open: () => {\n l.updateProps({ open: true })\n },\n close: () => {\n l.updateProps({ open: false })\n },\n }\n}\nLayer.close = () => {\n Renderar.unrender(Layer as any)\n}\nexport default Layer"],"names":["_jsx"],"mappings":"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"}
package/Menu/index.d.ts CHANGED
@@ -1,22 +1,22 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
3
  import { useBreakpointPropsType, TransitionProps, TagProps } from '@xanui/core';
4
- import { PlacementTypes } from './placedMenu.js';
5
4
  import { PortalProps } from '../Portal/index.js';
6
5
 
6
+ type PlacementTypes = "top" | "top-left" | "top-right" | "bottom" | "bottom-left" | "bottom-right" | "right" | "right-top" | "right-bottom" | "left" | "left-top" | "left-bottom";
7
7
  type MenuProps = {
8
8
  children?: ReactNode;
9
9
  target?: HTMLElement;
10
10
  placement?: useBreakpointPropsType<PlacementTypes>;
11
11
  zIndex?: number;
12
- onClickOutside?: () => void;
12
+ onClickOutside?: (e: MouseEvent) => void;
13
13
  slotProps?: {
14
14
  transition?: Omit<TransitionProps, "open">;
15
15
  portal?: Omit<PortalProps, "children">;
16
16
  content?: Omit<TagProps<"div">, "children">;
17
17
  };
18
18
  };
19
- declare const Menu: ({ children, target, ...props }: MenuProps) => react_jsx_runtime.JSX.Element;
19
+ declare const Menu: ({ children, target, ...props }: MenuProps) => react_jsx_runtime.JSX.Element | null;
20
20
 
21
21
  export { Menu as default };
22
- export type { MenuProps };
22
+ export type { MenuProps, PlacementTypes };
package/Menu/index.js CHANGED
@@ -1,4 +1,89 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var tslib=require('tslib'),jsxRuntime=require('react/jsx-runtime'),React=require('react'),core=require('@xanui/core'),placedMenu=require('./placedMenu.js'),index=require('../Portal/index.js'),getOrigin=require('./getOrigin.js'),index$1=require('../ClickOutside/index.js');const Menu = (_a) => {
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var tslib=require('tslib'),jsxRuntime=require('react/jsx-runtime'),React=require('react'),core=require('@xanui/core'),index=require('../Portal/index.js'),index$1=require('../ClickOutside/index.js');const placements = [
2
+ "top",
3
+ "top-left",
4
+ "top-right",
5
+ "bottom",
6
+ "bottom-left",
7
+ "bottom-right",
8
+ "right",
9
+ "right-top",
10
+ "right-bottom",
11
+ "left",
12
+ "left-top",
13
+ "left-bottom",
14
+ ];
15
+ const getTransformOrigin = (placement) => {
16
+ switch (placement) {
17
+ case "top":
18
+ return "bottom";
19
+ case "top-left":
20
+ return "bottom left";
21
+ case "top-right":
22
+ return "bottom right";
23
+ case "bottom":
24
+ return "top";
25
+ case "bottom-left":
26
+ return "top left";
27
+ case "bottom-right":
28
+ return "top right";
29
+ case "left":
30
+ return "right";
31
+ case "left-top":
32
+ return "top right";
33
+ case "left-bottom":
34
+ return "bottom right";
35
+ case "right":
36
+ return "left";
37
+ case "right-top":
38
+ return "top left";
39
+ case "right-bottom":
40
+ return "bottom left";
41
+ default:
42
+ return "top";
43
+ }
44
+ };
45
+ // Compute coordinates for each placement
46
+ const computePosition = (placement, menu, target) => {
47
+ const { width: mw, height: mh } = menu.getBoundingClientRect();
48
+ const { top: tt, left: tl, bottom: tb, right: tr, width: tw, height: th, } = target.getBoundingClientRect();
49
+ const positions = {
50
+ "bottom-left": { top: tb, left: tl },
51
+ "bottom-right": { top: tb, left: tr - mw },
52
+ bottom: { top: tb, left: tl + (tw - mw) / 2 },
53
+ "top-left": { top: tt - mh, left: tl },
54
+ "top-right": { top: tt - mh, left: tr - mw },
55
+ top: { top: tt - mh, left: tl + (tw - mw) / 2 },
56
+ left: { top: tt + (th - mh) / 2, left: tl - mw },
57
+ "left-top": { top: tt, left: tl - mw },
58
+ "left-bottom": { top: tb - mh, left: tl - mw },
59
+ right: { top: tt + (th - mh) / 2, left: tr },
60
+ "right-top": { top: tt, left: tr },
61
+ "right-bottom": { top: tb - mh, left: tr },
62
+ };
63
+ return positions[placement];
64
+ };
65
+ // Check if menu is off-screen
66
+ const isOffScreen = (menu) => {
67
+ const { x, y, width, height } = menu.getBoundingClientRect();
68
+ return x < 0 || y < 0 || x + width > window.innerWidth || y + height > window.innerHeight;
69
+ };
70
+ // Try to place menu and fallback if off-screen
71
+ const placeMenu = (placement, menu, target) => {
72
+ let pos = computePosition(placement, menu, target);
73
+ menu.style.top = pos.top + "px";
74
+ menu.style.left = pos.left + "px";
75
+ if (isOffScreen(menu)) {
76
+ for (const p of placements) {
77
+ const fallbackPos = computePosition(p, menu, target);
78
+ menu.style.top = fallbackPos.top + "px";
79
+ menu.style.left = fallbackPos.left + "px";
80
+ if (!isOffScreen(menu))
81
+ return p;
82
+ }
83
+ }
84
+ return placement;
85
+ };
86
+ const Menu = (_a) => {
2
87
  var _b;
3
88
  var { children, target } = _a, props = tslib.__rest(_a, ["children", "target"]);
4
89
  let [{ onClickOutside, placement, zIndex, slotProps }] = core.useInterface("Menu", props, {});
@@ -6,42 +91,43 @@
6
91
  if (placement)
7
92
  _p.placement = placement;
8
93
  const p = core.useBreakpointProps(_p);
9
- placement = p.placement;
94
+ placement = p.placement || "bottom-left";
10
95
  const isOpen = Boolean(target);
11
96
  const [closed, setClosed] = React.useState(!isOpen);
12
- let id = "menu-" + React.useId().replace(":", "");
13
97
  const [placed, setPlaced] = React.useState(placement);
14
- placement = placement || "bottom-left";
98
+ const menuRef = React.useRef(null);
99
+ // Open/close effect
15
100
  React.useEffect(() => {
16
- if (closed && isOpen) {
101
+ if (closed && isOpen)
17
102
  setClosed(false);
18
- }
19
103
  }, [isOpen]);
20
104
  React.useEffect(() => {
21
- if (!closed) {
22
- setTimeout(() => {
23
- const ele = document.getElementById(id);
24
- if (target && ele) {
25
- let p = placedMenu.placedMenu({
26
- place: placement,
27
- menu: ele,
28
- target
29
- });
105
+ if (!closed && target && menuRef.current) {
106
+ const updatePosition = () => {
107
+ if (menuRef.current && target) {
108
+ const p = placeMenu(placement, menuRef.current, target);
30
109
  setPlaced(p);
31
110
  }
32
- }, 1);
111
+ };
112
+ updatePosition();
113
+ window.addEventListener("resize", updatePosition);
114
+ window.addEventListener("scroll", updatePosition, true);
115
+ return () => {
116
+ window.removeEventListener("resize", updatePosition);
117
+ window.removeEventListener("scroll", updatePosition, true);
118
+ };
33
119
  }
34
- }, [closed]);
120
+ return undefined;
121
+ }, [closed, target, placement]);
35
122
  if (closed)
36
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
37
- return (jsxRuntime.jsx(index.default, Object.assign({}, slotProps === null || slotProps === void 0 ? void 0 : slotProps.portal, { children: jsxRuntime.jsx(index$1.default, { onClickOutside: () => {
38
- onClickOutside && onClickOutside();
39
- }, children: jsxRuntime.jsx(core.Tag, { baseClass: "menu", id: id, sx: {
40
- position: "fixed",
41
- zIndex: 1500 + (zIndex || 0)
42
- }, children: jsxRuntime.jsx(core.Transition, Object.assign({ duration: 200, easing: "easeInOut", variant: "grow" }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition, { open: isOpen, onClosed: () => {
43
- var _a, _b;
44
- setClosed(true);
45
- ((_a = slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition) === null || _a === void 0 ? void 0 : _a.onClosed) && ((_b = slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition) === null || _b === void 0 ? void 0 : _b.onClosed());
46
- }, children: jsxRuntime.jsx(core.Tag, Object.assign({ baseClass: 'menu-content' }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.content, { sxr: Object.assign({ overflow: "hidden", bgcolor: "background.primary", shadow: 10, radius: 1, transformOrigin: getOrigin.getOrigin(placed) || "top" }, (_b = slotProps === null || slotProps === void 0 ? void 0 : slotProps.content) === null || _b === void 0 ? void 0 : _b.sx), children: children })) })) }) }) })));
123
+ return null;
124
+ return (jsxRuntime.jsx(index.default, Object.assign({}, slotProps === null || slotProps === void 0 ? void 0 : slotProps.portal, { children: jsxRuntime.jsx(index$1.default, { onClickOutside: (e) => {
125
+ if (e.target !== target) {
126
+ onClickOutside && onClickOutside(e);
127
+ }
128
+ }, ref: menuRef, sx: { position: "fixed", zIndex: 1500 + (zIndex || 0) }, children: jsxRuntime.jsx(core.Transition, Object.assign({ duration: 200, easing: "fast", variant: "grow" }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition, { open: isOpen, onClosed: () => {
129
+ var _a, _b;
130
+ setClosed(true);
131
+ (_b = (_a = slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition) === null || _a === void 0 ? void 0 : _a.onClosed) === null || _b === void 0 ? void 0 : _b.call(_a);
132
+ }, children: jsxRuntime.jsx(core.Tag, Object.assign({ baseClass: "menu-content" }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.content, { sxr: Object.assign({ overflow: "hidden", bgcolor: "background.primary", shadow: 2, radius: 1, transformOrigin: getTransformOrigin(placed) }, (_b = slotProps === null || slotProps === void 0 ? void 0 : slotProps.content) === null || _b === void 0 ? void 0 : _b.sx), children: children })) })) }) })));
47
133
  };exports.default=Menu;//# sourceMappingURL=index.js.map
package/Menu/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/Menu/index.tsx"],"sourcesContent":["import { ReactNode, useEffect, useId, useState } from 'react'\nimport { Tag, TagProps, useBreakpointProps, useBreakpointPropsType, useInterface, TransitionProps, Transition } from \"@xanui/core\"\nimport { placedMenu, PlacementTypes } from \"./placedMenu\";\nimport Portal, { PortalProps } from \"../Portal\";\nimport { getOrigin } from './getOrigin';\nimport ClickOutside from '../ClickOutside';\n\n\nexport type MenuProps = {\n children?: ReactNode;\n target?: HTMLElement;\n placement?: useBreakpointPropsType<PlacementTypes>;\n zIndex?: number;\n onClickOutside?: () => void;\n slotProps?: {\n transition?: Omit<TransitionProps, \"open\">;\n portal?: Omit<PortalProps, \"children\">;\n content?: Omit<TagProps<\"div\">, \"children\">;\n }\n}\n\nconst Menu = ({ children, target, ...props }: MenuProps) => {\n let [{ onClickOutside, placement, zIndex, slotProps }] = useInterface<any>(\"Menu\", props, {})\n const _p: any = {}\n if (placement) _p.placement = placement\n const p: any = useBreakpointProps(_p)\n placement = p.placement\n\n const isOpen = Boolean(target)\n const [closed, setClosed] = useState(!isOpen)\n let id = \"menu-\" + useId().replace(\":\", \"\")\n const [placed, setPlaced] = useState<any>(placement)\n placement = placement || \"bottom-left\"\n\n useEffect(() => {\n if (closed && isOpen) {\n setClosed(false)\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!closed) {\n setTimeout(() => {\n const ele = document.getElementById(id)\n if (target && ele) {\n let p = placedMenu({\n place: placement as any,\n menu: ele,\n target\n })\n setPlaced(p)\n }\n }, 1);\n }\n }, [closed])\n\n if (closed) return <></>\n\n return (\n <Portal {...slotProps?.portal}>\n <ClickOutside\n onClickOutside={() => {\n onClickOutside && onClickOutside()\n }}\n >\n <Tag\n baseClass=\"menu\"\n id={id}\n sx={{\n position: \"fixed\",\n zIndex: 1500 + (zIndex || 0)\n }}\n >\n <Transition\n duration={200}\n easing=\"easeInOut\"\n variant=\"grow\"\n {...slotProps?.transition}\n open={isOpen}\n onClosed={() => {\n setClosed(true)\n slotProps?.transition?.onClosed && slotProps?.transition?.onClosed()\n }}\n >\n <Tag\n baseClass='menu-content'\n {...slotProps?.content}\n sxr={{\n overflow: \"hidden\",\n bgcolor: \"background.primary\",\n shadow: 10,\n radius: 1,\n transformOrigin: getOrigin(placed) || \"top\",\n ...slotProps?.content?.sx\n }}\n >\n {children}\n </Tag>\n </Transition>\n </Tag>\n </ClickOutside>\n </Portal>\n )\n}\n\nexport default Menu"],"names":["__rest","useInterface","useBreakpointProps","useState","useId","useEffect","placedMenu","_jsx","Portal","ClickOutside","Tag","Transition","getOrigin"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/Menu/index.tsx"],"sourcesContent":["import { ReactNode, useEffect, useState, useRef } from \"react\";\nimport { Tag, TagProps, useBreakpointProps, useBreakpointPropsType, useInterface, TransitionProps, Transition } from \"@xanui/core\";\nimport Portal, { PortalProps } from \"../Portal\";\nimport ClickOutside from \"../ClickOutside\";\n\nexport type PlacementTypes =\n | \"top\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"right\"\n | \"right-top\"\n | \"right-bottom\"\n | \"left\"\n | \"left-top\"\n | \"left-bottom\";\n\nexport type MenuProps = {\n children?: ReactNode;\n target?: HTMLElement;\n placement?: useBreakpointPropsType<PlacementTypes>;\n zIndex?: number;\n onClickOutside?: (e: MouseEvent) => void;\n slotProps?: {\n transition?: Omit<TransitionProps, \"open\">;\n portal?: Omit<PortalProps, \"children\">;\n content?: Omit<TagProps<\"div\">, \"children\">;\n };\n};\n\nconst placements: PlacementTypes[] = [\n \"top\",\n \"top-left\",\n \"top-right\",\n \"bottom\",\n \"bottom-left\",\n \"bottom-right\",\n \"right\",\n \"right-top\",\n \"right-bottom\",\n \"left\",\n \"left-top\",\n \"left-bottom\",\n];\n\nconst getTransformOrigin = (placement: PlacementTypes) => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"top-left\":\n return \"bottom left\";\n case \"top-right\":\n return \"bottom right\";\n case \"bottom\":\n return \"top\";\n case \"bottom-left\":\n return \"top left\";\n case \"bottom-right\":\n return \"top right\";\n case \"left\":\n return \"right\";\n case \"left-top\":\n return \"top right\";\n case \"left-bottom\":\n return \"bottom right\";\n case \"right\":\n return \"left\";\n case \"right-top\":\n return \"top left\";\n case \"right-bottom\":\n return \"bottom left\";\n default:\n return \"top\";\n }\n};\n\n// Compute coordinates for each placement\nconst computePosition = (\n placement: PlacementTypes,\n menu: HTMLElement,\n target: HTMLElement\n) => {\n const { width: mw, height: mh } = menu.getBoundingClientRect();\n const {\n top: tt,\n left: tl,\n bottom: tb,\n right: tr,\n width: tw,\n height: th,\n } = target.getBoundingClientRect();\n\n const positions: Record<PlacementTypes, { top: number; left: number }> = {\n \"bottom-left\": { top: tb, left: tl },\n \"bottom-right\": { top: tb, left: tr - mw },\n bottom: { top: tb, left: tl + (tw - mw) / 2 },\n\n \"top-left\": { top: tt - mh, left: tl },\n \"top-right\": { top: tt - mh, left: tr - mw },\n top: { top: tt - mh, left: tl + (tw - mw) / 2 },\n\n left: { top: tt + (th - mh) / 2, left: tl - mw },\n \"left-top\": { top: tt, left: tl - mw },\n \"left-bottom\": { top: tb - mh, left: tl - mw },\n\n right: { top: tt + (th - mh) / 2, left: tr },\n \"right-top\": { top: tt, left: tr },\n \"right-bottom\": { top: tb - mh, left: tr },\n };\n\n return positions[placement];\n};\n\n\n// Check if menu is off-screen\nconst isOffScreen = (menu: HTMLElement) => {\n const { x, y, width, height } = menu.getBoundingClientRect();\n return x < 0 || y < 0 || x + width > window.innerWidth || y + height > window.innerHeight;\n};\n\n// Try to place menu and fallback if off-screen\nconst placeMenu = (placement: PlacementTypes, menu: HTMLElement, target: HTMLElement) => {\n let pos = computePosition(placement, menu, target);\n menu.style.top = pos.top + \"px\";\n menu.style.left = pos.left + \"px\";\n\n if (isOffScreen(menu)) {\n for (const p of placements) {\n const fallbackPos = computePosition(p, menu, target);\n menu.style.top = fallbackPos.top + \"px\";\n menu.style.left = fallbackPos.left + \"px\";\n if (!isOffScreen(menu)) return p;\n }\n }\n return placement;\n};\n\nconst Menu = ({ children, target, ...props }: MenuProps) => {\n let [{ onClickOutside, placement, zIndex, slotProps }] = useInterface<any>(\"Menu\", props, {});\n const _p: any = {};\n if (placement) _p.placement = placement;\n const p: any = useBreakpointProps(_p);\n placement = p.placement || \"bottom-left\";\n\n const isOpen = Boolean(target);\n const [closed, setClosed] = useState(!isOpen);\n const [placed, setPlaced] = useState<PlacementTypes>(placement);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Open/close effect\n useEffect(() => {\n if (closed && isOpen) setClosed(false);\n }, [isOpen]);\n\n\n useEffect(() => {\n if (!closed && target && menuRef.current) {\n const updatePosition = () => {\n if (menuRef.current && target) {\n const p = placeMenu(placement!, menuRef.current, target);\n setPlaced(p);\n }\n };\n\n updatePosition();\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }\n return undefined;\n }, [closed, target, placement]);\n\n if (closed) return null;\n\n return (\n <Portal {...slotProps?.portal}>\n <ClickOutside\n onClickOutside={(e: MouseEvent) => {\n if (e.target !== target) {\n onClickOutside && onClickOutside(e);\n }\n }}\n ref={menuRef}\n sx={{ position: \"fixed\", zIndex: 1500 + (zIndex || 0) }}\n >\n <Transition\n duration={200}\n easing=\"fast\"\n variant=\"grow\"\n {...slotProps?.transition}\n open={isOpen}\n onClosed={() => {\n setClosed(true);\n slotProps?.transition?.onClosed?.();\n }}\n >\n <Tag\n baseClass=\"menu-content\"\n {...slotProps?.content}\n sxr={{\n overflow: \"hidden\",\n bgcolor: \"background.primary\",\n shadow: 2,\n radius: 1,\n transformOrigin: getTransformOrigin(placed),\n ...slotProps?.content?.sx,\n }}\n >\n {children}\n </Tag>\n </Transition>\n </ClickOutside>\n </Portal>\n );\n};\n\nexport default Menu;\n"],"names":["__rest","useInterface","useBreakpointProps","useState","useRef","useEffect","_jsx","Portal","ClickOutside","Transition","Tag"],"mappings":"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"}
package/Menu/index.mjs CHANGED
@@ -1,4 +1,89 @@
1
- import {__rest}from'tslib';import {jsx,Fragment}from'react/jsx-runtime';import {useState,useId,useEffect}from'react';import {useInterface,useBreakpointProps,Tag,Transition}from'@xanui/core';import {placedMenu}from'./placedMenu.mjs';import Portal from'../Portal/index.mjs';import {getOrigin}from'./getOrigin.mjs';import ClickOutside from'../ClickOutside/index.mjs';const Menu = (_a) => {
1
+ import {__rest}from'tslib';import {jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {useInterface,useBreakpointProps,Transition,Tag}from'@xanui/core';import Portal from'../Portal/index.mjs';import ClickOutside from'../ClickOutside/index.mjs';const placements = [
2
+ "top",
3
+ "top-left",
4
+ "top-right",
5
+ "bottom",
6
+ "bottom-left",
7
+ "bottom-right",
8
+ "right",
9
+ "right-top",
10
+ "right-bottom",
11
+ "left",
12
+ "left-top",
13
+ "left-bottom",
14
+ ];
15
+ const getTransformOrigin = (placement) => {
16
+ switch (placement) {
17
+ case "top":
18
+ return "bottom";
19
+ case "top-left":
20
+ return "bottom left";
21
+ case "top-right":
22
+ return "bottom right";
23
+ case "bottom":
24
+ return "top";
25
+ case "bottom-left":
26
+ return "top left";
27
+ case "bottom-right":
28
+ return "top right";
29
+ case "left":
30
+ return "right";
31
+ case "left-top":
32
+ return "top right";
33
+ case "left-bottom":
34
+ return "bottom right";
35
+ case "right":
36
+ return "left";
37
+ case "right-top":
38
+ return "top left";
39
+ case "right-bottom":
40
+ return "bottom left";
41
+ default:
42
+ return "top";
43
+ }
44
+ };
45
+ // Compute coordinates for each placement
46
+ const computePosition = (placement, menu, target) => {
47
+ const { width: mw, height: mh } = menu.getBoundingClientRect();
48
+ const { top: tt, left: tl, bottom: tb, right: tr, width: tw, height: th, } = target.getBoundingClientRect();
49
+ const positions = {
50
+ "bottom-left": { top: tb, left: tl },
51
+ "bottom-right": { top: tb, left: tr - mw },
52
+ bottom: { top: tb, left: tl + (tw - mw) / 2 },
53
+ "top-left": { top: tt - mh, left: tl },
54
+ "top-right": { top: tt - mh, left: tr - mw },
55
+ top: { top: tt - mh, left: tl + (tw - mw) / 2 },
56
+ left: { top: tt + (th - mh) / 2, left: tl - mw },
57
+ "left-top": { top: tt, left: tl - mw },
58
+ "left-bottom": { top: tb - mh, left: tl - mw },
59
+ right: { top: tt + (th - mh) / 2, left: tr },
60
+ "right-top": { top: tt, left: tr },
61
+ "right-bottom": { top: tb - mh, left: tr },
62
+ };
63
+ return positions[placement];
64
+ };
65
+ // Check if menu is off-screen
66
+ const isOffScreen = (menu) => {
67
+ const { x, y, width, height } = menu.getBoundingClientRect();
68
+ return x < 0 || y < 0 || x + width > window.innerWidth || y + height > window.innerHeight;
69
+ };
70
+ // Try to place menu and fallback if off-screen
71
+ const placeMenu = (placement, menu, target) => {
72
+ let pos = computePosition(placement, menu, target);
73
+ menu.style.top = pos.top + "px";
74
+ menu.style.left = pos.left + "px";
75
+ if (isOffScreen(menu)) {
76
+ for (const p of placements) {
77
+ const fallbackPos = computePosition(p, menu, target);
78
+ menu.style.top = fallbackPos.top + "px";
79
+ menu.style.left = fallbackPos.left + "px";
80
+ if (!isOffScreen(menu))
81
+ return p;
82
+ }
83
+ }
84
+ return placement;
85
+ };
86
+ const Menu = (_a) => {
2
87
  var _b;
3
88
  var { children, target } = _a, props = __rest(_a, ["children", "target"]);
4
89
  let [{ onClickOutside, placement, zIndex, slotProps }] = useInterface("Menu", props, {});
@@ -6,42 +91,43 @@ import {__rest}from'tslib';import {jsx,Fragment}from'react/jsx-runtime';import {
6
91
  if (placement)
7
92
  _p.placement = placement;
8
93
  const p = useBreakpointProps(_p);
9
- placement = p.placement;
94
+ placement = p.placement || "bottom-left";
10
95
  const isOpen = Boolean(target);
11
96
  const [closed, setClosed] = useState(!isOpen);
12
- let id = "menu-" + useId().replace(":", "");
13
97
  const [placed, setPlaced] = useState(placement);
14
- placement = placement || "bottom-left";
98
+ const menuRef = useRef(null);
99
+ // Open/close effect
15
100
  useEffect(() => {
16
- if (closed && isOpen) {
101
+ if (closed && isOpen)
17
102
  setClosed(false);
18
- }
19
103
  }, [isOpen]);
20
104
  useEffect(() => {
21
- if (!closed) {
22
- setTimeout(() => {
23
- const ele = document.getElementById(id);
24
- if (target && ele) {
25
- let p = placedMenu({
26
- place: placement,
27
- menu: ele,
28
- target
29
- });
105
+ if (!closed && target && menuRef.current) {
106
+ const updatePosition = () => {
107
+ if (menuRef.current && target) {
108
+ const p = placeMenu(placement, menuRef.current, target);
30
109
  setPlaced(p);
31
110
  }
32
- }, 1);
111
+ };
112
+ updatePosition();
113
+ window.addEventListener("resize", updatePosition);
114
+ window.addEventListener("scroll", updatePosition, true);
115
+ return () => {
116
+ window.removeEventListener("resize", updatePosition);
117
+ window.removeEventListener("scroll", updatePosition, true);
118
+ };
33
119
  }
34
- }, [closed]);
120
+ return undefined;
121
+ }, [closed, target, placement]);
35
122
  if (closed)
36
- return jsx(Fragment, {});
37
- return (jsx(Portal, Object.assign({}, slotProps === null || slotProps === void 0 ? void 0 : slotProps.portal, { children: jsx(ClickOutside, { onClickOutside: () => {
38
- onClickOutside && onClickOutside();
39
- }, children: jsx(Tag, { baseClass: "menu", id: id, sx: {
40
- position: "fixed",
41
- zIndex: 1500 + (zIndex || 0)
42
- }, children: jsx(Transition, Object.assign({ duration: 200, easing: "easeInOut", variant: "grow" }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition, { open: isOpen, onClosed: () => {
43
- var _a, _b;
44
- setClosed(true);
45
- ((_a = slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition) === null || _a === void 0 ? void 0 : _a.onClosed) && ((_b = slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition) === null || _b === void 0 ? void 0 : _b.onClosed());
46
- }, children: jsx(Tag, Object.assign({ baseClass: 'menu-content' }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.content, { sxr: Object.assign({ overflow: "hidden", bgcolor: "background.primary", shadow: 10, radius: 1, transformOrigin: getOrigin(placed) || "top" }, (_b = slotProps === null || slotProps === void 0 ? void 0 : slotProps.content) === null || _b === void 0 ? void 0 : _b.sx), children: children })) })) }) }) })));
123
+ return null;
124
+ return (jsx(Portal, Object.assign({}, slotProps === null || slotProps === void 0 ? void 0 : slotProps.portal, { children: jsx(ClickOutside, { onClickOutside: (e) => {
125
+ if (e.target !== target) {
126
+ onClickOutside && onClickOutside(e);
127
+ }
128
+ }, ref: menuRef, sx: { position: "fixed", zIndex: 1500 + (zIndex || 0) }, children: jsx(Transition, Object.assign({ duration: 200, easing: "fast", variant: "grow" }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition, { open: isOpen, onClosed: () => {
129
+ var _a, _b;
130
+ setClosed(true);
131
+ (_b = (_a = slotProps === null || slotProps === void 0 ? void 0 : slotProps.transition) === null || _a === void 0 ? void 0 : _a.onClosed) === null || _b === void 0 ? void 0 : _b.call(_a);
132
+ }, children: jsx(Tag, Object.assign({ baseClass: "menu-content" }, slotProps === null || slotProps === void 0 ? void 0 : slotProps.content, { sxr: Object.assign({ overflow: "hidden", bgcolor: "background.primary", shadow: 2, radius: 1, transformOrigin: getTransformOrigin(placed) }, (_b = slotProps === null || slotProps === void 0 ? void 0 : slotProps.content) === null || _b === void 0 ? void 0 : _b.sx), children: children })) })) }) })));
47
133
  };export{Menu as default};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/Menu/index.tsx"],"sourcesContent":["import { ReactNode, useEffect, useId, useState } from 'react'\nimport { Tag, TagProps, useBreakpointProps, useBreakpointPropsType, useInterface, TransitionProps, Transition } from \"@xanui/core\"\nimport { placedMenu, PlacementTypes } from \"./placedMenu\";\nimport Portal, { PortalProps } from \"../Portal\";\nimport { getOrigin } from './getOrigin';\nimport ClickOutside from '../ClickOutside';\n\n\nexport type MenuProps = {\n children?: ReactNode;\n target?: HTMLElement;\n placement?: useBreakpointPropsType<PlacementTypes>;\n zIndex?: number;\n onClickOutside?: () => void;\n slotProps?: {\n transition?: Omit<TransitionProps, \"open\">;\n portal?: Omit<PortalProps, \"children\">;\n content?: Omit<TagProps<\"div\">, \"children\">;\n }\n}\n\nconst Menu = ({ children, target, ...props }: MenuProps) => {\n let [{ onClickOutside, placement, zIndex, slotProps }] = useInterface<any>(\"Menu\", props, {})\n const _p: any = {}\n if (placement) _p.placement = placement\n const p: any = useBreakpointProps(_p)\n placement = p.placement\n\n const isOpen = Boolean(target)\n const [closed, setClosed] = useState(!isOpen)\n let id = \"menu-\" + useId().replace(\":\", \"\")\n const [placed, setPlaced] = useState<any>(placement)\n placement = placement || \"bottom-left\"\n\n useEffect(() => {\n if (closed && isOpen) {\n setClosed(false)\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!closed) {\n setTimeout(() => {\n const ele = document.getElementById(id)\n if (target && ele) {\n let p = placedMenu({\n place: placement as any,\n menu: ele,\n target\n })\n setPlaced(p)\n }\n }, 1);\n }\n }, [closed])\n\n if (closed) return <></>\n\n return (\n <Portal {...slotProps?.portal}>\n <ClickOutside\n onClickOutside={() => {\n onClickOutside && onClickOutside()\n }}\n >\n <Tag\n baseClass=\"menu\"\n id={id}\n sx={{\n position: \"fixed\",\n zIndex: 1500 + (zIndex || 0)\n }}\n >\n <Transition\n duration={200}\n easing=\"easeInOut\"\n variant=\"grow\"\n {...slotProps?.transition}\n open={isOpen}\n onClosed={() => {\n setClosed(true)\n slotProps?.transition?.onClosed && slotProps?.transition?.onClosed()\n }}\n >\n <Tag\n baseClass='menu-content'\n {...slotProps?.content}\n sxr={{\n overflow: \"hidden\",\n bgcolor: \"background.primary\",\n shadow: 10,\n radius: 1,\n transformOrigin: getOrigin(placed) || \"top\",\n ...slotProps?.content?.sx\n }}\n >\n {children}\n </Tag>\n </Transition>\n </Tag>\n </ClickOutside>\n </Portal>\n )\n}\n\nexport default Menu"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/Menu/index.tsx"],"sourcesContent":["import { ReactNode, useEffect, useState, useRef } from \"react\";\nimport { Tag, TagProps, useBreakpointProps, useBreakpointPropsType, useInterface, TransitionProps, Transition } from \"@xanui/core\";\nimport Portal, { PortalProps } from \"../Portal\";\nimport ClickOutside from \"../ClickOutside\";\n\nexport type PlacementTypes =\n | \"top\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"right\"\n | \"right-top\"\n | \"right-bottom\"\n | \"left\"\n | \"left-top\"\n | \"left-bottom\";\n\nexport type MenuProps = {\n children?: ReactNode;\n target?: HTMLElement;\n placement?: useBreakpointPropsType<PlacementTypes>;\n zIndex?: number;\n onClickOutside?: (e: MouseEvent) => void;\n slotProps?: {\n transition?: Omit<TransitionProps, \"open\">;\n portal?: Omit<PortalProps, \"children\">;\n content?: Omit<TagProps<\"div\">, \"children\">;\n };\n};\n\nconst placements: PlacementTypes[] = [\n \"top\",\n \"top-left\",\n \"top-right\",\n \"bottom\",\n \"bottom-left\",\n \"bottom-right\",\n \"right\",\n \"right-top\",\n \"right-bottom\",\n \"left\",\n \"left-top\",\n \"left-bottom\",\n];\n\nconst getTransformOrigin = (placement: PlacementTypes) => {\n switch (placement) {\n case \"top\":\n return \"bottom\";\n case \"top-left\":\n return \"bottom left\";\n case \"top-right\":\n return \"bottom right\";\n case \"bottom\":\n return \"top\";\n case \"bottom-left\":\n return \"top left\";\n case \"bottom-right\":\n return \"top right\";\n case \"left\":\n return \"right\";\n case \"left-top\":\n return \"top right\";\n case \"left-bottom\":\n return \"bottom right\";\n case \"right\":\n return \"left\";\n case \"right-top\":\n return \"top left\";\n case \"right-bottom\":\n return \"bottom left\";\n default:\n return \"top\";\n }\n};\n\n// Compute coordinates for each placement\nconst computePosition = (\n placement: PlacementTypes,\n menu: HTMLElement,\n target: HTMLElement\n) => {\n const { width: mw, height: mh } = menu.getBoundingClientRect();\n const {\n top: tt,\n left: tl,\n bottom: tb,\n right: tr,\n width: tw,\n height: th,\n } = target.getBoundingClientRect();\n\n const positions: Record<PlacementTypes, { top: number; left: number }> = {\n \"bottom-left\": { top: tb, left: tl },\n \"bottom-right\": { top: tb, left: tr - mw },\n bottom: { top: tb, left: tl + (tw - mw) / 2 },\n\n \"top-left\": { top: tt - mh, left: tl },\n \"top-right\": { top: tt - mh, left: tr - mw },\n top: { top: tt - mh, left: tl + (tw - mw) / 2 },\n\n left: { top: tt + (th - mh) / 2, left: tl - mw },\n \"left-top\": { top: tt, left: tl - mw },\n \"left-bottom\": { top: tb - mh, left: tl - mw },\n\n right: { top: tt + (th - mh) / 2, left: tr },\n \"right-top\": { top: tt, left: tr },\n \"right-bottom\": { top: tb - mh, left: tr },\n };\n\n return positions[placement];\n};\n\n\n// Check if menu is off-screen\nconst isOffScreen = (menu: HTMLElement) => {\n const { x, y, width, height } = menu.getBoundingClientRect();\n return x < 0 || y < 0 || x + width > window.innerWidth || y + height > window.innerHeight;\n};\n\n// Try to place menu and fallback if off-screen\nconst placeMenu = (placement: PlacementTypes, menu: HTMLElement, target: HTMLElement) => {\n let pos = computePosition(placement, menu, target);\n menu.style.top = pos.top + \"px\";\n menu.style.left = pos.left + \"px\";\n\n if (isOffScreen(menu)) {\n for (const p of placements) {\n const fallbackPos = computePosition(p, menu, target);\n menu.style.top = fallbackPos.top + \"px\";\n menu.style.left = fallbackPos.left + \"px\";\n if (!isOffScreen(menu)) return p;\n }\n }\n return placement;\n};\n\nconst Menu = ({ children, target, ...props }: MenuProps) => {\n let [{ onClickOutside, placement, zIndex, slotProps }] = useInterface<any>(\"Menu\", props, {});\n const _p: any = {};\n if (placement) _p.placement = placement;\n const p: any = useBreakpointProps(_p);\n placement = p.placement || \"bottom-left\";\n\n const isOpen = Boolean(target);\n const [closed, setClosed] = useState(!isOpen);\n const [placed, setPlaced] = useState<PlacementTypes>(placement);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Open/close effect\n useEffect(() => {\n if (closed && isOpen) setClosed(false);\n }, [isOpen]);\n\n\n useEffect(() => {\n if (!closed && target && menuRef.current) {\n const updatePosition = () => {\n if (menuRef.current && target) {\n const p = placeMenu(placement!, menuRef.current, target);\n setPlaced(p);\n }\n };\n\n updatePosition();\n\n window.addEventListener(\"resize\", updatePosition);\n window.addEventListener(\"scroll\", updatePosition, true);\n\n return () => {\n window.removeEventListener(\"resize\", updatePosition);\n window.removeEventListener(\"scroll\", updatePosition, true);\n };\n }\n return undefined;\n }, [closed, target, placement]);\n\n if (closed) return null;\n\n return (\n <Portal {...slotProps?.portal}>\n <ClickOutside\n onClickOutside={(e: MouseEvent) => {\n if (e.target !== target) {\n onClickOutside && onClickOutside(e);\n }\n }}\n ref={menuRef}\n sx={{ position: \"fixed\", zIndex: 1500 + (zIndex || 0) }}\n >\n <Transition\n duration={200}\n easing=\"fast\"\n variant=\"grow\"\n {...slotProps?.transition}\n open={isOpen}\n onClosed={() => {\n setClosed(true);\n slotProps?.transition?.onClosed?.();\n }}\n >\n <Tag\n baseClass=\"menu-content\"\n {...slotProps?.content}\n sxr={{\n overflow: \"hidden\",\n bgcolor: \"background.primary\",\n shadow: 2,\n radius: 1,\n transformOrigin: getTransformOrigin(placed),\n ...slotProps?.content?.sx,\n }}\n >\n {children}\n </Tag>\n </Transition>\n </ClickOutside>\n </Portal>\n );\n};\n\nexport default Menu;\n"],"names":["_jsx"],"mappings":"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"}
package/Portal/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import React from 'react';
3
2
 
4
3
  type PortalProps = {
@@ -6,7 +5,7 @@ type PortalProps = {
6
5
  appendTo?: HTMLElement;
7
6
  container?: HTMLElement;
8
7
  };
9
- declare const Portal: ({ children, appendTo, container }: PortalProps) => react_jsx_runtime.JSX.Element;
8
+ declare const Portal: ({ children, appendTo, container }: PortalProps) => React.ReactPortal;
10
9
 
11
10
  export { Portal as default };
12
11
  export type { PortalProps };
package/Portal/index.js CHANGED
@@ -1,19 +1,16 @@
1
1
  'use strict';Object.defineProperty(exports,'__esModule',{value:true});var jsxRuntime=require('react/jsx-runtime'),React=require('react'),ReactDOM=require('react-dom'),core=require('@xanui/core');const Portal = ({ children, appendTo, container }) => {
2
- const [_container, setContainer] = React.useState(container);
3
2
  const theme = core.useTheme();
4
- React.useEffect(() => {
5
- appendTo = appendTo || document.body;
6
- let _con = _container || document.createElement("div");
3
+ appendTo = appendTo || document.body;
4
+ const c = React.useMemo(() => {
5
+ let _con = container || document.createElement("div");
7
6
  appendTo.appendChild(_con);
8
7
  _con.className = "xui-portal";
9
- if (!_container) {
10
- setContainer(_con);
11
- }
8
+ return _con;
9
+ }, []);
10
+ React.useEffect(() => {
12
11
  return () => {
13
- appendTo.removeChild(_con);
12
+ appendTo.removeChild(c);
14
13
  };
15
14
  }, []);
16
- if (!_container)
17
- return jsxRuntime.jsx(jsxRuntime.Fragment, {});
18
- return ReactDOM.createPortal(jsxRuntime.jsx(core.ThemeProvider, { theme: theme.name, children: children }), _container);
15
+ return ReactDOM.createPortal(jsxRuntime.jsx(core.ThemeProvider, { theme: theme.name, children: children }), c);
19
16
  };exports.default=Portal;//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/Portal/index.tsx"],"sourcesContent":["\nimport React, { useEffect, useState } from 'react'\nimport ReactDOM from 'react-dom';\nimport { useTheme, ThemeProvider } from '@xanui/core';\nexport type PortalProps = {\n children?: React.ReactNode;\n appendTo?: HTMLElement;\n container?: HTMLElement;\n}\n\nconst Portal = ({ children, appendTo, container }: PortalProps) => {\n const [_container, setContainer] = useState<HTMLElement | undefined>(container)\n const theme = useTheme()\n\n useEffect(() => {\n appendTo = appendTo || document.body\n let _con: HTMLElement = _container || document.createElement(\"div\");\n appendTo.appendChild(_con);\n _con.className = \"xui-portal\"\n if (!_container) {\n setContainer(_con)\n }\n\n return () => {\n (appendTo as any).removeChild(_con);\n }\n }, [])\n\n if (!_container) return <></>\n\n return ReactDOM.createPortal(\n <ThemeProvider theme={theme.name}>\n {children}\n </ThemeProvider>,\n _container,\n );\n}\n\nexport default Portal"],"names":["useState","useTheme","useEffect","_jsx","ThemeProvider"],"mappings":"mMAUA,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAe,KAAI;IAC9D,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAA0B,SAAS,CAAC;AAC/E,IAAA,MAAM,KAAK,GAAGC,aAAQ,EAAE;IAExBC,eAAS,CAAC,MAAK;AACX,QAAA,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI;QACpC,IAAI,IAAI,GAAgB,UAAU,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACnE,QAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY;QAC7B,IAAI,CAAC,UAAU,EAAE;YACb,YAAY,CAAC,IAAI,CAAC;QACtB;AAEA,QAAA,OAAO,MAAK;AACP,YAAA,QAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;AACvC,QAAA,CAAC;IACL,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,IAAI,CAAC,UAAU;AAAE,QAAA,OAAOC,uCAAK;AAE7B,IAAA,OAAO,QAAQ,CAAC,YAAY,CACxBA,cAAA,CAACC,kBAAa,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAA,QAAA,EAC3B,QAAQ,GACG,EAChB,UAAU,CACb;AACL"}
1
+ {"version":3,"file":"index.js","sources":["../../src/Portal/index.tsx"],"sourcesContent":["\nimport React, { useEffect, useMemo } from 'react'\nimport ReactDOM from 'react-dom';\nimport { useTheme, ThemeProvider } from '@xanui/core';\nexport type PortalProps = {\n children?: React.ReactNode;\n appendTo?: HTMLElement;\n container?: HTMLElement;\n}\n\nconst Portal = ({ children, appendTo, container }: PortalProps) => {\n const theme = useTheme()\n appendTo = appendTo || document.body\n\n const c = useMemo(() => {\n let _con: HTMLElement = container || document.createElement(\"div\");\n appendTo.appendChild(_con);\n _con.className = \"xui-portal\"\n return _con\n }, [])\n\n useEffect(() => {\n return () => {\n (appendTo as any).removeChild(c);\n }\n }, [])\n\n return ReactDOM.createPortal(\n <ThemeProvider theme={theme.name}>\n {children}\n </ThemeProvider>,\n c,\n );\n}\n\nexport default Portal"],"names":["useTheme","useMemo","useEffect","_jsx","ThemeProvider"],"mappings":"mMAUA,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAe,KAAI;AAC9D,IAAA,MAAM,KAAK,GAAGA,aAAQ,EAAE;AACxB,IAAA,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI;AAEpC,IAAA,MAAM,CAAC,GAAGC,aAAO,CAAC,MAAK;QACnB,IAAI,IAAI,GAAgB,SAAS,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClE,QAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY;AAC7B,QAAA,OAAO,IAAI;IACf,CAAC,EAAE,EAAE,CAAC;IAENC,eAAS,CAAC,MAAK;AACX,QAAA,OAAO,MAAK;AACP,YAAA,QAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AACpC,QAAA,CAAC;IACL,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,OAAO,QAAQ,CAAC,YAAY,CACxBC,cAAA,CAACC,kBAAa,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAA,QAAA,EAC3B,QAAQ,GACG,EAChB,CAAC,CACJ;AACL"}
package/Portal/index.mjs CHANGED
@@ -1,19 +1,16 @@
1
- import {jsx,Fragment}from'react/jsx-runtime';import {useState,useEffect}from'react';import ReactDOM from'react-dom';import {useTheme,ThemeProvider}from'@xanui/core';const Portal = ({ children, appendTo, container }) => {
2
- const [_container, setContainer] = useState(container);
1
+ import {jsx}from'react/jsx-runtime';import {useMemo,useEffect}from'react';import ReactDOM from'react-dom';import {useTheme,ThemeProvider}from'@xanui/core';const Portal = ({ children, appendTo, container }) => {
3
2
  const theme = useTheme();
4
- useEffect(() => {
5
- appendTo = appendTo || document.body;
6
- let _con = _container || document.createElement("div");
3
+ appendTo = appendTo || document.body;
4
+ const c = useMemo(() => {
5
+ let _con = container || document.createElement("div");
7
6
  appendTo.appendChild(_con);
8
7
  _con.className = "xui-portal";
9
- if (!_container) {
10
- setContainer(_con);
11
- }
8
+ return _con;
9
+ }, []);
10
+ useEffect(() => {
12
11
  return () => {
13
- appendTo.removeChild(_con);
12
+ appendTo.removeChild(c);
14
13
  };
15
14
  }, []);
16
- if (!_container)
17
- return jsx(Fragment, {});
18
- return ReactDOM.createPortal(jsx(ThemeProvider, { theme: theme.name, children: children }), _container);
15
+ return ReactDOM.createPortal(jsx(ThemeProvider, { theme: theme.name, children: children }), c);
19
16
  };export{Portal as default};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/Portal/index.tsx"],"sourcesContent":["\nimport React, { useEffect, useState } from 'react'\nimport ReactDOM from 'react-dom';\nimport { useTheme, ThemeProvider } from '@xanui/core';\nexport type PortalProps = {\n children?: React.ReactNode;\n appendTo?: HTMLElement;\n container?: HTMLElement;\n}\n\nconst Portal = ({ children, appendTo, container }: PortalProps) => {\n const [_container, setContainer] = useState<HTMLElement | undefined>(container)\n const theme = useTheme()\n\n useEffect(() => {\n appendTo = appendTo || document.body\n let _con: HTMLElement = _container || document.createElement(\"div\");\n appendTo.appendChild(_con);\n _con.className = \"xui-portal\"\n if (!_container) {\n setContainer(_con)\n }\n\n return () => {\n (appendTo as any).removeChild(_con);\n }\n }, [])\n\n if (!_container) return <></>\n\n return ReactDOM.createPortal(\n <ThemeProvider theme={theme.name}>\n {children}\n </ThemeProvider>,\n _container,\n );\n}\n\nexport default Portal"],"names":["_jsx"],"mappings":"qKAUA,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAe,KAAI;IAC9D,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,QAAQ,CAA0B,SAAS,CAAC;AAC/E,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;IAExB,SAAS,CAAC,MAAK;AACX,QAAA,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI;QACpC,IAAI,IAAI,GAAgB,UAAU,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACnE,QAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY;QAC7B,IAAI,CAAC,UAAU,EAAE;YACb,YAAY,CAAC,IAAI,CAAC;QACtB;AAEA,QAAA,OAAO,MAAK;AACP,YAAA,QAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;AACvC,QAAA,CAAC;IACL,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,IAAI,CAAC,UAAU;AAAE,QAAA,OAAOA,iBAAK;AAE7B,IAAA,OAAO,QAAQ,CAAC,YAAY,CACxBA,GAAA,CAAC,aAAa,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAA,QAAA,EAC3B,QAAQ,GACG,EAChB,UAAU,CACb;AACL"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/Portal/index.tsx"],"sourcesContent":["\nimport React, { useEffect, useMemo } from 'react'\nimport ReactDOM from 'react-dom';\nimport { useTheme, ThemeProvider } from '@xanui/core';\nexport type PortalProps = {\n children?: React.ReactNode;\n appendTo?: HTMLElement;\n container?: HTMLElement;\n}\n\nconst Portal = ({ children, appendTo, container }: PortalProps) => {\n const theme = useTheme()\n appendTo = appendTo || document.body\n\n const c = useMemo(() => {\n let _con: HTMLElement = container || document.createElement(\"div\");\n appendTo.appendChild(_con);\n _con.className = \"xui-portal\"\n return _con\n }, [])\n\n useEffect(() => {\n return () => {\n (appendTo as any).removeChild(c);\n }\n }, [])\n\n return ReactDOM.createPortal(\n <ThemeProvider theme={theme.name}>\n {children}\n </ThemeProvider>,\n c,\n );\n}\n\nexport default Portal"],"names":["_jsx"],"mappings":"2JAUA,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAe,KAAI;AAC9D,IAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,IAAA,QAAQ,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAI;AAEpC,IAAA,MAAM,CAAC,GAAG,OAAO,CAAC,MAAK;QACnB,IAAI,IAAI,GAAgB,SAAS,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClE,QAAA,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,YAAY;AAC7B,QAAA,OAAO,IAAI;IACf,CAAC,EAAE,EAAE,CAAC;IAEN,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,MAAK;AACP,YAAA,QAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;AACpC,QAAA,CAAC;IACL,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,OAAO,QAAQ,CAAC,YAAY,CACxBA,GAAA,CAAC,aAAa,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAA,QAAA,EAC3B,QAAQ,GACG,EAChB,CAAC,CACJ;AACL"}
@@ -1,6 +1,6 @@
1
1
  'use strict';Object.defineProperty(exports,'__esModule',{value:true});var tslib=require('tslib'),jsxRuntime=require('react/jsx-runtime'),core=require('@xanui/core'),React=require('react');const Scrollbar = React.forwardRef((_a, ref) => {
2
2
  var { children } = _a, rest = tslib.__rest(_a, ["children"]);
3
- let [_b] = core.useInterface("Scrollbar", rest, {}), { thumbSize, thumbColor, trackColor, onScroll, onScrollEnd } = _b, props = tslib.__rest(_b, ["thumbSize", "thumbColor", "trackColor", "onScroll", "onScrollEnd"]);
3
+ let [_b] = core.useInterface("Scrollbar", rest, {}), { onScroll, onScrollEnd } = _b, props = tslib.__rest(_b, ["onScroll", "onScrollEnd"]);
4
4
  const innerRef = React.useRef(null);
5
5
  React.useImperativeHandle(ref, () => ({
6
6
  scrollTo(pos) {