@bioturing/components 0.18.0 → 0.20.0

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 (233) hide show
  1. package/dist/components/{Badge → badge}/component.js.map +1 -1
  2. package/dist/components/{Breadcrumb → breadcrumb}/component.js.map +1 -1
  3. package/dist/components/{Breadcrumb → breadcrumb}/useItemRender.js +6 -5
  4. package/dist/components/breadcrumb/useItemRender.js.map +1 -0
  5. package/dist/components/button/component.js +46 -0
  6. package/dist/components/button/component.js.map +1 -0
  7. package/dist/components/{Button → button}/style.css +1 -1
  8. package/dist/components/{Checkbox → checkbox}/component.js +1 -0
  9. package/dist/components/checkbox/component.js.map +1 -0
  10. package/dist/components/choice-list/component.js +54 -0
  11. package/dist/components/choice-list/component.js.map +1 -0
  12. package/dist/components/choice-list/style.css +1 -0
  13. package/dist/components/cmdk/command-score.js +48 -0
  14. package/dist/components/cmdk/command-score.js.map +1 -0
  15. package/dist/components/cmdk/index.js +611 -0
  16. package/dist/components/cmdk/index.js.map +1 -0
  17. package/dist/components/{CodeBlock → code-block}/component.js +4 -4
  18. package/dist/components/code-block/component.js.map +1 -0
  19. package/dist/components/{Collapse → collapse}/component.js.map +1 -1
  20. package/dist/components/{ColorSelect → color-select}/component.js +10 -10
  21. package/dist/components/color-select/component.js.map +1 -0
  22. package/dist/components/drag-drop/context.js.map +1 -0
  23. package/dist/components/drag-drop/draggable.js.map +1 -0
  24. package/dist/components/drag-drop/droppable.js.map +1 -0
  25. package/dist/components/{DragDrop → drag-drop}/hooks.js +1 -0
  26. package/dist/components/drag-drop/hooks.js.map +1 -0
  27. package/dist/components/drag-drop/index.js.map +1 -0
  28. package/dist/components/{DragDrop → drag-drop}/value.js +4 -4
  29. package/dist/components/drag-drop/value.js.map +1 -0
  30. package/dist/components/dropdown-menu/component.js +199 -0
  31. package/dist/components/dropdown-menu/component.js.map +1 -0
  32. package/dist/components/dropdown-menu/style.css +1 -0
  33. package/dist/components/{DSRoot → ds-root}/component.js +3 -3
  34. package/dist/components/ds-root/component.js.map +1 -0
  35. package/dist/components/ds-root/context.js.map +1 -0
  36. package/dist/components/{Empty → empty}/component.js +6 -5
  37. package/dist/components/empty/component.js.map +1 -0
  38. package/dist/components/{Field → field}/component.js.map +1 -1
  39. package/dist/components/{Form → form}/component.js.map +1 -1
  40. package/dist/components/{Form → form}/item.js +1 -1
  41. package/dist/components/form/item.js.map +1 -0
  42. package/dist/components/hooks/useCSSVariables.js +12 -0
  43. package/dist/components/hooks/useCSSVariables.js.map +1 -0
  44. package/dist/components/hooks/useCharts.js +1 -1
  45. package/dist/components/hooks/useCharts.js.map +1 -1
  46. package/dist/components/{IconButton → icon-button}/component.js +2 -2
  47. package/dist/components/icon-button/component.js.map +1 -0
  48. package/dist/components/input/component.js +26 -0
  49. package/dist/components/input/component.js.map +1 -0
  50. package/dist/components/{Modal → modal}/Modal.js +3 -3
  51. package/dist/components/modal/Modal.js.map +1 -0
  52. package/dist/components/{Modal → modal}/ModalProvider.js.map +1 -1
  53. package/dist/components/{Modal → modal}/ModalService.js +3 -2
  54. package/dist/components/modal/ModalService.js.map +1 -0
  55. package/dist/components/{Modal → modal}/constants.js.map +1 -1
  56. package/dist/components/{Modal → modal}/functions.js +8 -7
  57. package/dist/components/modal/functions.js.map +1 -0
  58. package/dist/components/{Modal → modal}/index.js.map +1 -1
  59. package/dist/components/{Nav → nav}/context.js.map +1 -1
  60. package/dist/components/{Nav → nav}/group.js.map +1 -1
  61. package/dist/components/{Nav → nav}/heading.js.map +1 -1
  62. package/dist/components/{Nav → nav}/index.js +3 -2
  63. package/dist/components/nav/index.js.map +1 -0
  64. package/dist/components/nav/item.js +36 -0
  65. package/dist/components/nav/item.js.map +1 -0
  66. package/dist/components/{Popover → popover}/component.js.map +1 -1
  67. package/dist/components/{PopupPanel → popup-panel}/component.js +47 -47
  68. package/dist/components/popup-panel/component.js.map +1 -0
  69. package/dist/components/popup-panel/constants.js.map +1 -0
  70. package/dist/components/{Radio → radio}/component.js +6 -5
  71. package/dist/components/radio/component.js.map +1 -0
  72. package/dist/components/scroll-area/component.js.map +1 -0
  73. package/dist/components/{Segmented → segmented}/component.js +3 -2
  74. package/dist/components/segmented/component.js.map +1 -0
  75. package/dist/components/{Select → select}/component.js +7 -6
  76. package/dist/components/select/component.js.map +1 -0
  77. package/dist/components/{Slider → slider}/component.js.map +1 -1
  78. package/dist/components/{Spin → spin}/component.js +5 -4
  79. package/dist/components/spin/component.js.map +1 -0
  80. package/dist/components/{Splitter → splitter}/component.js.map +1 -1
  81. package/dist/components/{Stack → stack}/Stack.js.map +1 -1
  82. package/dist/components/stack/StackChild.js +65 -0
  83. package/dist/components/{Stack → stack}/StackChild.js.map +1 -1
  84. package/dist/components/{Stack → stack}/index.js.map +1 -1
  85. package/dist/components/{Switch → switch}/component.js +3 -2
  86. package/dist/components/switch/component.js.map +1 -0
  87. package/dist/components/{Table → table}/component.js +1 -1
  88. package/dist/components/{Table → table}/component.js.map +1 -1
  89. package/dist/components/{Tag → tag}/component.js.map +1 -1
  90. package/dist/components/theme-provider/component.js.map +1 -0
  91. package/dist/components/{Toast → toast}/component.js +14 -14
  92. package/dist/components/toast/component.js.map +1 -0
  93. package/dist/components/{Toast → toast}/function.js.map +1 -1
  94. package/dist/components/{Toast → toast}/style.css +1 -1
  95. package/dist/components/{Tooltip → tooltip}/component.js.map +1 -1
  96. package/dist/components/{Tour → tour}/component.js.map +1 -1
  97. package/dist/components/{Transition → transition}/component.js.map +1 -1
  98. package/dist/components/{Tree → tree}/components.js.map +1 -1
  99. package/dist/components/{Tree → tree}/helpers.js.map +1 -1
  100. package/dist/components/{Tree → tree}/useTreeCommon.js.map +1 -1
  101. package/dist/components/{Tree → tree}/useUniqueKeysTree.js.map +1 -1
  102. package/dist/components/{Truncate → truncate}/component.js.map +1 -1
  103. package/dist/components/{Truncate → truncate}/helpers.js.map +1 -1
  104. package/dist/components/{Upload → upload}/component.js +1 -1
  105. package/dist/components/{Upload → upload}/component.js.map +1 -1
  106. package/dist/components/{Upload → upload}/dragger.js.map +1 -1
  107. package/dist/components/{Upload → upload}/hooks.js.map +1 -1
  108. package/dist/components/{Upload → upload}/item.js +7 -6
  109. package/dist/components/upload/item.js.map +1 -0
  110. package/dist/components/{Upload → upload}/utils.js.map +1 -1
  111. package/dist/components/utils/WithRenderProp.js +15 -0
  112. package/dist/components/utils/WithRenderProp.js.map +1 -0
  113. package/dist/components/{VerticalCollapsiblePanel → vertical-collapsible-panel}/component.js +9 -9
  114. package/dist/components/vertical-collapsible-panel/component.js.map +1 -0
  115. package/dist/index.d.ts +249 -3
  116. package/dist/index.js +164 -158
  117. package/dist/index.js.map +1 -1
  118. package/dist/metadata.js +14 -0
  119. package/dist/metadata.js.map +1 -1
  120. package/dist/tokens/and-theme/tokens.js +12 -12
  121. package/dist/tokens/and-theme/tokens.js.map +1 -1
  122. package/package.json +6 -2
  123. package/dist/components/Breadcrumb/useItemRender.js.map +0 -1
  124. package/dist/components/Button/component.js +0 -36
  125. package/dist/components/Button/component.js.map +0 -1
  126. package/dist/components/Checkbox/component.js.map +0 -1
  127. package/dist/components/CodeBlock/component.js.map +0 -1
  128. package/dist/components/ColorSelect/component.js.map +0 -1
  129. package/dist/components/DSRoot/component.js.map +0 -1
  130. package/dist/components/DSRoot/context.js.map +0 -1
  131. package/dist/components/DragDrop/context.js.map +0 -1
  132. package/dist/components/DragDrop/draggable.js.map +0 -1
  133. package/dist/components/DragDrop/droppable.js.map +0 -1
  134. package/dist/components/DragDrop/hooks.js.map +0 -1
  135. package/dist/components/DragDrop/index.js.map +0 -1
  136. package/dist/components/DragDrop/value.js.map +0 -1
  137. package/dist/components/DropdownMenu/component.js +0 -156
  138. package/dist/components/DropdownMenu/component.js.map +0 -1
  139. package/dist/components/DropdownMenu/style.css +0 -1
  140. package/dist/components/Empty/component.js.map +0 -1
  141. package/dist/components/Form/item.js.map +0 -1
  142. package/dist/components/IconButton/component.js.map +0 -1
  143. package/dist/components/Input/component.js +0 -25
  144. package/dist/components/Input/component.js.map +0 -1
  145. package/dist/components/Modal/Modal.js.map +0 -1
  146. package/dist/components/Modal/ModalService.js.map +0 -1
  147. package/dist/components/Modal/functions.js.map +0 -1
  148. package/dist/components/Nav/index.js.map +0 -1
  149. package/dist/components/Nav/item.js +0 -36
  150. package/dist/components/Nav/item.js.map +0 -1
  151. package/dist/components/PopupPanel/component.js.map +0 -1
  152. package/dist/components/PopupPanel/constants.js.map +0 -1
  153. package/dist/components/Radio/component.js.map +0 -1
  154. package/dist/components/ScrollArea/component.js.map +0 -1
  155. package/dist/components/Segmented/component.js.map +0 -1
  156. package/dist/components/Select/component.js.map +0 -1
  157. package/dist/components/Spin/component.js.map +0 -1
  158. package/dist/components/Stack/StackChild.js +0 -65
  159. package/dist/components/Switch/component.js.map +0 -1
  160. package/dist/components/ThemeProvider/component.js.map +0 -1
  161. package/dist/components/Toast/component.js.map +0 -1
  162. package/dist/components/Upload/item.js.map +0 -1
  163. package/dist/components/VerticalCollapsiblePanel/component.js.map +0 -1
  164. /package/dist/components/{Badge → badge}/component.js +0 -0
  165. /package/dist/components/{Badge → badge}/style.css +0 -0
  166. /package/dist/components/{Breadcrumb → breadcrumb}/component.js +0 -0
  167. /package/dist/components/{Breadcrumb → breadcrumb}/style.css +0 -0
  168. /package/dist/components/{Checkbox → checkbox}/style.css +0 -0
  169. /package/dist/components/{CodeBlock → code-block}/style.css +0 -0
  170. /package/dist/components/{Collapse → collapse}/component.js +0 -0
  171. /package/dist/components/{Collapse → collapse}/style.css +0 -0
  172. /package/dist/components/{ColorSelect → color-select}/style.css +0 -0
  173. /package/dist/components/{DragDrop → drag-drop}/context.js +0 -0
  174. /package/dist/components/{DragDrop → drag-drop}/draggable.js +0 -0
  175. /package/dist/components/{DragDrop → drag-drop}/droppable.js +0 -0
  176. /package/dist/components/{DragDrop → drag-drop}/index.js +0 -0
  177. /package/dist/components/{DragDrop → drag-drop}/style.css +0 -0
  178. /package/dist/components/{DSRoot → ds-root}/context.js +0 -0
  179. /package/dist/components/{DSRoot → ds-root}/style.css +0 -0
  180. /package/dist/components/{Empty → empty}/style.css +0 -0
  181. /package/dist/components/{Field → field}/component.js +0 -0
  182. /package/dist/components/{Field → field}/style.css +0 -0
  183. /package/dist/components/{Form → form}/component.js +0 -0
  184. /package/dist/components/{Form → form}/style.css +0 -0
  185. /package/dist/components/{IconButton → icon-button}/style.css +0 -0
  186. /package/dist/components/{Modal → modal}/ModalProvider.js +0 -0
  187. /package/dist/components/{Modal → modal}/constants.js +0 -0
  188. /package/dist/components/{Modal → modal}/index.js +0 -0
  189. /package/dist/components/{Modal → modal}/style.css +0 -0
  190. /package/dist/components/{Nav → nav}/context.js +0 -0
  191. /package/dist/components/{Nav → nav}/group.js +0 -0
  192. /package/dist/components/{Nav → nav}/heading.js +0 -0
  193. /package/dist/components/{Nav → nav}/style.css +0 -0
  194. /package/dist/components/{Popover → popover}/component.js +0 -0
  195. /package/dist/components/{PopupPanel → popup-panel}/constants.js +0 -0
  196. /package/dist/components/{PopupPanel → popup-panel}/style.css +0 -0
  197. /package/dist/components/{Radio → radio}/style.css +0 -0
  198. /package/dist/components/{ScrollArea → scroll-area}/component.js +0 -0
  199. /package/dist/components/{ScrollArea → scroll-area}/style.css +0 -0
  200. /package/dist/components/{Segmented → segmented}/style.css +0 -0
  201. /package/dist/components/{Select → select}/style.css +0 -0
  202. /package/dist/components/{Slider → slider}/component.js +0 -0
  203. /package/dist/components/{Spin → spin}/style.css +0 -0
  204. /package/dist/components/{Splitter → splitter}/component.js +0 -0
  205. /package/dist/components/{Splitter → splitter}/style.css +0 -0
  206. /package/dist/components/{Stack → stack}/Stack.js +0 -0
  207. /package/dist/components/{Stack → stack}/index.js +0 -0
  208. /package/dist/components/{Stack → stack}/style.css +0 -0
  209. /package/dist/components/{Switch → switch}/style.css +0 -0
  210. /package/dist/components/{Table → table}/style.css +0 -0
  211. /package/dist/components/{Tag → tag}/component.js +0 -0
  212. /package/dist/components/{Tag → tag}/style.css +0 -0
  213. /package/dist/components/{ThemeProvider → theme-provider}/component.js +0 -0
  214. /package/dist/components/{ThemeProvider → theme-provider}/style.css +0 -0
  215. /package/dist/components/{Toast → toast}/function.js +0 -0
  216. /package/dist/components/{Tooltip → tooltip}/component.js +0 -0
  217. /package/dist/components/{Tooltip → tooltip}/style.css +0 -0
  218. /package/dist/components/{Tour → tour}/component.js +0 -0
  219. /package/dist/components/{Tour → tour}/style.css +0 -0
  220. /package/dist/components/{Transition → transition}/component.js +0 -0
  221. /package/dist/components/{Tree → tree}/components.js +0 -0
  222. /package/dist/components/{Tree → tree}/helpers.js +0 -0
  223. /package/dist/components/{Tree → tree}/style.css +0 -0
  224. /package/dist/components/{Tree → tree}/useTreeCommon.js +0 -0
  225. /package/dist/components/{Tree → tree}/useUniqueKeysTree.js +0 -0
  226. /package/dist/components/{Truncate → truncate}/component.js +0 -0
  227. /package/dist/components/{Truncate → truncate}/helpers.js +0 -0
  228. /package/dist/components/{Truncate → truncate}/style.css +0 -0
  229. /package/dist/components/{Upload → upload}/dragger.js +0 -0
  230. /package/dist/components/{Upload → upload}/hooks.js +0 -0
  231. /package/dist/components/{Upload → upload}/style.css +0 -0
  232. /package/dist/components/{Upload → upload}/utils.js +0 -0
  233. /package/dist/components/{VerticalCollapsiblePanel → vertical-collapsible-panel}/style.css +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/cmdk/index.tsx"],"sourcesContent":["// It is used here to avoid dependency on cmdk package and radix-ui-components package.\n\"use client\";\n\nimport React, { useId, JSX } from \"react\";\nimport { Dialog as RadixDialog } from \"@base-ui-components/react\";\nimport { commandScore } from \"./command-score\";\nimport { default as composeRefs } from \"merge-refs\";\nimport { WithRenderProp, type WithRenderPropProps } from \"../utils\";\n\ntype Children = { children?: React.ReactNode };\ntype DivProps = WithRenderPropProps<\"div\">;\n\ntype LoadingProps = Children &\n DivProps & {\n /** Estimated progress of loading asynchronous options. */\n progress?: number;\n /**\n * Accessible label for this loading progressbar. Not shown visibly.\n */\n label?: string;\n };\n\ntype EmptyProps = Children & DivProps & {};\ntype SeparatorProps = DivProps & {\n /** Whether this separator should always be rendered. Useful if you disable automatic filtering. */\n alwaysRender?: boolean;\n};\ntype DialogProps = RadixDialog.Root.Props &\n CommandProps & {\n /** Provide a className to the Dialog overlay. */\n overlayClassName?: string;\n /** Provide a className to the Dialog content. */\n contentClassName?: string;\n /** Provide a custom element the Dialog should portal into. */\n container?: HTMLElement;\n };\ntype ListProps = Children &\n DivProps & {\n /**\n * Accessible label for this List of suggestions. Not shown visibly.\n */\n label?: string;\n };\ntype ItemProps = Children &\n Omit<DivProps, \"disabled\" | \"onSelect\" | \"value\"> & {\n /** Whether this item is currently disabled. */\n disabled?: boolean;\n /** Event handler for when this item is selected, either via click or keyboard selection. */\n onSelect?: (value: string) => void;\n /**\n * A unique value for this item.\n * If no value is provided, it will be inferred from `children` or the rendered `textContent`. If your `textContent` changes between renders, you _must_ provide a stable, unique `value`.\n */\n value?: string;\n /** Optional keywords to match against when filtering. */\n keywords?: string[];\n /** Whether this item is forcibly rendered regardless of filtering. */\n forceMount?: boolean;\n };\ntype GroupProps = Children &\n Omit<DivProps, \"heading\" | \"value\"> & {\n /** Optional heading to render for this group. */\n heading?: React.ReactNode;\n /** If no heading is provided, you must provide a value that is unique for this group. */\n value?: string;\n /** Whether this group is forcibly rendered regardless of filtering. */\n forceMount?: boolean;\n };\ntype InputProps = Omit<\n WithRenderPropProps<\"input\">,\n \"value\" | \"onChange\" | \"type\"\n> & {\n /**\n * Optional controlled state for the value of the search input.\n */\n value?: string;\n /**\n * Event handler called when the search value changes.\n */\n onValueChange?: (search: string) => void;\n};\ntype CommandFilter = (\n value: string,\n search: string,\n keywords?: string[]\n) => number;\ntype CommandProps = Children &\n DivProps & {\n /**\n * Accessible label for this command menu. Not shown visibly.\n */\n label?: string;\n /**\n * Optionally set to `false` to turn off the automatic filtering and sorting.\n * If `false`, you must conditionally render valid items based on the search query yourself.\n */\n shouldFilter?: boolean;\n /**\n * Custom filter function for whether each command menu item should matches the given search query.\n * It should return a number between 0 and 1, with 1 being the best match and 0 being hidden entirely.\n * By default, uses the `command-score` library.\n */\n filter?: CommandFilter;\n /**\n * Optional default item value when it is initially rendered.\n */\n defaultValue?: string;\n /**\n * Optional controlled state of the selected command menu item.\n */\n value?: string;\n /**\n * Event handler called when the selected item of the menu changes.\n */\n onValueChange?: (value: string) => void;\n /**\n * Optionally set to `true` to turn on looping around when using the arrow keys.\n */\n loop?: boolean;\n /**\n * Optionally set to `true` to disable selection via pointer events.\n */\n disablePointerSelection?: boolean;\n /**\n * Set to `false` to disable ctrl+n/j/p/k shortcuts. Defaults to `true`.\n */\n vimBindings?: boolean;\n };\n\ntype Context = {\n value: (id: string, value: string, keywords?: string[]) => void;\n item: (id: string, groupId: string) => () => void;\n group: (id: string) => () => void;\n filter: () => boolean;\n label: string;\n getDisablePointerSelection: () => boolean;\n // Ids\n listId: string;\n labelId: string;\n inputId: string;\n // Refs\n listInnerRef: React.RefObject<HTMLDivElement | null>;\n};\ntype State = {\n search: string;\n value: string;\n selectedItemId?: string;\n filtered: { count: number; items: Map<string, number>; groups: Set<string> };\n};\ntype Store = {\n subscribe: (callback: () => void) => () => void;\n snapshot: () => State;\n setState: <K extends keyof State>(\n key: K,\n value: State[K],\n opts?: any\n ) => void;\n emit: () => void;\n};\ntype Group = {\n id: string;\n forceMount?: boolean;\n};\n\nconst GROUP_SELECTOR = `[cmdk-group=\"\"]`;\nconst GROUP_ITEMS_SELECTOR = `[cmdk-group-items=\"\"]`;\nconst GROUP_HEADING_SELECTOR = `[cmdk-group-heading=\"\"]`;\nconst ITEM_SELECTOR = `[cmdk-item=\"\"]`;\nconst VALID_ITEM_SELECTOR = `${ITEM_SELECTOR}:not([aria-disabled=\"true\"])`;\nconst SELECT_EVENT = `cmdk-item-select`;\nconst VALUE_ATTR = `data-value`;\nconst defaultFilter: CommandFilter = (value, search, keywords) =>\n commandScore(value, search, keywords);\n\nconst CommandContext = React.createContext<Context>(undefined);\nconst useCommand = () => React.useContext(CommandContext);\nconst StoreContext = React.createContext<Store>(undefined);\nconst useStore = () => React.useContext(StoreContext);\nconst GroupContext = React.createContext<Group>(undefined);\n\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\n (props, forwardedRef) => {\n const state = useLazyRef<State>(() => ({\n /** Value of the search query. */\n search: \"\",\n /** Currently selected item value. */\n value: props.value ?? props.defaultValue ?? \"\",\n /** Currently selected item id. */\n selectedItemId: undefined,\n filtered: {\n /** The count of all visible items. */\n count: 0,\n /** Map from visible item id to its search score. */\n items: new Map(),\n /** Set of groups with at least one visible item. */\n groups: new Set(),\n },\n }));\n const allItems = useLazyRef<Set<string>>(() => new Set()); // [...itemIds]\n const allGroups = useLazyRef<Map<string, Set<string>>>(() => new Map()); // groupId → [...itemIds]\n const ids = useLazyRef<Map<string, { value: string; keywords?: string[] }>>(\n () => new Map()\n ); // id → { value, keywords }\n const listeners = useLazyRef<Set<() => void>>(() => new Set()); // [...rerenders]\n const propsRef = useAsRef(props);\n const {\n label,\n children,\n value,\n onValueChange,\n filter,\n shouldFilter,\n loop,\n disablePointerSelection = false,\n vimBindings = true,\n ...etc\n } = props;\n\n const listId = useId();\n const labelId = useId();\n const inputId = useId();\n\n const listInnerRef = React.useRef<HTMLDivElement>(null);\n\n const schedule = useScheduleLayoutEffect();\n\n /** Controlled mode `value` handling. */\n useLayoutEffect(() => {\n if (value !== undefined) {\n const v = value.trim();\n state.current.value = v;\n store.emit();\n }\n }, [value]);\n\n useLayoutEffect(() => {\n schedule(6, scrollSelectedIntoView);\n }, []);\n\n const store: Store = React.useMemo(() => {\n return {\n subscribe: (cb) => {\n listeners.current.add(cb);\n return () => listeners.current.delete(cb);\n },\n snapshot: () => {\n return state.current;\n },\n setState: (key, value, opts) => {\n if (Object.is(state.current[key], value)) return;\n state.current[key] = value;\n\n if (key === \"search\") {\n // Filter synchronously before emitting back to children\n filterItems();\n sort();\n schedule(1, selectFirstItem);\n } else if (key === \"value\") {\n // Force focus input or root so accessibility works\n if (\n document.activeElement.hasAttribute(\"cmdk-input\") ||\n document.activeElement.hasAttribute(\"cmdk-root\")\n ) {\n const input = document.getElementById(inputId);\n if (input) input.focus();\n else document.getElementById(listId)?.focus();\n }\n\n schedule(7, () => {\n state.current.selectedItemId = getSelectedItem()?.id;\n store.emit();\n });\n\n // opts is a boolean referring to whether it should NOT be scrolled into view\n if (!opts) {\n // Scroll the selected item into view\n schedule(5, scrollSelectedIntoView);\n }\n if (propsRef.current?.value !== undefined) {\n // If controlled, just call the callback instead of updating state internally\n const newValue = (value ?? \"\") as string;\n propsRef.current.onValueChange?.(newValue);\n return;\n }\n }\n\n // Notify subscribers that state has changed\n store.emit();\n },\n emit: () => {\n listeners.current.forEach((l) => l());\n },\n };\n }, []);\n\n const context: Context = React.useMemo(\n () => ({\n // Keep id → {value, keywords} mapping up-to-date\n value: (id, value, keywords) => {\n if (value !== ids.current.get(id)?.value) {\n ids.current.set(id, { value, keywords });\n state.current.filtered.items.set(id, score(value, keywords));\n schedule(2, () => {\n sort();\n store.emit();\n });\n }\n },\n // Track item lifecycle (mount, unmount)\n item: (id, groupId) => {\n allItems.current.add(id);\n\n // Track this item within the group\n if (groupId) {\n if (!allGroups.current.has(groupId)) {\n allGroups.current.set(groupId, new Set([id]));\n } else {\n allGroups.current.get(groupId).add(id);\n }\n }\n\n // Batch this, multiple items can mount in one pass\n // and we should not be filtering/sorting/emitting each time\n schedule(3, () => {\n filterItems();\n sort();\n\n // Could be initial mount, select the first item if none already selected\n if (!state.current.value) {\n selectFirstItem();\n }\n\n store.emit();\n });\n\n return () => {\n ids.current.delete(id);\n allItems.current.delete(id);\n state.current.filtered.items.delete(id);\n const selectedItem = getSelectedItem();\n\n // Batch this, multiple items could be removed in one pass\n schedule(4, () => {\n filterItems();\n\n // The item removed have been the selected one,\n // so selection should be moved to the first\n if (selectedItem?.getAttribute(\"id\") === id) selectFirstItem();\n\n store.emit();\n });\n };\n },\n // Track group lifecycle (mount, unmount)\n group: (id) => {\n if (!allGroups.current.has(id)) {\n allGroups.current.set(id, new Set());\n }\n\n return () => {\n ids.current.delete(id);\n allGroups.current.delete(id);\n };\n },\n filter: () => {\n return propsRef.current.shouldFilter;\n },\n label: label || props[\"aria-label\"],\n getDisablePointerSelection: () => {\n return propsRef.current.disablePointerSelection;\n },\n listId,\n inputId,\n labelId,\n listInnerRef,\n }),\n []\n );\n\n function score(value: string, keywords?: string[]) {\n const filter = propsRef.current?.filter ?? defaultFilter;\n return value ? filter(value, state.current.search, keywords) : 0;\n }\n\n /** Sorts items by score, and groups by highest item score. */\n function sort() {\n if (\n !state.current.search ||\n // Explicitly false, because true | undefined is the default\n propsRef.current.shouldFilter === false\n ) {\n return;\n }\n\n const scores = state.current.filtered.items;\n\n // Sort the groups\n const groups: [string, number][] = [];\n state.current.filtered.groups.forEach((value) => {\n const items = allGroups.current.get(value);\n\n // Get the maximum score of the group's items\n let max = 0;\n items.forEach((item) => {\n const score = scores.get(item);\n max = Math.max(score, max);\n });\n\n groups.push([value, max]);\n });\n\n // Sort items within groups to bottom\n // Sort items outside of groups\n // Sort groups to bottom (pushes all non-grouped items to the top)\n const listInsertionElement = listInnerRef.current;\n\n // Sort the items\n getValidItems()\n .sort((a, b) => {\n const valueA = a.getAttribute(\"id\");\n const valueB = b.getAttribute(\"id\");\n return (scores.get(valueB) ?? 0) - (scores.get(valueA) ?? 0);\n })\n .forEach((item) => {\n const group = item.closest(GROUP_ITEMS_SELECTOR);\n\n if (group) {\n group.appendChild(\n item.parentElement === group\n ? item\n : item.closest(`${GROUP_ITEMS_SELECTOR} > *`)\n );\n } else {\n listInsertionElement.appendChild(\n item.parentElement === listInsertionElement\n ? item\n : item.closest(`${GROUP_ITEMS_SELECTOR} > *`)\n );\n }\n });\n\n groups\n .sort((a, b) => b[1] - a[1])\n .forEach((group) => {\n const element = listInnerRef.current?.querySelector(\n `${GROUP_SELECTOR}[${VALUE_ATTR}=\"${encodeURIComponent(group[0])}\"]`\n );\n element?.parentElement.appendChild(element);\n });\n }\n\n function selectFirstItem() {\n const item = getValidItems().find(\n (item) => item.getAttribute(\"aria-disabled\") !== \"true\"\n );\n const value = item?.getAttribute(VALUE_ATTR);\n store.setState(\"value\", value || undefined);\n }\n\n /** Filters the current items. */\n function filterItems() {\n if (\n !state.current.search ||\n // Explicitly false, because true | undefined is the default\n propsRef.current.shouldFilter === false\n ) {\n state.current.filtered.count = allItems.current.size;\n // Do nothing, each item will know to show itself because search is empty\n return;\n }\n\n // Reset the groups\n state.current.filtered.groups = new Set();\n let itemCount = 0;\n\n // Check which items should be included\n for (const id of allItems.current) {\n const value = ids.current.get(id)?.value ?? \"\";\n const keywords = ids.current.get(id)?.keywords ?? [];\n const rank = score(value, keywords);\n state.current.filtered.items.set(id, rank);\n if (rank > 0) itemCount++;\n }\n\n // Check which groups have at least 1 item shown\n for (const [groupId, group] of allGroups.current) {\n for (const itemId of group) {\n if (state.current.filtered.items.get(itemId) > 0) {\n state.current.filtered.groups.add(groupId);\n break;\n }\n }\n }\n\n state.current.filtered.count = itemCount;\n }\n\n function scrollSelectedIntoView() {\n const item = getSelectedItem();\n\n if (item) {\n if (item.parentElement?.firstChild === item) {\n // First item in Group, ensure heading is in view\n item\n .closest(GROUP_SELECTOR)\n ?.querySelector(GROUP_HEADING_SELECTOR)\n ?.scrollIntoView({ block: \"nearest\" });\n }\n\n // Ensure the item is always in view\n item.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n /** Getters */\n\n function getSelectedItem() {\n return listInnerRef.current?.querySelector(\n `${ITEM_SELECTOR}[aria-selected=\"true\"]`\n );\n }\n\n function getValidItems() {\n return Array.from(\n listInnerRef.current?.querySelectorAll(VALID_ITEM_SELECTOR) || []\n );\n }\n\n /** Setters */\n\n function updateSelectedToIndex(index: number) {\n const items = getValidItems();\n const item = items[index];\n if (item) store.setState(\"value\", item.getAttribute(VALUE_ATTR));\n }\n\n function updateSelectedByItem(change: 1 | -1) {\n const selected = getSelectedItem();\n const items = getValidItems();\n const index = items.findIndex((item) => item === selected);\n\n // Get item at this index\n let newSelected = items[index + change];\n\n if (propsRef.current?.loop) {\n newSelected =\n index + change < 0\n ? items[items.length - 1]\n : index + change === items.length\n ? items[0]\n : items[index + change];\n }\n\n if (newSelected)\n store.setState(\"value\", newSelected.getAttribute(VALUE_ATTR));\n }\n\n function updateSelectedByGroup(change: 1 | -1) {\n const selected = getSelectedItem();\n let group = selected?.closest(GROUP_SELECTOR);\n let item: HTMLElement;\n\n while (group && !item) {\n group =\n change > 0\n ? findNextSibling(group, GROUP_SELECTOR)\n : findPreviousSibling(group, GROUP_SELECTOR);\n item = group?.querySelector(VALID_ITEM_SELECTOR);\n }\n\n if (item) {\n store.setState(\"value\", item.getAttribute(VALUE_ATTR));\n } else {\n updateSelectedByItem(change);\n }\n }\n\n const last = () => updateSelectedToIndex(getValidItems().length - 1);\n\n const next = (e: React.KeyboardEvent) => {\n e.preventDefault();\n\n if (e.metaKey) {\n // Last item\n last();\n } else if (e.altKey) {\n // Next group\n updateSelectedByGroup(1);\n } else {\n // Next item\n updateSelectedByItem(1);\n }\n };\n\n const prev = (e: React.KeyboardEvent) => {\n e.preventDefault();\n\n if (e.metaKey) {\n // First item\n updateSelectedToIndex(0);\n } else if (e.altKey) {\n // Previous group\n updateSelectedByGroup(-1);\n } else {\n // Previous item\n updateSelectedByItem(-1);\n }\n };\n\n return (\n <WithRenderProp\n ref={forwardedRef}\n tabIndex={-1}\n {...etc}\n cmdk-root=\"\"\n onKeyDown={(e) => {\n etc.onKeyDown?.(e);\n\n // Check if IME composition is finished before triggering key binds\n // This prevents unwanted triggering while user is still inputting text with IME\n // e.keyCode === 229 is for the CJK IME with Legacy Browser [https://w3c.github.io/uievents/#determine-keydown-keyup-keyCode]\n // isComposing is for the CJK IME with Modern Browser [https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent/isComposing]\n const isComposing = e.nativeEvent.isComposing || e.keyCode === 229;\n\n if (e.defaultPrevented || isComposing) {\n return;\n }\n\n switch (e.key) {\n case \"n\":\n case \"j\": {\n // vim keybind down\n if (vimBindings && e.ctrlKey) {\n next(e);\n }\n break;\n }\n case \"ArrowDown\": {\n next(e);\n break;\n }\n case \"p\":\n case \"k\": {\n // vim keybind up\n if (vimBindings && e.ctrlKey) {\n prev(e);\n }\n break;\n }\n case \"ArrowUp\": {\n prev(e);\n break;\n }\n case \"Home\": {\n // First item\n e.preventDefault();\n updateSelectedToIndex(0);\n break;\n }\n case \"End\": {\n // Last item\n e.preventDefault();\n last();\n break;\n }\n case \"Enter\": {\n // Trigger item onSelect\n e.preventDefault();\n const item = getSelectedItem();\n if (item) {\n const event = new Event(SELECT_EVENT);\n item.dispatchEvent(event);\n }\n }\n }\n }}\n >\n <label\n cmdk-label=\"\"\n htmlFor={context.inputId}\n id={context.labelId}\n // Screen reader only\n style={srOnlyStyles}\n >\n {label}\n </label>\n {SlottableWithNestedChildren(props, (child) => (\n <StoreContext.Provider value={store}>\n <CommandContext.Provider value={context}>\n {child}\n </CommandContext.Provider>\n </StoreContext.Provider>\n ))}\n </WithRenderProp>\n );\n }\n);\n\n/**\n * Command menu item. Becomes active on pointer enter or through keyboard navigation.\n * Preferably pass a `value`, otherwise the value will be inferred from `children` or\n * the rendered item's `textContent`.\n */\nconst Item = React.forwardRef<HTMLDivElement, ItemProps>(\n (props, forwardedRef) => {\n const id = useId();\n const ref = React.useRef<HTMLDivElement>(null);\n const groupContext = React.useContext(GroupContext);\n const context = useCommand();\n const propsRef = useAsRef(props);\n const forceMount = propsRef.current?.forceMount ?? groupContext?.forceMount;\n\n useLayoutEffect(() => {\n if (!forceMount) {\n return context.item(id, groupContext?.id);\n }\n }, [forceMount]);\n\n const value = useValue(\n id,\n ref,\n [props.value, props.children, ref],\n props.keywords\n );\n\n const store = useStore();\n const selected = useCmdk(\n (state) => state.value && state.value === value.current\n );\n const render = useCmdk((state) =>\n forceMount\n ? true\n : context.filter() === false\n ? true\n : !state.search\n ? true\n : state.filtered.items.get(id) > 0\n );\n\n React.useEffect(() => {\n const element = ref.current;\n if (!element || props.disabled) return;\n element.addEventListener(SELECT_EVENT, onSelect);\n return () => element.removeEventListener(SELECT_EVENT, onSelect);\n }, [render, props.onSelect, props.disabled]);\n\n function onSelect() {\n select();\n propsRef.current.onSelect?.(value.current);\n }\n\n function select() {\n store.setState(\"value\", value.current, true);\n }\n\n if (!render) return null;\n\n const {\n disabled,\n value: _,\n onSelect: __,\n forceMount: ___,\n keywords: ____,\n ...etc\n } = props;\n\n return (\n <WithRenderProp\n ref={composeRefs(ref, forwardedRef)}\n {...etc}\n id={id}\n cmdk-item=\"\"\n role=\"option\"\n aria-disabled={Boolean(disabled)}\n aria-selected={Boolean(selected)}\n data-disabled={Boolean(disabled)}\n data-selected={Boolean(selected)}\n onPointerMove={\n disabled || context.getDisablePointerSelection() ? undefined : select\n }\n onClick={disabled ? undefined : onSelect}\n >\n {props.children}\n </WithRenderProp>\n );\n }\n);\n\n/**\n * Group command menu items together with a heading.\n * Grouped items are always shown together.\n */\nconst Group = React.forwardRef<HTMLDivElement, GroupProps>(\n (props, forwardedRef) => {\n const { heading, children, forceMount, ...etc } = props;\n const id = useId();\n const ref = React.useRef<HTMLDivElement>(null);\n const headingRef = React.useRef<HTMLDivElement>(null);\n const headingId = useId();\n const context = useCommand();\n const render = useCmdk((state) =>\n forceMount\n ? true\n : context.filter() === false\n ? true\n : !state.search\n ? true\n : state.filtered.groups.has(id)\n );\n\n useLayoutEffect(() => {\n return context.group(id);\n }, []);\n\n useValue(id, ref, [props.value, props.heading, headingRef]);\n\n const contextValue = React.useMemo(\n () => ({ id, forceMount }),\n [forceMount]\n );\n\n return (\n <WithRenderProp\n ref={composeRefs(ref, forwardedRef)}\n {...etc}\n cmdk-group=\"\"\n role=\"presentation\"\n hidden={render ? undefined : true}\n >\n {heading && (\n <div\n ref={headingRef}\n cmdk-group-heading=\"\"\n aria-hidden\n id={headingId}\n >\n {heading}\n </div>\n )}\n {SlottableWithNestedChildren(props, (child) => (\n <div\n cmdk-group-items=\"\"\n role=\"group\"\n aria-labelledby={heading ? headingId : undefined}\n >\n <GroupContext.Provider value={contextValue}>\n {child}\n </GroupContext.Provider>\n </div>\n ))}\n </WithRenderProp>\n );\n }\n);\n\n/**\n * A visual and semantic separator between items or groups.\n * Visible when the search query is empty or `alwaysRender` is true, hidden otherwise.\n */\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (props, forwardedRef) => {\n const { alwaysRender, ...etc } = props;\n const ref = React.useRef<HTMLDivElement>(null);\n const render = useCmdk((state) => !state.search);\n\n if (!alwaysRender && !render) return null;\n return (\n <WithRenderProp\n ref={composeRefs(ref, forwardedRef)}\n {...etc}\n cmdk-separator=\"\"\n role=\"separator\"\n />\n );\n }\n);\n\n/**\n * Command menu input.\n * All props are forwarded to the underyling `input` element.\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (props, forwardedRef) => {\n const { onValueChange, ...etc } = props;\n const isControlled = props.value != null;\n const store = useStore();\n const search = useCmdk((state) => state.search);\n const selectedItemId = useCmdk((state) => state.selectedItemId);\n const context = useCommand();\n\n React.useEffect(() => {\n if (props.value != null) {\n store.setState(\"search\", props.value);\n }\n }, [props.value]);\n\n return (\n <WithRenderProp\n as=\"input\"\n ref={forwardedRef}\n {...etc}\n cmdk-input=\"\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n aria-autocomplete=\"list\"\n role=\"combobox\"\n aria-expanded={true}\n aria-controls={context.listId}\n aria-labelledby={context.labelId}\n aria-activedescendant={selectedItemId}\n id={context.inputId}\n type=\"text\"\n value={isControlled ? props.value : search}\n onChange={(e) => {\n if (!isControlled) {\n store.setState(\"search\", e.target.value);\n }\n\n onValueChange?.(e.target.value);\n }}\n />\n );\n }\n);\n\n/**\n * Contains `Item`, `Group`, and `Separator`.\n * Use the `--cmdk-list-height` CSS variable to animate height based on the number of results.\n */\nconst List = React.forwardRef<HTMLDivElement, ListProps>(\n (props, forwardedRef) => {\n const { children, label = \"Suggestions\", ...etc } = props;\n const ref = React.useRef<HTMLDivElement>(null);\n const height = React.useRef<HTMLDivElement>(null);\n const selectedItemId = useCmdk((state) => state.selectedItemId);\n const context = useCommand();\n\n React.useEffect(() => {\n if (height.current && ref.current) {\n const el = height.current;\n const wrapper = ref.current;\n let animationFrame;\n const observer = new ResizeObserver(() => {\n animationFrame = requestAnimationFrame(() => {\n const height = el.offsetHeight;\n wrapper.style.setProperty(\n `--cmdk-list-height`,\n height.toFixed(1) + \"px\"\n );\n });\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(animationFrame);\n observer.unobserve(el);\n };\n }\n }, []);\n\n return (\n <WithRenderProp\n ref={composeRefs(ref, forwardedRef)}\n {...etc}\n cmdk-list=\"\"\n role=\"listbox\"\n tabIndex={-1}\n aria-activedescendant={selectedItemId}\n aria-label={label}\n id={context.listId}\n >\n {SlottableWithNestedChildren(props, (child) => (\n <div\n ref={composeRefs(height, context.listInnerRef)}\n cmdk-list-sizer=\"\"\n >\n {child}\n </div>\n ))}\n </WithRenderProp>\n );\n }\n);\n\n/**\n * Renders the command menu in a Radix Dialog.\n */\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>(\n (props, forwardedRef) => {\n const {\n open,\n onOpenChange,\n overlayClassName,\n contentClassName,\n container,\n ...etc\n } = props;\n return (\n <RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixDialog.Portal container={container}>\n <RadixDialog.Backdrop cmdk-overlay=\"\" className={overlayClassName} />\n <RadixDialog.Popup\n aria-label={props.label}\n cmdk-dialog=\"\"\n className={contentClassName}\n >\n <Command ref={forwardedRef} {...etc} />\n </RadixDialog.Popup>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n }\n);\n\n/**\n * Automatically renders when there are no results for the search query.\n */\nconst Empty = React.forwardRef<HTMLDivElement, EmptyProps>(\n (props, forwardedRef) => {\n const render = useCmdk((state) => state.filtered.count === 0);\n\n if (!render) return null;\n return (\n <WithRenderProp\n ref={forwardedRef}\n {...props}\n cmdk-empty=\"\"\n role=\"presentation\"\n />\n );\n }\n);\n\n/**\n * You should conditionally render this with `progress` while loading asynchronous items.\n */\nconst Loading = React.forwardRef<HTMLDivElement, LoadingProps>(\n (props, forwardedRef) => {\n const { progress, children, label = \"Loading...\", ...etc } = props;\n\n return (\n <WithRenderProp\n ref={forwardedRef}\n {...etc}\n cmdk-loading=\"\"\n role=\"progressbar\"\n aria-valuenow={progress}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={label}\n >\n {SlottableWithNestedChildren(props, (child) => (\n <div aria-hidden>{child}</div>\n ))}\n </WithRenderProp>\n );\n }\n);\n\nconst pkg = Object.assign(Command, {\n List,\n Item,\n Input,\n Group,\n Separator,\n Dialog,\n Empty,\n Loading,\n});\n\nexport { useCmdk as useCommandState };\nexport { pkg as Command };\nexport { defaultFilter };\n\nexport { Command as CommandRoot };\nexport { List as CommandList };\nexport { Item as CommandItem };\nexport { Input as CommandInput };\nexport { Group as CommandGroup };\nexport { Separator as CommandSeparator };\nexport { Dialog as CommandDialog };\nexport { Empty as CommandEmpty };\nexport { Loading as CommandLoading };\n\n/**\n *\n *\n * Helpers\n *\n *\n */\n\nfunction findNextSibling(el: Element, selector: string) {\n let sibling = el.nextElementSibling;\n\n while (sibling) {\n if (sibling.matches(selector)) return sibling;\n sibling = sibling.nextElementSibling;\n }\n}\n\nfunction findPreviousSibling(el: Element, selector: string) {\n let sibling = el.previousElementSibling;\n\n while (sibling) {\n if (sibling.matches(selector)) return sibling;\n sibling = sibling.previousElementSibling;\n }\n}\n\nfunction useAsRef<T>(data: T) {\n const ref = React.useRef<T>(data);\n\n useLayoutEffect(() => {\n ref.current = data;\n });\n\n return ref;\n}\n\nconst useLayoutEffect =\n typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect;\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T>(undefined);\n\n if (ref.current === undefined) {\n ref.current = fn();\n }\n\n return ref as React.MutableRefObject<T>;\n}\n\n/** Run a selector against the store state. */\nfunction useCmdk<T = any>(selector: (state: State) => T): T {\n const store = useStore();\n const cb = () => selector(store.snapshot());\n return React.useSyncExternalStore(store.subscribe, cb, cb);\n}\n\nfunction useValue(\n id: string,\n ref: React.RefObject<HTMLElement>,\n deps: (string | React.ReactNode | React.RefObject<HTMLElement>)[],\n aliases: string[] = []\n) {\n const valueRef = React.useRef<string>(undefined);\n const context = useCommand();\n\n useLayoutEffect(() => {\n const value = (() => {\n for (const part of deps) {\n if (typeof part === \"string\") {\n return part.trim();\n }\n\n if (typeof part === \"object\" && \"current\" in part) {\n if (part.current) {\n return part.current.textContent?.trim();\n }\n return valueRef.current;\n }\n }\n })();\n\n const keywords = aliases.map((alias) => alias.trim());\n\n context.value(id, value, keywords);\n ref.current?.setAttribute(VALUE_ATTR, value);\n valueRef.current = value;\n });\n\n return valueRef;\n}\n\n/** Imperatively run a function on the next layout effect cycle. */\nconst useScheduleLayoutEffect = () => {\n const [s, ss] = React.useState<object>();\n const fns = useLazyRef(() => new Map<string | number, () => void>());\n\n useLayoutEffect(() => {\n fns.current.forEach((f) => f());\n fns.current = new Map();\n }, [s]);\n\n return (id: string | number, cb: () => void) => {\n fns.current.set(id, cb);\n ss({});\n };\n};\n\nfunction renderChildren(children: React.ReactElement) {\n const childrenType = children.type as any;\n // The children is a component\n if (typeof childrenType === \"function\") return childrenType(children.props);\n // The children is a component with `forwardRef`\n else if (\"render\" in childrenType) return childrenType.render(children.props);\n // It's a string, boolean, etc.\n else return children;\n}\n\nfunction SlottableWithNestedChildren(\n { asChild, children }: { asChild?: boolean; children?: React.ReactNode },\n render: (child: React.ReactNode) => JSX.Element\n) {\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n renderChildren(children),\n { ref: (children as any).ref },\n // @ts-expect-error expect error here\n render(children.props.children)\n );\n }\n return render(children);\n}\n\nconst srOnlyStyles = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n borderWidth: \"0\",\n} as const;\n"],"names":["GROUP_SELECTOR","GROUP_ITEMS_SELECTOR","GROUP_HEADING_SELECTOR","ITEM_SELECTOR","VALID_ITEM_SELECTOR","SELECT_EVENT","VALUE_ATTR","defaultFilter","value","search","keywords","commandScore","CommandContext","React","useCommand","StoreContext","useStore","GroupContext","Command","props","forwardedRef","state","useLazyRef","allItems","allGroups","ids","listeners","propsRef","useAsRef","label","children","onValueChange","filter","shouldFilter","loop","disablePointerSelection","vimBindings","etc","listId","useId","labelId","inputId","listInnerRef","schedule","useScheduleLayoutEffect","useLayoutEffect","v","store","scrollSelectedIntoView","cb","key","opts","filterItems","sort","selectFirstItem","input","_a","getSelectedItem","_b","newValue","_d","_c","l","context","id","score","groupId","selectedItem","scores","groups","items","max","item","listInsertionElement","getValidItems","a","b","valueA","valueB","group","element","itemCount","rank","itemId","updateSelectedToIndex","index","updateSelectedByItem","change","selected","newSelected","updateSelectedByGroup","findNextSibling","findPreviousSibling","last","next","prev","jsxs","WithRenderProp","isComposing","event","jsx","srOnlyStyles","SlottableWithNestedChildren","child","Item","ref","groupContext","forceMount","useValue","useCmdk","render","onSelect","select","disabled","_","__","___","____","composeRefs","Group","heading","headingRef","headingId","contextValue","Separator","alwaysRender","Input","isControlled","selectedItemId","e","List","height","el","wrapper","animationFrame","observer","Dialog","open","onOpenChange","overlayClassName","contentClassName","container","RadixDialog","Empty","Loading","progress","pkg","selector","sibling","data","fn","deps","aliases","valueRef","part","alias","s","ss","fns","f","renderChildren","childrenType","asChild"],"mappings":"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"}
