@recursica/adapter-mui-v7 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 (389) hide show
  1. package/.storybook/commonArgTypes.ts +148 -0
  2. package/ARCHITECTURE.md +18 -0
  3. package/CHANGELOG.md +582 -0
  4. package/LICENSE +21 -0
  5. package/OVERSTYLING.md +59 -0
  6. package/README.md +70 -0
  7. package/SETUP.md +92 -0
  8. package/USAGE.md +57 -0
  9. package/dist/adapter-mui-v7.cjs +292 -0
  10. package/dist/adapter-mui-v7.cjs.map +1 -0
  11. package/dist/adapter-mui-v7.css +1 -0
  12. package/dist/adapter-mui-v7.js +40757 -0
  13. package/dist/adapter-mui-v7.js.map +1 -0
  14. package/dist/index.d.ts +2350 -0
  15. package/dist/vite.svg +1 -0
  16. package/docs/PHILOSOPHY.md +39 -0
  17. package/llms.txt +76 -0
  18. package/package.json +151 -0
  19. package/recursica_brand.json +2677 -0
  20. package/recursica_tokens.json +799 -0
  21. package/recursica_ui-kit.json +14981 -0
  22. package/recursica_variables_scoped.css +30489 -0
  23. package/src/GlobalExemptions.modules.css +7 -0
  24. package/src/Introduction.stories.tsx +184 -0
  25. package/src/OverStyling.tsx +87 -0
  26. package/src/Version.tsx +37 -0
  27. package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +107 -0
  28. package/src/components/Accordion/Accordion.module.css +362 -0
  29. package/src/components/Accordion/Accordion.stories.tsx +198 -0
  30. package/src/components/Accordion/Accordion.test.tsx +1 -0
  31. package/src/components/Accordion/Accordion.tsx +285 -0
  32. package/src/components/Accordion/USAGE.md +43 -0
  33. package/src/components/Accordion/index.ts +1 -0
  34. package/src/components/AssistiveElement/ASSISTIVEELEMENT_IMPLEMENTATION_NOTES.md +59 -0
  35. package/src/components/AssistiveElement/AssistiveElement.module.css +121 -0
  36. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +68 -0
  37. package/src/components/AssistiveElement/AssistiveElement.test.tsx +1 -0
  38. package/src/components/AssistiveElement/AssistiveElement.tsx +94 -0
  39. package/src/components/AssistiveElement/USAGE.md +36 -0
  40. package/src/components/AssistiveElement/index.ts +1 -0
  41. package/src/components/AutoComplete/AutoComplete.module.css +456 -0
  42. package/src/components/AutoComplete/AutoComplete.stories.tsx +336 -0
  43. package/src/components/AutoComplete/AutoComplete.test.tsx +1 -0
  44. package/src/components/AutoComplete/AutoComplete.tsx +266 -0
  45. package/src/components/AutoComplete/IMPLEMENTATION_NOTES.md +37 -0
  46. package/src/components/AutoComplete/USAGE.md +68 -0
  47. package/src/components/AutoComplete/index.ts +1 -0
  48. package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +36 -0
  49. package/src/components/Avatar/Avatar.module.css +336 -0
  50. package/src/components/Avatar/Avatar.stories.tsx +92 -0
  51. package/src/components/Avatar/Avatar.test.tsx +1 -0
  52. package/src/components/Avatar/Avatar.tsx +88 -0
  53. package/src/components/Avatar/USAGE.md +38 -0
  54. package/src/components/Avatar/index.ts +1 -0
  55. package/src/components/Badge/Badge.module.css +115 -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 +61 -0
  59. package/src/components/Badge/USAGE.md +40 -0
  60. package/src/components/Badge/index.ts +1 -0
  61. package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +51 -0
  62. package/src/components/Breadcrumb/Breadcrumb.module.css +51 -0
  63. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +114 -0
  64. package/src/components/Breadcrumb/Breadcrumb.test.tsx +1 -0
  65. package/src/components/Breadcrumb/Breadcrumb.tsx +70 -0
  66. package/src/components/Breadcrumb/USAGE.md +42 -0
  67. package/src/components/Breadcrumb/index.ts +1 -0
  68. package/src/components/Button/BUTTON_IMPLEMENTATION_NOTES.md +123 -0
  69. package/src/components/Button/Button.module.css +413 -0
  70. package/src/components/Button/Button.stories.tsx +196 -0
  71. package/src/components/Button/Button.styleIsolation.dom.test.tsx +98 -0
  72. package/src/components/Button/Button.tsx +156 -0
  73. package/src/components/Button/USAGE.md +46 -0
  74. package/src/components/Button/index.ts +1 -0
  75. package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +15 -0
  76. package/src/components/Card/Card.module.css +155 -0
  77. package/src/components/Card/Card.stories.tsx +131 -0
  78. package/src/components/Card/Card.test.tsx +1 -0
  79. package/src/components/Card/Card.tsx +202 -0
  80. package/src/components/Card/USAGE.md +57 -0
  81. package/src/components/Card/index.ts +1 -0
  82. package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +14 -0
  83. package/src/components/Checkbox/Checkbox.module.css +286 -0
  84. package/src/components/Checkbox/Checkbox.stories.tsx +97 -0
  85. package/src/components/Checkbox/Checkbox.test.tsx +1 -0
  86. package/src/components/Checkbox/Checkbox.tsx +259 -0
  87. package/src/components/Checkbox/CheckboxGroup.stories.tsx +139 -0
  88. package/src/components/Checkbox/CheckboxGroup.tsx +148 -0
  89. package/src/components/Checkbox/USAGE.md +36 -0
  90. package/src/components/Checkbox/index.ts +6 -0
  91. package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +102 -0
  92. package/src/components/Chip/Chip.module.css +283 -0
  93. package/src/components/Chip/Chip.stories.tsx +154 -0
  94. package/src/components/Chip/Chip.test.tsx +1 -0
  95. package/src/components/Chip/Chip.tsx +168 -0
  96. package/src/components/Chip/USAGE.md +55 -0
  97. package/src/components/Chip/index.ts +1 -0
  98. package/src/components/Container/Container.stories.tsx +118 -0
  99. package/src/components/Container/Container.test.tsx +1 -0
  100. package/src/components/Container/Container.tsx +51 -0
  101. package/src/components/Container/IMPLEMENTATION_NOTES.md +5 -0
  102. package/src/components/Container/USAGE.md +48 -0
  103. package/src/components/Container/index.ts +1 -0
  104. package/src/components/DatePicker/DATEPICKER_IMPLEMENTATION_NOTES.md +29 -0
  105. package/src/components/DatePicker/DatePicker.icons.tsx +35 -0
  106. package/src/components/DatePicker/DatePicker.module.css +464 -0
  107. package/src/components/DatePicker/DatePicker.stories.tsx +163 -0
  108. package/src/components/DatePicker/DatePicker.test.tsx +1 -0
  109. package/src/components/DatePicker/DatePicker.tsx +229 -0
  110. package/src/components/DatePicker/USAGE.md +49 -0
  111. package/src/components/DatePicker/index.ts +1 -0
  112. package/src/components/Dropdown/BareDropdown.tsx +168 -0
  113. package/src/components/Dropdown/DROPDOWN_IMPLEMENTATION_NOTES.md +45 -0
  114. package/src/components/Dropdown/Dropdown.icons.tsx +33 -0
  115. package/src/components/Dropdown/Dropdown.module.css +535 -0
  116. package/src/components/Dropdown/Dropdown.stories.tsx +252 -0
  117. package/src/components/Dropdown/Dropdown.test.tsx +1 -0
  118. package/src/components/Dropdown/Dropdown.tsx +319 -0
  119. package/src/components/Dropdown/USAGE.md +68 -0
  120. package/src/components/Dropdown/index.ts +1 -0
  121. package/src/components/FileInput/FILEINPUT_IMPLEMENTATION_NOTES.md +153 -0
  122. package/src/components/FileInput/FileInput.module.css +268 -0
  123. package/src/components/FileInput/FileInput.stories.tsx +313 -0
  124. package/src/components/FileInput/FileInput.test.tsx +1 -0
  125. package/src/components/FileInput/FileInput.tsx +415 -0
  126. package/src/components/FileInput/USAGE.md +145 -0
  127. package/src/components/FileInput/index.ts +1 -0
  128. package/src/components/FileUpload/FILEUPLOAD_IMPLEMENTATION_NOTES.md +249 -0
  129. package/src/components/FileUpload/FileUpload.module.css +200 -0
  130. package/src/components/FileUpload/FileUpload.stories.tsx +362 -0
  131. package/src/components/FileUpload/FileUpload.test.tsx +1 -0
  132. package/src/components/FileUpload/FileUpload.tsx +352 -0
  133. package/src/components/FileUpload/USAGE.md +199 -0
  134. package/src/components/FileUpload/index.ts +1 -0
  135. package/src/components/Flex/Flex.stories.tsx +128 -0
  136. package/src/components/Flex/Flex.test.tsx +1 -0
  137. package/src/components/Flex/Flex.tsx +89 -0
  138. package/src/components/Flex/USAGE.md +41 -0
  139. package/src/components/Flex/index.ts +1 -0
  140. package/src/components/FormControlLayout/FormControlLayout.module.css +92 -0
  141. package/src/components/FormControlLayout/FormControlLayout.stories.tsx +118 -0
  142. package/src/components/FormControlLayout/FormControlLayout.test.tsx +1 -0
  143. package/src/components/FormControlLayout/FormControlLayout.tsx +72 -0
  144. package/src/components/FormControlLayout/USAGE.md +40 -0
  145. package/src/components/FormControlLayout/index.ts +1 -0
  146. package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +35 -0
  147. package/src/components/FormControlWrapper/FormControlWrapper.module.css +87 -0
  148. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +129 -0
  149. package/src/components/FormControlWrapper/FormControlWrapper.test.tsx +1 -0
  150. package/src/components/FormControlWrapper/FormControlWrapper.tsx +149 -0
  151. package/src/components/FormControlWrapper/USAGE.md +40 -0
  152. package/src/components/FormControlWrapper/index.ts +1 -0
  153. package/src/components/Grid/Grid.module.css +72 -0
  154. package/src/components/Grid/Grid.stories.tsx +161 -0
  155. package/src/components/Grid/Grid.test.tsx +1 -0
  156. package/src/components/Grid/Grid.tsx +155 -0
  157. package/src/components/Grid/IMPLEMENTATION_NOTES.md +24 -0
  158. package/src/components/Grid/USAGE.md +53 -0
  159. package/src/components/Grid/index.ts +1 -0
  160. package/src/components/Group/Group.stories.tsx +120 -0
  161. package/src/components/Group/Group.test.tsx +1 -0
  162. package/src/components/Group/Group.tsx +116 -0
  163. package/src/components/Group/USAGE.md +41 -0
  164. package/src/components/Group/index.ts +1 -0
  165. package/src/components/Heading/Heading.stories.tsx +50 -0
  166. package/src/components/Heading/Heading.test.tsx +1 -0
  167. package/src/components/Heading/Heading.tsx +28 -0
  168. package/src/components/Heading/USAGE.md +36 -0
  169. package/src/components/Heading/index.ts +1 -0
  170. package/src/components/HoverCard/HoverCard.module.css +107 -0
  171. package/src/components/HoverCard/HoverCard.stories.tsx +172 -0
  172. package/src/components/HoverCard/HoverCard.test.tsx +1 -0
  173. package/src/components/HoverCard/HoverCard.tsx +145 -0
  174. package/src/components/HoverCard/USAGE.md +45 -0
  175. package/src/components/HoverCard/index.ts +1 -0
  176. package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +27 -0
  177. package/src/components/Label/Label.module.css +169 -0
  178. package/src/components/Label/Label.stories.tsx +131 -0
  179. package/src/components/Label/Label.test.tsx +1 -0
  180. package/src/components/Label/Label.tsx +96 -0
  181. package/src/components/Label/USAGE.md +36 -0
  182. package/src/components/Label/index.ts +1 -0
  183. package/src/components/Layer/USAGE.md +50 -0
  184. package/src/components/Link/LINK_IMPLEMENTATION_NOTES.md +9 -0
  185. package/src/components/Link/Link.module.css +105 -0
  186. package/src/components/Link/Link.stories.tsx +58 -0
  187. package/src/components/Link/Link.test.tsx +1 -0
  188. package/src/components/Link/Link.tsx +45 -0
  189. package/src/components/Link/USAGE.md +40 -0
  190. package/src/components/Link/index.ts +1 -0
  191. package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +25 -0
  192. package/src/components/Loader/Loader.animate.dom.test.tsx +72 -0
  193. package/src/components/Loader/Loader.module.css +175 -0
  194. package/src/components/Loader/Loader.stories.tsx +123 -0
  195. package/src/components/Loader/Loader.test.tsx +1 -0
  196. package/src/components/Loader/Loader.tsx +72 -0
  197. package/src/components/Loader/USAGE.md +42 -0
  198. package/src/components/Loader/index.ts +1 -0
  199. package/src/components/Menu/IMPLEMENTATION_NOTES.md +5 -0
  200. package/src/components/Menu/Menu.module.css +283 -0
  201. package/src/components/Menu/Menu.stories.tsx +405 -0
  202. package/src/components/Menu/Menu.test.tsx +1 -0
  203. package/src/components/Menu/Menu.tsx +103 -0
  204. package/src/components/Menu/USAGE.md +53 -0
  205. package/src/components/Menu/index.ts +1 -0
  206. package/src/components/Modal/MODAL_IMPLEMENTATION_NOTES.md +31 -0
  207. package/src/components/Modal/Modal.module.css +302 -0
  208. package/src/components/Modal/Modal.stories.tsx +105 -0
  209. package/src/components/Modal/Modal.test.tsx +1 -0
  210. package/src/components/Modal/Modal.tsx +231 -0
  211. package/src/components/Modal/USAGE.md +40 -0
  212. package/src/components/Modal/index.ts +1 -0
  213. package/src/components/NumberInput/NUMBER_INPUT_IMPLEMENTATION_NOTES.md +93 -0
  214. package/src/components/NumberInput/NumberInput.module.css +303 -0
  215. package/src/components/NumberInput/NumberInput.stories.tsx +96 -0
  216. package/src/components/NumberInput/NumberInput.test.tsx +1 -0
  217. package/src/components/NumberInput/NumberInput.tsx +273 -0
  218. package/src/components/NumberInput/USAGE.md +36 -0
  219. package/src/components/NumberInput/index.ts +1 -0
  220. package/src/components/Pagination/IMPLEMENTATION_NOTES.md +40 -0
  221. package/src/components/Pagination/Pagination.icons.tsx +66 -0
  222. package/src/components/Pagination/Pagination.module.css +197 -0
  223. package/src/components/Pagination/Pagination.stories.tsx +48 -0
  224. package/src/components/Pagination/Pagination.test.tsx +1 -0
  225. package/src/components/Pagination/Pagination.tsx +123 -0
  226. package/src/components/Pagination/USAGE.md +36 -0
  227. package/src/components/Pagination/index.ts +1 -0
  228. package/src/components/Panel/PANEL_IMPLEMENTATION_NOTES.md +133 -0
  229. package/src/components/Panel/Panel.module.css +231 -0
  230. package/src/components/Panel/Panel.stories.tsx +227 -0
  231. package/src/components/Panel/Panel.test.tsx +1 -0
  232. package/src/components/Panel/Panel.tsx +186 -0
  233. package/src/components/Panel/USAGE.md +46 -0
  234. package/src/components/Panel/index.ts +1 -0
  235. package/src/components/Popover/IMPLEMENTATION_NOTES.md +22 -0
  236. package/src/components/Popover/Popover.module.css +118 -0
  237. package/src/components/Popover/Popover.stories.tsx +133 -0
  238. package/src/components/Popover/Popover.test.tsx +1 -0
  239. package/src/components/Popover/Popover.tsx +267 -0
  240. package/src/components/Popover/USAGE.md +69 -0
  241. package/src/components/Popover/index.ts +1 -0
  242. package/src/components/Radio/RADIO_IMPLEMENTATION_NOTES.md +12 -0
  243. package/src/components/Radio/Radio.module.css +247 -0
  244. package/src/components/Radio/Radio.stories.tsx +93 -0
  245. package/src/components/Radio/Radio.test.tsx +1 -0
  246. package/src/components/Radio/Radio.tsx +223 -0
  247. package/src/components/Radio/RadioGroup.stories.tsx +117 -0
  248. package/src/components/Radio/RadioGroup.tsx +122 -0
  249. package/src/components/Radio/USAGE.md +36 -0
  250. package/src/components/Radio/index.ts +2 -0
  251. package/src/components/ReadOnlyField/ReadOnlyBooleanField.tsx +21 -0
  252. package/src/components/ReadOnlyField/ReadOnlyField.module.css +54 -0
  253. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +163 -0
  254. package/src/components/ReadOnlyField/ReadOnlyField.test.tsx +1 -0
  255. package/src/components/ReadOnlyField/ReadOnlyField.tsx +108 -0
  256. package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
  257. package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
  258. package/src/components/ReadOnlyField/USAGE.md +36 -0
  259. package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
  260. package/src/components/ReadOnlyField/index.ts +2 -0
  261. package/src/components/RecursicaThemeProvider/USAGE.md +60 -0
  262. package/src/components/SegmentedControl/IMPLEMENTATION_NOTES.md +14 -0
  263. package/src/components/SegmentedControl/SegmentedControl.module.css +201 -0
  264. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +106 -0
  265. package/src/components/SegmentedControl/SegmentedControl.test.tsx +1 -0
  266. package/src/components/SegmentedControl/SegmentedControl.tsx +149 -0
  267. package/src/components/SegmentedControl/USAGE.md +49 -0
  268. package/src/components/SegmentedControl/index.ts +1 -0
  269. package/src/components/Slider/IMPLEMENTATION_NOTES.md +55 -0
  270. package/src/components/Slider/Slider.module.css +635 -0
  271. package/src/components/Slider/Slider.stories.tsx +282 -0
  272. package/src/components/Slider/Slider.test.tsx +1 -0
  273. package/src/components/Slider/Slider.tsx +435 -0
  274. package/src/components/Slider/USAGE.md +56 -0
  275. package/src/components/Slider/index.ts +1 -0
  276. package/src/components/Stack/Stack.stories.tsx +108 -0
  277. package/src/components/Stack/Stack.test.tsx +1 -0
  278. package/src/components/Stack/Stack.tsx +43 -0
  279. package/src/components/Stack/USAGE.md +41 -0
  280. package/src/components/Stack/index.ts +1 -0
  281. package/src/components/Stepper/IMPLEMENTATION_NOTES.md +120 -0
  282. package/src/components/Stepper/Stepper.module.css +474 -0
  283. package/src/components/Stepper/Stepper.stories.tsx +157 -0
  284. package/src/components/Stepper/Stepper.test.tsx +1 -0
  285. package/src/components/Stepper/Stepper.tsx +240 -0
  286. package/src/components/Stepper/USAGE.md +45 -0
  287. package/src/components/Stepper/index.ts +1 -0
  288. package/src/components/Switch/SWITCH_IMPLEMENTATION_NOTES.md +147 -0
  289. package/src/components/Switch/Switch.module.css +346 -0
  290. package/src/components/Switch/Switch.stories.tsx +114 -0
  291. package/src/components/Switch/Switch.test.tsx +1 -0
  292. package/src/components/Switch/Switch.tsx +294 -0
  293. package/src/components/Switch/SwitchGroup.stories.tsx +132 -0
  294. package/src/components/Switch/SwitchGroup.tsx +156 -0
  295. package/src/components/Switch/USAGE.md +36 -0
  296. package/src/components/Switch/index.ts +2 -0
  297. package/src/components/Table/TABLE_IMPLEMENTATION_NOTES.md +75 -0
  298. package/src/components/Table/Table.module.css +462 -0
  299. package/src/components/Table/Table.stories.tsx +154 -0
  300. package/src/components/Table/Table.test.tsx +1 -0
  301. package/src/components/Table/Table.tsx +250 -0
  302. package/src/components/Table/USAGE.md +90 -0
  303. package/src/components/Table/index.ts +1 -0
  304. package/src/components/Tabs/IMPLEMENTATION_NOTES.md +76 -0
  305. package/src/components/Tabs/Tabs.module.css +801 -0
  306. package/src/components/Tabs/Tabs.stories.tsx +174 -0
  307. package/src/components/Tabs/Tabs.test.tsx +1 -0
  308. package/src/components/Tabs/Tabs.tsx +103 -0
  309. package/src/components/Tabs/USAGE.md +61 -0
  310. package/src/components/Tabs/index.ts +1 -0
  311. package/src/components/Text/TEXT_IMPLEMENTATION_NOTES.md +10 -0
  312. package/src/components/Text/Text.stories.tsx +75 -0
  313. package/src/components/Text/Text.test.tsx +1 -0
  314. package/src/components/Text/Text.tsx +19 -0
  315. package/src/components/Text/USAGE.md +40 -0
  316. package/src/components/Text/index.ts +1 -0
  317. package/src/components/TextArea/TEXTAREA_IMPLEMENTATION_NOTES.md +42 -0
  318. package/src/components/TextArea/TextArea.module.css +203 -0
  319. package/src/components/TextArea/TextArea.stories.tsx +94 -0
  320. package/src/components/TextArea/TextArea.test.tsx +1 -0
  321. package/src/components/TextArea/TextArea.tsx +162 -0
  322. package/src/components/TextArea/USAGE.md +38 -0
  323. package/src/components/TextArea/index.ts +1 -0
  324. package/src/components/TextField/TextField.module.css +271 -0
  325. package/src/components/TextField/TextField.stories.tsx +162 -0
  326. package/src/components/TextField/TextField.test.tsx +1 -0
  327. package/src/components/TextField/TextField.tsx +182 -0
  328. package/src/components/TextField/USAGE.md +38 -0
  329. package/src/components/TextField/index.ts +1 -0
  330. package/src/components/TimePicker/TIMEPICKER_IMPLEMENTATION_NOTES.md +89 -0
  331. package/src/components/TimePicker/TimePicker.module.css +262 -0
  332. package/src/components/TimePicker/TimePicker.stories.tsx +155 -0
  333. package/src/components/TimePicker/TimePicker.test.tsx +1 -0
  334. package/src/components/TimePicker/TimePicker.tsx +277 -0
  335. package/src/components/TimePicker/USAGE.md +61 -0
  336. package/src/components/TimePicker/index.ts +1 -0
  337. package/src/components/Timeline/IMPLEMENTATION_NOTES.md +42 -0
  338. package/src/components/Timeline/Timeline.module.css +363 -0
  339. package/src/components/Timeline/Timeline.stories.tsx +128 -0
  340. package/src/components/Timeline/Timeline.test.tsx +1 -0
  341. package/src/components/Timeline/Timeline.tsx +90 -0
  342. package/src/components/Timeline/TimelineItem.tsx +95 -0
  343. package/src/components/Timeline/USAGE.md +41 -0
  344. package/src/components/Timeline/index.ts +2 -0
  345. package/src/components/Toast/TOAST_IMPLEMENTATION_NOTES.md +37 -0
  346. package/src/components/Toast/Toast.module.css +193 -0
  347. package/src/components/Toast/Toast.stories.tsx +67 -0
  348. package/src/components/Toast/Toast.test.tsx +1 -0
  349. package/src/components/Toast/Toast.tsx +121 -0
  350. package/src/components/Toast/USAGE.md +42 -0
  351. package/src/components/Toast/index.ts +1 -0
  352. package/src/components/Tooltip/Tooltip.module.css +83 -0
  353. package/src/components/Tooltip/Tooltip.stories.tsx +165 -0
  354. package/src/components/Tooltip/Tooltip.test.tsx +1 -0
  355. package/src/components/Tooltip/Tooltip.tsx +78 -0
  356. package/src/components/Tooltip/USAGE.md +40 -0
  357. package/src/components/Tooltip/index.ts +1 -0
  358. package/src/components/TransferList/TRANSFERLIST_IMPLEMENTATION_NOTES.md +140 -0
  359. package/src/components/TransferList/TransferList.module.css +174 -0
  360. package/src/components/TransferList/TransferList.stories.tsx +121 -0
  361. package/src/components/TransferList/TransferList.test.tsx +1 -0
  362. package/src/components/TransferList/TransferList.tsx +419 -0
  363. package/src/components/TransferList/USAGE.md +77 -0
  364. package/src/components/TransferList/index.ts +1 -0
  365. package/src/components/Tree/IMPLEMENTATION_NOTES.md +53 -0
  366. package/src/components/Tree/Tree.module.css +272 -0
  367. package/src/components/Tree/Tree.stories.tsx +104 -0
  368. package/src/components/Tree/Tree.test.tsx +1 -0
  369. package/src/components/Tree/Tree.tsx +298 -0
  370. package/src/components/Tree/USAGE.md +99 -0
  371. package/src/components/Tree/index.ts +1 -0
  372. package/src/components/Typography/TYPOGRAPHY_IMPLEMENTATION_NOTES.md +17 -0
  373. package/src/components/Typography/Typography.module.css +13 -0
  374. package/src/components/Typography/Typography.test.tsx +1 -0
  375. package/src/components/Typography/Typography.tsx +43 -0
  376. package/src/components/Typography/USAGE.md +40 -0
  377. package/src/components/Typography/index.ts +1 -0
  378. package/src/components/index.ts +50 -0
  379. package/src/env.d.ts +7 -0
  380. package/src/index.ts +194 -0
  381. package/src/types/index.ts +9 -0
  382. package/src/types/scss-modules.d.ts +9 -0
  383. package/src/utils/ColorSchemeWrapper.tsx +23 -0
  384. package/src/utils/RequireAccessibleLabel.ts +1 -0
  385. package/src/utils/copyToClipboard.ts +36 -0
  386. package/src/utils/filterStylingProps.test.ts +85 -0
  387. package/src/utils/filterStylingProps.ts +143 -0
  388. package/src/utils/index.ts +1 -0
  389. package/src/utils/renderRichOption.tsx +51 -0
