@mantine/core 9.4.3-alpha.0 → 9.5.1-alpha.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 (185) hide show
  1. package/cjs/components/Accordion/Accordion.cjs +5 -2
  2. package/cjs/components/Accordion/Accordion.cjs.map +1 -1
  3. package/cjs/components/AngleSlider/AngleSlider.cjs +4 -1
  4. package/cjs/components/AngleSlider/AngleSlider.cjs.map +1 -1
  5. package/cjs/components/Avatar/AvatarGroup/AvatarGroup.cjs +15 -14
  6. package/cjs/components/Avatar/AvatarGroup/AvatarGroup.cjs.map +1 -1
  7. package/cjs/components/Cascader/Cascader.cjs +371 -0
  8. package/cjs/components/Cascader/Cascader.cjs.map +1 -0
  9. package/cjs/components/Cascader/Cascader.module.cjs +18 -0
  10. package/cjs/components/Cascader/Cascader.module.cjs.map +1 -0
  11. package/cjs/components/Cascader/CascaderColumns.cjs +136 -0
  12. package/cjs/components/Cascader/CascaderColumns.cjs.map +1 -0
  13. package/cjs/components/Cascader/flatten-cascader-paths.cjs +26 -0
  14. package/cjs/components/Cascader/flatten-cascader-paths.cjs.map +1 -0
  15. package/cjs/components/Cascader/get-cascader-columns.cjs +30 -0
  16. package/cjs/components/Cascader/get-cascader-columns.cjs.map +1 -0
  17. package/cjs/components/Cascader/get-cascader-path-options.cjs +19 -0
  18. package/cjs/components/Cascader/get-cascader-path-options.cjs.map +1 -0
  19. package/cjs/components/Cascader/use-cascader.cjs +135 -0
  20. package/cjs/components/Cascader/use-cascader.cjs.map +1 -0
  21. package/cjs/components/ColorPicker/converters/converters.cjs +5 -0
  22. package/cjs/components/ColorPicker/converters/parsers.cjs +5 -0
  23. package/cjs/components/Combobox/use-combobox/use-combobox.cjs +6 -2
  24. package/cjs/components/Combobox/use-combobox/use-combobox.cjs.map +1 -1
  25. package/cjs/components/ComboboxPopover/ComboboxPopover.cjs +2 -1
  26. package/cjs/components/ComboboxPopover/ComboboxPopover.cjs.map +1 -1
  27. package/cjs/components/Drawer/DrawerStack.cjs +1 -1
  28. package/cjs/components/Drawer/DrawerStack.cjs.map +1 -1
  29. package/cjs/components/FloatingIndicator/FloatingIndicator.cjs +2 -1
  30. package/cjs/components/FloatingIndicator/FloatingIndicator.cjs.map +1 -1
  31. package/cjs/components/FloatingWindow/FloatingWindow.cjs +34 -10
  32. package/cjs/components/FloatingWindow/FloatingWindow.cjs.map +1 -1
  33. package/cjs/components/FloatingWindow/FloatingWindow.context.cjs +8 -0
  34. package/cjs/components/FloatingWindow/FloatingWindow.context.cjs.map +1 -0
  35. package/cjs/components/FloatingWindow/FloatingWindow.module.cjs.map +1 -1
  36. package/cjs/components/FloatingWindow/FloatingWindowResizeHandle.cjs +186 -0
  37. package/cjs/components/FloatingWindow/FloatingWindowResizeHandle.cjs.map +1 -0
  38. package/cjs/components/Input/InputLabel/InputLabel.cjs +3 -1
  39. package/cjs/components/Input/InputLabel/InputLabel.cjs.map +1 -1
  40. package/cjs/components/Input/InputWrapper/InputWrapper.cjs.map +1 -1
  41. package/cjs/components/Modal/ModalStack.cjs +1 -1
  42. package/cjs/components/Modal/ModalStack.cjs.map +1 -1
  43. package/cjs/components/OverflowList/OverflowList.cjs +2 -1
  44. package/cjs/components/OverflowList/OverflowList.cjs.map +1 -1
  45. package/cjs/components/Pagination/PaginationEdges/PaginationEdges.cjs +1 -0
  46. package/cjs/components/ScrollArea/ScrollArea.cjs +7 -2
  47. package/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -1
  48. package/cjs/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
  49. package/cjs/components/ScrollArea/ScrollAreaCorner/ScrollAreaCorner.cjs +1 -0
  50. package/cjs/components/ScrollArea/ScrollAreaScrollbar/Scrollbar.cjs +8 -4
  51. package/cjs/components/ScrollArea/ScrollAreaScrollbar/Scrollbar.cjs.map +1 -1
  52. package/cjs/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.cjs +3 -1
  53. package/cjs/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.cjs.map +1 -1
  54. package/cjs/components/SimpleGrid/SimpleGridVariables.cjs +1 -1
  55. package/cjs/components/SimpleGrid/SimpleGridVariables.cjs.map +1 -1
  56. package/cjs/components/Slider/RangeSlider/RangeSlider.cjs +18 -11
  57. package/cjs/components/Slider/RangeSlider/RangeSlider.cjs.map +1 -1
  58. package/cjs/components/Table/Table.components.cjs +1 -0
  59. package/cjs/components/TagsInput/TagsInput.cjs +2 -1
  60. package/cjs/components/TagsInput/TagsInput.cjs.map +1 -1
  61. package/cjs/components/Timeline/Timeline.cjs +5 -1
  62. package/cjs/components/Timeline/Timeline.cjs.map +1 -1
  63. package/cjs/components/Timeline/Timeline.module.cjs +2 -1
  64. package/cjs/components/Timeline/Timeline.module.cjs.map +1 -1
  65. package/cjs/components/Timeline/TimelineItem/TimelineItem.cjs +31 -20
  66. package/cjs/components/Timeline/TimelineItem/TimelineItem.cjs.map +1 -1
  67. package/cjs/components/Tree/TreeNode.cjs.map +1 -1
  68. package/cjs/components/Tree/use-tree.cjs +1 -1
  69. package/cjs/components/Tree/use-tree.cjs.map +1 -1
  70. package/cjs/components/TreeSelect/TreeSelect.cjs +3 -2
  71. package/cjs/components/TreeSelect/TreeSelect.cjs.map +1 -1
  72. package/cjs/core/Box/get-box-mod/get-box-mod.cjs +1 -0
  73. package/cjs/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.cjs +6 -5
  74. package/cjs/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.cjs.map +1 -1
  75. package/cjs/core/MantineProvider/merge-mantine-theme/merge-mantine-theme.cjs +2 -0
  76. package/cjs/core/MantineProvider/use-matches/use-matches.cjs +3 -2
  77. package/cjs/core/MantineProvider/use-matches/use-matches.cjs.map +1 -1
  78. package/cjs/index.cjs +7 -1
  79. package/esm/components/Accordion/Accordion.mjs +5 -2
  80. package/esm/components/Accordion/Accordion.mjs.map +1 -1
  81. package/esm/components/AngleSlider/AngleSlider.mjs +4 -1
  82. package/esm/components/AngleSlider/AngleSlider.mjs.map +1 -1
  83. package/esm/components/Avatar/AvatarGroup/AvatarGroup.mjs +15 -14
  84. package/esm/components/Avatar/AvatarGroup/AvatarGroup.mjs.map +1 -1
  85. package/esm/components/Cascader/Cascader.mjs +371 -0
  86. package/esm/components/Cascader/Cascader.mjs.map +1 -0
  87. package/esm/components/Cascader/Cascader.module.mjs +18 -0
  88. package/esm/components/Cascader/Cascader.module.mjs.map +1 -0
  89. package/esm/components/Cascader/CascaderColumns.mjs +135 -0
  90. package/esm/components/Cascader/CascaderColumns.mjs.map +1 -0
  91. package/esm/components/Cascader/flatten-cascader-paths.mjs +26 -0
  92. package/esm/components/Cascader/flatten-cascader-paths.mjs.map +1 -0
  93. package/esm/components/Cascader/get-cascader-columns.mjs +28 -0
  94. package/esm/components/Cascader/get-cascader-columns.mjs.map +1 -0
  95. package/esm/components/Cascader/get-cascader-path-options.mjs +19 -0
  96. package/esm/components/Cascader/get-cascader-path-options.mjs.map +1 -0
  97. package/esm/components/Cascader/use-cascader.mjs +135 -0
  98. package/esm/components/Cascader/use-cascader.mjs.map +1 -0
  99. package/esm/components/ColorPicker/converters/converters.mjs +1 -1
  100. package/esm/components/ColorPicker/converters/parsers.mjs +1 -1
  101. package/esm/components/Combobox/use-combobox/use-combobox.mjs +6 -2
  102. package/esm/components/Combobox/use-combobox/use-combobox.mjs.map +1 -1
  103. package/esm/components/ComboboxPopover/ComboboxPopover.mjs +2 -1
  104. package/esm/components/ComboboxPopover/ComboboxPopover.mjs.map +1 -1
  105. package/esm/components/Drawer/DrawerStack.mjs +1 -1
  106. package/esm/components/Drawer/DrawerStack.mjs.map +1 -1
  107. package/esm/components/FloatingIndicator/FloatingIndicator.mjs +2 -1
  108. package/esm/components/FloatingIndicator/FloatingIndicator.mjs.map +1 -1
  109. package/esm/components/FloatingWindow/FloatingWindow.context.mjs +8 -0
  110. package/esm/components/FloatingWindow/FloatingWindow.context.mjs.map +1 -0
  111. package/esm/components/FloatingWindow/FloatingWindow.mjs +35 -11
  112. package/esm/components/FloatingWindow/FloatingWindow.mjs.map +1 -1
  113. package/esm/components/FloatingWindow/FloatingWindow.module.mjs.map +1 -1
  114. package/esm/components/FloatingWindow/FloatingWindowResizeHandle.mjs +186 -0
  115. package/esm/components/FloatingWindow/FloatingWindowResizeHandle.mjs.map +1 -0
  116. package/esm/components/Input/InputLabel/InputLabel.mjs +3 -1
  117. package/esm/components/Input/InputLabel/InputLabel.mjs.map +1 -1
  118. package/esm/components/Input/InputWrapper/InputWrapper.mjs.map +1 -1
  119. package/esm/components/Modal/ModalStack.mjs +1 -1
  120. package/esm/components/Modal/ModalStack.mjs.map +1 -1
  121. package/esm/components/OverflowList/OverflowList.mjs +2 -1
  122. package/esm/components/OverflowList/OverflowList.mjs.map +1 -1
  123. package/esm/components/Pagination/PaginationEdges/PaginationEdges.mjs +1 -1
  124. package/esm/components/ScrollArea/ScrollArea.mjs +7 -2
  125. package/esm/components/ScrollArea/ScrollArea.mjs.map +1 -1
  126. package/esm/components/ScrollArea/ScrollArea.module.mjs.map +1 -1
  127. package/esm/components/ScrollArea/ScrollAreaCorner/ScrollAreaCorner.mjs +1 -1
  128. package/esm/components/ScrollArea/ScrollAreaScrollbar/Scrollbar.mjs +8 -4
  129. package/esm/components/ScrollArea/ScrollAreaScrollbar/Scrollbar.mjs.map +1 -1
  130. package/esm/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.mjs +3 -2
  131. package/esm/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.mjs.map +1 -1
  132. package/esm/components/SimpleGrid/SimpleGridVariables.mjs +1 -1
  133. package/esm/components/SimpleGrid/SimpleGridVariables.mjs.map +1 -1
  134. package/esm/components/Slider/RangeSlider/RangeSlider.mjs +18 -11
  135. package/esm/components/Slider/RangeSlider/RangeSlider.mjs.map +1 -1
  136. package/esm/components/Table/Table.components.mjs +1 -1
  137. package/esm/components/TagsInput/TagsInput.mjs +2 -1
  138. package/esm/components/TagsInput/TagsInput.mjs.map +1 -1
  139. package/esm/components/Timeline/Timeline.mjs +5 -1
  140. package/esm/components/Timeline/Timeline.mjs.map +1 -1
  141. package/esm/components/Timeline/Timeline.module.mjs +2 -1
  142. package/esm/components/Timeline/Timeline.module.mjs.map +1 -1
  143. package/esm/components/Timeline/TimelineItem/TimelineItem.mjs +31 -20
  144. package/esm/components/Timeline/TimelineItem/TimelineItem.mjs.map +1 -1
  145. package/esm/components/Tree/TreeNode.mjs.map +1 -1
  146. package/esm/components/Tree/use-tree.mjs +1 -1
  147. package/esm/components/Tree/use-tree.mjs.map +1 -1
  148. package/esm/components/TreeSelect/TreeSelect.mjs +3 -2
  149. package/esm/components/TreeSelect/TreeSelect.mjs.map +1 -1
  150. package/esm/core/Box/get-box-mod/get-box-mod.mjs +1 -1
  151. package/esm/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.mjs +6 -5
  152. package/esm/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.mjs.map +1 -1
  153. package/esm/core/MantineProvider/merge-mantine-theme/merge-mantine-theme.mjs +1 -1
  154. package/esm/core/MantineProvider/use-matches/use-matches.mjs +3 -2
  155. package/esm/core/MantineProvider/use-matches/use-matches.mjs.map +1 -1
  156. package/esm/index.mjs +5 -2
  157. package/lib/components/Accordion/Accordion.d.ts +2 -0
  158. package/lib/components/Cascader/Cascader.d.ts +114 -0
  159. package/lib/components/Cascader/CascaderColumns.d.ts +36 -0
  160. package/lib/components/Cascader/flatten-cascader-paths.d.ts +12 -0
  161. package/lib/components/Cascader/get-cascader-columns.d.ts +4 -0
  162. package/lib/components/Cascader/get-cascader-path-options.d.ts +2 -0
  163. package/lib/components/Cascader/index.d.ts +12 -0
  164. package/lib/components/Cascader/use-cascader.d.ts +25 -0
  165. package/lib/components/FloatingWindow/FloatingWindow.context.d.ts +30 -0
  166. package/lib/components/FloatingWindow/FloatingWindow.d.ts +16 -5
  167. package/lib/components/FloatingWindow/FloatingWindowResizeHandle.d.ts +11 -0
  168. package/lib/components/FloatingWindow/index.d.ts +2 -0
  169. package/lib/components/Input/InputWrapper/InputWrapper.d.ts +5 -5
  170. package/lib/components/Input/use-input-props.d.ts +4 -4
  171. package/lib/components/MaskInput/use-mask-input-props.d.ts +4 -4
  172. package/lib/components/ScrollArea/ScrollArea.d.ts +5 -0
  173. package/lib/components/Timeline/TimelineItem/TimelineItem.d.ts +5 -1
  174. package/lib/components/index.d.ts +1 -0
  175. package/package.json +3 -3
  176. package/styles/Cascader.css +215 -0
  177. package/styles/Cascader.layer.css +216 -0
  178. package/styles/FloatingWindow.css +2 -0
  179. package/styles/FloatingWindow.layer.css +2 -0
  180. package/styles/ScrollArea.css +58 -0
  181. package/styles/ScrollArea.layer.css +58 -0
  182. package/styles/Timeline.css +88 -14
  183. package/styles/Timeline.layer.css +88 -14
  184. package/styles.css +364 -14
  185. package/styles.layer.css +364 -14
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cascader.cjs","names":["Fragment","factory","useProps","useCombobox","useCascader","useStyles","useResolvedStylesApi","extractStyleProps","getCascaderPathOptions","flattenCascaderPaths","Combobox","ScrollArea","CheckIcon","CascaderColumns","InputBase","classes"],"sources":["../../../src/components/Cascader/Cascader.tsx"],"sourcesContent":["import { Fragment, useEffect, useMemo } from 'react';\nimport { useId, useUncontrolled } from '@mantine/hooks';\nimport {\n BoxProps,\n ElementProps,\n extractStyleProps,\n Factory,\n factory,\n MantineColor,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '../../core';\nimport { CheckIcon } from '../Checkbox/CheckIcon';\nimport { Combobox, ComboboxLikeStylesNames, useCombobox } from '../Combobox';\nimport {\n __BaseInputProps,\n __InputStylesNames,\n ClearSectionMode,\n InputClearButtonProps,\n InputVariant,\n} from '../Input';\nimport { InputBase } from '../InputBase';\nimport { ScrollArea, ScrollAreaProps } from '../ScrollArea';\nimport { CascaderColumns } from './CascaderColumns';\nimport { flattenCascaderPaths } from './flatten-cascader-paths';\nimport { getCascaderPathOptions } from './get-cascader-path-options';\nimport { useCascader } from './use-cascader';\nimport classes from './Cascader.module.css';\n\nexport interface CascaderOption {\n /** Option value, must be unique across the whole data tree */\n value: string;\n\n /** Option label, if not set `value` is used instead */\n label?: React.ReactNode;\n\n /** Nested options */\n children?: CascaderOption[];\n\n /** If set, the option cannot be selected or expanded */\n disabled?: boolean;\n}\n\nexport interface CascaderFormatValueInput {\n /** Selected path from root to node */\n value: string[];\n\n /** Option chain resolved from the selected path */\n options: CascaderOption[];\n}\n\nexport type CascaderFormatValue = (input: CascaderFormatValueInput) => React.ReactNode;\n\nexport type CascaderStylesNames =\n | __InputStylesNames\n | ComboboxLikeStylesNames\n | 'columnsList'\n | 'columnsOverflow'\n | 'column'\n | 'columnScroll'\n | 'columnOption'\n | 'columnOptionLabel'\n | 'columnOptionIcon'\n | 'columnOptionCheck'\n | 'columnEmpty'\n | 'flatOption';\n\nexport interface CascaderProps\n extends\n BoxProps,\n __BaseInputProps,\n StylesApiProps<CascaderFactory>,\n ElementProps<'input', 'size' | 'value' | 'defaultValue' | 'onChange'> {\n /** Hierarchical options data */\n data: CascaderOption[];\n\n /** Controlled selected path from root to node */\n value?: string[] | null;\n\n /** Uncontrolled selected path from root to node */\n defaultValue?: string[] | null;\n\n /** Called when the selected path changes with the path and the resolved option chain */\n onChange?: (value: string[] | null, options: CascaderOption[]) => void;\n\n /** If set, any intermediate option can be selected, not only leaf options @default false */\n changeOnSelect?: boolean;\n\n /** Determines whether the dropdown should be closed when a value is selected, defaults to `!allowDeselect` */\n closeOnSelect?: boolean;\n\n /** If set, the selected value can be deselected by selecting it again @default true */\n allowDeselect?: boolean;\n\n /** If set, the check icon is displayed on the selected option @default true */\n withCheckIcon?: boolean;\n\n /** Position of the check icon relative to the option label @default 'right' */\n checkIconPosition?: 'left' | 'right';\n\n /** Renders the dropdown as cascading columns. When `false`, options are rendered as a flat list of paths, the same way as search results (useful for narrow/mobile layouts) @default true */\n withColumns?: boolean;\n\n /** Determines how the next column is opened @default 'click' */\n expandTrigger?: 'click' | 'hover';\n\n /** If set, options can be searched by their flattened paths @default false */\n searchable?: boolean;\n\n /** Controlled search value */\n searchValue?: string;\n\n /** Uncontrolled search value */\n defaultSearchValue?: string;\n\n /** Called when the search value changes */\n onSearchChange?: (value: string) => void;\n\n /** Custom search filter, matched against the full option path */\n filter?: (query: string, options: CascaderOption[]) => boolean;\n\n /** Custom rendering of a search result row */\n renderSearchOption?: (query: string, options: CascaderOption[]) => React.ReactNode;\n\n /** A function to format the selected path displayed in the input, should return a string */\n formatValue?: CascaderFormatValue;\n\n /** Custom rendering of an option in columns */\n renderOption?: (option: CascaderOption, level: number) => React.ReactNode;\n\n /** Path separator displayed in the input and search results @default '/' */\n separator?: React.ReactNode;\n\n /** Width of each column */\n columnWidth?: number | string;\n\n /** Maximum number of columns (levels) displayed next to each other, deeper levels replace earlier ones @default 3 */\n maxDisplayedLevels?: number;\n\n /** `aria-label` and `title` of the control that reveals levels hidden before the visible ones by `maxDisplayedLevels` @default 'Show previous levels' */\n previousLevelsControlLabel?: string;\n\n /** `aria-label` and `title` of the control that reveals levels hidden after the visible ones by `maxDisplayedLevels` @default 'Show next levels' */\n nextLevelsControlLabel?: string;\n\n /** Max height of a column before it becomes scrollable @default 260 */\n maxDropdownHeight?: number | string;\n\n /** Message displayed when there are no options or search results */\n nothingFoundMessage?: React.ReactNode;\n\n /** If set, the clear button is displayed when a value is selected @default false */\n clearable?: boolean;\n\n /** Determines how the clear button and `rightSection` are rendered @default 'both' */\n clearSectionMode?: ClearSectionMode;\n\n /** Props passed down to the clear button */\n clearButtonProps?: InputClearButtonProps;\n\n /** Called when the clear button is clicked */\n onClear?: () => void;\n\n /** Controlled dropdown opened state */\n dropdownOpened?: boolean;\n\n /** Uncontrolled dropdown opened state */\n defaultDropdownOpened?: boolean;\n\n /** Called when the dropdown opens */\n onDropdownOpen?: () => void;\n\n /** Called when the dropdown closes */\n onDropdownClose?: () => void;\n\n /** Props passed down to the underlying `Combobox` component */\n comboboxProps?: Record<string, any>;\n\n /** Props passed down to the dropdown `ScrollArea` */\n scrollAreaProps?: ScrollAreaProps;\n\n /** Controls the default chevron color */\n chevronColor?: MantineColor;\n\n /** Props passed down to the hidden input */\n hiddenInputProps?: Omit<React.ComponentProps<'input'>, 'value'>;\n\n /** Opens the dropdown when the input is focused in `searchable` mode @default true */\n openOnFocus?: boolean;\n}\n\nexport type CascaderFactory = Factory<{\n props: CascaderProps;\n ref: HTMLInputElement;\n stylesNames: CascaderStylesNames;\n variant: InputVariant;\n}>;\n\nconst defaultProps = {\n expandTrigger: 'click',\n changeOnSelect: false,\n allowDeselect: true,\n withCheckIcon: true,\n checkIconPosition: 'right',\n withColumns: true,\n searchable: false,\n separator: '/',\n maxDisplayedLevels: 3,\n previousLevelsControlLabel: 'Show previous levels',\n nextLevelsControlLabel: 'Show next levels',\n maxDropdownHeight: 260,\n openOnFocus: true,\n size: 'sm',\n} satisfies Partial<CascaderProps>;\n\nfunction optionLabelToString(option: CascaderOption): string {\n return typeof option.label === 'string' || typeof option.label === 'number'\n ? String(option.label)\n : option.value;\n}\n\nfunction firstEnabledOptionIndex(options: CascaderOption[]): number {\n return options.findIndex((option) => !option.disabled);\n}\n\nfunction lastEnabledOptionIndex(options: CascaderOption[]): number {\n for (let index = options.length - 1; index >= 0; index -= 1) {\n if (!options[index].disabled) {\n return index;\n }\n }\n return -1;\n}\n\nfunction joinPathLabels(options: CascaderOption[], separator: string): string {\n return options.map(optionLabelToString).join(` ${separator} `);\n}\n\nfunction defaultCascaderFilter(\n query: string,\n options: CascaderOption[],\n separator: string\n): boolean {\n const trimmed = query.trim().toLowerCase();\n if (trimmed.length === 0) {\n return true;\n }\n return joinPathLabels(options, separator).toLowerCase().includes(trimmed);\n}\n\nfunction defaultRenderSearchOption(\n options: CascaderOption[],\n separator: React.ReactNode\n): React.ReactNode {\n return options.map((option, index) => (\n <Fragment key={option.value}>\n {index > 0 && <span data-cascader-separator> {separator} </span>}\n {option.label ?? option.value}\n </Fragment>\n ));\n}\n\nexport const Cascader = factory<CascaderFactory>((_props) => {\n const props = useProps(['Input', 'InputWrapper', 'Cascader'], defaultProps as any, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n size,\n data,\n value,\n defaultValue,\n onChange,\n changeOnSelect,\n closeOnSelect,\n allowDeselect,\n withCheckIcon,\n checkIconPosition,\n withColumns,\n expandTrigger,\n searchable,\n searchValue,\n defaultSearchValue,\n onSearchChange,\n filter,\n renderSearchOption,\n formatValue,\n renderOption,\n separator,\n columnWidth,\n maxDisplayedLevels,\n previousLevelsControlLabel,\n nextLevelsControlLabel,\n maxDropdownHeight,\n nothingFoundMessage,\n clearable,\n clearSectionMode,\n clearButtonProps,\n onClear,\n dropdownOpened,\n defaultDropdownOpened,\n onDropdownOpen,\n onDropdownClose,\n comboboxProps,\n scrollAreaProps,\n chevronColor,\n hiddenInputProps,\n openOnFocus,\n variant,\n onKeyDown,\n onFocus,\n onBlur,\n onClick,\n readOnly,\n disabled,\n radius,\n rightSection,\n rightSectionWidth,\n rightSectionPointerEvents,\n rightSectionProps,\n leftSection,\n leftSectionWidth,\n leftSectionPointerEvents,\n leftSectionProps,\n inputContainer,\n inputWrapperOrder,\n withAsterisk,\n labelProps,\n descriptionProps,\n errorProps,\n successProps,\n wrapperProps,\n description,\n label,\n error,\n success,\n withErrorStyles,\n withSuccessStyles,\n name,\n form,\n id,\n placeholder,\n required,\n mod,\n attributes,\n ...others\n } = props;\n\n const _id = useId(id);\n const separatorString =\n typeof separator === 'string' || typeof separator === 'number' ? String(separator) : '/';\n\n const combobox = useCombobox({\n opened: dropdownOpened,\n defaultOpened: defaultDropdownOpened,\n onDropdownOpen: () => {\n onDropdownOpen?.();\n cascader.resetActivePath();\n },\n onDropdownClose: () => {\n onDropdownClose?.();\n if (searchable) {\n setSearchValue(cascader.value ? displayString : '');\n }\n },\n });\n\n // When `allowDeselect` is enabled, keep the dropdown open by default so the value can be toggled\n const shouldCloseOnSelect = closeOnSelect ?? !allowDeselect;\n\n const cascader = useCascader({\n data,\n value,\n defaultValue,\n onChange,\n changeOnSelect,\n allowDeselect,\n expandTrigger,\n onLeafSelect: () => {\n if (shouldCloseOnSelect) {\n combobox.closeDropdown();\n }\n },\n });\n\n const getStyles = useStyles<CascaderFactory>({\n name: 'Cascader',\n classes,\n props: props as any,\n classNames,\n styles,\n unstyled,\n attributes,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<CascaderFactory>({\n props,\n styles,\n classNames,\n });\n\n const {\n styleProps,\n rest: { type, autoComplete, ...rest },\n } = extractStyleProps(others);\n\n const displayString = useMemo(() => {\n if (cascader.pathOptions.length === 0 || !cascader.value) {\n return '';\n }\n if (formatValue) {\n const rendered = formatValue({ value: cascader.value, options: cascader.pathOptions });\n if (typeof rendered === 'string' || typeof rendered === 'number') {\n return String(rendered);\n }\n }\n return joinPathLabels(cascader.pathOptions, separatorString);\n }, [cascader.pathOptions, cascader.value, formatValue, separatorString]);\n\n const initialSearchValue = useMemo(() => {\n if (!searchable || !defaultValue) {\n return '';\n }\n return joinPathLabels(getCascaderPathOptions(data, defaultValue), separatorString);\n }, []);\n\n const [_searchValue, setSearchValue] = useUncontrolled({\n value: searchValue,\n defaultValue: defaultSearchValue,\n finalValue: initialSearchValue,\n onChange: onSearchChange,\n });\n\n const isSearching =\n !!searchable && _searchValue.trim().length > 0 && _searchValue !== displayString;\n\n useEffect(() => {\n if (searchable) {\n setSearchValue(cascader.value ? displayString : '');\n }\n }, [cascader.value]);\n\n // The dropdown renders a flat list of paths when searching or when `withColumns` is disabled\n const showFlatList = isSearching || !withColumns;\n\n const flatPaths = useMemo(() => flattenCascaderPaths(data), [data]);\n\n const flatListItems = useMemo(() => {\n if (!showFlatList) {\n return [];\n }\n const base = flatPaths.filter((flatPath) => (changeOnSelect ? true : flatPath.leaf));\n if (!isSearching) {\n return base;\n }\n return base.filter((flatPath) =>\n filter\n ? filter(_searchValue, flatPath.options)\n : defaultCascaderFilter(_searchValue, flatPath.options, separatorString)\n );\n }, [flatPaths, showFlatList, isSearching, _searchValue, changeOnSelect, filter, separatorString]);\n\n const canInteract = !readOnly && !disabled;\n\n const handleSearchChange = (nextValue: string) => {\n setSearchValue(nextValue);\n if (canInteract) {\n combobox.openDropdown();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n\n if (event.key === 'Escape') {\n combobox.closeDropdown();\n return;\n }\n\n if (showFlatList || !canInteract) {\n return;\n }\n\n if (!combobox.dropdownOpened) {\n const opensDropdown =\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowRight' ||\n event.key === 'Enter' ||\n (!searchable && event.key === ' ');\n\n if (opensDropdown) {\n event.preventDefault();\n cascader.setKeyboardNav(true);\n combobox.openDropdown();\n\n if (!cascader.value && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n const rootIndex =\n event.key === 'ArrowDown'\n ? firstEnabledOptionIndex(data)\n : lastEnabledOptionIndex(data);\n if (rootIndex >= 0) {\n cascader.setActivePath([data[rootIndex].value]);\n }\n }\n }\n return;\n }\n\n if (cascader.handleColumnsKeyDown(event)) {\n event.preventDefault();\n } else if (!searchable && event.key === ' ') {\n event.preventDefault();\n }\n };\n\n const clearButton = (\n <Combobox.ClearButton\n {...clearButtonProps}\n onClear={() => {\n onClear?.();\n cascader.setValue(null);\n cascader.setActivePath([]);\n setSearchValue('');\n combobox.focusTarget();\n }}\n />\n );\n\n const hasValue = Array.isArray(cascader.value) && cascader.value.length > 0;\n const _clearable = clearable && hasValue && !disabled && !readOnly;\n\n const listId = _id ? `${_id}-cascader-list` : undefined;\n const valueKey = cascader.value ? JSON.stringify(cascader.value) : null;\n\n const dropdown = (\n <Combobox.Dropdown\n hidden={readOnly || disabled}\n style={showFlatList ? undefined : { padding: 0 }}\n >\n {showFlatList ? (\n <Combobox.Options aria-label={typeof label === 'string' ? label : undefined}>\n <ScrollArea.Autosize\n mah={maxDropdownHeight ?? 260}\n type=\"scroll\"\n scrollbarSize=\"var(--combobox-padding)\"\n offsetScrollbars=\"y\"\n {...scrollAreaProps}\n >\n {flatListItems.map((flatPath, index) => {\n const pathKey = JSON.stringify(flatPath.path);\n const active = valueKey !== null && pathKey === valueKey;\n return (\n <Combobox.Option\n key={pathKey}\n value={`${index}`}\n active={active}\n disabled={flatPath.disabled}\n >\n <span {...getStyles('flatOption')}>\n {active && withCheckIcon && checkIconPosition === 'left' && (\n <CheckIcon {...getStyles('columnOptionCheck')} />\n )}\n <span {...getStyles('columnOptionLabel')}>\n {renderSearchOption\n ? renderSearchOption(_searchValue, flatPath.options)\n : defaultRenderSearchOption(flatPath.options, separator)}\n </span>\n {active && withCheckIcon && checkIconPosition !== 'left' && (\n <CheckIcon {...getStyles('columnOptionCheck')} />\n )}\n </span>\n </Combobox.Option>\n );\n })}\n </ScrollArea.Autosize>\n {flatListItems.length === 0 && nothingFoundMessage && (\n <Combobox.Empty>{nothingFoundMessage}</Combobox.Empty>\n )}\n </Combobox.Options>\n ) : (\n <CascaderColumns\n data={data}\n activePath={cascader.activePath}\n value={cascader.value}\n keyboardNav={cascader.keyboardNav}\n withCheckIcon={withCheckIcon}\n checkIconPosition={checkIconPosition}\n renderOption={renderOption}\n columnWidth={columnWidth}\n maxDisplayedLevels={maxDisplayedLevels}\n previousLevelsControlLabel={previousLevelsControlLabel}\n nextLevelsControlLabel={nextLevelsControlLabel}\n maxDropdownHeight={maxDropdownHeight}\n nothingFoundMessage={nothingFoundMessage}\n getStyles={getStyles}\n unstyled={unstyled}\n scrollAreaProps={scrollAreaProps}\n onOptionClick={cascader.handleOptionClick}\n onOptionMouseEnter={cascader.handleOptionMouseEnter}\n onColumnsMouseLeave={() => {\n if (expandTrigger === 'hover') {\n cascader.setActivePath(cascader.value ?? []);\n }\n }}\n onPointerActivity={() => cascader.setKeyboardNav(false)}\n listId={listId}\n />\n )}\n </Combobox.Dropdown>\n );\n\n return (\n <>\n <Combobox\n store={combobox}\n __staticSelector=\"Cascader\"\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n readOnly={readOnly}\n size={size}\n attributes={attributes}\n width={showFlatList ? 'target' : 'max-content'}\n position=\"bottom-start\"\n onOptionSubmit={(val) => {\n const index = Number(val);\n const flatPath = flatListItems[index];\n if (!flatPath || flatPath.disabled) {\n return;\n }\n cascader.selectPath(flatPath.path);\n cascader.setActivePath(flatPath.path);\n if (shouldCloseOnSelect) {\n combobox.closeDropdown();\n }\n }}\n {...comboboxProps}\n >\n <Combobox.Target\n targetType={searchable ? 'input' : 'button'}\n withKeyboardNavigation={showFlatList}\n autoComplete={autoComplete}\n >\n <InputBase\n id={_id}\n __defaultRightSection={\n <Combobox.Chevron\n size={size}\n error={error}\n unstyled={unstyled}\n color={chevronColor}\n />\n }\n __clearSection={clearButton}\n __clearable={_clearable}\n __clearSectionMode={clearSectionMode}\n rightSection={rightSection}\n rightSectionPointerEvents={rightSectionPointerEvents || 'none'}\n {...rest}\n {...styleProps}\n size={size}\n __staticSelector=\"Cascader\"\n disabled={disabled}\n readOnly={readOnly || !searchable}\n value={searchable ? _searchValue : displayString}\n onChange={(event) => handleSearchChange(event.currentTarget.value)}\n onFocus={(event) => {\n if (openOnFocus && searchable && canInteract) {\n combobox.openDropdown();\n }\n onFocus?.(event);\n }}\n onBlur={(event) => {\n combobox.closeDropdown();\n onBlur?.(event);\n }}\n onClick={(event) => {\n if (canInteract) {\n cascader.setKeyboardNav(false);\n if (searchable) {\n combobox.openDropdown();\n } else {\n combobox.toggleDropdown();\n }\n }\n onClick?.(event);\n }}\n onKeyDown={handleKeyDown}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n pointer={!searchable}\n error={error}\n success={success}\n attributes={attributes}\n className={className}\n style={style}\n variant={variant}\n radius={radius}\n leftSection={leftSection}\n leftSectionWidth={leftSectionWidth}\n leftSectionPointerEvents={leftSectionPointerEvents}\n leftSectionProps={leftSectionProps}\n rightSectionWidth={rightSectionWidth}\n rightSectionProps={rightSectionProps}\n inputContainer={inputContainer}\n inputWrapperOrder={inputWrapperOrder}\n withAsterisk={withAsterisk}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorProps={errorProps}\n successProps={successProps}\n wrapperProps={wrapperProps}\n description={description}\n label={label}\n withErrorStyles={withErrorStyles}\n withSuccessStyles={withSuccessStyles}\n placeholder={placeholder}\n required={required}\n mod={mod}\n />\n </Combobox.Target>\n {dropdown}\n </Combobox>\n <Combobox.HiddenInput\n value={cascader.value}\n name={name}\n form={form}\n disabled={disabled}\n {...hiddenInputProps}\n />\n </>\n );\n});\n\nCascader.classes = { ...InputBase.classes, ...Combobox.classes, ...classes };\nCascader.displayName = '@mantine/core/Cascader';\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ //#region packages/@mantine/core/src/components/Cascader/Cascader.module.css
3
+ var Cascader_module_default = {
4
+ "columnsList": "m_9a782f2c",
5
+ "column": "m_4c5a03a5",
6
+ "columnScroll": "m_7f3ac6d2",
7
+ "columnsOverflow": "m_6b93b90",
8
+ "columnOption": "m_791f687a",
9
+ "flatOption": "m_452a61d",
10
+ "columnOptionLabel": "m_aecd629a",
11
+ "columnOptionIcon": "m_92054c13",
12
+ "columnOptionCheck": "m_ae51c8ae",
13
+ "columnEmpty": "m_97ff10a8"
14
+ };
15
+ //#endregion
16
+ exports.default = Cascader_module_default;
17
+
18
+ //# sourceMappingURL=Cascader.module.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cascader.module.cjs","names":[],"sources":["../../../src/components/Cascader/Cascader.module.css"],"sourcesContent":[".columnsList {\n --cascader-column-width: 200px;\n\n display: flex;\n flex-direction: row;\n align-items: stretch;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n width: var(--cascader-column-width);\n min-width: var(--cascader-column-width);\n border-inline-end: rem(1px) solid var(--popover-border-color, var(--mantine-color-default-border));\n\n /* Keep the border width reserved so revealing the next column does not shift the layout */\n &:where([data-last]) {\n border-inline-end-color: transparent;\n }\n}\n\n.columnScroll {\n flex: 1;\n padding: var(--combobox-padding);\n}\n\n.columnsOverflow {\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: stretch;\n padding-inline: calc(var(--combobox-padding) / 2);\n color: var(--mantine-color-dimmed);\n cursor: pointer;\n border-inline-end: rem(1px) solid var(--popover-border-color, var(--mantine-color-default-border));\n\n @mixin hover {\n @mixin where-light {\n background-color: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-7);\n }\n }\n\n & > svg {\n width: 0.9em;\n height: 0.9em;\n transform: rotate(90deg);\n }\n\n /* Round the corners that sit against the rounded dropdown edge so the hover background\n does not overflow the dropdown corners */\n &:where([data-position='start']) {\n border-start-start-radius: var(--popover-radius, var(--mantine-radius-default));\n border-end-start-radius: var(--popover-radius, var(--mantine-radius-default));\n }\n\n /* The divider on the left is provided by the previous column, so this control has none */\n &:where([data-position='end']) {\n border-inline-end-color: transparent;\n border-start-end-radius: var(--popover-radius, var(--mantine-radius-default));\n border-end-end-radius: var(--popover-radius, var(--mantine-radius-default));\n\n & > svg {\n transform: rotate(-90deg);\n }\n }\n\n @mixin where-rtl {\n & > svg {\n transform: rotate(-90deg);\n }\n\n &:where([data-position='end']) > svg {\n transform: rotate(90deg);\n }\n }\n}\n\n.columnOption {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n width: 100%;\n padding: var(--combobox-option-padding);\n font-size: var(--combobox-option-fz, var(--mantine-font-size-sm));\n border-radius: var(--combobox-option-radius, var(--mantine-radius-default));\n color: var(--mantine-color-text);\n cursor: pointer;\n\n @mixin hover {\n &:where(:not([data-disabled], [data-active])) {\n @mixin where-light {\n background-color: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-7);\n }\n }\n }\n\n /* Selected options in the ancestor columns (the navigation trail) */\n &:where([data-in-path]) {\n @mixin where-light {\n background-color: var(--mantine-color-gray-1);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-6);\n }\n }\n\n /* Option in the column that is currently being navigated */\n &:where([data-active]) {\n background-color: var(--mantine-primary-color-filled);\n color: var(--mantine-color-white);\n\n @mixin hover {\n background-color: var(--mantine-primary-color-filled-hover);\n }\n }\n\n &:where([data-disabled]) {\n color: var(--mantine-color-dimmed);\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n\n.flatOption {\n display: flex;\n align-items: center;\n gap: var(--mantine-spacing-xs);\n width: 100%;\n}\n\n.columnOptionLabel {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.columnOptionIcon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 0.9em;\n min-width: 0.9em;\n height: 0.9em;\n color: var(--mantine-color-dimmed);\n transform: rotate(-90deg);\n\n :where([data-active]) & {\n color: inherit;\n }\n\n @mixin where-rtl {\n transform: rotate(90deg);\n }\n}\n\n.columnOptionCheck {\n width: 0.8em;\n min-width: 0.8em;\n height: 0.8em;\n opacity: 0.4;\n\n :where([data-active]) &,\n :where([data-combobox-selected]) & {\n opacity: 1;\n }\n}\n\n.columnEmpty {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--combobox-option-padding);\n color: var(--mantine-color-dimmed);\n font-size: var(--combobox-option-fz, var(--mantine-font-size-sm));\n white-space: nowrap;\n}\n"],"mappings":""}
@@ -0,0 +1,136 @@
1
+ "use client";
2
+ const require_ScrollArea = require("../ScrollArea/ScrollArea.cjs");
3
+ const require_UnstyledButton = require("../UnstyledButton/UnstyledButton.cjs");
4
+ const require_AccordionChevron = require("../Accordion/AccordionChevron.cjs");
5
+ const require_CheckIcon = require("../Checkbox/CheckIcon.cjs");
6
+ const require_get_cascader_columns = require("./get-cascader-columns.cjs");
7
+ let react = require("react");
8
+ let react_jsx_runtime = require("react/jsx-runtime");
9
+ //#region packages/@mantine/core/src/components/Cascader/CascaderColumns.tsx
10
+ function getCascaderOptionId(listId, level, value) {
11
+ return listId ? `${listId}-${level}-${value}` : void 0;
12
+ }
13
+ function CascaderColumns({ data, activePath, value, keyboardNav, withCheckIcon, checkIconPosition, renderOption, columnWidth, maxDisplayedLevels, previousLevelsControlLabel, nextLevelsControlLabel, maxDropdownHeight, nothingFoundMessage, getStyles, unstyled, scrollAreaProps, onOptionClick, onOptionMouseEnter, onColumnsMouseLeave, onPointerActivity, listId }) {
14
+ const allColumns = require_get_cascader_columns.getCascaderColumns(data, activePath);
15
+ const totalColumns = allColumns.length;
16
+ const maxLevels = maxDisplayedLevels && maxDisplayedLevels > 0 ? maxDisplayedLevels : totalColumns;
17
+ const maxOffset = Math.max(0, totalColumns - maxLevels);
18
+ const focusedLevel = activePath.length - 1;
19
+ const showCheckIcon = withCheckIcon !== false;
20
+ const activePathKey = JSON.stringify(activePath);
21
+ const [windowState, setWindowState] = (0, react.useState)({
22
+ key: activePathKey,
23
+ offset: 0
24
+ });
25
+ const windowOffset = windowState.key === activePathKey ? windowState.offset : 0;
26
+ if (windowState.key !== activePathKey) setWindowState({
27
+ key: activePathKey,
28
+ offset: 0
29
+ });
30
+ const setWindowOffset = (updater) => setWindowState((current) => ({
31
+ key: activePathKey,
32
+ offset: updater(current.offset)
33
+ }));
34
+ const windowStart = Math.max(0, maxOffset - Math.min(windowOffset, maxOffset));
35
+ const windowEnd = Math.min(totalColumns, windowStart + maxLevels);
36
+ const visibleColumns = allColumns.slice(windowStart, windowEnd);
37
+ const hiddenBefore = windowStart;
38
+ const hiddenAfter = totalColumns - windowEnd;
39
+ const check = showCheckIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_CheckIcon.CheckIcon, { ...getStyles("columnOptionCheck") }) : null;
40
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
41
+ ...getStyles("columnsList"),
42
+ role: "presentation",
43
+ onMouseLeave: onColumnsMouseLeave,
44
+ onMouseMove: onPointerActivity,
45
+ children: [
46
+ hiddenBefore > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_UnstyledButton.UnstyledButton, {
47
+ ...getStyles("columnsOverflow"),
48
+ "data-position": "start",
49
+ tabIndex: -1,
50
+ unstyled,
51
+ "aria-label": previousLevelsControlLabel,
52
+ title: previousLevelsControlLabel,
53
+ onMouseDown: (event) => event.preventDefault(),
54
+ onClick: () => setWindowOffset((current) => Math.min(maxOffset, current + 1)),
55
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AccordionChevron.AccordionChevron, {})
56
+ }),
57
+ visibleColumns.map((options, index) => {
58
+ const level = windowStart + index;
59
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
60
+ "data-last": index === visibleColumns.length - 1 && hiddenAfter === 0 || void 0,
61
+ ...getStyles("column", { style: columnWidth ? {
62
+ width: columnWidth,
63
+ minWidth: columnWidth
64
+ } : void 0 }),
65
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ScrollArea.ScrollArea.Autosize, {
66
+ mah: maxDropdownHeight ?? 260,
67
+ type: "scroll",
68
+ scrollbarSize: "var(--combobox-padding)",
69
+ role: "listbox",
70
+ ...scrollAreaProps,
71
+ ...getStyles("columnScroll"),
72
+ children: options.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
73
+ ...getStyles("columnEmpty"),
74
+ children: nothingFoundMessage
75
+ }) : options.map((option) => {
76
+ const isActive = activePath[level] === option.value;
77
+ const isCurrent = isActive && level === focusedLevel && keyboardNav;
78
+ const isInPath = isActive && level < focusedLevel;
79
+ const hasChildren = require_get_cascader_columns.cascaderOptionHasChildren(option);
80
+ const isSelected = !!value && value.length === level + 1 && value[level] === option.value;
81
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_UnstyledButton.UnstyledButton, {
82
+ id: getCascaderOptionId(listId, level, option.value),
83
+ role: "option",
84
+ "aria-selected": isCurrent || void 0,
85
+ "aria-disabled": option.disabled || void 0,
86
+ "data-active": isCurrent || void 0,
87
+ "data-in-path": isInPath || void 0,
88
+ "data-selected": isSelected || void 0,
89
+ "data-disabled": option.disabled || void 0,
90
+ tabIndex: -1,
91
+ unstyled,
92
+ onMouseDown: (event) => event.preventDefault(),
93
+ onClick: () => {
94
+ if (!option.disabled) onOptionClick(level, option);
95
+ },
96
+ onMouseEnter: () => {
97
+ if (!option.disabled) onOptionMouseEnter(level, option);
98
+ },
99
+ ...getStyles("columnOption"),
100
+ children: [
101
+ isSelected && checkIconPosition === "left" && check,
102
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
103
+ ...getStyles("columnOptionLabel"),
104
+ children: renderOption ? renderOption(option, level) : option.label ?? option.value
105
+ }),
106
+ isSelected && checkIconPosition !== "left" && check,
107
+ hasChildren && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
108
+ ...getStyles("columnOptionIcon"),
109
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AccordionChevron.AccordionChevron, {})
110
+ })
111
+ ]
112
+ }, option.value);
113
+ })
114
+ })
115
+ }, level);
116
+ }),
117
+ hiddenAfter > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_UnstyledButton.UnstyledButton, {
118
+ ...getStyles("columnsOverflow"),
119
+ "data-position": "end",
120
+ tabIndex: -1,
121
+ unstyled,
122
+ "aria-label": nextLevelsControlLabel,
123
+ title: nextLevelsControlLabel,
124
+ onMouseDown: (event) => event.preventDefault(),
125
+ onClick: () => setWindowOffset((current) => Math.max(0, current - 1)),
126
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AccordionChevron.AccordionChevron, {})
127
+ })
128
+ ]
129
+ });
130
+ }
131
+ CascaderColumns.displayName = "@mantine/core/CascaderColumns";
132
+ //#endregion
133
+ exports.CascaderColumns = CascaderColumns;
134
+ exports.getCascaderOptionId = getCascaderOptionId;
135
+
136
+ //# sourceMappingURL=CascaderColumns.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CascaderColumns.cjs","names":["getCascaderColumns","CheckIcon","UnstyledButton","AccordionChevron","ScrollArea","cascaderOptionHasChildren"],"sources":["../../../src/components/Cascader/CascaderColumns.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { GetStylesApi } from '../../core';\nimport { AccordionChevron } from '../Accordion';\nimport { CheckIcon } from '../Checkbox/CheckIcon';\nimport { ScrollArea, ScrollAreaProps } from '../ScrollArea';\nimport { UnstyledButton } from '../UnstyledButton';\nimport type { CascaderOption, CascaderStylesNames } from './Cascader';\nimport { cascaderOptionHasChildren, getCascaderColumns } from './get-cascader-columns';\n\ntype CascaderColumnsGetStyles = GetStylesApi<{ props: any; stylesNames: CascaderStylesNames }>;\n\nexport interface CascaderColumnsProps {\n data: CascaderOption[];\n activePath: string[];\n value: string[] | null;\n keyboardNav: boolean;\n withCheckIcon: boolean | undefined;\n checkIconPosition: 'left' | 'right' | undefined;\n renderOption: ((option: CascaderOption, level: number) => React.ReactNode) | undefined;\n columnWidth: number | string | undefined;\n maxDisplayedLevels: number | undefined;\n previousLevelsControlLabel: string | undefined;\n nextLevelsControlLabel: string | undefined;\n maxDropdownHeight: number | string | undefined;\n nothingFoundMessage: React.ReactNode;\n getStyles: CascaderColumnsGetStyles;\n unstyled: boolean | undefined;\n scrollAreaProps: ScrollAreaProps | undefined;\n onOptionClick: (level: number, option: CascaderOption) => void;\n onOptionMouseEnter: (level: number, option: CascaderOption) => void;\n onColumnsMouseLeave: (() => void) | undefined;\n onPointerActivity: (() => void) | undefined;\n listId: string | undefined;\n}\n\nexport function getCascaderOptionId(listId: string | undefined, level: number, value: string) {\n return listId ? `${listId}-${level}-${value}` : undefined;\n}\n\nexport function CascaderColumns({\n data,\n activePath,\n value,\n keyboardNav,\n withCheckIcon,\n checkIconPosition,\n renderOption,\n columnWidth,\n maxDisplayedLevels,\n previousLevelsControlLabel,\n nextLevelsControlLabel,\n maxDropdownHeight,\n nothingFoundMessage,\n getStyles,\n unstyled,\n scrollAreaProps,\n onOptionClick,\n onOptionMouseEnter,\n onColumnsMouseLeave,\n onPointerActivity,\n listId,\n}: CascaderColumnsProps) {\n const allColumns = getCascaderColumns(data, activePath);\n const totalColumns = allColumns.length;\n const maxLevels =\n maxDisplayedLevels && maxDisplayedLevels > 0 ? maxDisplayedLevels : totalColumns;\n const maxOffset = Math.max(0, totalColumns - maxLevels);\n const focusedLevel = activePath.length - 1;\n const showCheckIcon = withCheckIcon !== false;\n\n // Manual left/right scrolling of the visible window. It is reset synchronously whenever the\n // active path changes so that the focused column always stays visible during navigation.\n const activePathKey = JSON.stringify(activePath);\n const [windowState, setWindowState] = useState({ key: activePathKey, offset: 0 });\n const windowOffset = windowState.key === activePathKey ? windowState.offset : 0;\n if (windowState.key !== activePathKey) {\n setWindowState({ key: activePathKey, offset: 0 });\n }\n const setWindowOffset = (updater: (current: number) => number) =>\n setWindowState((current) => ({ key: activePathKey, offset: updater(current.offset) }));\n\n const clampedOffset = Math.min(windowOffset, maxOffset);\n const windowStart = Math.max(0, maxOffset - clampedOffset);\n const windowEnd = Math.min(totalColumns, windowStart + maxLevels);\n const visibleColumns = allColumns.slice(windowStart, windowEnd);\n const hiddenBefore = windowStart;\n const hiddenAfter = totalColumns - windowEnd;\n\n const check = showCheckIcon ? <CheckIcon {...getStyles('columnOptionCheck')} /> : null;\n\n return (\n <div\n {...getStyles('columnsList')}\n role=\"presentation\"\n onMouseLeave={onColumnsMouseLeave}\n onMouseMove={onPointerActivity}\n >\n {hiddenBefore > 0 && (\n <UnstyledButton\n {...getStyles('columnsOverflow')}\n data-position=\"start\"\n tabIndex={-1}\n unstyled={unstyled}\n aria-label={previousLevelsControlLabel}\n title={previousLevelsControlLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setWindowOffset((current) => Math.min(maxOffset, current + 1))}\n >\n <AccordionChevron />\n </UnstyledButton>\n )}\n\n {visibleColumns.map((options, index) => {\n const level = windowStart + index;\n const isLastColumn = index === visibleColumns.length - 1 && hiddenAfter === 0;\n\n return (\n <div\n key={level}\n data-last={isLastColumn || undefined}\n {...getStyles('column', {\n style: columnWidth ? { width: columnWidth, minWidth: columnWidth } : undefined,\n })}\n >\n <ScrollArea.Autosize\n mah={maxDropdownHeight ?? 260}\n type=\"scroll\"\n scrollbarSize=\"var(--combobox-padding)\"\n role=\"listbox\"\n {...scrollAreaProps}\n {...getStyles('columnScroll')}\n >\n {options.length === 0 ? (\n <div {...getStyles('columnEmpty')}>{nothingFoundMessage}</div>\n ) : (\n options.map((option) => {\n const isActive = activePath[level] === option.value;\n const isCurrent = isActive && level === focusedLevel && keyboardNav;\n // The trail only covers ancestor columns; the deepest column is not highlighted\n // during mouse navigation (only via the keyboard \"current\" state)\n const isInPath = isActive && level < focusedLevel;\n const hasChildren = cascaderOptionHasChildren(option);\n const isSelected =\n !!value && value.length === level + 1 && value[level] === option.value;\n\n return (\n <UnstyledButton\n key={option.value}\n id={getCascaderOptionId(listId, level, option.value)}\n role=\"option\"\n aria-selected={isCurrent || undefined}\n aria-disabled={option.disabled || undefined}\n data-active={isCurrent || undefined}\n data-in-path={isInPath || undefined}\n data-selected={isSelected || undefined}\n data-disabled={option.disabled || undefined}\n tabIndex={-1}\n unstyled={unstyled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (!option.disabled) {\n onOptionClick(level, option);\n }\n }}\n onMouseEnter={() => {\n if (!option.disabled) {\n onOptionMouseEnter(level, option);\n }\n }}\n {...getStyles('columnOption')}\n >\n {isSelected && checkIconPosition === 'left' && check}\n\n <span {...getStyles('columnOptionLabel')}>\n {renderOption\n ? renderOption(option, level)\n : (option.label ?? option.value)}\n </span>\n\n {isSelected && checkIconPosition !== 'left' && check}\n\n {hasChildren && (\n <span {...getStyles('columnOptionIcon')}>\n <AccordionChevron />\n </span>\n )}\n </UnstyledButton>\n );\n })\n )}\n </ScrollArea.Autosize>\n </div>\n );\n })}\n\n {hiddenAfter > 0 && (\n <UnstyledButton\n {...getStyles('columnsOverflow')}\n data-position=\"end\"\n tabIndex={-1}\n unstyled={unstyled}\n aria-label={nextLevelsControlLabel}\n title={nextLevelsControlLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setWindowOffset((current) => Math.max(0, current - 1))}\n >\n <AccordionChevron />\n </UnstyledButton>\n )}\n </div>\n );\n}\n\nCascaderColumns.displayName = '@mantine/core/CascaderColumns';\n"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ "use client";
2
+ //#region packages/@mantine/core/src/components/Cascader/flatten-cascader-paths.ts
3
+ function flattenCascaderPaths(data) {
4
+ const result = [];
5
+ const walk = (nodes, parentPath, parentOptions, parentDisabled) => {
6
+ for (const node of nodes) {
7
+ const path = [...parentPath, node.value];
8
+ const options = [...parentOptions, node];
9
+ const disabled = parentDisabled || !!node.disabled;
10
+ const hasChildren = Array.isArray(node.children) && node.children.length > 0;
11
+ result.push({
12
+ path,
13
+ options,
14
+ leaf: !hasChildren,
15
+ disabled
16
+ });
17
+ if (hasChildren) walk(node.children, path, options, disabled);
18
+ }
19
+ };
20
+ walk(data, [], [], false);
21
+ return result;
22
+ }
23
+ //#endregion
24
+ exports.flattenCascaderPaths = flattenCascaderPaths;
25
+
26
+ //# sourceMappingURL=flatten-cascader-paths.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten-cascader-paths.cjs","names":[],"sources":["../../../src/components/Cascader/flatten-cascader-paths.ts"],"sourcesContent":["import type { CascaderOption } from './Cascader';\n\nexport interface CascaderFlatPath {\n /** Values from root to node */\n path: string[];\n\n /** Option chain from root to node */\n options: CascaderOption[];\n\n /** `true` if the node has no children */\n leaf: boolean;\n\n /** `true` if the node or any of its ancestors is disabled */\n disabled: boolean;\n}\n\nexport function flattenCascaderPaths(data: CascaderOption[]): CascaderFlatPath[] {\n const result: CascaderFlatPath[] = [];\n\n const walk = (\n nodes: CascaderOption[],\n parentPath: string[],\n parentOptions: CascaderOption[],\n parentDisabled: boolean\n ) => {\n for (const node of nodes) {\n const path = [...parentPath, node.value];\n const options = [...parentOptions, node];\n const disabled = parentDisabled || !!node.disabled;\n const hasChildren = Array.isArray(node.children) && node.children.length > 0;\n\n result.push({ path, options, leaf: !hasChildren, disabled });\n\n if (hasChildren) {\n walk(node.children!, path, options, disabled);\n }\n }\n };\n\n walk(data, [], [], false);\n\n return result;\n}\n"],"mappings":";;AAgBA,SAAgB,qBAAqB,MAA4C;CAC/E,MAAM,SAA6B,CAAC;CAEpC,MAAM,QACJ,OACA,YACA,eACA,mBACG;EACH,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,OAAO,CAAC,GAAG,YAAY,KAAK,KAAK;GACvC,MAAM,UAAU,CAAC,GAAG,eAAe,IAAI;GACvC,MAAM,WAAW,kBAAkB,CAAC,CAAC,KAAK;GAC1C,MAAM,cAAc,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS;GAE3E,OAAO,KAAK;IAAE;IAAM;IAAS,MAAM,CAAC;IAAa;GAAS,CAAC;GAE3D,IAAI,aACF,KAAK,KAAK,UAAW,MAAM,SAAS,QAAQ;EAEhD;CACF;CAEA,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;CAExB,OAAO;AACT"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ //#region packages/@mantine/core/src/components/Cascader/get-cascader-columns.ts
3
+ function cascaderOptionHasChildren(option) {
4
+ return Array.isArray(option.children) && option.children.length > 0;
5
+ }
6
+ function findCascaderOption(options, value) {
7
+ return options.find((option) => option.value === value);
8
+ }
9
+ function getCascaderColumns(data, activePath) {
10
+ const columns = [data];
11
+ let level = data;
12
+ for (let index = 0; index < activePath.length; index += 1) {
13
+ const node = findCascaderOption(level, activePath[index]);
14
+ if (!node) break;
15
+ const isLast = index === activePath.length - 1;
16
+ if (Array.isArray(node.children) && node.children.length > 0) {
17
+ if (!isLast) {
18
+ columns.push(node.children);
19
+ level = node.children;
20
+ }
21
+ } else break;
22
+ }
23
+ return columns;
24
+ }
25
+ //#endregion
26
+ exports.cascaderOptionHasChildren = cascaderOptionHasChildren;
27
+ exports.findCascaderOption = findCascaderOption;
28
+ exports.getCascaderColumns = getCascaderColumns;
29
+
30
+ //# sourceMappingURL=get-cascader-columns.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-cascader-columns.cjs","names":[],"sources":["../../../src/components/Cascader/get-cascader-columns.ts"],"sourcesContent":["import type { CascaderOption } from './Cascader';\n\nexport function cascaderOptionHasChildren(option: CascaderOption): boolean {\n return Array.isArray(option.children) && option.children.length > 0;\n}\n\nexport function findCascaderOption(\n options: CascaderOption[],\n value: string\n): CascaderOption | undefined {\n return options.find((option) => option.value === value);\n}\n\nexport function getCascaderColumns(\n data: CascaderOption[],\n activePath: string[]\n): CascaderOption[][] {\n const columns: CascaderOption[][] = [data];\n let level = data;\n\n for (let index = 0; index < activePath.length; index += 1) {\n const node = findCascaderOption(level, activePath[index]);\n\n if (!node) {\n break;\n }\n\n const isLast = index === activePath.length - 1;\n\n if (Array.isArray(node.children) && node.children.length > 0) {\n if (!isLast) {\n columns.push(node.children);\n level = node.children;\n }\n // The deepest highlighted option is intentionally not expanded\n } else {\n break;\n }\n }\n\n return columns;\n}\n"],"mappings":";;AAEA,SAAgB,0BAA0B,QAAiC;CACzE,OAAO,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS;AACpE;AAEA,SAAgB,mBACd,SACA,OAC4B;CAC5B,OAAO,QAAQ,MAAM,WAAW,OAAO,UAAU,KAAK;AACxD;AAEA,SAAgB,mBACd,MACA,YACoB;CACpB,MAAM,UAA8B,CAAC,IAAI;CACzC,IAAI,QAAQ;CAEZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;EACzD,MAAM,OAAO,mBAAmB,OAAO,WAAW,MAAM;EAExD,IAAI,CAAC,MACH;EAGF,MAAM,SAAS,UAAU,WAAW,SAAS;EAE7C,IAAI,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS;OACrD,CAAC,QAAQ;IACX,QAAQ,KAAK,KAAK,QAAQ;IAC1B,QAAQ,KAAK;GACf;SAGA;CAEJ;CAEA,OAAO;AACT"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ //#region packages/@mantine/core/src/components/Cascader/get-cascader-path-options.ts
3
+ function getCascaderPathOptions(data, value) {
4
+ if (!value || value.length === 0) return [];
5
+ const options = [];
6
+ let level = data;
7
+ for (const currentValue of value) {
8
+ if (!level) break;
9
+ const node = level.find((option) => option.value === currentValue);
10
+ if (!node) break;
11
+ options.push(node);
12
+ level = node.children;
13
+ }
14
+ return options;
15
+ }
16
+ //#endregion
17
+ exports.getCascaderPathOptions = getCascaderPathOptions;
18
+
19
+ //# sourceMappingURL=get-cascader-path-options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-cascader-path-options.cjs","names":[],"sources":["../../../src/components/Cascader/get-cascader-path-options.ts"],"sourcesContent":["import type { CascaderOption } from './Cascader';\n\nexport function getCascaderPathOptions(\n data: CascaderOption[],\n value: string[] | null | undefined\n): CascaderOption[] {\n if (!value || value.length === 0) {\n return [];\n }\n\n const options: CascaderOption[] = [];\n let level: CascaderOption[] | undefined = data;\n\n for (const currentValue of value) {\n if (!level) {\n break;\n }\n\n const node: CascaderOption | undefined = level.find((option) => option.value === currentValue);\n\n if (!node) {\n break;\n }\n\n options.push(node);\n level = node.children;\n }\n\n return options;\n}\n"],"mappings":";;AAEA,SAAgB,uBACd,MACA,OACkB;CAClB,IAAI,CAAC,SAAS,MAAM,WAAW,GAC7B,OAAO,CAAC;CAGV,MAAM,UAA4B,CAAC;CACnC,IAAI,QAAsC;CAE1C,KAAK,MAAM,gBAAgB,OAAO;EAChC,IAAI,CAAC,OACH;EAGF,MAAM,OAAmC,MAAM,MAAM,WAAW,OAAO,UAAU,YAAY;EAE7F,IAAI,CAAC,MACH;EAGF,QAAQ,KAAK,IAAI;EACjB,QAAQ,KAAK;CACf;CAEA,OAAO;AACT"}
@@ -0,0 +1,135 @@
1
+ "use client";
2
+ const require_get_cascader_columns = require("./get-cascader-columns.cjs");
3
+ const require_get_cascader_path_options = require("./get-cascader-path-options.cjs");
4
+ let react = require("react");
5
+ let _mantine_hooks = require("@mantine/hooks");
6
+ //#region packages/@mantine/core/src/components/Cascader/use-cascader.ts
7
+ function pathsEqual(a, b) {
8
+ return !!a && a.length === b.length && a.every((item, index) => item === b[index]);
9
+ }
10
+ function findEnabledIndex(options, from, direction) {
11
+ let index = from + direction;
12
+ while (index >= 0 && index < options.length) {
13
+ if (!options[index].disabled) return index;
14
+ index += direction;
15
+ }
16
+ return -1;
17
+ }
18
+ function useCascader({ data, value, defaultValue, onChange, changeOnSelect, allowDeselect, expandTrigger, onLeafSelect }) {
19
+ const [keyboardNav, setKeyboardNav] = (0, react.useState)(false);
20
+ const [_value, setValue] = (0, _mantine_hooks.useUncontrolled)({
21
+ value,
22
+ defaultValue,
23
+ finalValue: null,
24
+ onChange: (val) => onChange?.(val, require_get_cascader_path_options.getCascaderPathOptions(data, val))
25
+ });
26
+ const [activePath, setActivePath] = (0, react.useState)(() => _value ?? []);
27
+ const activePathRef = (0, react.useRef)(activePath);
28
+ activePathRef.current = activePath;
29
+ const resetActivePath = (0, react.useCallback)(() => {
30
+ setActivePath(_value ?? []);
31
+ }, [_value]);
32
+ const selectPath = (0, react.useCallback)((path) => {
33
+ setValue(allowDeselect && pathsEqual(_value, path) ? null : path);
34
+ }, [
35
+ allowDeselect,
36
+ _value,
37
+ setValue
38
+ ]);
39
+ const expandOption = (0, react.useCallback)((level, option) => {
40
+ const optionPath = [...activePathRef.current.slice(0, level), option.value];
41
+ const children = option.children;
42
+ if (Array.isArray(children) && children.length > 0) {
43
+ const first = findEnabledIndex(children, -1, 1);
44
+ setActivePath(first >= 0 ? [...optionPath, children[first].value] : optionPath);
45
+ } else setActivePath(optionPath);
46
+ }, []);
47
+ return {
48
+ value: _value,
49
+ setValue,
50
+ selectPath,
51
+ activePath,
52
+ setActivePath,
53
+ resetActivePath,
54
+ keyboardNav,
55
+ setKeyboardNav,
56
+ handleOptionClick: (0, react.useCallback)((level, option) => {
57
+ setKeyboardNav(false);
58
+ const path = [...activePath.slice(0, level), option.value];
59
+ if (require_get_cascader_columns.cascaderOptionHasChildren(option)) {
60
+ if (changeOnSelect) selectPath(path);
61
+ expandOption(level, option);
62
+ if (changeOnSelect) onLeafSelect?.();
63
+ } else {
64
+ selectPath(path);
65
+ onLeafSelect?.();
66
+ }
67
+ }, [
68
+ activePath,
69
+ changeOnSelect,
70
+ selectPath,
71
+ expandOption,
72
+ onLeafSelect
73
+ ]),
74
+ handleOptionMouseEnter: (0, react.useCallback)((level, option) => {
75
+ setKeyboardNav(false);
76
+ if (expandTrigger !== "hover") return;
77
+ if (require_get_cascader_columns.cascaderOptionHasChildren(option)) expandOption(level, option);
78
+ else setActivePath([...activePath.slice(0, level), option.value]);
79
+ }, [
80
+ expandTrigger,
81
+ activePath,
82
+ expandOption
83
+ ]),
84
+ handleColumnsKeyDown: (0, react.useCallback)((event) => {
85
+ setKeyboardNav(true);
86
+ const columns = require_get_cascader_columns.getCascaderColumns(data, activePath);
87
+ const focusedLevel = Math.max(0, activePath.length - 1);
88
+ const currentColumn = columns[focusedLevel] ?? columns[0] ?? [];
89
+ const focusedIndex = currentColumn.findIndex((item) => item.value === activePath[focusedLevel]);
90
+ const focusedOption = focusedIndex >= 0 ? currentColumn[focusedIndex] : void 0;
91
+ switch (event.key) {
92
+ case "ArrowDown": {
93
+ const next = findEnabledIndex(currentColumn, focusedIndex, 1);
94
+ if (next >= 0) setActivePath([...activePath.slice(0, focusedLevel), currentColumn[next].value]);
95
+ return true;
96
+ }
97
+ case "ArrowUp": {
98
+ const prev = findEnabledIndex(currentColumn, focusedIndex < 0 ? currentColumn.length : focusedIndex, -1);
99
+ if (prev >= 0) setActivePath([...activePath.slice(0, focusedLevel), currentColumn[prev].value]);
100
+ return true;
101
+ }
102
+ case "ArrowRight":
103
+ if (focusedOption && require_get_cascader_columns.cascaderOptionHasChildren(focusedOption)) expandOption(focusedLevel, focusedOption);
104
+ return true;
105
+ case "ArrowLeft":
106
+ if (activePath.length > 1) setActivePath(activePath.slice(0, -1));
107
+ return true;
108
+ case "Enter":
109
+ if (!focusedOption) return false;
110
+ if (require_get_cascader_columns.cascaderOptionHasChildren(focusedOption)) {
111
+ if (changeOnSelect) selectPath([...activePath.slice(0, focusedLevel), focusedOption.value]);
112
+ expandOption(focusedLevel, focusedOption);
113
+ if (changeOnSelect) onLeafSelect?.();
114
+ } else {
115
+ selectPath([...activePath.slice(0, focusedLevel), focusedOption.value]);
116
+ onLeafSelect?.();
117
+ }
118
+ return true;
119
+ default: return false;
120
+ }
121
+ }, [
122
+ data,
123
+ activePath,
124
+ changeOnSelect,
125
+ selectPath,
126
+ expandOption,
127
+ onLeafSelect
128
+ ]),
129
+ pathOptions: (0, react.useMemo)(() => require_get_cascader_path_options.getCascaderPathOptions(data, _value), [data, _value])
130
+ };
131
+ }
132
+ //#endregion
133
+ exports.useCascader = useCascader;
134
+
135
+ //# sourceMappingURL=use-cascader.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-cascader.cjs","names":["getCascaderPathOptions","cascaderOptionHasChildren","getCascaderColumns"],"sources":["../../../src/components/Cascader/use-cascader.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useUncontrolled } from '@mantine/hooks';\nimport type { CascaderOption } from './Cascader';\nimport { cascaderOptionHasChildren, getCascaderColumns } from './get-cascader-columns';\nimport { getCascaderPathOptions } from './get-cascader-path-options';\n\nexport interface UseCascaderInput {\n data: CascaderOption[];\n value: string[] | null | undefined;\n defaultValue: string[] | null | undefined;\n onChange: ((value: string[] | null, options: CascaderOption[]) => void) | undefined;\n changeOnSelect: boolean | undefined;\n allowDeselect: boolean | undefined;\n expandTrigger: 'click' | 'hover' | undefined;\n onLeafSelect?: () => void;\n}\n\nfunction pathsEqual(a: string[] | null, b: string[]): boolean {\n return !!a && a.length === b.length && a.every((item, index) => item === b[index]);\n}\n\nfunction findEnabledIndex(options: CascaderOption[], from: number, direction: 1 | -1): number {\n let index = from + direction;\n\n while (index >= 0 && index < options.length) {\n if (!options[index].disabled) {\n return index;\n }\n index += direction;\n }\n\n return -1;\n}\n\nexport function useCascader({\n data,\n value,\n defaultValue,\n onChange,\n changeOnSelect,\n allowDeselect,\n expandTrigger,\n onLeafSelect,\n}: UseCascaderInput) {\n const [keyboardNav, setKeyboardNav] = useState(false);\n\n const [_value, setValue] = useUncontrolled<string[] | null>({\n value: value as any,\n defaultValue: defaultValue as any,\n finalValue: null,\n onChange: (val) => onChange?.(val, getCascaderPathOptions(data, val)),\n });\n\n const [activePath, setActivePath] = useState<string[]>(() => _value ?? []);\n const activePathRef = useRef(activePath);\n activePathRef.current = activePath;\n\n const resetActivePath = useCallback(() => {\n setActivePath(_value ?? []);\n }, [_value]);\n\n const selectPath = useCallback(\n (path: string[]) => {\n setValue(allowDeselect && pathsEqual(_value, path) ? null : path);\n },\n [allowDeselect, _value, setValue]\n );\n\n const expandOption = useCallback((level: number, option: CascaderOption) => {\n const optionPath = [...activePathRef.current.slice(0, level), option.value];\n const children = option.children;\n\n if (Array.isArray(children) && children.length > 0) {\n const first = findEnabledIndex(children, -1, 1);\n setActivePath(first >= 0 ? [...optionPath, children[first].value] : optionPath);\n } else {\n setActivePath(optionPath);\n }\n }, []);\n\n const handleOptionClick = useCallback(\n (level: number, option: CascaderOption) => {\n setKeyboardNav(false);\n const path = [...activePath.slice(0, level), option.value];\n\n if (cascaderOptionHasChildren(option)) {\n if (changeOnSelect) {\n selectPath(path);\n }\n expandOption(level, option);\n if (changeOnSelect) {\n onLeafSelect?.();\n }\n } else {\n selectPath(path);\n onLeafSelect?.();\n }\n },\n [activePath, changeOnSelect, selectPath, expandOption, onLeafSelect]\n );\n\n const handleOptionMouseEnter = useCallback(\n (level: number, option: CascaderOption) => {\n setKeyboardNav(false);\n\n if (expandTrigger !== 'hover') {\n return;\n }\n\n if (cascaderOptionHasChildren(option)) {\n expandOption(level, option);\n } else {\n setActivePath([...activePath.slice(0, level), option.value]);\n }\n },\n [expandTrigger, activePath, expandOption]\n );\n\n const handleColumnsKeyDown = useCallback(\n (event: React.KeyboardEvent): boolean => {\n setKeyboardNav(true);\n const columns = getCascaderColumns(data, activePath);\n const focusedLevel = Math.max(0, activePath.length - 1);\n const currentColumn = columns[focusedLevel] ?? columns[0] ?? [];\n const focusedIndex = currentColumn.findIndex(\n (item) => item.value === activePath[focusedLevel]\n );\n const focusedOption = focusedIndex >= 0 ? currentColumn[focusedIndex] : undefined;\n\n switch (event.key) {\n case 'ArrowDown': {\n const next = findEnabledIndex(currentColumn, focusedIndex, 1);\n if (next >= 0) {\n setActivePath([...activePath.slice(0, focusedLevel), currentColumn[next].value]);\n }\n return true;\n }\n case 'ArrowUp': {\n const from = focusedIndex < 0 ? currentColumn.length : focusedIndex;\n const prev = findEnabledIndex(currentColumn, from, -1);\n if (prev >= 0) {\n setActivePath([...activePath.slice(0, focusedLevel), currentColumn[prev].value]);\n }\n return true;\n }\n case 'ArrowRight': {\n if (focusedOption && cascaderOptionHasChildren(focusedOption)) {\n expandOption(focusedLevel, focusedOption);\n }\n return true;\n }\n case 'ArrowLeft': {\n if (activePath.length > 1) {\n setActivePath(activePath.slice(0, -1));\n }\n return true;\n }\n case 'Enter': {\n if (!focusedOption) {\n return false;\n }\n\n if (cascaderOptionHasChildren(focusedOption)) {\n if (changeOnSelect) {\n selectPath([...activePath.slice(0, focusedLevel), focusedOption.value]);\n }\n expandOption(focusedLevel, focusedOption);\n if (changeOnSelect) {\n onLeafSelect?.();\n }\n } else {\n selectPath([...activePath.slice(0, focusedLevel), focusedOption.value]);\n onLeafSelect?.();\n }\n return true;\n }\n default:\n return false;\n }\n },\n [data, activePath, changeOnSelect, selectPath, expandOption, onLeafSelect]\n );\n\n const pathOptions = useMemo(() => getCascaderPathOptions(data, _value), [data, _value]);\n\n return {\n value: _value,\n setValue,\n selectPath,\n activePath,\n setActivePath,\n resetActivePath,\n keyboardNav,\n setKeyboardNav,\n handleOptionClick,\n handleOptionMouseEnter,\n handleColumnsKeyDown,\n pathOptions,\n };\n}\n"],"mappings":"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"}
@@ -80,5 +80,10 @@ function convertHsvaTo(format, color) {
80
80
  }