@@ -2,17 +2,17 @@
2
2
  import { jsx as o, jsxs as _ } from "react/jsx-runtime";
3
3
  import { useState as p, useEffect as $ } from "react";
4
4
  import { Check as q, Copy as z } from "@bioturing/assets";
5
- import { ThemeProvider as G } from "../ThemeProvider/component.js";
5
+ import { ThemeProvider as G } from "../theme-provider/component.js";
6
6
  import { Highlight as J, themes as K } from "prism-react-renderer";
7
7
  import './style.css';/* empty css */
8
8
  import { WithAntdTokens as Q } from "../utils/WithAntdTokens.js";
9
- import { Segmented as R } from "../Segmented/component.js";
10
- import { ScrollArea as U } from "../ScrollArea/component.js";
9
+ import { Segmented as R } from "../segmented/component.js";
10
+ import { ScrollArea as U } from "../scroll-area/component.js";
11
11
  import { reactNodeToString as V } from "../utils/reactToString.js";
12
12
  import { useControlledState as X } from "../hooks/useControlledState.js";
13
13
  import { useCls as Y } from "../utils/antdUtils.js";
14
14
  import { clsx as Z } from "../utils/cn.js";
15
- import { IconButton as H } from "../IconButton/component.js";
15
+ import { IconButton as H } from "../icon-button/component.js";
16
16
  const fo = ({
17
17
  code: u,
18
18
  children: s,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sources":["../../../src/components/code-block/component.tsx"],"sourcesContent":["\"use client\";\nimport { useEffect, useState } from \"react\";\nimport { Check, Copy } from \"@bioturing/assets\";\nimport { IconButton } from \"../icon-button\";\nimport { ScrollArea } from \"../scroll-area\";\nimport { Segmented } from \"../segmented\";\nimport { ThemeProvider } from \"../theme-provider/component\";\nimport { useControlledState } from \"../hooks\";\nimport { clsx, useCls, WithAntdTokens } from \"../utils\";\nimport { Highlight, themes } from \"prism-react-renderer\";\nimport type { CodeBlockProps } from \"./types\";\nimport { reactNodeToString } from \"../utils\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\nexport const CodeBlock = ({\n code,\n children,\n // initial,\n lang: defaultLang = \"tsx\",\n className,\n options,\n activeOption: controlledActiveOption,\n defaultActiveOption = 0,\n onActiveOptionChange,\n copyText = \"Copy\",\n copySuccessText = \"Copied\",\n classNames,\n maxHeight,\n ...rest\n}: CodeBlockProps) => {\n const [activeOption, setActiveOption] = useControlledState(\n controlledActiveOption,\n onActiveOptionChange,\n defaultActiveOption\n );\n\n const [currentCode, setCurrentCode] = useState(code || \"\");\n const [lang, setLang] = useState(defaultLang);\n\n const hasOptions = options && options.length > 0;\n\n useEffect(() => {\n if (hasOptions) {\n const newCode = options[activeOption]?.code || \"\";\n const newLang = options[activeOption]?.lang || defaultLang;\n setCurrentCode(newCode);\n setLang(newLang);\n }\n }, [\n code,\n activeOption,\n defaultActiveOption,\n options,\n defaultLang,\n hasOptions,\n setActiveOption,\n ]);\n\n const [tooltipContent, setTooltipContent] = useState(copyText);\n const [copySuccess, setCopySuccess] = useState(false);\n\n const handleCopy = () => {\n const codeContent = currentCode ? currentCode : reactNodeToString(children);\n try {\n navigator.clipboard.writeText(codeContent).then(() => {\n setTooltipContent(copySuccessText);\n setCopySuccess(true);\n });\n } catch (_) {\n setTooltipContent(\"Failed to copy\");\n }\n };\n\n const handleMouseLeave = () => {\n setTooltipContent(copyText);\n setCopySuccess(false);\n };\n\n const cls = useCls();\n return (\n <ThemeProvider theme={\"dark\"}>\n <WithAntdTokens\n className={clsx(cls(\"code-block\"), className, classNames?.root)}\n {...rest}\n >\n {hasOptions && (\n <div className={cls(\"code-block-header\", classNames?.header)}>\n <Segmented\n value={activeOption}\n onChange={setActiveOption}\n options={options.map((opt, index) => ({\n label: opt.label,\n value: index,\n }))}\n />\n </div>\n )}\n <div className={cls(\"code-block-copy\")}>\n <IconButton\n onClick={handleCopy}\n label={tooltipContent}\n onMouseLeave={handleMouseLeave}\n >\n {copySuccess ? <Check /> : <Copy />}\n </IconButton>\n </div>\n <div\n className={cls(\"code-block-content\", classNames?.content)}\n style={{\n maxHeight:\n maxHeight &&\n (typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight),\n }}\n >\n <ScrollArea>\n {currentCode ? (\n <Highlight\n language={lang}\n code={currentCode}\n theme={themes.vsDark}\n >\n {({\n className,\n style,\n tokens,\n getLineProps,\n getTokenProps,\n }) => (\n <pre\n style={{ ...style, backgroundColor: \"transparent\" }}\n className={className}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {/* <span>{i + 1}</span> */}\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n ) : (\n children\n )}\n </ScrollArea>\n </div>\n </WithAntdTokens>\n </ThemeProvider>\n );\n};\n"],"names":["CodeBlock","code","children","defaultLang","className","options","controlledActiveOption","defaultActiveOption","onActiveOptionChange","copyText","copySuccessText","classNames","maxHeight","rest","activeOption","setActiveOption","useControlledState","currentCode","setCurrentCode","useState","lang","setLang","hasOptions","useEffect","newCode","_a","newLang","_b","tooltipContent","setTooltipContent","copySuccess","setCopySuccess","handleCopy","codeContent","reactNodeToString","handleMouseLeave","cls","useCls","jsx","ThemeProvider","jsxs","WithAntdTokens","clsx","Segmented","opt","index","IconButton","Check","Copy","ScrollArea","Highlight","themes","style","tokens","getLineProps","getTokenProps","line","i","token","key"],"mappings":";;;;;;;;;;;;;;;AAgBO,MAAMA,KAAY,CAAC;AAAA,EACxB,MAAAC;AAAA,EACA,UAAAC;AAAA;AAAA,EAEA,MAAMC,IAAc;AAAA,EACpB,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAcC;AAAA,EACd,qBAAAC,IAAsB;AAAA,EACtB,sBAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,iBAAAC,IAAkB;AAAA,EAClB,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAAsB;AACd,QAAA,CAACC,GAAcC,CAAe,IAAIC;AAAA,IACtCV;AAAA,IACAE;AAAA,IACAD;AAAA,EACF,GAEM,CAACU,GAAaC,CAAc,IAAIC,EAASlB,KAAQ,EAAE,GACnD,CAACmB,GAAMC,CAAO,IAAIF,EAAShB,CAAW,GAEtCmB,IAAajB,KAAWA,EAAQ,SAAS;AAE/C,EAAAkB,EAAU,MAAM;;AACd,QAAID,GAAY;AACd,YAAME,MAAUC,IAAApB,EAAQS,CAAY,MAApB,gBAAAW,EAAuB,SAAQ,IACzCC,MAAUC,IAAAtB,EAAQS,CAAY,MAApB,gBAAAa,EAAuB,SAAQxB;AAC/C,MAAAe,EAAeM,CAAO,GACtBH,EAAQK,CAAO;AAAA,IAAA;AAAA,EACjB,GACC;AAAA,IACDzB;AAAA,IACAa;AAAA,IACAP;AAAA,IACAF;AAAA,IACAF;AAAA,IACAmB;AAAA,IACAP;AAAA,EAAA,CACD;AAED,QAAM,CAACa,GAAgBC,CAAiB,IAAIV,EAASV,CAAQ,GACvD,CAACqB,GAAaC,CAAc,IAAIZ,EAAS,EAAK,GAE9Ca,IAAa,MAAM;AACvB,UAAMC,IAAchB,KAA4BiB,EAAkBhC,CAAQ;AACtE,QAAA;AACF,gBAAU,UAAU,UAAU+B,CAAW,EAAE,KAAK,MAAM;AACpD,QAAAJ,EAAkBnB,CAAe,GACjCqB,EAAe,EAAI;AAAA,MAAA,CACpB;AAAA,YACS;AACV,MAAAF,EAAkB,gBAAgB;AAAA,IAAA;AAAA,EAEtC,GAEMM,IAAmB,MAAM;AAC7B,IAAAN,EAAkBpB,CAAQ,GAC1BsB,EAAe,EAAK;AAAA,EACtB,GAEMK,IAAMC,EAAO;AAEjB,SAAA,gBAAAC,EAACC,GAAc,EAAA,OAAO,QACpB,UAAA,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAKN,EAAI,YAAY,GAAGhC,GAAWO,KAAA,gBAAAA,EAAY,IAAI;AAAA,MAC7D,GAAGE;AAAA,MAEH,UAAA;AAAA,QAAAS,uBACE,OAAI,EAAA,WAAWc,EAAI,qBAAqBzB,KAAA,gBAAAA,EAAY,MAAM,GACzD,UAAA,gBAAA2B;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,OAAO7B;AAAA,YACP,UAAUC;AAAA,YACV,SAASV,EAAQ,IAAI,CAACuC,GAAKC,OAAW;AAAA,cACpC,OAAOD,EAAI;AAAA,cACX,OAAOC;AAAA,YAAA,EACP;AAAA,UAAA;AAAA,QAAA,GAEN;AAAA,QAED,gBAAAP,EAAA,OAAA,EAAI,WAAWF,EAAI,iBAAiB,GACnC,UAAA,gBAAAE;AAAA,UAACQ;AAAA,UAAA;AAAA,YACC,SAASd;AAAA,YACT,OAAOJ;AAAA,YACP,cAAcO;AAAA,YAEb,UAAcL,IAAA,gBAAAQ,EAACS,GAAM,CAAA,CAAA,sBAAMC,GAAK,CAAA,CAAA;AAAA,UAAA;AAAA,QAAA,GAErC;AAAA,QACA,gBAAAV;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF,EAAI,sBAAsBzB,KAAA,gBAAAA,EAAY,OAAO;AAAA,YACxD,OAAO;AAAA,cACL,WACEC,MACC,OAAOA,KAAc,WAAW,GAAGA,CAAS,OAAOA;AAAA,YACxD;AAAA,YAEA,UAAA,gBAAA0B,EAACW,KACE,UACChC,IAAA,gBAAAqB;AAAA,cAACY;AAAA,cAAA;AAAA,gBACC,UAAU9B;AAAA,gBACV,MAAMH;AAAA,gBACN,OAAOkC,EAAO;AAAA,gBAEb,UAAC,CAAA;AAAA,kBACA,WAAA/C;AAAAA,kBACA,OAAAgD;AAAA,kBACA,QAAAC;AAAA,kBACA,cAAAC;AAAA,kBACA,eAAAC;AAAA,gBAAA,MAEA,gBAAAjB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO,EAAE,GAAGc,GAAO,iBAAiB,cAAc;AAAA,oBAClD,WAAWhD;AAAAA,oBAEV,UAAOiD,EAAA,IAAI,CAACG,GAAMC,MACjB,gBAAAnB,EAAC,OAAa,EAAA,GAAGgB,EAAa,EAAE,MAAAE,EAAM,CAAA,GAEnC,UAAKA,EAAA,IAAI,CAACE,GAAOC,MAChB,gBAAArB,EAAC,QAAgB,EAAA,GAAGiB,EAAc,EAAE,OAAAG,EAAO,CAAA,EAAhC,GAAAC,CAAmC,CAC/C,EAAA,GAJOF,CAKV,CACD;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACH;AAAA,gBAIJvD,EAEJ,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../../src/components/Collapse/component.tsx"],"sourcesContent":["\"use client\";\nimport {\n Collapse as AntCollapse,\n type CollapseProps as AntCollapseProps,\n type CollapsePanelProps as AntCollapsePanelProps,\n} from \"antd\";\nimport { type ForwardedRef, forwardRef } from \"react\";\nimport { useCls, clsx } from \"../utils\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n// Define props interface extending Ant Design's CollapseProps\nexport interface CollapseProps extends AntCollapseProps {}\n\n// Define props interface extending Ant Design's CollapsePanelProps\nexport interface CollapsePanelProps extends AntCollapsePanelProps {}\n\n// Create inner function with forwarded ref\nconst CollapseInner = (\n props: CollapseProps,\n ref: ForwardedRef<HTMLDivElement>\n) => {\n const { className, ...restProps } = props;\n const cls = useCls();\n return (\n <AntCollapse\n ref={ref}\n className={cls(\"collapse\", className)}\n {...restProps}\n />\n );\n};\n\n// Use forwardRef with type assertion\nconst MainCollapse = forwardRef(CollapseInner) as (\n props: CollapseProps & {\n ref?: React.ForwardedRef<HTMLDivElement>;\n }\n) => ReturnType<typeof CollapseInner>;\n\n// Create the Panel component (deprecated)\nconst Panel = (props: CollapsePanelProps) => {\n const { className, ...restProps } = props;\n const cls = useCls();\n console.warn(\n \"[bioturing-ds] Collapse.Panel is deprecated. Please use items prop instead.\"\n );\n return (\n <AntCollapse.Panel\n className={clsx(cls(\"collapse-panel\"), className)}\n {...restProps}\n />\n );\n};\n\n// Create the final component with Panel property\nexport const Collapse = Object.assign(MainCollapse, {\n Panel: Panel,\n});\n"],"names":["CollapseInner","props","ref","className","restProps","cls","useCls","jsx","AntCollapse","MainCollapse","forwardRef","Panel","clsx","Collapse"],"mappings":";;;;;;;AAmBA,MAAMA,IAAgB,CACpBC,GACAC,MACG;AACH,QAAM,EAAE,WAAAC,GAAW,GAAGC,EAAA,IAAcH,GAC9BI,IAAMC,EAAO;AAEjB,SAAA,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,KAAAN;AAAA,MACA,WAAWG,EAAI,YAAYF,CAAS;AAAA,MACnC,GAAGC;AAAA,IAAA;AAAA,EACN;AAEJ,GAGMK,IAAeC,EAAWV,CAAa,GAOvCW,IAAQ,CAACV,MAA8B;AAC3C,QAAM,EAAE,WAAAE,GAAW,GAAGC,EAAA,IAAcH,GAC9BI,IAAMC,EAAO;AACX,iBAAA;AAAA,IACN;AAAA,EACF,GAEE,gBAAAC;AAAA,IAACC,EAAY;AAAA,IAAZ;AAAA,MACC,WAAWI,EAAKP,EAAI,gBAAgB,GAAGF,CAAS;AAAA,MAC/C,GAAGC;AAAA,IAAA;AAAA,EACN;AAEJ,GAGaS,IAAW,OAAO,OAAOJ,GAAc;AAAA,EAClD,OAAAE;AACF,CAAC;"}
