@mantine/core 9.0.2 → 9.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/cjs/components/Blockquote/Blockquote.cjs +5 -6
  2. package/cjs/components/Blockquote/Blockquote.cjs.map +1 -1
  3. package/cjs/components/Card/Card.cjs +1 -1
  4. package/cjs/components/Card/Card.cjs.map +1 -1
  5. package/cjs/components/Combobox/ComboboxClearButton/ComboboxClearButton.cjs +1 -1
  6. package/cjs/components/Combobox/ComboboxClearButton/ComboboxClearButton.cjs.map +1 -1
  7. package/cjs/components/Combobox/ComboboxEventsTarget/ComboboxEventsTarget.cjs +1 -0
  8. package/cjs/components/Combobox/ComboboxEventsTarget/ComboboxEventsTarget.cjs.map +1 -1
  9. package/cjs/components/Combobox/ComboboxSearch/ComboboxSearch.cjs +2 -1
  10. package/cjs/components/Combobox/ComboboxSearch/ComboboxSearch.cjs.map +1 -1
  11. package/cjs/components/Combobox/ComboboxTarget/ComboboxTarget.cjs +1 -0
  12. package/cjs/components/Combobox/ComboboxTarget/ComboboxTarget.cjs.map +1 -1
  13. package/cjs/components/Combobox/use-combobox-target-props/use-combobox-target-props.cjs +18 -12
  14. package/cjs/components/Combobox/use-combobox-target-props/use-combobox-target-props.cjs.map +1 -1
  15. package/cjs/components/Flex/Flex.cjs +7 -2
  16. package/cjs/components/Flex/Flex.cjs.map +1 -1
  17. package/cjs/components/FloatingIndicator/FloatingIndicator.cjs +1 -2
  18. package/cjs/components/FloatingIndicator/FloatingIndicator.cjs.map +1 -1
  19. package/cjs/components/Highlight/highlighter/highlighter.cjs +3 -3
  20. package/cjs/components/Highlight/highlighter/highlighter.cjs.map +1 -1
  21. package/cjs/components/MaskInput/MaskInput.cjs +24 -0
  22. package/cjs/components/MaskInput/MaskInput.cjs.map +1 -0
  23. package/cjs/components/MaskInput/use-mask-input-props.cjs +29 -0
  24. package/cjs/components/MaskInput/use-mask-input-props.cjs.map +1 -0
  25. package/cjs/components/MultiSelect/MultiSelect.cjs.map +1 -1
  26. package/cjs/components/PasswordInput/PasswordInput.cjs +1 -1
  27. package/cjs/components/PasswordInput/PasswordInput.cjs.map +1 -1
  28. package/cjs/components/Popover/Popover.context.cjs.map +1 -1
  29. package/cjs/components/Popover/PopoverDropdown/PopoverDropdown.cjs +1 -1
  30. package/cjs/components/Popover/PopoverDropdown/PopoverDropdown.cjs.map +1 -1
  31. package/cjs/components/Radio/Radio.module.cjs.map +1 -1
  32. package/cjs/components/Rating/Rating.cjs +1 -2
  33. package/cjs/components/Rating/Rating.cjs.map +1 -1
  34. package/cjs/components/ScrollArea/ScrollArea.cjs +24 -10
  35. package/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -1
  36. package/cjs/components/Select/Select.cjs.map +1 -1
  37. package/cjs/components/SemiCircleProgress/SemiCircleProgress.cjs +2 -0
  38. package/cjs/components/SemiCircleProgress/SemiCircleProgress.cjs.map +1 -1
  39. package/cjs/components/Slider/Marks/Marks.cjs +3 -2
  40. package/cjs/components/Slider/Marks/Marks.cjs.map +1 -1
  41. package/cjs/components/Slider/Marks/is-mark-filled.cjs +2 -1
  42. package/cjs/components/Slider/Marks/is-mark-filled.cjs.map +1 -1
  43. package/cjs/components/Slider/Slider/Slider.cjs +12 -3
  44. package/cjs/components/Slider/Slider/Slider.cjs.map +1 -1
  45. package/cjs/components/Slider/Track/Track.cjs +3 -2
  46. package/cjs/components/Slider/Track/Track.cjs.map +1 -1
  47. package/cjs/components/Tabs/Tabs.cjs +3 -1
  48. package/cjs/components/Tabs/Tabs.cjs.map +1 -1
  49. package/cjs/components/Tabs/Tabs.context.cjs.map +1 -1
  50. package/cjs/components/Tabs/TabsPanel/TabsPanel.cjs +2 -1
  51. package/cjs/components/Tabs/TabsPanel/TabsPanel.cjs.map +1 -1
  52. package/cjs/components/Tree/FlatTreeNode.cjs +103 -0
  53. package/cjs/components/Tree/FlatTreeNode.cjs.map +1 -0
  54. package/cjs/components/Tree/Tree.cjs +12 -2
  55. package/cjs/components/Tree/Tree.cjs.map +1 -1
  56. package/cjs/components/Tree/Tree.module.cjs.map +1 -1
  57. package/cjs/components/Tree/TreeNode.cjs +70 -27
  58. package/cjs/components/Tree/TreeNode.cjs.map +1 -1
  59. package/cjs/components/Tree/filter-tree-data/filter-tree-data.cjs +23 -0
  60. package/cjs/components/Tree/filter-tree-data/filter-tree-data.cjs.map +1 -0
  61. package/cjs/components/Tree/flatten-tree-data/flatten-tree-data.cjs +28 -0
  62. package/cjs/components/Tree/flatten-tree-data/flatten-tree-data.cjs.map +1 -0
  63. package/cjs/components/Tree/get-children-nodes-values/get-children-nodes-values.cjs +1 -0
  64. package/cjs/components/Tree/merge-async-children/merge-async-children.cjs +32 -0
  65. package/cjs/components/Tree/merge-async-children/merge-async-children.cjs.map +1 -0
  66. package/cjs/components/Tree/move-tree-node/move-tree-node.cjs +78 -0
  67. package/cjs/components/Tree/move-tree-node/move-tree-node.cjs.map +1 -0
  68. package/cjs/components/Tree/use-tree-node-drag-drop.cjs +127 -0
  69. package/cjs/components/Tree/use-tree-node-drag-drop.cjs.map +1 -0
  70. package/cjs/components/Tree/use-tree.cjs +176 -26
  71. package/cjs/components/Tree/use-tree.cjs.map +1 -1
  72. package/cjs/core/Box/Box.cjs +6 -2
  73. package/cjs/core/Box/Box.cjs.map +1 -1
  74. package/cjs/core/InlineStyles/InlineStyles.cjs +14 -2
  75. package/cjs/core/InlineStyles/InlineStyles.cjs.map +1 -1
  76. package/cjs/core/InlineStyles/hash-styles.cjs +15 -0
  77. package/cjs/core/InlineStyles/hash-styles.cjs.map +1 -0
  78. package/cjs/core/MantineProvider/Mantine.context.cjs +4 -0
  79. package/cjs/core/MantineProvider/Mantine.context.cjs.map +1 -1
  80. package/cjs/core/MantineProvider/MantineProvider.cjs +3 -2
  81. package/cjs/core/MantineProvider/MantineProvider.cjs.map +1 -1
  82. package/cjs/core/styles-api/use-resolved-styles-api/use-resolved-styles-api.cjs +2 -2
  83. package/cjs/core/styles-api/use-resolved-styles-api/use-resolved-styles-api.cjs.map +1 -1
  84. package/cjs/index.cjs +16 -0
  85. package/esm/components/Blockquote/Blockquote.mjs +5 -6
  86. package/esm/components/Blockquote/Blockquote.mjs.map +1 -1
  87. package/esm/components/Card/Card.mjs +1 -1
  88. package/esm/components/Card/Card.mjs.map +1 -1
  89. package/esm/components/Combobox/ComboboxClearButton/ComboboxClearButton.mjs +1 -1
  90. package/esm/components/Combobox/ComboboxClearButton/ComboboxClearButton.mjs.map +1 -1
  91. package/esm/components/Combobox/ComboboxEventsTarget/ComboboxEventsTarget.mjs +1 -0
  92. package/esm/components/Combobox/ComboboxEventsTarget/ComboboxEventsTarget.mjs.map +1 -1
  93. package/esm/components/Combobox/ComboboxSearch/ComboboxSearch.mjs +2 -1
  94. package/esm/components/Combobox/ComboboxSearch/ComboboxSearch.mjs.map +1 -1
  95. package/esm/components/Combobox/ComboboxTarget/ComboboxTarget.mjs +1 -0
  96. package/esm/components/Combobox/ComboboxTarget/ComboboxTarget.mjs.map +1 -1
  97. package/esm/components/Combobox/use-combobox-target-props/use-combobox-target-props.mjs +18 -12
  98. package/esm/components/Combobox/use-combobox-target-props/use-combobox-target-props.mjs.map +1 -1
  99. package/esm/components/Flex/Flex.mjs +7 -2
  100. package/esm/components/Flex/Flex.mjs.map +1 -1
  101. package/esm/components/FloatingIndicator/FloatingIndicator.mjs +1 -2
  102. package/esm/components/FloatingIndicator/FloatingIndicator.mjs.map +1 -1
  103. package/esm/components/Highlight/highlighter/highlighter.mjs +3 -3
  104. package/esm/components/Highlight/highlighter/highlighter.mjs.map +1 -1
  105. package/esm/components/MaskInput/MaskInput.mjs +23 -0
  106. package/esm/components/MaskInput/MaskInput.mjs.map +1 -0
  107. package/esm/components/MaskInput/use-mask-input-props.mjs +28 -0
  108. package/esm/components/MaskInput/use-mask-input-props.mjs.map +1 -0
  109. package/esm/components/MultiSelect/MultiSelect.mjs.map +1 -1
  110. package/esm/components/PasswordInput/PasswordInput.mjs +1 -1
  111. package/esm/components/PasswordInput/PasswordInput.mjs.map +1 -1
  112. package/esm/components/Popover/Popover.context.mjs.map +1 -1
  113. package/esm/components/Popover/PopoverDropdown/PopoverDropdown.mjs +1 -1
  114. package/esm/components/Popover/PopoverDropdown/PopoverDropdown.mjs.map +1 -1
  115. package/esm/components/Radio/Radio.module.mjs.map +1 -1
  116. package/esm/components/Rating/Rating.mjs +1 -2
  117. package/esm/components/Rating/Rating.mjs.map +1 -1
  118. package/esm/components/ScrollArea/ScrollArea.mjs +25 -11
  119. package/esm/components/ScrollArea/ScrollArea.mjs.map +1 -1
  120. package/esm/components/Select/Select.mjs.map +1 -1
  121. package/esm/components/SemiCircleProgress/SemiCircleProgress.mjs +2 -0
  122. package/esm/components/SemiCircleProgress/SemiCircleProgress.mjs.map +1 -1
  123. package/esm/components/Slider/Marks/Marks.mjs +3 -2
  124. package/esm/components/Slider/Marks/Marks.mjs.map +1 -1
  125. package/esm/components/Slider/Marks/is-mark-filled.mjs +2 -1
  126. package/esm/components/Slider/Marks/is-mark-filled.mjs.map +1 -1
  127. package/esm/components/Slider/Slider/Slider.mjs +12 -3
  128. package/esm/components/Slider/Slider/Slider.mjs.map +1 -1
  129. package/esm/components/Slider/Track/Track.mjs +3 -2
  130. package/esm/components/Slider/Track/Track.mjs.map +1 -1
  131. package/esm/components/Tabs/Tabs.context.mjs.map +1 -1
  132. package/esm/components/Tabs/Tabs.mjs +3 -1
  133. package/esm/components/Tabs/Tabs.mjs.map +1 -1
  134. package/esm/components/Tabs/TabsPanel/TabsPanel.mjs +2 -1
  135. package/esm/components/Tabs/TabsPanel/TabsPanel.mjs.map +1 -1
  136. package/esm/components/Tree/FlatTreeNode.mjs +102 -0
  137. package/esm/components/Tree/FlatTreeNode.mjs.map +1 -0
  138. package/esm/components/Tree/Tree.mjs +13 -3
  139. package/esm/components/Tree/Tree.mjs.map +1 -1
  140. package/esm/components/Tree/Tree.module.mjs.map +1 -1
  141. package/esm/components/Tree/TreeNode.mjs +70 -27
  142. package/esm/components/Tree/TreeNode.mjs.map +1 -1
  143. package/esm/components/Tree/filter-tree-data/filter-tree-data.mjs +22 -0
  144. package/esm/components/Tree/filter-tree-data/filter-tree-data.mjs.map +1 -0
  145. package/esm/components/Tree/flatten-tree-data/flatten-tree-data.mjs +28 -0
  146. package/esm/components/Tree/flatten-tree-data/flatten-tree-data.mjs.map +1 -0
  147. package/esm/components/Tree/get-children-nodes-values/get-children-nodes-values.mjs +1 -1
  148. package/esm/components/Tree/merge-async-children/merge-async-children.mjs +32 -0
  149. package/esm/components/Tree/merge-async-children/merge-async-children.mjs.map +1 -0
  150. package/esm/components/Tree/move-tree-node/move-tree-node.mjs +78 -0
  151. package/esm/components/Tree/move-tree-node/move-tree-node.mjs.map +1 -0
  152. package/esm/components/Tree/use-tree-node-drag-drop.mjs +126 -0
  153. package/esm/components/Tree/use-tree-node-drag-drop.mjs.map +1 -0
  154. package/esm/components/Tree/use-tree.mjs +177 -27
  155. package/esm/components/Tree/use-tree.mjs.map +1 -1
  156. package/esm/core/Box/Box.mjs +7 -3
  157. package/esm/core/Box/Box.mjs.map +1 -1
  158. package/esm/core/InlineStyles/InlineStyles.mjs +14 -2
  159. package/esm/core/InlineStyles/InlineStyles.mjs.map +1 -1
  160. package/esm/core/InlineStyles/hash-styles.mjs +15 -0
  161. package/esm/core/InlineStyles/hash-styles.mjs.map +1 -0
  162. package/esm/core/MantineProvider/Mantine.context.mjs +4 -1
  163. package/esm/core/MantineProvider/Mantine.context.mjs.map +1 -1
  164. package/esm/core/MantineProvider/MantineProvider.mjs +3 -2
  165. package/esm/core/MantineProvider/MantineProvider.mjs.map +1 -1
  166. package/esm/core/styles-api/use-resolved-styles-api/use-resolved-styles-api.mjs +2 -2
  167. package/esm/core/styles-api/use-resolved-styles-api/use-resolved-styles-api.mjs.map +1 -1
  168. package/esm/index.mjs +9 -2
  169. package/lib/components/Combobox/ComboboxClearButton/ComboboxClearButton.d.ts +1 -1
  170. package/lib/components/Combobox/use-combobox-target-props/use-combobox-target-props.d.ts +3 -1
  171. package/lib/components/MaskInput/MaskInput.d.ts +68 -0
  172. package/lib/components/MaskInput/index.d.ts +7 -0
  173. package/lib/components/MaskInput/use-mask-input-props.d.ts +428 -0
  174. package/lib/components/MultiSelect/MultiSelect.d.ts +1 -1
  175. package/lib/components/Popover/Popover.context.d.ts +1 -1
  176. package/lib/components/Select/Select.d.ts +1 -1
  177. package/lib/components/Slider/Marks/Marks.d.ts +2 -1
  178. package/lib/components/Slider/Marks/is-mark-filled.d.ts +2 -1
  179. package/lib/components/Slider/Slider/Slider.d.ts +2 -0
  180. package/lib/components/Slider/Track/Track.d.ts +2 -1
  181. package/lib/components/Tabs/Tabs.context.d.ts +1 -0
  182. package/lib/components/Tabs/Tabs.d.ts +2 -0
  183. package/lib/components/Tree/FlatTreeNode.d.ts +31 -0
  184. package/lib/components/Tree/Tree.d.ts +31 -1
  185. package/lib/components/Tree/TreeNode.d.ts +9 -2
  186. package/lib/components/Tree/filter-tree-data/filter-tree-data.d.ts +4 -0
  187. package/lib/components/Tree/flatten-tree-data/flatten-tree-data.d.ts +15 -0
  188. package/lib/components/Tree/index.d.ts +10 -0
  189. package/lib/components/Tree/merge-async-children/merge-async-children.d.ts +2 -0
  190. package/lib/components/Tree/move-tree-node/move-tree-node.d.ts +11 -0
  191. package/lib/components/Tree/use-tree-node-drag-drop.d.ts +30 -0
  192. package/lib/components/Tree/use-tree.d.ts +19 -1
  193. package/lib/components/index.d.ts +1 -0
  194. package/lib/core/InlineStyles/InlineStyles.d.ts +2 -1
  195. package/lib/core/InlineStyles/hash-styles.d.ts +2 -0
  196. package/lib/core/InlineStyles/index.d.ts +1 -0
  197. package/lib/core/MantineProvider/Mantine.context.d.ts +2 -0
  198. package/lib/core/MantineProvider/MantineProvider.d.ts +3 -1
  199. package/lib/core/MantineProvider/index.d.ts +1 -1
  200. package/lib/core/styles-api/use-resolved-styles-api/use-resolved-styles-api.d.ts +2 -2
  201. package/package.json +5 -5
  202. package/styles/Radio.css +3 -2
  203. package/styles/Radio.layer.css +3 -2
  204. package/styles/Tree.css +66 -0
  205. package/styles/Tree.layer.css +66 -0
  206. package/styles.css +69 -2
  207. package/styles.layer.css +69 -2
