@mich8060/unified-design-system 0.1.10

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 (454) hide show
  1. package/LICENSE +21 -0
  2. package/README.lib.md +103 -0
  3. package/README.md +265 -0
  4. package/dist/LICENSE +21 -0
  5. package/dist/README.md +103 -0
  6. package/dist/package.json +49 -0
  7. package/dist/styles.css +20544 -0
  8. package/dist/uds-components.es.js +67031 -0
  9. package/dist/uds-components.es.js.map +1 -0
  10. package/dist/uds-components.umd.js +67048 -0
  11. package/dist/uds-components.umd.js.map +1 -0
  12. package/package.json +158 -0
  13. package/src/styles/_typography.scss +932 -0
  14. package/src/styles/_utilities.scss +3738 -0
  15. package/src/styles/_variables.scss +620 -0
  16. package/src/styles/prism-custom.css +204 -0
  17. package/src/styles/prism-custom.scss +205 -0
  18. package/src/styles/tokens.css +1463 -0
  19. package/src/styles/tokens.scss +1116 -0
  20. package/src/ui/Accordion/Accordion.ai.md +69 -0
  21. package/src/ui/Accordion/Accordion.scss +87 -0
  22. package/src/ui/Accordion/Accordion.spec.ts +25 -0
  23. package/src/ui/Accordion/Accordion.stories.tsx +46 -0
  24. package/src/ui/Accordion/Accordion.test.tsx +54 -0
  25. package/src/ui/Accordion/Accordion.tsx +73 -0
  26. package/src/ui/Accordion/Accordion.types.ts +15 -0
  27. package/src/ui/Accordion/index.js +1 -0
  28. package/src/ui/ActionMenu/ActionMenu.ai.md +106 -0
  29. package/src/ui/ActionMenu/ActionMenu.jsx +437 -0
  30. package/src/ui/ActionMenu/ActionMenu.scss +252 -0
  31. package/src/ui/ActionMenu/ActionMenu.spec.ts +12 -0
  32. package/src/ui/ActionMenu/ActionMenu.stories.jsx +14 -0
  33. package/src/ui/ActionMenu/ActionMenu.stories.tsx +124 -0
  34. package/src/ui/ActionMenu/ActionMenu.test.tsx +1 -0
  35. package/src/ui/ActionMenu/ActionMenu.tsx +6 -0
  36. package/src/ui/ActionMenu/ActionMenu.types.ts +3 -0
  37. package/src/ui/ActionMenu/index.js +1 -0
  38. package/src/ui/Avatar/Avatar.ai.md +54 -0
  39. package/src/ui/Avatar/Avatar.jsx +49 -0
  40. package/src/ui/Avatar/Avatar.scss +87 -0
  41. package/src/ui/Avatar/Avatar.spec.ts +12 -0
  42. package/src/ui/Avatar/Avatar.stories.jsx +14 -0
  43. package/src/ui/Avatar/Avatar.stories.tsx +14 -0
  44. package/src/ui/Avatar/Avatar.test.tsx +1 -0
  45. package/src/ui/Avatar/Avatar.tsx +6 -0
  46. package/src/ui/Avatar/Avatar.types.ts +3 -0
  47. package/src/ui/Avatar/index.js +1 -0
  48. package/src/ui/Badge/Badge.ai.md +37 -0
  49. package/src/ui/Badge/Badge.jsx +64 -0
  50. package/src/ui/Badge/Badge.scss +84 -0
  51. package/src/ui/Badge/Badge.spec.ts +12 -0
  52. package/src/ui/Badge/Badge.stories.jsx +14 -0
  53. package/src/ui/Badge/Badge.stories.tsx +14 -0
  54. package/src/ui/Badge/Badge.test.tsx +1 -0
  55. package/src/ui/Badge/Badge.tsx +6 -0
  56. package/src/ui/Badge/Badge.types.ts +3 -0
  57. package/src/ui/Badge/index.js +1 -0
  58. package/src/ui/Branding/Branding.ai.md +81 -0
  59. package/src/ui/Branding/Branding.jsx +127 -0
  60. package/src/ui/Branding/Branding.scss +57 -0
  61. package/src/ui/Branding/Branding.spec.ts +12 -0
  62. package/src/ui/Branding/Branding.stories.jsx +14 -0
  63. package/src/ui/Branding/Branding.stories.tsx +14 -0
  64. package/src/ui/Branding/Branding.test.tsx +1 -0
  65. package/src/ui/Branding/Branding.tsx +6 -0
  66. package/src/ui/Branding/Branding.types.ts +3 -0
  67. package/src/ui/Branding/index.js +1 -0
  68. package/src/ui/Breadcrumb/Breadcrumb.ai.md +50 -0
  69. package/src/ui/Breadcrumb/Breadcrumb.jsx +167 -0
  70. package/src/ui/Breadcrumb/Breadcrumb.scss +46 -0
  71. package/src/ui/Breadcrumb/Breadcrumb.spec.ts +12 -0
  72. package/src/ui/Breadcrumb/Breadcrumb.stories.jsx +26 -0
  73. package/src/ui/Breadcrumb/Breadcrumb.stories.tsx +14 -0
  74. package/src/ui/Breadcrumb/Breadcrumb.test.tsx +1 -0
  75. package/src/ui/Breadcrumb/Breadcrumb.tsx +6 -0
  76. package/src/ui/Breadcrumb/Breadcrumb.types.ts +3 -0
  77. package/src/ui/Breadcrumb/index.js +2 -0
  78. package/src/ui/Button/Button.ai.md +122 -0
  79. package/src/ui/Button/Button.figma.tsx +49 -0
  80. package/src/ui/Button/Button.scss +188 -0
  81. package/src/ui/Button/Button.spec.ts +52 -0
  82. package/src/ui/Button/Button.stories.tsx +199 -0
  83. package/src/ui/Button/Button.test.tsx +85 -0
  84. package/src/ui/Button/Button.tsx +131 -0
  85. package/src/ui/Button/Button.types.ts +32 -0
  86. package/src/ui/Button/index.js +1 -0
  87. package/src/ui/Calendar/Calendar.ai.md +151 -0
  88. package/src/ui/Calendar/Calendar.jsx +504 -0
  89. package/src/ui/Calendar/Calendar.scss +451 -0
  90. package/src/ui/Calendar/Calendar.spec.ts +12 -0
  91. package/src/ui/Calendar/Calendar.stories.jsx +14 -0
  92. package/src/ui/Calendar/Calendar.stories.tsx +14 -0
  93. package/src/ui/Calendar/Calendar.test.tsx +1 -0
  94. package/src/ui/Calendar/Calendar.tsx +6 -0
  95. package/src/ui/Calendar/Calendar.types.ts +3 -0
  96. package/src/ui/Calendar/index.js +1 -0
  97. package/src/ui/Card/Card.ai.md +41 -0
  98. package/src/ui/Card/Card.jsx +25 -0
  99. package/src/ui/Card/Card.scss +47 -0
  100. package/src/ui/Card/Card.spec.ts +12 -0
  101. package/src/ui/Card/Card.stories.jsx +28 -0
  102. package/src/ui/Card/Card.stories.tsx +14 -0
  103. package/src/ui/Card/Card.test.tsx +1 -0
  104. package/src/ui/Card/Card.tsx +6 -0
  105. package/src/ui/Card/Card.types.ts +3 -0
  106. package/src/ui/Card/index.js +1 -0
  107. package/src/ui/Checkbox/Checkbox.ai.md +50 -0
  108. package/src/ui/Checkbox/Checkbox.jsx +73 -0
  109. package/src/ui/Checkbox/Checkbox.scss +115 -0
  110. package/src/ui/Checkbox/Checkbox.spec.ts +12 -0
  111. package/src/ui/Checkbox/Checkbox.stories.jsx +14 -0
  112. package/src/ui/Checkbox/Checkbox.stories.tsx +14 -0
  113. package/src/ui/Checkbox/Checkbox.test.tsx +1 -0
  114. package/src/ui/Checkbox/Checkbox.tsx +6 -0
  115. package/src/ui/Checkbox/Checkbox.types.ts +3 -0
  116. package/src/ui/Checkbox/index.js +1 -0
  117. package/src/ui/Chip/Chip.ai.md +43 -0
  118. package/src/ui/Chip/Chip.jsx +102 -0
  119. package/src/ui/Chip/Chip.scss +118 -0
  120. package/src/ui/Chip/Chip.spec.ts +12 -0
  121. package/src/ui/Chip/Chip.stories.jsx +14 -0
  122. package/src/ui/Chip/Chip.stories.tsx +14 -0
  123. package/src/ui/Chip/Chip.test.tsx +1 -0
  124. package/src/ui/Chip/Chip.tsx +6 -0
  125. package/src/ui/Chip/Chip.types.ts +3 -0
  126. package/src/ui/Chip/index.js +1 -0
  127. package/src/ui/Datepicker/Datepicker.ai.md +45 -0
  128. package/src/ui/Datepicker/Datepicker.jsx +330 -0
  129. package/src/ui/Datepicker/Datepicker.scss +206 -0
  130. package/src/ui/Datepicker/Datepicker.spec.ts +12 -0
  131. package/src/ui/Datepicker/Datepicker.stories.jsx +14 -0
  132. package/src/ui/Datepicker/Datepicker.stories.tsx +14 -0
  133. package/src/ui/Datepicker/Datepicker.test.tsx +1 -0
  134. package/src/ui/Datepicker/Datepicker.tsx +6 -0
  135. package/src/ui/Datepicker/Datepicker.types.ts +3 -0
  136. package/src/ui/Datepicker/index.js +2 -0
  137. package/src/ui/Divider/Divider.ai.md +34 -0
  138. package/src/ui/Divider/Divider.jsx +89 -0
  139. package/src/ui/Divider/Divider.scss +116 -0
  140. package/src/ui/Divider/Divider.spec.ts +12 -0
  141. package/src/ui/Divider/Divider.stories.jsx +14 -0
  142. package/src/ui/Divider/Divider.stories.tsx +14 -0
  143. package/src/ui/Divider/Divider.test.tsx +1 -0
  144. package/src/ui/Divider/Divider.tsx +6 -0
  145. package/src/ui/Divider/Divider.types.ts +3 -0
  146. package/src/ui/Divider/index.js +1 -0
  147. package/src/ui/DotStatus/DotStatus.ai.md +36 -0
  148. package/src/ui/DotStatus/DotStatus.jsx +64 -0
  149. package/src/ui/DotStatus/DotStatus.scss +87 -0
  150. package/src/ui/DotStatus/DotStatus.spec.ts +12 -0
  151. package/src/ui/DotStatus/DotStatus.stories.jsx +14 -0
  152. package/src/ui/DotStatus/DotStatus.stories.tsx +14 -0
  153. package/src/ui/DotStatus/DotStatus.test.tsx +1 -0
  154. package/src/ui/DotStatus/DotStatus.tsx +6 -0
  155. package/src/ui/DotStatus/DotStatus.types.ts +3 -0
  156. package/src/ui/DotStatus/index.js +1 -0
  157. package/src/ui/Dropdown/Dropdown.ai.md +118 -0
  158. package/src/ui/Dropdown/Dropdown.scss +129 -0
  159. package/src/ui/Dropdown/Dropdown.spec.ts +54 -0
  160. package/src/ui/Dropdown/Dropdown.stories.tsx +59 -0
  161. package/src/ui/Dropdown/Dropdown.test.tsx +37 -0
  162. package/src/ui/Dropdown/Dropdown.tsx +119 -0
  163. package/src/ui/Dropdown/Dropdown.types.ts +25 -0
  164. package/src/ui/Dropdown/index.js +1 -0
  165. package/src/ui/EventCard/EventCard.ai.md +101 -0
  166. package/src/ui/EventCard/EventCard.jsx +92 -0
  167. package/src/ui/EventCard/EventCard.scss +186 -0
  168. package/src/ui/EventCard/EventCard.spec.ts +12 -0
  169. package/src/ui/EventCard/EventCard.stories.jsx +14 -0
  170. package/src/ui/EventCard/EventCard.stories.tsx +14 -0
  171. package/src/ui/EventCard/EventCard.test.tsx +1 -0
  172. package/src/ui/EventCard/EventCard.tsx +6 -0
  173. package/src/ui/EventCard/EventCard.types.ts +3 -0
  174. package/src/ui/EventCard/index.js +1 -0
  175. package/src/ui/Field/Field.ai.md +69 -0
  176. package/src/ui/Field/Field.jsx +89 -0
  177. package/src/ui/Field/Field.scss +76 -0
  178. package/src/ui/Field/Field.spec.ts +12 -0
  179. package/src/ui/Field/Field.stories.jsx +14 -0
  180. package/src/ui/Field/Field.stories.tsx +14 -0
  181. package/src/ui/Field/Field.test.tsx +1 -0
  182. package/src/ui/Field/Field.tsx +6 -0
  183. package/src/ui/Field/Field.types.ts +3 -0
  184. package/src/ui/Field/index.js +1 -0
  185. package/src/ui/FileUpload/FileUpload.ai.md +38 -0
  186. package/src/ui/FileUpload/FileUpload.figma.tsx +28 -0
  187. package/src/ui/FileUpload/FileUpload.jsx +153 -0
  188. package/src/ui/FileUpload/FileUpload.scss +78 -0
  189. package/src/ui/FileUpload/FileUpload.spec.ts +12 -0
  190. package/src/ui/FileUpload/FileUpload.stories.jsx +14 -0
  191. package/src/ui/FileUpload/FileUpload.stories.tsx +14 -0
  192. package/src/ui/FileUpload/FileUpload.test.tsx +1 -0
  193. package/src/ui/FileUpload/FileUpload.tsx +6 -0
  194. package/src/ui/FileUpload/FileUpload.types.ts +3 -0
  195. package/src/ui/FileUpload/index.js +2 -0
  196. package/src/ui/Flex/Flex.ai.md +130 -0
  197. package/src/ui/Flex/Flex.jsx +53 -0
  198. package/src/ui/Flex/Flex.scss +119 -0
  199. package/src/ui/Flex/Flex.spec.ts +12 -0
  200. package/src/ui/Flex/Flex.stories.jsx +14 -0
  201. package/src/ui/Flex/Flex.stories.tsx +14 -0
  202. package/src/ui/Flex/Flex.test.tsx +1 -0
  203. package/src/ui/Flex/Flex.tsx +6 -0
  204. package/src/ui/Flex/Flex.types.ts +3 -0
  205. package/src/ui/Flex/index.js +1 -0
  206. package/src/ui/Icon/Icon.ai.md +46 -0
  207. package/src/ui/Icon/Icon.figma.tsx +22 -0
  208. package/src/ui/Icon/Icon.jsx +47 -0
  209. package/src/ui/Icon/Icon.scss +1 -0
  210. package/src/ui/Icon/Icon.spec.ts +12 -0
  211. package/src/ui/Icon/Icon.stories.jsx +14 -0
  212. package/src/ui/Icon/Icon.stories.tsx +14 -0
  213. package/src/ui/Icon/Icon.test.tsx +1 -0
  214. package/src/ui/Icon/Icon.tsx +6 -0
  215. package/src/ui/Icon/Icon.types.ts +3 -0
  216. package/src/ui/Icon/index.js +1 -0
  217. package/src/ui/ImageAspect/ImageAspect.ai.md +37 -0
  218. package/src/ui/ImageAspect/ImageAspect.jsx +56 -0
  219. package/src/ui/ImageAspect/ImageAspect.scss +62 -0
  220. package/src/ui/ImageAspect/ImageAspect.spec.ts +12 -0
  221. package/src/ui/ImageAspect/ImageAspect.stories.jsx +14 -0
  222. package/src/ui/ImageAspect/ImageAspect.stories.tsx +14 -0
  223. package/src/ui/ImageAspect/ImageAspect.test.tsx +1 -0
  224. package/src/ui/ImageAspect/ImageAspect.tsx +6 -0
  225. package/src/ui/ImageAspect/ImageAspect.types.ts +3 -0
  226. package/src/ui/ImageAspect/index.js +1 -0
  227. package/src/ui/Input/Input.ai.md +89 -0
  228. package/src/ui/Input/Input.figma.tsx +35 -0
  229. package/src/ui/Input/Input.scss +126 -0
  230. package/src/ui/Input/Input.spec.ts +54 -0
  231. package/src/ui/Input/Input.stories.tsx +72 -0
  232. package/src/ui/Input/Input.test.tsx +70 -0
  233. package/src/ui/Input/Input.tsx +91 -0
  234. package/src/ui/Input/Input.types.ts +22 -0
  235. package/src/ui/Input/index.js +2 -0
  236. package/src/ui/Key/Key.ai.md +31 -0
  237. package/src/ui/Key/Key.jsx +37 -0
  238. package/src/ui/Key/Key.scss +31 -0
  239. package/src/ui/Key/Key.spec.ts +12 -0
  240. package/src/ui/Key/Key.stories.jsx +14 -0
  241. package/src/ui/Key/Key.stories.tsx +14 -0
  242. package/src/ui/Key/Key.test.tsx +1 -0
  243. package/src/ui/Key/Key.tsx +6 -0
  244. package/src/ui/Key/Key.types.ts +3 -0
  245. package/src/ui/Key/index.js +1 -0
  246. package/src/ui/Menu/Menu.jsx +232 -0
  247. package/src/ui/Menu/Menu.scss +370 -0
  248. package/src/ui/Menu/Menu.spec.ts +12 -0
  249. package/src/ui/Menu/Menu.stories.jsx +41 -0
  250. package/src/ui/Menu/Menu.stories.tsx +14 -0
  251. package/src/ui/Menu/Menu.test.tsx +1 -0
  252. package/src/ui/Menu/Menu.tsx +6 -0
  253. package/src/ui/Menu/Menu.types.ts +3 -0
  254. package/src/ui/Menu/index.js +1 -0
  255. package/src/ui/MicroCalendar/MicroCalendar.ai.md +35 -0
  256. package/src/ui/MicroCalendar/MicroCalendar.jsx +393 -0
  257. package/src/ui/MicroCalendar/MicroCalendar.scss +289 -0
  258. package/src/ui/MicroCalendar/MicroCalendar.spec.ts +12 -0
  259. package/src/ui/MicroCalendar/MicroCalendar.stories.jsx +14 -0
  260. package/src/ui/MicroCalendar/MicroCalendar.stories.tsx +14 -0
  261. package/src/ui/MicroCalendar/MicroCalendar.test.tsx +1 -0
  262. package/src/ui/MicroCalendar/MicroCalendar.tsx +6 -0
  263. package/src/ui/MicroCalendar/MicroCalendar.types.ts +3 -0
  264. package/src/ui/MicroCalendar/index.js +1 -0
  265. package/src/ui/Modal/Modal.ai.md +150 -0
  266. package/src/ui/Modal/Modal.jsx +173 -0
  267. package/src/ui/Modal/Modal.scss +179 -0
  268. package/src/ui/Modal/Modal.spec.ts +12 -0
  269. package/src/ui/Modal/Modal.stories.jsx +14 -0
  270. package/src/ui/Modal/Modal.stories.tsx +14 -0
  271. package/src/ui/Modal/Modal.test.tsx +1 -0
  272. package/src/ui/Modal/Modal.tsx +6 -0
  273. package/src/ui/Modal/Modal.types.ts +3 -0
  274. package/src/ui/Modal/index.js +1 -0
  275. package/src/ui/Pagination/Pagination.ai.md +30 -0
  276. package/src/ui/Pagination/Pagination.jsx +237 -0
  277. package/src/ui/Pagination/Pagination.scss +182 -0
  278. package/src/ui/Pagination/Pagination.spec.ts +12 -0
  279. package/src/ui/Pagination/Pagination.stories.jsx +14 -0
  280. package/src/ui/Pagination/Pagination.stories.tsx +14 -0
  281. package/src/ui/Pagination/Pagination.test.tsx +1 -0
  282. package/src/ui/Pagination/Pagination.tsx +6 -0
  283. package/src/ui/Pagination/Pagination.types.ts +3 -0
  284. package/src/ui/Pagination/index.js +1 -0
  285. package/src/ui/PillToggle/PillToggle.ai.md +44 -0
  286. package/src/ui/PillToggle/PillToggle.jsx +56 -0
  287. package/src/ui/PillToggle/PillToggle.scss +84 -0
  288. package/src/ui/PillToggle/PillToggle.spec.ts +12 -0
  289. package/src/ui/PillToggle/PillToggle.stories.jsx +14 -0
  290. package/src/ui/PillToggle/PillToggle.stories.tsx +14 -0
  291. package/src/ui/PillToggle/PillToggle.test.tsx +1 -0
  292. package/src/ui/PillToggle/PillToggle.tsx +6 -0
  293. package/src/ui/PillToggle/PillToggle.types.ts +3 -0
  294. package/src/ui/PillToggle/index.js +1 -0
  295. package/src/ui/Playground/Playground.ai.md +96 -0
  296. package/src/ui/Playground/Playground.jsx +524 -0
  297. package/src/ui/Playground/Playground.scss +310 -0
  298. package/src/ui/Playground/Playground.spec.ts +12 -0
  299. package/src/ui/Playground/Playground.stories.jsx +14 -0
  300. package/src/ui/Playground/Playground.stories.tsx +14 -0
  301. package/src/ui/Playground/Playground.test.tsx +1 -0
  302. package/src/ui/Playground/Playground.tsx +6 -0
  303. package/src/ui/Playground/Playground.types.ts +3 -0
  304. package/src/ui/Playground/index.js +2 -0
  305. package/src/ui/ProgressCircle/ProgressCircle.ai.md +36 -0
  306. package/src/ui/ProgressCircle/ProgressCircle.jsx +147 -0
  307. package/src/ui/ProgressCircle/ProgressCircle.scss +143 -0
  308. package/src/ui/ProgressCircle/ProgressCircle.spec.ts +12 -0
  309. package/src/ui/ProgressCircle/ProgressCircle.stories.jsx +14 -0
  310. package/src/ui/ProgressCircle/ProgressCircle.stories.tsx +14 -0
  311. package/src/ui/ProgressCircle/ProgressCircle.test.tsx +1 -0
  312. package/src/ui/ProgressCircle/ProgressCircle.tsx +6 -0
  313. package/src/ui/ProgressCircle/ProgressCircle.types.ts +3 -0
  314. package/src/ui/ProgressCircle/index.js +1 -0
  315. package/src/ui/ProgressIndicator/ProgressIndicator.ai.md +27 -0
  316. package/src/ui/ProgressIndicator/ProgressIndicator.jsx +92 -0
  317. package/src/ui/ProgressIndicator/ProgressIndicator.scss +133 -0
  318. package/src/ui/ProgressIndicator/ProgressIndicator.spec.ts +12 -0
  319. package/src/ui/ProgressIndicator/ProgressIndicator.stories.jsx +14 -0
  320. package/src/ui/ProgressIndicator/ProgressIndicator.stories.tsx +14 -0
  321. package/src/ui/ProgressIndicator/ProgressIndicator.test.tsx +1 -0
  322. package/src/ui/ProgressIndicator/ProgressIndicator.tsx +6 -0
  323. package/src/ui/ProgressIndicator/ProgressIndicator.types.ts +3 -0
  324. package/src/ui/ProgressIndicator/index.js +1 -0
  325. package/src/ui/Radio/Radio.ai.md +53 -0
  326. package/src/ui/Radio/Radio.jsx +57 -0
  327. package/src/ui/Radio/Radio.scss +89 -0
  328. package/src/ui/Radio/Radio.spec.ts +12 -0
  329. package/src/ui/Radio/Radio.stories.jsx +14 -0
  330. package/src/ui/Radio/Radio.stories.tsx +14 -0
  331. package/src/ui/Radio/Radio.test.tsx +1 -0
  332. package/src/ui/Radio/Radio.tsx +6 -0
  333. package/src/ui/Radio/Radio.types.ts +3 -0
  334. package/src/ui/Radio/index.js +1 -0
  335. package/src/ui/Slider/Slider.ai.md +33 -0
  336. package/src/ui/Slider/Slider.jsx +283 -0
  337. package/src/ui/Slider/Slider.scss +156 -0
  338. package/src/ui/Slider/Slider.spec.ts +12 -0
  339. package/src/ui/Slider/Slider.stories.jsx +14 -0
  340. package/src/ui/Slider/Slider.stories.tsx +14 -0
  341. package/src/ui/Slider/Slider.test.tsx +1 -0
  342. package/src/ui/Slider/Slider.tsx +6 -0
  343. package/src/ui/Slider/Slider.types.ts +3 -0
  344. package/src/ui/Slider/index.js +1 -0
  345. package/src/ui/Status/Status.ai.md +36 -0
  346. package/src/ui/Status/Status.jsx +66 -0
  347. package/src/ui/Status/Status.scss +90 -0
  348. package/src/ui/Status/Status.spec.ts +12 -0
  349. package/src/ui/Status/Status.stories.jsx +14 -0
  350. package/src/ui/Status/Status.stories.tsx +14 -0
  351. package/src/ui/Status/Status.test.tsx +1 -0
  352. package/src/ui/Status/Status.tsx +6 -0
  353. package/src/ui/Status/Status.types.ts +3 -0
  354. package/src/ui/Status/index.js +1 -0
  355. package/src/ui/Steps/Steps.ai.md +56 -0
  356. package/src/ui/Steps/Steps.jsx +201 -0
  357. package/src/ui/Steps/Steps.scss +240 -0
  358. package/src/ui/Steps/Steps.spec.ts +12 -0
  359. package/src/ui/Steps/Steps.stories.jsx +14 -0
  360. package/src/ui/Steps/Steps.stories.tsx +14 -0
  361. package/src/ui/Steps/Steps.test.tsx +1 -0
  362. package/src/ui/Steps/Steps.tsx +6 -0
  363. package/src/ui/Steps/Steps.types.ts +3 -0
  364. package/src/ui/Steps/index.js +1 -0
  365. package/src/ui/Table/Table.ai.md +108 -0
  366. package/src/ui/Table/Table.jsx +143 -0
  367. package/src/ui/Table/Table.scss +90 -0
  368. package/src/ui/Table/Table.spec.ts +12 -0
  369. package/src/ui/Table/Table.stories.jsx +14 -0
  370. package/src/ui/Table/Table.stories.tsx +14 -0
  371. package/src/ui/Table/Table.test.tsx +1 -0
  372. package/src/ui/Table/Table.tsx +6 -0
  373. package/src/ui/Table/Table.types.ts +3 -0
  374. package/src/ui/Table/index.js +1 -0
  375. package/src/ui/Tabs/TabItem.jsx +80 -0
  376. package/src/ui/Tabs/Tabs.ai.md +52 -0
  377. package/src/ui/Tabs/Tabs.figma.tsx +30 -0
  378. package/src/ui/Tabs/Tabs.jsx +318 -0
  379. package/src/ui/Tabs/Tabs.scss +164 -0
  380. package/src/ui/Tabs/Tabs.spec.ts +12 -0
  381. package/src/ui/Tabs/Tabs.stories.jsx +18 -0
  382. package/src/ui/Tabs/Tabs.stories.tsx +14 -0
  383. package/src/ui/Tabs/Tabs.test.tsx +1 -0
  384. package/src/ui/Tabs/Tabs.tsx +6 -0
  385. package/src/ui/Tabs/Tabs.types.ts +3 -0
  386. package/src/ui/Tabs/index.js +3 -0
  387. package/src/ui/Tag/Tag.ai.md +59 -0
  388. package/src/ui/Tag/Tag.figma.tsx +29 -0
  389. package/src/ui/Tag/Tag.jsx +93 -0
  390. package/src/ui/Tag/Tag.scss +258 -0
  391. package/src/ui/Tag/Tag.spec.ts +12 -0
  392. package/src/ui/Tag/Tag.stories.jsx +14 -0
  393. package/src/ui/Tag/Tag.stories.tsx +14 -0
  394. package/src/ui/Tag/Tag.test.tsx +1 -0
  395. package/src/ui/Tag/Tag.tsx +6 -0
  396. package/src/ui/Tag/Tag.types.ts +3 -0
  397. package/src/ui/Tag/index.js +2 -0
  398. package/src/ui/Textarea/Textarea.ai.md +40 -0
  399. package/src/ui/Textarea/Textarea.figma.tsx +35 -0
  400. package/src/ui/Textarea/Textarea.jsx +68 -0
  401. package/src/ui/Textarea/Textarea.scss +71 -0
  402. package/src/ui/Textarea/Textarea.spec.ts +12 -0
  403. package/src/ui/Textarea/Textarea.stories.jsx +14 -0
  404. package/src/ui/Textarea/Textarea.stories.tsx +14 -0
  405. package/src/ui/Textarea/Textarea.test.tsx +1 -0
  406. package/src/ui/Textarea/Textarea.tsx +6 -0
  407. package/src/ui/Textarea/Textarea.types.ts +3 -0
  408. package/src/ui/Textarea/index.js +2 -0
  409. package/src/ui/Toast/Toast.ai.md +47 -0
  410. package/src/ui/Toast/Toast.jsx +75 -0
  411. package/src/ui/Toast/Toast.scss +132 -0
  412. package/src/ui/Toast/Toast.spec.ts +12 -0
  413. package/src/ui/Toast/Toast.stories.jsx +14 -0
  414. package/src/ui/Toast/Toast.stories.tsx +14 -0
  415. package/src/ui/Toast/Toast.test.tsx +1 -0
  416. package/src/ui/Toast/Toast.tsx +6 -0
  417. package/src/ui/Toast/Toast.types.ts +3 -0
  418. package/src/ui/Toast/index.js +2 -0
  419. package/src/ui/Toggle/Toggle.ai.md +37 -0
  420. package/src/ui/Toggle/Toggle.jsx +73 -0
  421. package/src/ui/Toggle/Toggle.scss +139 -0
  422. package/src/ui/Toggle/Toggle.spec.ts +12 -0
  423. package/src/ui/Toggle/Toggle.stories.jsx +14 -0
  424. package/src/ui/Toggle/Toggle.stories.tsx +14 -0
  425. package/src/ui/Toggle/Toggle.test.tsx +1 -0
  426. package/src/ui/Toggle/Toggle.tsx +6 -0
  427. package/src/ui/Toggle/Toggle.types.ts +3 -0
  428. package/src/ui/Toggle/index.js +1 -0
  429. package/src/ui/Tooltip/Tooltip.ai.md +33 -0
  430. package/src/ui/Tooltip/Tooltip.figma.tsx +24 -0
  431. package/src/ui/Tooltip/Tooltip.jsx +125 -0
  432. package/src/ui/Tooltip/Tooltip.scss +80 -0
  433. package/src/ui/Tooltip/Tooltip.spec.ts +12 -0
  434. package/src/ui/Tooltip/Tooltip.stories.jsx +14 -0
  435. package/src/ui/Tooltip/Tooltip.stories.tsx +14 -0
  436. package/src/ui/Tooltip/Tooltip.test.tsx +1 -0
  437. package/src/ui/Tooltip/Tooltip.tsx +6 -0
  438. package/src/ui/Tooltip/Tooltip.types.ts +3 -0
  439. package/src/ui/Tooltip/index.js +2 -0
  440. package/src/ui/UDS/UDS.jsx +52 -0
  441. package/src/ui/UDS/UDS.scss +49 -0
  442. package/src/ui/UDS/UDS.spec.ts +12 -0
  443. package/src/ui/UDS/UDS.stories.jsx +22 -0
  444. package/src/ui/UDS/UDS.stories.tsx +14 -0
  445. package/src/ui/UDS/UDS.test.tsx +1 -0
  446. package/src/ui/UDS/UDS.tsx +6 -0
  447. package/src/ui/UDS/UDS.types.ts +3 -0
  448. package/src/ui/UDS/index.js +1 -0
  449. package/src/ui/_spec/createMetaFromSpec.ts +35 -0
  450. package/src/ui/_spec/createStoryArgsFromSpec.ts +8 -0
  451. package/src/ui/_spec/generated/spec-props-reference.md +55 -0
  452. package/src/ui/_spec/specStorySync.test.ts +73 -0
  453. package/src/ui/_spec/types.ts +21 -0
  454. package/src/ui/index.js +66 -0
