@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,49 @@
1
+ import { createElement, type ReactElement } from "react";
2
+ import { describe, it, expect } from "vitest";
3
+ import { markCurrentPageItem } from "@recursica/adapter-common";
4
+
5
+ type Props = Record<string, unknown>;
6
+
7
+ describe("markCurrentPageItem", () => {
8
+ it("marks the last item aria-current=page and leaves earlier items untouched", () => {
9
+ const items = markCurrentPageItem([
10
+ createElement("a", { href: "/one" }, "One"),
11
+ createElement("a", { href: "/two" }, "Two"),
12
+ createElement("span", {}, "Three"),
13
+ ]) as ReactElement<Props>[];
14
+
15
+ expect(items[0].props.href).toBe("/one");
16
+ expect(items[0].props["aria-current"]).toBeUndefined();
17
+ expect(items[1].props.href).toBe("/two");
18
+ expect(items[1].props["aria-current"]).toBeUndefined();
19
+ expect(items[2].props["aria-current"]).toBe("page");
20
+ });
21
+
22
+ it("strips href/onClick and drops tab order on an interactive last item", () => {
23
+ const onClick = () => {};
24
+ const [last] = markCurrentPageItem([
25
+ createElement("a", { href: "/current", onClick }, "Current"),
26
+ ]) as ReactElement<Props>[];
27
+
28
+ expect(last.props.href).toBeUndefined();
29
+ expect(last.props.onClick).toBeUndefined();
30
+ expect(last.props.tabIndex).toBe(-1);
31
+ expect(last.props["aria-current"]).toBe("page");
32
+ });
33
+
34
+ it("leaves a non-interactive last item's other props untouched", () => {
35
+ const [last] = markCurrentPageItem([
36
+ createElement("span", { className: "current" }, "Current"),
37
+ ]) as ReactElement<Props>[];
38
+
39
+ expect(last.props.className).toBe("current");
40
+ expect(last.props.tabIndex).toBeUndefined();
41
+ expect(last.props["aria-current"]).toBe("page");
42
+ });
43
+
44
+ it("passes through non-element children (e.g. plain text) unchanged", () => {
45
+ const items = markCurrentPageItem(["First", "Last"]);
46
+
47
+ expect(items).toEqual(["First", "Last"]);
48
+ });
49
+ });
@@ -0,0 +1,446 @@
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
+ * recursica-allow-brand: --recursica_brand_states_hover_color
8
+ * recursica-allow-brand: --recursica_brand_states_hover_opacity
9
+ */
10
+
11
+ /**
12
+ * IMPLEMENTATION NOTES:
13
+ *
14
+ * - Icon-Only Flexbox Hack: Mantine renders a hidden `.label` span even if `children` is empty.
15
+ * Because we apply `flex: 1` to `.label`, this empty span grows and pushes the `leftSection` (the icon)
16
+ * off-center. To fix this, we apply `display: none` to the label when `data-content="icon-only"`.
17
+ */
18
+ /* Baseline and Reset */
19
+ .root {
20
+ box-sizing: border-box;
21
+ margin: 0;
22
+ border-style: solid;
23
+ overflow: hidden; /* Truncation bounding box */
24
+ position: relative;
25
+ transition: all 0.2s ease;
26
+ width: fit-content; /* Prevent stretching in flex columns */
27
+ max-width: 100%; /* Let a constraining parent (e.g. max-width container) actually shrink the button; fit-content alone ignores it */
28
+
29
+ /* Shared Defaults */
30
+ font-family: var(
31
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-family
32
+ );
33
+ font-size: var(
34
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-size
35
+ );
36
+ font-style: var(
37
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-style
38
+ );
39
+ font-weight: var(
40
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_font-weight
41
+ );
42
+ letter-spacing: var(
43
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_letter-spacing
44
+ );
45
+ text-decoration: var(
46
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-decoration
47
+ );
48
+ text-transform: var(
49
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_text-transform
50
+ );
51
+ }
52
+
53
+ /* Internal Mantine reset & layout logic for Truncation */
54
+ .root > *:not(.loader) {
55
+ min-width: 0;
56
+ position: relative;
57
+ z-index: 1;
58
+ }
59
+
60
+ .loader {
61
+ /* Mantine absolutely positions this; we just need a hook to exclude it from the child reset */
62
+ }
63
+
64
+ .label {
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ min-width: 0;
69
+ flex: 1 1 0;
70
+ }
71
+
72
+ .labelText {
73
+ display: block;
74
+ min-width: 0;
75
+ overflow: clip; /* HARDCODE: `hidden` clips descenders (e.g. "g") when text_line-height is
76
+ tighter than the font's natural ascent+descent; overflow-clip-margin gives ink a small bleed
77
+ allowance while still clipping genuinely overflowing text (see Chip's IMPLEMENTATION_NOTES.md). */
78
+ overflow-clip-margin: 0.35em;
79
+ text-overflow: ellipsis;
80
+ white-space: nowrap;
81
+ font-size: inherit;
82
+ line-height: var(
83
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_text_line-height
84
+ );
85
+ }
86
+
87
+ .root[data-size="small"] .labelText {
88
+ line-height: var(
89
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_line-height
90
+ );
91
+ }
92
+
93
+ /* ==== SIZES ==== */
94
+ .root[data-size="default"] {
95
+ /* Set baseline paddings and min-width using generic tokens as baseline defaults */
96
+ padding: 0
97
+ var(
98
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_horizontal-padding
99
+ );
100
+ min-width: var(
101
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_min-width
102
+ );
103
+
104
+ height: var(
105
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_height
106
+ );
107
+
108
+ .labelText {
109
+ max-width: var(
110
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_max-label-width
111
+ );
112
+ }
113
+
114
+ .iconWrapper {
115
+ width: var(
116
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_icon
117
+ );
118
+ height: var(
119
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_icon
120
+ );
121
+ }
122
+
123
+ .section {
124
+ gap: var(
125
+ --recursica_ui-kit_components_button_variants_sizes_default_properties_icon-text-gap
126
+ );
127
+ }
128
+
129
+ &[data-content="label"] {
130
+ border-radius: var(
131
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_default_properties_border-radius
132
+ );
133
+ min-width: var(
134
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_default_properties_min-width
135
+ );
136
+ padding: 0
137
+ var(
138
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_default_properties_horizontal-padding
139
+ );
140
+ }
141
+
142
+ &[data-content="icon-label"] {
143
+ border-radius: var(
144
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_default_properties_border-radius
145
+ );
146
+ min-width: var(
147
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_default_properties_min-width
148
+ );
149
+ padding: 0
150
+ var(
151
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_default_properties_horizontal-padding
152
+ );
153
+ }
154
+
155
+ &[data-content="icon-only"] {
156
+ border-radius: var(
157
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_border-radius
158
+ );
159
+ min-width: var(
160
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_min-width
161
+ );
162
+ padding: 0
163
+ var(
164
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_default_properties_horizontal-padding
165
+ );
166
+ }
167
+ }
168
+
169
+ .root[data-size="small"] {
170
+ /* Set baseline paddings and min-width using generic tokens as baseline defaults */
171
+ padding: 0
172
+ var(
173
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_horizontal-padding
174
+ );
175
+ min-width: var(
176
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_min-width
177
+ );
178
+
179
+ height: var(
180
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_height
181
+ );
182
+
183
+ .labelText {
184
+ max-width: var(
185
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_max-label-width
186
+ );
187
+ }
188
+
189
+ .iconWrapper {
190
+ width: var(
191
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_icon
192
+ );
193
+ height: var(
194
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_icon
195
+ );
196
+ }
197
+
198
+ .section {
199
+ gap: var(
200
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_icon-text-gap
201
+ );
202
+ }
203
+
204
+ /* Override specific typography for small */
205
+ font-family: var(
206
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_font-family
207
+ );
208
+ font-size: var(
209
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_font-size
210
+ );
211
+ font-weight: var(
212
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_font-weight
213
+ );
214
+ font-style: var(
215
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_font-style
216
+ );
217
+ letter-spacing: var(
218
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_letter-spacing
219
+ );
220
+ text-decoration: var(
221
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_text-decoration
222
+ );
223
+ text-transform: var(
224
+ --recursica_ui-kit_components_button_variants_sizes_small_properties_text_text-transform
225
+ );
226
+
227
+ &[data-content="label"] {
228
+ border-radius: var(
229
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_small_properties_border-radius
230
+ );
231
+ min-width: var(
232
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_small_properties_min-width
233
+ );
234
+ padding: 0
235
+ var(
236
+ --recursica_ui-kit_components_button_variants_content_label_variants_sizes_small_properties_horizontal-padding
237
+ );
238
+ }
239
+
240
+ &[data-content="icon-label"] {
241
+ border-radius: var(
242
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_small_properties_border-radius
243
+ );
244
+ min-width: var(
245
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_small_properties_min-width
246
+ );
247
+ padding: 0
248
+ var(
249
+ --recursica_ui-kit_components_button_variants_content_icon-label_variants_sizes_small_properties_horizontal-padding
250
+ );
251
+ }
252
+
253
+ &[data-content="icon-only"] {
254
+ border-radius: var(
255
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_small_properties_border-radius
256
+ );
257
+ min-width: var(
258
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_small_properties_min-width
259
+ );
260
+ padding: 0
261
+ var(
262
+ --recursica_ui-kit_components_button_variants_content_icon-only_variants_sizes_small_properties_horizontal-padding
263
+ );
264
+ }
265
+ }
266
+
267
+ /* Icon Resets */
268
+ .iconWrapper {
269
+ display: flex;
270
+ align-items: center;
271
+ justify-content: center;
272
+ flex-shrink: 0;
273
+ }
274
+ .iconWrapper > * {
275
+ width: 100%;
276
+ height: 100%;
277
+ object-fit: contain;
278
+ }
279
+
280
+ .section {
281
+ min-width: 0;
282
+ }
283
+
284
+ /* Icon-only logic overrides */
285
+ .root[data-content="icon-only"] .label {
286
+ display: none;
287
+ }
288
+ .root[data-content="icon-only"] .section {
289
+ gap: 0;
290
+ }
291
+ .root[data-content="icon-only"] .section[data-position="left"] {
292
+ margin-inline-end: 0;
293
+ }
294
+ .root[data-content="icon-only"] .section[data-position="right"] {
295
+ margin-inline-start: 0;
296
+ }
297
+
298
+ /* Disabled */
299
+ .root:disabled {
300
+ cursor: not-allowed;
301
+ }
302
+
303
+ /* Global Hover Hack Overlay */
304
+ .root::after {
305
+ content: "";
306
+ position: absolute;
307
+ inset: 0;
308
+ border-radius: inherit;
309
+ z-index: 0;
310
+ pointer-events: none;
311
+ transition: opacity 150ms ease;
312
+ opacity: 0;
313
+ background-color: var(--recursica_brand_states_hover_color);
314
+ }
315
+ .root:hover:not(:disabled)::after {
316
+ opacity: var(--recursica_brand_states_hover_opacity);
317
+ }
318
+ /* ==== VARIANTS ==== */
319
+
320
+ /* SOLID */
321
+ .root[data-variant="solid"] {
322
+ border-width: var(
323
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_border-size
324
+ );
325
+ box-shadow: var(
326
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_elevation
327
+ );
328
+ background-color: var(
329
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_background-color
330
+ );
331
+ border-color: var(
332
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_border-color
333
+ );
334
+ color: var(
335
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text-color
336
+ );
337
+ /* Exposed so the loading-state Loader (color="var(--button-color)" in Button.tsx) matches
338
+ this exact text-color token instead of Mantine's own unrelated --button-color default.
339
+ !important: Mantine's own Button sets --button-color via an inline `style` attribute on
340
+ this same root element, which normal-weight stylesheet rules can never outrank regardless
341
+ of selector specificity (see IMPLEMENTATION_NOTES.md). */
342
+ --button-color: var(
343
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_text-color
344
+ ) !important;
345
+
346
+ .iconWrapper {
347
+ color: var(
348
+ --recursica_ui-kit_components_button_variants_styles_solid_properties_colors_icon-color
349
+ );
350
+ }
351
+ }
352
+ .root[data-variant="solid"]:disabled {
353
+ opacity: var(
354
+ --recursica_ui-kit_components_button_variants_styles_solid_variants_states_disabled_properties_opacity
355
+ );
356
+ box-shadow: var(
357
+ --recursica_ui-kit_components_button_variants_styles_solid_variants_states_disabled_properties_elevation
358
+ );
359
+ }
360
+
361
+ /* OUTLINE */
362
+ .root[data-variant="outline"] {
363
+ border-width: var(
364
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_border-size
365
+ );
366
+ box-shadow: var(
367
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_elevation
368
+ );
369
+ background-color: var(
370
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_background-color
371
+ );
372
+ border-color: var(
373
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_border-color
374
+ );
375
+ color: var(
376
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text-color
377
+ );
378
+ /* !important: see solid variant's identical comment above. */
379
+ --button-color: var(
380
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_text-color
381
+ ) !important;
382
+
383
+ .iconWrapper {
384
+ color: var(
385
+ --recursica_ui-kit_components_button_variants_styles_outline_properties_colors_icon-color
386
+ );
387
+ }
388
+ }
389
+ .root[data-variant="outline"]:disabled {
390
+ opacity: var(
391
+ --recursica_ui-kit_components_button_variants_styles_outline_variants_states_disabled_properties_opacity
392
+ );
393
+ box-shadow: var(
394
+ --recursica_ui-kit_components_button_variants_styles_outline_variants_states_disabled_properties_elevation
395
+ );
396
+ }
397
+
398
+ /* TEXT */
399
+ .root[data-variant="text"] {
400
+ border-width: var(
401
+ --recursica_ui-kit_components_button_variants_styles_text_properties_border-size
402
+ );
403
+ box-shadow: var(
404
+ --recursica_ui-kit_components_button_variants_styles_text_properties_elevation
405
+ );
406
+ background-color: var(
407
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_background-color
408
+ );
409
+ border-color: var(
410
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_border-color
411
+ );
412
+ color: var(
413
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_text-color
414
+ );
415
+ /* !important: see solid variant's identical comment above. */
416
+ --button-color: var(
417
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_text-color
418
+ ) !important;
419
+
420
+ .iconWrapper {
421
+ color: var(
422
+ --recursica_ui-kit_components_button_variants_styles_text_properties_colors_icon-color
423
+ );
424
+ }
425
+ }
426
+ .root[data-variant="text"]:disabled {
427
+ opacity: var(
428
+ --recursica_ui-kit_components_button_variants_styles_text_variants_states_disabled_properties_opacity
429
+ );
430
+ box-shadow: var(
431
+ --recursica_ui-kit_components_button_variants_styles_text_variants_states_disabled_properties_elevation
432
+ );
433
+ }
434
+
435
+ /* Focus State Mapping (native browser focus outline replaced with the recursica focus ring).
436
+ Placed after every variant's own box-shadow (elevation) rule so it wins the cascade at equal
437
+ attribute-selector specificity regardless of variant. */
438
+ .root:focus-visible {
439
+ outline: none;
440
+ box-shadow:
441
+ 0 0 0 var(--recursica_brand_states_focus_border-size)
442
+ var(--recursica_brand_states_focus_color),
443
+ 0 0 var(--recursica_brand_states_focus_blur)
444
+ var(--recursica_brand_states_focus_margin)
445
+ var(--recursica_brand_states_focus_color);
446
+ }
@@ -0,0 +1,196 @@
1
+ import React from "react";
2
+ import type { Meta, StoryObj } from "@storybook/react";
3
+ import { Button } from "./Button";
4
+ import { Layer } from "@recursica/adapter-common";
5
+
6
+ type ButtonStoryProps = React.ComponentProps<typeof Button>;
7
+
8
+ const meta: Meta<ButtonStoryProps> = {
9
+ title: "UI-Kit/Button",
10
+ component: Button,
11
+ tags: ["autodocs"],
12
+ argTypes: {
13
+ disabled: {
14
+ control: "boolean",
15
+ },
16
+ variant: {
17
+ control: "select",
18
+ options: ["solid", "outline", "text"],
19
+ description: "The visual variant of the button",
20
+ },
21
+ size: {
22
+ control: "radio",
23
+ options: ["default", "small"],
24
+ description: "The size of the button",
25
+ },
26
+ loading: {
27
+ control: "boolean",
28
+ description: "Sets the button to a loading state",
29
+ },
30
+ useRecursicaLoader: {
31
+ control: "boolean",
32
+ description:
33
+ "Use the Recursica Loader component instead of the default Mantine loader",
34
+ },
35
+ loaderVariant: {
36
+ control: "select",
37
+ options: ["oval", "bars", "dots"],
38
+ description: "The visual variant of the Recursica Loader",
39
+ },
40
+ loaderSize: {
41
+ control: "select",
42
+ options: [undefined, "sm", "md", "lg", "small", "default", "large"],
43
+ description: "The size variant for the loader",
44
+ },
45
+ },
46
+ args: {
47
+ useRecursicaLoader: true,
48
+ loaderVariant: "oval",
49
+ loaderSize: undefined,
50
+ },
51
+ };
52
+
53
+ export default meta;
54
+
55
+ type Story = StoryObj<ButtonStoryProps>;
56
+
57
+ export const Default: Story = {
58
+ args: {
59
+ children: "Explore Button",
60
+ variant: "solid",
61
+ size: "default",
62
+ disabled: false,
63
+ },
64
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
65
+ render: ({ withLayer, layer, ...args }: any) => {
66
+ return <Button {...args} />;
67
+ },
68
+ };
69
+
70
+ export const SolidDefault: Story = {
71
+ args: {
72
+ children: "Solid Default",
73
+ variant: "solid",
74
+ size: "default",
75
+ },
76
+ };
77
+
78
+ export const OutlineSmall: Story = {
79
+ args: {
80
+ children: "Outline Small",
81
+ variant: "outline",
82
+ size: "small",
83
+ },
84
+ };
85
+
86
+ export const TextWithIcon: Story = {
87
+ args: {
88
+ children: "Text With Icon",
89
+ variant: "text",
90
+ size: "default",
91
+ icon: (
92
+ <svg
93
+ xmlns="http://www.w3.org/2000/svg"
94
+ width="24"
95
+ height="24"
96
+ viewBox="0 0 24 24"
97
+ fill="none"
98
+ stroke="currentColor"
99
+ strokeWidth="2"
100
+ strokeLinecap="round"
101
+ strokeLinejoin="round"
102
+ >
103
+ <circle cx="11" cy="11" r="8"></circle>
104
+ <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
105
+ </svg>
106
+ ),
107
+ },
108
+ };
109
+
110
+ export const IconOnly: Story = {
111
+ args: {
112
+ variant: "solid",
113
+ size: "default",
114
+ "aria-label": "Search",
115
+ icon: (
116
+ <svg
117
+ xmlns="http://www.w3.org/2000/svg"
118
+ width="24"
119
+ height="24"
120
+ viewBox="0 0 24 24"
121
+ fill="none"
122
+ stroke="currentColor"
123
+ strokeWidth="2"
124
+ strokeLinecap="round"
125
+ strokeLinejoin="round"
126
+ >
127
+ <circle cx="11" cy="11" r="8"></circle>
128
+ <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
129
+ </svg>
130
+ ),
131
+ },
132
+ };
133
+
134
+ export const LayerOneSolid: Story = {
135
+ args: {
136
+ children: "Layer 1 Solid",
137
+ variant: "solid",
138
+ size: "default",
139
+ },
140
+ render: (args: ButtonStoryProps) => (
141
+ <Layer layer={1} style={{ padding: "24px" }}>
142
+ <Button {...args} />
143
+ </Layer>
144
+ ),
145
+ };
146
+
147
+ export const DisabledSolid: Story = {
148
+ args: {
149
+ children: "Disabled Solid",
150
+ variant: "solid",
151
+ size: "default",
152
+ disabled: true,
153
+ },
154
+ };
155
+
156
+ export const PolymorphicAsLink: Story = {
157
+ args: {
158
+ children: "Button as Link",
159
+ variant: "solid",
160
+ size: "default",
161
+ component: "a",
162
+ href: "https://example.com",
163
+ target: "_blank",
164
+ },
165
+ };
166
+
167
+ export const TruncatedLabel: Story = {
168
+ args: {
169
+ children:
170
+ "This is an exceptionally long button label designed to demonstrate how the component handles text overflow by applying an ellipsis rather than breaking the layout or wrapping to multiple lines.",
171
+ variant: "solid",
172
+ size: "default",
173
+ },
174
+ render: (args: ButtonStoryProps) => (
175
+ <div style={{ maxWidth: "250px" }}>
176
+ <Button {...args} />
177
+ </div>
178
+ ),
179
+ };
180
+
181
+ export const Loading: Story = {
182
+ args: {
183
+ children: "Saving Changes",
184
+ variant: "solid",
185
+ size: "default",
186
+ loading: true,
187
+ },
188
+ parameters: {
189
+ docs: {
190
+ description: {
191
+ story:
192
+ "When `loading={true}` is applied, the Button injects the Recursica `<Loader />` component. Per Recursica design rules, placing a Button in a loading state automatically forces the `disabled={true}` state on the underlying element. This ensures the button immediately receives the brand theme disabled opacities without relying solely on semantic logic.",
193
+ },
194
+ },
195
+ },
196
+ };