@recursica/adapter-mantine-v8 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 (362) hide show
  1. package/.storybook/commonArgTypes.ts +148 -0
  2. package/ARCHITECTURE.md +18 -0
  3. package/CHANGELOG.md +688 -0
  4. package/LICENSE +21 -0
  5. package/OVERSTYLING.md +56 -0
  6. package/README.md +70 -0
  7. package/SETUP.md +93 -0
  8. package/USAGE.md +57 -0
  9. package/dist/adapter-mantine-v8.cjs +12 -0
  10. package/dist/adapter-mantine-v8.cjs.map +1 -0
  11. package/dist/adapter-mantine-v8.css +1 -0
  12. package/dist/adapter-mantine-v8.js +5759 -0
  13. package/dist/adapter-mantine-v8.js.map +1 -0
  14. package/dist/index.d.ts +2095 -0
  15. package/dist/test.html +1 -0
  16. package/dist/vite.svg +1 -0
  17. package/docs/PHILOSOPHY.md +39 -0
  18. package/llms.txt +74 -0
  19. package/package.json +131 -0
  20. package/recursica_brand.json +2677 -0
  21. package/recursica_tokens.json +799 -0
  22. package/recursica_ui-kit.json +14981 -0
  23. package/recursica_variables_scoped.css +30489 -0
  24. package/src/GlobalExemptions.modules.css +7 -0
  25. package/src/Introduction.stories.tsx +154 -0
  26. package/src/OverStyling.tsx +79 -0
  27. package/src/Version.tsx +44 -0
  28. package/src/components/Accordion/ACCORDION_IMPLEMENTATION_NOTES.md +72 -0
  29. package/src/components/Accordion/Accordion.module.css +367 -0
  30. package/src/components/Accordion/Accordion.stories.tsx +189 -0
  31. package/src/components/Accordion/Accordion.test.tsx +1 -0
  32. package/src/components/Accordion/Accordion.tsx +220 -0
  33. package/src/components/Accordion/USAGE.md +51 -0
  34. package/src/components/Accordion/index.ts +1 -0
  35. package/src/components/AssistiveElement/ASSISTIVEELEMENT_IMPLEMENTATION_NOTES.md +45 -0
  36. package/src/components/AssistiveElement/AssistiveElement.module.css +111 -0
  37. package/src/components/AssistiveElement/AssistiveElement.stories.tsx +68 -0
  38. package/src/components/AssistiveElement/AssistiveElement.test.tsx +1 -0
  39. package/src/components/AssistiveElement/AssistiveElement.tsx +93 -0
  40. package/src/components/AssistiveElement/USAGE.md +36 -0
  41. package/src/components/AutoComplete/AUTOCOMPLETE_IMPLEMENTATION_NOTES.md +42 -0
  42. package/src/components/AutoComplete/AutoComplete.module.css +430 -0
  43. package/src/components/AutoComplete/AutoComplete.stories.tsx +336 -0
  44. package/src/components/AutoComplete/AutoComplete.test.tsx +1 -0
  45. package/src/components/AutoComplete/AutoComplete.tsx +179 -0
  46. package/src/components/AutoComplete/USAGE.md +80 -0
  47. package/src/components/Avatar/AVATAR_IMPLEMENTATION_NOTES.md +34 -0
  48. package/src/components/Avatar/Avatar.module.css +336 -0
  49. package/src/components/Avatar/Avatar.stories.tsx +92 -0
  50. package/src/components/Avatar/Avatar.test.tsx +1 -0
  51. package/src/components/Avatar/Avatar.tsx +108 -0
  52. package/src/components/Avatar/USAGE.md +38 -0
  53. package/src/components/Avatar/index.ts +1 -0
  54. package/src/components/Badge/BADGE_IMPLEMENTATION_NOTES.md +18 -0
  55. package/src/components/Badge/Badge.module.css +127 -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 +64 -0
  59. package/src/components/Badge/USAGE.md +56 -0
  60. package/src/components/Breadcrumb/BREADCRUMB_IMPLEMENTATION_NOTES.md +47 -0
  61. package/src/components/Breadcrumb/Breadcrumb.module.css +48 -0
  62. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +114 -0
  63. package/src/components/Breadcrumb/Breadcrumb.test.tsx +1 -0
  64. package/src/components/Breadcrumb/Breadcrumb.tsx +85 -0
  65. package/src/components/Breadcrumb/USAGE.md +55 -0
  66. package/src/components/Breadcrumb/markCurrentPageItem.test.ts +49 -0
  67. package/src/components/Button/Button.module.css +446 -0
  68. package/src/components/Button/Button.stories.tsx +196 -0
  69. package/src/components/Button/Button.styleIsolation.dom.test.tsx +98 -0
  70. package/src/components/Button/Button.tsx +184 -0
  71. package/src/components/Button/IMPLEMENTATION_NOTES.md +109 -0
  72. package/src/components/Button/USAGE.md +80 -0
  73. package/src/components/Button/index.ts +1 -0
  74. package/src/components/Card/CARD_IMPLEMENTATION_NOTES.md +17 -0
  75. package/src/components/Card/Card.module.css +119 -0
  76. package/src/components/Card/Card.stories.tsx +131 -0
  77. package/src/components/Card/Card.test.tsx +1 -0
  78. package/src/components/Card/Card.tsx +248 -0
  79. package/src/components/Card/USAGE.md +63 -0
  80. package/src/components/Checkbox/CHECKBOX_IMPLEMENTATION_NOTES.md +25 -0
  81. package/src/components/Checkbox/Checkbox.module.css +267 -0
  82. package/src/components/Checkbox/Checkbox.stories.tsx +97 -0
  83. package/src/components/Checkbox/Checkbox.test.tsx +1 -0
  84. package/src/components/Checkbox/Checkbox.tsx +151 -0
  85. package/src/components/Checkbox/CheckboxGroup.stories.tsx +139 -0
  86. package/src/components/Checkbox/CheckboxGroup.tsx +147 -0
  87. package/src/components/Checkbox/USAGE.md +48 -0
  88. package/src/components/Chip/CHIP_IMPLEMENTATION_NOTES.md +110 -0
  89. package/src/components/Chip/Chip.module.css +288 -0
  90. package/src/components/Chip/Chip.stories.tsx +128 -0
  91. package/src/components/Chip/Chip.test.tsx +1 -0
  92. package/src/components/Chip/Chip.tsx +157 -0
  93. package/src/components/Chip/USAGE.md +55 -0
  94. package/src/components/Container/CONTAINER_IMPLEMENTATION_NOTES.md +4 -0
  95. package/src/components/Container/Container.module.css +7 -0
  96. package/src/components/Container/Container.stories.tsx +118 -0
  97. package/src/components/Container/Container.test.tsx +1 -0
  98. package/src/components/Container/Container.tsx +69 -0
  99. package/src/components/Container/USAGE.md +47 -0
  100. package/src/components/DatePicker/DATEPICKER_IMPLEMENTATION_NOTES.md +31 -0
  101. package/src/components/DatePicker/DatePicker.icons.tsx +27 -0
  102. package/src/components/DatePicker/DatePicker.module.css +566 -0
  103. package/src/components/DatePicker/DatePicker.stories.tsx +158 -0
  104. package/src/components/DatePicker/DatePicker.test.tsx +1 -0
  105. package/src/components/DatePicker/DatePicker.tsx +218 -0
  106. package/src/components/DatePicker/USAGE.md +49 -0
  107. package/src/components/Dropdown/BareDropdown.tsx +97 -0
  108. package/src/components/Dropdown/DROPDOWN_IMPLEMENTATION_NOTES.md +12 -0
  109. package/src/components/Dropdown/Dropdown.module.css +477 -0
  110. package/src/components/Dropdown/Dropdown.stories.tsx +252 -0
  111. package/src/components/Dropdown/Dropdown.test.tsx +1 -0
  112. package/src/components/Dropdown/Dropdown.tsx +213 -0
  113. package/src/components/Dropdown/USAGE.md +69 -0
  114. package/src/components/FileInput/FILEINPUT_IMPLEMENTATION_NOTES.md +153 -0
  115. package/src/components/FileInput/FileInput.module.css +280 -0
  116. package/src/components/FileInput/FileInput.stories.tsx +313 -0
  117. package/src/components/FileInput/FileInput.test.tsx +1 -0
  118. package/src/components/FileInput/FileInput.tsx +417 -0
  119. package/src/components/FileInput/USAGE.md +145 -0
  120. package/src/components/FileUpload/FILEUPLOAD_IMPLEMENTATION_NOTES.md +244 -0
  121. package/src/components/FileUpload/FileUpload.module.css +205 -0
  122. package/src/components/FileUpload/FileUpload.stories.tsx +362 -0
  123. package/src/components/FileUpload/FileUpload.test.tsx +1 -0
  124. package/src/components/FileUpload/FileUpload.tsx +354 -0
  125. package/src/components/FileUpload/USAGE.md +199 -0
  126. package/src/components/Flex/FLEX_IMPLEMENTATION_NOTES.md +4 -0
  127. package/src/components/Flex/Flex.module.css +7 -0
  128. package/src/components/Flex/Flex.stories.tsx +128 -0
  129. package/src/components/Flex/Flex.test.tsx +1 -0
  130. package/src/components/Flex/Flex.tsx +75 -0
  131. package/src/components/Flex/USAGE.md +48 -0
  132. package/src/components/FormControlLayout/FormControlLayout.module.css +90 -0
  133. package/src/components/FormControlLayout/FormControlLayout.stories.tsx +118 -0
  134. package/src/components/FormControlLayout/FormControlLayout.test.tsx +1 -0
  135. package/src/components/FormControlLayout/FormControlLayout.tsx +74 -0
  136. package/src/components/FormControlLayout/USAGE.md +40 -0
  137. package/src/components/FormControlWrapper/FORMCONTROLWRAPPER_IMPLEMENTATION_NOTES.md +32 -0
  138. package/src/components/FormControlWrapper/FormControlWrapper.module.css +75 -0
  139. package/src/components/FormControlWrapper/FormControlWrapper.stories.tsx +129 -0
  140. package/src/components/FormControlWrapper/FormControlWrapper.test.tsx +1 -0
  141. package/src/components/FormControlWrapper/FormControlWrapper.tsx +151 -0
  142. package/src/components/FormControlWrapper/USAGE.md +47 -0
  143. package/src/components/Grid/GRID_IMPLEMENTATION_NOTES.md +18 -0
  144. package/src/components/Grid/Grid.module.css +11 -0
  145. package/src/components/Grid/Grid.stories.tsx +206 -0
  146. package/src/components/Grid/Grid.test.tsx +1 -0
  147. package/src/components/Grid/Grid.tsx +140 -0
  148. package/src/components/Grid/USAGE.md +47 -0
  149. package/src/components/Group/GROUP_IMPLEMENTATION_NOTES.md +4 -0
  150. package/src/components/Group/Group.module.css +7 -0
  151. package/src/components/Group/Group.stories.tsx +120 -0
  152. package/src/components/Group/Group.test.tsx +1 -0
  153. package/src/components/Group/Group.tsx +60 -0
  154. package/src/components/Group/USAGE.md +48 -0
  155. package/src/components/Heading/HEADING_IMPLEMENTATION_NOTES.md +18 -0
  156. package/src/components/Heading/Heading.module.css +13 -0
  157. package/src/components/Heading/Heading.stories.tsx +50 -0
  158. package/src/components/Heading/Heading.test.tsx +1 -0
  159. package/src/components/Heading/Heading.tsx +52 -0
  160. package/src/components/Heading/USAGE.md +36 -0
  161. package/src/components/HoverCard/HOVERCARD_IMPLEMENTATION_NOTES.md +77 -0
  162. package/src/components/HoverCard/HoverCard.module.css +90 -0
  163. package/src/components/HoverCard/HoverCard.stories.tsx +172 -0
  164. package/src/components/HoverCard/HoverCard.test.tsx +1 -0
  165. package/src/components/HoverCard/HoverCard.tsx +133 -0
  166. package/src/components/HoverCard/USAGE.md +52 -0
  167. package/src/components/Label/LABEL_IMPLEMENTATION_NOTES.md +48 -0
  168. package/src/components/Label/Label.module.css +141 -0
  169. package/src/components/Label/Label.stories.tsx +131 -0
  170. package/src/components/Label/Label.test.tsx +1 -0
  171. package/src/components/Label/Label.tsx +113 -0
  172. package/src/components/Label/USAGE.md +47 -0
  173. package/src/components/Label/index.ts +1 -0
  174. package/src/components/Layer/USAGE.md +54 -0
  175. package/src/components/Link/IMPLEMENTATION_NOTES.md +19 -0
  176. package/src/components/Link/Link.module.css +110 -0
  177. package/src/components/Link/Link.stories.tsx +58 -0
  178. package/src/components/Link/Link.test.tsx +1 -0
  179. package/src/components/Link/Link.tsx +67 -0
  180. package/src/components/Link/USAGE.md +56 -0
  181. package/src/components/Link/index.ts +1 -0
  182. package/src/components/Loader/LOADER_IMPLEMENTATION_NOTES.md +24 -0
  183. package/src/components/Loader/Loader.animate.dom.test.tsx +82 -0
  184. package/src/components/Loader/Loader.module.css +63 -0
  185. package/src/components/Loader/Loader.stories.tsx +123 -0
  186. package/src/components/Loader/Loader.test.tsx +1 -0
  187. package/src/components/Loader/Loader.tsx +69 -0
  188. package/src/components/Loader/USAGE.md +44 -0
  189. package/src/components/Menu/MENU_IMPLEMENTATION_NOTES.md +88 -0
  190. package/src/components/Menu/Menu.module.css +280 -0
  191. package/src/components/Menu/Menu.stories.tsx +371 -0
  192. package/src/components/Menu/Menu.test.tsx +1 -0
  193. package/src/components/Menu/Menu.tsx +373 -0
  194. package/src/components/Menu/USAGE.md +55 -0
  195. package/src/components/Modal/MODAL_IMPLEMENTATION_NOTES.md +32 -0
  196. package/src/components/Modal/Modal.module.css +302 -0
  197. package/src/components/Modal/Modal.stories.tsx +105 -0
  198. package/src/components/Modal/Modal.test.tsx +1 -0
  199. package/src/components/Modal/Modal.tsx +368 -0
  200. package/src/components/Modal/USAGE.md +58 -0
  201. package/src/components/Modal/index.ts +1 -0
  202. package/src/components/NumberInput/NUMBER_INPUT_IMPLEMENTATION_NOTES.md +24 -0
  203. package/src/components/NumberInput/NumberInput.module.css +302 -0
  204. package/src/components/NumberInput/NumberInput.stories.tsx +96 -0
  205. package/src/components/NumberInput/NumberInput.test.tsx +1 -0
  206. package/src/components/NumberInput/NumberInput.tsx +157 -0
  207. package/src/components/NumberInput/USAGE.md +52 -0
  208. package/src/components/Pagination/IMPLEMENTATION_NOTES.md +16 -0
  209. package/src/components/Pagination/Pagination.icons.tsx +66 -0
  210. package/src/components/Pagination/Pagination.module.css +188 -0
  211. package/src/components/Pagination/Pagination.stories.tsx +48 -0
  212. package/src/components/Pagination/Pagination.test.tsx +1 -0
  213. package/src/components/Pagination/Pagination.tsx +265 -0
  214. package/src/components/Pagination/USAGE.md +36 -0
  215. package/src/components/Pagination/index.ts +5 -0
  216. package/src/components/Panel/PANEL_IMPLEMENTATION_NOTES.md +116 -0
  217. package/src/components/Panel/Panel.module.css +209 -0
  218. package/src/components/Panel/Panel.stories.tsx +227 -0
  219. package/src/components/Panel/Panel.test.tsx +1 -0
  220. package/src/components/Panel/Panel.tsx +269 -0
  221. package/src/components/Panel/USAGE.md +56 -0
  222. package/src/components/Popover/IMPLEMENTATION_NOTES.md +77 -0
  223. package/src/components/Popover/Popover.module.css +86 -0
  224. package/src/components/Popover/Popover.stories.tsx +133 -0
  225. package/src/components/Popover/Popover.test.tsx +1 -0
  226. package/src/components/Popover/Popover.tsx +142 -0
  227. package/src/components/Popover/USAGE.md +61 -0
  228. package/src/components/Popover/index.ts +1 -0
  229. package/src/components/Radio/Radio.module.css +231 -0
  230. package/src/components/Radio/Radio.stories.tsx +93 -0
  231. package/src/components/Radio/Radio.test.tsx +1 -0
  232. package/src/components/Radio/Radio.tsx +168 -0
  233. package/src/components/Radio/RadioGroup.stories.tsx +117 -0
  234. package/src/components/Radio/RadioGroup.tsx +124 -0
  235. package/src/components/Radio/USAGE.md +36 -0
  236. package/src/components/ReadOnlyField/READ_ONLY_FIELD_IMPLEMENTATION_NOTES.md +15 -0
  237. package/src/components/ReadOnlyField/ReadOnlyBooleanField.tsx +21 -0
  238. package/src/components/ReadOnlyField/ReadOnlyField.module.css +54 -0
  239. package/src/components/ReadOnlyField/ReadOnlyField.stories.tsx +163 -0
  240. package/src/components/ReadOnlyField/ReadOnlyField.test.tsx +1 -0
  241. package/src/components/ReadOnlyField/ReadOnlyField.tsx +114 -0
  242. package/src/components/ReadOnlyField/ReadOnlySwitchField.tsx +21 -0
  243. package/src/components/ReadOnlyField/ReadOnlyTextField.tsx +48 -0
  244. package/src/components/ReadOnlyField/USAGE.md +44 -0
  245. package/src/components/ReadOnlyField/WithReadOnlyWrapper.tsx +93 -0
  246. package/src/components/ReadOnlyField/index.ts +5 -0
  247. package/src/components/RecursicaThemeProvider/USAGE.md +60 -0
  248. package/src/components/SegmentedControl/IMPLEMENTATION_NOTES.md +25 -0
  249. package/src/components/SegmentedControl/SegmentedControl.module.css +185 -0
  250. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +106 -0
  251. package/src/components/SegmentedControl/SegmentedControl.test.tsx +1 -0
  252. package/src/components/SegmentedControl/SegmentedControl.tsx +110 -0
  253. package/src/components/SegmentedControl/USAGE.md +55 -0
  254. package/src/components/Slider/IMPLEMENTATION_NOTES.md +92 -0
  255. package/src/components/Slider/Slider.module.css +588 -0
  256. package/src/components/Slider/Slider.stories.tsx +282 -0
  257. package/src/components/Slider/Slider.test.tsx +1 -0
  258. package/src/components/Slider/Slider.tsx +391 -0
  259. package/src/components/Slider/USAGE.md +56 -0
  260. package/src/components/Stack/STACK_IMPLEMENTATION_NOTES.md +4 -0
  261. package/src/components/Stack/Stack.module.css +7 -0
  262. package/src/components/Stack/Stack.stories.tsx +108 -0
  263. package/src/components/Stack/Stack.test.tsx +1 -0
  264. package/src/components/Stack/Stack.tsx +62 -0
  265. package/src/components/Stack/USAGE.md +48 -0
  266. package/src/components/Stepper/IMPLEMENTATION_NOTES.md +28 -0
  267. package/src/components/Stepper/Stepper.module.css +404 -0
  268. package/src/components/Stepper/Stepper.stories.tsx +148 -0
  269. package/src/components/Stepper/Stepper.test.tsx +1 -0
  270. package/src/components/Stepper/Stepper.tsx +93 -0
  271. package/src/components/Stepper/USAGE.md +41 -0
  272. package/src/components/Switch/SWITCH_IMPLEMENTATION_NOTES.md +64 -0
  273. package/src/components/Switch/Switch.module.css +279 -0
  274. package/src/components/Switch/Switch.stories.tsx +114 -0
  275. package/src/components/Switch/Switch.test.tsx +1 -0
  276. package/src/components/Switch/Switch.tsx +177 -0
  277. package/src/components/Switch/SwitchGroup.stories.tsx +132 -0
  278. package/src/components/Switch/SwitchGroup.tsx +127 -0
  279. package/src/components/Switch/USAGE.md +42 -0
  280. package/src/components/Table/TABLE_IMPLEMENTATION_NOTES.md +78 -0
  281. package/src/components/Table/Table.icons.tsx +40 -0
  282. package/src/components/Table/Table.module.css +444 -0
  283. package/src/components/Table/Table.stories.tsx +140 -0
  284. package/src/components/Table/Table.test.tsx +1 -0
  285. package/src/components/Table/Table.tsx +243 -0
  286. package/src/components/Table/USAGE.md +78 -0
  287. package/src/components/Tabs/IMPLEMENTATION_NOTES.md +27 -0
  288. package/src/components/Tabs/Tabs.module.css +591 -0
  289. package/src/components/Tabs/Tabs.stories.tsx +154 -0
  290. package/src/components/Tabs/Tabs.test.tsx +1 -0
  291. package/src/components/Tabs/Tabs.tsx +114 -0
  292. package/src/components/Tabs/USAGE.md +45 -0
  293. package/src/components/Text/TEXT_IMPLEMENTATION_NOTES.md +12 -0
  294. package/src/components/Text/Text.module.css +13 -0
  295. package/src/components/Text/Text.stories.tsx +75 -0
  296. package/src/components/Text/Text.test.tsx +1 -0
  297. package/src/components/Text/Text.tsx +53 -0
  298. package/src/components/Text/USAGE.md +40 -0
  299. package/src/components/TextArea/TEXTAREA_IMPLEMENTATION_NOTES.md +7 -0
  300. package/src/components/TextArea/TextArea.module.css +183 -0
  301. package/src/components/TextArea/TextArea.stories.tsx +94 -0
  302. package/src/components/TextArea/TextArea.test.tsx +1 -0
  303. package/src/components/TextArea/TextArea.tsx +137 -0
  304. package/src/components/TextArea/USAGE.md +48 -0
  305. package/src/components/TextField/TEXTFIELD_IMPLEMENTATION_NOTES.md +19 -0
  306. package/src/components/TextField/TextField.module.css +264 -0
  307. package/src/components/TextField/TextField.stories.tsx +162 -0
  308. package/src/components/TextField/TextField.test.tsx +1 -0
  309. package/src/components/TextField/TextField.tsx +139 -0
  310. package/src/components/TextField/USAGE.md +44 -0
  311. package/src/components/TimePicker/TIMEPICKER_IMPLEMENTATION_NOTES.md +119 -0
  312. package/src/components/TimePicker/TimePicker.module.css +291 -0
  313. package/src/components/TimePicker/TimePicker.stories.tsx +141 -0
  314. package/src/components/TimePicker/TimePicker.test.tsx +1 -0
  315. package/src/components/TimePicker/TimePicker.tsx +304 -0
  316. package/src/components/TimePicker/USAGE.md +57 -0
  317. package/src/components/Timeline/TIMELINE_IMPLEMENTATION_NOTES.md +13 -0
  318. package/src/components/Timeline/Timeline.module.css +373 -0
  319. package/src/components/Timeline/Timeline.stories.tsx +128 -0
  320. package/src/components/Timeline/Timeline.test.tsx +1 -0
  321. package/src/components/Timeline/Timeline.tsx +73 -0
  322. package/src/components/Timeline/TimelineItem.tsx +79 -0
  323. package/src/components/Timeline/USAGE.md +49 -0
  324. package/src/components/Toast/TOAST_IMPLEMENTATION_NOTES.md +39 -0
  325. package/src/components/Toast/Toast.module.css +184 -0
  326. package/src/components/Toast/Toast.stories.tsx +67 -0
  327. package/src/components/Toast/Toast.test.tsx +1 -0
  328. package/src/components/Toast/Toast.tsx +82 -0
  329. package/src/components/Toast/USAGE.md +50 -0
  330. package/src/components/Toast/index.ts +1 -0
  331. package/src/components/Tooltip/TOOLTIP_IMPLEMENTATION_NOTES.md +85 -0
  332. package/src/components/Tooltip/Tooltip.module.css +91 -0
  333. package/src/components/Tooltip/Tooltip.stories.tsx +165 -0
  334. package/src/components/Tooltip/Tooltip.test.tsx +1 -0
  335. package/src/components/Tooltip/Tooltip.tsx +117 -0
  336. package/src/components/Tooltip/USAGE.md +80 -0
  337. package/src/components/TransferList/TRANSFERLIST_IMPLEMENTATION_NOTES.md +111 -0
  338. package/src/components/TransferList/TransferList.module.css +182 -0
  339. package/src/components/TransferList/TransferList.stories.tsx +121 -0
  340. package/src/components/TransferList/TransferList.test.tsx +1 -0
  341. package/src/components/TransferList/TransferList.tsx +419 -0
  342. package/src/components/TransferList/USAGE.md +77 -0
  343. package/src/components/Tree/IMPLEMENTATION_NOTES.md +48 -0
  344. package/src/components/Tree/Tree.module.css +232 -0
  345. package/src/components/Tree/Tree.stories.tsx +104 -0
  346. package/src/components/Tree/Tree.test.tsx +1 -0
  347. package/src/components/Tree/Tree.tsx +220 -0
  348. package/src/components/Tree/USAGE.md +96 -0
  349. package/src/components/Tree/index.ts +1 -0
  350. package/src/components/index.ts +52 -0
  351. package/src/env.d.ts +7 -0
  352. package/src/index.ts +179 -0
  353. package/src/types/index.ts +9 -0
  354. package/src/types/mantine.d.ts +7 -0
  355. package/src/types/scss-modules.d.ts +9 -0
  356. package/src/utils/ColorSchemeWrapper.tsx +27 -0
  357. package/src/utils/RequireAccessibleLabel.ts +1 -0
  358. package/src/utils/copyToClipboard.ts +36 -0
  359. package/src/utils/filterStylingProps.test.ts +85 -0
  360. package/src/utils/filterStylingProps.ts +150 -0
  361. package/src/utils/index.ts +1 -0
  362. package/src/utils/renderRichOption.tsx +65 -0