@@ -0,0 +1,153 @@
1
+ import React, { useState, useRef } from "react";
2
+ import Icon from "../Icon/Icon";
3
+ import "./FileUpload.scss";
4
+
5
+ const BASE_CLASS = "uds-file-upload";
6
+
7
+ /**
8
+ * FileUpload component for drag-and-drop and click-to-upload file selection
9
+ * @param {function} onFileSelect - Callback function when files are selected (receives FileList)
10
+ * @param {array} accept - Array of accepted file types (e.g., ['image/png', 'image/jpg'])
11
+ * @param {number} maxSize - Maximum file size in MB (default: 10)
12
+ * @param {string} acceptText - Text to display accepted file types (e.g., "PNG, JPG")
13
+ * @param {string} instructionText - Custom instruction text (default: "Drop files here or click to upload")
14
+ * @param {boolean} multiple - Whether to allow multiple file selection (default: false)
15
+ * @param {boolean} disabled - Whether the upload is disabled
16
+ * @param {string} className - Additional CSS classes
17
+ * @param {object} props - Additional props to pass to the file input
18
+ */
19
+ export default function FileUpload({
20
+ onFileSelect,
21
+ accept = [],
22
+ maxSize = 10,
23
+ acceptText,
24
+ instructionText = "Drop files here or click to upload",
25
+ multiple = false,
26
+ disabled = false,
27
+ className = "",
28
+ ...props
29
+ }) {
30
+ const [isDragging, setIsDragging] = useState(false);
31
+ const fileInputRef = useRef(null);
32
+
33
+ const classNames = [
34
+ BASE_CLASS,
35
+ isDragging && `${BASE_CLASS}--dragging`,
36
+ disabled && `${BASE_CLASS}--disabled`,
37
+ className,
38
+ ]
39
+ .filter(Boolean)
40
+ .join(" ");
41
+
42
+ const handleDragEnter = (e) => {
43
+ e.preventDefault();
44
+ e.stopPropagation();
45
+ if (!disabled) {
46
+ setIsDragging(true);
47
+ }
48
+ };
49
+
50
+ const handleDragLeave = (e) => {
51
+ e.preventDefault();
52
+ e.stopPropagation();
53
+ setIsDragging(false);
54
+ };
55
+
56
+ const handleDragOver = (e) => {
57
+ e.preventDefault();
58
+ e.stopPropagation();
59
+ };
60
+
61
+ const handleDrop = (e) => {
62
+ e.preventDefault();
63
+ e.stopPropagation();
64
+ setIsDragging(false);
65
+
66
+ if (disabled) return;
67
+
68
+ const files = e.dataTransfer.files;
69
+ if (files && files.length > 0) {
70
+ handleFiles(files);
71
+ }
72
+ };
73
+
74
+ const handleFileInputChange = (e) => {
75
+ const files = e.target.files;
76
+ if (files && files.length > 0) {
77
+ handleFiles(files);
78
+ }
79
+ // Reset input so same file can be selected again
80
+ e.target.value = "";
81
+ };
82
+
83
+ const handleFiles = (files) => {
84
+ const fileArray = Array.from(files);
85
+ const validFiles = fileArray.filter((file) => {
86
+ // Check file type
87
+ if (accept.length > 0 && !accept.some((type) => file.type.match(type))) {
88
+ return false;
89
+ }
90
+ // Check file size (convert MB to bytes)
91
+ if (file.size > maxSize * 1024 * 1024) {
92
+ return false;
93
+ }
94
+ return true;
95
+ });
96
+
97
+ if (validFiles.length > 0 && onFileSelect) {
98
+ // Create a FileList-like object
99
+ const dataTransfer = new DataTransfer();
100
+ validFiles.forEach((file) => dataTransfer.items.add(file));
101
+ onFileSelect(dataTransfer.files);
102
+ }
103
+ };
104
+
105
+ const handleClick = () => {
106
+ if (!disabled && fileInputRef.current) {
107
+ fileInputRef.current.click();
108
+ }
109
+ };
110
+
111
+ // Generate accept text from accept prop if not provided
112
+ const displayAcceptText =
113
+ acceptText ||
114
+ (accept.length > 0
115
+ ? accept
116
+ .map((type) => {
117
+ const ext = type.split("/")[1]?.toUpperCase();
118
+ return ext || type;
119
+ })
120
+ .join(", ")
121
+ : "All files");
122
+
123
+ return (
124
+ <div
125
+ className={classNames}
126
+ onDragEnter={handleDragEnter}
127
+ onDragLeave={handleDragLeave}
128
+ onDragOver={handleDragOver}
129
+ onDrop={handleDrop}
130
+ onClick={handleClick}
131
+ >
132
+ <input
133
+ ref={fileInputRef}
134
+ type="file"
135
+ className={`${BASE_CLASS}__input`}
136
+ accept={accept.length > 0 ? accept.join(",") : undefined}
137
+ multiple={multiple}
138
+ disabled={disabled}
139
+ onChange={handleFileInputChange}
140
+ {...props}
141
+ />
142
+ <div className={`${BASE_CLASS}__content`}>
143
+ <div className={`${BASE_CLASS}__icon`}>
144
+ <Icon name="Upload" size={32} appearance="regular" />
145
+ </div>
146
+ <p className={`${BASE_CLASS}__instruction`}>{instructionText}</p>
147
+ <p className={`${BASE_CLASS}__accept`}>
148
+ {displayAcceptText} up to {maxSize}MB
149
+ </p>
150
+ </div>
151
+ </div>
152
+ );
153
+ }
@@ -0,0 +1,78 @@
1
+ @use "../../styles/typography" as *;
2
+
3
+ .uds-file-upload {
4
+ position: relative;
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ min-height: 200px;
9
+ padding: var(--uds-spacing-48);
10
+ background: var(--uds-surface-primary, #ffffff);
11
+ border: var(--uds-border-width-2) dashed var(--uds-border-primary, #d1d5db);
12
+ border-radius: var(--uds-radius-8);
13
+ cursor: pointer;
14
+ transition: all var(--uds-animation-duration-200) var(--uds-animation-ease-standard);
15
+
16
+ &:hover:not(&--disabled) {
17
+ border-color: var(--uds-border-brand-primary, #3b82f6);
18
+ background: var(--uds-surface-secondary, #f9fafb);
19
+ }
20
+
21
+ &--dragging {
22
+ border-color: var(--uds-border-brand-primary, #3b82f6);
23
+ background: var(--uds-surface-brand-tertiary, #eff6ff);
24
+ }
25
+
26
+ &--disabled {
27
+ cursor: not-allowed;
28
+ opacity: 0.6;
29
+ pointer-events: none;
30
+ }
31
+
32
+ &__input {
33
+ position: absolute;
34
+ opacity: 0;
35
+ width: 0;
36
+ height: 0;
37
+ pointer-events: none;
38
+ }
39
+
40
+ &__content {
41
+ display: flex;
42
+ flex-direction: column;
43
+ align-items: center;
44
+ justify-content: center;
45
+ gap: var(--uds-gap-12);
46
+ text-align: center;
47
+ pointer-events: none;
48
+ }
49
+
50
+ &__icon {
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ color: var(--uds-text-secondary, #6b7280);
55
+ transition: color var(--uds-animation-duration-200) var(--uds-animation-ease-standard);
56
+
57
+ .uds-file-upload:hover:not(.uds-file-upload--disabled) & {
58
+ color: var(--uds-text-brand-primary, #3b82f6);
59
+ }
60
+
61
+ .uds-file-upload--dragging & {
62
+ color: var(--uds-text-brand-primary, #3b82f6);
63
+ }
64
+ }
65
+
66
+ &__instruction {
67
+ @include uds-body-16;
68
+ margin: 0;
69
+ color: var(--uds-text-primary, #111827);
70
+ font-weight: var(--uds-font-weight-medium);
71
+ }
72
+
73
+ &__accept {
74
+ @include uds-body-14;
75
+ margin: 0;
76
+ color: var(--uds-text-secondary, #6b7280);
77
+ }
78
+ }
@@ -0,0 +1,12 @@
1
+ export const FILE_UPLOAD_DEFAULTS = {
2
+ className: "",
3
+ } as const;
4
+
5
+ export const FILE_UPLOAD_STORY_SPEC = {
6
+ defaults: {
7
+ className: FILE_UPLOAD_DEFAULTS.className,
8
+ },
9
+ stories: {
10
+ default: {},
11
+ },
12
+ } as const;
@@ -0,0 +1,14 @@
1
+ import FileUpload from "./FileUpload";
2
+
3
+ export default {
4
+ title: "Components/FileUpload",
5
+ component: FileUpload,
6
+ tags: ["autodocs"],
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ };
11
+
12
+ export const Default = {
13
+ args: {},
14
+ };
@@ -0,0 +1,14 @@
1
+ import FileUpload from "./FileUpload.jsx";
2
+
3
+ export default {
4
+ title: "Components/FileUpload",
5
+ component: FileUpload,
6
+ tags: ["autodocs"],
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ };
11
+
12
+ export const Default = {
13
+ args: {},
14
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { ComponentType } from "react";
2
+ import LegacyFileUpload from "./FileUpload.jsx";
3
+
4
+ const FileUpload = LegacyFileUpload as ComponentType<any>;
5
+
6
+ export default FileUpload;
@@ -0,0 +1,3 @@
1
+ export interface FileUploadProps {
2
+ className?: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ export { default as FileUpload } from "./FileUpload";
2
+ export { default } from "./FileUpload";
@@ -0,0 +1,130 @@
1
+ # Flex
2
+
3
+ Flexbox layout utility component for quick row/column layouts with optional container constraints.
4
+
5
+ ## When to Use
6
+ - Any layout that needs flexbox (row/column, alignment, spacing)
7
+ - Button groups, form rows, card layouts, toolbar arrangements
8
+ - Quick spacing between child elements
9
+ - Centered, max-width constrained page sections (via `container` prop)
10
+
11
+ ## Props
12
+
13
+ | Prop | Type | Default | Values | Description |
14
+ |------|------|---------|--------|-------------|
15
+ | `direction` | `string` | `"row"` | `"row"`, `"column"`, `"row-reverse"`, `"column-reverse"` | Flex direction |
16
+ | `gap` | `string` | — | UDS gap tokens: `"4"`, `"8"`, `"12"`, `"16"`, `"24"`, `"32"`, `"48"` | Gap between items |
17
+ | `alignItems` | `string` | — | `"flex-start"`, `"flex-end"`, `"center"`, `"stretch"`, `"baseline"` | Cross-axis alignment |
18
+ | `justifyContent` | `string` | — | `"flex-start"`, `"flex-end"`, `"center"`, `"space-between"`, `"space-around"`, `"space-evenly"` | Main-axis alignment |
19
+ | `wrap` | `boolean` | `false` | — | Allow items to wrap |
20
+ | `container` | `string\|boolean` | — | `true`, `"responsive"`, `"xs"`, `"sm"`, `"md"`, `"lg"`, `"xl"`, `"2xl"`, `"narrow"`, `"prose"`, `"wide"`, `"full"` | Applies container max-width and centering |
21
+ | `padded` | `boolean` | `false` | — | Adds responsive horizontal padding (use with `container`) |
22
+ | `className` | `string` | `""` | — | Additional CSS classes |
23
+
24
+ ## Container Sizes
25
+
26
+ | Value | Max Width | Best For |
27
+ |-------|-----------|----------|
28
+ | `"xs"` | 480px | Modals, narrow dialogs |
29
+ | `"sm"` / `"narrow"` | 640px | Forms, settings panels |
30
+ | `"md"` | 768px | Content pages |
31
+ | `"lg"` | 1024px | Standard page layouts |
32
+ | `"xl"` | 1280px | Wide layouts |
33
+ | `"2xl"` | 1536px | Extra-wide layouts |
34
+ | `"prose"` | 65ch | Readable body text |
35
+ | `"wide"` | 1440px | Dashboards, data-heavy pages |
36
+ | `"full"` | 100% | No max-width, still centered |
37
+ | `true` / `"responsive"` | Auto | Scales max-width at each breakpoint |
38
+
39
+ ## Container CSS Classes (Standalone)
40
+
41
+ These classes can be used independently without the `Flex` component:
42
+
43
+ ```html
44
+ <div class="container container-lg">Centered, max 1024px</div>
45
+ <div class="container container-responsive container-padded">Responsive with padding</div>
46
+ ```
47
+
48
+ | Class | Description |
49
+ |-------|-------------|
50
+ | `.container` | Base: `width: 100%; margin: 0 auto` |
51
+ | `.container-xs` | `max-width: 480px` |
52
+ | `.container-sm` | `max-width: 640px` |
53
+ | `.container-md` | `max-width: 768px` |
54
+ | `.container-lg` | `max-width: 1024px` |
55
+ | `.container-xl` | `max-width: 1280px` |
56
+ | `.container-2xl` | `max-width: 1536px` |
57
+ | `.container-narrow` | `max-width: 640px` |
58
+ | `.container-prose` | `max-width: 65ch` |
59
+ | `.container-wide` | `max-width: 1440px` |
60
+ | `.container-full` | `max-width: 100%` |
61
+ | `.container-responsive` | Scales max-width at sm/md/lg/xl/2xl breakpoints |
62
+ | `.container-padded` | Responsive horizontal padding (16→24→32→48px) |
63
+
64
+ ## Examples
65
+
66
+ ### Horizontal row with gap
67
+ ```jsx
68
+ <Flex gap="8" alignItems="center">
69
+ <Avatar initials="JD" size="small" />
70
+ <span>John Doe</span>
71
+ <Tag label="Admin" color="blue" />
72
+ </Flex>
73
+ ```
74
+
75
+ ### Button action bar
76
+ ```jsx
77
+ <Flex gap="8" justifyContent="flex-end">
78
+ <Button label="Cancel" appearance="outline" />
79
+ <Button label="Save" />
80
+ </Flex>
81
+ ```
82
+
83
+ ### Vertical form layout
84
+ ```jsx
85
+ <Flex direction="column" gap="16">
86
+ <Field label="Name"><Input placeholder="Name" /></Field>
87
+ <Field label="Email"><Input type="email" placeholder="Email" /></Field>
88
+ <Button label="Submit" />
89
+ </Flex>
90
+ ```
91
+
92
+ ### Wrapping grid
93
+ ```jsx
94
+ <Flex gap="16" wrap>
95
+ {items.map(item => <Card key={item.id} {...item} />)}
96
+ </Flex>
97
+ ```
98
+
99
+ ### Centered page content with container
100
+ ```jsx
101
+ <Flex direction="column" gap="24" container="lg" padded>
102
+ <h1>Page Title</h1>
103
+ <p>Content centered and constrained to 1024px max width.</p>
104
+ </Flex>
105
+ ```
106
+
107
+ ### Responsive container
108
+ ```jsx
109
+ <Flex direction="column" gap="16" container padded>
110
+ {/* max-width scales with viewport: 640→768→1024→1280→1536 */}
111
+ <Card>Auto-scaling container</Card>
112
+ </Flex>
113
+ ```
114
+
115
+ ### Narrow form container
116
+ ```jsx
117
+ <Flex direction="column" gap="16" container="narrow" padded>
118
+ <Field label="Email"><Input type="email" /></Field>
119
+ <Field label="Password"><Input type="password" /></Field>
120
+ <Button label="Sign In" />
121
+ </Flex>
122
+ ```
123
+
124
+ ### Prose container for readable text
125
+ ```jsx
126
+ <Flex direction="column" gap="12" container="prose">
127
+ <h2>Article Title</h2>
128
+ <p>Body text constrained to 65 characters wide for optimal readability.</p>
129
+ </Flex>
130
+ ```
@@ -0,0 +1,53 @@
1
+ import React from "react";
2
+ import "./Flex.scss";
3
+
4
+ /**
5
+ * Flex layout component
6
+ * @param {string} direction - Flex direction: 'row', 'column', 'row-reverse', 'column-reverse'
7
+ * @param {string} gap - Gap between items (uses UDS gap tokens)
8
+ * @param {string} alignItems - Align items: 'flex-start', 'flex-end', 'center', 'stretch', 'baseline'
9
+ * @param {string} justifyContent - Justify content: 'flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly'
10
+ * @param {boolean} wrap - Whether to wrap items
11
+ * @param {string|boolean} container - Container size constraint. true or "responsive" for responsive container,
12
+ * or a named size: "xs" (480px), "sm" (640px), "md" (768px), "lg" (1024px), "xl" (1280px),
13
+ * "2xl" (1536px), "narrow" (640px), "prose" (65ch), "wide" (1440px), "full" (100%)
14
+ * @param {boolean} padded - When true with container, adds responsive horizontal padding
15
+ * @param {string} className - Additional CSS classes
16
+ * @param {React.ReactNode} children - Child elements
17
+ * @param {object} props - Additional props to pass to the flex container
18
+ */
19
+ export default function Flex({
20
+ direction = "row",
21
+ gap,
22
+ alignItems,
23
+ justifyContent,
24
+ wrap = false,
25
+ container,
26
+ padded = false,
27
+ className = "",
28
+ children,
29
+ ...props
30
+ }) {
31
+ const flexClasses = [
32
+ "uds-flex",
33
+ direction && `uds-flex--${direction}`,
34
+ wrap && "uds-flex--wrap",
35
+ gap && `uds-flex--gap-${gap}`,
36
+ alignItems && `uds-flex--align-${alignItems.replace("-", "_")}`,
37
+ justifyContent && `uds-flex--justify-${justifyContent.replace(/-/g, "_")}`,
38
+ container && "container",
39
+ container === true || container === "responsive"
40
+ ? "container-responsive"
41
+ : container && `container-${container}`,
42
+ padded && "container-padded",
43
+ className,
44
+ ]
45
+ .filter(Boolean)
46
+ .join(" ");
47
+
48
+ return (
49
+ <div className={flexClasses} {...props}>
50
+ {children}
51
+ </div>
52
+ );
53
+ }
@@ -0,0 +1,119 @@
1
+ @use "../../styles/typography" as *;
2
+
3
+ .uds-flex {
4
+ display: flex;
5
+
6
+ // ── Direction variants ──────────────────────────────
7
+ &--row {
8
+ flex-direction: row;
9
+ }
10
+
11
+ &--column {
12
+ flex-direction: column;
13
+ }
14
+
15
+ &--row-reverse {
16
+ flex-direction: row-reverse;
17
+ }
18
+
19
+ &--column-reverse {
20
+ flex-direction: column-reverse;
21
+ }
22
+
23
+ // ── Wrap ────────────────────────────────────────────
24
+ &--wrap {
25
+ flex-wrap: wrap;
26
+ }
27
+
28
+ // ── Gap variants (using UDS gap tokens) ─────────────
29
+ &--gap-4 {
30
+ gap: var(--uds-gap-4);
31
+ }
32
+
33
+ &--gap-8 {
34
+ gap: var(--uds-gap-8);
35
+ }
36
+
37
+ &--gap-12 {
38
+ gap: var(--uds-gap-12);
39
+ }
40
+
41
+ &--gap-16 {
42
+ gap: var(--uds-gap-16);
43
+ }
44
+
45
+ &--gap-24 {
46
+ gap: var(--uds-gap-24);
47
+ }
48
+
49
+ &--gap-32 {
50
+ gap: var(--uds-gap-32);
51
+ }
52
+
53
+ // ── Align items variants ────────────────────────────
54
+ &--align-flex_start {
55
+ align-items: flex-start;
56
+ }
57
+
58
+ &--align-flex_end {
59
+ align-items: flex-end;
60
+ }
61
+
62
+ &--align-center {
63
+ align-items: center;
64
+ }
65
+
66
+ &--align-stretch {
67
+ align-items: stretch;
68
+ }
69
+
70
+ &--align-baseline {
71
+ align-items: baseline;
72
+ }
73
+
74
+ // ── Justify content variants ────────────────────────
75
+ &--justify-flex_start {
76
+ justify-content: flex-start;
77
+ }
78
+
79
+ &--justify-flex_end {
80
+ justify-content: flex-end;
81
+ }
82
+
83
+ &--justify-center {
84
+ justify-content: center;
85
+ }
86
+
87
+ &--justify-space_between {
88
+ justify-content: space-between;
89
+ }
90
+
91
+ &--justify-space_around {
92
+ justify-content: space-around;
93
+ }
94
+
95
+ &--justify-space_evenly {
96
+ justify-content: space-evenly;
97
+ }
98
+
99
+ // ── Flex item utilities ─────────────────────────────
100
+ &-item {
101
+ flex: 0 1 auto;
102
+
103
+ &--grow {
104
+ flex: 1 1 auto;
105
+ }
106
+
107
+ &--shrink {
108
+ flex: 0 1 auto;
109
+ }
110
+
111
+ &--no-grow {
112
+ flex: 0 1 auto;
113
+ }
114
+
115
+ &--no-shrink {
116
+ flex: 1 0 auto;
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,12 @@
1
+ export const FLEX_DEFAULTS = {
2
+ className: "",
3
+ } as const;
4
+
5
+ export const FLEX_STORY_SPEC = {
6
+ defaults: {
7
+ className: FLEX_DEFAULTS.className,
8
+ },
9
+ stories: {
10
+ default: {},
11
+ },
12
+ } as const;
@@ -0,0 +1,14 @@
1
+ import Flex from "./Flex";
2
+
3
+ export default {
4
+ title: "Components/Flex",
5
+ component: Flex,
6
+ tags: ["autodocs"],
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ };
11
+
12
+ export const Default = {
13
+ args: {},
14
+ };
@@ -0,0 +1,14 @@
1
+ import Flex from "./Flex.jsx";
2
+
3
+ export default {
4
+ title: "Components/Flex",
5
+ component: Flex,
6
+ tags: ["autodocs"],
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ };
11
+
12
+ export const Default = {
13
+ args: {},
14
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { ComponentType } from "react";
2
+ import LegacyFlex from "./Flex.jsx";
3
+
4
+ const Flex = LegacyFlex as ComponentType<any>;
5
+
6
+ export default Flex;
@@ -0,0 +1,3 @@
1
+ export interface FlexProps {
2
+ className?: string;
3
+ }
@@ -0,0 +1 @@
1
+ export { default } from "./Flex";