@drivy/cobalt 2.19.0 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Calendar/CalendarRangePicker/CalendarRangePickerDay.js +14 -7
- package/components/Calendar/CalendarRangePicker/CalendarRangePickerDay.js.map +1 -1
- package/components/Modal/index.js +6 -5
- package/components/Modal/index.js.map +1 -1
- package/components/PhotoDropzone/index.js +1 -1
- package/components/PhotoDropzone/index.js.map +1 -1
- package/components/Popover/DesktopPopover.js +27 -0
- package/components/Popover/DesktopPopover.js.map +1 -0
- package/components/Popover/PopoverWrapper.js +49 -0
- package/components/Popover/PopoverWrapper.js.map +1 -0
- package/components/Popover/TooltipWrapper.js +10 -0
- package/components/Popover/TooltipWrapper.js.map +1 -0
- package/components/Popover/index.js +8 -40
- package/components/Popover/index.js.map +1 -1
- package/components/Popover/popoverRegistry.js +15 -0
- package/components/Popover/popoverRegistry.js.map +1 -0
- package/components/Popover/tooltipConfig.js +12 -0
- package/components/Popover/tooltipConfig.js.map +1 -0
- package/components/Popover/useDesktopPopoverCore.js +102 -0
- package/components/Popover/useDesktopPopoverCore.js.map +1 -0
- package/components/Popover/useSingletonPopover.js +148 -0
- package/components/Popover/useSingletonPopover.js.map +1 -0
- package/components/ProgressBanner/index.js +5 -3
- package/components/ProgressBanner/index.js.map +1 -1
- package/components/Sidepanel/index.js +7 -4
- package/components/Sidepanel/index.js.map +1 -1
- package/index.js +5 -0
- package/index.js.map +1 -1
- package/package.json +3 -4
- package/styles/components/Calendar/CalendarRangePicker/index.scss +0 -8
- package/styles/components/Modal/index.scss +14 -2
- package/styles/components/Popover/index.scss +29 -72
- package/styles/components/ProgressBanner/index.scss +7 -0
- package/styles/components/Sidepanel/index.scss +9 -3
- package/types/src/components/Modal/index.d.ts +1 -0
- package/types/src/components/Popover/DesktopPopover.d.ts +2 -0
- package/types/src/components/Popover/PopoverWrapper.d.ts +13 -0
- package/types/src/components/Popover/TooltipWrapper.d.ts +3 -0
- package/types/src/components/Popover/index.d.ts +13 -24
- package/types/src/components/Popover/popoverRegistry.d.ts +4 -0
- package/types/src/components/Popover/tooltipConfig.d.ts +9 -0
- package/types/src/components/Popover/useDesktopPopoverCore.d.ts +44 -0
- package/types/src/components/Popover/useSingletonPopover.d.ts +17 -0
- package/types/src/components/ProgressBanner/index.d.ts +2 -1
- package/types/src/components/Sidepanel/index.d.ts +2 -1
- package/types/src/index.d.ts +6 -0
- package/components/Calendar/CalendarRangePicker/DayTooltip.js +0 -23
- package/components/Calendar/CalendarRangePicker/DayTooltip.js.map +0 -1
- package/components/Popover/LazyTippy.js +0 -9
- package/components/Popover/LazyTippy.js.map +0 -1
- package/types/src/__tests__/AsyncComponent.d.ts +0 -6
- package/types/src/components/Calendar/CalendarRangePicker/DayTooltip.d.ts +0 -3
- package/types/src/components/Popover/LazyTippy.d.ts +0 -3
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import cx from 'classnames';
|
|
3
3
|
import { format } from 'date-fns';
|
|
4
|
-
import React from 'react';
|
|
5
|
-
import
|
|
4
|
+
import React, { useRef, useState } from 'react';
|
|
5
|
+
import Popover from '../../Popover/index.js';
|
|
6
|
+
import { tooltipConfig } from '../../Popover/tooltipConfig.js';
|
|
6
7
|
|
|
7
8
|
function CalendarRangePickerDay({ date, isToday, isStartDay, isEndDay, isSelected, isDisabled, isInvalid, isRange, isActive, hasNotification, tooltipMessage, onSelect, onMouseEnter, onMouseLeave, hoverTooltipMessage, }) {
|
|
9
|
+
const dayRef = useRef(null);
|
|
10
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
8
11
|
const handleSelectDate = () => {
|
|
9
12
|
!isDisabled && !isInvalid && onSelect(new Date(date));
|
|
10
13
|
};
|
|
11
|
-
const jsx$1 = (jsxs("button", { className: cx("cobalt-CalendarRangePicker__day", {
|
|
14
|
+
const jsx$1 = (jsxs("button", { ref: dayRef, className: cx("cobalt-CalendarRangePicker__day", {
|
|
12
15
|
"cobalt-CalendarRangePicker__day--today": isToday,
|
|
13
16
|
"cobalt-CalendarRangePicker__day--startDay": isStartDay,
|
|
14
17
|
"cobalt-CalendarRangePicker__day--endDay": isEndDay,
|
|
@@ -19,12 +22,16 @@ function CalendarRangePickerDay({ date, isToday, isStartDay, isEndDay, isSelecte
|
|
|
19
22
|
"cobalt-CalendarRangePicker__day--disabled": isDisabled,
|
|
20
23
|
}), onMouseEnter: () => {
|
|
21
24
|
onMouseEnter(date, !!isDisabled);
|
|
25
|
+
setIsHovered(true);
|
|
22
26
|
}, onMouseLeave: () => {
|
|
23
27
|
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(date);
|
|
28
|
+
setIsHovered(false);
|
|
24
29
|
}, onClick: handleSelectDate, "data-day": format(date, "yyyy-MM-dd"), type: "button", children: [date.getDate(), hasNotification && (jsx("div", { className: "cobalt-CalendarRangePicker__day-notification-container", children: jsx("div", { className: "cobalt-CalendarRangePicker__day-notification" }) }))] }));
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
const message = tooltipMessage !== null && tooltipMessage !== void 0 ? tooltipMessage : hoverTooltipMessage;
|
|
31
|
+
if (!message)
|
|
32
|
+
return jsx$1;
|
|
33
|
+
const isControlled = !!tooltipMessage;
|
|
34
|
+
return (jsxs(Fragment, { children: [jsx$1, jsx(Popover, { ...tooltipConfig, targetRef: dayRef, isOpen: isControlled || isHovered, onOpenChange: isControlled ? undefined : setIsHovered, placement: isControlled && !isStartDay ? "bottom" : "top", responsive: false, children: jsx("div", { className: "c-text-body-xs", children: message }) })] }));
|
|
28
35
|
}
|
|
29
36
|
function areEqual(prevProps, nextProps) {
|
|
30
37
|
return (prevProps.isSelected === nextProps.isSelected &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarRangePickerDay.js","sources":["../../../../src/components/Calendar/CalendarRangePicker/CalendarRangePickerDay.tsx"],"sourcesContent":["import classNames from \"classnames\"\nimport { format } from \"date-fns\"\nimport React from \"react\"\nimport
|
|
1
|
+
{"version":3,"file":"CalendarRangePickerDay.js","sources":["../../../../src/components/Calendar/CalendarRangePicker/CalendarRangePickerDay.tsx"],"sourcesContent":["import classNames from \"classnames\"\nimport { format } from \"date-fns\"\nimport React, { useRef, useState } from \"react\"\nimport Popover from \"../../Popover\"\nimport { tooltipConfig } from \"../../Popover/tooltipConfig\"\n\ntype CalendarRangePickerDayPropsType = {\n date: Date\n isEditingStartDate: boolean\n isEditingEndDate: boolean\n isToday?: boolean\n isStartDay?: boolean\n isEndDay?: boolean\n isSelected?: boolean\n isInvalid?: boolean\n isDisabled?: boolean\n isRange?: boolean\n isActive?: boolean\n hasNotification?: boolean\n tooltipMessage?: string\n hoverTooltipMessage?: string\n onSelect: (date: Date) => void\n onMouseEnter: (date: Date, disabled: boolean) => void\n onMouseLeave?: (date: Date) => void\n}\n\nfunction CalendarRangePickerDay({\n date,\n isToday,\n isStartDay,\n isEndDay,\n isSelected,\n isDisabled,\n isInvalid,\n isRange,\n isActive,\n hasNotification,\n tooltipMessage,\n onSelect,\n onMouseEnter,\n onMouseLeave,\n hoverTooltipMessage,\n}: CalendarRangePickerDayPropsType) {\n const dayRef = useRef<HTMLButtonElement>(null)\n const [isHovered, setIsHovered] = useState(false)\n\n const handleSelectDate = () => {\n !isDisabled && !isInvalid && onSelect(new Date(date))\n }\n\n const jsx = (\n <button\n ref={dayRef}\n className={classNames(\"cobalt-CalendarRangePicker__day\", {\n \"cobalt-CalendarRangePicker__day--today\": isToday,\n \"cobalt-CalendarRangePicker__day--startDay\": isStartDay,\n \"cobalt-CalendarRangePicker__day--endDay\": isEndDay,\n \"cobalt-CalendarRangePicker__day--range\": isRange,\n \"cobalt-CalendarRangePicker__day--selected\": isSelected,\n \"cobalt-CalendarRangePicker__day--active\": isActive,\n \"cobalt-CalendarRangePicker__day--invalid\": isInvalid,\n \"cobalt-CalendarRangePicker__day--disabled\": isDisabled,\n })}\n onMouseEnter={() => {\n onMouseEnter(date, !!isDisabled)\n setIsHovered(true)\n }}\n onMouseLeave={() => {\n onMouseLeave?.(date)\n setIsHovered(false)\n }}\n onClick={handleSelectDate}\n data-day={format(date, \"yyyy-MM-dd\")}\n type=\"button\"\n >\n {date.getDate()}\n {hasNotification && (\n <div className=\"cobalt-CalendarRangePicker__day-notification-container\">\n <div className=\"cobalt-CalendarRangePicker__day-notification\"></div>\n </div>\n )}\n </button>\n )\n\n const message = tooltipMessage ?? hoverTooltipMessage\n\n if (!message) return jsx\n\n const isControlled = !!tooltipMessage\n\n return (\n <>\n {jsx}\n <Popover\n {...tooltipConfig}\n targetRef={dayRef}\n isOpen={isControlled || isHovered}\n onOpenChange={isControlled ? undefined : setIsHovered}\n placement={isControlled && !isStartDay ? \"bottom\" : \"top\"}\n responsive={false}\n >\n <div className=\"c-text-body-xs\">{message}</div>\n </Popover>\n </>\n )\n}\n\nfunction areEqual(\n prevProps: CalendarRangePickerDayPropsType,\n nextProps: CalendarRangePickerDayPropsType,\n) {\n return (\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.isActive === nextProps.isActive &&\n prevProps.isStartDay === nextProps.isStartDay &&\n prevProps.isEndDay === nextProps.isEndDay &&\n prevProps.isInvalid === nextProps.isInvalid &&\n prevProps.isRange === nextProps.isRange &&\n prevProps.hasNotification === nextProps.hasNotification &&\n prevProps.isDisabled === nextProps.isDisabled &&\n prevProps.isEditingStartDate === nextProps.isEditingStartDate &&\n prevProps.isEditingEndDate === nextProps.isEditingEndDate\n )\n}\n\nconst MemoizedComponent = React.memo(CalendarRangePickerDay, areEqual)\nMemoizedComponent.displayName = \"CalendarRangePickerDay\"\n\nexport { MemoizedComponent as CalendarRangePickerDay }\n"],"names":["jsx","_jsxs","classNames","_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import ModalHeader from './ModalHeader.js';
|
|
|
8
8
|
// Only for the API, render nothing, we use ModalFooterInternal internally
|
|
9
9
|
const ModalFooterAPI = (_props) => null;
|
|
10
10
|
const isModalFooterAPIComponent = (component) => React.isValidElement(component) && component.type === ModalFooterAPI;
|
|
11
|
-
const Modal = forwardRef(({ isOpen, close, className, initialFocusRef, "aria-label": ariaLabel, title, children, overflowHidden = true, bodySpacing = true, fullWidth, fullHeight, onHidden, onShow, skipAnimation, onDismissAttempt, }, ref) => {
|
|
11
|
+
const Modal = forwardRef(({ isOpen, close, className, initialFocusRef, "aria-label": ariaLabel, title, children, overflowHidden = true, bodySpacing = true, fullWidth, fullHeight, fullScreen, onHidden, onShow, skipAnimation, onDismissAttempt, }, ref) => {
|
|
12
12
|
useEffect(() => {
|
|
13
13
|
isOpen && (onShow === null || onShow === void 0 ? void 0 : onShow());
|
|
14
14
|
}, [onShow, isOpen]);
|
|
@@ -19,15 +19,16 @@ const Modal = forwardRef(({ isOpen, close, className, initialFocusRef, "aria-lab
|
|
|
19
19
|
}, onExitComplete: onHidden, initialFocusEl: initialFocusRef && (() => initialFocusRef.current), onPointerDownOutside: close ? undefined : onDismissAttempt, lazyMount: true,
|
|
20
20
|
// For some reason, onHidden can sometimes not be called if we use unmountOnExit
|
|
21
21
|
unmountOnExit: !onHidden, children: jsx(Portal, { children: jsx(Dialog.Backdrop, { className: cx("cobalt-modal__overlay", {
|
|
22
|
-
"cobalt-modal--skipAnimation__enter": skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.enter,
|
|
23
|
-
"cobalt-modal--skipAnimation__leave": skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.leave,
|
|
22
|
+
"cobalt-modal--skipAnimation__enter": (skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.enter) || fullScreen,
|
|
23
|
+
"cobalt-modal--skipAnimation__leave": (skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.leave) || fullScreen,
|
|
24
24
|
}), children: jsx(Dialog.Positioner, { className: cx("cobalt-modal", {
|
|
25
25
|
"cobalt-modal--overflowHidden": overflowHidden,
|
|
26
26
|
"cobalt-modal--fullHeight": fullHeight,
|
|
27
27
|
"cobalt-modal--fullWidth": fullWidth,
|
|
28
|
+
"cobalt-modal--fullScreen": fullScreen,
|
|
28
29
|
}), ref: ref, children: jsxs(Dialog.Content, { className: cx("cobalt-modal__content", className, {
|
|
29
|
-
"cobalt-modal--skipAnimation__enter": skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.enter,
|
|
30
|
-
"cobalt-modal--skipAnimation__leave": skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.leave,
|
|
30
|
+
"cobalt-modal--skipAnimation__enter": (skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.enter) || fullScreen,
|
|
31
|
+
"cobalt-modal--skipAnimation__leave": (skipAnimation === null || skipAnimation === void 0 ? void 0 : skipAnimation.leave) || fullScreen,
|
|
31
32
|
}), children: [jsx(ModalHeader, { title: title, close: close }), jsxs(Dialog.Description, { className: "cobalt-modal-body__wrapper", children: [jsx("div", { className: cx("cobalt-modal-body", {
|
|
32
33
|
"cobalt-modal-body--bodySpacing": bodySpacing,
|
|
33
34
|
"cobalt-modal-body--hasFooter": hasFooter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Modal/index.tsx"],"sourcesContent":["import { Dialog, Portal } from \"@ark-ui/react\"\nimport cx from \"classnames\"\nimport React, { forwardRef, isValidElement, useEffect } from \"react\"\nimport ModalFooter, { type ModalFooterPropsType } from \"./ModalFooter\"\nimport ModalHeader from \"./ModalHeader\"\n\nexport type ModalPropsType = {\n /**\n * mandatory for A11y\n */\n \"aria-label\": string\n /**\n * Function called to close the modal, providing it make the modal closeable\n */\n close?: () => void\n /**\n * React.ref of the element to focus first when the modal opens\n */\n initialFocusRef?: React.RefObject<HTMLElement>\n /**\n * State to show or hide the modal/dialog\n */\n isOpen: boolean\n /**\n * Custom css classes to add to the modal\n */\n className?: string\n /**\n * Action to fire if the user try to dismiss when the modal is not closeable\n */\n onDismissAttempt?: () => void\n /**\n * Listener called when the modal has been fully hidden\n */\n onHidden?: () => void\n /**\n * Listener called when the modal begins to show\n */\n onShow?: () => void\n /**\n * Modal title\n */\n title?: React.ReactNode\n /**\n * Disable/Enable body paddings (enabled by default)\n */\n bodySpacing?: boolean\n /**\n * Disable/Enable hidding overflowing absolute elements (enabled by default)\n */\n overflowHidden?: boolean\n /**\n * Disable enter/leave animation (animation enabled by default)\n */\n skipAnimation?: {\n enter: boolean\n leave: boolean\n }\n /**\n * Disable modal max-width limit\n */\n fullWidth?: boolean\n /**\n * Always take the full height of the screen\n */\n fullHeight?: boolean\n /**\n * Remove the modal from the DOM on hidden (enabled by default)\n */\n unmountOnHidden?: boolean\n /**\n * Modal body content\n */\n children: React.ReactNode\n}\n\n// Only for the API, render nothing, we use ModalFooterInternal internally\nexport const ModalFooterAPI = (_props: ModalFooterPropsType) => null\n\nexport const isModalFooterAPIComponent = (\n component: React.ReactNode,\n): component is React.ReactElement<ModalFooterPropsType> =>\n React.isValidElement(component) && component.type === ModalFooterAPI\n\nconst Modal = forwardRef<HTMLDivElement, ModalPropsType>(\n (\n {\n isOpen,\n close,\n className,\n initialFocusRef,\n \"aria-label\": ariaLabel,\n title,\n children,\n overflowHidden = true,\n bodySpacing = true,\n fullWidth,\n fullHeight,\n onHidden,\n onShow,\n skipAnimation,\n onDismissAttempt,\n }: ModalPropsType,\n ref,\n ) => {\n useEffect(() => {\n isOpen && onShow?.()\n }, [onShow, isOpen])\n\n const modalFooter = React.Children.toArray(children).find((c) =>\n isModalFooterAPIComponent(c),\n )\n const hasFooter = isValidElement(modalFooter)\n\n return (\n <Dialog.Root\n aria-label={ariaLabel}\n open={isOpen}\n onOpenChange={(e) => {\n e.open ? onShow?.() : close?.()\n }}\n onExitComplete={onHidden}\n initialFocusEl={initialFocusRef && (() => initialFocusRef.current)}\n onPointerDownOutside={close ? undefined : onDismissAttempt}\n lazyMount\n // For some reason, onHidden can sometimes not be called if we use unmountOnExit\n unmountOnExit={!onHidden}\n >\n <Portal>\n <Dialog.Backdrop\n className={cx(\"cobalt-modal__overlay\", {\n \"cobalt-modal--skipAnimation__enter\"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Modal/index.tsx"],"sourcesContent":["import { Dialog, Portal } from \"@ark-ui/react\"\nimport cx from \"classnames\"\nimport React, { forwardRef, isValidElement, useEffect } from \"react\"\nimport ModalFooter, { type ModalFooterPropsType } from \"./ModalFooter\"\nimport ModalHeader from \"./ModalHeader\"\n\nexport type ModalPropsType = {\n /**\n * mandatory for A11y\n */\n \"aria-label\": string\n /**\n * Function called to close the modal, providing it make the modal closeable\n */\n close?: () => void\n /**\n * React.ref of the element to focus first when the modal opens\n */\n initialFocusRef?: React.RefObject<HTMLElement>\n /**\n * State to show or hide the modal/dialog\n */\n isOpen: boolean\n /**\n * Custom css classes to add to the modal\n */\n className?: string\n /**\n * Action to fire if the user try to dismiss when the modal is not closeable\n */\n onDismissAttempt?: () => void\n /**\n * Listener called when the modal has been fully hidden\n */\n onHidden?: () => void\n /**\n * Listener called when the modal begins to show\n */\n onShow?: () => void\n /**\n * Modal title\n */\n title?: React.ReactNode\n /**\n * Disable/Enable body paddings (enabled by default)\n */\n bodySpacing?: boolean\n /**\n * Disable/Enable hidding overflowing absolute elements (enabled by default)\n */\n overflowHidden?: boolean\n /**\n * Disable enter/leave animation (animation enabled by default)\n */\n skipAnimation?: {\n enter: boolean\n leave: boolean\n }\n /**\n * Disable modal max-width limit\n */\n fullWidth?: boolean\n /**\n * Always take the full height of the screen\n */\n fullHeight?: boolean\n fullScreen?: boolean\n /**\n * Remove the modal from the DOM on hidden (enabled by default)\n */\n unmountOnHidden?: boolean\n /**\n * Modal body content\n */\n children: React.ReactNode\n}\n\n// Only for the API, render nothing, we use ModalFooterInternal internally\nexport const ModalFooterAPI = (_props: ModalFooterPropsType) => null\n\nexport const isModalFooterAPIComponent = (\n component: React.ReactNode,\n): component is React.ReactElement<ModalFooterPropsType> =>\n React.isValidElement(component) && component.type === ModalFooterAPI\n\nconst Modal = forwardRef<HTMLDivElement, ModalPropsType>(\n (\n {\n isOpen,\n close,\n className,\n initialFocusRef,\n \"aria-label\": ariaLabel,\n title,\n children,\n overflowHidden = true,\n bodySpacing = true,\n fullWidth,\n fullHeight,\n fullScreen,\n onHidden,\n onShow,\n skipAnimation,\n onDismissAttempt,\n }: ModalPropsType,\n ref,\n ) => {\n useEffect(() => {\n isOpen && onShow?.()\n }, [onShow, isOpen])\n\n const modalFooter = React.Children.toArray(children).find((c) =>\n isModalFooterAPIComponent(c),\n )\n const hasFooter = isValidElement(modalFooter)\n\n return (\n <Dialog.Root\n aria-label={ariaLabel}\n open={isOpen}\n onOpenChange={(e) => {\n e.open ? onShow?.() : close?.()\n }}\n onExitComplete={onHidden}\n initialFocusEl={initialFocusRef && (() => initialFocusRef.current)}\n onPointerDownOutside={close ? undefined : onDismissAttempt}\n lazyMount\n // For some reason, onHidden can sometimes not be called if we use unmountOnExit\n unmountOnExit={!onHidden}\n >\n <Portal>\n <Dialog.Backdrop\n className={cx(\"cobalt-modal__overlay\", {\n \"cobalt-modal--skipAnimation__enter\":\n skipAnimation?.enter || fullScreen,\n \"cobalt-modal--skipAnimation__leave\":\n skipAnimation?.leave || fullScreen,\n })}\n >\n <Dialog.Positioner\n className={cx(\"cobalt-modal\", {\n \"cobalt-modal--overflowHidden\": overflowHidden,\n \"cobalt-modal--fullHeight\": fullHeight,\n \"cobalt-modal--fullWidth\": fullWidth,\n \"cobalt-modal--fullScreen\": fullScreen,\n })}\n ref={ref}\n >\n <Dialog.Content\n className={cx(\"cobalt-modal__content\", className, {\n \"cobalt-modal--skipAnimation__enter\":\n skipAnimation?.enter || fullScreen,\n \"cobalt-modal--skipAnimation__leave\":\n skipAnimation?.leave || fullScreen,\n })}\n >\n <ModalHeader title={title} close={close} />\n <Dialog.Description className=\"cobalt-modal-body__wrapper\">\n <div\n className={cx(\"cobalt-modal-body\", {\n \"cobalt-modal-body--bodySpacing\": bodySpacing,\n \"cobalt-modal-body--hasFooter\": hasFooter,\n })}\n >\n {children}\n </div>\n {hasFooter && <ModalFooter {...modalFooter.props} />}\n </Dialog.Description>\n </Dialog.Content>\n </Dialog.Positioner>\n </Dialog.Backdrop>\n </Portal>\n </Dialog.Root>\n )\n },\n)\n\nModal.displayName = \"Modal\"\n\nexport default Object.assign(Modal, { Footer: ModalFooterAPI })\n\nexport { default as MultiStepModal, type ModalStepType } from \"./MultiStepModal\"\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -160,7 +160,7 @@ const PhotoDropzone = ({ className, description, deleteContent, errorContent, on
|
|
|
160
160
|
setIsImageLoaded(true);
|
|
161
161
|
} }), jsxs("div", { children: [jsx("button", { type: "button", className: cx("cobalt-photo-dropzone__delete-button", {
|
|
162
162
|
"cobalt-photo-dropzone__delete-button--triggered": displayDeletion,
|
|
163
|
-
}), ref: deleteButtonRef, onClick: onDeleteButtonClick, onKeyUp: onDeleteKey, children: jsx(BinIcon, { color: "onSurface" }) }), deleteContentMode === "modal" && (jsx(Modal, { isOpen: showDeletePopover, "aria-label": "delete", bodySpacing: false, children: deleteContent(onDelete, closeDeletePopover) })), deleteContentMode === "popover" && (jsx(Popover, { targetRef: deleteButtonRef, isOpen: showDeletePopover,
|
|
163
|
+
}), ref: deleteButtonRef, onClick: onDeleteButtonClick, onKeyUp: onDeleteKey, children: jsx(BinIcon, { color: "onSurface" }) }), deleteContentMode === "modal" && (jsx(Modal, { isOpen: showDeletePopover, "aria-label": "delete", bodySpacing: false, children: deleteContent(onDelete, closeDeletePopover) })), deleteContentMode === "popover" && (jsx(Popover, { targetRef: deleteButtonRef, isOpen: showDeletePopover, onOpenChange: setShowDeletePopover, placement: "left-start", offset: [0, 12], bodySpacing: false, arrow: true, children: deleteContent(onDelete, closeDeletePopover) }))] })] })) : (jsxs("div", { className: "cobalt-photo-dropzone__description cobalt-photo-dropzone__description--strong", children: [description && jsx("div", { children: description }), jsx(PlusIcon, {})] }))), jsx("input", { ref: fileInputRef, className: "cobalt-photo-dropzone__hidden-input", type: "file", onChange: onFileInputChanged,
|
|
164
164
|
// Prevent the bubbled click from re-entering the label's onClick,
|
|
165
165
|
// which would cancel the file dialog via preventDefault.
|
|
166
166
|
onClick: (event) => event.stopPropagation(), accept: ACCEPTED_PHOTOS_TYPES.map((ext) => `.${ext}`).join(","), multiple: false })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/PhotoDropzone/index.tsx"],"sourcesContent":["import cx from \"classnames\"\nimport {\n type ChangeEvent as ReactChangeEvent,\n type DragEvent as ReactDragEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type TouchEvent as ReactTouchEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\"\nimport useBreakpoint from \"../../hooks/useBreakpoint\"\nimport {\n BinIcon,\n ContextualWarningCircleFilledIcon,\n LoadingIcon,\n PlusIcon,\n} from \"../Icon\"\nimport Modal from \"../Modal\"\nimport Popover from \"../Popover\"\nimport { validateFile } from \"../utils/validateFile\"\n\nconst ACCEPTED_MAX_SIZE_MB = 10\nconst ACCEPTED_PHOTOS_TYPES = [\"jpg\", \"jpeg\", \"png\", \"gif\"]\nconst ERROR_DISPLAY_TIME = 6000\nconst ACCEPTED_TYPES_LOCALE_STRING = ACCEPTED_PHOTOS_TYPES.join(\", \")\n\nexport type PhotoDropzonePropsType = {\n className?: string\n description?: string\n deleteContent: (onDelete: () => void, close: () => void) => ReactNode\n deleteContentMode?: \"popover\" | \"modal\"\n errorContent: (acceptedTypes: string, maxFileSize: number) => ReactNode\n onDropped: (file: File) => Promise<void> | void\n onPhotoDelete?: () => void\n initialImageUrl?: string\n}\n\nconst preventEventDefaults = (\n e: ReactDragEvent | ReactMouseEvent | ReactKeyboardEvent | ReactTouchEvent,\n) => {\n e.preventDefault?.()\n e.stopPropagation?.()\n}\n\nconst isEnterOrSpaceKey = (event: ReactKeyboardEvent) =>\n event.key === \"Enter\" || event.key === \" \"\n\nconst PhotoDropzone = ({\n className,\n description,\n deleteContent,\n errorContent,\n onDropped,\n onPhotoDelete,\n deleteContentMode = \"popover\",\n initialImageUrl = \"\",\n}: PhotoDropzonePropsType) => {\n const { isMobile } = useBreakpoint()\n const fileInputRef = useRef<HTMLInputElement>(null)\n const deleteButtonRef = useRef<HTMLButtonElement>(null)\n const [isDragging, setIsDragging] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [isErrored, setIsErrored] = useState(false)\n const [imagePreviewUrl, setImagePreviewUrl] = useState(initialImageUrl)\n const [displayDeletion, setDisplayDeletion] = useState(false)\n const [showDeletePopover, setShowDeletePopover] = useState(false)\n const [isImageLoaded, setIsImageLoaded] = useState(false)\n\n const openDeletePopover = (\n event?: ReactMouseEvent | ReactKeyboardEvent | ReactTouchEvent,\n ) => {\n event && preventEventDefaults(event)\n setShowDeletePopover(true)\n }\n const closeDeletePopover = (event?: ReactMouseEvent | ReactTouchEvent) => {\n event && preventEventDefaults(event)\n setShowDeletePopover(false)\n }\n\n const onDropzoneMouseEnter = (event?: ReactMouseEvent) => {\n event && preventEventDefaults(event)\n if (imagePreviewUrl) setDisplayDeletion(true)\n }\n\n const onDropzoneMouseLeave = (event?: ReactMouseEvent) => {\n event && preventEventDefaults(event)\n if (displayDeletion && !showDeletePopover) setDisplayDeletion(false)\n }\n\n const onDropzoneClick = (event?: ReactMouseEvent | ReactTouchEvent) => {\n event && preventEventDefaults(event)\n if (isMobile && showDeletePopover) return\n if (isLoading) return\n if (isErrored) setIsErrored(false)\n if (imagePreviewUrl) {\n if (showDeletePopover) closeDeletePopover()\n return setDisplayDeletion(!displayDeletion)\n }\n fileInputRef.current?.click()\n }\n\n const onDropzoneKey = (event: ReactKeyboardEvent) => {\n if (showDeletePopover) return\n if (isEnterOrSpaceKey(event)) {\n onDropzoneClick()\n }\n }\n\n const onDeleteKey = (event: ReactKeyboardEvent) => {\n if (isEnterOrSpaceKey(event)) {\n openDeletePopover(event)\n }\n }\n\n const onDelete = () => {\n if (fileInputRef.current) fileInputRef.current.value = \"\"\n closeDeletePopover()\n setImagePreviewUrl(\"\")\n onPhotoDelete?.()\n }\n\n const onDragEnter = (event: ReactDragEvent) => {\n preventEventDefaults(event)\n if (isErrored) setIsErrored(false)\n !imagePreviewUrl && setIsDragging(true)\n }\n\n const onDragLeave = (event: ReactDragEvent) => {\n preventEventDefaults(event)\n setIsDragging(false)\n }\n\n const processFile = async (fileToProcess: File) => {\n setIsDragging(false)\n setIsErrored(false)\n setIsLoading(true)\n\n const isValidFile = await validateFile(\n fileToProcess,\n (fileToValidate, extension) => {\n const maxFileSize = ACCEPTED_MAX_SIZE_MB * 1000 * 1000\n const acceptedFileTypes = ACCEPTED_PHOTOS_TYPES\n\n if (fileToValidate.size > maxFileSize) {\n return false\n } else if (!extension || !acceptedFileTypes.includes(extension)) {\n return false\n } else {\n return true\n }\n },\n )\n\n if (isValidFile) {\n const imageSrc = URL.createObjectURL(fileToProcess)\n setImagePreviewUrl(imageSrc)\n await onDropped(fileToProcess)\n setIsLoading(false)\n } else {\n setIsLoading(false)\n setIsErrored(true)\n setTimeout(() => {\n setIsErrored(false)\n }, ERROR_DISPLAY_TIME)\n }\n }\n\n const onFileInputChanged = (event: ReactChangeEvent<HTMLInputElement>) => {\n if (event.target.files?.length) {\n processFile(event.target.files[0])\n }\n }\n\n const onDrop = (event: ReactDragEvent<HTMLLabelElement>) => {\n preventEventDefaults(event)\n if (event.dataTransfer?.files?.length && !imagePreviewUrl) {\n processFile(event.dataTransfer.files[0])\n }\n }\n\n useEffect(() => {\n if (imagePreviewUrl) setIsImageLoaded(false)\n }, [imagePreviewUrl])\n\n const onDeleteButtonClick = showDeletePopover\n ? closeDeletePopover\n : openDeletePopover\n\n return (\n <label\n className={cx(\"cobalt-photo-dropzone\", className, {\n \"cobalt-photo-dropzone--filled\": imagePreviewUrl,\n \"cobalt-photo-dropzone--dragging\": isDragging,\n \"cobalt-photo-dropzone--loading\": isLoading,\n \"cobalt-photo-dropzone--errored\": isErrored,\n \"cobalt-photo-dropzone--imageVisible\": isImageLoaded,\n })}\n onMouseEnter={onDropzoneMouseEnter}\n onMouseLeave={onDropzoneMouseLeave}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onClick={onDropzoneClick}\n onKeyUp={onDropzoneKey}\n onDrop={onDrop}\n // Need to reset those listeners to avoid default browser behaviour\n onDragStart={preventEventDefaults}\n onDragEnd={preventEventDefaults}\n onDragOver={preventEventDefaults}\n >\n {isErrored && (\n <div className=\"cobalt-photo-dropzone__description\">\n <ContextualWarningCircleFilledIcon color=\"error\" />\n {errorContent(ACCEPTED_TYPES_LOCALE_STRING, ACCEPTED_MAX_SIZE_MB)}\n </div>\n )}\n {isLoading && (\n <div className=\"cobalt-photo-dropzone__description\">\n <LoadingIcon />\n </div>\n )}\n {!isLoading &&\n !isErrored &&\n (imagePreviewUrl ? (\n <>\n <img\n className=\"cobalt-photo-dropzone__preview\"\n src={imagePreviewUrl}\n alt=\"Uploaded preview\"\n onLoad={() => {\n setIsImageLoaded(true)\n }}\n />\n <div>\n <button\n type=\"button\"\n className={cx(\"cobalt-photo-dropzone__delete-button\", {\n \"cobalt-photo-dropzone__delete-button--triggered\":\n displayDeletion,\n })}\n ref={deleteButtonRef}\n onClick={onDeleteButtonClick}\n onKeyUp={onDeleteKey}\n >\n <BinIcon color=\"onSurface\" />\n </button>\n {deleteContentMode === \"modal\" && (\n <Modal\n isOpen={showDeletePopover}\n aria-label=\"delete\"\n bodySpacing={false}\n >\n {deleteContent(onDelete, closeDeletePopover)}\n </Modal>\n )}\n\n {deleteContentMode === \"popover\" && (\n <Popover\n targetRef={deleteButtonRef}\n isOpen={showDeletePopover}\n close={closeDeletePopover}\n placement=\"left-start\"\n distance={12}\n bodySpacing={false}\n arrow\n >\n {deleteContent(onDelete, closeDeletePopover)}\n </Popover>\n )}\n </div>\n </>\n ) : (\n <div className=\"cobalt-photo-dropzone__description cobalt-photo-dropzone__description--strong\">\n {description && <div>{description}</div>}\n <PlusIcon />\n </div>\n ))}\n <input\n ref={fileInputRef}\n className=\"cobalt-photo-dropzone__hidden-input\"\n type=\"file\"\n onChange={onFileInputChanged}\n // Prevent the bubbled click from re-entering the label's onClick,\n // which would cancel the file dialog via preventDefault.\n onClick={(event) => event.stopPropagation()}\n accept={ACCEPTED_PHOTOS_TYPES.map((ext) => `.${ext}`).join(\",\")}\n multiple={false}\n />\n </label>\n )\n}\n\nexport default PhotoDropzone\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/PhotoDropzone/index.tsx"],"sourcesContent":["import cx from \"classnames\"\nimport {\n type ChangeEvent as ReactChangeEvent,\n type DragEvent as ReactDragEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type TouchEvent as ReactTouchEvent,\n useEffect,\n useRef,\n useState,\n} from \"react\"\nimport useBreakpoint from \"../../hooks/useBreakpoint\"\nimport {\n BinIcon,\n ContextualWarningCircleFilledIcon,\n LoadingIcon,\n PlusIcon,\n} from \"../Icon\"\nimport Modal from \"../Modal\"\nimport Popover from \"../Popover\"\nimport { validateFile } from \"../utils/validateFile\"\n\nconst ACCEPTED_MAX_SIZE_MB = 10\nconst ACCEPTED_PHOTOS_TYPES = [\"jpg\", \"jpeg\", \"png\", \"gif\"]\nconst ERROR_DISPLAY_TIME = 6000\nconst ACCEPTED_TYPES_LOCALE_STRING = ACCEPTED_PHOTOS_TYPES.join(\", \")\n\nexport type PhotoDropzonePropsType = {\n className?: string\n description?: string\n deleteContent: (onDelete: () => void, close: () => void) => ReactNode\n deleteContentMode?: \"popover\" | \"modal\"\n errorContent: (acceptedTypes: string, maxFileSize: number) => ReactNode\n onDropped: (file: File) => Promise<void> | void\n onPhotoDelete?: () => void\n initialImageUrl?: string\n}\n\nconst preventEventDefaults = (\n e: ReactDragEvent | ReactMouseEvent | ReactKeyboardEvent | ReactTouchEvent,\n) => {\n e.preventDefault?.()\n e.stopPropagation?.()\n}\n\nconst isEnterOrSpaceKey = (event: ReactKeyboardEvent) =>\n event.key === \"Enter\" || event.key === \" \"\n\nconst PhotoDropzone = ({\n className,\n description,\n deleteContent,\n errorContent,\n onDropped,\n onPhotoDelete,\n deleteContentMode = \"popover\",\n initialImageUrl = \"\",\n}: PhotoDropzonePropsType) => {\n const { isMobile } = useBreakpoint()\n const fileInputRef = useRef<HTMLInputElement>(null)\n const deleteButtonRef = useRef<HTMLButtonElement>(null)\n const [isDragging, setIsDragging] = useState(false)\n const [isLoading, setIsLoading] = useState(false)\n const [isErrored, setIsErrored] = useState(false)\n const [imagePreviewUrl, setImagePreviewUrl] = useState(initialImageUrl)\n const [displayDeletion, setDisplayDeletion] = useState(false)\n const [showDeletePopover, setShowDeletePopover] = useState(false)\n const [isImageLoaded, setIsImageLoaded] = useState(false)\n\n const openDeletePopover = (\n event?: ReactMouseEvent | ReactKeyboardEvent | ReactTouchEvent,\n ) => {\n event && preventEventDefaults(event)\n setShowDeletePopover(true)\n }\n const closeDeletePopover = (event?: ReactMouseEvent | ReactTouchEvent) => {\n event && preventEventDefaults(event)\n setShowDeletePopover(false)\n }\n\n const onDropzoneMouseEnter = (event?: ReactMouseEvent) => {\n event && preventEventDefaults(event)\n if (imagePreviewUrl) setDisplayDeletion(true)\n }\n\n const onDropzoneMouseLeave = (event?: ReactMouseEvent) => {\n event && preventEventDefaults(event)\n if (displayDeletion && !showDeletePopover) setDisplayDeletion(false)\n }\n\n const onDropzoneClick = (event?: ReactMouseEvent | ReactTouchEvent) => {\n event && preventEventDefaults(event)\n if (isMobile && showDeletePopover) return\n if (isLoading) return\n if (isErrored) setIsErrored(false)\n if (imagePreviewUrl) {\n if (showDeletePopover) closeDeletePopover()\n return setDisplayDeletion(!displayDeletion)\n }\n fileInputRef.current?.click()\n }\n\n const onDropzoneKey = (event: ReactKeyboardEvent) => {\n if (showDeletePopover) return\n if (isEnterOrSpaceKey(event)) {\n onDropzoneClick()\n }\n }\n\n const onDeleteKey = (event: ReactKeyboardEvent) => {\n if (isEnterOrSpaceKey(event)) {\n openDeletePopover(event)\n }\n }\n\n const onDelete = () => {\n if (fileInputRef.current) fileInputRef.current.value = \"\"\n closeDeletePopover()\n setImagePreviewUrl(\"\")\n onPhotoDelete?.()\n }\n\n const onDragEnter = (event: ReactDragEvent) => {\n preventEventDefaults(event)\n if (isErrored) setIsErrored(false)\n !imagePreviewUrl && setIsDragging(true)\n }\n\n const onDragLeave = (event: ReactDragEvent) => {\n preventEventDefaults(event)\n setIsDragging(false)\n }\n\n const processFile = async (fileToProcess: File) => {\n setIsDragging(false)\n setIsErrored(false)\n setIsLoading(true)\n\n const isValidFile = await validateFile(\n fileToProcess,\n (fileToValidate, extension) => {\n const maxFileSize = ACCEPTED_MAX_SIZE_MB * 1000 * 1000\n const acceptedFileTypes = ACCEPTED_PHOTOS_TYPES\n\n if (fileToValidate.size > maxFileSize) {\n return false\n } else if (!extension || !acceptedFileTypes.includes(extension)) {\n return false\n } else {\n return true\n }\n },\n )\n\n if (isValidFile) {\n const imageSrc = URL.createObjectURL(fileToProcess)\n setImagePreviewUrl(imageSrc)\n await onDropped(fileToProcess)\n setIsLoading(false)\n } else {\n setIsLoading(false)\n setIsErrored(true)\n setTimeout(() => {\n setIsErrored(false)\n }, ERROR_DISPLAY_TIME)\n }\n }\n\n const onFileInputChanged = (event: ReactChangeEvent<HTMLInputElement>) => {\n if (event.target.files?.length) {\n processFile(event.target.files[0])\n }\n }\n\n const onDrop = (event: ReactDragEvent<HTMLLabelElement>) => {\n preventEventDefaults(event)\n if (event.dataTransfer?.files?.length && !imagePreviewUrl) {\n processFile(event.dataTransfer.files[0])\n }\n }\n\n useEffect(() => {\n if (imagePreviewUrl) setIsImageLoaded(false)\n }, [imagePreviewUrl])\n\n const onDeleteButtonClick = showDeletePopover\n ? closeDeletePopover\n : openDeletePopover\n\n return (\n <label\n className={cx(\"cobalt-photo-dropzone\", className, {\n \"cobalt-photo-dropzone--filled\": imagePreviewUrl,\n \"cobalt-photo-dropzone--dragging\": isDragging,\n \"cobalt-photo-dropzone--loading\": isLoading,\n \"cobalt-photo-dropzone--errored\": isErrored,\n \"cobalt-photo-dropzone--imageVisible\": isImageLoaded,\n })}\n onMouseEnter={onDropzoneMouseEnter}\n onMouseLeave={onDropzoneMouseLeave}\n onDragEnter={onDragEnter}\n onDragLeave={onDragLeave}\n onClick={onDropzoneClick}\n onKeyUp={onDropzoneKey}\n onDrop={onDrop}\n // Need to reset those listeners to avoid default browser behaviour\n onDragStart={preventEventDefaults}\n onDragEnd={preventEventDefaults}\n onDragOver={preventEventDefaults}\n >\n {isErrored && (\n <div className=\"cobalt-photo-dropzone__description\">\n <ContextualWarningCircleFilledIcon color=\"error\" />\n {errorContent(ACCEPTED_TYPES_LOCALE_STRING, ACCEPTED_MAX_SIZE_MB)}\n </div>\n )}\n {isLoading && (\n <div className=\"cobalt-photo-dropzone__description\">\n <LoadingIcon />\n </div>\n )}\n {!isLoading &&\n !isErrored &&\n (imagePreviewUrl ? (\n <>\n <img\n className=\"cobalt-photo-dropzone__preview\"\n src={imagePreviewUrl}\n alt=\"Uploaded preview\"\n onLoad={() => {\n setIsImageLoaded(true)\n }}\n />\n <div>\n <button\n type=\"button\"\n className={cx(\"cobalt-photo-dropzone__delete-button\", {\n \"cobalt-photo-dropzone__delete-button--triggered\":\n displayDeletion,\n })}\n ref={deleteButtonRef}\n onClick={onDeleteButtonClick}\n onKeyUp={onDeleteKey}\n >\n <BinIcon color=\"onSurface\" />\n </button>\n {deleteContentMode === \"modal\" && (\n <Modal\n isOpen={showDeletePopover}\n aria-label=\"delete\"\n bodySpacing={false}\n >\n {deleteContent(onDelete, closeDeletePopover)}\n </Modal>\n )}\n\n {deleteContentMode === \"popover\" && (\n <Popover\n targetRef={deleteButtonRef}\n isOpen={showDeletePopover}\n onOpenChange={setShowDeletePopover}\n placement=\"left-start\"\n offset={[0, 12]}\n bodySpacing={false}\n arrow\n >\n {deleteContent(onDelete, closeDeletePopover)}\n </Popover>\n )}\n </div>\n </>\n ) : (\n <div className=\"cobalt-photo-dropzone__description cobalt-photo-dropzone__description--strong\">\n {description && <div>{description}</div>}\n <PlusIcon />\n </div>\n ))}\n <input\n ref={fileInputRef}\n className=\"cobalt-photo-dropzone__hidden-input\"\n type=\"file\"\n onChange={onFileInputChanged}\n // Prevent the bubbled click from re-entering the label's onClick,\n // which would cancel the file dialog via preventDefault.\n onClick={(event) => event.stopPropagation()}\n accept={ACCEPTED_PHOTOS_TYPES.map((ext) => `.${ext}`).join(\",\")}\n multiple={false}\n />\n </label>\n )\n}\n\nexport default PhotoDropzone\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { registerPopover } from './popoverRegistry.js';
|
|
3
|
+
import { useDesktopPopoverCore } from './useDesktopPopoverCore.js';
|
|
4
|
+
|
|
5
|
+
const DesktopPopover = ({ targetRef, children, isOpen, onOpenChange, ...rest }) => {
|
|
6
|
+
const referenceElement = targetRef && "current" in targetRef ? targetRef.current : targetRef;
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (!onOpenChange)
|
|
9
|
+
return;
|
|
10
|
+
return registerPopover(() => {
|
|
11
|
+
onOpenChange(false);
|
|
12
|
+
});
|
|
13
|
+
}, [onOpenChange]);
|
|
14
|
+
const { refs, getReferenceProps, renderFloating } = useDesktopPopoverCore({
|
|
15
|
+
isOpen,
|
|
16
|
+
onOpenChange,
|
|
17
|
+
referenceElement,
|
|
18
|
+
...rest,
|
|
19
|
+
});
|
|
20
|
+
if (typeof children === "function") {
|
|
21
|
+
return children({ refs, getReferenceProps, renderFloating });
|
|
22
|
+
}
|
|
23
|
+
return renderFloating(children);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { DesktopPopover };
|
|
27
|
+
//# sourceMappingURL=DesktopPopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesktopPopover.js","sources":["../../../src/components/Popover/DesktopPopover.ts"],"sourcesContent":["import { useEffect } from \"react\"\nimport type { PopoverPropsType } from \".\"\nimport { registerPopover } from \"./popoverRegistry\"\nimport { useDesktopPopoverCore } from \"./useDesktopPopoverCore\"\n\nexport const DesktopPopover = ({\n targetRef,\n children,\n isOpen,\n onOpenChange,\n ...rest\n}: PopoverPropsType) => {\n const referenceElement =\n targetRef && \"current\" in targetRef ? targetRef.current : targetRef\n\n useEffect(() => {\n if (!onOpenChange) return\n\n return registerPopover(() => {\n onOpenChange(false)\n })\n }, [onOpenChange])\n\n const { refs, getReferenceProps, renderFloating } = useDesktopPopoverCore({\n isOpen,\n onOpenChange,\n referenceElement,\n ...rest,\n })\n\n if (typeof children === \"function\") {\n return children({ refs, getReferenceProps, renderFloating })\n }\n\n return renderFloating(children)\n}\n"],"names":[],"mappings":";;;;AAKa,MAAA,cAAc,GAAG,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,GAAG,IAAI,EACU,KAAI;AACrB,IAAA,MAAM,gBAAgB,GACpB,SAAS,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAA;IAErE,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY;YAAE,OAAM;QAEzB,OAAO,eAAe,CAAC,MAAK;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAA;AACrB,SAAC,CAAC,CAAA;AACJ,KAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,qBAAqB,CAAC;QACxE,MAAM;QACN,YAAY;QACZ,gBAAgB;AAChB,QAAA,GAAG,IAAI;AACR,KAAA,CAAC,CAAA;AAEF,IAAA,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;QAClC,OAAO,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,CAAA;KAC7D;AAED,IAAA,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAA;AACjC;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React, { useRef, useState } from 'react';
|
|
3
|
+
import useBreakpoint from '../../hooks/useBreakpoint.js';
|
|
4
|
+
import Popover from './index.js';
|
|
5
|
+
|
|
6
|
+
const mergeRefs = (node, originalRef, buttonRef, extraRef) => {
|
|
7
|
+
buttonRef.current = node;
|
|
8
|
+
extraRef === null || extraRef === void 0 ? void 0 : extraRef(node);
|
|
9
|
+
if (typeof originalRef === "function") {
|
|
10
|
+
originalRef(node);
|
|
11
|
+
}
|
|
12
|
+
else if (originalRef && typeof originalRef === "object") {
|
|
13
|
+
originalRef.current = node;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
function PopoverWrapper({ content, children, trigger, onOpenChange, isOpenByDefault = false, disabled = false, responsive = true, ...popoverProps }) {
|
|
17
|
+
var _a;
|
|
18
|
+
const buttonRef = useRef(null);
|
|
19
|
+
const [isOpen, setIsOpen] = useState(isOpenByDefault);
|
|
20
|
+
const { breakpoint } = useBreakpoint();
|
|
21
|
+
const isMobile = responsive && (breakpoint === "sm" || breakpoint === "xs");
|
|
22
|
+
const handleOpenChange = (open) => {
|
|
23
|
+
setIsOpen(open);
|
|
24
|
+
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(open);
|
|
25
|
+
};
|
|
26
|
+
if (disabled)
|
|
27
|
+
return children;
|
|
28
|
+
if (isMobile) {
|
|
29
|
+
const childProps = children.props;
|
|
30
|
+
return (jsxs(Fragment, { children: [React.cloneElement(children, {
|
|
31
|
+
onClick: (event) => {
|
|
32
|
+
var _a;
|
|
33
|
+
(_a = childProps.onClick) === null || _a === void 0 ? void 0 : _a.call(childProps, event);
|
|
34
|
+
handleOpenChange(true);
|
|
35
|
+
},
|
|
36
|
+
ref: (node) => mergeRefs(node, children.ref, buttonRef),
|
|
37
|
+
}), jsx(Popover, { ...popoverProps, responsive: true, isOpen: isOpen, onOpenChange: handleOpenChange, targetRef: buttonRef, children: content })] }));
|
|
38
|
+
}
|
|
39
|
+
return (jsx(Popover, { ...popoverProps, responsive: false, isOpen: isOpen, onOpenChange: handleOpenChange, targetRef: buttonRef, trigger: trigger, interactive: (_a = popoverProps.interactive) !== null && _a !== void 0 ? _a : trigger === "mouseenter", children: ({ refs, getReferenceProps, renderFloating }) => {
|
|
40
|
+
const referenceProps = getReferenceProps(children.props);
|
|
41
|
+
return (jsxs(Fragment, { children: [React.cloneElement(children, {
|
|
42
|
+
...referenceProps,
|
|
43
|
+
ref: (node) => mergeRefs(node, children.ref, buttonRef, refs.setReference),
|
|
44
|
+
}), renderFloating(content)] }));
|
|
45
|
+
} }));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { PopoverWrapper };
|
|
49
|
+
//# sourceMappingURL=PopoverWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverWrapper.js","sources":["../../../src/components/Popover/PopoverWrapper.tsx"],"sourcesContent":["import React, { type ReactElement, type Ref, useRef, useState } from \"react\"\nimport useBreakpoint from \"../../hooks/useBreakpoint\"\nimport Popover, { type PopoverPropsType } from \".\"\n\ntype RefableElement = ReactElement & {\n ref?: Ref<HTMLElement>\n}\n\nexport type PopoverWrapperPropsType = Omit<\n PopoverPropsType,\n \"targetRef\" | \"children\" | \"isOpen\"\n> & {\n content: React.ReactNode\n disabled?: boolean\n isOpenByDefault?: boolean\n children: RefableElement\n}\n\nconst mergeRefs = (\n node: HTMLElement | null,\n originalRef: Ref<HTMLElement> | undefined,\n buttonRef: React.MutableRefObject<HTMLElement | null>,\n extraRef?: (node: HTMLElement | null) => void,\n) => {\n buttonRef.current = node\n extraRef?.(node)\n\n if (typeof originalRef === \"function\") {\n originalRef(node)\n } else if (originalRef && typeof originalRef === \"object\") {\n ;(originalRef as React.MutableRefObject<HTMLElement | null>).current = node\n }\n}\n\nexport function PopoverWrapper({\n content,\n children,\n trigger,\n onOpenChange,\n isOpenByDefault = false,\n disabled = false,\n responsive = true,\n ...popoverProps\n}: PopoverWrapperPropsType) {\n const buttonRef = useRef<HTMLElement | null>(null)\n const [isOpen, setIsOpen] = useState(isOpenByDefault)\n const { breakpoint } = useBreakpoint()\n const isMobile = responsive && (breakpoint === \"sm\" || breakpoint === \"xs\")\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open)\n onOpenChange?.(open)\n }\n\n if (disabled) return children\n\n if (isMobile) {\n const childProps = children.props as {\n onClick?: (event: React.MouseEvent<HTMLElement>) => void\n }\n\n return (\n <>\n {React.cloneElement(children, {\n onClick: (event: React.MouseEvent<HTMLElement>) => {\n childProps.onClick?.(event)\n handleOpenChange(true)\n },\n ref: (node: HTMLElement | null) =>\n mergeRefs(node, children.ref, buttonRef),\n })}\n <Popover\n {...popoverProps}\n responsive\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n targetRef={buttonRef}\n >\n {content}\n </Popover>\n </>\n )\n }\n\n return (\n <Popover\n {...popoverProps}\n responsive={false}\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n targetRef={buttonRef}\n trigger={trigger}\n interactive={popoverProps.interactive ?? trigger === \"mouseenter\"}\n >\n {({ refs, getReferenceProps, renderFloating }) => {\n const referenceProps = getReferenceProps(children.props)\n\n return (\n <>\n {React.cloneElement(children, {\n ...referenceProps,\n ref: (node: HTMLElement | null) =>\n mergeRefs(node, children.ref, buttonRef, refs.setReference),\n })}\n {renderFloating(content)}\n </>\n )\n }}\n </Popover>\n )\n}\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { PopoverWrapper } from './PopoverWrapper.js';
|
|
3
|
+
import { tooltipConfig } from './tooltipConfig.js';
|
|
4
|
+
|
|
5
|
+
function TooltipWrapper({ content, children, ...popoverProps }) {
|
|
6
|
+
return (jsx(PopoverWrapper, { ...tooltipConfig, ...popoverProps, content: content, responsive: false, children: children }));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export { TooltipWrapper };
|
|
10
|
+
//# sourceMappingURL=TooltipWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TooltipWrapper.js","sources":["../../../src/components/Popover/TooltipWrapper.tsx"],"sourcesContent":["import { PopoverWrapper, type PopoverWrapperPropsType } from \"./PopoverWrapper\"\nimport { tooltipConfig } from \"./tooltipConfig\"\n\nexport type TooltipWrapperPropsType = Omit<\n PopoverWrapperPropsType,\n \"responsive\"\n>\n\nexport function TooltipWrapper({\n content,\n children,\n ...popoverProps\n}: TooltipWrapperPropsType) {\n return (\n <PopoverWrapper\n {...tooltipConfig}\n {...popoverProps}\n content={content}\n responsive={false}\n >\n {children}\n </PopoverWrapper>\n )\n}\n"],"names":["_jsx"],"mappings":";;;;AAQM,SAAU,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,GAAG,YAAY,EACS,EAAA;AACxB,IAAA,QACEA,GAAC,CAAA,cAAc,OACT,aAAa,EAAA,GACb,YAAY,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,KAAK,YAEhB,QAAQ,EAAA,CACM,EAClB;AACH;;;;"}
|
|
@@ -1,51 +1,19 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import Tippy from '@tippyjs/react';
|
|
3
|
-
import { useCallback, useEffect } from 'react';
|
|
4
|
-
import { sticky } from 'tippy.js';
|
|
5
2
|
import useBreakpoint from '../../hooks/useBreakpoint.js';
|
|
6
|
-
import { zIndexes } from '../../tokens/index.js';
|
|
7
3
|
import Modal from '../Modal/index.js';
|
|
8
|
-
import
|
|
4
|
+
import { DesktopPopover } from './DesktopPopover.js';
|
|
9
5
|
|
|
10
|
-
const ESC_KEY_CODE = 27;
|
|
11
|
-
const defaultTippyProps = {
|
|
12
|
-
animation: "shift-away-subtle",
|
|
13
|
-
interactive: true,
|
|
14
|
-
interactiveBorder: 10,
|
|
15
|
-
delay: [0, 0],
|
|
16
|
-
duration: [200, 150],
|
|
17
|
-
maxWidth: 500,
|
|
18
|
-
sticky: true,
|
|
19
|
-
plugins: [sticky],
|
|
20
|
-
theme: "light cobalt-popover",
|
|
21
|
-
inertia: true,
|
|
22
|
-
};
|
|
23
6
|
const MobilePopover = ({ isOpen, children, ariaLabel = "Popover mobile modal", onDismiss, bodySpacing, onShow, onHidden, }) => {
|
|
24
7
|
return (jsx(Modal, { "aria-label": ariaLabel, isOpen: isOpen, onDismissAttempt: onDismiss, bodySpacing: bodySpacing, onShow: onShow, onHidden: onHidden, children: children }));
|
|
25
8
|
};
|
|
26
|
-
const Popover = ({
|
|
27
|
-
// Desktop props
|
|
28
|
-
arrow = false, placement = "bottom-start", flip = true, theme = "", distance = 8, zIndex = zIndexes.dropdown, appendToBody = false, fitContent = false, lazy, }) => {
|
|
9
|
+
const Popover = ({ arrow = false, placement = "bottom-start", bodySpacing = true, appendToBody = false, fitContent = false, responsive = true, ...restProps }) => {
|
|
29
10
|
const { breakpoint } = useBreakpoint();
|
|
30
|
-
const isMobile = breakpoint === "sm" || breakpoint === "xs";
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
window.addEventListener("keydown", escListener);
|
|
37
|
-
return () => window.removeEventListener("keydown", escListener);
|
|
38
|
-
}, [escListener]);
|
|
39
|
-
const onTippyClose = () => {
|
|
40
|
-
if (onHidden)
|
|
41
|
-
onHidden();
|
|
42
|
-
};
|
|
43
|
-
const onTippyOpen = () => {
|
|
44
|
-
if (onShow)
|
|
45
|
-
onShow();
|
|
46
|
-
};
|
|
47
|
-
const TippyComp = lazy ? LazyTippy : Tippy;
|
|
48
|
-
return isMobile ? (jsx(MobilePopover, { isOpen: isOpen, onDismiss: close, bodySpacing: bodySpacing, ariaLabel: ariaLabel, onShow: onShow, onHidden: onHidden, children: children })) : (jsx(TippyComp, { content: bodySpacing ? (jsx("div", { className: "cobalt-popover--bodySpacing", children: children })) : (children), ...defaultTippyProps, visible: isOpen, reference: targetRef, theme: `${defaultTippyProps.theme} ${theme} ${arrow ? "cobalt-popover--withArrow" : ""} ${fitContent ? "cobalt-popover--fitContent" : ""}`, offset: [0, distance], arrow, placement, zIndex, popperOptions: { modifiers: [{ name: "flip", enabled: flip }] }, onHidden: onTippyClose, onShow: onTippyOpen, onClickOutside: close, appendTo: appendToBody ? document.body : "parent" }));
|
|
11
|
+
const isMobile = responsive && (breakpoint === "sm" || breakpoint === "xs");
|
|
12
|
+
const mobileChildren = typeof restProps.children === "function" ? null : restProps.children;
|
|
13
|
+
return isMobile ? (jsx(MobilePopover, { isOpen: restProps.isOpen, onDismiss: () => {
|
|
14
|
+
var _a;
|
|
15
|
+
(_a = restProps.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(restProps, false);
|
|
16
|
+
}, bodySpacing: bodySpacing, ariaLabel: restProps["aria-label"], onShow: restProps.onShow, onHidden: restProps.onHidden, children: mobileChildren })) : (jsx(DesktopPopover, { arrow: arrow, placement: placement, bodySpacing: bodySpacing, appendToBody: appendToBody, fitContent: fitContent, ...restProps }));
|
|
49
17
|
};
|
|
50
18
|
|
|
51
19
|
export { Popover as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Popover/index.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Popover/index.tsx"],"sourcesContent":["import type React from \"react\"\nimport useBreakpoint from \"../../hooks/useBreakpoint\"\nimport Modal, { type ModalPropsType } from \"../Modal\"\nimport { DesktopPopover } from \"./DesktopPopover\"\nimport type {\n DesktopPopoverCoreRefs,\n PopoverConfig,\n} from \"./useDesktopPopoverCore\"\n\ntype DesktopPopoverRenderProps = {\n refs: DesktopPopoverCoreRefs\n getReferenceProps: ReturnType<\n typeof import(\"@floating-ui/react\").useInteractions\n >[\"getReferenceProps\"]\n renderFloating: (content: React.ReactNode) => React.ReactNode\n}\n\nexport type DesktopPopoverChildren =\n | React.ReactNode\n | ((props: DesktopPopoverRenderProps) => React.ReactNode)\n\nexport type PopoverPropsType = PopoverConfig & {\n children?: DesktopPopoverChildren\n isOpen: boolean\n onOpenChange?: (open: boolean) => void\n \"aria-label\"?: string\n targetRef: React.RefObject<Element | null> | Element | null\n responsive?: boolean\n}\n\nconst MobilePopover = ({\n isOpen,\n children,\n ariaLabel = \"Popover mobile modal\",\n onDismiss,\n bodySpacing,\n onShow,\n onHidden,\n}: {\n children?: React.ReactNode\n ariaLabel?: ModalPropsType[\"aria-label\"]\n isOpen: ModalPropsType[\"isOpen\"]\n onDismiss?: () => void\n bodySpacing: ModalPropsType[\"bodySpacing\"]\n onShow: ModalPropsType[\"onShow\"]\n onHidden: ModalPropsType[\"onHidden\"]\n}) => {\n return (\n <Modal\n aria-label={ariaLabel}\n isOpen={isOpen}\n onDismissAttempt={onDismiss}\n bodySpacing={bodySpacing}\n onShow={onShow}\n onHidden={onHidden}\n >\n {children}\n </Modal>\n )\n}\n\nconst Popover = ({\n arrow = false,\n placement = \"bottom-start\",\n bodySpacing = true,\n appendToBody = false,\n fitContent = false,\n responsive = true,\n ...restProps\n}: PopoverPropsType) => {\n const { breakpoint } = useBreakpoint()\n const isMobile = responsive && (breakpoint === \"sm\" || breakpoint === \"xs\")\n\n const mobileChildren =\n typeof restProps.children === \"function\" ? null : restProps.children\n\n return isMobile ? (\n <MobilePopover\n isOpen={restProps.isOpen}\n onDismiss={() => {\n restProps.onOpenChange?.(false)\n }}\n bodySpacing={bodySpacing}\n ariaLabel={restProps[\"aria-label\"]}\n onShow={restProps.onShow}\n onHidden={restProps.onHidden}\n >\n {mobileChildren}\n </MobilePopover>\n ) : (\n <DesktopPopover\n arrow={arrow}\n placement={placement}\n bodySpacing={bodySpacing}\n appendToBody={appendToBody}\n fitContent={fitContent}\n {...restProps}\n />\n )\n}\n\nexport default Popover\n"],"names":["_jsx"],"mappings":";;;;;AA8BA,MAAM,aAAa,GAAG,CAAC,EACrB,MAAM,EACN,QAAQ,EACR,SAAS,GAAG,sBAAsB,EAClC,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,GAST,KAAI;AACH,IAAA,QACEA,GAAA,CAAC,KAAK,EAAA,EAAA,YAAA,EACQ,SAAS,EACrB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,SAAS,EAC3B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAAA,QAAA,EAEjB,QAAQ,EAAA,CACH,EACT;AACH,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,EACf,KAAK,GAAG,KAAK,EACb,SAAS,GAAG,cAAc,EAC1B,WAAW,GAAG,IAAI,EAClB,YAAY,GAAG,KAAK,EACpB,UAAU,GAAG,KAAK,EAClB,UAAU,GAAG,IAAI,EACjB,GAAG,SAAS,EACK,KAAI;AACrB,IAAA,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,EAAE,CAAA;AACtC,IAAA,MAAM,QAAQ,GAAG,UAAU,KAAK,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,CAAA;AAE3E,IAAA,MAAM,cAAc,GAClB,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAA;AAEtE,IAAA,OAAO,QAAQ,IACbA,IAAC,aAAa,EAAA,EACZ,MAAM,EAAE,SAAS,CAAC,MAAM,EACxB,SAAS,EAAE,MAAK;;AACd,YAAA,CAAA,EAAA,GAAA,SAAS,CAAC,YAAY,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,SAAA,EAAA,KAAK,CAAC,CAAA;SAChC,EACD,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,EAClC,MAAM,EAAE,SAAS,CAAC,MAAM,EACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAA,QAAA,EAE3B,cAAc,EAAA,CACD,KAEhBA,GAAC,CAAA,cAAc,EACb,EAAA,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EAClB,GAAA,SAAS,EACb,CAAA,CACH,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const registry = new Set();
|
|
2
|
+
const registerPopover = (close) => {
|
|
3
|
+
registry.add(close);
|
|
4
|
+
return () => {
|
|
5
|
+
registry.delete(close);
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
const hideAllPopovers = () => {
|
|
9
|
+
registry.forEach((close) => {
|
|
10
|
+
close();
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { hideAllPopovers, registerPopover };
|
|
15
|
+
//# sourceMappingURL=popoverRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popoverRegistry.js","sources":["../../../src/components/Popover/popoverRegistry.ts"],"sourcesContent":["type CloseFn = () => void\n\nconst registry = new Set<CloseFn>()\n\nexport const registerPopover = (close: CloseFn) => {\n registry.add(close)\n\n return () => {\n registry.delete(close)\n }\n}\n\nexport const hideAllPopovers = () => {\n registry.forEach((close) => {\n close()\n })\n}\n"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAW,CAAA;AAEtB,MAAA,eAAe,GAAG,CAAC,KAAc,KAAI;AAChD,IAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AAEnB,IAAA,OAAO,MAAK;AACV,QAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACxB,KAAC,CAAA;AACH,EAAC;AAEM,MAAM,eAAe,GAAG,MAAK;AAClC,IAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACzB,QAAA,KAAK,EAAE,CAAA;AACT,KAAC,CAAC,CAAA;AACJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltipConfig.js","sources":["../../../src/components/Popover/tooltipConfig.ts"],"sourcesContent":["import type { PopoverConfig } from \"./useDesktopPopoverCore\"\n\nexport const tooltipConfig = {\n trigger: \"mouseenter\",\n interactive: false,\n tooltip: true,\n arrow: true,\n placement: \"top\",\n bodySpacing: false,\n appendToBody: true,\n} satisfies Partial<PopoverConfig>\n"],"names":[],"mappings":"AAEa,MAAA,aAAa,GAAG;AAC3B,IAAA,OAAO,EAAE,YAAY;AACrB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,KAAK,EAAE,IAAI;AACX,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,YAAY,EAAE,IAAI;;;;;"}
|