@yourbestsoft/studio-screen-ui-kit 0.0.12 → 0.0.13

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolIconButton-BeXfpEJ7.js","sources":["../src/components/button/Button.tsx","../src/components/card/Card.tsx","../src/hooks/useKeyboardControls.ts","../src/hooks/useOutsideClick.ts","../src/hooks/useEscapeKey.ts","../src/hooks/useWindowEvents.ts","../src/components/drop-down/hooks/useDropdownPosition.ts","../src/components/drop-down/hooks/useDropDownStack.ts","../src/components/drop-down/DropDown.tsx","../src/components/dialog/Dialog.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/switcher-buttons/SwitcherButtons.tsx","../src/components/table/Table.tsx","../src/components/text-field/text-field.tsx","../src/features/theme-provider/ThemeProvider.tsx","../src/components/toolbar/tool-icon-button/ToolIconButton.tsx"],"sourcesContent":["import classNames from 'classnames'\nimport {\n ComponentPropsWithoutRef,\n ElementRef,\n ElementType,\n ForwardedRef,\n ReactNode,\n forwardRef,\n} from 'react'\n\nimport { Replace } from '../../utils'\nimport s from './button.module.scss'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'text'\ntype OwnProps<T extends ElementType> = {\n children?: ReactNode\n className?: string\n component?: T\n disabled?: boolean\n fullWidth?: boolean\n variant?: ButtonVariant\n icon?: ReactNode\n shortcut?: string\n}\n\nexport type ButtonProps<T extends ElementType> = Replace<\n ComponentPropsWithoutRef<T>,\n OwnProps<T>\n>\n\ntype ButtonRenderType = {\n (\n props: ButtonProps<'button'>,\n ref?: ForwardedRef<ElementRef<'button'>>\n ): ReactNode\n (\n props: ButtonProps<ElementType>,\n ref?: ForwardedRef<ElementRef<ElementType>>\n ): ReactNode\n}\n\nexport type ButtonComponent = {\n <T extends ElementType = 'button'>(\n props: ButtonProps<T> & { ref?: ForwardedRef<ElementRef<T>> }\n ): ReactNode\n}\n\nexport const ButtonRender: ButtonRenderType = (\n {\n children,\n className,\n component: Component = 'button',\n disabled,\n fullWidth,\n icon,\n shortcut,\n variant = 'primary',\n ...props\n },\n ref\n) => {\n const content = (\n <div className={s.buttonWithIcon}>\n <div className={s.content}>\n {icon}\n {children}\n </div>\n <div className={s.shortcut}>{shortcut}</div>\n </div>\n )\n\n return (\n <Component\n className={classNames(\n s[variant],\n fullWidth && s.fullWidth,\n disabled && s.disabled,\n icon && s.icon,\n className\n )}\n children={icon ? content : children}\n disabled={disabled}\n ref={ref}\n {...props}\n />\n )\n}\n\nexport const Button: ButtonComponent = forwardRef(ButtonRender)\n","import classNames from 'classnames'\nimport { ComponentPropsWithoutRef, ElementRef, forwardRef } from 'react'\n\nimport s from './card.module.scss'\n\nexport type CardProps = ComponentPropsWithoutRef<'div'>\n\nexport const CardRoot = forwardRef<ElementRef<'div'>, CardProps>(\n ({ className, ...props }, ref) => (\n <div className={classNames(s.root, className)} ref={ref} {...props} />\n )\n)\n\nexport type CardContentProps = CardProps & { ignoreHeader?: boolean }\n\nexport const CardContent = forwardRef<ElementRef<'div'>, CardContentProps>(\n ({ className, ignoreHeader, ...props }, ref) => (\n <div\n className={classNames(\n s.content,\n !ignoreHeader && s.contentAfterHeader,\n className\n )}\n ref={ref}\n {...props}\n />\n )\n)\n\nexport const CardHeader = forwardRef<ElementRef<'div'>, CardProps>(\n ({ className, ...props }, ref) => (\n <div className={classNames(s.header, className)} ref={ref} {...props} />\n )\n)\n\nexport const Card = Object.assign(CardRoot, {\n Content: CardContent,\n Header: CardHeader,\n Root: CardRoot,\n})\n","import { useEffect } from 'react'\n\ntype KeyHandler = (event: KeyboardEvent) => void\n\ninterface KeyboardControlsOptions {\n enabled?: boolean\n preventDefault?: boolean\n stopPropagation?: boolean\n}\n\nexport const useKeyboardControls = (\n handlers: KeyHandler[],\n options: KeyboardControlsOptions = {}\n) => {\n const {\n enabled = true,\n preventDefault = false,\n stopPropagation = false,\n } = options\n\n useEffect(() => {\n if (!enabled) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (preventDefault) event.preventDefault()\n if (stopPropagation) event.stopPropagation()\n\n handlers.forEach((handler) => handler(event))\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [handlers, enabled, preventDefault, stopPropagation])\n}\n\n// Удобные хелперы для создания handlers\nexport const createKeyHandler = (\n key: string,\n callback: (event: KeyboardEvent) => void,\n options: {\n ctrlKey?: boolean\n shiftKey?: boolean\n altKey?: boolean\n metaKey?: boolean\n } = {}\n): KeyHandler => {\n return (event: KeyboardEvent) => {\n const {\n ctrlKey = false,\n shiftKey = false,\n altKey = false,\n metaKey = false,\n } = options\n\n if (\n event.key === key &&\n event.ctrlKey === ctrlKey &&\n event.shiftKey === shiftKey &&\n event.altKey === altKey &&\n event.metaKey === metaKey\n ) {\n callback(event)\n }\n }\n}\n\nexport const createEscapeHandler = (callback: () => void): KeyHandler => {\n return createKeyHandler('Escape', callback)\n}\n\n// Хелпер для создания tab trap handler\nexport const createTabTrapHandler = (\n containerRef: React.RefObject<HTMLElement>,\n enabled: boolean = true\n): KeyHandler => {\n return (event: KeyboardEvent) => {\n if (!enabled || event.key !== 'Tab' || !containerRef.current) return\n\n const focusableElements = containerRef.current.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n const firstElement = focusableElements[0] as HTMLElement\n const lastElement = focusableElements[\n focusableElements.length - 1\n ] as HTMLElement\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault()\n lastElement?.focus()\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault()\n firstElement?.focus()\n }\n }\n }\n}\n","import { useEffect } from 'react'\n\nexport const useOutsideClick = (\n ref: React.RefObject<HTMLElement>,\n handler: () => void,\n enabled: boolean\n) => {\n useEffect(() => {\n if (!enabled) return\n\n const handleClickOutside = (event: MouseEvent) => {\n if (ref.current && !ref.current.contains(event.target as Node)) {\n handler()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [ref, handler, enabled])\n}\n","import { useEffect } from 'react'\n\nexport const useEscapeKey = (\n handler: () => void,\n enabled: boolean,\n shouldHandle: () => boolean\n) => {\n useEffect(() => {\n if (!enabled) return\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && shouldHandle()) {\n handler()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [handler, enabled, shouldHandle])\n}\n","import { useEffect } from 'react'\n\nexport const useWindowEvents = (\n handler: () => void,\n onScroll: () => void,\n enabled: boolean\n) => {\n useEffect(() => {\n if (!enabled) return\n\n window.addEventListener('resize', handler)\n window.addEventListener('scroll', onScroll, true)\n\n return () => {\n window.removeEventListener('resize', handler)\n window.removeEventListener('scroll', onScroll, true)\n }\n }, [handler, onScroll, enabled])\n}\n","import { useCallback, useLayoutEffect, useState } from 'react'\n\ninterface Position {\n top: number\n left: number\n}\n\ninterface CalculatedPosition extends Position {\n vertical: 'top' | 'bottom'\n horizontal: 'left' | 'center' | 'right'\n}\n\nexport const useDropdownPosition = (\n contentRef: React.RefObject<HTMLDivElement>,\n visible: boolean,\n horizontal: 'left' | 'center' | 'right',\n vertical: 'top' | 'bottom',\n offset: number\n) => {\n const [position, setPosition] = useState<CalculatedPosition>({\n horizontal,\n left: 0,\n top: 0,\n vertical,\n })\n\n const calculatePosition = useCallback(() => {\n const content = contentRef.current\n const trigger = content?.parentElement\n\n if (!content || !trigger) return\n\n const triggerRect = trigger.getBoundingClientRect()\n const contentRect = content.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n const padding = 16\n\n let finalVertical = vertical\n let finalHorizontal = horizontal\n let top = 0\n let left = 0\n\n const spaceBelow = viewportHeight - triggerRect.bottom\n const spaceAbove = triggerRect.top\n\n if (vertical === 'bottom') {\n if (spaceBelow >= contentRect.height + offset + padding) {\n finalVertical = 'bottom'\n top = triggerRect.bottom + offset - padding / 2\n } else if (spaceAbove >= contentRect.height + offset + padding) {\n finalVertical = 'top'\n top = triggerRect.top - contentRect.height - offset\n } else {\n // Контент не помещается — сделать maxHeight\n finalVertical = spaceBelow > spaceAbove ? 'bottom' : 'top'\n top =\n finalVertical === 'bottom'\n ? triggerRect.bottom + offset\n : triggerRect.top - contentRect.height - offset\n }\n } else {\n if (spaceAbove >= contentRect.height + offset + padding) {\n finalVertical = 'top'\n top = triggerRect.top - contentRect.height - offset - padding / 2\n } else if (spaceBelow >= contentRect.height + offset + padding) {\n finalVertical = 'bottom'\n top = triggerRect.bottom + offset - padding / 2\n } else {\n finalVertical = spaceAbove > spaceBelow ? 'top' : 'bottom'\n top =\n finalVertical === 'top'\n ? triggerRect.top - contentRect.height - offset\n : triggerRect.bottom + offset - padding / 2\n }\n }\n\n if (horizontal === 'left') {\n left = triggerRect.left\n if (left + contentRect.width > viewportWidth - padding) {\n left = viewportWidth - contentRect.width - padding\n finalHorizontal = 'right'\n }\n if (left < padding) {\n left = padding\n finalHorizontal = 'left'\n }\n } else if (horizontal === 'right') {\n left = triggerRect.right - contentRect.width\n if (left < padding) {\n left = padding\n finalHorizontal = 'left'\n }\n if (left + contentRect.width > viewportWidth - padding) {\n left = viewportWidth - contentRect.width - padding\n finalHorizontal = 'right'\n }\n } else {\n left = triggerRect.left + (triggerRect.width - contentRect.width) / 2\n if (left < padding) {\n left = padding\n finalHorizontal = 'left'\n } else if (left + contentRect.width > viewportWidth - padding) {\n left = viewportWidth - contentRect.width - padding\n finalHorizontal = 'right'\n }\n }\n\n top = Math.max(\n padding,\n Math.min(top, viewportHeight - contentRect.height - padding)\n )\n\n setPosition({\n horizontal: finalHorizontal,\n left,\n top,\n vertical: finalVertical,\n })\n }, [contentRef, vertical, horizontal, offset])\n\n useLayoutEffect(() => {\n if (!visible) return\n calculatePosition()\n }, [visible, calculatePosition])\n\n return { calculatePosition, position }\n}\n","import { useCallback, useEffect } from 'react'\n\nconst openDropDownStack: HTMLElement[] = []\n\nexport const useDropDownStack = (\n rootRef: React.RefObject<HTMLElement>,\n visible: boolean\n) => {\n useEffect(() => {\n if (visible && rootRef.current) {\n openDropDownStack.push(rootRef.current)\n return () => {\n const index = openDropDownStack.indexOf(rootRef.current!)\n if (index !== -1) {\n openDropDownStack.splice(index, 1)\n }\n }\n }\n }, [visible, rootRef])\n\n const isTopOfStack = useCallback(() => {\n if (!rootRef.current) return false\n return openDropDownStack[openDropDownStack.length - 1] === rootRef.current\n }, [rootRef])\n\n return { isTopOfStack }\n}\n","import classNames from 'classnames'\nimport {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\n\nimport { useEscapeKey, useOutsideClick, useWindowEvents } from '../../hooks'\nimport styles from './drop-down.module.scss'\nimport { useDropdownPosition } from './hooks'\nimport { useDropDownStack } from './hooks/useDropDownStack'\n\ninterface DropDownContextType {\n visible: boolean\n toggle: () => void\n close: () => void\n}\n\nconst DropDownContext = createContext<DropDownContextType | undefined>(\n undefined\n)\n\nconst useDropDownContext = () => {\n const context = useContext(DropDownContext)\n if (!context) {\n throw new Error('useDropDownContext must be used within a DropDown.Root')\n }\n return context\n}\ninterface RootProps {\n children: ReactNode\n defaultVisible?: boolean\n closeOnOutsideClick?: boolean\n closeOnEsc?: boolean\n}\n\nconst Root = ({\n children,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n defaultVisible = false,\n}: RootProps) => {\n const [visible, setVisible] = useState(defaultVisible)\n const rootRef = useRef<HTMLDivElement>(null)\n\n const close = useCallback(() => {\n setVisible(false)\n }, [])\n\n const toggle = useCallback(() => {\n setVisible((prev) => !prev)\n }, [])\n\n const { isTopOfStack } = useDropDownStack(rootRef, visible)\n\n useOutsideClick(rootRef, close, closeOnOutsideClick && visible)\n\n useEscapeKey(close, closeOnEsc && visible, isTopOfStack)\n\n return (\n <DropDownContext.Provider value={{ close, toggle, visible }}>\n <div ref={rootRef} className={styles.root}>\n {children}\n </div>\n </DropDownContext.Provider>\n )\n}\n\ninterface TriggerProps {\n children: ReactNode\n}\n\nconst Trigger = ({ children }: TriggerProps) => {\n const { toggle } = useDropDownContext()\n return <div onClick={toggle}>{children}</div>\n}\n\ninterface ContentProps {\n children: ReactNode\n horizontal?: 'left' | 'center' | 'right'\n vertical?: 'top' | 'bottom'\n className?: string\n offset?: number\n}\n\nconst Content = ({\n children,\n className,\n horizontal = 'left',\n offset = 8,\n vertical = 'bottom',\n}: ContentProps) => {\n const { close, visible } = useDropDownContext()\n const contentRef = useRef<HTMLDivElement>(null)\n const { calculatePosition, position } = useDropdownPosition(\n contentRef,\n visible,\n horizontal,\n vertical,\n offset\n )\n\n useEffect(() => {\n const content = contentRef.current\n if (!content) return\n const observer = new ResizeObserver(() => calculatePosition())\n observer.observe(content)\n return () => observer.disconnect()\n }, [calculatePosition])\n\n useWindowEvents(calculatePosition, close, visible)\n\n if (!visible) return null\n\n return (\n <div\n ref={contentRef}\n className={classNames(styles.dropdownContent, className)}\n style={{\n left: `${position.left}px`,\n maxWidth: 'calc(100vw - 32px)',\n minWidth: '150px',\n // при необходимости:\n overflowY: 'auto',\n top: `${position.top}px`,\n }}\n >\n {children}\n </div>\n )\n}\n\ninterface CloseProps {\n children: ReactNode\n onClick?: (event: React.MouseEvent) => void\n}\n\nconst Close = ({ children, onClick }: CloseProps) => {\n const { close } = useDropDownContext()\n\n const handleClick = useCallback(\n (event: React.MouseEvent) => {\n if (onClick) {\n onClick(event)\n }\n close()\n },\n [onClick, close]\n )\n\n return <div onClick={handleClick}>{children}</div>\n}\n\nexport const DropDown = { Close, Content, Root, Trigger }\n","import classNames from 'classnames'\nimport React, {\n useState,\n useRef,\n ReactNode,\n forwardRef,\n MouseEvent,\n ElementType,\n useContext,\n useEffect,\n} from 'react'\n\nimport styles from './dialog.module.scss'\nimport {\n createEscapeHandler,\n createTabTrapHandler,\n useKeyboardControls,\n} from '../../hooks'\n\ninterface RootProps {\n children: React.ReactNode\n isOpen?: boolean\n onStateChange?: (isOpen: boolean) => void\n}\n\ninterface DialogContextProps {\n dialogRef: React.RefObject<HTMLDivElement>\n isOpen: boolean\n setIsOpen: (state: boolean) => void\n}\nconst DialogContext = React.createContext<DialogContextProps | null>(null)\n\nconst Root = ({\n children,\n isOpen: externalIsOpen,\n onStateChange,\n}: RootProps) => {\n const dialogRef = useRef<HTMLDivElement | null>(null)\n const [internalIsOpen, setInternalIsOpen] = useState(false)\n\n const isOpen = externalIsOpen !== undefined ? externalIsOpen : internalIsOpen\n const setIsOpen = (state: boolean) => {\n if (externalIsOpen === undefined) {\n setInternalIsOpen(state)\n }\n if (onStateChange) {\n onStateChange(state)\n }\n }\n\n const keyboardHandlers = [\n createEscapeHandler(() => setIsOpen(false)),\n createTabTrapHandler(dialogRef, isOpen),\n ]\n\n useKeyboardControls(keyboardHandlers, { enabled: isOpen })\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden'\n } else {\n document.body.style.overflow = 'unset'\n }\n\n return () => {\n document.body.style.overflow = 'unset'\n }\n }, [isOpen])\n\n useEffect(() => {\n if (isOpen && dialogRef.current) {\n const focusableElements = dialogRef.current.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n )\n const firstElement = focusableElements[0] as HTMLElement\n if (firstElement) {\n firstElement.focus()\n }\n }\n }, [isOpen])\n\n return (\n <DialogContext.Provider value={{ dialogRef, isOpen, setIsOpen }}>\n <div>{children}</div>\n </DialogContext.Provider>\n )\n}\n\ninterface TriggerProps<T extends ElementType = 'button'> {\n as?: T\n children: ReactNode\n}\n\nconst Trigger = <T extends ElementType = 'button'>({\n as,\n children,\n ...props\n}: TriggerProps<T> & React.ComponentPropsWithoutRef<T>) => {\n const context = useContext(DialogContext)\n if (!context) throw new Error('Trigger must be used within a Dialog.Root')\n\n const { setIsOpen } = context\n const Component = as || 'button'\n\n const handleClick = () => {\n setIsOpen(true)\n }\n\n return (\n <Component\n onClick={handleClick}\n {...props}\n className={styles.dialogTrigger}\n role={as && as !== 'button' ? 'button' : undefined}\n >\n {children}\n </Component>\n )\n}\n\ninterface ContentProps {\n children: ReactNode\n classNameOverlay?: string\n className?: string\n closeOnBackdropClick?: boolean\n}\n\nconst Content = forwardRef<HTMLDivElement, ContentProps>(\n (\n { children, classNameOverlay, className, closeOnBackdropClick = true },\n _\n ) => {\n const context = useContext(DialogContext)\n if (!context) throw new Error('Content must be used within a Dialog.Root')\n\n const { dialogRef, isOpen, setIsOpen } = context\n\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n setIsOpen(false)\n }\n }\n\n if (!isOpen) return null\n\n return (\n <div\n ref={dialogRef}\n className={classNames(styles.dialogOverlay, classNameOverlay)}\n onClick={handleBackdropClick}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n className={classNames(styles.dialogContent, className)}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n )\n }\n)\n\ninterface CloseProps<T extends ElementType = 'button'> {\n as?: T\n children?: ReactNode\n}\n\nconst Close = <T extends ElementType = 'button'>({\n as,\n children,\n ...props\n}: CloseProps<T> & React.ComponentPropsWithoutRef<T>) => {\n const context = useContext(DialogContext)\n if (!context) throw new Error('Close must be used within a Dialog.Root')\n\n const { setIsOpen } = context\n const Component = as || 'button'\n\n const handleClick = () => {\n setIsOpen(false)\n }\n\n return (\n <Component\n onClick={handleClick}\n {...props}\n className={classNames(styles.dialogClose, props.className)}\n role={as && as !== 'button' ? 'button' : undefined}\n >\n {children}\n </Component>\n )\n}\n\ninterface TitleProps {\n children: ReactNode\n className?: string\n}\n\nconst Title = ({ children, className }: TitleProps) => {\n return (\n <h2 className={classNames(styles.dialogTitle, className)}>{children}</h2>\n )\n}\n\ninterface SeparatorProps {}\n\nconst Separator = ({}: SeparatorProps) => {\n return <div className={styles.dialogSeparator} />\n}\n\nexport const Dialog = {\n Close,\n Content,\n Root,\n Separator,\n Title,\n Trigger,\n}\n","import classNames from 'classnames'\nimport {\n createContext,\n MouseEvent,\n ReactNode,\n useContext,\n useEffect,\n useRef,\n} from 'react'\n\nimport styles from './sidebar.module.scss'\n\ntype SidebarContextProps = {\n isOpen: boolean\n setIsOpen: (isOpen: boolean) => void\n}\n\nexport const SidebarContext = createContext<SidebarContextProps | undefined>(\n undefined\n)\n\nexport const useSidebarContext = () => {\n const context = useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebarContext must be used within a SidebarProvider')\n }\n return context\n}\n\ntype SidebarRootProps = {\n isOpen: boolean\n setIsOpen: (isOpen: boolean) => void\n children: ReactNode\n}\n\nconst Root = ({ children, isOpen, setIsOpen }: SidebarRootProps) => {\n return (\n <SidebarContext.Provider\n value={{\n isOpen: isOpen,\n setIsOpen: () => setIsOpen(!isOpen),\n }}\n >\n {children}\n </SidebarContext.Provider>\n )\n}\n\ntype SidebarTriggerProps = {\n children: ReactNode\n}\n\nconst Trigger = ({ children }: SidebarTriggerProps) => {\n const { setIsOpen } = useSidebarContext()\n\n const onClickHandler = (event: MouseEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsOpen(true)\n }\n\n return (\n <div className={styles.trigger} onClick={onClickHandler}>\n {children}\n </div>\n )\n}\n\ntype SidebarContentProps = {\n position?: 'left' | 'right' | 'bottom' | 'top'\n children: ReactNode\n className?: string\n closeOnOutsideClick?: boolean\n}\n\nconst Content = ({\n children,\n className,\n closeOnOutsideClick = true,\n position = 'right',\n}: SidebarContentProps) => {\n const { isOpen, setIsOpen } = useSidebarContext()\n const contentRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!closeOnOutsideClick) return\n\n const handleClickOutside = (event: Event) => {\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, setIsOpen, closeOnOutsideClick])\n\n return (\n <div\n ref={contentRef}\n className={classNames(\n styles[position],\n styles.content,\n {\n [styles.close]: !isOpen,\n [styles.open]: isOpen,\n },\n className\n )}\n >\n {children}\n </div>\n )\n}\n\ntype SidebarCloseProps = {\n children: ReactNode\n}\n\nconst Close = ({ children }: SidebarCloseProps) => {\n const { setIsOpen } = useSidebarContext()\n\n const onClickHandler = (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault()\n setIsOpen(false)\n }\n\n return (\n <button className={styles.close} onClick={onClickHandler}>\n {children}\n </button>\n )\n}\n\nexport const Sidebar = {\n Close,\n Content,\n Root,\n Trigger,\n}\n","import classNames from 'classnames'\nimport React, { ElementType, forwardRef, ReactNode, useState } from 'react'\n\nimport style from './switcher-buttons.module.scss'\n\ninterface ComponentValues {\n value: string\n [key: string]: any\n}\n\ninterface SwitcherProps {\n componentValues: ComponentValues[]\n defaultValue?: string\n onChange?: (value: string) => void\n selectedValue?: string\n component: ElementType\n containerProps?: React.HTMLAttributes<HTMLDivElement>\n slot?: ReactNode\n className?: string\n}\n\nexport const SwitcherButtons = forwardRef<HTMLDivElement, SwitcherProps>(\n (\n {\n className,\n component: Component,\n componentValues,\n containerProps,\n onChange,\n selectedValue,\n slot,\n },\n ref\n ) => {\n const [activeValue, setActiveValue] = useState<string>(\n selectedValue || componentValues[0].value\n )\n\n const onChangeHandler = (value: string) => {\n setActiveValue(value)\n if (onChange) onChange(value)\n }\n\n return (\n <div ref={ref} className={style.switcher} {...containerProps}>\n <div className={classNames(style.buttons, className)}>\n {componentValues.map((button, index) => (\n <Component\n key={index}\n {...button}\n selected={activeValue === button.value}\n onClick={() => onChangeHandler(button.value)}\n />\n ))}\n </div>\n {slot && (\n <>\n <div className={style.separator} />\n {slot}\n </>\n )}\n </div>\n )\n }\n)\n","import classNames from 'classnames'\nimport { FocusEventHandler, MouseEventHandler, ReactNode } from 'react'\n\nimport s from './table.module.scss'\n\ninterface Props {\n children: ReactNode\n className?: string\n}\n\ntype RootProps = Props\nconst Root = ({ children, className }: RootProps) => {\n return <table className={classNames(s.root, className)}>{children}</table>\n}\n\ntype CaptionProps = Props\nconst Caption = ({ children, className }: CaptionProps) => {\n return (\n <caption className={classNames(s.caption, className)}>{children}</caption>\n )\n}\n\ntype HeaderProps = Props\nconst Header = ({ children, className }: HeaderProps) => {\n return <thead className={classNames(s.header, className)}>{children}</thead>\n}\n\ninterface RowProps extends Props {\n onClick?: MouseEventHandler<HTMLTableRowElement> | undefined\n onDoubleClick?: MouseEventHandler<HTMLTableRowElement> | undefined\n onBlur?: FocusEventHandler<HTMLTableRowElement> | undefined\n}\nconst Row = ({\n children,\n className,\n onBlur,\n onClick,\n onDoubleClick,\n}: RowProps) => {\n return (\n <tr\n className={classNames(s.row, className)}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onBlur={onBlur}\n >\n {children}\n </tr>\n )\n}\n\ntype HeadProps = Props\nconst Head = ({ children, className }: HeadProps) => {\n return <th className={classNames(s.head, className)}>{children}</th>\n}\n\ntype BodyProps = Props\nconst Body = ({ children, className }: BodyProps) => {\n return <tbody className={classNames(s.body, className)}>{children}</tbody>\n}\n\ntype CellProps = Props\nconst Cell = ({ children, className }: CellProps) => {\n return <td className={classNames(s.cell, className)}>{children}</td>\n}\n\ntype FooterProps = Props\nconst Footer = ({ children, className }: FooterProps) => {\n return <tfoot className={classNames(s.footer, className)}>{children}</tfoot>\n}\n\nexport const Table = Object.assign(Root, {\n Body,\n Caption,\n Cell,\n Footer,\n Head,\n Header,\n Root,\n Row,\n})\n","import classNames from 'classnames'\nimport { X, Eye, Search, EyeOff } from 'lucide-react'\nimport {\n ChangeEvent,\n ForwardedRef,\n ReactNode,\n forwardRef,\n useState,\n} from 'react'\n\nimport s from './text-field.module.scss'\n\ntype SharedProps = {\n className?: string\n disabled?: boolean\n error?: string\n label?: string\n onBlur?: () => void\n onChange: (value: string) => void\n onFocus?: () => void\n placeholder?: string\n required?: boolean\n type?: 'text' | 'password' | 'email' | 'url' | string\n value: string\n}\n\nexport type TextFieldProps =\n | (SharedProps & {\n as?: 'input'\n inputType?: 'password' | 'search' | 'text'\n })\n | (SharedProps & { as: 'textarea' })\n\nexport type TextFieldComponent = {\n (\n props: Extract<TextFieldProps, { as: 'textarea' }> & {\n ref?: ForwardedRef<HTMLTextAreaElement>\n }\n ): ReactNode\n (\n props: Extract<TextFieldProps, { as?: 'input' }> & {\n ref?: ForwardedRef<HTMLInputElement>\n }\n ): ReactNode\n}\n\nexport const TextField: TextFieldComponent = forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n TextFieldProps\n>(({ className, error, label, onChange, required, ...props }, ref) => {\n const [showPassword, setShowPassword] = useState(false)\n\n const handleChange = (\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => onChange(e.currentTarget.value)\n\n const sharedClassName = classNames(s.input, error && s.error, className)\n let resolvedFragment: ReactNode\n\n if (!props.as || props.as === 'input') {\n const { inputType, ...restProps } = props\n const isSearch = inputType === 'search'\n const isPassword = inputType === 'password'\n const passwordFieldNextType = showPassword ? 'text' : 'password'\n\n resolvedFragment = (\n <>\n <input\n className={classNames(sharedClassName, isSearch && s.inputSearch)}\n onChange={handleChange}\n ref={ref as unknown as ForwardedRef<HTMLInputElement>}\n type={isPassword ? passwordFieldNextType : inputType}\n {...restProps}\n />\n {isPassword &&\n (showPassword ? (\n <Eye\n strokeWidth={2.5}\n width={20}\n className={classNames(s.button, label && s.buttonWithLabel)}\n onClick={() => setShowPassword((prev) => !prev)}\n />\n ) : (\n <EyeOff\n strokeWidth={2.5}\n width={20}\n className={classNames(s.button, label && s.buttonWithLabel)}\n onClick={() => setShowPassword((prev) => !prev)}\n />\n ))}\n {isSearch && props.value && (\n <X\n onClick={() => onChange('')}\n className={classNames(\n s.button,\n label && s.buttonWithLabel,\n s.resetSearchValue\n )}\n strokeWidth={2.5}\n size={24}\n />\n )}\n {isSearch && (\n <Search\n className={classNames(\n s.searchOutline,\n label && s.searchOutlineWithLabel\n )}\n size={20}\n />\n )}\n </>\n )\n }\n\n if (props.as === 'textarea') {\n resolvedFragment = (\n <textarea\n className={sharedClassName}\n onChange={handleChange}\n ref={ref as unknown as ForwardedRef<HTMLTextAreaElement>}\n {...props}\n />\n )\n }\n\n return (\n <div className={s.root}>\n <span className={s.title}>\n {label}\n {required && <span className={s.titleError}>*</span>}\n </span>\n <div className={s.inputContainer}>{resolvedFragment}</div>\n <div className={s.errorMessage}>{error}</div>\n </div>\n )\n})\n","import { createContext, useContext, useState, ReactNode } from 'react'\n\nexport type Theme = 'light' | 'dark'\nexport type ThemeValue = Theme | 'system'\n\ninterface ThemeContextType {\n theme: ThemeValue\n setTheme: (theme: ThemeValue) => void\n}\n\nconst ThemeContext = createContext<ThemeContextType | undefined>(undefined)\n\nexport const ThemeProvider = ({ children }: { children: ReactNode }) => {\n const defaultTheme = getTheme() || 'system'\n const [theme, setTheme] = useState<ThemeValue>(defaultTheme)\n\n return (\n <ThemeContext.Provider value={{ setTheme, theme }}>\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const context = useContext(ThemeContext)\n\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n\n setDataThemeHandler(context.theme)\n\n return context\n}\n\nconst setDataThemeHandler = (value: ThemeValue) => {\n const savedTheme = getTheme()\n\n saveTheme(value || savedTheme)\n}\n\nconst saveTheme = (theme: ThemeValue) => {\n const prefersDarkScheme = window.matchMedia('(prefers-color-scheme: dark)')\n\n if (theme === 'system') {\n const defaultTheme = prefersDarkScheme.matches ? 'dark' : 'light'\n localStorage.setItem('theme', theme)\n setTheme(defaultTheme)\n } else {\n localStorage.setItem('theme', theme)\n setTheme(theme)\n }\n}\n\nconst setTheme = (theme: Theme) => {\n document.documentElement.setAttribute('data-theme', theme)\n}\n\nconst getTheme = () => {\n const theme = localStorage.getItem('theme')\n if (theme) return theme as ThemeValue\n}\n","import classNames from 'classnames'\nimport { ReactNode, forwardRef } from 'react'\n\nimport s from './tool-icon-button.module.scss'\n\nexport type ToolbarSlot = 'icon' | 'keybinding'\nexport type ToolbarClasses = { [P in ToolbarSlot]?: string }\n\ninterface Props {\n title?: string\n icon: ReactNode\n keybinding?: string\n aria_label?: string\n aria_keyshortcuts?: string\n classes?: ToolbarClasses\n name?: string\n id?: string\n isActive?: boolean\n disabled?: boolean\n onClick?: () => void\n}\n\nexport const ToolIconButton = forwardRef<HTMLDivElement, Props>(\n (props, ref) => {\n const { classes, disabled, icon, isActive, keybinding, onClick, title } =\n props\n\n const styles = getClasses(classes, isActive, disabled)\n\n return (\n <label className={s.root} title={title}>\n <div\n className={styles.icon}\n ref={ref}\n tabIndex={disabled ? -1 : 0}\n role=\"button\"\n aria-pressed={isActive}\n aria-disabled={disabled}\n onClick={!disabled ? onClick : undefined}\n >\n {icon}\n </div>\n {keybinding && <span className={styles.keybinding}>{keybinding}</span>}\n </label>\n )\n }\n)\n\nconst getClasses = (\n classes?: ToolbarClasses,\n isActive?: boolean,\n disabled?: boolean\n): Required<ToolbarClasses> => ({\n icon: classNames(\n s.icon,\n {\n [s.active]: isActive,\n [s.disabled]: disabled,\n },\n classes?.icon\n ),\n keybinding: classNames(s.keybinding, classes?.keybinding),\n})\n"],"names":["ButtonRender","children","className","Component","disabled","fullWidth","icon","shortcut","variant","props","ref","content","jsxs","s","jsx","classNames","Button","forwardRef","CardRoot","CardContent","ignoreHeader","CardHeader","Card","useKeyboardControls","handlers","options","enabled","preventDefault","stopPropagation","useEffect","handleKeyDown","event","handler","createKeyHandler","key","callback","ctrlKey","shiftKey","altKey","metaKey","createEscapeHandler","createTabTrapHandler","containerRef","focusableElements","firstElement","lastElement","useOutsideClick","handleClickOutside","useEscapeKey","shouldHandle","useWindowEvents","onScroll","useDropdownPosition","contentRef","visible","horizontal","vertical","offset","position","setPosition","useState","calculatePosition","useCallback","trigger","triggerRect","contentRect","viewportWidth","viewportHeight","padding","finalVertical","finalHorizontal","top","left","spaceBelow","spaceAbove","useLayoutEffect","openDropDownStack","useDropDownStack","rootRef","index","DropDownContext","createContext","useDropDownContext","context","useContext","Root","closeOnEsc","closeOnOutsideClick","defaultVisible","setVisible","useRef","close","toggle","prev","isTopOfStack","styles","Trigger","Content","observer","Close","onClick","handleClick","DropDown","DialogContext","React","externalIsOpen","onStateChange","dialogRef","internalIsOpen","setInternalIsOpen","isOpen","setIsOpen","state","keyboardHandlers","as","classNameOverlay","closeOnBackdropClick","_","handleBackdropClick","e","Title","Separator","Dialog","SidebarContext","useSidebarContext","onClickHandler","Sidebar","SwitcherButtons","componentValues","containerProps","onChange","selectedValue","slot","activeValue","setActiveValue","onChangeHandler","value","style","button","Fragment","Caption","Header","Row","onBlur","onDoubleClick","Head","Body","Cell","Footer","Table","TextField","error","label","required","showPassword","setShowPassword","handleChange","sharedClassName","resolvedFragment","inputType","restProps","isSearch","isPassword","passwordFieldNextType","Eye","EyeOff","X","Search","ThemeContext","ThemeProvider","defaultTheme","getTheme","theme","setTheme","useTheme","setDataThemeHandler","savedTheme","saveTheme","prefersDarkScheme","ToolIconButton","classes","isActive","keybinding","title","getClasses"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FC, SVGProps } from 'react';
2
+ export declare const MoonIcon: FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,2 @@
1
+ import { FC, SVGProps } from 'react';
2
+ export declare const SunIcon: FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,2 @@
1
+ export * from './SunIcon';
2
+ export * from './MoonIcon';
@@ -13,16 +13,16 @@ interface ContentProps {
13
13
  horizontal?: 'left' | 'center' | 'right';
14
14
  vertical?: 'top' | 'bottom';
15
15
  className?: string;
16
- fixedPosition?: boolean;
16
+ offset?: number;
17
17
  }
18
18
  interface CloseProps {
19
19
  children: ReactNode;
20
20
  onClick?: (event: React.MouseEvent) => void;
21
21
  }
22
22
  export declare const DropDown: {
23
- Content: ({ children, className, fixedPosition, horizontal, vertical, }: ContentProps) => import("react/jsx-runtime").JSX.Element | null;
23
+ Close: ({ children, onClick }: CloseProps) => import("react/jsx-runtime").JSX.Element;
24
+ Content: ({ children, className, horizontal, offset, vertical, }: ContentProps) => import("react/jsx-runtime").JSX.Element | null;
24
25
  Root: ({ children, closeOnEsc, closeOnOutsideClick, defaultVisible, }: RootProps) => import("react/jsx-runtime").JSX.Element;
25
26
  Trigger: ({ children }: TriggerProps) => import("react/jsx-runtime").JSX.Element;
26
- Close: ({ children, onClick }: CloseProps) => import("react/jsx-runtime").JSX.Element;
27
27
  };
28
28
  export {};
@@ -0,0 +1 @@
1
+ export { useDropdownPosition } from './useDropdownPosition';
@@ -0,0 +1,3 @@
1
+ export declare const useDropDownStack: (rootRef: React.RefObject<HTMLElement>, visible: boolean) => {
2
+ isTopOfStack: () => boolean;
3
+ };
@@ -0,0 +1,13 @@
1
+ interface Position {
2
+ top: number;
3
+ left: number;
4
+ }
5
+ interface CalculatedPosition extends Position {
6
+ vertical: 'top' | 'bottom';
7
+ horizontal: 'left' | 'center' | 'right';
8
+ }
9
+ export declare const useDropdownPosition: (contentRef: React.RefObject<HTMLDivElement>, visible: boolean, horizontal: "left" | "center" | "right", vertical: "top" | "bottom", offset: number) => {
10
+ calculatePosition: () => void;
11
+ position: CalculatedPosition;
12
+ };
13
+ export {};
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const ThemeToggle: FC;
@@ -0,0 +1 @@
1
+ export * from './ThemeToggle';
@@ -1,2 +1,5 @@
1
1
  export * from './useSelect';
2
2
  export * from './useKeyboardControls';
3
+ export { useOutsideClick } from './useOutsideClick';
4
+ export { useEscapeKey } from './useEscapeKey';
5
+ export { useWindowEvents } from './useWindowEvents';
@@ -0,0 +1 @@
1
+ export declare const useEscapeKey: (handler: () => void, enabled: boolean, shouldHandle: () => boolean) => void;
@@ -0,0 +1 @@
1
+ export declare const useOutsideClick: (ref: React.RefObject<HTMLElement>, handler: () => void, enabled: boolean) => void;
@@ -0,0 +1 @@
1
+ export declare const useWindowEvents: (handler: () => void, onScroll: () => void, enabled: boolean) => void;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { u as J, D as H, B as G, a as Q } from "./ToolIconButton-BezvcpMB.js";
2
- import { b as an, e as ln, c as rn, d as dn, C as hn, f as _n, h as un, S as mn, i as pn, T as gn, j as fn, k as yn, g as kn } from "./ToolIconButton-BezvcpMB.js";
1
+ import { u as J, D as H, B as G, a as Q } from "./ToolIconButton-BeXfpEJ7.js";
2
+ import { b as an, e as ln, c as rn, d as dn, C as hn, f as _n, h as un, S as mn, i as pn, T as gn, j as fn, k as yn, g as kn } from "./ToolIconButton-BeXfpEJ7.js";
3
3
  import { jsx as s, jsxs as g, Fragment as X } from "react/jsx-runtime";
4
4
  import m from "classnames";
5
5
  import { useState as k, useEffect as $, useCallback as M, useRef as O } from "react";
@@ -89,11 +89,72 @@ const ce = "_buttonGroup_ejhd6_1", ae = "_button_ejhd6_1", le = "_label_ejhd6_37
89
89
  children: /* @__PURE__ */ s("p", { className: I.hotkey, style: { color: me(t) }, children: a })
90
90
  }
