@recursica/adapter-mantine-v8 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/.storybook/commonArgTypes.ts +148 -0
  2. package/ARCHITECTURE.md +18 -0
  3. package/CHANGELOG.md +688 -0
  4. package/LICENSE +21 -0
  5. package/OVERSTYLING.md +56 -0
  6. package/README.md +70 -0
  7. package/SETUP.md +93 -0
  8. package/USAGE.md +57 -0
  9. package/dist/adapter-mantine-v8.cjs +12 -0
  10. package/dist/adapter-mantine-v8.cjs.map +1 -0
  11. package/dist/adapter-mantine-v8.css +1 -0
  12. package/dist/adapter-mantine-v8.js +5759 -0
  13. package/dist/adapter-mantine-v8.js.map +1 -0
  14. package/dist/index.d.ts +2095 -0
  15. package/dist/test.html +1 -0
  16. package/dist/vite.svg +1 -0
  17. package/docs/PHILOSOPHY.md +39 -0
  18. package/llms.txt +74 -0
  19. package/package.json +131 -0
  20. package/recursica_brand.json +2677 -0
  21. package/recursica_tokens.json +799 -0
  22. package/recursica_ui-kit.json +14981 -0
  23. package/recursica_variables_scoped.css +30489 -0
  24. package/src/GlobalExemptions.modules.css +7 -0
  25. package/src/Introduction.stories.tsx +154 -0
  26. package/src/OverStyling.tsx +79 -0
  27. package/src/Version.tsx +44 -0
  28. package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +72 -0
  29. package/src/components/Accordion/Accordion.module.css +367 -0
  30. package/src/components/Accordion/Accordion.stories.tsx +189 -0
  31. package/src/components/Accordion/Accordion.test.tsx +1 -0
  32. package/src/components/Accordion/Accordion.tsx +220 -0
  33. package/src/components/Accordion/USAGE.md +51 -0
  34. package/src/components/Accordion/index.ts +1 -0
  35. package/src/components/AssistiveElement/ASSISTIVEELEMENT_IMPLEMENTATION_NOTES.md +45 -0
  36. package/src/components/AssistiveElement/AssistiveElement.module.css +111 -0
  37. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +68 -0
  38. package/src/components/AssistiveElement/AssistiveElement.test.tsx +1 -0
  39. package/src/components/AssistiveElement/AssistiveElement.tsx +93 -0
  40. package/src/components/AssistiveElement/USAGE.md +36 -0
  41. package/src/components/AutoComplete/AUTOCOMPLETE_IMPLEMENTATION_NOTES.md +42 -0
  42. package/src/components/AutoComplete/AutoComplete.module.css +430 -0
  43. package/src/components/AutoComplete/AutoComplete.stories.tsx +336 -0
  44. package/src/components/AutoComplete/AutoComplete.test.tsx +1 -0
  45. package/src/components/AutoComplete/AutoComplete.tsx +179 -0
  46. package/src/components/AutoComplete/USAGE.md +80 -0
  47. package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +34 -0
  48. package/src/components/Avatar/Avatar.module.css +336 -0
  49. package/src/components/Avatar/Avatar.stories.tsx +92 -0
  50. package/src/components/Avatar/Avatar.test.tsx +1 -0
  51. package/src/components/Avatar/Avatar.tsx +108 -0
  52. package/src/components/Avatar/USAGE.md +38 -0
  53. package/src/components/Avatar/index.ts +1 -0
  54. package/src/components/Badge/BADGE_IMPLEMENTATION_NOTES.md +18 -0
  55. package/src/components/Badge/Badge.module.css +127 -0
  56. package/src/components/Badge/Badge.stories.tsx +78 -0
  57. package/src/components/Badge/Badge.test.tsx +1 -0
  58. package/src/components/Badge/Badge.tsx +64 -0
  59. package/src/components/Badge/USAGE.md +56 -0
  60. package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +47 -0
  61. package/src/components/Breadcrumb/Breadcrumb.module.css +48 -0
  62. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +114 -0
  63. package/src/components/Breadcrumb/Breadcrumb.test.tsx +1 -0
  64. package/src/components/Breadcrumb/Breadcrumb.tsx +85 -0
  65. package/src/components/Breadcrumb/USAGE.md +55 -0
  66. package/src/components/Breadcrumb/markCurrentPageItem.test.ts +49 -0
  67. package/src/components/Button/Button.module.css +446 -0
  68. package/src/components/Button/Button.stories.tsx +196 -0
  69. package/src/components/Button/Button.styleIsolation.dom.test.tsx +98 -0
  70. package/src/components/Button/Button.tsx +184 -0
  71. package/src/components/Button/IMPLEMENTATION_NOTES.md +109 -0
  72. package/src/components/Button/USAGE.md +80 -0
  73. package/src/components/Button/index.ts +1 -0
  74. package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +17 -0
  75. package/src/components/Card/Card.module.css +119 -0
  76. package/src/components/Card/Card.stories.tsx +131 -0
  77. package/src/components/Card/Card.test.tsx +1 -0
  78. package/src/components/Card/Card.tsx +248 -0
  79. package/src/components/Card/USAGE.md +63 -0
  80. package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +25 -0
  81. package/src/components/Checkbox/Checkbox.module.css +267 -0
  82. package/src/components/Checkbox/Checkbox.stories.tsx +97 -0
  83. package/src/components/Checkbox/Checkbox.test.tsx +1 -0
  84. package/src/components/Checkbox/Checkbox.tsx +151 -0
  85. package/src/components/Checkbox/CheckboxGroup.stories.tsx +139 -0
  86. package/src/components/Checkbox/CheckboxGroup.tsx +147 -0
  87. package/src/components/Checkbox/USAGE.md +48 -0
  88. package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +110 -0
  89. package/src/components/Chip/Chip.module.css +288 -0
  90. package/src/components/Chip/Chip.stories.tsx +128 -0
  91. package/src/components/Chip/Chip.test.tsx +1 -0
  92. package/src/components/Chip/Chip.tsx +157 -0
  93. package/src/components/Chip/USAGE.md +55 -0
  94. package/src/components/Container/CONTAINER_IMPLEMENTATION_NOTES.md +4 -0
  95. package/src/components/Container/Container.module.css +7 -0
  96. package/src/components/Container/Container.stories.tsx +118 -0
  97. package/src/components/Container/Container.test.tsx +1 -0
  98. package/src/components/Container/Container.tsx +69 -0
  99. package/src/components/Container/USAGE.md +47 -0
  100. package/src/components/DatePicker/DATEPICKER_IMPLEMENTATION_NOTES.md +31 -0
  101. package/src/components/DatePicker/DatePicker.icons.tsx +27 -0
  102. package/src/components/DatePicker/DatePicker.module.css +566 -0
  103. package/src/components/DatePicker/DatePicker.stories.tsx +158 -0
  104. package/src/components/DatePicker/DatePicker.test.tsx +1 -0
  105. package/src/components/DatePicker/DatePicker.tsx +218 -0
  106. package/src/components/DatePicker/USAGE.md +49 -0
  107. package/src/components/Dropdown/BareDropdown.tsx +97 -0
  108. package/src/components/Dropdown/DROPDOWN_IMPLEMENTATION_NOTES.md +12 -0
  109. package/src/components/Dropdown/Dropdown.module.css +477 -0
  110. package/src/components/Dropdown/Dropdown.stories.tsx +252 -0
  111. package/src/components/Dropdown/Dropdown.test.tsx +1 -0
  112. package/src/components/Dropdown/Dropdown.tsx +213 -0
  113. package/src/components/Dropdown/USAGE.md +69 -0
  114. package/src/components/FileInput/FILEINPUT_IMPLEMENTATION_NOTES.md +153 -0
  115. package/src/components/FileInput/FileInput.module.css +280 -0
  116. package/src/components/FileInput/FileInput.stories.tsx +313 -0
  117. package/src/components/FileInput/FileInput.test.tsx +1 -0
  118. package/src/components/FileInput/FileInput.tsx +417 -0
  119. package/src/components/FileInput/USAGE.md +145 -0
  120. package/src/components/FileUpload/FILEUPLOAD_IMPLEMENTATION_NOTES.md +244 -0
  121. package/src/components/FileUpload/FileUpload.module.css +205 -0
  122. package/src/components/FileUpload/FileUpload.stories.tsx +362 -0
  123. package/src/components/FileUpload/FileUpload.test.tsx +1 -0
  124. package/src/components/FileUpload/FileUpload.tsx +354 -0
  125. package/src/components/FileUpload/USAGE.md +199 -0
  126. package/src/components/Flex/FLEX_IMPLEMENTATION_NOTES.md +4 -0
  127. package/src/components/Flex/Flex.module.css +7 -0
  128. package/src/components/Flex/Flex.stories.tsx +128 -0
  129. package/src/components/Flex/Flex.test.tsx +1 -0
  130. package/src/components/Flex/Flex.tsx +75 -0
  131. package/src/components/Flex/USAGE.md +48 -0
  132. package/src/components/FormControlLayout/FormControlLayout.module.css +90 -0
  133. package/src/components/FormControlLayout/FormControlLayout.stories.tsx +118 -0
  134. package/src/components/FormControlLayout/FormControlLayout.test.tsx +1 -0
  135. package/src/components/FormControlLayout/FormControlLayout.tsx +74 -0
  136. package/src/components/FormControlLayout/USAGE.md +40 -0
  137. package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +32 -0
  138. package/src/components/FormControlWrapper/FormControlWrapper.module.css +75 -0
  139. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +129 -0
  140. package/src/components/FormControlWrapper/FormControlWrapper.test.tsx +1 -0
  141. package/src/components/FormControlWrapper/FormControlWrapper.tsx +151 -0
  142. package/src/components/FormControlWrapper/USAGE.md +47 -0
  143. package/src/components/Grid/GRID_IMPLEMENTATION_NOTES.md +18 -0
  144. package/src/components/Grid/Grid.module.css +11 -0
  145. package/src/components/Grid/Grid.stories.tsx +206 -0
  146. package/src/components/Grid/Grid.test.tsx +1 -0
  147. package/src/components/Grid/Grid.tsx +140 -0
  148. package/src/components/Grid/USAGE.md +47 -0
  149. package/src/components/Group/GROUP_IMPLEMENTATION_NOTES.md +4 -0
  150. package/src/components/Group/Group.module.css +7 -0
  151. package/src/components/Group/Group.stories.tsx +120 -0
  152. package/src/components/Group/Group.test.tsx +1 -0
  153. package/src/components/Group/Group.tsx +60 -0
  154. package/src/components/Group/USAGE.md +48 -0
  155. package/src/components/Heading/HEADING_IMPLEMENTATION_NOTES.md +18 -0
  156. package/src/components/Heading/Heading.module.css +13 -0
  157. package/src/components/Heading/Heading.stories.tsx +50 -0
  158. package/src/components/Heading/Heading.test.tsx +1 -0
  159. package/src/components/Heading/Heading.tsx +52 -0
  160. package/src/components/Heading/USAGE.md +36 -0
  161. package/src/components/HoverCard/HOVERCARD_IMPLEMENTATION_NOTES.md +77 -0
  162. package/src/components/HoverCard/HoverCard.module.css +90 -0
  163. package/src/components/HoverCard/HoverCard.stories.tsx +172 -0
  164. package/src/components/HoverCard/HoverCard.test.tsx +1 -0
  165. package/src/components/HoverCard/HoverCard.tsx +133 -0
  166. package/src/components/HoverCard/USAGE.md +52 -0
  167. package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +48 -0
  168. package/src/components/Label/Label.module.css +141 -0
  169. package/src/components/Label/Label.stories.tsx +131 -0
  170. package/src/components/Label/Label.test.tsx +1 -0
  171. package/src/components/Label/Label.tsx +113 -0
  172. package/src/components/Label/USAGE.md +47 -0
  173. package/src/components/Label/index.ts +1 -0
  174. package/src/components/Layer/USAGE.md +54 -0
  175. package/src/components/Link/IMPLEMENTATION_NOTES.md +19 -0
  176. package/src/components/Link/Link.module.css +110 -0
  177. package/src/components/Link/Link.stories.tsx +58 -0
  178. package/src/components/Link/Link.test.tsx +1 -0
  179. package/src/components/Link/Link.tsx +67 -0
  180. package/src/components/Link/USAGE.md +56 -0
  181. package/src/components/Link/index.ts +1 -0
  182. package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +24 -0
  183. package/src/components/Loader/Loader.animate.dom.test.tsx +82 -0
  184. package/src/components/Loader/Loader.module.css +63 -0
  185. package/src/components/Loader/Loader.stories.tsx +123 -0
  186. package/src/components/Loader/Loader.test.tsx +1 -0
  187. package/src/components/Loader/Loader.tsx +69 -0
  188. package/src/components/Loader/USAGE.md +44 -0
  189. package/src/components/Menu/MENU_IMPLEMENTATION_NOTES.md +88 -0
  190. package/src/components/Menu/Menu.module.css +280 -0
  191. package/src/components/Menu/Menu.stories.tsx +371 -0
  192. package/src/components/Menu/Menu.test.tsx +1 -0
  193. package/src/components/Menu/Menu.tsx +373 -0
  194. package/src/components/Menu/USAGE.md +55 -0
  195. package/src/components/Modal/MODAL_IMPLEMENTATION_NOTES.md +32 -0
  196. package/src/components/Modal/Modal.module.css +302 -0
  197. package/src/components/Modal/Modal.stories.tsx +105 -0
  198. package/src/components/Modal/Modal.test.tsx +1 -0
  199. package/src/components/Modal/Modal.tsx +368 -0
  200. package/src/components/Modal/USAGE.md +58 -0
  201. package/src/components/Modal/index.ts +1 -0
  202. package/src/components/NumberInput/NUMBER_INPUT_IMPLEMENTATION_NOTES.md +24 -0
  203. package/src/components/NumberInput/NumberInput.module.css +302 -0
  204. package/src/components/NumberInput/NumberInput.stories.tsx +96 -0
  205. package/src/components/NumberInput/NumberInput.test.tsx +1 -0
  206. package/src/components/NumberInput/NumberInput.tsx +157 -0
  207. package/src/components/NumberInput/USAGE.md +52 -0
  208. package/src/components/Pagination/IMPLEMENTATION_NOTES.md +16 -0
  209. package/src/components/Pagination/Pagination.icons.tsx +66 -0
  210. package/src/components/Pagination/Pagination.module.css +188 -0
  211. package/src/components/Pagination/Pagination.stories.tsx +48 -0
  212. package/src/components/Pagination/Pagination.test.tsx +1 -0
  213. package/src/components/Pagination/Pagination.tsx +265 -0
  214. package/src/components/Pagination/USAGE.md +36 -0
  215. package/src/components/Pagination/index.ts +5 -0
  216. package/src/components/Panel/PANEL_IMPLEMENTATION_NOTES.md +116 -0
  217. package/src/components/Panel/Panel.module.css +209 -0
  218. package/src/components/Panel/Panel.stories.tsx +227 -0
  219. package/src/components/Panel/Panel.test.tsx +1 -0
  220. package/src/components/Panel/Panel.tsx +269 -0
  221. package/src/components/Panel/USAGE.md +56 -0
  222. package/src/components/Popover/IMPLEMENTATION_NOTES.md +77 -0
  223. package/src/components/Popover/Popover.module.css +86 -0
  224. package/src/components/Popover/Popover.stories.tsx +133 -0
  225. package/src/components/Popover/Popover.test.tsx +1 -0
  226. package/src/components/Popover/Popover.tsx +142 -0
  227. package/src/components/Popover/USAGE.md +61 -0
  228. package/src/components/Popover/index.ts +1 -0
  229. package/src/components/Radio/Radio.module.css +231 -0
  230. package/src/components/Radio/Radio.stories.tsx +93 -0
  231. package/src/components/Radio/Radio.test.tsx +1 -0
  232. package/src/components/Radio/Radio.tsx +168 -0
  233. package/src/components/Radio/RadioGroup.stories.tsx +117 -0
  234. package/src/components/Radio/RadioGroup.tsx +124 -0
  235. package/src/components/Radio/USAGE.md +36 -0
  236. package/src/components/ReadOnlyField/READ_ONLY_FIELD_IMPLEMENTATION_NOTES.md +15 -0
  237. package/src/components/ReadOnlyField/ReadOnlyBooleanField.tsx +21 -0
  238. package/src/components/ReadOnlyField/ReadOnlyField.module.css +54 -0
  239. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +163 -0
  240. package/src/components/ReadOnlyField/ReadOnlyField.test.tsx +1 -0
  241. package/src/components/ReadOnlyField/ReadOnlyField.tsx +114 -0
  242. package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
  243. package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
  244. package/src/components/ReadOnlyField/USAGE.md +44 -0
  245. package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
  246. package/src/components/ReadOnlyField/index.ts +5 -0
  247. package/src/components/RecursicaThemeProvider/USAGE.md +60 -0
  248. package/src/components/SegmentedControl/IMPLEMENTATION_NOTES.md +25 -0
  249. package/src/components/SegmentedControl/SegmentedControl.module.css +185 -0
  250. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +106 -0
  251. package/src/components/SegmentedControl/SegmentedControl.test.tsx +1 -0
  252. package/src/components/SegmentedControl/SegmentedControl.tsx +110 -0
  253. package/src/components/SegmentedControl/USAGE.md +55 -0
  254. package/src/components/Slider/IMPLEMENTATION_NOTES.md +92 -0
  255. package/src/components/Slider/Slider.module.css +588 -0
  256. package/src/components/Slider/Slider.stories.tsx +282 -0
  257. package/src/components/Slider/Slider.test.tsx +1 -0
  258. package/src/components/Slider/Slider.tsx +391 -0
  259. package/src/components/Slider/USAGE.md +56 -0
  260. package/src/components/Stack/STACK_IMPLEMENTATION_NOTES.md +4 -0
  261. package/src/components/Stack/Stack.module.css +7 -0
  262. package/src/components/Stack/Stack.stories.tsx +108 -0
  263. package/src/components/Stack/Stack.test.tsx +1 -0
  264. package/src/components/Stack/Stack.tsx +62 -0
  265. package/src/components/Stack/USAGE.md +48 -0
  266. package/src/components/Stepper/IMPLEMENTATION_NOTES.md +28 -0
  267. package/src/components/Stepper/Stepper.module.css +404 -0
  268. package/src/components/Stepper/Stepper.stories.tsx +148 -0
  269. package/src/components/Stepper/Stepper.test.tsx +1 -0
  270. package/src/components/Stepper/Stepper.tsx +93 -0
  271. package/src/components/Stepper/USAGE.md +41 -0
  272. package/src/components/Switch/SWITCH_IMPLEMENTATION_NOTES.md +64 -0
  273. package/src/components/Switch/Switch.module.css +279 -0
  274. package/src/components/Switch/Switch.stories.tsx +114 -0
  275. package/src/components/Switch/Switch.test.tsx +1 -0
  276. package/src/components/Switch/Switch.tsx +177 -0
  277. package/src/components/Switch/SwitchGroup.stories.tsx +132 -0
  278. package/src/components/Switch/SwitchGroup.tsx +127 -0
  279. package/src/components/Switch/USAGE.md +42 -0
  280. package/src/components/Table/TABLE_IMPLEMENTATION_NOTES.md +78 -0
  281. package/src/components/Table/Table.icons.tsx +40 -0
  282. package/src/components/Table/Table.module.css +444 -0
  283. package/src/components/Table/Table.stories.tsx +140 -0
  284. package/src/components/Table/Table.test.tsx +1 -0
  285. package/src/components/Table/Table.tsx +243 -0
  286. package/src/components/Table/USAGE.md +78 -0
  287. package/src/components/Tabs/IMPLEMENTATION_NOTES.md +27 -0
  288. package/src/components/Tabs/Tabs.module.css +591 -0
  289. package/src/components/Tabs/Tabs.stories.tsx +154 -0
  290. package/src/components/Tabs/Tabs.test.tsx +1 -0
  291. package/src/components/Tabs/Tabs.tsx +114 -0
  292. package/src/components/Tabs/USAGE.md +45 -0
  293. package/src/components/Text/TEXT_IMPLEMENTATION_NOTES.md +12 -0
  294. package/src/components/Text/Text.module.css +13 -0
  295. package/src/components/Text/Text.stories.tsx +75 -0
  296. package/src/components/Text/Text.test.tsx +1 -0
  297. package/src/components/Text/Text.tsx +53 -0
  298. package/src/components/Text/USAGE.md +40 -0
  299. package/src/components/TextArea/TEXTAREA_IMPLEMENTATION_NOTES.md +7 -0
  300. package/src/components/TextArea/TextArea.module.css +183 -0
  301. package/src/components/TextArea/TextArea.stories.tsx +94 -0
  302. package/src/components/TextArea/TextArea.test.tsx +1 -0
  303. package/src/components/TextArea/TextArea.tsx +137 -0
  304. package/src/components/TextArea/USAGE.md +48 -0
  305. package/src/components/TextField/TEXTFIELD_IMPLEMENTATION_NOTES.md +19 -0
  306. package/src/components/TextField/TextField.module.css +264 -0
  307. package/src/components/TextField/TextField.stories.tsx +162 -0
  308. package/src/components/TextField/TextField.test.tsx +1 -0
  309. package/src/components/TextField/TextField.tsx +139 -0
  310. package/src/components/TextField/USAGE.md +44 -0
  311. package/src/components/TimePicker/TIMEPICKER_IMPLEMENTATION_NOTES.md +119 -0
  312. package/src/components/TimePicker/TimePicker.module.css +291 -0
  313. package/src/components/TimePicker/TimePicker.stories.tsx +141 -0
  314. package/src/components/TimePicker/TimePicker.test.tsx +1 -0
  315. package/src/components/TimePicker/TimePicker.tsx +304 -0
  316. package/src/components/TimePicker/USAGE.md +57 -0
  317. package/src/components/Timeline/TIMELINE_IMPLEMENTATION_NOTES.md +13 -0
  318. package/src/components/Timeline/Timeline.module.css +373 -0
  319. package/src/components/Timeline/Timeline.stories.tsx +128 -0
  320. package/src/components/Timeline/Timeline.test.tsx +1 -0
  321. package/src/components/Timeline/Timeline.tsx +73 -0
  322. package/src/components/Timeline/TimelineItem.tsx +79 -0
  323. package/src/components/Timeline/USAGE.md +49 -0
  324. package/src/components/Toast/TOAST_IMPLEMENTATION_NOTES.md +39 -0
  325. package/src/components/Toast/Toast.module.css +184 -0
  326. package/src/components/Toast/Toast.stories.tsx +67 -0
  327. package/src/components/Toast/Toast.test.tsx +1 -0
  328. package/src/components/Toast/Toast.tsx +82 -0
  329. package/src/components/Toast/USAGE.md +50 -0
  330. package/src/components/Toast/index.ts +1 -0
  331. package/src/components/Tooltip/TOOLTIP_IMPLEMENTATION_NOTES.md +85 -0
  332. package/src/components/Tooltip/Tooltip.module.css +91 -0
  333. package/src/components/Tooltip/Tooltip.stories.tsx +165 -0
  334. package/src/components/Tooltip/Tooltip.test.tsx +1 -0
  335. package/src/components/Tooltip/Tooltip.tsx +117 -0
  336. package/src/components/Tooltip/USAGE.md +80 -0
  337. package/src/components/TransferList/TRANSFERLIST_IMPLEMENTATION_NOTES.md +111 -0
  338. package/src/components/TransferList/TransferList.module.css +182 -0
  339. package/src/components/TransferList/TransferList.stories.tsx +121 -0
  340. package/src/components/TransferList/TransferList.test.tsx +1 -0
  341. package/src/components/TransferList/TransferList.tsx +419 -0
  342. package/src/components/TransferList/USAGE.md +77 -0
  343. package/src/components/Tree/IMPLEMENTATION_NOTES.md +48 -0
  344. package/src/components/Tree/Tree.module.css +232 -0
  345. package/src/components/Tree/Tree.stories.tsx +104 -0
  346. package/src/components/Tree/Tree.test.tsx +1 -0
  347. package/src/components/Tree/Tree.tsx +220 -0
  348. package/src/components/Tree/USAGE.md +96 -0
  349. package/src/components/Tree/index.ts +1 -0
  350. package/src/components/index.ts +52 -0
  351. package/src/env.d.ts +7 -0
  352. package/src/index.ts +179 -0
  353. package/src/types/index.ts +9 -0
  354. package/src/types/mantine.d.ts +7 -0
  355. package/src/types/scss-modules.d.ts +9 -0
  356. package/src/utils/ColorSchemeWrapper.tsx +27 -0
  357. package/src/utils/RequireAccessibleLabel.ts +1 -0
  358. package/src/utils/copyToClipboard.ts +36 -0
  359. package/src/utils/filterStylingProps.test.ts +85 -0
  360. package/src/utils/filterStylingProps.ts +150 -0
  361. package/src/utils/index.ts +1 -0
  362. package/src/utils/renderRichOption.tsx +65 -0
