@eocrm/design-system 0.0.0-stage → 0.6.18

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 (898) hide show
  1. package/AI-PRIMER.md +341 -0
  2. package/LICENSE +202 -0
  3. package/README.md +266 -2
  4. package/docs/components/Accordion.md +114 -0
  5. package/docs/components/AgentAvatar.md +58 -0
  6. package/docs/components/Alert.md +81 -0
  7. package/docs/components/AppLayout.md +70 -0
  8. package/docs/components/Avatar.md +49 -0
  9. package/docs/components/AvatarGroup.md +47 -0
  10. package/docs/components/Badge.md +60 -0
  11. package/docs/components/Banner.md +89 -0
  12. package/docs/components/BrandIcon.md +32 -0
  13. package/docs/components/Breadcrumb.md +72 -0
  14. package/docs/components/Button.md +107 -0
  15. package/docs/components/ButtonGroup.md +78 -0
  16. package/docs/components/Calendar.md +158 -0
  17. package/docs/components/Card.md +165 -0
  18. package/docs/components/CatalogPicker.md +83 -0
  19. package/docs/components/Chart.md +114 -0
  20. package/docs/components/ChatBubble.md +55 -0
  21. package/docs/components/ChatLauncher.md +97 -0
  22. package/docs/components/Checkbox.md +55 -0
  23. package/docs/components/CircularProgress.md +53 -0
  24. package/docs/components/Cluster.md +96 -0
  25. package/docs/components/Code.md +35 -0
  26. package/docs/components/CodeBlock.md +67 -0
  27. package/docs/components/ColorPicker.md +115 -0
  28. package/docs/components/ConfirmationPopover.md +70 -0
  29. package/docs/components/Constrain.md +39 -0
  30. package/docs/components/CurrencySelect.md +57 -0
  31. package/docs/components/CursorPagination.md +43 -0
  32. package/docs/components/DashboardCanvas.md +79 -0
  33. package/docs/components/DashboardWidget.md +131 -0
  34. package/docs/components/DataTable.md +88 -0
  35. package/docs/components/DatePicker.md +68 -0
  36. package/docs/components/DateRangePicker.md +71 -0
  37. package/docs/components/DateStrip.md +56 -0
  38. package/docs/components/DefinitionList.md +82 -0
  39. package/docs/components/Divider.md +57 -0
  40. package/docs/components/Dot.md +26 -0
  41. package/docs/components/Drawer.md +94 -0
  42. package/docs/components/DropdownMenu.md +299 -0
  43. package/docs/components/EmojiPicker.md +84 -0
  44. package/docs/components/EmptyState.md +55 -0
  45. package/docs/components/EntityChip.md +102 -0
  46. package/docs/components/ErrorState.md +72 -0
  47. package/docs/components/Field.md +91 -0
  48. package/docs/components/FileUpload.md +109 -0
  49. package/docs/components/FilterChip.md +88 -0
  50. package/docs/components/FlowCanvas.md +108 -0
  51. package/docs/components/FormRow.md +31 -0
  52. package/docs/components/FormSection.md +37 -0
  53. package/docs/components/Grid.md +103 -0
  54. package/docs/components/Highlight.md +75 -0
  55. package/docs/components/HighlightedText.md +50 -0
  56. package/docs/components/IconPicker.md +134 -0
  57. package/docs/components/IconTile.md +30 -0
  58. package/docs/components/Image.md +84 -0
  59. package/docs/components/ImageCrop.md +163 -0
  60. package/docs/components/Indent.md +31 -0
  61. package/docs/components/InlineDatePicker.md +58 -0
  62. package/docs/components/InlineDateRangePicker.md +57 -0
  63. package/docs/components/Input.md +54 -0
  64. package/docs/components/Kanban.md +122 -0
  65. package/docs/components/Kbd.md +41 -0
  66. package/docs/components/Lightbox.md +105 -0
  67. package/docs/components/Link.md +65 -0
  68. package/docs/components/LinkCard.md +41 -0
  69. package/docs/components/LiquidEditor.md +84 -0
  70. package/docs/components/List.md +68 -0
  71. package/docs/components/LiveRegion.md +29 -0
  72. package/docs/components/LocaleProvider.md +25 -0
  73. package/docs/components/Logo.md +41 -0
  74. package/docs/components/Masonry.md +48 -0
  75. package/docs/components/MediaTile.md +95 -0
  76. package/docs/components/Modal.md +107 -0
  77. package/docs/components/MoneyInput.md +62 -0
  78. package/docs/components/OptionsPicker.md +123 -0
  79. package/docs/components/OtpInput.md +65 -0
  80. package/docs/components/Page.md +35 -0
  81. package/docs/components/PageHeader.md +133 -0
  82. package/docs/components/Pagination.md +44 -0
  83. package/docs/components/Palette.md +32 -0
  84. package/docs/components/PasswordInput.md +45 -0
  85. package/docs/components/PasswordStrengthMeter.md +27 -0
  86. package/docs/components/PersonDisplay.md +153 -0
  87. package/docs/components/PhoneInput.md +54 -0
  88. package/docs/components/PillMenu.md +91 -0
  89. package/docs/components/Popover.md +127 -0
  90. package/docs/components/Progress.md +56 -0
  91. package/docs/components/QrCode.md +34 -0
  92. package/docs/components/Radio.md +37 -0
  93. package/docs/components/RadioGroup.md +56 -0
  94. package/docs/components/Rail.md +191 -0
  95. package/docs/components/RelativeDateInput.md +114 -0
  96. package/docs/components/RichText.md +44 -0
  97. package/docs/components/RichTextEditor.md +112 -0
  98. package/docs/components/Screen.md +37 -0
  99. package/docs/components/ScrollArea.md +39 -0
  100. package/docs/components/Select.md +131 -0
  101. package/docs/components/SettingRow.md +98 -0
  102. package/docs/components/Skeleton.md +68 -0
  103. package/docs/components/Slider.md +92 -0
  104. package/docs/components/SlotGrid.md +55 -0
  105. package/docs/components/SocialButton.md +31 -0
  106. package/docs/components/Sortable.md +127 -0
  107. package/docs/components/SortableGroup.md +52 -0
  108. package/docs/components/Sparkline.md +51 -0
  109. package/docs/components/Split.md +76 -0
  110. package/docs/components/Stack.md +59 -0
  111. package/docs/components/StagePath.md +66 -0
  112. package/docs/components/StatGroup.md +61 -0
  113. package/docs/components/StatTile.md +58 -0
  114. package/docs/components/Sticky.md +69 -0
  115. package/docs/components/Switch.md +89 -0
  116. package/docs/components/Table.md +184 -0
  117. package/docs/components/TableOfContents.md +76 -0
  118. package/docs/components/Tabs.md +94 -0
  119. package/docs/components/Text.md +63 -0
  120. package/docs/components/Textarea.md +59 -0
  121. package/docs/components/Thread.md +52 -0
  122. package/docs/components/TimeField.md +70 -0
  123. package/docs/components/Timeline.md +57 -0
  124. package/docs/components/Title.md +54 -0
  125. package/docs/components/ToastViewport.md +61 -0
  126. package/docs/components/Tooltip.md +63 -0
  127. package/docs/components/TopBar.md +214 -0
  128. package/docs/components/Tour.md +85 -0
  129. package/docs/components/TreeView.md +113 -0
  130. package/docs/components/VisuallyHidden.md +43 -0
  131. package/docs/components/WidgetPreview.md +54 -0
  132. package/docs/components/useBelowBreakpoint.md +11 -0
  133. package/docs/components/useMonth.md +18 -0
  134. package/docs/setup.md +51 -0
  135. package/docs/theming.md +95 -0
  136. package/docs/tokens.md +123 -0
  137. package/docs/transient-state.md +56 -0
  138. package/package.json +86 -4
  139. package/src/_meta/manifest.ts +293 -0
  140. package/src/app/AppProvider.tsx +78 -0
  141. package/src/app/index.ts +3 -0
  142. package/src/app/themeTokens.ts +95 -0
  143. package/src/calendar/dateMath.ts +114 -0
  144. package/src/calendar/formatters.ts +75 -0
  145. package/src/calendar/index.ts +39 -0
  146. package/src/calendar/types.ts +36 -0
  147. package/src/calendar/useAgenda.ts +70 -0
  148. package/src/calendar/useDay.ts +51 -0
  149. package/src/calendar/useMonth.ts +82 -0
  150. package/src/calendar/useWeek.ts +62 -0
  151. package/src/calendar/weekInfo.ts +83 -0
  152. package/src/components/Accordion/Accordion.module.scss +304 -0
  153. package/src/components/Accordion/Accordion.tokens.scss +64 -0
  154. package/src/components/Accordion/Accordion.tsx +272 -0
  155. package/src/components/Accordion/AccordionContent.tsx +36 -0
  156. package/src/components/Accordion/AccordionItem.tsx +66 -0
  157. package/src/components/Accordion/AccordionTrigger.tsx +121 -0
  158. package/src/components/Accordion/context.ts +47 -0
  159. package/src/components/Accordion/index.ts +14 -0
  160. package/src/components/Alert/Alert.module.scss +92 -0
  161. package/src/components/Alert/Alert.tokens.scss +60 -0
  162. package/src/components/Alert/Alert.tsx +136 -0
  163. package/src/components/Alert/index.ts +2 -0
  164. package/src/components/AppLayout/AppLayout.module.scss +130 -0
  165. package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
  166. package/src/components/AppLayout/AppLayout.tsx +211 -0
  167. package/src/components/AppLayout/index.ts +2 -0
  168. package/src/components/Avatar/AgentAvatar.module.scss +117 -0
  169. package/src/components/Avatar/AgentAvatar.tsx +122 -0
  170. package/src/components/Avatar/Avatar.module.scss +181 -0
  171. package/src/components/Avatar/Avatar.tokens.scss +107 -0
  172. package/src/components/Avatar/Avatar.tsx +210 -0
  173. package/src/components/Avatar/AvatarGroup.module.scss +128 -0
  174. package/src/components/Avatar/AvatarGroup.tsx +119 -0
  175. package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
  176. package/src/components/Avatar/index.ts +6 -0
  177. package/src/components/Badge/Badge.module.scss +124 -0
  178. package/src/components/Badge/Badge.tokens.scss +74 -0
  179. package/src/components/Badge/Badge.tsx +164 -0
  180. package/src/components/Badge/index.ts +2 -0
  181. package/src/components/Banner/Banner.module.scss +73 -0
  182. package/src/components/Banner/Banner.tokens.scss +51 -0
  183. package/src/components/Banner/Banner.tsx +138 -0
  184. package/src/components/Banner/index.ts +2 -0
  185. package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
  186. package/src/components/BrandIcon/BrandIcon.tsx +99 -0
  187. package/src/components/BrandIcon/index.ts +2 -0
  188. package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
  189. package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
  190. package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
  191. package/src/components/Breadcrumb/index.ts +2 -0
  192. package/src/components/Button/Button.module.scss +167 -0
  193. package/src/components/Button/Button.tokens.scss +90 -0
  194. package/src/components/Button/Button.tsx +205 -0
  195. package/src/components/Button/index.ts +2 -0
  196. package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
  197. package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
  198. package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
  199. package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
  200. package/src/components/ButtonGroup/context.ts +45 -0
  201. package/src/components/ButtonGroup/index.ts +2 -0
  202. package/src/components/Calendar/AgendaView.module.scss +231 -0
  203. package/src/components/Calendar/AgendaView.tsx +214 -0
  204. package/src/components/Calendar/AllDayBand.module.scss +18 -0
  205. package/src/components/Calendar/AllDayBand.tsx +75 -0
  206. package/src/components/Calendar/Calendar.module.scss +23 -0
  207. package/src/components/Calendar/Calendar.tokens.scss +262 -0
  208. package/src/components/Calendar/Calendar.tsx +370 -0
  209. package/src/components/Calendar/DayCell.module.scss +30 -0
  210. package/src/components/Calendar/DayCell.tsx +50 -0
  211. package/src/components/Calendar/DayView.module.scss +10 -0
  212. package/src/components/Calendar/DayView.tsx +163 -0
  213. package/src/components/Calendar/EventChip.module.scss +171 -0
  214. package/src/components/Calendar/EventChip.tsx +115 -0
  215. package/src/components/Calendar/HourGrid.module.scss +123 -0
  216. package/src/components/Calendar/HourGrid.tsx +381 -0
  217. package/src/components/Calendar/MonthView.module.scss +99 -0
  218. package/src/components/Calendar/MonthView.tsx +296 -0
  219. package/src/components/Calendar/TimedEvent.module.scss +205 -0
  220. package/src/components/Calendar/TimedEvent.tsx +247 -0
  221. package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
  222. package/src/components/Calendar/ViewSwitcher.tsx +47 -0
  223. package/src/components/Calendar/WeekView.module.scss +10 -0
  224. package/src/components/Calendar/WeekView.tsx +137 -0
  225. package/src/components/Calendar/eventColor.ts +60 -0
  226. package/src/components/Calendar/index.ts +18 -0
  227. package/src/components/Calendar/types.ts +451 -0
  228. package/src/components/Calendar/useEventDrag.ts +783 -0
  229. package/src/components/Calendar/utils.ts +622 -0
  230. package/src/components/Card/Card.module.scss +264 -0
  231. package/src/components/Card/Card.tokens.scss +55 -0
  232. package/src/components/Card/Card.tsx +170 -0
  233. package/src/components/Card/CardBody.tsx +45 -0
  234. package/src/components/Card/CardHeader.tsx +113 -0
  235. package/src/components/Card/CardList.tsx +24 -0
  236. package/src/components/Card/CardListRow.tsx +24 -0
  237. package/src/components/Card/index.ts +7 -0
  238. package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
  239. package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
  240. package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
  241. package/src/components/CatalogPicker/index.ts +2 -0
  242. package/src/components/Chart/Chart.module.scss +287 -0
  243. package/src/components/Chart/Chart.tokens.scss +63 -0
  244. package/src/components/Chart/Chart.tsx +607 -0
  245. package/src/components/Chart/ChartLegend.tsx +99 -0
  246. package/src/components/Chart/ChartTable.tsx +62 -0
  247. package/src/components/Chart/ChartTooltip.tsx +91 -0
  248. package/src/components/Chart/chartModel.ts +689 -0
  249. package/src/components/Chart/index.ts +2 -0
  250. package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
  251. package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
  252. package/src/components/ChatBubble/ChatBubble.tsx +61 -0
  253. package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
  254. package/src/components/ChatBubble/index.ts +3 -0
  255. package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
  256. package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
  257. package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
  258. package/src/components/ChatLauncher/index.ts +2 -0
  259. package/src/components/ChatLauncher/isAtBottom.ts +12 -0
  260. package/src/components/Checkbox/Checkbox.module.scss +147 -0
  261. package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
  262. package/src/components/Checkbox/Checkbox.tsx +188 -0
  263. package/src/components/Checkbox/index.ts +2 -0
  264. package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
  265. package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
  266. package/src/components/CircularProgress/CircularProgress.tsx +139 -0
  267. package/src/components/CircularProgress/index.ts +7 -0
  268. package/src/components/Cluster/Cluster.module.scss +145 -0
  269. package/src/components/Cluster/Cluster.tokens.scss +11 -0
  270. package/src/components/Cluster/Cluster.tsx +215 -0
  271. package/src/components/Cluster/index.ts +2 -0
  272. package/src/components/Code/Code.module.scss +28 -0
  273. package/src/components/Code/Code.tokens.scss +15 -0
  274. package/src/components/Code/Code.tsx +44 -0
  275. package/src/components/Code/index.ts +2 -0
  276. package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
  277. package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
  278. package/src/components/CodeBlock/CodeBlock.tsx +274 -0
  279. package/src/components/CodeBlock/highlight.ts +179 -0
  280. package/src/components/CodeBlock/index.ts +8 -0
  281. package/src/components/CodeBlock/sampleSync.ts +42 -0
  282. package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
  283. package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
  284. package/src/components/ColorPicker/ColorPicker.tsx +367 -0
  285. package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
  286. package/src/components/ColorPicker/SVSquare.tsx +189 -0
  287. package/src/components/ColorPicker/colorMath.ts +141 -0
  288. package/src/components/ColorPicker/index.ts +6 -0
  289. package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
  290. package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
  291. package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
  292. package/src/components/ConfirmationPopover/index.ts +2 -0
  293. package/src/components/Constrain/Constrain.module.scss +99 -0
  294. package/src/components/Constrain/Constrain.tsx +79 -0
  295. package/src/components/Constrain/index.ts +2 -0
  296. package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
  297. package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
  298. package/src/components/CurrencySelect/index.ts +3 -0
  299. package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
  300. package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
  301. package/src/components/CursorPagination/CursorPagination.tsx +121 -0
  302. package/src/components/CursorPagination/index.ts +2 -0
  303. package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
  304. package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
  305. package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
  306. package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
  307. package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
  308. package/src/components/DashboardCanvas/engine.ts +363 -0
  309. package/src/components/DashboardCanvas/index.ts +9 -0
  310. package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
  311. package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
  312. package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
  313. package/src/components/DashboardWidget/index.ts +7 -0
  314. package/src/components/DataTable/BodyRow.tsx +197 -0
  315. package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
  316. package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
  317. package/src/components/DataTable/DataTable.module.scss +511 -0
  318. package/src/components/DataTable/DataTable.tokens.scss +80 -0
  319. package/src/components/DataTable/DataTable.tsx +734 -0
  320. package/src/components/DataTable/HeaderCell.module.scss +215 -0
  321. package/src/components/DataTable/HeaderCell.tsx +440 -0
  322. package/src/components/DataTable/columnShift.ts +117 -0
  323. package/src/components/DataTable/index.ts +23 -0
  324. package/src/components/DataTable/pinStyle.ts +47 -0
  325. package/src/components/DataTable/reorderColumns.ts +66 -0
  326. package/src/components/DataTable/types.ts +289 -0
  327. package/src/components/DataTable/useColumnDragShift.ts +216 -0
  328. package/src/components/DataTable/useDataTable.ts +372 -0
  329. package/src/components/DataTable/useResizeHandle.ts +97 -0
  330. package/src/components/DatePicker/DatePicker.module.scss +180 -0
  331. package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
  332. package/src/components/DatePicker/DatePicker.tsx +664 -0
  333. package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
  334. package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
  335. package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
  336. package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
  337. package/src/components/DatePicker/index.ts +4 -0
  338. package/src/components/DatePicker/utils.ts +364 -0
  339. package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
  340. package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
  341. package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
  342. package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
  343. package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
  344. package/src/components/DateRangePicker/index.ts +5 -0
  345. package/src/components/DateRangePicker/utils.ts +151 -0
  346. package/src/components/DateStrip/DateStrip.module.scss +78 -0
  347. package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
  348. package/src/components/DateStrip/DateStrip.tsx +205 -0
  349. package/src/components/DateStrip/index.ts +2 -0
  350. package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
  351. package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
  352. package/src/components/DefinitionList/DefinitionList.tsx +198 -0
  353. package/src/components/DefinitionList/index.ts +9 -0
  354. package/src/components/Divider/Divider.module.scss +144 -0
  355. package/src/components/Divider/Divider.tokens.scss +21 -0
  356. package/src/components/Divider/Divider.tsx +103 -0
  357. package/src/components/Divider/index.ts +2 -0
  358. package/src/components/Dot/Dot.module.scss +40 -0
  359. package/src/components/Dot/Dot.tokens.scss +4 -0
  360. package/src/components/Dot/Dot.tsx +45 -0
  361. package/src/components/Dot/index.ts +2 -0
  362. package/src/components/Drawer/Body.tsx +23 -0
  363. package/src/components/Drawer/Close.tsx +35 -0
  364. package/src/components/Drawer/Content.tsx +93 -0
  365. package/src/components/Drawer/Drawer.module.scss +232 -0
  366. package/src/components/Drawer/Drawer.tokens.scss +38 -0
  367. package/src/components/Drawer/Drawer.tsx +23 -0
  368. package/src/components/Drawer/DrawerRoot.tsx +190 -0
  369. package/src/components/Drawer/Footer.tsx +24 -0
  370. package/src/components/Drawer/Header.tsx +64 -0
  371. package/src/components/Drawer/Overlay.tsx +82 -0
  372. package/src/components/Drawer/context.ts +44 -0
  373. package/src/components/Drawer/index.ts +12 -0
  374. package/src/components/Drawer/useDragToClose.ts +149 -0
  375. package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
  376. package/src/components/DropdownMenu/Content.tsx +419 -0
  377. package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
  378. package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
  379. package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
  380. package/src/components/DropdownMenu/Group.tsx +76 -0
  381. package/src/components/DropdownMenu/Item.tsx +148 -0
  382. package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
  383. package/src/components/DropdownMenu/Radio.tsx +178 -0
  384. package/src/components/DropdownMenu/Root.tsx +100 -0
  385. package/src/components/DropdownMenu/Sub.tsx +332 -0
  386. package/src/components/DropdownMenu/Trigger.tsx +76 -0
  387. package/src/components/DropdownMenu/context.ts +65 -0
  388. package/src/components/DropdownMenu/index.ts +20 -0
  389. package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
  390. package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
  391. package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
  392. package/src/components/EmojiPicker/emojiData.ts +245 -0
  393. package/src/components/EmojiPicker/index.ts +3 -0
  394. package/src/components/EmptyState/EmptyState.module.scss +102 -0
  395. package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
  396. package/src/components/EmptyState/EmptyState.tsx +112 -0
  397. package/src/components/EmptyState/index.ts +7 -0
  398. package/src/components/EntityChip/EntityChip.module.scss +275 -0
  399. package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
  400. package/src/components/EntityChip/EntityChip.tsx +649 -0
  401. package/src/components/EntityChip/index.ts +10 -0
  402. package/src/components/ErrorState/ErrorState.module.scss +105 -0
  403. package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
  404. package/src/components/ErrorState/ErrorState.tsx +125 -0
  405. package/src/components/ErrorState/index.ts +8 -0
  406. package/src/components/Field/Field.module.scss +46 -0
  407. package/src/components/Field/Field.tsx +185 -0
  408. package/src/components/Field/index.ts +2 -0
  409. package/src/components/FileUpload/FileUpload.module.scss +187 -0
  410. package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
  411. package/src/components/FileUpload/FileUpload.tsx +569 -0
  412. package/src/components/FileUpload/formatBytes.ts +34 -0
  413. package/src/components/FileUpload/iconForFile.ts +40 -0
  414. package/src/components/FileUpload/index.ts +2 -0
  415. package/src/components/FilterChip/FilterChip.module.scss +61 -0
  416. package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
  417. package/src/components/FilterChip/FilterChip.tsx +208 -0
  418. package/src/components/FilterChip/index.ts +5 -0
  419. package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
  420. package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
  421. package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
  422. package/src/components/FlowCanvas/FlowControls.tsx +46 -0
  423. package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
  424. package/src/components/FlowCanvas/FlowNode.tsx +76 -0
  425. package/src/components/FlowCanvas/edgePath.ts +85 -0
  426. package/src/components/FlowCanvas/index.ts +4 -0
  427. package/src/components/FlowCanvas/layout.ts +148 -0
  428. package/src/components/FlowCanvas/spatialNav.ts +76 -0
  429. package/src/components/FlowCanvas/types.ts +59 -0
  430. package/src/components/FlowCanvas/useViewport.ts +122 -0
  431. package/src/components/FormRow/FormRow.module.scss +2 -0
  432. package/src/components/FormRow/FormRow.tsx +37 -0
  433. package/src/components/FormRow/index.ts +2 -0
  434. package/src/components/FormSection/FormSection.module.scss +24 -0
  435. package/src/components/FormSection/FormSection.tsx +46 -0
  436. package/src/components/FormSection/index.ts +2 -0
  437. package/src/components/Grid/Grid.module.scss +162 -0
  438. package/src/components/Grid/Grid.tokens.scss +13 -0
  439. package/src/components/Grid/Grid.tsx +226 -0
  440. package/src/components/Grid/GridItem.tsx +77 -0
  441. package/src/components/Grid/index.ts +11 -0
  442. package/src/components/Highlight/Highlight.module.scss +43 -0
  443. package/src/components/Highlight/Highlight.tokens.scss +35 -0
  444. package/src/components/Highlight/Highlight.tsx +164 -0
  445. package/src/components/Highlight/HighlightOverlay.tsx +100 -0
  446. package/src/components/Highlight/index.ts +2 -0
  447. package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
  448. package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
  449. package/src/components/HighlightedText/HighlightedText.tsx +50 -0
  450. package/src/components/HighlightedText/highlightRanges.ts +44 -0
  451. package/src/components/HighlightedText/index.ts +2 -0
  452. package/src/components/IconPicker/IconPicker.module.scss +175 -0
  453. package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
  454. package/src/components/IconPicker/IconPicker.tsx +629 -0
  455. package/src/components/IconPicker/index.ts +9 -0
  456. package/src/components/IconTile/IconTile.module.scss +57 -0
  457. package/src/components/IconTile/IconTile.tokens.scss +16 -0
  458. package/src/components/IconTile/IconTile.tsx +91 -0
  459. package/src/components/IconTile/index.ts +2 -0
  460. package/src/components/Image/Image.module.scss +266 -0
  461. package/src/components/Image/Image.tokens.scss +55 -0
  462. package/src/components/Image/Image.tsx +342 -0
  463. package/src/components/Image/index.ts +2 -0
  464. package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
  465. package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
  466. package/src/components/ImageCrop/ImageCrop.tsx +542 -0
  467. package/src/components/ImageCrop/cropGeometry.ts +120 -0
  468. package/src/components/ImageCrop/extractCropBlob.ts +140 -0
  469. package/src/components/ImageCrop/index.ts +11 -0
  470. package/src/components/ImageCrop/useCropPreview.ts +161 -0
  471. package/src/components/Indent/Indent.module.scss +33 -0
  472. package/src/components/Indent/Indent.tokens.scss +10 -0
  473. package/src/components/Indent/Indent.tsx +46 -0
  474. package/src/components/Indent/index.ts +2 -0
  475. package/src/components/Input/Input.module.scss +99 -0
  476. package/src/components/Input/Input.tokens.scss +54 -0
  477. package/src/components/Input/Input.tsx +105 -0
  478. package/src/components/Input/Suggestions.tsx +260 -0
  479. package/src/components/Input/index.ts +2 -0
  480. package/src/components/Kanban/Kanban.module.scss +39 -0
  481. package/src/components/Kanban/Kanban.tokens.scss +15 -0
  482. package/src/components/Kanban/Kanban.tsx +951 -0
  483. package/src/components/Kanban/index.ts +7 -0
  484. package/src/components/Kbd/Kbd.module.scss +47 -0
  485. package/src/components/Kbd/Kbd.tokens.scss +26 -0
  486. package/src/components/Kbd/Kbd.tsx +73 -0
  487. package/src/components/Kbd/index.ts +2 -0
  488. package/src/components/Lightbox/Lightbox.module.scss +283 -0
  489. package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
  490. package/src/components/Lightbox/Lightbox.tsx +506 -0
  491. package/src/components/Lightbox/index.ts +2 -0
  492. package/src/components/Link/Link.module.scss +78 -0
  493. package/src/components/Link/Link.tokens.scss +28 -0
  494. package/src/components/Link/Link.tsx +114 -0
  495. package/src/components/Link/index.ts +2 -0
  496. package/src/components/LinkCard/LinkCard.module.scss +92 -0
  497. package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
  498. package/src/components/LinkCard/LinkCard.tsx +72 -0
  499. package/src/components/LinkCard/index.ts +2 -0
  500. package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
  501. package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
  502. package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
  503. package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
  504. package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
  505. package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
  506. package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
  507. package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
  508. package/src/components/LiquidEditor/index.ts +7 -0
  509. package/src/components/LiquidEditor/liquidFilters.ts +23 -0
  510. package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
  511. package/src/components/LiquidEditor/types.ts +101 -0
  512. package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
  513. package/src/components/List/List.module.scss +105 -0
  514. package/src/components/List/List.tokens.scss +42 -0
  515. package/src/components/List/List.tsx +124 -0
  516. package/src/components/List/index.ts +9 -0
  517. package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
  518. package/src/components/LiveRegion/LiveRegion.tsx +116 -0
  519. package/src/components/LiveRegion/index.ts +2 -0
  520. package/src/components/Logo/Logo.module.scss +139 -0
  521. package/src/components/Logo/Logo.tokens.scss +14 -0
  522. package/src/components/Logo/Logo.tsx +126 -0
  523. package/src/components/Logo/index.ts +2 -0
  524. package/src/components/Masonry/Masonry.module.scss +42 -0
  525. package/src/components/Masonry/Masonry.tokens.scss +8 -0
  526. package/src/components/Masonry/Masonry.tsx +136 -0
  527. package/src/components/Masonry/index.ts +2 -0
  528. package/src/components/Masonry/masonryUtils.ts +42 -0
  529. package/src/components/MediaTile/MediaTile.module.scss +183 -0
  530. package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
  531. package/src/components/MediaTile/MediaTile.tsx +208 -0
  532. package/src/components/MediaTile/index.ts +8 -0
  533. package/src/components/Modal/Body.tsx +27 -0
  534. package/src/components/Modal/Close.tsx +45 -0
  535. package/src/components/Modal/Content.tsx +98 -0
  536. package/src/components/Modal/Footer.tsx +28 -0
  537. package/src/components/Modal/Header.tsx +51 -0
  538. package/src/components/Modal/Modal.module.scss +262 -0
  539. package/src/components/Modal/Modal.tokens.scss +50 -0
  540. package/src/components/Modal/Modal.tsx +23 -0
  541. package/src/components/Modal/ModalRoot.tsx +299 -0
  542. package/src/components/Modal/Overlay.tsx +101 -0
  543. package/src/components/Modal/context.ts +60 -0
  544. package/src/components/Modal/index.ts +11 -0
  545. package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
  546. package/src/components/MoneyInput/MoneyInput.tsx +433 -0
  547. package/src/components/MoneyInput/index.ts +2 -0
  548. package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
  549. package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
  550. package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
  551. package/src/components/OptionsPicker/index.ts +9 -0
  552. package/src/components/OtpInput/OtpInput.module.scss +69 -0
  553. package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
  554. package/src/components/OtpInput/OtpInput.tsx +368 -0
  555. package/src/components/OtpInput/index.ts +2 -0
  556. package/src/components/Page/Page.module.scss +30 -0
  557. package/src/components/Page/Page.tokens.scss +11 -0
  558. package/src/components/Page/Page.tsx +53 -0
  559. package/src/components/Page/index.ts +2 -0
  560. package/src/components/PageHeader/PageHeader.module.scss +197 -0
  561. package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
  562. package/src/components/PageHeader/PageHeader.tsx +310 -0
  563. package/src/components/PageHeader/index.ts +20 -0
  564. package/src/components/Pagination/Pagination.module.scss +117 -0
  565. package/src/components/Pagination/Pagination.tokens.scss +54 -0
  566. package/src/components/Pagination/Pagination.tsx +165 -0
  567. package/src/components/Pagination/index.ts +4 -0
  568. package/src/components/Pagination/paginationRange.ts +72 -0
  569. package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
  570. package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
  571. package/src/components/PasswordInput/PasswordInput.tsx +210 -0
  572. package/src/components/PasswordInput/index.ts +2 -0
  573. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
  574. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
  575. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
  576. package/src/components/PasswordStrengthMeter/index.ts +2 -0
  577. package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
  578. package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
  579. package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
  580. package/src/components/PersonDisplay/index.ts +10 -0
  581. package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
  582. package/src/components/PhoneInput/PhoneInput.tsx +271 -0
  583. package/src/components/PhoneInput/index.ts +4 -0
  584. package/src/components/PhoneInput/phone.ts +128 -0
  585. package/src/components/PillMenu/PillMenu.module.scss +117 -0
  586. package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
  587. package/src/components/PillMenu/PillMenu.tsx +324 -0
  588. package/src/components/PillMenu/index.ts +2 -0
  589. package/src/components/Popover/Anchor.tsx +37 -0
  590. package/src/components/Popover/Close.tsx +45 -0
  591. package/src/components/Popover/Content.tsx +213 -0
  592. package/src/components/Popover/Heading.tsx +33 -0
  593. package/src/components/Popover/Popover.module.scss +177 -0
  594. package/src/components/Popover/Popover.tokens.scss +22 -0
  595. package/src/components/Popover/Popover.tsx +23 -0
  596. package/src/components/Popover/PopoverRoot.tsx +75 -0
  597. package/src/components/Popover/Trigger.tsx +86 -0
  598. package/src/components/Popover/context.ts +22 -0
  599. package/src/components/Popover/index.ts +7 -0
  600. package/src/components/Progress/Progress.module.scss +110 -0
  601. package/src/components/Progress/Progress.tokens.scss +44 -0
  602. package/src/components/Progress/Progress.tsx +129 -0
  603. package/src/components/Progress/index.ts +2 -0
  604. package/src/components/QrCode/QrCode.module.scss +97 -0
  605. package/src/components/QrCode/QrCode.tokens.scss +17 -0
  606. package/src/components/QrCode/QrCode.tsx +233 -0
  607. package/src/components/QrCode/index.ts +2 -0
  608. package/src/components/QrCode/qr.ts +161 -0
  609. package/src/components/Radio/Radio.module.scss +175 -0
  610. package/src/components/Radio/Radio.tokens.scss +59 -0
  611. package/src/components/Radio/Radio.tsx +127 -0
  612. package/src/components/Radio/RadioGroup.module.scss +42 -0
  613. package/src/components/Radio/RadioGroup.tsx +120 -0
  614. package/src/components/Radio/RadioGroupContext.tsx +30 -0
  615. package/src/components/Radio/index.ts +4 -0
  616. package/src/components/Rail/Rail.module.scss +510 -0
  617. package/src/components/Rail/Rail.tokens.scss +92 -0
  618. package/src/components/Rail/Rail.tsx +287 -0
  619. package/src/components/Rail/RailCollapseToggle.tsx +57 -0
  620. package/src/components/Rail/RailFooter.tsx +17 -0
  621. package/src/components/Rail/RailGroup.tsx +728 -0
  622. package/src/components/Rail/RailGroupContext.ts +9 -0
  623. package/src/components/Rail/RailHeader.tsx +23 -0
  624. package/src/components/Rail/RailItem.tsx +119 -0
  625. package/src/components/Rail/RailSection.tsx +39 -0
  626. package/src/components/Rail/RailSpacer.tsx +19 -0
  627. package/src/components/Rail/index.ts +9 -0
  628. package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
  629. package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
  630. package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
  631. package/src/components/RelativeDateInput/index.ts +10 -0
  632. package/src/components/RelativeDateInput/relativeDate.ts +127 -0
  633. package/src/components/RichText/RichText.module.scss +5 -0
  634. package/src/components/RichText/RichText.tsx +70 -0
  635. package/src/components/RichText/RichTextAttachment.module.scss +82 -0
  636. package/src/components/RichText/RichTextAttachment.tsx +122 -0
  637. package/src/components/RichText/_prose.scss +79 -0
  638. package/src/components/RichText/attachmentIcon.tsx +24 -0
  639. package/src/components/RichText/engine/attachment.ts +154 -0
  640. package/src/components/RichText/engine/autolink.ts +64 -0
  641. package/src/components/RichText/engine/blockUnit.ts +174 -0
  642. package/src/components/RichText/engine/colorMarks.ts +85 -0
  643. package/src/components/RichText/engine/escape.ts +11 -0
  644. package/src/components/RichText/engine/fromHtml.ts +353 -0
  645. package/src/components/RichText/engine/fromMarkdown.ts +20 -0
  646. package/src/components/RichText/engine/inlines.ts +82 -0
  647. package/src/components/RichText/engine/listDepths.ts +32 -0
  648. package/src/components/RichText/engine/marks.ts +80 -0
  649. package/src/components/RichText/engine/mdToHtml.ts +178 -0
  650. package/src/components/RichText/engine/model.ts +157 -0
  651. package/src/components/RichText/engine/position.ts +118 -0
  652. package/src/components/RichText/engine/renderDoc.tsx +395 -0
  653. package/src/components/RichText/engine/renderLink.ts +15 -0
  654. package/src/components/RichText/engine/renderMention.ts +16 -0
  655. package/src/components/RichText/engine/safeHref.ts +22 -0
  656. package/src/components/RichText/engine/toHtml.ts +154 -0
  657. package/src/components/RichText/engine/toMarkdown.ts +97 -0
  658. package/src/components/RichText/engine/transforms.ts +434 -0
  659. package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
  660. package/src/components/RichText/index.ts +31 -0
  661. package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
  662. package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
  663. package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
  664. package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
  665. package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
  666. package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
  667. package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
  668. package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
  669. package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
  670. package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
  671. package/src/components/RichTextEditor/autolinkInput.ts +65 -0
  672. package/src/components/RichTextEditor/blockDrop.ts +9 -0
  673. package/src/components/RichTextEditor/blockReflow.ts +62 -0
  674. package/src/components/RichTextEditor/commands.ts +300 -0
  675. package/src/components/RichTextEditor/history.ts +93 -0
  676. package/src/components/RichTextEditor/icons.tsx +152 -0
  677. package/src/components/RichTextEditor/imageSize.ts +70 -0
  678. package/src/components/RichTextEditor/index.ts +5 -0
  679. package/src/components/RichTextEditor/input.ts +209 -0
  680. package/src/components/RichTextEditor/inputRules.ts +71 -0
  681. package/src/components/RichTextEditor/links.ts +103 -0
  682. package/src/components/RichTextEditor/mentionContext.ts +37 -0
  683. package/src/components/RichTextEditor/mentions.ts +28 -0
  684. package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
  685. package/src/components/RichTextEditor/selection.ts +415 -0
  686. package/src/components/RichTextEditor/shortcuts.ts +44 -0
  687. package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
  688. package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
  689. package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
  690. package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
  691. package/src/components/RichTextEditor/useMention.ts +226 -0
  692. package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
  693. package/src/components/RichTextEditor/useUpload.ts +246 -0
  694. package/src/components/Screen/Screen.module.scss +46 -0
  695. package/src/components/Screen/Screen.tokens.scss +20 -0
  696. package/src/components/Screen/Screen.tsx +97 -0
  697. package/src/components/Screen/index.ts +2 -0
  698. package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
  699. package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
  700. package/src/components/ScrollArea/ScrollArea.tsx +154 -0
  701. package/src/components/ScrollArea/index.ts +2 -0
  702. package/src/components/Select/Chip.tsx +45 -0
  703. package/src/components/Select/Empty.tsx +39 -0
  704. package/src/components/Select/Error.tsx +51 -0
  705. package/src/components/Select/HiddenInputs.tsx +44 -0
  706. package/src/components/Select/Listbox.tsx +557 -0
  707. package/src/components/Select/Loading.tsx +30 -0
  708. package/src/components/Select/Select.module.scss +512 -0
  709. package/src/components/Select/Select.tokens.scss +140 -0
  710. package/src/components/Select/Select.tsx +685 -0
  711. package/src/components/Select/Trigger.tsx +952 -0
  712. package/src/components/Select/context.ts +101 -0
  713. package/src/components/Select/emptyStateText.ts +19 -0
  714. package/src/components/Select/index.ts +9 -0
  715. package/src/components/Select/useSelectState.ts +157 -0
  716. package/src/components/Select/utils-types.ts +7 -0
  717. package/src/components/Select/utils.ts +122 -0
  718. package/src/components/SettingRow/SettingRow.module.scss +166 -0
  719. package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
  720. package/src/components/SettingRow/SettingRow.tsx +242 -0
  721. package/src/components/SettingRow/index.ts +7 -0
  722. package/src/components/Skeleton/Skeleton.module.scss +55 -0
  723. package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
  724. package/src/components/Skeleton/Skeleton.tsx +131 -0
  725. package/src/components/Skeleton/index.ts +4 -0
  726. package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
  727. package/src/components/Slider/Slider.module.scss +293 -0
  728. package/src/components/Slider/Slider.tokens.scss +98 -0
  729. package/src/components/Slider/Slider.tsx +624 -0
  730. package/src/components/Slider/index.ts +9 -0
  731. package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
  732. package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
  733. package/src/components/SlotGrid/SlotGrid.tsx +111 -0
  734. package/src/components/SlotGrid/index.ts +2 -0
  735. package/src/components/SocialButton/SocialButton.module.scss +4 -0
  736. package/src/components/SocialButton/SocialButton.tsx +40 -0
  737. package/src/components/SocialButton/index.ts +2 -0
  738. package/src/components/Sortable/Sortable.module.scss +177 -0
  739. package/src/components/Sortable/Sortable.tokens.scss +27 -0
  740. package/src/components/Sortable/Sortable.tsx +572 -0
  741. package/src/components/Sortable/containerAwareCollision.ts +125 -0
  742. package/src/components/Sortable/index.ts +13 -0
  743. package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
  744. package/src/components/SortableGroup/SortableGroup.tsx +315 -0
  745. package/src/components/SortableGroup/index.ts +4 -0
  746. package/src/components/SortableGroup/moveSortableItem.ts +39 -0
  747. package/src/components/Sparkline/Sparkline.module.scss +28 -0
  748. package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
  749. package/src/components/Sparkline/Sparkline.tsx +133 -0
  750. package/src/components/Sparkline/index.ts +2 -0
  751. package/src/components/Sparkline/sparklineModel.ts +119 -0
  752. package/src/components/Split/Split.module.scss +158 -0
  753. package/src/components/Split/Split.tokens.scss +10 -0
  754. package/src/components/Split/Split.tsx +231 -0
  755. package/src/components/Split/index.ts +2 -0
  756. package/src/components/Stack/Stack.module.scss +67 -0
  757. package/src/components/Stack/Stack.tokens.scss +11 -0
  758. package/src/components/Stack/Stack.tsx +100 -0
  759. package/src/components/Stack/index.ts +2 -0
  760. package/src/components/StagePath/StagePath.module.scss +255 -0
  761. package/src/components/StagePath/StagePath.tokens.scss +43 -0
  762. package/src/components/StagePath/StagePath.tsx +176 -0
  763. package/src/components/StagePath/index.ts +2 -0
  764. package/src/components/StatGroup/StatGroup.module.scss +6 -0
  765. package/src/components/StatGroup/StatGroup.tsx +70 -0
  766. package/src/components/StatGroup/StatGroupContext.ts +10 -0
  767. package/src/components/StatGroup/StatTile.module.scss +99 -0
  768. package/src/components/StatGroup/StatTile.tokens.scss +35 -0
  769. package/src/components/StatGroup/StatTile.tsx +143 -0
  770. package/src/components/StatGroup/index.ts +4 -0
  771. package/src/components/Sticky/Sticky.module.scss +98 -0
  772. package/src/components/Sticky/Sticky.tokens.scss +17 -0
  773. package/src/components/Sticky/Sticky.tsx +103 -0
  774. package/src/components/Sticky/index.ts +2 -0
  775. package/src/components/Switch/Switch.module.scss +182 -0
  776. package/src/components/Switch/Switch.tokens.scss +59 -0
  777. package/src/components/Switch/Switch.tsx +214 -0
  778. package/src/components/Switch/index.ts +2 -0
  779. package/src/components/Table/Table.module.scss +308 -0
  780. package/src/components/Table/Table.tokens.scss +79 -0
  781. package/src/components/Table/Table.tsx +381 -0
  782. package/src/components/Table/index.ts +15 -0
  783. package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
  784. package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
  785. package/src/components/TableOfContents/TableOfContents.tsx +192 -0
  786. package/src/components/TableOfContents/activeSection.ts +18 -0
  787. package/src/components/TableOfContents/index.ts +2 -0
  788. package/src/components/Tabs/Tabs.module.scss +359 -0
  789. package/src/components/Tabs/Tabs.tokens.scss +50 -0
  790. package/src/components/Tabs/Tabs.tsx +538 -0
  791. package/src/components/Tabs/index.ts +2 -0
  792. package/src/components/Text/Text.module.scss +115 -0
  793. package/src/components/Text/Text.tokens.scss +55 -0
  794. package/src/components/Text/Text.tsx +197 -0
  795. package/src/components/Text/index.ts +2 -0
  796. package/src/components/Textarea/Textarea.module.scss +94 -0
  797. package/src/components/Textarea/Textarea.tokens.scss +48 -0
  798. package/src/components/Textarea/Textarea.tsx +246 -0
  799. package/src/components/Textarea/index.ts +2 -0
  800. package/src/components/Thread/Thread.module.scss +161 -0
  801. package/src/components/Thread/Thread.tokens.scss +32 -0
  802. package/src/components/Thread/Thread.tsx +176 -0
  803. package/src/components/Thread/index.ts +2 -0
  804. package/src/components/TimeField/TimeField.module.scss +232 -0
  805. package/src/components/TimeField/TimeField.tsx +793 -0
  806. package/src/components/TimeField/index.ts +2 -0
  807. package/src/components/Timeline/Timeline.module.scss +58 -0
  808. package/src/components/Timeline/Timeline.tokens.scss +13 -0
  809. package/src/components/Timeline/Timeline.tsx +53 -0
  810. package/src/components/Timeline/index.ts +2 -0
  811. package/src/components/Title/Title.module.scss +84 -0
  812. package/src/components/Title/Title.tokens.scss +37 -0
  813. package/src/components/Title/Title.tsx +150 -0
  814. package/src/components/Title/index.ts +2 -0
  815. package/src/components/Toast/Toast.module.scss +299 -0
  816. package/src/components/Toast/Toast.tokens.scss +65 -0
  817. package/src/components/Toast/Toast.tsx +122 -0
  818. package/src/components/Toast/ToastViewport.tsx +166 -0
  819. package/src/components/Toast/api.ts +175 -0
  820. package/src/components/Toast/index.ts +5 -0
  821. package/src/components/Toast/store.ts +133 -0
  822. package/src/components/Toast/useToastTimer.ts +94 -0
  823. package/src/components/Tooltip/Tooltip.module.scss +99 -0
  824. package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
  825. package/src/components/Tooltip/Tooltip.tsx +341 -0
  826. package/src/components/Tooltip/index.ts +2 -0
  827. package/src/components/TopBar/TopBar.module.scss +235 -0
  828. package/src/components/TopBar/TopBar.tokens.scss +79 -0
  829. package/src/components/TopBar/TopBar.tsx +87 -0
  830. package/src/components/TopBar/TopBarEnd.tsx +20 -0
  831. package/src/components/TopBar/TopBarIconButton.tsx +86 -0
  832. package/src/components/TopBar/TopBarSearch.tsx +319 -0
  833. package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
  834. package/src/components/TopBar/TopBarStart.tsx +20 -0
  835. package/src/components/TopBar/index.ts +11 -0
  836. package/src/components/Tour/Spotlight.tsx +121 -0
  837. package/src/components/Tour/Tour.module.scss +210 -0
  838. package/src/components/Tour/Tour.tokens.scss +58 -0
  839. package/src/components/Tour/Tour.tsx +617 -0
  840. package/src/components/Tour/index.ts +2 -0
  841. package/src/components/Tour/useTourTarget.ts +115 -0
  842. package/src/components/TreeView/TreeView.module.scss +268 -0
  843. package/src/components/TreeView/TreeView.tokens.scss +36 -0
  844. package/src/components/TreeView/TreeView.tsx +536 -0
  845. package/src/components/TreeView/index.ts +3 -0
  846. package/src/components/TreeView/treeModel.ts +224 -0
  847. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
  848. package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
  849. package/src/components/VisuallyHidden/index.ts +2 -0
  850. package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
  851. package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
  852. package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
  853. package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
  854. package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
  855. package/src/components/WidgetPreview/index.ts +2 -0
  856. package/src/components/_internal/Trend.tsx +27 -0
  857. package/src/components/_internal/choiceTile.scss +74 -0
  858. package/src/components/_internal/collapse.scss +10 -0
  859. package/src/components/_internal/collapse.ts +58 -0
  860. package/src/components/_internal/currency.ts +257 -0
  861. package/src/components/_internal/dragAnnouncements.ts +200 -0
  862. package/src/components/_internal/fieldWiring.ts +225 -0
  863. package/src/components/_internal/gridSpan.ts +54 -0
  864. package/src/components/_internal/isoDay.ts +35 -0
  865. package/src/components/_internal/letterKey.ts +26 -0
  866. package/src/components/_internal/overlay/focusRestore.ts +21 -0
  867. package/src/components/_internal/overlay/index.ts +12 -0
  868. package/src/components/_internal/overlay/tourHold.ts +23 -0
  869. package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
  870. package/src/components/_internal/overlay/useInOverlay.ts +81 -0
  871. package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
  872. package/src/components/_internal/overlay/useScrollLock.ts +112 -0
  873. package/src/components/_internal/refs.ts +48 -0
  874. package/src/components/_internal/statusColor.ts +26 -0
  875. package/src/components/_internal/timeUtils.ts +23 -0
  876. package/src/components/_internal/useAsyncOptions.ts +145 -0
  877. package/src/components/_internal/useClippedTooltip.ts +50 -0
  878. package/src/components/_internal/useControllableState.ts +50 -0
  879. package/src/components.manifest.json +1141 -0
  880. package/src/hooks/useBelowBreakpoint.ts +58 -0
  881. package/src/i18n/I18nProvider.tsx +52 -0
  882. package/src/i18n/LocaleProvider.tsx +17 -0
  883. package/src/i18n/en.ts +648 -0
  884. package/src/i18n/format.ts +71 -0
  885. package/src/i18n/index.ts +13 -0
  886. package/src/i18n/messages.ts +1275 -0
  887. package/src/i18n/ru.ts +677 -0
  888. package/src/i18n/useLocale.ts +19 -0
  889. package/src/i18n/useTranslation.ts +58 -0
  890. package/src/index.ts +913 -0
  891. package/src/palette/index.ts +2 -0
  892. package/src/palette/palette.ts +108 -0
  893. package/src/styles/dark.scss +4 -0
  894. package/src/styles/global.scss +7 -0
  895. package/src/styles/mixins.scss +143 -0
  896. package/src/styles/reset.scss +78 -0
  897. package/src/styles/tokens.scss +18 -0
  898. package/src/styles/typography.scss +44 -0
