@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,197 @@
1
+ /* Brand-layer exemptions (recursica-allow-brand) — see recursica-token-analyzer README.md.
2
+ * 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).
3
+ * recursica-allow-brand: --recursica_brand_states_disabled
4
+ * recursica-allow-brand: --recursica_brand_states_hover_color
5
+ * recursica-allow-brand: --recursica_brand_states_hover_opacity
6
+ */
7
+
8
+ .root {
9
+ display: flex;
10
+ align-items: center;
11
+ gap: var(--recursica_ui-kit_components_pagination_properties_item-gap);
12
+
13
+ /* Mantine's own native Pagination CSS defines `--pagination-control-size` (their
14
+ internal size scale) on the DOM already, which mantine-adapter's `.baseIcon`
15
+ below reads directly. MUI has no equivalent variable, so it's bridged here to
16
+ the same Button height token `.control` itself is sized from, keeping the
17
+ chevron glyphs proportional to the actual rendered circle size. */
18
+ --pagination-control-size: var(
19
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_height
20
+ );
21
+ }
22
+
23
+ .control {
24
+ box-sizing: border-box;
25
+ margin: 0;
26
+ border-style: solid;
27
+ position: relative;
28
+ transition: all 0.2s ease;
29
+ overflow: hidden;
30
+ display: inline-flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+
34
+ /* Typography */
35
+ font-family: var(
36
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-family
37
+ );
38
+ font-size: var(
39
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-size
40
+ );
41
+ font-style: var(
42
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-style
43
+ );
44
+ font-weight: var(
45
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-weight
46
+ );
47
+ letter-spacing: var(
48
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_letter-spacing
49
+ );
50
+ line-height: var(
51
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_line-height
52
+ );
53
+ text-decoration: var(
54
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-decoration
55
+ );
56
+ text-transform: var(
57
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-transform
58
+ );
59
+
60
+ /* Dimensions */
61
+ border-radius: var(
62
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
63
+ );
64
+ height: var(
65
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_height
66
+ );
67
+ min-width: var(
68
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
69
+ );
70
+ padding: 0
71
+ var(
72
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
73
+ );
74
+
75
+ /* Base Inactive Style: Outline */
76
+ border-width: var(
77
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_border-size
78
+ );
79
+ box-shadow: var(
80
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_elevation
81
+ );
82
+ background-color: var(
83
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_background-color
84
+ );
85
+ border-color: var(
86
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_border-color
87
+ );
88
+ color: var(
89
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text-color
90
+ );
91
+ }
92
+
93
+ .control:disabled {
94
+ opacity: var(--recursica_brand_states_disabled);
95
+ cursor: not-allowed;
96
+ }
97
+
98
+ /* Hover Overlay: no per-variant hover-color/hover-opacity tokens exist anymore; use the
99
+ generic overlay tokens shared across components (same as Button). */
100
+ .control::after {
101
+ content: "";
102
+ position: absolute;
103
+ inset: 0;
104
+ border-radius: inherit;
105
+ z-index: 0;
106
+ pointer-events: none;
107
+ transition: opacity 150ms ease;
108
+ opacity: 0;
109
+ background-color: var(--recursica_brand_states_hover_color);
110
+ }
111
+
112
+ .control:hover:not(:disabled)::after {
113
+ opacity: var(--recursica_brand_states_hover_opacity);
114
+ }
115
+
116
+ /* Active Style: Solid */
117
+ .control[data-active] {
118
+ border-width: var(
119
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_border-size
120
+ );
121
+ box-shadow: var(
122
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_elevation
123
+ );
124
+ background-color: var(
125
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_background-color
126
+ );
127
+ border-color: var(
128
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_border-color
129
+ );
130
+ color: var(
131
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text-color
132
+ );
133
+ }
134
+
135
+ /* Navigation Style: Text */
136
+ .control[data-variant="text"] {
137
+ border-width: var(
138
+ --recursica_ui-kit_components_button_variants_styles_text_properties_border-size
139
+ );
140
+ box-shadow: var(
141
+ --recursica_ui-kit_components_button_variants_styles_text_properties_elevation
142
+ );
143
+ background-color: var(
144
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_background-color
145
+ );
146
+ border-color: var(
147
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_border-color
148
+ );
149
+ color: var(
150
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_text-color
151
+ );
152
+
153
+ /* Also explicitly inherit navigation sizes incase they differ from pages */
154
+ border-radius: var(
155
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
156
+ );
157
+ height: var(
158
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_height
159
+ );
160
+ min-width: var(
161
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
162
+ );
163
+ padding: 0
164
+ var(
165
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
166
+ );
167
+ }
168
+
169
+ /* Dots */
170
+ .dots {
171
+ display: inline-flex;
172
+ align-items: center;
173
+ justify-content: center;
174
+ height: var(
175
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_height
176
+ );
177
+ min-width: var(
178
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
179
+ );
180
+ color: var(
181
+ --recursica_ui-kit_components_pagination_properties_colors_dots-color
182
+ );
183
+ }
184
+
185
+ /* Icon Styles */
186
+ .iconWithLabel {
187
+ display: flex;
188
+ align-items: center;
189
+ gap: var(
190
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_icon-text-gap
191
+ );
192
+ }
193
+
194
+ .baseIcon {
195
+ width: calc(var(--pagination-control-size) / 1.8);
196
+ height: calc(var(--pagination-control-size) / 1.8);
197
+ }
@@ -0,0 +1,48 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Pagination } from "./Pagination";
3
+
4
+ const meta: Meta<typeof Pagination> = {
5
+ title: "UI-Kit/Pagination",
6
+ component: Pagination,
7
+ tags: ["autodocs"],
8
+ argTypes: {
9
+ total: { control: "number" },
10
+ withEdges: { control: "boolean" },
11
+ withControls: { control: "boolean" },
12
+ disabled: { control: "boolean" },
13
+ withLabels: {
14
+ control: "boolean",
15
+ description: "Toggle text labels alongside icons",
16
+ },
17
+ defaultChecked: { table: { disable: true } },
18
+ },
19
+ args: {
20
+ total: 10,
21
+ withEdges: false,
22
+ withControls: true,
23
+ withLabels: false,
24
+ },
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
26
+ render: ({ withLayer, layer, ...args }: any) => {
27
+ return <Pagination {...args} />;
28
+ },
29
+ };
30
+
31
+ export default meta;
32
+
33
+ type Story = StoryObj<typeof Pagination>;
34
+
35
+ export const Default: Story = {};
36
+
37
+ export const WithEdges: Story = {
38
+ args: {
39
+ withEdges: true,
40
+ },
41
+ };
42
+
43
+ export const WithTextLabels: Story = {
44
+ args: {
45
+ withEdges: true,
46
+ withLabels: true,
47
+ },
48
+ };
@@ -0,0 +1 @@
1
+ // Placeholder for future Pagination component tests. Add tests here if/when needed.
@@ -0,0 +1,123 @@
1
+ import { forwardRef, type ComponentProps } from "react";
2
+ import {
3
+ Pagination as MuiPagination,
4
+ PaginationItem,
5
+ type PaginationProps as MuiPaginationProps,
6
+ type PaginationRenderItemParams,
7
+ } from "@mui/material";
8
+ import {
9
+ filterStylingProps,
10
+ mergeClassNames,
11
+ type RecursicaOverStyled,
12
+ } from "../../utils/filterStylingProps";
13
+ import styles from "./Pagination.module.css";
14
+ import {
15
+ PaginationIcon,
16
+ NextWithLabel,
17
+ PrevWithLabel,
18
+ FirstWithLabel,
19
+ LastWithLabel,
20
+ } from "./Pagination.icons";
21
+
22
+ import { type RecursicaPaginationProps } from "@recursica/adapter-common";
23
+
24
+ export type PaginationProps = RecursicaOverStyled<
25
+ MuiPaginationProps & RecursicaPaginationProps
26
+ >;
27
+
28
+ function usePaginationClassNames(restRecord: Record<string, unknown>): {
29
+ className: string;
30
+ classNames: Partial<Record<string, string>>;
31
+ } {
32
+ const mergedClassNames = mergeClassNames(
33
+ { root: styles.root, ul: styles.ul },
34
+ restRecord.classNames as Partial<Record<string, string>> | undefined,
35
+ );
36
+
37
+ const classNameProp = restRecord.className as string | undefined;
38
+ const finalClass = classNameProp
39
+ ? `${styles.root} ${classNameProp}`
40
+ : styles.root;
41
+
42
+ return { className: finalClass, classNames: mergedClassNames };
43
+ }
44
+
45
+ // Plain (non-labeled) icon slots — MUI's own default `NavigateBefore`/`NavigateNext`/
46
+ // `FirstPage`/`LastPage` icons never read our tokens, so every nav control is always
47
+ // replaced with our own `PaginationIcon` regardless of `withLabels`.
48
+ const iconSlots = {
49
+ next: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="next" />,
50
+ previous: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="prev" />,
51
+ first: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="first" />,
52
+ last: (p: ComponentProps<"svg">) => <PaginationIcon {...p} type="last" />,
53
+ };
54
+
55
+ const labeledIconSlots = {
56
+ next: NextWithLabel,
57
+ previous: PrevWithLabel,
58
+ first: FirstWithLabel,
59
+ last: LastWithLabel,
60
+ };
61
+
62
+ const _Pagination = forwardRef<HTMLDivElement, PaginationProps>(
63
+ function Pagination(props, ref) {
64
+ const {
65
+ overStyled = false,
66
+ withLabels = false,
67
+ total,
68
+ withEdges,
69
+ withControls,
70
+ ...rest
71
+ } = props;
72
+
73
+ const sanitizedProps = filterStylingProps(rest, overStyled);
74
+ const stylingParams = usePaginationClassNames(
75
+ sanitizedProps as Record<string, unknown>,
76
+ );
77
+
78
+ const renderItem = (item: PaginationRenderItemParams) => {
79
+ if (item.type === "start-ellipsis" || item.type === "end-ellipsis") {
80
+ return <PaginationItem {...item} className={styles.dots} />;
81
+ }
82
+ const isNavigation = item.type !== "page";
83
+ // `disableRipple` is a genuine `ButtonBase` prop `PaginationItemPage` forwards
84
+ // at runtime, but MUI's own `PaginationItem` type declarations don't expose it
85
+ // (same category of MUI type-gap other components in this adapter cast around,
86
+ // e.g. `Card.tsx`/`Radio.tsx`'s `as unknown as MuiXProps`).
87
+ const itemProps: Record<string, unknown> = {
88
+ ...item,
89
+ disableRipple: true,
90
+ className: styles.control,
91
+ "data-active": item.selected || undefined,
92
+ "data-variant": isNavigation ? "text" : undefined,
93
+ slots: withLabels ? labeledIconSlots : iconSlots,
94
+ };
95
+ return (
96
+ <PaginationItem
97
+ {...(itemProps as unknown as ComponentProps<typeof PaginationItem>)}
98
+ />
99
+ );
100
+ };
101
+
102
+ return (
103
+ <div ref={ref} className={stylingParams.className}>
104
+ <MuiPagination
105
+ {...(sanitizedProps as MuiPaginationProps)}
106
+ count={total}
107
+ showFirstButton={withEdges}
108
+ showLastButton={withEdges}
109
+ hidePrevButton={withControls === false ? true : undefined}
110
+ hideNextButton={withControls === false ? true : undefined}
111
+ classes={stylingParams.classNames}
112
+ renderItem={renderItem}
113
+ />
114
+ </div>
115
+ );
116
+ },
117
+ );
118
+ _Pagination.displayName = "Pagination";
119
+
120
+ /**
121
+ * Recursica Pagination component wrapping Mui's Pagination.
122
+ */
123
+ export const Pagination = _Pagination;
@@ -0,0 +1,36 @@
1
+ # Pagination - Usage Guide
2
+
3
+ This document describes how to integrate and use the `Pagination` component in your projects using `@recursica/adapter-mui-v7`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { Pagination } from "@recursica/adapter-mui-v7";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { Pagination } from "@recursica/adapter-mui-v7";
20
+
21
+ export default function Demo() {
22
+ return <Pagination total={10} value={activePage} onChange={setPage} />;
23
+ }
24
+ ```
25
+
26
+ ---
27
+
28
+ ## 3. Design System Integration
29
+
30
+ All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
31
+
32
+ > [!IMPORTANT]
33
+ >
34
+ > - **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.
35
+ > - **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.
36
+ > - **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 "./Pagination";
@@ -0,0 +1,133 @@
1
+ # Panel – Implementation Notes
2
+
3
+ Decisions and design tweaks strictly tailored for the UI Kit's Panel wrapped against `@mui/material`. This is a living document that tracks _why_ specific logic decisions exist.
4
+
5
+ ---
6
+
7
+ ## 1. Mapping to MUI Drawer
8
+
9
+ **Decision:** Panel maps to MUI's `Drawer` component, not `Paper` or `Card`.
10
+
11
+ **Implementation:** Per the Recursica design system specification, "Panels slide in or expand from the edge of the screen to reveal additional content or functionality." This is the exact behavior of MUI's `Drawer` component, which provides:
12
+
13
+ - Slide-in animation from any screen edge (using the `anchor` prop)
14
+ - Backdrop/overlay support
15
+ - Focus trap and overlay portal management
16
+ - Internal scroll lock when open
17
+
18
+ ---
19
+
20
+ ## 2. Token Namespace: `panel`
21
+
22
+ **Decision:** The CSS module exclusively uses variables from the `--recursica_ui-kit_components_panel_*` namespace.
23
+
24
+ **Implementation:** The Recursica token system defines the `panel` namespace covering:
25
+
26
+ - Geometry: border-radius, border-size, min-width (200px), max-width (960px)
27
+ - Content padding: content-horizontal-padding (xl), content-vertical-padding (lg)
28
+ - Header/Footer padding: header-footer-horizontal-padding (xl), header-footer-vertical-padding (md)
29
+ - Spacing: header-close-gap (md), footer-button-gap (md)
30
+ - Divider: divider-size (1px), divider-color
31
+ - Elevation: elevation-3
32
+ - Colors (layer-aware): background, border-color, content, divider-color, header-footer-background, title
33
+ - Non-CSS: header-style ("h3")
34
+
35
+ No tokens from other component namespaces are referenced.
36
+
37
+ ---
38
+
39
+ ## 3. Default Placement Override
40
+
41
+ **Decision:** Use `placement` instead of `position` for configuring slide-out direction, and default it to `"right"`.
42
+
43
+ **Implementation:** The prop was renamed from `position` to `placement` to prevent collision with the CSS `position` keyword, which is strictly blocked by the styling gatekeeper (`BLOCKED_STYLING_KEYS`). This allows configuring the drawer direction natively while maintaining strict design-system boundaries. The `placement="right"` default is mapped internally to MUI Drawer's `anchor` prop before any other sanitized props are applied. Right-side panels are the most common pattern for supplementary content, settings, and detail views.
44
+
45
+ ---
46
+
47
+ ## 4. Custom Panel.Footer
48
+
49
+ **Decision:** A custom `Panel.Footer` sub-component is provided. MUI's Drawer does not have a native footer.
50
+
51
+ **Implementation:** `Panel.Footer` is a `<div>` with styling referencing Recursica CSS variables for:
52
+
53
+ - `header-footer-background` and `header-footer-padding` tokens
54
+ - Top divider using `divider-size` and `divider-color`
55
+ - `footer-button-gap` for action button spacing
56
+ - `margin-top: auto` to push the footer to the bottom
57
+
58
+ ---
59
+
60
+ ## 5. Visibility Mapping (`opened` -> `open`)
61
+
62
+ **Decision:** Accept `opened` prop to match the standard Recursica component API.
63
+
64
+ **Implementation:** MUI Drawer natively expects the `open` boolean prop. The wrapper maps the incoming framework-agnostic `opened` prop to MUI's `open={Boolean(opened)}`, allowing consistent usage across both adapter implementations.
65
+
66
+ ---
67
+
68
+ ## Panel covered the whole viewport with no header (Matt Massey, 2026-08-30)
69
+
70
+ **Symptom:** `ui-kit-panel--default` rendered as an unstyled white box covering the entire
71
+ viewport (full width and height, no border/radius/shadow, no dark overlay), with no header,
72
+ title, or close button visible at all — not merely off-screen, never rendered.
73
+
74
+ **Root cause:** Two compounding bugs, both from writing this component as if MUI's `Drawer`
75
+ had Mantine's convenience API:
76
+
77
+ 1. `classes={{ content, header, title, body, inner }}` — MUI's `Drawer` `classes` prop only
78
+ recognizes its own slot names (`root`, `paper`, `docked`, `paperAnchorRight`, ...). It has no
79
+ `content`/`header`/`title`/`body`/`inner` slots the way Mantine's `classNames` does, so every
80
+ key in that object was silently ignored — none of this file's CSS Module classes were ever
81
+ attached to any DOM node. Confirmed via the rendered Paper's `className`: only MUI's own
82
+ default `MuiPaper-root MuiDrawer-paper MuiDrawer-paperAnchorRight` classes were present.
83
+ 2. `title`, `withOverlay`, `withCloseButton` were spread straight through onto `<MuiDrawer>` as
84
+ if it were Mantine's `<Drawer title="..." withCloseButton>`, which builds a Header/Title/
85
+ CloseButton internally from those props. MUI's `Drawer` has no such feature — it only takes
86
+ `children`. `title` landed as a plain HTML `title` (tooltip) attribute on the root div;
87
+ `withOverlay`/`withCloseButton` were dropped entirely (not valid DOM or Drawer props). No
88
+ header ever rendered.
89
+
90
+ Both bugs together meant Paper had zero width/height/border constraints of its own (MUI's
91
+ default temporary-variant Paper only fixes position, not size) and no header to visually anchor
92
+ against — hence "covers the whole viewport."
93
+
94
+ **Fix:** Rebuilt Panel the same way `Modal.tsx` builds its header/body/footer — as real JSX
95
+ children of `<MuiDrawer>`, not through the `classes` prop:
96
+
97
+ - `title`, `withOverlay`, `withCloseButton`, `onClose`, `children` are now destructured and used
98
+ directly: a manually-built `.header` div (title + close `IconButton`, only rendered when
99
+ `title` or `withCloseButton` is set) and `.body` div wrap the real children; `withOverlay`
100
+ maps to MUI's own `hideBackdrop={!withOverlay}`.
101
+ - `classes` now only maps `paper` (MUI's actual slot) to a new `.paper` rule that zeroes out
102
+ Paper's own default background/box-shadow, so the box-model chrome (border, radius, shadow,
103
+ `min-width`/`max-width` bounds) lives entirely on the new `.content` wrapper div rendered
104
+ inside Paper — mirroring where Mantine's own `.content` slot sits (it wraps header/body
105
+ already), just as an explicit element instead of a slot name MUI doesn't have.
106
+ - Added `display: flex` + `justify-content: space-between` to `.header` and a `.close` rule —
107
+ Mantine's own `Drawer.Header` is flex out of the box; this manually-built div needed it
108
+ declared. No dedicated close-button token namespace exists for Panel (Mantine's own Panel
109
+ doesn't style one either — it renders Mantine's plain default `CloseButton`), so `.close` only
110
+ sets `flex-shrink: 0` and reuses a plain `IconButton`.
111
+ - Removed the `.inner { left: 0 }` rule — that was a Mantine-only positioning hack (`Drawer.Inner`
112
+ has no MUI equivalent; MUI's own `paperAnchorLeft`/`paperAnchorRight` classes already position
113
+ Paper correctly).
114
+
115
+ Verified live in Storybook against `@recursica/mantine-adapter`'s Panel for `Default`,
116
+ `LeftPlacement`, `ScrollableContent`, and `LongTitle` — header renders, close button works,
117
+ title truncation and the sticky scrolling footer all behave correctly. Width is now bounded by
118
+ `--recursica_ui-kit_components_panel_properties_min-width`/`max-width` (200–960px) via
119
+ shrink-to-fit, same mechanism as Modal's `.content`; this is narrower/wider than mantine's own
120
+ default rendered width in some stories, because Mantine's Panel CSS (identical file, shared
121
+ copy) never added the `flex: 0 1 auto` override Mantine's own Modal has to make width
122
+ content-driven instead of Mantine's fixed `--drawer-size` default — that's a source-of-truth-side
123
+ gap, out of scope here.
124
+
125
+ ---
126
+
127
+ ## `.titleTruncate` descender clipping (Matt Massey, 2026-08-28)
128
+
129
+ `.titleTruncate` used plain `overflow: hidden` to make `text-overflow: ellipsis` work, which also
130
+ clips descenders (e.g. the "g" in a long title) whenever `text_line-height` is tighter than the
131
+ font's natural ascent+descent. Switched to `overflow: clip; overflow-clip-margin: 0.35em;` — same
132
+ truncation, but ink can bleed slightly past the line box before it's actually clipped.
133
+ Project-wide fix; see Chip's `CHIP_IMPLEMENTATION_NOTES.md` for the original discovery.