@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,346 @@
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
+ /* HARDCODED VALUES
10
+ *
11
+ * 1. track border: none; (we do not use border for the switch track)
12
+ * 2. thumb border: none; (we do not use border for the thumb)
13
+ * 3. .switchBase background-color: transparent; (cancels MUI's built-in primary-color
14
+ * hover/focus circle so only our tokens and our own explicit focus ring show — see
15
+ * SWITCH_IMPLEMENTATION_NOTES.md #5)
16
+ * 4. .track opacity: 1; (cancels MUI's own always-on track opacity — 0.38 unchecked, 0.5
17
+ * checked, both MUI defaults with no equivalent in our tokens; our disabled-state opacity
18
+ * rules below are the only intended dimming)
19
+ */
20
+
21
+ .root {
22
+ /* Provide a stable cursor when not disabled */
23
+ cursor: pointer;
24
+ }
25
+
26
+ .root:has(input:disabled) {
27
+ cursor: not-allowed;
28
+ }
29
+
30
+ /* Sizes MUI's actual switch root span (mapped via classes.root — MUI requires that exact key,
31
+ but the class name it points to is ours). Kept separate from .root above: when a label is
32
+ present, .root is applied to *this component's own outer wrapper div* (switch + label side
33
+ by side), not to the switch itself — giving both the same box-model rules would squeeze that
34
+ wrapper (and the label inside it) down to the track's own width. See
35
+ SWITCH_IMPLEMENTATION_NOTES.md #5. */
36
+ .switchRoot {
37
+ /* Cancel MUI's own hardcoded root box (width: 58px, height: 38px, padding: 12px,
38
+ overflow: hidden for the medium size) — without this the track/thumb tokens below get
39
+ clipped/shrunk to MUI's default geometry instead of driving the real size. */
40
+ width: var(--recursica_ui-kit_components_switch_properties_track-width);
41
+ height: calc(
42
+ var(--recursica_ui-kit_components_switch_properties_thumb-height) +
43
+ (
44
+ var(
45
+ --recursica_ui-kit_components_switch_properties_track-inner-padding
46
+ ) *
47
+ 2
48
+ )
49
+ );
50
+ padding: 0;
51
+ overflow: visible;
52
+
53
+ --switch-track-padding: var(
54
+ --recursica_ui-kit_components_switch_properties_track-inner-padding
55
+ );
56
+ --switch-thumb-width: var(
57
+ --recursica_ui-kit_components_switch_properties_thumb-width
58
+ );
59
+ --switch-thumb-height: var(
60
+ --recursica_ui-kit_components_switch_properties_thumb-height
61
+ );
62
+ --switch-track-width: var(
63
+ --recursica_ui-kit_components_switch_properties_track-width
64
+ );
65
+ }
66
+
67
+ /* Track/thumb dim per selection state; label dims via its own (single, state-agnostic) token */
68
+ /* In mantine-adapter, .thumb nests inside .track, so dimming .track's opacity visually dims
69
+ the thumb too "for free". MUI's DOM has .track and .thumb as siblings (documented
70
+ structural difference, see SWITCH_IMPLEMENTATION_NOTES.md), so the same selector only dimmed
71
+ the track — the thumb stayed at full color/opacity. Each selector targets both explicitly. */
72
+ .root:has(input:checked:disabled) .track,
73
+ .root:has(input:checked:disabled) .thumb {
74
+ opacity: var(
75
+ --recursica_ui-kit_components_switch_variants_selection-states_selected_variants_states_disabled_properties_opacity
76
+ );
77
+ }
78
+ .root:has(input:disabled):not(:has(input:checked)) .track,
79
+ .root:has(input:disabled):not(:has(input:checked)) .thumb {
80
+ opacity: var(
81
+ --recursica_ui-kit_components_switch_variants_selection-states_unselected_variants_states_disabled_properties_opacity
82
+ );
83
+ }
84
+
85
+ .body {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: var(--recursica_ui-kit_components_switch-item_properties_label-gap);
89
+ }
90
+
91
+ /* HARDCODE: disable native hover color transitions applied by Mantine */
92
+ .track:hover {
93
+ background-color: var(
94
+ --recursica_ui-kit_components_switch_variants_selection-states_unselected_properties_colors_track-color
95
+ );
96
+ }
97
+ .root:has(input:checked) .track:hover {
98
+ background-color: var(
99
+ --recursica_ui-kit_components_switch_variants_selection-states_selected_properties_colors_track-color
100
+ );
101
+ }
102
+
103
+ .track {
104
+ width: var(--switch-track-width);
105
+ height: calc(var(--switch-thumb-height) + (var(--switch-track-padding) * 2));
106
+ border-radius: var(
107
+ --recursica_ui-kit_components_switch_properties_track-border-radius
108
+ );
109
+ background-color: var(
110
+ --recursica_ui-kit_components_switch_variants_selection-states_unselected_properties_colors_track-color
111
+ );
112
+ box-shadow: var(
113
+ --recursica_ui-kit_components_switch_properties_track-elevation
114
+ );
115
+ border: none; /* HARDCODE */
116
+ opacity: 1; /* HARDCODE */
117
+ box-sizing: border-box;
118
+ transition: background-color 150ms ease;
119
+ cursor: inherit;
120
+ }
121
+
122
+ .root:has(input:checked) .track {
123
+ background-color: var(
124
+ --recursica_ui-kit_components_switch_variants_selection-states_selected_properties_colors_track-color
125
+ );
126
+ border-color: transparent;
127
+ /* HARDCODE #4: MUI's own checked-state selector (`.Mui-checked + .track { opacity: 0.5 }`)
128
+ is more specific than the base .track rule above, so it still wins there — needs its own
129
+ override here too. */
130
+ opacity: 1;
131
+ }
132
+
133
+ /* Positions/sizes the thumb's clickable hit area (MUI's internal SwitchBase). MUI's own
134
+ defaults here (padding: 9px; top/left: 0) are calibrated for its own hardcoded 20px thumb
135
+ and 58x38 root — meaningless against our tokens, so every dimension is replaced. The thumb
136
+ itself (the visible circle) renders as this element's only child, sized by .thumb below;
137
+ with padding: 0 and matching width/height, .switchBase and .thumb become the same box, so
138
+ the thumb sits flush inside the track's own inner padding. See
139
+ SWITCH_IMPLEMENTATION_NOTES.md #5. */
140
+ .switchBase {
141
+ top: var(--switch-track-padding);
142
+ left: var(--switch-track-padding);
143
+ width: var(--switch-thumb-width);
144
+ height: var(--switch-thumb-height);
145
+ padding: 0;
146
+ box-sizing: border-box;
147
+ }
148
+
149
+ .switchBase:hover,
150
+ .switchBase:global(.Mui-focusVisible) {
151
+ background-color: transparent; /* HARDCODE */
152
+ }
153
+
154
+ /* Focus ring reads on the whole visible track (the pill), not the thumb's small 20x20 hit-area
155
+ circle .switchBase actually is — .switchBase and .track are siblings under .switchRoot (in
156
+ that DOM order), so the ring is drawn on .track via the general sibling combinator when the
157
+ hit area is focus-visible. */
158
+ .switchBase:global(.Mui-focusVisible) ~ .track {
159
+ outline: var(--recursica_brand_states_focus_border-size) solid
160
+ var(--recursica_brand_states_focus_color);
161
+ outline-offset: var(--recursica_brand_states_focus_margin);
162
+ box-shadow: 0 0 var(--recursica_brand_states_focus_blur)
163
+ var(--recursica_brand_states_focus_color);
164
+ }
165
+
166
+ /* Moves the thumb from resting-left to resting-right. MUI hardcodes this same transform to
167
+ translateX(20px) for its own default thumb; ours is calculated from our tokens instead —
168
+ the exact distance between the thumb's checked and unchecked resting positions inside the
169
+ track's inner padding. .Mui-checked is MUI's own global state class (not a CSS Modules
170
+ local class), so it must be wrapped in :global() — same as Accordion's .Mui-expanded and
171
+ Button's .Mui-disabled — or the build hashes/scopes it into a name that never matches the
172
+ real DOM. */
173
+ .switchBase:global(.Mui-checked) {
174
+ transform: translateX(
175
+ calc(
176
+ var(--switch-track-width) - var(--switch-thumb-width) -
177
+ (var(--switch-track-padding) * 2)
178
+ )
179
+ );
180
+ }
181
+
182
+ .thumb {
183
+ width: var(--switch-thumb-width);
184
+ height: var(--switch-thumb-height);
185
+ border-radius: var(
186
+ --recursica_ui-kit_components_switch_properties_thumb-border-radius
187
+ );
188
+ background-color: var(
189
+ --recursica_ui-kit_components_switch_variants_selection-states_unselected_properties_colors_thumb-color
190
+ );
191
+ box-shadow: var(
192
+ --recursica_ui-kit_components_switch_properties_thumb-elevation
193
+ );
194
+ border: none; /* HARDCODE */
195
+
196
+ transition: background-color 150ms ease;
197
+ }
198
+
199
+ .root:has(input:checked) .thumb {
200
+ background-color: var(
201
+ --recursica_ui-kit_components_switch_variants_selection-states_selected_properties_colors_thumb-color
202
+ );
203
+ }
204
+
205
+ .thumbIconWrapper {
206
+ display: flex;
207
+ align-items: center;
208
+ justify-content: center;
209
+ width: 100%;
210
+ height: 100%;
211
+ position: relative;
212
+ }
213
+
214
+ .checkIcon,
215
+ .closeIcon {
216
+ width: var(--recursica_ui-kit_components_switch_properties_thumb-icon-size);
217
+ height: var(--recursica_ui-kit_components_switch_properties_thumb-icon-size);
218
+ position: absolute;
219
+ transition:
220
+ opacity 150ms ease,
221
+ transform 150ms ease;
222
+ }
223
+
224
+ /* Unchecked state */
225
+ .checkIcon {
226
+ opacity: 0;
227
+ transform: scale(0.5);
228
+ color: var(
229
+ --recursica_ui-kit_components_switch_variants_selection-states_selected_properties_colors_icon-color
230
+ );
231
+ }
232
+
233
+ .closeIcon {
234
+ opacity: 1;
235
+ transform: scale(1);
236
+ color: var(
237
+ --recursica_ui-kit_components_switch_variants_selection-states_unselected_properties_colors_icon-color
238
+ );
239
+ }
240
+
241
+ /* Checked state — same :has() scoping already used for track/thumb color above; .thumb isn't
242
+ a sibling of input here (MUI nests both under switchBase), but :has() only needs input:checked
243
+ to be a descendant of .root, so this still scopes correctly. */
244
+ .root:has(input:checked) .thumb .checkIcon {
245
+ opacity: 1;
246
+ transform: scale(1);
247
+ }
248
+
249
+ .root:has(input:checked) .thumb .closeIcon {
250
+ opacity: 0;
251
+ transform: scale(0.5);
252
+ }
253
+
254
+ .labelWrapper {
255
+ display: flex;
256
+ flex-direction: column;
257
+ max-width: var(
258
+ --recursica_ui-kit_components_switch-item_properties_label-max-width
259
+ );
260
+ }
261
+ .root:has(input:disabled) .labelWrapper {
262
+ opacity: var(
263
+ --recursica_ui-kit_components_switch-item_variants_states_disabled_properties_opacity
264
+ );
265
+ }
266
+
267
+ .label {
268
+ font-family: var(
269
+ --recursica_ui-kit_components_switch-item_properties_text_font-family
270
+ );
271
+ font-size: var(
272
+ --recursica_ui-kit_components_switch-item_properties_text_font-size
273
+ );
274
+ font-weight: var(
275
+ --recursica_ui-kit_components_switch-item_properties_text_font-weight
276
+ );
277
+ font-style: var(
278
+ --recursica_ui-kit_components_switch-item_properties_text_font-style
279
+ );
280
+ line-height: var(
281
+ --recursica_ui-kit_components_switch-item_properties_text_line-height
282
+ );
283
+ letter-spacing: var(
284
+ --recursica_ui-kit_components_switch-item_properties_text_letter-spacing
285
+ );
286
+ text-transform: var(
287
+ --recursica_ui-kit_components_switch-item_properties_text_text-transform
288
+ );
289
+ text-decoration: var(
290
+ --recursica_ui-kit_components_switch-item_properties_text_text-decoration
291
+ );
292
+ color: var(
293
+ --recursica_ui-kit_components_switch-item_properties_colors_text-color
294
+ );
295
+ cursor: inherit;
296
+ }
297
+
298
+ .root:has(input:disabled) .label {
299
+ color: var(
300
+ --recursica_ui-kit_components_switch-item_properties_colors_disabled-text
301
+ );
302
+ }
303
+
304
+ /* description/error text renders via AssistiveElement directly (see Switch.tsx) —
305
+ it owns its own tokenized styling. AssistiveElement has no disabled state and
306
+ must never dim. */
307
+
308
+ /* --- GROUP STYLES --- */
309
+ .groupRoot {
310
+ display: flex;
311
+ flex-direction: column;
312
+ align-items: flex-start;
313
+ padding: var(--recursica_ui-kit_components_switch-group_properties_padding);
314
+ gap: var(--recursica_ui-kit_components_switch-group_properties_item-gap);
315
+ }
316
+
317
+ /* SideBySide Variant */
318
+ .groupRoot[data-layout="side-by-side"] {
319
+ flex-direction: column;
320
+ gap: var(
321
+ --recursica_ui-kit_components_switch-group_variants_layouts_side-by-side_properties_gutter
322
+ );
323
+ padding-top: var(
324
+ --recursica_ui-kit_components_switch-group_variants_layouts_side-by-side_properties_vertical-padding
325
+ );
326
+ padding-bottom: var(
327
+ --recursica_ui-kit_components_switch-group_variants_layouts_side-by-side_properties_vertical-padding
328
+ );
329
+ margin-top: var(
330
+ --recursica_ui-kit_components_switch-group_variants_layouts_side-by-side_properties_top-bottom-margin
331
+ );
332
+ margin-bottom: var(
333
+ --recursica_ui-kit_components_switch-group_variants_layouts_side-by-side_properties_top-bottom-margin
334
+ );
335
+ }
336
+
337
+ /* Stacked Variant */
338
+ .groupRoot[data-layout="stacked"] {
339
+ flex-direction: column;
340
+ margin-top: var(
341
+ --recursica_ui-kit_components_switch-group_variants_layouts_stacked_properties_label-field-gap
342
+ );
343
+ margin-bottom: var(
344
+ --recursica_ui-kit_components_switch-group_variants_layouts_stacked_properties_top-bottom-margin
345
+ );
346
+ }
@@ -0,0 +1,114 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Switch } from "./Switch";
3
+ import { Stack } from "../Stack/Stack";
4
+
5
+ const meta: Meta<typeof Switch> = {
6
+ title: "UI-Kit/Switch",
7
+ component: Switch,
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: `
13
+ The \`Switch\` component is an atomic form primitive representing boolean states, natively aligned to the Recursica design system.
14
+
15
+ > [!IMPORTANT]
16
+ > Unlike \`Checkbox\`, the \`Switch\` is typically used for standalone settings toggles. It fully supports the universal \`ReadOnlyField\` boundaries when passed the \`readOnly\` attribute.
17
+
18
+ ### Usage
19
+ To render a standard switch:
20
+ \`\`\`tsx
21
+ <Switch label="Enable Notifications" defaultChecked />
22
+ \`\`\`
23
+ `,
24
+ },
25
+ },
26
+ },
27
+ argTypes: {
28
+ checked: {
29
+ control: "boolean",
30
+ },
31
+ disabled: {
32
+ control: "boolean",
33
+ },
34
+ required: {
35
+ control: "boolean",
36
+ },
37
+ error: {
38
+ control: "boolean",
39
+ },
40
+ defaultChecked: {
41
+ control: "boolean",
42
+ },
43
+ readOnly: {
44
+ control: "boolean",
45
+ description:
46
+ "Toggles structural read-only data presentation bypassing interaction boundaries completely.",
47
+ },
48
+ controlMaxWidth: { table: { disable: true } },
49
+ controlMinWidth: { table: { disable: true } },
50
+ emptyValueComponent: { table: { disable: true } },
51
+ },
52
+ };
53
+
54
+ export default meta;
55
+
56
+ type Story = StoryObj<typeof Switch>;
57
+
58
+ export const Default: Story = {
59
+ args: {
60
+ disabled: false,
61
+ label: "Standard Switch",
62
+ },
63
+ // We explicitly destructure global Storybook injected arguments so they do not leak into the DOM natively.
64
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
65
+ render: ({ withLayer, layer, ...args }: any) => <Switch {...args} />,
66
+ };
67
+
68
+ export const SideBySideLayout: Story = {
69
+ args: {
70
+ label: "Opt-in form alignment",
71
+ formLayout: "side-by-side",
72
+ },
73
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
74
+ render: ({ withLayer, layer, ...args }: any) => <Switch {...args} />,
75
+ };
76
+
77
+ export const StaticVariations: Story = {
78
+ args: {},
79
+ render: () => (
80
+ <Stack spacing="rec-xl">
81
+ <Switch label="Default Unchecked State" />
82
+ <Switch label="Checked State" defaultChecked />
83
+ <Switch label="Disabled Unchecked" disabled />
84
+ <Switch label="Disabled Checked" defaultChecked disabled />
85
+ </Stack>
86
+ ),
87
+ };
88
+
89
+ export const ReadOnly: Story = {
90
+ args: {
91
+ ...Default.args,
92
+ readOnly: true,
93
+ },
94
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
95
+ render: ({ withLayer, layer, ...args }: any) => <Switch {...args} />,
96
+ };
97
+
98
+ export const CustomReadOnly: Story = {
99
+ args: {
100
+ ...Default.args,
101
+ readOnly: true,
102
+ },
103
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
104
+ render: ({ withLayer, layer, ...args }: any) => (
105
+ <Switch
106
+ {...args}
107
+ readOnlyComponent={({ checked, label }) => (
108
+ <span style={{ fontWeight: "bold", color: checked ? "green" : "red" }}>
109
+ {label} {checked ? "ENABLED" : "DISABLED"}
110
+ </span>
111
+ )}
112
+ />
113
+ ),
114
+ };
@@ -0,0 +1 @@
1
+ // Placeholder for future Switch component tests. Add tests here if/when needed.