@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.
- package/dist/ToolIconButton-BeXfpEJ7.js +642 -0
- package/dist/ToolIconButton-BeXfpEJ7.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-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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"}
|
|
@@ -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/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,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 @@
|
|
|
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-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 =
|
|
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();
|