@seeqdev/qomponents 0.0.108 → 0.0.109
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/Accordion/Accordion.js +8 -8
- package/dist/Accordion/Accordion.stories.js +114 -114
- package/dist/Accordion/Accordion.test.js +54 -54
- package/dist/Accordion/Accordion.types.js +1 -1
- package/dist/Accordion/index.js +1 -1
- package/dist/Alert/Alert.js +31 -31
- package/dist/Alert/Alert.stories.js +44 -44
- package/dist/Alert/Alert.test.js +50 -50
- package/dist/Alert/Alert.types.js +1 -1
- package/dist/Alert/index.js +1 -1
- package/dist/Button/Button.js +91 -91
- package/dist/Button/Button.stories.js +97 -97
- package/dist/Button/Button.test.js +48 -48
- package/dist/Button/Button.types.js +4 -4
- package/dist/Button/index.js +1 -1
- package/dist/ButtonWithDropdown/ButtonWithDropdown.js +66 -66
- package/dist/ButtonWithDropdown/ButtonWithDropdown.stories.js +97 -97
- package/dist/ButtonWithDropdown/ButtonWithDropdown.test.js +84 -84
- package/dist/ButtonWithDropdown/ButtonWithDropdown.types.js +1 -1
- package/dist/ButtonWithDropdown/index.js +1 -1
- package/dist/ButtonWithPopover/ButtonWithPopover.js +50 -50
- package/dist/ButtonWithPopover/ButtonWithPopover.stories.js +74 -74
- package/dist/ButtonWithPopover/ButtonWithPopover.test.js +81 -81
- package/dist/ButtonWithPopover/ButtonWithPopover.types.js +1 -1
- package/dist/ButtonWithPopover/index.js +1 -1
- package/dist/Checkbox/Checkbox.js +25 -25
- package/dist/Checkbox/Checkbox.stories.js +33 -33
- package/dist/Checkbox/Checkbox.test.js +93 -93
- package/dist/Checkbox/Checkbox.types.js +1 -1
- package/dist/Checkbox/index.js +1 -1
- package/dist/Icon/Icon.js +53 -53
- package/dist/Icon/Icon.stories.js +44 -44
- package/dist/Icon/Icon.test.js +54 -54
- package/dist/Icon/Icon.types.js +15 -15
- package/dist/Icon/index.js +1 -1
- package/dist/InputGroup/InputGroup.js +25 -25
- package/dist/InputGroup/InputGroup.stories.js +141 -141
- package/dist/InputGroup/InputGroup.test.js +42 -42
- package/dist/InputGroup/InputGroup.types.js +1 -1
- package/dist/InputGroup/index.js +1 -1
- package/dist/Modal/Modal.js +97 -97
- package/dist/Modal/Modal.stories.js +126 -126
- package/dist/Modal/Modal.test.js +107 -107
- package/dist/Modal/Modal.types.js +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/SeeqActionDropdown/SeeqActionDropdown.js +47 -47
- package/dist/SeeqActionDropdown/SeeqActionDropdown.stories.js +79 -79
- package/dist/SeeqActionDropdown/SeeqActionDropdown.test.js +72 -72
- package/dist/SeeqActionDropdown/SeeqActionDropdown.types.js +1 -1
- package/dist/SeeqActionDropdown/index.js +1 -1
- package/dist/SeeqActionDropdown/variants.js +22 -22
- package/dist/Select/Select.js +173 -173
- package/dist/Select/Select.stories.js +79 -79
- package/dist/Select/Select.test.js +181 -181
- package/dist/Select/Select.types.js +1 -1
- package/dist/Select/index.js +2 -2
- package/dist/Tabs/Tabs.js +21 -21
- package/dist/Tabs/Tabs.stories.js +90 -90
- package/dist/Tabs/Tabs.test.js +90 -90
- package/dist/Tabs/Tabs.types.js +1 -1
- package/dist/Tabs/index.js +1 -1
- package/dist/TextArea/TextArea.js +24 -24
- package/dist/TextArea/TextArea.stories.js +45 -45
- package/dist/TextArea/TextArea.test.js +67 -67
- package/dist/TextArea/TextArea.types.js +1 -1
- package/dist/TextArea/index.js +1 -1
- package/dist/TextField/TextField.js +78 -78
- package/dist/TextField/TextField.stories.js +69 -69
- package/dist/TextField/TextField.test.js +38 -38
- package/dist/TextField/TextField.types.js +1 -1
- package/dist/TextField/index.js +1 -1
- package/dist/ToolbarButton/ToolbarButton.js +74 -74
- package/dist/ToolbarButton/ToolbarButton.stories.js +93 -93
- package/dist/ToolbarButton/ToolbarButton.test.js +92 -92
- package/dist/ToolbarButton/ToolbarButton.types.js +1 -1
- package/dist/ToolbarButton/index.js +1 -1
- package/dist/Tooltip/QTip.stories.js +44 -44
- package/dist/Tooltip/QTip.types.js +1 -1
- package/dist/Tooltip/QTipPerformance.stories.js +29 -29
- package/dist/Tooltip/Qtip.js +154 -154
- package/dist/Tooltip/Tooltip.js +30 -30
- package/dist/Tooltip/Tooltip.stories.js +31 -31
- package/dist/Tooltip/Tooltip.types.js +2 -2
- package/dist/Tooltip/TooltipPerformance.stories.js +29 -29
- package/dist/Tooltip/index.js +2 -2
- package/dist/Tooltip/qTip.utilities.js +10 -10
- package/dist/index.esm.js +30 -17
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +30 -17
- package/dist/index.js.map +1 -1
- package/dist/types.js +1 -1
- package/dist/utils/browserId.js +28 -28
- package/dist/utils/svg.js +19 -19
- package/dist/utils/validateStyleDimension.js +13 -13
- package/dist/utils/validateStyleDimension.test.js +19 -19
- package/package.json +1 -1
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
3
|
-
import { getQTipData } from '../Tooltip/qTip.utilities';
|
|
4
|
-
const bgStyles = ['tw-bg-sq-white', 'dark:tw-bg-sq-dark-background'].join(' ');
|
|
5
|
-
const borderStyles = [
|
|
6
|
-
'tw-border-solid',
|
|
7
|
-
'tw-border',
|
|
8
|
-
'tw-rounded-sm',
|
|
9
|
-
'tw-border-sq-disabled-gray',
|
|
10
|
-
'dark:tw-border-gray-500',
|
|
11
|
-
].join(' ');
|
|
12
|
-
const disabledClasses = ['tw-opacity-50', 'tw-cursor-not-allowed'].join(' ');
|
|
13
|
-
const ButtonWithPopover = ({ children, trigger, id, hasArrow, extraTriggerClassNames, extraPopoverClassNames, containerTestId, onInteractOutside, onPointerDownOutside, isTriggerAsChild = false, shouldTriggerFullWidth = false, disabled = false, align = 'end', alignOffset = -35, placement = 'bottom', placementOffset = 2, isHoverEnabled = false, hoverOpenDelay = 300, onOpenChange, isOpen, isCloseOnContentClick = false, isPortal = false, ...tooltipProps }) => {
|
|
14
|
-
const tooltipData = getQTipData(tooltipProps);
|
|
15
|
-
let timeout;
|
|
16
|
-
const [isHoveredOpen, setIsHoveredOpen] = React.useState(false);
|
|
17
|
-
const onHoverStart = () => {
|
|
18
|
-
if (isHoverEnabled) {
|
|
19
|
-
timeout = setTimeout(() => {
|
|
20
|
-
setIsHoveredOpen(true);
|
|
21
|
-
onOpenChange && onOpenChange(true);
|
|
22
|
-
}, hoverOpenDelay);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
const onHoverEnd = () => {
|
|
26
|
-
if (isHoverEnabled) {
|
|
27
|
-
timeout = setTimeout(() => {
|
|
28
|
-
setIsHoveredOpen(false);
|
|
29
|
-
onOpenChange && onOpenChange(false);
|
|
30
|
-
}, 200);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
React.useEffect(() => () => timeout && clearTimeout(timeout), []);
|
|
34
|
-
const renderContent = () => {
|
|
35
|
-
return (React.createElement(PopoverPrimitive.Content, { sideOffset: placementOffset, align: align, side: placement, onInteractOutside: onInteractOutside, onPointerDownOutside: onPointerDownOutside, alignOffset: isHoverEnabled ? -10 : alignOffset, asChild: true, onClick: () => isCloseOnContentClick && onOpenChange && onOpenChange(false), className: "focus-visible:tw-outline-none tw-outline-none tw-w-full tw-h-full" },
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
3
|
+
import { getQTipData } from '../Tooltip/qTip.utilities';
|
|
4
|
+
const bgStyles = ['tw-bg-sq-white', 'dark:tw-bg-sq-dark-background'].join(' ');
|
|
5
|
+
const borderStyles = [
|
|
6
|
+
'tw-border-solid',
|
|
7
|
+
'tw-border',
|
|
8
|
+
'tw-rounded-sm',
|
|
9
|
+
'tw-border-sq-disabled-gray',
|
|
10
|
+
'dark:tw-border-gray-500',
|
|
11
|
+
].join(' ');
|
|
12
|
+
const disabledClasses = ['tw-opacity-50', 'tw-cursor-not-allowed'].join(' ');
|
|
13
|
+
const ButtonWithPopover = ({ children, trigger, id, hasArrow, extraTriggerClassNames, extraPopoverClassNames, containerTestId, onInteractOutside, onPointerDownOutside, isTriggerAsChild = false, shouldTriggerFullWidth = false, disabled = false, align = 'end', alignOffset = -35, placement = 'bottom', placementOffset = 2, isHoverEnabled = false, hoverOpenDelay = 300, onOpenChange, isOpen, isCloseOnContentClick = false, isPortal = false, ...tooltipProps }) => {
|
|
14
|
+
const tooltipData = getQTipData(tooltipProps);
|
|
15
|
+
let timeout;
|
|
16
|
+
const [isHoveredOpen, setIsHoveredOpen] = React.useState(false);
|
|
17
|
+
const onHoverStart = () => {
|
|
18
|
+
if (isHoverEnabled) {
|
|
19
|
+
timeout = setTimeout(() => {
|
|
20
|
+
setIsHoveredOpen(true);
|
|
21
|
+
onOpenChange && onOpenChange(true);
|
|
22
|
+
}, hoverOpenDelay);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const onHoverEnd = () => {
|
|
26
|
+
if (isHoverEnabled) {
|
|
27
|
+
timeout = setTimeout(() => {
|
|
28
|
+
setIsHoveredOpen(false);
|
|
29
|
+
onOpenChange && onOpenChange(false);
|
|
30
|
+
}, 200);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
React.useEffect(() => () => timeout && clearTimeout(timeout), []);
|
|
34
|
+
const renderContent = () => {
|
|
35
|
+
return (React.createElement(PopoverPrimitive.Content, { sideOffset: placementOffset, align: align, side: placement, onInteractOutside: onInteractOutside, onPointerDownOutside: onPointerDownOutside, alignOffset: isHoverEnabled ? -10 : alignOffset, asChild: true, onClick: () => isCloseOnContentClick && onOpenChange && onOpenChange(false), className: "focus-visible:tw-outline-none tw-outline-none tw-w-full tw-h-full" },
|
|
36
36
|
React.createElement("div", { "data-testid": containerTestId, className: `${bgStyles} ${borderStyles} tw-relative tw-z-[1200] tw-min-w-6 focus-visible:tw-outline-none tw-outline-none data-[state=open]:tw-animate-in data-[state=closed]:tw-animate-out
|
|
37
37
|
data-[side=top]:tw-animate-slideDownAndFade data-[side=right]:tw-animate-slideLeftAndFade data-[side=bottom]:tw-animate-slideUpAndFade data-[side=left]:tw-animate-slideRightAndFade tw-text-sq-text-color
|
|
38
|
-
${extraPopoverClassNames || ''}` },
|
|
39
|
-
hasArrow && (React.createElement(PopoverPrimitive.Arrow, { asChild: true },
|
|
40
|
-
React.createElement("div", { className: "tw-fill-transparent tw-bg-white tw-w-[15px] tw-h-[15px] tw-mt-[-7px] tw-rotate-45 dark:tw-bg-sq-dark-background tw-border-b tw-border-r tw-border-sq-disabled-gray dark:tw-border-gray-500" }))),
|
|
41
|
-
children)));
|
|
42
|
-
};
|
|
43
|
-
const renderPopover = (popoverOpenState) => {
|
|
44
|
-
return (React.createElement(PopoverPrimitive.Root, { open: popoverOpenState, defaultOpen: false, onOpenChange: onOpenChange },
|
|
45
|
-
trigger ? (React.createElement(PopoverPrimitive.Trigger, { id: id, asChild: isTriggerAsChild, className: `focus-visible:tw-outline-none tw-outline-none ${shouldTriggerFullWidth ? 'tw-w-full tw-h-full' : ''}`, disabled: disabled },
|
|
46
|
-
React.createElement("div", { ...tooltipData, onMouseOver: onHoverStart, onMouseOut: onHoverEnd, className: `tw-bg-transparent focus-visible:tw-outline-none tw-outline-none ${disabled ? disabledClasses : ''} ${shouldTriggerFullWidth ? 'tw-flex tw-flex-col tw-items-center tw-justify-center' : 'tw-inline'} ${extraTriggerClassNames || ''}` }, trigger))) : (React.createElement(PopoverPrimitive.Trigger, { asChild: true },
|
|
47
|
-
React.createElement("div", null))),
|
|
48
|
-
isPortal ? React.createElement(PopoverPrimitive.Portal, null, renderContent()) : renderContent()));
|
|
49
|
-
};
|
|
50
|
-
return isHoverEnabled ? renderPopover(isHoveredOpen) : renderPopover(isOpen);
|
|
51
|
-
};
|
|
52
|
-
export default ButtonWithPopover;
|
|
38
|
+
${extraPopoverClassNames || ''}` },
|
|
39
|
+
hasArrow && (React.createElement(PopoverPrimitive.Arrow, { asChild: true },
|
|
40
|
+
React.createElement("div", { className: "tw-fill-transparent tw-bg-white tw-w-[15px] tw-h-[15px] tw-mt-[-7px] tw-rotate-45 dark:tw-bg-sq-dark-background tw-border-b tw-border-r tw-border-sq-disabled-gray dark:tw-border-gray-500" }))),
|
|
41
|
+
children)));
|
|
42
|
+
};
|
|
43
|
+
const renderPopover = (popoverOpenState) => {
|
|
44
|
+
return (React.createElement(PopoverPrimitive.Root, { open: popoverOpenState, defaultOpen: false, onOpenChange: onOpenChange },
|
|
45
|
+
trigger ? (React.createElement(PopoverPrimitive.Trigger, { id: id, asChild: isTriggerAsChild, className: `focus-visible:tw-outline-none tw-outline-none ${shouldTriggerFullWidth ? 'tw-w-full tw-h-full' : ''}`, disabled: disabled },
|
|
46
|
+
React.createElement("div", { ...tooltipData, onMouseOver: onHoverStart, onMouseOut: onHoverEnd, className: `tw-bg-transparent focus-visible:tw-outline-none tw-outline-none ${disabled ? disabledClasses : ''} ${shouldTriggerFullWidth ? 'tw-flex tw-flex-col tw-items-center tw-justify-center' : 'tw-inline'} ${extraTriggerClassNames || ''}` }, trigger))) : (React.createElement(PopoverPrimitive.Trigger, { asChild: true },
|
|
47
|
+
React.createElement("div", null))),
|
|
48
|
+
isPortal ? React.createElement(PopoverPrimitive.Portal, null, renderContent()) : renderContent()));
|
|
49
|
+
};
|
|
50
|
+
return isHoverEnabled ? renderPopover(isHoveredOpen) : renderPopover(isOpen);
|
|
51
|
+
};
|
|
52
|
+
export default ButtonWithPopover;
|
|
53
53
|
//# sourceMappingURL=ButtonWithPopover.js.map
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import ButtonWithPopover from './ButtonWithPopover';
|
|
3
|
-
import Icon from '../Icon';
|
|
4
|
-
import { QTip } from '../Tooltip/Qtip';
|
|
5
|
-
export default {
|
|
6
|
-
title: 'Button with Popover',
|
|
7
|
-
};
|
|
8
|
-
export const AllButtonWithPopoverVariants = () => {
|
|
9
|
-
const options = ['Chocolate', 'Strawberry', 'Vanilla', 'Rocky Road', 'Crazy Cow', 'Almond Joy'];
|
|
10
|
-
const renderFlavours = () => (React.createElement("div", { className: "tw-text-sm dark:tw-text-white tw-w-72 tw-p-4" },
|
|
11
|
-
React.createElement("p", { className: "tw-font-bold" }, "Flavors"),
|
|
12
|
-
React.createElement("div", { className: "tw-w-full tw-flex tw-flex-wrap tw-gap-1" }, options.map((option) => (React.createElement("div", { key: option, className: "tw-flex tw-items-center tw-px-2 tw-py-1 tw-mt-2 tw tw-rounded-full tw-border-sq-color-dark-dark tw-border" },
|
|
13
|
-
React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-check", extraClassNames: "tw-mr-2" }),
|
|
14
|
-
React.createElement("span", null, option)))))));
|
|
15
|
-
const renderInputFields = () => {
|
|
16
|
-
const [name, setName] = React.useState('');
|
|
17
|
-
const [email, setEmail] = React.useState('');
|
|
18
|
-
return (React.createElement("div", { className: "tw-w-72 tw-p-4" },
|
|
19
|
-
React.createElement("div", { className: "tw-flex tw-flex-col tw-gap-2" },
|
|
20
|
-
React.createElement("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "Enter your name", className: "tw-p-2 tw-rounded tw-border tw-border-sq-color-dark-dark dark:tw-border-sq-dark-background tw-bg-transparent" }),
|
|
21
|
-
React.createElement("input", { type: "text", value: email, onChange: (e) => setEmail(e.target.value), placeholder: "Enter your email", className: "tw-p-2 tw-rounded tw-border tw-border-sq-color-dark-dark dark:tw-border-sq-dark-background tw-bg-transparent" }),
|
|
22
|
-
React.createElement("button", { className: "tw-p-2 tw-rounded tw-border tw-border-sq-color-dark-dark dark:tw-border-sq-dark-background tw-bg-transparent tw-text-sq-color" }, "Submit"))));
|
|
23
|
-
};
|
|
24
|
-
const [openPopver, setOpenPopover] = React.useState('');
|
|
25
|
-
const iconRef = React.useRef(null);
|
|
26
|
-
const allButtonWithPopovers = (isDark = false, topic) => (React.createElement("div", { className: isDark ? 'tw-dark tw-bg-sq-dark-background ' : '' },
|
|
27
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
28
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-1`, tooltip: "This is a small popover.", tooltipDelay: 0, tooltipPlacement: "top", isHtmlTooltip: false }, renderFlavours())),
|
|
29
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
30
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-2`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-2`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-2` : ''), tooltip: "This is a normal popover.", tooltipDelay: 0, tooltipPlacement: "top", isHtmlTooltip: false }, renderFlavours())),
|
|
31
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
32
|
-
React.createElement("p", { className: "dark:tw-text-sq-white tw-text-sm tw-mb-4" }, "Close popover on content click"),
|
|
33
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-3`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-3`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-3` : ''), tooltip: "This is a normal popover.", tooltipDelay: 0, tooltipPlacement: "top", isCloseOnContentClick: true, isHtmlTooltip: false }, renderFlavours())),
|
|
34
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
35
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-4`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-4`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-4` : ''), tooltip: "This is a disabled popover.", tooltipDelay: 0, tooltipPlacement: "top", isHtmlTooltip: false, disabled: true }, renderFlavours())),
|
|
36
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
37
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover with arrow"),
|
|
38
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-5`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-5`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-5` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
39
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
40
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover aligned at center"),
|
|
41
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-6`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-6`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-6` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, tooltipPlacement: "top", align: "center", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
42
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
43
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover aligned at start"),
|
|
44
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-7`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-7`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-7` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, align: "start", tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
45
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
46
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover triggered by hover"),
|
|
47
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-8`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-8`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-8` : ''), isHoverEnabled: true, align: "start", tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
48
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
49
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover triggered by another element"), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9`, onInteractOutside: () => setOpenPopover(''), align: "start", tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours()),
|
|
50
|
-
openPopver != `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9` && (React.createElement("div", { ref: iconRef, onClick: () => {
|
|
51
|
-
setOpenPopover(`basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9`);
|
|
52
|
-
} },
|
|
53
|
-
React.createElement(Icon, { type: "text", icon: "fc-all-items" })))),
|
|
54
|
-
React.createElement("div", { className: "tw-p-5 " },
|
|
55
|
-
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover with input fields"),
|
|
56
|
-
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-10`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-10`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-10` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, tooltipPlacement: "top", align: "center", hasArrow: true, isHtmlTooltip: false }, renderInputFields()))));
|
|
57
|
-
const renderAllVariations = (color) => (React.createElement("div", { className: "tw-grid tw-grid-cols-2 tw-gap-4 tw-p-4" },
|
|
58
|
-
allButtonWithPopovers(false, color),
|
|
59
|
-
allButtonWithPopovers(true, color)));
|
|
60
|
-
return (React.createElement("div", { className: "tw-grid tw-grid-cols-4 tw-gap-4" },
|
|
61
|
-
React.createElement(QTip, null),
|
|
62
|
-
React.createElement("div", { className: "color_topic" },
|
|
63
|
-
React.createElement("b", null, "Topic Colors"),
|
|
64
|
-
renderAllVariations('topic')),
|
|
65
|
-
React.createElement("div", { className: "color_analysis" },
|
|
66
|
-
React.createElement("b", null, "Analysis Colors"),
|
|
67
|
-
renderAllVariations('analysis')),
|
|
68
|
-
React.createElement("div", { className: "color_datalab" },
|
|
69
|
-
React.createElement("b", null, "Datalab Colors"),
|
|
70
|
-
renderAllVariations('datalab')),
|
|
71
|
-
React.createElement("div", { className: "color_vantage" },
|
|
72
|
-
React.createElement("b", null, "Vantage Colors"),
|
|
73
|
-
renderAllVariations('vantage'))));
|
|
74
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import ButtonWithPopover from './ButtonWithPopover';
|
|
3
|
+
import Icon from '../Icon';
|
|
4
|
+
import { QTip } from '../Tooltip/Qtip';
|
|
5
|
+
export default {
|
|
6
|
+
title: 'Button with Popover',
|
|
7
|
+
};
|
|
8
|
+
export const AllButtonWithPopoverVariants = () => {
|
|
9
|
+
const options = ['Chocolate', 'Strawberry', 'Vanilla', 'Rocky Road', 'Crazy Cow', 'Almond Joy'];
|
|
10
|
+
const renderFlavours = () => (React.createElement("div", { className: "tw-text-sm dark:tw-text-white tw-w-72 tw-p-4" },
|
|
11
|
+
React.createElement("p", { className: "tw-font-bold" }, "Flavors"),
|
|
12
|
+
React.createElement("div", { className: "tw-w-full tw-flex tw-flex-wrap tw-gap-1" }, options.map((option) => (React.createElement("div", { key: option, className: "tw-flex tw-items-center tw-px-2 tw-py-1 tw-mt-2 tw tw-rounded-full tw-border-sq-color-dark-dark tw-border" },
|
|
13
|
+
React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-check", extraClassNames: "tw-mr-2" }),
|
|
14
|
+
React.createElement("span", null, option)))))));
|
|
15
|
+
const renderInputFields = () => {
|
|
16
|
+
const [name, setName] = React.useState('');
|
|
17
|
+
const [email, setEmail] = React.useState('');
|
|
18
|
+
return (React.createElement("div", { className: "tw-w-72 tw-p-4" },
|
|
19
|
+
React.createElement("div", { className: "tw-flex tw-flex-col tw-gap-2" },
|
|
20
|
+
React.createElement("input", { type: "text", value: name, onChange: (e) => setName(e.target.value), placeholder: "Enter your name", className: "tw-p-2 tw-rounded tw-border tw-border-sq-color-dark-dark dark:tw-border-sq-dark-background tw-bg-transparent" }),
|
|
21
|
+
React.createElement("input", { type: "text", value: email, onChange: (e) => setEmail(e.target.value), placeholder: "Enter your email", className: "tw-p-2 tw-rounded tw-border tw-border-sq-color-dark-dark dark:tw-border-sq-dark-background tw-bg-transparent" }),
|
|
22
|
+
React.createElement("button", { className: "tw-p-2 tw-rounded tw-border tw-border-sq-color-dark-dark dark:tw-border-sq-dark-background tw-bg-transparent tw-text-sq-color" }, "Submit"))));
|
|
23
|
+
};
|
|
24
|
+
const [openPopver, setOpenPopover] = React.useState('');
|
|
25
|
+
const iconRef = React.useRef(null);
|
|
26
|
+
const allButtonWithPopovers = (isDark = false, topic) => (React.createElement("div", { className: isDark ? 'tw-dark tw-bg-sq-dark-background ' : '' },
|
|
27
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
28
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-1`, tooltip: "This is a small popover.", tooltipDelay: 0, tooltipPlacement: "top", isHtmlTooltip: false }, renderFlavours())),
|
|
29
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
30
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-2`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-2`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-2` : ''), tooltip: "This is a normal popover.", tooltipDelay: 0, tooltipPlacement: "top", isHtmlTooltip: false }, renderFlavours())),
|
|
31
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
32
|
+
React.createElement("p", { className: "dark:tw-text-sq-white tw-text-sm tw-mb-4" }, "Close popover on content click"),
|
|
33
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-3`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-3`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-3` : ''), tooltip: "This is a normal popover.", tooltipDelay: 0, tooltipPlacement: "top", isCloseOnContentClick: true, isHtmlTooltip: false }, renderFlavours())),
|
|
34
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
35
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-4`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-4`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-4` : ''), tooltip: "This is a disabled popover.", tooltipDelay: 0, tooltipPlacement: "top", isHtmlTooltip: false, disabled: true }, renderFlavours())),
|
|
36
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
37
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover with arrow"),
|
|
38
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-5`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-5`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-5` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
39
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
40
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover aligned at center"),
|
|
41
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-6`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-6`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-6` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, tooltipPlacement: "top", align: "center", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
42
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
43
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover aligned at start"),
|
|
44
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-7`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-7`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-7` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, align: "start", tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
45
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
46
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover triggered by hover"),
|
|
47
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-8`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-8`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-8` : ''), isHoverEnabled: true, align: "start", tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours())),
|
|
48
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
49
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover triggered by another element"), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9`, onInteractOutside: () => setOpenPopover(''), align: "start", tooltipPlacement: "top", hasArrow: true, isHtmlTooltip: false }, renderFlavours()),
|
|
50
|
+
openPopver != `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9` && (React.createElement("div", { ref: iconRef, onClick: () => {
|
|
51
|
+
setOpenPopover(`basic-popover-${isDark ? 'dark' : 'light'}-${topic}-9`);
|
|
52
|
+
} },
|
|
53
|
+
React.createElement(Icon, { type: "text", icon: "fc-all-items" })))),
|
|
54
|
+
React.createElement("div", { className: "tw-p-5 " },
|
|
55
|
+
React.createElement("div", { className: "dark:tw-text-white tw-text-xs" }, "Popover with input fields"),
|
|
56
|
+
React.createElement(ButtonWithPopover, { trigger: React.createElement(Icon, { type: "color", color: "rgb(var(--sq-color-dark-dark))", icon: "fc-more" }), containerTestId: `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-10`, isOpen: openPopver === `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-10`, onOpenChange: (isOpen) => setOpenPopover(isOpen ? `basic-popover-${isDark ? 'dark' : 'light'}-${topic}-10` : ''), tooltip: "This is a normal popover with arrow.", tooltipDelay: 0, tooltipPlacement: "top", align: "center", hasArrow: true, isHtmlTooltip: false }, renderInputFields()))));
|
|
57
|
+
const renderAllVariations = (color) => (React.createElement("div", { className: "tw-grid tw-grid-cols-2 tw-gap-4 tw-p-4" },
|
|
58
|
+
allButtonWithPopovers(false, color),
|
|
59
|
+
allButtonWithPopovers(true, color)));
|
|
60
|
+
return (React.createElement("div", { className: "tw-grid tw-grid-cols-4 tw-gap-4" },
|
|
61
|
+
React.createElement(QTip, null),
|
|
62
|
+
React.createElement("div", { className: "color_topic" },
|
|
63
|
+
React.createElement("b", null, "Topic Colors"),
|
|
64
|
+
renderAllVariations('topic')),
|
|
65
|
+
React.createElement("div", { className: "color_analysis" },
|
|
66
|
+
React.createElement("b", null, "Analysis Colors"),
|
|
67
|
+
renderAllVariations('analysis')),
|
|
68
|
+
React.createElement("div", { className: "color_datalab" },
|
|
69
|
+
React.createElement("b", null, "Datalab Colors"),
|
|
70
|
+
renderAllVariations('datalab')),
|
|
71
|
+
React.createElement("div", { className: "color_vantage" },
|
|
72
|
+
React.createElement("b", null, "Vantage Colors"),
|
|
73
|
+
renderAllVariations('vantage'))));
|
|
74
|
+
};
|
|
75
75
|
//# sourceMappingURL=ButtonWithPopover.stories.js.map
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { render, screen, waitFor } from '@testing-library/react';
|
|
4
|
-
import userEvent from '@testing-library/user-event';
|
|
5
|
-
import ButtonWithPopover from './ButtonWithPopover';
|
|
6
|
-
import Icon from '../Icon';
|
|
7
|
-
describe('ButtonWithPopover', () => {
|
|
8
|
-
const mockOnClick = jest.fn();
|
|
9
|
-
const testId = 'trigger-icon';
|
|
10
|
-
class Context {
|
|
11
|
-
props = {
|
|
12
|
-
trigger: (React.createElement(Icon, { icon: "fc-more", type: "text", testId: testId, extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" })),
|
|
13
|
-
onOpenChange: mockOnClick,
|
|
14
|
-
containerTestId: 'basic-Popover1',
|
|
15
|
-
tooltip: 'This is a small Popover.',
|
|
16
|
-
tooltipDelay: 0,
|
|
17
|
-
tooltipPlacement: 'top',
|
|
18
|
-
isHtmlTooltip: false,
|
|
19
|
-
hoverOpenDelay: 0,
|
|
20
|
-
children: React.createElement("div", null, "Popover content"),
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
let tc;
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
tc = new Context();
|
|
26
|
-
jest.clearAllMocks();
|
|
27
|
-
});
|
|
28
|
-
afterEach(() => {
|
|
29
|
-
global.ResizeObserver = undefined;
|
|
30
|
-
});
|
|
31
|
-
const renderButtonWithPopover = (props) => render(React.createElement("div", { "data-testid": "container", className: "tw-w-10 tw-h-10" },
|
|
32
|
-
React.createElement(ButtonWithPopover, { ...props })));
|
|
33
|
-
const openPopover = async () => {
|
|
34
|
-
const popover = screen.getByTestId(testId);
|
|
35
|
-
await userEvent.click(popover);
|
|
36
|
-
};
|
|
37
|
-
const closePopover = async () => {
|
|
38
|
-
const container = screen.getByTestId('container');
|
|
39
|
-
await userEvent.click(container);
|
|
40
|
-
};
|
|
41
|
-
test('renders trigger and opens Popover content on trigger click', async () => {
|
|
42
|
-
renderButtonWithPopover(tc.props);
|
|
43
|
-
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
44
|
-
await openPopover();
|
|
45
|
-
expect(screen.getByText('Popover content')).toBeInTheDocument();
|
|
46
|
-
await closePopover();
|
|
47
|
-
expect(screen.queryByText('Popover content')).not.toBeInTheDocument();
|
|
48
|
-
});
|
|
49
|
-
test('renders trigger and opens Popover content on trigger hover', async () => {
|
|
50
|
-
tc.props.isHoverEnabled = true;
|
|
51
|
-
renderButtonWithPopover(tc.props);
|
|
52
|
-
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
53
|
-
const popover = screen.getByTestId(testId);
|
|
54
|
-
await userEvent.hover(popover);
|
|
55
|
-
await waitFor(() => {
|
|
56
|
-
expect(screen.getByText('Popover content')).toBeInTheDocument();
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
test('closes popover when content is clicked and is set in props', async () => {
|
|
60
|
-
tc.props.isCloseOnContentClick = true;
|
|
61
|
-
renderButtonWithPopover(tc.props);
|
|
62
|
-
await openPopover();
|
|
63
|
-
const item1 = screen.getByText('Popover content');
|
|
64
|
-
await userEvent.click(item1);
|
|
65
|
-
expect(mockOnClick).toHaveBeenCalledTimes(2);
|
|
66
|
-
});
|
|
67
|
-
test('leaves popover open when content is clicked and is set in props', async () => {
|
|
68
|
-
tc.props.isCloseOnContentClick = false;
|
|
69
|
-
renderButtonWithPopover(tc.props);
|
|
70
|
-
await openPopover();
|
|
71
|
-
const item1 = screen.getByText('Popover content');
|
|
72
|
-
await userEvent.click(item1);
|
|
73
|
-
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
74
|
-
});
|
|
75
|
-
test('does not open when disabled', async () => {
|
|
76
|
-
tc.props.disabled = true;
|
|
77
|
-
renderButtonWithPopover(tc.props);
|
|
78
|
-
await openPopover();
|
|
79
|
-
expect(screen.queryByText('Popover content')).not.toBeInTheDocument();
|
|
80
|
-
});
|
|
81
|
-
});
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import '@testing-library/jest-dom';
|
|
3
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
4
|
+
import userEvent from '@testing-library/user-event';
|
|
5
|
+
import ButtonWithPopover from './ButtonWithPopover';
|
|
6
|
+
import Icon from '../Icon';
|
|
7
|
+
describe('ButtonWithPopover', () => {
|
|
8
|
+
const mockOnClick = jest.fn();
|
|
9
|
+
const testId = 'trigger-icon';
|
|
10
|
+
class Context {
|
|
11
|
+
props = {
|
|
12
|
+
trigger: (React.createElement(Icon, { icon: "fc-more", type: "text", testId: testId, extraClassNames: "tw-text-sq-text-color dark:tw-text-sq-white tw-w-[18px]" })),
|
|
13
|
+
onOpenChange: mockOnClick,
|
|
14
|
+
containerTestId: 'basic-Popover1',
|
|
15
|
+
tooltip: 'This is a small Popover.',
|
|
16
|
+
tooltipDelay: 0,
|
|
17
|
+
tooltipPlacement: 'top',
|
|
18
|
+
isHtmlTooltip: false,
|
|
19
|
+
hoverOpenDelay: 0,
|
|
20
|
+
children: React.createElement("div", null, "Popover content"),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
let tc;
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
tc = new Context();
|
|
26
|
+
jest.clearAllMocks();
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
global.ResizeObserver = undefined;
|
|
30
|
+
});
|
|
31
|
+
const renderButtonWithPopover = (props) => render(React.createElement("div", { "data-testid": "container", className: "tw-w-10 tw-h-10" },
|
|
32
|
+
React.createElement(ButtonWithPopover, { ...props })));
|
|
33
|
+
const openPopover = async () => {
|
|
34
|
+
const popover = screen.getByTestId(testId);
|
|
35
|
+
await userEvent.click(popover);
|
|
36
|
+
};
|
|
37
|
+
const closePopover = async () => {
|
|
38
|
+
const container = screen.getByTestId('container');
|
|
39
|
+
await userEvent.click(container);
|
|
40
|
+
};
|
|
41
|
+
test('renders trigger and opens Popover content on trigger click', async () => {
|
|
42
|
+
renderButtonWithPopover(tc.props);
|
|
43
|
+
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
44
|
+
await openPopover();
|
|
45
|
+
expect(screen.getByText('Popover content')).toBeInTheDocument();
|
|
46
|
+
await closePopover();
|
|
47
|
+
expect(screen.queryByText('Popover content')).not.toBeInTheDocument();
|
|
48
|
+
});
|
|
49
|
+
test('renders trigger and opens Popover content on trigger hover', async () => {
|
|
50
|
+
tc.props.isHoverEnabled = true;
|
|
51
|
+
renderButtonWithPopover(tc.props);
|
|
52
|
+
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
53
|
+
const popover = screen.getByTestId(testId);
|
|
54
|
+
await userEvent.hover(popover);
|
|
55
|
+
await waitFor(() => {
|
|
56
|
+
expect(screen.getByText('Popover content')).toBeInTheDocument();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
test('closes popover when content is clicked and is set in props', async () => {
|
|
60
|
+
tc.props.isCloseOnContentClick = true;
|
|
61
|
+
renderButtonWithPopover(tc.props);
|
|
62
|
+
await openPopover();
|
|
63
|
+
const item1 = screen.getByText('Popover content');
|
|
64
|
+
await userEvent.click(item1);
|
|
65
|
+
expect(mockOnClick).toHaveBeenCalledTimes(2);
|
|
66
|
+
});
|
|
67
|
+
test('leaves popover open when content is clicked and is set in props', async () => {
|
|
68
|
+
tc.props.isCloseOnContentClick = false;
|
|
69
|
+
renderButtonWithPopover(tc.props);
|
|
70
|
+
await openPopover();
|
|
71
|
+
const item1 = screen.getByText('Popover content');
|
|
72
|
+
await userEvent.click(item1);
|
|
73
|
+
expect(mockOnClick).toHaveBeenCalledTimes(1);
|
|
74
|
+
});
|
|
75
|
+
test('does not open when disabled', async () => {
|
|
76
|
+
tc.props.disabled = true;
|
|
77
|
+
renderButtonWithPopover(tc.props);
|
|
78
|
+
await openPopover();
|
|
79
|
+
expect(screen.queryByText('Popover content')).not.toBeInTheDocument();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
82
|
//# sourceMappingURL=ButtonWithPopover.test.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=ButtonWithPopover.types.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default } from './ButtonWithPopover';
|
|
1
|
+
export { default } from './ButtonWithPopover';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '../styles.css';
|
|
3
|
-
import { getQTipData } from '../Tooltip/qTip.utilities';
|
|
4
|
-
const alignment = 'tw-flex';
|
|
5
|
-
const labelClasses = 'tw-ml-1.5 tw-text-sm tw--mt-0.5';
|
|
6
|
-
const baseClasses = 'tw-border-1 tw-h-3.5 tw-w-3.5 focus:tw-ring-0 focus:tw-ring-offset-0 tw-outline-none focus:tw-outline-none' +
|
|
7
|
-
' dark:tw-bg-sq-dark-background dark:tw-border-sq-dark-text dark:hover:tw-bg-sq-dark-background' +
|
|
8
|
-
' checked:tw-text-white checked:tw-border-sq-text-color checked:hover:tw-border-sq-color-dark' +
|
|
9
|
-
' checked:active:tw-border-sq-color-dark checked:focus:tw-border-sq-color-dark disabled:tw-border-sq-disabled-gray' +
|
|
10
|
-
' dark:disabled:tw-border-sq-fairly-dark-gray dark:checked:focus:tw-bg-sq-dark-background';
|
|
11
|
-
const checkboxClasses = `tw-form-checkbox tw-rounded ${baseClasses}`;
|
|
12
|
-
const radioClasses = `tw-form-radio ${baseClasses}`;
|
|
13
|
-
/**
|
|
14
|
-
* Checkbox and Radio Box Component.
|
|
15
|
-
*/
|
|
16
|
-
export const Checkbox = (props) => {
|
|
17
|
-
const { type = 'checkbox', value, disabled = false, label, onChange, onClick, onKeyDown, checked, defaultChecked, id, name, extraClassNames, extraLabelClassNames, testId, ...tooltipProps } = props;
|
|
18
|
-
const assignedId = id ?? 'checkbox_' + Math.random();
|
|
19
|
-
const tooltipData = getQTipData(tooltipProps);
|
|
20
|
-
return (React.createElement("span", { className: `${alignment} ${extraClassNames}` },
|
|
21
|
-
React.createElement("input", { value: value, type: type, "data-testid": testId, name: name, id: assignedId, readOnly: !onChange, checked: checked, defaultChecked: defaultChecked, className: `${type === 'checkbox' ? checkboxClasses : radioClasses} ${disabled ? 'tw-cursor-not-allowed' : 'tw-cursor-pointer'}`, disabled: disabled, onClick: onClick, onChange: onChange, onKeyDown: onKeyDown, ...tooltipData }),
|
|
22
|
-
React.createElement("label", { htmlFor: assignedId, className: `${labelClasses} ${extraLabelClassNames} ${disabled
|
|
23
|
-
? 'tw-cursor-not-allowed dark:tw-text-sq-fairly-dark-gray tw-text-sq-fairly-dark-gray'
|
|
24
|
-
: 'tw-cursor-pointer tw-text-sq-text-color dark:tw-text-sq-dark-text'}` }, label)));
|
|
25
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import '../styles.css';
|
|
3
|
+
import { getQTipData } from '../Tooltip/qTip.utilities';
|
|
4
|
+
const alignment = 'tw-flex';
|
|
5
|
+
const labelClasses = 'tw-ml-1.5 tw-text-sm tw--mt-0.5';
|
|
6
|
+
const baseClasses = 'tw-border-1 tw-h-3.5 tw-w-3.5 focus:tw-ring-0 focus:tw-ring-offset-0 tw-outline-none focus:tw-outline-none' +
|
|
7
|
+
' dark:tw-bg-sq-dark-background dark:tw-border-sq-dark-text dark:hover:tw-bg-sq-dark-background' +
|
|
8
|
+
' checked:tw-text-white checked:tw-border-sq-text-color checked:hover:tw-border-sq-color-dark' +
|
|
9
|
+
' checked:active:tw-border-sq-color-dark checked:focus:tw-border-sq-color-dark disabled:tw-border-sq-disabled-gray' +
|
|
10
|
+
' dark:disabled:tw-border-sq-fairly-dark-gray dark:checked:focus:tw-bg-sq-dark-background';
|
|
11
|
+
const checkboxClasses = `tw-form-checkbox tw-rounded ${baseClasses}`;
|
|
12
|
+
const radioClasses = `tw-form-radio ${baseClasses}`;
|
|
13
|
+
/**
|
|
14
|
+
* Checkbox and Radio Box Component.
|
|
15
|
+
*/
|
|
16
|
+
export const Checkbox = (props) => {
|
|
17
|
+
const { type = 'checkbox', value, disabled = false, label, onChange, onClick, onKeyDown, checked, defaultChecked, id, name, extraClassNames, extraLabelClassNames, testId, ...tooltipProps } = props;
|
|
18
|
+
const assignedId = id ?? 'checkbox_' + Math.random();
|
|
19
|
+
const tooltipData = getQTipData(tooltipProps);
|
|
20
|
+
return (React.createElement("span", { className: `${alignment} ${extraClassNames}` },
|
|
21
|
+
React.createElement("input", { value: value, type: type, "data-testid": testId, name: name, id: assignedId, readOnly: !onChange, checked: checked, defaultChecked: defaultChecked, className: `${type === 'checkbox' ? checkboxClasses : radioClasses} ${disabled ? 'tw-cursor-not-allowed' : 'tw-cursor-pointer'}`, disabled: disabled, onClick: onClick, onChange: onChange, onKeyDown: onKeyDown, ...tooltipData }),
|
|
22
|
+
React.createElement("label", { htmlFor: assignedId, className: `${labelClasses} ${extraLabelClassNames} ${disabled
|
|
23
|
+
? 'tw-cursor-not-allowed dark:tw-text-sq-fairly-dark-gray tw-text-sq-fairly-dark-gray'
|
|
24
|
+
: 'tw-cursor-pointer tw-text-sq-text-color dark:tw-text-sq-dark-text'}` }, label)));
|
|
25
|
+
};
|
|
26
26
|
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Checkbox } from './Checkbox';
|
|
3
|
-
import { QTip } from '../Tooltip';
|
|
4
|
-
export default {
|
|
5
|
-
title: 'Checkbox',
|
|
6
|
-
};
|
|
7
|
-
export const AllCheckboxes = () => {
|
|
8
|
-
const getDisplay = (type) => (React.createElement(React.Fragment, null,
|
|
9
|
-
React.createElement(QTip, null),
|
|
10
|
-
React.createElement("div", { className: "tw-p-4" },
|
|
11
|
-
React.createElement(Checkbox, { value: "a", type: type, checked: true, label: 'with Label', tooltip: "Checkbox Tooltip" })),
|
|
12
|
-
React.createElement("div", { className: "tw-p-4" },
|
|
13
|
-
React.createElement(Checkbox, { value: "d", type: type, checked: false, disabled: true, label: React.createElement("div", null,
|
|
14
|
-
"Disabled",
|
|
15
|
-
React.createElement("br", null),
|
|
16
|
-
"multi-Line"), tooltip: "Checkbox Tooltip" })),
|
|
17
|
-
React.createElement("div", { className: "tw-p-4" },
|
|
18
|
-
React.createElement(Checkbox, { value: "d", type: type, checked: true, disabled: true, label: "Disabled", tooltip: "Checkbox Tooltip" })),
|
|
19
|
-
React.createElement("div", { className: "tw-p-4" },
|
|
20
|
-
React.createElement(Checkbox, { value: "b", type: type, checked: true, tooltip: "Checkbox Tooltip" })),
|
|
21
|
-
React.createElement("div", { className: "tw-p-4" },
|
|
22
|
-
React.createElement(Checkbox, { value: "c", type: type, checked: false, tooltip: "Checkbox Tooltip" }))));
|
|
23
|
-
const renderAllVariations = (type) => (React.createElement(React.Fragment, null,
|
|
24
|
-
React.createElement("div", { className: "tw-p-4 light" }, getDisplay(type)),
|
|
25
|
-
React.createElement("div", { className: "tw-p-4 tw-dark tw-bg-sq-dark-background" }, getDisplay(type))));
|
|
26
|
-
return (React.createElement("div", { className: "tw-grid tw-grid-cols-2 tw-gap-4" },
|
|
27
|
-
React.createElement("div", null,
|
|
28
|
-
React.createElement("b", null, "Checkbox"),
|
|
29
|
-
renderAllVariations('checkbox')),
|
|
30
|
-
React.createElement("div", null,
|
|
31
|
-
React.createElement("b", null, "Radios"),
|
|
32
|
-
renderAllVariations('radio'))));
|
|
33
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Checkbox } from './Checkbox';
|
|
3
|
+
import { QTip } from '../Tooltip';
|
|
4
|
+
export default {
|
|
5
|
+
title: 'Checkbox',
|
|
6
|
+
};
|
|
7
|
+
export const AllCheckboxes = () => {
|
|
8
|
+
const getDisplay = (type) => (React.createElement(React.Fragment, null,
|
|
9
|
+
React.createElement(QTip, null),
|
|
10
|
+
React.createElement("div", { className: "tw-p-4" },
|
|
11
|
+
React.createElement(Checkbox, { value: "a", type: type, checked: true, label: 'with Label', tooltip: "Checkbox Tooltip" })),
|
|
12
|
+
React.createElement("div", { className: "tw-p-4" },
|
|
13
|
+
React.createElement(Checkbox, { value: "d", type: type, checked: false, disabled: true, label: React.createElement("div", null,
|
|
14
|
+
"Disabled",
|
|
15
|
+
React.createElement("br", null),
|
|
16
|
+
"multi-Line"), tooltip: "Checkbox Tooltip" })),
|
|
17
|
+
React.createElement("div", { className: "tw-p-4" },
|
|
18
|
+
React.createElement(Checkbox, { value: "d", type: type, checked: true, disabled: true, label: "Disabled", tooltip: "Checkbox Tooltip" })),
|
|
19
|
+
React.createElement("div", { className: "tw-p-4" },
|
|
20
|
+
React.createElement(Checkbox, { value: "b", type: type, checked: true, tooltip: "Checkbox Tooltip" })),
|
|
21
|
+
React.createElement("div", { className: "tw-p-4" },
|
|
22
|
+
React.createElement(Checkbox, { value: "c", type: type, checked: false, tooltip: "Checkbox Tooltip" }))));
|
|
23
|
+
const renderAllVariations = (type) => (React.createElement(React.Fragment, null,
|
|
24
|
+
React.createElement("div", { className: "tw-p-4 light" }, getDisplay(type)),
|
|
25
|
+
React.createElement("div", { className: "tw-p-4 tw-dark tw-bg-sq-dark-background" }, getDisplay(type))));
|
|
26
|
+
return (React.createElement("div", { className: "tw-grid tw-grid-cols-2 tw-gap-4" },
|
|
27
|
+
React.createElement("div", null,
|
|
28
|
+
React.createElement("b", null, "Checkbox"),
|
|
29
|
+
renderAllVariations('checkbox')),
|
|
30
|
+
React.createElement("div", null,
|
|
31
|
+
React.createElement("b", null, "Radios"),
|
|
32
|
+
renderAllVariations('radio'))));
|
|
33
|
+
};
|
|
34
34
|
//# sourceMappingURL=Checkbox.stories.js.map
|