@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,52 @@
1
+ export * from "./Accordion";
2
+ export * from "./AssistiveElement/AssistiveElement";
3
+ export * from "./AutoComplete/AutoComplete";
4
+ export * from "./Avatar";
5
+ export * from "./Badge/Badge";
6
+ export * from "./Breadcrumb/Breadcrumb";
7
+ export * from "./Button";
8
+ export * from "./Card/Card";
9
+ export * from "./Checkbox/Checkbox";
10
+ export * from "./Checkbox/CheckboxGroup";
11
+ export * from "./Chip/Chip";
12
+ export * from "./Container/Container";
13
+ export * from "./DatePicker/DatePicker";
14
+ export * from "./Dropdown/Dropdown";
15
+ export * from "./FileInput/FileInput";
16
+ export * from "./FileUpload/FileUpload";
17
+ export * from "./Flex/Flex";
18
+ export * from "./FormControlLayout/FormControlLayout";
19
+ export * from "./Grid/Grid";
20
+ export * from "./Group/Group";
21
+ export * from "./Heading/Heading";
22
+ export * from "./HoverCard/HoverCard";
23
+ export * from "./Link/Link";
24
+ export * from "./Loader/Loader";
25
+ export * from "./Label";
26
+ export * from "./Menu/Menu";
27
+ export * from "./Modal/Modal";
28
+ export * from "./NumberInput/NumberInput";
29
+ export * from "./Pagination/Pagination";
30
+ export * from "./Panel/Panel";
31
+ export * from "./Popover";
32
+ export * from "./Radio/Radio";
33
+ export * from "./Radio/RadioGroup";
34
+ export * from "./ReadOnlyField";
35
+ export * from "./SegmentedControl/SegmentedControl";
36
+ export * from "./Slider/Slider";
37
+ export * from "./Stack/Stack";
38
+ export * from "./Stepper/Stepper";
39
+ export * from "./Switch/Switch";
40
+ export * from "./Switch/SwitchGroup";
41
+ export * from "./Table/Table";
42
+ export * from "./Tabs/Tabs";
43
+ export * from "./Text/Text";
44
+ export * from "./TextArea/TextArea";
45
+ export * from "./TextField/TextField";
46
+ export * from "./TimePicker/TimePicker";
47
+ export * from "./Timeline/Timeline";
48
+ export * from "./Timeline/TimelineItem";
49
+ export * from "./Toast";
50
+ export * from "./Tooltip/Tooltip";
51
+ export * from "./TransferList/TransferList";
52
+ export * from "./Tree";
package/src/env.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /// <reference types="vite/client" />
2
+ /// <reference types="vite-plugin-svgr/client" />
3
+
4
+ declare module "*.module.css" {
5
+ const classes: { readonly [key: string]: string };
6
+ export default classes;
7
+ }
package/src/index.ts ADDED
@@ -0,0 +1,179 @@
1
+ import "@recursica/adapter-common/style.css";
2
+ import * as rawComponents from "./components";
3
+ import { wrapComponent } from "@recursica/adapter-common";
4
+
5
+ export * from "@recursica/adapter-common";
6
+
7
+ // Expose unwrapped structural layout primitives to preserve their polymorphic types
8
+ export const Flex = rawComponents.Flex;
9
+ export const Grid = rawComponents.Grid;
10
+ export const GridCol = rawComponents.GridCol;
11
+ export const Group = rawComponents.Group;
12
+ export const Stack = rawComponents.Stack;
13
+ export const Container = rawComponents.Container;
14
+ export const Link = rawComponents.Link;
15
+ export const Text = rawComponents.Text;
16
+
17
+ // Statically wrap and export components to inject overStyled visual highlight in dev mode
18
+ export const Accordion = wrapComponent(
19
+ rawComponents.Accordion,
20
+ ) as typeof rawComponents.Accordion;
21
+ export const AccordionItem = wrapComponent(
22
+ rawComponents.AccordionItem,
23
+ ) as typeof rawComponents.AccordionItem;
24
+ export const AccordionControl = wrapComponent(
25
+ rawComponents.AccordionControl,
26
+ ) as typeof rawComponents.AccordionControl;
27
+ export const AccordionPanel = wrapComponent(
28
+ rawComponents.AccordionPanel,
29
+ ) as typeof rawComponents.AccordionPanel;
30
+ export const AssistiveElement = wrapComponent(
31
+ rawComponents.AssistiveElement,
32
+ ) as typeof rawComponents.AssistiveElement;
33
+ export const AutoComplete = wrapComponent(
34
+ rawComponents.AutoComplete,
35
+ ) as typeof rawComponents.AutoComplete;
36
+ export const Avatar = wrapComponent(
37
+ rawComponents.Avatar,
38
+ ) as typeof rawComponents.Avatar;
39
+ export const Badge = wrapComponent(
40
+ rawComponents.Badge,
41
+ ) as typeof rawComponents.Badge;
42
+ export const Breadcrumb = wrapComponent(
43
+ rawComponents.Breadcrumb,
44
+ ) as typeof rawComponents.Breadcrumb;
45
+ export const Button = wrapComponent(
46
+ rawComponents.Button,
47
+ ) as typeof rawComponents.Button;
48
+ export const Card = wrapComponent(
49
+ rawComponents.Card,
50
+ ) as typeof rawComponents.Card;
51
+ export const Checkbox = wrapComponent(
52
+ rawComponents.Checkbox,
53
+ ) as typeof rawComponents.Checkbox;
54
+ export const CheckboxGroup = wrapComponent(
55
+ rawComponents.CheckboxGroup,
56
+ ) as typeof rawComponents.CheckboxGroup;
57
+ export const Chip = wrapComponent(
58
+ rawComponents.Chip,
59
+ ) as typeof rawComponents.Chip;
60
+ export const DatePicker = wrapComponent(
61
+ rawComponents.DatePicker,
62
+ ) as typeof rawComponents.DatePicker;
63
+ export const Dropdown = wrapComponent(
64
+ rawComponents.Dropdown,
65
+ ) as typeof rawComponents.Dropdown;
66
+ export const FileInput = wrapComponent(
67
+ rawComponents.FileInput,
68
+ ) as typeof rawComponents.FileInput;
69
+ export const FileUpload = wrapComponent(
70
+ rawComponents.FileUpload,
71
+ ) as typeof rawComponents.FileUpload;
72
+ export const FormControlLayout = wrapComponent(
73
+ rawComponents.FormControlLayout,
74
+ ) as typeof rawComponents.FormControlLayout;
75
+ export const Heading = wrapComponent(
76
+ rawComponents.Heading,
77
+ ) as typeof rawComponents.Heading;
78
+ export const HoverCard = wrapComponent(
79
+ rawComponents.HoverCard,
80
+ ) as typeof rawComponents.HoverCard;
81
+ export const Loader = wrapComponent(
82
+ rawComponents.Loader,
83
+ ) as typeof rawComponents.Loader;
84
+ export const Label = wrapComponent(
85
+ rawComponents.Label,
86
+ ) as typeof rawComponents.Label;
87
+ export const Menu = wrapComponent(
88
+ rawComponents.Menu,
89
+ ) as typeof rawComponents.Menu;
90
+ export const Modal = wrapComponent(
91
+ rawComponents.Modal,
92
+ ) as typeof rawComponents.Modal;
93
+ export const NumberInput = wrapComponent(
94
+ rawComponents.NumberInput,
95
+ ) as typeof rawComponents.NumberInput;
96
+ export const Pagination = wrapComponent(
97
+ rawComponents.Pagination,
98
+ ) as typeof rawComponents.Pagination;
99
+ export const Panel = wrapComponent(
100
+ rawComponents.Panel,
101
+ ) as typeof rawComponents.Panel;
102
+ export const PanelFooter = wrapComponent(
103
+ rawComponents.PanelFooter,
104
+ ) as typeof rawComponents.PanelFooter;
105
+ export const Popover = wrapComponent(
106
+ rawComponents.Popover,
107
+ ) as typeof rawComponents.Popover;
108
+ export const Radio = wrapComponent(
109
+ rawComponents.Radio,
110
+ ) as typeof rawComponents.Radio;
111
+ export const RadioGroup = wrapComponent(
112
+ rawComponents.RadioGroup,
113
+ ) as typeof rawComponents.RadioGroup;
114
+ export const ReadOnlyField = wrapComponent(
115
+ rawComponents.ReadOnlyField,
116
+ ) as typeof rawComponents.ReadOnlyField;
117
+ export const SegmentedControl = wrapComponent(
118
+ rawComponents.SegmentedControl,
119
+ ) as typeof rawComponents.SegmentedControl;
120
+ export const Slider = wrapComponent(
121
+ rawComponents.Slider,
122
+ ) as typeof rawComponents.Slider;
123
+ export const Stepper = wrapComponent(
124
+ rawComponents.Stepper,
125
+ ) as typeof rawComponents.Stepper;
126
+ export const Switch = wrapComponent(
127
+ rawComponents.Switch,
128
+ ) as typeof rawComponents.Switch;
129
+ export const SwitchGroup = wrapComponent(
130
+ rawComponents.SwitchGroup,
131
+ ) as typeof rawComponents.SwitchGroup;
132
+ export const Table = wrapComponent(
133
+ rawComponents.Table,
134
+ ) as typeof rawComponents.Table;
135
+ export const Tabs = wrapComponent(
136
+ rawComponents.Tabs,
137
+ ) as typeof rawComponents.Tabs;
138
+ export const TextArea = wrapComponent(
139
+ rawComponents.TextArea,
140
+ ) as typeof rawComponents.TextArea;
141
+ export const TextField = wrapComponent(
142
+ rawComponents.TextField,
143
+ ) as typeof rawComponents.TextField;
144
+ export const TimePicker = wrapComponent(
145
+ rawComponents.TimePicker,
146
+ ) as typeof rawComponents.TimePicker;
147
+ export const Timeline = wrapComponent(
148
+ rawComponents.Timeline,
149
+ ) as typeof rawComponents.Timeline;
150
+ export const TimelineItem = wrapComponent(
151
+ rawComponents.TimelineItem,
152
+ ) as typeof rawComponents.TimelineItem;
153
+ export const Toast = wrapComponent(
154
+ rawComponents.Toast,
155
+ ) as typeof rawComponents.Toast;
156
+ export const Tooltip = wrapComponent(
157
+ rawComponents.Tooltip,
158
+ ) as typeof rawComponents.Tooltip;
159
+ export const TransferList = wrapComponent(
160
+ rawComponents.TransferList,
161
+ ) as typeof rawComponents.TransferList;
162
+ export const Tree = wrapComponent(
163
+ rawComponents.Tree,
164
+ ) as typeof rawComponents.Tree;
165
+
166
+ export type {
167
+ RecursicaCheckboxGroupProps,
168
+ RecursicaDatePickerProps,
169
+ RecursicaDropdownProps,
170
+ RecursicaNumberInputProps,
171
+ RecursicaRadioGroupProps,
172
+ RecursicaReadOnlyFieldProps,
173
+ RecursicaReadOnlyTextFieldProps,
174
+ RecursicaSliderProps,
175
+ RecursicaSwitchGroupProps,
176
+ RecursicaTextAreaProps,
177
+ RecursicaTextFieldProps,
178
+ RecursicaTimePickerProps,
179
+ } from "./components";
@@ -0,0 +1,9 @@
1
+ export interface ComboboxItem {
2
+ value: string;
3
+ label: string;
4
+ disabled?: boolean;
5
+ // icon?: IconName;
6
+ onClick?: () => void;
7
+ }
8
+
9
+ // Export other shared types here
@@ -0,0 +1,7 @@
1
+ import type { ComboboxItem as RecursicaComboboxItem } from "./index";
2
+ import "@mantine/core";
3
+
4
+ declare module "@mantine/core" {
5
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
6
+ export interface ComboboxItem extends RecursicaComboboxItem {}
7
+ }
@@ -0,0 +1,9 @@
1
+ declare module "*.scss" {
2
+ const content: { [className: string]: string };
3
+ export default content;
4
+ }
5
+
6
+ declare module "*.module.scss" {
7
+ const content: { [className: string]: string };
8
+ export default content;
9
+ }
@@ -0,0 +1,27 @@
1
+ import { useMantineColorScheme } from "@mantine/core";
2
+ import { useEffect } from "react";
3
+ import { addons } from "storybook/internal/preview-api";
4
+ import { DARK_MODE_EVENT_NAME } from "storybook-dark-mode";
5
+
6
+ const channel = addons.getChannel();
7
+
8
+ export function ColorSchemeWrapper({
9
+ children,
10
+ }: {
11
+ children: React.ReactNode;
12
+ }) {
13
+ const { setColorScheme } = useMantineColorScheme();
14
+
15
+ useEffect(() => {
16
+ const handleColorScheme = (value: boolean) => {
17
+ const theme = value ? "dark" : "light";
18
+ setColorScheme(theme);
19
+ document.documentElement.setAttribute("data-recursica-theme", theme);
20
+ };
21
+
22
+ channel.on(DARK_MODE_EVENT_NAME, handleColorScheme);
23
+ return () => channel.off(DARK_MODE_EVENT_NAME, handleColorScheme);
24
+ }, [setColorScheme]);
25
+
26
+ return <>{children}</>;
27
+ }
@@ -0,0 +1 @@
1
+ export { type RequireAccessibleLabel } from "@recursica/adapter-common";
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+
3
+ /**
4
+ * Helper function for copy text to clipboard
5
+ * @param {string} textToCopy The text string for copying to the clipboard
6
+ * @param {element|node} componentRef The ref of the component that we want to trigger the copy
7
+ */
8
+ const copyToClipboard = (
9
+ textToCopy: string,
10
+ componentRef: React.RefObject<HTMLElement | null>,
11
+ ): Promise<void> => {
12
+ const currentFocus = document.activeElement as HTMLInputElement;
13
+ return new Promise((resolve, reject) => {
14
+ if (componentRef && componentRef.current) {
15
+ const textArea = document.createElement("textarea");
16
+ textArea.readOnly = true;
17
+ textArea.defaultValue = textToCopy;
18
+ componentRef.current.appendChild(textArea);
19
+ textArea.select();
20
+ const wasCopied = document.execCommand("copy");
21
+ componentRef.current.removeChild(textArea);
22
+ if (currentFocus) {
23
+ currentFocus.focus();
24
+ }
25
+ if (wasCopied) {
26
+ resolve();
27
+ } else {
28
+ reject(new Error("Failed to copy"));
29
+ }
30
+ } else {
31
+ reject(new Error("Copy area reference is not defined"));
32
+ }
33
+ });
34
+ };
35
+
36
+ export { copyToClipboard };
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ BLOCKED_STYLING_KEYS,
4
+ SPACING_MAP,
5
+ filterStylingProps,
6
+ mapLayoutProps,
7
+ } from "./filterStylingProps";
8
+
9
+ describe("filterStylingProps", () => {
10
+ it("strips every blocked styling key by default", () => {
11
+ const props = Object.fromEntries(
12
+ BLOCKED_STYLING_KEYS.map((key) => [key, "should-be-removed"]),
13
+ );
14
+
15
+ const sanitized = filterStylingProps(props);
16
+
17
+ for (const key of BLOCKED_STYLING_KEYS) {
18
+ expect(sanitized).not.toHaveProperty(key);
19
+ }
20
+ });
21
+
22
+ it("keeps props that aren't blocked styling keys", () => {
23
+ const sanitized = filterStylingProps({
24
+ disabled: true,
25
+ "aria-label": "Submit",
26
+ });
27
+
28
+ expect(sanitized).toEqual({ disabled: true, "aria-label": "Submit" });
29
+ });
30
+
31
+ it("keeps layout props (e.g. margin) untouched when not a rec- token", () => {
32
+ const sanitized = filterStylingProps({ m: "16px" });
33
+
34
+ expect(sanitized).toEqual({ m: "16px" });
35
+ });
36
+
37
+ it("maps rec- spacing tokens on layout props to their CSS variable", () => {
38
+ const sanitized = filterStylingProps({ m: "rec-lg", gap: "rec-sm" });
39
+
40
+ expect(sanitized).toEqual({
41
+ m: SPACING_MAP["rec-lg"],
42
+ gap: SPACING_MAP["rec-sm"],
43
+ });
44
+ });
45
+
46
+ it("does not map rec- tokens on props that aren't layout props", () => {
47
+ const sanitized = filterStylingProps({ "data-testid": "rec-lg" });
48
+
49
+ expect(sanitized).toEqual({ "data-testid": "rec-lg" });
50
+ });
51
+
52
+ it("leaves an unrecognized rec- value alone", () => {
53
+ const sanitized = filterStylingProps({ m: "rec-not-a-real-token" });
54
+
55
+ expect(sanitized).toEqual({ m: "rec-not-a-real-token" });
56
+ });
57
+
58
+ it("bypasses all filtering when overStyled is true", () => {
59
+ const props = { className: "custom", bg: "red", m: "rec-lg" };
60
+
61
+ expect(filterStylingProps(props, true)).toEqual(props);
62
+ });
63
+
64
+ it("does not mutate the input props object", () => {
65
+ const props = { className: "custom", m: "rec-lg" };
66
+
67
+ filterStylingProps(props);
68
+
69
+ expect(props).toEqual({ className: "custom", m: "rec-lg" });
70
+ });
71
+ });
72
+
73
+ describe("mapLayoutProps", () => {
74
+ it("maps rec- spacing tokens on layout props", () => {
75
+ expect(mapLayoutProps({ mt: "rec-xl" })).toEqual({
76
+ mt: SPACING_MAP["rec-xl"],
77
+ });
78
+ });
79
+
80
+ it("leaves non-layout props untouched even if they look like a token", () => {
81
+ expect(mapLayoutProps({ variant: "rec-xl" })).toEqual({
82
+ variant: "rec-xl",
83
+ });
84
+ });
85
+ });
@@ -0,0 +1,150 @@
1
+ /**
2
+ * filterStylingProps
3
+ *
4
+ * This utility acts as the central gatekeeper for strict design-system adherence across
5
+ * all Recursica components mapped over Mantine.
6
+ *
7
+ * PHILOSOPHY:
8
+ * Recursica components are designed to be explicitly sandboxed tokens. Allowing external
9
+ * `className` or Mantine style system props (`bg`, `p`, etc.) breaks the design system by
10
+ * allowing developers to leak arbitrary designs into components.
11
+ *
12
+ * By default (`overStyled=false`), this utility actively prevents developers from overriding
13
+ * internal component styles (such as background, colors, typography, or internal classNames).
14
+ * It safely *permits* external layout overrides (like `margin` / `m`) so that components can
15
+ * easily be spaced alongside other DOM elements.
16
+ *
17
+ * If a developer passes `overStyled={true}`, this filter allows all styling properties to
18
+ * flow through to the underlying Mantine component natively, at the developer's own risk.
19
+ *
20
+ * @param props - The raw component props passed down to the wrapper
21
+ * @param overStyled - Boolean toggle to allow raw external styling. Defaults to false.
22
+ * @returns Sanitized component props safe for internal styling merging
23
+ */
24
+
25
+ export const BLOCKED_STYLING_KEYS = [
26
+ "className",
27
+ "classNames",
28
+ "style",
29
+ "styles",
30
+ "vars", // Internal structure hooks
31
+ "p",
32
+ "px",
33
+ "py",
34
+ "pt",
35
+ "pb",
36
+ "pl",
37
+ "pr", // Padding
38
+ "bg",
39
+ "c",
40
+ "opacity", // Color
41
+ "ff",
42
+ "fz",
43
+ "fw",
44
+ "lts",
45
+ "ta",
46
+ "lh",
47
+ "fs",
48
+ "tt",
49
+ "td", // Typography
50
+ "bd",
51
+ "bdw",
52
+ "bds",
53
+ "bdc",
54
+ "bdr", // Borders
55
+ "shadow", // Effects
56
+ "w",
57
+ "miw",
58
+ "maw",
59
+ "h",
60
+ "mih",
61
+ "mah", // Dimensions
62
+ ] as const;
63
+ export {
64
+ type RecursicaSpacing,
65
+ type RecursicaSize,
66
+ type RecursicaOverStyled,
67
+ type BlockedStylingKeys,
68
+ type ForbiddenStyles,
69
+ type WithRecursicaSpacing,
70
+ omitUnsupportedProps,
71
+ withCallerOverride,
72
+ mergeClassNames,
73
+ mergeStyles,
74
+ } from "@recursica/adapter-common";
75
+
76
+ const LAYOUT_PROPS = new Set([
77
+ "m",
78
+ "my",
79
+ "mx",
80
+ "mt",
81
+ "mb",
82
+ "ml",
83
+ "mr",
84
+ "gap",
85
+ "rowGap",
86
+ "columnGap",
87
+ "gutter",
88
+ "top",
89
+ "left",
90
+ "bottom",
91
+ "right",
92
+ ]);
93
+
94
+ export const SPACING_MAP: Record<string, string> = {
95
+ "rec-none": "var(--recursica_brand_dimensions_general_none)",
96
+ "rec-sm": "var(--recursica_brand_dimensions_general_sm)",
97
+ "rec-default": "var(--recursica_brand_dimensions_general_default)",
98
+ "rec-md": "var(--recursica_brand_dimensions_general_md)",
99
+ "rec-lg": "var(--recursica_brand_dimensions_general_lg)",
100
+ "rec-xl": "var(--recursica_brand_dimensions_general_xl)",
101
+ "rec-2xl": "var(--recursica_brand_dimensions_general_2xl)",
102
+ };
103
+
104
+ export function mapLayoutProps<T extends Record<string, unknown>>(props: T): T {
105
+ const mapped = { ...props };
106
+ for (const [key, value] of Object.entries(mapped)) {
107
+ if (
108
+ typeof value === "string" &&
109
+ value.startsWith("rec-") &&
110
+ LAYOUT_PROPS.has(key)
111
+ ) {
112
+ if (value in SPACING_MAP) {
113
+ (mapped as Record<string, unknown>)[key] = SPACING_MAP[value];
114
+ }
115
+ }
116
+ }
117
+ return mapped;
118
+ }
119
+
120
+ export function filterStylingProps<T extends Record<string, unknown>>(
121
+ props: T,
122
+ overStyled?: boolean,
123
+ ): Partial<T> {
124
+ if (overStyled) {
125
+ return props;
126
+ }
127
+
128
+ const sanitized = { ...props };
129
+
130
+ for (const prop of BLOCKED_STYLING_KEYS) {
131
+ if (prop in sanitized) {
132
+ delete sanitized[prop];
133
+ }
134
+ }
135
+
136
+ // Intercept Recursica spacing tokens for valid layout properties
137
+ for (const [key, value] of Object.entries(sanitized)) {
138
+ if (
139
+ typeof value === "string" &&
140
+ value.startsWith("rec-") &&
141
+ LAYOUT_PROPS.has(key)
142
+ ) {
143
+ if (value in SPACING_MAP) {
144
+ (sanitized as Record<string, unknown>)[key] = SPACING_MAP[value];
145
+ }
146
+ }
147
+ }
148
+
149
+ return sanitized;
150
+ }
@@ -0,0 +1 @@
1
+ export * from "./copyToClipboard";
@@ -0,0 +1,65 @@
1
+ import React from "react";
2
+ import {
3
+ type ComboboxStringItem,
4
+ type ComboboxLikeRenderOptionInput,
5
+ } from "@mantine/core";
6
+
7
+ // `ComboboxStringItem`/`ComboboxItem` only type `value`/`label`/`disabled` —
8
+ // `leadingIcon`/`supportingText` are extra fields Mantine's own `getParsedComboboxData` passes
9
+ // through untouched whenever an item already has both `value` and `label` (see
10
+ // get-parsed-combobox-data.mjs), so they reach `option` here at runtime even though the upstream
11
+ // type doesn't know about them. Generic over both Autocomplete's `ComboboxStringItem` (optional
12
+ // `label`) and Dropdown's `ComboboxItem` (required `label`) — the same renderer serves both.
13
+ type RichComboboxItem = ComboboxStringItem & {
14
+ label?: string;
15
+ leadingIcon?: React.ReactNode;
16
+ supportingText?: string;
17
+ };
18
+
19
+ export interface RichOptionClassNames {
20
+ optionContent: string;
21
+ optionIcon: string;
22
+ optionText: string;
23
+ /** Combined with `optionText` when `wrapItemText` is true — see `renderRichOption` below. */
24
+ optionTextWrap: string;
25
+ optionSupportingText: string;
26
+ }
27
+
28
+ /**
29
+ * `renderOption` for Autocomplete/Dropdown that renders an item's `leadingIcon`/`supportingText`
30
+ * (see MANTINE_ADAPTER_RICH_OPTION_DATA.md) inside the option row. Falls back to plain
31
+ * `option.label` — the same rendering Mantine uses when no `renderOption` is supplied at all — so
32
+ * items without the new fields are unaffected.
33
+ *
34
+ * `wrapItemText` (default `false`) controls whether `label`/`supportingText` wrap onto additional
35
+ * lines or truncate to a single line with an ellipsis.
36
+ */
37
+ export function renderRichOption<T extends ComboboxStringItem>(
38
+ { option }: ComboboxLikeRenderOptionInput<T>,
39
+ classNames: RichOptionClassNames,
40
+ wrapItemText = false,
41
+ ): React.ReactNode {
42
+ const { label, leadingIcon, supportingText } = option as RichComboboxItem;
43
+ const displayLabel = label ?? option.value;
44
+ if (!leadingIcon && !supportingText) {
45
+ return displayLabel;
46
+ }
47
+ const optionTextClassName = wrapItemText
48
+ ? `${classNames.optionText} ${classNames.optionTextWrap}`
49
+ : classNames.optionText;
50
+ return (
51
+ <span className={classNames.optionContent}>
52
+ {leadingIcon && (
53
+ <span className={classNames.optionIcon}>{leadingIcon}</span>
54
+ )}
55
+ <span className={optionTextClassName}>
56
+ <span>{displayLabel}</span>
57
+ {supportingText && (
58
+ <span className={classNames.optionSupportingText}>
59
+ {supportingText}
60
+ </span>
61
+ )}
62
+ </span>
63
+ </span>
64
+ );
65
+ }