@lateralus-ai/shipping-ui 1.4.16 → 2.0.0-dev.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 (451) hide show
  1. package/README.md +70 -53
  2. package/dist/components/Checkbox.d.ts +9 -0
  3. package/dist/components/Chip.d.ts +15 -0
  4. package/dist/components/EmptyState.d.ts +10 -0
  5. package/dist/components/Entry.d.ts +33 -0
  6. package/dist/components/Header.d.ts +9 -0
  7. package/dist/components/Input.d.ts +11 -0
  8. package/dist/components/InputType.d.ts +10 -0
  9. package/dist/components/Modal.d.ts +36 -0
  10. package/dist/components/ModalPanel.d.ts +7 -7
  11. package/dist/components/PdfViewer/ImageViewer.d.ts +2 -2
  12. package/dist/components/PdfViewer/PdfViewer.d.ts +2 -2
  13. package/dist/components/ReportInput.d.ts +10 -0
  14. package/dist/components/Tab.d.ts +7 -0
  15. package/dist/components/Tabs.d.ts +26 -12
  16. package/dist/components/index.d.ts +12 -4
  17. package/dist/domain/Filters/FilterPill.d.ts +6 -0
  18. package/dist/domain/Filters/FilteredPill.d.ts +8 -0
  19. package/dist/domain/Filters/FiltersBar.d.ts +12 -0
  20. package/dist/domain/Filters/index.d.ts +3 -0
  21. package/dist/domain/Forms/FormCard.d.ts +12 -0
  22. package/dist/domain/Forms/FormHeader.d.ts +8 -0
  23. package/dist/domain/Forms/ListRow.d.ts +8 -0
  24. package/dist/domain/Forms/RiskMeter.d.ts +8 -0
  25. package/dist/domain/Forms/index.d.ts +4 -0
  26. package/dist/domain/Library/File.d.ts +8 -0
  27. package/dist/domain/Library/Folder.d.ts +8 -0
  28. package/dist/domain/Library/Folders.d.ts +11 -0
  29. package/dist/domain/Library/ListRow.d.ts +8 -0
  30. package/dist/domain/Library/Navigation.d.ts +7 -0
  31. package/dist/domain/Library/index.d.ts +5 -0
  32. package/dist/domain/Report/InfoHeading.d.ts +7 -0
  33. package/dist/domain/Report/InfoRow.d.ts +8 -0
  34. package/dist/domain/Report/Report.d.ts +7 -0
  35. package/dist/domain/Report/SectionHeader.d.ts +10 -0
  36. package/dist/domain/Report/TaskRow.d.ts +11 -0
  37. package/dist/domain/Report/index.d.ts +5 -0
  38. package/dist/domain/Settings/EquipmentRow.d.ts +8 -0
  39. package/dist/domain/Settings/MemberRow.d.ts +11 -0
  40. package/dist/domain/Settings/SettingRow.d.ts +10 -0
  41. package/dist/domain/Settings/index.d.ts +3 -0
  42. package/dist/domain/Ships/ShipRow.d.ts +10 -0
  43. package/dist/domain/Ships/index.d.ts +1 -0
  44. package/dist/domain/Workflows/GroupHeader.d.ts +8 -0
  45. package/dist/domain/Workflows/Importance.d.ts +8 -0
  46. package/dist/domain/Workflows/Progress.d.ts +7 -0
  47. package/dist/domain/Workflows/Question.d.ts +9 -0
  48. package/dist/domain/Workflows/StatusPopover.d.ts +7 -0
  49. package/dist/domain/Workflows/Task.d.ts +9 -0
  50. package/dist/domain/Workflows/TaskHeader.d.ts +9 -0
  51. package/dist/domain/Workflows/WorkflowFilters.d.ts +6 -0
  52. package/dist/domain/Workflows/WorkflowForm.d.ts +8 -0
  53. package/dist/domain/Workflows/WorkflowHeader.d.ts +11 -0
  54. package/dist/domain/Workflows/WorkflowListItem.d.ts +11 -0
  55. package/dist/domain/Workflows/WorkflowProgress.d.ts +6 -0
  56. package/dist/domain/Workflows/WorkflowRow.d.ts +10 -0
  57. package/dist/domain/Workflows/index.d.ts +13 -0
  58. package/dist/domain/index.d.ts +7 -0
  59. package/dist/icons/ArrowIcon.d.ts +8 -0
  60. package/dist/icons/ChevronIcon.d.ts +8 -0
  61. package/dist/icons/Icon.d.ts +96 -0
  62. package/dist/icons/arrow-paths.d.ts +12 -0
  63. package/dist/icons/chevron-paths.d.ts +27 -0
  64. package/dist/icons/createIcon.d.ts +34 -0
  65. package/dist/icons/generated.d.ts +68 -0
  66. package/dist/icons/icon-sizes.d.ts +5 -0
  67. package/dist/icons/icons-data.d.ts +1023 -0
  68. package/dist/icons/index.d.ts +13 -0
  69. package/dist/icons/types.d.ts +10 -0
  70. package/dist/illustrations/AuditPreparation.d.ts +4 -0
  71. package/dist/illustrations/CompletedTasks.d.ts +4 -0
  72. package/dist/illustrations/Creation.d.ts +4 -0
  73. package/dist/illustrations/InternalAudit.d.ts +4 -0
  74. package/dist/illustrations/Invite.d.ts +4 -0
  75. package/dist/illustrations/PortStateControl.d.ts +4 -0
  76. package/dist/illustrations/Processing.d.ts +4 -0
  77. package/dist/illustrations/QuestionsDone.d.ts +4 -0
  78. package/dist/illustrations/RightShipInspection.d.ts +4 -0
  79. package/dist/illustrations/Upload.d.ts +4 -0
  80. package/dist/illustrations/WorkflowCreated.d.ts +4 -0
  81. package/dist/illustrations/Workflows.d.ts +4 -0
  82. package/dist/illustrations/createIllustration.d.ts +11 -0
  83. package/dist/illustrations/index.d.ts +13 -0
  84. package/dist/index.cjs +64 -80
  85. package/dist/index.d.ts +9 -3
  86. package/dist/index.esm.js +11535 -36619
  87. package/dist/patterns/Chat/Attachment.d.ts +6 -0
  88. package/dist/patterns/Chat/ChatEntry.d.ts +10 -0
  89. package/dist/patterns/Chat/ChatHeader.d.ts +7 -0
  90. package/dist/patterns/Chat/ChatInput.d.ts +5 -0
  91. package/dist/patterns/Chat/ChatStatus.d.ts +6 -0
  92. package/dist/patterns/Chat/ChatTile.d.ts +9 -0
  93. package/dist/patterns/Chat/Copilot.d.ts +8 -0
  94. package/dist/patterns/Chat/Draft.d.ts +5 -0
  95. package/dist/patterns/Chat/Greeting.d.ts +7 -0
  96. package/dist/patterns/Chat/Reference.d.ts +6 -0
  97. package/dist/patterns/Chat/Source.d.ts +6 -0
  98. package/dist/patterns/Chat/Sources.d.ts +5 -0
  99. package/dist/patterns/Chat/Suggestion.d.ts +5 -0
  100. package/dist/patterns/Chat/Suggestions.d.ts +4 -0
  101. package/dist/patterns/Chat/index.d.ts +14 -0
  102. package/dist/patterns/Modal/Invitee.d.ts +8 -0
  103. package/dist/patterns/Modal/ModalFooter.d.ts +6 -0
  104. package/dist/patterns/Modal/ModalHeader.d.ts +10 -0
  105. package/dist/patterns/Modal/index.d.ts +3 -0
  106. package/dist/patterns/Search/Pill.d.ts +10 -0
  107. package/dist/patterns/Search/PillInfo.d.ts +8 -0
  108. package/dist/patterns/Search/ResultRow.d.ts +19 -0
  109. package/dist/patterns/Search/SearchModal.d.ts +88 -0
  110. package/dist/patterns/Search/SectionHeader.d.ts +5 -0
  111. package/dist/patterns/Search/index.d.ts +5 -0
  112. package/dist/patterns/Sidebar/Account.d.ts +22 -0
  113. package/dist/patterns/Sidebar/ActivityNavGroup.d.ts +17 -0
  114. package/dist/patterns/Sidebar/CollapsibleNavGroup.d.ts +24 -0
  115. package/dist/patterns/Sidebar/Indicator.d.ts +6 -0
  116. package/dist/patterns/Sidebar/NewChat.d.ts +10 -0
  117. package/dist/patterns/Sidebar/Sidebar.d.ts +13 -0
  118. package/dist/patterns/Sidebar/SidebarAction.d.ts +11 -0
  119. package/dist/patterns/Sidebar/SidebarEntry.d.ts +25 -0
  120. package/dist/patterns/Sidebar/SidebarHeading.d.ts +11 -0
  121. package/dist/patterns/Sidebar/SidebarLink.d.ts +22 -0
  122. package/dist/patterns/Sidebar/SidebarShell.d.ts +11 -0
  123. package/dist/patterns/Sidebar/Switcher.d.ts +8 -0
  124. package/dist/patterns/Sidebar/constants.d.ts +2 -0
  125. package/dist/patterns/Sidebar/figma-assets.d.ts +3 -0
  126. package/dist/patterns/Sidebar/figma-demo-content.d.ts +75 -0
  127. package/dist/patterns/Sidebar/figma-sidebar-nav.d.ts +12 -0
  128. package/dist/patterns/Sidebar/index.d.ts +13 -0
  129. package/dist/patterns/Sidebar/sidebar-styles.d.ts +45 -0
  130. package/dist/patterns/Skeleton/Skeleton.d.ts +6 -0
  131. package/dist/patterns/Skeleton/index.d.ts +1 -0
  132. package/dist/patterns/index.d.ts +5 -0
  133. package/dist/primitives/Avatar.d.ts +10 -0
  134. package/dist/primitives/Badge.d.ts +14 -0
  135. package/dist/primitives/Button.d.ts +22 -0
  136. package/dist/primitives/Callout.d.ts +7 -0
  137. package/dist/primitives/Count.d.ts +5 -0
  138. package/dist/primitives/DropdownMenu.d.ts +15 -0
  139. package/dist/primitives/GroupedAvatars.d.ts +7 -0
  140. package/dist/primitives/IconButton.d.ts +16 -0
  141. package/dist/primitives/Logo.d.ts +8 -0
  142. package/dist/primitives/MenuItem.d.ts +7 -0
  143. package/dist/primitives/Switch.d.ts +7 -0
  144. package/dist/primitives/ThinkingDot.d.ts +4 -0
  145. package/dist/primitives/Tooltip.d.ts +12 -0
  146. package/dist/primitives/button-styles.d.ts +4 -0
  147. package/dist/primitives/index.d.ts +15 -0
  148. package/dist/style.css +1 -1
  149. package/dist/tailwind-theme.d.ts +234 -198
  150. package/dist/theme-entry-BUK3MJUJ.mjs +261 -0
  151. package/dist/theme-entry-ygTpGaNC.js +1 -0
  152. package/dist/theme-entry.d.ts +2 -0
  153. package/dist/theme.cjs +1 -0
  154. package/dist/theme.d.ts +2 -0
  155. package/dist/theme.esm.js +5 -0
  156. package/dist/tokens/colors.d.ts +148 -0
  157. package/dist/tokens/elevation.d.ts +11 -0
  158. package/dist/tokens/index.d.ts +4 -0
  159. package/dist/tokens/semantic.d.ts +89 -0
  160. package/dist/tokens/typography.d.ts +85 -0
  161. package/package.json +36 -7
  162. package/src/components/Checkbox.tsx +77 -0
  163. package/src/components/Chip.tsx +69 -0
  164. package/src/components/EmptyState.tsx +44 -0
  165. package/src/components/Entry.tsx +138 -0
  166. package/src/components/Header.tsx +39 -0
  167. package/src/components/Input.tsx +69 -0
  168. package/src/components/InputType.tsx +76 -0
  169. package/src/components/Modal.tsx +141 -0
  170. package/src/components/ModalPanel.tsx +22 -37
  171. package/src/components/PdfViewer/ImageViewer.tsx +121 -182
  172. package/src/components/PdfViewer/PdfViewer.tsx +103 -155
  173. package/src/components/ReportInput.tsx +65 -0
  174. package/src/components/Tab.tsx +33 -0
  175. package/src/components/Tabs.tsx +146 -43
  176. package/src/components/index.ts +43 -6
  177. package/src/domain/Filters/FilterPill.tsx +25 -0
  178. package/src/domain/Filters/FilteredPill.tsx +39 -0
  179. package/src/domain/Filters/FiltersBar.tsx +76 -0
  180. package/src/domain/Filters/index.ts +3 -0
  181. package/src/domain/Forms/FormCard.tsx +61 -0
  182. package/src/domain/Forms/FormHeader.tsx +34 -0
  183. package/src/domain/Forms/ListRow.tsx +40 -0
  184. package/src/domain/Forms/RiskMeter.tsx +50 -0
  185. package/src/domain/Forms/index.ts +4 -0
  186. package/src/domain/Library/File.tsx +59 -0
  187. package/src/domain/Library/Folder.tsx +55 -0
  188. package/src/domain/Library/Folders.tsx +43 -0
  189. package/src/domain/Library/ListRow.tsx +40 -0
  190. package/src/domain/Library/Navigation.tsx +31 -0
  191. package/src/domain/Library/index.ts +5 -0
  192. package/src/domain/Report/InfoHeading.tsx +25 -0
  193. package/src/domain/Report/InfoRow.tsx +35 -0
  194. package/src/domain/Report/Report.tsx +53 -0
  195. package/src/domain/Report/SectionHeader.tsx +43 -0
  196. package/src/domain/Report/TaskRow.tsx +57 -0
  197. package/src/domain/Report/index.ts +5 -0
  198. package/src/domain/Settings/EquipmentRow.tsx +39 -0
  199. package/src/domain/Settings/MemberRow.tsx +53 -0
  200. package/src/domain/Settings/SettingRow.tsx +66 -0
  201. package/src/domain/Settings/index.ts +3 -0
  202. package/src/domain/Ships/ShipRow.tsx +49 -0
  203. package/src/domain/Ships/index.ts +1 -0
  204. package/src/domain/Workflows/GroupHeader.tsx +48 -0
  205. package/src/domain/Workflows/Importance.tsx +48 -0
  206. package/src/domain/Workflows/Progress.tsx +55 -0
  207. package/src/domain/Workflows/Question.tsx +42 -0
  208. package/src/domain/Workflows/StatusPopover.tsx +53 -0
  209. package/src/domain/Workflows/Task.tsx +46 -0
  210. package/src/domain/Workflows/TaskHeader.tsx +51 -0
  211. package/src/domain/Workflows/WorkflowFilters.tsx +40 -0
  212. package/src/domain/Workflows/WorkflowForm.tsx +40 -0
  213. package/src/domain/Workflows/WorkflowHeader.tsx +62 -0
  214. package/src/domain/Workflows/WorkflowListItem.tsx +45 -0
  215. package/src/domain/Workflows/WorkflowProgress.tsx +36 -0
  216. package/src/domain/Workflows/WorkflowRow.tsx +43 -0
  217. package/src/domain/Workflows/index.ts +13 -0
  218. package/src/domain/index.ts +37 -0
  219. package/src/icons/ArrowIcon.tsx +42 -0
  220. package/src/icons/ChevronIcon.tsx +42 -0
  221. package/src/icons/Icon.tsx +184 -0
  222. package/src/icons/arrow-paths.ts +8 -0
  223. package/src/icons/chevron-paths.ts +17 -0
  224. package/src/icons/createIcon.tsx +128 -0
  225. package/src/icons/generated.tsx +71 -0
  226. package/src/icons/icon-sizes.ts +20 -0
  227. package/src/icons/icons-data.ts +656 -0
  228. package/src/icons/index.ts +25 -0
  229. package/src/icons/types.ts +18 -0
  230. package/src/illustrations/AuditPreparation.tsx +15 -0
  231. package/src/illustrations/CompletedTasks.tsx +16 -0
  232. package/src/illustrations/Creation.tsx +13 -0
  233. package/src/illustrations/InternalAudit.tsx +13 -0
  234. package/src/illustrations/Invite.tsx +13 -0
  235. package/src/illustrations/PortStateControl.tsx +13 -0
  236. package/src/illustrations/Processing.tsx +17 -0
  237. package/src/illustrations/QuestionsDone.tsx +16 -0
  238. package/src/illustrations/RightShipInspection.tsx +18 -0
  239. package/src/illustrations/Upload.tsx +12 -0
  240. package/src/illustrations/WorkflowCreated.tsx +13 -0
  241. package/src/illustrations/Workflows.tsx +13 -0
  242. package/src/illustrations/createIllustration.tsx +30 -0
  243. package/src/illustrations/index.ts +14 -0
  244. package/src/index.ts +76 -4
  245. package/src/patterns/Chat/Attachment.tsx +27 -0
  246. package/src/patterns/Chat/ChatEntry.tsx +41 -0
  247. package/src/patterns/Chat/ChatHeader.tsx +39 -0
  248. package/src/patterns/Chat/ChatInput.tsx +35 -0
  249. package/src/patterns/Chat/ChatStatus.tsx +26 -0
  250. package/src/patterns/Chat/ChatTile.tsx +40 -0
  251. package/src/patterns/Chat/Copilot.tsx +50 -0
  252. package/src/patterns/Chat/Draft.tsx +23 -0
  253. package/src/patterns/Chat/Greeting.tsx +32 -0
  254. package/src/patterns/Chat/Reference.tsx +26 -0
  255. package/src/patterns/Chat/Source.tsx +27 -0
  256. package/src/patterns/Chat/Sources.tsx +23 -0
  257. package/src/patterns/Chat/Suggestion.tsx +23 -0
  258. package/src/patterns/Chat/Suggestions.tsx +21 -0
  259. package/src/patterns/Chat/index.ts +14 -0
  260. package/src/patterns/Modal/Invitee.tsx +44 -0
  261. package/src/patterns/Modal/ModalFooter.tsx +39 -0
  262. package/src/patterns/Modal/ModalHeader.tsx +77 -0
  263. package/src/patterns/Modal/index.ts +3 -0
  264. package/src/patterns/Search/Pill.tsx +44 -0
  265. package/src/patterns/Search/PillInfo.tsx +41 -0
  266. package/src/patterns/Search/ResultRow.tsx +44 -0
  267. package/src/patterns/Search/SearchModal.tsx +310 -0
  268. package/src/patterns/Search/SectionHeader.tsx +20 -0
  269. package/src/patterns/Search/index.ts +31 -0
  270. package/src/patterns/Sidebar/Account.tsx +193 -0
  271. package/src/patterns/Sidebar/ActivityNavGroup.tsx +71 -0
  272. package/src/patterns/Sidebar/CollapsibleNavGroup.tsx +106 -0
  273. package/src/patterns/Sidebar/Indicator.tsx +14 -0
  274. package/src/patterns/Sidebar/NewChat.tsx +71 -0
  275. package/src/patterns/Sidebar/Sidebar.tsx +363 -0
  276. package/src/patterns/Sidebar/SidebarAction.tsx +55 -0
  277. package/src/patterns/Sidebar/SidebarEntry.tsx +129 -0
  278. package/src/patterns/Sidebar/SidebarHeading.tsx +38 -0
  279. package/src/patterns/Sidebar/SidebarLink.tsx +125 -0
  280. package/src/patterns/Sidebar/SidebarShell.tsx +32 -0
  281. package/src/patterns/Sidebar/Switcher.tsx +116 -0
  282. package/src/patterns/Sidebar/assets/account-avatar-24.jpg +0 -0
  283. package/src/patterns/Sidebar/assets/account-avatar.jpg +0 -0
  284. package/src/patterns/Sidebar/assets/indicator-compliance.png +0 -0
  285. package/src/patterns/Sidebar/assets/indicator-technical.png +0 -0
  286. package/src/patterns/Sidebar/assets/logo-compliance-mark.png +5 -0
  287. package/src/patterns/Sidebar/assets/logo-compliance-mask.png +13 -0
  288. package/src/patterns/Sidebar/assets/logo-compliance.svg +17 -0
  289. package/src/patterns/Sidebar/assets/logo-technical-avatar.svg +17 -0
  290. package/src/patterns/Sidebar/assets/logo-technical-mark.png +5 -0
  291. package/src/patterns/Sidebar/assets/logo-technical.svg +16 -0
  292. package/src/patterns/Sidebar/constants.ts +2 -0
  293. package/src/patterns/Sidebar/figma-assets.ts +4 -0
  294. package/src/patterns/Sidebar/figma-demo-content.ts +30 -0
  295. package/src/patterns/Sidebar/figma-sidebar-nav.ts +79 -0
  296. package/src/patterns/Sidebar/index.ts +13 -0
  297. package/src/patterns/Sidebar/sidebar-styles.ts +101 -0
  298. package/src/patterns/Skeleton/Skeleton.tsx +56 -0
  299. package/src/patterns/Skeleton/index.ts +1 -0
  300. package/src/patterns/index.ts +5 -0
  301. package/src/primitives/Avatar.tsx +71 -0
  302. package/src/primitives/Badge.tsx +44 -0
  303. package/src/primitives/Button.tsx +231 -0
  304. package/src/primitives/Callout.tsx +21 -0
  305. package/src/primitives/Count.tsx +18 -0
  306. package/src/primitives/DropdownMenu.tsx +60 -0
  307. package/src/primitives/GroupedAvatars.tsx +36 -0
  308. package/src/primitives/IconButton.tsx +56 -0
  309. package/src/primitives/Logo.tsx +43 -0
  310. package/src/primitives/MenuItem.tsx +35 -0
  311. package/src/primitives/Switch.tsx +38 -0
  312. package/src/primitives/ThinkingDot.tsx +34 -0
  313. package/src/primitives/Tooltip.tsx +42 -0
  314. package/src/primitives/button-styles.ts +92 -0
  315. package/src/primitives/index.ts +18 -0
  316. package/src/stories/_layout/FigmaPage.tsx +94 -0
  317. package/src/stories/_layout/index.ts +8 -0
  318. package/src/stories/canvases/ButtonsCanvas.tsx +107 -0
  319. package/src/stories/canvases/ButtonsMatrixCanvas.tsx +65 -0
  320. package/src/stories/canvases/ChatCanvas.tsx +130 -0
  321. package/src/stories/canvases/ColorTokensCanvas.tsx +16 -0
  322. package/src/stories/canvases/ColorsCanvas.tsx +101 -0
  323. package/src/stories/canvases/ContentCanvas.tsx +157 -0
  324. package/src/stories/canvases/CoreCanvas.tsx +125 -0
  325. package/src/stories/canvases/DomainFormsCanvas.tsx +67 -0
  326. package/src/stories/canvases/FiltersCanvas.tsx +41 -0
  327. package/src/stories/canvases/FormsCanvas.tsx +71 -0
  328. package/src/stories/canvases/IconsCanvas.tsx +99 -0
  329. package/src/stories/canvases/IllustrationsCanvas.tsx +50 -0
  330. package/src/stories/canvases/LibraryCanvas.tsx +67 -0
  331. package/src/stories/canvases/ModalsCanvas.tsx +54 -0
  332. package/src/stories/canvases/RaiseLevelsCanvas.tsx +27 -0
  333. package/src/stories/canvases/ReportCanvas.tsx +33 -0
  334. package/src/stories/canvases/ReportLayoutCanvas.tsx +19 -0
  335. package/src/stories/canvases/SearchCanvas.tsx +150 -0
  336. package/src/stories/canvases/SettingsCanvas.tsx +41 -0
  337. package/src/stories/canvases/ShipsCanvas.tsx +38 -0
  338. package/src/stories/canvases/SidebarCanvas.tsx +147 -0
  339. package/src/stories/canvases/SidebarLayoutsCanvas.tsx +71 -0
  340. package/src/stories/canvases/SidebarPlayground.tsx +35 -0
  341. package/src/stories/canvases/SkeletonsCanvas.tsx +30 -0
  342. package/src/stories/canvases/TypographyCanvas.tsx +53 -0
  343. package/src/stories/canvases/WorkflowsCanvas.tsx +129 -0
  344. package/src/stories/canvases/figma-buttons-layout.ts +83 -0
  345. package/src/stories/canvases/figma-icons-layout.ts +318 -0
  346. package/src/stories/canvases/figma-sidebar-layout.ts +212 -0
  347. package/src/stories/canvases/figma-sidebar-layouts-layout.ts +84 -0
  348. package/src/stories/canvases/figma-widths.ts +28 -0
  349. package/src/stories/canvases/helpers.tsx +146 -0
  350. package/src/stories/components/Buttons.stories.tsx +12 -0
  351. package/src/stories/components/Chat.stories.tsx +12 -0
  352. package/src/stories/components/Content.stories.tsx +12 -0
  353. package/src/stories/components/Core.stories.tsx +12 -0
  354. package/src/stories/components/DomainForms.stories.tsx +12 -0
  355. package/src/stories/components/Filters.stories.tsx +12 -0
  356. package/src/stories/components/Forms.stories.tsx +12 -0
  357. package/src/stories/components/Icons.stories.tsx +12 -0
  358. package/src/stories/components/Illustrations.stories.tsx +12 -0
  359. package/src/stories/components/Library.stories.tsx +12 -0
  360. package/src/stories/components/Modals.stories.tsx +12 -0
  361. package/src/stories/components/Report.stories.tsx +12 -0
  362. package/src/stories/components/ReportLayout.stories.tsx +12 -0
  363. package/src/stories/components/Search.stories.tsx +12 -0
  364. package/src/stories/components/Settings.stories.tsx +12 -0
  365. package/src/stories/components/Ships.stories.tsx +12 -0
  366. package/src/stories/components/Sidebar.stories.tsx +37 -0
  367. package/src/stories/components/SidebarLayouts.stories.tsx +12 -0
  368. package/src/stories/components/Skeletons.stories.tsx +12 -0
  369. package/src/stories/components/Workflows.stories.tsx +12 -0
  370. package/src/stories/style-guide/Buttons.stories.tsx +12 -0
  371. package/src/stories/style-guide/ColorTokens.stories.tsx +12 -0
  372. package/src/stories/style-guide/Colors.stories.tsx +12 -0
  373. package/src/stories/style-guide/RaiseLevels.stories.tsx +12 -0
  374. package/src/stories/style-guide/Typography.stories.tsx +12 -0
  375. package/src/style.css +169 -2
  376. package/src/tailwind-theme.ts +164 -240
  377. package/src/theme-entry.ts +2 -0
  378. package/src/tokens/colors.ts +82 -0
  379. package/src/tokens/elevation.ts +12 -0
  380. package/src/tokens/index.ts +4 -0
  381. package/src/tokens/semantic.ts +89 -0
  382. package/src/tokens/typography.ts +21 -0
  383. package/tailwind.config.ts +12 -0
  384. package/dist/components/HelloWorld.d.ts +0 -1
  385. package/dist/components/InputPrompt.d.ts +0 -20
  386. package/dist/components/SearchModal.d.ts +0 -24
  387. package/dist/components/Sidebar/Button.d.ts +0 -7
  388. package/dist/components/Sidebar/Container.d.ts +0 -5
  389. package/dist/components/Sidebar/Item.d.ts +0 -9
  390. package/dist/components/Sidebar/Layout.d.ts +0 -10
  391. package/dist/components/Sidebar/Provider.d.ts +0 -14
  392. package/dist/components/Sidebar/SecondaryItem.d.ts +0 -9
  393. package/dist/components/Sidebar/SideContainer.d.ts +0 -5
  394. package/dist/components/Sidebar/ToggleCollapseButton.d.ts +0 -1
  395. package/dist/components/Sidebar/index.d.ts +0 -8
  396. package/dist/components/icons/CloseSidebarIcon.d.ts +0 -2
  397. package/dist/components/icons/CloseSidebarMidIcon.d.ts +0 -1
  398. package/dist/components/icons/ExpandIcon.d.ts +0 -3
  399. package/dist/components/icons/SendArrowIcon.d.ts +0 -4
  400. package/dist/components/icons/SendArrowIconGreen.d.ts +0 -4
  401. package/dist/components/icons/SettingsIcon.d.ts +0 -3
  402. package/dist/components/icons/XIcon.d.ts +0 -3
  403. package/dist/material-theme.d.ts +0 -442
  404. package/dist/stories/Buttons.d.ts +0 -1
  405. package/dist/stories/Checkbox.d.ts +0 -1
  406. package/dist/stories/ColorPalette.d.ts +0 -1
  407. package/dist/stories/Dropdowns.d.ts +0 -1
  408. package/dist/stories/InputPrompt.d.ts +0 -1
  409. package/dist/stories/SearchModal.d.ts +0 -1
  410. package/dist/stories/Sidebar.d.ts +0 -1
  411. package/dist/stories/Typography.d.ts +0 -1
  412. package/src/components/HelloWorld.tsx +0 -3
  413. package/src/components/InputPrompt.tsx +0 -96
  414. package/src/components/SearchModal.tsx +0 -320
  415. package/src/components/Sidebar/Button.tsx +0 -20
  416. package/src/components/Sidebar/Container.tsx +0 -31
  417. package/src/components/Sidebar/Item.tsx +0 -39
  418. package/src/components/Sidebar/Layout.tsx +0 -32
  419. package/src/components/Sidebar/Provider.tsx +0 -47
  420. package/src/components/Sidebar/SecondaryItem.tsx +0 -39
  421. package/src/components/Sidebar/SideContainer.tsx +0 -31
  422. package/src/components/Sidebar/ToggleCollapseButton.tsx +0 -24
  423. package/src/components/Sidebar/index.ts +0 -8
  424. package/src/components/icons/CloseSidebarIcon.tsx +0 -19
  425. package/src/components/icons/CloseSidebarMidIcon.tsx +0 -19
  426. package/src/components/icons/ExpandIcon.tsx +0 -21
  427. package/src/components/icons/SendArrowIcon.tsx +0 -23
  428. package/src/components/icons/SendArrowIconGreen.tsx +0 -17
  429. package/src/components/icons/SettingsIcon.tsx +0 -33
  430. package/src/components/icons/XIcon.tsx +0 -21
  431. package/src/material-theme.ts +0 -477
  432. package/src/stories/Buttons.stories.tsx +0 -15
  433. package/src/stories/Buttons.tsx +0 -52
  434. package/src/stories/Checkbox.stories.tsx +0 -15
  435. package/src/stories/Checkbox.tsx +0 -56
  436. package/src/stories/ColorPalette.stories.tsx +0 -15
  437. package/src/stories/ColorPalette.tsx +0 -85
  438. package/src/stories/DocumentEditor.stories.tsx +0 -287
  439. package/src/stories/Dropdowns.stories.tsx +0 -15
  440. package/src/stories/Dropdowns.tsx +0 -52
  441. package/src/stories/InputPrompt.stories.tsx +0 -15
  442. package/src/stories/InputPrompt.tsx +0 -63
  443. package/src/stories/ModalHeader.stories.tsx +0 -36
  444. package/src/stories/PDFViewer.stories.tsx +0 -39
  445. package/src/stories/SearchModal.stories.tsx +0 -132
  446. package/src/stories/SearchModal.tsx +0 -82
  447. package/src/stories/Sidebar.stories.tsx +0 -15
  448. package/src/stories/Sidebar.tsx +0 -108
  449. package/src/stories/Tabs.stories.tsx +0 -51
  450. package/src/stories/Typography.stories.tsx +0 -15
  451. package/src/stories/Typography.tsx +0 -110