@@ -0,0 +1,124 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React, { forwardRef } from "react";
3
+ import {
4
+ Radio as MantineRadio,
5
+ type RadioGroupProps as MantineRadioGroupProps,
6
+ } from "@mantine/core";
7
+ import { type ReadOnlyControlProps } from "@recursica/adapter-common";
8
+ import {
9
+ filterStylingProps,
10
+ omitUnsupportedProps,
11
+ type RecursicaOverStyled,
12
+ } from "../../utils/filterStylingProps";
13
+ import { type RecursicaFormControlWrapperProps } from "../FormControlWrapper/FormControlWrapper";
14
+ import { WithReadOnlyWrapper } from "../ReadOnlyField/WithReadOnlyWrapper";
15
+ import styles from "./Radio.module.css";
16
+
17
+ import { type RecursicaRadioGroupProps as BaseRecursicaRadioGroupProps } from "@recursica/adapter-common";
18
+
19
+ export interface RecursicaRadioGroupProps
20
+ extends Omit<
21
+ MantineRadioGroupProps,
22
+ "size" | "labelProps" | "defaultValue" | "value"
23
+ >,
24
+ Omit<
25
+ RecursicaFormControlWrapperProps,
26
+ "controlMaxWidth" | "controlMinWidth"
27
+ >,
28
+ ReadOnlyControlProps,
29
+ BaseRecursicaRadioGroupProps {}
30
+
31
+ export type RadioGroupProps = RecursicaOverStyled<RecursicaRadioGroupProps>;
32
+
33
+ export const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(
34
+ function RadioGroup(props, ref) {
35
+ const {
36
+ overStyled = false,
37
+ formLayout = "stacked",
38
+
39
+ // Label Wrappers
40
+ labelSize,
41
+ labelAlignment,
42
+ labelOptionalText,
43
+ labelWithEditIcon,
44
+ onLabelEditClick,
45
+
46
+ // Base Mantine Extracted Attributes
47
+ label,
48
+ description,
49
+ assistiveText,
50
+ assistiveWithIcon,
51
+ error,
52
+ required,
53
+ withAsterisk,
54
+ id,
55
+ className,
56
+ style,
57
+ children,
58
+ readOnly,
59
+ readOnlyComponent,
60
+ emptyValueComponent,
61
+ value,
62
+ defaultValue,
63
+ ...rest
64
+ } = props;
65
+ // Props this component intentionally doesn't support — deleted at runtime so they can't leak
66
+ // through even if a caller forces them via plain JavaScript, bypassing the `Omit<>` above.
67
+ const UNSUPPORTED_PROPS = [
68
+ "size", // Recursica controls sizing via Radio.module.css variables, not Mantine's native size scale.
69
+ ] as const satisfies readonly (keyof MantineRadioGroupProps)[];
70
+
71
+ const sanitizedProps = omitUnsupportedProps(
72
+ filterStylingProps(rest, overStyled) as Record<string, unknown>,
73
+ UNSUPPORTED_PROPS,
74
+ ) as Partial<typeof rest>;
75
+ const restRecord = sanitizedProps as Record<string, unknown>;
76
+
77
+ return (
78
+ <WithReadOnlyWrapper
79
+ className={className}
80
+ style={style as React.CSSProperties}
81
+ controlMaxWidth="var(--recursica_ui-kit_components_radio-button-item_properties_max-width)"
82
+ controlMinWidth={undefined}
83
+ overStyled={overStyled as true}
84
+ labelElement="div" // Strictly override. ARIA grouping prohibits interactive radios nested natively inside <label>.
85
+ formLayout={formLayout}
86
+ labelSize={labelSize}
87
+ labelAlignment={labelAlignment}
88
+ labelOptionalText={labelOptionalText}
89
+ labelWithEditIcon={labelWithEditIcon}
90
+ onLabelEditClick={onLabelEditClick}
91
+ label={label}
92
+ description={description}
93
+ assistiveText={assistiveText}
94
+ assistiveWithIcon={assistiveWithIcon}
95
+ error={error}
96
+ required={required}
97
+ withAsterisk={withAsterisk}
98
+ id={id}
99
+ readOnly={readOnly && !!readOnlyComponent}
100
+ readOnlyComponent={readOnlyComponent}
101
+ emptyValueComponent={emptyValueComponent}
102
+ readOnlyType="text"
103
+ readOnlyValue={value !== undefined ? value : defaultValue}
104
+ readOnlyNativeProps={props}
105
+ activeComponent={
106
+ <MantineRadio.Group
107
+ ref={ref}
108
+ /* Natively bind local disabled lock dynamically */
109
+ {...(sanitizedProps as unknown as MantineRadioGroupProps)}
110
+ disabled={readOnly || (restRecord as any).disabled}
111
+ value={value as any}
112
+ defaultValue={defaultValue as any}
113
+ >
114
+ <div className={styles.groupRoot} data-layout={formLayout}>
115
+ {children}
116
+ </div>
117
+ </MantineRadio.Group>
118
+ }
119
+ />
120
+ );
121
+ },
122
+ );
123
+
124
+ RadioGroup.displayName = "RadioGroup";
@@ -0,0 +1,36 @@
1
+ # Radio - Usage Guide
2
+
3
+ This document describes how to integrate and use the `Radio` component in your projects using `@recursica/adapter-mantine-v8`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { Radio } from "@recursica/adapter-mantine-v8";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { Radio } from "@recursica/adapter-mantine-v8";
20
+
21
+ export default function Demo() {
22
+ return <Radio label="Option 1" name="radio-group" value="1" defaultChecked />;
23
+ }
24
+ ```
25
+
26
+ ---
27
+
28
+ ## 3. Design System Integration
29
+
30
+ All Recursica components in the `@recursica/adapter-mantine-v8` package adhere strictly to design system spacing, scaling, and behavior patterns.
31
+
32
+ > [!IMPORTANT]
33
+ >
34
+ > - **Anti-override protection**: Rogues style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
35
+ > - **No Direct Layers**: Do not pass a `layer` prop to this component. To place it on a specific visual layer, wrap it in a `<Layer layer={0|1|2|3}>` component natively.
36
+ > - **Variables and Theming**: Styling is entirely determined by local CSS variables defined in `recursica_variables_scoped.css` and mapped in the component's CSS module.
@@ -0,0 +1,15 @@
1
+ # ReadOnlyField Implementation Notes
2
+
3
+ This document acts as a living record tracking edge cases and architectural choices made specific to the `ReadOnlyField` and its internal blocks (like `ReadOnlyTextField`).
4
+
5
+ ## 1. Stripping Mantine Assumptions
6
+
7
+ Unlike standard input variables, standard HTML output `<p>` tags inherently carry margin and spacing assumptions from core browser stylesheets. To correctly map `ReadOnlyTextField` elements gracefully inside the generic `FormControlWrapper` bounded context, we hardcode resets:
8
+
9
+ - `margin: 0` explicitly strips block flow gap so `FormControlWrapper` handles vertical rhythm.
10
+ - `min-height`: Native `Input` boxes typically have baseline padding borders. We map directly to `var(--recursica_ui-kit_components_read-only-field_properties_min-height)` to ensure a side-by-side editable `TextField` and `ReadOnlyField` perfectly share roughly identical visual heights.
11
+
12
+ ## 2. Unidirectional Editable Mode
13
+
14
+ The main wrapper intercepts `readOnly` boolean blocks, maintaining its own `isReadOnly` state. Natively, if a user clicks an exposed 'Edit' action (like our legacy SVG or custom `labelActionArea`), the context permanently switches to active.
15
+ There is intentionally no built-in reverse toggle inside typical field bindings (like input "Blur") to revert state. Parents must pass external controls to `readOnly` forcing the internal hooks to reset via standard `useEffect` propagation.
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { Box } from "@mantine/core";
3
+ import styles from "./ReadOnlyField.module.css";
4
+
5
+ export const ReadOnlyBooleanField: React.FC<{
6
+ checked: boolean;
7
+ label?: React.ReactNode;
8
+ }> = ({ checked, label }) => {
9
+ return (
10
+ <Box
11
+ component="span"
12
+ className={styles.textField}
13
+ style={{ display: "inline-flex", gap: "8px", alignItems: "baseline" }}
14
+ >
15
+ {label && <span style={{ fontWeight: 500 }}>{label}:</span>}
16
+ <span>{checked ? "True" : "False"}</span>
17
+ </Box>
18
+ );
19
+ };
20
+
21
+ ReadOnlyBooleanField.displayName = "ReadOnlyBooleanField";
@@ -0,0 +1,54 @@
1
+ /* LAYOUT SPACING OVERRIDES:
2
+ - Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens. */
3
+ .layoutOverride {
4
+ --form-control-margin-bottom: var(
5
+ --recursica_ui-kit_components_read-only-field_variants_layouts_stacked_properties_top-bottom-margin
6
+ );
7
+ }
8
+
9
+ .layoutOverride[data-form-layout="side-by-side"] {
10
+ --form-control-margin-bottom: var(
11
+ --recursica_ui-kit_components_read-only-field_variants_layouts_side-by-side_properties_top-bottom-margin
12
+ );
13
+ }
14
+
15
+ /* HARDCODED VALUES:
16
+ - margin: 0; padding: overrides native paragraph margins mapping back to form element flows.
17
+ */
18
+ .textField {
19
+ margin: 0; /* HARDCODE: Reset paragraph margin; assume wrapper controls layout */
20
+ display: flex;
21
+ align-items: center;
22
+ word-break: break-word;
23
+ padding: 0; /* HARDCODE: read-only fields have no specific padding defined by tokens, zeroing it. */
24
+ font-family: var(
25
+ --recursica_ui-kit_components_read-only-field_properties_text_font-family
26
+ );
27
+ font-size: var(
28
+ --recursica_ui-kit_components_read-only-field_properties_text_font-size
29
+ );
30
+ font-weight: var(
31
+ --recursica_ui-kit_components_read-only-field_properties_text_font-weight
32
+ );
33
+ letter-spacing: var(
34
+ --recursica_ui-kit_components_read-only-field_properties_text_letter-spacing
35
+ );
36
+ line-height: var(
37
+ --recursica_ui-kit_components_read-only-field_properties_text_line-height
38
+ );
39
+ font-style: var(
40
+ --recursica_ui-kit_components_read-only-field_properties_text_font-style
41
+ );
42
+ text-decoration: var(
43
+ --recursica_ui-kit_components_read-only-field_properties_text_text-decoration
44
+ );
45
+ text-transform: var(
46
+ --recursica_ui-kit_components_read-only-field_properties_text_text-transform
47
+ );
48
+ color: var(
49
+ --recursica_ui-kit_components_read-only-field_properties_colors_text-color
50
+ );
51
+ min-height: var(
52
+ --recursica_ui-kit_components_read-only-field_properties_min-height
53
+ );
54
+ }
@@ -0,0 +1,163 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import type { Meta, StoryObj } from "@storybook/react";
3
+ import { ReadOnlyField } from "./ReadOnlyField";
4
+ import { EmptyValueRenderer } from "@recursica/adapter-common";
5
+
6
+ const meta: Meta<typeof ReadOnlyField> = {
7
+ title: "UI Kit/ReadOnlyField",
8
+ component: ReadOnlyField,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ docs: {
12
+ description: {
13
+ component:
14
+ "The ReadOnlyField safely natively wraps data sets bypassing active HTML interaction hooks while natively retaining exact bounding visual layouts defined by internal Design System Tokens. Useful for creating strict data-review profiles or conditional form read-overs.",
15
+ },
16
+ },
17
+ },
18
+ args: {
19
+ label: "Read Only Label",
20
+ value: "Fixed Data Set Value",
21
+ assistiveText: "Helper description text beneath the node.",
22
+ type: "text",
23
+ },
24
+ argTypes: {
25
+ type: {
26
+ control: "select",
27
+ options: ["text", "number"], // Add more as we support them
28
+ },
29
+ labelWithEditIcon: {
30
+ control: "boolean",
31
+ },
32
+ // We cannot natively control a React.ElementType through standard primitive storybook panels.
33
+ },
34
+ };
35
+
36
+ export default meta;
37
+
38
+ type Story = StoryObj<typeof ReadOnlyField>;
39
+
40
+ /**
41
+ * Playground story demonstrating standard structural blocks of the ReadOnlyField module dynamically.
42
+ */
43
+ export const Default: Story = {
44
+ args: {},
45
+ };
46
+
47
+ /**
48
+ * Shows the default handler replacing missing mapping data directly with 'N/A'.
49
+ */
50
+ export const EmptyValue: Story = {
51
+ args: {
52
+ value: "",
53
+ label: "Empty String Evaluated Automatically (Default 'N/A')",
54
+ },
55
+ };
56
+
57
+ const CustomEmptyTextRenderer: React.FC<{ value?: any }> & {
58
+ check?: (v: any) => boolean;
59
+ } = (props) => <EmptyValueRenderer {...props} emptyText="No Data Found" />;
60
+ CustomEmptyTextRenderer.check = EmptyValueRenderer.check;
61
+
62
+ /**
63
+ * Demonstrates overriding the baseline verbiage internally utilizing the exported `EmptyValueRenderer` while inheriting default evaluation checks.
64
+ */
65
+ export const CustomEmptyText: Story = {
66
+ args: {
67
+ value: null,
68
+ label: "Custom Empty Text Default",
69
+ emptyValueComponent: CustomEmptyTextRenderer,
70
+ },
71
+ };
72
+
73
+ const CustomEmptyCheckRenderer: React.FC<{ value?: any }> & {
74
+ check?: (v: any) => boolean;
75
+ } = () => {
76
+ return <i>Custom HTML Markup Provided</i>;
77
+ };
78
+ CustomEmptyCheckRenderer.check = (val) => val === "EMPTY_MOCK";
79
+
80
+ /**
81
+ * Validates a fully overridden emptyValueComponent injecting custom rendering boundaries alongside explicitly tailored validation rules evaluating datasets dynamically.
82
+ */
83
+ export const CustomEmptyRenderer: Story = {
84
+ args: {
85
+ value: "EMPTY_MOCK",
86
+ label: "Custom Logic Evaluation Binding",
87
+ emptyValueComponent: CustomEmptyCheckRenderer,
88
+ },
89
+ };
90
+
91
+ /**
92
+ * Validates the core read-only label execution and base default spacing bindings globally.
93
+ */
94
+ export const StackedDefault: Story = {
95
+ args: {
96
+ formLayout: "stacked",
97
+ value: "Some fixed readable text",
98
+ },
99
+ };
100
+
101
+ /**
102
+ * Binds side-by-side structures globally maintaining correct inline gutter layouts.
103
+ */
104
+ export const SideBySide: Story = {
105
+ args: {
106
+ formLayout: "side-by-side",
107
+ value: "Some fixed readable text mapping horizontally",
108
+ },
109
+ };
110
+
111
+ /**
112
+ * Tests the fallback structural logic when Edit icon natively overrides required bindings.
113
+ */
114
+ export const WithEditIcon: Story = {
115
+ args: {
116
+ labelWithEditIcon: true,
117
+ required: true,
118
+ value: "Editable fixed structure",
119
+ },
120
+ };
121
+
122
+ /**
123
+ * Demonstrates how the generic ReadOnlyField handles mapping different internal data types.
124
+ * Currently, all types safely default to string extraction mapping into the text renderer natively.
125
+ */
126
+ export const DataTypes: Story = {
127
+ args: {},
128
+ render: () => (
129
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
130
+ <ReadOnlyField
131
+ label="Text Mapping"
132
+ type="text"
133
+ value="Standard string output"
134
+ />
135
+ <ReadOnlyField label="Number Mapping" type="number" value={1234567.89} />
136
+ <ReadOnlyField
137
+ label="Date Mapping"
138
+ type="date"
139
+ value={new Date("2026-04-28T12:00:00Z").toLocaleDateString()}
140
+ />
141
+ <ReadOnlyField
142
+ label="Boolean Mapping (True)"
143
+ type="boolean"
144
+ value={true}
145
+ />
146
+ <ReadOnlyField
147
+ label="Boolean Mapping (False)"
148
+ type="boolean"
149
+ value={false}
150
+ />
151
+ <ReadOnlyField
152
+ label="Switch Mapping (True -> On)"
153
+ type="switch"
154
+ value={true}
155
+ />
156
+ <ReadOnlyField
157
+ label="Switch Mapping (False -> Off)"
158
+ type="switch"
159
+ value={false}
160
+ />
161
+ </div>
162
+ ),
163
+ };
@@ -0,0 +1 @@
1
+ // Placeholder for future ReadOnlyField component tests. Add tests here if/when needed.
@@ -0,0 +1,114 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React, { forwardRef } from "react";
3
+ import {
4
+ EmptyValueRenderer,
5
+ type ReadOnlyControlProps,
6
+ } from "@recursica/adapter-common";
7
+ import {
8
+ filterStylingProps,
9
+ type RecursicaOverStyled,
10
+ } from "../../utils/filterStylingProps";
11
+ import {
12
+ type FormControlWrapperProps,
13
+ FormControlWrapper,
14
+ } from "../FormControlWrapper/FormControlWrapper";
15
+ import { ReadOnlyTextField } from "./ReadOnlyTextField";
16
+ import styles from "./ReadOnlyField.module.css";
17
+
18
+ import { type RecursicaReadOnlyFieldProps as BaseRecursicaReadOnlyFieldProps } from "@recursica/adapter-common";
19
+
20
+ export interface RecursicaReadOnlyFieldProps
21
+ extends Omit<
22
+ FormControlWrapperProps,
23
+ "children" | "overStyled" | "controlMaxWidth" | "controlMinWidth"
24
+ >,
25
+ Pick<ReadOnlyControlProps, "emptyValueComponent">,
26
+ BaseRecursicaReadOnlyFieldProps {}
27
+
28
+ export type ReadOnlyFieldProps =
29
+ RecursicaOverStyled<RecursicaReadOnlyFieldProps>;
30
+
31
+ /**
32
+ * A native generic form control wrapper exclusively responsible for displaying fixed data.
33
+ * Internally maps to structural ReadOnly primitive blocks bridging standard `FormControlWrapper` layouts natively.
34
+ */
35
+ export const ReadOnlyField = forwardRef<HTMLDivElement, ReadOnlyFieldProps>(
36
+ function ReadOnlyField(
37
+ {
38
+ value,
39
+ type = "text",
40
+ emptyValueComponent,
41
+ overStyled = false,
42
+ className,
43
+ style,
44
+ ...rest
45
+ },
46
+ ref,
47
+ ) {
48
+ let content: React.ReactNode = null;
49
+
50
+ // We still pass sanitized properties (like className/style/etc) strictly down.
51
+ const sanitizedProps = filterStylingProps(rest, overStyled);
52
+
53
+ const Renderer = emptyValueComponent || EmptyValueRenderer;
54
+ const isValueEmpty = (Renderer as any).check
55
+ ? (Renderer as any).check(value)
56
+ : EmptyValueRenderer.check(value);
57
+
58
+ const displayValue = isValueEmpty ? (
59
+ <Renderer value={value as any} />
60
+ ) : (
61
+ value
62
+ );
63
+
64
+ switch (type) {
65
+ case "boolean":
66
+ content = (
67
+ <ReadOnlyTextField
68
+ value={
69
+ value === true ? "True" : value === false ? "False" : displayValue
70
+ }
71
+ overStyled={overStyled as true}
72
+ />
73
+ );
74
+ break;
75
+ case "switch":
76
+ content = (
77
+ <ReadOnlyTextField
78
+ value={
79
+ value === true ? "On" : value === false ? "Off" : displayValue
80
+ }
81
+ overStyled={overStyled as true}
82
+ />
83
+ );
84
+ break;
85
+ case "text":
86
+ default:
87
+ content = (
88
+ <ReadOnlyTextField
89
+ value={displayValue}
90
+ overStyled={overStyled as true}
91
+ />
92
+ );
93
+ break;
94
+ }
95
+
96
+ const wrapperClass = className
97
+ ? `${styles.layoutOverride} ${className}`
98
+ : styles.layoutOverride;
99
+
100
+ return (
101
+ <FormControlWrapper
102
+ ref={ref}
103
+ {...(sanitizedProps as any)}
104
+ overStyled={overStyled as true}
105
+ className={wrapperClass}
106
+ style={style}
107
+ >
108
+ {content}
109
+ </FormControlWrapper>
110
+ );
111
+ },
112
+ );
113
+
114
+ ReadOnlyField.displayName = "ReadOnlyField";
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { Box } from "@mantine/core";
3
+ import styles from "./ReadOnlyField.module.css";
4
+
5
+ export const ReadOnlySwitchField: React.FC<{
6
+ checked: boolean;
7
+ label?: React.ReactNode;
8
+ }> = ({ checked, label }) => {
9
+ return (
10
+ <Box
11
+ component="span"
12
+ className={styles.textField}
13
+ style={{ display: "inline-flex", gap: "8px", alignItems: "baseline" }}
14
+ >
15
+ {label && <span style={{ fontWeight: 500 }}>{label}:</span>}
16
+ <span>{checked ? "On" : "Off"}</span>
17
+ </Box>
18
+ );
19
+ };
20
+
21
+ ReadOnlySwitchField.displayName = "ReadOnlySwitchField";
@@ -0,0 +1,48 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import React from "react";
3
+ import { Box } from "@mantine/core";
4
+ import {
5
+ filterStylingProps,
6
+ type RecursicaOverStyled,
7
+ } from "../../utils/filterStylingProps";
8
+ import styles from "./ReadOnlyField.module.css";
9
+
10
+ export interface RecursicaReadOnlyTextFieldProps {
11
+ /** The value strictly rendered as text output */
12
+ value?: any;
13
+ }
14
+
15
+ export type ReadOnlyTextFieldProps =
16
+ RecursicaOverStyled<RecursicaReadOnlyTextFieldProps>;
17
+
18
+ export const ReadOnlyTextField: React.FC<ReadOnlyTextFieldProps> = ({
19
+ value,
20
+ overStyled = false,
21
+ ...rest
22
+ }) => {
23
+ const sanitizedProps = filterStylingProps(rest, overStyled);
24
+ const classNameProp = (sanitizedProps as Record<string, unknown>)
25
+ .className as string | undefined;
26
+
27
+ return (
28
+ <Box
29
+ component="p"
30
+ {...sanitizedProps}
31
+ className={
32
+ classNameProp
33
+ ? `${styles.textField} ${classNameProp}`
34
+ : styles.textField
35
+ }
36
+ >
37
+ {value != null
38
+ ? React.isValidElement(value)
39
+ ? value
40
+ : Array.isArray(value)
41
+ ? value.join(", ")
42
+ : String(value)
43
+ : ""}
44
+ </Box>
45
+ );
46
+ };
47
+
48
+ ReadOnlyTextField.displayName = "ReadOnlyTextField";
@@ -0,0 +1,44 @@
1
+ # ReadOnlyField - Usage Guide
2
+
3
+ This document describes how to integrate and use the `ReadOnlyField` component in your projects using `@recursica/adapter-mantine-v8`.
4
+
5
+ ---
6
+
7
+ ## 1. Import Reference
8
+
9
+ ```tsx
10
+ import { ReadOnlyField } from "@recursica/adapter-mantine-v8";
11
+ ```
12
+
13
+ ---
14
+
15
+ ## 2. Basic Example
16
+
17
+ ```tsx
18
+ import React from "react";
19
+ import { ReadOnlyField } from "@recursica/adapter-mantine-v8";
20
+
21
+ export default function Demo() {
22
+ return <ReadOnlyField label="API Key" value="sk_test_123456789" copyable />;
23
+ }
24
+ ```
25
+
26
+ ---
27
+
28
+ ## 3. Design System Integration
29
+
30
+ All Recursica components in the `@recursica/adapter-mantine-v8` package adhere strictly to design system spacing, scaling, and behavior patterns.
31
+
32
+ > [!IMPORTANT]
33
+ >
34
+ > - **Anti-override protection**: Rogues style injections (like inline `style` or arbitrary `className`) are automatically blocked by our prop layer unless `overStyled={true}` is explicitly provided.
35
+ > - **No Direct Layers**: Do not pass a `layer` prop to this component. To place it on a specific visual layer, wrap it in a `<Layer layer={0|1|2|3}>` component natively.
36
+ > - **Variables and Theming**: Styling is entirely determined by local CSS variables defined in `recursica_variables_scoped.css` and mapped in the component's CSS module.
37
+
38
+ ---
39
+
40
+ ## 4. Key Integration Features & Constraints
41
+
42
+ ### Editable Mode
43
+
44
+ If an edit action (e.g. via `labelActionArea`) is used to let a user switch a field from read-only to editable, that switch is one-directional in the UI — there is no built-in control (such as blurring the input) that switches it back to read-only. To revert to read-only, the parent must pass an updated `readOnly` value.