@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,35 @@
1
+ # MicroCalendar
2
+
3
+ Compact inline calendar widget for displaying dates at a glance.
4
+
5
+ ## When to Use
6
+ - Compact date display in cards, list items, or dashboards
7
+ - Visual date badge showing month and day
8
+ - Calendar widgets in tight spaces
9
+
10
+ ## Props
11
+
12
+ | Prop | Type | Default | Description |
13
+ |------|------|---------|-------------|
14
+ | `date` | `Date\|string` | — | Date to display |
15
+ | `size` | `string` | `"default"` | `"small"`, `"default"`, `"large"` |
16
+ | `color` | `string` | `"blue"` | Accent color |
17
+ | `className` | `string` | `""` | Additional CSS classes |
18
+
19
+ ## Examples
20
+
21
+ ```jsx
22
+ <MicroCalendar date={new Date()} />
23
+ <MicroCalendar date="2024-03-15" size="small" />
24
+ ```
25
+
26
+ ### In a list item
27
+ ```jsx
28
+ <Flex gap="12" alignItems="center">
29
+ <MicroCalendar date={event.date} size="small" />
30
+ <Flex direction="column">
31
+ <strong>{event.title}</strong>
32
+ <span>{event.location}</span>
33
+ </Flex>
34
+ </Flex>
35
+ ```
@@ -0,0 +1,393 @@
1
+ import React, { useState, useMemo } from "react";
2
+ import Icon from "../Icon/Icon";
3
+ import Button from "../Button/Button";
4
+ import "./MicroCalendar.scss";
5
+
6
+ const BASE_CLASS = "uds-micro-calendar";
7
+
8
+ const DAYS_OF_WEEK = ["S", "M", "T", "W", "T", "F", "S"];
9
+ const MONTHS = [
10
+ "January",
11
+ "February",
12
+ "March",
13
+ "April",
14
+ "May",
15
+ "June",
16
+ "July",
17
+ "August",
18
+ "September",
19
+ "October",
20
+ "November",
21
+ "December",
22
+ ];
23
+
24
+ /**
25
+ * MicroCalendar component - A compact calendar with expand/collapse functionality
26
+ * @param {Date} value - Selected date (optional)
27
+ * @param {Date} month - Month to display (default: current month)
28
+ * @param {function} onDateSelect - Callback when a date is selected: (date: Date) => void
29
+ * @param {array} unavailableDates - Array of dates that are unavailable
30
+ * @param {object} dateData - Object mapping dates to data (travel, onAssignment)
31
+ * @param {boolean} defaultExpanded - Whether calendar starts expanded (default: true)
32
+ * @param {boolean} showLegend - Whether to show the legend (default: true)
33
+ * @param {boolean} showExpandCollapse - Whether to show the expand/collapse button (default: true)
34
+ * @param {string} className - Additional CSS classes
35
+ * @param {object} props - Additional props
36
+ */
37
+ export default function MicroCalendar({
38
+ value,
39
+ month,
40
+ onDateSelect,
41
+ unavailableDates = [],
42
+ dateData = {},
43
+ defaultExpanded = true,
44
+ showLegend = true,
45
+ showExpandCollapse = true,
46
+ className = "",
47
+ ...props
48
+ }) {
49
+ const [currentMonth, setCurrentMonth] = useState(month || new Date());
50
+ const [isExpanded, setIsExpanded] = useState(defaultExpanded);
51
+ // eslint-disable-next-line react-hooks/exhaustive-deps
52
+ const today = useMemo(() => { const d = new Date(); d.setHours(0, 0, 0, 0); return d; }, []);
53
+
54
+ const year = currentMonth.getFullYear();
55
+ const monthIndex = currentMonth.getMonth();
56
+
57
+ // Get first day of month and number of days
58
+ const firstDay = new Date(year, monthIndex, 1);
59
+ const lastDay = new Date(year, monthIndex + 1, 0);
60
+ const daysInMonth = lastDay.getDate();
61
+ const startingDayOfWeek = firstDay.getDay();
62
+
63
+ // Generate calendar days
64
+ const calendarDays = useMemo(() => {
65
+ const days = [];
66
+
67
+ // Add empty cells for days before month starts
68
+ for (let i = 0; i < startingDayOfWeek; i++) {
69
+ days.push(null);
70
+ }
71
+
72
+ // Add days of the month
73
+ for (let day = 1; day <= daysInMonth; day++) {
74
+ const date = new Date(year, monthIndex, day);
75
+ date.setHours(0, 0, 0, 0);
76
+ days.push(date);
77
+ }
78
+
79
+ return days;
80
+ }, [year, monthIndex, startingDayOfWeek, daysInMonth]);
81
+
82
+ const isToday = (date) => {
83
+ if (!date) return false;
84
+ return date.getTime() === today.getTime();
85
+ };
86
+
87
+ const isSelected = (date) => {
88
+ if (!date) return false;
89
+ if (value) {
90
+ const selectedDate = new Date(value);
91
+ selectedDate.setHours(0, 0, 0, 0);
92
+ return date.getTime() === selectedDate.getTime();
93
+ }
94
+ return false;
95
+ };
96
+
97
+ const isUnavailable = (date) => {
98
+ if (!date) return false;
99
+ return unavailableDates.some((unavail) => {
100
+ const unavailDate = new Date(unavail);
101
+ unavailDate.setHours(0, 0, 0, 0);
102
+ return date.getTime() === unavailDate.getTime();
103
+ });
104
+ };
105
+
106
+ const getDateData = (date) => {
107
+ if (!date) return null;
108
+ const dateKey = date.toISOString().split("T")[0];
109
+ return dateData[dateKey] || null;
110
+ };
111
+
112
+ // Check if a date is the first day of a string of on-assignment days
113
+ const isFirstOnAssignmentDay = (date, dateIndex) => {
114
+ if (!date || !getDateData(date)?.onAssignment) return false;
115
+
116
+ // Check previous day in calendar
117
+ if (dateIndex > 0) {
118
+ const prevDate = calendarDays[dateIndex - 1];
119
+ if (prevDate && getDateData(prevDate)?.onAssignment) {
120
+ return false; // Previous day also has onAssignment
121
+ }
122
+ }
123
+ return true; // This is the first day
124
+ };
125
+
126
+ // Check if a date is the last day of a string of on-assignment days
127
+ const isLastOnAssignmentDay = (date, dateIndex) => {
128
+ if (!date || !getDateData(date)?.onAssignment) return false;
129
+
130
+ // Check next day in calendar
131
+ if (dateIndex < calendarDays.length - 1) {
132
+ const nextDate = calendarDays[dateIndex + 1];
133
+ if (nextDate && getDateData(nextDate)?.onAssignment) {
134
+ return false; // Next day also has onAssignment
135
+ }
136
+ }
137
+ return true; // This is the last day
138
+ };
139
+
140
+ const handleDateClick = (date) => {
141
+ if (date && !isUnavailable(date) && onDateSelect) {
142
+ onDateSelect(date);
143
+ }
144
+ };
145
+
146
+ const handlePrevMonth = () => {
147
+ setCurrentMonth(new Date(year, monthIndex - 1, 1));
148
+ };
149
+
150
+ const handleNextMonth = () => {
151
+ setCurrentMonth(new Date(year, monthIndex + 1, 1));
152
+ };
153
+
154
+ const toggleExpand = () => {
155
+ setIsExpanded(!isExpanded);
156
+ };
157
+
158
+ // Check if we're viewing the current month
159
+ const isCurrentMonth = useMemo(() => {
160
+ const todayMonth = today.getMonth();
161
+ const todayYear = today.getFullYear();
162
+ return monthIndex === todayMonth && year === todayYear;
163
+ }, [monthIndex, year, today]);
164
+
165
+ // Calculate which week to show when collapsed
166
+ const weekOffset = useMemo(() => {
167
+ if (isExpanded) return 0;
168
+
169
+ // If not viewing current month, always show first week
170
+ if (!isCurrentMonth) {
171
+ return 0;
172
+ }
173
+
174
+ // Find the index of today in the calendar
175
+ const todayIndex = calendarDays.findIndex((date) => {
176
+ if (!date) return false;
177
+ return date.getTime() === today.getTime();
178
+ });
179
+
180
+ // If today is not in the current month's calendar, show first week
181
+ if (todayIndex === -1) {
182
+ return 0;
183
+ }
184
+
185
+ // Find the start of the week (Sunday = 0)
186
+ const weekStartIndex = Math.floor(todayIndex / 7) * 7;
187
+ return weekStartIndex / 7; // Convert to week number (0-based)
188
+ }, [isExpanded, calendarDays, today, isCurrentMonth]); // eslint-disable-line react-hooks/exhaustive-deps
189
+
190
+
191
+ // Always show all days, we'll use transform to slide to the correct week when collapsed
192
+ const visibleDays = calendarDays;
193
+
194
+ // Calculate the number of weeks in the month for height adjustment
195
+ const numberOfWeeks = useMemo(() => {
196
+ return Math.ceil(calendarDays.length / 7);
197
+ }, [calendarDays]);
198
+
199
+ const classNames = [BASE_CLASS, className].filter(Boolean).join(" ");
200
+
201
+ return (
202
+ <div className={classNames} {...props}>
203
+ {/* Header */}
204
+ <div className={`${BASE_CLASS}__header`}>
205
+ <Button icon="ArrowLeft" size="small" appearance="text" onClick={handlePrevMonth} aria-label="Previous month" />
206
+ <h3 className={`${BASE_CLASS}__title`}>
207
+ {MONTHS[monthIndex]} {year}
208
+ </h3>
209
+ <Button icon="ArrowRight" size="small" appearance="text" onClick={handleNextMonth} aria-label="Next month" />
210
+ </div>
211
+
212
+ {/* Weekday Header */}
213
+ <div className={`${BASE_CLASS}__weekdays`}>
214
+ {DAYS_OF_WEEK.map((day, index) => (
215
+ <div key={index} className={`${BASE_CLASS}__weekday`}>
216
+ {day}
217
+ </div>
218
+ ))}
219
+ </div>
220
+
221
+ {/* Calendar Grid */}
222
+ <div
223
+ key={`grid-${year}-${monthIndex}`}
224
+ className={`${BASE_CLASS}__grid-wrapper ${isExpanded ? `${BASE_CLASS}__grid-wrapper--expanded` : `${BASE_CLASS}__grid-wrapper--collapsed}`}`}
225
+ style={isExpanded ? { height: `${numberOfWeeks * 64.3}px` } : {}}
226
+ >
227
+ <div
228
+ className={`${BASE_CLASS}__grid`}
229
+ style={{
230
+ transform: !isExpanded
231
+ ? weekOffset === 0
232
+ ? 'translateY(0px)'
233
+ : `translateY(-${weekOffset * 64.3 - 1}px)`
234
+ : 'translateY(0px)'
235
+ }}
236
+ >
237
+ {visibleDays.map((date, index) => {
238
+ if (!date) {
239
+ return (
240
+ <div
241
+ key={`empty-${index}`}
242
+ className={`${BASE_CLASS}__day ${BASE_CLASS}__day--empty`}
243
+ />
244
+ );
245
+ }
246
+
247
+ const dateInfo = getDateData(date);
248
+ const travel = dateInfo?.travel || false;
249
+ const onAssignment = dateInfo?.onAssignment || false;
250
+ const unavailable = isUnavailable(date);
251
+ const today = isToday(date);
252
+ const selected = isSelected(date);
253
+
254
+ // Determine if this is first or last day of on-assignment string
255
+ const firstOnAssignment = isFirstOnAssignmentDay(date, index);
256
+ const lastOnAssignment = isLastOnAssignmentDay(date, index);
257
+
258
+ // Determine icon order based on rules:
259
+ // - First day of on-assignment string with travel: travel comes first
260
+ // - Last day of on-assignment string with both: on-assignment comes first
261
+ // - Default: travel first, then on-assignment
262
+ // eslint-disable-next-line no-unused-vars
263
+ const showTravelFirst = firstOnAssignment && travel && onAssignment;
264
+ const showAssignmentFirst = lastOnAssignment && travel && onAssignment;
265
+
266
+ let dayState = "available";
267
+ if (unavailable) {
268
+ dayState = "unavailable";
269
+ } else if (selected) {
270
+ dayState = "selected";
271
+ } else if (onAssignment && !travel) {
272
+ dayState = "on-assignment";
273
+ }
274
+
275
+ return (
276
+ <button
277
+ key={date.toISOString()}
278
+ type="button"
279
+ className={[
280
+ `${BASE_CLASS}__day`,
281
+ `${BASE_CLASS}__day--${dayState}`,
282
+ today && `${BASE_CLASS}__day--today`,
283
+ ]
284
+ .filter(Boolean)
285
+ .join(" ")}
286
+ onClick={() => handleDateClick(date)}
287
+ disabled={unavailable}
288
+ aria-label={`${date.getDate()} ${MONTHS[monthIndex]} ${year}`}
289
+ >
290
+ <span className={`${BASE_CLASS}__day-number`}>
291
+ {date.getDate()}
292
+ </span>
293
+ {unavailable && (
294
+ <span className={`${BASE_CLASS}__day-unavailable-line`} />
295
+ )}
296
+ {(travel || onAssignment) && (
297
+ <div className={`${BASE_CLASS}__icons`}>
298
+ {showAssignmentFirst ? (
299
+ // Last day: on-assignment first, then travel
300
+ <>
301
+ {onAssignment && (
302
+ <span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--assignment`}>
303
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
304
+ <circle cx="8" cy="8" r="7.5" fill="#DBEAFF" stroke="#1D4ED7"/>
305
+ </svg>
306
+ </span>
307
+ )}
308
+ {travel && (
309
+ <span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--travel`}>
310
+ <svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg">
311
+ <path d="M17.5791 15.4736H0.865265L9.22171 1L17.5791 15.4736Z" fill="#DCFCE7" stroke="#157F3D"/>
312
+ </svg>
313
+ </span>
314
+ )}
315
+ </>
316
+ ) : (
317
+ // First day or default: travel first, then on-assignment
318
+ <>
319
+ {travel && (
320
+ <span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--travel`}>
321
+ <svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg">
322
+ <path d="M17.5791 15.4736H0.865265L9.22171 1L17.5791 15.4736Z" fill="#DCFCE7" stroke="#157F3D"/>
323
+ </svg>
324
+ </span>
325
+ )}
326
+ {onAssignment && (
327
+ <span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--assignment`}>
328
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
329
+ <circle cx="8" cy="8" r="7.5" fill="#DBEAFF" stroke="#1D4ED7"/>
330
+ </svg>
331
+ </span>
332
+ )}
333
+ </>
334
+ )}
335
+ </div>
336
+ )}
337
+ </button>
338
+ );
339
+ })}
340
+ </div>
341
+ </div>
342
+
343
+ {/* Legend */}
344
+ {showLegend && isExpanded && (
345
+ <div className={`${BASE_CLASS}__legend`}>
346
+ <div className={`${BASE_CLASS}__legend-column`}>
347
+ <div className={`${BASE_CLASS}__legend-item`}>
348
+ <div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--available`}>
349
+ </div>
350
+ <span className={`${BASE_CLASS}__legend-label`}>Available</span>
351
+ </div>
352
+ <div className={`${BASE_CLASS}__legend-item`}>
353
+ <div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--unavailable`}>
354
+ <span className={`${BASE_CLASS}__legend-unavailable-line`} />
355
+ </div>
356
+ <span className={`${BASE_CLASS}__legend-label`}>Unavailable</span>
357
+ </div>
358
+ </div>
359
+ <div className={`${BASE_CLASS}__legend-column`}>
360
+ <div className={`${BASE_CLASS}__legend-item`}>
361
+ <div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--assignment`}>
362
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={`${BASE_CLASS}__legend-icon ${BASE_CLASS}__legend-icon--assignment`}>
363
+ <circle cx="8" cy="8" r="7.5" fill="#DBEAFF" stroke="#1D4ED7"/>
364
+ </svg>
365
+ </div>
366
+ <span className={`${BASE_CLASS}__legend-label`}>On Assignment</span>
367
+ </div>
368
+ <div className={`${BASE_CLASS}__legend-item`}>
369
+ <div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--available`}>
370
+ <svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={`${BASE_CLASS}__legend-icon`}>
371
+ <path d="M17.5791 15.4736H0.865265L9.22171 1L17.5791 15.4736Z" fill="#DCFCE7" stroke="#157F3D"/>
372
+ </svg>
373
+ </div>
374
+ <span className={`${BASE_CLASS}__legend-label`}>Travel</span>
375
+ </div>
376
+ </div>
377
+ </div>
378
+ )}
379
+
380
+ {/* Expand/Collapse Button */}
381
+ {showExpandCollapse && (
382
+ <button
383
+ type="button"
384
+ className={`${BASE_CLASS}__toggle`}
385
+ onClick={toggleExpand}
386
+ aria-label={isExpanded ? "Collapse calendar" : "Expand calendar"}
387
+ >
388
+ <Icon name={isExpanded ? "CaretUp" : "CaretDown"} size={16} />
389
+ </button>
390
+ )}
391
+ </div>
392
+ );
393
+ }