@particle-network/ui-react 0.6.1 → 0.7.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/UXSimplePopover/index.d.ts +1 -0
- package/dist/components/UXSimplePopover/index.js +1 -0
- package/dist/components/UXSimplePopover/simple-popover.d.ts +25 -0
- package/dist/components/UXSimplePopover/simple-popover.js +116 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './simple-popover';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./simple-popover.js";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type SimplePopoverPlacement = 'top' | 'bottom' | 'left' | 'right' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' | 'left-start' | 'left-end' | 'right-start' | 'right-end';
|
|
3
|
+
export type SimplePopoverTriggerType = 'click' | 'hover';
|
|
4
|
+
export interface UXSimplePopoverProps {
|
|
5
|
+
/** Popover content */
|
|
6
|
+
content: React.ReactNode;
|
|
7
|
+
/** Trigger element(s) */
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
/** How to open: click (uses popovertarget) or hover (uses showPopover/hidePopover) */
|
|
10
|
+
triggerType?: SimplePopoverTriggerType;
|
|
11
|
+
/** Placement relative to trigger; uses CSS Anchor Positioning when supported */
|
|
12
|
+
placement?: SimplePopoverPlacement;
|
|
13
|
+
/** Hover only: delay before opening (ms) */
|
|
14
|
+
delay?: number;
|
|
15
|
+
/** Hover only: delay before closing (ms) */
|
|
16
|
+
closeDelay?: number;
|
|
17
|
+
/** ClassName for the trigger wrapper (when cloning a single child, applied to that child) */
|
|
18
|
+
classNames?: {
|
|
19
|
+
trigger?: string;
|
|
20
|
+
content?: string;
|
|
21
|
+
};
|
|
22
|
+
/** popovertargetaction when triggerType is click: 'toggle' | 'show' | 'hide' */
|
|
23
|
+
popoverTargetAction?: 'toggle' | 'show' | 'hide';
|
|
24
|
+
}
|
|
25
|
+
export declare const UXSimplePopover: React.FC<UXSimplePopoverProps>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import react, { cloneElement, isValidElement, useCallback, useId, useRef } from "react";
|
|
3
|
+
import { cn } from "../../utils/index.js";
|
|
4
|
+
const UXSimplePopover = (props)=>{
|
|
5
|
+
const { content, children, triggerType = 'hover', placement = 'top', delay = 300, closeDelay = 100, classNames = {
|
|
6
|
+
trigger: '',
|
|
7
|
+
content: ''
|
|
8
|
+
}, popoverTargetAction = 'toggle' } = props;
|
|
9
|
+
const id = useId().replace(/:/g, '');
|
|
10
|
+
const popoverId = `simple-popover-${id}`;
|
|
11
|
+
const anchorName = `--simple-popover-${id}`;
|
|
12
|
+
const popoverRef = useRef(null);
|
|
13
|
+
const openTimerRef = useRef(null);
|
|
14
|
+
const closeTimerRef = useRef(null);
|
|
15
|
+
const clearOpenTimer = useCallback(()=>{
|
|
16
|
+
if (null !== openTimerRef.current) {
|
|
17
|
+
clearTimeout(openTimerRef.current);
|
|
18
|
+
openTimerRef.current = null;
|
|
19
|
+
}
|
|
20
|
+
}, []);
|
|
21
|
+
const clearCloseTimer = useCallback(()=>{
|
|
22
|
+
if (null !== closeTimerRef.current) {
|
|
23
|
+
clearTimeout(closeTimerRef.current);
|
|
24
|
+
closeTimerRef.current = null;
|
|
25
|
+
}
|
|
26
|
+
}, []);
|
|
27
|
+
const showPopover = useCallback(()=>{
|
|
28
|
+
clearCloseTimer();
|
|
29
|
+
openTimerRef.current = setTimeout(()=>{
|
|
30
|
+
openTimerRef.current = null;
|
|
31
|
+
popoverRef.current?.showPopover();
|
|
32
|
+
}, delay);
|
|
33
|
+
}, [
|
|
34
|
+
delay,
|
|
35
|
+
clearCloseTimer
|
|
36
|
+
]);
|
|
37
|
+
const hidePopover = useCallback(()=>{
|
|
38
|
+
clearOpenTimer();
|
|
39
|
+
closeTimerRef.current = setTimeout(()=>{
|
|
40
|
+
closeTimerRef.current = null;
|
|
41
|
+
popoverRef.current?.hidePopover();
|
|
42
|
+
}, closeDelay);
|
|
43
|
+
}, [
|
|
44
|
+
closeDelay,
|
|
45
|
+
clearOpenTimer
|
|
46
|
+
]);
|
|
47
|
+
react.useEffect(()=>()=>{
|
|
48
|
+
clearOpenTimer();
|
|
49
|
+
clearCloseTimer();
|
|
50
|
+
}, [
|
|
51
|
+
clearOpenTimer,
|
|
52
|
+
clearCloseTimer
|
|
53
|
+
]);
|
|
54
|
+
const triggerAnchorStyle = {
|
|
55
|
+
anchorName
|
|
56
|
+
};
|
|
57
|
+
const popoverAnchorStyle = {
|
|
58
|
+
positionAnchor: anchorName,
|
|
59
|
+
positionArea: placement
|
|
60
|
+
};
|
|
61
|
+
const isClick = 'click' === triggerType;
|
|
62
|
+
const trigger = isClick ? /*#__PURE__*/ jsx("button", {
|
|
63
|
+
type: "button",
|
|
64
|
+
popovertarget: popoverId,
|
|
65
|
+
popovertargetaction: popoverTargetAction,
|
|
66
|
+
className: classNames.trigger,
|
|
67
|
+
style: {
|
|
68
|
+
margin: 0,
|
|
69
|
+
padding: 0,
|
|
70
|
+
border: 'none',
|
|
71
|
+
font: 'inherit',
|
|
72
|
+
color: 'inherit',
|
|
73
|
+
backgroundColor: 'transparent',
|
|
74
|
+
cursor: 'pointer',
|
|
75
|
+
...triggerAnchorStyle
|
|
76
|
+
},
|
|
77
|
+
children: children
|
|
78
|
+
}) : (()=>{
|
|
79
|
+
const childElement = /*#__PURE__*/ isValidElement(children) && 1 === react.Children.count(children) ? children : null;
|
|
80
|
+
return childElement ? /*#__PURE__*/ cloneElement(childElement, {
|
|
81
|
+
onMouseEnter: showPopover,
|
|
82
|
+
onMouseLeave: hidePopover,
|
|
83
|
+
className: [
|
|
84
|
+
classNames.trigger,
|
|
85
|
+
childElement.props?.className
|
|
86
|
+
].filter(Boolean).join(' '),
|
|
87
|
+
style: {
|
|
88
|
+
...childElement.props?.style,
|
|
89
|
+
...triggerAnchorStyle
|
|
90
|
+
}
|
|
91
|
+
}) : /*#__PURE__*/ jsx("span", {
|
|
92
|
+
className: classNames.trigger,
|
|
93
|
+
style: triggerAnchorStyle,
|
|
94
|
+
role: "button",
|
|
95
|
+
tabIndex: 0,
|
|
96
|
+
onMouseEnter: showPopover,
|
|
97
|
+
onMouseLeave: hidePopover,
|
|
98
|
+
children: children
|
|
99
|
+
});
|
|
100
|
+
})();
|
|
101
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
|
102
|
+
children: [
|
|
103
|
+
trigger,
|
|
104
|
+
/*#__PURE__*/ jsx("div", {
|
|
105
|
+
ref: popoverRef,
|
|
106
|
+
id: popoverId,
|
|
107
|
+
popover: isClick ? 'auto' : 'manual',
|
|
108
|
+
className: cn('bg-content1 text-foreground-300 shadow-box text-tiny leading-1.4 wrap-break-word rounded-medium max-w-[300px] break-words p-2.5 antialiased', classNames.content),
|
|
109
|
+
style: popoverAnchorStyle,
|
|
110
|
+
children: content
|
|
111
|
+
})
|
|
112
|
+
]
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
UXSimplePopover.displayName = 'UXSimplePopover';
|
|
116
|
+
export { UXSimplePopover };
|
package/dist/components/index.js
CHANGED
|
@@ -23,6 +23,7 @@ export * from "./UXPopover/index.js";
|
|
|
23
23
|
export * from "./UXRadio/index.js";
|
|
24
24
|
export * from "./UXRangeInput/index.js";
|
|
25
25
|
export * from "./UXSelect/index.js";
|
|
26
|
+
export * from "./UXSimplePopover/index.js";
|
|
26
27
|
export * from "./UXSlider/index.js";
|
|
27
28
|
export * from "./UXSpinner/index.js";
|
|
28
29
|
export * from "./UXSwitch/index.js";
|