@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,277 @@
1
+ import React, { forwardRef, useEffect, useState } from "react";
2
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
3
+ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
4
+ import {
5
+ TimePicker as MuiTimePicker,
6
+ type TimePickerProps as MuiTimePickerProps,
7
+ } from "@mui/x-date-pickers/TimePicker";
8
+ import dayjs, { type Dayjs } from "dayjs";
9
+ import customParseFormat from "dayjs/plugin/customParseFormat";
10
+ import { type ReadOnlyControlProps } from "@recursica/adapter-common";
11
+ import {
12
+ filterStylingProps,
13
+ type RecursicaOverStyled,
14
+ } from "../../utils/filterStylingProps";
15
+ import { type RecursicaFormControlWrapperProps } from "../FormControlWrapper/FormControlWrapper";
16
+ import { WithReadOnlyWrapper } from "../ReadOnlyField/WithReadOnlyWrapper";
17
+ import { BareDropdown } from "../Dropdown/BareDropdown";
18
+ import styles from "./TimePicker.module.css";
19
+
20
+ import { type RecursicaTimePickerProps as BaseRecursicaTimePickerProps } from "@recursica/adapter-common";
21
+
22
+ // Required for dayjs's 2-arg `dayjs(value, format)` string-parsing signature used by `toDayjs`
23
+ // below — without this, dayjs silently ignores the format string and falls back to native `Date`
24
+ // parsing, which fails on a bare "HH:mm" time string (no date component) and returns an Invalid
25
+ // Date. This went unnoticed until a real initial `value`/`defaultValue` needed parsing (every
26
+ // interactive test before that produced Dayjs objects directly from the field's own onChange,
27
+ // never exercising this path).
28
+ dayjs.extend(customParseFormat);
29
+
30
+ const TIME_FORMAT_SECONDS = "HH:mm:ss";
31
+ const TIME_FORMAT_MINUTES = "HH:mm";
32
+ const AM_PM_DATA = [
33
+ { value: "AM", label: "AM" },
34
+ { value: "PM", label: "PM" },
35
+ ];
36
+
37
+ /** Parses a Recursica "HH:mm" / "HH:mm:ss" string into a Dayjs instance, or undefined if not set. */
38
+ function toDayjs(value: string | undefined): Dayjs | undefined {
39
+ if (!value) return undefined;
40
+ const format = value.length > 5 ? TIME_FORMAT_SECONDS : TIME_FORMAT_MINUTES;
41
+ return dayjs(value, format);
42
+ }
43
+
44
+ /**
45
+ * Formats an "HH:mm"/"HH:mm:ss" 24-hour value as a 12-hour + AM/PM string for read-only display
46
+ * (e.g. "14:30" -> "2:30 PM") — the raw 24-hour string was being shown as-is in read-only mode,
47
+ * with no AM/PM, unlike the interactive composite. Returns undefined if not parseable.
48
+ */
49
+ function formatReadOnlyTime(value: string | undefined): string | undefined {
50
+ const parsed = toDayjs(value);
51
+ if (!parsed) return value;
52
+ return parsed.format(value && value.length > 5 ? "h:mm:ss A" : "h:mm A");
53
+ }
54
+
55
+ export interface RecursicaTimePickerProps
56
+ extends Omit<
57
+ MuiTimePickerProps,
58
+ | "value"
59
+ | "defaultValue"
60
+ | "onChange"
61
+ | "minTime"
62
+ | "maxTime"
63
+ | "views"
64
+ | "format"
65
+ | "style"
66
+ >,
67
+ Pick<
68
+ RecursicaFormControlWrapperProps,
69
+ | "label"
70
+ | "error"
71
+ | "required"
72
+ | "id"
73
+ | "assistiveText"
74
+ | "assistiveWithIcon"
75
+ | "formLayout"
76
+ | "labelSize"
77
+ | "labelAlignment"
78
+ | "labelOptionalText"
79
+ | "labelWithEditIcon"
80
+ | "onLabelEditClick"
81
+ >,
82
+ ReadOnlyControlProps,
83
+ BaseRecursicaTimePickerProps {
84
+ /** Selected time as an "HH:mm" (or "HH:mm:ss" with `withSeconds`) string, matching the mantine-adapter convention. */
85
+ value?: string;
86
+ /** Uncontrolled initial time as an "HH:mm" (or "HH:mm:ss" with `withSeconds`) string. */
87
+ defaultValue?: string;
88
+ /** Fires with the new time as an "HH:mm" (or "HH:mm:ss" with `withSeconds`) string, or `null` if cleared. */
89
+ onChange?: (value: string | null) => void;
90
+ /** Caller-provided inline style, passed through to the FormControlWrapper root. */
91
+ style?: React.CSSProperties;
92
+ }
93
+
94
+ export type TimePickerProps = RecursicaOverStyled<RecursicaTimePickerProps>;
95
+
96
+ export const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(
97
+ function TimePicker(props, ref) {
98
+ const {
99
+ overStyled = false,
100
+ formLayout = "stacked",
101
+
102
+ // Label & Wrapper Maps
103
+ labelSize,
104
+ labelAlignment,
105
+ labelOptionalText,
106
+ labelWithEditIcon,
107
+ onLabelEditClick,
108
+
109
+ label,
110
+ assistiveText,
111
+ assistiveWithIcon,
112
+ error,
113
+ required,
114
+ id,
115
+ className,
116
+ style,
117
+ disabled,
118
+ readOnly,
119
+ readOnlyComponent,
120
+ emptyValueComponent,
121
+ value,
122
+ defaultValue,
123
+ onChange,
124
+ withSeconds,
125
+ minTime,
126
+ maxTime,
127
+ leftSection,
128
+ ...rest
129
+ } = props;
130
+
131
+ const sanitizedProps = filterStylingProps(rest, overStyled);
132
+
133
+ // Internal full 24-hour value. Needed (unlike every other component in this adapter) because
134
+ // the time field and the AM/PM BareDropdown both mutate the same conceptual value — see
135
+ // TIMEPICKER_IMPLEMENTATION_NOTES.md.
136
+ const [internalValue, setInternalValue] = useState<Dayjs | null>(
137
+ () => toDayjs(value) ?? toDayjs(defaultValue) ?? null,
138
+ );
139
+
140
+ useEffect(() => {
141
+ if (value !== undefined) {
142
+ setInternalValue(toDayjs(value) ?? null);
143
+ }
144
+ }, [value]);
145
+
146
+ const isPM = internalValue ? internalValue.hour() >= 12 : false;
147
+
148
+ const wrapperClass = className
149
+ ? `${styles.layoutOverride} ${className}`
150
+ : styles.layoutOverride;
151
+
152
+ const startAdornment = leftSection ? (
153
+ <div className={styles.section} data-position="left">
154
+ {leftSection}
155
+ </div>
156
+ ) : undefined;
157
+
158
+ const emitChange = (next: Dayjs | null) => {
159
+ setInternalValue(next);
160
+ onChange?.(
161
+ next
162
+ ? next.format(withSeconds ? TIME_FORMAT_SECONDS : TIME_FORMAT_MINUTES)
163
+ : null,
164
+ );
165
+ };
166
+
167
+ const handleFieldChange = (next: Dayjs | null) => {
168
+ emitChange(next);
169
+ };
170
+
171
+ const handleMeridiemChange = (next: string | null) => {
172
+ if (!internalValue || !next) return;
173
+ const wantsPM = next === "PM";
174
+ const currentHour = internalValue.hour();
175
+ const currentlyPM = currentHour >= 12;
176
+ if (wantsPM === currentlyPM) return;
177
+ const nextHour = wantsPM ? currentHour + 12 : currentHour - 12;
178
+ emitChange(internalValue.hour(nextHour));
179
+ };
180
+
181
+ return (
182
+ <WithReadOnlyWrapper
183
+ ref={ref}
184
+ className={wrapperClass}
185
+ style={style as React.CSSProperties}
186
+ controlMaxWidth={undefined}
187
+ controlMinWidth={undefined}
188
+ overStyled={overStyled as true}
189
+ formLayout={formLayout}
190
+ labelSize={labelSize}
191
+ labelAlignment={labelAlignment}
192
+ labelOptionalText={labelOptionalText}
193
+ labelWithEditIcon={labelWithEditIcon}
194
+ onLabelEditClick={onLabelEditClick}
195
+ label={label}
196
+ assistiveText={assistiveText}
197
+ assistiveWithIcon={assistiveWithIcon}
198
+ error={error}
199
+ required={required}
200
+ id={id}
201
+ readOnly={readOnly}
202
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
203
+ readOnlyComponent={readOnlyComponent as any}
204
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
+ emptyValueComponent={(emptyValueComponent as any) || undefined}
206
+ readOnlyType="text"
207
+ readOnlyValue={formatReadOnlyTime(
208
+ value !== undefined ? value : defaultValue,
209
+ )}
210
+ readOnlyNativeProps={props}
211
+ activeComponent={
212
+ /* Naked field execution safely decoupled from MUI X's own label/error macro handling.
213
+ format="hh:mm" is always on (12-hour digits, no native meridiem section) — this is the
214
+ only way this component operates, not a user choice. The AM/PM BareDropdown next to it
215
+ is the only AM/PM control; see TIMEPICKER_IMPLEMENTATION_NOTES.md. */
216
+ <div
217
+ className={styles.root}
218
+ data-error={error ? "true" : undefined}
219
+ data-with-left-section={leftSection ? "true" : undefined}
220
+ >
221
+ <LocalizationProvider dateAdapter={AdapterDayjs}>
222
+ <MuiTimePicker
223
+ {...(sanitizedProps as unknown as Partial<MuiTimePickerProps>)}
224
+ value={internalValue}
225
+ onChange={handleFieldChange}
226
+ disabled={disabled}
227
+ format={`hh:${withSeconds ? "mm:ss" : "mm"}`}
228
+ views={
229
+ withSeconds
230
+ ? ["hours", "minutes", "seconds"]
231
+ : ["hours", "minutes"]
232
+ }
233
+ minTime={toDayjs(minTime)}
234
+ maxTime={toDayjs(maxTime)}
235
+ // No open-picker button: the popup clock/list view it opens isn't styled to
236
+ // Recursica tokens (see TIMEPICKER_IMPLEMENTATION_NOTES.md) — showing an affordance
237
+ // to open an unstyled popup would be worse than not showing one. Typing directly
238
+ // into the field's masked hour/minute segments is the only interaction. leftSection
239
+ // (below) is purely decorative, unrelated to this button.
240
+ slots={{ openPickerButton: () => null }}
241
+ slotProps={{
242
+ field: {
243
+ className: styles.field,
244
+ },
245
+ textField: {
246
+ slotProps: {
247
+ input: {
248
+ startAdornment,
249
+ },
250
+ },
251
+ },
252
+ }}
253
+ />
254
+ </LocalizationProvider>
255
+ <BareDropdown
256
+ overStyled
257
+ className={styles.amPmSelect}
258
+ // Dropdown.module.css's own .root sets width: 100% (correct for a standalone
259
+ // Dropdown filling its form-control column) — overStyled lets us override just the
260
+ // width via inline style, keeping every other Recursica style (border, colors,
261
+ // padding) intact. See TIMEPICKER_IMPLEMENTATION_NOTES.md.
262
+ style={{ width: "fit-content" }}
263
+ data={AM_PM_DATA}
264
+ value={isPM ? "PM" : "AM"}
265
+ onChange={handleMeridiemChange}
266
+ disabled={disabled}
267
+ error={!!error}
268
+ aria-label="AM or PM"
269
+ />
270
+ </div>
271
+ }
272
+ />
273
+ );
274
+ },
275
+ );
276
+
277
+ TimePicker.displayName = "TimePicker";
@@ -0,0 +1,61 @@
1
+ # TimePicker - Usage Guide
2
+
3
+ This document describes how to integrate and use the `TimePicker` component in your projects using `@recursica/adapter-mui-v7`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { TimePicker } from "@recursica/adapter-mui-v7";
11
+ ```
12
+
13
+ `TimePicker` requires `@mui/x-date-pickers` (optional peer dependency) to be installed alongside `@mui/material`. See [SETUP.md](../../../SETUP.md).
14
+
15
+ ---
16
+
17
+ ## 2. Basic Example
18
+
19
+ ```tsx
20
+ import React from "react";
21
+ import { TimePicker } from "@recursica/adapter-mui-v7";
22
+
23
+ export default function Demo() {
24
+ return <TimePicker label="Select Time" />;
25
+ }
26
+ ```
27
+
28
+ `TimePicker`'s value is a plain `"HH:mm"` string (matching `@recursica/mantine-adapter`'s convention) — always 24-hour. Pass `withSeconds` to add a seconds segment (`"HH:mm:ss"`), and `minTime`/`maxTime` (in the same string format) to bound the allowed range.
29
+
30
+ ```tsx
31
+ <TimePicker
32
+ label="Precise Time"
33
+ withSeconds
34
+ minTime="09:00:00"
35
+ maxTime="17:00:00"
36
+ onChange={(value) => console.log(value)} // "HH:mm:ss" | null
37
+ />
38
+ ```
39
+
40
+ > [!IMPORTANT] > **Recursica-specific behavior:** `TimePicker` always renders a 12-hour field with a dedicated AM/PM `Dropdown`-style selector next to it — a deviation from `@mui/x-date-pickers`'s own default (24-hour, or a single field with an inline meridiem section) and **not configurable**. There is no prop to switch to a plain 24-hour field; this is the only way the component operates.
41
+
42
+ The AM/PM control visually matches Recursica's `Dropdown` component exactly, rather than a plain native `<select>`.
43
+
44
+ ---
45
+
46
+ ## 3. Design System Integration
47
+
48
+ All Recursica components in the `@recursica/adapter-mui-v7` package adhere strictly to design system spacing, scaling, and behavior patterns.
49
+
50
+ > [!IMPORTANT]
51
+ >
52
+ > - **Anti-override protection**: Rogue style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
53
+ > - **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.
54
+ > - **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.
55
+ > - **Known limitation**: the closed field is fully token-driven; the open clock/list dropdown currently renders with MUI's default styling (no Figma token spec exists for it yet).
56
+
57
+ ---
58
+
59
+ ## 4. Read-Only Mode
60
+
61
+ Pass `readOnly` to render the current value as static text, matching every other Recursica form control. The value is formatted as 12-hour + AM/PM (e.g. `"14:30"` displays as `"2:30 PM"`).
@@ -0,0 +1 @@
1
+ export * from "./TimePicker";
@@ -0,0 +1,42 @@
1
+ # Timeline Implementation Notes
2
+
3
+ ## Architecture
4
+
5
+ Unlike Mantine, `@mui/lab`'s `TimelineItem` has no built-in bullet/connector — it only
6
+ composes whatever you nest inside it. `TimelineItem.tsx` renders `TimelineSeparator` >
7
+ `TimelineDot` (`.itemBullet`) + `TimelineConnector` (`.itemConnector`), and `TimelineContent`
8
+ (`.itemBody`) containing the `title`/description/`timestamp` nodes, to reproduce Mantine's
9
+ single-component bullet + connecting-line structure.
10
+
11
+ - `Timeline.tsx` computes `active`/`isLast` per item (Mui has no `active` concept at all) and
12
+ injects them into each `Timeline.Item` as internal `__active`/`__isLast` props, mirroring
13
+ Mantine's own `cloneElement` pattern for propagating active state down to children.
14
+ - `data-active` / `data-variant` are set directly on `TimelineItem`'s real `li` root and
15
+ consumed via plain descendant selectors (`.item[data-active] .itemBullet`, etc.) in
16
+ `Timeline.module.css` — Mui's `TimelineItem` only defines a `root` classes slot, so (unlike
17
+ Mantine) passing a `classes` object with `item`/`itemBullet`/`itemBody`/... keys is a no-op;
18
+ those class names must be applied as plain `className`s on the elements we render ourselves.
19
+ - The last item omits `TimelineConnector` entirely so no trailing line renders past it.
20
+ - `Timeline.module.css` neutralizes Mui's `TimelineItem::before` opposite-content spacer
21
+ (`flex: 0; padding: 0`), which otherwise pushes the separator/content right since this
22
+ adapter never renders `TimelineOppositeContent`.
23
+
24
+ ## Limitations & Missing Tokens
25
+
26
+ - **Avatar Bullet Size**: There is no specific pixel variable provided for the Avatar bullet size in the UI kit tokens (`avatar-size` evaluates to `"default"`). To maintain exact mathematical centering with the connector line, the CSS falls back to inheriting the `default` bullet size (`20px`) for avatar nodes natively. If users supply a custom sized `img` tag, it must adhere to inline structural constraints or flex mappings.
27
+
28
+ ## Connector fell short of the next bullet (source-of-truth audit, 2026-08-30)
29
+
30
+ `.root` spaces items with a real flex `gap` (`item-gap`) instead of Mui's own zero-gap default,
31
+ so each `<li>` sits with actual whitespace before the next one. `TimelineConnector` is Mui's own
32
+ `flex: 1` element that only fills its _own_ `<li>`'s content height (bounded by `TimelineItem`'s
33
+ row `align-items: stretch` matching `TimelineContent`'s height) — it always ended flush with its
34
+ own item's bottom edge, `item-gap` short of the next item's bullet. Fixed with `margin-bottom:
35
+ calc(-1 * item-gap)` on `.itemConnector`: flexbox's remaining-space distribution accounts for
36
+ margins when growing a `flex: 1` item, so a negative margin here hands the connector that much
37
+ extra grow height while pulling the _container's_ own computed size back in by the same amount —
38
+ net effect, the rendered line's box is genuinely `item-gap` taller and visually reaches the next
39
+ bullet, confirmed via `getBoundingClientRect()` (connector height 58.8px → 90.8px, exactly +32px
40
+ == the `item-gap` token value). Mantine's equivalent isn't a flex gap at all — it overrides
41
+ Mantine's own `--mantine-spacing-xl` (which natively drives both `.item`'s margin-top and the
42
+ connector's negative-bottom bridging offset together) — but the net visual result matches.