@@ -65,6 +65,8 @@ const SemiCircleProgress = require_factory.factory((_props) => {
65
65
  "data-orientation": orientation,
66
66
  children: label
67
67
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
68
+ width: size,
69
+ height: size / 2,
68
70
  viewBox: `0 0 ${size} ${size / 2}`,
69
71
  ...getStyles("svg"),
70
72
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
@@ -1 +1 @@
1
- {"version":3,"file":"SemiCircleProgress.cjs","names":["createVarsResolver","getThemeColor","rem","factory","useProps","useStyles","Box","classes"],"sources":["../../../src/components/SemiCircleProgress/SemiCircleProgress.tsx"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getThemeColor,\n MantineColor,\n rem,\n StylesApiProps,\n useProps,\n useStyles,\n} from '../../core';\nimport classes from './SemiCircleProgress.module.css';\n\nexport type SemiCircleProgressStylesNames =\n | 'root'\n | 'svg'\n | 'emptySegment'\n | 'filledSegment'\n | 'label';\n\nexport type SemiCircleProgressCssVariables = {\n root:\n | '--scp-filled-segment-color'\n | '--scp-empty-segment-color'\n | '--scp-rotation'\n | '--scp-transition-duration'\n | '--scp-thickness';\n};\n\nexport interface SemiCircleProgressProps\n extends BoxProps, StylesApiProps<SemiCircleProgressFactory>, ElementProps<'div'> {\n /** Progress value from `0` to `100` */\n value: number;\n\n /** Width of the component and diameter of the full circle in px. The visible SVG height will be size/2 @default 200 */\n size?: number;\n\n /** Stroke width of the circle segments in px @default 12 */\n thickness?: number;\n\n /** Orientation of the circle @default 'up' */\n orientation?: 'up' | 'down';\n\n /** Direction from which the circle is filled @default 'left-to-right' */\n fillDirection?: 'right-to-left' | 'left-to-right';\n\n /** Key of `theme.colors` or any valid CSS color value @default theme.primaryColor */\n filledSegmentColor?: MantineColor;\n\n /** Key of `theme.colors` or any valid CSS color value @default 'gray.2' in light mode, 'dark.4' in dark mode */\n emptySegmentColor?: MantineColor;\n\n /** Transition duration for the filled segment progress changes in ms. Does not affect color transitions @default 0 */\n transitionDuration?: number;\n\n /** Label rendered inside the circle */\n label?: React.ReactNode;\n\n /** Label position relative to the circle center @default 'bottom' */\n labelPosition?: 'center' | 'bottom';\n}\n\nexport type SemiCircleProgressFactory = Factory<{\n props: SemiCircleProgressProps;\n ref: HTMLDivElement;\n stylesNames: SemiCircleProgressStylesNames;\n vars: SemiCircleProgressCssVariables;\n}>;\n\nconst defaultProps = {\n size: 200,\n thickness: 12,\n orientation: 'up',\n fillDirection: 'left-to-right',\n labelPosition: 'bottom',\n} satisfies Partial<SemiCircleProgressProps>;\n\nfunction getRotation({\n orientation,\n fillDirection,\n}: Pick<SemiCircleProgressProps, 'orientation' | 'fillDirection'>) {\n if (orientation === 'down') {\n if (fillDirection === 'right-to-left') {\n return 'rotate(180deg) rotateY(180deg)';\n }\n return 'rotate(180deg)';\n }\n if (fillDirection === 'left-to-right') {\n return 'rotateY(180deg)';\n }\n\n return undefined;\n}\n\nconst varsResolver = createVarsResolver<SemiCircleProgressFactory>(\n (\n theme,\n {\n filledSegmentColor,\n emptySegmentColor,\n orientation,\n fillDirection,\n transitionDuration,\n thickness,\n }\n ) => ({\n root: {\n '--scp-filled-segment-color': filledSegmentColor\n ? getThemeColor(filledSegmentColor, theme)\n : undefined,\n '--scp-empty-segment-color': emptySegmentColor\n ? getThemeColor(emptySegmentColor, theme)\n : undefined,\n '--scp-rotation': getRotation({ orientation, fillDirection }),\n '--scp-transition-duration': transitionDuration ? `${transitionDuration}ms` : undefined,\n '--scp-thickness': rem(thickness),\n },\n })\n);\n\nexport const SemiCircleProgress = factory<SemiCircleProgressFactory>((_props) => {\n const props = useProps('SemiCircleProgress', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n size,\n thickness,\n value,\n orientation,\n fillDirection,\n filledSegmentColor,\n emptySegmentColor,\n transitionDuration,\n label,\n labelPosition,\n attributes,\n ...others\n } = props;\n\n const getStyles = useStyles<SemiCircleProgressFactory>({\n name: 'SemiCircleProgress',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const coordinateForCircle = size / 2;\n const radius = (size - 2 * thickness) / 2;\n const circumference = Math.PI * radius;\n const semiCirclePercentage = clamp(value, 0, 100) * (circumference / 100);\n\n return (\n <Box size={size} {...getStyles('root')} {...others}>\n {label && (\n <div {...getStyles('label')} data-position={labelPosition} data-orientation={orientation}>\n {label}\n </div>\n )}\n\n <svg viewBox={`0 0 ${size} ${size / 2}`} {...getStyles('svg')}>\n <circle\n cx={coordinateForCircle}\n cy={coordinateForCircle}\n r={radius}\n fill=\"none\"\n stroke=\"var(--scp-empty-segment-color)\"\n strokeWidth={thickness}\n strokeDasharray={circumference}\n {...getStyles('emptySegment', { style: { strokeDashoffset: circumference } })}\n />\n\n <circle\n cx={coordinateForCircle}\n cy={coordinateForCircle}\n r={radius}\n fill=\"none\"\n stroke=\"var(--scp-filled-segment-color)\"\n strokeWidth={thickness}\n strokeDasharray={circumference}\n {...getStyles('filledSegment', { style: { strokeDashoffset: semiCirclePercentage } })}\n />\n </svg>\n </Box>\n );\n});\n\nSemiCircleProgress.displayName = '@mantine/core/SemiCircleProgress';\nSemiCircleProgress.classes = classes;\nSemiCircleProgress.varsResolver = varsResolver;\n\nexport namespace SemiCircleProgress {\n export type Props = SemiCircleProgressProps;\n export type StylesNames = SemiCircleProgressStylesNames;\n export type CssVariables = SemiCircleProgressCssVariables;\n export type Factory = SemiCircleProgressFactory;\n}\n"],"mappings":";;;;;;;;;;;;;AAyEA,MAAM,eAAe;CACnB,MAAM;CACN,WAAW;CACX,aAAa;CACb,eAAe;CACf,eAAe;CAChB;AAED,SAAS,YAAY,EACnB,aACA,iBACiE;AACjE,KAAI,gBAAgB,QAAQ;AAC1B,MAAI,kBAAkB,gBACpB,QAAO;AAET,SAAO;;AAET,KAAI,kBAAkB,gBACpB,QAAO;;AAMX,MAAM,eAAeA,6BAAAA,oBAEjB,OACA,EACE,oBACA,mBACA,aACA,eACA,oBACA,iBAEE,EACJ,MAAM;CACJ,8BAA8B,qBAC1BC,wBAAAA,cAAc,oBAAoB,MAAM,GACxC,KAAA;CACJ,6BAA6B,oBACzBA,wBAAAA,cAAc,mBAAmB,MAAM,GACvC,KAAA;CACJ,kBAAkB,YAAY;EAAE;EAAa;EAAe,CAAC;CAC7D,6BAA6B,qBAAqB,GAAG,mBAAmB,MAAM,KAAA;CAC9E,mBAAmBC,YAAAA,IAAI,UAAU;CAClC,EACF,EACF;AAED,MAAa,qBAAqBC,gBAAAA,SAAoC,WAAW;CAC/E,MAAM,QAAQC,kBAAAA,SAAS,sBAAsB,cAAc,OAAO;CAClE,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,MACA,WACA,OACA,aACA,eACA,oBACA,mBACA,oBACA,OACA,eACA,YACA,GAAG,WACD;CAEJ,MAAM,YAAYC,mBAAAA,UAAqC;EACrD,MAAM;EACN,SAAA,kCAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,sBAAsB,OAAO;CACnC,MAAM,UAAU,OAAO,IAAI,aAAa;CACxC,MAAM,gBAAgB,KAAK,KAAK;CAChC,MAAM,wBAAA,GAAA,eAAA,OAA6B,OAAO,GAAG,IAAI,IAAI,gBAAgB;AAErE,QACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,KAAD;EAAW;EAAM,GAAI,UAAU,OAAO;EAAE,GAAI;YAA5C,CACG,SACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,GAAI,UAAU,QAAQ;GAAE,iBAAe;GAAe,oBAAkB;aAC1E;GACG,CAAA,EAGR,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,SAAS,OAAO,KAAK,GAAG,OAAO;GAAK,GAAI,UAAU,MAAM;aAA7D,CACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,iBAAiB;IACjB,GAAI,UAAU,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,eAAe,EAAE,CAAC;IAC7E,CAAA,EAEF,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,iBAAiB;IACjB,GAAI,UAAU,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,sBAAsB,EAAE,CAAC;IACrF,CAAA,CACE;KACF;;EAER;AAEF,mBAAmB,cAAc;AACjC,mBAAmB,UAAUC,kCAAAA;AAC7B,mBAAmB,eAAe"}
1
+ {"version":3,"file":"SemiCircleProgress.cjs","names":["createVarsResolver","getThemeColor","rem","factory","useProps","useStyles","Box","classes"],"sources":["../../../src/components/SemiCircleProgress/SemiCircleProgress.tsx"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getThemeColor,\n MantineColor,\n rem,\n StylesApiProps,\n useProps,\n useStyles,\n} from '../../core';\nimport classes from './SemiCircleProgress.module.css';\n\nexport type SemiCircleProgressStylesNames =\n | 'root'\n | 'svg'\n | 'emptySegment'\n | 'filledSegment'\n | 'label';\n\nexport type SemiCircleProgressCssVariables = {\n root:\n | '--scp-filled-segment-color'\n | '--scp-empty-segment-color'\n | '--scp-rotation'\n | '--scp-transition-duration'\n | '--scp-thickness';\n};\n\nexport interface SemiCircleProgressProps\n extends BoxProps, StylesApiProps<SemiCircleProgressFactory>, ElementProps<'div'> {\n /** Progress value from `0` to `100` */\n value: number;\n\n /** Width of the component and diameter of the full circle in px. The visible SVG height will be size/2 @default 200 */\n size?: number;\n\n /** Stroke width of the circle segments in px @default 12 */\n thickness?: number;\n\n /** Orientation of the circle @default 'up' */\n orientation?: 'up' | 'down';\n\n /** Direction from which the circle is filled @default 'left-to-right' */\n fillDirection?: 'right-to-left' | 'left-to-right';\n\n /** Key of `theme.colors` or any valid CSS color value @default theme.primaryColor */\n filledSegmentColor?: MantineColor;\n\n /** Key of `theme.colors` or any valid CSS color value @default 'gray.2' in light mode, 'dark.4' in dark mode */\n emptySegmentColor?: MantineColor;\n\n /** Transition duration for the filled segment progress changes in ms. Does not affect color transitions @default 0 */\n transitionDuration?: number;\n\n /** Label rendered inside the circle */\n label?: React.ReactNode;\n\n /** Label position relative to the circle center @default 'bottom' */\n labelPosition?: 'center' | 'bottom';\n}\n\nexport type SemiCircleProgressFactory = Factory<{\n props: SemiCircleProgressProps;\n ref: HTMLDivElement;\n stylesNames: SemiCircleProgressStylesNames;\n vars: SemiCircleProgressCssVariables;\n}>;\n\nconst defaultProps = {\n size: 200,\n thickness: 12,\n orientation: 'up',\n fillDirection: 'left-to-right',\n labelPosition: 'bottom',\n} satisfies Partial<SemiCircleProgressProps>;\n\nfunction getRotation({\n orientation,\n fillDirection,\n}: Pick<SemiCircleProgressProps, 'orientation' | 'fillDirection'>) {\n if (orientation === 'down') {\n if (fillDirection === 'right-to-left') {\n return 'rotate(180deg) rotateY(180deg)';\n }\n return 'rotate(180deg)';\n }\n if (fillDirection === 'left-to-right') {\n return 'rotateY(180deg)';\n }\n\n return undefined;\n}\n\nconst varsResolver = createVarsResolver<SemiCircleProgressFactory>(\n (\n theme,\n {\n filledSegmentColor,\n emptySegmentColor,\n orientation,\n fillDirection,\n transitionDuration,\n thickness,\n }\n ) => ({\n root: {\n '--scp-filled-segment-color': filledSegmentColor\n ? getThemeColor(filledSegmentColor, theme)\n : undefined,\n '--scp-empty-segment-color': emptySegmentColor\n ? getThemeColor(emptySegmentColor, theme)\n : undefined,\n '--scp-rotation': getRotation({ orientation, fillDirection }),\n '--scp-transition-duration': transitionDuration ? `${transitionDuration}ms` : undefined,\n '--scp-thickness': rem(thickness),\n },\n })\n);\n\nexport const SemiCircleProgress = factory<SemiCircleProgressFactory>((_props) => {\n const props = useProps('SemiCircleProgress', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n size,\n thickness,\n value,\n orientation,\n fillDirection,\n filledSegmentColor,\n emptySegmentColor,\n transitionDuration,\n label,\n labelPosition,\n attributes,\n ...others\n } = props;\n\n const getStyles = useStyles<SemiCircleProgressFactory>({\n name: 'SemiCircleProgress',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const coordinateForCircle = size / 2;\n const radius = (size - 2 * thickness) / 2;\n const circumference = Math.PI * radius;\n const semiCirclePercentage = clamp(value, 0, 100) * (circumference / 100);\n\n return (\n <Box size={size} {...getStyles('root')} {...others}>\n {label && (\n <div {...getStyles('label')} data-position={labelPosition} data-orientation={orientation}>\n {label}\n </div>\n )}\n\n <svg width={size} height={size / 2} viewBox={`0 0 ${size} ${size / 2}`} {...getStyles('svg')}>\n <circle\n cx={coordinateForCircle}\n cy={coordinateForCircle}\n r={radius}\n fill=\"none\"\n stroke=\"var(--scp-empty-segment-color)\"\n strokeWidth={thickness}\n strokeDasharray={circumference}\n {...getStyles('emptySegment', { style: { strokeDashoffset: circumference } })}\n />\n\n <circle\n cx={coordinateForCircle}\n cy={coordinateForCircle}\n r={radius}\n fill=\"none\"\n stroke=\"var(--scp-filled-segment-color)\"\n strokeWidth={thickness}\n strokeDasharray={circumference}\n {...getStyles('filledSegment', { style: { strokeDashoffset: semiCirclePercentage } })}\n />\n </svg>\n </Box>\n );\n});\n\nSemiCircleProgress.displayName = '@mantine/core/SemiCircleProgress';\nSemiCircleProgress.classes = classes;\nSemiCircleProgress.varsResolver = varsResolver;\n\nexport namespace SemiCircleProgress {\n export type Props = SemiCircleProgressProps;\n export type StylesNames = SemiCircleProgressStylesNames;\n export type CssVariables = SemiCircleProgressCssVariables;\n export type Factory = SemiCircleProgressFactory;\n}\n"],"mappings":";;;;;;;;;;;;;AAyEA,MAAM,eAAe;CACnB,MAAM;CACN,WAAW;CACX,aAAa;CACb,eAAe;CACf,eAAe;CAChB;AAED,SAAS,YAAY,EACnB,aACA,iBACiE;AACjE,KAAI,gBAAgB,QAAQ;AAC1B,MAAI,kBAAkB,gBACpB,QAAO;AAET,SAAO;;AAET,KAAI,kBAAkB,gBACpB,QAAO;;AAMX,MAAM,eAAeA,6BAAAA,oBAEjB,OACA,EACE,oBACA,mBACA,aACA,eACA,oBACA,iBAEE,EACJ,MAAM;CACJ,8BAA8B,qBAC1BC,wBAAAA,cAAc,oBAAoB,MAAM,GACxC,KAAA;CACJ,6BAA6B,oBACzBA,wBAAAA,cAAc,mBAAmB,MAAM,GACvC,KAAA;CACJ,kBAAkB,YAAY;EAAE;EAAa;EAAe,CAAC;CAC7D,6BAA6B,qBAAqB,GAAG,mBAAmB,MAAM,KAAA;CAC9E,mBAAmBC,YAAAA,IAAI,UAAU;CAClC,EACF,EACF;AAED,MAAa,qBAAqBC,gBAAAA,SAAoC,WAAW;CAC/E,MAAM,QAAQC,kBAAAA,SAAS,sBAAsB,cAAc,OAAO;CAClE,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,MACA,WACA,OACA,aACA,eACA,oBACA,mBACA,oBACA,OACA,eACA,YACA,GAAG,WACD;CAEJ,MAAM,YAAYC,mBAAAA,UAAqC;EACrD,MAAM;EACN,SAAA,kCAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,sBAAsB,OAAO;CACnC,MAAM,UAAU,OAAO,IAAI,aAAa;CACxC,MAAM,gBAAgB,KAAK,KAAK;CAChC,MAAM,wBAAA,GAAA,eAAA,OAA6B,OAAO,GAAG,IAAI,IAAI,gBAAgB;AAErE,QACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,KAAD;EAAW;EAAM,GAAI,UAAU,OAAO;EAAE,GAAI;YAA5C,CACG,SACC,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,GAAI,UAAU,QAAQ;GAAE,iBAAe;GAAe,oBAAkB;aAC1E;GACG,CAAA,EAGR,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,OAAO;GAAM,QAAQ,OAAO;GAAG,SAAS,OAAO,KAAK,GAAG,OAAO;GAAK,GAAI,UAAU,MAAM;aAA5F,CACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,iBAAiB;IACjB,GAAI,UAAU,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,eAAe,EAAE,CAAC;IAC7E,CAAA,EAEF,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,MAAK;IACL,QAAO;IACP,aAAa;IACb,iBAAiB;IACjB,GAAI,UAAU,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,sBAAsB,EAAE,CAAC;IACrF,CAAA,CACE;KACF;;EAER;AAEF,mBAAmB,cAAc;AACjC,mBAAmB,UAAUC,kCAAAA;AAC7B,mBAAmB,eAAe"}
@@ -7,7 +7,7 @@ const require_is_mark_filled = require("./is-mark-filled.cjs");
7
7
  let react = require("react");
8
8
  let react_jsx_runtime = require("react/jsx-runtime");
9
9
  //#region packages/@mantine/core/src/components/Slider/Marks/Marks.tsx
10
- function Marks({ marks, min, max, disabled, value, offset, inverted }) {
10
+ function Marks({ marks, min, max, disabled, value, offset, inverted, startPointValue }) {
11
11
  const { getStyles } = require_Slider_context.useSliderContext();
12
12
  if (!marks) return null;
13
13
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: marks.map((mark, index) => {
@@ -27,7 +27,8 @@ function Marks({ marks, min, max, disabled, value, offset, inverted }) {
27
27
  mark,
28
28
  value,
29
29
  offset,
30
- inverted
30
+ inverted,
31
+ startPointValue
31
32
  }),
32
33
  disabled
33
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Marks.cjs","names":["useSliderContext","Box","getPosition","isMarkFilled"],"sources":["../../../../src/components/Slider/Marks/Marks.tsx"],"sourcesContent":["import { Box } from '../../../core';\nimport { useSliderContext } from '../Slider.context';\nimport { SliderMark } from '../SliderMark';\nimport { getPosition } from '../utils/get-position/get-position';\nimport { isMarkFilled } from './is-mark-filled';\n\nexport interface MarksProps {\n marks: SliderMark[] | undefined;\n min: number;\n max: number;\n value: number;\n offset: number | undefined;\n disabled: boolean | undefined;\n inverted: boolean | undefined;\n}\n\nexport function Marks({ marks, min, max, disabled, value, offset, inverted }: MarksProps) {\n const { getStyles } = useSliderContext();\n\n if (!marks) {\n return null;\n }\n\n const items = marks.map((mark, index) => {\n if (mark.hidden) {\n return null;\n }\n\n return (\n <Box\n {...getStyles('markWrapper')}\n __vars={{ '--mark-offset': `${getPosition({ value: mark.value, min, max })}%` }}\n key={index}\n >\n <Box\n {...getStyles('mark')}\n mod={{ filled: isMarkFilled({ mark, value, offset, inverted }), disabled }}\n />\n {mark.label && <div {...getStyles('markLabel')}>{mark.label}</div>}\n </Box>\n );\n });\n\n return <div>{items}</div>;\n}\n\nMarks.displayName = '@mantine/core/SliderMarks';\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,MAAM,EAAE,OAAO,KAAK,KAAK,UAAU,OAAO,QAAQ,YAAwB;CACxF,MAAM,EAAE,cAAcA,uBAAAA,kBAAkB;AAExC,KAAI,CAAC,MACH,QAAO;AAuBT,QAAO,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAA,UApBO,MAAM,KAAK,MAAM,UAAU;AACvC,MAAI,KAAK,OACP,QAAO;AAGT,SACE,iBAAA,GAAA,MAAA,eAACC,YAAAA,KAAD;GACE,GAAI,UAAU,cAAc;GAC5B,QAAQ,EAAE,iBAAiB,GAAGC,qBAAAA,YAAY;IAAE,OAAO,KAAK;IAAO;IAAK;IAAK,CAAC,CAAC,IAAI;GAC/E,KAAK;GAOD,EALJ,iBAAA,GAAA,kBAAA,KAACD,YAAAA,KAAD;GACE,GAAI,UAAU,OAAO;GACrB,KAAK;IAAE,QAAQE,uBAAAA,aAAa;KAAE;KAAM;KAAO;KAAQ;KAAU,CAAC;IAAE;IAAU;GAC1E,CAAA,EACD,KAAK,SAAS,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,GAAI,UAAU,YAAY;aAAG,KAAK;GAAY,CAAA,CAC9D;GAER,EAEuB,CAAA;;AAG3B,MAAM,cAAc"}
1
+ {"version":3,"file":"Marks.cjs","names":["useSliderContext","Box","getPosition","isMarkFilled"],"sources":["../../../../src/components/Slider/Marks/Marks.tsx"],"sourcesContent":["import { Box } from '../../../core';\nimport { useSliderContext } from '../Slider.context';\nimport { SliderMark } from '../SliderMark';\nimport { getPosition } from '../utils/get-position/get-position';\nimport { isMarkFilled } from './is-mark-filled';\n\nexport interface MarksProps {\n marks: SliderMark[] | undefined;\n min: number;\n max: number;\n value: number;\n offset: number | undefined;\n disabled: boolean | undefined;\n inverted: boolean | undefined;\n startPointValue?: number;\n}\n\nexport function Marks({\n marks,\n min,\n max,\n disabled,\n value,\n offset,\n inverted,\n startPointValue,\n}: MarksProps) {\n const { getStyles } = useSliderContext();\n\n if (!marks) {\n return null;\n }\n\n const items = marks.map((mark, index) => {\n if (mark.hidden) {\n return null;\n }\n\n return (\n <Box\n {...getStyles('markWrapper')}\n __vars={{ '--mark-offset': `${getPosition({ value: mark.value, min, max })}%` }}\n key={index}\n >\n <Box\n {...getStyles('mark')}\n mod={{\n filled: isMarkFilled({ mark, value, offset, inverted, startPointValue }),\n disabled,\n }}\n />\n {mark.label && <div {...getStyles('markLabel')}>{mark.label}</div>}\n </Box>\n );\n });\n\n return <div>{items}</div>;\n}\n\nMarks.displayName = '@mantine/core/SliderMarks';\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,MAAM,EACpB,OACA,KACA,KACA,UACA,OACA,QACA,UACA,mBACa;CACb,MAAM,EAAE,cAAcA,uBAAAA,kBAAkB;AAExC,KAAI,CAAC,MACH,QAAO;AA0BT,QAAO,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAA,UAvBO,MAAM,KAAK,MAAM,UAAU;AACvC,MAAI,KAAK,OACP,QAAO;AAGT,SACE,iBAAA,GAAA,MAAA,eAACC,YAAAA,KAAD;GACE,GAAI,UAAU,cAAc;GAC5B,QAAQ,EAAE,iBAAiB,GAAGC,qBAAAA,YAAY;IAAE,OAAO,KAAK;IAAO;IAAK;IAAK,CAAC,CAAC,IAAI;GAC/E,KAAK;GAUD,EARJ,iBAAA,GAAA,kBAAA,KAACD,YAAAA,KAAD;GACE,GAAI,UAAU,OAAO;GACrB,KAAK;IACH,QAAQE,uBAAAA,aAAa;KAAE;KAAM;KAAO;KAAQ;KAAU;KAAiB,CAAC;IACxE;IACD;GACD,CAAA,EACD,KAAK,SAAS,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,GAAI,UAAU,YAAY;aAAG,KAAK;GAAY,CAAA,CAC9D;GAER,EAEuB,CAAA;;AAG3B,MAAM,cAAc"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  //#region packages/@mantine/core/src/components/Slider/Marks/is-mark-filled.ts
3
- function isMarkFilled({ mark, offset, value, inverted = false }) {
3
+ function isMarkFilled({ mark, offset, value, inverted = false, startPointValue }) {
4
+ if (typeof startPointValue === "number" && !inverted) return mark.value >= startPointValue && mark.value <= value || mark.value <= startPointValue && mark.value >= value;
4
5
  return inverted ? typeof offset === "number" ? mark.value <= offset || mark.value >= value : mark.value >= value : typeof offset === "number" ? mark.value >= offset && mark.value <= value : mark.value <= value;
5
6
  }
6
7
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"is-mark-filled.cjs","names":[],"sources":["../../../../src/components/Slider/Marks/is-mark-filled.ts"],"sourcesContent":["interface IsMarkFilled {\n mark: { value: number; label?: any };\n offset?: number;\n value: number;\n inverted?: boolean;\n}\n\nexport function isMarkFilled({ mark, offset, value, inverted = false }: IsMarkFilled) {\n return inverted\n ? typeof offset === 'number'\n ? mark.value <= offset || mark.value >= value\n : mark.value >= value\n : typeof offset === 'number'\n ? mark.value >= offset && mark.value <= value\n : mark.value <= value;\n}\n"],"mappings":";;AAOA,SAAgB,aAAa,EAAE,MAAM,QAAQ,OAAO,WAAW,SAAuB;AACpF,QAAO,WACH,OAAO,WAAW,WAChB,KAAK,SAAS,UAAU,KAAK,SAAS,QACtC,KAAK,SAAS,QAChB,OAAO,WAAW,WAChB,KAAK,SAAS,UAAU,KAAK,SAAS,QACtC,KAAK,SAAS"}
1
+ {"version":3,"file":"is-mark-filled.cjs","names":[],"sources":["../../../../src/components/Slider/Marks/is-mark-filled.ts"],"sourcesContent":["interface IsMarkFilled {\n mark: { value: number; label?: any };\n offset?: number;\n value: number;\n inverted?: boolean;\n startPointValue?: number;\n}\n\nexport function isMarkFilled({\n mark,\n offset,\n value,\n inverted = false,\n startPointValue,\n}: IsMarkFilled) {\n if (typeof startPointValue === 'number' && !inverted) {\n return (\n (mark.value >= startPointValue && mark.value <= value) ||\n (mark.value <= startPointValue && mark.value >= value)\n );\n }\n\n return inverted\n ? typeof offset === 'number'\n ? mark.value <= offset || mark.value >= value\n : mark.value >= value\n : typeof offset === 'number'\n ? mark.value >= offset && mark.value <= value\n : mark.value <= value;\n}\n"],"mappings":";;AAQA,SAAgB,aAAa,EAC3B,MACA,QACA,OACA,WAAW,OACX,mBACe;AACf,KAAI,OAAO,oBAAoB,YAAY,CAAC,SAC1C,QACG,KAAK,SAAS,mBAAmB,KAAK,SAAS,SAC/C,KAAK,SAAS,mBAAmB,KAAK,SAAS;AAIpD,QAAO,WACH,OAAO,WAAW,WAChB,KAAK,SAAS,UAAU,KAAK,SAAS,QACtC,KAAK,SAAS,QAChB,OAAO,WAAW,WAChB,KAAK,SAAS,UAAU,KAAK,SAAS,QACtC,KAAK,SAAS"}
@@ -47,7 +47,7 @@ const varsResolver = require_create_vars_resolver.createVarsResolver((theme, { s
47
47
  } }));
48
48
  const Slider = require_factory.factory((_props) => {
49
49
  const props = require_use_props.useProps("Slider", defaultProps, _props);
50
- const { classNames, styles, value, onChange, onChangeEnd, size, min, max, domain, step, precision: _precision, defaultValue, name, marks, label, labelTransitionProps, labelAlwaysOn, thumbLabel, showLabelOnHover, thumbChildren, disabled, unstyled, scale, inverted, orientation, className, style, vars, hiddenInputProps, restrictToMarks, thumbProps, attributes, ref, ...others } = props;
50
+ const { classNames, styles, value, onChange, onChangeEnd, size, min, max, domain, step, precision: _precision, defaultValue, name, marks, label, labelTransitionProps, labelAlwaysOn, thumbLabel, showLabelOnHover, thumbChildren, disabled, unstyled, scale, inverted, startPointValue, orientation, className, style, vars, hiddenInputProps, restrictToMarks, thumbProps, attributes, ref, ...others } = props;
51
51
  const getStyles = require_use_styles.useStyles({
52
52
  name: "Slider",
53
53
  props,
@@ -85,6 +85,14 @@ const Slider = require_factory.factory((_props) => {
85
85
  const scaledValue = scale(_value);
86
86
  const _label = typeof label === "function" ? label(scaledValue) : label;
87
87
  const precision = _precision ?? require_get_precision.getPrecision(step);
88
+ const hasStartPoint = typeof startPointValue === "number" && !inverted;
89
+ const startPosition = hasStartPoint ? require_get_position.getPosition({
90
+ value: startPointValue,
91
+ min: domainMin,
92
+ max: domainMax
93
+ }) : 0;
94
+ const trackOffset = hasStartPoint ? Math.min(position, startPosition) : 0;
95
+ const trackFilled = hasStartPoint ? Math.abs(position - startPosition) : position;
88
96
  const handleChange = (0, react.useCallback)(({ x }) => {
89
97
  if (!disabled) {
90
98
  const clampedValue = (0, _mantine_hooks.clamp)(require_get_change_value.getChangeValue({
@@ -217,12 +225,13 @@ const Slider = require_factory.factory((_props) => {
217
225
  orientation,
218
226
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Track.Track, {
219
227
  inverted,
220
- offset: 0,
221
- filled: position,
228
+ offset: trackOffset,
229
+ filled: trackFilled,
222
230
  marks,
223
231
  min: domainMin,
224
232
  max: domainMax,
225
233
  value: scaledValue,
234
+ startPointValue: hasStartPoint ? startPointValue : void 0,
226
235
  disabled,
227
236
  containerProps: {
228
237
  ref: container,
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.cjs","names":["createVarsResolver","getSize","getThemeColor","getRadius","rem","factory","useProps","useStyles","useDirection","getPosition","getPrecision","getChangeValue","findClosestNumber","getNextMarkValue","getFloatingValue","getPreviousMarkValue","getFirstMarkValue","getLastMarkValue","SliderProvider","SliderRoot","Track","Thumb","classes"],"sources":["../../../../src/components/Slider/Slider/Slider.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { clamp, useMergedRef, useMove, useUncontrolled } from '@mantine/hooks';\nimport {\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n findClosestNumber,\n getRadius,\n getSize,\n getThemeColor,\n MantineColor,\n MantineRadius,\n MantineSize,\n rem,\n StylesApiProps,\n useDirection,\n useProps,\n useStyles,\n} from '../../../core';\nimport { TransitionOverride } from '../../Transition';\nimport { SliderCssVariables, SliderProvider, SliderStylesNames } from '../Slider.context';\nimport { SliderMark } from '../SliderMark';\nimport { SliderRoot } from '../SliderRoot/SliderRoot';\nimport { Thumb } from '../Thumb/Thumb';\nimport { Track } from '../Track/Track';\nimport { getChangeValue } from '../utils/get-change-value/get-change-value';\nimport { getFloatingValue } from '../utils/get-floating-value/get-floating-value';\nimport { getPosition } from '../utils/get-position/get-position';\nimport { getPrecision } from '../utils/get-precision/get-precision';\nimport {\n getFirstMarkValue,\n getLastMarkValue,\n getNextMarkValue,\n getPreviousMarkValue,\n} from '../utils/get-step-mark-value/get-step-mark-value';\nimport classes from '../Slider.module.css';\n\nexport interface SliderProps\n extends BoxProps, StylesApiProps<SliderFactory>, ElementProps<'div', 'onChange'> {\n /** Key of `theme.colors` or any valid CSS color, controls color of track and thumb @default theme.primaryColor */\n color?: MantineColor;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius`, numbers are converted to rem @default 'xl' */\n radius?: MantineRadius;\n\n /** Controls size of the track @default 'md' */\n size?: MantineSize | (string & {}) | number;\n\n /** Minimal possible value @default 0 */\n min?: number;\n\n /** Maximum possible value @default 100 */\n max?: number;\n\n /** Domain of the slider, defines the selectable value range independently of min/max. Useful when you want to display a wider track range (min/max) but restrict actual selection to a subset (domain). @default [min, max] */\n domain?: [number, number];\n\n /** Number by which value will be incremented/decremented with thumb drag and arrows @default 1 */\n step?: number;\n\n /** Number of significant digits after the decimal point */\n precision?: number;\n\n /** Controlled component value */\n value?: number;\n\n /** Uncontrolled component default value */\n defaultValue?: number;\n\n /** Called when value changes */\n onChange?: (value: number) => void;\n\n /** Called when user stops dragging slider or changes value with arrows */\n onChangeEnd?: (value: number) => void;\n\n /** Hidden input name, use with uncontrolled component */\n name?: string;\n\n /** Marks displayed on the track */\n marks?: SliderMark[];\n\n /** Function to generate label or any react node to render instead, set to null to disable label */\n label?: React.ReactNode | ((value: number) => React.ReactNode);\n\n /** Props passed down to the `Transition` component @default { transition: 'fade', duration: 0 } */\n labelTransitionProps?: TransitionOverride;\n\n /** Determines whether the label should be visible when the slider is not being dragged or hovered @default false */\n labelAlwaysOn?: boolean;\n\n /** Thumb `aria-label` */\n thumbLabel?: string;\n\n /** Determines whether the label should be displayed when the slider is hovered @default true */\n showLabelOnHover?: boolean;\n\n /** Content rendered inside thumb */\n thumbChildren?: React.ReactNode;\n\n /** Disables slider */\n disabled?: boolean;\n\n /** Thumb `width` and `height`, by default value is computed based on `size` prop */\n thumbSize?: number | string;\n\n /** A transformation function to change the scale of the slider */\n scale?: (value: number) => number;\n\n /** Determines whether track value representation should be inverted @default false */\n inverted?: boolean;\n\n /** Slider orientation @default 'horizontal' */\n orientation?: 'horizontal' | 'vertical';\n\n /** Props passed down to the hidden input */\n hiddenInputProps?: React.ComponentProps<'input'>;\n\n /** Determines whether the selection should be only allowed from the given marks array @default false */\n restrictToMarks?: boolean;\n\n /** Props passed down to thumb element */\n thumbProps?: React.ComponentProps<'div'>;\n}\n\nexport type SliderFactory = Factory<{\n props: SliderProps;\n ref: HTMLDivElement;\n stylesNames: SliderStylesNames;\n vars: SliderCssVariables;\n}>;\n\nconst defaultProps = {\n radius: 'xl',\n min: 0,\n max: 100,\n step: 1,\n marks: [],\n label: (f) => f,\n labelTransitionProps: { transition: 'fade', duration: 0 },\n thumbLabel: '',\n showLabelOnHover: true,\n scale: (v) => v,\n size: 'md',\n} satisfies Partial<SliderProps>;\n\nconst varsResolver = createVarsResolver<SliderFactory>(\n (theme, { size, color, thumbSize, radius }) => ({\n root: {\n '--slider-size': getSize(size, 'slider-size'),\n '--slider-color': color ? getThemeColor(color, theme) : undefined,\n '--slider-radius': radius === undefined ? undefined : getRadius(radius),\n '--slider-thumb-size':\n thumbSize !== undefined ? rem(thumbSize) : 'calc(var(--slider-size) * 2)',\n },\n })\n);\n\nexport const Slider = factory<SliderFactory>((_props) => {\n const props = useProps('Slider', defaultProps, _props);\n const {\n classNames,\n styles,\n value,\n onChange,\n onChangeEnd,\n size,\n min,\n max,\n domain,\n step,\n precision: _precision,\n defaultValue,\n name,\n marks,\n label,\n labelTransitionProps,\n labelAlwaysOn,\n thumbLabel,\n showLabelOnHover,\n thumbChildren,\n disabled,\n unstyled,\n scale,\n inverted,\n orientation,\n className,\n style,\n vars,\n hiddenInputProps,\n restrictToMarks,\n thumbProps,\n attributes,\n ref,\n ...others\n } = props;\n\n const getStyles = useStyles<SliderFactory>({\n name: 'Slider',\n props,\n classes,\n classNames,\n className,\n styles,\n style,\n attributes,\n vars,\n varsResolver,\n unstyled,\n });\n\n const { dir } = useDirection();\n const [hovered, setHovered] = useState(false);\n const [_value, setValue] = useUncontrolled({\n value: typeof value === 'number' ? clamp(value, min, max) : value,\n defaultValue: typeof defaultValue === 'number' ? clamp(defaultValue, min, max) : defaultValue,\n finalValue: clamp(0, min, max),\n onChange,\n });\n\n const valueRef = useRef(_value);\n const onChangeEndRef = useRef(onChangeEnd);\n\n useEffect(() => {\n onChangeEndRef.current = onChangeEnd;\n }, [onChangeEnd]);\n\n const root = useRef<HTMLDivElement>(null);\n const thumb = useRef<HTMLDivElement>(null);\n const [domainMin, domainMax] = domain || [min, max];\n const position = getPosition({ value: _value, min: domainMin, max: domainMax });\n const scaledValue = scale!(_value);\n const _label = typeof label === 'function' ? label(scaledValue) : label;\n const precision = _precision ?? getPrecision(step);\n\n const handleChange = useCallback(\n ({ x }: { x: number }) => {\n if (!disabled) {\n const nextValue = getChangeValue({\n value: x,\n min: domainMin,\n max: domainMax,\n step,\n precision,\n });\n const clampedValue = clamp(nextValue, min!, max!);\n setValue(\n restrictToMarks && marks?.length\n ? findClosestNumber(\n clampedValue,\n marks.map((mark) => mark.value)\n )\n : clampedValue\n );\n valueRef.current = clampedValue;\n }\n },\n [disabled, min, max, domainMin, domainMax, step, precision, setValue, marks, restrictToMarks]\n );\n\n const handleScrubEnd = useCallback(() => {\n if (!disabled && onChangeEndRef.current) {\n const finalValue =\n restrictToMarks && marks?.length\n ? findClosestNumber(\n valueRef.current,\n marks.map((mark) => mark.value)\n )\n : valueRef.current;\n onChangeEndRef.current(finalValue);\n }\n }, [disabled, marks, restrictToMarks]);\n\n const { ref: container, active } = useMove(\n ({ x, y }) => handleChange({ x: orientation === 'vertical' ? 1 - y : x }),\n { onScrubEnd: handleScrubEnd },\n dir\n );\n\n const callOnChangeEnd = useCallback(\n (value: number) => {\n if (!disabled && onChangeEndRef.current) {\n onChangeEndRef.current(value);\n }\n },\n [disabled]\n );\n\n const handleTrackKeydownCapture = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!disabled) {\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue = getNextMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(_value + step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'ArrowRight': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue =\n dir === 'rtl' ? getPreviousMarkValue(_value, marks) : getNextMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(dir === 'rtl' ? _value - step : _value + step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'ArrowDown': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue = getPreviousMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(_value - step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'ArrowLeft': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue =\n dir === 'rtl' ? getNextMarkValue(_value, marks) : getPreviousMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(dir === 'rtl' ? _value + step : _value - step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'Home': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n setValue(getFirstMarkValue(marks));\n callOnChangeEnd(getFirstMarkValue(marks));\n break;\n }\n\n setValue(min);\n callOnChangeEnd(min);\n break;\n }\n\n case 'End': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n setValue(getLastMarkValue(marks));\n callOnChangeEnd(getLastMarkValue(marks));\n break;\n }\n\n setValue(max);\n callOnChangeEnd(max);\n break;\n }\n\n default: {\n break;\n }\n }\n }\n };\n\n return (\n <SliderProvider value={{ getStyles }}>\n <SliderRoot\n {...others}\n ref={useMergedRef(ref, root)}\n onKeyDownCapture={handleTrackKeydownCapture}\n onMouseDownCapture={() => root.current?.focus()}\n size={size}\n disabled={disabled}\n orientation={orientation}\n >\n <Track\n inverted={inverted}\n offset={0}\n filled={position}\n marks={marks}\n min={domainMin}\n max={domainMax}\n value={scaledValue}\n disabled={disabled}\n containerProps={{\n ref: container,\n onMouseEnter: showLabelOnHover ? () => setHovered(true) : undefined,\n onMouseLeave: showLabelOnHover ? () => setHovered(false) : undefined,\n }}\n >\n <Thumb\n max={domainMax}\n min={domainMin}\n value={scaledValue}\n position={position}\n dragging={active}\n label={_label}\n ref={thumb as any}\n labelTransitionProps={labelTransitionProps}\n labelAlwaysOn={labelAlwaysOn}\n thumbLabel={thumbLabel}\n showLabelOnHover={showLabelOnHover}\n isHovered={hovered}\n disabled={disabled}\n orientation={orientation}\n {...thumbProps}\n >\n {thumbChildren}\n </Thumb>\n </Track>\n\n <input type=\"hidden\" name={name} value={scaledValue} {...hiddenInputProps} />\n </SliderRoot>\n </SliderProvider>\n );\n});\n\nSlider.classes = classes;\nSlider.varsResolver = varsResolver;\nSlider.displayName = '@mantine/core/Slider';\n\nexport namespace Slider {\n export type Props = SliderProps;\n export type StylesNames = SliderStylesNames;\n export type CssVariables = SliderCssVariables;\n export type Factory = SliderFactory;\n export type Mark = SliderMark;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Slider.cjs","names":["createVarsResolver","getSize","getThemeColor","getRadius","rem","factory","useProps","useStyles","useDirection","getPosition","getPrecision","getChangeValue","findClosestNumber","getNextMarkValue","getFloatingValue","getPreviousMarkValue","getFirstMarkValue","getLastMarkValue","SliderProvider","SliderRoot","Track","Thumb","classes"],"sources":["../../../../src/components/Slider/Slider/Slider.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { clamp, useMergedRef, useMove, useUncontrolled } from '@mantine/hooks';\nimport {\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n findClosestNumber,\n getRadius,\n getSize,\n getThemeColor,\n MantineColor,\n MantineRadius,\n MantineSize,\n rem,\n StylesApiProps,\n useDirection,\n useProps,\n useStyles,\n} from '../../../core';\nimport { TransitionOverride } from '../../Transition';\nimport { SliderCssVariables, SliderProvider, SliderStylesNames } from '../Slider.context';\nimport { SliderMark } from '../SliderMark';\nimport { SliderRoot } from '../SliderRoot/SliderRoot';\nimport { Thumb } from '../Thumb/Thumb';\nimport { Track } from '../Track/Track';\nimport { getChangeValue } from '../utils/get-change-value/get-change-value';\nimport { getFloatingValue } from '../utils/get-floating-value/get-floating-value';\nimport { getPosition } from '../utils/get-position/get-position';\nimport { getPrecision } from '../utils/get-precision/get-precision';\nimport {\n getFirstMarkValue,\n getLastMarkValue,\n getNextMarkValue,\n getPreviousMarkValue,\n} from '../utils/get-step-mark-value/get-step-mark-value';\nimport classes from '../Slider.module.css';\n\nexport interface SliderProps\n extends BoxProps, StylesApiProps<SliderFactory>, ElementProps<'div', 'onChange'> {\n /** Key of `theme.colors` or any valid CSS color, controls color of track and thumb @default theme.primaryColor */\n color?: MantineColor;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius`, numbers are converted to rem @default 'xl' */\n radius?: MantineRadius;\n\n /** Controls size of the track @default 'md' */\n size?: MantineSize | (string & {}) | number;\n\n /** Minimal possible value @default 0 */\n min?: number;\n\n /** Maximum possible value @default 100 */\n max?: number;\n\n /** Domain of the slider, defines the selectable value range independently of min/max. Useful when you want to display a wider track range (min/max) but restrict actual selection to a subset (domain). @default [min, max] */\n domain?: [number, number];\n\n /** Number by which value will be incremented/decremented with thumb drag and arrows @default 1 */\n step?: number;\n\n /** Number of significant digits after the decimal point */\n precision?: number;\n\n /** Controlled component value */\n value?: number;\n\n /** Uncontrolled component default value */\n defaultValue?: number;\n\n /** Called when value changes */\n onChange?: (value: number) => void;\n\n /** Called when user stops dragging slider or changes value with arrows */\n onChangeEnd?: (value: number) => void;\n\n /** Hidden input name, use with uncontrolled component */\n name?: string;\n\n /** Marks displayed on the track */\n marks?: SliderMark[];\n\n /** Function to generate label or any react node to render instead, set to null to disable label */\n label?: React.ReactNode | ((value: number) => React.ReactNode);\n\n /** Props passed down to the `Transition` component @default { transition: 'fade', duration: 0 } */\n labelTransitionProps?: TransitionOverride;\n\n /** Determines whether the label should be visible when the slider is not being dragged or hovered @default false */\n labelAlwaysOn?: boolean;\n\n /** Thumb `aria-label` */\n thumbLabel?: string;\n\n /** Determines whether the label should be displayed when the slider is hovered @default true */\n showLabelOnHover?: boolean;\n\n /** Content rendered inside thumb */\n thumbChildren?: React.ReactNode;\n\n /** Disables slider */\n disabled?: boolean;\n\n /** Thumb `width` and `height`, by default value is computed based on `size` prop */\n thumbSize?: number | string;\n\n /** A transformation function to change the scale of the slider */\n scale?: (value: number) => number;\n\n /** Determines whether track value representation should be inverted @default false */\n inverted?: boolean;\n\n /** Value at which the filled bar starts. When set, the bar extends from this point toward the current value. Ignored when `inverted` is set. */\n startPointValue?: number;\n\n /** Slider orientation @default 'horizontal' */\n orientation?: 'horizontal' | 'vertical';\n\n /** Props passed down to the hidden input */\n hiddenInputProps?: React.ComponentProps<'input'>;\n\n /** Determines whether the selection should be only allowed from the given marks array @default false */\n restrictToMarks?: boolean;\n\n /** Props passed down to thumb element */\n thumbProps?: React.ComponentProps<'div'>;\n}\n\nexport type SliderFactory = Factory<{\n props: SliderProps;\n ref: HTMLDivElement;\n stylesNames: SliderStylesNames;\n vars: SliderCssVariables;\n}>;\n\nconst defaultProps = {\n radius: 'xl',\n min: 0,\n max: 100,\n step: 1,\n marks: [],\n label: (f) => f,\n labelTransitionProps: { transition: 'fade', duration: 0 },\n thumbLabel: '',\n showLabelOnHover: true,\n scale: (v) => v,\n size: 'md',\n} satisfies Partial<SliderProps>;\n\nconst varsResolver = createVarsResolver<SliderFactory>(\n (theme, { size, color, thumbSize, radius }) => ({\n root: {\n '--slider-size': getSize(size, 'slider-size'),\n '--slider-color': color ? getThemeColor(color, theme) : undefined,\n '--slider-radius': radius === undefined ? undefined : getRadius(radius),\n '--slider-thumb-size':\n thumbSize !== undefined ? rem(thumbSize) : 'calc(var(--slider-size) * 2)',\n },\n })\n);\n\nexport const Slider = factory<SliderFactory>((_props) => {\n const props = useProps('Slider', defaultProps, _props);\n const {\n classNames,\n styles,\n value,\n onChange,\n onChangeEnd,\n size,\n min,\n max,\n domain,\n step,\n precision: _precision,\n defaultValue,\n name,\n marks,\n label,\n labelTransitionProps,\n labelAlwaysOn,\n thumbLabel,\n showLabelOnHover,\n thumbChildren,\n disabled,\n unstyled,\n scale,\n inverted,\n startPointValue,\n orientation,\n className,\n style,\n vars,\n hiddenInputProps,\n restrictToMarks,\n thumbProps,\n attributes,\n ref,\n ...others\n } = props;\n\n const getStyles = useStyles<SliderFactory>({\n name: 'Slider',\n props,\n classes,\n classNames,\n className,\n styles,\n style,\n attributes,\n vars,\n varsResolver,\n unstyled,\n });\n\n const { dir } = useDirection();\n const [hovered, setHovered] = useState(false);\n const [_value, setValue] = useUncontrolled({\n value: typeof value === 'number' ? clamp(value, min, max) : value,\n defaultValue: typeof defaultValue === 'number' ? clamp(defaultValue, min, max) : defaultValue,\n finalValue: clamp(0, min, max),\n onChange,\n });\n\n const valueRef = useRef(_value);\n const onChangeEndRef = useRef(onChangeEnd);\n\n useEffect(() => {\n onChangeEndRef.current = onChangeEnd;\n }, [onChangeEnd]);\n\n const root = useRef<HTMLDivElement>(null);\n const thumb = useRef<HTMLDivElement>(null);\n const [domainMin, domainMax] = domain || [min, max];\n const position = getPosition({ value: _value, min: domainMin, max: domainMax });\n const scaledValue = scale!(_value);\n const _label = typeof label === 'function' ? label(scaledValue) : label;\n const precision = _precision ?? getPrecision(step);\n\n const hasStartPoint = typeof startPointValue === 'number' && !inverted;\n const startPosition = hasStartPoint\n ? getPosition({ value: startPointValue!, min: domainMin, max: domainMax })\n : 0;\n const trackOffset = hasStartPoint ? Math.min(position, startPosition) : 0;\n const trackFilled = hasStartPoint ? Math.abs(position - startPosition) : position;\n\n const handleChange = useCallback(\n ({ x }: { x: number }) => {\n if (!disabled) {\n const nextValue = getChangeValue({\n value: x,\n min: domainMin,\n max: domainMax,\n step,\n precision,\n });\n const clampedValue = clamp(nextValue, min!, max!);\n setValue(\n restrictToMarks && marks?.length\n ? findClosestNumber(\n clampedValue,\n marks.map((mark) => mark.value)\n )\n : clampedValue\n );\n valueRef.current = clampedValue;\n }\n },\n [disabled, min, max, domainMin, domainMax, step, precision, setValue, marks, restrictToMarks]\n );\n\n const handleScrubEnd = useCallback(() => {\n if (!disabled && onChangeEndRef.current) {\n const finalValue =\n restrictToMarks && marks?.length\n ? findClosestNumber(\n valueRef.current,\n marks.map((mark) => mark.value)\n )\n : valueRef.current;\n onChangeEndRef.current(finalValue);\n }\n }, [disabled, marks, restrictToMarks]);\n\n const { ref: container, active } = useMove(\n ({ x, y }) => handleChange({ x: orientation === 'vertical' ? 1 - y : x }),\n { onScrubEnd: handleScrubEnd },\n dir\n );\n\n const callOnChangeEnd = useCallback(\n (value: number) => {\n if (!disabled && onChangeEndRef.current) {\n onChangeEndRef.current(value);\n }\n },\n [disabled]\n );\n\n const handleTrackKeydownCapture = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!disabled) {\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue = getNextMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(_value + step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'ArrowRight': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue =\n dir === 'rtl' ? getPreviousMarkValue(_value, marks) : getNextMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(dir === 'rtl' ? _value - step : _value + step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'ArrowDown': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue = getPreviousMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(_value - step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'ArrowLeft': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n const nextValue =\n dir === 'rtl' ? getNextMarkValue(_value, marks) : getPreviousMarkValue(_value, marks);\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n const nextValue = getFloatingValue(\n Math.min(Math.max(dir === 'rtl' ? _value + step : _value - step, domainMin), domainMax),\n precision\n );\n setValue(nextValue);\n callOnChangeEnd(nextValue);\n break;\n }\n\n case 'Home': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n setValue(getFirstMarkValue(marks));\n callOnChangeEnd(getFirstMarkValue(marks));\n break;\n }\n\n setValue(min);\n callOnChangeEnd(min);\n break;\n }\n\n case 'End': {\n event.preventDefault();\n thumb.current?.focus();\n\n if (restrictToMarks && marks) {\n setValue(getLastMarkValue(marks));\n callOnChangeEnd(getLastMarkValue(marks));\n break;\n }\n\n setValue(max);\n callOnChangeEnd(max);\n break;\n }\n\n default: {\n break;\n }\n }\n }\n };\n\n return (\n <SliderProvider value={{ getStyles }}>\n <SliderRoot\n {...others}\n ref={useMergedRef(ref, root)}\n onKeyDownCapture={handleTrackKeydownCapture}\n onMouseDownCapture={() => root.current?.focus()}\n size={size}\n disabled={disabled}\n orientation={orientation}\n >\n <Track\n inverted={inverted}\n offset={trackOffset}\n filled={trackFilled}\n marks={marks}\n min={domainMin}\n max={domainMax}\n value={scaledValue}\n startPointValue={hasStartPoint ? startPointValue : undefined}\n disabled={disabled}\n containerProps={{\n ref: container,\n onMouseEnter: showLabelOnHover ? () => setHovered(true) : undefined,\n onMouseLeave: showLabelOnHover ? () => setHovered(false) : undefined,\n }}\n >\n <Thumb\n max={domainMax}\n min={domainMin}\n value={scaledValue}\n position={position}\n dragging={active}\n label={_label}\n ref={thumb as any}\n labelTransitionProps={labelTransitionProps}\n labelAlwaysOn={labelAlwaysOn}\n thumbLabel={thumbLabel}\n showLabelOnHover={showLabelOnHover}\n isHovered={hovered}\n disabled={disabled}\n orientation={orientation}\n {...thumbProps}\n >\n {thumbChildren}\n </Thumb>\n </Track>\n\n <input type=\"hidden\" name={name} value={scaledValue} {...hiddenInputProps} />\n </SliderRoot>\n </SliderProvider>\n );\n});\n\nSlider.classes = classes;\nSlider.varsResolver = varsResolver;\nSlider.displayName = '@mantine/core/Slider';\n\nexport namespace Slider {\n export type Props = SliderProps;\n export type StylesNames = SliderStylesNames;\n export type CssVariables = SliderCssVariables;\n export type Factory = SliderFactory;\n export type Mark = SliderMark;\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ const require_Slider_context = require("../Slider.context.cjs");
5
5
  const require_Marks = require("../Marks/Marks.cjs");
6
6
  let react_jsx_runtime = require("react/jsx-runtime");
7
7
  //#region packages/@mantine/core/src/components/Slider/Track/Track.tsx
8
- function Track({ filled, children, offset, disabled, marksOffset, inverted, containerProps, ...others }) {
8
+ function Track({ filled, children, offset, disabled, marksOffset, inverted, startPointValue, containerProps, ...others }) {
9
9
  const { getStyles } = require_Slider_context.useSliderContext();
10
10
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Box.Box, {
11
11
  ...getStyles("trackContainer"),
@@ -34,7 +34,8 @@ function Track({ filled, children, offset, disabled, marksOffset, inverted, cont
34
34
  ...others,
35
35
  offset: marksOffset,
36
36
  disabled,
37
- inverted
37
+ inverted,
38
+ startPointValue
38
39
  })
39
40
  ]
40
41
  })
@@ -1 +1 @@
1
- {"version":3,"file":"Track.cjs","names":["useSliderContext","Box","Marks"],"sources":["../../../../src/components/Slider/Track/Track.tsx"],"sourcesContent":["import { Box } from '../../../core';\nimport { Marks } from '../Marks/Marks';\nimport { useSliderContext } from '../Slider.context';\n\nexport interface TrackProps {\n filled: number;\n offset?: number;\n marksOffset?: number;\n marks: { value: number; label?: React.ReactNode }[] | undefined;\n min: number;\n max: number;\n value: number;\n children: React.ReactNode;\n disabled: boolean | undefined;\n inverted: boolean | undefined;\n containerProps?: React.ComponentProps<'div'>;\n}\n\nexport function Track({\n filled,\n children,\n offset,\n disabled,\n marksOffset,\n inverted,\n containerProps,\n ...others\n}: TrackProps) {\n const { getStyles } = useSliderContext();\n\n return (\n <Box {...getStyles('trackContainer')} mod={{ disabled }} {...containerProps}>\n <Box {...getStyles('track')} mod={{ inverted, disabled }}>\n <Box\n mod={{ inverted, disabled }}\n __vars={{\n '--slider-bar-width': `calc(${filled}% + 2 * var(--slider-size))`,\n '--slider-bar-offset': `calc(${offset}% - var(--slider-size))`,\n }}\n {...getStyles('bar')}\n />\n\n {children}\n\n <Marks {...others} offset={marksOffset} disabled={disabled} inverted={inverted} />\n </Box>\n </Box>\n );\n}\n\nTrack.displayName = '@mantine/core/SliderTrack';\n"],"mappings":";;;;;;;AAkBA,SAAgB,MAAM,EACpB,QACA,UACA,QACA,UACA,aACA,UACA,gBACA,GAAG,UACU;CACb,MAAM,EAAE,cAAcA,uBAAAA,kBAAkB;AAExC,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EAAK,GAAI,UAAU,iBAAiB;EAAE,KAAK,EAAE,UAAU;EAAE,GAAI;YAC3D,iBAAA,GAAA,kBAAA,MAACA,YAAAA,KAAD;GAAK,GAAI,UAAU,QAAQ;GAAE,KAAK;IAAE;IAAU;IAAU;aAAxD;IACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,KAAD;KACE,KAAK;MAAE;MAAU;MAAU;KAC3B,QAAQ;MACN,sBAAsB,QAAQ,OAAO;MACrC,uBAAuB,QAAQ,OAAO;MACvC;KACD,GAAI,UAAU,MAAM;KACpB,CAAA;IAED;IAED,iBAAA,GAAA,kBAAA,KAACC,cAAAA,OAAD;KAAO,GAAI;KAAQ,QAAQ;KAAuB;KAAoB;KAAY,CAAA;IAC9E;;EACF,CAAA;;AAIV,MAAM,cAAc"}
1
+ {"version":3,"file":"Track.cjs","names":["useSliderContext","Box","Marks"],"sources":["../../../../src/components/Slider/Track/Track.tsx"],"sourcesContent":["import { Box } from '../../../core';\nimport { Marks } from '../Marks/Marks';\nimport { useSliderContext } from '../Slider.context';\n\nexport interface TrackProps {\n filled: number;\n offset?: number;\n marksOffset?: number;\n marks: { value: number; label?: React.ReactNode }[] | undefined;\n min: number;\n max: number;\n value: number;\n startPointValue?: number;\n children: React.ReactNode;\n disabled: boolean | undefined;\n inverted: boolean | undefined;\n containerProps?: React.ComponentProps<'div'>;\n}\n\nexport function Track({\n filled,\n children,\n offset,\n disabled,\n marksOffset,\n inverted,\n startPointValue,\n containerProps,\n ...others\n}: TrackProps) {\n const { getStyles } = useSliderContext();\n\n return (\n <Box {...getStyles('trackContainer')} mod={{ disabled }} {...containerProps}>\n <Box {...getStyles('track')} mod={{ inverted, disabled }}>\n <Box\n mod={{ inverted, disabled }}\n __vars={{\n '--slider-bar-width': `calc(${filled}% + 2 * var(--slider-size))`,\n '--slider-bar-offset': `calc(${offset}% - var(--slider-size))`,\n }}\n {...getStyles('bar')}\n />\n\n {children}\n\n <Marks\n {...others}\n offset={marksOffset}\n disabled={disabled}\n inverted={inverted}\n startPointValue={startPointValue}\n />\n </Box>\n </Box>\n );\n}\n\nTrack.displayName = '@mantine/core/SliderTrack';\n"],"mappings":";;;;;;;AAmBA,SAAgB,MAAM,EACpB,QACA,UACA,QACA,UACA,aACA,UACA,iBACA,gBACA,GAAG,UACU;CACb,MAAM,EAAE,cAAcA,uBAAAA,kBAAkB;AAExC,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EAAK,GAAI,UAAU,iBAAiB;EAAE,KAAK,EAAE,UAAU;EAAE,GAAI;YAC3D,iBAAA,GAAA,kBAAA,MAACA,YAAAA,KAAD;GAAK,GAAI,UAAU,QAAQ;GAAE,KAAK;IAAE;IAAU;IAAU;aAAxD;IACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,KAAD;KACE,KAAK;MAAE;MAAU;MAAU;KAC3B,QAAQ;MACN,sBAAsB,QAAQ,OAAO;MACrC,uBAAuB,QAAQ,OAAO;MACvC;KACD,GAAI,UAAU,MAAM;KACpB,CAAA;IAED;IAED,iBAAA,GAAA,kBAAA,KAACC,cAAAA,OAAD;KACE,GAAI;KACJ,QAAQ;KACE;KACA;KACO;KACjB,CAAA;IACE;;EACF,CAAA;;AAIV,MAAM,cAAc"}
@@ -21,6 +21,7 @@ let react_jsx_runtime = require("react/jsx-runtime");
21
21
  const VALUE_ERROR = "Tabs.Tab or Tabs.Panel component was rendered with invalid value or without value";
22
22
  const defaultProps = {
23
23
  keepMounted: true,
24
+ keepMountedMode: "activity",
24
25
  orientation: "horizontal",
25
26
  loop: true,
26
27
  activateTabWithKeyboard: true,
@@ -38,7 +39,7 @@ const varsResolver = require_create_vars_resolver.createVarsResolver((theme, { r
38
39
  } }));
39
40
  const Tabs = require_factory.factory((_props) => {
40
41
  const props = require_use_props.useProps("Tabs", defaultProps, _props);
41
- const { defaultValue, value, onChange, orientation, children, loop, id, activateTabWithKeyboard, allowTabDeactivation, variant, color, radius, inverted, placement, keepMounted, classNames, styles, unstyled, className, style, vars, autoContrast, mod, attributes, ...others } = props;
42
+ const { defaultValue, value, onChange, orientation, children, loop, id, activateTabWithKeyboard, allowTabDeactivation, variant, color, radius, inverted, placement, keepMounted, keepMountedMode, classNames, styles, unstyled, className, style, vars, autoContrast, mod, attributes, ...others } = props;
42
43
  const uid = (0, _mantine_hooks.useId)(id);
43
44
  const [currentTab, setCurrentTab] = (0, _mantine_hooks.useUncontrolled)({
44
45
  value,
@@ -76,6 +77,7 @@ const Tabs = require_factory.factory((_props) => {
76
77
  radius,
77
78
  inverted,
78
79
  keepMounted,
80
+ keepMountedMode,
79
81
  unstyled,
80
82
  getStyles
81
83
  },
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.cjs","names":["createVarsResolver","getRadius","getThemeColor","getAutoContrastValue","getContrastColor","factory","useProps","useStyles","TabsProvider","getSafeId","Box","classes","TabsTab","TabsPanel","TabsList"],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useId, useUncontrolled } from '@mantine/hooks';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getAutoContrastValue,\n getContrastColor,\n getRadius,\n getSafeId,\n getThemeColor,\n MantineColor,\n MantineRadius,\n StylesApiProps,\n useProps,\n useStyles,\n} from '../../core';\nimport { TabsProvider, type TabsContextValue } from './Tabs.context';\nimport { TabsList, TabsListStylesNames, type TabsListProps } from './TabsList/TabsList';\nimport { TabsPanel, TabsPanelStylesNames, type TabsPanelProps } from './TabsPanel/TabsPanel';\nimport { TabsTab, TabsTabStylesNames, type TabsTabProps } from './TabsTab/TabsTab';\nimport classes from './Tabs.module.css';\nexport type TabsStylesNames =\n | 'root'\n | TabsListStylesNames\n | TabsPanelStylesNames\n | TabsTabStylesNames;\n\nexport type TabsVariant = 'default' | 'outline' | 'pills';\nexport type TabsCssVariables = {\n root: '--tabs-color' | '--tabs-radius';\n};\n\nexport interface TabsProps\n extends\n BoxProps,\n StylesApiProps<TabsFactory>,\n ElementProps<'div', 'defaultValue' | 'value' | 'onChange'> {\n /** Uncontrolled component default value */\n defaultValue?: string | null;\n\n /** Controlled component value */\n value?: string | null;\n\n /** Called when value changes */\n onChange?: (value: string | null) => void;\n\n /** Tabs orientation @default 'horizontal' */\n orientation?: 'vertical' | 'horizontal';\n\n /** `Tabs.List` placement relative to `Tabs.Panel`, applicable only when `orientation=\"vertical\"` @default 'left' */\n placement?: 'left' | 'right';\n\n /** Base id, used to generate ids to connect labels with controls, generated randomly by default */\n id?: string;\n\n /** If set, arrow key presses loop though items (first to last and last to first) @default true */\n loop?: boolean;\n\n /** If set, tab is activated with arrow key press @default true */\n activateTabWithKeyboard?: boolean;\n\n /** If set, tab can be deactivated @default false */\n allowTabDeactivation?: boolean;\n\n /** Tabs content */\n children?: React.ReactNode;\n\n /** Changes colors of `Tabs.Tab` components when variant is `pills` or `default`, does nothing for other variants */\n color?: MantineColor;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Determines whether tabs should have inverted styles @default false */\n inverted?: boolean;\n\n /** If set to `false`, `Tabs.Panel` content will be unmounted when the associated tab is not active @default true */\n keepMounted?: boolean;\n\n /** If set, adjusts text color based on background color for `pills` variant */\n autoContrast?: boolean;\n}\n\nexport type TabsFactory = Factory<{\n props: TabsProps;\n ref: HTMLDivElement;\n variant: TabsVariant;\n stylesNames: TabsStylesNames;\n vars: TabsCssVariables;\n staticComponents: {\n Tab: typeof TabsTab;\n Panel: typeof TabsPanel;\n List: typeof TabsList;\n };\n}>;\n\nconst VALUE_ERROR =\n 'Tabs.Tab or Tabs.Panel component was rendered with invalid value or without value';\n\nconst defaultProps = {\n keepMounted: true,\n orientation: 'horizontal',\n loop: true,\n activateTabWithKeyboard: true,\n variant: 'default',\n placement: 'left',\n} satisfies Partial<TabsProps>;\n\nconst varsResolver = createVarsResolver<TabsFactory>((theme, { radius, color, autoContrast }) => ({\n root: {\n '--tabs-radius': getRadius(radius),\n '--tabs-color': getThemeColor(color, theme),\n '--tabs-text-color': getAutoContrastValue(autoContrast, theme)\n ? getContrastColor({ color, theme, autoContrast })\n : undefined,\n },\n}));\n\nexport const Tabs = factory<TabsFactory>((_props) => {\n const props = useProps('Tabs', defaultProps, _props);\n const {\n defaultValue,\n value,\n onChange,\n orientation,\n children,\n loop,\n id,\n activateTabWithKeyboard,\n allowTabDeactivation,\n variant,\n color,\n radius,\n inverted,\n placement,\n keepMounted,\n classNames,\n styles,\n unstyled,\n className,\n style,\n vars,\n autoContrast,\n mod,\n attributes,\n ...others\n } = props;\n\n const uid = useId(id);\n\n const [currentTab, setCurrentTab] = useUncontrolled({\n value,\n defaultValue,\n finalValue: null,\n onChange,\n });\n\n const getStyles = useStyles<TabsFactory>({\n name: 'Tabs',\n props,\n classes,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n return (\n <TabsProvider\n value={{\n placement,\n value: currentTab,\n orientation,\n id: uid,\n loop,\n activateTabWithKeyboard,\n getTabId: getSafeId(`${uid}-tab`, VALUE_ERROR),\n getPanelId: getSafeId(`${uid}-panel`, VALUE_ERROR),\n onChange: setCurrentTab,\n allowTabDeactivation,\n variant,\n color,\n radius,\n inverted,\n keepMounted,\n unstyled,\n getStyles,\n }}\n >\n <Box\n id={uid}\n variant={variant}\n mod={[\n {\n orientation,\n inverted: orientation === 'horizontal' && inverted,\n placement: orientation === 'vertical' && placement,\n },\n mod,\n ]}\n {...getStyles('root')}\n {...others}\n >\n {children}\n </Box>\n </TabsProvider>\n );\n});\n\nTabs.classes = classes;\nTabs.varsResolver = varsResolver;\nTabs.displayName = '@mantine/core/Tabs';\nTabs.Tab = TabsTab;\nTabs.Panel = TabsPanel;\nTabs.List = TabsList;\n\nexport namespace Tabs {\n export type Props = TabsProps;\n export type StylesNames = TabsStylesNames;\n export type CssVariables = TabsCssVariables;\n export type Factory = TabsFactory;\n export type Variant = TabsVariant;\n export type ContextValue = TabsContextValue;\n\n export namespace Tab {\n export type Props = TabsTabProps;\n export type StylesNames = TabsTabStylesNames;\n }\n\n export namespace Panel {\n export type Props = TabsPanelProps;\n export type StylesNames = TabsPanelStylesNames;\n }\n\n export namespace List {\n export type Props = TabsListProps;\n export type StylesNames = TabsListStylesNames;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmGA,MAAM,cACJ;AAEF,MAAM,eAAe;CACnB,aAAa;CACb,aAAa;CACb,MAAM;CACN,yBAAyB;CACzB,SAAS;CACT,WAAW;CACZ;AAED,MAAM,eAAeA,6BAAAA,oBAAiC,OAAO,EAAE,QAAQ,OAAO,oBAAoB,EAChG,MAAM;CACJ,iBAAiBC,iBAAAA,UAAU,OAAO;CAClC,gBAAgBC,wBAAAA,cAAc,OAAO,MAAM;CAC3C,qBAAqBC,gCAAAA,qBAAqB,cAAc,MAAM,GAC1DC,2BAAAA,iBAAiB;EAAE;EAAO;EAAO;EAAc,CAAC,GAChD,KAAA;CACL,EACF,EAAE;AAEH,MAAa,OAAOC,gBAAAA,SAAsB,WAAW;CACnD,MAAM,QAAQC,kBAAAA,SAAS,QAAQ,cAAc,OAAO;CACpD,MAAM,EACJ,cACA,OACA,UACA,aACA,UACA,MACA,IACA,yBACA,sBACA,SACA,OACA,QACA,UACA,WACA,aACA,YACA,QACA,UACA,WACA,OACA,MACA,cACA,KACA,YACA,GAAG,WACD;CAEJ,MAAM,OAAA,GAAA,eAAA,OAAY,GAAG;CAErB,MAAM,CAAC,YAAY,kBAAA,GAAA,eAAA,iBAAiC;EAClD;EACA;EACA,YAAY;EACZ;EACD,CAAC;CAEF,MAAM,YAAYC,mBAAAA,UAAuB;EACvC,MAAM;EACN;EACA,SAAA,oBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,qBAAAA,cAAD;EACE,OAAO;GACL;GACA,OAAO;GACP;GACA,IAAI;GACJ;GACA;GACA,UAAUC,oBAAAA,UAAU,GAAG,IAAI,OAAO,YAAY;GAC9C,YAAYA,oBAAAA,UAAU,GAAG,IAAI,SAAS,YAAY;GAClD,UAAU;GACV;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;YAED,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;GACE,IAAI;GACK;GACT,KAAK,CACH;IACE;IACA,UAAU,gBAAgB,gBAAgB;IAC1C,WAAW,gBAAgB,cAAc;IAC1C,EACD,IACD;GACD,GAAI,UAAU,OAAO;GACrB,GAAI;GAEH;GACG,CAAA;EACO,CAAA;EAEjB;AAEF,KAAK,UAAUC,oBAAAA;AACf,KAAK,eAAe;AACpB,KAAK,cAAc;AACnB,KAAK,MAAMC,gBAAAA;AACX,KAAK,QAAQC,kBAAAA;AACb,KAAK,OAAOC,iBAAAA"}
1
+ {"version":3,"file":"Tabs.cjs","names":["createVarsResolver","getRadius","getThemeColor","getAutoContrastValue","getContrastColor","factory","useProps","useStyles","TabsProvider","getSafeId","Box","classes","TabsTab","TabsPanel","TabsList"],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useId, useUncontrolled } from '@mantine/hooks';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getAutoContrastValue,\n getContrastColor,\n getRadius,\n getSafeId,\n getThemeColor,\n MantineColor,\n MantineRadius,\n StylesApiProps,\n useProps,\n useStyles,\n} from '../../core';\nimport { TabsProvider, type TabsContextValue } from './Tabs.context';\nimport { TabsList, TabsListStylesNames, type TabsListProps } from './TabsList/TabsList';\nimport { TabsPanel, TabsPanelStylesNames, type TabsPanelProps } from './TabsPanel/TabsPanel';\nimport { TabsTab, TabsTabStylesNames, type TabsTabProps } from './TabsTab/TabsTab';\nimport classes from './Tabs.module.css';\nexport type TabsStylesNames =\n | 'root'\n | TabsListStylesNames\n | TabsPanelStylesNames\n | TabsTabStylesNames;\n\nexport type TabsVariant = 'default' | 'outline' | 'pills';\nexport type TabsCssVariables = {\n root: '--tabs-color' | '--tabs-radius';\n};\n\nexport interface TabsProps\n extends\n BoxProps,\n StylesApiProps<TabsFactory>,\n ElementProps<'div', 'defaultValue' | 'value' | 'onChange'> {\n /** Uncontrolled component default value */\n defaultValue?: string | null;\n\n /** Controlled component value */\n value?: string | null;\n\n /** Called when value changes */\n onChange?: (value: string | null) => void;\n\n /** Tabs orientation @default 'horizontal' */\n orientation?: 'vertical' | 'horizontal';\n\n /** `Tabs.List` placement relative to `Tabs.Panel`, applicable only when `orientation=\"vertical\"` @default 'left' */\n placement?: 'left' | 'right';\n\n /** Base id, used to generate ids to connect labels with controls, generated randomly by default */\n id?: string;\n\n /** If set, arrow key presses loop though items (first to last and last to first) @default true */\n loop?: boolean;\n\n /** If set, tab is activated with arrow key press @default true */\n activateTabWithKeyboard?: boolean;\n\n /** If set, tab can be deactivated @default false */\n allowTabDeactivation?: boolean;\n\n /** Tabs content */\n children?: React.ReactNode;\n\n /** Changes colors of `Tabs.Tab` components when variant is `pills` or `default`, does nothing for other variants */\n color?: MantineColor;\n\n /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n radius?: MantineRadius;\n\n /** Determines whether tabs should have inverted styles @default false */\n inverted?: boolean;\n\n /** If set to `false`, `Tabs.Panel` content will be unmounted when the associated tab is not active @default true */\n keepMounted?: boolean;\n\n /** Controls how inactive tabs content is hidden when `keepMounted` is `true`, `'activity'` – hidden with `Activity` component, `'display-none'` – hidden with `display: none` styles @default 'activity' */\n keepMountedMode?: 'activity' | 'display-none';\n\n /** If set, adjusts text color based on background color for `pills` variant */\n autoContrast?: boolean;\n}\n\nexport type TabsFactory = Factory<{\n props: TabsProps;\n ref: HTMLDivElement;\n variant: TabsVariant;\n stylesNames: TabsStylesNames;\n vars: TabsCssVariables;\n staticComponents: {\n Tab: typeof TabsTab;\n Panel: typeof TabsPanel;\n List: typeof TabsList;\n };\n}>;\n\nconst VALUE_ERROR =\n 'Tabs.Tab or Tabs.Panel component was rendered with invalid value or without value';\n\nconst defaultProps = {\n keepMounted: true,\n keepMountedMode: 'activity',\n orientation: 'horizontal',\n loop: true,\n activateTabWithKeyboard: true,\n variant: 'default',\n placement: 'left',\n} satisfies Partial<TabsProps>;\n\nconst varsResolver = createVarsResolver<TabsFactory>((theme, { radius, color, autoContrast }) => ({\n root: {\n '--tabs-radius': getRadius(radius),\n '--tabs-color': getThemeColor(color, theme),\n '--tabs-text-color': getAutoContrastValue(autoContrast, theme)\n ? getContrastColor({ color, theme, autoContrast })\n : undefined,\n },\n}));\n\nexport const Tabs = factory<TabsFactory>((_props) => {\n const props = useProps('Tabs', defaultProps, _props);\n const {\n defaultValue,\n value,\n onChange,\n orientation,\n children,\n loop,\n id,\n activateTabWithKeyboard,\n allowTabDeactivation,\n variant,\n color,\n radius,\n inverted,\n placement,\n keepMounted,\n keepMountedMode,\n classNames,\n styles,\n unstyled,\n className,\n style,\n vars,\n autoContrast,\n mod,\n attributes,\n ...others\n } = props;\n\n const uid = useId(id);\n\n const [currentTab, setCurrentTab] = useUncontrolled({\n value,\n defaultValue,\n finalValue: null,\n onChange,\n });\n\n const getStyles = useStyles<TabsFactory>({\n name: 'Tabs',\n props,\n classes,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n return (\n <TabsProvider\n value={{\n placement,\n value: currentTab,\n orientation,\n id: uid,\n loop,\n activateTabWithKeyboard,\n getTabId: getSafeId(`${uid}-tab`, VALUE_ERROR),\n getPanelId: getSafeId(`${uid}-panel`, VALUE_ERROR),\n onChange: setCurrentTab,\n allowTabDeactivation,\n variant,\n color,\n radius,\n inverted,\n keepMounted,\n keepMountedMode,\n unstyled,\n getStyles,\n }}\n >\n <Box\n id={uid}\n variant={variant}\n mod={[\n {\n orientation,\n inverted: orientation === 'horizontal' && inverted,\n placement: orientation === 'vertical' && placement,\n },\n mod,\n ]}\n {...getStyles('root')}\n {...others}\n >\n {children}\n </Box>\n </TabsProvider>\n );\n});\n\nTabs.classes = classes;\nTabs.varsResolver = varsResolver;\nTabs.displayName = '@mantine/core/Tabs';\nTabs.Tab = TabsTab;\nTabs.Panel = TabsPanel;\nTabs.List = TabsList;\n\nexport namespace Tabs {\n export type Props = TabsProps;\n export type StylesNames = TabsStylesNames;\n export type CssVariables = TabsCssVariables;\n export type Factory = TabsFactory;\n export type Variant = TabsVariant;\n export type ContextValue = TabsContextValue;\n\n export namespace Tab {\n export type Props = TabsTabProps;\n export type StylesNames = TabsTabStylesNames;\n }\n\n export namespace Panel {\n export type Props = TabsPanelProps;\n export type StylesNames = TabsPanelStylesNames;\n }\n\n export namespace List {\n export type Props = TabsListProps;\n export type StylesNames = TabsListStylesNames;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsGA,MAAM,cACJ;AAEF,MAAM,eAAe;CACnB,aAAa;CACb,iBAAiB;CACjB,aAAa;CACb,MAAM;CACN,yBAAyB;CACzB,SAAS;CACT,WAAW;CACZ;AAED,MAAM,eAAeA,6BAAAA,oBAAiC,OAAO,EAAE,QAAQ,OAAO,oBAAoB,EAChG,MAAM;CACJ,iBAAiBC,iBAAAA,UAAU,OAAO;CAClC,gBAAgBC,wBAAAA,cAAc,OAAO,MAAM;CAC3C,qBAAqBC,gCAAAA,qBAAqB,cAAc,MAAM,GAC1DC,2BAAAA,iBAAiB;EAAE;EAAO;EAAO;EAAc,CAAC,GAChD,KAAA;CACL,EACF,EAAE;AAEH,MAAa,OAAOC,gBAAAA,SAAsB,WAAW;CACnD,MAAM,QAAQC,kBAAAA,SAAS,QAAQ,cAAc,OAAO;CACpD,MAAM,EACJ,cACA,OACA,UACA,aACA,UACA,MACA,IACA,yBACA,sBACA,SACA,OACA,QACA,UACA,WACA,aACA,iBACA,YACA,QACA,UACA,WACA,OACA,MACA,cACA,KACA,YACA,GAAG,WACD;CAEJ,MAAM,OAAA,GAAA,eAAA,OAAY,GAAG;CAErB,MAAM,CAAC,YAAY,kBAAA,GAAA,eAAA,iBAAiC;EAClD;EACA;EACA,YAAY;EACZ;EACD,CAAC;CAEF,MAAM,YAAYC,mBAAAA,UAAuB;EACvC,MAAM;EACN;EACA,SAAA,oBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,qBAAAA,cAAD;EACE,OAAO;GACL;GACA,OAAO;GACP;GACA,IAAI;GACJ;GACA;GACA,UAAUC,oBAAAA,UAAU,GAAG,IAAI,OAAO,YAAY;GAC9C,YAAYA,oBAAAA,UAAU,GAAG,IAAI,SAAS,YAAY;GAClD,UAAU;GACV;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;YAED,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;GACE,IAAI;GACK;GACT,KAAK,CACH;IACE;IACA,UAAU,gBAAgB,gBAAgB;IAC1C,WAAW,gBAAgB,cAAc;IAC1C,EACD,IACD;GACD,GAAI,UAAU,OAAO;GACrB,GAAI;GAEH;GACG,CAAA;EACO,CAAA;EAEjB;AAEF,KAAK,UAAUC,oBAAAA;AACf,KAAK,eAAe;AACpB,KAAK,cAAc;AACnB,KAAK,MAAMC,gBAAAA;AACX,KAAK,QAAQC,kBAAAA;AACb,KAAK,OAAOC,iBAAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.context.cjs","names":["createSafeContext"],"sources":["../../../src/components/Tabs/Tabs.context.ts"],"sourcesContent":["import { createSafeContext, GetStylesApi } from '../../core';\nimport type { TabsFactory } from './Tabs';\n\nexport interface TabsContextValue {\n id: string;\n value: string | null;\n orientation: 'horizontal' | 'vertical' | undefined;\n loop: boolean | undefined;\n activateTabWithKeyboard: boolean | undefined;\n allowTabDeactivation: boolean | undefined;\n onChange: (value: string | null) => void;\n getTabId: (value: string) => string;\n getPanelId: (value: string) => string;\n variant: string | undefined;\n color: string | undefined;\n radius: string | number | undefined;\n inverted: boolean | undefined;\n keepMounted: boolean | undefined;\n placement: 'right' | 'left' | undefined;\n unstyled: boolean | undefined;\n getStyles: GetStylesApi<TabsFactory>;\n}\n\nexport const [TabsProvider, useTabsContext] = createSafeContext<TabsContextValue>(\n 'Tabs component was not found in the tree'\n);\n"],"mappings":";;AAuBA,MAAa,CAAC,cAAc,0FAAkBA,kBAC5C,2CACD"}
1
+ {"version":3,"file":"Tabs.context.cjs","names":["createSafeContext"],"sources":["../../../src/components/Tabs/Tabs.context.ts"],"sourcesContent":["import { createSafeContext, GetStylesApi } from '../../core';\nimport type { TabsFactory } from './Tabs';\n\nexport interface TabsContextValue {\n id: string;\n value: string | null;\n orientation: 'horizontal' | 'vertical' | undefined;\n loop: boolean | undefined;\n activateTabWithKeyboard: boolean | undefined;\n allowTabDeactivation: boolean | undefined;\n onChange: (value: string | null) => void;\n getTabId: (value: string) => string;\n getPanelId: (value: string) => string;\n variant: string | undefined;\n color: string | undefined;\n radius: string | number | undefined;\n inverted: boolean | undefined;\n keepMounted: boolean | undefined;\n keepMountedMode: 'activity' | 'display-none' | undefined;\n placement: 'right' | 'left' | undefined;\n unstyled: boolean | undefined;\n getStyles: GetStylesApi<TabsFactory>;\n}\n\nexport const [TabsProvider, useTabsContext] = createSafeContext<TabsContextValue>(\n 'Tabs component was not found in the tree'\n);\n"],"mappings":";;AAwBA,MAAa,CAAC,cAAc,0FAAkBA,kBAC5C,2CACD"}
@@ -16,7 +16,8 @@ const TabsPanel = require_factory.factory((_props) => {
16
16
  const ctx = require_Tabs_context.useTabsContext();
17
17
  const active = ctx.value === value;
18
18
  const shouldKeepMounted = ctx.keepMounted || keepMounted;
19
- const content = shouldKeepMounted && env !== "test" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Activity, {
19
+ const useActivity = ctx.keepMountedMode !== "display-none";
20
+ const content = shouldKeepMounted && useActivity && env !== "test" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Activity, {
20
21
  mode: active ? "visible" : "hidden",
21
22
  children
22
23
  }) : shouldKeepMounted ? children : active ? children : null;
@@ -1 +1 @@
1
- {"version":3,"file":"TabsPanel.cjs","names":["factory","useProps","useMantineEnv","useTabsContext","Activity","Box","classes"],"sources":["../../../../src/components/Tabs/TabsPanel/TabsPanel.tsx"],"sourcesContent":["import { Activity } from 'react';\nimport {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useMantineEnv,\n useProps,\n} from '../../../core';\nimport { useTabsContext } from '../Tabs.context';\nimport classes from '../Tabs.module.css';\n\nexport type TabsPanelStylesNames = 'panel';\n\nexport interface TabsPanelProps\n extends BoxProps, CompoundStylesApiProps<TabsPanelFactory>, ElementProps<'div'> {\n /** Panel content */\n children: React.ReactNode;\n\n /** If set, the content is kept mounted, even if `keepMounted` is set `false` in the parent `Tabs` component */\n keepMounted?: boolean;\n\n /** Value of associated control */\n value: string;\n}\n\nexport type TabsPanelFactory = Factory<{\n props: TabsPanelProps;\n ref: HTMLDivElement;\n stylesNames: TabsPanelStylesNames;\n compound: true;\n}>;\n\nexport const TabsPanel = factory<TabsPanelFactory>((_props) => {\n const props = useProps('TabsPanel', null, _props);\n const { children, className, value, classNames, styles, style, mod, keepMounted, ...others } =\n props;\n\n const env = useMantineEnv();\n const ctx = useTabsContext();\n\n const active = ctx.value === value;\n const shouldKeepMounted = ctx.keepMounted || keepMounted;\n const content =\n shouldKeepMounted && env !== 'test' ? (\n <Activity mode={active ? 'visible' : 'hidden'}>{children}</Activity>\n ) : shouldKeepMounted ? (\n children\n ) : active ? (\n children\n ) : null;\n\n return (\n <Box\n {...ctx.getStyles('panel', {\n className,\n classNames,\n styles,\n style: [style, !active ? { display: 'none' } : undefined],\n props,\n })}\n mod={[{ orientation: ctx.orientation }, mod]}\n role=\"tabpanel\"\n id={ctx.getPanelId(value)}\n aria-labelledby={ctx.getTabId(value)}\n {...others}\n >\n {content}\n </Box>\n );\n});\n\nTabsPanel.classes = classes;\nTabsPanel.displayName = '@mantine/core/TabsPanel';\n"],"mappings":";;;;;;;;;;;AAmCA,MAAa,YAAYA,gBAAAA,SAA2B,WAAW;CAC7D,MAAM,QAAQC,kBAAAA,SAAS,aAAa,MAAM,OAAO;CACjD,MAAM,EAAE,UAAU,WAAW,OAAO,YAAY,QAAQ,OAAO,KAAK,aAAa,GAAG,WAClF;CAEF,MAAM,MAAMC,wBAAAA,eAAe;CAC3B,MAAM,MAAMC,qBAAAA,gBAAgB;CAE5B,MAAM,SAAS,IAAI,UAAU;CAC7B,MAAM,oBAAoB,IAAI,eAAe;CAC7C,MAAM,UACJ,qBAAqB,QAAQ,SAC3B,iBAAA,GAAA,kBAAA,KAACC,MAAAA,UAAD;EAAU,MAAM,SAAS,YAAY;EAAW;EAAoB,CAAA,GAClE,oBACF,WACE,SACF,WACE;AAEN,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EACE,GAAI,IAAI,UAAU,SAAS;GACzB;GACA;GACA;GACA,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,QAAQ,GAAG,KAAA,EAAU;GACzD;GACD,CAAC;EACF,KAAK,CAAC,EAAE,aAAa,IAAI,aAAa,EAAE,IAAI;EAC5C,MAAK;EACL,IAAI,IAAI,WAAW,MAAM;EACzB,mBAAiB,IAAI,SAAS,MAAM;EACpC,GAAI;YAEH;EACG,CAAA;EAER;AAEF,UAAU,UAAUC,oBAAAA;AACpB,UAAU,cAAc"}
1
+ {"version":3,"file":"TabsPanel.cjs","names":["factory","useProps","useMantineEnv","useTabsContext","Activity","Box","classes"],"sources":["../../../../src/components/Tabs/TabsPanel/TabsPanel.tsx"],"sourcesContent":["import { Activity } from 'react';\nimport {\n Box,\n BoxProps,\n CompoundStylesApiProps,\n ElementProps,\n factory,\n Factory,\n useMantineEnv,\n useProps,\n} from '../../../core';\nimport { useTabsContext } from '../Tabs.context';\nimport classes from '../Tabs.module.css';\n\nexport type TabsPanelStylesNames = 'panel';\n\nexport interface TabsPanelProps\n extends BoxProps, CompoundStylesApiProps<TabsPanelFactory>, ElementProps<'div'> {\n /** Panel content */\n children: React.ReactNode;\n\n /** If set, the content is kept mounted, even if `keepMounted` is set `false` in the parent `Tabs` component */\n keepMounted?: boolean;\n\n /** Value of associated control */\n value: string;\n}\n\nexport type TabsPanelFactory = Factory<{\n props: TabsPanelProps;\n ref: HTMLDivElement;\n stylesNames: TabsPanelStylesNames;\n compound: true;\n}>;\n\nexport const TabsPanel = factory<TabsPanelFactory>((_props) => {\n const props = useProps('TabsPanel', null, _props);\n const { children, className, value, classNames, styles, style, mod, keepMounted, ...others } =\n props;\n\n const env = useMantineEnv();\n const ctx = useTabsContext();\n\n const active = ctx.value === value;\n const shouldKeepMounted = ctx.keepMounted || keepMounted;\n const useActivity = ctx.keepMountedMode !== 'display-none';\n const content =\n shouldKeepMounted && useActivity && env !== 'test' ? (\n <Activity mode={active ? 'visible' : 'hidden'}>{children}</Activity>\n ) : shouldKeepMounted ? (\n children\n ) : active ? (\n children\n ) : null;\n\n return (\n <Box\n {...ctx.getStyles('panel', {\n className,\n classNames,\n styles,\n style: [style, !active ? { display: 'none' } : undefined],\n props,\n })}\n mod={[{ orientation: ctx.orientation }, mod]}\n role=\"tabpanel\"\n id={ctx.getPanelId(value)}\n aria-labelledby={ctx.getTabId(value)}\n {...others}\n >\n {content}\n </Box>\n );\n});\n\nTabsPanel.classes = classes;\nTabsPanel.displayName = '@mantine/core/TabsPanel';\n"],"mappings":";;;;;;;;;;;AAmCA,MAAa,YAAYA,gBAAAA,SAA2B,WAAW;CAC7D,MAAM,QAAQC,kBAAAA,SAAS,aAAa,MAAM,OAAO;CACjD,MAAM,EAAE,UAAU,WAAW,OAAO,YAAY,QAAQ,OAAO,KAAK,aAAa,GAAG,WAClF;CAEF,MAAM,MAAMC,wBAAAA,eAAe;CAC3B,MAAM,MAAMC,qBAAAA,gBAAgB;CAE5B,MAAM,SAAS,IAAI,UAAU;CAC7B,MAAM,oBAAoB,IAAI,eAAe;CAC7C,MAAM,cAAc,IAAI,oBAAoB;CAC5C,MAAM,UACJ,qBAAqB,eAAe,QAAQ,SAC1C,iBAAA,GAAA,kBAAA,KAACC,MAAAA,UAAD;EAAU,MAAM,SAAS,YAAY;EAAW;EAAoB,CAAA,GAClE,oBACF,WACE,SACF,WACE;AAEN,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EACE,GAAI,IAAI,UAAU,SAAS;GACzB;GACA;GACA;GACA,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,QAAQ,GAAG,KAAA,EAAU;GACzD;GACD,CAAC;EACF,KAAK,CAAC,EAAE,aAAa,IAAI,aAAa,EAAE,IAAI;EAC5C,MAAK;EACL,IAAI,IAAI,WAAW,MAAM;EACzB,mBAAiB,IAAI,SAAS,MAAM;EACpC,GAAI;YAEH;EACG,CAAA;EAER;AAEF,UAAU,UAAUC,oBAAAA;AACpB,UAAU,cAAc"}
@@ -0,0 +1,103 @@
1
+ "use client";
2
+ require("../../_virtual/_rolldown/runtime.cjs");
3
+ const require_find_element_ancestor = require("../../core/utils/find-element-ancestor/find-element-ancestor.cjs");
4
+ const require_Tree_module = require("./Tree.module.cjs");
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ //#region packages/@mantine/core/src/components/Tree/FlatTreeNode.tsx
8
+ const FlatTreeNode = (0, react.memo)(function FlatTreeNode({ node, level, parent, hasChildren, expanded, tree, expandOnClick = true, selectOnClick, expandOnSpace = true, checkOnSpace, renderNode, style, tabIndex = -1 }) {
9
+ const ref = (0, react.useRef)(null);
10
+ const isLoading = tree.isNodeLoading(node.value);
11
+ const loadError = tree.getNodeLoadError(node.value);
12
+ const selected = tree.selectedState.includes(node.value);
13
+ const handleClick = (event) => {
14
+ event.stopPropagation();
15
+ if (expandOnClick && hasChildren) tree.toggleExpanded(node.value);
16
+ if (selectOnClick) tree.select(node.value);
17
+ ref.current?.focus();
18
+ };
19
+ const handleKeyDown = (event) => {
20
+ if (event.nativeEvent.code === "ArrowRight") {
21
+ event.stopPropagation();
22
+ event.preventDefault();
23
+ if (expanded && hasChildren) {
24
+ const root = require_find_element_ancestor.findElementAncestor(event.currentTarget, "[data-tree-root]");
25
+ const nodes = root ? Array.from(root.querySelectorAll("[role=treeitem]")).filter((treeNode) => treeNode.style.display !== "none") : [];
26
+ const index = nodes.indexOf(event.currentTarget);
27
+ if (index !== -1) nodes[index + 1]?.focus();
28
+ } else if (hasChildren) tree.expand(node.value);
29
+ }
30
+ if (event.nativeEvent.code === "ArrowLeft") {
31
+ event.stopPropagation();
32
+ event.preventDefault();
33
+ if (expanded && hasChildren) tree.collapse(node.value);
34
+ else if (parent) (require_find_element_ancestor.findElementAncestor(event.currentTarget, "[data-tree-root]")?.querySelector(`[role=treeitem][data-value="${CSS.escape(parent)}"]`))?.focus();
35
+ }
36
+ if (event.nativeEvent.code === "ArrowDown" || event.nativeEvent.code === "ArrowUp") {
37
+ const root = require_find_element_ancestor.findElementAncestor(event.currentTarget, "[data-tree-root]");
38
+ if (!root) return;
39
+ event.stopPropagation();
40
+ event.preventDefault();
41
+ const nodes = Array.from(root.querySelectorAll("[role=treeitem]")).filter((treeNode) => treeNode.style.display !== "none");
42
+ const index = nodes.indexOf(event.currentTarget);
43
+ if (index === -1) return;
44
+ nodes[event.nativeEvent.code === "ArrowDown" ? index + 1 : index - 1]?.focus();
45
+ }
46
+ if (event.nativeEvent.code === "Space") {
47
+ if (expandOnSpace) {
48
+ event.stopPropagation();
49
+ event.preventDefault();
50
+ tree.toggleExpanded(node.value);
51
+ }
52
+ if (checkOnSpace) {
53
+ event.stopPropagation();
54
+ event.preventDefault();
55
+ if (tree.isNodeChecked(node.value)) tree.uncheckNode(node.value);
56
+ else tree.checkNode(node.value);
57
+ }
58
+ }
59
+ };
60
+ const elementProps = {
61
+ className: require_Tree_module.default.label,
62
+ style: {},
63
+ onClick: handleClick,
64
+ "data-selected": selected || void 0,
65
+ "data-value": node.value
66
+ };
67
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
68
+ ref,
69
+ className: require_Tree_module.default.node,
70
+ style: {
71
+ "--label-offset": `calc(var(--level-offset, var(--mantine-spacing-lg)) * ${level - 1})`,
72
+ ...style
73
+ },
74
+ role: "treeitem",
75
+ "aria-selected": selected,
76
+ "aria-expanded": hasChildren ? expanded : void 0,
77
+ "data-value": node.value,
78
+ "data-selected": selected || void 0,
79
+ "data-level": level,
80
+ tabIndex,
81
+ onKeyDown: handleKeyDown,
82
+ children: typeof renderNode === "function" ? renderNode({
83
+ node,
84
+ level,
85
+ selected,
86
+ tree,
87
+ expanded,
88
+ hasChildren,
89
+ isLoading,
90
+ loadError,
91
+ elementProps,
92
+ dragHandleProps: void 0
93
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
94
+ ...elementProps,
95
+ children: node.label
96
+ })
97
+ });
98
+ });
99
+ FlatTreeNode.displayName = "@mantine/core/FlatTreeNode";
100
+ //#endregion
101
+ exports.FlatTreeNode = FlatTreeNode;
102
+
103
+ //# sourceMappingURL=FlatTreeNode.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlatTreeNode.cjs","names":["findElementAncestor","classes"],"sources":["../../../src/components/Tree/FlatTreeNode.tsx"],"sourcesContent":["import { memo, useRef } from 'react';\nimport { findElementAncestor } from '../../core';\nimport type { RenderNode, TreeNodeData } from './Tree';\nimport type { TreeController } from './use-tree';\nimport classes from './Tree.module.css';\n\nexport interface FlatTreeNodeProps {\n /** Node data from tree data */\n node: TreeNodeData;\n\n /** Nesting level of the node, starts at 1 */\n level: number;\n\n /** Value of the parent node, `null` for root nodes */\n parent: string | null;\n\n /** Whether the node has children */\n hasChildren: boolean;\n\n /** Whether the node is expanded */\n expanded: boolean;\n\n /** Tree controller instance, return value of `useTree` hook */\n tree: TreeController;\n\n /** If set, tree node with children is expanded on click @default true */\n expandOnClick?: boolean;\n\n /** If set, tree node is selected on click @default false */\n selectOnClick?: boolean;\n\n /** If set, tree node with children is expanded on space key press @default true */\n expandOnSpace?: boolean;\n\n /** If set, tree node is checked on space key press @default false */\n checkOnSpace?: boolean;\n\n /** A function to render tree node label */\n renderNode?: RenderNode;\n\n /** Style to apply to the root element, used for virtualizer positioning */\n style?: React.CSSProperties;\n\n /** Tab index for the node */\n tabIndex?: number;\n}\n\nexport const FlatTreeNode = memo(function FlatTreeNode({\n node,\n level,\n parent,\n hasChildren,\n expanded,\n tree,\n expandOnClick = true,\n selectOnClick,\n expandOnSpace = true,\n checkOnSpace,\n renderNode,\n style,\n tabIndex = -1,\n}: FlatTreeNodeProps) {\n const ref = useRef<HTMLDivElement>(null);\n const isLoading = tree.isNodeLoading(node.value);\n const loadError = tree.getNodeLoadError(node.value);\n const selected = tree.selectedState.includes(node.value);\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n\n if (expandOnClick && hasChildren) {\n tree.toggleExpanded(node.value);\n }\n\n if (selectOnClick) {\n tree.select(node.value);\n }\n\n ref.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.nativeEvent.code === 'ArrowRight') {\n event.stopPropagation();\n event.preventDefault();\n\n if (expanded && hasChildren) {\n const root = findElementAncestor(event.currentTarget as HTMLElement, '[data-tree-root]');\n const nodes = root\n ? Array.from(root.querySelectorAll<HTMLElement>('[role=treeitem]')).filter(\n (treeNode) => treeNode.style.display !== 'none'\n )\n : [];\n const index = nodes.indexOf(event.currentTarget as HTMLElement);\n if (index !== -1) {\n nodes[index + 1]?.focus();\n }\n } else if (hasChildren) {\n tree.expand(node.value);\n }\n }\n\n if (event.nativeEvent.code === 'ArrowLeft') {\n event.stopPropagation();\n event.preventDefault();\n\n if (expanded && hasChildren) {\n tree.collapse(node.value);\n } else if (parent) {\n const root = findElementAncestor(event.currentTarget as HTMLElement, '[data-tree-root]');\n const parentElement = root?.querySelector<HTMLElement>(\n `[role=treeitem][data-value=\"${CSS.escape(parent)}\"]`\n );\n parentElement?.focus();\n }\n }\n\n if (event.nativeEvent.code === 'ArrowDown' || event.nativeEvent.code === 'ArrowUp') {\n const root = findElementAncestor(event.currentTarget as HTMLElement, '[data-tree-root]');\n\n if (!root) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n const nodes = Array.from(root.querySelectorAll<HTMLElement>('[role=treeitem]')).filter(\n (treeNode) => treeNode.style.display !== 'none'\n );\n const index = nodes.indexOf(event.currentTarget as HTMLElement);\n\n if (index === -1) {\n return;\n }\n\n const nextIndex = event.nativeEvent.code === 'ArrowDown' ? index + 1 : index - 1;\n nodes[nextIndex]?.focus();\n }\n\n if (event.nativeEvent.code === 'Space') {\n if (expandOnSpace) {\n event.stopPropagation();\n event.preventDefault();\n tree.toggleExpanded(node.value);\n }\n\n if (checkOnSpace) {\n event.stopPropagation();\n event.preventDefault();\n if (tree.isNodeChecked(node.value)) {\n tree.uncheckNode(node.value);\n } else {\n tree.checkNode(node.value);\n }\n }\n }\n };\n\n const elementProps = {\n className: classes.label,\n style: {} as React.CSSProperties,\n onClick: handleClick,\n 'data-selected': selected || undefined,\n 'data-value': node.value,\n };\n\n return (\n <div\n ref={ref}\n className={classes.node}\n style={{\n ...({\n '--label-offset': `calc(var(--level-offset, var(--mantine-spacing-lg)) * ${level - 1})`,\n } as React.CSSProperties),\n ...style,\n }}\n role=\"treeitem\"\n aria-selected={selected}\n aria-expanded={hasChildren ? expanded : undefined}\n data-value={node.value}\n data-selected={selected || undefined}\n data-level={level}\n tabIndex={tabIndex}\n onKeyDown={handleKeyDown}\n >\n {typeof renderNode === 'function' ? (\n renderNode({\n node,\n level,\n selected,\n tree,\n expanded,\n hasChildren,\n isLoading,\n loadError,\n elementProps,\n dragHandleProps: undefined,\n })\n ) : (\n <div {...elementProps}>{node.label}</div>\n )}\n </div>\n );\n});\n\nFlatTreeNode.displayName = '@mantine/core/FlatTreeNode';\n"],"mappings":"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"}
@@ -28,9 +28,13 @@ const defaultProps = {
28
28
  const varsResolver = require_create_vars_resolver.createVarsResolver((_theme, { levelOffset }) => ({ root: { "--level-offset": require_get_size.getSpacing(levelOffset) } }));
29
29
  const Tree = require_factory.factory((_props) => {
30
30
  const props = require_use_props.useProps("Tree", defaultProps, _props);
31
- const { classNames, className, style, styles, unstyled, vars, data, expandOnClick, tree, renderNode, selectOnClick, clearSelectionOnOutsideClick, allowRangeSelection, expandOnSpace, levelOffset, checkOnSpace, keepMounted, attributes, ref, ...others } = props;
31
+ const { classNames, className, style, styles, unstyled, vars, data, expandOnClick, tree, renderNode, selectOnClick, clearSelectionOnOutsideClick, allowRangeSelection, expandOnSpace, levelOffset, checkOnSpace, keepMounted, onDragDrop, allowDrop, withDragHandle, withLines, attributes, ref, ...others } = props;
32
32
  const defaultController = require_use_tree.useTree();
33
33
  const controller = tree || defaultController;
34
+ const dragStateRef = (0, react.useRef)({
35
+ draggedValue: null,
36
+ currentDropTarget: null
37
+ });
34
38
  const getStyles = require_use_styles.useStyles({
35
39
  name: "Tree",
36
40
  classes: require_Tree_module.default,
@@ -61,7 +65,12 @@ const Tree = require_factory.factory((_props) => {
61
65
  allowRangeSelection,
62
66
  expandOnSpace,
63
67
  checkOnSpace,
64
- keepMounted
68
+ keepMounted,
69
+ onDragDrop,
70
+ allowDrop,
71
+ withDragHandle,
72
+ dragStateRef,
73
+ data
65
74
  }, node.value));
66
75
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Box.Box, {
67
76
  component: "ul",
@@ -71,6 +80,7 @@ const Tree = require_factory.factory((_props) => {
71
80
  role: "tree",
72
81
  "aria-multiselectable": controller.multiple,
73
82
  "data-tree-root": true,
83
+ "data-with-lines": withLines || void 0,
74
84
  children: nodes
75
85
  });
76
86
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.cjs","names":["createVarsResolver","getSpacing","factory","useProps","useTree","useStyles","TreeNode","Box","classes"],"sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { useClickOutside, useMergedRef } from '@mantine/hooks';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getSpacing,\n MantineSpacing,\n StylesApiProps,\n useProps,\n useStyles,\n} from '../../core';\nimport { TreeNode } from './TreeNode';\nimport { TreeController, useTree } from './use-tree';\nimport classes from './Tree.module.css';\n\nexport interface TreeNodeData {\n label: React.ReactNode;\n value: string;\n nodeProps?: Record<string, any>;\n children?: TreeNodeData[];\n}\n\nexport interface RenderTreeNodePayload {\n /** Node level in the tree */\n level: number;\n\n /** `true` if the node is expanded, applicable only for nodes with `children` */\n expanded: boolean;\n\n /** `true` if the node has non-empty `children` array */\n hasChildren: boolean;\n\n /** `true` if the node is selected */\n selected: boolean;\n\n /** Node data from the `data` prop of `Tree` */\n node: TreeNodeData;\n\n /** Tree controller instance, return value of `useTree` hook */\n tree: TreeController;\n\n /** Props to spread into the root node element */\n elementProps: {\n className: string;\n style: React.CSSProperties;\n onClick: (event: React.MouseEvent) => void;\n 'data-selected': boolean | undefined;\n 'data-value': string;\n };\n}\n\nexport type RenderNode = (payload: RenderTreeNodePayload) => React.ReactNode;\n\nexport type TreeStylesNames = 'root' | 'node' | 'subtree' | 'label';\nexport type TreeCssVariables = {\n root: '--level-offset';\n};\n\nexport interface TreeProps extends BoxProps, StylesApiProps<TreeFactory>, ElementProps<'ul'> {\n /** Data used to render nodes */\n data: TreeNodeData[];\n\n /** Horizontal padding of each subtree level, key of `theme.spacing` or any valid CSS value @default 'lg' */\n levelOffset?: MantineSpacing;\n\n /** If set, tree node with children is expanded on click @default true */\n expandOnClick?: boolean;\n\n /** If set, tree node with children is expanded on space key press @default true */\n expandOnSpace?: boolean;\n\n /** If set, tree node is checked on space key press @default false */\n checkOnSpace?: boolean;\n\n /** If set, tree node is selected on click @default false */\n selectOnClick?: boolean;\n\n /** Use-tree hook instance that can be used to manipulate component state */\n tree?: TreeController;\n\n /** A function to render tree node label */\n renderNode?: RenderNode;\n\n /** If set, selection is cleared when user clicks outside of the tree @default false */\n clearSelectionOnOutsideClick?: boolean;\n\n /** If set, tree nodes range can be selected with click when `Shift` key is pressed @default true */\n allowRangeSelection?: boolean;\n\n /** If set, subtree content is kept mounted when collapsed. React 19 `Activity` is used to preserve state. @default false */\n keepMounted?: boolean;\n}\n\nfunction getFlatValues(data: TreeNodeData[]): string[] {\n return data.reduce<string[]>((acc, item) => {\n acc.push(item.value);\n if (item.children) {\n acc.push(...getFlatValues(item.children));\n }\n return acc;\n }, []);\n}\n\nexport type TreeFactory = Factory<{\n props: TreeProps;\n ref: HTMLUListElement;\n stylesNames: TreeStylesNames;\n vars: TreeCssVariables;\n}>;\n\nconst defaultProps = {\n expandOnClick: true,\n allowRangeSelection: true,\n expandOnSpace: true,\n} satisfies Partial<TreeProps>;\n\nconst varsResolver = createVarsResolver<TreeFactory>((_theme, { levelOffset }) => ({\n root: {\n '--level-offset': getSpacing(levelOffset),\n },\n}));\n\nexport const Tree = factory<TreeFactory>((_props) => {\n const props = useProps('Tree', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n data,\n expandOnClick,\n tree,\n renderNode,\n selectOnClick,\n clearSelectionOnOutsideClick,\n allowRangeSelection,\n expandOnSpace,\n levelOffset,\n checkOnSpace,\n keepMounted,\n attributes,\n ref,\n ...others\n } = props;\n\n const defaultController = useTree();\n const controller = tree || defaultController;\n\n const getStyles = useStyles<TreeFactory>({\n name: 'Tree',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const clickOutsideRef = useClickOutside(\n () => clearSelectionOnOutsideClick && controller.clearSelected()\n );\n\n const mergedRef = useMergedRef(ref, clickOutsideRef);\n\n const flatValues = useMemo(() => getFlatValues(data), [data]);\n\n useEffect(() => {\n controller.initialize(data);\n }, [data]);\n\n const nodes = data.map((node, index) => (\n <TreeNode\n key={node.value}\n node={node}\n getStyles={getStyles}\n rootIndex={index}\n expandOnClick={expandOnClick}\n selectOnClick={selectOnClick}\n controller={controller}\n renderNode={renderNode}\n flatValues={flatValues}\n allowRangeSelection={allowRangeSelection}\n expandOnSpace={expandOnSpace}\n checkOnSpace={checkOnSpace}\n keepMounted={keepMounted}\n />\n ));\n\n return (\n <Box\n component=\"ul\"\n ref={mergedRef}\n {...getStyles('root')}\n {...others}\n role=\"tree\"\n aria-multiselectable={controller.multiple}\n data-tree-root\n >\n {nodes}\n </Box>\n );\n});\n\nTree.displayName = '@mantine/core/Tree';\nTree.classes = classes;\nTree.varsResolver = varsResolver;\n\nexport namespace Tree {\n export type Props = TreeProps;\n export type StylesNames = TreeStylesNames;\n export type Factory = TreeFactory;\n export type NodeData = TreeNodeData;\n export type RenderNodePayload = RenderTreeNodePayload;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAiGA,SAAS,cAAc,MAAgC;AACrD,QAAO,KAAK,QAAkB,KAAK,SAAS;AAC1C,MAAI,KAAK,KAAK,MAAM;AACpB,MAAI,KAAK,SACP,KAAI,KAAK,GAAG,cAAc,KAAK,SAAS,CAAC;AAE3C,SAAO;IACN,EAAE,CAAC;;AAUR,MAAM,eAAe;CACnB,eAAe;CACf,qBAAqB;CACrB,eAAe;CAChB;AAED,MAAM,eAAeA,6BAAAA,oBAAiC,QAAQ,EAAE,mBAAmB,EACjF,MAAM,EACJ,kBAAkBC,iBAAAA,WAAW,YAAY,EAC1C,EACF,EAAE;AAEH,MAAa,OAAOC,gBAAAA,SAAsB,WAAW;CACnD,MAAM,QAAQC,kBAAAA,SAAS,QAAQ,cAAc,OAAO;CACpD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,MACA,eACA,MACA,YACA,eACA,8BACA,qBACA,eACA,aACA,cACA,aACA,YACA,KACA,GAAG,WACD;CAEJ,MAAM,oBAAoBC,iBAAAA,SAAS;CACnC,MAAM,aAAa,QAAQ;CAE3B,MAAM,YAAYC,mBAAAA,UAAuB;EACvC,MAAM;EACN,SAAA,oBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAMF,MAAM,aAAA,GAAA,eAAA,cAAyB,MAAA,GAAA,eAAA,uBAHvB,gCAAgC,WAAW,eAAe,CACjE,CAEmD;CAEpD,MAAM,cAAA,GAAA,MAAA,eAA2B,cAAc,KAAK,EAAE,CAAC,KAAK,CAAC;AAE7D,EAAA,GAAA,MAAA,iBAAgB;AACd,aAAW,WAAW,KAAK;IAC1B,CAAC,KAAK,CAAC;CAEV,MAAM,QAAQ,KAAK,KAAK,MAAM,UAC5B,iBAAA,GAAA,kBAAA,KAACC,iBAAAA,UAAD;EAEQ;EACK;EACX,WAAW;EACI;EACA;EACH;EACA;EACA;EACS;EACN;EACD;EACD;EACb,EAbK,KAAK,MAaV,CACF;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EACE,WAAU;EACV,KAAK;EACL,GAAI,UAAU,OAAO;EACrB,GAAI;EACJ,MAAK;EACL,wBAAsB,WAAW;EACjC,kBAAA;YAEC;EACG,CAAA;EAER;AAEF,KAAK,cAAc;AACnB,KAAK,UAAUC,oBAAAA;AACf,KAAK,eAAe"}
1
+ {"version":3,"file":"Tree.cjs","names":["createVarsResolver","getSpacing","factory","useProps","useTree","useStyles","TreeNode","Box","classes"],"sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { useClickOutside, useMergedRef } from '@mantine/hooks';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getSpacing,\n MantineSpacing,\n StylesApiProps,\n useProps,\n useStyles,\n} from '../../core';\nimport type { TreeDragDropPayload } from './move-tree-node/move-tree-node';\nimport { TreeNode } from './TreeNode';\nimport type { TreeAllowDrop, TreeDragHandleProps } from './use-tree-node-drag-drop';\nimport { TreeController, useTree } from './use-tree';\nimport classes from './Tree.module.css';\n\nexport interface TreeNodeData {\n label: React.ReactNode;\n value: string;\n nodeProps?: Record<string, any>;\n children?: TreeNodeData[];\n hasChildren?: boolean;\n}\n\nexport interface RenderTreeNodePayload {\n /** Node level in the tree */\n level: number;\n\n /** `true` if the node is expanded, applicable only for nodes with `children` */\n expanded: boolean;\n\n /** `true` if the node has non-empty `children` array or `hasChildren` is set to `true` in the data */\n hasChildren: boolean;\n\n /** `true` if the node is selected */\n selected: boolean;\n\n /** `true` if the node's children are currently being loaded */\n isLoading: boolean;\n\n /** Error from the last failed load attempt, or `null` */\n loadError: Error | null;\n\n /** Node data from the `data` prop of `Tree` */\n node: TreeNodeData;\n\n /** Tree controller instance, return value of `useTree` hook */\n tree: TreeController;\n\n /** Props to spread into the root node element */\n elementProps: {\n className: string;\n style: React.CSSProperties;\n onClick: (event: React.MouseEvent) => void;\n 'data-selected': boolean | undefined;\n 'data-value': string;\n draggable?: boolean;\n onDragStart?: (event: React.DragEvent) => void;\n onDragOver?: (event: React.DragEvent) => void;\n onDragLeave?: (event: React.DragEvent) => void;\n onDrop?: (event: React.DragEvent) => void;\n onDragEnd?: (event: React.DragEvent) => void;\n };\n\n /** Props to spread into the drag handle element when `withDragHandle` is set on `Tree`.\n * `undefined` when `withDragHandle` is not enabled or drag-and-drop is disabled. */\n dragHandleProps: TreeDragHandleProps | undefined;\n}\n\nexport type RenderNode = (payload: RenderTreeNodePayload) => React.ReactNode;\n\nexport type TreeStylesNames = 'root' | 'node' | 'subtree' | 'label';\nexport type TreeCssVariables = {\n root: '--level-offset';\n};\n\nexport interface TreeDragState {\n draggedValue: string | null;\n currentDropTarget: HTMLElement | null;\n}\n\nexport interface TreeProps extends BoxProps, StylesApiProps<TreeFactory>, ElementProps<'ul'> {\n /** Data used to render nodes */\n data: TreeNodeData[];\n\n /** Horizontal padding of each subtree level, key of `theme.spacing` or any valid CSS value @default 'lg' */\n levelOffset?: MantineSpacing;\n\n /** If set, tree node with children is expanded on click @default true */\n expandOnClick?: boolean;\n\n /** If set, tree node with children is expanded on space key press @default true */\n expandOnSpace?: boolean;\n\n /** If set, tree node is checked on space key press @default false */\n checkOnSpace?: boolean;\n\n /** If set, tree node is selected on click @default false */\n selectOnClick?: boolean;\n\n /** Use-tree hook instance that can be used to manipulate component state */\n tree?: TreeController;\n\n /** A function to render tree node label */\n renderNode?: RenderNode;\n\n /** If set, selection is cleared when user clicks outside of the tree @default false */\n clearSelectionOnOutsideClick?: boolean;\n\n /** If set, tree nodes range can be selected with click when `Shift` key is pressed @default true */\n allowRangeSelection?: boolean;\n\n /** If set, subtree content is kept mounted when collapsed. React 19 `Activity` is used to preserve state. @default false */\n keepMounted?: boolean;\n\n /** Called when a node is dropped on another node, enables drag-and-drop when provided */\n onDragDrop?: (payload: TreeDragDropPayload) => void;\n\n /** Called for each potential drop target to determine whether a drop is allowed.\n * When it returns `false`, the drop indicator is hidden and the drop is rejected. */\n allowDrop?: TreeAllowDrop;\n\n /** If set, drag-and-drop must be initiated from an element that spreads `dragHandleProps`\n * from the `renderNode` payload, rather than anywhere on the node. @default false */\n withDragHandle?: boolean;\n\n /** If set, connecting lines are rendered showing parent-child relationships @default false */\n withLines?: boolean;\n}\n\nfunction getFlatValues(data: TreeNodeData[]): string[] {\n return data.reduce<string[]>((acc, item) => {\n acc.push(item.value);\n if (item.children) {\n acc.push(...getFlatValues(item.children));\n }\n return acc;\n }, []);\n}\n\nexport type TreeFactory = Factory<{\n props: TreeProps;\n ref: HTMLUListElement;\n stylesNames: TreeStylesNames;\n vars: TreeCssVariables;\n}>;\n\nconst defaultProps = {\n expandOnClick: true,\n allowRangeSelection: true,\n expandOnSpace: true,\n} satisfies Partial<TreeProps>;\n\nconst varsResolver = createVarsResolver<TreeFactory>((_theme, { levelOffset }) => ({\n root: {\n '--level-offset': getSpacing(levelOffset),\n },\n}));\n\nexport const Tree = factory<TreeFactory>((_props) => {\n const props = useProps('Tree', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n data,\n expandOnClick,\n tree,\n renderNode,\n selectOnClick,\n clearSelectionOnOutsideClick,\n allowRangeSelection,\n expandOnSpace,\n levelOffset,\n checkOnSpace,\n keepMounted,\n onDragDrop,\n allowDrop,\n withDragHandle,\n withLines,\n attributes,\n ref,\n ...others\n } = props;\n\n const defaultController = useTree();\n const controller = tree || defaultController;\n\n const dragStateRef = useRef<TreeDragState>({ draggedValue: null, currentDropTarget: null });\n\n const getStyles = useStyles<TreeFactory>({\n name: 'Tree',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const clickOutsideRef = useClickOutside(\n () => clearSelectionOnOutsideClick && controller.clearSelected()\n );\n\n const mergedRef = useMergedRef(ref, clickOutsideRef);\n\n const flatValues = useMemo(() => getFlatValues(data), [data]);\n\n useEffect(() => {\n controller.initialize(data);\n }, [data]);\n\n const nodes = data.map((node, index) => (\n <TreeNode\n key={node.value}\n node={node}\n getStyles={getStyles}\n rootIndex={index}\n expandOnClick={expandOnClick}\n selectOnClick={selectOnClick}\n controller={controller}\n renderNode={renderNode}\n flatValues={flatValues}\n allowRangeSelection={allowRangeSelection}\n expandOnSpace={expandOnSpace}\n checkOnSpace={checkOnSpace}\n keepMounted={keepMounted}\n onDragDrop={onDragDrop}\n allowDrop={allowDrop}\n withDragHandle={withDragHandle}\n dragStateRef={dragStateRef}\n data={data}\n />\n ));\n\n return (\n <Box\n component=\"ul\"\n ref={mergedRef}\n {...getStyles('root')}\n {...others}\n role=\"tree\"\n aria-multiselectable={controller.multiple}\n data-tree-root\n data-with-lines={withLines || undefined}\n >\n {nodes}\n </Box>\n );\n});\n\nTree.displayName = '@mantine/core/Tree';\nTree.classes = classes;\nTree.varsResolver = varsResolver;\n\nexport namespace Tree {\n export type Props = TreeProps;\n export type StylesNames = TreeStylesNames;\n export type Factory = TreeFactory;\n export type NodeData = TreeNodeData;\n export type RenderNodePayload = RenderTreeNodePayload;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuIA,SAAS,cAAc,MAAgC;AACrD,QAAO,KAAK,QAAkB,KAAK,SAAS;AAC1C,MAAI,KAAK,KAAK,MAAM;AACpB,MAAI,KAAK,SACP,KAAI,KAAK,GAAG,cAAc,KAAK,SAAS,CAAC;AAE3C,SAAO;IACN,EAAE,CAAC;;AAUR,MAAM,eAAe;CACnB,eAAe;CACf,qBAAqB;CACrB,eAAe;CAChB;AAED,MAAM,eAAeA,6BAAAA,oBAAiC,QAAQ,EAAE,mBAAmB,EACjF,MAAM,EACJ,kBAAkBC,iBAAAA,WAAW,YAAY,EAC1C,EACF,EAAE;AAEH,MAAa,OAAOC,gBAAAA,SAAsB,WAAW;CACnD,MAAM,QAAQC,kBAAAA,SAAS,QAAQ,cAAc,OAAO;CACpD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,MACA,eACA,MACA,YACA,eACA,8BACA,qBACA,eACA,aACA,cACA,aACA,YACA,WACA,gBACA,WACA,YACA,KACA,GAAG,WACD;CAEJ,MAAM,oBAAoBC,iBAAAA,SAAS;CACnC,MAAM,aAAa,QAAQ;CAE3B,MAAM,gBAAA,GAAA,MAAA,QAAqC;EAAE,cAAc;EAAM,mBAAmB;EAAM,CAAC;CAE3F,MAAM,YAAYC,mBAAAA,UAAuB;EACvC,MAAM;EACN,SAAA,oBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAMF,MAAM,aAAA,GAAA,eAAA,cAAyB,MAAA,GAAA,eAAA,uBAHvB,gCAAgC,WAAW,eAAe,CACjE,CAEmD;CAEpD,MAAM,cAAA,GAAA,MAAA,eAA2B,cAAc,KAAK,EAAE,CAAC,KAAK,CAAC;AAE7D,EAAA,GAAA,MAAA,iBAAgB;AACd,aAAW,WAAW,KAAK;IAC1B,CAAC,KAAK,CAAC;CAEV,MAAM,QAAQ,KAAK,KAAK,MAAM,UAC5B,iBAAA,GAAA,kBAAA,KAACC,iBAAAA,UAAD;EAEQ;EACK;EACX,WAAW;EACI;EACA;EACH;EACA;EACA;EACS;EACN;EACD;EACD;EACD;EACD;EACK;EACF;EACR;EACN,EAlBK,KAAK,MAkBV,CACF;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EACE,WAAU;EACV,KAAK;EACL,GAAI,UAAU,OAAO;EACrB,GAAI;EACJ,MAAK;EACL,wBAAsB,WAAW;EACjC,kBAAA;EACA,mBAAiB,aAAa,KAAA;YAE7B;EACG,CAAA;EAER;AAEF,KAAK,cAAc;AACnB,KAAK,UAAUC,oBAAAA;AACf,KAAK,eAAe"}