@aloudata/aloudata-design 3.0.0-beta.9 → 3.0.1

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.
Files changed (172) hide show
  1. package/dist/AProgress/index.d.ts +1 -1
  2. package/dist/AProgress/index.js +19 -5
  3. package/dist/AProgress/index.js.map +1 -1
  4. package/dist/Alert/index.d.ts +1 -1
  5. package/dist/Alert/index.js +22 -8
  6. package/dist/Alert/index.js.map +1 -1
  7. package/dist/Avatar/component/Avatar/index.d.ts +1 -1
  8. package/dist/Avatar/component/Avatar/index.js +4 -4
  9. package/dist/Avatar/component/Avatar/index.js.map +1 -1
  10. package/dist/Avatar/component/Avatar/type.d.ts +1 -1
  11. package/dist/Avatar/component/Avatar/type.js +6 -1
  12. package/dist/Avatar/component/Avatar/type.js.map +1 -1
  13. package/dist/Avatar/index.js +67 -8
  14. package/dist/Avatar/index.js.map +1 -1
  15. package/dist/Badge/index.d.ts +1 -0
  16. package/dist/Badge/index.js +32 -9
  17. package/dist/Badge/index.js.map +1 -1
  18. package/dist/Breadcrumb/index.js +21 -12
  19. package/dist/Breadcrumb/index.js.map +1 -1
  20. package/dist/Button/index.d.ts +2 -0
  21. package/dist/Button/index.js +39 -32
  22. package/dist/Button/index.js.map +1 -1
  23. package/dist/Card/index.js +5 -5
  24. package/dist/Card/index.js.map +1 -1
  25. package/dist/Checkbox/index.js +5 -12
  26. package/dist/Checkbox/index.js.map +1 -1
  27. package/dist/Checkbox/type.d.ts +3 -1
  28. package/dist/Collapse/index.js +40 -24
  29. package/dist/Collapse/index.js.map +1 -1
  30. package/dist/DataPreviewTable/components/Body/Cell.js +5 -4
  31. package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
  32. package/dist/DataPreviewTable/components/Body/Error.js +1 -1
  33. package/dist/DataPreviewTable/components/Body/Error.js.map +1 -1
  34. package/dist/DataPreviewTable/components/Body/index.js +2 -1
  35. package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
  36. package/dist/DataPreviewTable/components/DragBar/index.js +1 -1
  37. package/dist/DataPreviewTable/components/DragBar/index.js.map +1 -1
  38. package/dist/DataPreviewTable/components/Header/index.js +14 -12
  39. package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
  40. package/dist/DataPreviewTable/index.js +5 -6
  41. package/dist/DataPreviewTable/index.js.map +1 -1
  42. package/dist/DatePicker/index.d.ts +4 -0
  43. package/dist/DatePicker/index.js +8 -6
  44. package/dist/DatePicker/index.js.map +1 -1
  45. package/dist/Drawer/index.d.ts +1 -0
  46. package/dist/Drawer/index.js +102 -47
  47. package/dist/Drawer/index.js.map +1 -1
  48. package/dist/Dropdown/index.d.ts +5 -0
  49. package/dist/Dropdown/index.js +155 -34
  50. package/dist/Dropdown/index.js.map +1 -1
  51. package/dist/Form/index.d.ts +45 -5
  52. package/dist/Form/index.js +59 -34
  53. package/dist/Form/index.js.map +1 -1
  54. package/dist/HighlightText/index.js +1 -1
  55. package/dist/HighlightText/index.js.map +1 -1
  56. package/dist/Input/components/Input/index.d.ts +5 -2
  57. package/dist/Input/components/Input/index.js +18 -6
  58. package/dist/Input/components/Input/index.js.map +1 -1
  59. package/dist/InputNumber/index.js +1 -0
  60. package/dist/InputNumber/index.js.map +1 -1
  61. package/dist/InputNumber/type.d.ts +2 -2
  62. package/dist/InputSearch/index.d.ts +3 -0
  63. package/dist/InputSearch/index.js +3 -2
  64. package/dist/InputSearch/index.js.map +1 -1
  65. package/dist/Layout/index.js +1 -1
  66. package/dist/Layout/index.js.map +1 -1
  67. package/dist/LogicTree/DisplayLogicTree.d.ts +1 -1
  68. package/dist/LogicTree/DisplayLogicTree.js.map +1 -1
  69. package/dist/LogicTree/components/DisplayLogicItem/index.d.ts +1 -1
  70. package/dist/LogicTree/components/DisplayLogicItem/index.js +1 -1
  71. package/dist/LogicTree/components/DisplayLogicItem/index.js.map +1 -1
  72. package/dist/LogicTree/components/LogicItem/index.js +2 -3
  73. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  74. package/dist/LogicTree/index.d.ts +1 -1
  75. package/dist/LogicTree/index.js +26 -10
  76. package/dist/LogicTree/index.js.map +1 -1
  77. package/dist/MemberPicker/components/NickLabel.js +1 -1
  78. package/dist/MemberPicker/components/NickLabel.js.map +1 -1
  79. package/dist/MemberPicker/components/Panel.js +13 -14
  80. package/dist/MemberPicker/components/Panel.js.map +1 -1
  81. package/dist/MemberPicker/index.js +10 -5
  82. package/dist/MemberPicker/index.js.map +1 -1
  83. package/dist/Menu/index.d.ts +4 -0
  84. package/dist/Menu/index.js +35 -13
  85. package/dist/Menu/index.js.map +1 -1
  86. package/dist/Modal/index.d.ts +5 -2
  87. package/dist/Modal/index.js +119 -66
  88. package/dist/Modal/index.js.map +1 -1
  89. package/dist/Popconfirm/index.js +6 -1
  90. package/dist/Popconfirm/index.js.map +1 -1
  91. package/dist/Popover/index.js +5 -3
  92. package/dist/Popover/index.js.map +1 -1
  93. package/dist/Progress/index.d.ts +0 -3
  94. package/dist/Progress/index.js +0 -3
  95. package/dist/Progress/index.js.map +1 -1
  96. package/dist/Radio/components/Radio/index.js +14 -25
  97. package/dist/Radio/components/Radio/index.js.map +1 -1
  98. package/dist/RenameInput/index.js +0 -1
  99. package/dist/RenameInput/index.js.map +1 -1
  100. package/dist/Select/BaseSelect.js +12 -7
  101. package/dist/Select/BaseSelect.js.map +1 -1
  102. package/dist/Select/Selector/MultipleSelector.js +10 -6
  103. package/dist/Select/Selector/MultipleSelector.js.map +1 -1
  104. package/dist/Select/Selector/index.d.ts +2 -0
  105. package/dist/Select/Selector/index.js +1 -1
  106. package/dist/Select/Selector/index.js.map +1 -1
  107. package/dist/Select/components/Suffix.js +1 -1
  108. package/dist/Select/components/Suffix.js.map +1 -1
  109. package/dist/Select/interface.d.ts +4 -0
  110. package/dist/Select/utils/getWidthStyle.js.map +1 -1
  111. package/dist/Steps/index.js +6 -6
  112. package/dist/Steps/index.js.map +1 -1
  113. package/dist/Switch/index.js +21 -7
  114. package/dist/Switch/index.js.map +1 -1
  115. package/dist/Table/components/Footer/index.js +1 -1
  116. package/dist/Table/components/Footer/index.js.map +1 -1
  117. package/dist/Table/hooks/useRowDnd.js +2 -8
  118. package/dist/Table/hooks/useRowDnd.js.map +1 -1
  119. package/dist/Table/hooks/useRowSelection.d.ts +1 -1
  120. package/dist/Table/hooks/useRowSelection.js +7 -9
  121. package/dist/Table/hooks/useRowSelection.js.map +1 -1
  122. package/dist/Table/index.js +1 -1
  123. package/dist/Table/index.js.map +1 -1
  124. package/dist/Tabs/index.js +37 -30
  125. package/dist/Tabs/index.js.map +1 -1
  126. package/dist/Tooltip/index.js +5 -3
  127. package/dist/Tooltip/index.js.map +1 -1
  128. package/dist/Tour/index.js +48 -38
  129. package/dist/Tour/index.js.map +1 -1
  130. package/dist/Tree/DirectoryTree.d.ts +2 -2
  131. package/dist/Tree/DirectoryTree.js.map +1 -1
  132. package/dist/Tree/Tree.d.ts +13 -2
  133. package/dist/Tree/Tree2.js +86 -8
  134. package/dist/Tree/Tree2.js.map +1 -1
  135. package/dist/Tree/utils/composeAllowDrop.d.ts +14 -0
  136. package/dist/Tree/utils/composeAllowDrop.js +20 -0
  137. package/dist/Tree/utils/composeAllowDrop.js.map +1 -0
  138. package/dist/Upload/index.d.ts +15 -2
  139. package/dist/Upload/index.js +4 -2
  140. package/dist/Upload/index.js.map +1 -1
  141. package/dist/_utils/floatingLayer.d.ts +15 -0
  142. package/dist/_utils/floatingLayer.js +30 -0
  143. package/dist/_utils/floatingLayer.js.map +1 -0
  144. package/dist/_utils/storybookArgTypes.d.ts +11 -0
  145. package/dist/_utils/storybookArgTypes.js +2 -0
  146. package/dist/aloudata-design.css +1 -1
  147. package/dist/index.d.ts +15 -6
  148. package/dist/index.js +8 -3
  149. package/dist/theme/createTheme.d.ts +2 -0
  150. package/dist/theme/createTheme.js +46 -0
  151. package/dist/theme/createTheme.js.map +1 -0
  152. package/dist/theme/defaultTheme.d.ts +2 -0
  153. package/dist/theme/defaultTheme.js +19 -0
  154. package/dist/theme/defaultTheme.js.map +1 -0
  155. package/dist/theme/index.d.ts +5 -0
  156. package/dist/theme/index.js +4 -0
  157. package/dist/theme/initAldTheme.d.ts +2 -0
  158. package/dist/theme/initAldTheme.js +26 -0
  159. package/dist/theme/initAldTheme.js.map +1 -0
  160. package/dist/theme/themeToCssVars.d.ts +2 -0
  161. package/dist/theme/themeToCssVars.js +144 -0
  162. package/dist/theme/themeToCssVars.js.map +1 -0
  163. package/dist/theme/tokenMap.d.ts +5 -0
  164. package/dist/theme/tokenMap.js +12 -0
  165. package/dist/theme/tokenMap.js.map +1 -0
  166. package/dist/theme/types.d.ts +20 -0
  167. package/dist/theme/types.js +2 -0
  168. package/dist/theme.d.ts +2 -0
  169. package/package.json +9 -4
  170. package/dist/_utils/SimpleOverflow.d.ts +0 -14
  171. package/dist/_utils/SimpleOverflow.js +0 -61
  172. package/dist/_utils/SimpleOverflow.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Tooltip/index.tsx"],"sourcesContent":["import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport React from 'react';\nimport { cn } from '../lib/utils';\n\nexport type ActionType = 'hover' | 'focus' | 'click' | 'contextMenu';\n\nexport interface ITooltipProps {\n title?: React.ReactNode;\n /** Alias for title, for Popover-style usage */\n content?: React.ReactNode;\n destroyTooltipOnHide?: boolean;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n mouseEnterDelay?: number;\n mouseLeaveDelay?: number;\n placement?:\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight'\n | 'leftTop'\n | 'leftBottom'\n | 'rightTop'\n | 'rightBottom';\n trigger?: ActionType | ActionType[];\n zIndex?: number;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n overlayClassName?: string;\n /** Custom class for the root element */\n rootClassName?: string;\n getTooltipContainer?: (node: HTMLElement) => HTMLElement;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst sideMap: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right',\n topLeft: 'top',\n topRight: 'top',\n bottomLeft: 'bottom',\n bottomRight: 'bottom',\n leftTop: 'left',\n leftBottom: 'left',\n rightTop: 'right',\n rightBottom: 'right',\n};\n\nconst alignMap: Record<string, 'start' | 'end' | 'center'> = {\n topLeft: 'start',\n topRight: 'end',\n bottomLeft: 'start',\n bottomRight: 'end',\n leftTop: 'start',\n leftBottom: 'end',\n rightTop: 'start',\n rightBottom: 'end',\n};\n\nfunction isClickTrigger(trigger?: ActionType | ActionType[]): boolean {\n if (!trigger) return false;\n if (Array.isArray(trigger)) return trigger.includes('click');\n return trigger === 'click';\n}\n\nfunction isTriggerDisabled(trigger?: ActionType | ActionType[]): boolean {\n return Array.isArray(trigger) && trigger.length === 0;\n}\n\nconst contentClasses =\n 'ald-tooltip-overlay tw-z-50 tw-min-h-[28px] tw-rounded-r-50 tw-px-2 tw-py-1.5 tw-text-xs tw-leading-4 tw-bg-[var(--alias-colors-bg-skeleton-inverse-subtler)] tw-text-[var(--alias-colors-text-inverse-strong)] tw-animate-in tw-fade-in-0 tw-zoom-in-95';\n\nfunction usePortalContainer(\n getPopupContainer?: (node: HTMLElement) => HTMLElement,\n getTooltipContainer?: (node: HTMLElement) => HTMLElement,\n) {\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const [container, setContainer] = React.useState<HTMLElement | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const getter = getPopupContainer || getTooltipContainer;\n if (getter && triggerRef.current) {\n setContainer(getter(triggerRef.current));\n }\n }, [getPopupContainer, getTooltipContainer]);\n\n return { triggerRef, container };\n}\n\nfunction ClickTooltip({\n children,\n title,\n open,\n onOpenChange,\n placement = 'top',\n overlayClassName,\n zIndex,\n container,\n triggerRef,\n}: Pick<\n ITooltipProps,\n | 'children'\n | 'title'\n | 'open'\n | 'onOpenChange'\n | 'placement'\n | 'overlayClassName'\n | 'zIndex'\n> & {\n container?: HTMLElement;\n triggerRef: React.RefObject<HTMLElement | null>;\n}) {\n const side = sideMap[placement] || 'top';\n const align = alignMap[placement] || 'center';\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <PopoverPrimitive.Trigger asChild>\n {React.isValidElement(children) ? (\n React.cloneElement(children as React.ReactElement, {\n ref: triggerRef,\n })\n ) : (\n <span ref={triggerRef as React.RefObject<HTMLSpanElement>}>\n {children}\n </span>\n )}\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n side={side}\n align={align}\n sideOffset={4}\n className={cn(contentClasses, overlayClassName)}\n style={\n zIndex !== null && zIndex !== undefined ? { zIndex } : undefined\n }\n >\n {title}\n <PopoverPrimitive.Arrow className=\"tw-fill-[var(--alias-colors-bg-skeleton-inverse-subtler)]\" />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\nexport default function Tooltip(props: ITooltipProps) {\n const {\n children,\n title,\n open,\n onOpenChange,\n placement = 'top',\n mouseEnterDelay = 0,\n mouseLeaveDelay = 0,\n overlayClassName,\n trigger,\n getPopupContainer,\n getTooltipContainer,\n zIndex,\n } = props;\n\n const { triggerRef, container } = usePortalContainer(\n getPopupContainer,\n getTooltipContainer,\n );\n\n if (!title && title !== 0) {\n return <>{children}</>;\n }\n\n if (isTriggerDisabled(trigger)) {\n return <>{children}</>;\n }\n\n if (isClickTrigger(trigger)) {\n return (\n <ClickTooltip\n title={title}\n open={open}\n onOpenChange={onOpenChange}\n placement={placement}\n overlayClassName={overlayClassName}\n zIndex={zIndex}\n container={container}\n triggerRef={triggerRef}\n >\n {children}\n </ClickTooltip>\n );\n }\n\n const side = sideMap[placement] || 'top';\n const align = alignMap[placement] || 'center';\n\n return (\n <TooltipPrimitive.Provider\n delayDuration={mouseEnterDelay * 1000}\n skipDelayDuration={mouseLeaveDelay * 1000}\n >\n <TooltipPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <TooltipPrimitive.Trigger asChild>\n {React.isValidElement(children) ? (\n React.cloneElement(children as React.ReactElement, {\n ref: triggerRef,\n })\n ) : (\n <span ref={triggerRef as React.RefObject<HTMLSpanElement>}>\n {children}\n </span>\n )}\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Content\n side={side}\n align={align}\n sideOffset={4}\n className={cn(contentClasses, overlayClassName)}\n style={\n zIndex !== null && zIndex !== undefined ? { zIndex } : undefined\n }\n >\n {title}\n <TooltipPrimitive.Arrow className=\"tw-fill-[var(--alias-colors-bg-skeleton-inverse-subtler)]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Tooltip/index.tsx"],"sourcesContent":["import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport React from 'react';\nimport { useFloatingPopupZIndex } from '../_utils/floatingLayer';\nimport { cn } from '../lib/utils';\n\nexport type ActionType = 'hover' | 'focus' | 'click' | 'contextMenu';\n\nexport interface ITooltipProps {\n title?: React.ReactNode;\n /** Alias for title, for Popover-style usage */\n content?: React.ReactNode;\n destroyTooltipOnHide?: boolean;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n mouseEnterDelay?: number;\n mouseLeaveDelay?: number;\n placement?:\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight'\n | 'leftTop'\n | 'leftBottom'\n | 'rightTop'\n | 'rightBottom';\n trigger?: ActionType | ActionType[];\n zIndex?: number;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n overlayClassName?: string;\n /** Custom class for the root element */\n rootClassName?: string;\n getTooltipContainer?: (node: HTMLElement) => HTMLElement;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst sideMap: Record<string, 'top' | 'bottom' | 'left' | 'right'> = {\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right',\n topLeft: 'top',\n topRight: 'top',\n bottomLeft: 'bottom',\n bottomRight: 'bottom',\n leftTop: 'left',\n leftBottom: 'left',\n rightTop: 'right',\n rightBottom: 'right',\n};\n\nconst alignMap: Record<string, 'start' | 'end' | 'center'> = {\n topLeft: 'start',\n topRight: 'end',\n bottomLeft: 'start',\n bottomRight: 'end',\n leftTop: 'start',\n leftBottom: 'end',\n rightTop: 'start',\n rightBottom: 'end',\n};\n\nfunction isClickTrigger(trigger?: ActionType | ActionType[]): boolean {\n if (!trigger) return false;\n if (Array.isArray(trigger)) return trigger.includes('click');\n return trigger === 'click';\n}\n\nfunction isTriggerDisabled(trigger?: ActionType | ActionType[]): boolean {\n return Array.isArray(trigger) && trigger.length === 0;\n}\n\nconst contentClasses =\n 'ald-tooltip-overlay tw-z-50 tw-min-h-[28px] tw-rounded-r-50 tw-px-2 tw-py-1.5 tw-text-xs tw-leading-4 tw-bg-[var(--alias-colors-bg-skeleton-inverse-subtler)] tw-text-[var(--alias-colors-text-inverse-strong)] tw-animate-in tw-fade-in-0 tw-zoom-in-95';\n\nfunction usePortalContainer(\n getPopupContainer?: (node: HTMLElement) => HTMLElement,\n getTooltipContainer?: (node: HTMLElement) => HTMLElement,\n) {\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const [container, setContainer] = React.useState<HTMLElement | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const getter = getPopupContainer || getTooltipContainer;\n if (getter && triggerRef.current) {\n setContainer(getter(triggerRef.current));\n }\n }, [getPopupContainer, getTooltipContainer]);\n\n return { triggerRef, container };\n}\n\nfunction ClickTooltip({\n children,\n title,\n open,\n onOpenChange,\n placement = 'top',\n overlayClassName,\n zIndex,\n container,\n triggerRef,\n}: Pick<\n ITooltipProps,\n | 'children'\n | 'title'\n | 'open'\n | 'onOpenChange'\n | 'placement'\n | 'overlayClassName'\n | 'zIndex'\n> & {\n container?: HTMLElement;\n triggerRef: React.RefObject<HTMLElement | null>;\n}) {\n const side = sideMap[placement] || 'top';\n const align = alignMap[placement] || 'center';\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <PopoverPrimitive.Trigger asChild>\n {React.isValidElement(children) ? (\n React.cloneElement(children as React.ReactElement, {\n ref: triggerRef,\n })\n ) : (\n <span ref={triggerRef as React.RefObject<HTMLSpanElement>}>\n {children}\n </span>\n )}\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={container}>\n <PopoverPrimitive.Content\n side={side}\n align={align}\n sideOffset={4}\n className={cn(contentClasses, overlayClassName)}\n style={{ zIndex }}\n >\n {title}\n <PopoverPrimitive.Arrow className=\"tw-fill-[var(--alias-colors-bg-skeleton-inverse-subtler)]\" />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\nexport default function Tooltip(props: ITooltipProps) {\n const {\n children,\n title,\n open,\n onOpenChange,\n placement = 'top',\n mouseEnterDelay = 0,\n mouseLeaveDelay = 0,\n overlayClassName,\n trigger,\n getPopupContainer,\n getTooltipContainer,\n zIndex,\n } = props;\n\n const { triggerRef, container } = usePortalContainer(\n getPopupContainer,\n getTooltipContainer,\n );\n const resolvedZIndex = useFloatingPopupZIndex(zIndex);\n\n if (!title && title !== 0) {\n return <>{children}</>;\n }\n\n if (isTriggerDisabled(trigger)) {\n return <>{children}</>;\n }\n\n if (isClickTrigger(trigger)) {\n return (\n <ClickTooltip\n title={title}\n open={open}\n onOpenChange={onOpenChange}\n placement={placement}\n overlayClassName={overlayClassName}\n zIndex={resolvedZIndex}\n container={container}\n triggerRef={triggerRef}\n >\n {children}\n </ClickTooltip>\n );\n }\n\n const side = sideMap[placement] || 'top';\n const align = alignMap[placement] || 'center';\n\n return (\n <TooltipPrimitive.Provider\n delayDuration={mouseEnterDelay * 1000}\n skipDelayDuration={mouseLeaveDelay * 1000}\n >\n <TooltipPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <TooltipPrimitive.Trigger asChild>\n {React.isValidElement(children) ? (\n React.cloneElement(children as React.ReactElement, {\n ref: triggerRef,\n })\n ) : (\n <span ref={triggerRef as React.RefObject<HTMLSpanElement>}>\n {children}\n </span>\n )}\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal container={container}>\n <TooltipPrimitive.Content\n side={side}\n align={align}\n sideOffset={4}\n className={cn(contentClasses, overlayClassName)}\n style={{ zIndex: resolvedZIndex }}\n >\n {title}\n <TooltipPrimitive.Arrow className=\"tw-fill-[var(--alias-colors-bg-skeleton-inverse-subtler)]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import Button_default from "../Button/index.js";
3
+ import { FloatingLayerProvider, useFloatingLayer } from "../_utils/floatingLayer.js";
3
4
  import { useEffect, useState } from "react";
4
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/Tour/index.tsx
@@ -10,6 +11,7 @@ function Tour(props) {
10
11
  useEffect(() => {
11
12
  if (!open) setInnerCurrent(0);
12
13
  }, [open]);
14
+ const { maskZIndex, contentZIndex, nextLevel } = useFloatingLayer();
13
15
  if (!open || steps.length === 0) return null;
14
16
  const step = steps[current];
15
17
  const isLast = current === steps.length - 1;
@@ -30,47 +32,55 @@ function Tour(props) {
30
32
  };
31
33
  return /* @__PURE__ */ jsxs(Fragment, { children: [mask && /* @__PURE__ */ jsx("div", {
32
34
  className: "ald-tour-mask tw-fixed tw-inset-0 tw-z-[1000] tw-bg-black/45",
35
+ style: { zIndex: maskZIndex },
33
36
  onClick: onClose
34
- }), /* @__PURE__ */ jsxs("div", {
37
+ }), /* @__PURE__ */ jsx("div", {
35
38
  className: cn("ald-tour tw-fixed tw-z-[1001] tw-max-w-sm tw-rounded-r-100 tw-bg-[var(--background-default)] tw-p-6 tw-shadow-xl", "tw-left-1/2 tw-top-1/2 tw--translate-x-1/2 tw--translate-y-1/2", className),
36
- children: [
37
- step?.cover && /* @__PURE__ */ jsx("div", {
38
- className: "ald-tour-cover tw-mb-4",
39
- children: step.cover
40
- }),
41
- step?.title && /* @__PURE__ */ jsx("div", {
42
- className: "ald-tour-title tw-mb-2 tw-text-base tw-font-semibold tw-text-[var(--content-primary)]",
43
- children: step.title
44
- }),
45
- step?.description && /* @__PURE__ */ jsx("div", {
46
- className: "ald-tour-description tw-mb-4 tw-text-sm tw-text-[var(--content-secondary)]",
47
- children: step.description
48
- }),
49
- /* @__PURE__ */ jsxs("div", {
50
- className: "ald-tour-footer tw-flex tw-items-center tw-justify-between",
51
- children: [/* @__PURE__ */ jsxs("span", {
52
- className: "tw-text-xs tw-text-[var(--content-tertiary)]",
53
- children: [
54
- current + 1,
55
- "/",
56
- steps.length
57
- ]
58
- }), /* @__PURE__ */ jsxs("div", {
59
- className: "tw-flex tw-gap-2",
60
- children: [current > 0 && /* @__PURE__ */ jsx(Button_default, {
61
- type: "secondary",
62
- size: "small",
63
- onClick: goPrev,
64
- children: step?.prevButtonProps?.children || "Prev"
65
- }), /* @__PURE__ */ jsx(Button_default, {
66
- type: "primary",
67
- size: "small",
68
- onClick: goNext,
69
- children: step?.nextButtonProps?.children || (isLast ? "Finish" : "Next")
39
+ style: {
40
+ zIndex: contentZIndex,
41
+ ...step?.style
42
+ },
43
+ children: /* @__PURE__ */ jsxs(FloatingLayerProvider, {
44
+ value: nextLevel,
45
+ children: [
46
+ step?.cover && /* @__PURE__ */ jsx("div", {
47
+ className: "ald-tour-cover tw-mb-4",
48
+ children: step.cover
49
+ }),
50
+ step?.title && /* @__PURE__ */ jsx("div", {
51
+ className: "ald-tour-title tw-mb-2 tw-text-base tw-font-semibold tw-text-[var(--content-primary)]",
52
+ children: step.title
53
+ }),
54
+ step?.description && /* @__PURE__ */ jsx("div", {
55
+ className: "ald-tour-description tw-mb-4 tw-text-sm tw-text-[var(--content-secondary)]",
56
+ children: step.description
57
+ }),
58
+ /* @__PURE__ */ jsxs("div", {
59
+ className: "ald-tour-footer tw-flex tw-items-center tw-justify-between",
60
+ children: [/* @__PURE__ */ jsxs("span", {
61
+ className: "tw-text-xs tw-text-[var(--content-tertiary)]",
62
+ children: [
63
+ current + 1,
64
+ "/",
65
+ steps.length
66
+ ]
67
+ }), /* @__PURE__ */ jsxs("div", {
68
+ className: "tw-flex tw-gap-2",
69
+ children: [current > 0 && /* @__PURE__ */ jsx(Button_default, {
70
+ type: "secondary",
71
+ size: "small",
72
+ onClick: goPrev,
73
+ children: step?.prevButtonProps?.children || "Prev"
74
+ }), /* @__PURE__ */ jsx(Button_default, {
75
+ type: "primary",
76
+ size: "small",
77
+ onClick: goNext,
78
+ children: step?.nextButtonProps?.children || (isLast ? "Finish" : "Next")
79
+ })]
70
80
  })]
71
- })]
72
- })
73
- ]
81
+ })
82
+ ]
83
+ })
74
84
  })] });
75
85
  }
76
86
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Tour/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport Button from '../Button';\nimport { cn } from '../lib/utils';\n\nexport interface TourStepProps {\n title?: React.ReactNode;\n description?: React.ReactNode;\n cover?: React.ReactNode;\n target?: (() => HTMLElement | null) | null;\n placement?:\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight';\n mask?: boolean;\n className?: string;\n style?: React.CSSProperties;\n nextButtonProps?: { children?: React.ReactNode };\n prevButtonProps?: { children?: React.ReactNode };\n}\n\nexport interface TourProps {\n open?: boolean;\n onClose?: () => void;\n steps?: TourStepProps[];\n current?: number;\n onChange?: (current: number) => void;\n mask?: boolean;\n type?: 'default' | 'primary';\n className?: string;\n onFinish?: () => void;\n}\n\nfunction Tour(props: TourProps) {\n const {\n open = false,\n onClose,\n steps = [],\n current: controlledCurrent,\n onChange,\n mask = true,\n className,\n onFinish,\n } = props;\n\n const [innerCurrent, setInnerCurrent] = useState(0);\n const current = controlledCurrent ?? innerCurrent;\n\n useEffect(() => {\n if (!open) setInnerCurrent(0);\n }, [open]);\n\n if (!open || steps.length === 0) return null;\n\n const step = steps[current];\n const isLast = current === steps.length - 1;\n\n const goNext = () => {\n if (isLast) {\n onFinish?.();\n onClose?.();\n } else {\n const next = current + 1;\n if (controlledCurrent === undefined) setInnerCurrent(next);\n onChange?.(next);\n }\n };\n\n const goPrev = () => {\n const prev = Math.max(0, current - 1);\n if (controlledCurrent === undefined) setInnerCurrent(prev);\n onChange?.(prev);\n };\n\n return (\n <>\n {mask && (\n <div\n className=\"ald-tour-mask tw-fixed tw-inset-0 tw-z-[1000] tw-bg-black/45\"\n onClick={onClose}\n />\n )}\n <div\n className={cn(\n 'ald-tour tw-fixed tw-z-[1001] tw-max-w-sm tw-rounded-r-100 tw-bg-[var(--background-default)] tw-p-6 tw-shadow-xl',\n 'tw-left-1/2 tw-top-1/2 tw--translate-x-1/2 tw--translate-y-1/2',\n className,\n )}\n >\n {step?.cover && (\n <div className=\"ald-tour-cover tw-mb-4\">{step.cover}</div>\n )}\n {step?.title && (\n <div className=\"ald-tour-title tw-mb-2 tw-text-base tw-font-semibold tw-text-[var(--content-primary)]\">\n {step.title}\n </div>\n )}\n {step?.description && (\n <div className=\"ald-tour-description tw-mb-4 tw-text-sm tw-text-[var(--content-secondary)]\">\n {step.description}\n </div>\n )}\n <div className=\"ald-tour-footer tw-flex tw-items-center tw-justify-between\">\n <span className=\"tw-text-xs tw-text-[var(--content-tertiary)]\">\n {current + 1}/{steps.length}\n </span>\n <div className=\"tw-flex tw-gap-2\">\n {current > 0 && (\n <Button type=\"secondary\" size=\"small\" onClick={goPrev}>\n {step?.prevButtonProps?.children || 'Prev'}\n </Button>\n )}\n <Button type=\"primary\" size=\"small\" onClick={goNext}>\n {step?.nextButtonProps?.children || (isLast ? 'Finish' : 'Next')}\n </Button>\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport default Tour;\n"],"mappings":";;;;;AAqCA,SAAS,KAAK,OAAkB;CAC9B,MAAM,EACJ,OAAO,OACP,SACA,QAAQ,EAAE,EACV,SAAS,mBACT,UACA,OAAO,MACP,WACA,aACE;CAEJ,MAAM,CAAC,cAAc,mBAAmB,SAAS,EAAE;CACnD,MAAM,UAAU,qBAAqB;AAErC,iBAAgB;AACd,MAAI,CAAC,KAAM,iBAAgB,EAAE;IAC5B,CAAC,KAAK,CAAC;AAEV,KAAI,CAAC,QAAQ,MAAM,WAAW,EAAG,QAAO;CAExC,MAAM,OAAO,MAAM;CACnB,MAAM,SAAS,YAAY,MAAM,SAAS;CAE1C,MAAM,eAAe;AACnB,MAAI,QAAQ;AACV,eAAY;AACZ,cAAW;SACN;GACL,MAAM,OAAO,UAAU;AACvB,OAAI,sBAAsB,OAAW,iBAAgB,KAAK;AAC1D,cAAW,KAAK;;;CAIpB,MAAM,eAAe;EACnB,MAAM,OAAO,KAAK,IAAI,GAAG,UAAU,EAAE;AACrC,MAAI,sBAAsB,OAAW,iBAAgB,KAAK;AAC1D,aAAW,KAAK;;AAGlB,QACE,qBAAA,UAAA,EAAA,UAAA,CACG,QACC,oBAAC,OAAD;EACE,WAAU;EACV,SAAS;EACT,CAAA,EAEJ,qBAAC,OAAD;EACE,WAAW,GACT,oHACA,kEACA,UACD;YALH;GAOG,MAAM,SACL,oBAAC,OAAD;IAAK,WAAU;cAA0B,KAAK;IAAY,CAAA;GAE3D,MAAM,SACL,oBAAC,OAAD;IAAK,WAAU;cACZ,KAAK;IACF,CAAA;GAEP,MAAM,eACL,oBAAC,OAAD;IAAK,WAAU;cACZ,KAAK;IACF,CAAA;GAER,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,qBAAC,QAAD;KAAM,WAAU;eAAhB;MACG,UAAU;MAAE;MAAE,MAAM;MAChB;QACP,qBAAC,OAAD;KAAK,WAAU;eAAf,CACG,UAAU,KACT,oBAAC,gBAAD;MAAQ,MAAK;MAAY,MAAK;MAAQ,SAAS;gBAC5C,MAAM,iBAAiB,YAAY;MAC7B,CAAA,EAEX,oBAAC,gBAAD;MAAQ,MAAK;MAAU,MAAK;MAAQ,SAAS;gBAC1C,MAAM,iBAAiB,aAAa,SAAS,WAAW;MAClD,CAAA,CACL;OACF;;GACF;IACL,EAAA,CAAA"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Tour/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport Button from '../Button';\nimport {\n FloatingLayerProvider,\n useFloatingLayer,\n} from '../_utils/floatingLayer';\nimport { cn } from '../lib/utils';\n\nexport interface TourStepProps {\n title?: React.ReactNode;\n description?: React.ReactNode;\n cover?: React.ReactNode;\n target?: (() => HTMLElement | null) | null;\n placement?:\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight';\n mask?: boolean;\n className?: string;\n style?: React.CSSProperties;\n nextButtonProps?: { children?: React.ReactNode };\n prevButtonProps?: { children?: React.ReactNode };\n}\n\nexport interface TourProps {\n open?: boolean;\n onClose?: () => void;\n steps?: TourStepProps[];\n current?: number;\n onChange?: (current: number) => void;\n mask?: boolean;\n type?: 'default' | 'primary';\n className?: string;\n onFinish?: () => void;\n}\n\nfunction Tour(props: TourProps) {\n const {\n open = false,\n onClose,\n steps = [],\n current: controlledCurrent,\n onChange,\n mask = true,\n className,\n onFinish,\n } = props;\n\n const [innerCurrent, setInnerCurrent] = useState(0);\n const current = controlledCurrent ?? innerCurrent;\n\n useEffect(() => {\n if (!open) setInnerCurrent(0);\n }, [open]);\n\n const { maskZIndex, contentZIndex, nextLevel } = useFloatingLayer();\n\n if (!open || steps.length === 0) return null;\n\n const step = steps[current];\n const isLast = current === steps.length - 1;\n\n const goNext = () => {\n if (isLast) {\n onFinish?.();\n onClose?.();\n } else {\n const next = current + 1;\n if (controlledCurrent === undefined) setInnerCurrent(next);\n onChange?.(next);\n }\n };\n\n const goPrev = () => {\n const prev = Math.max(0, current - 1);\n if (controlledCurrent === undefined) setInnerCurrent(prev);\n onChange?.(prev);\n };\n\n return (\n <>\n {mask && (\n <div\n className=\"ald-tour-mask tw-fixed tw-inset-0 tw-z-[1000] tw-bg-black/45\"\n style={{ zIndex: maskZIndex }}\n onClick={onClose}\n />\n )}\n <div\n className={cn(\n 'ald-tour tw-fixed tw-z-[1001] tw-max-w-sm tw-rounded-r-100 tw-bg-[var(--background-default)] tw-p-6 tw-shadow-xl',\n 'tw-left-1/2 tw-top-1/2 tw--translate-x-1/2 tw--translate-y-1/2',\n className,\n )}\n style={{ zIndex: contentZIndex, ...step?.style }}\n >\n <FloatingLayerProvider value={nextLevel}>\n {step?.cover && (\n <div className=\"ald-tour-cover tw-mb-4\">{step.cover}</div>\n )}\n {step?.title && (\n <div className=\"ald-tour-title tw-mb-2 tw-text-base tw-font-semibold tw-text-[var(--content-primary)]\">\n {step.title}\n </div>\n )}\n {step?.description && (\n <div className=\"ald-tour-description tw-mb-4 tw-text-sm tw-text-[var(--content-secondary)]\">\n {step.description}\n </div>\n )}\n <div className=\"ald-tour-footer tw-flex tw-items-center tw-justify-between\">\n <span className=\"tw-text-xs tw-text-[var(--content-tertiary)]\">\n {current + 1}/{steps.length}\n </span>\n <div className=\"tw-flex tw-gap-2\">\n {current > 0 && (\n <Button type=\"secondary\" size=\"small\" onClick={goPrev}>\n {step?.prevButtonProps?.children || 'Prev'}\n </Button>\n )}\n <Button type=\"primary\" size=\"small\" onClick={goNext}>\n {step?.nextButtonProps?.children ||\n (isLast ? 'Finish' : 'Next')}\n </Button>\n </div>\n </div>\n </FloatingLayerProvider>\n </div>\n </>\n );\n}\n\nexport default Tour;\n"],"mappings":";;;;;;AAyCA,SAAS,KAAK,OAAkB;CAC9B,MAAM,EACJ,OAAO,OACP,SACA,QAAQ,EAAE,EACV,SAAS,mBACT,UACA,OAAO,MACP,WACA,aACE;CAEJ,MAAM,CAAC,cAAc,mBAAmB,SAAS,EAAE;CACnD,MAAM,UAAU,qBAAqB;AAErC,iBAAgB;AACd,MAAI,CAAC,KAAM,iBAAgB,EAAE;IAC5B,CAAC,KAAK,CAAC;CAEV,MAAM,EAAE,YAAY,eAAe,cAAc,kBAAkB;AAEnE,KAAI,CAAC,QAAQ,MAAM,WAAW,EAAG,QAAO;CAExC,MAAM,OAAO,MAAM;CACnB,MAAM,SAAS,YAAY,MAAM,SAAS;CAE1C,MAAM,eAAe;AACnB,MAAI,QAAQ;AACV,eAAY;AACZ,cAAW;SACN;GACL,MAAM,OAAO,UAAU;AACvB,OAAI,sBAAsB,OAAW,iBAAgB,KAAK;AAC1D,cAAW,KAAK;;;CAIpB,MAAM,eAAe;EACnB,MAAM,OAAO,KAAK,IAAI,GAAG,UAAU,EAAE;AACrC,MAAI,sBAAsB,OAAW,iBAAgB,KAAK;AAC1D,aAAW,KAAK;;AAGlB,QACE,qBAAA,UAAA,EAAA,UAAA,CACG,QACC,oBAAC,OAAD;EACE,WAAU;EACV,OAAO,EAAE,QAAQ,YAAY;EAC7B,SAAS;EACT,CAAA,EAEJ,oBAAC,OAAD;EACE,WAAW,GACT,oHACA,kEACA,UACD;EACD,OAAO;GAAE,QAAQ;GAAe,GAAG,MAAM;GAAO;YAEhD,qBAAC,uBAAD;GAAuB,OAAO;aAA9B;IACG,MAAM,SACL,oBAAC,OAAD;KAAK,WAAU;eAA0B,KAAK;KAAY,CAAA;IAE3D,MAAM,SACL,oBAAC,OAAD;KAAK,WAAU;eACZ,KAAK;KACF,CAAA;IAEP,MAAM,eACL,oBAAC,OAAD;KAAK,WAAU;eACZ,KAAK;KACF,CAAA;IAER,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,QAAD;MAAM,WAAU;gBAAhB;OACG,UAAU;OAAE;OAAE,MAAM;OAChB;SACP,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,UAAU,KACT,oBAAC,gBAAD;OAAQ,MAAK;OAAY,MAAK;OAAQ,SAAS;iBAC5C,MAAM,iBAAiB,YAAY;OAC7B,CAAA,EAEX,oBAAC,gBAAD;OAAQ,MAAK;OAAU,MAAK;OAAQ,SAAS;iBAC1C,MAAM,iBAAiB,aACrB,SAAS,WAAW;OAChB,CAAA,CACL;QACF;;IACgB;;EACpB,CAAA,CACL,EAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { default as RcTree, BasicDataNode } from 'rc-tree';
1
+ import { BasicDataNode } from 'rc-tree';
2
2
  import { DataNode, Key } from 'rc-tree/es/interface';
3
3
  import { TreeProps } from './Tree.js';
4
4
  import * as React from 'react';
@@ -7,7 +7,7 @@ export interface DirectoryTreeProps<T extends BasicDataNode = DataNode> extends
7
7
  expandAction?: ExpandAction;
8
8
  }
9
9
  type DirectoryTreeCompoundedComponent = (<T extends BasicDataNode | DataNode = DataNode>(props: React.PropsWithChildren<DirectoryTreeProps<T>> & {
10
- ref?: React.Ref<RcTree>;
10
+ ref?: React.Ref<any>;
11
11
  }) => React.ReactElement) & {
12
12
  displayName?: string;
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DirectoryTree.js","names":[],"sources":["../../src/Tree/DirectoryTree.tsx"],"sourcesContent":["import { cn } from '../lib/utils';\nimport type RcTree from 'rc-tree';\nimport type { BasicDataNode } from 'rc-tree';\nimport type { DataNode, EventDataNode, Key } from 'rc-tree/es/interface';\nimport { conductExpandParent } from 'rc-tree/es/util';\nimport {\n convertDataToEntities,\n convertTreeToData,\n} from 'rc-tree/es/utils/treeUtil';\nimport * as React from 'react';\nimport { ConfigContext } from '../ConfigProvider';\n\nimport type { TreeProps } from './Tree';\nimport Tree from './Tree';\nimport { calcRangeKeys, convertDirectoryKeysToNodes } from './utils/dictUtil';\n\nexport type ExpandAction = false | 'click' | 'doubleClick';\n\nexport interface DirectoryTreeProps<T extends BasicDataNode = DataNode>\n extends TreeProps<T> {\n expandAction?: ExpandAction;\n}\n\ntype DirectoryTreeCompoundedComponent = (<\n T extends BasicDataNode | DataNode = DataNode,\n>(\n props: React.PropsWithChildren<DirectoryTreeProps<T>> & {\n ref?: React.Ref<RcTree>;\n },\n) => React.ReactElement) & {\n displayName?: string;\n};\n\nexport interface DirectoryTreeState {\n expandedKeys?: Key[];\n selectedKeys?: Key[];\n}\n\nfunction getTreeData({ treeData, children }: DirectoryTreeProps) {\n return treeData || convertTreeToData(children);\n}\n\nconst DirectoryTree: React.ForwardRefRenderFunction<\n RcTree,\n DirectoryTreeProps\n> = (\n { defaultExpandAll, defaultExpandParent, defaultExpandedKeys, ...props },\n ref,\n) => {\n // Shift click usage\n const lastSelectedKey = React.useRef<Key>();\n\n const cachedSelectedKeys = React.useRef<Key[]>();\n\n const getInitExpandedKeys = () => {\n const { keyEntities } = convertDataToEntities(getTreeData(props));\n\n let initExpandedKeys: Key[];\n\n // Expanded keys\n if (defaultExpandAll) {\n initExpandedKeys = Object.keys(keyEntities);\n } else if (defaultExpandParent) {\n initExpandedKeys = conductExpandParent(\n props.expandedKeys || defaultExpandedKeys || [],\n keyEntities,\n );\n } else {\n initExpandedKeys = (props.expandedKeys || defaultExpandedKeys)!;\n }\n return initExpandedKeys;\n };\n\n const [selectedKeys, setSelectedKeys] = React.useState(\n props.selectedKeys || props.defaultSelectedKeys || [],\n );\n const [expandedKeys, setExpandedKeys] = React.useState(() =>\n getInitExpandedKeys(),\n );\n\n React.useEffect(() => {\n if ('selectedKeys' in props) {\n setSelectedKeys(props.selectedKeys!);\n }\n }, [props.selectedKeys, props]);\n\n React.useEffect(() => {\n if ('expandedKeys' in props) {\n setExpandedKeys(props.expandedKeys!);\n }\n }, [props.expandedKeys, props]);\n\n const onExpand = (\n keys: Key[],\n info: {\n node: EventDataNode<any>;\n expanded: boolean;\n nativeEvent: MouseEvent;\n },\n ) => {\n if (!('expandedKeys' in props)) {\n setExpandedKeys(keys);\n }\n // Call origin function\n return props.onExpand?.(keys, info);\n };\n\n const onSelect = (\n keys: Key[],\n event: {\n event: 'select';\n selected: boolean;\n node: any;\n selectedNodes: DataNode[];\n nativeEvent: MouseEvent;\n },\n ) => {\n const { multiple } = props;\n const { node, nativeEvent } = event;\n const { key = '' } = node;\n\n const treeData = getTreeData(props);\n // const newState: DirectoryTreeState = {};\n\n // We need wrap this event since some value is not same\n const newEvent: any = {\n ...event,\n selected: true, // Directory selected always true\n };\n\n // Windows / Mac single pick\n const ctrlPick: boolean = nativeEvent?.ctrlKey || nativeEvent?.metaKey;\n const shiftPick: boolean = nativeEvent?.shiftKey;\n\n // Generate new selected keys\n let newSelectedKeys: Key[];\n if (multiple && ctrlPick) {\n // Control click\n newSelectedKeys = keys;\n lastSelectedKey.current = key;\n cachedSelectedKeys.current = newSelectedKeys;\n newEvent.selectedNodes = convertDirectoryKeysToNodes(\n treeData,\n newSelectedKeys,\n );\n } else if (multiple && shiftPick) {\n // Shift click\n newSelectedKeys = Array.from(\n new Set([\n ...(cachedSelectedKeys.current || []),\n ...calcRangeKeys({\n treeData,\n expandedKeys,\n startKey: key,\n endKey: lastSelectedKey.current,\n }),\n ]),\n );\n newEvent.selectedNodes = convertDirectoryKeysToNodes(\n treeData,\n newSelectedKeys,\n );\n } else {\n // Single click\n newSelectedKeys = [key];\n lastSelectedKey.current = key;\n cachedSelectedKeys.current = newSelectedKeys;\n newEvent.selectedNodes = convertDirectoryKeysToNodes(\n treeData,\n newSelectedKeys,\n );\n }\n\n props.onSelect?.(newSelectedKeys, newEvent);\n if (!('selectedKeys' in props)) {\n setSelectedKeys(newSelectedKeys);\n }\n };\n const { getPrefixCls, direction } = React.useContext(ConfigContext);\n\n const {\n prefixCls: customizePrefixCls,\n className,\n showIcon = true,\n expandAction = 'click',\n ...otherProps\n } = props;\n\n const prefixCls = getPrefixCls('tree', customizePrefixCls);\n const connectClassName = cn(\n `${prefixCls}-directory`,\n {\n [`${prefixCls}-directory-rtl`]: direction === 'rtl',\n },\n className,\n );\n\n return (\n <Tree\n ref={ref}\n blockNode\n {...otherProps}\n showIcon={showIcon}\n expandAction={expandAction}\n prefixCls={prefixCls}\n className={connectClassName}\n expandedKeys={expandedKeys}\n selectedKeys={selectedKeys}\n onSelect={onSelect}\n onExpand={onExpand}\n />\n );\n};\n\nconst ForwardDirectoryTree = React.forwardRef(\n DirectoryTree,\n) as unknown as DirectoryTreeCompoundedComponent;\n\nif (process.env.NODE_ENV !== 'production') {\n ForwardDirectoryTree.displayName = 'DirectoryTree';\n}\n\nexport default ForwardDirectoryTree;\n"],"mappings":";;;;;;;;;AAsCA,SAAS,YAAY,EAAE,UAAU,YAAgC;AAC/D,QAAO,YAAY,kBAAkB,SAAS;;AAGhD,IAAM,iBAIJ,EAAE,kBAAkB,qBAAqB,qBAAqB,GAAG,SACjE,QACG;CAEH,MAAM,kBAAkB,QAAM,QAAa;CAE3C,MAAM,qBAAqB,QAAM,QAAe;CAEhD,MAAM,4BAA4B;EAChC,MAAM,EAAE,gBAAgB,sBAAsB,YAAY,MAAM,CAAC;EAEjE,IAAI;AAGJ,MAAI,iBACF,oBAAmB,OAAO,KAAK,YAAY;WAClC,oBACT,oBAAmB,oBACjB,MAAM,gBAAgB,uBAAuB,EAAE,EAC/C,YACD;MAED,oBAAoB,MAAM,gBAAgB;AAE5C,SAAO;;CAGT,MAAM,CAAC,cAAc,mBAAmB,QAAM,SAC5C,MAAM,gBAAgB,MAAM,uBAAuB,EAAE,CACtD;CACD,MAAM,CAAC,cAAc,mBAAmB,QAAM,eAC5C,qBAAqB,CACtB;AAED,SAAM,gBAAgB;AACpB,MAAI,kBAAkB,MACpB,iBAAgB,MAAM,aAAc;IAErC,CAAC,MAAM,cAAc,MAAM,CAAC;AAE/B,SAAM,gBAAgB;AACpB,MAAI,kBAAkB,MACpB,iBAAgB,MAAM,aAAc;IAErC,CAAC,MAAM,cAAc,MAAM,CAAC;CAE/B,MAAM,YACJ,MACA,SAKG;AACH,MAAI,EAAE,kBAAkB,OACtB,iBAAgB,KAAK;AAGvB,SAAO,MAAM,WAAW,MAAM,KAAK;;CAGrC,MAAM,YACJ,MACA,UAOG;EACH,MAAM,EAAE,aAAa;EACrB,MAAM,EAAE,MAAM,gBAAgB;EAC9B,MAAM,EAAE,MAAM,OAAO;EAErB,MAAM,WAAW,YAAY,MAAM;EAInC,MAAM,WAAgB;GACpB,GAAG;GACH,UAAU;GACX;EAGD,MAAM,WAAoB,aAAa,WAAW,aAAa;EAC/D,MAAM,YAAqB,aAAa;EAGxC,IAAI;AACJ,MAAI,YAAY,UAAU;AAExB,qBAAkB;AAClB,mBAAgB,UAAU;AAC1B,sBAAmB,UAAU;AAC7B,YAAS,gBAAgB,4BACvB,UACA,gBACD;aACQ,YAAY,WAAW;AAEhC,qBAAkB,MAAM,KACtB,IAAI,IAAI,CACN,GAAI,mBAAmB,WAAW,EAAE,EACpC,GAAG,cAAc;IACf;IACA;IACA,UAAU;IACV,QAAQ,gBAAgB;IACzB,CAAC,CACH,CAAC,CACH;AACD,YAAS,gBAAgB,4BACvB,UACA,gBACD;SACI;AAEL,qBAAkB,CAAC,IAAI;AACvB,mBAAgB,UAAU;AAC1B,sBAAmB,UAAU;AAC7B,YAAS,gBAAgB,4BACvB,UACA,gBACD;;AAGH,QAAM,WAAW,iBAAiB,SAAS;AAC3C,MAAI,EAAE,kBAAkB,OACtB,iBAAgB,gBAAgB;;CAGpC,MAAM,EAAE,cAAc,cAAc,QAAM,WAAW,cAAc;CAEnE,MAAM,EACJ,WAAW,oBACX,WACA,WAAW,MACX,eAAe,SACf,GAAG,eACD;CAEJ,MAAM,YAAY,aAAa,QAAQ,mBAAmB;CAC1D,MAAM,mBAAmB,GACvB,GAAG,UAAU,aACb,GACG,GAAG,UAAU,kBAAkB,cAAc,OAC/C,EACD,UACD;AAED,QACE,oBAAC,MAAD;EACO;EACL,WAAA;EACA,GAAI;EACM;EACI;EACH;EACX,WAAW;EACG;EACA;EACJ;EACA;EACV,CAAA;;AAIN,IAAM,uBAAuB,QAAM,WACjC,cACD;AAED,IAAA,QAAA,IAAA,aAA6B,aAC3B,sBAAqB,cAAc"}
1
+ {"version":3,"file":"DirectoryTree.js","names":[],"sources":["../../src/Tree/DirectoryTree.tsx"],"sourcesContent":["import { cn } from '../lib/utils';\nimport type RcTree from 'rc-tree';\nimport type { BasicDataNode } from 'rc-tree';\nimport type { DataNode, EventDataNode, Key } from 'rc-tree/es/interface';\nimport { conductExpandParent } from 'rc-tree/es/util';\nimport {\n convertDataToEntities,\n convertTreeToData,\n} from 'rc-tree/es/utils/treeUtil';\nimport * as React from 'react';\nimport { ConfigContext } from '../ConfigProvider';\n\nimport type { TreeProps } from './Tree';\nimport Tree from './Tree';\nimport { calcRangeKeys, convertDirectoryKeysToNodes } from './utils/dictUtil';\n\nexport type ExpandAction = false | 'click' | 'doubleClick';\n\nexport interface DirectoryTreeProps<T extends BasicDataNode = DataNode>\n extends TreeProps<T> {\n expandAction?: ExpandAction;\n}\n\ntype DirectoryTreeCompoundedComponent = (<\n T extends BasicDataNode | DataNode = DataNode,\n>(\n props: React.PropsWithChildren<DirectoryTreeProps<T>> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref?: React.Ref<any>;\n },\n) => React.ReactElement) & {\n displayName?: string;\n};\n\nexport interface DirectoryTreeState {\n expandedKeys?: Key[];\n selectedKeys?: Key[];\n}\n\nfunction getTreeData({ treeData, children }: DirectoryTreeProps) {\n return treeData || convertTreeToData(children);\n}\n\nconst DirectoryTree: React.ForwardRefRenderFunction<\n RcTree,\n DirectoryTreeProps\n> = (\n { defaultExpandAll, defaultExpandParent, defaultExpandedKeys, ...props },\n ref,\n) => {\n // Shift click usage\n const lastSelectedKey = React.useRef<Key>();\n\n const cachedSelectedKeys = React.useRef<Key[]>();\n\n const getInitExpandedKeys = () => {\n const { keyEntities } = convertDataToEntities(getTreeData(props));\n\n let initExpandedKeys: Key[];\n\n // Expanded keys\n if (defaultExpandAll) {\n initExpandedKeys = Object.keys(keyEntities);\n } else if (defaultExpandParent) {\n initExpandedKeys = conductExpandParent(\n props.expandedKeys || defaultExpandedKeys || [],\n keyEntities,\n );\n } else {\n initExpandedKeys = (props.expandedKeys || defaultExpandedKeys)!;\n }\n return initExpandedKeys;\n };\n\n const [selectedKeys, setSelectedKeys] = React.useState(\n props.selectedKeys || props.defaultSelectedKeys || [],\n );\n const [expandedKeys, setExpandedKeys] = React.useState(() =>\n getInitExpandedKeys(),\n );\n\n React.useEffect(() => {\n if ('selectedKeys' in props) {\n setSelectedKeys(props.selectedKeys!);\n }\n }, [props.selectedKeys, props]);\n\n React.useEffect(() => {\n if ('expandedKeys' in props) {\n setExpandedKeys(props.expandedKeys!);\n }\n }, [props.expandedKeys, props]);\n\n const onExpand = (\n keys: Key[],\n info: {\n node: EventDataNode<any>;\n expanded: boolean;\n nativeEvent: MouseEvent;\n },\n ) => {\n if (!('expandedKeys' in props)) {\n setExpandedKeys(keys);\n }\n // Call origin function\n return props.onExpand?.(keys, info);\n };\n\n const onSelect = (\n keys: Key[],\n event: {\n event: 'select';\n selected: boolean;\n node: any;\n selectedNodes: DataNode[];\n nativeEvent: MouseEvent;\n },\n ) => {\n const { multiple } = props;\n const { node, nativeEvent } = event;\n const { key = '' } = node;\n\n const treeData = getTreeData(props);\n // const newState: DirectoryTreeState = {};\n\n // We need wrap this event since some value is not same\n const newEvent: any = {\n ...event,\n selected: true, // Directory selected always true\n };\n\n // Windows / Mac single pick\n const ctrlPick: boolean = nativeEvent?.ctrlKey || nativeEvent?.metaKey;\n const shiftPick: boolean = nativeEvent?.shiftKey;\n\n // Generate new selected keys\n let newSelectedKeys: Key[];\n if (multiple && ctrlPick) {\n // Control click\n newSelectedKeys = keys;\n lastSelectedKey.current = key;\n cachedSelectedKeys.current = newSelectedKeys;\n newEvent.selectedNodes = convertDirectoryKeysToNodes(\n treeData,\n newSelectedKeys,\n );\n } else if (multiple && shiftPick) {\n // Shift click\n newSelectedKeys = Array.from(\n new Set([\n ...(cachedSelectedKeys.current || []),\n ...calcRangeKeys({\n treeData,\n expandedKeys,\n startKey: key,\n endKey: lastSelectedKey.current,\n }),\n ]),\n );\n newEvent.selectedNodes = convertDirectoryKeysToNodes(\n treeData,\n newSelectedKeys,\n );\n } else {\n // Single click\n newSelectedKeys = [key];\n lastSelectedKey.current = key;\n cachedSelectedKeys.current = newSelectedKeys;\n newEvent.selectedNodes = convertDirectoryKeysToNodes(\n treeData,\n newSelectedKeys,\n );\n }\n\n props.onSelect?.(newSelectedKeys, newEvent);\n if (!('selectedKeys' in props)) {\n setSelectedKeys(newSelectedKeys);\n }\n };\n const { getPrefixCls, direction } = React.useContext(ConfigContext);\n\n const {\n prefixCls: customizePrefixCls,\n className,\n showIcon = true,\n expandAction = 'click',\n ...otherProps\n } = props;\n\n const prefixCls = getPrefixCls('tree', customizePrefixCls);\n const connectClassName = cn(\n `${prefixCls}-directory`,\n {\n [`${prefixCls}-directory-rtl`]: direction === 'rtl',\n },\n className,\n );\n\n return (\n <Tree\n ref={ref}\n blockNode\n {...otherProps}\n showIcon={showIcon}\n expandAction={expandAction}\n prefixCls={prefixCls}\n className={connectClassName}\n expandedKeys={expandedKeys}\n selectedKeys={selectedKeys}\n onSelect={onSelect}\n onExpand={onExpand}\n />\n );\n};\n\nconst ForwardDirectoryTree = React.forwardRef(\n DirectoryTree,\n) as unknown as DirectoryTreeCompoundedComponent;\n\nif (process.env.NODE_ENV !== 'production') {\n ForwardDirectoryTree.displayName = 'DirectoryTree';\n}\n\nexport default ForwardDirectoryTree;\n"],"mappings":";;;;;;;;;AAuCA,SAAS,YAAY,EAAE,UAAU,YAAgC;AAC/D,QAAO,YAAY,kBAAkB,SAAS;;AAGhD,IAAM,iBAIJ,EAAE,kBAAkB,qBAAqB,qBAAqB,GAAG,SACjE,QACG;CAEH,MAAM,kBAAkB,QAAM,QAAa;CAE3C,MAAM,qBAAqB,QAAM,QAAe;CAEhD,MAAM,4BAA4B;EAChC,MAAM,EAAE,gBAAgB,sBAAsB,YAAY,MAAM,CAAC;EAEjE,IAAI;AAGJ,MAAI,iBACF,oBAAmB,OAAO,KAAK,YAAY;WAClC,oBACT,oBAAmB,oBACjB,MAAM,gBAAgB,uBAAuB,EAAE,EAC/C,YACD;MAED,oBAAoB,MAAM,gBAAgB;AAE5C,SAAO;;CAGT,MAAM,CAAC,cAAc,mBAAmB,QAAM,SAC5C,MAAM,gBAAgB,MAAM,uBAAuB,EAAE,CACtD;CACD,MAAM,CAAC,cAAc,mBAAmB,QAAM,eAC5C,qBAAqB,CACtB;AAED,SAAM,gBAAgB;AACpB,MAAI,kBAAkB,MACpB,iBAAgB,MAAM,aAAc;IAErC,CAAC,MAAM,cAAc,MAAM,CAAC;AAE/B,SAAM,gBAAgB;AACpB,MAAI,kBAAkB,MACpB,iBAAgB,MAAM,aAAc;IAErC,CAAC,MAAM,cAAc,MAAM,CAAC;CAE/B,MAAM,YACJ,MACA,SAKG;AACH,MAAI,EAAE,kBAAkB,OACtB,iBAAgB,KAAK;AAGvB,SAAO,MAAM,WAAW,MAAM,KAAK;;CAGrC,MAAM,YACJ,MACA,UAOG;EACH,MAAM,EAAE,aAAa;EACrB,MAAM,EAAE,MAAM,gBAAgB;EAC9B,MAAM,EAAE,MAAM,OAAO;EAErB,MAAM,WAAW,YAAY,MAAM;EAInC,MAAM,WAAgB;GACpB,GAAG;GACH,UAAU;GACX;EAGD,MAAM,WAAoB,aAAa,WAAW,aAAa;EAC/D,MAAM,YAAqB,aAAa;EAGxC,IAAI;AACJ,MAAI,YAAY,UAAU;AAExB,qBAAkB;AAClB,mBAAgB,UAAU;AAC1B,sBAAmB,UAAU;AAC7B,YAAS,gBAAgB,4BACvB,UACA,gBACD;aACQ,YAAY,WAAW;AAEhC,qBAAkB,MAAM,KACtB,IAAI,IAAI,CACN,GAAI,mBAAmB,WAAW,EAAE,EACpC,GAAG,cAAc;IACf;IACA;IACA,UAAU;IACV,QAAQ,gBAAgB;IACzB,CAAC,CACH,CAAC,CACH;AACD,YAAS,gBAAgB,4BACvB,UACA,gBACD;SACI;AAEL,qBAAkB,CAAC,IAAI;AACvB,mBAAgB,UAAU;AAC1B,sBAAmB,UAAU;AAC7B,YAAS,gBAAgB,4BACvB,UACA,gBACD;;AAGH,QAAM,WAAW,iBAAiB,SAAS;AAC3C,MAAI,EAAE,kBAAkB,OACtB,iBAAgB,gBAAgB;;CAGpC,MAAM,EAAE,cAAc,cAAc,QAAM,WAAW,cAAc;CAEnE,MAAM,EACJ,WAAW,oBACX,WACA,WAAW,MACX,eAAe,SACf,GAAG,eACD;CAEJ,MAAM,YAAY,aAAa,QAAQ,mBAAmB;CAC1D,MAAM,mBAAmB,GACvB,GAAG,UAAU,aACb,GACG,GAAG,UAAU,kBAAkB,cAAc,OAC/C,EACD,UACD;AAED,QACE,oBAAC,MAAD;EACO;EACL,WAAA;EACA,GAAI;EACM;EACI;EACH;EACX,WAAW;EACG;EACA;EACJ;EACA;EACV,CAAA;;AAIN,IAAM,uBAAuB,QAAM,WACjC,cACD;AAED,IAAA,QAAA,IAAA,aAA6B,aAC3B,sBAAqB,cAAc"}
@@ -1,4 +1,4 @@
1
- import { BasicDataNode, TreeProps as RcTreeProps, default as RcTree } from 'rc-tree';
1
+ import { BasicDataNode, TreeProps as RcTreeProps } from 'rc-tree';
2
2
  import { DataNode, Key } from 'rc-tree/es/interface';
3
3
  import * as React from 'react';
4
4
  export type SwitcherIcon = React.ReactNode | ((props: AldTreeNodeProps) => React.ReactNode);
@@ -77,7 +77,18 @@ export type TreeNodeNormal = DataNode;
77
77
  type DraggableFn = (node: DataNode) => boolean;
78
78
  interface DraggableConfig {
79
79
  icon?: React.ReactNode | false;
80
+ /** 节点是否可作为 drag source(拖起来)。返回 false:不显示 drag handle、不能起拖。 */
80
81
  nodeDraggable?: DraggableFn;
82
+ /**
83
+ * 节点是否可作为 drop target(接收落入)。返回 true:即使 nodeDraggable=false 仍注册
84
+ * onDragOver/onDrop 等 listener,浏览器才会真正派发 drop 事件。
85
+ *
86
+ * 解决 rc-tree 5.x 把"可拖"与"可放"绑到同一个 nodeDraggable 的限制——之前要让"类目可接收
87
+ * 资源拖入但本身不可拖"只能让 nodeDraggable 全返回 true,再用业务侧 CSS hack 隐藏 drag icon。
88
+ *
89
+ * 默认不传 = 沿用 nodeDraggable 行为(向后兼容)。
90
+ */
91
+ nodeDroppable?: DraggableFn;
81
92
  }
82
93
  export interface TreeProps<T extends BasicDataNode = DataNode> extends Omit<RcTreeProps<T>, 'prefixCls' | 'showLine' | 'direction' | 'draggable' | 'icon' | 'switcherIcon' | 'filterTreeNode'> {
83
94
  showLine?: boolean | {
@@ -132,5 +143,5 @@ export interface TreeProps<T extends BasicDataNode = DataNode> extends Omit<RcTr
132
143
  handlerRender?: (node: T) => React.ReactNode;
133
144
  highlightKeywords?: string;
134
145
  }
135
- declare const Tree: React.ForwardRefExoticComponent<TreeProps<DataNode> & React.RefAttributes<RcTree<import('rc-tree/lib/interface').DataNode>>>;
146
+ declare const Tree: React.ForwardRefExoticComponent<TreeProps<DataNode> & React.RefAttributes<any>>;
136
147
  export default Tree;
@@ -6,6 +6,7 @@ import { ConfigContext } from "../ConfigProvider/index.js";
6
6
  import HighlightText from "../HighlightText/index.js";
7
7
  /* empty css */
8
8
  import collapseMotion from "../_utils/motion.js";
9
+ import { composeAllowDrop } from "./utils/composeAllowDrop.js";
9
10
  import dropIndicatorRender from "./utils/dropIndicator.js";
10
11
  import renderSwitcherIcon from "./utils/iconUtil.js";
11
12
  import * as React$1 from "react";
@@ -48,8 +49,11 @@ var Tree = React$1.forwardRef((props, ref) => {
48
49
  dropIndicatorRender,
49
50
  titleRender: customTitleRender
50
51
  };
51
- const draggableConfig = React$1.useMemo(() => {
52
- if (!draggable) return false;
52
+ const { draggableConfig, dropOnlyResolvers } = React$1.useMemo(() => {
53
+ if (!draggable) return {
54
+ draggableConfig: false,
55
+ dropOnlyResolvers: null
56
+ };
53
57
  const newIcon = /* @__PURE__ */ jsx(Memo$1, {
54
58
  size: TREE_SWITCH_CION_SIZE,
55
59
  color: "var(--alias-colors-icon-subtle)"
@@ -62,13 +66,64 @@ var Tree = React$1.forwardRef((props, ref) => {
62
66
  case "object":
63
67
  mergedDraggable = {
64
68
  ...draggable,
65
- icon: newIcon
69
+ icon: draggable.icon === void 0 ? newIcon : draggable.icon
66
70
  };
67
71
  break;
68
72
  default: break;
69
73
  }
70
- return mergedDraggable;
74
+ let resolvers = null;
75
+ if (mergedDraggable.nodeDroppable) {
76
+ const userNodeDraggable = mergedDraggable.nodeDraggable;
77
+ const userNodeDroppable = mergedDraggable.nodeDroppable;
78
+ resolvers = {
79
+ nodeDraggable: userNodeDraggable,
80
+ nodeDroppable: userNodeDroppable
81
+ };
82
+ mergedDraggable = {
83
+ ...mergedDraggable,
84
+ nodeDraggable: (node) => (userNodeDraggable ? userNodeDraggable(node) : true) || userNodeDroppable(node)
85
+ };
86
+ }
87
+ return {
88
+ draggableConfig: mergedDraggable,
89
+ dropOnlyResolvers: resolvers
90
+ };
71
91
  }, [draggable]);
92
+ /**
93
+ * drop-only 节点不能真的起拖。
94
+ *
95
+ * 历史教训:以前在 props.onDragStart 里调 preventDefault。问题是 rc-tree 内部
96
+ * onNodeDragStart(Tree.js:88-99)会在调用 user onDragStart **之前**把
97
+ * draggingNodeKey/dragNodeProps 写进 state;TreeNode(TreeNode.js:112)也已经先
98
+ * setDragNodeHighlight(true)。然后 preventDefault 让浏览器取消拖拽,dragend 不再派发
99
+ * → onWindowDragEnd 永远不触发 → state 卡在"正在拖类目",外层 .ald-tree-treenode
100
+ * 卡着 `dragging`、内层 .ald-tree-node-content-wrapper 卡着 `ald-tree-node-selected`
101
+ * 高亮,直到下一次合法 dragstart 才被覆盖。
102
+ *
103
+ * 修复手段:document 级 dragstart capture handler,在 rc-tree 的 React 监听器之前
104
+ * stopPropagation+preventDefault,让 TreeNode 的 onDragStart 整段都不执行,rc-tree
105
+ * 内部 state 彻底不写入。document 是 React root 容器的祖先,capture 阶段先于 React
106
+ * delegation 监听器,因此 stopPropagation 能彻底拦截。
107
+ */
108
+ React$1.useLayoutEffect(() => {
109
+ if (!dropOnlyResolvers) return;
110
+ const handler = (e) => {
111
+ const target = e.target;
112
+ if (!target?.closest) return;
113
+ if (target.closest(".ald-tree-treenode-drop-only")) {
114
+ e.preventDefault();
115
+ e.stopPropagation();
116
+ }
117
+ };
118
+ document.addEventListener("dragstart", handler, true);
119
+ return () => document.removeEventListener("dragstart", handler, true);
120
+ }, [dropOnlyResolvers]);
121
+ /**
122
+ * nodeDroppable 同时收口到 rc-tree 的 allowDrop:避免出现"nodeDroppable=false 但 rc-tree
123
+ * 默认 allowDrop=()=>true 仍然接收 drop"的语义裂缝。用户自传的 allowDrop 与 nodeDroppable
124
+ * 取 AND(任一拒绝即拒绝)。
125
+ */
126
+ const composedAllowDrop = React$1.useMemo(() => composeAllowDrop(rest.allowDrop, dropOnlyResolvers?.nodeDroppable), [rest.allowDrop, dropOnlyResolvers]);
72
127
  const renderIndent = (nodeProps) => {
73
128
  const { pos, isLeaf } = nodeProps;
74
129
  const level = pos ? pos.split("-").length - 1 : 0;
@@ -104,19 +159,42 @@ var Tree = React$1.forwardRef((props, ref) => {
104
159
  treeData,
105
160
  highlightKeywords
106
161
  ]);
162
+ /** 给 drop-only 节点的 wrapper 加 'ald-tree-treenode-drop-only' className(rc-tree 5.x
163
+ * 会把 DataNode.className 透传到 .ald-tree-treenode 上)。css 据此隐藏 drag handle icon
164
+ * 并提供 not-allowed cursor,区分纯 drop target 与真正可拖节点。 */
165
+ const finalTreeData = React$1.useMemo(() => {
166
+ if (!dropOnlyResolvers || !newTreeData) return newTreeData;
167
+ const { nodeDraggable, nodeDroppable } = dropOnlyResolvers;
168
+ return produce(newTreeData, (draft) => {
169
+ const visit = (nodes) => {
170
+ if (!nodes) return;
171
+ for (const node of nodes) {
172
+ const isDraggable = nodeDraggable ? nodeDraggable(node) : true;
173
+ const isDroppable = nodeDroppable(node);
174
+ if (!isDraggable && isDroppable) {
175
+ const existing = node.className ?? "";
176
+ if (!existing.includes("ald-tree-treenode-drop-only")) node.className = cn(existing, "ald-tree-treenode-drop-only");
177
+ }
178
+ visit(node.children);
179
+ }
180
+ };
181
+ visit(draft);
182
+ });
183
+ }, [newTreeData, dropOnlyResolvers]);
107
184
  const noChildren = React$1.useMemo(() => {
108
- if (newTreeData?.length) return newTreeData.every((node) => {
185
+ if (finalTreeData?.length) return finalTreeData.every((node) => {
109
186
  return !node.children?.length && node.isLeaf !== false;
110
187
  });
111
188
  return true;
112
- }, [newTreeData]);
189
+ }, [finalTreeData]);
113
190
  return /* @__PURE__ */ jsx(RcTree, {
114
191
  itemHeight: 20,
115
192
  ref,
116
193
  virtual,
117
194
  ...newProps,
195
+ allowDrop: composedAllowDrop,
118
196
  prefixCls,
119
- treeData: newTreeData,
197
+ treeData: finalTreeData,
120
198
  className: cn({
121
199
  [`${prefixCls}-icon-hide`]: !showIcon,
122
200
  [`${prefixCls}-block-node`]: blockNode,
@@ -125,7 +203,7 @@ var Tree = React$1.forwardRef((props, ref) => {
125
203
  [`${prefixCls}-rtl`]: direction === "rtl",
126
204
  ["ald-draggable-tree"]: draggable,
127
205
  [`${prefixCls}-no-children`]: noChildren
128
- }, className),
206
+ }, "ant-tree", className),
129
207
  direction,
130
208
  checkable: checkable ? /* @__PURE__ */ jsx("span", { className: `${prefixCls}-checkbox-inner` }) : checkable,
131
209
  selectable,
@@ -1 +1 @@
1
- {"version":3,"file":"Tree2.js","names":[],"sources":["../../src/Tree/Tree.tsx"],"sourcesContent":["import './tree.css';\nimport { cn } from '../lib/utils';\nimport { produce } from 'immer';\nimport { noop } from 'lodash';\nimport type { BasicDataNode, TreeProps as RcTreeProps } from 'rc-tree';\nimport RcTree from 'rc-tree';\nimport type { DataNode, Key } from 'rc-tree/es/interface';\nimport * as React from 'react';\nimport { ConfigContext } from '../ConfigProvider';\nimport HighlightText from '../HighlightText';\nimport { ArrowRightLightLine, DragLine } from '../Icon';\nimport collapseMotion from '../_utils/motion';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport dropIndicatorRender from './utils/dropIndicator';\nimport renderSwitcherIcon from './utils/iconUtil';\nconst TREE_SWITCH_CION_SIZE = 16;\nconst NODE_DISABLE_CLASS_NAME = 'ald-tree-node-disabled';\nexport type SwitcherIcon =\n | React.ReactNode\n | ((props: AldTreeNodeProps) => React.ReactNode);\nexport type TreeLeafIcon =\n | React.ReactNode\n | ((props: AldTreeNodeProps) => React.ReactNode);\n\nexport interface AldTreeNodeAttribute {\n eventKey: string;\n prefixCls: string;\n className: string;\n expanded: boolean;\n selected: boolean;\n checked: boolean;\n halfChecked: boolean;\n children: React.ReactNode;\n title: React.ReactNode;\n pos: string;\n dragOver: boolean;\n dragOverGapTop: boolean;\n dragOverGapBottom: boolean;\n isLeaf: boolean;\n selectable: boolean;\n disabled: boolean;\n disableCheckbox: boolean;\n}\n\nexport interface AldTreeNodeProps {\n className?: string;\n checkable?: boolean;\n disabled?: boolean;\n disableCheckbox?: boolean;\n title?: string | React.ReactNode;\n key?: Key;\n eventKey?: string;\n isLeaf?: boolean;\n checked?: boolean;\n expanded?: boolean;\n loading?: boolean;\n selected?: boolean;\n selectable?: boolean;\n icon?:\n | ((treeNode: AldTreeNodeAttribute) => React.ReactNode)\n | React.ReactNode;\n children?: React.ReactNode;\n [customProp: string]: any;\n}\n\nexport type AldTreeNode = React.Component<AldTreeNodeProps, object>;\n\nexport interface AldTreeNodeBaseEvent {\n node: AldTreeNode;\n nativeEvent: MouseEvent;\n}\n\nexport interface AldTreeNodeCheckedEvent extends AldTreeNodeBaseEvent {\n event: 'check';\n checked?: boolean;\n checkedNodes?: AldTreeNode[];\n}\n\nexport interface AldTreeNodeSelectedEvent extends AldTreeNodeBaseEvent {\n event: 'select';\n selected?: boolean;\n selectedNodes?: DataNode[];\n}\n\nexport interface AldTreeNodeExpandedEvent extends AldTreeNodeBaseEvent {\n expanded?: boolean;\n}\n\nexport interface AldTreeNodeMouseEvent {\n node: AldTreeNode;\n event: React.DragEvent<HTMLElement>;\n}\n\nexport interface AldTreeNodeDragEnterEvent extends AldTreeNodeMouseEvent {\n expandedKeys: Key[];\n}\n\nexport interface AldTreeNodeAttribute {\n node: AldTreeNode;\n dragNode: AldTreeNode;\n dragNodesKeys: Key[];\n dropPosition: number;\n dropToGap?: boolean;\n event: React.MouseEvent<HTMLElement>;\n}\n\n// [Legacy] Compatible for v3\nexport type TreeNodeNormal = DataNode;\n\ntype DraggableFn = (node: DataNode) => boolean;\n\ninterface DraggableConfig {\n icon?: React.ReactNode | false;\n nodeDraggable?: DraggableFn;\n}\n\nexport interface TreeProps<T extends BasicDataNode = DataNode>\n extends Omit<\n RcTreeProps<T>,\n | 'prefixCls'\n | 'showLine'\n | 'direction'\n | 'draggable'\n | 'icon'\n | 'switcherIcon'\n | 'filterTreeNode'\n > {\n showLine?: boolean | { showLeafIcon: boolean | TreeLeafIcon };\n className?: string;\n /** 是否支持多选 */\n multiple?: boolean;\n /** 是否自动展开父节点 */\n autoExpandParent?: boolean;\n /** Checkable状态下节点选择完全受控(父子节点选中状态不再关联) */\n checkStrictly?: boolean;\n /** 是否支持选中 */\n checkable?: boolean;\n /** 是否禁用树 */\n disabled?: boolean;\n /** 默认展开所有树节点 */\n defaultExpandAll?: boolean;\n /** 默认展开对应树节点 */\n defaultExpandParent?: boolean;\n /** 默认展开指定的树节点 */\n defaultExpandedKeys?: Key[];\n /** (受控)展开指定的树节点 */\n expandedKeys?: Key[];\n /** (受控)选中复选框的树节点 */\n checkedKeys?: Key[] | { checked: Key[]; halfChecked: Key[] };\n /** 默认选中复选框的树节点 */\n defaultCheckedKeys?: Key[];\n /** (受控)设置选中的树节点 */\n selectedKeys?: Key[];\n /** 默认选中的树节点 */\n defaultSelectedKeys?: Key[];\n selectable?: boolean;\n /** 点击树节点触发 */\n filterTreeNode?: (node: DataNode) => boolean;\n loadedKeys?: Key[];\n /** 设置节点可拖拽(IE>8) */\n draggable?: DraggableFn | boolean | DraggableConfig;\n style?: React.CSSProperties;\n showIcon?: boolean;\n icon?:\n | ((nodeProps: AldTreeNodeAttribute) => React.ReactNode)\n | React.ReactNode\n | RcTreeProps<T>['icon'];\n switcherIcon?: SwitcherIcon | RcTreeProps<T>['switcherIcon'];\n prefixCls?: string;\n children?: React.ReactNode;\n blockNode?: boolean;\n size?: 'large' | 'small';\n titleRender?: (node: T) => React.ReactNode;\n showTabLeader?: boolean;\n handlerRender?: (node: T) => React.ReactNode;\n highlightKeywords?: string;\n}\n\nconst Tree = React.forwardRef<RcTree, TreeProps>((props, ref) => {\n const { locale } = React.useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getPrefixCls, direction, virtual } = React.useContext(ConfigContext);\n const size = props.size || 'large';\n const {\n className,\n showIcon = false,\n showLine,\n blockNode = false,\n children,\n checkable = false,\n selectable = true,\n draggable,\n titleRender,\n showTabLeader,\n handlerRender = noop,\n filterTreeNode,\n treeData,\n highlightKeywords,\n motion = { ...collapseMotion, motionAppear: false },\n ...rest\n } = props;\n const prefixCls = getPrefixCls('tree', 'ald-tree');\n\n const customTitleRender = React.useCallback(\n (node: DataNode) => {\n const renderedTitle = titleRender\n ? titleRender(node)\n : typeof node.title === 'function'\n ? node.title(node)\n : node.title;\n return (\n <>\n {renderedTitle}\n {showTabLeader && <div className=\"ald-tree-tab-leader\"></div>}\n {handlerRender && (handlerRender(node) as React.ReactNode)}\n </>\n );\n },\n [titleRender, showTabLeader, handlerRender],\n );\n const newProps = {\n ...rest,\n checkable,\n selectable,\n showIcon,\n motion,\n blockNode,\n showLine: Boolean(showLine),\n dropIndicatorRender,\n titleRender: customTitleRender,\n };\n\n const draggableConfig = React.useMemo(() => {\n if (!draggable) {\n return false;\n }\n const newIcon = (\n <DragLine\n size={TREE_SWITCH_CION_SIZE}\n color={'var(--alias-colors-icon-subtle)'}\n ></DragLine>\n );\n let mergedDraggable: DraggableConfig = {\n icon: newIcon,\n };\n switch (typeof draggable) {\n case 'function':\n mergedDraggable.nodeDraggable = draggable;\n break;\n case 'object':\n mergedDraggable = { ...draggable, icon: newIcon };\n break;\n default:\n break;\n // Do nothing\n }\n\n return mergedDraggable;\n }, [draggable]);\n const renderIndent = (nodeProps: AldTreeNodeProps) => {\n const { pos, isLeaf } = nodeProps as AldTreeNodeProps & { pos?: string };\n // Determine level from `pos` string (e.g. \"0-0-1\" → level 2)\n const level = pos ? pos.split('-').length - 1 : 0;\n const iconSize = TREE_SWITCH_CION_SIZE;\n let indentWidth = isLeaf ? iconSize : 0;\n indentWidth += level * (iconSize / 2);\n return <span style={{ width: indentWidth, flexShrink: 0 }}></span>;\n };\n const newTreeData = React.useMemo(() => {\n if (!filterTreeNode || !treeData) return treeData;\n\n const shouldNodeDisabled = (node: DataNode): boolean => {\n // 初始化一个标志来表示是否需要为当前节点添加className\n let shouldAddDisabled = true;\n if (filterTreeNode(node)) {\n shouldAddDisabled = false;\n }\n\n if (node.children) {\n // 遍历当前节点的子节点,只要有一个子节点不disable,则该不需要添加className\n const allChildrenShouldAddDisabled = node.children.reduce(\n (pre, child) => {\n return shouldNodeDisabled(child) && pre;\n },\n shouldAddDisabled,\n );\n shouldAddDisabled = allChildrenShouldAddDisabled;\n }\n\n // 如果shouldAddDisabled为true,就为当前节点添加className\n if (shouldAddDisabled) {\n node.className = node.className?.includes(NODE_DISABLE_CLASS_NAME)\n ? node.className\n : cn(node.className, NODE_DISABLE_CLASS_NAME);\n } else {\n const reg = /ald-tree-node-disabled/g;\n node.className?.replace(reg, ' ');\n }\n if (highlightKeywords && typeof node.title !== 'function') {\n node.title = (\n <HighlightText keyword={highlightKeywords}>\n {node.title}\n </HighlightText>\n );\n }\n return shouldAddDisabled;\n };\n const newTreeData = produce(treeData, (draft) => {\n for (const rootNode of draft) {\n shouldNodeDisabled(rootNode);\n }\n });\n return newTreeData;\n }, [filterTreeNode, treeData, highlightKeywords]);\n\n const noChildren = React.useMemo(() => {\n if (newTreeData?.length) {\n return newTreeData.every((node) => {\n return !node.children?.length && node.isLeaf !== false;\n });\n }\n return true;\n }, [newTreeData]);\n\n return (\n <RcTree\n itemHeight={20}\n ref={ref}\n virtual={virtual}\n {...newProps}\n prefixCls={prefixCls}\n treeData={newTreeData}\n className={cn(\n {\n [`${prefixCls}-icon-hide`]: !showIcon,\n [`${prefixCls}-block-node`]: blockNode,\n [`${prefixCls}-unselectable`]: !selectable,\n [`${prefixCls}-large`]: size === 'large',\n [`${prefixCls}-rtl`]: direction === 'rtl',\n ['ald-draggable-tree']: draggable,\n [`${prefixCls}-no-children`]: noChildren,\n },\n className,\n )}\n direction={direction as any}\n checkable={\n checkable ? (\n <span className={`${prefixCls}-checkbox-inner`} />\n ) : (\n checkable\n )\n }\n selectable={selectable}\n // @ts-ignore\n switcherIcon={(nodeProps: AldTreeNodeProps) => {\n return (\n <>\n {renderIndent(nodeProps)}\n {renderSwitcherIcon(\n prefixCls,\n <ArrowRightLightLine\n size={TREE_SWITCH_CION_SIZE}\n color={'var(--alias-colors-icon-subtle)'}\n >\n {t.Tree.expand}\n </ArrowRightLightLine>,\n showLine,\n nodeProps,\n TREE_SWITCH_CION_SIZE,\n )}\n </>\n );\n }}\n draggable={draggableConfig}\n >\n {children}\n </RcTree>\n );\n});\n\nexport default Tree;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Tree2.js","names":[],"sources":["../../src/Tree/Tree.tsx"],"sourcesContent":["import './tree.css';\nimport { cn } from '../lib/utils';\nimport { produce } from 'immer';\nimport { noop } from 'lodash';\nimport type { BasicDataNode, TreeProps as RcTreeProps } from 'rc-tree';\nimport RcTree from 'rc-tree';\nimport type { DataNode, Key } from 'rc-tree/es/interface';\nimport * as React from 'react';\nimport { ConfigContext } from '../ConfigProvider';\nimport HighlightText from '../HighlightText';\nimport { ArrowRightLightLine, DragLine } from '../Icon';\nimport collapseMotion from '../_utils/motion';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport { composeAllowDrop } from './utils/composeAllowDrop';\nimport dropIndicatorRender from './utils/dropIndicator';\nimport renderSwitcherIcon from './utils/iconUtil';\nconst TREE_SWITCH_CION_SIZE = 16;\nconst NODE_DISABLE_CLASS_NAME = 'ald-tree-node-disabled';\nexport type SwitcherIcon =\n | React.ReactNode\n | ((props: AldTreeNodeProps) => React.ReactNode);\nexport type TreeLeafIcon =\n | React.ReactNode\n | ((props: AldTreeNodeProps) => React.ReactNode);\n\nexport interface AldTreeNodeAttribute {\n eventKey: string;\n prefixCls: string;\n className: string;\n expanded: boolean;\n selected: boolean;\n checked: boolean;\n halfChecked: boolean;\n children: React.ReactNode;\n title: React.ReactNode;\n pos: string;\n dragOver: boolean;\n dragOverGapTop: boolean;\n dragOverGapBottom: boolean;\n isLeaf: boolean;\n selectable: boolean;\n disabled: boolean;\n disableCheckbox: boolean;\n}\n\nexport interface AldTreeNodeProps {\n className?: string;\n checkable?: boolean;\n disabled?: boolean;\n disableCheckbox?: boolean;\n title?: string | React.ReactNode;\n key?: Key;\n eventKey?: string;\n isLeaf?: boolean;\n checked?: boolean;\n expanded?: boolean;\n loading?: boolean;\n selected?: boolean;\n selectable?: boolean;\n icon?:\n | ((treeNode: AldTreeNodeAttribute) => React.ReactNode)\n | React.ReactNode;\n children?: React.ReactNode;\n [customProp: string]: any;\n}\n\nexport type AldTreeNode = React.Component<AldTreeNodeProps, object>;\n\nexport interface AldTreeNodeBaseEvent {\n node: AldTreeNode;\n nativeEvent: MouseEvent;\n}\n\nexport interface AldTreeNodeCheckedEvent extends AldTreeNodeBaseEvent {\n event: 'check';\n checked?: boolean;\n checkedNodes?: AldTreeNode[];\n}\n\nexport interface AldTreeNodeSelectedEvent extends AldTreeNodeBaseEvent {\n event: 'select';\n selected?: boolean;\n selectedNodes?: DataNode[];\n}\n\nexport interface AldTreeNodeExpandedEvent extends AldTreeNodeBaseEvent {\n expanded?: boolean;\n}\n\nexport interface AldTreeNodeMouseEvent {\n node: AldTreeNode;\n event: React.DragEvent<HTMLElement>;\n}\n\nexport interface AldTreeNodeDragEnterEvent extends AldTreeNodeMouseEvent {\n expandedKeys: Key[];\n}\n\nexport interface AldTreeNodeAttribute {\n node: AldTreeNode;\n dragNode: AldTreeNode;\n dragNodesKeys: Key[];\n dropPosition: number;\n dropToGap?: boolean;\n event: React.MouseEvent<HTMLElement>;\n}\n\n// [Legacy] Compatible for v3\nexport type TreeNodeNormal = DataNode;\n\ntype DraggableFn = (node: DataNode) => boolean;\n\ninterface DropOnlyResolvers {\n nodeDraggable: DraggableFn | undefined;\n nodeDroppable: DraggableFn;\n}\n\ninterface DraggableConfig {\n icon?: React.ReactNode | false;\n /** 节点是否可作为 drag source(拖起来)。返回 false:不显示 drag handle、不能起拖。 */\n nodeDraggable?: DraggableFn;\n /**\n * 节点是否可作为 drop target(接收落入)。返回 true:即使 nodeDraggable=false 仍注册\n * onDragOver/onDrop 等 listener,浏览器才会真正派发 drop 事件。\n *\n * 解决 rc-tree 5.x 把\"可拖\"与\"可放\"绑到同一个 nodeDraggable 的限制——之前要让\"类目可接收\n * 资源拖入但本身不可拖\"只能让 nodeDraggable 全返回 true,再用业务侧 CSS hack 隐藏 drag icon。\n *\n * 默认不传 = 沿用 nodeDraggable 行为(向后兼容)。\n */\n nodeDroppable?: DraggableFn;\n}\n\nexport interface TreeProps<T extends BasicDataNode = DataNode>\n extends Omit<\n RcTreeProps<T>,\n | 'prefixCls'\n | 'showLine'\n | 'direction'\n | 'draggable'\n | 'icon'\n | 'switcherIcon'\n | 'filterTreeNode'\n > {\n showLine?: boolean | { showLeafIcon: boolean | TreeLeafIcon };\n className?: string;\n /** 是否支持多选 */\n multiple?: boolean;\n /** 是否自动展开父节点 */\n autoExpandParent?: boolean;\n /** Checkable状态下节点选择完全受控(父子节点选中状态不再关联) */\n checkStrictly?: boolean;\n /** 是否支持选中 */\n checkable?: boolean;\n /** 是否禁用树 */\n disabled?: boolean;\n /** 默认展开所有树节点 */\n defaultExpandAll?: boolean;\n /** 默认展开对应树节点 */\n defaultExpandParent?: boolean;\n /** 默认展开指定的树节点 */\n defaultExpandedKeys?: Key[];\n /** (受控)展开指定的树节点 */\n expandedKeys?: Key[];\n /** (受控)选中复选框的树节点 */\n checkedKeys?: Key[] | { checked: Key[]; halfChecked: Key[] };\n /** 默认选中复选框的树节点 */\n defaultCheckedKeys?: Key[];\n /** (受控)设置选中的树节点 */\n selectedKeys?: Key[];\n /** 默认选中的树节点 */\n defaultSelectedKeys?: Key[];\n selectable?: boolean;\n /** 点击树节点触发 */\n filterTreeNode?: (node: DataNode) => boolean;\n loadedKeys?: Key[];\n /** 设置节点可拖拽(IE>8) */\n draggable?: DraggableFn | boolean | DraggableConfig;\n style?: React.CSSProperties;\n showIcon?: boolean;\n icon?:\n | ((nodeProps: AldTreeNodeAttribute) => React.ReactNode)\n | React.ReactNode\n | RcTreeProps<T>['icon'];\n switcherIcon?: SwitcherIcon | RcTreeProps<T>['switcherIcon'];\n prefixCls?: string;\n children?: React.ReactNode;\n blockNode?: boolean;\n size?: 'large' | 'small';\n titleRender?: (node: T) => React.ReactNode;\n showTabLeader?: boolean;\n handlerRender?: (node: T) => React.ReactNode;\n highlightKeywords?: string;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Tree = React.forwardRef<any, TreeProps>((props, ref) => {\n const { locale } = React.useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getPrefixCls, direction, virtual } = React.useContext(ConfigContext);\n const size = props.size || 'large';\n const {\n className,\n showIcon = false,\n showLine,\n blockNode = false,\n children,\n checkable = false,\n selectable = true,\n draggable,\n titleRender,\n showTabLeader,\n handlerRender = noop,\n filterTreeNode,\n treeData,\n highlightKeywords,\n motion = { ...collapseMotion, motionAppear: false },\n ...rest\n } = props;\n const prefixCls = getPrefixCls('tree', 'ald-tree');\n\n const customTitleRender = React.useCallback(\n (node: DataNode) => {\n const renderedTitle = titleRender\n ? titleRender(node)\n : typeof node.title === 'function'\n ? node.title(node)\n : node.title;\n return (\n <>\n {renderedTitle}\n {showTabLeader && <div className=\"ald-tree-tab-leader\"></div>}\n {handlerRender && (handlerRender(node) as React.ReactNode)}\n </>\n );\n },\n [titleRender, showTabLeader, handlerRender],\n );\n const newProps = {\n ...rest,\n checkable,\n selectable,\n showIcon,\n motion,\n blockNode,\n showLine: Boolean(showLine),\n dropIndicatorRender,\n titleRender: customTitleRender,\n };\n\n // 一次性吃掉 draggable 的归一化:rc-tree 看到的 mergedDraggable + 我们内部用的\n // dropOnlyResolvers(原样保留用户 nodeDraggable/nodeDroppable)。集中一处避免两处 useMemo\n // 的判断散开导致字段扩展时遗漏。\n const { draggableConfig, dropOnlyResolvers } = React.useMemo(() => {\n if (!draggable) {\n return {\n draggableConfig: false as const,\n dropOnlyResolvers: null as DropOnlyResolvers | null,\n };\n }\n const newIcon = (\n <DragLine\n size={TREE_SWITCH_CION_SIZE}\n color={'var(--alias-colors-icon-subtle)'}\n ></DragLine>\n );\n let mergedDraggable: DraggableConfig = { icon: newIcon };\n switch (typeof draggable) {\n case 'function':\n mergedDraggable.nodeDraggable = draggable;\n break;\n case 'object':\n mergedDraggable = {\n ...draggable,\n icon: draggable.icon === undefined ? newIcon : draggable.icon,\n };\n break;\n default:\n break;\n }\n\n // rc-tree 5.x 把\"可拖(drag source)\"与\"可放(drop target)\"绑到同一个 nodeDraggable:\n // 该返回 false 时 onDragOver/onDrop 也连带不注册,浏览器认为该节点 not droppable\n // → drop 事件根本不派发。为了让\"类目可接收资源拖入但本身不可拖\",把 rc-tree 看到的\n // nodeDraggable 改成 nodeDraggable || nodeDroppable,从而保证 drop listener 仍注册。\n // 真正的 drag-source 阻断由 document 级 dragstart capture handler 负责(见下方 effect)。\n let resolvers: DropOnlyResolvers | null = null;\n if (mergedDraggable.nodeDroppable) {\n const userNodeDraggable = mergedDraggable.nodeDraggable;\n const userNodeDroppable = mergedDraggable.nodeDroppable;\n resolvers = {\n nodeDraggable: userNodeDraggable,\n nodeDroppable: userNodeDroppable,\n };\n mergedDraggable = {\n ...mergedDraggable,\n nodeDraggable: (node: DataNode) =>\n (userNodeDraggable ? userNodeDraggable(node) : true) ||\n userNodeDroppable(node),\n };\n }\n\n return { draggableConfig: mergedDraggable, dropOnlyResolvers: resolvers };\n }, [draggable]);\n\n /**\n * drop-only 节点不能真的起拖。\n *\n * 历史教训:以前在 props.onDragStart 里调 preventDefault。问题是 rc-tree 内部\n * onNodeDragStart(Tree.js:88-99)会在调用 user onDragStart **之前**把\n * draggingNodeKey/dragNodeProps 写进 state;TreeNode(TreeNode.js:112)也已经先\n * setDragNodeHighlight(true)。然后 preventDefault 让浏览器取消拖拽,dragend 不再派发\n * → onWindowDragEnd 永远不触发 → state 卡在\"正在拖类目\",外层 .ald-tree-treenode\n * 卡着 `dragging`、内层 .ald-tree-node-content-wrapper 卡着 `ald-tree-node-selected`\n * 高亮,直到下一次合法 dragstart 才被覆盖。\n *\n * 修复手段:document 级 dragstart capture handler,在 rc-tree 的 React 监听器之前\n * stopPropagation+preventDefault,让 TreeNode 的 onDragStart 整段都不执行,rc-tree\n * 内部 state 彻底不写入。document 是 React root 容器的祖先,capture 阶段先于 React\n * delegation 监听器,因此 stopPropagation 能彻底拦截。\n */\n React.useLayoutEffect(() => {\n if (!dropOnlyResolvers) return;\n const handler = (e: DragEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target?.closest) return;\n if (target.closest('.ald-tree-treenode-drop-only')) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n document.addEventListener('dragstart', handler, true);\n return () => document.removeEventListener('dragstart', handler, true);\n }, [dropOnlyResolvers]);\n\n /**\n * nodeDroppable 同时收口到 rc-tree 的 allowDrop:避免出现\"nodeDroppable=false 但 rc-tree\n * 默认 allowDrop=()=>true 仍然接收 drop\"的语义裂缝。用户自传的 allowDrop 与 nodeDroppable\n * 取 AND(任一拒绝即拒绝)。\n */\n const composedAllowDrop = React.useMemo(\n () => composeAllowDrop(rest.allowDrop, dropOnlyResolvers?.nodeDroppable),\n [rest.allowDrop, dropOnlyResolvers],\n );\n const renderIndent = (nodeProps: AldTreeNodeProps) => {\n const { pos, isLeaf } = nodeProps as AldTreeNodeProps & { pos?: string };\n // Determine level from `pos` string (e.g. \"0-0-1\" → level 2)\n const level = pos ? pos.split('-').length - 1 : 0;\n const iconSize = TREE_SWITCH_CION_SIZE;\n let indentWidth = isLeaf ? iconSize : 0;\n indentWidth += level * (iconSize / 2);\n return <span style={{ width: indentWidth, flexShrink: 0 }}></span>;\n };\n const newTreeData = React.useMemo(() => {\n if (!filterTreeNode || !treeData) return treeData;\n\n const shouldNodeDisabled = (node: DataNode): boolean => {\n // 初始化一个标志来表示是否需要为当前节点添加className\n let shouldAddDisabled = true;\n if (filterTreeNode(node)) {\n shouldAddDisabled = false;\n }\n\n if (node.children) {\n // 遍历当前节点的子节点,只要有一个子节点不disable,则该不需要添加className\n const allChildrenShouldAddDisabled = node.children.reduce(\n (pre, child) => {\n return shouldNodeDisabled(child) && pre;\n },\n shouldAddDisabled,\n );\n shouldAddDisabled = allChildrenShouldAddDisabled;\n }\n\n // 如果shouldAddDisabled为true,就为当前节点添加className\n if (shouldAddDisabled) {\n node.className = node.className?.includes(NODE_DISABLE_CLASS_NAME)\n ? node.className\n : cn(node.className, NODE_DISABLE_CLASS_NAME);\n } else {\n const reg = /ald-tree-node-disabled/g;\n node.className?.replace(reg, ' ');\n }\n if (highlightKeywords && typeof node.title !== 'function') {\n node.title = (\n <HighlightText keyword={highlightKeywords}>\n {node.title}\n </HighlightText>\n );\n }\n return shouldAddDisabled;\n };\n const newTreeData = produce(treeData, (draft) => {\n for (const rootNode of draft) {\n shouldNodeDisabled(rootNode);\n }\n });\n return newTreeData;\n }, [filterTreeNode, treeData, highlightKeywords]);\n\n /** 给 drop-only 节点的 wrapper 加 'ald-tree-treenode-drop-only' className(rc-tree 5.x\n * 会把 DataNode.className 透传到 .ald-tree-treenode 上)。css 据此隐藏 drag handle icon\n * 并提供 not-allowed cursor,区分纯 drop target 与真正可拖节点。 */\n const finalTreeData = React.useMemo(() => {\n if (!dropOnlyResolvers || !newTreeData) return newTreeData;\n const { nodeDraggable, nodeDroppable } = dropOnlyResolvers;\n return produce(newTreeData, (draft) => {\n const visit = (nodes: DataNode[] | undefined) => {\n if (!nodes) return;\n for (const node of nodes) {\n const isDraggable = nodeDraggable ? nodeDraggable(node) : true;\n const isDroppable = nodeDroppable(node);\n if (!isDraggable && isDroppable) {\n const existing = node.className ?? '';\n if (!existing.includes('ald-tree-treenode-drop-only')) {\n node.className = cn(existing, 'ald-tree-treenode-drop-only');\n }\n }\n visit(node.children as DataNode[] | undefined);\n }\n };\n visit(draft as DataNode[]);\n });\n }, [newTreeData, dropOnlyResolvers]);\n\n const noChildren = React.useMemo(() => {\n if (finalTreeData?.length) {\n return finalTreeData.every((node) => {\n return !node.children?.length && node.isLeaf !== false;\n });\n }\n return true;\n }, [finalTreeData]);\n\n return (\n <RcTree\n itemHeight={20}\n ref={ref}\n virtual={virtual}\n {...newProps}\n allowDrop={composedAllowDrop}\n prefixCls={prefixCls}\n treeData={finalTreeData}\n className={cn(\n {\n [`${prefixCls}-icon-hide`]: !showIcon,\n [`${prefixCls}-block-node`]: blockNode,\n [`${prefixCls}-unselectable`]: !selectable,\n [`${prefixCls}-large`]: size === 'large',\n [`${prefixCls}-rtl`]: direction === 'rtl',\n ['ald-draggable-tree']: draggable,\n [`${prefixCls}-no-children`]: noChildren,\n },\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ant-tree',\n className,\n )}\n direction={direction as any}\n checkable={\n checkable ? (\n <span className={`${prefixCls}-checkbox-inner`} />\n ) : (\n checkable\n )\n }\n selectable={selectable}\n // @ts-ignore\n switcherIcon={(nodeProps: AldTreeNodeProps) => {\n return (\n <>\n {renderIndent(nodeProps)}\n {renderSwitcherIcon(\n prefixCls,\n <ArrowRightLightLine\n size={TREE_SWITCH_CION_SIZE}\n color={'var(--alias-colors-icon-subtle)'}\n >\n {t.Tree.expand}\n </ArrowRightLightLine>,\n showLine,\n nodeProps,\n TREE_SWITCH_CION_SIZE,\n )}\n </>\n );\n }}\n draggable={draggableConfig}\n >\n {children}\n </RcTree>\n );\n});\n\nexport default Tree;\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { TreeProps as RcTreeProps } from 'rc-tree';
2
+ import { DataNode } from 'rc-tree/es/interface';
3
+ type RcAllowDrop = NonNullable<RcTreeProps['allowDrop']>;
4
+ type NodeDroppableFn = (node: DataNode) => boolean;
5
+ /**
6
+ * 把用户传入的 allowDrop 和 nodeDroppable 组合成 AND 关系:任一拒绝即整体拒绝。
7
+ *
8
+ * 没传 nodeDroppable 时原样透传用户 allowDrop(包括 undefined),保持向后兼容。
9
+ *
10
+ * 短路:nodeDroppable 先判定,false 即返回 false,不调用用户 allowDrop;避免用户
11
+ * allowDrop 里做拼接计算时产生无谓副作用。
12
+ */
13
+ export declare function composeAllowDrop(userAllowDrop: RcAllowDrop | undefined, nodeDroppable: NodeDroppableFn | undefined): RcAllowDrop | undefined;
14
+ export {};
@@ -0,0 +1,20 @@
1
+ //#region src/Tree/utils/composeAllowDrop.ts
2
+ /**
3
+ * 把用户传入的 allowDrop 和 nodeDroppable 组合成 AND 关系:任一拒绝即整体拒绝。
4
+ *
5
+ * 没传 nodeDroppable 时原样透传用户 allowDrop(包括 undefined),保持向后兼容。
6
+ *
7
+ * 短路:nodeDroppable 先判定,false 即返回 false,不调用用户 allowDrop;避免用户
8
+ * allowDrop 里做拼接计算时产生无谓副作用。
9
+ */
10
+ function composeAllowDrop(userAllowDrop, nodeDroppable) {
11
+ if (!nodeDroppable) return userAllowDrop;
12
+ return (info) => {
13
+ if (!nodeDroppable(info.dropNode)) return false;
14
+ return userAllowDrop ? userAllowDrop(info) : true;
15
+ };
16
+ }
17
+ //#endregion
18
+ export { composeAllowDrop };
19
+
20
+ //# sourceMappingURL=composeAllowDrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composeAllowDrop.js","names":[],"sources":["../../../src/Tree/utils/composeAllowDrop.ts"],"sourcesContent":["import type { TreeProps as RcTreeProps } from 'rc-tree';\nimport type { DataNode } from 'rc-tree/es/interface';\n\ntype RcAllowDrop = NonNullable<RcTreeProps['allowDrop']>;\ntype AllowDropInfo = Parameters<RcAllowDrop>[0];\ntype NodeDroppableFn = (node: DataNode) => boolean;\n\n/**\n * 把用户传入的 allowDrop 和 nodeDroppable 组合成 AND 关系:任一拒绝即整体拒绝。\n *\n * 没传 nodeDroppable 时原样透传用户 allowDrop(包括 undefined),保持向后兼容。\n *\n * 短路:nodeDroppable 先判定,false 即返回 false,不调用用户 allowDrop;避免用户\n * allowDrop 里做拼接计算时产生无谓副作用。\n */\nexport function composeAllowDrop(\n userAllowDrop: RcAllowDrop | undefined,\n nodeDroppable: NodeDroppableFn | undefined,\n): RcAllowDrop | undefined {\n if (!nodeDroppable) return userAllowDrop;\n return (info: AllowDropInfo) => {\n if (!nodeDroppable(info.dropNode as DataNode)) return false;\n return userAllowDrop ? userAllowDrop(info) : true;\n };\n}\n"],"mappings":";;;;;;;;;AAeA,SAAgB,iBACd,eACA,eACyB;AACzB,KAAI,CAAC,cAAe,QAAO;AAC3B,SAAQ,SAAwB;AAC9B,MAAI,CAAC,cAAc,KAAK,SAAqB,CAAE,QAAO;AACtD,SAAO,gBAAgB,cAAc,KAAK,GAAG"}
@@ -1,4 +1,4 @@
1
- import { RcFile as RcUploadFile, UploadProgressEvent, UploadProps as RcUploadProps } from 'rc-upload/es/interface';
1
+ import { RcFile as RcUploadFile, UploadProgressEvent } from 'rc-upload/es/interface';
2
2
  import { default as React } from 'react';
3
3
  export interface UploadFile<T = any> {
4
4
  uid: string;
@@ -33,7 +33,20 @@ export interface UploadProps<T = any> {
33
33
  data?: Record<string, unknown> | ((file: RcFile | string | Blob) => Record<string, unknown>);
34
34
  withCredentials?: boolean;
35
35
  beforeUpload?: (file: RcFile, fileList: RcFile[]) => boolean | Promise<void | Blob | File>;
36
- customRequest?: RcUploadProps['customRequest'] | ((options: any) => any);
36
+ customRequest?: (options: {
37
+ file: RcFile;
38
+ filename?: string;
39
+ data?: Record<string, unknown>;
40
+ headers?: Record<string, string>;
41
+ onProgress?: (event: {
42
+ percent: number;
43
+ }) => void;
44
+ onSuccess?: (body: unknown, xhr?: XMLHttpRequest) => void;
45
+ onError?: (event: Error) => void;
46
+ withCredentials?: boolean;
47
+ action?: string;
48
+ method?: string;
49
+ }) => void;
37
50
  disabled?: boolean;
38
51
  fileList?: UploadFile<T>[];
39
52
  defaultFileList?: UploadFile<T>[];
@@ -313,9 +313,11 @@ function Dragger(props) {
313
313
  className: cn("ald-upload-dragger-wrapper", className),
314
314
  style: mergedStyle,
315
315
  children: /* @__PURE__ */ jsx("div", {
316
- className: cn("ald-upload-dragger", {
316
+ className: cn("ald-upload-dragger ant-upload-drag", {
317
317
  "ald-upload-drag-hover": dragOver,
318
- "ald-upload-disabled": disabled
318
+ "ant-upload-drag-hover": dragOver,
319
+ "ald-upload-disabled": disabled,
320
+ "ant-upload-disabled": disabled
319
321
  }),
320
322
  onDragOver: (e) => {
321
323
  e.preventDefault();