91
91
  );
92
- }, Ne = "_content_1ybrq_1", xe = "_section_1ybrq_11", we = "_title_1ybrq_17", S = {
93
- content: Ne,
94
- section: xe,
95
- title: we
96
- }, Be = [
92
+ }, Ne = ({
93
+ onSelect: n,
94
+ options: o,
95
+ selectedId: t
96
+ }) => {
97
+ const [e, a] = k(!1), [l, c] = k(null), [i, h] = k(
98
+ t && o.find((u) => u.value === t) || null
99
+ );
100
+ $(() => {
101
+ if (t) {
102
+ const u = o.find((f) => f.value === t);
103
+ h(u || null);
104
+ }
105
+ }, [t, o]);
106
+ const r = M(
107
+ (u) => {
108
+ h(u), n && n(u.value), a(!1), c(null);
109
+ },
110
+ [n]
111
+ ), d = M(
112
+ (u) => {
113
+ if (!e) {
114
+ (u.key === "Enter" || u.key === " ") && (a(!0), c(0));
115
+ return;
116
+ }
117
+ switch (u.key) {
118
+ case "ArrowDown": {
119
+ c(
120
+ (f) => f === null ? 0 : Math.min(f + 1, o.length - 1)
121
+ );
122
+ break;
123
+ }
124
+ case "ArrowUp": {
125
+ c(
126
+ (f) => f === null ? o.length - 1 : Math.max(f - 1, 0)
127
+ );
128
+ break;
129
+ }
130
+ case "Enter": {
131
+ l !== null && r(o[l]);
132
+ break;
133
+ }
134
+ case "Escape": {
135
+ a(!1);
136
+ break;
137
+ }
138
+ }
139
+ },
140
+ [e, l, o, r]
141
+ ), _ = M(() => {
142
+ a(!1), c(null);
143
+ }, []);
144
+ return {
145
+ handleChange: r,
146
+ handleKeyDown: d,
147
+ handleOutsideClick: _,
148
+ highlightedIndex: l,
149
+ isOpen: e,
150
+ selectedItem: i,
151
+ setIsOpen: a
152
+ };
153
+ }, xe = "_content_1ybrq_1", we = "_section_1ybrq_11", Be = "_title_1ybrq_17", S = {
154
+ content: xe,
155
+ section: we,
156
+ title: Be
157
+ }, Se = [
97
158
  {
98
159
  color: "transparent",
99
160
  hotkey: "q",
@@ -169,7 +230,7 @@ const ce = "_buttonGroup_ejhd6_1", ae = "_button_ejhd6_1", le = "_label_ejhd6_37
169
230
  hotkey: "b",
170
231
  name: "red"
171
232
  }
172
- ], Se = ({
233
+ ], Ie = ({
173
234
  colors: n,
174
235
  selectedColor: o,
175
236
  selectedShadeIndex: t
@@ -181,7 +242,7 @@ const ce = "_buttonGroup_ejhd6_1", ae = "_button_ejhd6_1", le = "_label_ejhd6_37
181
242
  index: o?.index ?? 0
182
243
  })), r = (_) => {
183
244
  const u = j(n, _);
184
- console.log(u), c(u), h(Ie(u, i));
245
+ console.log(u), c(u), h(Te(u, i));
185
246
  }, d = (_, u = 999) => {
186
247
  h({ ...W(_, e), index: u });
187
248
  };
