@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,165 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Tooltip, type TooltipProps } from "./Tooltip";
3
+ import { Button } from "../Button";
4
+
5
+ /**
6
+ * Tooltip story axes:
7
+ * - position: tooltip alignment relative to target
8
+ * - withBeak: beak (arrow) indicator on the tooltip
9
+ * - openDelay / closeDelay: hover timing controls
10
+ * - multiline: text wrapping behavior
11
+ * - disabled: suppress the tooltip entirely
12
+ * - layer: tested via the global Layer decorator (withLayer/layer args)
13
+ */
14
+
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ type TooltipStoryArgs = Record<string, any>;
17
+
18
+ const meta: Meta = {
19
+ title: "UI-Kit/Tooltip",
20
+ component: Tooltip,
21
+ tags: ["autodocs"],
22
+ argTypes: {
23
+ label: {
24
+ control: "text",
25
+ description: "Content displayed inside the tooltip.",
26
+ },
27
+ position: {
28
+ control: "select",
29
+ options: [
30
+ "bottom",
31
+ "bottom-start",
32
+ "bottom-end",
33
+ "top",
34
+ "top-start",
35
+ "top-end",
36
+ "left",
37
+ "left-start",
38
+ "left-end",
39
+ "right",
40
+ "right-start",
41
+ "right-end",
42
+ ],
43
+ description: "The position of the tooltip relative to the target.",
44
+ },
45
+ withBeak: {
46
+ control: "boolean",
47
+ description:
48
+ "Whether to display a beak (arrow) pointing to the target. Recursica equivalent of Mantine's withArrow.",
49
+ },
50
+ offset: {
51
+ control: "number",
52
+ description: "Distance in px between the tooltip and the target element.",
53
+ },
54
+ openDelay: {
55
+ control: "number",
56
+ description: "Delay in ms before the tooltip opens on hover.",
57
+ },
58
+ closeDelay: {
59
+ control: "number",
60
+ description: "Delay in ms before the tooltip closes when hover ends.",
61
+ },
62
+ disabled: {
63
+ control: "boolean",
64
+ description: "If set, the tooltip will not be rendered.",
65
+ },
66
+ opened: {
67
+ control: "boolean",
68
+ description:
69
+ "Force the tooltip to stay open. Useful for inspecting styling.",
70
+ },
71
+ // Hide auto-detected HTML attributes that leak from ElementProps<'div'>
72
+ defaultChecked: { table: { disable: true } },
73
+ defaultValue: { table: { disable: true } },
74
+ suppressContentEditableWarning: { table: { disable: true } },
75
+ suppressHydrationWarning: { table: { disable: true } },
76
+ },
77
+ parameters: {
78
+ layout: "centered",
79
+ docs: {
80
+ description: {
81
+ component: `
82
+ The \`Tooltip\` component displays a floating label when the user hovers over or focuses a target element. It wraps Mantine's \`Tooltip\` while enforcing strict Recursica design token styling.
83
+
84
+ ### API
85
+
86
+ Unlike \`HoverCard\`, Tooltip is a single component — content is passed via the \`label\` prop:
87
+ \`\`\`tsx
88
+ <Tooltip label="Helpful text" withBeak>
89
+ <Button>Hover me</Button>
90
+ </Tooltip>
91
+ \`\`\`
92
+
93
+ ### Static Sub-Components
94
+ - \`Tooltip.Floating\` — A tooltip that follows the cursor position
95
+ - \`Tooltip.Group\` — Groups multiple tooltips to share hover delay
96
+
97
+ ### Key Behaviors
98
+ - The beak (arrow) is shown by default (\`withBeak={true}\`)
99
+ - Supports \`openDelay\` and \`closeDelay\` for timing control
100
+ - Set \`multiline\` to allow text wrapping within max-width
101
+ `,
102
+ },
103
+ },
104
+ },
105
+ };
106
+
107
+ export default meta;
108
+
109
+ type Story = StoryObj<TooltipStoryArgs>;
110
+
111
+ export const Default: Story = {
112
+ args: {
113
+ label: "This is a helpful tooltip",
114
+ position: "top",
115
+ withBeak: true,
116
+ offset: 5,
117
+ openDelay: 0,
118
+ closeDelay: 0,
119
+ disabled: false,
120
+ },
121
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
122
+ render: ({ withLayer, layer, ...args }: TooltipStoryArgs) => {
123
+ return (
124
+ <Tooltip {...(args as TooltipProps)}>
125
+ <Button variant="solid">Hover me</Button>
126
+ </Tooltip>
127
+ );
128
+ },
129
+ };
130
+
131
+ export const WithoutBeak: Story = {
132
+ args: {
133
+ label: "Tooltip without a beak indicator",
134
+ position: "top",
135
+ withBeak: false,
136
+ offset: 5,
137
+ },
138
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
139
+ render: ({ withLayer, layer, ...args }: TooltipStoryArgs) => {
140
+ return (
141
+ <Tooltip {...(args as TooltipProps)}>
142
+ <Button variant="outline">Without Beak</Button>
143
+ </Tooltip>
144
+ );
145
+ },
146
+ };
147
+
148
+ export const LongContent: Story = {
149
+ args: {
150
+ label:
151
+ "This is a longer tooltip message that demonstrates how text wraps within the maximum width defined by the design system.",
152
+ position: "top",
153
+ withBeak: true,
154
+ opened: true,
155
+ offset: 5,
156
+ },
157
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
158
+ render: ({ withLayer, layer, ...args }: TooltipStoryArgs) => {
159
+ return (
160
+ <Tooltip {...(args as TooltipProps)}>
161
+ <Button variant="solid">Long Content</Button>
162
+ </Tooltip>
163
+ );
164
+ },
165
+ };
@@ -0,0 +1 @@
1
+ // Placeholder for future Tooltip component tests. Add tests here if/when needed.
@@ -0,0 +1,117 @@
1
+ import { forwardRef } from "react";
2
+ import {
3
+ Tooltip as MantineTooltip,
4
+ type TooltipProps as MantineTooltipProps,
5
+ type TooltipFloatingProps as MantineTooltipFloatingProps,
6
+ } from "@mantine/core";
7
+ import {
8
+ filterStylingProps,
9
+ mergeClassNames,
10
+ type RecursicaOverStyled,
11
+ } from "../../utils/filterStylingProps";
12
+ import styles from "./Tooltip.module.css";
13
+
14
+ // ============================================================
15
+ // TOOLTIP
16
+ // ============================================================
17
+
18
+ /**
19
+ * Recursica-specific props for Tooltip.
20
+ */
21
+ import { type RecursicaTooltipProps } from "@recursica/adapter-common";
22
+
23
+ /**
24
+ * Recursica Tooltip component wrapping Mantine's Tooltip.
25
+ *
26
+ * Displays a floating label when the user hovers over or focuses a target element.
27
+ * Unlike HoverCard, Tooltip is a single component (not composable) — content is
28
+ * passed via the `label` prop, and the trigger is passed as `children`.
29
+ *
30
+ * ```tsx
31
+ * <Tooltip label="Helpful information" withBeak>
32
+ * <Button>Hover me</Button>
33
+ * </Tooltip>
34
+ * ```
35
+ *
36
+ * Static sub-components available via dot-notation:
37
+ * - `Tooltip.Floating` — Tooltip that follows the cursor
38
+ * - `Tooltip.Group` — Shared hover delay group for multiple tooltips
39
+ */
40
+ export type TooltipProps = RecursicaOverStyled<
41
+ MantineTooltipProps & RecursicaTooltipProps
42
+ >;
43
+
44
+ const TooltipBase = function Tooltip({
45
+ overStyled = false,
46
+ withBeak = true,
47
+ position = "top", // Recursica default; Mantine defaults to "bottom"
48
+ // arrowSize must be a JS number prop — Mantine uses it for inline width/height
49
+ // and positioning offset (-arrowSize/2) calculations that cannot be CSS-driven.
50
+ // Default to 16 to match the Recursica beak-size token (16px).
51
+ arrowSize = 16,
52
+ ...rest
53
+ }: TooltipProps) {
54
+ const sanitizedProps = filterStylingProps(rest, overStyled);
55
+ const restRecord = sanitizedProps as Record<string, unknown>;
56
+
57
+ // Bind CSS module classes to Mantine's internal classNames API
58
+ const mergedClassNames = mergeClassNames(
59
+ {
60
+ tooltip: styles.tooltip,
61
+ arrow: styles.arrow,
62
+ },
63
+ restRecord.classNames as Partial<Record<string, string>> | undefined,
64
+ );
65
+
66
+ // Resolve withBeak (Recursica) vs withArrow (Mantine).
67
+ // withBeak takes precedence when both are provided.
68
+ const withArrow = restRecord.withArrow as boolean | undefined;
69
+ const resolvedWithArrow = withBeak ?? withArrow;
70
+
71
+ return (
72
+ <MantineTooltip
73
+ {...(sanitizedProps as unknown as MantineTooltipProps)}
74
+ position={position}
75
+ arrowSize={arrowSize}
76
+ withArrow={resolvedWithArrow}
77
+ multiline /* Always allow text wrapping within max-width */
78
+ classNames={mergedClassNames}
79
+ />
80
+ );
81
+ };
82
+ TooltipBase.displayName = "Tooltip";
83
+
84
+ // ============================================================
85
+ // TOOLTIP.FLOATING
86
+ // ============================================================
87
+
88
+ export type TooltipFloatingProps =
89
+ RecursicaOverStyled<MantineTooltipFloatingProps>;
90
+
91
+ export const TooltipFloating = forwardRef<HTMLDivElement, TooltipFloatingProps>(
92
+ function TooltipFloating({ overStyled = false, ...rest }, ref) {
93
+ const sanitizedProps = filterStylingProps(rest, overStyled);
94
+ return (
95
+ <MantineTooltip.Floating
96
+ ref={ref}
97
+ {...(sanitizedProps as unknown as MantineTooltipFloatingProps)}
98
+ />
99
+ );
100
+ },
101
+ );
102
+ TooltipFloating.displayName = "TooltipFloating";
103
+
104
+ // ============================================================
105
+ // DOT NOTATION EXPORT
106
+ // ============================================================
107
+
108
+ type TooltipComponent = typeof TooltipBase & {
109
+ Floating: typeof TooltipFloating;
110
+ Group: typeof MantineTooltip.Group;
111
+ };
112
+
113
+ export const Tooltip = TooltipBase as TooltipComponent;
114
+ Tooltip.Floating = TooltipFloating;
115
+ // Tooltip.Group has no styling props of its own (no `style`/`className`/BoxProps),
116
+ // so re-exporting Mantine's implementation directly is not a styling-gate gap.
117
+ Tooltip.Group = MantineTooltip.Group;
@@ -0,0 +1,80 @@
1
+ # Tooltip - Usage Guide
2
+
3
+ This document describes how to integrate and use the `Tooltip` component in your projects using `@recursica/adapter-mantine-v8`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { Tooltip } from "@recursica/adapter-mantine-v8";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { Tooltip } from "@recursica/adapter-mantine-v8";
20
+
21
+ export default function Demo() {
22
+ return (
23
+ <Tooltip label="This is a helpful tooltip">
24
+ <Button variant="primary">Hover Me</Button>
25
+ </Tooltip>
26
+ );
27
+ }
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 3. Design System Integration
33
+
34
+ All Recursica components in the `@recursica/adapter-mantine-v8` package adhere strictly to design system spacing, scaling, and behavior patterns.
35
+
36
+ > [!IMPORTANT]
37
+ >
38
+ > - **Anti-override protection**: Rogues style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
39
+ > - **No Direct Layers**: Do not pass a `layer` prop to this component. To place it on a specific visual layer, wrap it in a `<Layer layer={0|1|2|3}>` component natively.
40
+ > - **Variables and Theming**: Styling is entirely determined by local CSS variables defined in `recursica_variables_scoped.css` and mapped in the component's CSS module.
41
+
42
+ ---
43
+
44
+ ## 4. Key Integration Features & Constraints
45
+
46
+ ## 1. Single Component API (Not Composable)
47
+
48
+ **Decision:** Unlike HoverCard (which uses `HoverCard` + `HoverCard.Target` + `HoverCard.Dropdown`), Tooltip is a single wrapper component.
49
+
50
+ **Implementation:** Mantine's `Tooltip` takes content via a `label` prop and wraps the trigger element as `children`. There are no separate Target/Dropdown sub-components. The Recursica wrapper preserves this exact API.
51
+
52
+ **Static sub-components:** `Tooltip.Floating` and `Tooltip.Group` are exposed as pass-through references to Mantine's implementations. These do not receive Recursica styling treatment — they are utility wrappers for cursor-following tooltips and shared delay grouping respectively.
53
+
54
+ ---
55
+
56
+ ## 2. Behavior Notes
57
+
58
+ Tooltip text always wraps to fit within the token-defined max width, rather than staying on a single line or overflowing. The `multiline` prop is not exposed, since this behavior is always on.
59
+
60
+ ---
61
+
62
+ ## 3. Recursica `withBeak` Prop
63
+
64
+ **Decision:** `withBeak` is the official Recursica prop for controlling beak visibility, defaulting to `true`.
65
+
66
+ **Implementation:** Both `withBeak` and Mantine's `withArrow` are accepted. When both are provided, `withBeak` takes precedence. The beak's size can be adjusted via the `arrowSize` prop (default `16`).
67
+
68
+ ---
69
+
70
+ ## 4. Tooltip.Floating and Tooltip.Group
71
+
72
+ **Decision:** These static sub-components are direct pass-throughs to Mantine with no Recursica styling.
73
+
74
+ **Implementation:** `Tooltip.Floating` follows the cursor and uses a different rendering mechanism than standard Tooltip. `Tooltip.Group` is a utility for shared delay timing. Neither has Recursica design tokens defined, so they remain unstyled pass-throughs. If tokens are added in the future, they can be wrapped independently.
75
+
76
+ ---
77
+
78
+ ## 5. Default Position
79
+
80
+ Recursica defaults `position` to `"top"` instead of Mantine's default of `"bottom"`. Pass your own `position` value to override it.
@@ -0,0 +1,111 @@
1
+ # TransferList Implementation Notes
2
+
3
+ ## Architecture overview
4
+
5
+ `TransferList` replaces the "coming soon" stub with a fully custom composite — neither
6
+ `@mantine/core` nor `@mui/material` ships a real dual-listbox component (MUI's docs "Transfer
7
+ List" is a List+Checkbox recipe, not a package export), so it's built from Recursica's own
8
+ primitives, the same situation `FileUpload`/`FileInput` were in.
9
+
10
+ Follows Matt's reference implementation (Forge's fallback `TransferList.tsx`) fairly closely:
11
+
12
+ - Two side-by-side panes (source/target), each: a header row (pane label + `Badge` count,
13
+ `"selected / total"` once something's checked), a search `TextField`, then a scrollable list of
14
+ `Checkbox` rows (`CheckboxGroup` for items carrying a `group` field).
15
+ - A column of four transfer `Button`s between the panes: single/double chevron, each direction —
16
+ single moves only the checked items in that pane, double moves everything in that pane.
17
+ - Data model: `data`/`defaultData` as a `[sourceItems, targetItems]` tuple + `onChange`, matching
18
+ Forge's controlled/uncontrolled pattern (same shape as `FileUpload`'s `files`/`onFilesAdded`).
19
+
20
+ ## Routed through `FormControlWrapper` directly, not Forge's hand-rolled label/assistive
21
+
22
+ Forge's reference renders its own `Label`/`AssistiveElement` directly instead of going through
23
+ `FormControlWrapper`. Per direction, this build uses `FormControlWrapper` instead — consistent
24
+ with every other form control in this codebase (and with `FileUpload`, which was reverted to
25
+ `FormControlWrapper` rather than hand-rolling that same thing). `formLayout`
26
+ (`stacked`/`side-by-side`), `label`, `required`, `assistiveText`/`description`/`helperText`, and
27
+ `error` all come from the standard wrapper; only the two panes + transfer buttons are the
28
+ component's own content.
29
+
30
+ ## `state` axis: `disabled`/`error` props, not Forge's `state` string
31
+
32
+ Forge's reference takes a single `state="default"|"disabled"|"error"` prop. This build instead
33
+ uses the same convention as every other Recursica control: a boolean `disabled` prop plus
34
+ `FormControlWrapper`'s own `error` (message) prop — `error`'s mere presence is what triggers the
35
+ error visuals, exactly like `TextArea`/`CheckboxGroup`. The token export only defines
36
+ `disabled`/`error` state variants (no `focus`), matching Matt's direction to "follow the tokens."
37
+
38
+ ## `readOnly` mode (added 2026-08-19)
39
+
40
+ Forge's reference has no read-only concept, but Matt asked for a `ReadOnly` story demonstrating
41
+ the selected items as a read-only list. Switched from calling `FormControlWrapper` directly to
42
+ routing through `WithReadOnlyWrapper` (the follow-up flagged in the original version of this note),
43
+ matching `TextArea`'s shape: `readOnly`/`readOnlyComponent`/`emptyValueComponent` added to the prop
44
+ surface via `ReadOnlyControlProps`, `readOnlyType="text"`, and `readOnlyValue` set to the target
45
+ pane's item labels (`effectiveData[1].map(item => item.label)`). Renders as a comma-joined text
46
+ list via the shared `ReadOnlyTextField`, same convention `CheckboxGroup`'s own read-only mode
47
+ already uses for an array of values — no new read-only renderer needed. The two panes + transfer
48
+ buttons (`activeComponent`) are skipped entirely when `readOnly` is set, same as every other
49
+ control.
50
+
51
+ ## Height/gap/padding token audit (2026-08-19)
52
+
53
+ Matt flagged the pane height as "too short" and asked that gap/padding be tied to recursica
54
+ variables. Re-verified against `recursica_variables_scoped.css`: `properties_height` (200px),
55
+ `properties_width`, `properties_vertical-padding`/`properties_horizontal-padding`, and
56
+ `properties_gap` were already wired to their tokens (see "Token interpretation" above) — the 200px
57
+ pane height is the design token's own value, not a hardcoded fallback. Two spacing values genuinely
58
+ have no covering token in the 31-variable schema and are intentionally left as hardcoded pixels
59
+ (see `TransferList.module.css` comments) rather than reusing another component's token: the gap
60
+ between stacked `CheckboxGroup` blocks in `.paneList` (ungrouped row + each named group), and the
61
+ gap between the four transfer buttons in `.transferColumn`. If a token is added to the schema for
62
+ either, wire it in directly; until then this matches the established precedent (e.g. `FileUpload`'s
63
+ untokened icon size) of leaving a truly uncovered value hardcoded with a documented reason instead
64
+ of borrowing a sibling component's namespace.
65
+
66
+ ## Token interpretation: unlabeled tokens with more than one plausible layout target
67
+
68
+ The 31-variable schema (`properties_*` + two `layouts.*` + `states.{disabled,error}`) has a few
69
+ names that don't pin down a single location by themselves:
70
+
71
+ - **`properties_gap`** — applied to the row holding `[source pane, transfer column, target pane]`.
72
+ It's the only _unnested_ gap the schema defines at the component's own level (not under
73
+ `header-style`, a state, or a layout), so it reads as the component's top-level layout gap.
74
+ - **`properties_title-filter-gap`** — between each pane's header row (label + count `Badge`) and
75
+ its search field.
76
+ - **`properties_filter-items-gap`** — between each pane's search field and its item list.
77
+ - **`properties_header-style_*` / `properties_colors_header-color`** — typography/color for each
78
+ pane's own header text, not the overall `FormControlWrapper` label (which has its own type
79
+ styling already).
80
+ - **`properties_width` (300px) / `properties_height` (200px)** — taken as each pane's own fixed
81
+ box size (`flex: 1 1 <width>`, so panes still stretch evenly in a wider container; `height` is
82
+ literal since a dual-listbox needs a bounded, independently-scrollable list).
83
+
84
+ No exemptions needed beyond `border-size` (see below) — all 31 variables are referenced; verified
85
+ zero broken/unused via `recursica-token-analyzer`.
86
+
87
+ ## Border-size intentionally unused
88
+
89
+ Same house policy `TextField`/`TextArea`/`FileInput` already follow: `border-size` (base,
90
+ `disabled`, `error`) is `recursica-ignore`d and a flat 1px border is applied uniformly instead, so
91
+ switching states doesn't shift layout.
92
+
93
+ ## No forge-defined focus state
94
+
95
+ `transfer-list` has no `states.focus` axis in the export — same as `FileInput`/`TextField`. Focus
96
+ is handled per-control (each `Checkbox`/`TextField`/`Button` already has its own focus ring); the
97
+ pane box itself has no focus state to render.
98
+
99
+ ## Grouping and search are local, not per-item persisted state
100
+
101
+ Search filters each pane independently (`sourceSearch`/`targetSearch`); grouped items render under
102
+ a `CheckboxGroup` keyed by `item.group`, ungrouped items render as plain `Checkbox` rows above the
103
+ groups (alphabetized by group name) — same two-bucket split Forge's reference uses. Selection
104
+ (`sourceSelected`/`targetSelected`) is cleared on every transfer, matching Forge's behavior.
105
+
106
+ ## Chevron icons are inline, not a shared icon set entry
107
+
108
+ Same precedent as `Tree`'s `ExpandGlyph`/`FileInput`'s `ClearIcon`: a single-chevron and a
109
+ double-chevron SVG are defined locally and flipped via `transform: scaleX(-1)` for the "left"
110
+ direction, rather than maintaining four separate paths or adding new shared icon-set entries for a
111
+ single component.
@@ -0,0 +1,182 @@
1
+ /* TOKEN INTERPRETATION NOTES (see TRANSFERLIST_IMPLEMENTATION_NOTES.md):
2
+ - `properties_gap` is applied to the row that holds [source pane, transfer buttons, target pane] —
3
+ it's the only unnested gap the schema defines at the component's own level.
4
+ - `properties_title-filter-gap` sits between each pane's header row and its search field.
5
+ - `properties_filter-items-gap` sits between each pane's search field and its item list. */
6
+
7
+ /* EXEMPTIONS:
8
+ - border-size is constant across disabled/error states — only border-color changes; the
9
+ disabled/error border-size tokens are never applied by design. */
10
+ /* recursica-ignore: --recursica_ui-kit_components_transfer-list_variants_states_disabled_properties_border-size */
11
+ /* recursica-ignore: --recursica_ui-kit_components_transfer-list_variants_states_error_properties_border-size */
12
+
13
+ .layoutOverride {
14
+ --form-control-margin-bottom: var(
15
+ --recursica_ui-kit_components_transfer-list_variants_layouts_stacked_properties_top-bottom-margin
16
+ );
17
+ }
18
+
19
+ .layoutOverride[data-form-layout="side-by-side"] {
20
+ --form-control-margin-bottom: var(
21
+ --recursica_ui-kit_components_transfer-list_variants_layouts_side-by-side_properties_top-bottom-margin
22
+ );
23
+ }
24
+
25
+ .root {
26
+ display: flex;
27
+ width: 100%;
28
+ }
29
+
30
+ .panes {
31
+ display: flex;
32
+ align-items: stretch;
33
+ gap: var(--recursica_ui-kit_components_transfer-list_properties_gap);
34
+ width: 100%;
35
+ }
36
+
37
+ .pane {
38
+ display: flex;
39
+ flex-direction: column;
40
+ box-sizing: border-box;
41
+ min-width: 0;
42
+ flex: 1 1 var(--recursica_ui-kit_components_transfer-list_properties_width);
43
+ height: var(--recursica_ui-kit_components_transfer-list_properties_height);
44
+ padding: var(
45
+ --recursica_ui-kit_components_transfer-list_properties_vertical-padding
46
+ )
47
+ var(
48
+ --recursica_ui-kit_components_transfer-list_properties_horizontal-padding
49
+ );
50
+ border-width: var(
51
+ --recursica_ui-kit_components_transfer-list_properties_border-size
52
+ );
53
+ border-style: solid;
54
+ border-radius: var(
55
+ --recursica_ui-kit_components_transfer-list_properties_border-radius
56
+ );
57
+ border-color: var(
58
+ --recursica_ui-kit_components_transfer-list_properties_colors_border-color
59
+ );
60
+ background-color: var(
61
+ --recursica_ui-kit_components_transfer-list_properties_colors_background-color
62
+ );
63
+ }
64
+
65
+ .paneHeader {
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: space-between;
69
+ margin-bottom: var(
70
+ --recursica_ui-kit_components_transfer-list_properties_title-filter-gap
71
+ );
72
+ font-family: var(
73
+ --recursica_ui-kit_components_transfer-list_properties_header-style_fontFamily
74
+ );
75
+ font-size: var(
76
+ --recursica_ui-kit_components_transfer-list_properties_header-style_fontSize
77
+ );
78
+ font-style: var(
79
+ --recursica_ui-kit_components_transfer-list_properties_header-style_fontStyle
80
+ );
81
+ font-weight: var(
82
+ --recursica_ui-kit_components_transfer-list_properties_header-style_fontWeight
83
+ );
84
+ letter-spacing: var(
85
+ --recursica_ui-kit_components_transfer-list_properties_header-style_letterSpacing
86
+ );
87
+ line-height: var(
88
+ --recursica_ui-kit_components_transfer-list_properties_header-style_lineHeight
89
+ );
90
+ text-decoration: var(
91
+ --recursica_ui-kit_components_transfer-list_properties_header-style_textDecoration
92
+ );
93
+ text-transform: var(
94
+ --recursica_ui-kit_components_transfer-list_properties_header-style_textCase
95
+ );
96
+ color: var(
97
+ --recursica_ui-kit_components_transfer-list_properties_colors_header-color
98
+ );
99
+ }
100
+
101
+ .paneSearch {
102
+ margin-bottom: var(
103
+ --recursica_ui-kit_components_transfer-list_properties_filter-items-gap
104
+ );
105
+ }
106
+
107
+ .paneList {
108
+ flex: 1;
109
+ overflow-y: auto;
110
+ display: flex;
111
+ flex-direction: column;
112
+ /* No token exists for the gap between stacked CheckboxGroup blocks (ungrouped row +
113
+ each named group) — the 31-variable transfer-list schema only defines gaps at the
114
+ header/search/pane level (see TRANSFERLIST_IMPLEMENTATION_NOTES.md). Left as an
115
+ intentional hardcoded value rather than borrowing another component's token, same
116
+ as FileUpload's untokened icon size. */
117
+ gap: 2px;
118
+ min-height: 0;
119
+ }
120
+
121
+ .emptyState {
122
+ display: flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ flex: 1;
126
+ opacity: 0.6;
127
+ font-size: 14px;
128
+ padding: 16px;
129
+ text-align: center;
130
+ }
131
+
132
+ .transferColumn {
133
+ display: flex;
134
+ flex-direction: column;
135
+ align-items: center;
136
+ justify-content: center;
137
+ /* No token exists for spacing between the four transfer buttons — not part of the
138
+ 31-variable schema. Left as an intentional hardcoded value (see TRANSFERLIST_IMPLEMENTATION_NOTES.md). */
139
+ gap: 4px;
140
+ flex-shrink: 0;
141
+ }
142
+
143
+ .chevron[data-direction="left"] {
144
+ transform: scaleX(-1);
145
+ }
146
+
147
+ /* -------------------------------------
148
+ STATE CASCADE
149
+ -------------------------------------- */
150
+
151
+ .root[data-error] .pane {
152
+ border-color: var(
153
+ --recursica_ui-kit_components_transfer-list_variants_states_error_properties_colors_border-color
154
+ ) !important;
155
+ background-color: var(
156
+ --recursica_ui-kit_components_transfer-list_variants_states_error_properties_colors_background-color
157
+ ) !important;
158
+ }
159
+
160
+ .root[data-error] .paneHeader {
161
+ color: var(
162
+ --recursica_ui-kit_components_transfer-list_variants_states_error_properties_colors_header-color
163
+ ) !important;
164
+ }
165
+
166
+ .root[data-disabled] .pane {
167
+ border-color: var(
168
+ --recursica_ui-kit_components_transfer-list_variants_states_disabled_properties_colors_border-color
169
+ ) !important;
170
+ background-color: var(
171
+ --recursica_ui-kit_components_transfer-list_variants_states_disabled_properties_colors_background-color
172
+ ) !important;
173
+ opacity: var(
174
+ --recursica_ui-kit_components_transfer-list_variants_states_disabled_properties_opacity
175
+ );
176
+ }
177
+
178
+ .root[data-disabled] .paneHeader {
179
+ color: var(
180
+ --recursica_ui-kit_components_transfer-list_variants_states_disabled_properties_colors_header-color
181
+ ) !important;
182
+ }