@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,231 @@
1
+ import React, { forwardRef } from "react";
2
+ import {
3
+ Dialog as MuiDialog,
4
+ type DialogProps as MuiDialogProps,
5
+ DialogTitle as MuiDialogTitle,
6
+ type DialogTitleProps as MuiDialogTitleProps,
7
+ DialogContent as MuiDialogContent,
8
+ type DialogContentProps as MuiDialogContentProps,
9
+ DialogActions as MuiDialogActions,
10
+ type DialogActionsProps as MuiDialogActionsProps,
11
+ IconButton as MuiIconButton,
12
+ } from "@mui/material";
13
+ import {
14
+ filterStylingProps,
15
+ mergeClassNames,
16
+ type RecursicaOverStyled,
17
+ } from "../../utils/filterStylingProps";
18
+ import styles from "./Modal.module.css";
19
+
20
+ // ============================================================
21
+ // MODAL ROOT (Dialog)
22
+ // ============================================================
23
+
24
+ import { type RecursicaModalProps } from "@recursica/adapter-common";
25
+
26
+ export type ModalProps = RecursicaOverStyled<
27
+ Omit<MuiDialogProps, "size" | "radius" | "shadow" | "open"> &
28
+ RecursicaModalProps
29
+ >;
30
+
31
+ const CloseIcon = () => (
32
+ <svg
33
+ xmlns="http://www.w3.org/2000/svg"
34
+ width="20"
35
+ height="20"
36
+ viewBox="0 0 24 24"
37
+ fill="none"
38
+ stroke="currentColor"
39
+ strokeWidth="2"
40
+ strokeLinecap="round"
41
+ strokeLinejoin="round"
42
+ >
43
+ <path d="M18 6L6 18M6 6l12 12" />
44
+ </svg>
45
+ );
46
+
47
+ const ModalRoot = forwardRef<HTMLDivElement, ModalProps>(function ModalRoot(
48
+ {
49
+ overStyled = false,
50
+ opened = false,
51
+ withCloseButton = true,
52
+ title,
53
+ children,
54
+ onClose,
55
+ className,
56
+ ...rest
57
+ },
58
+ ref,
59
+ ) {
60
+ const sanitizedProps = filterStylingProps(rest, overStyled);
61
+
62
+ const mergedClassNames = mergeClassNames(
63
+ { paper: styles.inner },
64
+ (sanitizedProps as Record<string, unknown>).classes as
65
+ | Partial<Record<string, string>>
66
+ | undefined,
67
+ );
68
+
69
+ let footer: React.ReactNode = null;
70
+ const bodyChildren: React.ReactNode[] = [];
71
+
72
+ React.Children.forEach(children, (child) => {
73
+ if (
74
+ React.isValidElement(child) &&
75
+ (child.type === ModalFooter ||
76
+ (child.type as unknown as { displayName?: string })?.displayName ===
77
+ "Modal.Footer")
78
+ ) {
79
+ footer = child;
80
+ } else {
81
+ bodyChildren.push(child);
82
+ }
83
+ });
84
+
85
+ return (
86
+ <MuiDialog
87
+ ref={ref}
88
+ {...(sanitizedProps as MuiDialogProps)}
89
+ className={`${styles.root} ${className || ""}`}
90
+ classes={mergedClassNames}
91
+ open={
92
+ opened ||
93
+ ((sanitizedProps as Record<string, unknown>).open as boolean) ||
94
+ false
95
+ }
96
+ onClose={onClose}
97
+ >
98
+ {(title || withCloseButton) && (
99
+ <div className={styles.header}>
100
+ {title && <div className={styles.title}>{title}</div>}
101
+ {withCloseButton && (
102
+ <MuiIconButton
103
+ onClick={(e) => onClose?.(e, "backdropClick")}
104
+ className={styles.close}
105
+ >
106
+ <CloseIcon />
107
+ </MuiIconButton>
108
+ )}
109
+ </div>
110
+ )}
111
+ <ModalBody>{bodyChildren}</ModalBody>
112
+ {footer}
113
+ </MuiDialog>
114
+ );
115
+ });
116
+
117
+ ModalRoot.displayName = "Modal";
118
+
119
+ // ============================================================
120
+ // MODAL TITLE (DialogTitle)
121
+ // ============================================================
122
+
123
+ export type ModalTitleProps = RecursicaOverStyled<MuiDialogTitleProps>;
124
+
125
+ const ModalTitle = forwardRef<HTMLDivElement, ModalTitleProps>(
126
+ function ModalTitle({ overStyled = false, className, ...rest }, ref) {
127
+ const sanitizedProps = filterStylingProps(rest, overStyled);
128
+
129
+ return (
130
+ <MuiDialogTitle
131
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ ref={ref as any}
133
+ {...(sanitizedProps as MuiDialogTitleProps)}
134
+ className={`${styles.title} ${className || ""}`}
135
+ />
136
+ );
137
+ },
138
+ );
139
+
140
+ ModalTitle.displayName = "Modal.Title";
141
+
142
+ // ============================================================
143
+ // MODAL BODY (DialogContent)
144
+ // ============================================================
145
+
146
+ export type ModalBodyProps = RecursicaOverStyled<MuiDialogContentProps>;
147
+
148
+ const ModalBody = forwardRef<HTMLDivElement, ModalBodyProps>(function ModalBody(
149
+ { overStyled = false, className, children, ...rest },
150
+ ref,
151
+ ) {
152
+ const sanitizedProps = filterStylingProps(rest, overStyled);
153
+ const internalRef = React.useRef<HTMLDivElement>(null);
154
+ const [scrolledTop, setScrolledTop] = React.useState(false);
155
+ const [scrolledBottom, setScrolledBottom] = React.useState(false);
156
+
157
+ const checkScroll = React.useCallback(() => {
158
+ if (internalRef.current) {
159
+ const { scrollTop, scrollHeight, clientHeight } = internalRef.current;
160
+ setScrolledTop(scrollTop > 0);
161
+ setScrolledBottom(Math.ceil(scrollTop + clientHeight) < scrollHeight);
162
+ }
163
+ }, []);
164
+
165
+ React.useEffect(() => {
166
+ checkScroll();
167
+ window.addEventListener("resize", checkScroll);
168
+ return () => window.removeEventListener("resize", checkScroll);
169
+ }, [checkScroll, children]);
170
+
171
+ return (
172
+ <MuiDialogContent
173
+ ref={(node) => {
174
+ if (typeof ref === "function") ref(node as HTMLDivElement);
175
+ else if (ref)
176
+ (ref as React.MutableRefObject<HTMLDivElement | null>).current =
177
+ node as HTMLDivElement;
178
+ if (internalRef)
179
+ (
180
+ internalRef as React.MutableRefObject<HTMLDivElement | null>
181
+ ).current = node as HTMLDivElement;
182
+ }}
183
+ {...(sanitizedProps as MuiDialogContentProps)}
184
+ onScroll={() => checkScroll()}
185
+ data-scrolled-top={scrolledTop || undefined}
186
+ data-scrolled-bottom={scrolledBottom || undefined}
187
+ className={`${styles.content} ${styles.scrollArea} ${className || ""}`}
188
+ >
189
+ {children}
190
+ </MuiDialogContent>
191
+ );
192
+ });
193
+
194
+ ModalBody.displayName = "Modal.Body";
195
+
196
+ // ============================================================
197
+ // MODAL FOOTER (DialogActions)
198
+ // ============================================================
199
+
200
+ export type ModalFooterProps = RecursicaOverStyled<MuiDialogActionsProps>;
201
+
202
+ const ModalFooter = forwardRef<HTMLDivElement, ModalFooterProps>(
203
+ function ModalFooter({ overStyled = false, className, ...rest }, ref) {
204
+ const sanitizedProps = filterStylingProps(rest, overStyled);
205
+
206
+ return (
207
+ <MuiDialogActions
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ ref={ref as any}
210
+ {...(sanitizedProps as MuiDialogActionsProps)}
211
+ className={`${styles.footer} ${className || ""}`}
212
+ />
213
+ );
214
+ },
215
+ );
216
+
217
+ ModalFooter.displayName = "Modal.Footer";
218
+
219
+ // ============================================================
220
+ // EXPORT COMPOSITION
221
+ // ============================================================
222
+
223
+ export const Modal = ModalRoot as typeof ModalRoot & {
224
+ Title: typeof ModalTitle;
225
+ Body: typeof ModalBody;
226
+ Footer: typeof ModalFooter;
227
+ };
228
+
229
+ Modal.Title = ModalTitle;
230
+ Modal.Body = ModalBody;
231
+ Modal.Footer = ModalFooter;
@@ -0,0 +1,40 @@
1
+ # Modal - Usage Guide
2
+
3
+ This document describes how to integrate and use the `Modal` component in your projects using `@recursica/adapter-mui-v7`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { Modal } from "@recursica/adapter-mui-v7";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { Modal } from "@recursica/adapter-mui-v7";
20
+
21
+ export default function Demo() {
22
+ return (
23
+ <Modal opened={isOpen} onClose={close} title="Modal Title">
24
+ <Text>This is a styled Modal wrapping the native primitive.</Text>
25
+ </Modal>
26
+ );
27
+ }
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 3. Design System Integration
33
+
34
+ All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
35
+
36
+ > [!IMPORTANT]
37
+ >
38
+ > - **Anti-override protection**: Rogues style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
39
+ > - **No Direct Layers**: Do not pass a `layer` prop to this component. To place it on a specific visual layer, wrap it in a `<Layer layer={0|1|2|3}>` component natively.
40
+ > - **Variables and Theming**: Styling is entirely determined by local CSS variables defined in `recursica_variables_scoped.css` and mapped in the component's CSS module.
@@ -0,0 +1 @@
1
+ export * from "./Modal";
@@ -0,0 +1,93 @@
1
+ # NumberInput – implementation notes
2
+
3
+ Decisions and design tweaks specific to the UI Kit's NumberInput wrapped against `@mui/material`.
4
+
5
+ ---
6
+
7
+ ## 1. `InputBase` instead of `TextField` (source-of-truth audit, 2026-08-30)
8
+
9
+ **Decision:** Render the naked field with MUI's `InputBase`, not `TextField`.
10
+
11
+ **Root cause:** The component previously rendered `<TextField>` and passed the CSS-module class
12
+ map (`root`/`input`/`section`/`controls`/`control`) through TextField's own `classes` prop.
13
+ `TextField`'s `classes` type only exposes a single `root` key
14
+ (`@mui/material/TextField/textFieldClasses.d.ts`), and that `root` maps to the outer
15
+ `FormControl` wrapper `TextField` renders around everything — not to the actual `<input>`
16
+ element or its border/background. Every rule in `NumberInput.module.css` scoped to `.input`
17
+ (padding, border-radius, colors, focus box-shadow) or to `.root` (min-height, border, background)
18
+ was therefore never attached to any real DOM node. `TextField`'s default `variant="outlined"`
19
+ also draws its own border via an internal `<fieldset>` (`notchedOutline`) with MUI's own
20
+ default focus/hover treatment, independent of any of our CSS — which is why the focus ring came
21
+ through as MUI's stock primary-color ring instead of the Recursica focus tokens, and why
22
+ border-radius/height/icon-gutter tokens had no visible effect.
23
+
24
+ **Implementation:** Switched to `InputBase`, which supports real `classes.root`/`classes.input`
25
+ slots (`root` = the bordered/backgrounded box InputBase renders around the input + adornments;
26
+ `input` = the actual `<input>` element) — the exact same fix already used by the sibling
27
+ `TextField` (Recursica) component (`src/components/TextField/TextField.tsx`), which this
28
+ implementation now mirrors structurally: border/background/color/font/border-radius moved onto
29
+ `.root`, box geometry (padding) on `.input`, and `.section` (icon/adornment slots) made
30
+ `position: absolute` inset to the root's edges instead of an inline flex sibling, matching how
31
+ Mantine's own `Input.Wrapper` reserves icon-gutter space via `.input`'s dynamic
32
+ `padding-left`/`padding-right` (`--input-left-section-size` / `--input-right-section-size`).
33
+ `data-disabled`/`data-error`/`data-with-left-section`/`data-with-right-section` are now set
34
+ explicitly on `<InputBase>` (previously never set at all, so the `[data-error]`/`[data-disabled]`
35
+ state selectors in the CSS module were dead code too).
36
+
37
+ This one root-cause fix resolves several source-of-truth-audit findings at once:
38
+
39
+ - Focus ring now uses the Recursica focus tokens (was MUI's default blue).
40
+ - `.root`'s border-radius token now actually renders (was invisible; `states` story).
41
+ - `.root`'s min-height token now actually renders, matching Mantine's height exactly instead of
42
+ being taller (`hidden-controls` story) — MUI's own default `TextField` padding/line-height was
43
+ filling the gap our own (unattached) `min-height` was supposed to constrain.
44
+ - Icon-gutter padding (`--input-left-section-size`/`--input-right-section-size`) now actually
45
+ reserves space on `.input`, fixing both the crowded left icon (`with-left-icon`) and the right
46
+ icon sitting further from the edge than Mantine's (`with-right-icon`).
47
+
48
+ **Border-width also switched from a hardcoded `1px` to the existing
49
+ `--recursica_ui-kit_components_number-input_properties_border-size` token** (previously unused
50
+ by this component, in violation of the "no hardcoded sizing" rule — Mantine's own module already
51
+ used it). The per-state `border-size` exemption comments were ported from `mantine-adapter`'s
52
+ `NumberInput.module.css` since disabled/error only ever recolor the border, never resize it.
53
+
54
+ ## 2. Icon/adornment section color applies to the whole slot, not just `<svg>` (2026-08-30)
55
+
56
+ **Decision:** `.section[data-position="left"|"right"]` now sets `color` directly, in addition to
57
+ keeping the icon-sizing rule scoped to `:global(svg)`.
58
+
59
+ **Context:** The `with-left-icon`/`with-right-icon` stories pass a plain `<span>$</span>` /
60
+ `<span>%</span>` as the section content, not a real icon component. Mantine's own
61
+ `mantine-Input-section` ships a library-default `color: var(--mantine-color-placeholder)` (a
62
+ generic gray, independent of any Recursica token) that free-rides under any content dropped into
63
+ that slot; our own CSS only ever recolored `:global(svg)` descendants, so plain text fell back to
64
+ inheriting `.root`'s text-color token (near-black) instead. Applying the leading/trailing-icon
65
+ token to the section itself (not just its `<svg>` children) makes any section content —
66
+ icon or plain text — consistently use the Recursica icon-color token.
67
+
68
+ **Caveat (documented, not a further attempt):** The Recursica
69
+ `--recursica_ui-kit_components_number-input_properties_colors_trailing-icon` /
70
+ `_leading-icon` tokens both resolve to `#131313` (near-black) in this token set. Mantine's demo
71
+ stories render a lighter gray only because of the unrelated `--mantine-color-placeholder`
72
+ library default described above — that gray is not backed by any Recursica variable. Since
73
+ hardcoding a copy of Mantine's incidental placeholder-gray would violate the "no hardcoded
74
+ colors" rule, this component now applies the actual token value everywhere a section renders,
75
+ which is the token-correct behavior even though it no longer color-matches Mantine's demo-only
76
+ `<span>` stand-in pixel-for-pixel. If the intent is for real icon color to look lighter than
77
+ `#131313`, that's a token value question for the design system, not an adapter bug.
78
+
79
+ ## 3. Numeric-only keystroke filtering (source-of-truth audit, 2026-08-30)
80
+
81
+ **Decision:** Restrict typed/pasted characters to digits, a single decimal point, and (only when
82
+ negative values aren't excluded by `min`) a single leading minus sign.
83
+
84
+ **Root cause:** MUI's `InputBase` has no numeric-parsing behavior built in — unlike Mantine's
85
+ `NumberInput`, which validates/rejects non-numeric characters internally, this component
86
+ previously behaved like a plain text field, silently accepting any input.
87
+
88
+ **Implementation:** `onKeyDown` calls `isAllowedNumericKeystroke` (rejecting anything that isn't
89
+ a digit, a first `-` when `min === undefined || min < 0`, a single `.`, a navigation/editing key,
90
+ or a modifier-held shortcut) before forwarding the event to any caller-supplied `onKeyDown`.
91
+ `onPaste` runs the same allowance against the full pasted string. This is deliberately a
92
+ keystroke gate, not a value-transforming `onChange` wrapper — it never rewrites a caller's
93
+ controlled `value`, only prevents the illegal keystroke from landing in the first place.
@@ -0,0 +1,303 @@
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_focus_blur
4
+ * recursica-allow-brand: --recursica_brand_states_focus_border-size
5
+ * recursica-allow-brand: --recursica_brand_states_focus_color
6
+ * recursica-allow-brand: --recursica_brand_states_focus_margin
7
+ */
8
+
9
+ /* LAYOUT SPACING OVERRIDES:
10
+ - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
11
+ - Also sets the --number-input-control-{max,min}-width hooks consumed inline in NumberInput.tsx,
12
+ since the token schema no longer provides a single layout-agnostic min/max width. */
13
+ .layoutOverride {
14
+ --form-control-margin-bottom: var(
15
+ --recursica_ui-kit_components_number-input_variants_layouts_stacked_properties_top-bottom-margin
16
+ );
17
+ --number-input-control-max-width: var(
18
+ --recursica_ui-kit_components_number-input_variants_layouts_stacked_properties_max-width
19
+ );
20
+ --number-input-control-min-width: var(
21
+ --recursica_ui-kit_components_number-input_variants_layouts_stacked_properties_min-width
22
+ );
23
+ }
24
+
25
+ .layoutOverride[data-form-layout="side-by-side"] {
26
+ --form-control-margin-bottom: var(
27
+ --recursica_ui-kit_components_number-input_variants_layouts_side-by-side_properties_top-bottom-margin
28
+ );
29
+ --number-input-control-max-width: var(
30
+ --recursica_ui-kit_components_number-input_variants_layouts_side-by-side_properties_max-width
31
+ );
32
+ --number-input-control-min-width: var(
33
+ --recursica_ui-kit_components_number-input_variants_layouts_side-by-side_properties_min-width
34
+ );
35
+ }
36
+
37
+ /* HARDCODED VALUES:
38
+ - border-style: solid. Native structural rendering rule.
39
+ - outline: none. Bypassing browser focus rings to rely strictly on Recursica focus states natively.
40
+ - flex/layout: display: flex on the root wrapper safely encapsulating internal section rendering.
41
+ - Controls: Hardcoded to bypass MUI's default borders and backgrounds on the increment/decrement arrows.
42
+ */
43
+
44
+ /* EXEMPTIONS:
45
+ - border-size is constant across disabled/error states — only border-color changes; the
46
+ disabled/error border-size tokens are never applied by design. */
47
+ /* recursica-ignore: --recursica_ui-kit_components_number-input_variants_states_disabled_properties_border-size */
48
+ /* recursica-ignore: --recursica_ui-kit_components_number-input_variants_states_error_properties_border-size */
49
+
50
+ .root {
51
+ display: flex;
52
+ position: relative;
53
+ width: 100%;
54
+ min-height: var(
55
+ --recursica_ui-kit_components_number-input_properties_min-height
56
+ );
57
+
58
+ /* Strict Typography Unification placed on root for MUI InputBase inheritance */
59
+ font-family: var(
60
+ --recursica_ui-kit_components_number-input_properties_text_font-family
61
+ );
62
+ font-size: var(
63
+ --recursica_ui-kit_components_number-input_properties_text_font-size
64
+ );
65
+ font-style: var(
66
+ --recursica_ui-kit_components_number-input_properties_text_font-style
67
+ );
68
+ font-weight: var(
69
+ --recursica_ui-kit_components_number-input_properties_text_font-weight
70
+ );
71
+ letter-spacing: var(
72
+ --recursica_ui-kit_components_number-input_properties_text_letter-spacing
73
+ );
74
+ line-height: var(
75
+ --recursica_ui-kit_components_number-input_properties_text_line-height
76
+ );
77
+ text-decoration: var(
78
+ --recursica_ui-kit_components_number-input_properties_text_text-decoration
79
+ );
80
+ text-transform: var(
81
+ --recursica_ui-kit_components_number-input_properties_text_text-transform
82
+ );
83
+
84
+ /* Box Geometry placed on root so MUI InputBase boundary executes */
85
+ border-radius: var(
86
+ --recursica_ui-kit_components_number-input_properties_border-radius
87
+ );
88
+ border-width: var(
89
+ --recursica_ui-kit_components_number-input_properties_border-size
90
+ );
91
+ border-style: solid;
92
+
93
+ /* Base State Default Execution */
94
+ background-color: var(
95
+ --recursica_ui-kit_components_number-input_properties_colors_background-color
96
+ );
97
+ border-color: var(
98
+ --recursica_ui-kit_components_number-input_properties_colors_border-color
99
+ );
100
+ color: var(
101
+ --recursica_ui-kit_components_number-input_properties_colors_text-color
102
+ );
103
+
104
+ /* Override native Input variables governing section spacing padding mathematics safely */
105
+ --input-left-section-size: calc(
106
+ var(
107
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
108
+ ) +
109
+ var(--recursica_ui-kit_components_number-input_properties_icon-size) +
110
+ var(--recursica_ui-kit_components_number-input_properties_icon-text-gap)
111
+ );
112
+ --input-right-section-size: calc(
113
+ var(
114
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
115
+ ) +
116
+ var(--recursica_ui-kit_components_number-input_properties_icon-size) +
117
+ var(--recursica_ui-kit_components_number-input_properties_icon-text-gap)
118
+ );
119
+ }
120
+
121
+ .input {
122
+ /* Structural Overrides */
123
+ width: 100%;
124
+ box-sizing: border-box;
125
+ margin: 0;
126
+
127
+ /* Box Geometry */
128
+ min-height: var(
129
+ --recursica_ui-kit_components_number-input_properties_min-height
130
+ );
131
+ padding-top: var(
132
+ --recursica_ui-kit_components_number-input_properties_vertical-padding
133
+ );
134
+ padding-bottom: var(
135
+ --recursica_ui-kit_components_number-input_properties_vertical-padding
136
+ );
137
+ padding-left: var(
138
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
139
+ );
140
+ padding-right: var(
141
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
142
+ );
143
+
144
+ outline: none;
145
+ border: none; /* Because root handles border in MUI */
146
+ background: transparent;
147
+ color: inherit;
148
+ height: auto; /* overrides MUI's 1.1876em */
149
+ }
150
+
151
+ .input::placeholder {
152
+ opacity: var(
153
+ --recursica_ui-kit_components_number-input_properties_placeholder-opacity
154
+ );
155
+ color: inherit;
156
+ }
157
+
158
+ /* Dynamic Padding Overrides */
159
+ .root[data-with-left-section="true"] .input {
160
+ padding-left: var(--input-left-section-size);
161
+ }
162
+
163
+ .root[data-with-right-section="true"] .input {
164
+ padding-right: var(--input-right-section-size);
165
+ }
166
+
167
+ /* Flexible End-Caps (Icons, actions) */
168
+ .section {
169
+ display: flex;
170
+ align-items: center;
171
+ height: 100%;
172
+ position: absolute;
173
+ }
174
+
175
+ .section[data-position="left"] {
176
+ justify-content: flex-start;
177
+ left: 0;
178
+ padding-left: var(
179
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
180
+ );
181
+ /* Mantine's native Input.Section slot defaults its own text color to the icon-muted gray
182
+ regardless of whether the slot holds an <svg> or plain text (e.g. a "$"/"%" span) — set it
183
+ here too, not just on :global(svg) below, so non-icon section content matches visually. */
184
+ color: var(
185
+ --recursica_ui-kit_components_number-input_properties_colors_leading-icon
186
+ );
187
+ }
188
+
189
+ .section[data-position="right"] {
190
+ justify-content: flex-end;
191
+ right: 0;
192
+ padding-right: var(
193
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
194
+ );
195
+ color: var(
196
+ --recursica_ui-kit_components_number-input_properties_colors_trailing-icon
197
+ );
198
+ }
199
+
200
+ .section :global(svg) {
201
+ width: var(--recursica_ui-kit_components_number-input_properties_icon-size);
202
+ height: var(--recursica_ui-kit_components_number-input_properties_icon-size);
203
+ }
204
+
205
+ /* -------------------------------------
206
+ CONTROLS (increment/decrement arrows — not currently rendered by this adapter; rules kept
207
+ for structural parity with Mantine's class map and to style them if/when implemented).
208
+ -------------------------------------- */
209
+
210
+ .controls {
211
+ padding-right: var(
212
+ --recursica_ui-kit_components_number-input_properties_horizontal-padding
213
+ );
214
+ }
215
+
216
+ .control {
217
+ border: none;
218
+ background: transparent;
219
+ color: var(
220
+ --recursica_ui-kit_components_number-input_properties_colors_trailing-icon
221
+ );
222
+ }
223
+
224
+ .control:hover {
225
+ background: transparent;
226
+ }
227
+
228
+ /* -------------------------------------
229
+ STATE CASCADE ARCHITECTURE
230
+ -------------------------------------- */
231
+
232
+ /* Focus State Mapping (Triggered internally via browser focus rules) */
233
+ /* The token schema no longer provides per-component focus colors; apply the generic focus ring
234
+ tokens as a box-shadow ring instead of a color swap (matches mantine-adapter reference). */
235
+ .root:focus-within,
236
+ .root:focus {
237
+ box-shadow:
238
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
239
+ var(--recursica_brand_states_focus_color),
240
+ 0 0 var(--recursica_brand_states_focus_blur)
241
+ var(--recursica_brand_states_focus_margin)
242
+ var(--recursica_brand_states_focus_color);
243
+ }
244
+
245
+ /* Error State Mapping (Propagated strictly down from the wrapper DOM context) */
246
+ .root[data-error="true"] {
247
+ border-color: var(
248
+ --recursica_ui-kit_components_number-input_variants_states_error_properties_colors_border-color
249
+ );
250
+ background-color: var(
251
+ --recursica_ui-kit_components_number-input_variants_states_error_properties_colors_background-color
252
+ );
253
+ color: var(
254
+ --recursica_ui-kit_components_number-input_variants_states_error_properties_colors_text-color
255
+ );
256
+ }
257
+
258
+ .root[data-error="true"] .section[data-position="left"] {
259
+ color: var(
260
+ --recursica_ui-kit_components_number-input_variants_states_error_properties_colors_leading-icon
261
+ );
262
+ }
263
+
264
+ .root[data-error="true"] .section[data-position="right"],
265
+ .root[data-error="true"] .control {
266
+ color: var(
267
+ --recursica_ui-kit_components_number-input_variants_states_error_properties_colors_trailing-icon
268
+ );
269
+ }
270
+
271
+ /* Disabled State Mapping (Propagated strictly down from the wrapper DOM context) */
272
+ .root[data-disabled="true"] {
273
+ border-color: var(
274
+ --recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_border-color
275
+ );
276
+ background-color: var(
277
+ --recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_background-color
278
+ );
279
+ color: var(
280
+ --recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_text-color
281
+ );
282
+ opacity: var(
283
+ --recursica_ui-kit_components_number-input_variants_states_disabled_properties_opacity
284
+ );
285
+ cursor: not-allowed;
286
+ }
287
+
288
+ .root[data-disabled="true"] .input {
289
+ cursor: not-allowed;
290
+ }
291
+
292
+ .root[data-disabled="true"] .section[data-position="left"] {
293
+ color: var(
294
+ --recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_leading-icon
295
+ );
296
+ }
297
+
298
+ .root[data-disabled="true"] .section[data-position="right"],
299
+ .root[data-disabled="true"] .control {
300
+ color: var(
301
+ --recursica_ui-kit_components_number-input_variants_states_disabled_properties_colors_trailing-icon
302
+ );
303
+ }