@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,66 @@
1
+ import { forwardRef, useId, useMemo, type HTMLAttributes, type ReactNode } from 'react';
2
+ import clsx from 'clsx';
3
+ import {
4
+ AccordionItemContext,
5
+ useAccordionContext,
6
+ type AccordionItemContextValue,
7
+ } from './context';
8
+ import type { AccordionHeaderLevel } from './Accordion';
9
+ import styles from './Accordion.module.scss';
10
+
11
+ export interface AccordionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'value'> {
12
+ /** Unique value used to identify the item in the root's `value`/`onValueChange`. */
13
+ value: string;
14
+ /** When true, the trigger is non-interactive and keyboard nav skips this item. */
15
+ disabled?: boolean;
16
+ /**
17
+ * Heading level wrapping the trigger. WAI-ARIA APG requires triggers to live
18
+ * inside a heading element. Defaults to `'h3'`.
19
+ */
20
+ headerLevel?: AccordionHeaderLevel;
21
+ children: ReactNode;
22
+ }
23
+
24
+ /**
25
+ * Item wrapper providing the item context to its Trigger and Content.
26
+ * @see docs/components/Accordion.md
27
+ */
28
+ export const AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(function AccordionItem(
29
+ { value, disabled = false, headerLevel = 'h3', children, className, ...props },
30
+ ref,
31
+ ) {
32
+ const { isOpen } = useAccordionContext('Item');
33
+ const open = isOpen(value);
34
+ const reactId = useId();
35
+ const triggerId = `accordion-trigger-${reactId}`;
36
+ const contentId = `accordion-content-${reactId}`;
37
+
38
+ const ctx = useMemo<AccordionItemContextValue & { headerLevel: AccordionHeaderLevel }>(
39
+ () => ({
40
+ value,
41
+ disabled,
42
+ isOpen: open,
43
+ triggerId,
44
+ contentId,
45
+ headerLevel,
46
+ }),
47
+ [value, disabled, open, triggerId, contentId, headerLevel],
48
+ );
49
+
50
+ return (
51
+ <AccordionItemContext.Provider value={ctx}>
52
+ {/* Pattern A — {...props} after ref so consumer attrs reach the div,
53
+ but data-state/data-disabled/className are set AFTER the spread
54
+ so the component wins on those three. */}
55
+ <div
56
+ ref={ref}
57
+ {...props}
58
+ data-state={open ? 'open' : 'closed'}
59
+ data-disabled={disabled ? 'true' : undefined}
60
+ className={clsx(styles.item, className)}
61
+ >
62
+ {children}
63
+ </div>
64
+ </AccordionItemContext.Provider>
65
+ );
66
+ });
@@ -0,0 +1,121 @@
1
+ import { forwardRef, type ButtonHTMLAttributes, type KeyboardEvent, type ReactNode } from 'react';
2
+ import { ChevronDown } from 'lucide-react';
3
+ import clsx from 'clsx';
4
+ import {
5
+ useAccordionContext,
6
+ useAccordionItemContext,
7
+ type AccordionItemContextValue,
8
+ } from './context';
9
+ import type { AccordionHeaderLevel } from './Accordion';
10
+ import styles from './Accordion.module.scss';
11
+
12
+ export interface AccordionTriggerProps extends Omit<
13
+ ButtonHTMLAttributes<HTMLButtonElement>,
14
+ 'children'
15
+ > {
16
+ /**
17
+ * Override the default trigger indicator icon (rotates 180° when open).
18
+ * Pass `null` to suppress the icon entirely. Default: `<ChevronDown />`.
19
+ */
20
+ icon?: ReactNode | null;
21
+ /**
22
+ * Controls rendered at the **right of the header**, OUTSIDE the toggle button —
23
+ * so their buttons/menus are clickable without toggling the section, and the
24
+ * heading's accessible name stays just the title. Keep it to a few small
25
+ * controls (`<Button iconOnly>`, a `<DropdownMenu>` trigger, a `<Switch>`).
26
+ */
27
+ actions?: ReactNode;
28
+ children: ReactNode;
29
+ }
30
+
31
+ interface ItemContextWithHeaderLevel extends AccordionItemContextValue {
32
+ headerLevel: AccordionHeaderLevel;
33
+ }
34
+
35
+ /**
36
+ * Heading-wrapped button that toggles the parent Item.
37
+ * @see docs/components/Accordion.md
38
+ */
39
+ export const AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerProps>(
40
+ function AccordionTrigger({ icon, actions, children, className, onKeyDown, ...props }, ref) {
41
+ const { toggle } = useAccordionContext('Trigger');
42
+ const itemCtx = useAccordionItemContext('Trigger') as ItemContextWithHeaderLevel;
43
+ const { value, disabled, isOpen, triggerId, contentId, headerLevel } = itemCtx;
44
+
45
+ const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {
46
+ onKeyDown?.(e);
47
+ if (e.defaultPrevented) return;
48
+ const isNav = ['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key);
49
+ if (!isNav) return;
50
+ e.preventDefault();
51
+
52
+ const root = e.currentTarget.closest<HTMLElement>('[data-accordion]');
53
+ if (!root) return;
54
+
55
+ // Match ONLY accordion toggle buttons (the `data-accordion-trigger` marker),
56
+ // never an `aria-expanded` control a consumer put in the `actions` slot (a
57
+ // DropdownMenu/Select trigger). Then scope to THIS root by filtering to
58
+ // triggers whose nearest accordion ancestor is this root — so ArrowDown from
59
+ // an outer trigger doesn't jump into a nested Accordion inside open Content.
60
+ const triggers = Array.from(
61
+ root.querySelectorAll<HTMLButtonElement>('button[data-accordion-trigger]:not(:disabled)'),
62
+ ).filter((btn) => btn.closest('[data-accordion]') === root);
63
+ if (triggers.length === 0) return;
64
+
65
+ const current = triggers.indexOf(e.currentTarget);
66
+ let next = current;
67
+
68
+ if (e.key === 'ArrowDown') next = (current + 1) % triggers.length;
69
+ else if (e.key === 'ArrowUp') next = (current - 1 + triggers.length) % triggers.length;
70
+ else if (e.key === 'Home') next = 0;
71
+ else if (e.key === 'End') next = triggers.length - 1;
72
+
73
+ triggers[next]?.focus();
74
+ };
75
+
76
+ const renderedIcon =
77
+ icon === null
78
+ ? null
79
+ : (icon ?? <ChevronDown size={16} aria-hidden="true" className={styles.indicator} />);
80
+
81
+ // headerLevel is a string union of valid HTML heading tag names; cast to
82
+ // ElementType for JSX use.
83
+ const Heading = headerLevel as 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
84
+
85
+ return (
86
+ // Header ROW: the heading (toggle button) + an optional actions slot. Actions
87
+ // live OUTSIDE the heading/button so they're independently clickable (no
88
+ // toggle), valid HTML (no nested buttons), and don't pollute the heading's
89
+ // accessible name.
90
+ <div className={styles.header}>
91
+ <Heading className={styles.heading}>
92
+ {/* Pattern B — {...props} first so component-owned id/aria-expanded/
93
+ aria-controls/disabled/onClick/onKeyDown/className win and the ARIA
94
+ contract can't be overridden by a consumer. */}
95
+ <button
96
+ {...props}
97
+ ref={ref}
98
+ type="button"
99
+ id={triggerId}
100
+ // Stable marker so keyboard arrow-nav targets ONLY accordion toggles,
101
+ // never an aria-expanded control in the `actions` slot.
102
+ data-accordion-trigger=""
103
+ aria-expanded={isOpen}
104
+ aria-controls={contentId}
105
+ disabled={disabled}
106
+ onClick={() => toggle(value)}
107
+ onKeyDown={handleKeyDown}
108
+ className={clsx(styles.trigger, className)}
109
+ >
110
+ <span className={styles.label}>{children}</span>
111
+ {/* Icon wrapped in a slot so its side is controlled purely by CSS
112
+ (root data-indicator-side flips its `order`) — works for a custom
113
+ `icon` too, not just the default chevron. */}
114
+ {renderedIcon !== null && <span className={styles.indicatorSlot}>{renderedIcon}</span>}
115
+ </button>
116
+ </Heading>
117
+ {actions != null && <div className={styles.actions}>{actions}</div>}
118
+ </div>
119
+ );
120
+ },
121
+ );
@@ -0,0 +1,47 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export interface AccordionContextValue {
4
+ /** Selection mode. */
5
+ mode: 'single' | 'multiple';
6
+ /** Whether the given item value is currently open. */
7
+ isOpen: (value: string) => boolean;
8
+ /** Toggle the given item value. Closes others in single mode; flips membership in multiple mode. */
9
+ toggle: (value: string) => void;
10
+ }
11
+
12
+ export const AccordionContext = createContext<AccordionContextValue | null>(null);
13
+
14
+ /**
15
+ * Hook for child components to read the root context. Throws if used outside
16
+ * an `<Accordion>` — surfaces the bug early instead of silently no-op'ing.
17
+ */
18
+ export function useAccordionContext(componentName: string): AccordionContextValue {
19
+ const ctx = useContext(AccordionContext);
20
+ if (ctx === null) {
21
+ throw new Error(`<Accordion.${componentName}> must be used inside <Accordion>`);
22
+ }
23
+ return ctx;
24
+ }
25
+
26
+ export interface AccordionItemContextValue {
27
+ /** This item's unique value. */
28
+ value: string;
29
+ /** Whether the item is disabled (Trigger non-interactive, keyboard nav skips). */
30
+ disabled: boolean;
31
+ /** Whether the item is currently open (mirrored from root context for convenience). */
32
+ isOpen: boolean;
33
+ /** Stable id for the Trigger (so Content's aria-labelledby points at it). */
34
+ triggerId: string;
35
+ /** Stable id for the Content (so Trigger's aria-controls points at it). */
36
+ contentId: string;
37
+ }
38
+
39
+ export const AccordionItemContext = createContext<AccordionItemContextValue | null>(null);
40
+
41
+ export function useAccordionItemContext(componentName: string): AccordionItemContextValue {
42
+ const ctx = useContext(AccordionItemContext);
43
+ if (ctx === null) {
44
+ throw new Error(`<Accordion.${componentName}> must be used inside <Accordion.Item>`);
45
+ }
46
+ return ctx;
47
+ }
@@ -0,0 +1,14 @@
1
+ export { Accordion } from './Accordion';
2
+ export type {
3
+ AccordionProps,
4
+ AccordionMode,
5
+ AccordionHeaderLevel,
6
+ AccordionVariant,
7
+ AccordionSize,
8
+ AccordionGap,
9
+ AccordionIndicatorSide,
10
+ AccordionActionsWhenClosed,
11
+ } from './Accordion';
12
+ export type { AccordionItemProps } from './AccordionItem';
13
+ export type { AccordionTriggerProps } from './AccordionTrigger';
14
+ export type { AccordionContentProps } from './AccordionContent';
@@ -0,0 +1,92 @@
1
+ @use '../../styles/mixins' as *;
2
+ @use './Alert.tokens';
3
+
4
+ .alert {
5
+ display: grid;
6
+ grid-template-columns: auto 1fr auto;
7
+ gap: var(--alert-gap);
8
+ align-items: start;
9
+ padding: var(--alert-padding-y) var(--alert-padding-x);
10
+ background: var(--alert-bg);
11
+ border-radius: var(--alert-radius);
12
+ border-left: var(--alert-border-width) solid var(--alert-border-color);
13
+ color: var(--alert-fg);
14
+ }
15
+
16
+ .alert[data-tone='info'] {
17
+ background: var(--alert-bg-info);
18
+ border-left-color: var(--alert-border-color-info);
19
+ }
20
+
21
+ .alert[data-tone='success'] {
22
+ background: var(--alert-bg-success);
23
+ border-left-color: var(--alert-border-color-success);
24
+ }
25
+
26
+ .alert[data-tone='warning'] {
27
+ background: var(--alert-bg-warning);
28
+ border-left-color: var(--alert-border-color-warning);
29
+ }
30
+
31
+ .alert[data-tone='error'] {
32
+ background: var(--alert-bg-danger);
33
+ border-left-color: var(--alert-border-color-danger);
34
+ }
35
+
36
+ .icon {
37
+ display: grid;
38
+ place-items: center;
39
+
40
+ // Match the first text line's box so the icon sits centered with the title
41
+ // line (the alert grid is align-items:start, which would otherwise top-align
42
+ // the 16px icon ~2px above the line's optical center).
43
+ min-height: var(--alert-icon-row-height);
44
+ color: var(--alert-icon);
45
+ }
46
+
47
+ .alert[data-tone='info'] .icon {
48
+ color: var(--alert-icon-info);
49
+ }
50
+
51
+ .alert[data-tone='success'] .icon {
52
+ color: var(--alert-icon-success);
53
+ }
54
+
55
+ .alert[data-tone='warning'] .icon {
56
+ color: var(--alert-icon-warning);
57
+ }
58
+
59
+ .alert[data-tone='error'] .icon {
60
+ color: var(--alert-icon-danger);
61
+ }
62
+
63
+ .body {
64
+ min-width: 0;
65
+ }
66
+
67
+ .title {
68
+ display: block;
69
+ font-size: var(--alert-title-font-size);
70
+ font-weight: var(--alert-title-font-weight);
71
+
72
+ // Keep this 1.4 in sync with --alert-icon-row-height (the icon centers to this
73
+ // line box).
74
+ line-height: 1.4;
75
+ color: var(--alert-title-fg);
76
+ }
77
+
78
+ .description {
79
+ font-size: var(--alert-description-font-size);
80
+ color: var(--alert-description-fg);
81
+ line-height: 1.5;
82
+ }
83
+
84
+ .title + .description {
85
+ // stylelint-disable-next-line property-disallowed-list -- internal spacing between alert title and its description child
86
+ margin-top: var(--alert-title-description-gap);
87
+ }
88
+
89
+ .actions {
90
+ // stylelint-disable-next-line property-disallowed-list -- internal spacing between alert body content and its action row
91
+ margin-top: var(--alert-actions-gap);
92
+ }
@@ -0,0 +1,60 @@
1
+ // Alert.tokens.scss — Component-scoped tokens for <Alert>. Per-tone bg/fg/icon/border-color pairs for info/success/warning/danger, plus shared shape and typography defaults. Each token defaults to the primitive the SCSS used before this migration.
2
+ :root {
3
+ // Shared shape + typography
4
+ --alert-bg: var(--color-bg);
5
+ --alert-fg: var(--color-fg);
6
+ --alert-border-color: var(--color-fg-muted);
7
+ --alert-border-width: var(--border-width-strong);
8
+ --alert-radius: var(--radius-md);
9
+ --alert-padding-y: var(--space-3);
10
+ --alert-padding-x: var(--space-4);
11
+ --alert-gap: var(--space-3);
12
+ --alert-icon: var(--color-fg-muted);
13
+
14
+ // Title
15
+ --alert-title-fg: var(--color-fg);
16
+ --alert-title-font-size: var(--font-size-md);
17
+ --alert-title-font-weight: var(--font-weight-medium);
18
+
19
+ // Icon box height = the title's line box (font-size × 1.4 line-height), so the
20
+ // icon centers with the first text line instead of top-aligning above it.
21
+ --alert-icon-row-height: calc(var(--alert-title-font-size) * 1.4);
22
+
23
+ // Description
24
+ --alert-description-fg: var(--color-fg-muted);
25
+ --alert-description-font-size: var(--font-size-sm);
26
+
27
+ // Internal spacing (title-to-description, body-to-actions)
28
+ --alert-title-description-gap: var(--space-1);
29
+ --alert-actions-gap: var(--space-2);
30
+
31
+ // Per-tone surfaces (background + border + icon)
32
+ --alert-bg-info: var(--color-info-bg-subtle);
33
+ --alert-fg-info: var(--color-fg);
34
+ --alert-icon-info: var(--color-info);
35
+ --alert-border-color-info: var(--color-info);
36
+
37
+ --alert-bg-success: var(--color-success-bg-subtle);
38
+ --alert-fg-success: var(--color-fg);
39
+ --alert-icon-success: var(--color-success);
40
+ --alert-border-color-success: var(--color-success);
41
+
42
+ --alert-bg-warning: var(--color-warning-bg-subtle);
43
+ --alert-fg-warning: var(--color-fg);
44
+
45
+ // warning uses --color-warning-strong, not --color-warning, which measures
46
+ // @contrast --color-warning on --color-bg = 2.14:1 light
47
+ // @contrast --color-warning-strong on --color-bg = 5.95:1 light
48
+ // @contrast --color-warning on --color-warning-bg-subtle = 2.01:1 light
49
+ // @contrast --color-warning-strong on --color-warning-bg-subtle = 5.61:1 light
50
+ // 2.01:1 on the light tint (and 2.14:1 as an icon or border on --color-bg), below WCAG AA
51
+ // for text and below 1.4.11's 3:1 for a graphical object. The strong variant
52
+ // clears both. Dark is unaffected — the two resolve to the same value there.
53
+ --alert-icon-warning: var(--color-warning-strong);
54
+ --alert-border-color-warning: var(--color-warning-strong);
55
+
56
+ --alert-bg-danger: var(--color-danger-bg-subtle);
57
+ --alert-fg-danger: var(--color-fg);
58
+ --alert-icon-danger: var(--color-danger);
59
+ --alert-border-color-danger: var(--color-danger);
60
+ }
@@ -0,0 +1,136 @@
1
+ import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
2
+ import { AlertTriangle, CheckCircle2, Info, X, XCircle } from 'lucide-react';
3
+ import clsx from 'clsx';
4
+ import { Button } from '../Button';
5
+ import { useTranslation } from '../../i18n/useTranslation';
6
+ import styles from './Alert.module.scss';
7
+
8
+ /**
9
+ * Tone — drives icon, accent stripe color, tinted background, and ARIA role.
10
+ *
11
+ * - `'info'` — blue accent. Neutral updates ("Synced 5 minutes ago").
12
+ * - `'success'` — green accent. Confirmations ("Changes saved").
13
+ * - `'warning'` — dark amber accent. Non-blocking heads-up ("Storage at 85%").
14
+ * - `'error'` — red accent. Failures. ALSO sets `role="alert"` (assertive); the
15
+ * other tones use `role="status"` (polite). With `live={false}` every tone
16
+ * is a static `role="note"` instead.
17
+ */
18
+ export type AlertTone = 'info' | 'success' | 'warning' | 'error';
19
+
20
+ export interface AlertProps extends Omit<HTMLAttributes<HTMLElement>, 'role' | 'title'> {
21
+ /** Tone. Defaults to `'info'`. See `AlertTone` for full descriptions. */
22
+ tone?: AlertTone;
23
+
24
+ /**
25
+ * Optional bold heading. Renders above the description. ReactNode so you
26
+ * can embed inline emphasis (`<>Update <strong>1.2.3</strong> available</>`).
27
+ *
28
+ * The native HTML `title` attribute (tooltip-on-hover) is collapsed by this
29
+ * prop. Use `aria-label` if you need that.
30
+ */
31
+ title?: ReactNode;
32
+
33
+ /** Description body. Rendered below the title in muted color. */
34
+ children?: ReactNode;
35
+
36
+ /**
37
+ * Override the tone's default icon. Pass any ReactNode (typically a
38
+ * lucide-react icon). Pass `null` to hide the icon entirely.
39
+ *
40
+ * Defaults: `info` → `Info`, `success` → `CheckCircle2`,
41
+ * `warning` → `AlertTriangle`, `error` → `XCircle`.
42
+ */
43
+ icon?: ReactNode | null;
44
+
45
+ /**
46
+ * Optional action row rendered below the description. Typically a single
47
+ * Button or a Cluster of two ("Retry", "Dismiss"). The component doesn't
48
+ * manage the action row's layout — pass a pre-laid-out node.
49
+ */
50
+ actions?: ReactNode;
51
+
52
+ /**
53
+ * Whether the Alert is a live region. Defaults to `true`: `role="status"`
54
+ * (polite), or `role="alert"` (assertive) for `tone="error"` — right for a
55
+ * message that APPEARS in response to something (a save failed, an update
56
+ * arrived).
57
+ *
58
+ * Pass `false` for a callout that is simply part of the page when it opens —
59
+ * a "Needs action" note in each card of a list, a standing warning in a
60
+ * form. It renders `role="note"` with the same visuals and no live
61
+ * semantics, so screen readers read it in place instead of announcing it.
62
+ * N live Alerts mounting together can queue N announcements (#547).
63
+ *
64
+ * The tone is shown by the icon's shape and the colour only; it is not
65
+ * exposed to assistive tech in either mode (the icon is decorative). With
66
+ * `live={false}`, `tone="error"` also loses the "alert" role that browse-mode
67
+ * readers speak. So put the urgency in `title` ("Needs action").
68
+ *
69
+ * Decide it at mount: flipping `false` → `true` on a mounted Alert turns
70
+ * content that is already there into a live region, which announces nothing.
71
+ * @default true
72
+ */
73
+ live?: boolean;
74
+
75
+ /**
76
+ * Called when the user clicks the close (×) button. When set, the close
77
+ * button renders; when omitted, no close button. Alert is **controlled** —
78
+ * the component does NOT manage internal hidden state. Hide via
79
+ * conditional render in the consumer:
80
+ *
81
+ * ```tsx
82
+ * const [show, setShow] = useState(true);
83
+ * {show && <Alert tone="success" onDismiss={() => setShow(false)}>Saved</Alert>}
84
+ * ```
85
+ */
86
+ onDismiss?: () => void;
87
+ }
88
+
89
+ const DEFAULT_ICONS: Record<AlertTone, ReactNode> = {
90
+ info: <Info size={16} aria-hidden="true" />,
91
+ success: <CheckCircle2 size={16} aria-hidden="true" />,
92
+ warning: <AlertTriangle size={16} aria-hidden="true" />,
93
+ error: <XCircle size={16} aria-hidden="true" />,
94
+ };
95
+
96
+ /**
97
+ * Persistent in-flow notification.
98
+ * @see docs/components/Alert.md
99
+ */
100
+ export const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(
101
+ { tone = 'info', title, children, icon, actions, live = true, onDismiss, className, ...props },
102
+ ref,
103
+ ) {
104
+ const t = useTranslation();
105
+ const role = !live ? 'note' : tone === 'error' ? 'alert' : 'status';
106
+ const renderedIcon = icon === null ? null : (icon ?? DEFAULT_ICONS[tone]);
107
+
108
+ return (
109
+ <div
110
+ ref={ref}
111
+ {...props}
112
+ // {...props} first so role / data-tone (the ARIA contract) win.
113
+ role={role}
114
+ data-tone={tone}
115
+ className={clsx(styles.alert, className)}
116
+ >
117
+ {renderedIcon && <div className={styles.icon}>{renderedIcon}</div>}
118
+ <div className={styles.body}>
119
+ {title && <strong className={styles.title}>{title}</strong>}
120
+ {children && <div className={styles.description}>{children}</div>}
121
+ {actions && <div className={styles.actions}>{actions}</div>}
122
+ </div>
123
+ {onDismiss && (
124
+ <Button
125
+ variant="ghost"
126
+ size="xs"
127
+ iconOnly
128
+ aria-label={t('alert.dismiss')}
129
+ onClick={onDismiss}
130
+ >
131
+ <X size={14} aria-hidden="true" />
132
+ </Button>
133
+ )}
134
+ </div>
135
+ );
136
+ });
@@ -0,0 +1,2 @@
1
+ export { Alert } from './Alert';
2
+ export type { AlertProps, AlertTone } from './Alert';
@@ -0,0 +1,130 @@
1
+ // AppLayout is a layout-owning primitive — the documented exception to the
2
+ // "no layout properties on components" rule (like Page / Screen / Rail). Owning
3
+ // the viewport-filling shell is its whole job. The topBar / sidebar slots bring
4
+ // their own surfaces; the main region's only own-styling is its content gutter
5
+ // (--app-layout-content-padding) + subtle canvas (--app-layout-content-background)
6
+ // — the canonical shell look, so a DS-only consumer needs no raw CSS. Matches the
7
+ // CRM shell topology
8
+ // (see the playground AppShell): a full-height sidebar down the left, the top bar
9
+ // over the content column, and the main content below it. (stylelint's
10
+ // property-disallowed-list blocks flex-grow / flex-basis but not the `flex`
11
+ // shorthand, min-height, or min-width, so no disable is needed here.)
12
+ @use './AppLayout.tokens';
13
+
14
+ // Column: optional full-window banner above the [sidebar | column] row.
15
+ .root {
16
+ display: flex;
17
+ flex-direction: column;
18
+ min-height: 100vh;
19
+
20
+ // Own stacking context so a nested AppLayout's --z-app-chrome topBar can't
21
+ // tie with (and win tree-order over) an ancestor AppLayout's topBar —
22
+ // nesting is sanctioned (demos mount several inside the app's own shell;
23
+ // see the component JSDoc). `isolation` creates a stacking context WITHOUT
24
+ // creating a containing block, so it doesn't affect portaled overlays
25
+ // (Modal/Drawer/Popover — those escape to document.body regardless) or any
26
+ // in-content `position: fixed` element.
27
+ isolation: isolate;
28
+ }
29
+
30
+ .banner,
31
+ .contextBanner {
32
+ flex: none;
33
+ }
34
+
35
+ // The original shell row. flex: 1 fills the root's min-height (and a
36
+ // consumer's fixed `height: 100vh` override); min-height: 0 lets that
37
+ // fixed-height mode shrink the row so Rail / main manage their own overflow.
38
+ .row {
39
+ display: flex;
40
+ flex: 1;
41
+ flex-direction: row;
42
+
43
+ // Explicit (it's the default) — the full-height sidebar depends on the row
44
+ // stretching its items to the row's height; don't change this to center/start.
45
+ align-items: stretch;
46
+ min-height: 0;
47
+ }
48
+
49
+ // Full-height sidebar down the left (stretches to the row height). Sets its own
50
+ // width.
51
+ .sidebar {
52
+ flex: none;
53
+ }
54
+
55
+ // Viewport-pinned sidebar (sidebarPinned): the sidebar spans exactly the
56
+ // screen, not the row/page. sticky (not fixed) so it keeps its flex-row slot
57
+ // and width; a DEFINITE 100dvh height gives a Rail's `height: 100%` something
58
+ // to resolve against, which is what lets its footer pin to the viewport
59
+ // bottom (the Rail's own scroll body does the pinning, not a spacer).
60
+ // dvh tracks mobile dynamic toolbars;
61
+ // the vh line is the older-engine fallback. overflow-y: auto scrolls an
62
+ // over-tall rail inside the pinned box instead of growing the page.
63
+ .sidebarPinned {
64
+ position: sticky;
65
+ top: 0;
66
+ height: 100vh;
67
+ height: 100dvh;
68
+ overflow-y: auto;
69
+ }
70
+
71
+ // The top bar + content column to the right of the sidebar. min-width:0 lets the
72
+ // column (and wide content like tables) shrink instead of pushing the sidebar.
73
+ .body {
74
+ display: flex;
75
+ flex: 1;
76
+ flex-direction: column;
77
+ min-width: 0;
78
+ }
79
+
80
+ // Top bar over the content column; natural height. Also sticky (redundant
81
+ // with the <TopBar> primitive's own `position: sticky; top: 0`, which alone
82
+ // isn't enough): a sticky element's range is capped by its containing
83
+ // block's box, and this wrapper's containing block is itself — sized to the
84
+ // bar's own content height by `flex: none`. Without its own sticky here, the
85
+ // wrapper (and the bar riding inside it) unsticks and scrolls away the
86
+ // instant the page scrolls past the bar's own height. Stickying the wrapper
87
+ // against `.body` (which spans the full scrollable column) gives it room to
88
+ // stay pinned for the page's whole height. z-index keeps it painting over
89
+ // scrolled-under content — `--z-app-chrome` sits above unpositioned page
90
+ // content but below every overlay tier (dropdown/popover/modal/toast/
91
+ // tooltip), so it never fights a real overlay for stacking order.
92
+ .topBar {
93
+ flex: none;
94
+ position: sticky;
95
+ top: 0;
96
+ z-index: var(--z-app-chrome);
97
+ }
98
+
99
+ // Main content fills the rest of the column. Carries the canonical shell content
100
+ // gutter by default (--app-layout-content-padding = --space-6) so a DS-only
101
+ // consumer gets padded routed content with no prop and no raw CSS; override the
102
+ // token to `0` for a full-bleed main region.
103
+ .main {
104
+ flex: 1;
105
+ min-width: 0;
106
+ padding: var(--app-layout-content-padding);
107
+
108
+ // Subtle content canvas so page Cards lift off it (default
109
+ // --color-bg-subtle; override the token to `transparent` for a flat area).
110
+ background: var(--app-layout-content-background);
111
+ }
112
+
113
+ // Overlay sidebar (sidebarOverlayBelow): the Drawer panel is 320px
114
+ // (--size-drawer-sm, the sanctioned nav-drawer width) but a <Rail> inside sets
115
+ // its own 240px width and would leave a dead strip. Rebinding the rail's own
116
+ // width token — its documented override surface — makes the rail fill the
117
+ // panel instead. Scoped to this class so it can't leak to an in-flow rail.
118
+ .overlaySidebar {
119
+ --rail-width-expanded: 100%;
120
+ --rail-width-collapsed: 100%;
121
+ }
122
+
123
+ // The Drawer header consumes part of the fixed-height panel. Give the sidebar
124
+ // the remaining block space and allow it to shrink below its automatic
125
+ // min-content size, so a 100%-height Rail keeps its footer inside the panel on
126
+ // short touch viewports.
127
+ .overlaySidebarContent {
128
+ flex: 1 1 auto;
129
+ min-height: 0;
130
+ }