@blueshift-gg/ui-components 0.1.6 → 0.1.8
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/Alert.d.mts +1 -1
- package/dist/Alert.d.ts +1 -1
- package/dist/Avatar.d.mts +5 -5
- package/dist/Avatar.d.ts +5 -5
- package/dist/Avatar.js +18 -12
- package/dist/Avatar.js.map +1 -1
- package/dist/Avatar.mjs +18 -12
- package/dist/Avatar.mjs.map +1 -1
- package/dist/Badge.d.mts +1 -1
- package/dist/Badge.d.ts +1 -1
- package/dist/Button.d.mts +4 -2
- package/dist/Button.d.ts +4 -2
- package/dist/Button.js +9 -3
- package/dist/Button.js.map +1 -1
- package/dist/Button.mjs +9 -3
- package/dist/Button.mjs.map +1 -1
- package/dist/DecryptText.js +0 -18
- package/dist/DecryptText.js.map +1 -1
- package/dist/DecryptText.mjs +0 -18
- package/dist/DecryptText.mjs.map +1 -1
- package/dist/Dropdown.d.mts +18 -17
- package/dist/Dropdown.d.ts +18 -17
- package/dist/Dropdown.js +246 -31
- package/dist/Dropdown.js.map +1 -1
- package/dist/Dropdown.mjs +246 -31
- package/dist/Dropdown.mjs.map +1 -1
- package/dist/{Icon-CTxwWbdC.d.mts → Icon-BlNfHVtM.d.mts} +3 -0
- package/dist/{Icon-llWd6yMa.d.ts → Icon-CyRhTGIG.d.ts} +3 -0
- package/dist/Icon.d.mts +1 -1
- package/dist/Icon.d.ts +1 -1
- package/dist/Input.d.mts +1 -1
- package/dist/Input.d.ts +1 -1
- package/dist/Slider.d.mts +1 -1
- package/dist/Slider.d.ts +1 -1
- package/dist/Tabs.d.mts +1 -1
- package/dist/Tabs.d.ts +1 -1
- package/dist/Toast.d.mts +1 -1
- package/dist/Toast.d.ts +1 -1
- package/dist/icons/Anchor.d.mts +1 -1
- package/dist/icons/Anchor.d.ts +1 -1
- package/dist/icons/ArrowLeft.d.mts +1 -1
- package/dist/icons/ArrowLeft.d.ts +1 -1
- package/dist/icons/ArrowRight.d.mts +1 -1
- package/dist/icons/ArrowRight.d.ts +1 -1
- package/dist/icons/Assembly.d.mts +1 -1
- package/dist/icons/Assembly.d.ts +1 -1
- package/dist/icons/Brave.d.mts +7 -0
- package/dist/icons/Brave.d.ts +7 -0
- package/dist/icons/Brave.js +60 -0
- package/dist/icons/Brave.js.map +1 -0
- package/dist/icons/Brave.mjs +58 -0
- package/dist/icons/Brave.mjs.map +1 -0
- package/dist/icons/Challenge.d.mts +1 -1
- package/dist/icons/Challenge.d.ts +1 -1
- package/dist/icons/Chevron.d.mts +1 -1
- package/dist/icons/Chevron.d.ts +1 -1
- package/dist/icons/ChevronLeft.d.mts +1 -1
- package/dist/icons/ChevronLeft.d.ts +1 -1
- package/dist/icons/ChevronRight.d.mts +1 -1
- package/dist/icons/ChevronRight.d.ts +1 -1
- package/dist/icons/Claim.d.mts +1 -1
- package/dist/icons/Claim.d.ts +1 -1
- package/dist/icons/Claimed.d.mts +1 -1
- package/dist/icons/Claimed.d.ts +1 -1
- package/dist/icons/Close.d.mts +1 -1
- package/dist/icons/Close.d.ts +1 -1
- package/dist/icons/Code.d.mts +1 -1
- package/dist/icons/Code.d.ts +1 -1
- package/dist/icons/Copy.d.mts +1 -1
- package/dist/icons/Copy.d.ts +1 -1
- package/dist/icons/Developer.d.mts +1 -1
- package/dist/icons/Developer.d.ts +1 -1
- package/dist/icons/Difficulty.d.mts +1 -1
- package/dist/icons/Difficulty.d.ts +1 -1
- package/dist/icons/Discord.d.mts +1 -1
- package/dist/icons/Discord.d.ts +1 -1
- package/dist/icons/Dollar.d.mts +1 -1
- package/dist/icons/Dollar.d.ts +1 -1
- package/dist/icons/DoubleArrow.d.mts +1 -1
- package/dist/icons/DoubleArrow.d.ts +1 -1
- package/dist/icons/EVM.d.mts +1 -1
- package/dist/icons/EVM.d.ts +1 -1
- package/dist/icons/Email.d.mts +1 -1
- package/dist/icons/Email.d.ts +1 -1
- package/dist/icons/Error.d.mts +1 -1
- package/dist/icons/Error.d.ts +1 -1
- package/dist/icons/External.d.mts +1 -1
- package/dist/icons/External.d.ts +1 -1
- package/dist/icons/Filter.d.mts +1 -1
- package/dist/icons/Filter.d.ts +1 -1
- package/dist/icons/Firmware.d.mts +1 -1
- package/dist/icons/Firmware.d.ts +1 -1
- package/dist/icons/Flag.d.mts +1 -1
- package/dist/icons/Flag.d.ts +1 -1
- package/dist/icons/Flame.d.mts +1 -1
- package/dist/icons/Flame.d.ts +1 -1
- package/dist/icons/Flexible.d.mts +1 -1
- package/dist/icons/Flexible.d.ts +1 -1
- package/dist/icons/Free.d.mts +1 -1
- package/dist/icons/Free.d.ts +1 -1
- package/dist/icons/General.d.mts +1 -1
- package/dist/icons/General.d.ts +1 -1
- package/dist/icons/Github.d.mts +1 -1
- package/dist/icons/Github.d.ts +1 -1
- package/dist/icons/GridView.d.mts +1 -1
- package/dist/icons/GridView.d.ts +1 -1
- package/dist/icons/Heart.d.mts +1 -1
- package/dist/icons/Heart.d.ts +1 -1
- package/dist/icons/Info.d.mts +1 -1
- package/dist/icons/Info.d.ts +1 -1
- package/dist/icons/Language.d.mts +1 -1
- package/dist/icons/Language.d.ts +1 -1
- package/dist/icons/Lessons.d.mts +1 -1
- package/dist/icons/Lessons.d.ts +1 -1
- package/dist/icons/Link.d.mts +1 -1
- package/dist/icons/Link.d.ts +1 -1
- package/dist/icons/ListView.d.mts +1 -1
- package/dist/icons/ListView.d.ts +1 -1
- package/dist/icons/Loading.d.mts +1 -1
- package/dist/icons/Loading.d.ts +1 -1
- package/dist/icons/Locked.d.mts +1 -1
- package/dist/icons/Locked.d.ts +1 -1
- package/dist/icons/Mentor.d.mts +1 -1
- package/dist/icons/Mentor.d.ts +1 -1
- package/dist/icons/Modular.d.mts +1 -1
- package/dist/icons/Modular.d.ts +1 -1
- package/dist/icons/NFT.d.mts +1 -1
- package/dist/icons/NFT.d.ts +1 -1
- package/dist/icons/Online.d.mts +1 -1
- package/dist/icons/Online.d.ts +1 -1
- package/dist/icons/Password.d.mts +1 -1
- package/dist/icons/Password.d.ts +1 -1
- package/dist/icons/Phantom.d.mts +7 -0
- package/dist/icons/Phantom.d.ts +7 -0
- package/dist/icons/Phantom.js +28 -0
- package/dist/icons/Phantom.js.map +1 -0
- package/dist/icons/Phantom.mjs +26 -0
- package/dist/icons/Phantom.mjs.map +1 -0
- package/dist/icons/Product.d.mts +1 -1
- package/dist/icons/Product.d.ts +1 -1
- package/dist/icons/Progress.d.mts +1 -1
- package/dist/icons/Progress.d.ts +1 -1
- package/dist/icons/Protocol.d.mts +1 -1
- package/dist/icons/Protocol.d.ts +1 -1
- package/dist/icons/Rewards.d.mts +1 -1
- package/dist/icons/Rewards.d.ts +1 -1
- package/dist/icons/Rust.d.mts +1 -1
- package/dist/icons/Rust.d.ts +1 -1
- package/dist/icons/Search.d.mts +1 -1
- package/dist/icons/Search.d.ts +1 -1
- package/dist/icons/SmartContract.d.mts +1 -1
- package/dist/icons/SmartContract.d.ts +1 -1
- package/dist/icons/Solana.d.mts +1 -1
- package/dist/icons/Solana.d.ts +1 -1
- package/dist/icons/Solflare.d.mts +7 -0
- package/dist/icons/Solflare.d.ts +7 -0
- package/dist/icons/Solflare.js +28 -0
- package/dist/icons/Solflare.js.map +1 -0
- package/dist/icons/Solflare.mjs +26 -0
- package/dist/icons/Solflare.mjs.map +1 -0
- package/dist/icons/Success.d.mts +1 -1
- package/dist/icons/Success.d.ts +1 -1
- package/dist/icons/SuccessCircle.d.mts +1 -1
- package/dist/icons/SuccessCircle.d.ts +1 -1
- package/dist/icons/Table.d.mts +1 -1
- package/dist/icons/Table.d.ts +1 -1
- package/dist/icons/Target.d.mts +1 -1
- package/dist/icons/Target.d.ts +1 -1
- package/dist/icons/Training.d.mts +1 -1
- package/dist/icons/Training.d.ts +1 -1
- package/dist/icons/Typescript.d.mts +1 -1
- package/dist/icons/Typescript.d.ts +1 -1
- package/dist/icons/Unclaimed.d.mts +1 -1
- package/dist/icons/Unclaimed.d.ts +1 -1
- package/dist/icons/Upload.d.mts +1 -1
- package/dist/icons/Upload.d.ts +1 -1
- package/dist/icons/Wallet.d.mts +1 -1
- package/dist/icons/Wallet.d.ts +1 -1
- package/dist/icons/WalletSmall.d.mts +1 -1
- package/dist/icons/WalletSmall.d.ts +1 -1
- package/dist/icons/Warning.d.mts +1 -1
- package/dist/icons/Warning.d.ts +1 -1
- package/dist/icons/X.d.mts +1 -1
- package/dist/icons/X.d.ts +1 -1
- package/dist/icons/index.d.mts +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +7 -1
- package/dist/icons/index.js.map +1 -1
- package/dist/icons/index.mjs +7 -1
- package/dist/icons/index.mjs.map +1 -1
- package/dist/index.d.mts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +15 -0
- package/dist/index.mjs +3 -0
- package/package.json +1 -1
- package/src/theme.css +10 -0
package/dist/Dropdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Dropdown.tsx"],"names":["useState","useRef","useCallback","useEffect","jsx","AnimatePresence","motion","swift","classNames","jsxs","Checkbox","Divider","useOnClickOutside","Button","CrosshairCorners","Icon"],"mappings":"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","file":"Dropdown.js","sourcesContent":["\"use client\";\n\nimport { Button, ButtonProps } from \"./Button\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { swift } from \"./utils/easings\";\nimport { Checkbox } from \"./Checkbox\";\nimport { Divider } from \"./Divider\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport { CrosshairCorners } from \"./CrossHair\";\n\nexport type DropdownProps = {\n className?: string;\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n disabled?: boolean;\n label: string;\n multiSelectLabel?: string;\n buttonClassName?: string;\n menuClassName?: string;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport type DropdownButtonProps = {\n label: string;\n multiSelectLabel?: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n buttonClassName?: string;\n selectedItems?: DropdownProps[\"items\"];\n multiple?: boolean;\n count?: number;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownItemProps = {\n label: string;\n icon?: IconProps;\n onClick: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownMenuProps = {\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n menuClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n isOpen: boolean;\n onItemClick?: (value: string) => void;\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport const DropdownMenu = ({\n items,\n selectedItem,\n handleChange,\n multiple = false,\n menuClassName,\n size = \"md\",\n isOpen,\n onItemClick,\n isScrollable = false,\n animationOrigin = \"top-left\",\n search,\n onClearSearch,\n}: DropdownMenuProps) => {\n const [isAtBottom, setIsAtBottom] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Filter items based on search term\n const filteredItems = (() => {\n // If search is provided, filter based on search\n if (search) {\n return items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase())\n );\n }\n\n // Default: show all items\n return items;\n })();\n\n // Handle scroll detection\n const handleScroll = useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const threshold = 5; // Small threshold to account for rounding\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - threshold;\n\n setIsAtBottom(isNearBottom);\n }, []);\n\n // Reset scroll state when items change or menu opens\n useEffect(() => {\n if (isOpen) {\n setIsAtBottom(false);\n }\n }, [isOpen, filteredItems.length]);\n\n // Check if content is actually scrollable\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !isOpen) return;\n\n const { scrollHeight, clientHeight } = container;\n const hasScrollbar = scrollHeight > clientHeight;\n\n // If no scrollbar (content fits), consider it \"at bottom\"\n if (!hasScrollbar) {\n setIsAtBottom(true);\n }\n }, [isOpen, filteredItems.length]);\n\n // Helper to check if an item is selected\n const isItemSelected = (value: string) => {\n if (multiple) {\n return (\n Array.isArray(selectedItem) &&\n selectedItem.length > 0 &&\n selectedItem.includes(value)\n );\n }\n return !!selectedItem && selectedItem === value;\n };\n\n // Handle item selection\n const handleItemClick = (value: string) => {\n if (multiple) {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n\n // If all items are selected, clicking any item should deselect all others\n if (isAllSelected()) {\n handleChange([value]);\n } else if (currentSelection.includes(value)) {\n // Remove from selection\n handleChange(currentSelection.filter((item) => item !== value));\n } else {\n // Add to selection\n handleChange([...currentSelection, value]);\n }\n } else {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n // Call the optional callback for single select\n onItemClick?.(value);\n }\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n const allValues = filteredItems\n .filter((item) => !item.disabled)\n .map((item) => item.value);\n\n if (currentSelection.length === allValues.length) {\n // Deselect all\n handleChange([]);\n } else {\n // Select all\n handleChange(allValues);\n }\n };\n\n // Check if all items are selected\n const isAllSelected = () => {\n if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;\n const selectableItems = filteredItems.filter((item) => !item.disabled);\n return (\n selectableItems.length > 0 &&\n selectedItem.length === selectableItems.length &&\n selectableItems.every((item) => selectedItem.includes(item.value))\n );\n };\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8, y: -15 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ duration: 0.1, ease: swift }}\n exit={{ opacity: 0, scale: 0.8, y: -5 }}\n className={classNames(\n \"absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border\",\n (size === \"lg\" || size === \"md\") && \"min-w-[200px]\",\n animationOrigin === \"top-left\" && \"origin-top-left\",\n animationOrigin === \"top-center\" && \"origin-top-center\",\n animationOrigin === \"top-right\" && \"origin-top-right\",\n menuClassName\n )}\n >\n <div\n ref={scrollContainerRef}\n onScroll={handleScroll}\n className={classNames(\n \"flex flex-col gap-y-1\",\n isScrollable && [\n \"max-h-[250px] overflow-y-auto\",\n !isAtBottom &&\n \"[mask-image:linear-gradient(180deg,black,black_85%,transparent_100%)]\",\n ]\n )}\n >\n {multiple && (\n <div className=\"group flex flex-col gap-y-1\">\n <button\n onClick={handleSelectAll}\n className={classNames(\n \"py-3 pl-2.5 pr-3 flex items-center gap-x-2.5 outline-none bg-transparent transition-colors duration-100 ease-crisp hover:bg-border-light/50\"\n )}\n >\n <Checkbox checked={isAllSelected()} />\n <span className=\"text-sm text-shade-primary font-medium\">\n Select All\n </span>\n </button>\n <Divider direction=\"horizontal\" />\n </div>\n )}\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => (\n <DropdownItem\n key={item.value}\n label={item.label}\n icon={\n item.icon?.name\n ? {\n name: item.icon.name,\n className: item.icon.className,\n size: item.icon.size,\n difficulties: item.icon.difficulties,\n }\n : undefined\n }\n onClick={() => handleItemClick(item.value)}\n disabled={item.disabled}\n isSelected={isItemSelected(item.value)}\n size={size}\n />\n ))\n ) : (\n <button\n onClick={() => {\n // Clear search by calling the onClearSearch callback\n if (onClearSearch) {\n onClearSearch();\n }\n }}\n className=\"py-3 pl-2.5 pr-3 text-sm font-mono text-shade-tertiary hover:bg-border-light/50 transition-colors duration-100 ease-crisp w-full text-center\"\n >\n No options found\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\nexport const Dropdown = ({\n className,\n items,\n selectedItem,\n handleChange,\n label = \"View All\",\n multiSelectLabel,\n disabled,\n buttonClassName,\n menuClassName,\n multiple = false,\n menuIcon,\n size = \"md\",\n isScrollable = false,\n search,\n onClearSearch,\n}: DropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Handle item selection for single select (closes menu)\n const handleItemClick = (value: string) => {\n if (!multiple) {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n setIsOpen(false);\n }\n };\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = () => {\n setIsOpen(false);\n };\n\n // Cast ref to RefObject<HTMLElement> to satisfy useOnClickOutside's expected type\n useOnClickOutside(ref as React.RefObject<HTMLElement>, handleClickOutside);\n\n // Get selected items for display in button\n const getSelectedItems = () => {\n if (multiple) {\n const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];\n return items.filter((item) => selectedValues.includes(item.value));\n } else {\n const selected = items.find((item) => item.value === selectedItem);\n return selected ? [selected] : [];\n }\n };\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative flex flex-col gap-y-1.5 items-start\",\n className\n )}\n >\n <DropdownButton\n label={label}\n multiSelectLabel={multiSelectLabel}\n disabled={disabled}\n className={buttonClassName}\n onClick={() => setIsOpen(!isOpen)}\n selectedItems={getSelectedItems()}\n multiple={multiple}\n count={getSelectedItems().length}\n menuIcon={menuIcon}\n size={size}\n />\n\n <DropdownMenu\n items={items}\n selectedItem={selectedItem}\n handleChange={handleChange}\n multiple={multiple}\n menuClassName={menuClassName}\n size={size}\n isOpen={isOpen}\n onItemClick={handleItemClick}\n isScrollable={isScrollable}\n search={search}\n onClearSearch={onClearSearch}\n />\n </div>\n );\n};\n\nexport const DropdownButton = ({\n label,\n multiSelectLabel,\n disabled,\n className,\n onClick,\n selectedItems = [],\n multiple = false,\n count = 0,\n menuIcon,\n size,\n}: DropdownButtonProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Determine what to display\n const hasSelection = selectedItems.length > 0;\n const isSingleSelection = selectedItems.length === 1;\n const isMultipleSelection = selectedItems.length > 1;\n\n // Compute icon and label based on selection state\n let buttonIcon: ButtonProps[\"icon\"] | undefined;\n let buttonLabel: string;\n\n if (hasSelection && isSingleSelection) {\n // Single selection: show selected item's icon and label\n const selectedItem = selectedItems[0];\n buttonIcon = selectedItem.icon\n ? {\n name: selectedItem.icon.name,\n className: selectedItem.icon.className || \"\",\n size: selectedItem.icon.size || 18,\n difficulties: selectedItem.icon.difficulties,\n }\n : menuIcon;\n buttonLabel = selectedItem.label;\n } else if (isMultipleSelection && multiple && multiSelectLabel) {\n // Multiple selections: show count and multiSelectLabel\n // Collect all difficulties from selected items\n const combinedDifficulties = selectedItems\n .filter((item) => item.icon?.difficulties)\n .flatMap((item) => item.icon!.difficulties!)\n .filter((value, index, self) => self.indexOf(value) === index) // Remove duplicates\n .sort((a, b) => a - b); // Sort in ascending order\n\n buttonIcon = menuIcon\n ? {\n name: menuIcon.name,\n className: menuIcon.className || \"\",\n size: menuIcon.size || 18,\n difficulties:\n combinedDifficulties.length > 0\n ? combinedDifficulties\n : menuIcon.difficulties,\n }\n : undefined;\n buttonLabel = `${count} ${multiSelectLabel}`;\n } else {\n // Default: no selection\n buttonIcon = menuIcon;\n buttonLabel = label;\n }\n\n return (\n <Button\n icon={buttonIcon}\n label={buttonLabel}\n disabled={disabled}\n size={size}\n variant=\"secondary\"\n className={classNames(\n \"!origin-bottom-left !justify-start w-full\",\n (size === \"md\" || size === \"lg\") && \"!pr-[18px] !pl-[12px]\",\n size === \"sm\" && \"!pr-4 !pl-3\",\n className\n )}\n useHoverEffect={false}\n crosshairProps={{\n variant: \"corners\",\n corners: [\"bottom-right\"],\n spacingX: !isHovered ? -6 : -4,\n spacingY: !isHovered ? -6 : -4,\n animationDuration: 0.5,\n animationDelay: 0,\n className: \"text-shade-mute group-hover:text-shade-primary\",\n }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n );\n};\n\nexport const DropdownItem = ({\n label,\n icon,\n onClick,\n disabled,\n isSelected = false,\n size,\n}: DropdownItemProps) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center gap-x-2.5 outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n isSelected && \"bg-background/50\"\n )}\n >\n <div className=\"opacity-0 group-hover/item:!opacity-100 absolute inset-0.5\">\n <CrosshairCorners\n size={6}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-shade-mute\"\n animationDelay={0}\n animationDuration={0.5}\n />\n </div>\n\n {icon && (\n <Icon\n name={icon.name}\n className={classNames(\"flex-shrink-0\", icon.className)}\n size={icon.size || 18}\n difficulties={icon.difficulties}\n />\n )}\n <span\n className={classNames(\" text-shade-primary font-medium leading-[100%]\")}\n >\n {label}\n </span>\n </button>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Dropdown.tsx"],"names":["useState","useCallback","useEffect","jsx","useRef","AnimatePresence","motion","swift","classNames","jsxs","Checkbox","Divider","useOnClickOutside","Button","Icon","CrosshairCorners"],"mappings":"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","file":"Dropdown.js","sourcesContent":["\"use client\";\n\nimport { Button, ButtonProps } from \"./Button\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { swift } from \"./utils/easings\";\nimport { Checkbox } from \"./Checkbox\";\nimport { Divider } from \"./Divider\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport { CrosshairCorners } from \"./CrossHair\";\n\nexport type DropdownOption = {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n children?: DropdownOption[];\n};\n\nexport type DropdownProps = {\n className?: string;\n items: DropdownOption[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n disabled?: boolean;\n label: string;\n multiSelectLabel?: string;\n buttonClassName?: string;\n menuClassName?: string;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n showSelectAll?: boolean;\n};\n\nexport type DropdownButtonProps = {\n label: string;\n multiSelectLabel?: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n buttonClassName?: string;\n selectedItems?: DropdownProps[\"items\"];\n multiple?: boolean;\n count?: number;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n onClear?: () => void;\n};\n\nexport type DropdownItemProps = {\n label: string;\n icon?: IconProps;\n onClick: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownMenuProps = {\n items: DropdownOption[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n menuClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n isOpen: boolean;\n onItemClick?: (value: string) => void;\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n showSelectAll?: boolean;\n showSafeTriangle?: boolean;\n};\n\n// Track mouse position for SafeArea triangles\nconst useMousePosition = () => {\n const [mousePosition, setMousePosition] = useState<[number, number]>([0, 0]);\n\n const updateMousePosition = useCallback((ev: MouseEvent) => {\n setMousePosition([ev.clientX, ev.clientY]);\n }, []);\n\n useEffect(() => {\n const throttledUpdate = (ev: MouseEvent) => {\n requestAnimationFrame(() => updateMousePosition(ev));\n };\n\n window.addEventListener(\"mousemove\", throttledUpdate);\n return () => window.removeEventListener(\"mousemove\", throttledUpdate);\n }, [updateMousePosition]);\n\n return mousePosition;\n};\n\ntype MouseSafeAreaProps = {\n submenuRef: React.RefObject<HTMLDivElement | null>;\n parentRef: React.RefObject<HTMLDivElement | null>;\n onEnter?: () => void;\n onLeave?: () => void;\n debug?: boolean;\n};\n\n// Component to cover the area between the mouse cursor and the sub-menu, to allow moving cursor to lower parts of sub-menu without the sub-menu disappearing.\nconst MouseSafeArea = ({\n parentRef,\n submenuRef,\n onEnter,\n onLeave,\n debug = false,\n}: MouseSafeAreaProps) => {\n const {\n x = 0,\n y = 0,\n height: h = 0,\n width: w = 0,\n } = submenuRef.current?.getBoundingClientRect() || {};\n const [mouseX, mouseY] = useMousePosition();\n const positions = { x, y, h, w, mouseX, mouseY };\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: getLeft(positions),\n right: getRight(positions),\n top: 0,\n width: getWidth(positions),\n height: h,\n clipPath: getClipPath(positions),\n pointerEvents: \"auto\",\n zIndex: 9999,\n backgroundColor: debug ? \"rgba(0, 179, 179, 0.25)\" : \"transparent\",\n }}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n />\n );\n};\n\ninterface Positions {\n /* Sub-menu x */\n x: number;\n /* Sub-menu y */\n y: number;\n /* Sub-menu height */\n h: number;\n /* Sub-menu width */\n w: number;\n /* Mouse x */\n mouseX: number;\n /* Mouse y */\n mouseY: number;\n}\n\nconst getLeft = ({ x, mouseX }: Positions) =>\n mouseX > x ? undefined : -Math.max(x - mouseX, 10) + \"px\";\nconst getRight = ({ x, w, mouseX }: Positions) =>\n mouseX > x ? -Math.max(mouseX - (x + w), 10) + \"px\" : undefined;\nconst getWidth = ({ x, w, mouseX }: Positions) =>\n mouseX > x\n ? Math.max(mouseX - (x + w), 10) + \"px\"\n : Math.max(x - mouseX, 10) + \"px\";\nconst getClipPath = ({ x, y, h, mouseX, mouseY }: Positions) =>\n mouseX < x\n ? `polygon(100% 0%, 0% ${(100 * (mouseY - y)) / h}%, 100% 100%)`\n : `polygon(0% 0%, 0% 100%, 100% ${(100 * (mouseY - y)) / h}%)`;\n\nexport const DropdownMenu = ({\n items,\n selectedItem,\n handleChange,\n multiple = false,\n menuClassName,\n size = \"md\",\n isOpen,\n onItemClick,\n isScrollable = false,\n animationOrigin = \"top-left\",\n search,\n onClearSearch,\n showSelectAll = true,\n showSafeTriangle = false,\n}: DropdownMenuProps) => {\n const [isAtBottom, setIsAtBottom] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Filter items based on search term\n const filteredItems = (() => {\n // If search is provided, filter based on search\n if (search) {\n return items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase())\n );\n }\n\n // Default: show all items\n return items;\n })();\n\n // Handle scroll detection\n const handleScroll = useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const threshold = 5; // Small threshold to account for rounding\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - threshold;\n\n setIsAtBottom(isNearBottom);\n }, []);\n\n // Reset scroll state when items change or menu opens\n useEffect(() => {\n if (isOpen) {\n setIsAtBottom(false);\n }\n }, [isOpen, filteredItems.length]);\n\n // Check if content is actually scrollable\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !isOpen) return;\n\n const { scrollHeight, clientHeight } = container;\n const hasScrollbar = scrollHeight > clientHeight;\n\n // If no scrollbar (content fits), consider it \"at bottom\"\n if (!hasScrollbar) {\n setIsAtBottom(true);\n }\n }, [isOpen, filteredItems.length]);\n\n // Helper to check if an item is selected\n const isItemSelected = (value: string) => {\n if (multiple) {\n return (\n Array.isArray(selectedItem) &&\n selectedItem.length > 0 &&\n selectedItem.includes(value)\n );\n }\n return !!selectedItem && selectedItem === value;\n };\n\n const flattenSelectable = (options: DropdownOption[]): DropdownOption[] => {\n const out: DropdownOption[] = [];\n const walk = (nodes: DropdownOption[]) => {\n nodes.forEach((n) => {\n if (n.children && n.children.length > 0) {\n walk(n.children);\n } else {\n out.push(n);\n }\n });\n };\n walk(options);\n return out;\n };\n\n // Handle item selection\n const handleItemClick = (value: string) => {\n if (multiple) {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n\n // If all items are selected, clicking any item should deselect all others\n if (isAllSelected()) {\n handleChange([value]);\n } else if (currentSelection.includes(value)) {\n // Remove from selection\n handleChange(currentSelection.filter((item) => item !== value));\n } else {\n // Add to selection\n handleChange([...currentSelection, value]);\n }\n } else {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n // Call the optional callback for single select\n onItemClick?.(value);\n }\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n const allValues = flattenSelectable(filteredItems)\n .filter((item) => !item.disabled)\n .map((item) => item.value);\n\n if (currentSelection.length === allValues.length) {\n // Deselect all\n handleChange([]);\n } else {\n // Select all\n handleChange(allValues);\n }\n };\n\n // Check if all items are selected\n const isAllSelected = () => {\n if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;\n const selectableItems = flattenSelectable(filteredItems).filter(\n (item) => !item.disabled\n );\n return (\n selectableItems.length > 0 &&\n selectedItem.length === selectableItems.length &&\n selectableItems.every((item) => selectedItem.includes(item.value))\n );\n };\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8, y: -15 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ duration: 0.1, ease: swift }}\n exit={{ opacity: 0, scale: 0.8, y: -5 }}\n className={classNames(\n \"z-50 absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border\",\n (size === \"lg\" || size === \"md\") && \"min-w-[200px]\",\n animationOrigin === \"top-left\" && \"origin-top-left\",\n animationOrigin === \"top-center\" && \"origin-top-center\",\n animationOrigin === \"top-right\" && \"origin-top-right\",\n menuClassName\n )}\n >\n <div\n ref={scrollContainerRef}\n onScroll={handleScroll}\n className={classNames(\n \"flex flex-col gap-y-1\",\n isScrollable && [\n \"max-h-[250px] overflow-y-auto\",\n !isAtBottom &&\n \"[mask-image:linear-gradient(180deg,black,black_85%,transparent_100%)]\",\n ]\n )}\n >\n {multiple && showSelectAll && (\n <div className=\"group flex flex-col gap-y-1\">\n <button\n onClick={handleSelectAll}\n className={classNames(\n \"py-3 pl-2.5 pr-3 flex items-center gap-x-2.5 outline-none bg-transparent transition-colors duration-100 ease-crisp hover:bg-border-light/50\"\n )}\n >\n <Checkbox checked={isAllSelected()} />\n <span className=\"text-sm text-shade-primary font-medium\">\n Select All\n </span>\n </button>\n <Divider direction=\"horizontal\" />\n </div>\n )}\n {filteredItems.length > 0 ? (\n filteredItems.map((item) =>\n item.children && item.children.length > 0 ? (\n <DropdownSubmenuItem\n key={item.value}\n item={item}\n size={size}\n onLeafClick={handleItemClick}\n isLeafSelected={isItemSelected}\n />\n ) : (\n <DropdownItem\n key={item.value}\n label={item.label}\n icon={\n item.icon?.name\n ? {\n name: item.icon.name,\n className: item.icon.className,\n size: item.icon.size,\n difficulties: item.icon.difficulties,\n }\n : undefined\n }\n onClick={() => handleItemClick(item.value)}\n disabled={item.disabled}\n isSelected={isItemSelected(item.value)}\n size={size}\n />\n )\n )\n ) : (\n <button\n onClick={() => {\n // Clear search by calling the onClearSearch callback\n if (onClearSearch) {\n onClearSearch();\n }\n }}\n className=\"py-3 pl-2.5 pr-3 text-sm font-mono text-shade-tertiary hover:bg-border-light/50 transition-colors duration-100 ease-crisp w-full text-center\"\n >\n No options found\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\nexport const Dropdown = ({\n className,\n items,\n selectedItem,\n handleChange,\n label = \"View All\",\n multiSelectLabel,\n disabled,\n buttonClassName,\n menuClassName,\n multiple = false,\n menuIcon,\n size = \"md\",\n isScrollable = false,\n search,\n onClearSearch,\n showSelectAll,\n}: DropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Handle item selection for single select (closes menu)\n const handleItemClick = (value: string) => {\n if (!multiple) {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n setIsOpen(false);\n }\n };\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = () => {\n setIsOpen(false);\n };\n\n // Cast ref to RefObject<HTMLElement> to satisfy useOnClickOutside's expected type\n useOnClickOutside(ref as React.RefObject<HTMLElement>, handleClickOutside);\n\n // Get selected items for display in button\n const getSelectedItems = () => {\n const flatten = (options: DropdownOption[]): DropdownOption[] => {\n const out: DropdownOption[] = [];\n const walk = (nodes: DropdownOption[]) => {\n nodes.forEach((n) => {\n if (n.children && n.children.length > 0) {\n walk(n.children);\n } else {\n out.push(n);\n }\n });\n };\n walk(options);\n return out;\n };\n\n const leaves = flatten(items);\n if (multiple) {\n const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];\n return leaves.filter((item) => selectedValues.includes(item.value));\n }\n const selected = leaves.find((item) => item.value === selectedItem);\n return selected ? [selected] : [];\n };\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative flex flex-col gap-y-1.5 items-start\",\n className\n )}\n >\n <DropdownButton\n label={label}\n multiSelectLabel={multiSelectLabel}\n disabled={disabled}\n className={buttonClassName}\n onClick={() => setIsOpen(!isOpen)}\n selectedItems={getSelectedItems()}\n multiple={multiple}\n count={getSelectedItems().length}\n menuIcon={menuIcon}\n size={size}\n onClear={() => handleChange(multiple ? [] : undefined)}\n />\n\n <DropdownMenu\n items={items}\n selectedItem={selectedItem}\n handleChange={handleChange}\n multiple={multiple}\n menuClassName={menuClassName}\n size={size}\n isOpen={isOpen}\n onItemClick={handleItemClick}\n isScrollable={isScrollable}\n search={search}\n onClearSearch={onClearSearch}\n showSelectAll={showSelectAll}\n />\n </div>\n );\n};\n\nexport const DropdownButton = ({\n label,\n multiSelectLabel,\n disabled,\n className,\n onClick,\n selectedItems = [],\n multiple = false,\n count = 0,\n menuIcon,\n size,\n onClear,\n}: DropdownButtonProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Determine what to display\n const hasSelection = selectedItems.length > 0;\n const isSingleSelection = selectedItems.length === 1;\n const isMultipleSelection = selectedItems.length > 1;\n\n // Compute icon and label based on selection state\n let buttonIcon: ButtonProps[\"icon\"] | undefined;\n let buttonLabel: string;\n\n if (hasSelection && isSingleSelection) {\n // Single selection: show selected item's icon and label\n const selectedItem = selectedItems[0];\n buttonIcon = selectedItem.icon\n ? {\n name: selectedItem.icon.name,\n className: selectedItem.icon.className || \"\",\n size: selectedItem.icon.size || 18,\n difficulties: selectedItem.icon.difficulties,\n }\n : menuIcon;\n buttonLabel = selectedItem.label;\n } else if (isMultipleSelection && multiple && multiSelectLabel) {\n // Multiple selections: show count and multiSelectLabel\n // Collect all difficulties from selected items\n const combinedDifficulties = selectedItems\n .filter((item) => item.icon?.difficulties)\n .flatMap((item) => item.icon!.difficulties!)\n .filter((value, index, self) => self.indexOf(value) === index) // Remove duplicates\n .sort((a, b) => a - b); // Sort in ascending order\n\n buttonIcon = menuIcon\n ? {\n name: menuIcon.name,\n className: menuIcon.className || \"\",\n size: menuIcon.size || 18,\n difficulties:\n combinedDifficulties.length > 0\n ? combinedDifficulties\n : menuIcon.difficulties,\n }\n : undefined;\n buttonLabel = `${count} ${multiSelectLabel}`;\n } else {\n // Default: no selection\n buttonIcon = menuIcon;\n buttonLabel = label;\n }\n\n return (\n <Button\n icon={buttonIcon}\n label={buttonLabel}\n disabled={disabled}\n size={size}\n variant=\"secondary\"\n className={classNames(\n \"!origin-bottom-left !justify-start w-full\",\n (size === \"md\" || size === \"lg\") && \"!pr-[18px] !pl-[12px]\",\n size === \"sm\" && \"!pr-4 !pl-3\",\n className\n )}\n useDecryptAnimation={false}\n useHoverEffect={false}\n crosshairProps={{\n variant: \"corners\",\n corners: [\"bottom-right\"],\n spacingX: !isHovered ? -6 : -4,\n spacingY: !isHovered ? -6 : -4,\n animationDuration: 0.5,\n animationDelay: 0,\n className: \"text-shade-mute group-hover:text-shade-primary\",\n }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n children={\n hasSelection &&\n multiple && (\n <div\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-[24px] w-[24px] flex items-center justify-center hover:bg-background/40 transition duration-100 ease-crisp cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onClear?.();\n }}\n >\n <Icon name=\"Close\" size={12} />\n </div>\n )\n }\n />\n );\n};\n\nexport const DropdownItem = ({\n label,\n icon,\n onClick,\n disabled,\n isSelected = false,\n size,\n}: DropdownItemProps) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center gap-x-2.5 outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n isSelected && \"bg-background/50\"\n )}\n >\n <div className=\"opacity-0 group-hover/item:!opacity-100 absolute inset-0.5\">\n <CrosshairCorners\n size={6}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-shade-mute\"\n animationDelay={0}\n animationDuration={0.5}\n />\n </div>\n\n {icon && (\n <Icon\n name={icon.name}\n className={classNames(\"flex-shrink-0\", icon.className)}\n size={icon.size || 18}\n difficulties={icon.difficulties}\n />\n )}\n <span\n className={classNames(\" text-shade-primary font-medium leading-[100%]\")}\n >\n {label}\n </span>\n </button>\n );\n};\n\ntype DropdownSubmenuItemProps = {\n item: DropdownOption;\n size?: \"sm\" | \"md\" | \"lg\";\n onLeafClick: (value: string) => void;\n isLeafSelected: (value: string) => boolean;\n};\n\nconst DropdownSubmenuItem = ({\n item,\n size = \"md\",\n onLeafClick,\n isLeafSelected,\n}: DropdownSubmenuItemProps) => {\n const parentRef = useRef<HTMLDivElement | null>(null);\n const submenuRef = useRef<HTMLDivElement | null>(null);\n\n const [hoverParent, setHoverParent] = useState(false);\n const [hoverSubmenu, setHoverSubmenu] = useState(false);\n const [hoverSafe, setHoverSafe] = useState(false);\n\n const open = hoverParent || hoverSubmenu || hoverSafe;\n\n return (\n <div\n ref={parentRef}\n className=\"relative\"\n onMouseEnter={() => setHoverParent(true)}\n onMouseLeave={() => setHoverParent(false)}\n >\n <button\n type=\"button\"\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center justify-between gap-x-2.5 w-full outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n open && \"bg-border-light/50\"\n )}\n disabled={item.disabled}\n >\n <span className=\"flex items-center gap-x-2.5\">\n {item.icon?.name && (\n <Icon\n name={item.icon.name}\n className={classNames(\"flex-shrink-0\", item.icon.className)}\n size={item.icon.size || 18}\n difficulties={item.icon.difficulties}\n />\n )}\n <span className=\"text-shade-primary font-medium leading-[100%]\">\n {item.label}\n </span>\n </span>\n <Icon name=\"ChevronRight\" size={14} className=\"text-shade-tertiary\" />\n </button>\n\n {open && (\n <div\n ref={submenuRef}\n onMouseEnter={() => setHoverSubmenu(true)}\n onMouseLeave={() => setHoverSubmenu(false)}\n className={classNames(\n \"z-[60] absolute top-0 left-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border min-w-[180px]\"\n )}\n >\n <MouseSafeArea\n parentRef={parentRef}\n submenuRef={submenuRef}\n onEnter={() => setHoverSafe(true)}\n onLeave={() => setHoverSafe(false)}\n />\n <div className=\"flex flex-col gap-y-1\">\n {(item.children || []).map((child) =>\n child.children && child.children.length > 0 ? (\n <DropdownSubmenuItem\n key={child.value}\n item={child}\n size={size}\n onLeafClick={onLeafClick}\n isLeafSelected={isLeafSelected}\n />\n ) : (\n <DropdownItem\n key={child.value}\n label={child.label}\n icon={\n child.icon?.name\n ? {\n name: child.icon.name,\n className: child.icon.className,\n size: child.icon.size,\n difficulties: child.icon.difficulties,\n }\n : undefined\n }\n onClick={() => onLeafClick(child.value)}\n disabled={child.disabled}\n isSelected={isLeafSelected(child.value)}\n size={size}\n />\n )\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n"]}
|
package/dist/Dropdown.mjs
CHANGED
|
@@ -10,6 +10,59 @@ import { Icon } from './Icon';
|
|
|
10
10
|
import { useOnClickOutside } from 'usehooks-ts';
|
|
11
11
|
import { CrosshairCorners } from './CrossHair';
|
|
12
12
|
|
|
13
|
+
const useMousePosition = () => {
|
|
14
|
+
const [mousePosition, setMousePosition] = useState([0, 0]);
|
|
15
|
+
const updateMousePosition = useCallback((ev) => {
|
|
16
|
+
setMousePosition([ev.clientX, ev.clientY]);
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const throttledUpdate = (ev) => {
|
|
20
|
+
requestAnimationFrame(() => updateMousePosition(ev));
|
|
21
|
+
};
|
|
22
|
+
window.addEventListener("mousemove", throttledUpdate);
|
|
23
|
+
return () => window.removeEventListener("mousemove", throttledUpdate);
|
|
24
|
+
}, [updateMousePosition]);
|
|
25
|
+
return mousePosition;
|
|
26
|
+
};
|
|
27
|
+
const MouseSafeArea = ({
|
|
28
|
+
parentRef,
|
|
29
|
+
submenuRef,
|
|
30
|
+
onEnter,
|
|
31
|
+
onLeave,
|
|
32
|
+
debug = false
|
|
33
|
+
}) => {
|
|
34
|
+
const {
|
|
35
|
+
x = 0,
|
|
36
|
+
y = 0,
|
|
37
|
+
height: h = 0,
|
|
38
|
+
width: w = 0
|
|
39
|
+
} = submenuRef.current?.getBoundingClientRect() || {};
|
|
40
|
+
const [mouseX, mouseY] = useMousePosition();
|
|
41
|
+
const positions = { x, y, h, w, mouseX, mouseY };
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
style: {
|
|
46
|
+
position: "absolute",
|
|
47
|
+
left: getLeft(positions),
|
|
48
|
+
right: getRight(positions),
|
|
49
|
+
top: 0,
|
|
50
|
+
width: getWidth(positions),
|
|
51
|
+
height: h,
|
|
52
|
+
clipPath: getClipPath(positions),
|
|
53
|
+
pointerEvents: "auto",
|
|
54
|
+
zIndex: 9999,
|
|
55
|
+
backgroundColor: debug ? "rgba(0, 179, 179, 0.25)" : "transparent"
|
|
56
|
+
},
|
|
57
|
+
onMouseEnter: onEnter,
|
|
58
|
+
onMouseLeave: onLeave
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
const getLeft = ({ x, mouseX }) => mouseX > x ? void 0 : -Math.max(x - mouseX, 10) + "px";
|
|
63
|
+
const getRight = ({ x, w, mouseX }) => mouseX > x ? -Math.max(mouseX - (x + w), 10) + "px" : void 0;
|
|
64
|
+
const getWidth = ({ x, w, mouseX }) => mouseX > x ? Math.max(mouseX - (x + w), 10) + "px" : Math.max(x - mouseX, 10) + "px";
|
|
65
|
+
const getClipPath = ({ x, y, h, mouseX, mouseY }) => mouseX < x ? `polygon(100% 0%, 0% ${100 * (mouseY - y) / h}%, 100% 100%)` : `polygon(0% 0%, 0% 100%, 100% ${100 * (mouseY - y) / h}%)`;
|
|
13
66
|
const DropdownMenu = ({
|
|
14
67
|
items,
|
|
15
68
|
selectedItem,
|
|
@@ -22,7 +75,9 @@ const DropdownMenu = ({
|
|
|
22
75
|
isScrollable = false,
|
|
23
76
|
animationOrigin = "top-left",
|
|
24
77
|
search,
|
|
25
|
-
onClearSearch
|
|
78
|
+
onClearSearch,
|
|
79
|
+
showSelectAll = true,
|
|
80
|
+
showSafeTriangle = false
|
|
26
81
|
}) => {
|
|
27
82
|
const [isAtBottom, setIsAtBottom] = useState(false);
|
|
28
83
|
const scrollContainerRef = useRef(null);
|
|
@@ -62,6 +117,20 @@ const DropdownMenu = ({
|
|
|
62
117
|
}
|
|
63
118
|
return !!selectedItem && selectedItem === value;
|
|
64
119
|
};
|
|
120
|
+
const flattenSelectable = (options) => {
|
|
121
|
+
const out = [];
|
|
122
|
+
const walk = (nodes) => {
|
|
123
|
+
nodes.forEach((n) => {
|
|
124
|
+
if (n.children && n.children.length > 0) {
|
|
125
|
+
walk(n.children);
|
|
126
|
+
} else {
|
|
127
|
+
out.push(n);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
walk(options);
|
|
132
|
+
return out;
|
|
133
|
+
};
|
|
65
134
|
const handleItemClick = (value) => {
|
|
66
135
|
if (multiple) {
|
|
67
136
|
const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];
|
|
@@ -83,7 +152,7 @@ const DropdownMenu = ({
|
|
|
83
152
|
};
|
|
84
153
|
const handleSelectAll = () => {
|
|
85
154
|
const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];
|
|
86
|
-
const allValues = filteredItems.filter((item) => !item.disabled).map((item) => item.value);
|
|
155
|
+
const allValues = flattenSelectable(filteredItems).filter((item) => !item.disabled).map((item) => item.value);
|
|
87
156
|
if (currentSelection.length === allValues.length) {
|
|
88
157
|
handleChange([]);
|
|
89
158
|
} else {
|
|
@@ -92,7 +161,9 @@ const DropdownMenu = ({
|
|
|
92
161
|
};
|
|
93
162
|
const isAllSelected = () => {
|
|
94
163
|
if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;
|
|
95
|
-
const selectableItems = filteredItems.filter(
|
|
164
|
+
const selectableItems = flattenSelectable(filteredItems).filter(
|
|
165
|
+
(item) => !item.disabled
|
|
166
|
+
);
|
|
96
167
|
return selectableItems.length > 0 && selectedItem.length === selectableItems.length && selectableItems.every((item) => selectedItem.includes(item.value));
|
|
97
168
|
};
|
|
98
169
|
return /* @__PURE__ */ jsx(AnimatePresence, { children: isOpen && /* @__PURE__ */ jsx(
|
|
@@ -103,7 +174,7 @@ const DropdownMenu = ({
|
|
|
103
174
|
transition: { duration: 0.1, ease: swift },
|
|
104
175
|
exit: { opacity: 0, scale: 0.8, y: -5 },
|
|
105
176
|
className: classNames(
|
|
106
|
-
"absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border",
|
|
177
|
+
"z-50 absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border",
|
|
107
178
|
(size === "lg" || size === "md") && "min-w-[200px]",
|
|
108
179
|
animationOrigin === "top-left" && "origin-top-left",
|
|
109
180
|
animationOrigin === "top-center" && "origin-top-center",
|
|
@@ -123,7 +194,7 @@ const DropdownMenu = ({
|
|
|
123
194
|
]
|
|
124
195
|
),
|
|
125
196
|
children: [
|
|
126
|
-
multiple && /* @__PURE__ */ jsxs("div", { className: "group flex flex-col gap-y-1", children: [
|
|
197
|
+
multiple && showSelectAll && /* @__PURE__ */ jsxs("div", { className: "group flex flex-col gap-y-1", children: [
|
|
127
198
|
/* @__PURE__ */ jsxs(
|
|
128
199
|
"button",
|
|
129
200
|
{
|
|
@@ -139,23 +210,34 @@ const DropdownMenu = ({
|
|
|
139
210
|
),
|
|
140
211
|
/* @__PURE__ */ jsx(Divider, { direction: "horizontal" })
|
|
141
212
|
] }),
|
|
142
|
-
filteredItems.length > 0 ? filteredItems.map(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
213
|
+
filteredItems.length > 0 ? filteredItems.map(
|
|
214
|
+
(item) => item.children && item.children.length > 0 ? /* @__PURE__ */ jsx(
|
|
215
|
+
DropdownSubmenuItem,
|
|
216
|
+
{
|
|
217
|
+
item,
|
|
218
|
+
size,
|
|
219
|
+
onLeafClick: handleItemClick,
|
|
220
|
+
isLeafSelected: isItemSelected
|
|
221
|
+
},
|
|
222
|
+
item.value
|
|
223
|
+
) : /* @__PURE__ */ jsx(
|
|
224
|
+
DropdownItem,
|
|
225
|
+
{
|
|
226
|
+
label: item.label,
|
|
227
|
+
icon: item.icon?.name ? {
|
|
228
|
+
name: item.icon.name,
|
|
229
|
+
className: item.icon.className,
|
|
230
|
+
size: item.icon.size,
|
|
231
|
+
difficulties: item.icon.difficulties
|
|
232
|
+
} : void 0,
|
|
233
|
+
onClick: () => handleItemClick(item.value),
|
|
234
|
+
disabled: item.disabled,
|
|
235
|
+
isSelected: isItemSelected(item.value),
|
|
236
|
+
size
|
|
237
|
+
},
|
|
238
|
+
item.value
|
|
239
|
+
)
|
|
240
|
+
) : /* @__PURE__ */ jsx(
|
|
159
241
|
"button",
|
|
160
242
|
{
|
|
161
243
|
onClick: () => {
|
|
@@ -188,7 +270,8 @@ const Dropdown = ({
|
|
|
188
270
|
size = "md",
|
|
189
271
|
isScrollable = false,
|
|
190
272
|
search,
|
|
191
|
-
onClearSearch
|
|
273
|
+
onClearSearch,
|
|
274
|
+
showSelectAll
|
|
192
275
|
}) => {
|
|
193
276
|
const [isOpen, setIsOpen] = useState(false);
|
|
194
277
|
const handleItemClick = (value) => {
|
|
@@ -207,13 +290,27 @@ const Dropdown = ({
|
|
|
207
290
|
};
|
|
208
291
|
useOnClickOutside(ref, handleClickOutside);
|
|
209
292
|
const getSelectedItems = () => {
|
|
293
|
+
const flatten = (options) => {
|
|
294
|
+
const out = [];
|
|
295
|
+
const walk = (nodes) => {
|
|
296
|
+
nodes.forEach((n) => {
|
|
297
|
+
if (n.children && n.children.length > 0) {
|
|
298
|
+
walk(n.children);
|
|
299
|
+
} else {
|
|
300
|
+
out.push(n);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
walk(options);
|
|
305
|
+
return out;
|
|
306
|
+
};
|
|
307
|
+
const leaves = flatten(items);
|
|
210
308
|
if (multiple) {
|
|
211
309
|
const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];
|
|
212
|
-
return
|
|
213
|
-
} else {
|
|
214
|
-
const selected = items.find((item) => item.value === selectedItem);
|
|
215
|
-
return selected ? [selected] : [];
|
|
310
|
+
return leaves.filter((item) => selectedValues.includes(item.value));
|
|
216
311
|
}
|
|
312
|
+
const selected = leaves.find((item) => item.value === selectedItem);
|
|
313
|
+
return selected ? [selected] : [];
|
|
217
314
|
};
|
|
218
315
|
return /* @__PURE__ */ jsxs(
|
|
219
316
|
"div",
|
|
@@ -236,7 +333,8 @@ const Dropdown = ({
|
|
|
236
333
|
multiple,
|
|
237
334
|
count: getSelectedItems().length,
|
|
238
335
|
menuIcon,
|
|
239
|
-
size
|
|
336
|
+
size,
|
|
337
|
+
onClear: () => handleChange(multiple ? [] : void 0)
|
|
240
338
|
}
|
|
241
339
|
),
|
|
242
340
|
/* @__PURE__ */ jsx(
|
|
@@ -252,7 +350,8 @@ const Dropdown = ({
|
|
|
252
350
|
onItemClick: handleItemClick,
|
|
253
351
|
isScrollable,
|
|
254
352
|
search,
|
|
255
|
-
onClearSearch
|
|
353
|
+
onClearSearch,
|
|
354
|
+
showSelectAll
|
|
256
355
|
}
|
|
257
356
|
)
|
|
258
357
|
]
|
|
@@ -269,7 +368,8 @@ const DropdownButton = ({
|
|
|
269
368
|
multiple = false,
|
|
270
369
|
count = 0,
|
|
271
370
|
menuIcon,
|
|
272
|
-
size
|
|
371
|
+
size,
|
|
372
|
+
onClear
|
|
273
373
|
}) => {
|
|
274
374
|
const [isHovered, setIsHovered] = useState(false);
|
|
275
375
|
const hasSelection = selectedItems.length > 0;
|
|
@@ -313,6 +413,7 @@ const DropdownButton = ({
|
|
|
313
413
|
size === "sm" && "!pr-4 !pl-3",
|
|
314
414
|
className
|
|
315
415
|
),
|
|
416
|
+
useDecryptAnimation: false,
|
|
316
417
|
useHoverEffect: false,
|
|
317
418
|
crosshairProps: {
|
|
318
419
|
variant: "corners",
|
|
@@ -325,7 +426,18 @@ const DropdownButton = ({
|
|
|
325
426
|
},
|
|
326
427
|
onClick,
|
|
327
428
|
onMouseEnter: () => setIsHovered(true),
|
|
328
|
-
onMouseLeave: () => setIsHovered(false)
|
|
429
|
+
onMouseLeave: () => setIsHovered(false),
|
|
430
|
+
children: hasSelection && multiple && /* @__PURE__ */ jsx(
|
|
431
|
+
"div",
|
|
432
|
+
{
|
|
433
|
+
className: "absolute right-2 top-1/2 -translate-y-1/2 h-[24px] w-[24px] flex items-center justify-center hover:bg-background/40 transition duration-100 ease-crisp cursor-pointer",
|
|
434
|
+
onClick: (e) => {
|
|
435
|
+
e.stopPropagation();
|
|
436
|
+
onClear?.();
|
|
437
|
+
},
|
|
438
|
+
children: /* @__PURE__ */ jsx(Icon, { name: "Close", size: 12 })
|
|
439
|
+
}
|
|
440
|
+
)
|
|
329
441
|
}
|
|
330
442
|
);
|
|
331
443
|
};
|
|
@@ -381,6 +493,109 @@ const DropdownItem = ({
|
|
|
381
493
|
}
|
|
382
494
|
);
|
|
383
495
|
};
|
|
496
|
+
const DropdownSubmenuItem = ({
|
|
497
|
+
item,
|
|
498
|
+
size = "md",
|
|
499
|
+
onLeafClick,
|
|
500
|
+
isLeafSelected
|
|
501
|
+
}) => {
|
|
502
|
+
const parentRef = useRef(null);
|
|
503
|
+
const submenuRef = useRef(null);
|
|
504
|
+
const [hoverParent, setHoverParent] = useState(false);
|
|
505
|
+
const [hoverSubmenu, setHoverSubmenu] = useState(false);
|
|
506
|
+
const [hoverSafe, setHoverSafe] = useState(false);
|
|
507
|
+
const open = hoverParent || hoverSubmenu || hoverSafe;
|
|
508
|
+
return /* @__PURE__ */ jsxs(
|
|
509
|
+
"div",
|
|
510
|
+
{
|
|
511
|
+
ref: parentRef,
|
|
512
|
+
className: "relative",
|
|
513
|
+
onMouseEnter: () => setHoverParent(true),
|
|
514
|
+
onMouseLeave: () => setHoverParent(false),
|
|
515
|
+
children: [
|
|
516
|
+
/* @__PURE__ */ jsxs(
|
|
517
|
+
"button",
|
|
518
|
+
{
|
|
519
|
+
type: "button",
|
|
520
|
+
className: classNames(
|
|
521
|
+
"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center justify-between gap-x-2.5 w-full outline-none transition-colors duration-100 ease-crisp",
|
|
522
|
+
size === "lg" && "py-4 pl-3 pr-3 text-base",
|
|
523
|
+
size === "md" && "py-3 pl-2.5 pr-3 text-sm",
|
|
524
|
+
size === "sm" && "py-2 pl-2.5 pr-3 h-[36px] text-sm",
|
|
525
|
+
open && "bg-border-light/50"
|
|
526
|
+
),
|
|
527
|
+
disabled: item.disabled,
|
|
528
|
+
children: [
|
|
529
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-x-2.5", children: [
|
|
530
|
+
item.icon?.name && /* @__PURE__ */ jsx(
|
|
531
|
+
Icon,
|
|
532
|
+
{
|
|
533
|
+
name: item.icon.name,
|
|
534
|
+
className: classNames("flex-shrink-0", item.icon.className),
|
|
535
|
+
size: item.icon.size || 18,
|
|
536
|
+
difficulties: item.icon.difficulties
|
|
537
|
+
}
|
|
538
|
+
),
|
|
539
|
+
/* @__PURE__ */ jsx("span", { className: "text-shade-primary font-medium leading-[100%]", children: item.label })
|
|
540
|
+
] }),
|
|
541
|
+
/* @__PURE__ */ jsx(Icon, { name: "ChevronRight", size: 14, className: "text-shade-tertiary" })
|
|
542
|
+
]
|
|
543
|
+
}
|
|
544
|
+
),
|
|
545
|
+
open && /* @__PURE__ */ jsxs(
|
|
546
|
+
"div",
|
|
547
|
+
{
|
|
548
|
+
ref: submenuRef,
|
|
549
|
+
onMouseEnter: () => setHoverSubmenu(true),
|
|
550
|
+
onMouseLeave: () => setHoverSubmenu(false),
|
|
551
|
+
className: classNames(
|
|
552
|
+
"z-[60] absolute top-0 left-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border min-w-[180px]"
|
|
553
|
+
),
|
|
554
|
+
children: [
|
|
555
|
+
/* @__PURE__ */ jsx(
|
|
556
|
+
MouseSafeArea,
|
|
557
|
+
{
|
|
558
|
+
parentRef,
|
|
559
|
+
submenuRef,
|
|
560
|
+
onEnter: () => setHoverSafe(true),
|
|
561
|
+
onLeave: () => setHoverSafe(false)
|
|
562
|
+
}
|
|
563
|
+
),
|
|
564
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-y-1", children: (item.children || []).map(
|
|
565
|
+
(child) => child.children && child.children.length > 0 ? /* @__PURE__ */ jsx(
|
|
566
|
+
DropdownSubmenuItem,
|
|
567
|
+
{
|
|
568
|
+
item: child,
|
|
569
|
+
size,
|
|
570
|
+
onLeafClick,
|
|
571
|
+
isLeafSelected
|
|
572
|
+
},
|
|
573
|
+
child.value
|
|
574
|
+
) : /* @__PURE__ */ jsx(
|
|
575
|
+
DropdownItem,
|
|
576
|
+
{
|
|
577
|
+
label: child.label,
|
|
578
|
+
icon: child.icon?.name ? {
|
|
579
|
+
name: child.icon.name,
|
|
580
|
+
className: child.icon.className,
|
|
581
|
+
size: child.icon.size,
|
|
582
|
+
difficulties: child.icon.difficulties
|
|
583
|
+
} : void 0,
|
|
584
|
+
onClick: () => onLeafClick(child.value),
|
|
585
|
+
disabled: child.disabled,
|
|
586
|
+
isSelected: isLeafSelected(child.value),
|
|
587
|
+
size
|
|
588
|
+
},
|
|
589
|
+
child.value
|
|
590
|
+
)
|
|
591
|
+
) })
|
|
592
|
+
]
|
|
593
|
+
}
|
|
594
|
+
)
|
|
595
|
+
]
|
|
596
|
+
}
|
|
597
|
+
);
|
|
598
|
+
};
|
|
384
599
|
|
|
385
600
|
export { Dropdown, DropdownButton, DropdownItem, DropdownMenu };
|
|
386
601
|
//# sourceMappingURL=Dropdown.mjs.map
|