@@ -0,0 +1,282 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Slider } from "./Slider";
3
+ import { formControlArgTypes } from "../../../.storybook/commonArgTypes";
4
+
5
+ const meta: Meta<typeof Slider> = {
6
+ title: "UI-Kit/Slider",
7
+ component: Slider,
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: `
13
+ The \`Slider\` component wraps Mantine's Slider to support a premium design system, a bidirectional input state,
14
+ custom min/max labels, step indicators, and strict states like error, disabled, and read-only.
15
+
16
+ ### Architecture
17
+ The component uses Recursica's unified \`FormControlWrapper\` and \`<WithReadOnlyWrapper>\` to render consistent form layouts (stacked, side-by-side) and read-only representations.
18
+ All visual properties map perfectly to token values inside \`Slider.module.css\`.
19
+ `,
20
+ },
21
+ },
22
+ },
23
+ argTypes: {
24
+ ...formControlArgTypes,
25
+ disabled: {
26
+ control: "boolean",
27
+ description: "Disables both the slider track and the text input field.",
28
+ },
29
+ error: {
30
+ control: "text",
31
+ description:
32
+ "Places the slider in an error state with custom border/icon highlights.",
33
+ },
34
+ required: {
35
+ control: "boolean",
36
+ },
37
+ label: {
38
+ control: "text",
39
+ description: "Outer form control label.",
40
+ },
41
+ assistiveText: {
42
+ control: "text",
43
+ description: "Assistive text rendered below or beside the component.",
44
+ },
45
+ readOnly: {
46
+ control: "boolean",
47
+ description: "Puts the component in static read-only mode.",
48
+ },
49
+ showInput: {
50
+ control: "boolean",
51
+ description: "Controls whether the numeric input box is visible.",
52
+ },
53
+ showMinMaxLabels: {
54
+ control: "boolean",
55
+ description: "Toggles rendering of min/max labels below the track.",
56
+ },
57
+ },
58
+ };
59
+
60
+ export default meta;
61
+
62
+ type Story = StoryObj<typeof Slider>;
63
+
64
+ export const Default: Story = {
65
+ args: {
66
+ label: "Auditory Threshold",
67
+ assistiveText: "Specify the maximum decibel frequency boundary.",
68
+ defaultValue: 60,
69
+ min: 10,
70
+ max: 100,
71
+ step: 1,
72
+ showMinMaxLabels: true,
73
+ },
74
+ };
75
+
76
+ export const WithInputField: Story = {
77
+ args: {
78
+ ...Default.args,
79
+ showInput: true,
80
+ },
81
+ };
82
+
83
+ export const SideBySideLayout: Story = {
84
+ args: {
85
+ ...Default.args,
86
+ formLayout: "side-by-side",
87
+ },
88
+ };
89
+
90
+ export const Disabled: Story = {
91
+ args: {
92
+ label: "Decommissioned Server Node",
93
+ assistiveText: "Modifications to this environment are frozen.",
94
+ defaultValue: 35,
95
+ disabled: true,
96
+ },
97
+ };
98
+
99
+ export const ErrorState: Story = {
100
+ args: {
101
+ label: "Core Temperature Alert",
102
+ assistiveText:
103
+ "Severe core degradation across the hypervisor socket cluster.",
104
+ defaultValue: 85,
105
+ error: "Thermal overload threshold exceeded.",
106
+ required: true,
107
+ },
108
+ };
109
+
110
+ export const StaticReadOnly: Story = {
111
+ args: {
112
+ label: "System Calibration Metrics",
113
+ assistiveText:
114
+ "Frozen baseline calibrations derived during initial staging.",
115
+ value: 65,
116
+ readOnly: true,
117
+ },
118
+ };
119
+
120
+ export const EditableReadOnly: Story = {
121
+ args: {
122
+ label: "Adaptive Node Output",
123
+ assistiveText:
124
+ "Click edit to unlock bidirectional input parameter boundaries.",
125
+ defaultValue: 15,
126
+ readOnly: true,
127
+ labelWithEditIcon: true,
128
+ },
129
+ };
130
+
131
+ export const WithMarks: Story = {
132
+ args: {
133
+ label: "Interactive Marks Map",
134
+ defaultValue: 50,
135
+ min: 0,
136
+ max: 100,
137
+ step: 10,
138
+ marks: [
139
+ { value: 0, label: "0%" },
140
+ { value: 25, label: "25%" },
141
+ { value: 50, label: "50%" },
142
+ { value: 75, label: "75%" },
143
+ { value: 100, label: "100%" },
144
+ ],
145
+ showMinMaxLabels: false,
146
+ },
147
+ };
148
+
149
+ export const WithIconsAndLabels: Story = {
150
+ args: {
151
+ label: "Volume",
152
+ assistiveText:
153
+ "Icons flank the track; min/max labels replace the raw bounds.",
154
+ defaultValue: 60,
155
+ minLabel: "Quiet",
156
+ maxLabel: "Loud",
157
+ tooltipLabel: (value: number) => `${value}%`,
158
+ icon: (
159
+ <svg
160
+ xmlns="http://www.w3.org/2000/svg"
161
+ width="16"
162
+ height="16"
163
+ viewBox="0 0 24 24"
164
+ fill="none"
165
+ stroke="currentColor"
166
+ strokeWidth="2"
167
+ strokeLinecap="round"
168
+ strokeLinejoin="round"
169
+ >
170
+ <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon>
171
+ </svg>
172
+ ),
173
+ trailingIcon: (
174
+ <svg
175
+ xmlns="http://www.w3.org/2000/svg"
176
+ width="16"
177
+ height="16"
178
+ viewBox="0 0 24 24"
179
+ fill="none"
180
+ stroke="currentColor"
181
+ strokeWidth="2"
182
+ strokeLinecap="round"
183
+ strokeLinejoin="round"
184
+ >
185
+ <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon>
186
+ <path d="M15.54 8.46a5 5 0 0 1 0 7.07"></path>
187
+ <path d="M19.07 4.93a10 10 0 0 1 0 14.14"></path>
188
+ </svg>
189
+ ),
190
+ },
191
+ };
192
+
193
+ export const RangeMode: Story = {
194
+ args: {
195
+ label: "Price Range",
196
+ assistiveText: "Pass a [number, number] tuple to render two thumbs.",
197
+ defaultValue: [20, 80],
198
+ min: 0,
199
+ max: 100,
200
+ showMinMaxLabels: true,
201
+ },
202
+ };
203
+
204
+ export const RangeModeWithInputs: Story = {
205
+ args: {
206
+ ...RangeMode.args,
207
+ showInput: true,
208
+ },
209
+ };
210
+
211
+ export const RangeModeWithIconsAndInputs: Story = {
212
+ args: {
213
+ label: "Price Range",
214
+ assistiveText:
215
+ "Full range usage: leading/trailing icons, min/max label overrides, and both bound inputs.",
216
+ defaultValue: [20, 80],
217
+ min: 0,
218
+ max: 100,
219
+ showInput: true,
220
+ minLabel: "$0",
221
+ maxLabel: "$100",
222
+ tooltipLabel: (value: number) => `$${value}`,
223
+ icon: (
224
+ <svg
225
+ xmlns="http://www.w3.org/2000/svg"
226
+ width="16"
227
+ height="16"
228
+ viewBox="0 0 24 24"
229
+ fill="none"
230
+ stroke="currentColor"
231
+ strokeWidth="2"
232
+ strokeLinecap="round"
233
+ strokeLinejoin="round"
234
+ >
235
+ <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon>
236
+ </svg>
237
+ ),
238
+ trailingIcon: (
239
+ <svg
240
+ xmlns="http://www.w3.org/2000/svg"
241
+ width="16"
242
+ height="16"
243
+ viewBox="0 0 24 24"
244
+ fill="none"
245
+ stroke="currentColor"
246
+ strokeWidth="2"
247
+ strokeLinecap="round"
248
+ strokeLinejoin="round"
249
+ >
250
+ <polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"></polygon>
251
+ <path d="M15.54 8.46a5 5 0 0 1 0 7.07"></path>
252
+ <path d="M19.07 4.93a10 10 0 0 1 0 14.14"></path>
253
+ </svg>
254
+ ),
255
+ },
256
+ };
257
+
258
+ export const FormLayouts: Story = {
259
+ render: () => (
260
+ <div
261
+ style={{
262
+ display: "flex",
263
+ flexDirection: "column",
264
+ gap: "2.5rem",
265
+ maxWidth: 600,
266
+ }}
267
+ >
268
+ <Slider
269
+ label="Stacked Layout"
270
+ assistiveText="This is the standard top-to-bottom stacked form layout."
271
+ defaultValue={40}
272
+ formLayout="stacked"
273
+ />
274
+ <Slider
275
+ label="Side-by-Side Layout"
276
+ assistiveText="This is the side-by-side layout aligning label beside control."
277
+ defaultValue={60}
278
+ formLayout="side-by-side"
279
+ />
280
+ </div>
281
+ ),
282
+ };
@@ -0,0 +1 @@
1
+ // Placeholder for future Slider component tests. Add tests here if/when needed.
@@ -0,0 +1,391 @@
1
+ import React, { forwardRef, useState, useEffect } from "react";
2
+ import {
3
+ Slider as MantineSlider,
4
+ RangeSlider as MantineRangeSlider,
5
+ type SliderProps as MantineSliderProps,
6
+ type RangeSliderProps as MantineRangeSliderProps,
7
+ type InputWrapperProps,
8
+ } from "@mantine/core";
9
+ import { type ReadOnlyControlProps } from "@recursica/adapter-common";
10
+ import {
11
+ filterStylingProps,
12
+ omitUnsupportedProps,
13
+ mergeClassNames,
14
+ type RecursicaOverStyled,
15
+ } from "../../utils/filterStylingProps";
16
+ import { type RecursicaFormControlWrapperProps } from "../FormControlWrapper/FormControlWrapper";
17
+ import { WithReadOnlyWrapper } from "../ReadOnlyField/WithReadOnlyWrapper";
18
+
19
+ import styles from "./Slider.module.css";
20
+
21
+ import { type RecursicaSliderProps as BaseRecursicaSliderProps } from "@recursica/adapter-common";
22
+
23
+ export interface RecursicaSliderProps
24
+ extends Omit<
25
+ MantineSliderProps,
26
+ | "size"
27
+ | "variant"
28
+ | "radius"
29
+ | "wrapperProps"
30
+ | "classNames"
31
+ | "styles"
32
+ | "label"
33
+ | "value"
34
+ | "defaultValue"
35
+ | "onChange"
36
+ | "onChangeEnd"
37
+ >,
38
+ Omit<
39
+ RecursicaFormControlWrapperProps,
40
+ "controlMaxWidth" | "controlMinWidth"
41
+ >,
42
+ Pick<InputWrapperProps, "error" | "required" | "withAsterisk">,
43
+ ReadOnlyControlProps,
44
+ BaseRecursicaSliderProps {}
45
+
46
+ export type SliderProps = RecursicaOverStyled<RecursicaSliderProps>;
47
+
48
+ /**
49
+ * Custom Read-Only visual representation of the Slider value.
50
+ * Utilizes component-specific read-only typography variables. Renders a "lower – upper" pair
51
+ * when the value is a range tuple.
52
+ */
53
+ const SliderReadOnlyValue: React.FC<{ value: number | [number, number] }> = ({
54
+ value,
55
+ }) => {
56
+ const display = Array.isArray(value) ? `${value[0]} – ${value[1]}` : value;
57
+ return <div className={styles.readOnlyValue}>{display}</div>;
58
+ };
59
+
60
+ /**
61
+ * Recursica Slider component wrapping Mantine's Slider (or, when `value`/`defaultValue` is a
62
+ * `[number, number]` tuple, Mantine's two-thumb RangeSlider).
63
+ *
64
+ * Implements a bidirectional text input field next to the slider track, responsive layouts,
65
+ * custom typography-bound min/max labels (optionally overridden via `minLabel`/`maxLabel`),
66
+ * optional leading/trailing icons, and an explicit read-only layout.
67
+ */
68
+ export const Slider = forwardRef<HTMLDivElement, SliderProps>(
69
+ function Slider(props, ref) {
70
+ const {
71
+ overStyled = false,
72
+ formLayout = "stacked",
73
+
74
+ // Label & Wrapper Maps
75
+ labelSize,
76
+ labelAlignment,
77
+ labelOptionalText,
78
+ labelWithEditIcon,
79
+ labelActionArea,
80
+ onLabelEditClick,
81
+
82
+ label,
83
+ tooltipLabel,
84
+ assistiveText,
85
+ assistiveWithIcon,
86
+ error,
87
+ required,
88
+ withAsterisk,
89
+ id,
90
+ className,
91
+ style,
92
+ disabled,
93
+ readOnly,
94
+ readOnlyComponent,
95
+ emptyValueComponent,
96
+ value,
97
+ defaultValue,
98
+ icon,
99
+ trailingIcon,
100
+ showInput = false,
101
+ showMinMaxLabels = true,
102
+ min = 0,
103
+ max = 100,
104
+ minLabel,
105
+ maxLabel,
106
+ step = 1,
107
+ onChange,
108
+ onChangeEnd,
109
+ ...rest
110
+ } = props;
111
+
112
+ // Bidirectional state linking the slider track value to the input field string
113
+ // representation. A `[number, number]` value/defaultValue switches the component into
114
+ // two-thumb range mode, backed by Mantine's RangeSlider instead of Slider.
115
+ type SliderValue = number | [number, number];
116
+
117
+ const [internalValue, setInternalValue] = useState<SliderValue>(() => {
118
+ if (value !== undefined) return value;
119
+ if (defaultValue !== undefined) return defaultValue;
120
+ return min;
121
+ });
122
+
123
+ const resolvedValue: SliderValue =
124
+ value !== undefined ? value : internalValue;
125
+ const isRange = Array.isArray(resolvedValue);
126
+
127
+ const [inputValue, setInputValue] = useState<string | [string, string]>(
128
+ () =>
129
+ Array.isArray(resolvedValue)
130
+ ? [resolvedValue[0].toString(), resolvedValue[1].toString()]
131
+ : resolvedValue.toString(),
132
+ );
133
+
134
+ // Synchronize text input(s) whenever the slider value changes
135
+ useEffect(() => {
136
+ setInputValue(
137
+ Array.isArray(resolvedValue)
138
+ ? [resolvedValue[0].toString(), resolvedValue[1].toString()]
139
+ : resolvedValue.toString(),
140
+ );
141
+ }, [resolvedValue]);
142
+
143
+ const handleValueChange = (val: SliderValue) => {
144
+ if (value === undefined) {
145
+ setInternalValue(val);
146
+ }
147
+ onChange?.(val);
148
+ };
149
+
150
+ const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
151
+ const valStr = e.target.value;
152
+ setInputValue(valStr);
153
+
154
+ const parsed = parseFloat(valStr);
155
+ if (!isNaN(parsed)) {
156
+ // Clamp input value to bounds
157
+ const clamped = Math.max(min, Math.min(max, parsed));
158
+ handleValueChange(clamped);
159
+ }
160
+ };
161
+
162
+ const handleInputBlur = () => {
163
+ // Clean up text field on blur to reflect the final clamped resolved value
164
+ setInputValue((resolvedValue as number).toString());
165
+ };
166
+
167
+ // Range-mode input handlers: each bound clamps against the other thumb rather than the
168
+ // shared min/max, so the lower thumb can never cross the upper one and vice versa.
169
+ const handleLowerInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
170
+ const current = resolvedValue as [number, number];
171
+ const valStr = e.target.value;
172
+ setInputValue([valStr, current[1].toString()]);
173
+
174
+ const parsed = parseFloat(valStr);
175
+ if (!isNaN(parsed)) {
176
+ const clamped = Math.max(min, Math.min(current[1], parsed));
177
+ handleValueChange([clamped, current[1]]);
178
+ }
179
+ };
180
+
181
+ const handleUpperInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
182
+ const current = resolvedValue as [number, number];
183
+ const valStr = e.target.value;
184
+ setInputValue([current[0].toString(), valStr]);
185
+
186
+ const parsed = parseFloat(valStr);
187
+ if (!isNaN(parsed)) {
188
+ const clamped = Math.max(current[0], Math.min(max, parsed));
189
+ handleValueChange([current[0], clamped]);
190
+ }
191
+ };
192
+
193
+ const handleRangeInputBlur = () => {
194
+ const current = resolvedValue as [number, number];
195
+ setInputValue([current[0].toString(), current[1].toString()]);
196
+ };
197
+
198
+ // Props this component intentionally doesn't support — deleted at runtime so they can't leak
199
+ // through even if a caller forces them via plain JavaScript, bypassing the `Omit<>` above.
200
+ const UNSUPPORTED_PROPS = [
201
+ "size", // Recursica controls sizing via Slider.module.css variables, not Mantine's native size scale.
202
+ "variant", // Slider has a single Recursica-defined visual treatment; Mantine's variant isn't exposed.
203
+ "radius", // Corner radius is fixed by Recursica tokens in Slider.module.css, not caller-configurable.
204
+ // Not currently a real key of Mantine's SliderProps (that's an Input.Wrapper-only prop) — kept
205
+ // as a defensive no-op delete since it predates this consolidation and the public prop type
206
+ // already `Omit`s it; Recursica's own FormControlLayout/WithReadOnlyWrapper own wrapper markup.
207
+ "wrapperProps",
208
+ ] as const satisfies readonly (keyof MantineSliderProps | "wrapperProps")[];
209
+
210
+ const sanitizedProps = omitUnsupportedProps(
211
+ filterStylingProps(rest, overStyled) as Record<string, unknown>,
212
+ UNSUPPORTED_PROPS,
213
+ ) as Partial<typeof rest>;
214
+ const restRecord = sanitizedProps as Record<string, unknown>;
215
+
216
+ // Securely map core native blocks down ensuring nested CSS modules map precisely
217
+ const mergedClassNames = mergeClassNames(
218
+ {
219
+ root: styles.sliderRoot,
220
+ track: styles.sliderTrack,
221
+ bar: styles.sliderBar,
222
+ thumb: styles.sliderThumb,
223
+ markWrapper: styles.sliderMarkWrapper,
224
+ mark: styles.sliderMark,
225
+ markLabel: styles.sliderMarkLabel,
226
+ },
227
+ restRecord.classNames as Partial<Record<string, string>> | undefined,
228
+ );
229
+
230
+ const wrapperClass = className
231
+ ? `${styles.layoutOverride} ${className}`
232
+ : styles.layoutOverride;
233
+
234
+ const leadingIcon = icon ? (
235
+ <span className={styles.iconWrapper} aria-hidden>
236
+ {icon}
237
+ </span>
238
+ ) : null;
239
+
240
+ const trailingIconEl = trailingIcon ? (
241
+ <span className={styles.iconWrapper} aria-hidden>
242
+ {trailingIcon}
243
+ </span>
244
+ ) : null;
245
+
246
+ // Duplicates the raw numeric value next to the track by default; when `tooltipLabel` is a
247
+ // formatter, reuse it here too so both displays agree instead of one showing raw numbers.
248
+ // Range mode formats each thumb independently and joins them with an en dash.
249
+ const displayValue = Array.isArray(resolvedValue)
250
+ ? typeof tooltipLabel === "function"
251
+ ? `${tooltipLabel(resolvedValue[0])} – ${tooltipLabel(resolvedValue[1])}`
252
+ : `${resolvedValue[0]} – ${resolvedValue[1]}`
253
+ : typeof tooltipLabel === "function"
254
+ ? tooltipLabel(resolvedValue)
255
+ : resolvedValue;
256
+
257
+ return (
258
+ <WithReadOnlyWrapper
259
+ ref={ref}
260
+ className={wrapperClass}
261
+ style={style as React.CSSProperties}
262
+ controlMaxWidth={undefined}
263
+ controlMinWidth={undefined}
264
+ overStyled={overStyled as true}
265
+ formLayout={formLayout}
266
+ labelSize={labelSize}
267
+ labelAlignment={labelAlignment}
268
+ labelOptionalText={labelOptionalText}
269
+ labelWithEditIcon={labelWithEditIcon}
270
+ labelActionArea={labelActionArea}
271
+ onLabelEditClick={onLabelEditClick}
272
+ label={label}
273
+ assistiveText={assistiveText}
274
+ assistiveWithIcon={assistiveWithIcon}
275
+ error={error}
276
+ required={required}
277
+ withAsterisk={withAsterisk}
278
+ id={id}
279
+ readOnly={readOnly}
280
+ readOnlyComponent={readOnlyComponent || SliderReadOnlyValue}
281
+ emptyValueComponent={emptyValueComponent}
282
+ readOnlyType="text"
283
+ readOnlyValue={resolvedValue}
284
+ readOnlyNativeProps={{ value: resolvedValue }}
285
+ activeComponent={
286
+ <div
287
+ className={styles.sliderContainer}
288
+ data-form-layout={formLayout}
289
+ data-disabled={disabled ? "true" : undefined}
290
+ data-error={error ? "true" : undefined}
291
+ >
292
+ {isRange && showInput && (
293
+ <input
294
+ type="number"
295
+ className={styles.inputField}
296
+ value={(inputValue as [string, string])[0]}
297
+ onChange={handleLowerInputChange}
298
+ onBlur={handleRangeInputBlur}
299
+ min={min}
300
+ max={(resolvedValue as [number, number])[1]}
301
+ step={step}
302
+ disabled={disabled}
303
+ data-error={error ? "true" : undefined}
304
+ aria-label="Minimum value"
305
+ />
306
+ )}
307
+
308
+ {leadingIcon}
309
+
310
+ {showMinMaxLabels && (
311
+ <span className={styles.minMaxGuide}>{minLabel ?? min}</span>
312
+ )}
313
+
314
+ <div className={styles.sliderTrackWrapper}>
315
+ {isRange ? (
316
+ <MantineRangeSlider
317
+ {...(sanitizedProps as unknown as MantineRangeSliderProps)}
318
+ classNames={mergedClassNames}
319
+ disabled={disabled}
320
+ value={resolvedValue as [number, number]}
321
+ onChange={handleValueChange}
322
+ onChangeEnd={onChangeEnd}
323
+ min={min}
324
+ max={max}
325
+ step={step}
326
+ label={tooltipLabel}
327
+ />
328
+ ) : (
329
+ <MantineSlider
330
+ {...(sanitizedProps as unknown as MantineSliderProps)}
331
+ classNames={mergedClassNames}
332
+ disabled={disabled}
333
+ value={resolvedValue as number}
334
+ onChange={handleValueChange}
335
+ onChangeEnd={onChangeEnd}
336
+ min={min}
337
+ max={max}
338
+ step={step}
339
+ label={tooltipLabel}
340
+ />
341
+ )}
342
+ </div>
343
+
344
+ <div className={styles.rightGuideContainer}>
345
+ {!showInput && (
346
+ <span className={styles.currentValue}>{displayValue}</span>
347
+ )}
348
+ {showMinMaxLabels && (
349
+ <span className={styles.minMaxGuide}>{maxLabel ?? max}</span>
350
+ )}
351
+ </div>
352
+
353
+ {trailingIconEl}
354
+
355
+ {showInput &&
356
+ (isRange ? (
357
+ <input
358
+ type="number"
359
+ className={styles.inputField}
360
+ value={(inputValue as [string, string])[1]}
361
+ onChange={handleUpperInputChange}
362
+ onBlur={handleRangeInputBlur}
363
+ min={(resolvedValue as [number, number])[0]}
364
+ max={max}
365
+ step={step}
366
+ disabled={disabled}
367
+ data-error={error ? "true" : undefined}
368
+ aria-label="Maximum value"
369
+ />
370
+ ) : (
371
+ <input
372
+ type="number"
373
+ className={styles.inputField}
374
+ value={inputValue as string}
375
+ onChange={handleInputChange}
376
+ onBlur={handleInputBlur}
377
+ min={min}
378
+ max={max}
379
+ step={step}
380
+ disabled={disabled}
381
+ data-error={error ? "true" : undefined}
382
+ />
383
+ ))}
384
+ </div>
385
+ }
386
+ />
387
+ );
388
+ },
389
+ );
390
+
391
+ Slider.displayName = "Slider";