@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,68 @@
1
+ # Autocomplete - Usage Guide
2
+
3
+ This document describes how to integrate and use the `Autocomplete` component in your projects using `@recursica/adapter-mui-v7`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { Autocomplete } from "@recursica/adapter-mui-v7";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { Autocomplete } from "@recursica/adapter-mui-v7";
20
+
21
+ export default function Demo() {
22
+ return (
23
+ <Autocomplete
24
+ label="Country"
25
+ placeholder="Type a country name..."
26
+ data={["USA", "Canada", "Mexico"]}
27
+ />
28
+ );
29
+ }
30
+ ```
31
+
32
+ ---
33
+
34
+ ## 3. Design System Integration
35
+
36
+ All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
37
+
38
+ > [!IMPORTANT]
39
+ >
40
+ > - **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.
41
+ > - **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.
42
+ > - **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.
43
+
44
+ ---
45
+
46
+ ## 4. Rich option content: `leadingIcon` / `supportingText`
47
+
48
+ `data` items can carry an icon and a secondary line of text, rendered inside each option row:
49
+
50
+ ```tsx
51
+ <Autocomplete
52
+ label="Assignee"
53
+ data={[
54
+ {
55
+ value: "jdoe",
56
+ label: "Jane Doe",
57
+ leadingIcon: <UserIcon />,
58
+ supportingText: "jane.doe@example.com",
59
+ },
60
+ { value: "asmith", label: "Alex Smith" },
61
+ ]}
62
+ />
63
+ ```
64
+
65
+ Pass your own `renderOption` to opt out of this default rendering for a given instance.
66
+
67
+ By default `label`/`supportingText` truncate to a single line with an ellipsis. Set
68
+ `wrapItemText` to wrap them onto additional lines instead: `<Autocomplete data={data} wrapItemText />`.
@@ -0,0 +1 @@
1
+ export * from "./AutoComplete";
@@ -0,0 +1,36 @@
1
+ # Avatar Component Implementation Notes
2
+
3
+ ## Architecture Decisions
4
+
5
+ The `Avatar` component is an adapter over MUI's `Avatar`.
6
+
7
+ - We do not wrap `MuiAvatar` in any custom standard `div` elements, preserving DOM structure.
8
+ - All styles strictly pull from explicit `--recursica_ui-kit_components_avatar_*` CSS tokens.
9
+
10
+ ## `data-style`/`data-variant`, not MUI's own classes
11
+
12
+ Same reasoning as the Mantine adapter: `data-style="image|icon|text"` is set based on which of
13
+ `src`/`icon`/`children` is present, and `data-variant` carries Recursica's own `variant` value
14
+ (`"solid"|"outline"|"ghost"`) — `Avatar.module.css` keys every visual treatment (background,
15
+ border, border-radius) off these two attributes, not off anything MUI's own classes do.
16
+
17
+ ## `variant` — a name collision with a different meaning, not a shared concept
18
+
19
+ **Found while auditing this component (not in Forge's original report):** MUI's native
20
+ `Avatar.variant` means **shape** (`'circular'|'rounded'|'square'`) — unlike almost every other
21
+ MUI component (including Mantine's `Avatar.variant`, which really is the same color-treatment
22
+ concept Recursica's `variant` is), MUI repurposes this name for something else entirely.
23
+
24
+ The previous implementation mapped Recursica's `variant` (`solid|outline|ghost`) to strings
25
+ (`"filled"|"outline"|"transparent"`) and fed them into MUI's native `variant` prop via an
26
+ `as unknown as MuiAvatarProps["variant"]` cast — none of those strings are valid MUI shape
27
+ values, so it was silently a no-op on MUI's own shape class (visually masked only because
28
+ `Avatar.module.css` already forces border-radius per `data-style` unconditionally, regardless
29
+ of what shape class MUI resolves to).
30
+
31
+ **Fix:** stopped feeding Recursica's `variant` into MUI's native `variant` prop at all.
32
+ `<MuiAvatar>` is now given an explicit, real, valid `variant="circular"` — Recursica has no
33
+ shape concept of its own to expose here, and avatars are always circular by design, so this is
34
+ just being explicit about that instead of relying on MUI's own default. `Omit<MuiAvatarProps,
35
+ "variant">` in the type prevents a caller from reaching MUI's real shape prop under Recursica's
36
+ `variant` name and getting confused about what it does.
@@ -0,0 +1,336 @@
1
+ /*
2
+ HARDCODED VALUES:
3
+ - justify-content, align-items, display: Center content for custom internal spans
4
+ - Mantine overrides (--avatar-bd, --avatar-bg, --avatar-color): Remove default static themes
5
+ - Default object-fit for image
6
+ - Transitions and standard flex layouts
7
+ - Image has no explicit size tokens other than root size, assume it scales 100%
8
+ */
9
+
10
+ .root {
11
+ box-sizing: border-box;
12
+ margin: 0;
13
+ border-style: solid;
14
+ overflow: hidden;
15
+ position: relative;
16
+ transition: all 0.2s ease;
17
+ box-shadow: var(--recursica_ui-kit_components_avatar_properties_elevation);
18
+
19
+ /* HARDCODE: Remove internal Mantine custom props that interfere */
20
+ --avatar-bd: none;
21
+ --avatar-bg: transparent;
22
+ --avatar-color: inherit;
23
+ }
24
+
25
+ /* ==== SIZES ==== */
26
+ .root[data-size="small"] {
27
+ width: var(
28
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_width
29
+ );
30
+ height: var(
31
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_height
32
+ );
33
+ border-width: var(
34
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_border-size
35
+ );
36
+ }
37
+
38
+ .root[data-size="small"] .iconWrapper {
39
+ width: var(
40
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_icon-size
41
+ );
42
+ height: var(
43
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_icon-size
44
+ );
45
+ }
46
+
47
+ .root[data-size="small"] .textWrapper {
48
+ font-family: var(
49
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-family
50
+ );
51
+ font-size: var(
52
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-size
53
+ );
54
+ font-style: var(
55
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-style
56
+ );
57
+ font-weight: var(
58
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_font-weight
59
+ );
60
+ letter-spacing: var(
61
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_letter-spacing
62
+ );
63
+ line-height: var(
64
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_line-height
65
+ );
66
+ text-decoration: var(
67
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_text-decoration
68
+ );
69
+ text-transform: var(
70
+ --recursica_ui-kit_components_avatar_variants_sizes_small_properties_text_text-transform
71
+ );
72
+ }
73
+
74
+ .root[data-size="default"] {
75
+ width: var(
76
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_width
77
+ );
78
+ height: var(
79
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_height
80
+ );
81
+ border-width: var(
82
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_border-size
83
+ );
84
+ }
85
+
86
+ .root[data-size="default"] .iconWrapper {
87
+ width: var(
88
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_icon-size
89
+ );
90
+ height: var(
91
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_icon-size
92
+ );
93
+ }
94
+
95
+ .root[data-size="default"] .textWrapper {
96
+ font-family: var(
97
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-family
98
+ );
99
+ font-size: var(
100
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-size
101
+ );
102
+ font-style: var(
103
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-style
104
+ );
105
+ font-weight: var(
106
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_font-weight
107
+ );
108
+ letter-spacing: var(
109
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_letter-spacing
110
+ );
111
+ line-height: var(
112
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_line-height
113
+ );
114
+ text-decoration: var(
115
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_text-decoration
116
+ );
117
+ text-transform: var(
118
+ --recursica_ui-kit_components_avatar_variants_sizes_default_properties_text_text-transform
119
+ );
120
+ }
121
+
122
+ .root[data-size="large"] {
123
+ width: var(
124
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_width
125
+ );
126
+ height: var(
127
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_height
128
+ );
129
+ border-width: var(
130
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_border-size
131
+ );
132
+ }
133
+
134
+ .root[data-size="large"] .iconWrapper {
135
+ width: var(
136
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_icon-size
137
+ );
138
+ height: var(
139
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_icon-size
140
+ );
141
+ }
142
+
143
+ .root[data-size="large"] .textWrapper {
144
+ font-family: var(
145
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-family
146
+ );
147
+ font-size: var(
148
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-size
149
+ );
150
+ font-style: var(
151
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-style
152
+ );
153
+ font-weight: var(
154
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_font-weight
155
+ );
156
+ letter-spacing: var(
157
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_letter-spacing
158
+ );
159
+ line-height: var(
160
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_line-height
161
+ );
162
+ text-decoration: var(
163
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_text-decoration
164
+ );
165
+ text-transform: var(
166
+ --recursica_ui-kit_components_avatar_variants_sizes_large_properties_text_text-transform
167
+ );
168
+ }
169
+
170
+ /* ==== STYLES & VARIANTS ==== */
171
+
172
+ /* 1. IMAGE */
173
+ .root[data-style="image"] {
174
+ border-radius: var(
175
+ --recursica_ui-kit_components_avatar_variants_styles_image_properties_border-radius
176
+ );
177
+ border-width: var(
178
+ --recursica_ui-kit_components_avatar_variants_styles_image_properties_border-size
179
+ );
180
+ padding: var(
181
+ --recursica_ui-kit_components_avatar_variants_styles_image_properties_padding
182
+ );
183
+
184
+ /* Image variant styles */
185
+ background-color: var(
186
+ --recursica_ui-kit_components_avatar_variants_styles_image_properties_colors_background-color
187
+ );
188
+ border-color: var(
189
+ --recursica_ui-kit_components_avatar_variants_styles_image_properties_colors_border-color
190
+ );
191
+ }
192
+
193
+ /* Base styles for Internal Nodes */
194
+ .image {
195
+ object-fit: cover;
196
+ width: 100%;
197
+ height: 100%;
198
+ }
199
+
200
+ .placeholder {
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ width: 100%;
205
+ height: 100%;
206
+ color: inherit;
207
+ background-color: transparent;
208
+ }
209
+
210
+ .iconWrapper {
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ flex-shrink: 0;
215
+ }
216
+ .iconWrapper > * {
217
+ width: 100%;
218
+ height: 100%;
219
+ object-fit: contain;
220
+ }
221
+
222
+ .textWrapper {
223
+ display: inline-flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ }
227
+
228
+ /* 2. ICON */
229
+ .root[data-style="icon"] {
230
+ border-radius: var(
231
+ --recursica_ui-kit_components_avatar_variants_styles_icon_properties_border-radius
232
+ );
233
+ padding: var(
234
+ --recursica_ui-kit_components_avatar_variants_styles_icon_properties_padding
235
+ );
236
+ }
237
+
238
+ .root[data-style="icon"][data-variant="solid"] {
239
+ border-width: var(
240
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_border-size
241
+ );
242
+ background-color: var(
243
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_colors_background-color
244
+ );
245
+ border-color: var(
246
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_colors_border-color
247
+ );
248
+ color: var(
249
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_solid_properties_colors_icon-color
250
+ );
251
+ }
252
+
253
+ .root[data-style="icon"][data-variant="outline"] {
254
+ border-width: var(
255
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_border-size
256
+ );
257
+ background-color: var(
258
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_colors_background-color
259
+ );
260
+ border-color: var(
261
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_colors_border-color
262
+ );
263
+ color: var(
264
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_outline_properties_colors_icon-color
265
+ );
266
+ }
267
+
268
+ .root[data-style="icon"][data-variant="ghost"] {
269
+ border-width: var(
270
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_border-size
271
+ );
272
+ background-color: var(
273
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_colors_background-color
274
+ );
275
+ border-color: var(
276
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_colors_border-color
277
+ );
278
+ color: var(
279
+ --recursica_ui-kit_components_avatar_variants_styles_icon_variants_types_ghost_properties_colors_icon-color
280
+ );
281
+ }
282
+
283
+ /* 3. TEXT */
284
+ .root[data-style="text"] {
285
+ border-radius: var(
286
+ --recursica_ui-kit_components_avatar_variants_styles_text_properties_border-radius
287
+ );
288
+ padding: var(
289
+ --recursica_ui-kit_components_avatar_variants_styles_text_properties_padding
290
+ );
291
+ }
292
+
293
+ .root[data-style="text"][data-variant="solid"] {
294
+ border-width: var(
295
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_border-size
296
+ );
297
+ background-color: var(
298
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_colors_background-color
299
+ );
300
+ border-color: var(
301
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_colors_border-color
302
+ );
303
+ color: var(
304
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_solid_properties_colors_text-color
305
+ );
306
+ }
307
+
308
+ .root[data-style="text"][data-variant="outline"] {
309
+ border-width: var(
310
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_border-size
311
+ );
312
+ background-color: var(
313
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_colors_background-color
314
+ );
315
+ border-color: var(
316
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_colors_border-color
317
+ );
318
+ color: var(
319
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_outline_properties_colors_text-color
320
+ );
321
+ }
322
+
323
+ .root[data-style="text"][data-variant="ghost"] {
324
+ border-width: var(
325
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_border-size
326
+ );
327
+ background-color: var(
328
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_colors_background-color
329
+ );
330
+ border-color: var(
331
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_colors_border-color
332
+ );
333
+ color: var(
334
+ --recursica_ui-kit_components_avatar_variants_styles_text_variants_types_ghost_properties_colors_text-color
335
+ );
336
+ }
@@ -0,0 +1,92 @@
1
+ import React from "react";
2
+ import type { Meta, StoryObj } from "@storybook/react";
3
+ import { Avatar } from "./Avatar";
4
+
5
+ type AvatarStoryProps = React.ComponentProps<typeof Avatar>;
6
+
7
+ const meta: Meta<AvatarStoryProps> = {
8
+ title: "UI-Kit/Avatar",
9
+ component: Avatar,
10
+ tags: ["autodocs"],
11
+ argTypes: {
12
+ variant: {
13
+ control: "select",
14
+ options: ["solid", "outline", "ghost"],
15
+ description:
16
+ "The visual variant of the avatar (applies to icon/text styles)",
17
+ },
18
+ size: {
19
+ control: "radio",
20
+ options: ["default", "small", "large"],
21
+ description: "The size of the avatar",
22
+ },
23
+ src: {
24
+ control: "text",
25
+ description: "Image URL for the image style avatar",
26
+ },
27
+ icon: {
28
+ table: {
29
+ disable: true,
30
+ },
31
+ },
32
+ },
33
+ };
34
+
35
+ export default meta;
36
+
37
+ type Story = StoryObj<AvatarStoryProps>;
38
+
39
+ export const Default: Story = {
40
+ args: {
41
+ size: "default",
42
+ variant: "solid",
43
+ },
44
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
45
+ render: ({ withLayer, layer, ...args }: any) => {
46
+ return <Avatar {...args} />;
47
+ },
48
+ };
49
+
50
+ export const TextSolidDefault: Story = {
51
+ args: {
52
+ children: "JD",
53
+ variant: "solid",
54
+ size: "default",
55
+ },
56
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
57
+ render: ({ withLayer, layer, ...args }: any) => <Avatar {...args} />,
58
+ };
59
+
60
+ export const ImageLarge: Story = {
61
+ args: {
62
+ src: "https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=250&q=80",
63
+ size: "large",
64
+ },
65
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
66
+ render: ({ withLayer, layer, ...args }: any) => <Avatar {...args} />,
67
+ };
68
+
69
+ export const IconSmallGhost: Story = {
70
+ args: {
71
+ size: "small",
72
+ variant: "ghost",
73
+ icon: (
74
+ <svg
75
+ xmlns="http://www.w3.org/2000/svg"
76
+ width="16"
77
+ height="16"
78
+ viewBox="0 0 24 24"
79
+ fill="none"
80
+ stroke="currentColor"
81
+ strokeWidth="2"
82
+ strokeLinecap="round"
83
+ strokeLinejoin="round"
84
+ >
85
+ <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
86
+ <circle cx="12" cy="7" r="4"></circle>
87
+ </svg>
88
+ ),
89
+ },
90
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
91
+ render: ({ withLayer, layer, ...args }: any) => <Avatar {...args} />,
92
+ };
@@ -0,0 +1 @@
1
+ // Placeholder for future Avatar component tests. Add tests here if/when needed.
@@ -0,0 +1,88 @@
1
+ import { forwardRef } from "react";
2
+ import {
3
+ Avatar as MuiAvatar,
4
+ type AvatarProps as MuiAvatarProps,
5
+ } from "@mui/material";
6
+ import {
7
+ filterStylingProps,
8
+ mergeClassNames,
9
+ type RecursicaOverStyled,
10
+ } from "../../utils/filterStylingProps";
11
+ import styles from "./Avatar.module.css";
12
+
13
+ import { type RecursicaAvatarProps } from "@recursica/adapter-common";
14
+
15
+ // MUI's native `variant` is Avatar's *shape* ('circular'|'rounded'|'square'), not a color
16
+ // treatment like every other MUI component's `variant` — unlike Mantine's, where `variant`
17
+ // really is the same color-treatment concept ours is. Omitted so Recursica's own `variant`
18
+ // (a completely different concept) can't be confused with it; see AVATAR_IMPLEMENTATION_NOTES.md.
19
+ export type AvatarProps = RecursicaOverStyled<
20
+ Omit<MuiAvatarProps, "variant"> & RecursicaAvatarProps
21
+ >;
22
+
23
+ const _Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(
24
+ {
25
+ size = "default",
26
+ variant = "solid",
27
+ icon,
28
+ children,
29
+ src,
30
+ overStyled = false,
31
+ ...rest
32
+ },
33
+ ref,
34
+ ) {
35
+ const sanitizedProps = filterStylingProps(rest, overStyled);
36
+ const restRecord = sanitizedProps as Record<string, unknown>;
37
+
38
+ // Determine semantic style based on provided props
39
+ let computedStyle = "text";
40
+ if (src) {
41
+ computedStyle = "image";
42
+ } else if (icon) {
43
+ computedStyle = "icon";
44
+ }
45
+
46
+ // Note MUI's actual prop is "classes", not "classNames" (that's Mantine's naming) — this
47
+ // used to read the wrong key, silently no-op-ing any caller-supplied classes.
48
+ const mergedClassNames = mergeClassNames(
49
+ {
50
+ root: styles.root,
51
+ image: styles.image,
52
+ placeholder: styles.placeholder,
53
+ },
54
+ restRecord.classes as Partial<Record<string, string>> | undefined,
55
+ );
56
+
57
+ const classNameProp = restRecord.className as string | undefined;
58
+
59
+ return (
60
+ <MuiAvatar
61
+ ref={ref}
62
+ className={classNameProp}
63
+ classes={mergedClassNames}
64
+ variant="circular"
65
+ src={src}
66
+ data-variant={variant}
67
+ data-size={size}
68
+ data-style={computedStyle}
69
+ {...sanitizedProps}
70
+ >
71
+ {icon != null ? (
72
+ <span className={styles.iconWrapper} aria-hidden>
73
+ {icon}
74
+ </span>
75
+ ) : children != null ? (
76
+ <span className={styles.textWrapper}>{children}</span>
77
+ ) : undefined}
78
+ </MuiAvatar>
79
+ );
80
+ });
81
+ _Avatar.displayName = "Avatar";
82
+
83
+ /**
84
+ * Recursica Avatar component wrapping Mui's Avatar.
85
+ *
86
+ * Supports polymorphism via the `component` prop or `renderRoot` for custom element rendering.
87
+ */
88
+ export const Avatar = _Avatar;
@@ -0,0 +1,38 @@
1
+ # Avatar - Usage Guide
2
+
3
+ This document describes how to integrate and use the `Avatar` component in your projects using `@recursica/adapter-mui-v7`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { Avatar } from "@recursica/adapter-mui-v7";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { Avatar } from "@recursica/adapter-mui-v7";
20
+
21
+ export default function Demo() {
22
+ return (
23
+ <Avatar src="https://example.com/avatar.png" alt="User Name" radius="xl" />
24
+ );
25
+ }
26
+ ```
27
+
28
+ ---
29
+
30
+ ## 3. Design System Integration
31
+
32
+ All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
33
+
34
+ > [!IMPORTANT]
35
+ >
36
+ > - **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.
37
+ > - **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.
38
+ > - **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.
@@ -0,0 +1 @@
1
+ export * from "./Avatar";