@eocrm/design-system 0.0.0-stage → 0.6.17

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 (897) hide show
  1. package/AI-PRIMER.md +341 -0
  2. package/README.md +262 -2
  3. package/docs/components/Accordion.md +114 -0
  4. package/docs/components/AgentAvatar.md +58 -0
  5. package/docs/components/Alert.md +81 -0
  6. package/docs/components/AppLayout.md +70 -0
  7. package/docs/components/Avatar.md +49 -0
  8. package/docs/components/AvatarGroup.md +47 -0
  9. package/docs/components/Badge.md +60 -0
  10. package/docs/components/Banner.md +89 -0
  11. package/docs/components/BrandIcon.md +32 -0
  12. package/docs/components/Breadcrumb.md +72 -0
  13. package/docs/components/Button.md +107 -0
  14. package/docs/components/ButtonGroup.md +78 -0
  15. package/docs/components/Calendar.md +158 -0
  16. package/docs/components/Card.md +165 -0
  17. package/docs/components/CatalogPicker.md +83 -0
  18. package/docs/components/Chart.md +114 -0
  19. package/docs/components/ChatBubble.md +55 -0
  20. package/docs/components/ChatLauncher.md +97 -0
  21. package/docs/components/Checkbox.md +55 -0
  22. package/docs/components/CircularProgress.md +53 -0
  23. package/docs/components/Cluster.md +96 -0
  24. package/docs/components/Code.md +35 -0
  25. package/docs/components/CodeBlock.md +67 -0
  26. package/docs/components/ColorPicker.md +115 -0
  27. package/docs/components/ConfirmationPopover.md +70 -0
  28. package/docs/components/Constrain.md +39 -0
  29. package/docs/components/CurrencySelect.md +57 -0
  30. package/docs/components/CursorPagination.md +43 -0
  31. package/docs/components/DashboardCanvas.md +79 -0
  32. package/docs/components/DashboardWidget.md +131 -0
  33. package/docs/components/DataTable.md +88 -0
  34. package/docs/components/DatePicker.md +68 -0
  35. package/docs/components/DateRangePicker.md +71 -0
  36. package/docs/components/DateStrip.md +56 -0
  37. package/docs/components/DefinitionList.md +82 -0
  38. package/docs/components/Divider.md +57 -0
  39. package/docs/components/Dot.md +26 -0
  40. package/docs/components/Drawer.md +94 -0
  41. package/docs/components/DropdownMenu.md +299 -0
  42. package/docs/components/EmojiPicker.md +84 -0
  43. package/docs/components/EmptyState.md +55 -0
  44. package/docs/components/EntityChip.md +102 -0
  45. package/docs/components/ErrorState.md +72 -0
  46. package/docs/components/Field.md +91 -0
  47. package/docs/components/FileUpload.md +109 -0
  48. package/docs/components/FilterChip.md +88 -0
  49. package/docs/components/FlowCanvas.md +108 -0
  50. package/docs/components/FormRow.md +31 -0
  51. package/docs/components/FormSection.md +37 -0
  52. package/docs/components/Grid.md +103 -0
  53. package/docs/components/Highlight.md +75 -0
  54. package/docs/components/HighlightedText.md +50 -0
  55. package/docs/components/IconPicker.md +134 -0
  56. package/docs/components/IconTile.md +30 -0
  57. package/docs/components/Image.md +84 -0
  58. package/docs/components/ImageCrop.md +163 -0
  59. package/docs/components/Indent.md +31 -0
  60. package/docs/components/InlineDatePicker.md +58 -0
  61. package/docs/components/InlineDateRangePicker.md +57 -0
  62. package/docs/components/Input.md +54 -0
  63. package/docs/components/Kanban.md +122 -0
  64. package/docs/components/Kbd.md +41 -0
  65. package/docs/components/Lightbox.md +105 -0
  66. package/docs/components/Link.md +65 -0
  67. package/docs/components/LinkCard.md +41 -0
  68. package/docs/components/LiquidEditor.md +84 -0
  69. package/docs/components/List.md +68 -0
  70. package/docs/components/LiveRegion.md +29 -0
  71. package/docs/components/LocaleProvider.md +25 -0
  72. package/docs/components/Logo.md +41 -0
  73. package/docs/components/Masonry.md +48 -0
  74. package/docs/components/MediaTile.md +95 -0
  75. package/docs/components/Modal.md +107 -0
  76. package/docs/components/MoneyInput.md +62 -0
  77. package/docs/components/OptionsPicker.md +123 -0
  78. package/docs/components/OtpInput.md +65 -0
  79. package/docs/components/Page.md +35 -0
  80. package/docs/components/PageHeader.md +133 -0
  81. package/docs/components/Pagination.md +44 -0
  82. package/docs/components/Palette.md +32 -0
  83. package/docs/components/PasswordInput.md +45 -0
  84. package/docs/components/PasswordStrengthMeter.md +27 -0
  85. package/docs/components/PersonDisplay.md +153 -0
  86. package/docs/components/PhoneInput.md +54 -0
  87. package/docs/components/PillMenu.md +91 -0
  88. package/docs/components/Popover.md +127 -0
  89. package/docs/components/Progress.md +56 -0
  90. package/docs/components/QrCode.md +34 -0
  91. package/docs/components/Radio.md +37 -0
  92. package/docs/components/RadioGroup.md +56 -0
  93. package/docs/components/Rail.md +191 -0
  94. package/docs/components/RelativeDateInput.md +114 -0
  95. package/docs/components/RichText.md +44 -0
  96. package/docs/components/RichTextEditor.md +112 -0
  97. package/docs/components/Screen.md +37 -0
  98. package/docs/components/ScrollArea.md +39 -0
  99. package/docs/components/Select.md +131 -0
  100. package/docs/components/SettingRow.md +98 -0
  101. package/docs/components/Skeleton.md +68 -0
  102. package/docs/components/Slider.md +92 -0
  103. package/docs/components/SlotGrid.md +55 -0
  104. package/docs/components/SocialButton.md +31 -0
  105. package/docs/components/Sortable.md +127 -0
  106. package/docs/components/SortableGroup.md +52 -0
  107. package/docs/components/Sparkline.md +51 -0
  108. package/docs/components/Split.md +76 -0
  109. package/docs/components/Stack.md +59 -0
  110. package/docs/components/StagePath.md +66 -0
  111. package/docs/components/StatGroup.md +61 -0
  112. package/docs/components/StatTile.md +58 -0
  113. package/docs/components/Sticky.md +69 -0
  114. package/docs/components/Switch.md +89 -0
  115. package/docs/components/Table.md +184 -0
  116. package/docs/components/TableOfContents.md +76 -0
  117. package/docs/components/Tabs.md +94 -0
  118. package/docs/components/Text.md +63 -0
  119. package/docs/components/Textarea.md +59 -0
  120. package/docs/components/Thread.md +52 -0
  121. package/docs/components/TimeField.md +70 -0
  122. package/docs/components/Timeline.md +57 -0
  123. package/docs/components/Title.md +54 -0
  124. package/docs/components/ToastViewport.md +61 -0
  125. package/docs/components/Tooltip.md +63 -0
  126. package/docs/components/TopBar.md +214 -0
  127. package/docs/components/Tour.md +85 -0
  128. package/docs/components/TreeView.md +113 -0
  129. package/docs/components/VisuallyHidden.md +43 -0
  130. package/docs/components/WidgetPreview.md +54 -0
  131. package/docs/components/useBelowBreakpoint.md +11 -0
  132. package/docs/components/useMonth.md +18 -0
  133. package/docs/setup.md +51 -0
  134. package/docs/theming.md +95 -0
  135. package/docs/tokens.md +123 -0
  136. package/docs/transient-state.md +56 -0
  137. package/package.json +82 -4
  138. package/src/_meta/manifest.ts +293 -0
  139. package/src/app/AppProvider.tsx +78 -0
  140. package/src/app/index.ts +3 -0
  141. package/src/app/themeTokens.ts +95 -0
  142. package/src/calendar/dateMath.ts +114 -0
  143. package/src/calendar/formatters.ts +75 -0
  144. package/src/calendar/index.ts +39 -0
  145. package/src/calendar/types.ts +36 -0
  146. package/src/calendar/useAgenda.ts +70 -0
  147. package/src/calendar/useDay.ts +51 -0
  148. package/src/calendar/useMonth.ts +82 -0
  149. package/src/calendar/useWeek.ts +62 -0
  150. package/src/calendar/weekInfo.ts +83 -0
  151. package/src/components/Accordion/Accordion.module.scss +304 -0
  152. package/src/components/Accordion/Accordion.tokens.scss +64 -0
  153. package/src/components/Accordion/Accordion.tsx +272 -0
  154. package/src/components/Accordion/AccordionContent.tsx +36 -0
  155. package/src/components/Accordion/AccordionItem.tsx +66 -0
  156. package/src/components/Accordion/AccordionTrigger.tsx +121 -0
  157. package/src/components/Accordion/context.ts +47 -0
  158. package/src/components/Accordion/index.ts +14 -0
  159. package/src/components/Alert/Alert.module.scss +92 -0
  160. package/src/components/Alert/Alert.tokens.scss +60 -0
  161. package/src/components/Alert/Alert.tsx +136 -0
  162. package/src/components/Alert/index.ts +2 -0
  163. package/src/components/AppLayout/AppLayout.module.scss +130 -0
  164. package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
  165. package/src/components/AppLayout/AppLayout.tsx +211 -0
  166. package/src/components/AppLayout/index.ts +2 -0
  167. package/src/components/Avatar/AgentAvatar.module.scss +117 -0
  168. package/src/components/Avatar/AgentAvatar.tsx +122 -0
  169. package/src/components/Avatar/Avatar.module.scss +181 -0
  170. package/src/components/Avatar/Avatar.tokens.scss +107 -0
  171. package/src/components/Avatar/Avatar.tsx +210 -0
  172. package/src/components/Avatar/AvatarGroup.module.scss +128 -0
  173. package/src/components/Avatar/AvatarGroup.tsx +119 -0
  174. package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
  175. package/src/components/Avatar/index.ts +6 -0
  176. package/src/components/Badge/Badge.module.scss +124 -0
  177. package/src/components/Badge/Badge.tokens.scss +74 -0
  178. package/src/components/Badge/Badge.tsx +164 -0
  179. package/src/components/Badge/index.ts +2 -0
  180. package/src/components/Banner/Banner.module.scss +73 -0
  181. package/src/components/Banner/Banner.tokens.scss +51 -0
  182. package/src/components/Banner/Banner.tsx +138 -0
  183. package/src/components/Banner/index.ts +2 -0
  184. package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
  185. package/src/components/BrandIcon/BrandIcon.tsx +99 -0
  186. package/src/components/BrandIcon/index.ts +2 -0
  187. package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
  188. package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
  189. package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
  190. package/src/components/Breadcrumb/index.ts +2 -0
  191. package/src/components/Button/Button.module.scss +167 -0
  192. package/src/components/Button/Button.tokens.scss +90 -0
  193. package/src/components/Button/Button.tsx +205 -0
  194. package/src/components/Button/index.ts +2 -0
  195. package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
  196. package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
  197. package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
  198. package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
  199. package/src/components/ButtonGroup/context.ts +45 -0
  200. package/src/components/ButtonGroup/index.ts +2 -0
  201. package/src/components/Calendar/AgendaView.module.scss +231 -0
  202. package/src/components/Calendar/AgendaView.tsx +214 -0
  203. package/src/components/Calendar/AllDayBand.module.scss +18 -0
  204. package/src/components/Calendar/AllDayBand.tsx +75 -0
  205. package/src/components/Calendar/Calendar.module.scss +23 -0
  206. package/src/components/Calendar/Calendar.tokens.scss +262 -0
  207. package/src/components/Calendar/Calendar.tsx +370 -0
  208. package/src/components/Calendar/DayCell.module.scss +30 -0
  209. package/src/components/Calendar/DayCell.tsx +50 -0
  210. package/src/components/Calendar/DayView.module.scss +10 -0
  211. package/src/components/Calendar/DayView.tsx +163 -0
  212. package/src/components/Calendar/EventChip.module.scss +171 -0
  213. package/src/components/Calendar/EventChip.tsx +115 -0
  214. package/src/components/Calendar/HourGrid.module.scss +123 -0
  215. package/src/components/Calendar/HourGrid.tsx +381 -0
  216. package/src/components/Calendar/MonthView.module.scss +99 -0
  217. package/src/components/Calendar/MonthView.tsx +296 -0
  218. package/src/components/Calendar/TimedEvent.module.scss +205 -0
  219. package/src/components/Calendar/TimedEvent.tsx +247 -0
  220. package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
  221. package/src/components/Calendar/ViewSwitcher.tsx +47 -0
  222. package/src/components/Calendar/WeekView.module.scss +10 -0
  223. package/src/components/Calendar/WeekView.tsx +137 -0
  224. package/src/components/Calendar/eventColor.ts +60 -0
  225. package/src/components/Calendar/index.ts +18 -0
  226. package/src/components/Calendar/types.ts +451 -0
  227. package/src/components/Calendar/useEventDrag.ts +783 -0
  228. package/src/components/Calendar/utils.ts +622 -0
  229. package/src/components/Card/Card.module.scss +264 -0
  230. package/src/components/Card/Card.tokens.scss +55 -0
  231. package/src/components/Card/Card.tsx +170 -0
  232. package/src/components/Card/CardBody.tsx +45 -0
  233. package/src/components/Card/CardHeader.tsx +113 -0
  234. package/src/components/Card/CardList.tsx +24 -0
  235. package/src/components/Card/CardListRow.tsx +24 -0
  236. package/src/components/Card/index.ts +7 -0
  237. package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
  238. package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
  239. package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
  240. package/src/components/CatalogPicker/index.ts +2 -0
  241. package/src/components/Chart/Chart.module.scss +287 -0
  242. package/src/components/Chart/Chart.tokens.scss +63 -0
  243. package/src/components/Chart/Chart.tsx +607 -0
  244. package/src/components/Chart/ChartLegend.tsx +99 -0
  245. package/src/components/Chart/ChartTable.tsx +62 -0
  246. package/src/components/Chart/ChartTooltip.tsx +91 -0
  247. package/src/components/Chart/chartModel.ts +689 -0
  248. package/src/components/Chart/index.ts +2 -0
  249. package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
  250. package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
  251. package/src/components/ChatBubble/ChatBubble.tsx +61 -0
  252. package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
  253. package/src/components/ChatBubble/index.ts +3 -0
  254. package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
  255. package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
  256. package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
  257. package/src/components/ChatLauncher/index.ts +2 -0
  258. package/src/components/ChatLauncher/isAtBottom.ts +12 -0
  259. package/src/components/Checkbox/Checkbox.module.scss +147 -0
  260. package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
  261. package/src/components/Checkbox/Checkbox.tsx +188 -0
  262. package/src/components/Checkbox/index.ts +2 -0
  263. package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
  264. package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
  265. package/src/components/CircularProgress/CircularProgress.tsx +139 -0
  266. package/src/components/CircularProgress/index.ts +7 -0
  267. package/src/components/Cluster/Cluster.module.scss +145 -0
  268. package/src/components/Cluster/Cluster.tokens.scss +11 -0
  269. package/src/components/Cluster/Cluster.tsx +215 -0
  270. package/src/components/Cluster/index.ts +2 -0
  271. package/src/components/Code/Code.module.scss +28 -0
  272. package/src/components/Code/Code.tokens.scss +15 -0
  273. package/src/components/Code/Code.tsx +44 -0
  274. package/src/components/Code/index.ts +2 -0
  275. package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
  276. package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
  277. package/src/components/CodeBlock/CodeBlock.tsx +274 -0
  278. package/src/components/CodeBlock/highlight.ts +179 -0
  279. package/src/components/CodeBlock/index.ts +8 -0
  280. package/src/components/CodeBlock/sampleSync.ts +42 -0
  281. package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
  282. package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
  283. package/src/components/ColorPicker/ColorPicker.tsx +367 -0
  284. package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
  285. package/src/components/ColorPicker/SVSquare.tsx +189 -0
  286. package/src/components/ColorPicker/colorMath.ts +141 -0
  287. package/src/components/ColorPicker/index.ts +6 -0
  288. package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
  289. package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
  290. package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
  291. package/src/components/ConfirmationPopover/index.ts +2 -0
  292. package/src/components/Constrain/Constrain.module.scss +99 -0
  293. package/src/components/Constrain/Constrain.tsx +79 -0
  294. package/src/components/Constrain/index.ts +2 -0
  295. package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
  296. package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
  297. package/src/components/CurrencySelect/index.ts +3 -0
  298. package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
  299. package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
  300. package/src/components/CursorPagination/CursorPagination.tsx +121 -0
  301. package/src/components/CursorPagination/index.ts +2 -0
  302. package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
  303. package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
  304. package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
  305. package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
  306. package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
  307. package/src/components/DashboardCanvas/engine.ts +363 -0
  308. package/src/components/DashboardCanvas/index.ts +9 -0
  309. package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
  310. package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
  311. package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
  312. package/src/components/DashboardWidget/index.ts +7 -0
  313. package/src/components/DataTable/BodyRow.tsx +197 -0
  314. package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
  315. package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
  316. package/src/components/DataTable/DataTable.module.scss +511 -0
  317. package/src/components/DataTable/DataTable.tokens.scss +80 -0
  318. package/src/components/DataTable/DataTable.tsx +734 -0
  319. package/src/components/DataTable/HeaderCell.module.scss +215 -0
  320. package/src/components/DataTable/HeaderCell.tsx +440 -0
  321. package/src/components/DataTable/columnShift.ts +117 -0
  322. package/src/components/DataTable/index.ts +23 -0
  323. package/src/components/DataTable/pinStyle.ts +47 -0
  324. package/src/components/DataTable/reorderColumns.ts +66 -0
  325. package/src/components/DataTable/types.ts +289 -0
  326. package/src/components/DataTable/useColumnDragShift.ts +216 -0
  327. package/src/components/DataTable/useDataTable.ts +372 -0
  328. package/src/components/DataTable/useResizeHandle.ts +97 -0
  329. package/src/components/DatePicker/DatePicker.module.scss +180 -0
  330. package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
  331. package/src/components/DatePicker/DatePicker.tsx +664 -0
  332. package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
  333. package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
  334. package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
  335. package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
  336. package/src/components/DatePicker/index.ts +4 -0
  337. package/src/components/DatePicker/utils.ts +364 -0
  338. package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
  339. package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
  340. package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
  341. package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
  342. package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
  343. package/src/components/DateRangePicker/index.ts +5 -0
  344. package/src/components/DateRangePicker/utils.ts +151 -0
  345. package/src/components/DateStrip/DateStrip.module.scss +78 -0
  346. package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
  347. package/src/components/DateStrip/DateStrip.tsx +205 -0
  348. package/src/components/DateStrip/index.ts +2 -0
  349. package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
  350. package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
  351. package/src/components/DefinitionList/DefinitionList.tsx +198 -0
  352. package/src/components/DefinitionList/index.ts +9 -0
  353. package/src/components/Divider/Divider.module.scss +144 -0
  354. package/src/components/Divider/Divider.tokens.scss +21 -0
  355. package/src/components/Divider/Divider.tsx +103 -0
  356. package/src/components/Divider/index.ts +2 -0
  357. package/src/components/Dot/Dot.module.scss +40 -0
  358. package/src/components/Dot/Dot.tokens.scss +4 -0
  359. package/src/components/Dot/Dot.tsx +45 -0
  360. package/src/components/Dot/index.ts +2 -0
  361. package/src/components/Drawer/Body.tsx +23 -0
  362. package/src/components/Drawer/Close.tsx +35 -0
  363. package/src/components/Drawer/Content.tsx +93 -0
  364. package/src/components/Drawer/Drawer.module.scss +232 -0
  365. package/src/components/Drawer/Drawer.tokens.scss +38 -0
  366. package/src/components/Drawer/Drawer.tsx +23 -0
  367. package/src/components/Drawer/DrawerRoot.tsx +190 -0
  368. package/src/components/Drawer/Footer.tsx +24 -0
  369. package/src/components/Drawer/Header.tsx +64 -0
  370. package/src/components/Drawer/Overlay.tsx +82 -0
  371. package/src/components/Drawer/context.ts +44 -0
  372. package/src/components/Drawer/index.ts +12 -0
  373. package/src/components/Drawer/useDragToClose.ts +149 -0
  374. package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
  375. package/src/components/DropdownMenu/Content.tsx +419 -0
  376. package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
  377. package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
  378. package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
  379. package/src/components/DropdownMenu/Group.tsx +76 -0
  380. package/src/components/DropdownMenu/Item.tsx +148 -0
  381. package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
  382. package/src/components/DropdownMenu/Radio.tsx +178 -0
  383. package/src/components/DropdownMenu/Root.tsx +100 -0
  384. package/src/components/DropdownMenu/Sub.tsx +332 -0
  385. package/src/components/DropdownMenu/Trigger.tsx +76 -0
  386. package/src/components/DropdownMenu/context.ts +65 -0
  387. package/src/components/DropdownMenu/index.ts +20 -0
  388. package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
  389. package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
  390. package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
  391. package/src/components/EmojiPicker/emojiData.ts +245 -0
  392. package/src/components/EmojiPicker/index.ts +3 -0
  393. package/src/components/EmptyState/EmptyState.module.scss +102 -0
  394. package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
  395. package/src/components/EmptyState/EmptyState.tsx +112 -0
  396. package/src/components/EmptyState/index.ts +7 -0
  397. package/src/components/EntityChip/EntityChip.module.scss +275 -0
  398. package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
  399. package/src/components/EntityChip/EntityChip.tsx +649 -0
  400. package/src/components/EntityChip/index.ts +10 -0
  401. package/src/components/ErrorState/ErrorState.module.scss +105 -0
  402. package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
  403. package/src/components/ErrorState/ErrorState.tsx +125 -0
  404. package/src/components/ErrorState/index.ts +8 -0
  405. package/src/components/Field/Field.module.scss +46 -0
  406. package/src/components/Field/Field.tsx +185 -0
  407. package/src/components/Field/index.ts +2 -0
  408. package/src/components/FileUpload/FileUpload.module.scss +187 -0
  409. package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
  410. package/src/components/FileUpload/FileUpload.tsx +569 -0
  411. package/src/components/FileUpload/formatBytes.ts +34 -0
  412. package/src/components/FileUpload/iconForFile.ts +40 -0
  413. package/src/components/FileUpload/index.ts +2 -0
  414. package/src/components/FilterChip/FilterChip.module.scss +61 -0
  415. package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
  416. package/src/components/FilterChip/FilterChip.tsx +208 -0
  417. package/src/components/FilterChip/index.ts +5 -0
  418. package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
  419. package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
  420. package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
  421. package/src/components/FlowCanvas/FlowControls.tsx +46 -0
  422. package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
  423. package/src/components/FlowCanvas/FlowNode.tsx +76 -0
  424. package/src/components/FlowCanvas/edgePath.ts +85 -0
  425. package/src/components/FlowCanvas/index.ts +4 -0
  426. package/src/components/FlowCanvas/layout.ts +148 -0
  427. package/src/components/FlowCanvas/spatialNav.ts +76 -0
  428. package/src/components/FlowCanvas/types.ts +59 -0
  429. package/src/components/FlowCanvas/useViewport.ts +122 -0
  430. package/src/components/FormRow/FormRow.module.scss +2 -0
  431. package/src/components/FormRow/FormRow.tsx +37 -0
  432. package/src/components/FormRow/index.ts +2 -0
  433. package/src/components/FormSection/FormSection.module.scss +24 -0
  434. package/src/components/FormSection/FormSection.tsx +46 -0
  435. package/src/components/FormSection/index.ts +2 -0
  436. package/src/components/Grid/Grid.module.scss +162 -0
  437. package/src/components/Grid/Grid.tokens.scss +13 -0
  438. package/src/components/Grid/Grid.tsx +226 -0
  439. package/src/components/Grid/GridItem.tsx +77 -0
  440. package/src/components/Grid/index.ts +11 -0
  441. package/src/components/Highlight/Highlight.module.scss +43 -0
  442. package/src/components/Highlight/Highlight.tokens.scss +35 -0
  443. package/src/components/Highlight/Highlight.tsx +164 -0
  444. package/src/components/Highlight/HighlightOverlay.tsx +100 -0
  445. package/src/components/Highlight/index.ts +2 -0
  446. package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
  447. package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
  448. package/src/components/HighlightedText/HighlightedText.tsx +50 -0
  449. package/src/components/HighlightedText/highlightRanges.ts +44 -0
  450. package/src/components/HighlightedText/index.ts +2 -0
  451. package/src/components/IconPicker/IconPicker.module.scss +175 -0
  452. package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
  453. package/src/components/IconPicker/IconPicker.tsx +629 -0
  454. package/src/components/IconPicker/index.ts +9 -0
  455. package/src/components/IconTile/IconTile.module.scss +57 -0
  456. package/src/components/IconTile/IconTile.tokens.scss +16 -0
  457. package/src/components/IconTile/IconTile.tsx +91 -0
  458. package/src/components/IconTile/index.ts +2 -0
  459. package/src/components/Image/Image.module.scss +266 -0
  460. package/src/components/Image/Image.tokens.scss +55 -0
  461. package/src/components/Image/Image.tsx +342 -0
  462. package/src/components/Image/index.ts +2 -0
  463. package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
  464. package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
  465. package/src/components/ImageCrop/ImageCrop.tsx +542 -0
  466. package/src/components/ImageCrop/cropGeometry.ts +120 -0
  467. package/src/components/ImageCrop/extractCropBlob.ts +140 -0
  468. package/src/components/ImageCrop/index.ts +11 -0
  469. package/src/components/ImageCrop/useCropPreview.ts +161 -0
  470. package/src/components/Indent/Indent.module.scss +33 -0
  471. package/src/components/Indent/Indent.tokens.scss +10 -0
  472. package/src/components/Indent/Indent.tsx +46 -0
  473. package/src/components/Indent/index.ts +2 -0
  474. package/src/components/Input/Input.module.scss +99 -0
  475. package/src/components/Input/Input.tokens.scss +54 -0
  476. package/src/components/Input/Input.tsx +105 -0
  477. package/src/components/Input/Suggestions.tsx +260 -0
  478. package/src/components/Input/index.ts +2 -0
  479. package/src/components/Kanban/Kanban.module.scss +39 -0
  480. package/src/components/Kanban/Kanban.tokens.scss +15 -0
  481. package/src/components/Kanban/Kanban.tsx +951 -0
  482. package/src/components/Kanban/index.ts +7 -0
  483. package/src/components/Kbd/Kbd.module.scss +47 -0
  484. package/src/components/Kbd/Kbd.tokens.scss +26 -0
  485. package/src/components/Kbd/Kbd.tsx +73 -0
  486. package/src/components/Kbd/index.ts +2 -0
  487. package/src/components/Lightbox/Lightbox.module.scss +283 -0
  488. package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
  489. package/src/components/Lightbox/Lightbox.tsx +506 -0
  490. package/src/components/Lightbox/index.ts +2 -0
  491. package/src/components/Link/Link.module.scss +78 -0
  492. package/src/components/Link/Link.tokens.scss +28 -0
  493. package/src/components/Link/Link.tsx +114 -0
  494. package/src/components/Link/index.ts +2 -0
  495. package/src/components/LinkCard/LinkCard.module.scss +92 -0
  496. package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
  497. package/src/components/LinkCard/LinkCard.tsx +72 -0
  498. package/src/components/LinkCard/index.ts +2 -0
  499. package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
  500. package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
  501. package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
  502. package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
  503. package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
  504. package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
  505. package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
  506. package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
  507. package/src/components/LiquidEditor/index.ts +7 -0
  508. package/src/components/LiquidEditor/liquidFilters.ts +23 -0
  509. package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
  510. package/src/components/LiquidEditor/types.ts +101 -0
  511. package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
  512. package/src/components/List/List.module.scss +105 -0
  513. package/src/components/List/List.tokens.scss +42 -0
  514. package/src/components/List/List.tsx +124 -0
  515. package/src/components/List/index.ts +9 -0
  516. package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
  517. package/src/components/LiveRegion/LiveRegion.tsx +116 -0
  518. package/src/components/LiveRegion/index.ts +2 -0
  519. package/src/components/Logo/Logo.module.scss +139 -0
  520. package/src/components/Logo/Logo.tokens.scss +14 -0
  521. package/src/components/Logo/Logo.tsx +126 -0
  522. package/src/components/Logo/index.ts +2 -0
  523. package/src/components/Masonry/Masonry.module.scss +42 -0
  524. package/src/components/Masonry/Masonry.tokens.scss +8 -0
  525. package/src/components/Masonry/Masonry.tsx +136 -0
  526. package/src/components/Masonry/index.ts +2 -0
  527. package/src/components/Masonry/masonryUtils.ts +42 -0
  528. package/src/components/MediaTile/MediaTile.module.scss +183 -0
  529. package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
  530. package/src/components/MediaTile/MediaTile.tsx +208 -0
  531. package/src/components/MediaTile/index.ts +8 -0
  532. package/src/components/Modal/Body.tsx +27 -0
  533. package/src/components/Modal/Close.tsx +45 -0
  534. package/src/components/Modal/Content.tsx +98 -0
  535. package/src/components/Modal/Footer.tsx +28 -0
  536. package/src/components/Modal/Header.tsx +51 -0
  537. package/src/components/Modal/Modal.module.scss +262 -0
  538. package/src/components/Modal/Modal.tokens.scss +50 -0
  539. package/src/components/Modal/Modal.tsx +23 -0
  540. package/src/components/Modal/ModalRoot.tsx +299 -0
  541. package/src/components/Modal/Overlay.tsx +101 -0
  542. package/src/components/Modal/context.ts +60 -0
  543. package/src/components/Modal/index.ts +11 -0
  544. package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
  545. package/src/components/MoneyInput/MoneyInput.tsx +433 -0
  546. package/src/components/MoneyInput/index.ts +2 -0
  547. package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
  548. package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
  549. package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
  550. package/src/components/OptionsPicker/index.ts +9 -0
  551. package/src/components/OtpInput/OtpInput.module.scss +69 -0
  552. package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
  553. package/src/components/OtpInput/OtpInput.tsx +368 -0
  554. package/src/components/OtpInput/index.ts +2 -0
  555. package/src/components/Page/Page.module.scss +30 -0
  556. package/src/components/Page/Page.tokens.scss +11 -0
  557. package/src/components/Page/Page.tsx +53 -0
  558. package/src/components/Page/index.ts +2 -0
  559. package/src/components/PageHeader/PageHeader.module.scss +197 -0
  560. package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
  561. package/src/components/PageHeader/PageHeader.tsx +310 -0
  562. package/src/components/PageHeader/index.ts +20 -0
  563. package/src/components/Pagination/Pagination.module.scss +117 -0
  564. package/src/components/Pagination/Pagination.tokens.scss +54 -0
  565. package/src/components/Pagination/Pagination.tsx +165 -0
  566. package/src/components/Pagination/index.ts +4 -0
  567. package/src/components/Pagination/paginationRange.ts +72 -0
  568. package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
  569. package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
  570. package/src/components/PasswordInput/PasswordInput.tsx +210 -0
  571. package/src/components/PasswordInput/index.ts +2 -0
  572. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
  573. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
  574. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
  575. package/src/components/PasswordStrengthMeter/index.ts +2 -0
  576. package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
  577. package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
  578. package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
  579. package/src/components/PersonDisplay/index.ts +10 -0
  580. package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
  581. package/src/components/PhoneInput/PhoneInput.tsx +271 -0
  582. package/src/components/PhoneInput/index.ts +4 -0
  583. package/src/components/PhoneInput/phone.ts +128 -0
  584. package/src/components/PillMenu/PillMenu.module.scss +117 -0
  585. package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
  586. package/src/components/PillMenu/PillMenu.tsx +324 -0
  587. package/src/components/PillMenu/index.ts +2 -0
  588. package/src/components/Popover/Anchor.tsx +37 -0
  589. package/src/components/Popover/Close.tsx +45 -0
  590. package/src/components/Popover/Content.tsx +213 -0
  591. package/src/components/Popover/Heading.tsx +33 -0
  592. package/src/components/Popover/Popover.module.scss +177 -0
  593. package/src/components/Popover/Popover.tokens.scss +22 -0
  594. package/src/components/Popover/Popover.tsx +23 -0
  595. package/src/components/Popover/PopoverRoot.tsx +75 -0
  596. package/src/components/Popover/Trigger.tsx +86 -0
  597. package/src/components/Popover/context.ts +22 -0
  598. package/src/components/Popover/index.ts +7 -0
  599. package/src/components/Progress/Progress.module.scss +110 -0
  600. package/src/components/Progress/Progress.tokens.scss +44 -0
  601. package/src/components/Progress/Progress.tsx +129 -0
  602. package/src/components/Progress/index.ts +2 -0
  603. package/src/components/QrCode/QrCode.module.scss +97 -0
  604. package/src/components/QrCode/QrCode.tokens.scss +17 -0
  605. package/src/components/QrCode/QrCode.tsx +233 -0
  606. package/src/components/QrCode/index.ts +2 -0
  607. package/src/components/QrCode/qr.ts +161 -0
  608. package/src/components/Radio/Radio.module.scss +175 -0
  609. package/src/components/Radio/Radio.tokens.scss +59 -0
  610. package/src/components/Radio/Radio.tsx +127 -0
  611. package/src/components/Radio/RadioGroup.module.scss +42 -0
  612. package/src/components/Radio/RadioGroup.tsx +120 -0
  613. package/src/components/Radio/RadioGroupContext.tsx +30 -0
  614. package/src/components/Radio/index.ts +4 -0
  615. package/src/components/Rail/Rail.module.scss +510 -0
  616. package/src/components/Rail/Rail.tokens.scss +92 -0
  617. package/src/components/Rail/Rail.tsx +287 -0
  618. package/src/components/Rail/RailCollapseToggle.tsx +57 -0
  619. package/src/components/Rail/RailFooter.tsx +17 -0
  620. package/src/components/Rail/RailGroup.tsx +728 -0
  621. package/src/components/Rail/RailGroupContext.ts +9 -0
  622. package/src/components/Rail/RailHeader.tsx +23 -0
  623. package/src/components/Rail/RailItem.tsx +119 -0
  624. package/src/components/Rail/RailSection.tsx +39 -0
  625. package/src/components/Rail/RailSpacer.tsx +19 -0
  626. package/src/components/Rail/index.ts +9 -0
  627. package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
  628. package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
  629. package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
  630. package/src/components/RelativeDateInput/index.ts +10 -0
  631. package/src/components/RelativeDateInput/relativeDate.ts +127 -0
  632. package/src/components/RichText/RichText.module.scss +5 -0
  633. package/src/components/RichText/RichText.tsx +70 -0
  634. package/src/components/RichText/RichTextAttachment.module.scss +82 -0
  635. package/src/components/RichText/RichTextAttachment.tsx +122 -0
  636. package/src/components/RichText/_prose.scss +79 -0
  637. package/src/components/RichText/attachmentIcon.tsx +24 -0
  638. package/src/components/RichText/engine/attachment.ts +154 -0
  639. package/src/components/RichText/engine/autolink.ts +64 -0
  640. package/src/components/RichText/engine/blockUnit.ts +174 -0
  641. package/src/components/RichText/engine/colorMarks.ts +85 -0
  642. package/src/components/RichText/engine/escape.ts +11 -0
  643. package/src/components/RichText/engine/fromHtml.ts +353 -0
  644. package/src/components/RichText/engine/fromMarkdown.ts +20 -0
  645. package/src/components/RichText/engine/inlines.ts +82 -0
  646. package/src/components/RichText/engine/listDepths.ts +32 -0
  647. package/src/components/RichText/engine/marks.ts +80 -0
  648. package/src/components/RichText/engine/mdToHtml.ts +178 -0
  649. package/src/components/RichText/engine/model.ts +157 -0
  650. package/src/components/RichText/engine/position.ts +118 -0
  651. package/src/components/RichText/engine/renderDoc.tsx +395 -0
  652. package/src/components/RichText/engine/renderLink.ts +15 -0
  653. package/src/components/RichText/engine/renderMention.ts +16 -0
  654. package/src/components/RichText/engine/safeHref.ts +22 -0
  655. package/src/components/RichText/engine/toHtml.ts +154 -0
  656. package/src/components/RichText/engine/toMarkdown.ts +97 -0
  657. package/src/components/RichText/engine/transforms.ts +434 -0
  658. package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
  659. package/src/components/RichText/index.ts +31 -0
  660. package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
  661. package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
  662. package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
  663. package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
  664. package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
  665. package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
  666. package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
  667. package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
  668. package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
  669. package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
  670. package/src/components/RichTextEditor/autolinkInput.ts +65 -0
  671. package/src/components/RichTextEditor/blockDrop.ts +9 -0
  672. package/src/components/RichTextEditor/blockReflow.ts +62 -0
  673. package/src/components/RichTextEditor/commands.ts +300 -0
  674. package/src/components/RichTextEditor/history.ts +93 -0
  675. package/src/components/RichTextEditor/icons.tsx +152 -0
  676. package/src/components/RichTextEditor/imageSize.ts +70 -0
  677. package/src/components/RichTextEditor/index.ts +5 -0
  678. package/src/components/RichTextEditor/input.ts +209 -0
  679. package/src/components/RichTextEditor/inputRules.ts +71 -0
  680. package/src/components/RichTextEditor/links.ts +103 -0
  681. package/src/components/RichTextEditor/mentionContext.ts +37 -0
  682. package/src/components/RichTextEditor/mentions.ts +28 -0
  683. package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
  684. package/src/components/RichTextEditor/selection.ts +415 -0
  685. package/src/components/RichTextEditor/shortcuts.ts +44 -0
  686. package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
  687. package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
  688. package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
  689. package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
  690. package/src/components/RichTextEditor/useMention.ts +226 -0
  691. package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
  692. package/src/components/RichTextEditor/useUpload.ts +246 -0
  693. package/src/components/Screen/Screen.module.scss +46 -0
  694. package/src/components/Screen/Screen.tokens.scss +20 -0
  695. package/src/components/Screen/Screen.tsx +97 -0
  696. package/src/components/Screen/index.ts +2 -0
  697. package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
  698. package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
  699. package/src/components/ScrollArea/ScrollArea.tsx +154 -0
  700. package/src/components/ScrollArea/index.ts +2 -0
  701. package/src/components/Select/Chip.tsx +45 -0
  702. package/src/components/Select/Empty.tsx +39 -0
  703. package/src/components/Select/Error.tsx +51 -0
  704. package/src/components/Select/HiddenInputs.tsx +44 -0
  705. package/src/components/Select/Listbox.tsx +557 -0
  706. package/src/components/Select/Loading.tsx +30 -0
  707. package/src/components/Select/Select.module.scss +512 -0
  708. package/src/components/Select/Select.tokens.scss +140 -0
  709. package/src/components/Select/Select.tsx +685 -0
  710. package/src/components/Select/Trigger.tsx +952 -0
  711. package/src/components/Select/context.ts +101 -0
  712. package/src/components/Select/emptyStateText.ts +19 -0
  713. package/src/components/Select/index.ts +9 -0
  714. package/src/components/Select/useSelectState.ts +157 -0
  715. package/src/components/Select/utils-types.ts +7 -0
  716. package/src/components/Select/utils.ts +122 -0
  717. package/src/components/SettingRow/SettingRow.module.scss +166 -0
  718. package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
  719. package/src/components/SettingRow/SettingRow.tsx +242 -0
  720. package/src/components/SettingRow/index.ts +7 -0
  721. package/src/components/Skeleton/Skeleton.module.scss +55 -0
  722. package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
  723. package/src/components/Skeleton/Skeleton.tsx +131 -0
  724. package/src/components/Skeleton/index.ts +4 -0
  725. package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
  726. package/src/components/Slider/Slider.module.scss +293 -0
  727. package/src/components/Slider/Slider.tokens.scss +98 -0
  728. package/src/components/Slider/Slider.tsx +624 -0
  729. package/src/components/Slider/index.ts +9 -0
  730. package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
  731. package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
  732. package/src/components/SlotGrid/SlotGrid.tsx +111 -0
  733. package/src/components/SlotGrid/index.ts +2 -0
  734. package/src/components/SocialButton/SocialButton.module.scss +4 -0
  735. package/src/components/SocialButton/SocialButton.tsx +40 -0
  736. package/src/components/SocialButton/index.ts +2 -0
  737. package/src/components/Sortable/Sortable.module.scss +177 -0
  738. package/src/components/Sortable/Sortable.tokens.scss +27 -0
  739. package/src/components/Sortable/Sortable.tsx +572 -0
  740. package/src/components/Sortable/containerAwareCollision.ts +125 -0
  741. package/src/components/Sortable/index.ts +13 -0
  742. package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
  743. package/src/components/SortableGroup/SortableGroup.tsx +315 -0
  744. package/src/components/SortableGroup/index.ts +4 -0
  745. package/src/components/SortableGroup/moveSortableItem.ts +39 -0
  746. package/src/components/Sparkline/Sparkline.module.scss +28 -0
  747. package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
  748. package/src/components/Sparkline/Sparkline.tsx +133 -0
  749. package/src/components/Sparkline/index.ts +2 -0
  750. package/src/components/Sparkline/sparklineModel.ts +119 -0
  751. package/src/components/Split/Split.module.scss +158 -0
  752. package/src/components/Split/Split.tokens.scss +10 -0
  753. package/src/components/Split/Split.tsx +231 -0
  754. package/src/components/Split/index.ts +2 -0
  755. package/src/components/Stack/Stack.module.scss +67 -0
  756. package/src/components/Stack/Stack.tokens.scss +11 -0
  757. package/src/components/Stack/Stack.tsx +100 -0
  758. package/src/components/Stack/index.ts +2 -0
  759. package/src/components/StagePath/StagePath.module.scss +255 -0
  760. package/src/components/StagePath/StagePath.tokens.scss +43 -0
  761. package/src/components/StagePath/StagePath.tsx +176 -0
  762. package/src/components/StagePath/index.ts +2 -0
  763. package/src/components/StatGroup/StatGroup.module.scss +6 -0
  764. package/src/components/StatGroup/StatGroup.tsx +70 -0
  765. package/src/components/StatGroup/StatGroupContext.ts +10 -0
  766. package/src/components/StatGroup/StatTile.module.scss +99 -0
  767. package/src/components/StatGroup/StatTile.tokens.scss +35 -0
  768. package/src/components/StatGroup/StatTile.tsx +143 -0
  769. package/src/components/StatGroup/index.ts +4 -0
  770. package/src/components/Sticky/Sticky.module.scss +98 -0
  771. package/src/components/Sticky/Sticky.tokens.scss +17 -0
  772. package/src/components/Sticky/Sticky.tsx +103 -0
  773. package/src/components/Sticky/index.ts +2 -0
  774. package/src/components/Switch/Switch.module.scss +182 -0
  775. package/src/components/Switch/Switch.tokens.scss +59 -0
  776. package/src/components/Switch/Switch.tsx +214 -0
  777. package/src/components/Switch/index.ts +2 -0
  778. package/src/components/Table/Table.module.scss +308 -0
  779. package/src/components/Table/Table.tokens.scss +79 -0
  780. package/src/components/Table/Table.tsx +381 -0
  781. package/src/components/Table/index.ts +15 -0
  782. package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
  783. package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
  784. package/src/components/TableOfContents/TableOfContents.tsx +192 -0
  785. package/src/components/TableOfContents/activeSection.ts +18 -0
  786. package/src/components/TableOfContents/index.ts +2 -0
  787. package/src/components/Tabs/Tabs.module.scss +359 -0
  788. package/src/components/Tabs/Tabs.tokens.scss +50 -0
  789. package/src/components/Tabs/Tabs.tsx +538 -0
  790. package/src/components/Tabs/index.ts +2 -0
  791. package/src/components/Text/Text.module.scss +115 -0
  792. package/src/components/Text/Text.tokens.scss +55 -0
  793. package/src/components/Text/Text.tsx +197 -0
  794. package/src/components/Text/index.ts +2 -0
  795. package/src/components/Textarea/Textarea.module.scss +94 -0
  796. package/src/components/Textarea/Textarea.tokens.scss +48 -0
  797. package/src/components/Textarea/Textarea.tsx +246 -0
  798. package/src/components/Textarea/index.ts +2 -0
  799. package/src/components/Thread/Thread.module.scss +161 -0
  800. package/src/components/Thread/Thread.tokens.scss +32 -0
  801. package/src/components/Thread/Thread.tsx +176 -0
  802. package/src/components/Thread/index.ts +2 -0
  803. package/src/components/TimeField/TimeField.module.scss +232 -0
  804. package/src/components/TimeField/TimeField.tsx +793 -0
  805. package/src/components/TimeField/index.ts +2 -0
  806. package/src/components/Timeline/Timeline.module.scss +58 -0
  807. package/src/components/Timeline/Timeline.tokens.scss +13 -0
  808. package/src/components/Timeline/Timeline.tsx +53 -0
  809. package/src/components/Timeline/index.ts +2 -0
  810. package/src/components/Title/Title.module.scss +84 -0
  811. package/src/components/Title/Title.tokens.scss +37 -0
  812. package/src/components/Title/Title.tsx +150 -0
  813. package/src/components/Title/index.ts +2 -0
  814. package/src/components/Toast/Toast.module.scss +299 -0
  815. package/src/components/Toast/Toast.tokens.scss +65 -0
  816. package/src/components/Toast/Toast.tsx +122 -0
  817. package/src/components/Toast/ToastViewport.tsx +166 -0
  818. package/src/components/Toast/api.ts +175 -0
  819. package/src/components/Toast/index.ts +5 -0
  820. package/src/components/Toast/store.ts +133 -0
  821. package/src/components/Toast/useToastTimer.ts +94 -0
  822. package/src/components/Tooltip/Tooltip.module.scss +99 -0
  823. package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
  824. package/src/components/Tooltip/Tooltip.tsx +341 -0
  825. package/src/components/Tooltip/index.ts +2 -0
  826. package/src/components/TopBar/TopBar.module.scss +235 -0
  827. package/src/components/TopBar/TopBar.tokens.scss +79 -0
  828. package/src/components/TopBar/TopBar.tsx +87 -0
  829. package/src/components/TopBar/TopBarEnd.tsx +20 -0
  830. package/src/components/TopBar/TopBarIconButton.tsx +86 -0
  831. package/src/components/TopBar/TopBarSearch.tsx +319 -0
  832. package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
  833. package/src/components/TopBar/TopBarStart.tsx +20 -0
  834. package/src/components/TopBar/index.ts +11 -0
  835. package/src/components/Tour/Spotlight.tsx +121 -0
  836. package/src/components/Tour/Tour.module.scss +210 -0
  837. package/src/components/Tour/Tour.tokens.scss +58 -0
  838. package/src/components/Tour/Tour.tsx +617 -0
  839. package/src/components/Tour/index.ts +2 -0
  840. package/src/components/Tour/useTourTarget.ts +115 -0
  841. package/src/components/TreeView/TreeView.module.scss +268 -0
  842. package/src/components/TreeView/TreeView.tokens.scss +36 -0
  843. package/src/components/TreeView/TreeView.tsx +536 -0
  844. package/src/components/TreeView/index.ts +3 -0
  845. package/src/components/TreeView/treeModel.ts +224 -0
  846. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
  847. package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
  848. package/src/components/VisuallyHidden/index.ts +2 -0
  849. package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
  850. package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
  851. package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
  852. package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
  853. package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
  854. package/src/components/WidgetPreview/index.ts +2 -0
  855. package/src/components/_internal/Trend.tsx +27 -0
  856. package/src/components/_internal/choiceTile.scss +74 -0
  857. package/src/components/_internal/collapse.scss +10 -0
  858. package/src/components/_internal/collapse.ts +58 -0
  859. package/src/components/_internal/currency.ts +257 -0
  860. package/src/components/_internal/dragAnnouncements.ts +200 -0
  861. package/src/components/_internal/fieldWiring.ts +225 -0
  862. package/src/components/_internal/gridSpan.ts +54 -0
  863. package/src/components/_internal/isoDay.ts +35 -0
  864. package/src/components/_internal/letterKey.ts +26 -0
  865. package/src/components/_internal/overlay/focusRestore.ts +21 -0
  866. package/src/components/_internal/overlay/index.ts +12 -0
  867. package/src/components/_internal/overlay/tourHold.ts +23 -0
  868. package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
  869. package/src/components/_internal/overlay/useInOverlay.ts +81 -0
  870. package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
  871. package/src/components/_internal/overlay/useScrollLock.ts +112 -0
  872. package/src/components/_internal/refs.ts +48 -0
  873. package/src/components/_internal/statusColor.ts +26 -0
  874. package/src/components/_internal/timeUtils.ts +23 -0
  875. package/src/components/_internal/useAsyncOptions.ts +145 -0
  876. package/src/components/_internal/useClippedTooltip.ts +50 -0
  877. package/src/components/_internal/useControllableState.ts +50 -0
  878. package/src/components.manifest.json +1141 -0
  879. package/src/hooks/useBelowBreakpoint.ts +58 -0
  880. package/src/i18n/I18nProvider.tsx +52 -0
  881. package/src/i18n/LocaleProvider.tsx +17 -0
  882. package/src/i18n/en.ts +648 -0
  883. package/src/i18n/format.ts +71 -0
  884. package/src/i18n/index.ts +13 -0
  885. package/src/i18n/messages.ts +1275 -0
  886. package/src/i18n/ru.ts +677 -0
  887. package/src/i18n/useLocale.ts +19 -0
  888. package/src/i18n/useTranslation.ts +58 -0
  889. package/src/index.ts +913 -0
  890. package/src/palette/index.ts +2 -0
  891. package/src/palette/palette.ts +108 -0
  892. package/src/styles/dark.scss +4 -0
  893. package/src/styles/global.scss +7 -0
  894. package/src/styles/mixins.scss +143 -0
  895. package/src/styles/reset.scss +78 -0
  896. package/src/styles/tokens.scss +18 -0
  897. package/src/styles/typography.scss +44 -0
