@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 3.19 kB
Source Map (JSON)
{"version":3,"file":"renderUtils.mjs","names":["Icon"],"sources":["../../src/Menu/renderUtils.tsx"],"sourcesContent":["import type { Key, ReactNode } from 'react';\nimport { isValidElement } from 'react';\n\nimport Icon, { type IconSize } from '@/Icon';\n\nimport type { BaseMenuItemType } from './baseItem';\nimport type { MenuCheckboxItemType } from './checkboxItem';\nimport type { MenuItemType, SubMenuType } from './type';\n\nexport type IconSpaceMode = 'global' | 'group';\n\nexport interface RenderOptions {\n iconSpaceMode?: IconSpaceMode;\n indicatorOnRight?: boolean;\n reserveIconSpace?: boolean;\n}\n\nexport interface RenderItemContentOptions {\n indicatorOnRight?: boolean;\n reserveIconSpace?: boolean;\n submenu?: boolean;\n}\n\ntype KeyableItem = { key?: Key };\n\nexport const getItemKey = (item: KeyableItem, fallback: string): Key => {\n if (item && 'key' in item && item.key !== undefined) return item.key;\n return fallback;\n};\n\ntype LabelableItem = {\n key?: Key;\n label?: ReactNode;\n title?: ReactNode;\n};\n\nexport const getItemLabel = (\n item: MenuItemType | SubMenuType | MenuCheckboxItemType | LabelableItem,\n): ReactNode => {\n if (item.label !== undefined) return item.label;\n if ('title' in item && item.title !== undefined) return item.title;\n return item.key;\n};\n\nexport const renderIcon = (icon: MenuItemType['icon'], size?: IconSize): ReactNode => {\n if (!icon) return null;\n if (isValidElement(icon)) return icon;\n return <Icon icon={icon} size={size} />;\n};\n\nexport const hasAnyIcon = (items: BaseMenuItemType[], recursive = false): boolean => {\n return items.some((item) => {\n if (!item) return false;\n if ((item as MenuCheckboxItemType).type === 'checkbox') return true;\n if ('icon' in item && item.icon) return true;\n if (recursive && 'children' in item && item.children) {\n return hasAnyIcon(item.children as BaseMenuItemType[], true);\n }\n return false;\n });\n};\n\nexport const hasCheckboxAndIcon = (items: BaseMenuItemType[]): boolean => {\n let hasCheckbox = false;\n let hasIcon = false;\n for (const item of items) {\n if (!item) continue;\n if ((item as MenuCheckboxItemType).type === 'checkbox') {\n hasCheckbox = true;\n }\n if ('icon' in item && item.icon) {\n hasIcon = true;\n }\n if (hasCheckbox && hasIcon) return true;\n }\n return false;\n};\n"],"mappings":";;;;;AAyBA,MAAa,cAAc,MAAmB,aAA0B;AACtE,KAAI,QAAQ,SAAS,QAAQ,KAAK,QAAQ,OAAW,QAAO,KAAK;AACjE,QAAO;;AAST,MAAa,gBACX,SACc;AACd,KAAI,KAAK,UAAU,OAAW,QAAO,KAAK;AAC1C,KAAI,WAAW,QAAQ,KAAK,UAAU,OAAW,QAAO,KAAK;AAC7D,QAAO,KAAK;;AAGd,MAAa,cAAc,MAA4B,SAA+B;AACpF,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,eAAe,KAAK,CAAE,QAAO;AACjC,QAAO,oBAACA;EAAW;EAAY;GAAQ;;AAGzC,MAAa,cAAc,OAA2B,YAAY,UAAmB;AACnF,QAAO,MAAM,MAAM,SAAS;AAC1B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAK,KAA8B,SAAS,WAAY,QAAO;AAC/D,MAAI,UAAU,QAAQ,KAAK,KAAM,QAAO;AACxC,MAAI,aAAa,cAAc,QAAQ,KAAK,SAC1C,QAAO,WAAW,KAAK,UAAgC,KAAK;AAE9D,SAAO;GACP;;AAGJ,MAAa,sBAAsB,UAAuC;CACxE,IAAI,cAAc;CAClB,IAAI,UAAU;AACd,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,CAAC,KAAM;AACX,MAAK,KAA8B,SAAS,WAC1C,eAAc;AAEhB,MAAI,UAAU,QAAQ,KAAK,KACzB,WAAU;AAEZ,MAAI,eAAe,QAAS,QAAO;;AAErC,QAAO"}