81
81
  //#endregion
82
82
  exports.convertHsvaTo = convertHsvaTo;
83
+ exports.hsvaToHex = hsvaToHex;
84
+ exports.hsvaToHexa = hsvaToHexa;
85
+ exports.hsvaToHsl = hsvaToHsl;
86
+ exports.hsvaToRgba = hsvaToRgba;
87
+ exports.hsvaToRgbaObject = hsvaToRgbaObject;
83
88
 
84
89
  //# sourceMappingURL=converters.cjs.map
@@ -141,6 +141,11 @@ function parseColor(color) {
141
141
  //#endregion
142
142
  exports.isColorValid = isColorValid;
143
143
  exports.parseColor = parseColor;
144
+ exports.parseHex = parseHex;
145
+ exports.parseHexa = parseHexa;
146
+ exports.parseHsla = parseHsla;
147
+ exports.parseHue = parseHue;
148
+ exports.parseRgba = parseRgba;
144
149
  exports.round = round;
145
150
 
146
151
  //# sourceMappingURL=parsers.cjs.map
@@ -74,7 +74,10 @@ function useCombobox({ defaultOpened, opened, onOpenedChange, onDropdownClose, o
74
74
  const selectActiveOption = (0, react.useCallback)(() => {
75
75
  const root = require_find_element_in_shadow_dom.getRootElement(targetRef.current);
76
76
  const activeOption = require_find_element_in_shadow_dom.findElementBySelector(`#${listId.current} [data-combobox-active]`, root);
77
- if (activeOption) return selectOption(require_find_element_in_shadow_dom.findElementsBySelector(`#${listId.current} [data-combobox-option]`, root).findIndex((option) => option === activeOption));
77
+ if (activeOption) {
78
+ const index = require_find_element_in_shadow_dom.findElementsBySelector(`#${listId.current} [data-combobox-option]`, root).findIndex((option) => option === activeOption);
79
+ return selectOption(index);
80
+ }
78
81
  return selectOption(0);
79
82
  }, [selectOption]);
80
83
  const selectNextOption = (0, react.useCallback)(() => {
@@ -89,7 +92,8 @@ function useCombobox({ defaultOpened, opened, onOpenedChange, onDropdownClose, o
89
92
  }, [selectOption, loop]);
90
93
  const selectFirstOption = (0, react.useCallback)(() => {
91
94
  const root = require_find_element_in_shadow_dom.getRootElement(targetRef.current);
92
- return selectOption(require_get_index.getFirstIndex(require_find_element_in_shadow_dom.findElementsBySelector(`#${listId.current} [data-combobox-option]`, root)));
95
+ const items = require_find_element_in_shadow_dom.findElementsBySelector(`#${listId.current} [data-combobox-option]`, root);
96
+ return selectOption(require_get_index.getFirstIndex(items));
93
97
  }, [selectOption]);
94
98
  const updateSelectedOptionIndex = (0, react.useCallback)((target = "selected", options) => {
95
99
  if (typeof target === "number") {