@@ -0,0 +1,264 @@
1
+ @use './Card.tokens';
2
+
3
+ .card {
4
+ background: var(--card-bg);
5
+ border: var(--border-width) solid var(--card-border-color);
6
+ border-radius: var(--card-radius);
7
+ box-shadow: var(--card-shadow);
8
+
9
+ // Default: clip children to the rounded border so square-cornered content
10
+ // (Tables with internal scrollWrap, images, full-bleed media) doesn't show
11
+ // a seam at the Card's rounded corners. Overlay primitives (DropdownMenu,
12
+ // Tooltip, Popover) portal out via Floating UI and aren't affected; focus
13
+ // rings are clipped, so flush focusables draw them inset.
14
+ // Opt out with `<Card overflow="visible">` when a child genuinely needs to
15
+ // overhang the card (decorative badges, hover lifts, etc).
16
+ overflow: hidden;
17
+ }
18
+
19
+ .overflowVisible {
20
+ // stylelint-disable-next-line scale-unlimited/declaration-strict-value -- CSS keyword
21
+ overflow: visible;
22
+ }
23
+
24
+ .fill {
25
+ height: 100%;
26
+ min-width: 0;
27
+ }
28
+
29
+ // Card owns this layout because it relates only its own Header and Body
30
+ // compound pieces. It activates only for `<Card fill>` with a direct Body, so
31
+ // ordinary fill Cards keep their existing block layout.
32
+ .fillWithBody {
33
+ display: flex;
34
+ flex-direction: column;
35
+ min-height: 0;
36
+ }
37
+
38
+ .fillWithBody > .header {
39
+ flex-shrink: 0;
40
+ }
41
+
42
+ // Tone-coded left-stripe via inset box-shadow. Drawn inside the card on top
43
+ // of the existing border, so untoned cards stay pixel-identical to before
44
+ // (no layout shift, no width change). The existing --shadow-sm stays on
45
+ // every card; the inset stripe layers on top when `data-tone` is set.
46
+ .card[data-tone='accent'] {
47
+ box-shadow:
48
+ inset var(--card-stripe-width) 0 0 var(--card-stripe-color-accent),
49
+ var(--card-shadow);
50
+ }
51
+
52
+ .card[data-tone='info'] {
53
+ box-shadow:
54
+ inset var(--card-stripe-width) 0 0 var(--card-stripe-color-info),
55
+ var(--card-shadow);
56
+ }
57
+
58
+ .card[data-tone='success'] {
59
+ box-shadow:
60
+ inset var(--card-stripe-width) 0 0 var(--card-stripe-color-success),
61
+ var(--card-shadow);
62
+ }
63
+
64
+ .card[data-tone='warning'] {
65
+ box-shadow:
66
+ inset var(--card-stripe-width) 0 0 var(--card-stripe-color-warning),
67
+ var(--card-shadow);
68
+ }
69
+
70
+ .card[data-tone='danger'] {
71
+ box-shadow:
72
+ inset var(--card-stripe-width) 0 0 var(--card-stripe-color-danger),
73
+ var(--card-shadow);
74
+ }
75
+
76
+ .paddingNone {
77
+ padding: 0;
78
+ }
79
+
80
+ .paddingSm {
81
+ padding: var(--card-padding-sm);
82
+ }
83
+
84
+ .paddingMd {
85
+ padding: var(--card-padding-md);
86
+ }
87
+
88
+ .paddingLg {
89
+ padding: var(--card-padding-lg);
90
+ }
91
+
92
+ .header {
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: space-between;
96
+ gap: var(--card-section-gap);
97
+ padding: var(--card-section-padding-y) var(--card-section-padding-x);
98
+ border-bottom: var(--border-width) solid var(--card-section-border-color);
99
+ }
100
+
101
+ .title {
102
+ // stylelint-disable-next-line property-disallowed-list -- native heading margin reset
103
+ margin: 0;
104
+ font-size: var(--card-title-font-size);
105
+ font-weight: var(--card-title-font-weight);
106
+ color: var(--card-title-fg);
107
+ min-width: 0;
108
+ }
109
+
110
+ .action {
111
+ flex-shrink: 0;
112
+ }
113
+
114
+ // With meta: grid, not flex. Flex shrink is weighted by size, so the title
115
+ // would always give up a fraction of a pixel and wrap; here the auto title
116
+ // track reaches its one-line width before the 1fr meta track gets anything,
117
+ // so meta (min 0, ellipsis) absorbs every narrowing until it is gone. The
118
+ // gaps live in padding, not column-gap, so a collapsed meta track costs the
119
+ // title nothing beyond the one gap it has without meta.
120
+ .withMeta {
121
+ display: grid;
122
+ grid-template-columns: auto minmax(0, 1fr);
123
+ grid-auto-flow: column;
124
+ column-gap: 0;
125
+ }
126
+
127
+ // flex-shrink means nothing on a grid item; an auto track's floor is
128
+ // min-content, so pin it to max-content to keep a text action from wrapping.
129
+ .withMeta .action {
130
+ min-width: max-content;
131
+ padding-inline-start: var(--card-section-gap);
132
+ }
133
+
134
+ // With controls: the header is an inline-size container and an inner grid
135
+ // holds the items, so a container query can re-lay them out. Wide: title ·
136
+ // controls · meta (or an empty spacer) · action (or an empty placeholder), so
137
+ // action always lands in column 4, right-aligned. The title track keeps a
138
+ // short minimum (ellipsis below its natural width); meta truncates before the
139
+ // title gives up anything. Gaps live in padding, as with meta.
140
+ .withControls {
141
+ display: block;
142
+ container: card-header / inline-size;
143
+ }
144
+
145
+ .controlsGrid {
146
+ display: grid;
147
+ grid-auto-flow: column;
148
+ grid-template-columns:
149
+ minmax(var(--card-title-min-width), auto) max-content minmax(0, 1fr)
150
+ max-content;
151
+ align-items: center;
152
+ }
153
+
154
+ .withControls .title {
155
+ overflow: hidden;
156
+ white-space: nowrap;
157
+ text-overflow: ellipsis;
158
+ }
159
+
160
+ .withControls .action {
161
+ min-width: max-content;
162
+ padding-inline-start: var(--card-section-gap);
163
+ }
164
+
165
+ .controls {
166
+ min-width: max-content;
167
+ padding-inline-start: var(--card-section-gap);
168
+ }
169
+
170
+ // SCSS constant because container-query conditions can't read custom
171
+ // properties (same as Image.module.scss). Sized for the 96px title floor, a
172
+ // two-option ButtonGroup (~175px) and an icon action, plus gaps (~323px).
173
+ // ponytail: fixed threshold; wider controls overflow between it and their real need.
174
+ $controls-wrap-below: 360px;
175
+
176
+ // Narrow: controls move to a second row under the title (order, not
177
+ // grid-column, so auto-placement does it). Row 1 is title · meta · action.
178
+ @container card-header (max-width: #{$controls-wrap-below}) {
179
+ .controlsGrid {
180
+ grid-auto-flow: row;
181
+ grid-template-columns: minmax(0, auto) minmax(0, 1fr) max-content;
182
+ row-gap: var(--card-section-gap);
183
+ }
184
+
185
+ .controls {
186
+ order: 1;
187
+ padding-inline-start: 0;
188
+ }
189
+ }
190
+
191
+ .subtle {
192
+ background: var(--card-header-bg-subtle);
193
+ }
194
+
195
+ .meta {
196
+ min-width: 0;
197
+ padding-inline-start: var(--card-section-gap);
198
+ font-size: var(--card-meta-font-size);
199
+ color: var(--card-meta-fg);
200
+ }
201
+
202
+ .metaText {
203
+ display: block;
204
+ overflow: hidden;
205
+ white-space: nowrap;
206
+ text-overflow: ellipsis;
207
+ text-align: end;
208
+ }
209
+
210
+ // In a fill Card (a sized cell, e.g. DashboardWidget) the meta box is sized
211
+ // by its 1fr track, never by content, so size containment is safe there and
212
+ // lets .metaText hide once only a clipped letter or a lone "…" would show.
213
+ // Not on other Cards: in a shrink-to-fit parent containment would zero
214
+ // meta's width and hide it for good; those keep the plain ellipsis. A fill
215
+ // Card in a shrink-to-fit parent would hit the same trap; the meta JSDoc
216
+ // warns about it.
217
+ .fill .meta {
218
+ container: card-meta / inline-size;
219
+ }
220
+
221
+ // SCSS constant because container-query conditions can't read custom
222
+ // properties (same as Image.module.scss).
223
+ // ponytail: fixed threshold — fine for the muted sm text it sizes.
224
+ $meta-hide-below: 48px;
225
+
226
+ @container card-meta (max-width: #{$meta-hide-below}) {
227
+ // Clip, not visibility/display: the text stays in the accessibility tree.
228
+ .metaText {
229
+ clip-path: inset(50%);
230
+ }
231
+ }
232
+
233
+ .body {
234
+ min-height: 0;
235
+ padding: var(--card-body-padding-y) var(--card-body-padding-x);
236
+ }
237
+
238
+ .scroll {
239
+ // Intentional compound-internal layout exception: Body is the Card-owned
240
+ // flexible sibling beneath Header, not a consumer-positioned component.
241
+ flex: 1 1 auto;
242
+ overflow-y: auto;
243
+ }
244
+
245
+ .list {
246
+ list-style: none;
247
+ // stylelint-disable-next-line property-disallowed-list -- native <ul> margin reset
248
+ margin: 0;
249
+ // stylelint-disable-next-line property-disallowed-list -- native <ul> padding reset
250
+ padding: 0;
251
+ }
252
+
253
+ .listRow {
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: space-between;
257
+ gap: var(--card-section-gap);
258
+ padding: var(--card-section-padding-y) var(--card-section-padding-x);
259
+ border-bottom: var(--border-width) solid var(--card-section-border-color);
260
+ }
261
+
262
+ .listRow:last-child {
263
+ border-bottom: 0;
264
+ }
@@ -0,0 +1,55 @@
1
+ // Card.tokens.scss — Component-scoped tokens for <Card>. Each token
2
+ // defaults to the primitive the SCSS used before this migration.
3
+ :root {
4
+ // Surface + border
5
+ --card-bg: var(--color-bg);
6
+ --card-border-color: var(--color-border);
7
+ --card-radius: var(--radius-lg);
8
+ --card-shadow: var(--shadow-sm);
9
+
10
+ // Tone stripe — width + per-tone color (inset box-shadow on the card)
11
+ --card-stripe-width: var(--border-width-strong);
12
+ --card-stripe-color-accent: var(--color-accent);
13
+ --card-stripe-color-info: var(--color-info);
14
+ --card-stripe-color-success: var(--color-success);
15
+
16
+ // @contrast --color-warning on --color-bg = 2.14:1 light
17
+ // @contrast --color-warning-strong on --color-bg = 5.95:1 light
18
+ // warning uses --color-warning-strong; the bare --color-warning measures 2.14:1 here, below
19
+ // WCAG AA for text and below 1.4.11's 3:1 for a graphical object. See #481.
20
+ --card-stripe-color-warning: var(--color-warning-strong);
21
+ --card-stripe-color-danger: var(--color-danger);
22
+
23
+ // Padding per size
24
+ --card-padding-sm: var(--space-3);
25
+ --card-padding-md: var(--space-4);
26
+ --card-padding-lg: var(--space-6);
27
+
28
+ // Header / list-row internal layout
29
+ --card-section-gap: var(--space-3);
30
+ --card-section-padding-y: var(--space-3);
31
+ --card-section-padding-x: var(--space-4);
32
+ --card-section-border-color: var(--color-border);
33
+
34
+ // Sunken, not muted: muted is the segmented ButtonGroup track and the ghost
35
+ // Button hover, so a muted header swallowed both. bg-subtle was the other
36
+ // candidate, but in light it sits ~1 step off --card-bg and the tint vanishes.
37
+ --card-header-bg-subtle: var(--color-bg-sunken);
38
+
39
+ // Body section spacing
40
+ --card-body-padding-y: var(--space-3);
41
+ --card-body-padding-x: var(--space-4);
42
+
43
+ // Title typography
44
+ --card-title-font-size: var(--font-size-md);
45
+ --card-title-font-weight: var(--font-weight-semibold);
46
+ --card-title-fg: var(--color-fg);
47
+
48
+ // Title floor beside `controls` before they wrap under it: 96px keeps a
49
+ // word like "Conditions" whole. No 96px step exists, hence the calc.
50
+ --card-title-min-width: calc(var(--space-12) * 2);
51
+
52
+ // Header meta (secondary text beside the title)
53
+ --card-meta-font-size: var(--font-size-sm);
54
+ --card-meta-fg: var(--color-fg-muted);
55
+ }
@@ -0,0 +1,170 @@
1
+ import {
2
+ Children,
3
+ Fragment,
4
+ forwardRef,
5
+ isValidElement,
6
+ type HTMLAttributes,
7
+ type ReactNode,
8
+ } from 'react';
9
+ import clsx from 'clsx';
10
+ import styles from './Card.module.scss';
11
+ import { CardBody } from './CardBody';
12
+ import { CardHeader } from './CardHeader';
13
+ import { CardList } from './CardList';
14
+ import { CardListRow } from './CardListRow';
15
+
16
+ /** Inner padding. See CardProps#padding for guidance on each. */
17
+ export type CardPadding = 'none' | 'sm' | 'md' | 'lg';
18
+
19
+ /**
20
+ * Optional left-edge tone stripe color. When set on a Card, draws a 3px
21
+ * accent-colored bar on the left edge. Uses the same token vocabulary as Alert.
22
+ */
23
+ export type CardTone = 'accent' | 'info' | 'success' | 'warning' | 'danger';
24
+
25
+ /** How the Card clips its children. See CardProps#overflow. */
26
+ export type CardOverflow = 'hidden' | 'visible';
27
+
28
+ export interface CardProps extends HTMLAttributes<HTMLDivElement> {
29
+ /**
30
+ * Inner padding.
31
+ * - `none` — use when the card contains a table or list that should bleed
32
+ * edge-to-edge; inner sections manage their own padding.
33
+ * - `sm` (12px) — dense info cards.
34
+ * - `md` (16px) — default for plain-content cards.
35
+ * - `lg` (24px) — emphasis cards, marketing-style panels.
36
+ *
37
+ * When omitted, defaults to `'md'` for plain content, or `'none'` when the
38
+ * card contains compound subcomponents (`Card.Header` / `Card.Body` /
39
+ * `Card.List` / `Card.ListRow`) so its sections bleed to the card edge
40
+ * automatically.
41
+ * Pass an explicit value to override the auto-detect.
42
+ *
43
+ * **Detection is shallow:** only direct children are inspected. Fragments
44
+ * (`<>...</>`) are transparent — the detection recurses into them, so
45
+ * conditional renders that wrap compound children in a Fragment still
46
+ * trigger the auto-detect. But wrapping a `Card.Header` in any other
47
+ * element (`<div>`, `<Stack>`, etc.) defeats the heuristic — pass
48
+ * `padding="none"` explicitly in that case.
49
+ */
50
+ padding?: CardPadding;
51
+ /**
52
+ * Optional left-edge tone stripe (3px). Useful for "stat card" / "status card"
53
+ * patterns where one card in a row needs visual emphasis. Default: no stripe
54
+ * (the card keeps its standard bordered look).
55
+ *
56
+ * Uses the same tone vocabulary as `Alert`: `accent` / `info` / `success` /
57
+ * `warning` / `danger`.
58
+ */
59
+ tone?: CardTone;
60
+ /**
61
+ * How the card clips its children at the rounded border.
62
+ * - `hidden` (default) — children are clipped to the rounded border. This
63
+ * prevents the visible seam that appears at the corners when a child has
64
+ * square corners (Table's internal scroll wrapper, images, full-bleed
65
+ * media). Overlays in this library (DropdownMenu, Tooltip, Popover, Drawer,
66
+ * Modal) portal to `document.body` and are NOT clipped by this. Focus
67
+ * rings are NOT exempt: an `outline` is clipped by an ancestor's overflow,
68
+ * so a focusable flush against the card edge loses that band — draw its
69
+ * ring inset by passing `$offset: calc(-1 * var(--ring-offset))` to the
70
+ * `focus-ring` mixin, not a separate `outline-offset` after the `@include`
71
+ * (a `structure.test.ts` gate fails the build on that shape).
72
+ * - `visible` — opt out of clipping. Use when a direct child needs to
73
+ * overhang the card edge — decorative badges that protrude from a corner,
74
+ * hover-lift transforms whose shadow extends past the card border, etc.
75
+ *
76
+ * @default 'hidden'
77
+ */
78
+ overflow?: CardOverflow;
79
+ /**
80
+ * Fill the containing block's height and allow the Card to shrink within a
81
+ * narrow grid cell. Use in stretched Grid, Sortable, or DashboardCanvas
82
+ * cells whose wrapper already has a definite height. When a direct
83
+ * `Card.Body` child is present, `fill` also establishes Card's internal
84
+ * column and minimum-height chain; add `scroll` to the Body to keep a sibling
85
+ * Header fixed above a scrolling content region. Defaults to `false`.
86
+ * @default false
87
+ */
88
+ fill?: boolean;
89
+ }
90
+
91
+ const paddingClass: Record<CardPadding, string> = {
92
+ none: styles.paddingNone,
93
+ sm: styles.paddingSm,
94
+ md: styles.paddingMd,
95
+ lg: styles.paddingLg,
96
+ };
97
+
98
+ interface CompoundChildrenInfo {
99
+ hasCompound: boolean;
100
+ hasBody: boolean;
101
+ }
102
+
103
+ function inspectCompoundChildren(children: ReactNode): CompoundChildrenInfo {
104
+ return Children.toArray(children).reduce<CompoundChildrenInfo>(
105
+ (info, child) => {
106
+ if (!isValidElement(child)) return info;
107
+ const type = child.type;
108
+ if (type === CardBody) {
109
+ return { hasCompound: true, hasBody: true };
110
+ }
111
+ if (type === CardHeader || type === CardList || type === CardListRow) {
112
+ return { ...info, hasCompound: true };
113
+ }
114
+ // Fragments are transparent — Children.toArray preserves them as nodes,
115
+ // but a consumer who wraps compound children in a `<>` (e.g. for a
116
+ // conditional render) clearly still wants the auto-detect to fire.
117
+ if (type === Fragment) {
118
+ const nested = inspectCompoundChildren((child.props as { children?: ReactNode }).children);
119
+ return {
120
+ hasCompound: info.hasCompound || nested.hasCompound,
121
+ hasBody: info.hasBody || nested.hasBody,
122
+ };
123
+ }
124
+ return info;
125
+ },
126
+ { hasCompound: false, hasBody: false },
127
+ );
128
+ }
129
+
130
+ /**
131
+ * Bordered container for grouped content, with an optional compound API (`Card.Header` / `Body` / `List` / `ListRow`).
132
+ * @see docs/components/Card.md
133
+ */
134
+ const CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(
135
+ { padding, tone, overflow = 'hidden', fill = false, className, children, ...props },
136
+ ref,
137
+ ) {
138
+ const compoundChildren = inspectCompoundChildren(children);
139
+ // Compound subcomponents (Card.Header / Card.Body / Card.List /
140
+ // Card.ListRow) manage their own internal padding and want to bleed to the
141
+ // card edge. When any are present and `padding` wasn't passed explicitly,
142
+ // default to 'none' so the consumer doesn't have to repeat themselves.
143
+ // Explicit `padding` wins.
144
+ const effectivePadding: CardPadding = padding ?? (compoundChildren.hasCompound ? 'none' : 'md');
145
+ // {...props} last so consumer overrides win (Pattern A).
146
+ return (
147
+ <div
148
+ ref={ref}
149
+ className={clsx(
150
+ styles.card,
151
+ paddingClass[effectivePadding],
152
+ overflow === 'visible' && styles.overflowVisible,
153
+ fill && styles.fill,
154
+ fill && compoundChildren.hasBody && styles.fillWithBody,
155
+ className,
156
+ )}
157
+ data-tone={tone}
158
+ {...props}
159
+ >
160
+ {children}
161
+ </div>
162
+ );
163
+ });
164
+
165
+ export const Card = Object.assign(CardRoot, {
166
+ Body: CardBody,
167
+ Header: CardHeader,
168
+ List: CardList,
169
+ ListRow: CardListRow,
170
+ });
@@ -0,0 +1,45 @@
1
+ import { forwardRef, type HTMLAttributes } from 'react';
2
+ import clsx from 'clsx';
3
+ import styles from './Card.module.scss';
4
+
5
+ /** Props for the content region inside a compound Card. */
6
+ export interface CardBodyProps extends HTMLAttributes<HTMLDivElement> {
7
+ /**
8
+ * Makes the body the flexible vertical scroll region of a `fill` Card while
9
+ * sibling `Card.Header` content stays fixed. The Card's parent must provide
10
+ * a definite height. Defaults to `false`.
11
+ * @default false
12
+ */
13
+ scroll?: boolean;
14
+ }
15
+
16
+ /**
17
+ * Padded content region for the Card compound API.
18
+ * @see docs/components/Card.md
19
+ */
20
+ export const CardBody = forwardRef<HTMLDivElement, CardBodyProps>(function CardBody(
21
+ { scroll = false, className, ...props },
22
+ ref,
23
+ ) {
24
+ // {...props} last so consumer overrides win (Pattern A) — including
25
+ // tabIndex, so a consumer that gives the region a focusable descendant, or
26
+ // wants to manage focus itself, can opt out with tabIndex={-1}.
27
+ return (
28
+ <div
29
+ ref={ref}
30
+ // `scroll` is what makes this an overflow container, so `scroll` is what
31
+ // has to make it keyboard-reachable. Without it, content that overflows
32
+ // is unreachable for a keyboard-only user whenever it has no focusable
33
+ // descendant — axe `scrollable-region-focusable`, WCAG 2.1.1. The
34
+ // sharpest case is a loading body full of `Skeleton`s, every one of
35
+ // which is aria-hidden: a scrollable region with nothing in it to reach.
36
+ //
37
+ // The NAME still has to come from the consumer — the DS cannot know what
38
+ // the region holds — so pair this with `role="group"` and an
39
+ // `aria-label` when the content warrants announcing.
40
+ tabIndex={scroll ? 0 : undefined}
41
+ className={clsx(styles.body, scroll && styles.scroll, className)}
42
+ {...props}
43
+ />
44
+ );
45
+ });
@@ -0,0 +1,113 @@
1
+ import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
2
+ import clsx from 'clsx';
3
+ import styles from './Card.module.scss';
4
+
5
+ /** Heading level wrapping the title. Defaults to 'h3'. Same vocab as Accordion. */
6
+ export type CardHeaderLevel = 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
7
+
8
+ export interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
9
+ /**
10
+ * Heading level for the title text. Defaults to `'h3'` (assumes the page
11
+ * has an h1/h2 above). Override when this section sits beneath an h1
12
+ * directly (`headerLevel="h2"`) or further nested (`headerLevel="h4"`).
13
+ */
14
+ headerLevel?: CardHeaderLevel;
15
+ /**
16
+ * `'subtle'` paints the header on a tinted (sunken) surface, for a nested editable
17
+ * sub-section inside a `Card.Body` (e.g. a condition group). Defaults to
18
+ * `'default'`.
19
+ */
20
+ surface?: 'default' | 'subtle';
21
+ /**
22
+ * Optional interactive slot right after the title (e.g. a `ButtonGroup`
23
+ * mode switch). Rendered outside the heading, so it is not part of the
24
+ * heading's name. Order: title, controls, meta, action. Controls never
25
+ * shrink: on a wide header the title ellipsizes down to a short minimum
26
+ * width; on a narrow header (under ~360px of content) the controls wrap onto
27
+ * a second row under the title, which keeps the first row with meta and
28
+ * action. Keep titles short, or pass a `title` attribute for long ones.
29
+ */
30
+ controls?: ReactNode;
31
+ /**
32
+ * Optional right-aligned slot — typically a `<Link>` or `<Button>` that
33
+ * lets the user navigate to a full list or take a section-level action.
34
+ * Rendered inside a `<span>` that never shrinks or wraps (flex-shrink: 0;
35
+ * with `meta` or `controls`, min-width: max-content). Beside `controls` it is
36
+ * the removal/section action of a nested sub-group (e.g. a ghost delete
37
+ * button), right-aligned after any meta.
38
+ */
39
+ action?: ReactNode;
40
+ /**
41
+ * Optional secondary, non-interactive text beside the title — freshness
42
+ * ("Updated 3 minutes ago") or status. Muted and single-line; sits just
43
+ * before `action` and is the first thing to give way at narrow widths: it
44
+ * truncates with an ellipsis before the title gives up any width, while
45
+ * `action` keeps its width. In a `fill` Card (which needs a parent of
46
+ * definite width) it is also visually hidden, still read by screen
47
+ * readers, once only a sliver would show. Not part
48
+ * of the heading's name. Put controls in `controls` or `action`, never
49
+ * here. `false` and `''` count as no meta.
50
+ */
51
+ meta?: ReactNode;
52
+ /**
53
+ * Title content. Becomes the inner text of the heading element. Typically
54
+ * a plain string, but can contain inline elements if needed.
55
+ */
56
+ children: ReactNode;
57
+ }
58
+
59
+ /**
60
+ * Title row subcomponent for `<Card>` with optional right-aligned meta text and action slot.
61
+ * @see docs/components/Card.md
62
+ */
63
+ export const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(function CardHeader(
64
+ { headerLevel = 'h3', surface = 'default', controls, action, meta, children, className, ...rest },
65
+ ref,
66
+ ) {
67
+ // headerLevel is a string union of valid HTML heading tag names; cast to
68
+ // the union (not a single literal) so the JSX dispatch type is honest.
69
+ const Heading = headerLevel as 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
70
+ const hasMeta = meta != null && meta !== false && meta !== '';
71
+ const hasControls = controls != null && controls !== false && controls !== '';
72
+ const title = <Heading className={styles.title}>{children}</Heading>;
73
+ const metaNode = hasMeta && (
74
+ <span className={styles.meta}>
75
+ <span className={styles.metaText}>{meta}</span>
76
+ </span>
77
+ );
78
+ const actionNode = action != null ? <span className={styles.action}>{action}</span> : null;
79
+ // {...rest} last so consumer overrides win (Pattern A).
80
+ return (
81
+ <div
82
+ ref={ref}
83
+ className={clsx(
84
+ styles.header,
85
+ hasMeta && styles.withMeta,
86
+ hasControls && styles.withControls,
87
+ surface === 'subtle' && styles.subtle,
88
+ className,
89
+ )}
90
+ data-surface={surface === 'subtle' ? 'subtle' : undefined}
91
+ {...rest}
92
+ >
93
+ {hasControls ? (
94
+ // The header is the size container; this inner grid is what its
95
+ // container query re-lays out (a container can't restyle itself).
96
+ <div className={styles.controlsGrid}>
97
+ {title}
98
+ <span className={styles.controls}>{controls}</span>
99
+ {!hasMeta && <span aria-hidden="true" />}
100
+ {metaNode}
101
+ {/* Placeholder keeps the column count fixed when there is no action. */}
102
+ {actionNode ?? <span aria-hidden="true" />}
103
+ </div>
104
+ ) : (
105
+ <>
106
+ {title}
107
+ {metaNode}
108
+ {actionNode}
109
+ </>
110
+ )}
111
+ </div>
112
+ );
113
+ });
@@ -0,0 +1,24 @@
1
+ import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
2
+ import clsx from 'clsx';
3
+ import styles from './Card.module.scss';
4
+
5
+ export interface CardListProps extends HTMLAttributes<HTMLUListElement> {
6
+ /** Row items — typically `<Card.ListRow>` elements. */
7
+ children: ReactNode;
8
+ }
9
+
10
+ /**
11
+ * Semantic `<ul>` wrapper for a list of `<Card.ListRow>` items inside a `<Card>`.
12
+ * @see docs/components/Card.md
13
+ */
14
+ export const CardList = forwardRef<HTMLUListElement, CardListProps>(function CardList(
15
+ { children, className, ...rest },
16
+ ref,
17
+ ) {
18
+ // {...rest} last so consumer overrides win (Pattern A).
19
+ return (
20
+ <ul ref={ref} className={clsx(styles.list, className)} {...rest}>
21
+ {children}
22
+ </ul>
23
+ );
24
+ });