@yourbestsoft/studio-screen-ui-kit 0.0.12 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ToolIconButton-CtrbbDcL.js +647 -0
- package/dist/ToolIconButton-CtrbbDcL.js.map +1 -0
- package/dist/assets/icons/MoonIcon.d.ts +2 -0
- package/dist/assets/icons/SunIcon.d.ts +2 -0
- package/dist/assets/icons/index.d.ts +2 -0
- package/dist/components/drop-down/DropDown.d.ts +3 -3
- package/dist/components/drop-down/hooks/index.d.ts +1 -0
- package/dist/components/drop-down/hooks/useDropDownStack.d.ts +3 -0
- package/dist/components/drop-down/hooks/useDropdownPosition.d.ts +13 -0
- package/dist/components/theme-toggle/ThemeToggle.d.ts +2 -0
- package/dist/components/theme-toggle/index.d.ts +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/useEscapeKey.d.ts +1 -0
- package/dist/hooks/useOutsideClick.d.ts +1 -0
- package/dist/hooks/useWindowEvents.d.ts +1 -0
- package/dist/index.js +75 -75
- package/dist/index.js.map +1 -1
- package/dist/index2.js +2 -2
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/dist/ToolIconButton-BezvcpMB.js +0 -586
- package/dist/ToolIconButton-BezvcpMB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolIconButton-CtrbbDcL.js","sources":["../src/components/button/Button.tsx","../src/components/card/Card.tsx","../src/hooks/useKeyboardControls.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 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 rootRef: React.RefObject<HTMLDivElement>,\n visible: boolean,\n horizontal: 'left' | 'center' | 'right' = 'left',\n vertical: 'top' | 'bottom' = 'bottom',\n offset: number = 8\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 = rootRef.current\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 // Вычисление вертикальной позиции\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\n } else if (spaceAbove >= contentRect.height + offset + padding) {\n finalVertical = 'top'\n top = triggerRect.top - contentRect.height - offset\n } else {\n // Контент не помещается — выбрать сторону с больше места\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 // vertical === 'top'\n if (spaceAbove >= contentRect.height + offset + padding) {\n finalVertical = 'top'\n top = triggerRect.top - contentRect.height - offset\n } else if (spaceBelow >= contentRect.height + offset + padding) {\n finalVertical = 'bottom'\n top = triggerRect.bottom + offset\n } else {\n finalVertical = spaceAbove > spaceBelow ? 'top' : 'bottom'\n top =\n finalVertical === 'top'\n ? triggerRect.top - contentRect.height - offset\n : triggerRect.bottom + offset\n }\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 // horizontal === 'center'\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 с учётом viewport\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, rootRef, 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 RefObject,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEscapeKey, 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 rootRef: RefObject<HTMLDivElement>\n contentRef: RefObject<HTMLDivElement>\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 const contentRef = 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 // Проверка click outside с учётом портального контента\n useEffect(() => {\n if (!visible || !closeOnOutsideClick) return\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node\n if (\n rootRef.current &&\n !rootRef.current.contains(target) &&\n contentRef.current &&\n !contentRef.current.contains(target)\n ) {\n close()\n }\n }\n\n window.addEventListener('mousedown', handleClickOutside)\n return () => window.removeEventListener('mousedown', handleClickOutside)\n }, [visible, closeOnOutsideClick, close])\n\n useEscapeKey(close, closeOnEsc && visible, isTopOfStack)\n\n return (\n <DropDownContext.Provider\n value={{ close, contentRef, rootRef, toggle, visible }}\n >\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, contentRef, rootRef, visible } = useDropDownContext()\n\n const { calculatePosition, position } = useDropdownPosition(\n contentRef,\n rootRef,\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, contentRef])\n\n useWindowEvents(calculatePosition, close, visible)\n\n if (!visible) return null\n\n return createPortal(\n <div\n ref={contentRef}\n className={classNames(styles.dropdownContent, className)}\n style={{\n left: `${position.left}px`,\n top: `${position.top}px`,\n }}\n tabIndex={-1}\n >\n {children}\n </div>,\n document.body\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 onClick?.(event)\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","useEscapeKey","shouldHandle","useWindowEvents","onScroll","useDropdownPosition","contentRef","rootRef","visible","horizontal","vertical","offset","position","setPosition","useState","calculatePosition","useCallback","trigger","triggerRect","contentRect","viewportWidth","viewportHeight","padding","finalVertical","finalHorizontal","top","left","spaceBelow","spaceAbove","useLayoutEffect","openDropDownStack","useDropDownStack","index","DropDownContext","createContext","useDropDownContext","context","useContext","Root","closeOnEsc","closeOnOutsideClick","defaultVisible","setVisible","useRef","close","toggle","prev","isTopOfStack","handleClickOutside","e","target","styles","Trigger","Content","observer","createPortal","Close","onClick","handleClick","DropDown","DialogContext","React","externalIsOpen","onStateChange","dialogRef","internalIsOpen","setInternalIsOpen","isOpen","setIsOpen","state","keyboardHandlers","as","classNameOverlay","closeOnBackdropClick","_","handleBackdropClick","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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"}
|
|
@@ -13,16 +13,16 @@ interface ContentProps {
|
|
|
13
13
|
horizontal?: 'left' | 'center' | 'right';
|
|
14
14
|
vertical?: 'top' | 'bottom';
|
|
15
15
|
className?: string;
|
|
16
|
-
|
|
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
|
-
|
|
23
|
+
Close: ({ children, onClick }: CloseProps) => import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
Content: ({ children, className, horizontal, offset, vertical, }: ContentProps) => import("react").ReactPortal | 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,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>, rootRef: 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 @@
|
|
|
1
|
+
export * from './ThemeToggle';
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
1
|
+
import { u as J, D as H, B as G, a as Q } from "./ToolIconButton-CtrbbDcL.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-CtrbbDcL.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 =
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
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
|
-
],
|
|
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(
|
|
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)),
|
|
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
|
-
}),
|
|
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 =
|
|
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
|
-
} =
|
|
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
|
-
} =
|
|
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();
|