@spark-ui/components
Version:
Spark (Leboncoin design system) components.
1 lines • 43.9 kB
Source Map (JSON)
{"version":3,"sources":["../../src/snackbar/Snackbar.tsx","../../src/snackbar/SnackbarRegion.tsx","../../src/snackbar/SnackbarItem.tsx","../../src/snackbar/SnackbarItem.styles.ts","../../src/snackbar/snackbarVariants.ts","../../src/snackbar/SnackbarItemAction.tsx","../../src/snackbar/SnackbarItemContext.tsx","../../src/snackbar/SnackbarItemClose.tsx","../../src/snackbar/SnackbarItemIcon.tsx","../../src/snackbar/useSwipe.ts","../../src/snackbar/SnackbarRegion.styles.ts","../../src/snackbar/useSnackbarGlobalStore.ts","../../src/snackbar/index.ts"],"sourcesContent":["import {\n type ToastOptions as SnackBarItemOptions,\n ToastQueue,\n useToastQueue,\n} from '@react-stately/toast'\nimport { type ReactElement, Ref, type RefObject, useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { type SnackbarItemValue } from './SnackbarItem'\nimport { SnackbarRegion, type SnackbarRegionProps } from './SnackbarRegion'\nimport { useSnackbarGlobalStore } from './useSnackbarGlobalStore'\n\n/**\n * We define here a global queue thanks to dedicated util from React Spectrum.\n * It is based on React `useSyncExternalStore` and allows us to consume data from\n * an external data store, and thus preventing use of React context that could\n * lead to unwanted rerenderings. It also simplifies initial implementation.\n */\nlet GLOBAL_SNACKBAR_QUEUE: ToastQueue<SnackbarItemValue> | null = null\n\nconst getGlobalSnackBarQueue = () => {\n if (!GLOBAL_SNACKBAR_QUEUE) {\n GLOBAL_SNACKBAR_QUEUE = new ToastQueue({\n maxVisibleToasts: 1,\n hasExitAnimation: true,\n })\n }\n\n return GLOBAL_SNACKBAR_QUEUE\n}\n\nexport const clearSnackbarQueue = () => {\n GLOBAL_SNACKBAR_QUEUE = null\n}\n\n/**\n * We define a global store to keep track of all providers instances, to ensure\n * we always have a single Snackbar container.\n */\nconst GLOBAL_SNACKBAR_STORE = {\n providers: new Set<RefObject<HTMLDivElement | null>>(),\n subscriptions: new Set<() => void>(),\n}\n\nexport type SnackbarProps = Omit<SnackbarRegionProps, 'state'> & {\n ref?: Ref<HTMLDivElement>\n}\n\nexport const Snackbar = ({ ref: forwardedRef, ...props }: SnackbarProps): ReactElement | null => {\n const ref = useRef<HTMLDivElement>(null)\n\n const state = useToastQueue(getGlobalSnackBarQueue())\n\n const { provider, addProvider, deleteProvider } = useSnackbarGlobalStore(GLOBAL_SNACKBAR_STORE)\n\n useEffect(() => {\n addProvider(ref)\n\n return () => {\n for (const toast of getGlobalSnackBarQueue().visibleToasts) {\n toast.animation = undefined\n }\n\n deleteProvider(ref)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return ref === provider && state.visibleToasts.length > 0\n ? createPortal(<SnackbarRegion ref={forwardedRef} state={state} {...props} />, document.body)\n : null\n}\n\nSnackbar.displayName = 'Snackbar'\n\nexport interface AddSnackbarArgs extends SnackbarItemValue, Omit<SnackBarItemOptions, 'timeout'> {\n /**\n * Handler that is called when the snackbar is closed, either by the user\n * or after a timeout.\n */\n onClose?: () => void\n /**\n * A timeout to automatically close the snackbar after, in milliseconds.\n * @default 5000\n */\n timeout?: number | null\n /**\n * The priority of the snackbar relative to other snackbars. Larger numbers indicate higher priority.\n */\n priority?: number\n}\n\nexport const addSnackbar = ({ onClose, timeout = 5000, priority, ...content }: AddSnackbarArgs) => {\n const queue = getGlobalSnackBarQueue()\n\n queue.add(content, {\n onClose,\n timeout: timeout && !content.onAction ? Math.max(timeout, 5000) : undefined,\n priority,\n })\n}\n","import { type AriaToastRegionProps, useToastRegion } from '@react-aria/toast'\nimport { cloneElement, type ComponentPropsWithRef, type ReactElement, useRef } from 'react'\n\nimport { SnackbarItem, type SnackbarItemProps } from './SnackbarItem'\nimport { SnackbarItemContext, type SnackbarItemState } from './SnackbarItemContext'\nimport { snackbarRegionVariant, type SnackbarRegionVariantProps } from './SnackbarRegion.styles'\n\nexport interface SnackbarRegionProps\n extends ComponentPropsWithRef<'div'>,\n AriaToastRegionProps,\n SnackbarRegionVariantProps,\n Pick<SnackbarItemState, 'state'> {\n /**\n * An accessibility label for the snackbar region.\n * @default 'Notifications'\n */\n 'aria-label'?: string\n /**\n * Identifies the element (or elements) that labels the current element.\n */\n 'aria-labelledby'?: string\n /**\n * Identifies the element (or elements) that describes the object.\n */\n 'aria-describedby'?: string\n /**\n * Identifies the element (or elements) that provide a detailed, extended description for the object.\n */\n 'aria-details'?: string\n /**\n * The component/template used to display each snackbar from the queue\n * @default 'Snackbar.Item'\n */\n children?: ReactElement<SnackbarItemProps, typeof SnackbarItem>\n}\n\nexport const SnackbarRegion = ({\n children = <SnackbarItem />,\n state,\n position = 'bottom',\n className,\n ref: forwardedRef,\n ...rest\n}: SnackbarRegionProps): ReactElement => {\n const innerRef = useRef<HTMLDivElement>(null)\n const ref = forwardedRef && typeof forwardedRef !== 'function' ? forwardedRef : innerRef\n\n const { regionProps } = useToastRegion(rest, state, ref)\n\n return (\n <div\n {...regionProps}\n ref={ref}\n data-position={position}\n className={snackbarRegionVariant({ position, className })}\n >\n {state.visibleToasts.map(toast => (\n <SnackbarItemContext.Provider key={toast.key} value={{ toast, state }}>\n {cloneElement(children, { key: toast.key })}\n </SnackbarItemContext.Provider>\n ))}\n </div>\n )\n}\n","/* eslint-disable complexity */\nimport { useToast } from '@react-aria/toast'\nimport {\n Children,\n cloneElement,\n type ComponentPropsWithRef,\n type FC,\n isValidElement,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n useCallback,\n useRef,\n} from 'react'\n\nimport {\n snackbarItemVariant,\n snackbarItemVariantContent,\n type SnackbarItemVariantContentProps,\n type SnackbarItemVariantProps,\n} from './SnackbarItem.styles'\nimport { SnackbarItemAction, SnackbarItemActionProps } from './SnackbarItemAction'\nimport { SnackbarItemClose, SnackbarItemCloseProps } from './SnackbarItemClose'\nimport { useSnackbarItemContext } from './SnackbarItemContext'\nimport { SnackbarItemIcon, SnackbarItemIconProps } from './SnackbarItemIcon'\nimport { useSwipe } from './useSwipe'\n\nexport interface SnackbarItemValue extends SnackbarItemVariantProps {\n /**\n * Icon that will be prepended before snackbar message\n */\n icon?: ReactNode\n message: ReactNode\n /**\n * If `true` snackbar will display a close button\n * @default false\n */\n isClosable?: boolean\n /**\n * A label for the action button within the toast.\n */\n actionLabel?: string\n /**\n * Handler that is called when the action button is pressed.\n */\n onAction?: () => void\n /**\n * If `true` the action button will be displayed on a new line.\n * @default false\n */\n actionOnNewline?: boolean\n}\n\nexport interface SnackbarItemProps\n extends ComponentPropsWithRef<'div'>,\n SnackbarItemVariantProps,\n SnackbarItemVariantContentProps {\n /**\n * Defines a string value that labels the current element.\n */\n 'aria-label'?: string\n /**\n * Identifies the element (or elements) that labels the current element.\n */\n 'aria-labelledby'?: string\n /**\n * Identifies the element (or elements) that describes the object.\n */\n 'aria-describedby'?: string\n /**\n * Identifies the element (or elements) that provide a detailed, extended description for the object.\n */\n 'aria-details'?: string\n}\n\nexport const SnackbarItem = ({\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'aria-details': ariaDetails,\n design: designProp,\n intent: intentProp,\n actionOnNewline: actionOnNewlineProp,\n className,\n children,\n ref: forwardedRef,\n ...rest\n}: PropsWithChildren<SnackbarItemProps>) => {\n const innerRef = useRef(null)\n const ref = typeof forwardedRef !== 'function' ? forwardedRef || innerRef : innerRef\n\n const { toast, state } = useSnackbarItemContext()\n\n const { state: swipeState, direction: swipeDirection } = useSwipe({\n swipeRef: ref,\n onSwipeStart: state.pauseAll,\n onSwipeCancel: state.resumeAll,\n onSwipeEnd: ({ direction }) => {\n ;['left', 'right'].includes(`${direction}`) && state.close(toast.key)\n },\n })\n\n const { message, icon, isClosable, onAction, actionLabel } = toast.content\n const intent = intentProp ?? toast.content.intent\n const design = designProp ?? toast.content.design\n const actionOnNewline = actionOnNewlineProp ?? toast.content.actionOnNewline\n\n const ariaProps = {\n ariaLabel,\n ariaLabelledby,\n ariaDescribedby,\n ariaDetails,\n }\n\n const { toastProps, titleProps, closeButtonProps, contentProps } = useToast(\n { toast, ...ariaProps },\n state,\n ref\n )\n\n const findElement = useCallback(\n <P extends object>(elementDisplayName: string): ReactElement<P> | undefined => {\n const childrenArray = Children.toArray(children)\n\n const match = childrenArray\n .filter(isValidElement)\n .find(\n (child): child is ReactElement<P> =>\n !!(child.type as FC<P> & { displayName?: string }).displayName?.includes(\n elementDisplayName\n )\n )\n\n return match as ReactElement<P> | undefined\n },\n [children]\n )\n\n const iconFromChildren = findElement<SnackbarItemIconProps>('Snackbar.ItemIcon')\n const actionBtnFromChildren = findElement<SnackbarItemActionProps>('Snackbar.ItemAction')\n const closeBtnFromChildren = findElement<SnackbarItemCloseProps>('Snackbar.ItemClose')\n\n return (\n <div\n className={snackbarItemVariant({ design, intent, className })}\n data-animation={toast.animation}\n {...(!(swipeState === 'cancel' && toast.animation === 'exiting') && {\n 'data-swipe': swipeState,\n 'data-swipe-direction': swipeDirection,\n })}\n {...(toast.animation === 'exiting' && {\n // Remove snackbar when the exiting animation completes\n onAnimationEnd: () => state.remove(toast.key),\n })}\n ref={ref}\n {...toastProps}\n {...rest}\n >\n <div className={snackbarItemVariantContent({ actionOnNewline })} {...contentProps}>\n {/* 1. ICON */}\n {renderSubComponent(iconFromChildren, icon ? SnackbarItemIcon : null, {\n children: icon,\n })}\n\n {/* 2. MESSAGE */}\n <p\n className=\"px-md py-lg text-body-2 row-span-3\"\n style={{ gridArea: 'message' }}\n {...titleProps}\n >\n {message}\n </p>\n\n {/* 3. ACTION BUTTON */}\n {renderSubComponent(\n actionBtnFromChildren,\n actionLabel && onAction ? SnackbarItemAction : null,\n { intent, design, onClick: onAction, children: actionLabel }\n )}\n\n {/* 4. CLOSE BUTTON */}\n {renderSubComponent(closeBtnFromChildren, isClosable ? SnackbarItemClose : null, {\n intent,\n design,\n /**\n * React Spectrum typing of aria-label is inaccurate, and aria-label value should never be undefined.\n * See https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/i18n/src/useLocalizedStringFormatter.ts#L40\n */\n 'aria-label': closeButtonProps['aria-label'] as string,\n })}\n </div>\n </div>\n )\n}\n\nSnackbarItem.displayName = 'Snackbar.Item'\n\n/**\n * Returns compound item if found in children prop.\n * If not fallbacks to default item, conditionned by addSnackbar options.\n */\nconst renderSubComponent = <P extends object>(\n childItem?: ReactElement<P>,\n defaultItem?: FC<P> | null,\n props?: P\n) => {\n if (childItem) {\n return cloneElement(childItem, { ...props, ...childItem.props })\n } else if (defaultItem) {\n const Item = defaultItem\n\n return <Item {...(props as P)} />\n } else {\n return null\n }\n}\n","import { cva, VariantProps } from 'class-variance-authority'\n\nimport { filledVariants, tintedVariants } from './snackbarVariants'\n\nexport const snackbarItemVariant = cva(\n [\n 'rounded-md shadow-sm',\n 'max-w-[600px]',\n 'cursor-default pointer-events-auto touch-none select-none',\n 'absolute',\n /**\n * Focus\n */\n 'group-focus-visible:outline-hidden group-focus-visible:u-outline group-not-focus-visible:ring-inset',\n /**\n * Positionning\n */\n 'group-data-[position=bottom]:bottom-0 group-data-[position=bottom-left]:bottom-0 group-data-[position=bottom-right]:bottom-0',\n 'group-data-[position=top]:top-0 group-data-[position=top-left]:top-0 group-data-[position=top-right]:top-0',\n /**\n * Animation and opacity\n */\n '[animation-fill-mode: forwards]!',\n 'data-[animation=queued]:animate-fade-in',\n 'data-[animation=entering]:easing-decelerate-back',\n 'data-[animation=exiting]:easing-standard',\n // Parent position bottom|bottom-left|bottom-right\n 'data-[animation=entering]:group-data-[position=bottom]:[&:not([data-swipe])]:animate-slide-in-bottom',\n 'data-[animation=exiting]:opacity-0 data-[animation=exiting]:transition-opacity',\n 'data-[animation=exiting]:group-data-[position=bottom]:[&:not([data-swipe])]:animate-slide-out-bottom',\n 'data-[animation=entering]:group-data-[position=bottom-left]:[&:not([data-swipe])]:animate-slide-in-bottom',\n 'data-[animation=exiting]:group-data-[position=bottom-left]:[&:not([data-swipe])]:animate-slide-out-bottom',\n 'data-[animation=entering]:group-data-[position=bottom-right]:[&:not([data-swipe])]:animate-slide-in-bottom',\n 'data-[animation=exiting]:group-data-[position=bottom-right]:[&:not([data-swipe])]:animate-slide-out-bottom',\n // Parent position top|top-left|top-right\n 'data-[animation=entering]:group-data-[position=top]:[&:not([data-swipe])]:animate-slide-in-top',\n 'data-[animation=exiting]:group-data-[position=top]:[&:not([data-swipe])]:animate-slide-out-top',\n 'data-[animation=entering]:group-data-[position=top-left]:[&:not([data-swipe])]:animate-slide-in-top',\n 'data-[animation=exiting]:group-data-[position=top-left]:[&:not([data-swipe])]:animate-slide-out-top',\n 'data-[animation=entering]:group-data-[position=top-right]:[&:not([data-swipe])]:animate-slide-in-top',\n 'data-[animation=exiting]:group-data-[position=top-right]:[&:not([data-swipe])]:animate-slide-out-top',\n /**\n * Swipe\n */\n 'data-[swipe=move]:data-[swipe-direction=right]:translate-x-(--swipe-position-x)',\n 'data-[swipe=move]:data-[swipe-direction=left]:translate-x-(--swipe-position-x)',\n 'data-[swipe=cancel]:translate-x-0',\n 'data-[swipe=end]:data-[swipe-direction=right]:animate-standalone-swipe-out-right',\n 'data-[swipe=end]:data-[swipe-direction=left]:animate-standalone-swipe-out-left',\n ],\n {\n variants: {\n /**\n * Set different look and feel\n * @default 'filled'\n */\n design: {\n filled: '',\n tinted: '',\n },\n /**\n * Set color intent\n * @default 'neutral'\n */\n intent: {\n success: '',\n alert: '',\n error: '',\n info: '',\n neutral: '',\n main: '',\n basic: '',\n support: '',\n accent: '',\n inverse: '',\n },\n },\n compoundVariants: [...filledVariants, ...tintedVariants],\n defaultVariants: {\n design: 'filled',\n intent: 'neutral',\n },\n }\n)\n\nexport const snackbarItemVariantContent = cva(\n [\n 'inline-grid items-center',\n 'col-start-1 row-start-1',\n 'px-md', // applying padding on the parent prevents VoiceOver on Safari from reading snackbar content 🤷\n ],\n {\n variants: {\n /**\n * Force action button displaying on a new line\n * @default false\n */\n actionOnNewline: {\n true: [\n 'grid-rows-[52px_1fr_52px]',\n 'grid-cols-[min-content_1fr_min-content]',\n \"[grid-template-areas:'icon_message_close'_'._message_.'_'action_action_action']\",\n ],\n false: [\n 'grid-cols-[min-content_1fr_min-content_min-content]',\n \"[grid-template-areas:'icon_message_action_close']\",\n ],\n },\n },\n defaultVariants: {\n actionOnNewline: false,\n },\n }\n)\n\nexport type SnackbarItemVariantProps = VariantProps<typeof snackbarItemVariant>\nexport type SnackbarItemVariantContentProps = VariantProps<typeof snackbarItemVariantContent>\n","export const filledVariants = [\n {\n design: 'filled',\n intent: 'success',\n class: ['bg-success text-on-success'],\n },\n {\n design: 'filled',\n intent: 'alert',\n class: ['bg-alert text-on-alert'],\n },\n {\n design: 'filled',\n intent: 'error',\n class: ['bg-error text-on-error'],\n },\n {\n design: 'filled',\n intent: 'info',\n class: ['bg-info text-on-info'],\n },\n {\n design: 'filled',\n intent: 'neutral',\n class: ['bg-neutral text-on-neutral'],\n },\n {\n design: 'filled',\n intent: 'main',\n class: ['bg-main text-on-main'],\n },\n {\n design: 'filled',\n intent: 'basic',\n class: ['bg-basic text-on-basic'],\n },\n {\n design: 'filled',\n intent: 'support',\n class: ['bg-support text-on-support'],\n },\n {\n design: 'filled',\n intent: 'accent',\n class: ['bg-accent text-on-accent'],\n },\n {\n design: 'filled',\n intent: 'inverse',\n class: ['bg-surface-inverse text-on-surface-inverse'],\n },\n] as const\n\nexport const tintedVariants = [\n {\n design: 'tinted',\n intent: 'success',\n class: ['bg-success-container text-on-success-container'],\n },\n {\n design: 'tinted',\n intent: 'alert',\n class: ['bg-alert-container text-on-alert-container'],\n },\n {\n design: 'tinted',\n intent: 'error',\n class: ['bg-error-container text-on-error-container'],\n },\n {\n design: 'tinted',\n intent: 'info',\n class: ['bg-info-container text-on-info-container'],\n },\n {\n design: 'tinted',\n intent: 'neutral',\n class: ['bg-neutral-container text-on-neutral-container'],\n },\n {\n design: 'tinted',\n intent: 'main',\n class: ['bg-main-container text-on-main-container'],\n },\n {\n design: 'tinted',\n intent: 'basic',\n class: ['bg-basic-container text-on-basic-container'],\n },\n {\n design: 'tinted',\n intent: 'support',\n class: ['bg-support-container text-on-support-container'],\n },\n {\n design: 'tinted',\n intent: 'accent',\n class: ['bg-accent-container text-on-accent-container'],\n },\n {\n design: 'tinted',\n intent: 'inverse',\n class: ['bg-surface-inverse text-on-surface-inverse'],\n },\n] as const\n","import { cx } from 'class-variance-authority'\nimport { Ref } from 'react'\n\nimport { Button, type ButtonProps } from '../button'\nimport type { SnackbarItemVariantProps } from './SnackbarItem.styles'\nimport { useSnackbarItemContext } from './SnackbarItemContext'\n\nexport type SnackbarItemActionProps = Omit<ButtonProps, 'size' | 'shape' | 'intent'> &\n SnackbarItemVariantProps & {\n ref?: Ref<HTMLButtonElement>\n }\n\nexport const SnackbarItemAction = ({\n design: designProp = 'filled',\n intent: intentProp = 'neutral',\n onClick,\n children,\n className,\n ref,\n ...rest\n}: SnackbarItemActionProps) => {\n const { toast, state } = useSnackbarItemContext()\n\n const intent = intentProp ?? toast.content.intent\n const design = designProp ?? toast.content.design\n\n return (\n <Button\n ref={ref}\n size=\"md\"\n shape=\"rounded\"\n {...(intent === 'inverse'\n ? {\n design: 'ghost',\n intent: 'surface',\n }\n : {\n design,\n intent: intent === 'error' ? 'danger' : intent,\n })}\n onClick={e => {\n onClick?.(e)\n state.close(toast.key)\n }}\n style={{ gridArea: 'action', ...rest.style }}\n className={cx('ml-md justify-self-end', className)}\n {...rest}\n >\n {children}\n </Button>\n )\n}\n\nSnackbarItemAction.displayName = 'Snackbar.ItemAction'\n","import { QueuedToast, ToastState } from '@react-stately/toast'\nimport { createContext, useContext } from 'react'\n\nimport type { SnackbarItemValue } from './SnackbarItem'\n\nexport interface SnackbarItemState<T = SnackbarItemValue> {\n toast: QueuedToast<T>\n state: ToastState<T>\n}\n\nexport const SnackbarItemContext = createContext<SnackbarItemState>({} as SnackbarItemState)\n\nexport const useSnackbarItemContext = () => useContext(SnackbarItemContext)\n","import { Close } from '@spark-ui/icons/Close'\nimport { cx } from 'class-variance-authority'\nimport { type ComponentPropsWithRef } from 'react'\n\nimport { Icon } from '../icon'\nimport { IconButton, type IconButtonProps } from '../icon-button'\nimport type { SnackbarItemVariantProps } from './SnackbarItem.styles'\nimport { useSnackbarItemContext } from './SnackbarItemContext'\n\nexport interface SnackbarItemCloseProps\n extends Omit<ComponentPropsWithRef<'button'>, 'aria-label' | 'disabled'>,\n Pick<IconButtonProps, 'aria-label'>,\n SnackbarItemVariantProps {}\n\nexport const SnackbarItemClose = ({\n design: designProp = 'filled',\n intent: intentProp = 'neutral',\n 'aria-label': ariaLabel,\n onClick,\n className,\n ref,\n ...rest\n}: SnackbarItemCloseProps) => {\n const { toast, state } = useSnackbarItemContext()\n\n const intent = intentProp ?? toast.content.intent\n const design = designProp ?? toast.content.design\n\n return (\n <IconButton\n ref={ref}\n size=\"md\"\n shape=\"rounded\"\n {...(intent === 'inverse'\n ? {\n design: 'ghost',\n intent: 'surface',\n }\n : {\n design,\n intent: intent === 'error' ? 'danger' : intent,\n })}\n aria-label={ariaLabel}\n onClick={e => {\n onClick?.(e)\n state.close(toast.key)\n }}\n style={{ gridArea: 'close', ...rest.style }}\n className={cx('ml-md justify-self-end', className)}\n {...rest}\n >\n <Icon size=\"sm\">\n <Close />\n </Icon>\n </IconButton>\n )\n}\n\nSnackbarItemClose.displayName = 'Snackbar.ItemClose'\n","import { cx } from 'class-variance-authority'\nimport type { ReactElement } from 'react'\n\nimport { Icon, type IconProps } from '../icon'\n\nexport type SnackbarItemIconProps = IconProps\n\nexport const SnackbarItemIcon = ({\n children,\n className,\n ...rest\n}: SnackbarItemIconProps): ReactElement => (\n <Icon\n size=\"md\"\n className={cx('mx-md', className)}\n style={{ gridArea: 'icon', ...rest.style }}\n {...rest}\n >\n {children}\n </Icon>\n)\n\nSnackbarItemIcon.displayName = 'Snackbar.ItemIcon'\n","/* eslint-disable complexity */\nimport { type RefObject, useEffect, useRef, useState } from 'react'\n\ninterface SwipeArgs<T> {\n swipeRef: RefObject<T | null>\n onSwipeStart?: ({ state, direction }: SwipeReturn) => void\n onSwipeMove?: ({ state, direction }: SwipeReturn) => void\n onSwipeCancel?: ({ state, direction }: SwipeReturn) => void\n onSwipeEnd?: ({ state, direction }: SwipeReturn) => void\n threshold?: number\n}\n\ninterface SwipeReturn {\n state?: 'start' | 'move' | 'cancel' | 'end'\n direction?: 'up' | 'down' | 'right' | 'left' | null\n}\n\nconst SWIPE_THRESHOLD = 75\n\nexport const useSwipe = <T extends HTMLElement>({\n swipeRef,\n onSwipeStart,\n onSwipeMove,\n onSwipeCancel,\n onSwipeEnd,\n threshold = 10,\n}: SwipeArgs<T>): SwipeReturn => {\n const [state, setState] = useState<SwipeReturn['state']>()\n\n const direction = useRef<SwipeReturn['direction']>(null)\n const origin = useRef<Record<'x' | 'y', number> | null>(null)\n const delta = useRef<Record<'x' | 'y', number> | null>(null)\n\n const handleSwipeStart = (evt: PointerEvent) => {\n origin.current = { x: evt.clientX, y: evt.clientY }\n\n /**\n * Prevents unwanted text selection in Safari browser (longpress)\n */\n document.addEventListener('selectstart', e => e.preventDefault())\n }\n\n const handleSwipeMove = (evt: PointerEvent) => {\n if (!origin.current) return\n\n const deltaX = Math.abs(evt.clientX - origin.current.x)\n const deltaY = Math.abs(evt.clientY - origin.current.y)\n\n let moveState: SwipeReturn['state']\n\n if (deltaX > deltaY && deltaX > threshold) {\n direction.current = evt.clientX > origin.current.x ? 'right' : 'left'\n } else if (deltaY > threshold) {\n direction.current = evt.clientY > origin.current.y ? 'down' : 'up'\n }\n\n /**\n * If no direction could be defined, then no move should be handled.\n * This is particularly true with trackpads working with MacOS/Windows.\n */\n if (!direction.current) return\n\n if (!delta.current) {\n moveState = 'start'\n delta.current = { x: deltaX, y: deltaY }\n onSwipeStart?.({ state: moveState, direction: direction.current })\n } else {\n moveState = 'move'\n delta.current = { x: deltaX, y: deltaY }\n ;(swipeRef.current as T).style.setProperty(\n '--swipe-position-x',\n `${deltaX > deltaY ? evt.clientX - origin.current.x : 0}px`\n )\n ;(swipeRef.current as T).style.setProperty(\n '--swipe-position-y',\n `${!(deltaX > deltaY) ? evt.clientY - origin.current.y : 0}px`\n )\n onSwipeMove?.({ state: moveState, direction: direction.current })\n }\n\n setState(moveState)\n }\n\n const handleSwipeEnd = () => {\n const proxyDelta = delta.current\n\n origin.current = null\n delta.current = null\n\n if (proxyDelta) {\n const { x: deltaX, y: deltaY } = proxyDelta\n\n let endState: SwipeReturn['state']\n\n if (deltaX > deltaY) {\n if (deltaX > SWIPE_THRESHOLD) {\n endState = 'end'\n onSwipeEnd?.({ state: endState, direction: direction.current })\n } else {\n endState = 'cancel'\n onSwipeCancel?.({ state: endState, direction: direction.current })\n }\n } else {\n if (deltaY > SWIPE_THRESHOLD) {\n endState = 'end'\n onSwipeEnd?.({ state: endState, direction: direction.current })\n } else {\n endState = 'cancel'\n onSwipeCancel?.({ state: endState, direction: direction.current })\n }\n }\n\n setState(endState)\n\n /**\n * Prevents unwanted text selection in Safari browser (longpress)\n */\n document.removeEventListener('selectstart', e => e.preventDefault())\n }\n }\n\n useEffect(() => {\n if (!swipeRef.current) return\n\n const swipeElement = swipeRef.current\n\n swipeElement.addEventListener('pointerdown', handleSwipeStart)\n document.addEventListener('pointermove', handleSwipeMove)\n document.addEventListener('pointerup', handleSwipeEnd)\n\n return () => {\n swipeElement.removeEventListener('pointerdown', handleSwipeStart)\n document.removeEventListener('pointermove', handleSwipeMove)\n document.removeEventListener('pointerup', handleSwipeEnd)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return {\n state,\n direction: direction.current,\n }\n}\n","import { cva, VariantProps } from 'class-variance-authority'\n\nexport const snackbarRegionVariant = cva(\n [\n 'fixed inset-x-lg z-toast group',\n 'outline-hidden pointer-events-none',\n 'grid grid-rows-1 grid-cols-1 gap-lg',\n ],\n {\n variants: {\n /**\n * Set snackbar item position\n * @default 'bottom'\n */\n position: {\n top: 'top-lg justify-items-center',\n 'top-right': 'top-lg justify-items-end',\n 'top-left': 'top-lg justify-items-start',\n bottom: 'bottom-lg justify-items-center',\n 'bottom-right': 'bottom-lg justify-items-end',\n 'bottom-left': 'bottom-lg justify-items-start',\n },\n },\n defaultVariants: {\n position: 'bottom',\n },\n }\n)\n\nexport type SnackbarRegionVariantProps = VariantProps<typeof snackbarRegionVariant>\n","import { type RefObject, useCallback, useSyncExternalStore } from 'react'\n\ninterface UseSnackbarGlobalStoreArgs<T> {\n providers: Set<T>\n subscriptions: Set<() => void>\n}\n\ninterface UseSnackbarGlobalStoreReturn<T> {\n provider: T\n addProvider: (ref: T) => void\n deleteProvider: (ref: T) => void\n}\n\n/**\n * This hook is a basic abstraction of useSyncExternalStore hook which allows us\n * to consume data from an external data store.\n *\n * Cf. https://react.dev/reference/react/useSyncExternalStore#subscribing-to-an-external-store\n */\n\nexport const useSnackbarGlobalStore = <T = RefObject<HTMLDivElement | null>>({\n providers,\n subscriptions,\n}: UseSnackbarGlobalStoreArgs<T>): UseSnackbarGlobalStoreReturn<T> => {\n const subscribe = useCallback(\n (listener: () => void) => {\n subscriptions.add(listener)\n\n return () => subscriptions.delete(listener)\n },\n [subscriptions]\n )\n\n const getLastSnackbarProvider = useCallback(() => [...providers].reverse()[0] as T, [providers])\n\n const addProvider = useCallback(\n (provider: T) => {\n providers.add(provider)\n\n for (const subscribeFn of subscriptions) {\n subscribeFn()\n }\n },\n [providers, subscriptions]\n )\n\n const deleteProvider = useCallback(\n (provider: T) => {\n providers.delete(provider)\n\n for (const subscribeFn of subscriptions) {\n subscribeFn()\n }\n },\n [providers, subscriptions]\n )\n\n const provider = useSyncExternalStore(subscribe, getLastSnackbarProvider, getLastSnackbarProvider)\n\n return {\n provider,\n addProvider,\n deleteProvider,\n }\n}\n","import {\n addSnackbar,\n type AddSnackbarArgs,\n clearSnackbarQueue,\n Snackbar as Root,\n type SnackbarProps,\n} from './Snackbar'\nimport { SnackbarItem as Item, type SnackbarItemProps } from './SnackbarItem'\nimport {\n SnackbarItemAction as ItemAction,\n type SnackbarItemActionProps,\n} from './SnackbarItemAction'\nimport { SnackbarItemClose as ItemClose, type SnackbarItemCloseProps } from './SnackbarItemClose'\nimport { SnackbarItemIcon as ItemIcon, type SnackbarItemIconProps } from './SnackbarItemIcon'\n\nexport const Snackbar: typeof Root & {\n Item: typeof Item\n ItemAction: typeof ItemAction\n ItemClose: typeof ItemClose\n ItemIcon: typeof ItemIcon\n} = Object.assign(Root, {\n Item,\n ItemAction,\n ItemClose,\n ItemIcon,\n})\n\nSnackbar.displayName = 'Snackbar'\nItem.displayName = 'Snackbar.Item'\nItemAction.displayName = 'Snackbar.ItemAction'\nItemClose.displayName = 'Snackbar.ItemClose'\nItemIcon.displayName = 'Snackbar.ItemIcon'\n\nexport type {\n SnackbarProps,\n SnackbarItemProps,\n SnackbarItemActionProps,\n SnackbarItemCloseProps,\n SnackbarItemIconProps,\n AddSnackbarArgs,\n}\nexport { addSnackbar, clearSnackbarQueue }\n"],"mappings":"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","names":["useEffect","useRef","cloneElement","useRef","useRef","cx","jsx","cx","cx","jsx","cx","jsx","useRef","cva","jsx","useRef","cloneElement","useCallback","provider","jsx","useRef","useEffect","Snackbar"]}