@@ -197,71 +258,10 @@ const ce = "_buttonGroup_ejhd6_1", ae = "_button_ejhd6_1", le = "_label_ejhd6_37
197
258
  }, W = (n, o) => ({
198
259
  ...n,
199
260
  color: q(n.color, o)
200
- }), j = (n, o) => n.map((t) => W(t, o)), Ie = (n, o) => ({
261
+ }), j = (n, o) => n.map((t) => W(t, o)), Te = (n, o) => ({
201
262
  ...n[o.index] ?? n[0],
202
263
  index: o.index ?? 0
203
- }), Te = ({
204
- onSelect: n,
205
- options: o,
206
- selectedId: t
207
- }) => {
208
- const [e, a] = k(!1), [l, c] = k(null), [i, h] = k(
209
- t && o.find((u) => u.value === t) || null
210
- );
211
- $(() => {
212
- if (t) {
213
- const u = o.find((f) => f.value === t);
214
- h(u || null);
215
- }
216
- }, [t, o]);
217
- const r = M(
218
- (u) => {
219
- h(u), n && n(u.value), a(!1), c(null);
220
- },
221
- [n]
222
- ), d = M(
223
- (u) => {
224
- if (!e) {
225
- (u.key === "Enter" || u.key === " ") && (a(!0), c(0));
226
- return;
227
- }
228
- switch (u.key) {
229
- case "ArrowDown": {
230
- c(
231
- (f) => f === null ? 0 : Math.min(f + 1, o.length - 1)
232
- );
233
- break;
234
- }
235
- case "ArrowUp": {
236
- c(
237
- (f) => f === null ? o.length - 1 : Math.max(f - 1, 0)
238
- );
239
- break;
240
- }
241
- case "Enter": {
242
- l !== null && r(o[l]);
243
- break;
244
- }
245
- case "Escape": {
246
- a(!1);
247
- break;
248
- }
249
- }
250
- },
251
- [e, l, o, r]
252
- ), _ = M(() => {
253
- a(!1), c(null);
254
- }, []);
255
- return {
256
- handleChange: r,
257
- handleKeyDown: d,
258
- handleOutsideClick: _,
259
- highlightedIndex: l,
260
- isOpen: e,
261
- selectedItem: i,
262
- setIsOpen: a
263
- };
264
- }, Le = (n) => {
264
+ }), Le = (n) => {
265
265
  const { palette: o, setActiveColorHandler: t, setActiveShade: e } = n;
266
266
  J([(c) => {
267
267
  if (c.shiftKey && c.code.startsWith("Digit")) {
@@ -406,13 +406,13 @@ const ce = "_buttonGroup_ejhd6_1", ae = "_button_ejhd6_1", le = "_label_ejhd6_37
406
406
  c
407
407
  )) });
408
408
  }, Qt = (n) => {
409
- const { changeColor: o, colors: t, selectedColor: e, selectedShadeIndex: a = 5 } = n, l = Be || t, {
409
+ const { changeColor: o, colors: t, selectedColor: e, selectedShadeIndex: a = 5 } = n, l = Se || t, {
410
410
  activeColor: c,
411
411
  activeShade: i,
412
412
  palette: h,
413
413
  setActiveColorHandler: r,
414
414
  setActiveShade: d
415
- } = Se({ colors: l, selectedColor: e, selectedShadeIndex: a });
415
+ } = Ie({ colors: l, selectedColor: e, selectedShadeIndex: a });
416
416
  return Le({
417
417
  palette: h,
418
418
  setActiveColorHandler: r,
@@ -569,7 +569,7 @@ const Xt = (n) => {
569
569
  isOpen: y,
570
570
  selectedItem: x,
571
571
  setIsOpen: v
572
- } = Te({ onSelect: o, options: t, selectedId: a });
572
+ } = Ne({ onSelect: o, options: t, selectedId: a });
573
573
  $(() => {
574
574
  const w = (z) => {
575
575
  d.current && !d.current.contains(z.target) && f();