@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,89 @@
1
+ import React from "react";
2
+ import Icon from "../Icon/Icon";
3
+ import "./Divider.scss";
4
+
5
+ const BASE_CLASS = "uds-divider";
6
+
7
+ const alignmentClassMap = {
8
+ left: "left",
9
+ center: "center",
10
+ right: "right",
11
+ };
12
+
13
+ const variantClassMap = {
14
+ line: "line",
15
+ solid: "solid",
16
+ };
17
+
18
+ /**
19
+ * Divider component for separating content sections
20
+ * @param {string} variant - Variant style: 'line' (default) or 'solid' (8px solid box)
21
+ * @param {string} label - Optional text label to display on the divider (only for 'line' variant)
22
+ * @param {string} icon - Optional icon name to display on the divider (only for 'line' variant)
23
+ * @param {string} alignment - Alignment of label/icon: 'left', 'center', or 'right' (only for 'line' variant)
24
+ * @param {boolean} labelWithIcon - Whether to show icon within the label text (e.g., "+ Divider Label") (only for 'line' variant)
25
+ * @param {string} className - Additional CSS classes
26
+ * @param {object} props - Additional props to pass to the divider element
27
+ */
28
+ export default function Divider({
29
+ variant = "line",
30
+ label,
31
+ icon,
32
+ alignment = "center",
33
+ labelWithIcon = false,
34
+ className = "",
35
+ ...props
36
+ }) {
37
+ const classNames = [
38
+ BASE_CLASS,
39
+ variantClassMap[variant] && `${BASE_CLASS}--${variantClassMap[variant]}`,
40
+ variant === "line" &&
41
+ alignmentClassMap[alignment] &&
42
+ `${BASE_CLASS}--${alignmentClassMap[alignment]}`,
43
+ className,
44
+ ]
45
+ .filter(Boolean)
46
+ .join(" ");
47
+
48
+ const hasLabel = !!label;
49
+ const hasIcon = !!icon;
50
+ const hasContent = hasLabel || hasIcon;
51
+ const isSolidVariant = variant === "solid";
52
+
53
+ return (
54
+ <div
55
+ className={classNames}
56
+ role="separator"
57
+ aria-orientation="horizontal"
58
+ {...props}
59
+ >
60
+ {!isSolidVariant && hasContent && (
61
+ <div className={`${BASE_CLASS}__content ${hasIcon && !hasLabel ? `${BASE_CLASS}__content--icon-only` : ''} ${hasLabel ? `${BASE_CLASS}__content--with-label` : ''}`}>
62
+ {hasIcon && !hasLabel && (
63
+ <span className={`${BASE_CLASS}__icon`}>
64
+ <Icon name={icon} size={16} appearance="regular" />
65
+ </span>
66
+ )}
67
+ {hasLabel && (
68
+ <span className={`${BASE_CLASS}__label`}>
69
+ {labelWithIcon && hasIcon && (
70
+ <Icon
71
+ name={icon}
72
+ size={16}
73
+ appearance="regular"
74
+ className={`${BASE_CLASS}__label-icon`}
75
+ />
76
+ )}
77
+ {label}
78
+ </span>
79
+ )}
80
+ {hasIcon && hasLabel && !labelWithIcon && (
81
+ <span className={`${BASE_CLASS}__icon`}>
82
+ <Icon name={icon} size={16} appearance="regular" />
83
+ </span>
84
+ )}
85
+ </div>
86
+ )}
87
+ </div>
88
+ );
89
+ }
@@ -0,0 +1,116 @@
1
+ @use "../../styles/typography" as *;
2
+
3
+ .uds-divider {
4
+ position: relative;
5
+ display: flex;
6
+ align-items: center;
7
+ width: 100%;
8
+ margin: var(--uds-gap-16) 0;
9
+
10
+ // Solid variant - 8px tall box that goes edge to edge
11
+ &--solid {
12
+ align-items: stretch;
13
+ height: 8px;
14
+ margin: var(--uds-spacing-24) 0;
15
+ background-color: var(--uds-color-neutrals-100);
16
+ border-top:solid var(--uds-border-width-1) var(--uds-border-secondary);
17
+ border-bottom:solid var(--uds-border-width-1) var(--uds-border-secondary);
18
+ width: 100%;
19
+ margin-left: calc(50% - 50vw);
20
+ max-width: 100vw;
21
+ overflow: hidden;
22
+ width: 100vw;
23
+ }
24
+
25
+ // Line variant (default) - horizontal line with optional content
26
+ &--line,
27
+ &:not(&--solid) {
28
+ &::before {
29
+ content: "";
30
+ position: absolute;
31
+ left: 0;
32
+ right: 0;
33
+ top: 50%;
34
+ height: var(--uds-border-width-1);
35
+ background-color: var(--uds-border-primary);
36
+ z-index: 0;
37
+ }
38
+ }
39
+
40
+ // Alignment variants
41
+ &--left {
42
+ .uds-divider__content {
43
+ }
44
+ }
45
+
46
+ &--center {
47
+ display: flex;
48
+ align-items: center;
49
+
50
+ .uds-divider__content {
51
+ margin: 0 auto;
52
+ }
53
+ }
54
+
55
+ &--right {
56
+ .uds-divider__content {
57
+ margin-left: auto;
58
+ }
59
+ }
60
+
61
+ &__content {
62
+ position: relative;
63
+ z-index: 1;
64
+ display: inline-flex;
65
+ align-items: center;
66
+ gap: var(--uds-gap-8);
67
+ background-color: var(--uds-surface-primary);
68
+ border: var(--uds-border-width-1) solid var(--uds-border-primary);
69
+ padding-inline: var(--uds-spacing-12);
70
+ padding-block: var(--uds-spacing-4);
71
+
72
+ // Icon-only variant
73
+ &--icon-only {
74
+ border-radius: var(--uds-radius-9999);
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ width:28px;
79
+ padding:0;
80
+ height:28px;
81
+ }
82
+
83
+ // Label variant (with or without icon)
84
+ &--with-label {
85
+ border-radius: var(--uds-radius-9999);
86
+ }
87
+ }
88
+
89
+ &__icon {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ justify-content: center;
93
+ color: var(--uds-text-primary);
94
+ flex: 0;
95
+ width: 20px;
96
+ height: 28px;
97
+ }
98
+
99
+ &__label {
100
+ @include uds-body-14-medium;
101
+ display: inline-flex;
102
+ align-items: center;
103
+ gap: var(--uds-gap-6);
104
+ color: var(--uds-text-primary);
105
+ background-color: var(--uds-surface-primary);
106
+ padding-inline: var(--uds-spacing-8);
107
+ padding-block: var(--uds-spacing-4);
108
+ border-radius: var(--uds-radius-4);
109
+ white-space: nowrap;
110
+ }
111
+
112
+ &__label-icon {
113
+ flex-shrink: 0;
114
+ color: var(--uds-text-primary);
115
+ }
116
+ }
@@ -0,0 +1,12 @@
1
+ export const DIVIDER_DEFAULTS = {
2
+ className: "",
3
+ } as const;
4
+
5
+ export const DIVIDER_STORY_SPEC = {
6
+ defaults: {
7
+ className: DIVIDER_DEFAULTS.className,
8
+ },
9
+ stories: {
10
+ default: {},
11
+ },
12
+ } as const;
@@ -0,0 +1,14 @@
1
+ import Divider from "./Divider";
2
+
3
+ export default {
4
+ title: "Components/Divider",
5
+ component: Divider,
6
+ tags: ["autodocs"],
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ };
11
+
12
+ export const Default = {
13
+ args: {},
14
+ };
@@ -0,0 +1,14 @@
1
+ import Divider from "./Divider.jsx";
2
+
3
+ export default {
4
+ title: "Components/Divider",
5
+ component: Divider,
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 LegacyDivider from "./Divider.jsx";
3
+
4
+ const Divider = LegacyDivider as ComponentType<any>;
5
+
6
+ export default Divider;
@@ -0,0 +1,3 @@
1
+ export interface DividerProps {
2
+ className?: string;
3
+ }
@@ -0,0 +1 @@
1
+ export { default } from "./Divider";
@@ -0,0 +1,36 @@
1
+ # DotStatus
2
+
3
+ Simple colored dot indicator for status display.
4
+
5
+ ## When to Use
6
+ - Minimal status indicators (online/offline, severity levels)
7
+ - Color-coded dots next to labels
8
+ - Compact status in table cells or lists
9
+
10
+ ## Props
11
+
12
+ | Prop | Type | Default | Values | Description |
13
+ |------|------|---------|--------|-------------|
14
+ | `color` | `string` | `"gray"` | `"red"`, `"orange"`, `"yellow"`, `"green"`, `"blue"`, `"purple"`, `"gray"` | Dot color |
15
+ | `size` | `string` | `"default"` | `"small"`, `"default"`, `"large"` | Dot size |
16
+ | `pulse` | `boolean` | `false` | — | Animate with pulse effect |
17
+ | `label` | `string` | — | — | Accessible label (sr-only) |
18
+ | `className` | `string` | `""` | — | Additional CSS classes |
19
+
20
+ ## Examples
21
+
22
+ ```jsx
23
+ <DotStatus color="green" />
24
+ <DotStatus color="red" pulse />
25
+ <DotStatus color="yellow" label="Warning" />
26
+ ```
27
+
28
+ ### In a table
29
+ ```jsx
30
+ render: (value) => (
31
+ <Flex gap="8" alignItems="center">
32
+ <DotStatus color={value === "Active" ? "green" : "gray"} />
33
+ <span>{value}</span>
34
+ </Flex>
35
+ )
36
+ ```
@@ -0,0 +1,64 @@
1
+ import React from "react";
2
+ import "./DotStatus.scss";
3
+
4
+ const BASE_CLASS = "uds-dot-status";
5
+
6
+ const variantClassMap = {
7
+ "light-gray": "light-gray",
8
+ red: "red",
9
+ orange: "orange",
10
+ yellow: "yellow",
11
+ "light-green": "light-green",
12
+ green: "green",
13
+ blue: "blue",
14
+ "dark-blue": "dark-blue",
15
+ teal: "teal",
16
+ purple: "purple",
17
+ pink: "pink",
18
+ magenta: "magenta",
19
+ "dark-red": "dark-red",
20
+ "dark-gray": "dark-gray",
21
+ };
22
+
23
+ const sizeClassMap = {
24
+ small: "small",
25
+ medium: "medium",
26
+ large: "large",
27
+ };
28
+
29
+ /**
30
+ * Dot Status component for displaying status indicators
31
+ * @param {string} variant - Color variant
32
+ * @param {string} size - Size variant: 'small', 'medium', or 'large'
33
+ * @param {boolean} outline - Whether to show an outline/border around the dot
34
+ * @param {string} className - Additional CSS classes
35
+ * @param {string} 'aria-label' - Accessible label for screen readers
36
+ * @param {object} props - Additional props to pass to the dot element
37
+ */
38
+ export default function DotStatus({
39
+ variant = "blue",
40
+ size = "medium",
41
+ outline = false,
42
+ className = "",
43
+ "aria-label": ariaLabel,
44
+ ...props
45
+ }) {
46
+ const classNames = [
47
+ BASE_CLASS,
48
+ variantClassMap[variant] && `${BASE_CLASS}--${variantClassMap[variant]}`,
49
+ sizeClassMap[size] && `${BASE_CLASS}--${sizeClassMap[size]}`,
50
+ outline && `${BASE_CLASS}--outline`,
51
+ className,
52
+ ]
53
+ .filter(Boolean)
54
+ .join(" ");
55
+
56
+ return (
57
+ <span
58
+ className={classNames}
59
+ role="status"
60
+ aria-label={ariaLabel || `${variant} status`}
61
+ {...props}
62
+ />
63
+ );
64
+ }
@@ -0,0 +1,87 @@
1
+ @use "../../styles/typography" as *;
2
+
3
+ .uds-dot-status {
4
+ display: inline-block;
5
+ border-radius: 50%;
6
+ flex-shrink: 0;
7
+ vertical-align: middle;
8
+
9
+ // Size variants
10
+ &--small {
11
+ width: 8px;
12
+ height: 8px;
13
+ }
14
+
15
+ &--medium {
16
+ width: 12px;
17
+ height: 12px;
18
+ }
19
+
20
+ &--large {
21
+ width: 16px;
22
+ height: 16px;
23
+ }
24
+
25
+ // Variant colors
26
+ &--light-gray {
27
+ background-color: #f3f4f6; // Very light gray
28
+ }
29
+
30
+ &--red {
31
+ background-color: #ef4444; // Bright red
32
+ }
33
+
34
+ &--orange {
35
+ background-color: #f97316; // Bright orange
36
+ }
37
+
38
+ &--yellow {
39
+ background-color: #eab308; // Bright yellow
40
+ }
41
+
42
+ &--light-green {
43
+ background-color: #84cc16; // Light green (lime)
44
+ }
45
+
46
+ &--green {
47
+ background-color: #22c55e; // Darker green
48
+ }
49
+
50
+ &--blue {
51
+ background-color: #3b82f6; // Medium blue
52
+ }
53
+
54
+ &--dark-blue {
55
+ background-color: #2563eb; // Dark blue
56
+ }
57
+
58
+ &--teal {
59
+ background-color: #14b8a6; // Teal/Cyan
60
+ }
61
+
62
+ &--purple {
63
+ background-color: #a855f7; // Medium purple
64
+ }
65
+
66
+ &--pink {
67
+ background-color: #ec4899; // Bright pink
68
+ }
69
+
70
+ &--magenta {
71
+ background-color: #d946ef; // Darker pink/magenta
72
+ }
73
+
74
+ &--dark-red {
75
+ background-color: #dc2626; // Dark red/maroon
76
+ }
77
+
78
+ &--dark-gray {
79
+ background-color: #1f2937; // Dark gray (almost black)
80
+ }
81
+
82
+ // Outline variant
83
+ &--outline {
84
+ border: var(--uds-border-width-1) solid var(--uds-border-inverse); // Light gray border/ring
85
+ // Background colors remain the same as defined above
86
+ }
87
+ }
@@ -0,0 +1,12 @@
1
+ export const DOT_STATUS_DEFAULTS = {
2
+ className: "",
3
+ } as const;
4
+
5
+ export const DOT_STATUS_STORY_SPEC = {
6
+ defaults: {
7
+ className: DOT_STATUS_DEFAULTS.className,
8
+ },
9
+ stories: {
10
+ default: {},
11
+ },
12
+ } as const;
@@ -0,0 +1,14 @@
1
+ import DotStatus from "./DotStatus";
2
+
3
+ export default {
4
+ title: "Components/DotStatus",
5
+ component: DotStatus,
6
+ tags: ["autodocs"],
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ };
11
+
12
+ export const Default = {
13
+ args: {},
14
+ };
@@ -0,0 +1,14 @@
1
+ import DotStatus from "./DotStatus.jsx";
2
+
3
+ export default {
4
+ title: "Components/DotStatus",
5
+ component: DotStatus,
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 LegacyDotStatus from "./DotStatus.jsx";
3
+
4
+ const DotStatus = LegacyDotStatus as ComponentType<any>;
5
+
6
+ export default DotStatus;
@@ -0,0 +1,3 @@
1
+ export interface DotStatusProps {
2
+ className?: string;
3
+ }
@@ -0,0 +1 @@
1
+ export { default } from "./DotStatus";
@@ -0,0 +1,118 @@
1
+ # Dropdown
2
+
3
+ Custom select/dropdown input built on top of `ActionMenu`. Provides keyboard navigation, click-outside-to-close, and accessible markup out of the box.
4
+
5
+ ## Architecture
6
+
7
+ Dropdown composes `ActionMenu` internally:
8
+ - The select-style trigger button (value display + caret) is passed as ActionMenu's `trigger`
9
+ - Options are mapped to ActionMenu `items` with `active` set on the selected item
10
+ - ActionMenu handles the popup, click-outside, keyboard nav, and focus management
11
+ - Dropdown only owns: option normalization, selected value tracking, trigger styling, label, size/state variants
12
+
13
+ This means ActionMenu and Dropdown share a single popup engine, but each is fully encapsulated and independently usable.
14
+
15
+ ## When to Use
16
+ - Selecting a single value from a list of options
17
+ - Replacing native `<select>` with a styled, accessible alternative
18
+ - Form fields that need consistent design system styling
19
+
20
+ ## Props
21
+
22
+ | Prop | Type | Default | Values | Description |
23
+ |------|------|---------|--------|-------------|
24
+ | `options` | `array` | `[]` | `[{ value, label }]` or `["string"]` | Options list |
25
+ | `value` | `string\|number` | — | — | Currently selected value |
26
+ | `onChange` | `function` | — | `(value) => void` | Selection change callback |
27
+ | `placeholder` | `string` | `"Select an option"` | — | Placeholder when nothing selected |
28
+ | `size` | `string` | `"default"` | `"compact"`, `"default"` | Size variant |
29
+ | `state` | `string` | `"default"` | `"default"`, `"focused"`, `"error"`, `"disabled"` | Visual state |
30
+ | `disabled` | `boolean` | `false` | — | Disabled state (overrides `state`) |
31
+ | `id` | `string` | auto-generated | — | Unique identifier |
32
+ | `label` | `string` | — | — | Label text above the dropdown |
33
+ | `className` | `string` | `""` | — | Additional CSS classes |
34
+
35
+ ## Examples
36
+
37
+ ### Basic dropdown
38
+ ```jsx
39
+ const [value, setValue] = useState("");
40
+
41
+ <Dropdown
42
+ options={["Option A", "Option B", "Option C"]}
43
+ value={value}
44
+ onChange={setValue}
45
+ placeholder="Choose one..."
46
+ />
47
+ ```
48
+
49
+ ### With label and object options
50
+ ```jsx
51
+ <Dropdown
52
+ label="Country"
53
+ options={[
54
+ { value: "us", label: "United States" },
55
+ { value: "uk", label: "United Kingdom" },
56
+ { value: "ca", label: "Canada" },
57
+ ]}
58
+ value={country}
59
+ onChange={setCountry}
60
+ />
61
+ ```
62
+
63
+ ### Inside a Field (with validation)
64
+ ```jsx
65
+ <Field label="Department" required helperMessage="Select your department">
66
+ <Dropdown
67
+ options={departments}
68
+ value={dept}
69
+ onChange={setDept}
70
+ state={errors.dept ? "error" : "default"}
71
+ />
72
+ </Field>
73
+ ```
74
+
75
+ ### Compact size
76
+ ```jsx
77
+ <Dropdown
78
+ options={options}
79
+ value={value}
80
+ onChange={setValue}
81
+ size="compact"
82
+ placeholder="Compact dropdown"
83
+ />
84
+ ```
85
+
86
+ ### Disabled state
87
+ ```jsx
88
+ <Dropdown
89
+ label="Locked Selection"
90
+ options={options}
91
+ value="locked-value"
92
+ disabled
93
+ />
94
+ ```
95
+
96
+ ## Keyboard Navigation
97
+
98
+ - **Enter/Space**: Open dropdown
99
+ - **Arrow Up/Down**: Navigate options
100
+ - **Escape**: Close dropdown
101
+ - **Click outside**: Close dropdown
102
+
103
+ ## Composition
104
+
105
+ - Wrap with `<Field>` for labels, required markers, and helper text
106
+ - Use inside forms alongside `Input`, `Textarea`, `Checkbox`
107
+ - Use `state="error"` with `Field` `helperMessage` for validation feedback
108
+
109
+ ## Do's and Don'ts
110
+
111
+ ✅ **Do**: Always provide a meaningful `placeholder`
112
+ ✅ **Do**: Use `{ value, label }` objects for options when values differ from display text
113
+ ✅ **Do**: Wrap with `<Field>` for form contexts
114
+ ✅ **Do**: Use `state="error"` for validation errors
115
+
116
+ ❌ **Don't**: Use for more than ~20 options — consider a searchable autocomplete instead
117
+ ❌ **Don't**: Forget to manage `value` and `onChange` — this is a controlled component
118
+ ❌ **Don't**: Set both `disabled` prop and `state="disabled"` — just use `disabled`