@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,572 @@
1
+ import {
2
+ Children,
3
+ createContext,
4
+ forwardRef,
5
+ isValidElement,
6
+ useContext,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ type ButtonHTMLAttributes,
11
+ type HTMLAttributes,
12
+ type ReactNode,
13
+ } from 'react';
14
+ import {
15
+ closestCenter,
16
+ DndContext,
17
+ DragOverlay,
18
+ KeyboardSensor,
19
+ PointerSensor,
20
+ useSensor,
21
+ useSensors,
22
+ type DragEndEvent,
23
+ type DragStartEvent,
24
+ type Modifier,
25
+ } from '@dnd-kit/core';
26
+ import {
27
+ SortableContext,
28
+ rectSortingStrategy,
29
+ sortableKeyboardCoordinates,
30
+ useSortable,
31
+ verticalListSortingStrategy,
32
+ } from '@dnd-kit/sortable';
33
+ import { CSS, type Transform } from '@dnd-kit/utilities';
34
+ import clsx from 'clsx';
35
+ import { useTranslation } from '../../i18n/useTranslation';
36
+ import { mergeRefs } from '../_internal/refs';
37
+ import { useFloatingSurface } from '../_internal/overlay';
38
+ import {
39
+ resolveGridItemSpan,
40
+ resolveCollapsedGridItemSpan,
41
+ type GridItemSpan,
42
+ } from '../_internal/gridSpan';
43
+ import {
44
+ CollapseColumnsContext,
45
+ COLLAPSE_BREAKPOINTS,
46
+ collapseTrackTemplate,
47
+ type CollapseBreakpoint,
48
+ type CollapseColumnsMap,
49
+ } from '../_internal/collapse';
50
+ import { sortableTarget, useDragAccessibility } from '../_internal/dragAnnouncements';
51
+ import styles from './Sortable.module.scss';
52
+
53
+ /**
54
+ * Layout arrangement of the sortable items.
55
+ * - `'list'` (default) — a single vertical column (`verticalListSortingStrategy`).
56
+ * - `'grid'` — a `columns`-track CSS grid where items carry column spans and
57
+ * siblings reflow in 2D during a drag (`rectSortingStrategy`).
58
+ */
59
+ export type SortableArrangement = 'list' | 'grid';
60
+
61
+ /**
62
+ * Payload fired by `onReorder` after a successful drag-drop or keyboard move.
63
+ * Consumer applies the move via an immutable `arrayMove(items, from, to)`
64
+ * (3-line utility, not shipped by the library; `@dnd-kit/sortable` ships an
65
+ * `arrayMove` consumers can import if they want).
66
+ */
67
+ export interface SortableReorderEvent {
68
+ from: number;
69
+ to: number;
70
+ id: string | number;
71
+ }
72
+
73
+ /**
74
+ * Clamp a drag `transform` so the dragged node (`nodeRect`) stays within
75
+ * `boundingRect`. Pure function mirroring dnd-kit's `restrictToBoundingRect`;
76
+ * exported so the clamp math can be unit-tested without a real DOM / drag.
77
+ *
78
+ * `scaleX` / `scaleY` pass through untouched — only the translation is clamped.
79
+ */
80
+ export function restrictTransformToRect(
81
+ transform: Transform,
82
+ nodeRect: { top: number; bottom: number; left: number; right: number },
83
+ boundingRect: { top: number; left: number; width: number; height: number },
84
+ ): Transform {
85
+ const value = { ...transform };
86
+ if (nodeRect.top + transform.y <= boundingRect.top) {
87
+ value.y = boundingRect.top - nodeRect.top;
88
+ } else if (nodeRect.bottom + transform.y >= boundingRect.top + boundingRect.height) {
89
+ value.y = boundingRect.top + boundingRect.height - nodeRect.bottom;
90
+ }
91
+ if (nodeRect.left + transform.x <= boundingRect.left) {
92
+ value.x = boundingRect.left - nodeRect.left;
93
+ } else if (nodeRect.right + transform.x >= boundingRect.left + boundingRect.width) {
94
+ value.x = boundingRect.left + boundingRect.width - nodeRect.right;
95
+ }
96
+ return value;
97
+ }
98
+
99
+ export interface SortableProps extends HTMLAttributes<HTMLOListElement> {
100
+ /**
101
+ * Fires after a drag or keyboard move with the new position. Consumer
102
+ * holds the items array and re-renders with the new order.
103
+ *
104
+ * Not fired if the drop position equals the source position (no-op).
105
+ */
106
+ onReorder?: (event: SortableReorderEvent) => void;
107
+ /**
108
+ * When `true` (default), the dragged item is clamped to the list's bounding
109
+ * box — it can't be dragged outside the `<ol>`. Set `false` for free-drag
110
+ * (the item can be dragged anywhere on the page). For a vertical list this
111
+ * constrains the drag vertically to the list's extent.
112
+ */
113
+ restrictToContainer?: boolean;
114
+ /**
115
+ * Layout arrangement of the items.
116
+ * - `'list'` (default) — single vertical column; existing behavior unchanged.
117
+ * - `'grid'` — the `<ol>` becomes a `columns`-track CSS grid. Items carry
118
+ * column spans (`Sortable.Item span`), rows are equal-height, and siblings
119
+ * reflow in 2D during a drag. Reorder semantics stay order-based (a drop
120
+ * reorders the flow; nothing here persists an x/y position).
121
+ */
122
+ arrangement?: SortableArrangement;
123
+ /**
124
+ * Number of equal-width grid tracks. Only applies when `arrangement="grid"`
125
+ * (ignored for a list). Default `12`, matching `Grid.Item`'s 12-column
126
+ * fraction spans (`'25%'`→3 … `'75%'`→9 tracks). Set another count for a
127
+ * simpler grid, but the named fraction spans then won't map to their
128
+ * fraction (documented, not validated — same as `Grid`).
129
+ */
130
+ columns?: number;
131
+ /**
132
+ * Responsive collapse for the grid arrangement — mirrors `Grid`'s
133
+ * `collapseBelow` exactly (same breakpoints, same container-query
134
+ * mechanism). Ignored unless `arrangement="grid"`.
135
+ * - `'sm' | 'md' | 'lg'` — below the container-width threshold (480 / 640 /
136
+ * 768px of the LIST'S OWN width) every item spans the full row: a single
137
+ * visual column.
138
+ * - `{ lg?: n, md?: n, sm?: n }` — graduated: below each breakpoint the grid
139
+ * re-templates to that many columns and item spans clamp to fit (a span
140
+ * wider than the step becomes a full row). E.g. `{ md: 6, sm: 1 }`.
141
+ *
142
+ * ❌ Anti-pattern: a collapsible Sortable must get its width from its
143
+ * parent — `container-type: inline-size` zeroes the list's contribution to
144
+ * intrinsic sizing (same caveat as `Grid`'s `collapseBelow`).
145
+ *
146
+ * ⚠️ The map form (and ONLY the map form) wraps the `<ol>` in an extra
147
+ * `<div>` carrying `container-type: inline-size` — re-templating the `<ol>`
148
+ * requires querying an ancestor, not the `<ol>` itself. A `> child` selector
149
+ * aimed at the list from its parent hits that wrapper instead, and layout the
150
+ * parent applies via `className` lands on the `<ol>` inside it. `ref`,
151
+ * `className`, `style` and spread props all stay on the `<ol>`.
152
+ */
153
+ collapseBelow?: CollapseBreakpoint | CollapseColumnsMap;
154
+ }
155
+
156
+ export interface SortableItemProps extends Omit<HTMLAttributes<HTMLLIElement>, 'id'> {
157
+ /**
158
+ * Stable identifier for this item. Used by dnd-kit for tracking the item
159
+ * across reorders. String or number — typically the consumer's database id.
160
+ */
161
+ id: string | number;
162
+ /** Item content — typically a `<Card>` or a row of text + icons. */
163
+ children: ReactNode;
164
+ /**
165
+ * Column span, only meaningful under `<Sortable arrangement="grid">`
166
+ * (ignored in a list). Mirrors `Grid.Item`'s `span` exactly:
167
+ * - number — `span N` of the grid's `columns`.
168
+ * - `'25%' | '33%' | '50%' | '67%' | '75%'` — fractions of a 12-column grid.
169
+ * - `'100%'` / `'full'` — the entire row (`1 / -1`); safe with any `columns`.
170
+ * Omit for a single track (auto placement).
171
+ */
172
+ span?: GridItemSpan;
173
+ }
174
+
175
+ export interface SortableHandleProps extends ButtonHTMLAttributes<HTMLButtonElement> {
176
+ /**
177
+ * Decorative content — typically a grip icon (e.g. `<GripVertical size={14} />`).
178
+ * Rendered inside the Handle's `<button>` wrapped with `aria-hidden`.
179
+ */
180
+ children?: ReactNode;
181
+ }
182
+
183
+ export interface SortableItemContextValue {
184
+ listeners: ReturnType<typeof useSortable>['listeners'];
185
+ attributes: ReturnType<typeof useSortable>['attributes'];
186
+ setActivatorNodeRef: ReturnType<typeof useSortable>['setActivatorNodeRef'];
187
+ }
188
+
189
+ export const SortableItemContext = createContext<SortableItemContextValue | null>(null);
190
+
191
+ // Inert context for the DragOverlay clone — the overlay is a static visual; its
192
+ // Handle (if any) must render without wiring real drag listeners.
193
+ const OVERLAY_ITEM_CONTEXT: SortableItemContextValue = {
194
+ listeners: undefined,
195
+ attributes: {} as SortableItemContextValue['attributes'],
196
+ setActivatorNodeRef: () => {},
197
+ };
198
+
199
+ /**
200
+ * Recursively check whether the children subtree contains a `Sortable.Handle`.
201
+ * Used by `Sortable.Item` to decide whether to attach drag listeners to itself
202
+ * (no Handle present) or rely on the Handle to attach them.
203
+ *
204
+ * **Limitation:** only walks `React.Children` and direct `props.children`.
205
+ * If a consumer wraps `<Sortable.Handle>` inside their own custom component
206
+ * (e.g. `<TaskRow>` whose JSX internally renders the Handle), the walk sees
207
+ * `<TaskRow>` but not the Handle inside it — the Item is classified as
208
+ * no-Handle and gets whole-item drag. Workaround: put `<Sortable.Handle>` at
209
+ * the same JSX nesting level as the rest of the Item's content.
210
+ */
211
+ function containsHandle(children: ReactNode): boolean {
212
+ let found = false;
213
+ function walk(node: ReactNode) {
214
+ if (found) return;
215
+ if (!isValidElement(node)) return;
216
+ if (node.type === SortableHandle) {
217
+ found = true;
218
+ return;
219
+ }
220
+ const { children: nested } = node.props as { children?: ReactNode };
221
+ if (nested != null) Children.forEach(nested, walk);
222
+ }
223
+ Children.forEach(children, walk);
224
+ return found;
225
+ }
226
+
227
+ const collapseClass: Record<CollapseBreakpoint, string> = {
228
+ sm: styles.collapseSm,
229
+ md: styles.collapseMd,
230
+ lg: styles.collapseLg,
231
+ };
232
+ const stepClass: Record<CollapseBreakpoint, string> = {
233
+ sm: styles.stepSm,
234
+ md: styles.stepMd,
235
+ lg: styles.stepLg,
236
+ };
237
+
238
+ const SortableRoot = forwardRef<HTMLOListElement, SortableProps>(function SortableRoot(
239
+ {
240
+ onReorder,
241
+ restrictToContainer = true,
242
+ arrangement = 'list',
243
+ columns = 12,
244
+ collapseBelow,
245
+ className,
246
+ style,
247
+ children,
248
+ ...rest
249
+ },
250
+ ref,
251
+ ) {
252
+ const isGrid = arrangement === 'grid';
253
+ const collapse = isGrid ? collapseBelow : undefined;
254
+ const collapseMap = typeof collapse === 'object' ? collapse : undefined;
255
+ const collapseKeys = collapseMap
256
+ ? COLLAPSE_BREAKPOINTS.filter((b) => collapseMap[b] !== undefined)
257
+ : [];
258
+ const [activeId, setActiveId] = useState<string | number | null>(null);
259
+ // #282: a keyboard drag is an Escape-consuming MODE (Escape cancels the
260
+ // drag). Register it as a floating surface while active so a host Modal/Drawer
261
+ // yields that Escape — the drag cancels, the host survives that press.
262
+ useFloatingSurface(activeId != null);
263
+ // Internal handle on the <ol> so the restrict modifier can read the live
264
+ // list rect, independent of whether the consumer forwards a ref.
265
+ const olRef = useRef<HTMLOListElement | null>(null);
266
+
267
+ const itemIds = useMemo(() => {
268
+ const ids: (string | number)[] = [];
269
+ Children.forEach(children, (child) => {
270
+ if (isValidElement(child) && child.type === SortableItem) {
271
+ ids.push((child.props as SortableItemProps).id);
272
+ }
273
+ });
274
+ return ids;
275
+ }, [children]);
276
+
277
+ // The active item's content, rendered into the DragOverlay clone. Looking it
278
+ // up by id (rather than capturing a snapshot on drag-start) keeps the overlay
279
+ // in sync if the consumer's item content re-renders mid-drag.
280
+ const activeChildren = useMemo<ReactNode>(() => {
281
+ if (activeId == null) return null;
282
+ let content: ReactNode = null;
283
+ Children.forEach(children, (child) => {
284
+ if (
285
+ isValidElement(child) &&
286
+ child.type === SortableItem &&
287
+ (child.props as SortableItemProps).id === activeId
288
+ ) {
289
+ content = (child.props as SortableItemProps).children;
290
+ }
291
+ });
292
+ return content;
293
+ }, [activeId, children]);
294
+
295
+ const sensors = useSensors(
296
+ useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
297
+ useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),
298
+ );
299
+
300
+ const handleDragStart = (event: DragStartEvent) => {
301
+ setActiveId(event.active.id as string | number);
302
+ };
303
+
304
+ const handleDragEnd = (event: DragEndEvent) => {
305
+ setActiveId(null);
306
+ const { active, over } = event;
307
+ if (!over || active.id === over.id) return;
308
+ const from = itemIds.indexOf(active.id as string | number);
309
+ const to = itemIds.indexOf(over.id as string | number);
310
+ if (from < 0 || to < 0) return;
311
+ onReorder?.({ from, to, id: active.id as string | number });
312
+ };
313
+
314
+ const handleDragCancel = () => {
315
+ setActiveId(null);
316
+ };
317
+
318
+ // SSR-safe reduced-motion probe; disables the overlay's drop animation.
319
+ const prefersReducedMotion =
320
+ typeof window !== 'undefined' &&
321
+ typeof window.matchMedia === 'function' &&
322
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches;
323
+
324
+ // Modifier that confines the drag transform to the live <ol> bounding box.
325
+ // A modifier is a pure `(args) => Transform`; we read the list rect from the
326
+ // internal ref rather than dnd-kit's `containerNodeRect` (which is unreliable
327
+ // through the DragOverlay portal). Memoized once — it closes over the ref,
328
+ // so it always sees the current node.
329
+ const restrictModifier = useMemo<Modifier>(
330
+ () =>
331
+ ({ transform, draggingNodeRect }) => {
332
+ const container = olRef.current?.getBoundingClientRect();
333
+ if (!draggingNodeRect || !container) return transform;
334
+ return restrictTransformToRect(transform, draggingNodeRect, container);
335
+ },
336
+ [],
337
+ );
338
+ const modifiers = restrictToContainer ? [restrictModifier] : undefined;
339
+
340
+ // Localized screen-reader announcements (Hard rule 9). Every droppable here
341
+ // IS a sortable item, so dnd-kit's own `data.sortable` supplies the slot and
342
+ // `sortableTarget` needs no help; the item's name comes from the `aria-label`
343
+ // / rendered text `<Sortable.Item>` publishes below.
344
+ const accessibility = useDragAccessibility(sortableTarget);
345
+
346
+ const ol = (
347
+ <ol
348
+ ref={mergeRefs(olRef, ref)}
349
+ className={clsx(
350
+ isGrid ? styles.grid : styles.list,
351
+ // String form only: those rules query descendants, so the <ol> can be
352
+ // its own container. The map form's container is the wrapper below.
353
+ typeof collapse === 'string' && styles.collapsible,
354
+ typeof collapse === 'string' && collapseClass[collapse],
355
+ ...collapseKeys.map((b) => stepClass[b]),
356
+ className,
357
+ )}
358
+ // In grid mode the <ol> owns the track template; inject the column
359
+ // count as a custom prop AFTER the consumer's style so it wins
360
+ // (mirrors Grid's --grid-columns). List mode leaves style untouched.
361
+ style={
362
+ isGrid
363
+ ? {
364
+ ...style,
365
+ ...Object.fromEntries(
366
+ collapseKeys.map((b) => [
367
+ `--sortable-columns-${b}`,
368
+ collapseTrackTemplate(collapseMap![b]!),
369
+ ]),
370
+ ),
371
+ ['--sortable-columns' as string]: columns,
372
+ }
373
+ : style
374
+ }
375
+ {...rest}
376
+ >
377
+ {children}
378
+ </ol>
379
+ );
380
+
381
+ // Map form only: the step rules re-template the <ol> itself, and a container
382
+ // query never matches its own container — so the size container has to be a
383
+ // wrapper. `ref`, `className`, `style` and `{...rest}` all stay on the <ol>.
384
+ const list =
385
+ collapseMap && collapseKeys.length > 0 ? <div className={styles.stepContainer}>{ol}</div> : ol;
386
+
387
+ const tree = (
388
+ <DndContext
389
+ accessibility={accessibility}
390
+ sensors={sensors}
391
+ modifiers={modifiers}
392
+ // Grid: closestCenter is dnd-kit's idiomatic pairing for a 2D sortable
393
+ // grid — the dragged cell reflows to the nearest slot without needing to
394
+ // physically overlap it (the default rectIntersection requires overlap,
395
+ // which reads as sticky/unpredictable when cells vary in span). List
396
+ // keeps the default (undefined) so its behavior is unchanged.
397
+ collisionDetection={isGrid ? closestCenter : undefined}
398
+ onDragStart={handleDragStart}
399
+ onDragEnd={handleDragEnd}
400
+ onDragCancel={handleDragCancel}
401
+ >
402
+ <SortableContext
403
+ items={itemIds}
404
+ strategy={isGrid ? rectSortingStrategy : verticalListSortingStrategy}
405
+ >
406
+ {list}
407
+ </SortableContext>
408
+ {/* The dragged item lives in a portaled, fixed-position overlay that owns
409
+ the drag + drop animation. The list <li> becomes an invisible
410
+ placeholder during drag, so a late/async order update from onReorder
411
+ can never leave a stale dnd-kit transform on a list <li> (#165). The
412
+ overlay is the *visible* drag, so it must carry the restrict modifier
413
+ too — DndContext alone constrains the underlying item transform. */}
414
+ <DragOverlay modifiers={modifiers} dropAnimation={prefersReducedMotion ? null : undefined}>
415
+ {activeChildren != null ? (
416
+ <SortableItemContext.Provider value={OVERLAY_ITEM_CONTEXT}>
417
+ <div className={clsx(styles.item, styles.overlayItem)} data-dragging="true">
418
+ {activeChildren}
419
+ </div>
420
+ </SortableItemContext.Provider>
421
+ ) : null}
422
+ </DragOverlay>
423
+ </DndContext>
424
+ );
425
+
426
+ return collapseMap && collapseKeys.length > 0 ? (
427
+ <CollapseColumnsContext.Provider value={collapseMap}>{tree}</CollapseColumnsContext.Provider>
428
+ ) : (
429
+ tree
430
+ );
431
+ });
432
+ SortableRoot.displayName = 'Sortable';
433
+
434
+ /**
435
+ * One reorderable item in a `<Sortable>`; renders an `<li>` with a stable `id`.
436
+ * @see docs/components/Sortable.md
437
+ */
438
+ export const SortableItem = forwardRef<HTMLLIElement, SortableItemProps>(function SortableItem(
439
+ { id, span, className, children, ...rest },
440
+ ref,
441
+ ) {
442
+ // Announcement label: the consumer's `aria-label`, else the item's RENDERED
443
+ // text — so a drag says "Review pricing page mocks, position 2 of 3" instead
444
+ // of dnd-kit's raw id, and a collapsed menu inside the item contributes
445
+ // nothing (see `dragLabelOf`).
446
+ const liRef = useRef<HTMLLIElement | null>(null);
447
+ const dragLabel = rest['aria-label'];
448
+ const data = useMemo(() => ({ dragLabel, dragNode: liRef }), [dragLabel]);
449
+
450
+ const {
451
+ setNodeRef,
452
+ setActivatorNodeRef,
453
+ listeners,
454
+ attributes,
455
+ transform,
456
+ transition,
457
+ isDragging,
458
+ } = useSortable({ id, data });
459
+
460
+ const hasHandle = useMemo(() => containsHandle(children), [children]);
461
+
462
+ const collapseMap = useContext(CollapseColumnsContext);
463
+
464
+ const ctxValue = useMemo<SortableItemContextValue>(
465
+ () => ({ listeners, attributes, setActivatorNodeRef }),
466
+ [listeners, attributes, setActivatorNodeRef],
467
+ );
468
+
469
+ const setRef = (node: HTMLLIElement | null) => {
470
+ liRef.current = node;
471
+ setNodeRef(node);
472
+ // When no Handle is present, the Item itself is the drag activator —
473
+ // dnd-kit uses this ref to scope keyboard / pointer events.
474
+ if (!hasHandle) setActivatorNodeRef(node);
475
+ if (typeof ref === 'function') ref(node);
476
+ else if (ref) ref.current = node;
477
+ };
478
+
479
+ return (
480
+ <SortableItemContext.Provider value={ctxValue}>
481
+ <li
482
+ ref={setRef}
483
+ style={{
484
+ transform: CSS.Transform.toString(transform),
485
+ transition,
486
+ // The DragOverlay renders the dragged item's visual; the in-list copy
487
+ // is an invisible placeholder so it never carries a stale drag/drop
488
+ // transform when onReorder commits the new order asynchronously (#165).
489
+ opacity: isDragging ? 0 : undefined,
490
+ // Grid-arrangement column span. Always stamped (default 'auto') so a
491
+ // span-less item never inherits a spanned ancestor's custom property;
492
+ // ignored by the CSS in list mode (grid-column is inert on a flex
493
+ // child). Mirrors Grid.Item.
494
+ ['--sortable-item-span' as string]: resolveGridItemSpan(span) ?? 'auto',
495
+ // Per-breakpoint clamped span for a graduated (map-form)
496
+ // `collapseBelow` ancestor — same always-stamp rationale as
497
+ // `--sortable-item-span` (custom properties inherit).
498
+ ...(collapseMap
499
+ ? Object.fromEntries(
500
+ (Object.keys(collapseMap) as CollapseBreakpoint[]).map((b) => [
501
+ `--sortable-item-span-${b}`,
502
+ resolveCollapsedGridItemSpan(span, collapseMap[b]!),
503
+ ]),
504
+ )
505
+ : undefined),
506
+ }}
507
+ data-dragging={isDragging ? 'true' : undefined}
508
+ className={clsx(styles.item, className)}
509
+ // Listeners + attributes go on the Item only when no Handle is present.
510
+ // When a Handle exists, the Handle attaches them via context.
511
+ // dnd-kit drag attrs spread BEFORE {...rest} on Item (consumer rest wins).
512
+ // The Handle does the inverse: drag attrs after rest so they cannot be
513
+ // disabled. Item is more permissive — consumer may legitimately want to
514
+ // pre-empt drag on a per-item basis.
515
+ {...(hasHandle ? {} : listeners)}
516
+ {...(hasHandle ? {} : attributes)}
517
+ {...rest}
518
+ >
519
+ {children}
520
+ </li>
521
+ </SortableItemContext.Provider>
522
+ );
523
+ });
524
+ SortableItem.displayName = 'SortableItem';
525
+
526
+ /**
527
+ * Optional drag-origin marker inside a `<Sortable.Item>`; when present, only the Handle initiates drag.
528
+ * @see docs/components/Sortable.md
529
+ */
530
+ export const SortableHandle = forwardRef<HTMLButtonElement, SortableHandleProps>(
531
+ function SortableHandle({ className, children, 'aria-label': ariaLabel, ...rest }, ref) {
532
+ const t = useTranslation();
533
+ const ctx = useContext(SortableItemContext);
534
+ if (!ctx) {
535
+ throw new Error('<Sortable.Handle> must be rendered inside a <Sortable.Item>.');
536
+ }
537
+
538
+ const setRef = (node: HTMLButtonElement | null) => {
539
+ ctx.setActivatorNodeRef(node);
540
+ if (typeof ref === 'function') ref(node);
541
+ else if (ref) ref.current = node;
542
+ };
543
+
544
+ return (
545
+ <button
546
+ ref={setRef}
547
+ type="button"
548
+ aria-label={ariaLabel || t('drag.handleLabel')}
549
+ className={clsx(styles.handle, className)}
550
+ {...rest}
551
+ // {...listeners} + {...attributes} AFTER {...rest} so consumer spread
552
+ // cannot disable drag detection. data-sortable-handle is a structural
553
+ // marker for tests / styling.
554
+ data-sortable-handle="true"
555
+ {...ctx.listeners}
556
+ {...ctx.attributes}
557
+ >
558
+ <span aria-hidden="true">{children}</span>
559
+ </button>
560
+ );
561
+ },
562
+ );
563
+ SortableHandle.displayName = 'SortableHandle';
564
+
565
+ /**
566
+ * Drag-to-reorder list (single column) with `Sortable.Item` and `Sortable.Handle`, in list or grid arrangement.
567
+ * @see docs/components/Sortable.md
568
+ */
569
+ export const Sortable = Object.assign(SortableRoot, {
570
+ Item: SortableItem,
571
+ Handle: SortableHandle,
572
+ });
@@ -0,0 +1,125 @@
1
+ // Container-aware collision detection for multi-container sortable boards
2
+ // (Kanban, SortableGroup). Pure function so it's unit-testable with synthetic
3
+ // rects; imported by both components' DndContexts.
4
+ import {
5
+ closestCorners,
6
+ pointerWithin,
7
+ type CollisionDetection,
8
+ type DroppableContainer,
9
+ } from '@dnd-kit/core';
10
+
11
+ /**
12
+ * A CONTAINER droppable (a `<Kanban.Column>` / `<SortableGroup.Group>`) as
13
+ * opposed to an ITEM droppable (a card). Containers register via plain
14
+ * `useDroppable`, so they carry no `data.sortable`; items register via
15
+ * `useSortable`, which adds it.
16
+ */
17
+ const isContainer = (droppable: DroppableContainer) => droppable.data.current?.sortable == null;
18
+
19
+ /**
20
+ * `closestCorners`, but the pointer's containing container wins first.
21
+ *
22
+ * Why: with plain `closestCorners`, every card registers as a droppable
23
+ * alongside the column containers, and ranking is by corner distance of the
24
+ * DRAGGED RECT — not by where the pointer is. Next to a tall column, an
25
+ * empty/sparse sibling column stretches (flex align-items: stretch) far
26
+ * beyond its content, so its corners sit hundreds of pixels from the dragged
27
+ * card while a same-Y card in the SOURCE column sits one column-gap away.
28
+ * The source card out-ranks the geometrically-containing target column, the
29
+ * cross-column transit is never detected, and the drop silently resolves as
30
+ * a same-column no-op (#367).
31
+ *
32
+ * Strategy:
33
+ * 1. No pointer (keyboard drags pass `pointerCoordinates: null`) → plain
34
+ * `closestCorners` over everything — keyboard behavior unchanged.
35
+ * 2. Find the container droppable the pointer is inside (`pointerWithin`
36
+ * over containers only). Containers are droppables registered via plain
37
+ * `useDroppable` — they carry no `data.sortable`; card/item droppables
38
+ * registered via `useSortable` do.
39
+ * 3. Pointer inside a container → rank with `closestCorners` restricted to
40
+ * that container plus the droppables whose center lies inside it (its own
41
+ * cards). An empty column is its only candidate, so it wins; over a card,
42
+ * the card wins; below the last card, the nearest of card/column wins —
43
+ * both resolve to "append" downstream.
44
+ * 4. Pointer in no container (board gap / outside) → plain `closestCorners`.
45
+ */
46
+ export const containerAwareClosestCorners: CollisionDetection = (args) => {
47
+ const { droppableContainers, droppableRects, pointerCoordinates } = args;
48
+ if (!pointerCoordinates) return closestCorners(args);
49
+
50
+ const containers = droppableContainers.filter(isContainer);
51
+ const within = pointerWithin({ ...args, droppableContainers: containers });
52
+ const containerId = within[0]?.id;
53
+ const containerRect = containerId != null ? droppableRects.get(containerId) : undefined;
54
+ if (containerId == null || !containerRect) return closestCorners(args);
55
+
56
+ const candidates = droppableContainers.filter((d) => {
57
+ if (d.id === containerId) return true;
58
+ const rect = droppableRects.get(d.id);
59
+ if (!rect) return false;
60
+ const cx = rect.left + rect.width / 2;
61
+ const cy = rect.top + rect.height / 2;
62
+ return (
63
+ cx >= containerRect.left &&
64
+ cx <= containerRect.right &&
65
+ cy >= containerRect.top &&
66
+ cy <= containerRect.bottom
67
+ );
68
+ });
69
+ return closestCorners({ ...args, droppableContainers: candidates });
70
+ };
71
+
72
+ /**
73
+ * True when the pointer sits outside the collective bounding box of every
74
+ * CONTAINER droppable — i.e. the drag is over unrelated page content rather
75
+ * than over the board. Callers use it to reject a drop that collision
76
+ * detection nonetheless resolved to a container (#387).
77
+ *
78
+ * It has to be asked separately because no collision detector can answer it:
79
+ * `closestCorners` — which `containerAwareClosestCorners` falls back to
80
+ * whenever the pointer is in no container — pushes a collision for EVERY
81
+ * measured droppable and uses distance only to rank them, never to reject. So
82
+ * `over` is never null, and "released nowhere" is indistinguishable from
83
+ * "released on the nearest column" from the drop handler's side.
84
+ *
85
+ * Collective bounding box, not each container's own rect: a board with a `gap`
86
+ * between columns has pointer positions inside the board but inside no column.
87
+ * Per-rect testing would cancel those, and a release in a 12px gutter means the
88
+ * column beside it — which is exactly what `closestCorners` returns. Only
89
+ * leaving the band of columns entirely is a cancel. Containers only (never the
90
+ * cards') so a pointer in a sparse column's empty space stays a valid drop,
91
+ * which is the whole point of #367.
92
+ *
93
+ * Returns false whenever it cannot tell — no pointer (keyboard drags pass
94
+ * `pointerCoordinates: null`) or nothing measured (jsdom lays nothing out) —
95
+ * so an unmeasurable board keeps committing to the nearest container instead of
96
+ * cancelling every drop.
97
+ */
98
+ export function isPointerOutsideContainers({
99
+ droppableContainers,
100
+ droppableRects,
101
+ pointerCoordinates,
102
+ }: Pick<
103
+ Parameters<CollisionDetection>[0],
104
+ 'droppableContainers' | 'droppableRects' | 'pointerCoordinates'
105
+ >): boolean {
106
+ if (!pointerCoordinates) return false;
107
+
108
+ let left = Infinity;
109
+ let top = Infinity;
110
+ let right = -Infinity;
111
+ let bottom = -Infinity;
112
+ for (const droppable of droppableContainers) {
113
+ if (!isContainer(droppable)) continue;
114
+ const rect = droppableRects.get(droppable.id);
115
+ if (!rect) continue;
116
+ left = Math.min(left, rect.left);
117
+ top = Math.min(top, rect.top);
118
+ right = Math.max(right, rect.right);
119
+ bottom = Math.max(bottom, rect.bottom);
120
+ }
121
+ if (left === Infinity) return false;
122
+
123
+ const { x, y } = pointerCoordinates;
124
+ return x < left || x > right || y < top || y > bottom;
125
+ }