1
+ {"version":3,"file":"component.js","sources":["../../../src/components/collapse/component.tsx"],"sourcesContent":["\"use client\";\nimport {\n Collapse as AntCollapse,\n type CollapseProps as AntCollapseProps,\n type CollapsePanelProps as AntCollapsePanelProps,\n} from \"antd\";\nimport { type ForwardedRef, forwardRef } from \"react\";\nimport { useCls, clsx } from \"../utils\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n// Define props interface extending Ant Design's CollapseProps\nexport interface CollapseProps extends AntCollapseProps {}\n\n// Define props interface extending Ant Design's CollapsePanelProps\nexport interface CollapsePanelProps extends AntCollapsePanelProps {}\n\n// Create inner function with forwarded ref\nconst CollapseInner = (\n props: CollapseProps,\n ref: ForwardedRef<HTMLDivElement>\n) => {\n const { className, ...restProps } = props;\n const cls = useCls();\n return (\n <AntCollapse\n ref={ref}\n className={cls(\"collapse\", className)}\n {...restProps}\n />\n );\n};\n\n// Use forwardRef with type assertion\nconst MainCollapse = forwardRef(CollapseInner) as (\n props: CollapseProps & {\n ref?: React.ForwardedRef<HTMLDivElement>;\n }\n) => ReturnType<typeof CollapseInner>;\n\n// Create the Panel component (deprecated)\nconst Panel = (props: CollapsePanelProps) => {\n const { className, ...restProps } = props;\n const cls = useCls();\n console.warn(\n \"[bioturing-ds] Collapse.Panel is deprecated. Please use items prop instead.\"\n );\n return (\n <AntCollapse.Panel\n className={clsx(cls(\"collapse-panel\"), className)}\n {...restProps}\n />\n );\n};\n\n// Create the final component with Panel property\nexport const Collapse = Object.assign(MainCollapse, {\n Panel: Panel,\n});\n"],"names":["CollapseInner","props","ref","className","restProps","cls","useCls","jsx","AntCollapse","MainCollapse","forwardRef","Panel","clsx","Collapse"],"mappings":";;;;;;;AAmBA,MAAMA,IAAgB,CACpBC,GACAC,MACG;AACH,QAAM,EAAE,WAAAC,GAAW,GAAGC,EAAA,IAAcH,GAC9BI,IAAMC,EAAO;AAEjB,SAAA,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,KAAAN;AAAA,MACA,WAAWG,EAAI,YAAYF,CAAS;AAAA,MACnC,GAAGC;AAAA,IAAA;AAAA,EACN;AAEJ,GAGMK,IAAeC,EAAWV,CAAa,GAOvCW,IAAQ,CAACV,MAA8B;AAC3C,QAAM,EAAE,WAAAE,GAAW,GAAGC,EAAA,IAAcH,GAC9BI,IAAMC,EAAO;AACX,iBAAA;AAAA,IACN;AAAA,EACF,GAEE,gBAAAC;AAAA,IAACC,EAAY;AAAA,IAAZ;AAAA,MACC,WAAWI,EAAKP,EAAI,gBAAgB,GAAGF,CAAS;AAAA,MAC/C,GAAGC;AAAA,IAAA;AAAA,EACN;AAEJ,GAGaS,IAAW,OAAO,OAAOJ,GAAc;AAAA,EAClD,OAAAE;AACF,CAAC;"}
@@ -2,35 +2,35 @@
2
2
  import { jsx as f, jsxs as Q } from "react/jsx-runtime";