@@ -0,0 +1,101 @@
1
+ import { cn } from "../../utils/cn";
2
+
3
+ /** Figma sidebar surfaces use translucent grey overlays, not solid background-hover tokens. */
4
+ export const sidebarSurfaceHover = "bg-[rgba(38,36,32,0.04)]";
5
+ export const sidebarSurfaceSelected = "bg-[rgba(38,36,32,0.08)]";
6
+
7
+ /** 8px between top-level sidebar blocks (Figma Top gap). */
8
+ export const sidebarBlockGap = "gap-2";
9
+
10
+ /** 4px between entries inside a group (Activity, Ships). */
11
+ export const sidebarGroupGap = "gap-1";
12
+
13
+ /** Section row shell — 36px total (Figma Section symbols). */
14
+ export const sidebarSectionShell =
15
+ "box-border flex h-9 w-full items-center rounded-control p-2";
16
+
17
+ /** Taller section row — 40px (New chat, Ships header). */
18
+ export const sidebarSectionShellTall =
19
+ "box-border flex h-10 w-full items-center rounded-control p-2";
20
+
21
+ /** Collapsed icon-only section — Figma Section/Collapsed On: w-full, p-2, 16px icon. */
22
+ export const sidebarSectionShellCollapsed =
23
+ "relative box-border flex w-full flex-col items-center justify-center rounded-control p-2";
24
+
25
+ /** Figma Indicator overlay — 24×24 anchored top-left of icon content. */
26
+ export const sidebarUnreadOverlay =
27
+ "pointer-events-none absolute left-0 top-0 size-6";
28
+
29
+ /** Figma unread dot — ~6px, top-right of the 24px indicator overlay. */
30
+ export const sidebarUnreadDot =
31
+ "absolute right-0 top-0 size-1.5 rounded-full bg-[#802c20]";
32
+
33
+ export const sidebarSectionContent = "flex w-full min-w-0 items-center gap-2 pl-1";
34
+
35
+ export const sidebarSectionIconClass = "shrink-0 [&>svg]:size-4";
36
+
37
+ export const sidebarSectionLabelClass =
38
+ "min-w-0 flex-1 truncate text-caption-2 tracking-[0.01em]";
39
+
40
+ /** Figma sidebar icon buttons — transparent idle, grey hover (no white fill). */
41
+ export const sidebarQuaternaryIconButton =
42
+ "bg-transparent text-action-quaternary-on-idle hover:bg-[rgba(38,36,32,0.04)] hover:text-action-quaternary-on-hover disabled:bg-transparent disabled:opacity-50";
43
+
44
+ /** Scrollable nav region — thin thumb flush to the right edge (matches shipping-ai). */
45
+ export const sidebarScrollRegion =
46
+ "sidebar-scroll flex min-h-0 flex-1 flex-col overflow-x-hidden overflow-y-auto";
47
+
48
+ /** Nav row — grey hover surface (Section, Entry, collapsed + expanded). */
49
+ export const sidebarRowInteractiveHover =
50
+ "transition-colors hover:bg-[rgba(38,36,32,0.04)] hover:text-display-on-light-primary";
51
+
52
+ /** @deprecated Use sidebarRowInteractiveHover */
53
+ export const sidebarCollapsedRowHover = sidebarRowInteractiveHover;
54
+
55
+ /** New chat — primary blue hover (Figma New chat Hover variant). */
56
+ export const sidebarNewChatInteractiveHover =
57
+ "group/newchat transition-colors hover:bg-action-primary-hover hover:text-action-primary-on-hover";
58
+
59
+ export const sidebarNewChatIconHover =
60
+ "group-hover/newchat:text-action-primary-on-hover";
61
+
62
+ export const sidebarLinkIdle = "text-display-on-light-secondary";
63
+
64
+ export const sidebarLinkHover =
65
+ cn(sidebarSurfaceHover, "text-display-on-light-primary");
66
+
67
+ export const sidebarLinkActive =
68
+ cn(sidebarSurfaceSelected, "text-display-on-light-primary");
69
+
70
+ export const sidebarEntryIdle = "text-display-on-light-secondary";
71
+ export const sidebarEntryHover = cn(sidebarSurfaceHover, "text-display-on-light-primary");
72
+ export const sidebarEntrySelected = cn(sidebarSurfaceSelected, "text-display-on-light-primary");
73
+
74
+ /** Entry row — Figma min-h-[36px] px-[8px] py-[6px]. */
75
+ export const sidebarEntryShell =
76
+ "box-border flex h-9 w-full items-center gap-1 rounded-control px-2 py-1.5";
77
+
78
+ export const sidebarRowPadding = "px-2 py-1.5";
79
+ export const sidebarRowMinHeight = "min-h-9";
80
+ export const sidebarRowRadius = "rounded-control";
81
+
82
+ export const sidebarRowClass = (className?: string) =>
83
+ cn(
84
+ "group/row relative flex w-full items-center gap-1",
85
+ sidebarRowPadding,
86
+ sidebarRowMinHeight,
87
+ sidebarRowRadius,
88
+ className,
89
+ );
90
+
91
+ export const sidebarAnchorClass = (className?: string) =>
92
+ cn(
93
+ "flex min-w-0 flex-1 items-center gap-2 truncate text-left text-caption-2 transition-colors",
94
+ className,
95
+ );
96
+
97
+ export const sidebarSectionAnchorClass = (className?: string) =>
98
+ cn(
99
+ "flex min-w-0 flex-1 items-center gap-2 truncate text-left text-caption-2 transition-colors",
100
+ className,
101
+ );
@@ -0,0 +1,56 @@
1
+ import { cn } from "../../utils/cn";
2
+
3
+ export type SkeletonVariant = "content" | "search";
4
+
5
+ export type SkeletonProps = {
6
+ variant?: SkeletonVariant;
7
+ className?: string;
8
+ };
9
+
10
+ const ContentSkeleton = () => (
11
+ <div className="flex flex-col gap-4 p-4" aria-hidden>
12
+ <div className="flex items-center gap-3">
13
+ <div className="size-8 animate-pulse rounded-full bg-grey-200" />
14
+ <div className="flex flex-1 flex-col gap-2">
15
+ <div className="h-4 w-1/3 animate-pulse rounded bg-grey-200" />
16
+ <div className="h-3 w-1/4 animate-pulse rounded bg-grey-100" />
17
+ </div>
18
+ </div>
19
+ <div className="flex flex-col gap-2">
20
+ <div className="h-4 w-full animate-pulse rounded bg-grey-200" />
21
+ <div className="h-4 w-5/6 animate-pulse rounded bg-grey-200" />
22
+ <div className="h-4 w-2/3 animate-pulse rounded bg-grey-100" />
23
+ </div>
24
+ <div className="h-24 animate-pulse rounded-control bg-grey-100" />
25
+ </div>
26
+ );
27
+
28
+ /** Figma Search loading — 8 rows of icon + bar (no input/pills). */
29
+ const SearchSkeleton = () => {
30
+ const widths = [250, 300, 220, 255, 250, 300, 220, 255];
31
+
32
+ return (
33
+ <div className="flex flex-col gap-1.5 p-4" aria-hidden>
34
+ {widths.map((width, index) => (
35
+ <div key={index} className="flex items-start gap-2 py-2">
36
+ <div className="size-3 shrink-0 animate-pulse rounded-md bg-grey-200" />
37
+ <div
38
+ className="h-3 animate-pulse rounded-md bg-grey-200"
39
+ style={{ width }}
40
+ />
41
+ </div>
42
+ ))}
43
+ </div>
44
+ );
45
+ };
46
+
47
+ export const Skeleton = ({ variant = "content", className }: SkeletonProps) => (
48
+ <div
49
+ className={cn("rounded-control bg-background-primary", className)}
50
+ role="status"
51
+ aria-label="Loading"
52
+ data-variant={variant}
53
+ >
54
+ {variant === "content" ? <ContentSkeleton /> : <SearchSkeleton />}
55
+ </div>
56
+ );
@@ -0,0 +1 @@
1
+ export { Skeleton, type SkeletonProps, type SkeletonVariant } from "./Skeleton";
@@ -0,0 +1,5 @@
1
+ export * from "./Sidebar";
2
+ export * from "./Chat";
3
+ export * from "./Modal";
4
+ export * from "./Search";
5
+ export * from "./Skeleton";
@@ -0,0 +1,71 @@
1
+ import { cn } from "../utils/cn";
2
+
3
+ type ChiefType = "technical" | "compliance" | "initials";
4
+ type AvatarSize = 32 | 24 | 18 | 16;
5
+
6
+ export type AvatarProps = {
7
+ chief: ChiefType;
8
+ size?: AvatarSize;
9
+ initials?: string;
10
+ className?: string;
11
+ };
12
+
13
+ const sizeStyles: Record<AvatarSize, string> = {
14
+ 32: "size-8 text-caption-2-em",
15
+ 24: "size-6 text-footnote-em",
16
+ 18: "size-[18px] text-[10px] font-medium leading-none",
17
+ 16: "size-4 text-[9px] font-medium leading-none",
18
+ };
19
+
20
+ const chiefStyles: Record<ChiefType, string> = {
21
+ technical: "bg-blue-100 text-blue-700",
22
+ compliance: "bg-green-100 text-green-700",
23
+ initials: "bg-grey-200 text-display-on-light-secondary",
24
+ };
25
+
26
+ const TechnicalIcon = ({ size }: { size: AvatarSize }) => {
27
+ const iconSize = size >= 24 ? 12 : 8;
28
+
29
+ return (
30
+ <svg width={iconSize} height={iconSize} viewBox="0 0 12 12" fill="none" aria-hidden>
31
+ <path
32
+ d="M6 1.5v9M3.5 4h5M3.5 8h5"
33
+ stroke="currentColor"
34
+ strokeWidth="1.2"
35
+ strokeLinecap="round"
36
+ />
37
+ </svg>
38
+ );
39
+ };
40
+
41
+ const ComplianceIcon = ({ size }: { size: AvatarSize }) => {
42
+ const iconSize = size >= 24 ? 12 : 8;
43
+
44
+ return (
45
+ <svg width={iconSize} height={iconSize} viewBox="0 0 12 12" fill="none" aria-hidden>
46
+ <path
47
+ d="M3 6l2 2 4-4"
48
+ stroke="currentColor"
49
+ strokeWidth="1.2"
50
+ strokeLinecap="round"
51
+ strokeLinejoin="round"
52
+ />
53
+ </svg>
54
+ );
55
+ };
56
+
57
+ export const Avatar = ({ chief, size = 32, initials, className }: AvatarProps) => (
58
+ <span
59
+ className={cn(
60
+ "inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full",
61
+ sizeStyles[size],
62
+ chiefStyles[chief],
63
+ className,
64
+ )}
65
+ aria-hidden={chief !== "initials"}
66
+ >
67
+ {chief === "technical" && <TechnicalIcon size={size} />}
68
+ {chief === "compliance" && <ComplianceIcon size={size} />}
69
+ {chief === "initials" && (initials?.slice(0, 2).toUpperCase() ?? "AC")}
70
+ </span>
71
+ );
@@ -0,0 +1,44 @@
1
+ import { type ReactNode } from "react";
2
+ import { cn } from "../utils/cn";
3
+
4
+ export type BadgeColor = "blue" | "green" | "red" | "orange" | "purple" | "grey";
5
+ export type BadgeType = "label" | "icon";
6
+
7
+ export type BadgeProps = {
8
+ color: BadgeColor;
9
+ /** `label` grows with content (pill). `icon` is a compact circle for a glyph/digit. */
10
+ type?: BadgeType;
11
+ children: ReactNode;
12
+ className?: string;
13
+ };
14
+
15
+ const colorStyles: Record<BadgeColor, string> = {
16
+ blue: "bg-meta-blue text-meta-onBlue",
17
+ green: "bg-meta-green text-meta-onGreen",
18
+ red: "bg-meta-red text-meta-onRed",
19
+ orange: "bg-meta-orange text-meta-onOrange",
20
+ purple: "bg-meta-purple text-meta-onPurple",
21
+ grey: "bg-grey-100 text-display-on-light-secondary",
22
+ };
23
+
24
+ /**
25
+ * Figma Badge (4365:74363) — padding + rounded-full; no fixed width on labels.
26
+ */
27
+ export const Badge = ({
28
+ color,
29
+ type = "label",
30
+ children,
31
+ className,
32
+ }: BadgeProps) => (
33
+ <span
34
+ className={cn(
35
+ "inline-flex shrink-0 items-center justify-center text-footnote-em leading-none",
36
+ type === "label" && "rounded-full px-1.5 py-0.5",
37
+ type === "icon" && "size-5 rounded-full [&>svg]:size-3",
38
+ colorStyles[color],
39
+ className,
40
+ )}
41
+ >
42
+ {children}
43
+ </span>
44
+ );
@@ -0,0 +1,231 @@
1
+ import {
2
+ type ButtonHTMLAttributes,
3
+ type ComponentType,
4
+ isValidElement,
5
+ type ReactNode,
6
+ } from "react";
7
+ import { ChevronIcon } from "../icons";
8
+ import type { IconProps } from "../icons";
9
+ import { cn } from "../utils/cn";
10
+ import {
11
+ DropdownMenu,
12
+ DropdownMenuItem,
13
+ } from "./DropdownMenu";
14
+ import {
15
+ getButtonAppearanceClasses,
16
+ getButtonInteractiveClasses,
17
+ type ButtonAppearance,
18
+ type ButtonHierarchy,
19
+ } from "./button-styles";
20
+
21
+ export type ButtonDropdownOption = {
22
+ label: string;
23
+ onSelect: () => void;
24
+ destructive?: boolean;
25
+ disabled?: boolean;
26
+ icon?: ComponentType<IconProps>;
27
+ };
28
+
29
+ export type ButtonProps = Omit<
30
+ ButtonHTMLAttributes<HTMLButtonElement>,
31
+ "children"
32
+ > & {
33
+ hierarchy?: ButtonHierarchy;
34
+ disabled?: boolean;
35
+ icon?: ComponentType<IconProps> | ReactNode;
36
+ startIcon?: ComponentType<IconProps> | ReactNode;
37
+ dropdownOptions?: ButtonDropdownOption[];
38
+ dropdownOpen?: boolean;
39
+ onDropdownOpenChange?: (open: boolean) => void;
40
+ forcedState?: ButtonAppearance;
41
+ children: ReactNode;
42
+ };
43
+
44
+ const renderIcon = (icon?: ComponentType<IconProps> | ReactNode) => {
45
+ if (!icon) return null;
46
+
47
+ if (isValidElement(icon)) {
48
+ return <span className="shrink-0 [&>svg]:size-4">{icon}</span>;
49
+ }
50
+
51
+ if (
52
+ typeof icon === "string" ||
53
+ typeof icon === "number" ||
54
+ typeof icon === "boolean"
55
+ ) {
56
+ return <span className="shrink-0 [&>svg]:size-4">{icon}</span>;
57
+ }
58
+
59
+ const Icon = icon as ComponentType<IconProps>;
60
+ return <Icon size="small" className="shrink-0" />;
61
+ };
62
+
63
+ const getAppearance = (
64
+ disabled: boolean,
65
+ forcedState?: ButtonAppearance,
66
+ ): ButtonAppearance => {
67
+ if (forcedState) return forcedState;
68
+ if (disabled) return "disabled";
69
+ return "idle";
70
+ };
71
+
72
+ const getSegmentClasses = (
73
+ hierarchy: ButtonHierarchy,
74
+ appearance: ButtonAppearance,
75
+ forcedState?: ButtonAppearance,
76
+ ) => {
77
+ if (forcedState) {
78
+ return getButtonAppearanceClasses(hierarchy, appearance);
79
+ }
80
+
81
+ if (appearance === "disabled") {
82
+ return getButtonAppearanceClasses(hierarchy, "disabled");
83
+ }
84
+
85
+ if (appearance === "hover") {
86
+ return getButtonAppearanceClasses(hierarchy, "hover");
87
+ }
88
+
89
+ return getButtonInteractiveClasses(hierarchy, false);
90
+ };
91
+
92
+ const getCursorClass = (disabled: boolean) =>
93
+ disabled ? "cursor-not-allowed" : "cursor-pointer";
94
+
95
+ const withSecondarySplitBorders = (
96
+ hierarchy: ButtonHierarchy,
97
+ segment: "main" | "dropdown",
98
+ classes: string,
99
+ ) => {
100
+ if (hierarchy !== "secondary") return classes;
101
+
102
+ return cn(
103
+ classes,
104
+ segment === "main" ? "border-r-0" : "border-l-0",
105
+ );
106
+ };
107
+
108
+ export const Button = ({
109
+ hierarchy = "primary",
110
+ disabled = false,
111
+ icon,
112
+ startIcon,
113
+ dropdownOptions,
114
+ dropdownOpen,
115
+ onDropdownOpenChange,
116
+ forcedState,
117
+ children,
118
+ className,
119
+ type = "button",
120
+ onClick,
121
+ ...props
122
+ }: ButtonProps) => {
123
+ const resolvedIcon = icon ?? startIcon;
124
+ const hasDropdown = Boolean(dropdownOptions?.length);
125
+ const dropdownDisabled = !dropdownOptions?.some((option) => !option.disabled);
126
+ const mainAppearance = getAppearance(disabled, forcedState);
127
+ const dropdownAppearance = getAppearance(dropdownDisabled, forcedState);
128
+ const mainClasses = getSegmentClasses(
129
+ hierarchy,
130
+ mainAppearance,
131
+ forcedState,
132
+ );
133
+ const dropdownClasses = getSegmentClasses(
134
+ hierarchy,
135
+ dropdownAppearance,
136
+ forcedState,
137
+ );
138
+ const label = (
139
+ <>
140
+ {renderIcon(resolvedIcon)}
141
+ <span className="px-2">{children}</span>
142
+ </>
143
+ );
144
+
145
+ if (!hasDropdown) {
146
+ return (
147
+ <button
148
+ type={type}
149
+ disabled={disabled}
150
+ onClick={onClick}
151
+ className={cn(
152
+ "inline-flex min-h-10 items-center justify-center rounded-control p-2 text-caption-1 tracking-[0.32px] transition-colors",
153
+ getCursorClass(disabled),
154
+ mainClasses,
155
+ className,
156
+ )}
157
+ {...props}
158
+ >
159
+ <span className="flex min-h-6 items-center [&>*:first-child]:-mr-1 [&>*:last-child]:-mr-1">
160
+ {label}
161
+ </span>
162
+ </button>
163
+ );
164
+ }
165
+
166
+ const mainButton = (
167
+ <button
168
+ type={type}
169
+ disabled={disabled}
170
+ onClick={onClick}
171
+ className={cn(
172
+ "inline-flex min-h-10 items-center justify-center rounded-none rounded-l-control p-2 text-caption-1 tracking-[0.32px] transition-colors",
173
+ getCursorClass(disabled),
174
+ withSecondarySplitBorders(hierarchy, "main", mainClasses),
175
+ )}
176
+ {...props}
177
+ >
178
+ <span className="flex min-h-6 items-center [&>*:first-child]:-mr-1 [&>*:last-child]:-mr-1">
179
+ {label}
180
+ </span>
181
+ </button>
182
+ );
183
+
184
+ const dropdownTrigger = (
185
+ <button
186
+ type="button"
187
+ disabled={dropdownDisabled}
188
+ aria-label="Open menu"
189
+ className={cn(
190
+ "inline-flex min-h-10 shrink-0 items-center justify-center rounded-none rounded-r-control px-1 transition-colors",
191
+ getCursorClass(dropdownDisabled),
192
+ withSecondarySplitBorders(hierarchy, "dropdown", dropdownClasses),
193
+ )}
194
+ >
195
+ <ChevronIcon direction="down" size="small" />
196
+ </button>
197
+ );
198
+
199
+ return (
200
+ <div
201
+ className={cn(
202
+ "inline-flex min-h-10 items-stretch overflow-hidden rounded-control",
203
+ className,
204
+ )}
205
+ >
206
+ {mainButton}
207
+ <DropdownMenu
208
+ open={dropdownOpen}
209
+ onOpenChange={onDropdownOpenChange}
210
+ align="end"
211
+ trigger={dropdownTrigger}
212
+ contentClassName="min-w-[11rem]"
213
+ >
214
+ {dropdownOptions?.map((option) => (
215
+ <DropdownMenuItem
216
+ key={option.label}
217
+ disabled={option.disabled}
218
+ onSelect={option.onSelect}
219
+ className={cn(
220
+ option.destructive &&
221
+ "text-red-600 hover:bg-red-50 focus:bg-red-50 focus:text-red-600",
222
+ )}
223
+ >
224
+ {option.icon ? renderIcon(option.icon) : null}
225
+ {option.label}
226
+ </DropdownMenuItem>
227
+ ))}
228
+ </DropdownMenu>
229
+ </div>
230
+ );
231
+ };
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from "react";
2
+ import { cn } from "../utils/cn";
3
+
4
+ export type CalloutProps = {
5
+ children: ReactNode;
6
+ icon?: ReactNode;
7
+ className?: string;
8
+ };
9
+
10
+ export const Callout = ({ children, icon, className }: CalloutProps) => (
11
+ <div
12
+ className={cn(
13
+ "flex items-start gap-2 rounded-control bg-meta-blue px-3 py-2 text-caption-2 text-meta-on-blue",
14
+ className,
15
+ )}
16
+ role="note"
17
+ >
18
+ {icon && <span className="shrink-0 pt-0.5 [&>svg]:size-4">{icon}</span>}
19
+ <span>{children}</span>
20
+ </div>
21
+ );
@@ -0,0 +1,18 @@
1
+ import { cn } from "../utils/cn";
2
+
3
+ export type CountProps = {
4
+ value: number;
5
+ className?: string;
6
+ };
7
+
8
+ export const Count = ({ value, className }: CountProps) => (
9
+ <span
10
+ className={cn(
11
+ "inline-flex min-w-5 items-center justify-center rounded-full bg-blue-600 px-1.5 py-0.5 text-footnote-em text-white",
12
+ className,
13
+ )}
14
+ aria-label={`Count: ${value}`}
15
+ >
16
+ {value > 99 ? "99+" : value}
17
+ </span>
18
+ );
@@ -0,0 +1,60 @@
1
+ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
2
+ import { type ReactNode } from "react";
3
+ import { cn } from "../utils/cn";
4
+
5
+ export type DropdownMenuProps = {
6
+ trigger: ReactNode;
7
+ children: ReactNode;
8
+ side?: "top" | "bottom" | "left" | "right";
9
+ align?: "start" | "center" | "end";
10
+ open?: boolean;
11
+ onOpenChange?: (open: boolean) => void;
12
+ triggerClassName?: string;
13
+ contentClassName?: string;
14
+ };
15
+
16
+ export const DropdownMenu = ({
17
+ trigger,
18
+ children,
19
+ side = "bottom",
20
+ align = "start",
21
+ open,
22
+ onOpenChange,
23
+ triggerClassName,
24
+ contentClassName,
25
+ }: DropdownMenuProps) => (
26
+ <DropdownMenuPrimitive.Root open={open} onOpenChange={onOpenChange} modal={false}>
27
+ <DropdownMenuPrimitive.Trigger asChild>{trigger}</DropdownMenuPrimitive.Trigger>
28
+ <DropdownMenuPrimitive.Portal>
29
+ <DropdownMenuPrimitive.Content
30
+ side={side}
31
+ align={align}
32
+ sideOffset={4}
33
+ collisionPadding={8}
34
+ className={cn(
35
+ "z-[200] min-w-40 rounded-control border border-divider-primary bg-background-primary p-1 shadow-raise2",
36
+ contentClassName,
37
+ )}
38
+ >
39
+ {children}
40
+ </DropdownMenuPrimitive.Content>
41
+ </DropdownMenuPrimitive.Portal>
42
+ </DropdownMenuPrimitive.Root>
43
+ );
44
+
45
+ export const DropdownMenuItem = ({
46
+ className,
47
+ ...props
48
+ }: DropdownMenuPrimitive.DropdownMenuItemProps) => (
49
+ <DropdownMenuPrimitive.Item
50
+ className={cn(
51
+ "flex cursor-pointer items-center gap-2 rounded-control px-2 py-1.5 text-caption-1 text-display-on-light-primary outline-none transition-colors hover:bg-grey-100 focus:bg-grey-100 data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
52
+ className,
53
+ )}
54
+ {...props}
55
+ />
56
+ );
57
+
58
+ export const DropdownMenuSeparator = () => (
59
+ <DropdownMenuPrimitive.Separator className="my-1 h-px bg-divider-primary" />
60
+ );
@@ -0,0 +1,36 @@
1
+ import { Avatar } from "./Avatar";
2
+ import { cn } from "../utils/cn";
3
+
4
+ type GroupCount = 1 | 2 | 3;
5
+
6
+ export type GroupedAvatarsProps = {
7
+ count: GroupCount;
8
+ className?: string;
9
+ };
10
+
11
+ const groups: Record<GroupCount, Array<{ chief: "technical" | "compliance" | "initials"; initials?: string }>> = {
12
+ 1: [{ chief: "technical" }],
13
+ 2: [
14
+ { chief: "technical" },
15
+ { chief: "compliance" },
16
+ ],
17
+ 3: [
18
+ { chief: "technical" },
19
+ { chief: "compliance" },
20
+ { chief: "initials", initials: "AC" },
21
+ ],
22
+ };
23
+
24
+ export const GroupedAvatars = ({ count, className }: GroupedAvatarsProps) => (
25
+ <div className={cn("inline-flex items-center", className)}>
26
+ {groups[count].map((avatar, index) => (
27
+ <Avatar
28
+ key={`${avatar.chief}-${index}`}
29
+ chief={avatar.chief}
30
+ initials={avatar.initials}
31
+ size={24}
32
+ className={cn("ring-2 ring-white", index > 0 && "-ml-2")}
33
+ />
34
+ ))}
35
+ </div>
36
+ );