@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,55 @@
1
+ # Slider Implementation Notes
2
+
3
+ This document contains specific design decisions, architectural constraints, and hacks required to bridge the Recursica design system with MUI's underlying `Slider` primitive.
4
+
5
+ ## 1. Pointer Clicks Falsely Trigger MUI's `Mui-focusVisible` Ring
6
+
7
+ **Symptom:** Clicking or dragging the thumb showed the keyboard focus ring, which Mantine never shows for a plain mouse interaction.
8
+
9
+ **Root cause:** MUI's `Slider` always programmatically re-focuses its hidden native `<input type="range">` on pointer-down (`focusThumb()` in `useSlider`). Because the focus target (`<input>`) differs from the element the pointer actually interacted with, and because a script-driven `.focus()` call is what browsers use to decide visibility, the native `:focus-visible` heuristic (which MUI's own `isFocusVisible` check relies on) resolves to `true` even for a plain click. Mantine's thumb is a plain `<div tabIndex>` that receives real native focus directly from the click, so the same heuristic correctly resolves to `false` there.
10
+
11
+ **Fix:** `Slider.tsx` tracks pointer-vs-keyboard itself (`onMouseDown` sets a ref, `onFocus` reads it to flag `suppressFocusRing`, `onKeyDown`/`onBlur` clear it — mirroring how real `:focus-visible` re-evaluates on a subsequent keypress). `Slider.module.css` only paints the ring when `[data-suppress-focus-ring="true"]` is absent from `.sliderContainer`.
12
+
13
+ ## 2. Disabled Track Stayed Red
14
+
15
+ **Symptom:** Once `disabled` was wired through correctly, the filled track (`.sliderBar`) still rendered the active/red color instead of the disabled grey token.
16
+
17
+ **Root cause:** The base `.sliderBar` rule had `background-color: ... !important`, so the (non-`!important`) `[data-disabled="true"] .sliderBar` override could never win the cascade regardless of source order.
18
+
19
+ **Fix:** Removed the unneeded `!important` flags from the base `.sliderBar` rule — `injectFirst` already makes our CSS-module class beat MUI's native `.MuiSlider-track` via source order alone (same as `.sliderTrack`/`.sliderThumb`/`.sliderMark`, none of which need `!important`).
20
+
21
+ ## 3. Assistive Text Rendered as `<div>` Instead of `<span>`
22
+
23
+ **Root cause:** `AssistiveElement.tsx` (adapter-mui-v7) hardcoded a `<div>` around the children text; Mantine's equivalent uses a `<span>`. Not shared via `adapter-common` — each adapter has its own `AssistiveElement`.
24
+
25
+ **Fix:** Changed the inner text wrapper to a `<span>`. No CSS selector depended on the element type (`.text` is a class-only selector and remains a valid flex item as a span).
26
+
27
+ ## 4. Mark Label Color
28
+
29
+ **Root cause:** MUI's `.sliderMarkLabel` already inherited the container text color using the min-max-label typography tokens. Mantine's equivalent class (`styles.sliderMarkLabel`) was referenced in `Slider.tsx`'s `classNames` map but was never defined in Mantine's `Slider.module.css`, so Mantine silently fell back to its own default theme grey instead of any recursica token. Fixed in `mantine-adapter` by adding the missing `.sliderMarkLabel` rule (same tokens/inherit-color approach as MUI) rather than copying Mantine's undefined behavior into MUI.
30
+
31
+ ## 5. Formatted Current Value, Label Overrides, Trailing Icon
32
+
33
+ **Symptom:** `.currentValue` always rendered the raw numeric value, even when `tooltipLabel` was a formatter function (already used for MUI's own `valueLabelFormat`) — a caller mapping values onto custom text got the formatted tooltip while dragging but the raw number next to the track otherwise. Same bug as `mantine-adapter`.
34
+
35
+ **Fix:** `.currentValue` now runs `resolvedValue` through `tooltipLabel` when it's a function, reusing the same formatter passed to `valueLabelFormat`. Added `minLabel`/`maxLabel` (new `adapter-common` props) to override the `.minMaxGuide` text at either end of the track, and `trailingIcon` (new `adapter-common` prop) to render a second icon opposite the existing `icon`, reusing the same `.iconWrapper` styling.
36
+
37
+ ## 6. Dual-Thumb / Range Support
38
+
39
+ **Decision:** Previously requested and declined (see git history for this section) as no use case needed it; reopened with a full spec and implemented. `value`/`defaultValue`/`onChange`/`onChangeEnd` are now typed `number | [number, number]` in `@recursica/adapter-common`'s `RecursicaSliderProps`.
40
+ **Implementation:**
41
+
42
+ - MUI's `Slider` already accepts `number[]` for `value`/`onChange` and renders two thumbs natively, so unlike `mantine-adapter` (which must swap to a separate `RangeSlider` component) this stays the same `<MuiSlider>` — arrays are no longer collapsed to `value[0]`.
43
+ - Internal state (`internalValue`, `resolvedValue`, `inputValue`) generalized from `number` to `number | [number, number]`; range-mode input handlers (`handleLowerInputChange`/`handleUpperInputChange`) clamp each thumb against the other's current value (not the shared `min`/`max`) so the two inputs can't cross.
44
+ - `SliderReadOnlyValue` and the floating `.currentValue` display both render `"lower – upper"` for a range value, running each side through `tooltipLabel` independently (`valueLabelFormat` already handled this per-thumb natively, unchanged).
45
+ - DOM order in range mode (input → leading icon → min label → track → max label → trailing icon → input) mirrors Forge's own Material/Carbon range layouts — see §7 below.
46
+
47
+ ## 7. Trailing Icon Order Relative to the Input Field
48
+
49
+ **Decision:** `trailingIcon` previously rendered after the numeric input (`... max label, input, trailing icon`), reversed from Forge's Material/Carbon kits, which always render the trailing icon directly after the max label and before the input.
50
+ **Implementation:** Moved `{trailingIconEl}` before the `showInput` input block in the single-value layout; the range layout was built with this order from the start (input → icon → min label → track → max label → trailing icon → input).
51
+
52
+ ## 8. Mark Vertically Off-Center
53
+
54
+ **Decision:** MUI's own mark is `top: 50%; transform: translate(-1px, -50%)` — the `-1px` assumes MUI's built-in 2px dot, the `-50%` is real vertical centering. `.sliderMark` overrode `transform` to `translateX(-50%)` (horizontal-only, meant to mirror the mantine-adapter) without noticing it dropped MUI's vertical `-50%`, leaving the dot hanging below the track's midpoint instead of centered.
55
+ **Implementation:** Changed `.sliderMark`'s transform to `translate(-50%, -50%)` — keeps MUI's vertical centering and swaps the horizontal term to properly center our (non-2px) `step-indicator-width` instead of MUI's hardcoded 1px.
@@ -0,0 +1,635 @@
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
+ /*
10
+ * HARDCODED VALUES:
11
+ * - display: flex; align-items: center; width: 100%; (Standard CSS flexbox layouts for bidirectional components)
12
+ * - flex-grow: 1; flex-shrink: 0; (Layout control structures)
13
+ * - transform: translate(-50%, -50%); on .sliderMark (preserves MUI's own vertical mark
14
+ * centering while re-deriving the horizontal offset for our step-indicator-width token — see
15
+ * .sliderMark below)
16
+ * - transform: translateX(-50%); on .sliderMarkLabel (horizontal-only; matches Mantine's offset
17
+ * mechanism)
18
+ * - outline: none; border-style: solid; (Standard focus reset and border outlines)
19
+ * - Focus ring on thumb/input: the token schema no longer provides per-component focus
20
+ * colors for these (only `active` covers track/step-indicator-color). We apply the generic
21
+ * --recursica_brand_states_focus_* ring tokens (border-size/color/margin/blur) as a box-shadow
22
+ * ring instead of a color swap.
23
+ * - Focus ring on thumb is applied via MUI's own `Mui-focusVisible` class (not native
24
+ * `:focus`/`:focus-visible`, which never match the thumb span — see inline comment).
25
+ */
26
+
27
+ /* ==========================================
28
+ 1. Baseline, Reset & Layout Overrides
29
+ ========================================== */
30
+
31
+ /* Stacked Layout Spacing Override */
32
+ .layoutOverride {
33
+ --form-control-margin-bottom: var(
34
+ --recursica_ui-kit_components_slider_variants_layouts_stacked_properties_top-bottom-margin
35
+ );
36
+ }
37
+
38
+ /* Side-by-Side Layout Spacing Override */
39
+ .layoutOverride[data-form-layout="side-by-side"] {
40
+ --form-control-margin-bottom: var(
41
+ --recursica_ui-kit_components_slider_variants_layouts_side-by-side_properties_top-bottom-margin
42
+ );
43
+ }
44
+
45
+ .sliderContainer {
46
+ display: flex;
47
+ align-items: center;
48
+ width: 100%;
49
+ box-sizing: border-box;
50
+ gap: var(--recursica_ui-kit_components_slider_properties_input-gap);
51
+ color: var(--form-field-text-valued);
52
+ }
53
+
54
+ .sliderTrackWrapper {
55
+ flex-grow: 1;
56
+ display: flex;
57
+ flex-direction: column;
58
+ box-sizing: border-box;
59
+ }
60
+
61
+ .iconWrapper {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ flex-shrink: 0;
66
+ width: var(--recursica_ui-kit_components_slider_properties_icon-size);
67
+ height: var(--recursica_ui-kit_components_slider_properties_icon-size);
68
+ color: var(--recursica_ui-kit_components_slider_properties_colors_icon-color);
69
+ }
70
+
71
+ /* ==========================================
72
+ 2. Slider Tracks, Bars, Thumbs, and Marks
73
+ ========================================== */
74
+
75
+ .sliderRoot {
76
+ width: 100%;
77
+ box-sizing: border-box;
78
+ color: inherit;
79
+ font-family: inherit;
80
+ font-size: inherit;
81
+ padding: 0;
82
+ margin: 0;
83
+ }
84
+
85
+ .sliderTrack {
86
+ height: var(--recursica_ui-kit_components_slider_properties_track-height);
87
+ border-radius: var(
88
+ --recursica_ui-kit_components_slider_properties_track-border-radius
89
+ );
90
+ background-color: var(
91
+ --recursica_ui-kit_components_slider_properties_colors_track
92
+ );
93
+ }
94
+
95
+ .sliderBar {
96
+ height: var(--recursica_ui-kit_components_slider_properties_track-height);
97
+ border-radius: var(
98
+ --recursica_ui-kit_components_slider_properties_track-border-radius
99
+ );
100
+ background-color: var(
101
+ --recursica_ui-kit_components_slider_properties_colors_track-active
102
+ );
103
+ border: none;
104
+ }
105
+
106
+ .sliderThumb {
107
+ box-sizing: border-box;
108
+ width: var(--recursica_ui-kit_components_slider_properties_thumb-size);
109
+ height: var(--recursica_ui-kit_components_slider_properties_thumb-size);
110
+ border-radius: var(
111
+ --recursica_ui-kit_components_slider_properties_thumb-border-radius
112
+ );
113
+ box-shadow: var(
114
+ --recursica_ui-kit_components_slider_properties_thumb-elevation
115
+ );
116
+ background-color: var(
117
+ --recursica_ui-kit_components_slider_properties_colors_thumb
118
+ );
119
+ border: none;
120
+ cursor: pointer;
121
+ outline: none;
122
+ }
123
+
124
+ .sliderThumb:hover {
125
+ /* Reset MUI's default hover ring (box-shadow) */
126
+ box-shadow: var(
127
+ --recursica_ui-kit_components_slider_properties_thumb-elevation
128
+ );
129
+ }
130
+
131
+ /*
132
+ * MUI toggles its own `Mui-focusVisible` class on the thumb (for both keyboard focus and
133
+ * mouse-driven dragging, since MUI's slider routes real DOM focus to a hidden native input,
134
+ * never the visible thumb span) and pairs it with a hardcoded `theme.palette.primary.main`
135
+ * box-shadow ring. Native `:focus`/`:focus-visible` never match the thumb span itself, so we
136
+ * target MUI's own class directly to replace its default-blue ring with the recursica ring.
137
+ *
138
+ * MUI also always programmatically re-focuses that hidden input on pointer interaction, which
139
+ * browsers' `:focus-visible` heuristic treats as keyboard-visible — unlike Mantine's plain div
140
+ * thumb, where a real click correctly resolves to a non-visible focus. `data-suppress-focus-ring`
141
+ * (set in Slider.tsx by tracking pointer-vs-keyboard ourselves) keeps the ring keyboard-only,
142
+ * matching Mantine.
143
+ */
144
+ .sliderContainer:not([data-suppress-focus-ring="true"])
145
+ .sliderThumb:global(.Mui-focusVisible) {
146
+ outline: none;
147
+ box-shadow:
148
+ var(--recursica_ui-kit_components_slider_properties_thumb-elevation),
149
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
150
+ var(--recursica_brand_states_focus_color),
151
+ 0 0 var(--recursica_brand_states_focus_blur)
152
+ var(--recursica_brand_states_focus_margin)
153
+ var(--recursica_brand_states_focus_color);
154
+ }
155
+
156
+ .sliderContainer[data-suppress-focus-ring="true"]
157
+ .sliderThumb:global(.Mui-focusVisible) {
158
+ outline: none;
159
+ box-shadow: var(
160
+ --recursica_ui-kit_components_slider_properties_thumb-elevation
161
+ );
162
+ }
163
+
164
+ .sliderMark {
165
+ box-sizing: border-box;
166
+ width: var(
167
+ --recursica_ui-kit_components_slider_properties_step-indicator-width
168
+ );
169
+ height: var(
170
+ --recursica_ui-kit_components_slider_properties_step-indicator-width
171
+ );
172
+ border-radius: var(
173
+ --recursica_ui-kit_components_slider_properties_step-indicator-border-radius
174
+ );
175
+ background-color: var(
176
+ --recursica_ui-kit_components_slider_properties_colors_step-indicator-color
177
+ );
178
+ /* MUI's own mark is `top: 50%; transform: translate(-1px, -50%)` — the -1px assumes its
179
+ built-in 2px-wide dot and the -50% is real vertical centering, not decoration. Overriding
180
+ width/height above without preserving that vertical -50% would leave the dot vertically
181
+ un-centered (it would hang below the track's midpoint); translateX(-50%) alone stomped it.
182
+ translate(-50%, -50%) keeps the vertical centering and swaps the horizontal offset to match
183
+ our (non-2px) step-indicator-width. */
184
+ transform: translate(-50%, -50%);
185
+ border: none;
186
+ }
187
+
188
+ .sliderMark[data-filled] {
189
+ /* No default-state "-active" step-indicator token exists anymore (only disabled/error define
190
+ one); reusing the active-track color keeps filled marks visually tied to the filled track. */
191
+ background-color: var(
192
+ --recursica_ui-kit_components_slider_properties_colors_track-active
193
+ );
194
+ }
195
+
196
+ /*
197
+ * MUI's default markLabel sits ~30-40px below the mark (`top: 30`, `top: 40` under
198
+ * `(pointer: coarse)`) and uses `theme.palette.text.secondary`. Mantine's equivalent label sits
199
+ * right under the mark (a half-step-indicator offset plus a small gap) and has no explicit color,
200
+ * inheriting the container's text color. Reusing the min-max-label typography tokens (the closest
201
+ * existing "small label near the track" token set) and inheriting color keeps this visually
202
+ * consistent with Mantine without a dedicated mark-label token.
203
+ */
204
+ .sliderMarkLabel {
205
+ top: calc(
206
+ var(--recursica_ui-kit_components_slider_properties_step-indicator-width) /
207
+ 2 +
208
+ var(--recursica_ui-kit_globals_form_properties_label-field-gap-vertical)
209
+ );
210
+ transform: translateX(-50%);
211
+ color: inherit;
212
+
213
+ font-family: var(
214
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-family
215
+ );
216
+ font-size: var(
217
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-size
218
+ );
219
+ font-style: var(
220
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-style
221
+ );
222
+ font-weight: var(
223
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-weight
224
+ );
225
+ letter-spacing: var(
226
+ --recursica_ui-kit_components_slider_properties_min-max-label_letter-spacing
227
+ );
228
+ line-height: var(
229
+ --recursica_ui-kit_components_slider_properties_min-max-label_line-height
230
+ );
231
+ text-decoration: var(
232
+ --recursica_ui-kit_components_slider_properties_min-max-label_text-decoration
233
+ );
234
+ text-transform: var(
235
+ --recursica_ui-kit_components_slider_properties_min-max-label_text-transform
236
+ );
237
+ }
238
+
239
+ .sliderTooltip {
240
+ background-color: var(--form-field-text-valued) !important;
241
+ color: var(--form-field-background) !important;
242
+ font-size: 12px !important;
243
+ font-weight: 500 !important;
244
+ padding: 4px 8px !important;
245
+ border-radius: 4px !important;
246
+
247
+ /* Reset MUI's default teardrop transform styling */
248
+ transform: translateY(-100%) !important;
249
+ display: flex !important;
250
+ align-items: center !important;
251
+ justify-content: center !important;
252
+ }
253
+
254
+ .sliderTooltip * {
255
+ /* Prevent MUI's internal rotation hack */
256
+ transform: none !important;
257
+ }
258
+
259
+ .sliderTooltip::before {
260
+ /* Hide the default MUI teardrop arrow (if v5 uses before) */
261
+ display: none !important;
262
+ }
263
+
264
+ /* ==========================================
265
+ 3. Min / Max Custom Typography Labels & Floating Active Value
266
+ ========================================== */
267
+
268
+ .minMaxGuide {
269
+ font-family: var(
270
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-family
271
+ );
272
+ font-size: var(
273
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-size
274
+ );
275
+ font-style: var(
276
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-style
277
+ );
278
+ font-weight: var(
279
+ --recursica_ui-kit_components_slider_properties_min-max-label_font-weight
280
+ );
281
+ letter-spacing: var(
282
+ --recursica_ui-kit_components_slider_properties_min-max-label_letter-spacing
283
+ );
284
+ line-height: var(
285
+ --recursica_ui-kit_components_slider_properties_min-max-label_line-height
286
+ );
287
+ text-decoration: var(
288
+ --recursica_ui-kit_components_slider_properties_min-max-label_text-decoration
289
+ );
290
+ text-transform: var(
291
+ --recursica_ui-kit_components_slider_properties_min-max-label_text-transform
292
+ );
293
+ }
294
+
295
+ /*
296
+ * LAYOUT DECISION: Right-Aligned Floating Current Value Container
297
+ * - Wrapped around the right-side max guide (or icon) as a relative flex context.
298
+ * - This provides the anchor for absolutely positioning the floating current value element
299
+ * above the guide.
300
+ */
301
+ .rightGuideContainer {
302
+ position: relative;
303
+ display: inline-flex;
304
+ align-items: center;
305
+ justify-content: center;
306
+ flex-shrink: 0;
307
+ }
308
+
309
+ /*
310
+ * LAYOUT DECISION: Floating Active Value Element
311
+ * - Absolutely positioned directly above the max guide and right-aligned (`right: 0`).
312
+ * - Uses a vertical gap matching the global label-to-component gap variable, ensuring
313
+ * that `.currentValue` is placed in perfect horizontal baseline alignment with the
314
+ * left-aligned form label of the component.
315
+ * - Typography maps back to the slider component's read-only value token definitions.
316
+ * - Inherits the container default/disabled/error text colors naturally.
317
+ */
318
+ .currentValue {
319
+ position: absolute;
320
+ bottom: calc(
321
+ 100% +
322
+ var(--recursica_ui-kit_globals_form_properties_label-field-gap-vertical)
323
+ );
324
+ right: 0;
325
+ white-space: nowrap;
326
+ pointer-events: none;
327
+ display: inline-block;
328
+ width: var(--recursica_ui-kit_components_slider_properties_input-width);
329
+ text-align: right;
330
+
331
+ font-family: var(
332
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-family
333
+ );
334
+ font-size: var(
335
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-size
336
+ );
337
+ font-style: var(
338
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-style
339
+ );
340
+ font-weight: var(
341
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-weight
342
+ );
343
+ letter-spacing: var(
344
+ --recursica_ui-kit_components_slider_properties_read-only-value_letter-spacing
345
+ );
346
+ line-height: var(
347
+ --recursica_ui-kit_components_slider_properties_read-only-value_line-height
348
+ );
349
+ text-decoration: var(
350
+ --recursica_ui-kit_components_slider_properties_read-only-value_text-decoration
351
+ );
352
+ text-transform: var(
353
+ --recursica_ui-kit_components_slider_properties_read-only-value_text-transform
354
+ );
355
+ }
356
+
357
+ /* ==========================================
358
+ 4. Numeric Input Field
359
+ ========================================== */
360
+
361
+ .inputField {
362
+ box-sizing: border-box;
363
+ flex-shrink: 0;
364
+ width: var(--recursica_ui-kit_components_slider_properties_input-width);
365
+ height: var(--recursica_ui-kit_components_slider_properties_input-height);
366
+ border-radius: var(
367
+ --recursica_ui-kit_components_slider_properties_input-border-radius
368
+ );
369
+ border-style: solid;
370
+ border-width: var(
371
+ --recursica_ui-kit_components_slider_properties_input-border-size
372
+ );
373
+ border-color: var(
374
+ --recursica_ui-kit_components_slider_properties_colors_input-border-color
375
+ );
376
+ background-color: var(
377
+ --recursica_ui-kit_components_slider_properties_colors_input-background-color
378
+ );
379
+ color: var(--recursica_ui-kit_components_slider_properties_colors_input-text);
380
+
381
+ font-family: var(
382
+ --recursica_ui-kit_components_slider_properties_input-text_font-family
383
+ );
384
+ font-size: var(
385
+ --recursica_ui-kit_components_slider_properties_input-text_font-size
386
+ );
387
+ font-style: var(
388
+ --recursica_ui-kit_components_slider_properties_input-text_font-style
389
+ );
390
+ font-weight: var(
391
+ --recursica_ui-kit_components_slider_properties_input-text_font-weight
392
+ );
393
+ letter-spacing: var(
394
+ --recursica_ui-kit_components_slider_properties_input-text_letter-spacing
395
+ );
396
+ line-height: var(
397
+ --recursica_ui-kit_components_slider_properties_input-text_line-height
398
+ );
399
+ text-decoration: var(
400
+ --recursica_ui-kit_components_slider_properties_input-text_text-decoration
401
+ );
402
+ text-transform: var(
403
+ --recursica_ui-kit_components_slider_properties_input-text_text-transform
404
+ );
405
+
406
+ padding-left: var(
407
+ --recursica_ui-kit_components_slider_properties_input-padding-left
408
+ );
409
+ padding-right: var(
410
+ --recursica_ui-kit_components_slider_properties_input-padding-right
411
+ );
412
+ padding-top: var(
413
+ --recursica_ui-kit_components_slider_properties_input-padding-vertical
414
+ );
415
+ padding-bottom: var(
416
+ --recursica_ui-kit_components_slider_properties_input-padding-vertical
417
+ );
418
+ text-align: center;
419
+ transition:
420
+ border-color 0.15s ease,
421
+ background-color 0.15s ease;
422
+ }
423
+
424
+ .inputField:focus {
425
+ outline: none;
426
+ box-shadow:
427
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
428
+ var(--recursica_brand_states_focus_color),
429
+ 0 0 var(--recursica_brand_states_focus_blur)
430
+ var(--recursica_brand_states_focus_margin)
431
+ var(--recursica_brand_states_focus_color);
432
+ }
433
+
434
+ /* Chrome, Safari, Edge, Opera: Hide number spin buttons */
435
+ .inputField::-webkit-outer-spin-button,
436
+ .inputField::-webkit-inner-spin-button {
437
+ -webkit-appearance: none;
438
+ margin: 0;
439
+ }
440
+
441
+ /* Firefox: Hide number spin buttons */
442
+ .inputField[type="number"] {
443
+ -moz-appearance: textfield;
444
+ }
445
+
446
+ /* ==========================================
447
+ 5. Custom Read-Only Typography Value
448
+ ========================================== */
449
+
450
+ .readOnlyValue {
451
+ font-family: var(
452
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-family
453
+ );
454
+ font-size: var(
455
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-size
456
+ );
457
+ font-style: var(
458
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-style
459
+ );
460
+ font-weight: var(
461
+ --recursica_ui-kit_components_slider_properties_read-only-value_font-weight
462
+ );
463
+ letter-spacing: var(
464
+ --recursica_ui-kit_components_slider_properties_read-only-value_letter-spacing
465
+ );
466
+ line-height: var(
467
+ --recursica_ui-kit_components_slider_properties_read-only-value_line-height
468
+ );
469
+ text-decoration: var(
470
+ --recursica_ui-kit_components_slider_properties_read-only-value_text-decoration
471
+ );
472
+ text-transform: var(
473
+ --recursica_ui-kit_components_slider_properties_read-only-value_text-transform
474
+ );
475
+ }
476
+
477
+ /* ==========================================
478
+ 6. State-Specific Overrides (Disabled, Error)
479
+ ========================================== */
480
+
481
+ /* Focus states */
482
+ /* The token schema's `active` state (not a separate `focus` state) now covers track/step-indicator
483
+ color while focus is within the slider. Unlike Mantine (whose unfilled track is painted by an
484
+ internal `::before` layer that this rule never actually reaches), MUI's rail element is styled
485
+ directly by `.sliderTrack`, so applying the active-track color here visibly repaints the rail a
486
+ different color for the whole duration of a drag. There is no design requirement for the rail to
487
+ change color while dragging, so the track is intentionally left out of this rule; only the
488
+ step-indicator (mark) is included, matching the token schema's remaining active-state coverage. */
489
+ .sliderRoot:has(.sliderThumb:focus) .sliderMark,
490
+ .sliderRoot:focus-within .sliderMark {
491
+ background-color: var(
492
+ --recursica_ui-kit_components_slider_variants_states_active_properties_colors_step-indicator-color
493
+ );
494
+ }
495
+
496
+ /* Disabled state */
497
+ .sliderContainer[data-disabled="true"] .iconWrapper {
498
+ color: var(
499
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_icon-color
500
+ );
501
+ }
502
+
503
+ .sliderContainer[data-disabled="true"] .sliderTrack {
504
+ background-color: var(
505
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_track
506
+ );
507
+ }
508
+
509
+ .sliderContainer[data-disabled="true"] .sliderBar {
510
+ background-color: var(
511
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_track-active
512
+ );
513
+ }
514
+
515
+ .sliderContainer[data-disabled="true"] .sliderThumb {
516
+ background-color: var(
517
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_thumb
518
+ );
519
+ cursor: not-allowed;
520
+ box-shadow: none;
521
+ }
522
+
523
+ .sliderContainer[data-disabled="true"] .sliderMark {
524
+ background-color: var(
525
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_step-indicator-color
526
+ );
527
+ }
528
+
529
+ .sliderContainer[data-disabled="true"] .sliderMark[data-filled] {
530
+ background-color: var(
531
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_step-indicator-color-active
532
+ );
533
+ }
534
+
535
+ .sliderContainer[data-disabled="true"] {
536
+ color: var(--form-field-disabled-text);
537
+ opacity: var(
538
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_opacity
539
+ );
540
+ }
541
+
542
+ .inputField:disabled {
543
+ cursor: not-allowed;
544
+ background-color: var(
545
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_input-background-color
546
+ );
547
+ border-color: var(
548
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_input-border-color
549
+ );
550
+ color: var(
551
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_colors_input-text
552
+ );
553
+ border-width: var(
554
+ --recursica_ui-kit_components_slider_variants_states_disabled_properties_input-border-size
555
+ );
556
+ }
557
+
558
+ /* Error state */
559
+ .sliderContainer[data-error="true"] .iconWrapper {
560
+ color: var(
561
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_icon-color
562
+ );
563
+ }
564
+
565
+ .sliderContainer[data-error="true"] .sliderTrack {
566
+ background-color: var(
567
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_track
568
+ );
569
+ }
570
+
571
+ .sliderContainer[data-error="true"] .sliderBar {
572
+ background-color: var(
573
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_track-active
574
+ );
575
+ }
576
+
577
+ .sliderContainer[data-error="true"] .sliderThumb {
578
+ background-color: var(
579
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_thumb
580
+ );
581
+ }
582
+
583
+ .sliderContainer[data-error="true"] .sliderMark {
584
+ background-color: var(
585
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_step-indicator-color
586
+ );
587
+ }
588
+
589
+ .sliderContainer[data-error="true"] .sliderMark[data-filled] {
590
+ background-color: var(
591
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_step-indicator-color-active
592
+ );
593
+ }
594
+
595
+ .inputField[data-error="true"] {
596
+ background-color: var(
597
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_input-background-color
598
+ );
599
+ border-color: var(
600
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_input-border-color
601
+ );
602
+ color: var(
603
+ --recursica_ui-kit_components_slider_variants_states_error_properties_colors_input-text
604
+ );
605
+ border-width: var(
606
+ --recursica_ui-kit_components_slider_variants_states_error_properties_input-border-size
607
+ );
608
+ }
609
+
610
+ /* ==========================================
611
+ 7. Side-by-Side Layout Overrides
612
+ ========================================== */
613
+
614
+ .sliderContainer[data-form-layout="side-by-side"] .rightGuideContainer {
615
+ position: relative;
616
+ display: inline-flex;
617
+ flex-direction: row;
618
+ align-items: center;
619
+ justify-content: flex-end;
620
+ flex-shrink: 0;
621
+ gap: var(--recursica_ui-kit_components_slider_properties_input-gap);
622
+ }
623
+
624
+ .sliderContainer[data-form-layout="side-by-side"] .currentValue {
625
+ position: static;
626
+ white-space: nowrap;
627
+ pointer-events: none;
628
+ order: 2; /* Positioned to the right of the max label */
629
+ }
630
+
631
+ .sliderContainer[data-form-layout="side-by-side"]
632
+ .rightGuideContainer
633
+ .minMaxGuide {
634
+ order: 1; /* Positioned to the left of the current value */
635
+ }