@@ -0,0 +1,107 @@
1
+ // Avatar.tokens.scss — Component-scoped tokens for <Avatar> and <AvatarGroup>. The name-hashed primitive palette --color-avatar-1..6 stays primitive (in tokens.scss) and the React-injected --avatar-bg inline var also stays as a runtime hook on .crop.
2
+ :root {
3
+ // Surface / shape
4
+ --avatar-radius: var(--radius-full);
5
+ --avatar-fg: var(--color-avatar-fg);
6
+ --avatar-bg-fallback: var(--color-bg-sunken);
7
+ --avatar-font-weight: var(--font-weight-semibold);
8
+
9
+ // Size variants — square dimension + initials font-size per size
10
+ // `inline` is font-relative (#579): one text line tall, initials ~0.7 of
11
+ // the text (≈ the sm ratio of initials to diameter).
12
+ // 1.5em before `lh` support (Safari < 16.4, Firefox < 120) — the library's
13
+ // body line-height, so still about one line.
14
+ --avatar-size-inline: 1.5em;
15
+ --avatar-font-size-inline: 0.7em;
16
+
17
+ // Scales with larger text, but never below the sm dot: #506's presence
18
+ // shapes (filled/half/barred/hollow, 2px strokes) are the non-colour
19
+ // channel and were only checked down to --size-presence-sm (8px).
20
+ --avatar-presence-size-inline: max(var(--size-presence-sm), 0.5em);
21
+ --avatar-size-sm: var(--size-sm);
22
+ --avatar-size-md: var(--size-md);
23
+ --avatar-size-lg: var(--size-lg);
24
+ --avatar-size-xl: var(--size-xl);
25
+ --avatar-font-size-sm: var(--font-size-xs);
26
+ --avatar-font-size-md: var(--font-size-sm);
27
+ --avatar-font-size-lg: var(--font-size-md);
28
+
29
+ // Jumps two steps on the font scale (2xl, not lg/xl) — continues the decreasing size:font ratio (0.458 → 0.375 → 0.35 → 0.30) at 80px.
30
+ --avatar-font-size-xl: var(--font-size-2xl);
31
+
32
+ // Presence dot — ring + per-status fill
33
+ --avatar-presence-radius: var(--radius-full);
34
+ --avatar-presence-ring-width: var(--border-width-emphasis);
35
+ --avatar-presence-ring-color: var(--color-bg);
36
+ --avatar-presence-size-sm: var(--size-presence-sm);
37
+ --avatar-presence-size-md: var(--size-presence-md);
38
+ --avatar-presence-size-lg: var(--size-presence-lg);
39
+ --avatar-presence-size-xl: var(--size-presence-xl);
40
+ --avatar-presence-bg-online: var(--color-presence-online);
41
+ --avatar-presence-bg-busy: var(--color-presence-busy);
42
+ --avatar-presence-bg-away: var(--color-presence-away);
43
+ --avatar-presence-bg-offline: var(--color-presence-offline);
44
+
45
+ // #506. The SHAPE channel. Every cut in a dot is painted in the surface
46
+ // behind the avatar, so the dot reads as a silhouette rather than as two
47
+ // colours — which is what survives a greyscale print and every dichromacy.
48
+ --avatar-presence-glyph-color: var(--avatar-presence-ring-color);
49
+ --avatar-presence-hollow-width: var(--border-width-emphasis);
50
+ --avatar-presence-bar-height: var(--border-width-emphasis);
51
+
52
+ // AgentAvatar — neutral tile (never the name-hashed palette, so a brand mark
53
+ // is not recoloured), mark = a fraction of the tile, badge = the member.
54
+ --agent-avatar-bg: var(--color-bg-muted);
55
+ --agent-avatar-fg: var(--color-fg-muted);
56
+ --agent-avatar-mark-size-inline: calc(var(--avatar-size-inline) * 0.6);
57
+ --agent-avatar-mark-size-sm: calc(var(--avatar-size-sm) * 0.6);
58
+ --agent-avatar-mark-size-md: calc(var(--avatar-size-md) * 0.6);
59
+ --agent-avatar-mark-size-lg: calc(var(--avatar-size-lg) * 0.6);
60
+ --agent-avatar-mark-size-xl: calc(var(--avatar-size-xl) * 0.6);
61
+ --agent-avatar-badge-size-sm: calc(var(--avatar-size-sm) * 0.5);
62
+ --agent-avatar-badge-size-md: calc(var(--avatar-size-md) * 0.5);
63
+ --agent-avatar-badge-size-lg: calc(var(--avatar-size-lg) * 0.5);
64
+ --agent-avatar-badge-size-xl: calc(var(--avatar-size-xl) * 0.45);
65
+ --agent-avatar-badge-font-size: 0.4em;
66
+ --agent-avatar-badge-ring-width: var(--avatar-presence-ring-width);
67
+ --agent-avatar-badge-ring-color: var(--avatar-presence-ring-color);
68
+
69
+ // In-group ring (stacked siblings)
70
+ --avatar-in-group-ring-width: var(--border-width-emphasis);
71
+ --avatar-in-group-ring-color: var(--color-bg);
72
+
73
+ // AvatarGroup — overlap per size
74
+ --avatar-group-overlap-sm: var(--avatar-overlap-sm);
75
+ --avatar-group-overlap-md: var(--avatar-overlap-md);
76
+ --avatar-group-overlap-lg: var(--avatar-overlap-lg);
77
+ --avatar-group-overlap-xl: var(--avatar-overlap-xl);
78
+
79
+ // AvatarGroup — +N overflow chip
80
+ --avatar-overflow-gap: var(--space-1);
81
+ --avatar-overflow-padding-x: var(--space-2);
82
+ --avatar-overflow-bg: var(--color-bg-muted);
83
+ --avatar-overflow-fg: var(--color-fg-muted);
84
+ --avatar-overflow-radius: var(--radius-full);
85
+ --avatar-overflow-font-weight: var(--font-weight-semibold);
86
+ --avatar-overflow-ring-width: var(--border-width-emphasis);
87
+ --avatar-overflow-ring-color: var(--color-bg);
88
+ --avatar-overflow-bg-hover: var(--color-bg-muted-hover);
89
+ --avatar-overflow-fg-hover: var(--color-fg);
90
+ --avatar-overflow-ring-focus: var(--ring-accent);
91
+
92
+ // AvatarGroup — +N size per group size
93
+ --avatar-overflow-size-sm: var(--size-sm);
94
+ --avatar-overflow-size-md: var(--size-md);
95
+ --avatar-overflow-size-lg: var(--size-lg);
96
+ --avatar-overflow-size-xl: var(--size-xl);
97
+ --avatar-overflow-font-size-sm: var(--font-size-xs);
98
+ --avatar-overflow-font-size-md: var(--font-size-sm);
99
+ --avatar-overflow-font-size-lg: var(--font-size-md);
100
+ --avatar-overflow-font-size-xl: var(--font-size-2xl);
101
+ }
102
+
103
+ @supports (height: 1lh) {
104
+ :root {
105
+ --avatar-size-inline: 1lh;
106
+ }
107
+ }
@@ -0,0 +1,210 @@
1
+ import { forwardRef, useState, type CSSProperties, type HTMLAttributes } from 'react';
2
+ import clsx from 'clsx';
3
+ import { Tooltip } from '../Tooltip';
4
+ import { useTranslation } from '../../i18n';
5
+ import { useAvatarGroup } from './AvatarGroupContext';
6
+ import styles from './Avatar.module.scss';
7
+
8
+ /**
9
+ * Diameter. Matches the shared `--size-*` scale so a Button next to an Avatar
10
+ * lines up — except `inline`, which is one text line tall (`1lh`).
11
+ */
12
+ export type AvatarSize = 'inline' | 'sm' | 'md' | 'lg' | 'xl';
13
+
14
+ /** Presence dot rendered in the bottom-right corner. Omit to render no dot. */
15
+ export type AvatarStatus = 'online' | 'busy' | 'away' | 'offline';
16
+
17
+ export interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {
18
+ /**
19
+ * The person's name. Required — used as the `alt`/`aria-label`, as the
20
+ * source of the initials, and as the seed for the deterministic fallback
21
+ * color. The same name always renders the same color. When `tooltip` is
22
+ * true, also used as the tooltip body.
23
+ */
24
+ name: string;
25
+ /**
26
+ * Image URL. When provided, the `<img>` is rendered with `alt={name}`.
27
+ * Empty/whitespace strings are treated as missing. If the image fails to
28
+ * load (404, network), the component automatically falls back to initials.
29
+ */
30
+ src?: string;
31
+ /**
32
+ * Diameter.
33
+ * - `sm` (24px) — table rows, dense lists.
34
+ * - `md` (32px, default) — most uses.
35
+ * - `lg` (40px) — detail-page headers.
36
+ * - `xl` (80px) — member-card popovers / profile headers.
37
+ * - `inline` — one line of the surrounding text tall (`1lh`), initials
38
+ * scaled to match, so an avatar in a text row (a `DefinitionList` value,
39
+ * a table cell, a line of text) doesn't make it taller. Follows the text
40
+ * size; no size decision per call site. Not available on `<AvatarGroup>`
41
+ * — and don't set it per child inside one: the group's overlaps are
42
+ * sized for its fixed steps.
43
+ *
44
+ * Inside `<AvatarGroup>`, defaults to the group's `size`.
45
+ */
46
+ size?: AvatarSize;
47
+ /**
48
+ * Presence dot in the bottom-right.
49
+ * - `'online'` — green.
50
+ * - `'busy'` — red.
51
+ * - `'away'` — amber (the categorical amber, dark enough to read at dot size).
52
+ * - `'offline'` — gray.
53
+ * Omit to render no dot at all.
54
+ *
55
+ * Setting `status` changes the accessible name to `"{name}, {status}"`
56
+ * (localized), because colour alone cannot carry the status (WCAG 1.4.1);
57
+ * query with `getByRole('img', { name: 'Alex, online' })`. Each status also
58
+ * renders a distinct shape (filled / half / barred / hollow), so it survives
59
+ * colour-vision deficiency and greyscale; the dot stays `aria-hidden` so
60
+ * nothing is announced twice.
61
+ */
62
+ status?: AvatarStatus;
63
+ /**
64
+ * Whether to wrap the avatar in a `<Tooltip>` showing `name`. Defaults to
65
+ * `false` (back-compat — existing renders don't gain a hover affordance).
66
+ * Inside `<AvatarGroup>`, the group's `tooltip` prop becomes the default
67
+ * (which itself defaults to `true` for grouped avatars); explicit
68
+ * per-child still wins.
69
+ */
70
+ tooltip?: boolean;
71
+ }
72
+
73
+ const sizeClass: Record<AvatarSize, string> = {
74
+ inline: styles.inline,
75
+ sm: styles.sm,
76
+ md: styles.md,
77
+ lg: styles.lg,
78
+ xl: styles.xl,
79
+ };
80
+
81
+ function initials(name: string): string {
82
+ const parts = name.trim().split(/\s+/).slice(0, 2);
83
+ return parts.map((p) => p[0]?.toUpperCase() ?? '').join('') || '?';
84
+ }
85
+
86
+ /**
87
+ * Returns the avatar color slot (1-6) for a given name. The mapping is stable:
88
+ * the same name always returns the same slot. Useful for matching avatar
89
+ * colors elsewhere (e.g. a "ghost" item or a chart segment representing the
90
+ * same user).
91
+ *
92
+ * Each slot corresponds to a `--color-avatar-N` CSS custom property.
93
+ */
94
+ export function avatarColorIndex(name: string): number {
95
+ let hash = 0;
96
+ for (let i = 0; i < name.length; i++) hash = (hash * 31 + name.charCodeAt(i)) | 0;
97
+ return (Math.abs(hash) % 6) + 1;
98
+ }
99
+
100
+ type StyleWithVars = CSSProperties & { [key: `--${string}`]: string | number };
101
+
102
+ function hasOwnProps(obj: object | undefined): obj is object {
103
+ return obj !== undefined && Object.keys(obj).length > 0;
104
+ }
105
+
106
+ /**
107
+ * Profile circle. Renders an `<img>` when `src` is set, otherwise initials on a deterministic color.
108
+ * @see docs/components/Avatar.md
109
+ */
110
+ export const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(
111
+ { name, src, size, status, tooltip, className, style, ...props },
112
+ ref,
113
+ ) {
114
+ const t = useTranslation();
115
+ const group = useAvatarGroup();
116
+ const resolvedSize: AvatarSize = size ?? group?.size ?? 'md';
117
+ const resolvedTooltip: boolean = tooltip ?? group?.tooltip ?? false;
118
+
119
+ // Reset on src change during render, not in an effect: a mount-time effect
120
+ // undid an error that fired before it ran (#574).
121
+ const [imageBroken, setImageBroken] = useState(false);
122
+ const [prevSrc, setPrevSrc] = useState(src);
123
+ if (src !== prevSrc) {
124
+ setPrevSrc(src);
125
+ setImageBroken(false);
126
+ }
127
+
128
+ const hasImage = typeof src === 'string' && src.trim() !== '' && !imageBroken;
129
+ const trimmedName = name.trim();
130
+ const accessibleName = trimmedName === '' ? '?' : trimmedName;
131
+
132
+ // #506. Presence was colour-only: the dot is decorative, and `status` reached
133
+ // neither the accessible name nor the tooltip, so WCAG 1.4.1 applied and the
134
+ // library did not meet it. The OKLab separation the token gate measures is
135
+ // blind to dichromacy — under simulated protanopia light away/busy collapses
136
+ // by an order of magnitude while that gate reads 0.158 and passes.
137
+ //
138
+ // FOLDED INTO THE NAME rather than announced from the dot, for two reasons.
139
+ // Rule 10: presence is a property you ARRIVE at — an avatar sits in a list you
140
+ // browse minutes after it rendered — and arrived-at properties belong in the
141
+ // name. And mechanically, the no-image branch is `role="img"`, whose children
142
+ // ARIA prunes as presentational: a visually-hidden span inside it would be
143
+ // silent in exactly half the cases, which is the trap Rule 10 records for
144
+ // Lightbox. Folding works identically in both branches.
145
+ //
146
+ // The dot itself stays aria-hidden, so nothing is announced twice.
147
+ const statusLabel = status ? t(`avatar.presence.${status}` as const) : undefined;
148
+ const labelledName = statusLabel ? `${accessibleName}, ${statusLabel}` : accessibleName;
149
+
150
+ const fallbackStyle: StyleWithVars | undefined = hasImage
151
+ ? undefined
152
+ : { '--avatar-bg': `var(--color-avatar-${avatarColorIndex(accessibleName)})` };
153
+
154
+ const mergedStyle: StyleWithVars | undefined =
155
+ hasOwnProps(fallbackStyle) || hasOwnProps(style) ? { ...fallbackStyle, ...style } : undefined;
156
+
157
+ const wrapperClass = clsx(
158
+ styles.avatar,
159
+ sizeClass[resolvedSize],
160
+ group != null && styles.inGroup,
161
+ className,
162
+ );
163
+
164
+ // .crop clips the image/initials into a circle without clipping the
165
+ // .presence dot, which lives as a sibling outside .crop.
166
+ const cropInner = hasImage ? (
167
+ <span className={styles.crop}>
168
+ <img src={src} alt={labelledName} onError={() => setImageBroken(true)} />
169
+ </span>
170
+ ) : (
171
+ <span className={styles.crop}>
172
+ <span aria-hidden="true">{initials(name)}</span>
173
+ </span>
174
+ );
175
+
176
+ const presenceDot = status ? (
177
+ <span aria-hidden="true" className={styles.presence} data-status={status} />
178
+ ) : null;
179
+
180
+ // {...props} first so component-owned ARIA attributes (role, aria-label) win.
181
+ const inner = hasImage ? (
182
+ <span {...props} ref={ref} className={wrapperClass} style={mergedStyle}>
183
+ {cropInner}
184
+ {presenceDot}
185
+ </span>
186
+ ) : (
187
+ <span
188
+ {...props}
189
+ ref={ref}
190
+ role="img"
191
+ aria-label={labelledName}
192
+ className={wrapperClass}
193
+ style={mergedStyle}
194
+ >
195
+ {cropInner}
196
+ {presenceDot}
197
+ </span>
198
+ );
199
+
200
+ // Suppress the tooltip when we don't have a real name to show — the
201
+ // `?` fallback is for unnamed avatars and saying "?" in a tooltip
202
+ // would be noise. (Comparing trimmedName, not accessibleName, so a
203
+ // person legitimately named `?` still gets a tooltip.)
204
+ const hasRealName = trimmedName !== '';
205
+ if (resolvedTooltip && hasRealName) {
206
+ return <Tooltip content={accessibleName}>{inner}</Tooltip>;
207
+ }
208
+
209
+ return inner;
210
+ });
@@ -0,0 +1,128 @@
1
+ @use './Avatar.tokens';
2
+
3
+ // AvatarGroup — horizontal row of stacked Avatars with optional +N overflow.
4
+ // Rule 4 note: `.item:not(:first-child)` uses `margin-left` to overlap
5
+ // siblings — intentional internal layout. The public component IS the
6
+ // wrapper; consumers don't see the inner `.item` divs.
7
+ .group {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ }
11
+
12
+ .item {
13
+ position: relative;
14
+ display: inline-flex;
15
+ }
16
+
17
+ // Hovered (or keyboard-focused) item rises to the top of the stack so the
18
+ // reader can see the full circle of the avatar they're inspecting. Without
19
+ // this, deeper-in-the-stack avatars are clipped by their right neighbour.
20
+ .item:hover,
21
+ .item:focus-within {
22
+ z-index: 1;
23
+ }
24
+
25
+ // Per-size overlap. The group wrapper picks up a .groupSize-* class so
26
+ // every direct .item child after the first slides left by the right amount.
27
+ // stylelint-disable property-disallowed-list -- margin-left here is intentional
28
+ // internal layout: .item divs are internal implementation detail, not exposed to
29
+ // consumers. Negative margin is the only CSS mechanism that both overlaps elements
30
+ // and reclaims space in the flow; gap and translate cannot produce negative spacing.
31
+ .groupSize-sm > .item:not(:first-child, .overflowItem) {
32
+ margin-left: var(--avatar-group-overlap-sm);
33
+ }
34
+
35
+ .groupSize-md > .item:not(:first-child, .overflowItem) {
36
+ margin-left: var(--avatar-group-overlap-md);
37
+ }
38
+
39
+ .groupSize-lg > .item:not(:first-child, .overflowItem) {
40
+ margin-left: var(--avatar-group-overlap-lg);
41
+ }
42
+
43
+ .groupSize-xl > .item:not(:first-child, .overflowItem) {
44
+ margin-left: var(--avatar-group-overlap-xl);
45
+ }
46
+
47
+ // The +N item gets a small positive gap from its preceding sibling instead
48
+ // of the negative overlap used between avatars. It's metadata, not a face,
49
+ // so it should not pretend to be another stacked avatar — plus longer
50
+ // counts (+33, +99) deserve breathing room.
51
+ .groupSize-sm > .overflowItem,
52
+ .groupSize-md > .overflowItem,
53
+ .groupSize-lg > .overflowItem,
54
+ .groupSize-xl > .overflowItem {
55
+ margin-left: var(--avatar-overflow-gap);
56
+ }
57
+ // stylelint-enable property-disallowed-list
58
+
59
+ // +N overflow chip — same circular surface as Avatar, muted background.
60
+ // The 2px ring matches the .inGroup ring on Avatar so the +N sits flush.
61
+ .overflow {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ flex-shrink: 0;
66
+
67
+ // Height is fixed per size; width stretches for multi-digit counts (+33,
68
+ // +99) via min-width + horizontal padding. The pill keeps full radius so
69
+ // a single-digit +N still reads as a perfect circle.
70
+ padding: 0 var(--avatar-overflow-padding-x);
71
+ background: var(--avatar-overflow-bg);
72
+ color: var(--avatar-overflow-fg);
73
+ border: none;
74
+ border-radius: var(--avatar-overflow-radius);
75
+ font-family: inherit;
76
+ font-weight: var(--avatar-overflow-font-weight);
77
+ box-shadow: 0 0 0 var(--avatar-overflow-ring-width) var(--avatar-overflow-ring-color);
78
+ cursor: default;
79
+ user-select: none;
80
+
81
+ &:is(button) {
82
+ cursor: pointer;
83
+ }
84
+
85
+ &:is(button):hover {
86
+ background: var(--avatar-overflow-bg-hover);
87
+ color: var(--avatar-overflow-fg-hover);
88
+ }
89
+
90
+ // Stays a two-layer box-shadow rather than moving to the focus-ring mixin
91
+ // (#505). The inner layer is --color-bg and is doing the same job
92
+ // outline-offset does elsewhere — separating the ring from the chip — but it
93
+ // also has to sit between the chip and the OVERLAPPING avatars beside it,
94
+ // which an offset gap showing the real surface would not do, because the real
95
+ // surface there is another avatar. It picked up the opaque --ring-accent for
96
+ // free, so the conformance fix reached it anyway.
97
+ &:is(button):focus-visible {
98
+ outline: none;
99
+ box-shadow:
100
+ 0 0 0 var(--avatar-overflow-ring-width) var(--avatar-overflow-ring-color),
101
+ 0 0 0 calc(var(--avatar-overflow-ring-width) + var(--ring-width))
102
+ var(--avatar-overflow-ring-focus);
103
+ }
104
+ }
105
+
106
+ .overflowSize-sm {
107
+ min-width: var(--avatar-overflow-size-sm);
108
+ height: var(--avatar-overflow-size-sm);
109
+ font-size: var(--avatar-overflow-font-size-sm);
110
+ }
111
+
112
+ .overflowSize-md {
113
+ min-width: var(--avatar-overflow-size-md);
114
+ height: var(--avatar-overflow-size-md);
115
+ font-size: var(--avatar-overflow-font-size-md);
116
+ }
117
+
118
+ .overflowSize-lg {
119
+ min-width: var(--avatar-overflow-size-lg);
120
+ height: var(--avatar-overflow-size-lg);
121
+ font-size: var(--avatar-overflow-font-size-lg);
122
+ }
123
+
124
+ .overflowSize-xl {
125
+ min-width: var(--avatar-overflow-size-xl);
126
+ height: var(--avatar-overflow-size-xl);
127
+ font-size: var(--avatar-overflow-font-size-xl);
128
+ }
@@ -0,0 +1,119 @@
1
+ import {
2
+ Children,
3
+ forwardRef,
4
+ isValidElement,
5
+ useMemo,
6
+ type HTMLAttributes,
7
+ type MouseEvent,
8
+ type ReactNode,
9
+ } from 'react';
10
+ import clsx from 'clsx';
11
+ import type { AvatarSize } from './Avatar';
12
+ import { AvatarGroupContext, type AvatarGroupContextValue } from './AvatarGroupContext';
13
+ import styles from './AvatarGroup.module.scss';
14
+ import { useTranslation } from '../../i18n/useTranslation';
15
+
16
+ export interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {
17
+ /** Avatar children. */
18
+ children: ReactNode;
19
+
20
+ /**
21
+ * Diameter default for child avatars. Defaults to `'md'`. Each child can
22
+ * still override via its own `size` prop (idiomatic React composition —
23
+ * explicit prop wins). For a strictly uniform group, don't set `size` on
24
+ * individual children.
25
+ * - `sm` (24px) — table rows, dense lists.
26
+ * - `md` (32px, default) — most uses.
27
+ * - `lg` (40px) — detail-page headers.
28
+ * - `xl` (80px) — member-card popovers / profile headers.
29
+ */
30
+ size?: Exclude<AvatarSize, 'inline'>;
31
+
32
+ /**
33
+ * Maximum number of visible avatars. Children beyond this count collapse
34
+ * into a single `+N` button at the tail. Defaults to `4`. The `+N` only
35
+ * appears when there are STRICTLY more children than `max`.
36
+ */
37
+ max?: number;
38
+
39
+ /**
40
+ * Whether to render a name tooltip on each child avatar. Defaults to `true`
41
+ * inside the group (a standalone `<Avatar tooltip>` is opt-in; group context
42
+ * flips that default). Set `false` on the group to suppress all tooltips;
43
+ * overridable per-child by setting `tooltip` on the Avatar.
44
+ */
45
+ tooltip?: boolean;
46
+
47
+ /**
48
+ * Fires when the user clicks the `+N` overflow button. The library does
49
+ * NOT render a popover — apps decide what happens (open a modal, navigate,
50
+ * etc.). When omitted, the `+N` is rendered as a non-interactive `<span>` (still labelled for AT).
51
+ *
52
+ * @param event The native click event.
53
+ * @param hiddenCount The number of children not visible in the strip.
54
+ */
55
+ onOverflowClick?: (event: MouseEvent<HTMLButtonElement>, hiddenCount: number) => void;
56
+ }
57
+
58
+ /**
59
+ * Horizontal stack of `<Avatar>`s with `+N` overflow when count exceeds `max`.
60
+ * @see docs/components/AvatarGroup.md
61
+ */
62
+ export const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(function AvatarGroup(
63
+ { children, size = 'md', max = 4, tooltip = true, onOverflowClick, className, ...props },
64
+ ref,
65
+ ) {
66
+ const t = useTranslation();
67
+ const items = Children.toArray(children).filter(isValidElement);
68
+ const visible = items.slice(0, max);
69
+ const hiddenCount = Math.max(0, items.length - max);
70
+
71
+ const ctx: AvatarGroupContextValue = useMemo(() => ({ size, tooltip }), [size, tooltip]);
72
+
73
+ const overflowClass = clsx(styles.overflow, styles[`overflowSize-${size}`]);
74
+
75
+ const overflowNode =
76
+ hiddenCount > 0 ? (
77
+ onOverflowClick ? (
78
+ <button
79
+ type="button"
80
+ className={overflowClass}
81
+ aria-label={t('avatarGroup.overflow', { count: hiddenCount })}
82
+ onClick={(e) => onOverflowClick(e, hiddenCount)}
83
+ >
84
+ +{hiddenCount}
85
+ </button>
86
+ ) : (
87
+ <span
88
+ className={overflowClass}
89
+ role="img"
90
+ aria-label={t('avatarGroup.overflow', { count: hiddenCount })}
91
+ >
92
+ +{hiddenCount}
93
+ </span>
94
+ )
95
+ ) : null;
96
+
97
+ return (
98
+ // Pattern A — props last so consumer overrides win.
99
+ <AvatarGroupContext.Provider value={ctx}>
100
+ <div
101
+ ref={ref}
102
+ role="list"
103
+ className={clsx(styles.group, styles[`groupSize-${size}`], className)}
104
+ {...props}
105
+ >
106
+ {visible.map((child, i) => (
107
+ <div key={i} role="listitem" className={styles.item}>
108
+ {child}
109
+ </div>
110
+ ))}
111
+ {overflowNode && (
112
+ <div role="listitem" className={clsx(styles.item, styles.overflowItem)}>
113
+ {overflowNode}
114
+ </div>
115
+ )}
116
+ </div>
117
+ </AvatarGroupContext.Provider>
118
+ );
119
+ });
@@ -0,0 +1,20 @@
1
+ import { createContext, useContext } from 'react';
2
+ import type { AvatarSize } from './Avatar';
3
+
4
+ export interface AvatarGroupContextValue {
5
+ /** Uniform size for every avatar in the group. */
6
+ size: Exclude<AvatarSize, 'inline'>;
7
+ /** Default tooltip behavior for child avatars. */
8
+ tooltip: boolean;
9
+ }
10
+
11
+ /**
12
+ * Internal context shared by `<AvatarGroup>` with its descendant `<Avatar>`s.
13
+ * `null` means the avatar is standalone (not inside a group).
14
+ */
15
+ export const AvatarGroupContext = createContext<AvatarGroupContextValue | null>(null);
16
+
17
+ /** Read the surrounding group context; `null` when standalone. */
18
+ export function useAvatarGroup(): AvatarGroupContextValue | null {
19
+ return useContext(AvatarGroupContext);
20
+ }
@@ -0,0 +1,6 @@
1
+ export { Avatar, avatarColorIndex } from './Avatar';
2
+ export type { AvatarProps, AvatarSize, AvatarStatus } from './Avatar';
3
+ export { AgentAvatar } from './AgentAvatar';
4
+ export type { AgentAvatarProps, AgentAvatarMember } from './AgentAvatar';
5
+ export { AvatarGroup } from './AvatarGroup';
6
+ export type { AvatarGroupProps } from './AvatarGroup';