@@ -0,0 +1,801 @@
1
+ /* Brand-layer exemptions (recursica-allow-brand) — see recursica-token-analyzer README.md.
2
+ * Outline variant's baseline-patch trick needs an opaque paint (active background is transparent by design); borrows Layer 0's surface as the default ambient layer absent a wrapping <Layer> (see IMPLEMENTATION_NOTES.md 'Outline selected-tab border'). Schema gap: no generic 'current ambient layer' token exists — flagged for the token-schema owner.
3
+ * recursica-allow-brand: --recursica_brand_layer_0_properties_surface
4
+ * Global hover/focus/disabled state tokens (recursica_variables_scoped.css header, 'Hover & Focus states' / 'Disabled state' — implicit rule for every interactive element; components must not define their own per-component treatment).
5
+ * recursica-allow-brand: --recursica_brand_states_disabled
6
+ * recursica-allow-brand: --recursica_brand_states_hover_color
7
+ * recursica-allow-brand: --recursica_brand_states_hover_opacity
8
+ */
9
+
10
+ /*
11
+ Recursica Tabs CSS module natively binding to Figma variables.
12
+ */
13
+
14
+ /* Unlike Mantine's .root (which internally wraps List+Panel and always spans its parent),
15
+ MUI's .root is only the tablist — it sits beside the panel in the consumer's own flex row for
16
+ vertical orientation. Stretching it to 100% width there fights the panel for space and drags
17
+ the border-right rail/indicator away from the tab content, so only horizontal gets full width;
18
+ vertical sizes to its content instead, same as Mantine's vertical .list does. */
19
+ .root[data-orientation="horizontal"] {
20
+ width: 100%;
21
+ }
22
+
23
+ /* `inverted` (RecursicaTabsProps): "tabs list at the bottom ... instead of top". USAGE.md
24
+ already requires wrapping `Tabs`+`TabPanel` in a column-direction Flex, since `TabPanel`
25
+ renders as this component's actual flex sibling (not nested inside it, unlike Mantine) — so
26
+ `order` on this root alone reorders them visually with no DOM change needed. `.list`'s
27
+ margin-bottom (tabs-content-gap, see below) collapses through this root's bottom edge in the
28
+ default order; flip it to margin-top so the same gap lands between the (now-preceding) panel
29
+ and this now-trailing root instead. Scoped to horizontal only — vertical's "instead of left"
30
+ flip isn't exercised by any story yet. See IMPLEMENTATION_NOTES.md. */
31
+ .root[data-orientation="horizontal"][data-inverted] {
32
+ order: 1;
33
+ }
34
+ .root[data-orientation="horizontal"][data-inverted] .list {
35
+ margin-bottom: 0;
36
+ margin-top: var(--tabs-content-gap);
37
+ }
38
+
39
+ /* Mantine's vertical .list stretches to the root's full height via flex align-items, so a
40
+ border-right divider on it spans the whole rail. MUI's scroller (the .list's parent) is a plain
41
+ block for vertical, not a flex container, so .list sizes to its own content (just the stacked
42
+ tabs) and a divider on it stops short at the last tab instead of running the full height —
43
+ spell the stretch out explicitly instead. */
44
+ .root[data-orientation="vertical"] .list {
45
+ height: 100%;
46
+ }
47
+
48
+ /* Vertical `inverted`: "instead of left" — the list moves to the right, panel to the left.
49
+ Mirrors the horizontal[data-inverted] flip above, rotated 90°: `order: 1` pushes the list after
50
+ the panel in the consumer's row Flex, and the content-gap margin flips from the trailing edge
51
+ (margin-right, spacing the panel that used to follow) to the leading edge (margin-left, spacing
52
+ the panel that now precedes it). Divider/indicator side-flip lives in SELECTION INDICATOR &
53
+ BASELINE and BORDER RADIUS GEOMETRY below (only default/outline draw a divider; pills has
54
+ neither). */
55
+ .root[data-orientation="vertical"][data-inverted] {
56
+ order: 1;
57
+ }
58
+ .root[data-orientation="vertical"][data-inverted] .list {
59
+ margin-right: 0;
60
+ margin-left: var(--tabs-content-gap);
61
+ }
62
+
63
+ /*
64
+ Mantine Tabs Anatomy:
65
+ .root
66
+ .list (container for tabs)
67
+ .tab (individual tab)
68
+ .panel (content)
69
+ */
70
+
71
+ /* ---------------------------------
72
+ VARIANTS
73
+ Sizing, geometry, colors, and typography are all scoped per style (default/outline/pills) in
74
+ the token schema now — nothing is shared flat across variants anymore. Content-alignment,
75
+ space-between-tabs, and the tabs-content-gap remain additionally scoped per orientation.
76
+ --------------------------------- */
77
+
78
+ .root[data-variant="default"][data-orientation] {
79
+ --tabs-element-gap: var(
80
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_element-gap
81
+ );
82
+ --tabs-horizontal-padding: var(
83
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_horizontal-padding
84
+ );
85
+ --tabs-vertical-padding: var(
86
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_vertical-padding
87
+ );
88
+ --tabs-icon-size: var(
89
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_icon-size
90
+ );
91
+ --tabs-min-width: var(
92
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_min-width
93
+ );
94
+ --tabs-max-width: var(
95
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_max-width
96
+ );
97
+
98
+ --tabs-active-border-size: var(
99
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_border-size
100
+ ) !important;
101
+ --tabs-inactive-border-size: var(
102
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_border-size
103
+ ) !important;
104
+ --tabs-border-radius: var(
105
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_properties_border-radius
106
+ ) !important;
107
+ --tabs-border-color: var(
108
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_colors_border-color
109
+ ) !important;
110
+ --tabs-color: var(
111
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_colors_border-color
112
+ ) !important;
113
+ }
114
+
115
+ .root[data-variant="default"][data-orientation="horizontal"] {
116
+ --tabs-content-alignment: var(
117
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_orientation_horizontal_properties_tab-content-alignment
118
+ );
119
+ --tabs-space-between-tabs: var(
120
+ --recursica_ui-kit_components_tabs_variants_styles_default_variants_orientation_horizontal_properties_space-between-tabs
121
+ );
122
+ --tabs-content-gap: var(
123
+ --recursica_ui-kit_components_tabs_variants_styles_default_variants_orientation_horizontal_properties_tabs-content-gap
124
+ );
125
+ }
126
+ .root[data-variant="default"][data-orientation="horizontal"] .list {
127
+ gap: var(--tabs-space-between-tabs);
128
+ width: 100%;
129
+ margin-bottom: var(--tabs-content-gap);
130
+ }
131
+
132
+ .root[data-variant="default"][data-orientation="vertical"] {
133
+ --tabs-content-alignment: var(
134
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_orientation_vertical_properties_tab-content-alignment
135
+ );
136
+ --tabs-space-between-tabs: var(
137
+ --recursica_ui-kit_components_tabs_variants_styles_default_variants_orientation_vertical_properties_space-between-tabs
138
+ );
139
+ --tabs-content-gap: var(
140
+ --recursica_ui-kit_components_tabs_variants_styles_default_variants_orientation_vertical_properties_tabs-content-gap
141
+ );
142
+ }
143
+ .root[data-variant="default"][data-orientation="vertical"] .list {
144
+ gap: var(--tabs-space-between-tabs);
145
+ margin-right: var(--tabs-content-gap);
146
+ }
147
+
148
+ /* Outline Variant */
149
+ .root[data-variant="outline"][data-orientation] {
150
+ --tabs-element-gap: var(
151
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_element-gap
152
+ );
153
+ --tabs-horizontal-padding: var(
154
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_horizontal-padding
155
+ );
156
+ --tabs-vertical-padding: var(
157
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_vertical-padding
158
+ );
159
+ --tabs-icon-size: var(
160
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_icon-size
161
+ );
162
+ --tabs-min-width: var(
163
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_min-width
164
+ );
165
+ --tabs-max-width: var(
166
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_max-width
167
+ );
168
+
169
+ --tabs-active-border-size: var(
170
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_border-size
171
+ ) !important;
172
+ --tabs-inactive-border-size: var(
173
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_border-size
174
+ ) !important;
175
+ --tabs-border-radius: var(
176
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_properties_border-radius
177
+ ) !important;
178
+ --tabs-border-color: var(
179
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_colors_border-color
180
+ ) !important;
181
+ --tabs-color: var(
182
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_colors_border-color
183
+ ) !important;
184
+ --tabs-active-bg: var(
185
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_colors_background-color
186
+ );
187
+ /* The active tab's own background-color token above is transparent by design (it's meant to
188
+ let whichever ambient Layer surface sits behind the Tabs show through). That means it can't
189
+ double as an opaque "eraser" for the baseline-patch trick below, which needs a real paint to
190
+ replace, not reveal-through. Layer 0 is the default/outermost surface a Tabs instance sits
191
+ on absent a wrapping <Layer>; see OUTLINE SELECTION BORDER below for why this is needed. */
192
+ --tabs-baseline-patch-bg: var(--recursica_brand_layer_0_properties_surface);
193
+ }
194
+
195
+ .root[data-variant="outline"][data-orientation="horizontal"] {
196
+ --tabs-content-alignment: var(
197
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_orientation_horizontal_properties_tab-content-alignment
198
+ );
199
+ --tabs-space-between-tabs: var(
200
+ --recursica_ui-kit_components_tabs_variants_styles_outline_variants_orientation_horizontal_properties_space-between-tabs
201
+ );
202
+ --tabs-content-gap: var(
203
+ --recursica_ui-kit_components_tabs_variants_styles_outline_variants_orientation_horizontal_properties_tabs-content-gap
204
+ );
205
+ }
206
+ .root[data-variant="outline"][data-orientation="horizontal"] .list {
207
+ gap: var(--tabs-space-between-tabs);
208
+ width: 100%;
209
+ margin-bottom: var(--tabs-content-gap);
210
+ }
211
+
212
+ .root[data-variant="outline"][data-orientation="vertical"] {
213
+ --tabs-content-alignment: var(
214
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_orientation_vertical_properties_tab-content-alignment
215
+ );
216
+ --tabs-space-between-tabs: var(
217
+ --recursica_ui-kit_components_tabs_variants_styles_outline_variants_orientation_vertical_properties_space-between-tabs
218
+ );
219
+ --tabs-content-gap: var(
220
+ --recursica_ui-kit_components_tabs_variants_styles_outline_variants_orientation_vertical_properties_tabs-content-gap
221
+ );
222
+ }
223
+ .root[data-variant="outline"][data-orientation="vertical"] .list {
224
+ gap: var(--tabs-space-between-tabs);
225
+ margin-right: var(--tabs-content-gap);
226
+ }
227
+
228
+ /* Pills Variant */
229
+ .root[data-variant="pills"][data-orientation] {
230
+ --tabs-element-gap: var(
231
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_element-gap
232
+ );
233
+ --tabs-horizontal-padding: var(
234
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_horizontal-padding
235
+ );
236
+ --tabs-vertical-padding: var(
237
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_vertical-padding
238
+ );
239
+ --tabs-icon-size: var(
240
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_icon-size
241
+ );
242
+ --tabs-min-width: var(
243
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_min-width
244
+ );
245
+ --tabs-max-width: var(
246
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_max-width
247
+ );
248
+
249
+ --tabs-active-border-size: var(
250
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_border-size
251
+ );
252
+ --tabs-inactive-border-size: var(
253
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_border-size
254
+ );
255
+ --tabs-border-radius: var(
256
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_properties_border-radius
257
+ );
258
+ }
259
+
260
+ .root[data-variant="pills"][data-orientation="horizontal"] {
261
+ --tabs-content-alignment: var(
262
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_orientation_horizontal_properties_tab-content-alignment
263
+ );
264
+ --tabs-space-between-tabs: var(
265
+ --recursica_ui-kit_components_tabs_variants_styles_pills_variants_orientation_horizontal_properties_space-between-tabs
266
+ );
267
+ --tabs-content-gap: var(
268
+ --recursica_ui-kit_components_tabs_variants_styles_pills_variants_orientation_horizontal_properties_tabs-content-gap
269
+ );
270
+ }
271
+ .root[data-variant="pills"][data-orientation="horizontal"] .list {
272
+ gap: var(--tabs-space-between-tabs);
273
+ width: 100%;
274
+ margin-bottom: var(--tabs-content-gap);
275
+ }
276
+
277
+ .root[data-variant="pills"][data-orientation="vertical"] {
278
+ --tabs-content-alignment: var(
279
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_orientation_vertical_properties_tab-content-alignment
280
+ );
281
+ --tabs-space-between-tabs: var(
282
+ --recursica_ui-kit_components_tabs_variants_styles_pills_variants_orientation_vertical_properties_space-between-tabs
283
+ );
284
+ --tabs-content-gap: var(
285
+ --recursica_ui-kit_components_tabs_variants_styles_pills_variants_orientation_vertical_properties_tabs-content-gap
286
+ );
287
+ }
288
+ .root[data-variant="pills"][data-orientation="vertical"] .list {
289
+ gap: var(--tabs-space-between-tabs);
290
+ margin-right: var(--tabs-content-gap);
291
+ }
292
+
293
+ /* ---------------------------------
294
+ SELECTION INDICATOR & BASELINE
295
+ Mantine draws the active-tab underline natively off the shared --tabs-color var above. MUI has
296
+ no equivalent built-in, so we drive its own indicator slot (classes.indicator, wired in
297
+ Tabs.tsx) and the list's baseline border explicitly from the same vars. Pills has no underline
298
+ indicator — selection shows via the pill's own background/border (see COLORS & TYPOGRAPHY
299
+ below). Outline repurposes the indicator as a baseline patch rather than an underline (see
300
+ below).
301
+ --------------------------------- */
302
+ .root[data-variant="default"] .indicator {
303
+ background-color: var(--tabs-color) !important;
304
+ }
305
+ .root[data-variant="default"][data-orientation="horizontal"] .indicator {
306
+ height: var(--tabs-active-border-size) !important;
307
+ }
308
+ /* MUI's Tabs root has no border/padding of its own, so the list's margin-bottom (the
309
+ tabs-content-gap, used to space the panel below) collapses into the root's auto height instead
310
+ of stopping at the list's own border edge. The indicator is absolutely positioned against that
311
+ inflated root box, so without this offset it renders content-gap pixels below the baseline
312
+ instead of flush against it. */
313
+ .root[data-variant="default"][data-orientation="horizontal"]:not(
314
+ [data-inverted]
315
+ )
316
+ .indicator {
317
+ bottom: var(
318
+ --recursica_ui-kit_components_tabs_variants_styles_default_variants_orientation_horizontal_properties_tabs-content-gap
319
+ ) !important;
320
+ }
321
+ /* width: same reasoning as the horizontal height above, rotated 90°.
322
+ right: same reasoning as the horizontal bottom offset above, rotated 90° — the list's
323
+ margin-right (this orientation's tabs-content-gap, spacing the panel to its right) inflates the
324
+ root's auto width past the list's own border-right edge. The indicator is absolutely positioned
325
+ against that wider box, so without this offset it renders content-gap pixels to the right of the
326
+ divider instead of flush against it. */
327
+ .root[data-variant="default"][data-orientation="vertical"] .indicator {
328
+ width: var(--tabs-active-border-size) !important;
329
+ right: var(--tabs-content-gap) !important;
330
+ }
331
+ .root[data-variant="default"][data-orientation="horizontal"][data-inverted]
332
+ .indicator {
333
+ bottom: auto !important;
334
+ top: 0 !important;
335
+ }
336
+ /* Vertical inverted mirror of the above: the list's content-gap margin moved from right to left
337
+ (see .root[data-orientation="vertical"][data-inverted] .list above), so the indicator's offset
338
+ has to track the same edge. */
339
+ .root[data-variant="default"][data-orientation="vertical"][data-inverted]
340
+ .indicator {
341
+ right: auto !important;
342
+ left: var(--tabs-content-gap) !important;
343
+ }
344
+ .root[data-variant="pills"] .indicator {
345
+ display: none !important;
346
+ }
347
+
348
+ /* Outline has no sliding underline of its own, but reuses the indicator element (already
349
+ positioned/sized by MUI to exactly track the selected tab, no matter which one) as a baseline
350
+ patch instead of hiding it — see OUTLINE SELECTION BORDER below for why a patch is needed at
351
+ all, and why it has to live here (in the scroller) rather than on the tab itself. */
352
+ .root[data-variant="outline"] .indicator {
353
+ background-color: var(--tabs-baseline-patch-bg) !important;
354
+ }
355
+ .root[data-variant="outline"][data-orientation="horizontal"]:not(
356
+ [data-inverted]
357
+ )
358
+ .indicator {
359
+ height: var(--tabs-inactive-border-size) !important;
360
+ bottom: var(
361
+ --recursica_ui-kit_components_tabs_variants_styles_outline_variants_orientation_horizontal_properties_tabs-content-gap
362
+ ) !important;
363
+ }
364
+ .root[data-variant="outline"][data-orientation="horizontal"][data-inverted]
365
+ .indicator {
366
+ height: var(--tabs-inactive-border-size) !important;
367
+ bottom: auto !important;
368
+ top: calc(-1 * var(--tabs-inactive-border-size)) !important;
369
+ }
370
+ .root[data-variant="outline"][data-orientation="vertical"] .indicator {
371
+ width: var(--tabs-inactive-border-size) !important;
372
+ right: calc(-1 * var(--tabs-inactive-border-size)) !important;
373
+ }
374
+ .root[data-variant="outline"][data-orientation="vertical"][data-inverted]
375
+ .indicator {
376
+ right: auto !important;
377
+ left: calc(-1 * var(--tabs-inactive-border-size)) !important;
378
+ }
379
+
380
+ .root[data-variant="default"][data-orientation="horizontal"] .list,
381
+ .root[data-variant="outline"][data-orientation="horizontal"] .list {
382
+ border-bottom: var(--tabs-inactive-border-size) solid var(--tabs-border-color);
383
+ }
384
+ .root[data-variant="default"][data-orientation="horizontal"][data-inverted]
385
+ .list,
386
+ .root[data-variant="outline"][data-orientation="horizontal"][data-inverted]
387
+ .list {
388
+ border-bottom: none;
389
+ border-top: var(--tabs-inactive-border-size) solid var(--tabs-border-color);
390
+ }
391
+ .root[data-variant="default"][data-orientation="vertical"] .list,
392
+ .root[data-variant="outline"][data-orientation="vertical"] .list {
393
+ border-right: var(--tabs-inactive-border-size) solid var(--tabs-border-color);
394
+ }
395
+ .root[data-variant="default"][data-orientation="vertical"][data-inverted] .list,
396
+ .root[data-variant="outline"][data-orientation="vertical"][data-inverted]
397
+ .list {
398
+ border-right: none;
399
+ border-left: var(--tabs-inactive-border-size) solid var(--tabs-border-color);
400
+ }
401
+
402
+ /* ---------------------------------
403
+ TAB ELEMENT
404
+ --------------------------------- */
405
+ .root .tab {
406
+ /* MUI defaults icon+label tabs to a 72px min-height; Mantine's tab height is purely
407
+ content/padding-driven (auto), so without this reset MUI's row is visibly taller. */
408
+ min-height: auto !important;
409
+ min-width: var(--tabs-min-width);
410
+ max-width: var(--tabs-max-width);
411
+ padding: var(--tabs-vertical-padding) var(--tabs-horizontal-padding);
412
+ gap: var(--tabs-element-gap);
413
+ display: flex;
414
+ align-items: center;
415
+ justify-content: var(--tabs-content-alignment);
416
+ cursor: pointer;
417
+ position: relative;
418
+ }
419
+
420
+ /* Hover effect (moved to bottom for specificity, see end of file) */
421
+
422
+ /* Icon support */
423
+ .root .tab svg {
424
+ width: var(--tabs-icon-size);
425
+ height: var(--tabs-icon-size);
426
+ }
427
+
428
+ /* Disabled State */
429
+ .root .tab[data-disabled] {
430
+ opacity: var(--recursica_brand_states_disabled);
431
+ cursor: not-allowed;
432
+ }
433
+
434
+ /* ---------------------------------
435
+ BORDER RADIUS GEOMETRY
436
+ --------------------------------- */
437
+
438
+ /* Pills get full radius on all sides */
439
+ .root[data-variant="pills"] .tab {
440
+ border-radius: var(--tabs-border-radius);
441
+ }
442
+
443
+ /* Default & Outline Horizontal get top radius only so they sit flush on the panel */
444
+ .root[data-variant="default"][data-orientation="horizontal"]:not(
445
+ [data-inverted]
446
+ )
447
+ .tab,
448
+ .root[data-variant="outline"][data-orientation="horizontal"]:not(
449
+ [data-inverted]
450
+ )
451
+ .tab {
452
+ border-radius: var(--tabs-border-radius) var(--tabs-border-radius) 0 0;
453
+ }
454
+
455
+ /* Inverted horizontal tabs hang downwards, so bottom corners are rounded */
456
+ .root[data-variant="default"][data-orientation="horizontal"][data-inverted]
457
+ .tab,
458
+ .root[data-variant="outline"][data-orientation="horizontal"][data-inverted]
459
+ .tab {
460
+ border-radius: 0 0 var(--tabs-border-radius) var(--tabs-border-radius);
461
+ }
462
+
463
+ /* Default & Outline Vertical get left radius only so they sit flush against the right-side panel */
464
+ .root[data-variant="default"][data-orientation="vertical"]:not([data-inverted])
465
+ .tab,
466
+ .root[data-variant="outline"][data-orientation="vertical"]:not([data-inverted])
467
+ .tab {
468
+ border-radius: var(--tabs-border-radius) 0 0 var(--tabs-border-radius);
469
+ }
470
+
471
+ /* Inverted vertical tabs sit to the right of the panel, so the flush edge — and the rounded
472
+ corners — flip to the right side. */
473
+ .root[data-variant="default"][data-orientation="vertical"][data-inverted] .tab,
474
+ .root[data-variant="outline"][data-orientation="vertical"][data-inverted] .tab {
475
+ border-radius: 0 var(--tabs-border-radius) var(--tabs-border-radius) 0;
476
+ }
477
+
478
+ /* ---------------------------------
479
+ OUTLINE SELECTION BORDER
480
+ Mantine's outline tab marks selection with a bordered box left open on the edge that touches
481
+ the list's own baseline, so the box visually connects to it instead of floating above it.
482
+ Every tab keeps the border geometry (transparent by default) so selecting a tab doesn't shift
483
+ layout; only the color changes on selection. The open edge here has 0 border-width, which
484
+ leaves the list's own baseline border showing straight through underneath — see the indicator
485
+ patch in SELECTION INDICATOR & BASELINE above, which covers just that segment. (A pseudo-element
486
+ on the tab itself can't do this: MUI clips tab content to its own bounds for ripple containment,
487
+ so anything extending past the tab's box to reach the list's border gets clipped away.)
488
+ --------------------------------- */
489
+ .root[data-variant="outline"] .tab {
490
+ border-style: solid;
491
+ border-color: transparent;
492
+ }
493
+ .root[data-variant="outline"][data-orientation="horizontal"]:not(
494
+ [data-inverted]
495
+ )
496
+ .tab {
497
+ border-width: var(--tabs-inactive-border-size)
498
+ var(--tabs-inactive-border-size) 0 var(--tabs-inactive-border-size);
499
+ }
500
+ .root[data-variant="outline"][data-orientation="horizontal"][data-inverted]
501
+ .tab {
502
+ border-width: 0 var(--tabs-inactive-border-size)
503
+ var(--tabs-inactive-border-size) var(--tabs-inactive-border-size);
504
+ }
505
+ .root[data-variant="outline"][data-orientation="vertical"] .tab {
506
+ border-width: var(--tabs-inactive-border-size) 0
507
+ var(--tabs-inactive-border-size) var(--tabs-inactive-border-size);
508
+ }
509
+ .root[data-variant="outline"][data-orientation="vertical"][data-inverted] .tab {
510
+ border-width: var(--tabs-inactive-border-size)
511
+ var(--tabs-inactive-border-size) var(--tabs-inactive-border-size) 0;
512
+ }
513
+ .root[data-variant="outline"] .tab:global(.Mui-selected) {
514
+ border-color: var(--tabs-color) !important;
515
+ }
516
+
517
+ /* ---------------------------------
518
+ COLORS & TYPOGRAPHY
519
+ Because colors are defined per-layer and theme via generic variable structures,
520
+ we rely on Mantine injecting the correct data-variant attributes, but we must
521
+ map the colors in our CSS. Recursica handles dark/light automatically via root.
522
+ Typography is now scoped per style (not shared flat across variants), so each
523
+ variant repeats its own inactive/active text rules.
524
+ --------------------------------- */
525
+
526
+ /* Default Variant Colors & Typography */
527
+ .root[data-variant="default"] .tab {
528
+ background-color: var(
529
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_colors_background-color
530
+ );
531
+ color: var(
532
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_colors_text-color
533
+ );
534
+
535
+ font-family: var(
536
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_font-family
537
+ );
538
+ font-size: var(
539
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_font-size
540
+ );
541
+ font-style: var(
542
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_font-style
543
+ );
544
+ font-weight: var(
545
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_font-weight
546
+ );
547
+ letter-spacing: var(
548
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_letter-spacing
549
+ );
550
+ line-height: var(
551
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_line-height
552
+ );
553
+ text-decoration: var(
554
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_text-decoration
555
+ );
556
+ text-transform: var(
557
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_text_text-transform
558
+ );
559
+ }
560
+ .root[data-variant="default"] .tab svg {
561
+ color: var(
562
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_inactive_properties_colors_icon-color
563
+ );
564
+ }
565
+
566
+ .root[data-variant="default"] .tab:global(.Mui-selected) {
567
+ background-color: var(
568
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_colors_background-color
569
+ ) !important;
570
+ color: var(
571
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_colors_text-color
572
+ ) !important;
573
+
574
+ font-family: var(
575
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_font-family
576
+ ) !important;
577
+ font-size: var(
578
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_font-size
579
+ ) !important;
580
+ font-style: var(
581
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_font-style
582
+ ) !important;
583
+ font-weight: var(
584
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_font-weight
585
+ ) !important;
586
+ letter-spacing: var(
587
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_letter-spacing
588
+ ) !important;
589
+ line-height: var(
590
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_line-height
591
+ ) !important;
592
+ text-decoration: var(
593
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_text-decoration
594
+ ) !important;
595
+ text-transform: var(
596
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_text_text-transform
597
+ ) !important;
598
+ }
599
+ .root[data-variant="default"] .tab:global(.Mui-selected) svg {
600
+ color: var(
601
+ --recursica_ui-kit_components_tabs-item_variants_styles_default_variants_selection-states_active_properties_colors_icon-color
602
+ ) !important;
603
+ }
604
+
605
+ /* Outline Variant Colors & Typography */
606
+ .root[data-variant="outline"] .tab {
607
+ background-color: var(
608
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_colors_background-color
609
+ );
610
+ color: var(
611
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_colors_text-color
612
+ );
613
+
614
+ font-family: var(
615
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_font-family
616
+ );
617
+ font-size: var(
618
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_font-size
619
+ );
620
+ font-style: var(
621
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_font-style
622
+ );
623
+ font-weight: var(
624
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_font-weight
625
+ );
626
+ letter-spacing: var(
627
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_letter-spacing
628
+ );
629
+ line-height: var(
630
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_line-height
631
+ );
632
+ text-decoration: var(
633
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_text-decoration
634
+ );
635
+ text-transform: var(
636
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_text_text-transform
637
+ );
638
+ }
639
+ .root[data-variant="outline"] .tab svg {
640
+ color: var(
641
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_inactive_properties_colors_icon-color
642
+ );
643
+ }
644
+
645
+ .root[data-variant="outline"] .tab:global(.Mui-selected) {
646
+ background-color: var(--tabs-active-bg) !important;
647
+ color: var(
648
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_colors_text-color
649
+ ) !important;
650
+
651
+ font-family: var(
652
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_font-family
653
+ ) !important;
654
+ font-size: var(
655
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_font-size
656
+ ) !important;
657
+ font-style: var(
658
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_font-style
659
+ ) !important;
660
+ font-weight: var(
661
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_font-weight
662
+ ) !important;
663
+ letter-spacing: var(
664
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_letter-spacing
665
+ ) !important;
666
+ line-height: var(
667
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_line-height
668
+ ) !important;
669
+ text-decoration: var(
670
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_text-decoration
671
+ ) !important;
672
+ text-transform: var(
673
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_text_text-transform
674
+ ) !important;
675
+ }
676
+ .root[data-variant="outline"] .tab:global(.Mui-selected) svg {
677
+ color: var(
678
+ --recursica_ui-kit_components_tabs-item_variants_styles_outline_variants_selection-states_active_properties_colors_icon-color
679
+ ) !important;
680
+ }
681
+
682
+ /* Pills Variant Colors & Typography */
683
+ .root[data-variant="pills"] .tab {
684
+ background-color: var(
685
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_colors_background-color
686
+ );
687
+ color: var(
688
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_colors_text-color
689
+ );
690
+ border: var(--tabs-inactive-border-size) solid
691
+ var(
692
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_colors_border-color
693
+ );
694
+
695
+ font-family: var(
696
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_font-family
697
+ );
698
+ font-size: var(
699
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_font-size
700
+ );
701
+ font-style: var(
702
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_font-style
703
+ );
704
+ font-weight: var(
705
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_font-weight
706
+ );
707
+ letter-spacing: var(
708
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_letter-spacing
709
+ );
710
+ line-height: var(
711
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_line-height
712
+ );
713
+ text-decoration: var(
714
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_text-decoration
715
+ );
716
+ text-transform: var(
717
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_text_text-transform
718
+ );
719
+ }
720
+ .root[data-variant="pills"] .tab svg {
721
+ color: var(
722
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_inactive_properties_colors_icon-color
723
+ );
724
+ }
725
+
726
+ .root[data-variant="pills"] .tab:global(.Mui-selected) {
727
+ background-color: var(
728
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_colors_background-color
729
+ ) !important;
730
+ color: var(
731
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_colors_text-color
732
+ ) !important;
733
+ border: var(--tabs-active-border-size) solid
734
+ var(
735
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_colors_border-color
736
+ ) !important;
737
+
738
+ font-family: var(
739
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_font-family
740
+ ) !important;
741
+ font-size: var(
742
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_font-size
743
+ ) !important;
744
+ font-style: var(
745
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_font-style
746
+ ) !important;
747
+ font-weight: var(
748
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_font-weight
749
+ ) !important;
750
+ letter-spacing: var(
751
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_letter-spacing
752
+ ) !important;
753
+ line-height: var(
754
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_line-height
755
+ ) !important;
756
+ text-decoration: var(
757
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_text-decoration
758
+ ) !important;
759
+ text-transform: var(
760
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_text_text-transform
761
+ ) !important;
762
+ }
763
+ .root[data-variant="pills"] .tab:global(.Mui-selected) svg {
764
+ color: var(
765
+ --recursica_ui-kit_components_tabs-item_variants_styles_pills_variants_selection-states_active_properties_colors_icon-color
766
+ ) !important;
767
+ }
768
+
769
+ /* Content panel
770
+ Note: unlike .list (MUI's internal flexContainer, a true descendant of .root), TabPanel
771
+ renders as a DOM sibling of <Tabs>, not nested inside it — `.root .panel` would never match.
772
+ Scope directly off the CSS-module-scoped class name instead. */
773
+ .panel {
774
+ /* Recursica doesn't define panel colors intrinsically, leaves it to child content */
775
+ /* MUI's TabPanel defaults to theme.spacing(3) padding; Mantine's Tabs.Panel has none, and
776
+ the tab-to-content gap is already carried by the list's own margin (tabs-content-gap) */
777
+ padding: 0 !important;
778
+ }
779
+
780
+ /* Hover state uses a pseudo-element to apply opacity to the background without fading the text.
781
+ No per-variant hover-color/hover-opacity tokens exist anymore; use the generic overlay tokens
782
+ shared across components instead. */
783
+ .root[data-variant] .tab:not(:global(.Mui-selected)):hover::before {
784
+ content: "";
785
+ position: absolute;
786
+ inset: 0;
787
+ border-radius: inherit;
788
+ background-color: var(--recursica_brand_states_hover_color);
789
+ opacity: var(--recursica_brand_states_hover_opacity);
790
+ pointer-events: none;
791
+ z-index: 0;
792
+ }
793
+
794
+ /* Ensure tab content sits above the hover background. Excludes MuiTouchRipple-root: it relies on
795
+ its native position:absolute to stay out of flow, and forcing it to position:relative here
796
+ turns it into a real flex item — inserting an extra element-gap into the tab's flex row (and
797
+ growing the tab's width) the first time it's clicked, permanently shifting later siblings. */
798
+ .root .tab > *:not(:global(.MuiTouchRipple-root)) {
799
+ z-index: 1;
800
+ position: relative;
801
+ }