3
3
  import { forwardRef as Z, useState as w, useRef as I, useCallback as c, useEffect as L, useMemo as j } from "react";
4
4
  import _ from "antd/es/color-picker";
5
- import { Stack as ee } from "../Stack/index.js";
5
+ import { Stack as ee } from "../stack/index.js";
6
6
  import te from "merge-refs";
7
7
  import './style.css';/* empty css */
8
8
  import { moveTypingCursorToEnd as oe } from "../utils/selectionRange.js";
9
9
  import { isValidHexColor as R } from "../utils/colors.js";
10
- import { toast as ne } from "../Toast/function.js";
10
+ import { toast as ne } from "../toast/function.js";
11
11
  import { useCls as re } from "../utils/antdUtils.js";
12
12
  import { useControlledState as $ } from "../hooks/useControlledState.js";
13
- import { Tooltip as se } from "../Tooltip/component.js";
14
- import { Tag as le } from "../Tag/component.js";
13
+ import { Tooltip as se } from "../tooltip/component.js";
14
+ import { Tag as le } from "../tag/component.js";
15
15
  const ce = ({
16
16
  className: ue,
17
17
  value: q,
18
18
  defaultValue: O,
19
- onChange: g,
19
+ onChange: h,
20
20
  colorPickerProps: F,
21
21
  presetColors: P,
22
22
  open: U,
23
- onOpenChange: h,
23
+ onOpenChange: g,
24
24
  defaultOpen: W,
25
25
  ...X
26
26
  }, N) => {
27
27
  const a = re(), [s, u] = $(
28
28
  q,
29
- g,
29
+ h,
30
30
  O
31
31
  ), [C, S] = w(null), [i, D] = w(""), [E, M] = w(""), [k, r] = $(
32
32
  U,
33
- h,
33
+ g,
34
34
  W
35
35
  ), [Y, T] = w(!1), y = I(null), d = I(null), z = I(!1), x = I({
36
36
  x: 0,
@@ -65,10 +65,10 @@ const ce = ({
65
65
  ), o = [], n = t.reduce((l, m) => (R(m, !0) ? l.push(m) : o.push(m), l), []);
66
66
  o.length && ne(`Invalid colors: ${o.join(", ")}`);
67
67
  const p = /* @__PURE__ */ new Set([...s, ...n]);
68
- g && g([...p]), h && h(!1), D(""), M(""), r(!1), requestAnimationFrame(() => {
68
+ h && h([...p]), g && g(!1), D(""), M(""), r(!1), requestAnimationFrame(() => {
69
69
  r(!0);
70
70
  });
71
- }, [i, s, g, h, r]), B = c(
71
+ }, [i, s, h, g, r]), B = c(
72
72
  (e) => {
73
73
  e.key === "Enter" && A(), e.key === "Backspace" && !i && (e.ctrlKey || e.metaKey ? u([]) : u(s.slice(0, -1)));
74
74
  },
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.js","sources":["../../../src/components/color-select/component.tsx"],"sourcesContent":["\"use client\";\nimport React, {\n ComponentPropsWithoutRef,\n forwardRef,\n useRef,\n useState,\n useCallback,\n useMemo,\n useEffect,\n} from \"react\";\nimport ColorPicker from \"antd/es/color-picker\";\nimport { type ColorPickerProps, type Color } from \"antd/es/color-picker\";\nimport { useCls, isValidHexColor } from \"../utils\";\nimport { useControlledState } from \"../hooks\";\nimport { Tag } from \"../tag\";\nimport { Stack } from \"../stack\";\nimport { toast } from \"../toast\";\nimport mergeRefs from \"merge-refs\";\nimport { moveTypingCursorToEnd } from \"../utils/client\";\nimport { Tooltip } from \"../tooltip\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n/**\n * Props for the ColorSelect component.\n */\nexport interface ColorSelectProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /** Controlled list of selected hex colors */\n value?: string[];\n /** Default list of selected hex colors for uncontrolled usage */\n defaultValue?: string[];\n /** Callback invoked when selected colors change */\n onChange?: (value: string[]) => void;\n /** Props to pass through to the Ant Design ColorPicker, excluding value/onChange/onChangeComplete */\n colorPickerProps?: Omit<\n ColorPickerProps,\n \"value\" | \"onChange\" | \"onChangeComplete\"\n >;\n /** Preset color swatches displayed in the picker */\n presetColors?: string[];\n /** Controlled open state of the ColorPicker dropdown */\n open?: boolean;\n /** Callback invoked when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage */\n defaultOpen?: boolean;\n}\n\n/**\n * ColorSelectInner - Combines an input and Ant Design ColorPicker for selecting multiple colors.\n * Supports preset color swatches and freeform hex entry, displaying selections as tags.\n * Controlled/uncontrolled APIs for `value` and `open`, emitting invalid input notifications via toast.\n * @param props - {@link ColorSelectProps}\n * @param ref - ref to the input element\n * @returns JSX.Element\n */\nconst ColorSelectInner = (\n {\n className,\n value: valueProp,\n defaultValue,\n onChange,\n colorPickerProps,\n presetColors,\n open: openProp,\n onOpenChange,\n defaultOpen,\n ...rest\n },\n ref: React.Ref<React.ComponentRef<\"input\">>\n) => {\n const cls = useCls();\n const [value, setValue] = useControlledState<string[]>(\n valueProp,\n onChange,\n defaultValue\n );\n const [activeColorIndex, setActiveColorIndex] = useState<number | null>(null);\n const [searchValue, setSearchValue] = useState(\"\");\n const [tmpValue, setTmpValue] = useState(\"\");\n const [open, setOpen] = useControlledState<boolean>(\n openProp,\n onOpenChange,\n defaultOpen\n );\n\n const [isFocus, setIsFocus] = useState(false);\n\n const popupRef = useRef<HTMLDivElement>(null);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isFocusedProgramatically = useRef(false);\n\n const mousePosition = useRef({\n x: 0,\n y: 0,\n });\n\n const focusInput = useCallback(() => {\n isFocusedProgramatically.current = true;\n inputRef.current?.focus();\n moveTypingCursorToEnd(inputRef.current);\n }, []);\n\n const closeAndFocus = useCallback(() => {\n setOpen(false);\n focusInput();\n }, [setOpen, focusInput]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (event: MouseEvent) => {\n if (!popupRef.current?.contains(event.target as Node)) {\n if (\n inputRef.current &&\n !inputRef.current.isEqualNode(event.target as Node)\n ) {\n closeAndFocus();\n }\n }\n };\n document.addEventListener(\"click\", handler);\n\n // Return cleanup function\n return () => document.removeEventListener(\"click\", handler);\n }, [open, closeAndFocus]);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n mousePosition.current = {\n x: e.clientX,\n y: e.clientY,\n };\n };\n document.addEventListener(\"mousemove\", handleMouseMove);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n };\n }, []);\n\n const onEnter = useCallback(() => {\n const searchValueSplit = searchValue\n .trim()\n .split(/[;,\\s]+/)\n .filter(Boolean);\n const addedValues = searchValueSplit.map((gene) =>\n gene.trim().toUpperCase()\n );\n const inValidValues: string[] = [];\n const validAddedValues = addedValues.reduce((acc, curr) => {\n if (!isValidHexColor(curr, true)) {\n inValidValues.push(curr);\n } else {\n acc.push(curr);\n }\n return acc;\n }, [] as string[]);\n if (inValidValues.length) {\n toast(`Invalid colors: ${inValidValues.join(\", \")}`);\n }\n const newColors = new Set([...value, ...validAddedValues]);\n if (onChange) onChange([...newColors]);\n if (onOpenChange) onOpenChange(false);\n setSearchValue(\"\");\n setTmpValue(\"\");\n setOpen(false);\n requestAnimationFrame(() => {\n setOpen(true);\n });\n }, [searchValue, value, onChange, onOpenChange, setOpen]);\n\n const onInputKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") onEnter();\n if (e.key === \"Backspace\" && !searchValue) {\n if (e.ctrlKey || e.metaKey) {\n setValue([]);\n } else {\n setValue(value.slice(0, -1));\n }\n }\n },\n [onEnter, searchValue, value, setValue]\n );\n\n const handlePopupMouseDown = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Prevent input blur when clicking popup\n e.preventDefault();\n e.stopPropagation();\n },\n []\n );\n\n const handlePopupMouseDownCapture = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Prevent input blur when clicking popup\n e.preventDefault();\n },\n []\n );\n\n const renderedColorPicker = useCallback(\n ({\n open,\n child,\n value,\n onChange,\n onOpenChange,\n }: {\n open: boolean;\n child: React.ReactNode;\n value: string;\n onChange: (value: Color) => void;\n onOpenChange?: (open: boolean) => void;\n }) => (\n <ColorPicker\n value={value}\n onChange={onChange}\n open={open}\n onOpenChange={onOpenChange}\n arrow={false}\n presets={\n presetColors\n ? [{ label: \"Preset Colors\", colors: presetColors }]\n : undefined\n }\n {...colorPickerProps}\n panelRender={(panel) => (\n <div\n ref={(el) => {\n if (el) {\n popupRef.current = el;\n }\n }}\n onMouseDown={handlePopupMouseDown}\n onMouseDownCapture={handlePopupMouseDownCapture}\n >\n {panel}\n </div>\n )}\n >\n {child}\n </ColorPicker>\n ),\n [\n presetColors,\n colorPickerProps,\n handlePopupMouseDown,\n handlePopupMouseDownCapture,\n ]\n );\n\n const renderedTags = useMemo(\n () =>\n value.map((color, index) => {\n const tag = (\n <Tooltip title={color} key={`${color}-${index}`}>\n <Tag\n className={cls(\"color-select-tag\")}\n closable\n onClose={() => setValue(value.filter((v) => v !== color))}\n icon={\n <span\n className={cls(\"color-select-swatch\")}\n style={{ backgroundColor: color }}\n />\n }\n onClick={() =>\n activeColorIndex === index\n ? setActiveColorIndex(null)\n : setActiveColorIndex(index)\n }\n />\n </Tooltip>\n );\n return renderedColorPicker({\n child: tag,\n open: activeColorIndex !== null && activeColorIndex === index,\n value: value[index],\n onChange: (color) => {\n setValue(\n value.map((v, i) => (i === index ? color.toHexString() : v))\n );\n },\n onOpenChange: (open) => {\n setActiveColorIndex(open ? index : null);\n },\n });\n }),\n [\n value,\n cls,\n setValue,\n activeColorIndex,\n setActiveColorIndex,\n renderedColorPicker,\n ]\n );\n\n const renderedColorPickerInput = useMemo(() => {\n return renderedColorPicker({\n child: (\n <input\n placeholder=\"Select or enter a color list\"\n className={cls(\"color-select-input\")}\n value={searchValue}\n type=\"text\"\n ref={mergeRefs(ref, inputRef)}\n onChange={(e) => {\n const currValue = e.target.value;\n setSearchValue(currValue);\n if (isValidHexColor(currValue, true)) setTmpValue(currValue);\n if (\n currValue.length > 7 ||\n (currValue.length == 7 && !currValue.startsWith(\"#\"))\n ) {\n // closeAndFocus();\n setOpen(false);\n } else {\n setOpen(true);\n }\n }}\n onKeyDown={onInputKeyDown}\n onFocus={(e) => {\n // if focus is triggered by programatically, do not open the popup\n // if (isFocusedProgramatically.current) {\n // isFocusedProgramatically.current = false;\n // return;\n // }\n setIsFocus(true);\n setOpen(true);\n }}\n onBlur={(e) => {\n // if (popupRef.current?.contains(e.relatedTarget)) return;\n // Check if click is inside popup using cursor position\n if (popupRef.current) {\n const rect = popupRef.current.getBoundingClientRect();\n const { x, y } = mousePosition.current;\n const isClickInsidePopup =\n x >= rect.left &&\n x <= rect.right &&\n y >= rect.top &&\n y <= rect.bottom;\n if (isClickInsidePopup) {\n e.preventDefault();\n e.stopPropagation();\n if (isValidHexColor(tmpValue)) {\n focusInput();\n }\n return;\n }\n }\n // Check if the new focus target is inside the popup\n setIsFocus(false);\n setOpen(false);\n }}\n />\n ),\n value: tmpValue,\n onChange: (color) => {\n // setValue([...value, color]);\n setTmpValue(color.toHexString());\n setSearchValue(color.toHexString());\n focusInput();\n },\n open,\n });\n }, [\n cls,\n tmpValue,\n onInputKeyDown,\n ref,\n renderedColorPicker,\n searchValue,\n setOpen,\n open,\n focusInput,\n mousePosition,\n ]);\n return (\n <Stack\n wrap\n gap={4}\n className={cls(\"color-select\")}\n data-focus={isFocus || undefined}\n {...rest}\n >\n {renderedTags}\n {renderedColorPickerInput}\n </Stack>\n );\n};\n\n// Use forwardRef with type assertion\nconst MainColorSelect = forwardRef(ColorSelectInner);\n\nexport const ColorSelect = MainColorSelect;\n"],"names":["ColorSelectInner","className","valueProp","defaultValue","onChange","colorPickerProps","presetColors","openProp","onOpenChange","defaultOpen","rest","ref","cls","useCls","value","setValue","useControlledState","activeColorIndex","setActiveColorIndex","useState","searchValue","setSearchValue","tmpValue","setTmpValue","open","setOpen","isFocus","setIsFocus","popupRef","useRef","inputRef","isFocusedProgramatically","mousePosition","focusInput","useCallback","_a","moveTypingCursorToEnd","closeAndFocus","useEffect","handler","event","handleMouseMove","e","onEnter","addedValues","gene","inValidValues","validAddedValues","acc","curr","isValidHexColor","toast","newColors","onInputKeyDown","handlePopupMouseDown","handlePopupMouseDownCapture","renderedColorPicker","child","jsx","ColorPicker","panel","el","renderedTags","useMemo","color","index","tag","Tooltip","Tag","v","i","renderedColorPickerInput","mergeRefs","currValue","rect","x","y","jsxs","Stack","MainColorSelect","forwardRef","ColorSelect"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sources":["../../../src/components/drag-drop/context.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport { type DragDropContextType, type Data } from \"./types\";\n\n/**\n * Drag context for sharing state between components\n */\nexport const DragDropContext = createContext<DragDropContextType>({\n active: null,\n setActive: () => {},\n onDragStart: undefined,\n onDragEnd: undefined,\n onDrop: undefined,\n isDragging: false,\n setIsDragging: () => {},\n});\n\n/**\n * Hook to access the Drag context\n */\nexport const useDragDropContext = <T extends Data = Data>() =>\n useContext(DragDropContext) as DragDropContextType<T>;\n"],"names":["DragDropContext","createContext","useDragDropContext","useContext"],"mappings":";;AAQO,MAAMA,IAAkBC,EAAmC;AAAA,EAChE,QAAQ;AAAA,EACR,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,eAAe,MAAM;AAAA,EAAA;AACvB,CAAC,GAKYC,IAAqB,MAChCC,EAAWH,CAAe;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draggable.js","sources":["../../../src/components/drag-drop/draggable.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDraggable } from \"./hooks\";\nimport { clsx, useCls } from \"../utils\";\nimport { useRender } from \"@base-ui-components/react/use-render\";\nimport type { Data, DragDropDraggableProps } from \"./types\";\nimport { DotsSixVerticalIcon } from \"@bioturing/assets\";\nimport { cloneElement, isValidElement, HTMLProps } from \"react\";\n\n/**\n * A draggable item component that can be used within the Drag context\n */\nexport const Draggable = <T extends Data = Data>({\n id,\n children,\n className,\n disabled = false,\n data,\n style,\n render,\n onDragEnd,\n onDragStart,\n indicator = true,\n onlyIndicatorDraggable = false,\n ...rest\n}: DragDropDraggableProps<T>) => {\n const cls = useCls();\n\n const { attributes, listeners, isDragging, setNodeRef } = useDraggable({\n id,\n data,\n disabled,\n onDragEnd,\n onDragStart,\n });\n\n const indicatorIcon =\n indicator === true ? (\n <DotsSixVerticalIcon className={cls(\"draggable-indicator\")} />\n ) : (\n indicator\n );\n const indicatorElement = isValidElement(indicatorIcon)\n ? onlyIndicatorDraggable\n ? cloneElement(indicatorIcon, {\n ...attributes,\n ...listeners,\n key: \"indicator\" + id,\n })\n : indicatorIcon\n : null;\n\n const combinedChildren = [\n indicatorElement,\n ...(Array.isArray(children) ? children : [children]),\n ];\n\n const renderedElement = useRender({\n render: render ? (\n render\n ) : (\n <div className={clsx(cls(\"draggable\"), className)} />\n ),\n ref: setNodeRef,\n props: {\n children: combinedChildren,\n className,\n style: {\n ...style,\n touchAction: \"none\", // Prevents scrolling on touch devices while dragging\n cursor: disabled ? \"default\" : \"grab\",\n opacity: isDragging ? 0.5 : 1, // Visual feedback when dragging\n },\n ...rest,\n ...attributes,\n ...(!onlyIndicatorDraggable ? listeners : {}),\n },\n state: {\n isDragging,\n id,\n data,\n },\n });\n\n return renderedElement;\n};\n"],"names":["Draggable","id","children","className","disabled","data","style","render","onDragEnd","onDragStart","indicator","onlyIndicatorDraggable","rest","cls","useCls","attributes","listeners","isDragging","setNodeRef","useDraggable","indicatorIcon","jsx","DotsSixVerticalIcon","combinedChildren","isValidElement","cloneElement","useRender","clsx"],"mappings":";;;;;;;;AAYO,MAAMA,IAAY,CAAwB;AAAA,EAC/C,IAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,wBAAAC,IAAyB;AAAA,EACzB,GAAGC;AACL,MAAiC;AAC/B,QAAMC,IAAMC,EAAO,GAEb,EAAE,YAAAC,GAAY,WAAAC,GAAW,YAAAC,GAAY,YAAAC,EAAA,IAAeC,EAAa;AAAA,IACrE,IAAAlB;AAAA,IACA,MAAAI;AAAA,IACA,UAAAD;AAAA,IACA,WAAAI;AAAA,IACA,aAAAC;AAAA,EAAA,CACD,GAEKW,IACJV,MAAc,KACZ,gBAAAW,EAACC,KAAoB,WAAWT,EAAI,qBAAqB,EAAA,CAAG,IAE5DH,GAYEa,IAAmB;AAAA,IAVAC,EAAeJ,CAAa,IACjDT,IACEc,EAAaL,GAAe;AAAA,MAC1B,GAAGL;AAAA,MACH,GAAGC;AAAA,MACH,KAAK,cAAcf;AAAA,IAAA,CACpB,IACDmB,IACF;AAAA,IAIF,GAAI,MAAM,QAAQlB,CAAQ,IAAIA,IAAW,CAACA,CAAQ;AAAA,EACpD;AA6BO,SA3BiBwB,EAAU;AAAA,IAChC,QAAQnB,KAGL,gBAAAc,EAAA,OAAA,EAAI,WAAWM,EAAKd,EAAI,WAAW,GAAGV,CAAS,EAAG,CAAA;AAAA,IAErD,KAAKe;AAAA,IACL,OAAO;AAAA,MACL,UAAUK;AAAA,MACV,WAAApB;AAAA,MACA,OAAO;AAAA,QACL,GAAGG;AAAA,QACH,aAAa;AAAA;AAAA,QACb,QAAQF,IAAW,YAAY;AAAA,QAC/B,SAASa,IAAa,MAAM;AAAA;AAAA,MAC9B;AAAA,MACA,GAAGL;AAAA,MACH,GAAGG;AAAA,MACH,GAAKJ,IAAqC,CAAA,IAAZK;AAAA,IAChC;AAAA,IACA,OAAO;AAAA,MACL,YAAAC;AAAA,MACA,IAAAhB;AAAA,MACA,MAAAI;AAAA,IAAA;AAAA,EACF,CACD;AAGH;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droppable.js","sources":["../../../src/components/drag-drop/droppable.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useCallback, useMemo, memo } from \"react\";\nimport { useDroppable } from \"./hooks\";\nimport { clsx, useCls } from \"../utils\";\nimport { ArrowsOutCardinalIcon } from \"@bioturing/assets\";\nimport { useRender } from \"@base-ui-components/react/use-render\";\nimport type { Data, DragDropDroppableProps, DraggableInfo } from \"./types\";\nimport { Value } from \"./value\";\nimport { uniqWith, isEqual } from \"es-toolkit\";\n\n/**\n * A drop zone component that can receive draggable items\n * Styled similarly to the Upload component's droppable area\n */\nconst DroppableInner = <T extends Data = Data, M extends boolean = false>({\n id,\n children,\n className,\n disabled = false,\n placeholder = \"Drop items here\",\n icon = <ArrowsOutCardinalIcon size={24} />,\n render,\n onDrop,\n validate,\n multiple,\n value,\n onChange,\n renderValueLabel,\n renderValueIcon,\n ...rest\n}: DragDropDroppableProps<T, M>) => {\n const cls = useCls();\n const handleOnDrop = useCallback(\n (item: DraggableInfo<T>) => {\n if (onDrop) {\n onDrop(item);\n }\n if (onChange) {\n if (multiple) {\n (onChange as (value: T[]) => void)(\n uniqWith([...(value as T[]), item.data], isEqual)\n );\n } else {\n (onChange as (value: T) => void)(item.data);\n }\n }\n },\n [onDrop, onChange, multiple, value]\n );\n const { isOver, setNodeRef, attributes, listeners } = useDroppable({\n id,\n disabled,\n onDrop: handleOnDrop,\n validate,\n });\n\n // memoize value props to avoid re-renders\n const valueProps = useMemo(\n () => ({ value, onChange, multiple, renderValueLabel, renderValueIcon }),\n [value, onChange, multiple, renderValueLabel, renderValueIcon]\n );\n\n // memoize dropzone content\n const dropzoneContent = useMemo(\n () =>\n children || (\n <div className={cls(\"drop-zone-content\")}>\n <div className={cls(\"drop-zone-icon\")}>{icon}</div>\n <div className={cls(\"drop-zone-text\")}>{placeholder}</div>\n </div>\n ),\n [children, cls, icon, placeholder]\n );\n\n // memoize default render tree\n const defaultRender = useCallback<\n (props: Record<string, unknown>) => React.ReactElement\n >(\n ({ className, ...props }) =>\n (!multiple && value) || (multiple && (value as T[]).length) ? (\n <Value<T, M>\n {...valueProps}\n className={className as string}\n {...props}\n />\n ) : (\n <div className={clsx(cls(\"drop-zone\"), className as string)} {...props}>\n {dropzoneContent}\n </div>\n ),\n [value, multiple, valueProps, dropzoneContent, cls]\n );\n\n const renderedElement = useRender({\n render: render ?? defaultRender,\n ref: setNodeRef,\n props: {\n className: className,\n ...attributes,\n ...listeners,\n ...rest,\n },\n state: {\n isOver,\n value,\n onChange: onChange as (value: M extends true ? T[] : T) => void,\n id,\n },\n });\n\n return renderedElement;\n};\n\nexport const Droppable = memo(DroppableInner) as typeof DroppableInner;\n"],"names":["DroppableInner","id","children","className","disabled","placeholder","icon","jsx","ArrowsOutCardinalIcon","render","onDrop","validate","multiple","value","onChange","renderValueLabel","renderValueIcon","rest","cls","useCls","handleOnDrop","useCallback","item","uniqWith","isEqual","isOver","setNodeRef","attributes","listeners","useDroppable","valueProps","useMemo","dropzoneContent","jsxs","defaultRender","props","Value","clsx","useRender","Droppable","memo"],"mappings":";;;;;;;;;;AAeA,MAAMA,IAAiB,CAAmD;AAAA,EACxE,IAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,MAAAC,IAAO,gBAAAC,EAACC,GAAsB,EAAA,MAAM,GAAI,CAAA;AAAA,EACxC,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,GAAGC;AACL,MAAoC;AAClC,QAAMC,IAAMC,EAAO,GACbC,IAAeC;AAAA,IACnB,CAACC,MAA2B;AAC1B,MAAIZ,KACFA,EAAOY,CAAI,GAETR,KAECA;AAAA,QADCF,IAEAW,EAAS,CAAC,GAAIV,GAAeS,EAAK,IAAI,GAAGE,CAAO,IAGjBF,EAAK;AAAA,MAFtC;AAAA,IAKN;AAAA,IACA,CAACZ,GAAQI,GAAUF,GAAUC,CAAK;AAAA,EACpC,GACM,EAAE,QAAAY,GAAQ,YAAAC,GAAY,YAAAC,GAAY,WAAAC,EAAA,IAAcC,EAAa;AAAA,IACjE,IAAA5B;AAAA,IACA,UAAAG;AAAA,IACA,QAAQgB;AAAA,IACR,UAAAT;AAAA,EAAA,CACD,GAGKmB,IAAaC;AAAA,IACjB,OAAO,EAAE,OAAAlB,GAAO,UAAAC,GAAU,UAAAF,GAAU,kBAAAG,GAAkB,iBAAAC,EAAgB;AAAA,IACtE,CAACH,GAAOC,GAAUF,GAAUG,GAAkBC,CAAe;AAAA,EAC/D,GAGMgB,IAAkBD;AAAA,IACtB,MACE7B,KACE,gBAAA+B,EAAC,SAAI,WAAWf,EAAI,mBAAmB,GACrC,UAAA;AAAA,MAAA,gBAAAX,EAAC,OAAI,EAAA,WAAWW,EAAI,gBAAgB,GAAI,UAAKZ,GAAA;AAAA,wBAC5C,OAAI,EAAA,WAAWY,EAAI,gBAAgB,GAAI,UAAYb,EAAA,CAAA;AAAA,IAAA,GACtD;AAAA,IAEJ,CAACH,GAAUgB,GAAKZ,GAAMD,CAAW;AAAA,EACnC,GAGM6B,IAAgBb;AAAA,IAGpB,CAAC,EAAE,WAAAlB,GAAW,GAAGgC,EACd,MAAA,CAACvB,KAAYC,KAAWD,KAAaC,EAAc,SAClD,gBAAAN;AAAA,MAAC6B;AAAA,MAAA;AAAA,QACE,GAAGN;AAAA,QACJ,WAAW3B;AAAAA,QACV,GAAGgC;AAAA,MAAA;AAAA,IAGN,IAAA,gBAAA5B,EAAC,OAAI,EAAA,WAAW8B,EAAKnB,EAAI,WAAW,GAAGf,CAAmB,GAAI,GAAGgC,GAC9D,UACHH,EAAA,CAAA;AAAA,IAEJ,CAACnB,GAAOD,GAAUkB,GAAYE,GAAiBd,CAAG;AAAA,EACpD;AAmBO,SAjBiBoB,EAAU;AAAA,IAChC,QAAQ7B,KAAUyB;AAAA,IAClB,KAAKR;AAAA,IACL,OAAO;AAAA,MACL,WAAAvB;AAAA,MACA,GAAGwB;AAAA,MACH,GAAGC;AAAA,MACH,GAAGX;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,QAAAQ;AAAA,MACA,OAAAZ;AAAA,MACA,UAAAC;AAAA,MACA,IAAAb;AAAA,IAAA;AAAA,EACF,CACD;AAGH,GAEasC,IAAYC,EAAKxC,CAAc;"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { useState as R, useRef as N, useCallback as u, useEffect as A } from "react";
2
3
  import { useDragDropContext as z } from "./context.js";
3
4
  function k({
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sources":["../../../src/components/drag-drop/hooks.ts"],"sourcesContent":["\"use client\";\nimport { useCallback, useRef, useState, useEffect } from \"react\";\n\nimport {\n DraggableInfo,\n type Data,\n type UseDraggableProps,\n type UseDroppableProps,\n} from \"./types\";\nimport { useDragDropContext } from \"./context\";\n\n/**\n * Hook for making an element draggable using HTML5 drag and drop API\n */\nexport function useDraggable<T extends Data = Data>({\n id,\n data,\n disabled = false,\n onDragStart: onDragStartProp,\n onDragEnd: onDragEndProp,\n}: UseDraggableProps<T>) {\n const [isDragging, setIsDragging] = useState(false);\n const nodeRef = useRef<HTMLElement | null>(null);\n const thumbnailNodeRef = useRef<HTMLElement | null>(null);\n\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n const {\n setActive,\n onDragStart: onDragStartContext,\n onDragEnd: onDragEndContext,\n setIsDragging: setIsDraggingContext,\n } = useDragDropContext();\n\n const onDragStart = onDragStartProp || onDragStartContext;\n const onDragEnd = onDragEndProp || onDragEndContext;\n\n const handleDragStart = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n\n setIsDragging(true);\n setIsDraggingContext(true);\n\n // Update the active item in context\n const dragItem = { data, id };\n setActive(dragItem);\n\n // Call the onDragStart callback if available\n if (onDragStart) {\n onDragStart({ active: dragItem });\n }\n\n // Set data transfer\n let dataPayload: string;\n try {\n dataPayload = JSON.stringify({ id, data });\n } catch (error) {\n console.error(\"Error serializing data:\", error);\n return;\n }\n e.dataTransfer?.setData(\"application/json\", dataPayload);\n\n // For Firefox compatibility\n e.dataTransfer?.setData(\"text/plain\", dataPayload);\n\n // Set drag image (optional)\n const node = nodeRef.current;\n if (node) {\n const nodeRect = node.getBoundingClientRect();\n\n thumbnailNodeRef.current = node.cloneNode(true) as HTMLElement;\n thumbnailNodeRef.current.style.maxWidth = \"400px\";\n thumbnailNodeRef.current.style.position = \"absolute\";\n thumbnailNodeRef.current.style.pointerEvents = \"none\";\n thumbnailNodeRef.current.style.top = \"-99px\";\n thumbnailNodeRef.current.style.left = \"-99px\";\n thumbnailNodeRef.current.style.zIndex = \"-1\";\n\n node.parentElement?.appendChild(thumbnailNodeRef.current);\n\n // Use the node itself as the drag image\n e.dataTransfer?.setDragImage(\n thumbnailNodeRef.current,\n e.clientX - nodeRect.left,\n e.clientY - nodeRect.top\n );\n }\n },\n [id, data, disabled, onDragStart, setActive, setIsDraggingContext]\n );\n\n const handleDragEnd = useCallback(\n (_e: React.DragEvent) => {\n if (disabled) return;\n\n setIsDragging(false);\n setIsDraggingContext(false);\n thumbnailNodeRef.current?.remove();\n\n if (onDragEnd) {\n onDragEnd({ active: { data, id }, over: null });\n }\n },\n [id, data, disabled, onDragEnd, setIsDraggingContext]\n );\n\n return {\n isDragging,\n setNodeRef,\n attributes: {\n draggable: !disabled,\n role: \"button\",\n \"aria-pressed\": isDragging,\n tabIndex: disabled ? -1 : 0,\n \"data-dragging\": isDragging ? true : undefined,\n \"data-disabled\": disabled ? true : undefined,\n },\n listeners: {\n onDragStart: handleDragStart,\n onDragEnd: handleDragEnd,\n },\n };\n}\n\n/**\n * Hook for making an element a drop target using HTML5 drag and drop API\n */\nexport function useDroppable<T extends Data = Data>({\n id,\n disabled = false,\n validate = () => true,\n onDrop: onDropProp,\n}: UseDroppableProps<T>) {\n const [isOver, setIsOver] = useState(false);\n const [valid, setValid] = useState(undefined);\n const nodeRef = useRef<HTMLElement | null>(null);\n\n const setNodeRef = useCallback((node: HTMLElement | null) => {\n nodeRef.current = node;\n }, []);\n\n const {\n active,\n setActive,\n onDragEnd,\n onDrop: onDropContext,\n isDragging,\n } = useDragDropContext<T>();\n\n const onDrop = onDropProp || onDropContext;\n\n useEffect(() => {\n if (active && validate) {\n setValid(validate(active));\n }\n }, [active, validate]);\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsOver(true);\n },\n [disabled]\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault(); // Necessary to allow dropping\n e.dataTransfer.dropEffect = \"move\";\n },\n [disabled]\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n // Only set isOver to false if we're leaving this element (not a child)\n if (e.currentTarget === e.target) {\n setIsOver(false);\n }\n },\n [disabled]\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n if (!valid) return;\n\n try {\n // Try to get data from dataTransfer\n const jsonData = e.dataTransfer.getData(\"application/json\");\n let draggedItem: DraggableInfo<T>;\n\n if (jsonData) {\n draggedItem = JSON.parse(jsonData);\n } else if (active) {\n // Fall back to active item from context if dataTransfer is not available\n draggedItem = active;\n } else {\n return; // No item to drop\n }\n\n // Call the component's onDrop handler if provided\n if (onDrop) {\n onDrop(draggedItem);\n }\n\n // Call the onDragEnd callback from context if available\n if (onDragEnd && active) {\n onDragEnd({\n active: draggedItem,\n over: { id },\n });\n }\n\n setIsOver(false);\n\n // Reset the active item in context\n setActive(null);\n } catch (error) {\n console.error(\"Error processing drop:\", error);\n }\n },\n [disabled, id, active, onDrop, onDragEnd, setActive, valid]\n );\n\n return {\n isOver,\n setNodeRef,\n attributes: {\n \"data-droppable\": true,\n \"data-over\": isOver ? true : undefined,\n \"data-disabled\": disabled ? true : undefined,\n \"data-dragging\": isDragging ? true : undefined,\n \"data-valid\": valid ? true : undefined,\n },\n valid,\n listeners: {\n onDragEnter: handleDragEnter,\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDrop: handleDrop,\n },\n };\n}\n"],"names":["useDraggable","id","data","disabled","onDragStartProp","onDragEndProp","isDragging","setIsDragging","useState","nodeRef","useRef","thumbnailNodeRef","setNodeRef","useCallback","node","setActive","onDragStartContext","onDragEndContext","setIsDraggingContext","useDragDropContext","onDragStart","onDragEnd","handleDragStart","e","dragItem","dataPayload","error","_a","_b","nodeRect","_c","_d","handleDragEnd","_e","useDroppable","validate","onDropProp","isOver","setIsOver","valid","setValid","active","onDropContext","onDrop","useEffect","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","jsonData","draggedItem"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/drag-drop/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type DragEndEvent,\n type DragStartEvent,\n type Data as DragData,\n type UniqueIdentifier,\n type DragDropDraggableProps,\n type DragDropDroppableProps,\n type DragDropProps,\n} from \"./types\";\nimport { useState } from \"react\";\nimport { clsx, useCls } from \"../utils\";\nimport { Draggable } from \"./draggable\";\nimport { Droppable } from \"./droppable\";\nimport { Value } from \"./value\";\nimport { DragDropContext } from \"./context\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n/**\n * The root component for the drag and drop functionality\n */\nexport function DragDropRoot<T extends DragData = DragData>({\n children,\n // These callbacks are passed to child components via context\n onDragEnd: _onDragEnd,\n onDragStart: _onDragStart,\n onDrop: _onDrop,\n className,\n}: DragDropProps<T>) {\n const cls = useCls();\n const [active, setActive] = useState<{\n data: T;\n id: UniqueIdentifier;\n } | null>(null);\n\n const [isDragging, setIsDragging] = useState(false);\n\n // These functions are now handled directly in the Item and DropZone components\n\n // Create context value for child components\n const contextValue = {\n active,\n setActive: (item: { data: unknown; id: UniqueIdentifier } | null) => {\n setActive(item as { data: T; id: UniqueIdentifier } | null);\n },\n isDragging,\n setIsDragging,\n onDragStart: _onDragStart,\n onDragEnd: _onDragEnd,\n onDrop: _onDrop,\n };\n\n return (\n <DragDropContext.Provider value={contextValue}>\n <div className={clsx(cls(\"drag-container\"), className)}>{children}</div>\n </DragDropContext.Provider>\n );\n}\n\n/**\n * Drag component with subcomponents\n */\nexport const DragDrop = Object.assign(DragDropRoot, {\n /**\n * Item that can be dragged\n */\n Draggable,\n\n /**\n * Zone where items can be dropped\n */\n Droppable,\n\n /**\n * Value component to display the value of the dragged item\n */\n Value,\n});\n\nexport type {\n DragEndEvent,\n DragStartEvent,\n DragDropDraggableProps,\n DragDropDroppableProps,\n DragData,\n DragDropProps,\n};\n"],"names":["DragDropRoot","children","_onDragEnd","_onDragStart","_onDrop","className","cls","useCls","active","setActive","useState","isDragging","setIsDragging","contextValue","item","DragDropContext","jsx","clsx","DragDrop","Draggable","Droppable","Value"],"mappings":";;;;;;;;;;AAwBO,SAASA,EAA4C;AAAA,EAC1D,UAAAC;AAAA;AAAA,EAEA,WAAWC;AAAA,EACX,aAAaC;AAAA,EACb,QAAQC;AAAA,EACR,WAAAC;AACF,GAAqB;AACnB,QAAMC,IAAMC,EAAO,GACb,CAACC,GAAQC,CAAS,IAAIC,EAGlB,IAAI,GAER,CAACC,GAAYC,CAAa,IAAIF,EAAS,EAAK,GAK5CG,IAAe;AAAA,IACnB,QAAAL;AAAA,IACA,WAAW,CAACM,MAAyD;AACnE,MAAAL,EAAUK,CAAgD;AAAA,IAC5D;AAAA,IACA,YAAAH;AAAA,IACA,eAAAC;AAAA,IACA,aAAaT;AAAA,IACb,WAAWD;AAAA,IACX,QAAQE;AAAA,EACV;AAEA,2BACGW,EAAgB,UAAhB,EAAyB,OAAOF,GAC/B,UAAC,gBAAAG,EAAA,OAAA,EAAI,WAAWC,EAAKX,EAAI,gBAAgB,GAAGD,CAAS,GAAI,UAAAJ,EAAS,CAAA,GACpE;AAEJ;AAKa,MAAAiB,IAAW,OAAO,OAAOlB,GAAc;AAAA;AAAA;AAAA;AAAA,EAIlD,WAAAmB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAAC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAAC;AACF,CAAC;"}
@@ -3,11 +3,11 @@ import { jsx as e, Fragment as u, jsxs as S } from "react/jsx-runtime";
3
3
  import { FileIcon as h, XIcon as j } from "@bioturing/assets";
4
4
  import { isEqual as w } from "es-toolkit";
5
5
  import { memo as E, forwardRef as F, useCallback as c, cloneElement as M } from "react";
6
- import { Stack as T } from "../Stack/index.js";
7
- import { Tag as q } from "../Tag/component.js";
6
+ import { Stack as T } from "../stack/index.js";
7
+ import { Tag as q } from "../tag/component.js";
8
8
  import { useCls as y } from "../utils/antdUtils.js";
9
- import { Truncate as B } from "../Truncate/component.js";
10
- import { IconButton as X } from "../IconButton/component.js";
9
+ import { Truncate as B } from "../truncate/component.js";
10
+ import { IconButton as X } from "../icon-button/component.js";
11
11
  function A({
12
12
  value: o,
13
13
  onChange: l,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value.js","sources":["../../../src/components/drag-drop/value.tsx"],"sourcesContent":["\"use client\";\nimport { FileIcon, XIcon } from \"@bioturing/assets\";\nimport { isEqual } from \"es-toolkit\";\nimport React, {\n cloneElement,\n forwardRef,\n memo,\n useCallback,\n type ComponentPropsWithoutRef,\n type ForwardedRef,\n} from \"react\";\nimport { IconButton } from \"../icon-button\";\nimport { Stack } from \"../stack\";\nimport { Tag } from \"../tag\";\nimport { Truncate } from \"../truncate\";\nimport { useCls } from \"../utils\";\nimport { DragDropValueProps, type Data } from \"./types\";\n\nfunction ValueInner<T extends Data, M extends boolean>(\n {\n value,\n onChange,\n multiple,\n renderValueLabel,\n renderValueIcon,\n className,\n style,\n ...rest\n }: DragDropValueProps<T, M> & ComponentPropsWithoutRef<\"div\">,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const cls = useCls();\n\n const renderLabel = useCallback(\n (value: T) => {\n const label = renderValueLabel(value);\n return typeof label === \"string\" ? (\n <Truncate position=\"middle\" className={cls(\"dropzone-value-label\")}>\n {label}\n </Truncate>\n ) : (\n <span className={cls(\"dropzone-value-label\")}>{label}</span>\n );\n },\n [cls, renderValueLabel]\n );\n\n const renderedValueIcon = useCallback(\n (value: T) => {\n return cloneElement(renderValueIcon(value) || <FileIcon />, {\n className: cls(\"dropzone-value-icon\"),\n });\n },\n [cls, renderValueIcon]\n );\n\n const handleResetMultiple = useCallback(\n (singleValue: T) => {\n (onChange as (value: T[]) => void)(\n (value as T[]).filter((v) => !isEqual(v, singleValue))\n );\n },\n [onChange, value]\n );\n\n const renderMultiple = useCallback(() => {\n return (\n <>\n {((value as T[]) || []).map((singleValue, index) => {\n const label = renderLabel(singleValue);\n return (\n <Tag\n key={index}\n icon={renderedValueIcon(singleValue)}\n size=\"large\"\n closable\n onClose={() => handleResetMultiple(singleValue)}\n >\n {label}\n </Tag>\n );\n })}\n </>\n );\n }, [renderLabel, value, renderedValueIcon, handleResetMultiple]);\n\n const handleResetSingle = useCallback(() => {\n onChange?.(null);\n }, [onChange]);\n\n const renderSingle = useCallback(() => {\n const label = renderLabel(value as T);\n return (\n <>\n {renderedValueIcon(value as T)}\n {label}\n <IconButton size=\"small\" onClick={handleResetSingle}>\n <XIcon />\n </IconButton>\n </>\n );\n }, [value, renderLabel, renderedValueIcon, handleResetSingle]);\n\n return (\n <Stack\n ref={ref}\n gap={multiple ? 4 : 8}\n align=\"center\"\n wrap={multiple}\n className={cls(\n \"dropzone-value\",\n multiple && \"dropzone-value-multiple\",\n className\n )}\n style={style}\n {...rest}\n >\n {multiple ? renderMultiple() : renderSingle()}\n </Stack>\n );\n}\n\nexport const Value = memo(forwardRef(ValueInner)) as <\n T extends Data,\n M extends boolean\n>(\n props: DragDropValueProps<T, M> & { ref?: ForwardedRef<HTMLDivElement> }\n) => ReturnType<typeof ValueInner>;\n"],"names":["ValueInner","value","onChange","multiple","renderValueLabel","renderValueIcon","className","style","rest","ref","cls","useCls","renderLabel","useCallback","label","Truncate","jsx","renderedValueIcon","cloneElement","FileIcon","handleResetMultiple","singleValue","v","isEqual","renderMultiple","index","Tag","handleResetSingle","renderSingle","jsxs","Fragment","IconButton","XIcon","Stack","Value","memo","forwardRef"],"mappings":";;;;;;;;;;AAkBA,SAASA,EACP;AAAA,EACE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAMC,EAAO,GAEbC,IAAcC;AAAA,IAClB,CAACZ,MAAa;AACN,YAAAa,IAAQV,EAAiBH,CAAK;AACpC,aAAO,OAAOa,KAAU,6BACrBC,GAAS,EAAA,UAAS,UAAS,WAAWL,EAAI,sBAAsB,GAC9D,UAAAI,GACH,IAEC,gBAAAE,EAAA,QAAA,EAAK,WAAWN,EAAI,sBAAsB,GAAI,UAAMI,GAAA;AAAA,IAEzD;AAAA,IACA,CAACJ,GAAKN,CAAgB;AAAA,EACxB,GAEMa,IAAoBJ;AAAA,IACxB,CAACZ,MACQiB,EAAab,EAAgBJ,CAAK,KAAK,gBAAAe,EAACG,KAAS,GAAI;AAAA,MAC1D,WAAWT,EAAI,qBAAqB;AAAA,IAAA,CACrC;AAAA,IAEH,CAACA,GAAKL,CAAe;AAAA,EACvB,GAEMe,IAAsBP;AAAA,IAC1B,CAACQ,MAAmB;AACjB,MAAAnB;AAAA,QACED,EAAc,OAAO,CAACqB,MAAM,CAACC,EAAQD,GAAGD,CAAW,CAAC;AAAA,MACvD;AAAA,IACF;AAAA,IACA,CAACnB,GAAUD,CAAK;AAAA,EAClB,GAEMuB,IAAiBX,EAAY,6BAG1B,WAAiBZ,KAAA,CAAA,GAAI,IAAI,CAACoB,GAAaI,MAAU;AAC5C,UAAAX,IAAQF,EAAYS,CAAW;AAEnC,WAAA,gBAAAL;AAAA,MAACU;AAAA,MAAA;AAAA,QAEC,MAAMT,EAAkBI,CAAW;AAAA,QACnC,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,SAAS,MAAMD,EAAoBC,CAAW;AAAA,QAE7C,UAAAP;AAAA,MAAA;AAAA,MANIW;AAAA,IAOP;AAAA,EAEH,CAAA,GACH,GAED,CAACb,GAAaX,GAAOgB,GAAmBG,CAAmB,CAAC,GAEzDO,IAAoBd,EAAY,MAAM;AAC1C,IAAAX,KAAA,QAAAA,EAAW;AAAA,EAAI,GACd,CAACA,CAAQ,CAAC,GAEP0B,IAAef,EAAY,MAAM;AAC/B,UAAAC,IAAQF,EAAYX,CAAU;AACpC,WAEK,gBAAA4B,EAAAC,GAAA,EAAA,UAAA;AAAA,MAAAb,EAAkBhB,CAAU;AAAA,MAC5Ba;AAAA,MACD,gBAAAE,EAACe,KAAW,MAAK,SAAQ,SAASJ,GAChC,UAAA,gBAAAX,EAACgB,IAAM,CAAA,EACT,CAAA;AAAA,IAAA,GACF;AAAA,KAED,CAAC/B,GAAOW,GAAaK,GAAmBU,CAAiB,CAAC;AAG3D,SAAA,gBAAAX;AAAA,IAACiB;AAAA,IAAA;AAAA,MACC,KAAAxB;AAAA,MACA,KAAKN,IAAW,IAAI;AAAA,MACpB,OAAM;AAAA,MACN,MAAMA;AAAA,MACN,WAAWO;AAAA,QACT;AAAA,QACAP,KAAY;AAAA,QACZG;AAAA,MACF;AAAA,MACA,OAAAC;AAAA,MACC,GAAGC;AAAA,MAEH,UAAAL,IAAWqB,EAAe,IAAII,EAAa;AAAA,IAAA;AAAA,EAC9C;AAEJ;AAEO,MAAMM,IAAQC,EAAKC,EAAWpC,CAAU,CAAC;"}