@eocrm/design-system 0.0.0-stage → 0.6.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (898) hide show
  1. package/AI-PRIMER.md +341 -0
  2. package/LICENSE +202 -0
  3. package/README.md +266 -2
  4. package/docs/components/Accordion.md +114 -0
  5. package/docs/components/AgentAvatar.md +58 -0
  6. package/docs/components/Alert.md +81 -0
  7. package/docs/components/AppLayout.md +70 -0
  8. package/docs/components/Avatar.md +49 -0
  9. package/docs/components/AvatarGroup.md +47 -0
  10. package/docs/components/Badge.md +60 -0
  11. package/docs/components/Banner.md +89 -0
  12. package/docs/components/BrandIcon.md +32 -0
  13. package/docs/components/Breadcrumb.md +72 -0
  14. package/docs/components/Button.md +107 -0
  15. package/docs/components/ButtonGroup.md +78 -0
  16. package/docs/components/Calendar.md +158 -0
  17. package/docs/components/Card.md +165 -0
  18. package/docs/components/CatalogPicker.md +83 -0
  19. package/docs/components/Chart.md +114 -0
  20. package/docs/components/ChatBubble.md +55 -0
  21. package/docs/components/ChatLauncher.md +97 -0
  22. package/docs/components/Checkbox.md +55 -0
  23. package/docs/components/CircularProgress.md +53 -0
  24. package/docs/components/Cluster.md +96 -0
  25. package/docs/components/Code.md +35 -0
  26. package/docs/components/CodeBlock.md +67 -0
  27. package/docs/components/ColorPicker.md +115 -0
  28. package/docs/components/ConfirmationPopover.md +70 -0
  29. package/docs/components/Constrain.md +39 -0
  30. package/docs/components/CurrencySelect.md +57 -0
  31. package/docs/components/CursorPagination.md +43 -0
  32. package/docs/components/DashboardCanvas.md +79 -0
  33. package/docs/components/DashboardWidget.md +131 -0
  34. package/docs/components/DataTable.md +88 -0
  35. package/docs/components/DatePicker.md +68 -0
  36. package/docs/components/DateRangePicker.md +71 -0
  37. package/docs/components/DateStrip.md +56 -0
  38. package/docs/components/DefinitionList.md +82 -0
  39. package/docs/components/Divider.md +57 -0
  40. package/docs/components/Dot.md +26 -0
  41. package/docs/components/Drawer.md +94 -0
  42. package/docs/components/DropdownMenu.md +299 -0
  43. package/docs/components/EmojiPicker.md +84 -0
  44. package/docs/components/EmptyState.md +55 -0
  45. package/docs/components/EntityChip.md +102 -0
  46. package/docs/components/ErrorState.md +72 -0
  47. package/docs/components/Field.md +91 -0
  48. package/docs/components/FileUpload.md +109 -0
  49. package/docs/components/FilterChip.md +88 -0
  50. package/docs/components/FlowCanvas.md +108 -0
  51. package/docs/components/FormRow.md +31 -0
  52. package/docs/components/FormSection.md +37 -0
  53. package/docs/components/Grid.md +103 -0
  54. package/docs/components/Highlight.md +75 -0
  55. package/docs/components/HighlightedText.md +50 -0
  56. package/docs/components/IconPicker.md +134 -0
  57. package/docs/components/IconTile.md +30 -0
  58. package/docs/components/Image.md +84 -0
  59. package/docs/components/ImageCrop.md +163 -0
  60. package/docs/components/Indent.md +31 -0
  61. package/docs/components/InlineDatePicker.md +58 -0
  62. package/docs/components/InlineDateRangePicker.md +57 -0
  63. package/docs/components/Input.md +54 -0
  64. package/docs/components/Kanban.md +122 -0
  65. package/docs/components/Kbd.md +41 -0
  66. package/docs/components/Lightbox.md +105 -0
  67. package/docs/components/Link.md +65 -0
  68. package/docs/components/LinkCard.md +41 -0
  69. package/docs/components/LiquidEditor.md +84 -0
  70. package/docs/components/List.md +68 -0
  71. package/docs/components/LiveRegion.md +29 -0
  72. package/docs/components/LocaleProvider.md +25 -0
  73. package/docs/components/Logo.md +41 -0
  74. package/docs/components/Masonry.md +48 -0
  75. package/docs/components/MediaTile.md +95 -0
  76. package/docs/components/Modal.md +107 -0
  77. package/docs/components/MoneyInput.md +62 -0
  78. package/docs/components/OptionsPicker.md +123 -0
  79. package/docs/components/OtpInput.md +65 -0
  80. package/docs/components/Page.md +35 -0
  81. package/docs/components/PageHeader.md +133 -0
  82. package/docs/components/Pagination.md +44 -0
  83. package/docs/components/Palette.md +32 -0
  84. package/docs/components/PasswordInput.md +45 -0
  85. package/docs/components/PasswordStrengthMeter.md +27 -0
  86. package/docs/components/PersonDisplay.md +153 -0
  87. package/docs/components/PhoneInput.md +54 -0
  88. package/docs/components/PillMenu.md +91 -0
  89. package/docs/components/Popover.md +127 -0
  90. package/docs/components/Progress.md +56 -0
  91. package/docs/components/QrCode.md +34 -0
  92. package/docs/components/Radio.md +37 -0
  93. package/docs/components/RadioGroup.md +56 -0
  94. package/docs/components/Rail.md +191 -0
  95. package/docs/components/RelativeDateInput.md +114 -0
  96. package/docs/components/RichText.md +44 -0
  97. package/docs/components/RichTextEditor.md +112 -0
  98. package/docs/components/Screen.md +37 -0
  99. package/docs/components/ScrollArea.md +39 -0
  100. package/docs/components/Select.md +131 -0
  101. package/docs/components/SettingRow.md +98 -0
  102. package/docs/components/Skeleton.md +68 -0
  103. package/docs/components/Slider.md +92 -0
  104. package/docs/components/SlotGrid.md +55 -0
  105. package/docs/components/SocialButton.md +31 -0
  106. package/docs/components/Sortable.md +127 -0
  107. package/docs/components/SortableGroup.md +52 -0
  108. package/docs/components/Sparkline.md +51 -0
  109. package/docs/components/Split.md +76 -0
  110. package/docs/components/Stack.md +59 -0
  111. package/docs/components/StagePath.md +66 -0
  112. package/docs/components/StatGroup.md +61 -0
  113. package/docs/components/StatTile.md +58 -0
  114. package/docs/components/Sticky.md +69 -0
  115. package/docs/components/Switch.md +89 -0
  116. package/docs/components/Table.md +184 -0
  117. package/docs/components/TableOfContents.md +76 -0
  118. package/docs/components/Tabs.md +94 -0
  119. package/docs/components/Text.md +63 -0
  120. package/docs/components/Textarea.md +59 -0
  121. package/docs/components/Thread.md +52 -0
  122. package/docs/components/TimeField.md +70 -0
  123. package/docs/components/Timeline.md +57 -0
  124. package/docs/components/Title.md +54 -0
  125. package/docs/components/ToastViewport.md +61 -0
  126. package/docs/components/Tooltip.md +63 -0
  127. package/docs/components/TopBar.md +214 -0
  128. package/docs/components/Tour.md +85 -0
  129. package/docs/components/TreeView.md +113 -0
  130. package/docs/components/VisuallyHidden.md +43 -0
  131. package/docs/components/WidgetPreview.md +54 -0
  132. package/docs/components/useBelowBreakpoint.md +11 -0
  133. package/docs/components/useMonth.md +18 -0
  134. package/docs/setup.md +51 -0
  135. package/docs/theming.md +95 -0
  136. package/docs/tokens.md +123 -0
  137. package/docs/transient-state.md +56 -0
  138. package/package.json +86 -4
  139. package/src/_meta/manifest.ts +293 -0
  140. package/src/app/AppProvider.tsx +78 -0
  141. package/src/app/index.ts +3 -0
  142. package/src/app/themeTokens.ts +95 -0
  143. package/src/calendar/dateMath.ts +114 -0
  144. package/src/calendar/formatters.ts +75 -0
  145. package/src/calendar/index.ts +39 -0
  146. package/src/calendar/types.ts +36 -0
  147. package/src/calendar/useAgenda.ts +70 -0
  148. package/src/calendar/useDay.ts +51 -0
  149. package/src/calendar/useMonth.ts +82 -0
  150. package/src/calendar/useWeek.ts +62 -0
  151. package/src/calendar/weekInfo.ts +83 -0
  152. package/src/components/Accordion/Accordion.module.scss +304 -0
  153. package/src/components/Accordion/Accordion.tokens.scss +64 -0
  154. package/src/components/Accordion/Accordion.tsx +272 -0
  155. package/src/components/Accordion/AccordionContent.tsx +36 -0
  156. package/src/components/Accordion/AccordionItem.tsx +66 -0
  157. package/src/components/Accordion/AccordionTrigger.tsx +121 -0
  158. package/src/components/Accordion/context.ts +47 -0
  159. package/src/components/Accordion/index.ts +14 -0
  160. package/src/components/Alert/Alert.module.scss +92 -0
  161. package/src/components/Alert/Alert.tokens.scss +60 -0
  162. package/src/components/Alert/Alert.tsx +136 -0
  163. package/src/components/Alert/index.ts +2 -0
  164. package/src/components/AppLayout/AppLayout.module.scss +130 -0
  165. package/src/components/AppLayout/AppLayout.tokens.scss +27 -0
  166. package/src/components/AppLayout/AppLayout.tsx +211 -0
  167. package/src/components/AppLayout/index.ts +2 -0
  168. package/src/components/Avatar/AgentAvatar.module.scss +117 -0
  169. package/src/components/Avatar/AgentAvatar.tsx +122 -0
  170. package/src/components/Avatar/Avatar.module.scss +181 -0
  171. package/src/components/Avatar/Avatar.tokens.scss +107 -0
  172. package/src/components/Avatar/Avatar.tsx +210 -0
  173. package/src/components/Avatar/AvatarGroup.module.scss +128 -0
  174. package/src/components/Avatar/AvatarGroup.tsx +119 -0
  175. package/src/components/Avatar/AvatarGroupContext.tsx +20 -0
  176. package/src/components/Avatar/index.ts +6 -0
  177. package/src/components/Badge/Badge.module.scss +124 -0
  178. package/src/components/Badge/Badge.tokens.scss +74 -0
  179. package/src/components/Badge/Badge.tsx +164 -0
  180. package/src/components/Badge/index.ts +2 -0
  181. package/src/components/Banner/Banner.module.scss +73 -0
  182. package/src/components/Banner/Banner.tokens.scss +51 -0
  183. package/src/components/Banner/Banner.tsx +138 -0
  184. package/src/components/Banner/index.ts +2 -0
  185. package/src/components/BrandIcon/BrandIcon.module.scss +5 -0
  186. package/src/components/BrandIcon/BrandIcon.tsx +99 -0
  187. package/src/components/BrandIcon/index.ts +2 -0
  188. package/src/components/Breadcrumb/Breadcrumb.module.scss +32 -0
  189. package/src/components/Breadcrumb/Breadcrumb.tokens.scss +9 -0
  190. package/src/components/Breadcrumb/Breadcrumb.tsx +146 -0
  191. package/src/components/Breadcrumb/index.ts +2 -0
  192. package/src/components/Button/Button.module.scss +167 -0
  193. package/src/components/Button/Button.tokens.scss +90 -0
  194. package/src/components/Button/Button.tsx +205 -0
  195. package/src/components/Button/index.ts +2 -0
  196. package/src/components/ButtonGroup/ButtonGroup.module.scss +134 -0
  197. package/src/components/ButtonGroup/ButtonGroup.tokens.scss +42 -0
  198. package/src/components/ButtonGroup/ButtonGroup.tsx +278 -0
  199. package/src/components/ButtonGroup/ButtonGroupItem.tsx +74 -0
  200. package/src/components/ButtonGroup/context.ts +45 -0
  201. package/src/components/ButtonGroup/index.ts +2 -0
  202. package/src/components/Calendar/AgendaView.module.scss +231 -0
  203. package/src/components/Calendar/AgendaView.tsx +214 -0
  204. package/src/components/Calendar/AllDayBand.module.scss +18 -0
  205. package/src/components/Calendar/AllDayBand.tsx +75 -0
  206. package/src/components/Calendar/Calendar.module.scss +23 -0
  207. package/src/components/Calendar/Calendar.tokens.scss +262 -0
  208. package/src/components/Calendar/Calendar.tsx +370 -0
  209. package/src/components/Calendar/DayCell.module.scss +30 -0
  210. package/src/components/Calendar/DayCell.tsx +50 -0
  211. package/src/components/Calendar/DayView.module.scss +10 -0
  212. package/src/components/Calendar/DayView.tsx +163 -0
  213. package/src/components/Calendar/EventChip.module.scss +171 -0
  214. package/src/components/Calendar/EventChip.tsx +115 -0
  215. package/src/components/Calendar/HourGrid.module.scss +123 -0
  216. package/src/components/Calendar/HourGrid.tsx +381 -0
  217. package/src/components/Calendar/MonthView.module.scss +99 -0
  218. package/src/components/Calendar/MonthView.tsx +296 -0
  219. package/src/components/Calendar/TimedEvent.module.scss +205 -0
  220. package/src/components/Calendar/TimedEvent.tsx +247 -0
  221. package/src/components/Calendar/ViewSwitcher.module.scss +3 -0
  222. package/src/components/Calendar/ViewSwitcher.tsx +47 -0
  223. package/src/components/Calendar/WeekView.module.scss +10 -0
  224. package/src/components/Calendar/WeekView.tsx +137 -0
  225. package/src/components/Calendar/eventColor.ts +60 -0
  226. package/src/components/Calendar/index.ts +18 -0
  227. package/src/components/Calendar/types.ts +451 -0
  228. package/src/components/Calendar/useEventDrag.ts +783 -0
  229. package/src/components/Calendar/utils.ts +622 -0
  230. package/src/components/Card/Card.module.scss +264 -0
  231. package/src/components/Card/Card.tokens.scss +55 -0
  232. package/src/components/Card/Card.tsx +170 -0
  233. package/src/components/Card/CardBody.tsx +45 -0
  234. package/src/components/Card/CardHeader.tsx +113 -0
  235. package/src/components/Card/CardList.tsx +24 -0
  236. package/src/components/Card/CardListRow.tsx +24 -0
  237. package/src/components/Card/index.ts +7 -0
  238. package/src/components/CatalogPicker/CatalogPicker.module.scss +193 -0
  239. package/src/components/CatalogPicker/CatalogPicker.tokens.scss +26 -0
  240. package/src/components/CatalogPicker/CatalogPicker.tsx +339 -0
  241. package/src/components/CatalogPicker/index.ts +2 -0
  242. package/src/components/Chart/Chart.module.scss +287 -0
  243. package/src/components/Chart/Chart.tokens.scss +63 -0
  244. package/src/components/Chart/Chart.tsx +607 -0
  245. package/src/components/Chart/ChartLegend.tsx +99 -0
  246. package/src/components/Chart/ChartTable.tsx +62 -0
  247. package/src/components/Chart/ChartTooltip.tsx +91 -0
  248. package/src/components/Chart/chartModel.ts +689 -0
  249. package/src/components/Chart/index.ts +2 -0
  250. package/src/components/ChatBubble/ChatBubble.module.scss +93 -0
  251. package/src/components/ChatBubble/ChatBubble.tokens.scss +17 -0
  252. package/src/components/ChatBubble/ChatBubble.tsx +61 -0
  253. package/src/components/ChatBubble/ChatBubbleList.tsx +27 -0
  254. package/src/components/ChatBubble/index.ts +3 -0
  255. package/src/components/ChatLauncher/ChatLauncher.module.scss +68 -0
  256. package/src/components/ChatLauncher/ChatLauncher.tokens.scss +27 -0
  257. package/src/components/ChatLauncher/ChatLauncher.tsx +202 -0
  258. package/src/components/ChatLauncher/index.ts +2 -0
  259. package/src/components/ChatLauncher/isAtBottom.ts +12 -0
  260. package/src/components/Checkbox/Checkbox.module.scss +147 -0
  261. package/src/components/Checkbox/Checkbox.tokens.scss +44 -0
  262. package/src/components/Checkbox/Checkbox.tsx +188 -0
  263. package/src/components/Checkbox/index.ts +2 -0
  264. package/src/components/CircularProgress/CircularProgress.module.scss +133 -0
  265. package/src/components/CircularProgress/CircularProgress.tokens.scss +40 -0
  266. package/src/components/CircularProgress/CircularProgress.tsx +139 -0
  267. package/src/components/CircularProgress/index.ts +7 -0
  268. package/src/components/Cluster/Cluster.module.scss +145 -0
  269. package/src/components/Cluster/Cluster.tokens.scss +11 -0
  270. package/src/components/Cluster/Cluster.tsx +215 -0
  271. package/src/components/Cluster/index.ts +2 -0
  272. package/src/components/Code/Code.module.scss +28 -0
  273. package/src/components/Code/Code.tokens.scss +15 -0
  274. package/src/components/Code/Code.tsx +44 -0
  275. package/src/components/Code/index.ts +2 -0
  276. package/src/components/CodeBlock/CodeBlock.module.scss +146 -0
  277. package/src/components/CodeBlock/CodeBlock.tokens.scss +27 -0
  278. package/src/components/CodeBlock/CodeBlock.tsx +274 -0
  279. package/src/components/CodeBlock/highlight.ts +179 -0
  280. package/src/components/CodeBlock/index.ts +8 -0
  281. package/src/components/CodeBlock/sampleSync.ts +42 -0
  282. package/src/components/ColorPicker/ColorPicker.module.scss +286 -0
  283. package/src/components/ColorPicker/ColorPicker.tokens.scss +60 -0
  284. package/src/components/ColorPicker/ColorPicker.tsx +367 -0
  285. package/src/components/ColorPicker/ColorPickerPanel.tsx +265 -0
  286. package/src/components/ColorPicker/SVSquare.tsx +189 -0
  287. package/src/components/ColorPicker/colorMath.ts +141 -0
  288. package/src/components/ColorPicker/index.ts +6 -0
  289. package/src/components/ConfirmationPopover/ConfirmationPopover.module.scss +39 -0
  290. package/src/components/ConfirmationPopover/ConfirmationPopover.tokens.scss +13 -0
  291. package/src/components/ConfirmationPopover/ConfirmationPopover.tsx +395 -0
  292. package/src/components/ConfirmationPopover/index.ts +2 -0
  293. package/src/components/Constrain/Constrain.module.scss +99 -0
  294. package/src/components/Constrain/Constrain.tsx +79 -0
  295. package/src/components/Constrain/index.ts +2 -0
  296. package/src/components/CurrencySelect/CurrencySelect.module.scss +7 -0
  297. package/src/components/CurrencySelect/CurrencySelect.tsx +167 -0
  298. package/src/components/CurrencySelect/index.ts +3 -0
  299. package/src/components/CursorPagination/CursorPagination.module.scss +69 -0
  300. package/src/components/CursorPagination/CursorPagination.tokens.scss +32 -0
  301. package/src/components/CursorPagination/CursorPagination.tsx +121 -0
  302. package/src/components/CursorPagination/index.ts +2 -0
  303. package/src/components/DashboardCanvas/DashboardCanvas.module.scss +360 -0
  304. package/src/components/DashboardCanvas/DashboardCanvas.tokens.scss +48 -0
  305. package/src/components/DashboardCanvas/DashboardCanvas.tsx +1270 -0
  306. package/src/components/DashboardCanvas/DashboardCanvasItem.tsx +140 -0
  307. package/src/components/DashboardCanvas/DashboardCanvasSection.tsx +174 -0
  308. package/src/components/DashboardCanvas/engine.ts +363 -0
  309. package/src/components/DashboardCanvas/index.ts +9 -0
  310. package/src/components/DashboardWidget/DashboardWidget.module.scss +100 -0
  311. package/src/components/DashboardWidget/DashboardWidget.tokens.scss +16 -0
  312. package/src/components/DashboardWidget/DashboardWidget.tsx +188 -0
  313. package/src/components/DashboardWidget/index.ts +7 -0
  314. package/src/components/DataTable/BodyRow.tsx +197 -0
  315. package/src/components/DataTable/ColumnVisibilityTrigger.module.scss +7 -0
  316. package/src/components/DataTable/ColumnVisibilityTrigger.tsx +105 -0
  317. package/src/components/DataTable/DataTable.module.scss +511 -0
  318. package/src/components/DataTable/DataTable.tokens.scss +80 -0
  319. package/src/components/DataTable/DataTable.tsx +734 -0
  320. package/src/components/DataTable/HeaderCell.module.scss +215 -0
  321. package/src/components/DataTable/HeaderCell.tsx +440 -0
  322. package/src/components/DataTable/columnShift.ts +117 -0
  323. package/src/components/DataTable/index.ts +23 -0
  324. package/src/components/DataTable/pinStyle.ts +47 -0
  325. package/src/components/DataTable/reorderColumns.ts +66 -0
  326. package/src/components/DataTable/types.ts +289 -0
  327. package/src/components/DataTable/useColumnDragShift.ts +216 -0
  328. package/src/components/DataTable/useDataTable.ts +372 -0
  329. package/src/components/DataTable/useResizeHandle.ts +97 -0
  330. package/src/components/DatePicker/DatePicker.module.scss +180 -0
  331. package/src/components/DatePicker/DatePicker.tokens.scss +152 -0
  332. package/src/components/DatePicker/DatePicker.tsx +664 -0
  333. package/src/components/DatePicker/DatePickerGrid.module.scss +172 -0
  334. package/src/components/DatePicker/DatePickerGrid.tsx +341 -0
  335. package/src/components/DatePicker/InlineDatePicker.module.scss +32 -0
  336. package/src/components/DatePicker/InlineDatePicker.tsx +201 -0
  337. package/src/components/DatePicker/index.ts +4 -0
  338. package/src/components/DatePicker/utils.ts +364 -0
  339. package/src/components/DateRangePicker/DateRangePicker.module.scss +237 -0
  340. package/src/components/DateRangePicker/DateRangePicker.tokens.scss +78 -0
  341. package/src/components/DateRangePicker/DateRangePicker.tsx +720 -0
  342. package/src/components/DateRangePicker/InlineDateRangePicker.module.scss +94 -0
  343. package/src/components/DateRangePicker/InlineDateRangePicker.tsx +376 -0
  344. package/src/components/DateRangePicker/index.ts +5 -0
  345. package/src/components/DateRangePicker/utils.ts +151 -0
  346. package/src/components/DateStrip/DateStrip.module.scss +78 -0
  347. package/src/components/DateStrip/DateStrip.tokens.scss +23 -0
  348. package/src/components/DateStrip/DateStrip.tsx +205 -0
  349. package/src/components/DateStrip/index.ts +2 -0
  350. package/src/components/DefinitionList/DefinitionList.module.scss +102 -0
  351. package/src/components/DefinitionList/DefinitionList.tokens.scss +29 -0
  352. package/src/components/DefinitionList/DefinitionList.tsx +198 -0
  353. package/src/components/DefinitionList/index.ts +9 -0
  354. package/src/components/Divider/Divider.module.scss +144 -0
  355. package/src/components/Divider/Divider.tokens.scss +21 -0
  356. package/src/components/Divider/Divider.tsx +103 -0
  357. package/src/components/Divider/index.ts +2 -0
  358. package/src/components/Dot/Dot.module.scss +40 -0
  359. package/src/components/Dot/Dot.tokens.scss +4 -0
  360. package/src/components/Dot/Dot.tsx +45 -0
  361. package/src/components/Dot/index.ts +2 -0
  362. package/src/components/Drawer/Body.tsx +23 -0
  363. package/src/components/Drawer/Close.tsx +35 -0
  364. package/src/components/Drawer/Content.tsx +93 -0
  365. package/src/components/Drawer/Drawer.module.scss +232 -0
  366. package/src/components/Drawer/Drawer.tokens.scss +38 -0
  367. package/src/components/Drawer/Drawer.tsx +23 -0
  368. package/src/components/Drawer/DrawerRoot.tsx +190 -0
  369. package/src/components/Drawer/Footer.tsx +24 -0
  370. package/src/components/Drawer/Header.tsx +64 -0
  371. package/src/components/Drawer/Overlay.tsx +82 -0
  372. package/src/components/Drawer/context.ts +44 -0
  373. package/src/components/Drawer/index.ts +12 -0
  374. package/src/components/Drawer/useDragToClose.ts +149 -0
  375. package/src/components/DropdownMenu/CheckboxItem.tsx +144 -0
  376. package/src/components/DropdownMenu/Content.tsx +419 -0
  377. package/src/components/DropdownMenu/DropdownMenu.module.scss +280 -0
  378. package/src/components/DropdownMenu/DropdownMenu.tokens.scss +88 -0
  379. package/src/components/DropdownMenu/DropdownMenu.tsx +43 -0
  380. package/src/components/DropdownMenu/Group.tsx +76 -0
  381. package/src/components/DropdownMenu/Item.tsx +148 -0
  382. package/src/components/DropdownMenu/ItemIndicator.tsx +30 -0
  383. package/src/components/DropdownMenu/Radio.tsx +178 -0
  384. package/src/components/DropdownMenu/Root.tsx +100 -0
  385. package/src/components/DropdownMenu/Sub.tsx +332 -0
  386. package/src/components/DropdownMenu/Trigger.tsx +76 -0
  387. package/src/components/DropdownMenu/context.ts +65 -0
  388. package/src/components/DropdownMenu/index.ts +20 -0
  389. package/src/components/EmojiPicker/EmojiPicker.module.scss +84 -0
  390. package/src/components/EmojiPicker/EmojiPicker.tokens.scss +24 -0
  391. package/src/components/EmojiPicker/EmojiPicker.tsx +341 -0
  392. package/src/components/EmojiPicker/emojiData.ts +245 -0
  393. package/src/components/EmojiPicker/index.ts +3 -0
  394. package/src/components/EmptyState/EmptyState.module.scss +102 -0
  395. package/src/components/EmptyState/EmptyState.tokens.scss +28 -0
  396. package/src/components/EmptyState/EmptyState.tsx +112 -0
  397. package/src/components/EmptyState/index.ts +7 -0
  398. package/src/components/EntityChip/EntityChip.module.scss +275 -0
  399. package/src/components/EntityChip/EntityChip.tokens.scss +66 -0
  400. package/src/components/EntityChip/EntityChip.tsx +649 -0
  401. package/src/components/EntityChip/index.ts +10 -0
  402. package/src/components/ErrorState/ErrorState.module.scss +105 -0
  403. package/src/components/ErrorState/ErrorState.tokens.scss +32 -0
  404. package/src/components/ErrorState/ErrorState.tsx +125 -0
  405. package/src/components/ErrorState/index.ts +8 -0
  406. package/src/components/Field/Field.module.scss +46 -0
  407. package/src/components/Field/Field.tsx +185 -0
  408. package/src/components/Field/index.ts +2 -0
  409. package/src/components/FileUpload/FileUpload.module.scss +187 -0
  410. package/src/components/FileUpload/FileUpload.tokens.scss +81 -0
  411. package/src/components/FileUpload/FileUpload.tsx +569 -0
  412. package/src/components/FileUpload/formatBytes.ts +34 -0
  413. package/src/components/FileUpload/iconForFile.ts +40 -0
  414. package/src/components/FileUpload/index.ts +2 -0
  415. package/src/components/FilterChip/FilterChip.module.scss +61 -0
  416. package/src/components/FilterChip/FilterChip.tokens.scss +25 -0
  417. package/src/components/FilterChip/FilterChip.tsx +208 -0
  418. package/src/components/FilterChip/index.ts +5 -0
  419. package/src/components/FlowCanvas/FlowCanvas.module.scss +329 -0
  420. package/src/components/FlowCanvas/FlowCanvas.tokens.scss +45 -0
  421. package/src/components/FlowCanvas/FlowCanvas.tsx +1867 -0
  422. package/src/components/FlowCanvas/FlowControls.tsx +46 -0
  423. package/src/components/FlowCanvas/FlowEdge.tsx +58 -0
  424. package/src/components/FlowCanvas/FlowNode.tsx +76 -0
  425. package/src/components/FlowCanvas/edgePath.ts +85 -0
  426. package/src/components/FlowCanvas/index.ts +4 -0
  427. package/src/components/FlowCanvas/layout.ts +148 -0
  428. package/src/components/FlowCanvas/spatialNav.ts +76 -0
  429. package/src/components/FlowCanvas/types.ts +59 -0
  430. package/src/components/FlowCanvas/useViewport.ts +122 -0
  431. package/src/components/FormRow/FormRow.module.scss +2 -0
  432. package/src/components/FormRow/FormRow.tsx +37 -0
  433. package/src/components/FormRow/index.ts +2 -0
  434. package/src/components/FormSection/FormSection.module.scss +24 -0
  435. package/src/components/FormSection/FormSection.tsx +46 -0
  436. package/src/components/FormSection/index.ts +2 -0
  437. package/src/components/Grid/Grid.module.scss +162 -0
  438. package/src/components/Grid/Grid.tokens.scss +13 -0
  439. package/src/components/Grid/Grid.tsx +226 -0
  440. package/src/components/Grid/GridItem.tsx +77 -0
  441. package/src/components/Grid/index.ts +11 -0
  442. package/src/components/Highlight/Highlight.module.scss +43 -0
  443. package/src/components/Highlight/Highlight.tokens.scss +35 -0
  444. package/src/components/Highlight/Highlight.tsx +164 -0
  445. package/src/components/Highlight/HighlightOverlay.tsx +100 -0
  446. package/src/components/Highlight/index.ts +2 -0
  447. package/src/components/HighlightedText/HighlightedText.module.scss +11 -0
  448. package/src/components/HighlightedText/HighlightedText.tokens.scss +9 -0
  449. package/src/components/HighlightedText/HighlightedText.tsx +50 -0
  450. package/src/components/HighlightedText/highlightRanges.ts +44 -0
  451. package/src/components/HighlightedText/index.ts +2 -0
  452. package/src/components/IconPicker/IconPicker.module.scss +175 -0
  453. package/src/components/IconPicker/IconPicker.tokens.scss +40 -0
  454. package/src/components/IconPicker/IconPicker.tsx +629 -0
  455. package/src/components/IconPicker/index.ts +9 -0
  456. package/src/components/IconTile/IconTile.module.scss +57 -0
  457. package/src/components/IconTile/IconTile.tokens.scss +16 -0
  458. package/src/components/IconTile/IconTile.tsx +91 -0
  459. package/src/components/IconTile/index.ts +2 -0
  460. package/src/components/Image/Image.module.scss +266 -0
  461. package/src/components/Image/Image.tokens.scss +55 -0
  462. package/src/components/Image/Image.tsx +342 -0
  463. package/src/components/Image/index.ts +2 -0
  464. package/src/components/ImageCrop/ImageCrop.module.scss +274 -0
  465. package/src/components/ImageCrop/ImageCrop.tokens.scss +33 -0
  466. package/src/components/ImageCrop/ImageCrop.tsx +542 -0
  467. package/src/components/ImageCrop/cropGeometry.ts +120 -0
  468. package/src/components/ImageCrop/extractCropBlob.ts +140 -0
  469. package/src/components/ImageCrop/index.ts +11 -0
  470. package/src/components/ImageCrop/useCropPreview.ts +161 -0
  471. package/src/components/Indent/Indent.module.scss +33 -0
  472. package/src/components/Indent/Indent.tokens.scss +10 -0
  473. package/src/components/Indent/Indent.tsx +46 -0
  474. package/src/components/Indent/index.ts +2 -0
  475. package/src/components/Input/Input.module.scss +99 -0
  476. package/src/components/Input/Input.tokens.scss +54 -0
  477. package/src/components/Input/Input.tsx +105 -0
  478. package/src/components/Input/Suggestions.tsx +260 -0
  479. package/src/components/Input/index.ts +2 -0
  480. package/src/components/Kanban/Kanban.module.scss +39 -0
  481. package/src/components/Kanban/Kanban.tokens.scss +15 -0
  482. package/src/components/Kanban/Kanban.tsx +951 -0
  483. package/src/components/Kanban/index.ts +7 -0
  484. package/src/components/Kbd/Kbd.module.scss +47 -0
  485. package/src/components/Kbd/Kbd.tokens.scss +26 -0
  486. package/src/components/Kbd/Kbd.tsx +73 -0
  487. package/src/components/Kbd/index.ts +2 -0
  488. package/src/components/Lightbox/Lightbox.module.scss +283 -0
  489. package/src/components/Lightbox/Lightbox.tokens.scss +36 -0
  490. package/src/components/Lightbox/Lightbox.tsx +506 -0
  491. package/src/components/Lightbox/index.ts +2 -0
  492. package/src/components/Link/Link.module.scss +78 -0
  493. package/src/components/Link/Link.tokens.scss +28 -0
  494. package/src/components/Link/Link.tsx +114 -0
  495. package/src/components/Link/index.ts +2 -0
  496. package/src/components/LinkCard/LinkCard.module.scss +92 -0
  497. package/src/components/LinkCard/LinkCard.tokens.scss +9 -0
  498. package/src/components/LinkCard/LinkCard.tsx +72 -0
  499. package/src/components/LinkCard/index.ts +2 -0
  500. package/src/components/LiquidEditor/AutocompleteMenu.tsx +133 -0
  501. package/src/components/LiquidEditor/HighlightLayer.tsx +53 -0
  502. package/src/components/LiquidEditor/InsertVariableMenu.tsx +81 -0
  503. package/src/components/LiquidEditor/LiquidEditor.module.scss +339 -0
  504. package/src/components/LiquidEditor/LiquidEditor.tokens.scss +81 -0
  505. package/src/components/LiquidEditor/LiquidEditor.tsx +412 -0
  506. package/src/components/LiquidEditor/PreviewPane.tsx +29 -0
  507. package/src/components/LiquidEditor/caretCoordinates.ts +97 -0
  508. package/src/components/LiquidEditor/index.ts +7 -0
  509. package/src/components/LiquidEditor/liquidFilters.ts +23 -0
  510. package/src/components/LiquidEditor/liquidTokenizer.ts +235 -0
  511. package/src/components/LiquidEditor/types.ts +101 -0
  512. package/src/components/LiquidEditor/useLiquidAutocomplete.ts +178 -0
  513. package/src/components/List/List.module.scss +105 -0
  514. package/src/components/List/List.tokens.scss +42 -0
  515. package/src/components/List/List.tsx +124 -0
  516. package/src/components/List/index.ts +9 -0
  517. package/src/components/LiveRegion/LiveRegion.module.scss +3 -0
  518. package/src/components/LiveRegion/LiveRegion.tsx +116 -0
  519. package/src/components/LiveRegion/index.ts +2 -0
  520. package/src/components/Logo/Logo.module.scss +139 -0
  521. package/src/components/Logo/Logo.tokens.scss +14 -0
  522. package/src/components/Logo/Logo.tsx +126 -0
  523. package/src/components/Logo/index.ts +2 -0
  524. package/src/components/Masonry/Masonry.module.scss +42 -0
  525. package/src/components/Masonry/Masonry.tokens.scss +8 -0
  526. package/src/components/Masonry/Masonry.tsx +136 -0
  527. package/src/components/Masonry/index.ts +2 -0
  528. package/src/components/Masonry/masonryUtils.ts +42 -0
  529. package/src/components/MediaTile/MediaTile.module.scss +183 -0
  530. package/src/components/MediaTile/MediaTile.tokens.scss +60 -0
  531. package/src/components/MediaTile/MediaTile.tsx +208 -0
  532. package/src/components/MediaTile/index.ts +8 -0
  533. package/src/components/Modal/Body.tsx +27 -0
  534. package/src/components/Modal/Close.tsx +45 -0
  535. package/src/components/Modal/Content.tsx +98 -0
  536. package/src/components/Modal/Footer.tsx +28 -0
  537. package/src/components/Modal/Header.tsx +51 -0
  538. package/src/components/Modal/Modal.module.scss +262 -0
  539. package/src/components/Modal/Modal.tokens.scss +50 -0
  540. package/src/components/Modal/Modal.tsx +23 -0
  541. package/src/components/Modal/ModalRoot.tsx +299 -0
  542. package/src/components/Modal/Overlay.tsx +101 -0
  543. package/src/components/Modal/context.ts +60 -0
  544. package/src/components/Modal/index.ts +11 -0
  545. package/src/components/MoneyInput/MoneyInput.module.scss +57 -0
  546. package/src/components/MoneyInput/MoneyInput.tsx +433 -0
  547. package/src/components/MoneyInput/index.ts +2 -0
  548. package/src/components/OptionsPicker/OptionsPicker.module.scss +216 -0
  549. package/src/components/OptionsPicker/OptionsPicker.tokens.scss +68 -0
  550. package/src/components/OptionsPicker/OptionsPicker.tsx +936 -0
  551. package/src/components/OptionsPicker/index.ts +9 -0
  552. package/src/components/OtpInput/OtpInput.module.scss +69 -0
  553. package/src/components/OtpInput/OtpInput.tokens.scss +45 -0
  554. package/src/components/OtpInput/OtpInput.tsx +368 -0
  555. package/src/components/OtpInput/index.ts +2 -0
  556. package/src/components/Page/Page.module.scss +30 -0
  557. package/src/components/Page/Page.tokens.scss +11 -0
  558. package/src/components/Page/Page.tsx +53 -0
  559. package/src/components/Page/index.ts +2 -0
  560. package/src/components/PageHeader/PageHeader.module.scss +197 -0
  561. package/src/components/PageHeader/PageHeader.tokens.scss +41 -0
  562. package/src/components/PageHeader/PageHeader.tsx +310 -0
  563. package/src/components/PageHeader/index.ts +20 -0
  564. package/src/components/Pagination/Pagination.module.scss +117 -0
  565. package/src/components/Pagination/Pagination.tokens.scss +54 -0
  566. package/src/components/Pagination/Pagination.tsx +165 -0
  567. package/src/components/Pagination/index.ts +4 -0
  568. package/src/components/Pagination/paginationRange.ts +72 -0
  569. package/src/components/PasswordInput/PasswordInput.module.scss +120 -0
  570. package/src/components/PasswordInput/PasswordInput.tokens.scss +44 -0
  571. package/src/components/PasswordInput/PasswordInput.tsx +210 -0
  572. package/src/components/PasswordInput/index.ts +2 -0
  573. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.module.scss +80 -0
  574. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tokens.scss +40 -0
  575. package/src/components/PasswordStrengthMeter/PasswordStrengthMeter.tsx +96 -0
  576. package/src/components/PasswordStrengthMeter/index.ts +2 -0
  577. package/src/components/PersonDisplay/PersonDisplay.module.scss +180 -0
  578. package/src/components/PersonDisplay/PersonDisplay.tokens.scss +35 -0
  579. package/src/components/PersonDisplay/PersonDisplay.tsx +420 -0
  580. package/src/components/PersonDisplay/index.ts +10 -0
  581. package/src/components/PhoneInput/PhoneInput.module.scss +23 -0
  582. package/src/components/PhoneInput/PhoneInput.tsx +271 -0
  583. package/src/components/PhoneInput/index.ts +4 -0
  584. package/src/components/PhoneInput/phone.ts +128 -0
  585. package/src/components/PillMenu/PillMenu.module.scss +117 -0
  586. package/src/components/PillMenu/PillMenu.tokens.scss +22 -0
  587. package/src/components/PillMenu/PillMenu.tsx +324 -0
  588. package/src/components/PillMenu/index.ts +2 -0
  589. package/src/components/Popover/Anchor.tsx +37 -0
  590. package/src/components/Popover/Close.tsx +45 -0
  591. package/src/components/Popover/Content.tsx +213 -0
  592. package/src/components/Popover/Heading.tsx +33 -0
  593. package/src/components/Popover/Popover.module.scss +177 -0
  594. package/src/components/Popover/Popover.tokens.scss +22 -0
  595. package/src/components/Popover/Popover.tsx +23 -0
  596. package/src/components/Popover/PopoverRoot.tsx +75 -0
  597. package/src/components/Popover/Trigger.tsx +86 -0
  598. package/src/components/Popover/context.ts +22 -0
  599. package/src/components/Popover/index.ts +7 -0
  600. package/src/components/Progress/Progress.module.scss +110 -0
  601. package/src/components/Progress/Progress.tokens.scss +44 -0
  602. package/src/components/Progress/Progress.tsx +129 -0
  603. package/src/components/Progress/index.ts +2 -0
  604. package/src/components/QrCode/QrCode.module.scss +97 -0
  605. package/src/components/QrCode/QrCode.tokens.scss +17 -0
  606. package/src/components/QrCode/QrCode.tsx +233 -0
  607. package/src/components/QrCode/index.ts +2 -0
  608. package/src/components/QrCode/qr.ts +161 -0
  609. package/src/components/Radio/Radio.module.scss +175 -0
  610. package/src/components/Radio/Radio.tokens.scss +59 -0
  611. package/src/components/Radio/Radio.tsx +127 -0
  612. package/src/components/Radio/RadioGroup.module.scss +42 -0
  613. package/src/components/Radio/RadioGroup.tsx +120 -0
  614. package/src/components/Radio/RadioGroupContext.tsx +30 -0
  615. package/src/components/Radio/index.ts +4 -0
  616. package/src/components/Rail/Rail.module.scss +510 -0
  617. package/src/components/Rail/Rail.tokens.scss +92 -0
  618. package/src/components/Rail/Rail.tsx +287 -0
  619. package/src/components/Rail/RailCollapseToggle.tsx +57 -0
  620. package/src/components/Rail/RailFooter.tsx +17 -0
  621. package/src/components/Rail/RailGroup.tsx +728 -0
  622. package/src/components/Rail/RailGroupContext.ts +9 -0
  623. package/src/components/Rail/RailHeader.tsx +23 -0
  624. package/src/components/Rail/RailItem.tsx +119 -0
  625. package/src/components/Rail/RailSection.tsx +39 -0
  626. package/src/components/Rail/RailSpacer.tsx +19 -0
  627. package/src/components/Rail/index.ts +9 -0
  628. package/src/components/RelativeDateInput/RelativeDateInput.module.scss +15 -0
  629. package/src/components/RelativeDateInput/RelativeDateInput.tokens.scss +6 -0
  630. package/src/components/RelativeDateInput/RelativeDateInput.tsx +474 -0
  631. package/src/components/RelativeDateInput/index.ts +10 -0
  632. package/src/components/RelativeDateInput/relativeDate.ts +127 -0
  633. package/src/components/RichText/RichText.module.scss +5 -0
  634. package/src/components/RichText/RichText.tsx +70 -0
  635. package/src/components/RichText/RichTextAttachment.module.scss +82 -0
  636. package/src/components/RichText/RichTextAttachment.tsx +122 -0
  637. package/src/components/RichText/_prose.scss +79 -0
  638. package/src/components/RichText/attachmentIcon.tsx +24 -0
  639. package/src/components/RichText/engine/attachment.ts +154 -0
  640. package/src/components/RichText/engine/autolink.ts +64 -0
  641. package/src/components/RichText/engine/blockUnit.ts +174 -0
  642. package/src/components/RichText/engine/colorMarks.ts +85 -0
  643. package/src/components/RichText/engine/escape.ts +11 -0
  644. package/src/components/RichText/engine/fromHtml.ts +353 -0
  645. package/src/components/RichText/engine/fromMarkdown.ts +20 -0
  646. package/src/components/RichText/engine/inlines.ts +82 -0
  647. package/src/components/RichText/engine/listDepths.ts +32 -0
  648. package/src/components/RichText/engine/marks.ts +80 -0
  649. package/src/components/RichText/engine/mdToHtml.ts +178 -0
  650. package/src/components/RichText/engine/model.ts +157 -0
  651. package/src/components/RichText/engine/position.ts +118 -0
  652. package/src/components/RichText/engine/renderDoc.tsx +395 -0
  653. package/src/components/RichText/engine/renderLink.ts +15 -0
  654. package/src/components/RichText/engine/renderMention.ts +16 -0
  655. package/src/components/RichText/engine/safeHref.ts +22 -0
  656. package/src/components/RichText/engine/toHtml.ts +154 -0
  657. package/src/components/RichText/engine/toMarkdown.ts +97 -0
  658. package/src/components/RichText/engine/transforms.ts +434 -0
  659. package/src/components/RichText/imageMaxHeightStyle.ts +10 -0
  660. package/src/components/RichText/index.ts +31 -0
  661. package/src/components/RichTextEditor/RichTextAttachmentConfig.tsx +264 -0
  662. package/src/components/RichTextEditor/RichTextBlockControls.tsx +365 -0
  663. package/src/components/RichTextEditor/RichTextBlockMenu.tsx +162 -0
  664. package/src/components/RichTextEditor/RichTextColorMenu.tsx +115 -0
  665. package/src/components/RichTextEditor/RichTextEditor.module.scss +298 -0
  666. package/src/components/RichTextEditor/RichTextEditor.tsx +1910 -0
  667. package/src/components/RichTextEditor/RichTextImageResizer.tsx +131 -0
  668. package/src/components/RichTextEditor/RichTextLinkEditor.tsx +151 -0
  669. package/src/components/RichTextEditor/RichTextMentionMenu.tsx +99 -0
  670. package/src/components/RichTextEditor/RichTextToolbar.tsx +379 -0
  671. package/src/components/RichTextEditor/autolinkInput.ts +65 -0
  672. package/src/components/RichTextEditor/blockDrop.ts +9 -0
  673. package/src/components/RichTextEditor/blockReflow.ts +62 -0
  674. package/src/components/RichTextEditor/commands.ts +300 -0
  675. package/src/components/RichTextEditor/history.ts +93 -0
  676. package/src/components/RichTextEditor/icons.tsx +152 -0
  677. package/src/components/RichTextEditor/imageSize.ts +70 -0
  678. package/src/components/RichTextEditor/index.ts +5 -0
  679. package/src/components/RichTextEditor/input.ts +209 -0
  680. package/src/components/RichTextEditor/inputRules.ts +71 -0
  681. package/src/components/RichTextEditor/links.ts +103 -0
  682. package/src/components/RichTextEditor/mentionContext.ts +37 -0
  683. package/src/components/RichTextEditor/mentions.ts +28 -0
  684. package/src/components/RichTextEditor/preventSelectionLoss.ts +15 -0
  685. package/src/components/RichTextEditor/selection.ts +415 -0
  686. package/src/components/RichTextEditor/shortcuts.ts +44 -0
  687. package/src/components/RichTextEditor/useAnchoredFloating.ts +50 -0
  688. package/src/components/RichTextEditor/useAttachmentConfig.ts +134 -0
  689. package/src/components/RichTextEditor/useDismissOnOutsidePointerDown.ts +26 -0
  690. package/src/components/RichTextEditor/useLinkEditor.ts +107 -0
  691. package/src/components/RichTextEditor/useMention.ts +226 -0
  692. package/src/components/RichTextEditor/useOverlayRect.ts +73 -0
  693. package/src/components/RichTextEditor/useUpload.ts +246 -0
  694. package/src/components/Screen/Screen.module.scss +46 -0
  695. package/src/components/Screen/Screen.tokens.scss +20 -0
  696. package/src/components/Screen/Screen.tsx +97 -0
  697. package/src/components/Screen/index.ts +2 -0
  698. package/src/components/ScrollArea/ScrollArea.module.scss +39 -0
  699. package/src/components/ScrollArea/ScrollArea.tokens.scss +15 -0
  700. package/src/components/ScrollArea/ScrollArea.tsx +154 -0
  701. package/src/components/ScrollArea/index.ts +2 -0
  702. package/src/components/Select/Chip.tsx +45 -0
  703. package/src/components/Select/Empty.tsx +39 -0
  704. package/src/components/Select/Error.tsx +51 -0
  705. package/src/components/Select/HiddenInputs.tsx +44 -0
  706. package/src/components/Select/Listbox.tsx +557 -0
  707. package/src/components/Select/Loading.tsx +30 -0
  708. package/src/components/Select/Select.module.scss +512 -0
  709. package/src/components/Select/Select.tokens.scss +140 -0
  710. package/src/components/Select/Select.tsx +685 -0
  711. package/src/components/Select/Trigger.tsx +952 -0
  712. package/src/components/Select/context.ts +101 -0
  713. package/src/components/Select/emptyStateText.ts +19 -0
  714. package/src/components/Select/index.ts +9 -0
  715. package/src/components/Select/useSelectState.ts +157 -0
  716. package/src/components/Select/utils-types.ts +7 -0
  717. package/src/components/Select/utils.ts +122 -0
  718. package/src/components/SettingRow/SettingRow.module.scss +166 -0
  719. package/src/components/SettingRow/SettingRow.tokens.scss +37 -0
  720. package/src/components/SettingRow/SettingRow.tsx +242 -0
  721. package/src/components/SettingRow/index.ts +7 -0
  722. package/src/components/Skeleton/Skeleton.module.scss +55 -0
  723. package/src/components/Skeleton/Skeleton.tokens.scss +17 -0
  724. package/src/components/Skeleton/Skeleton.tsx +131 -0
  725. package/src/components/Skeleton/index.ts +4 -0
  726. package/src/components/Skeleton/useSkeletonVisibility.ts +95 -0
  727. package/src/components/Slider/Slider.module.scss +293 -0
  728. package/src/components/Slider/Slider.tokens.scss +98 -0
  729. package/src/components/Slider/Slider.tsx +624 -0
  730. package/src/components/Slider/index.ts +9 -0
  731. package/src/components/SlotGrid/SlotGrid.module.scss +61 -0
  732. package/src/components/SlotGrid/SlotGrid.tokens.scss +21 -0
  733. package/src/components/SlotGrid/SlotGrid.tsx +111 -0
  734. package/src/components/SlotGrid/index.ts +2 -0
  735. package/src/components/SocialButton/SocialButton.module.scss +4 -0
  736. package/src/components/SocialButton/SocialButton.tsx +40 -0
  737. package/src/components/SocialButton/index.ts +2 -0
  738. package/src/components/Sortable/Sortable.module.scss +177 -0
  739. package/src/components/Sortable/Sortable.tokens.scss +27 -0
  740. package/src/components/Sortable/Sortable.tsx +572 -0
  741. package/src/components/Sortable/containerAwareCollision.ts +125 -0
  742. package/src/components/Sortable/index.ts +13 -0
  743. package/src/components/SortableGroup/SortableGroup.module.scss +23 -0
  744. package/src/components/SortableGroup/SortableGroup.tsx +315 -0
  745. package/src/components/SortableGroup/index.ts +4 -0
  746. package/src/components/SortableGroup/moveSortableItem.ts +39 -0
  747. package/src/components/Sparkline/Sparkline.module.scss +28 -0
  748. package/src/components/Sparkline/Sparkline.tokens.scss +7 -0
  749. package/src/components/Sparkline/Sparkline.tsx +133 -0
  750. package/src/components/Sparkline/index.ts +2 -0
  751. package/src/components/Sparkline/sparklineModel.ts +119 -0
  752. package/src/components/Split/Split.module.scss +158 -0
  753. package/src/components/Split/Split.tokens.scss +10 -0
  754. package/src/components/Split/Split.tsx +231 -0
  755. package/src/components/Split/index.ts +2 -0
  756. package/src/components/Stack/Stack.module.scss +67 -0
  757. package/src/components/Stack/Stack.tokens.scss +11 -0
  758. package/src/components/Stack/Stack.tsx +100 -0
  759. package/src/components/Stack/index.ts +2 -0
  760. package/src/components/StagePath/StagePath.module.scss +255 -0
  761. package/src/components/StagePath/StagePath.tokens.scss +43 -0
  762. package/src/components/StagePath/StagePath.tsx +176 -0
  763. package/src/components/StagePath/index.ts +2 -0
  764. package/src/components/StatGroup/StatGroup.module.scss +6 -0
  765. package/src/components/StatGroup/StatGroup.tsx +70 -0
  766. package/src/components/StatGroup/StatGroupContext.ts +10 -0
  767. package/src/components/StatGroup/StatTile.module.scss +99 -0
  768. package/src/components/StatGroup/StatTile.tokens.scss +35 -0
  769. package/src/components/StatGroup/StatTile.tsx +143 -0
  770. package/src/components/StatGroup/index.ts +4 -0
  771. package/src/components/Sticky/Sticky.module.scss +98 -0
  772. package/src/components/Sticky/Sticky.tokens.scss +17 -0
  773. package/src/components/Sticky/Sticky.tsx +103 -0
  774. package/src/components/Sticky/index.ts +2 -0
  775. package/src/components/Switch/Switch.module.scss +182 -0
  776. package/src/components/Switch/Switch.tokens.scss +59 -0
  777. package/src/components/Switch/Switch.tsx +214 -0
  778. package/src/components/Switch/index.ts +2 -0
  779. package/src/components/Table/Table.module.scss +308 -0
  780. package/src/components/Table/Table.tokens.scss +79 -0
  781. package/src/components/Table/Table.tsx +381 -0
  782. package/src/components/Table/index.ts +15 -0
  783. package/src/components/TableOfContents/TableOfContents.module.scss +83 -0
  784. package/src/components/TableOfContents/TableOfContents.tokens.scss +26 -0
  785. package/src/components/TableOfContents/TableOfContents.tsx +192 -0
  786. package/src/components/TableOfContents/activeSection.ts +18 -0
  787. package/src/components/TableOfContents/index.ts +2 -0
  788. package/src/components/Tabs/Tabs.module.scss +359 -0
  789. package/src/components/Tabs/Tabs.tokens.scss +50 -0
  790. package/src/components/Tabs/Tabs.tsx +538 -0
  791. package/src/components/Tabs/index.ts +2 -0
  792. package/src/components/Text/Text.module.scss +115 -0
  793. package/src/components/Text/Text.tokens.scss +55 -0
  794. package/src/components/Text/Text.tsx +197 -0
  795. package/src/components/Text/index.ts +2 -0
  796. package/src/components/Textarea/Textarea.module.scss +94 -0
  797. package/src/components/Textarea/Textarea.tokens.scss +48 -0
  798. package/src/components/Textarea/Textarea.tsx +246 -0
  799. package/src/components/Textarea/index.ts +2 -0
  800. package/src/components/Thread/Thread.module.scss +161 -0
  801. package/src/components/Thread/Thread.tokens.scss +32 -0
  802. package/src/components/Thread/Thread.tsx +176 -0
  803. package/src/components/Thread/index.ts +2 -0
  804. package/src/components/TimeField/TimeField.module.scss +232 -0
  805. package/src/components/TimeField/TimeField.tsx +793 -0
  806. package/src/components/TimeField/index.ts +2 -0
  807. package/src/components/Timeline/Timeline.module.scss +58 -0
  808. package/src/components/Timeline/Timeline.tokens.scss +13 -0
  809. package/src/components/Timeline/Timeline.tsx +53 -0
  810. package/src/components/Timeline/index.ts +2 -0
  811. package/src/components/Title/Title.module.scss +84 -0
  812. package/src/components/Title/Title.tokens.scss +37 -0
  813. package/src/components/Title/Title.tsx +150 -0
  814. package/src/components/Title/index.ts +2 -0
  815. package/src/components/Toast/Toast.module.scss +299 -0
  816. package/src/components/Toast/Toast.tokens.scss +65 -0
  817. package/src/components/Toast/Toast.tsx +122 -0
  818. package/src/components/Toast/ToastViewport.tsx +166 -0
  819. package/src/components/Toast/api.ts +175 -0
  820. package/src/components/Toast/index.ts +5 -0
  821. package/src/components/Toast/store.ts +133 -0
  822. package/src/components/Toast/useToastTimer.ts +94 -0
  823. package/src/components/Tooltip/Tooltip.module.scss +99 -0
  824. package/src/components/Tooltip/Tooltip.tokens.scss +23 -0
  825. package/src/components/Tooltip/Tooltip.tsx +341 -0
  826. package/src/components/Tooltip/index.ts +2 -0
  827. package/src/components/TopBar/TopBar.module.scss +235 -0
  828. package/src/components/TopBar/TopBar.tokens.scss +79 -0
  829. package/src/components/TopBar/TopBar.tsx +87 -0
  830. package/src/components/TopBar/TopBarEnd.tsx +20 -0
  831. package/src/components/TopBar/TopBarIconButton.tsx +86 -0
  832. package/src/components/TopBar/TopBarSearch.tsx +319 -0
  833. package/src/components/TopBar/TopBarSearchPanel.tsx +268 -0
  834. package/src/components/TopBar/TopBarStart.tsx +20 -0
  835. package/src/components/TopBar/index.ts +11 -0
  836. package/src/components/Tour/Spotlight.tsx +121 -0
  837. package/src/components/Tour/Tour.module.scss +210 -0
  838. package/src/components/Tour/Tour.tokens.scss +58 -0
  839. package/src/components/Tour/Tour.tsx +617 -0
  840. package/src/components/Tour/index.ts +2 -0
  841. package/src/components/Tour/useTourTarget.ts +115 -0
  842. package/src/components/TreeView/TreeView.module.scss +268 -0
  843. package/src/components/TreeView/TreeView.tokens.scss +36 -0
  844. package/src/components/TreeView/TreeView.tsx +536 -0
  845. package/src/components/TreeView/index.ts +3 -0
  846. package/src/components/TreeView/treeModel.ts +224 -0
  847. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +7 -0
  848. package/src/components/VisuallyHidden/VisuallyHidden.tsx +29 -0
  849. package/src/components/VisuallyHidden/index.ts +2 -0
  850. package/src/components/WidgetPreview/WidgetPreview.module.scss +11 -0
  851. package/src/components/WidgetPreview/WidgetPreview.tokens.scss +26 -0
  852. package/src/components/WidgetPreview/WidgetPreview.tsx +36 -0
  853. package/src/components/WidgetPreview/WidgetShape.module.scss +140 -0
  854. package/src/components/WidgetPreview/WidgetShape.tsx +159 -0
  855. package/src/components/WidgetPreview/index.ts +2 -0
  856. package/src/components/_internal/Trend.tsx +27 -0
  857. package/src/components/_internal/choiceTile.scss +74 -0
  858. package/src/components/_internal/collapse.scss +10 -0
  859. package/src/components/_internal/collapse.ts +58 -0
  860. package/src/components/_internal/currency.ts +257 -0
  861. package/src/components/_internal/dragAnnouncements.ts +200 -0
  862. package/src/components/_internal/fieldWiring.ts +225 -0
  863. package/src/components/_internal/gridSpan.ts +54 -0
  864. package/src/components/_internal/isoDay.ts +35 -0
  865. package/src/components/_internal/letterKey.ts +26 -0
  866. package/src/components/_internal/overlay/focusRestore.ts +21 -0
  867. package/src/components/_internal/overlay/index.ts +12 -0
  868. package/src/components/_internal/overlay/tourHold.ts +23 -0
  869. package/src/components/_internal/overlay/useFocusTrap.ts +120 -0
  870. package/src/components/_internal/overlay/useInOverlay.ts +81 -0
  871. package/src/components/_internal/overlay/useOverlayStack.ts +232 -0
  872. package/src/components/_internal/overlay/useScrollLock.ts +112 -0
  873. package/src/components/_internal/refs.ts +48 -0
  874. package/src/components/_internal/statusColor.ts +26 -0
  875. package/src/components/_internal/timeUtils.ts +23 -0
  876. package/src/components/_internal/useAsyncOptions.ts +145 -0
  877. package/src/components/_internal/useClippedTooltip.ts +50 -0
  878. package/src/components/_internal/useControllableState.ts +50 -0
  879. package/src/components.manifest.json +1141 -0
  880. package/src/hooks/useBelowBreakpoint.ts +58 -0
  881. package/src/i18n/I18nProvider.tsx +52 -0
  882. package/src/i18n/LocaleProvider.tsx +17 -0
  883. package/src/i18n/en.ts +648 -0
  884. package/src/i18n/format.ts +71 -0
  885. package/src/i18n/index.ts +13 -0
  886. package/src/i18n/messages.ts +1275 -0
  887. package/src/i18n/ru.ts +677 -0
  888. package/src/i18n/useLocale.ts +19 -0
  889. package/src/i18n/useTranslation.ts +58 -0
  890. package/src/index.ts +913 -0
  891. package/src/palette/index.ts +2 -0
  892. package/src/palette/palette.ts +108 -0
  893. package/src/styles/dark.scss +4 -0
  894. package/src/styles/global.scss +7 -0
  895. package/src/styles/mixins.scss +143 -0
  896. package/src/styles/reset.scss +78 -0
  897. package/src/styles/tokens.scss +18 -0
  898. package/src/styles/typography.scss +44 -0
@@ -0,0 +1,225 @@
1
+ import {
2
+ cloneElement,
3
+ Fragment,
4
+ isValidElement,
5
+ useId,
6
+ type ReactElement,
7
+ type ReactNode,
8
+ } from 'react';
9
+
10
+ /**
11
+ * `Boolean(n)`, plus: an empty RE-ITERABLE container (array, `Set`, or `Map`
12
+ * used directly — NOT `Map.values()`/`.entries()`, see below) and an empty
13
+ * fragment (`<></>`) count as ABSENT rather than present. `Boolean(label)`
14
+ * alone treats both as truthy when empty, so `Field`/`SettingRow` used to render
15
+ * a real, empty `<label>` and point `aria-labelledby` at it — and a
16
+ * real-but-empty referent is authoritative in the accname algorithm, so it
17
+ * silently named the control `""` instead of falling through to anything else.
18
+ * Use this everywhere a `hasX` predicate feeds BOTH a render gate (should
19
+ * something visible exist) and an ARIA reference (does that visible thing
20
+ * actually name/describe the control) — `hasLabel`, `hasDescription`, `hasError`.
21
+ *
22
+ * Known, deliberate limits:
23
+ * - This cannot see a REAL element with empty visual content
24
+ * (`label={<span />}`) or a whitespace-only string (`label=" "`) — both are
25
+ * still truthy content as far as this function is concerned, same as
26
+ * `Boolean(x)` was. Detecting those needs rendering the element and
27
+ * inspecting its content, which this predicate does not attempt.
28
+ * - A one-shot iterator — `Map.prototype.values()`, a generator — always
29
+ * counts as PRESENT, empty or not. Round 8 tried inspecting it (spreading
30
+ * the iterator to check), which reads correctly here but then hands React
31
+ * the same, now-exhausted iterator to render — React gets nothing, so a
32
+ * non-empty generator silently produced an empty `<label>` and suppressed
33
+ * the control's own `aria-label`: this predicate's own bug, reintroduced by
34
+ * the fix for it. You cannot ask a one-shot iterator whether it is empty
35
+ * without spending it, so this only inspects containers that survive being
36
+ * read twice (arrays, `Set`, a `Map` itself — iterating any of them fresh
37
+ * each time, unlike the iterator `.values()`/`.entries()` RETURN) and
38
+ * otherwise falls back to `Boolean(n)`, which is `true` for any non-null
39
+ * object — same as an untouched iterator reaching React does. Nobody
40
+ * passes `label={someGenerator()}` on purpose; React itself dev-warns on
41
+ * both iterator and `Map` children regardless ("Using Maps as children is
42
+ * not supported").
43
+ */
44
+ export function hasContent(n: ReactNode): boolean {
45
+ // Only RE-ITERABLE containers are inspected — reading them (`[...n]`) to
46
+ // check for content doesn't consume what React later reads to render them.
47
+ // A one-shot iterator (generator, `Map.values()`/`.entries()`) is
48
+ // deliberately NOT matched here — see the "Known, deliberate limits" doc
49
+ // above. `n instanceof Map` catches a Map passed DIRECTLY (its default
50
+ // iteration yields `[k, v]` tuples — themselves arrays of ReactNode-legal
51
+ // values, so this recurses into them correctly), which is a real,
52
+ // type-legal, re-iterable input distinct from its one-shot `.values()`.
53
+ if (Array.isArray(n) || n instanceof Set || n instanceof Map) {
54
+ return [...(n as Iterable<ReactNode>)].some(hasContent);
55
+ }
56
+ if (isValidElement(n) && n.type === Fragment) {
57
+ return hasContent((n.props as { children?: ReactNode }).children);
58
+ }
59
+ return Boolean(n);
60
+ }
61
+
62
+ /** The wiring a field-like component hands to its control. Spread onto the control in render-prop form. */
63
+ export interface FieldRenderProps {
64
+ id: string;
65
+ 'aria-describedby': string | undefined;
66
+ /** Id of the label element to name the control — set only when a label is rendered. */
67
+ 'aria-labelledby': string | undefined;
68
+ 'aria-invalid': boolean | undefined;
69
+ invalid: boolean;
70
+ required: boolean;
71
+ /** Id of the label/caption element — for manual `aria-labelledby` wiring. */
72
+ labelId: string;
73
+ }
74
+
75
+ export interface FieldWiringOptions {
76
+ /** Explicit control id. Omit to let the wiring own it (auto-generated). */
77
+ id?: string;
78
+ /** Whether the caller renders a label — drives `aria-labelledby` injection. */
79
+ hasLabel: boolean;
80
+ /** Whether the caller renders a description — drives `aria-describedby` when there is no error. */
81
+ hasDescription: boolean;
82
+ /** Truthy when the caller renders an error message. */
83
+ hasError: boolean;
84
+ /** Marks the control required. */
85
+ required?: boolean;
86
+ /** Group mode (radio/checkbox sets): skip id/ARIA injection, inject only `invalid`/`required`. */
87
+ asGroup?: boolean;
88
+ }
89
+
90
+ export interface FieldWiring {
91
+ controlId: string;
92
+ labelId: string;
93
+ descriptionId: string;
94
+ errorId: string;
95
+ /** The id the control's `aria-describedby` should point at — error wins over description. */
96
+ describedBy: string | undefined;
97
+ /** The id the control's `aria-labelledby` should point at — set only when a label is rendered. */
98
+ labelledBy: string | undefined;
99
+ invalid: boolean;
100
+ /** Auto-wire a single element child, or invoke a render-prop with `field`. */
101
+ wire: (children: ReactNode | ((field: FieldRenderProps) => ReactNode)) => ReactNode;
102
+ }
103
+
104
+ /**
105
+ * Shared control wiring for `<Field>` and `<SettingRow>`: id ownership, the
106
+ * `aria-describedby` error-over-description choice, `aria-invalid`, and the
107
+ * `cloneElement` injection onto a single child.
108
+ *
109
+ * Extracted rather than copied because the `||`-not-`??` rule below is subtle
110
+ * and load-bearing for every named input in the library.
111
+ */
112
+ export function useFieldWiring({
113
+ id,
114
+ hasLabel,
115
+ hasDescription,
116
+ hasError,
117
+ required,
118
+ asGroup = false,
119
+ }: FieldWiringOptions): FieldWiring {
120
+ const reactId = useId();
121
+ const controlId = id ?? reactId;
122
+ const labelId = `${controlId}-label`;
123
+ const descriptionId = `${controlId}-description`;
124
+ const errorId = `${controlId}-error`;
125
+
126
+ const invalid = hasError;
127
+ const requiredBool = Boolean(required);
128
+ const describedBy = hasError ? errorId : hasDescription ? descriptionId : undefined;
129
+ // Single source for the labelledby value, same shape as describedBy above —
130
+ // computed once and reused by the render-prop field object, the
131
+ // cloneElement branch below, AND returned to the caller (Field's `asGroup`
132
+ // wrapper reads this instead of re-deriving `hasLabel ? labelId : undefined`
133
+ // a third time), so none of them can recompute `hasLabel` a different way
134
+ // and drift (that drift is exactly what shipped: the render-prop path and
135
+ // the cloneElement path used to each derive this independently).
136
+ const labelledBy = hasLabel ? labelId : undefined;
137
+
138
+ const field: FieldRenderProps = {
139
+ id: controlId,
140
+ 'aria-describedby': describedBy,
141
+ 'aria-labelledby': labelledBy,
142
+ 'aria-invalid': invalid || undefined,
143
+ invalid,
144
+ required: requiredBool,
145
+ labelId,
146
+ };
147
+
148
+ const wire = (children: ReactNode | ((f: FieldRenderProps) => ReactNode)): ReactNode => {
149
+ if (typeof children === 'function') return children(field);
150
+ if (!isValidElement(children)) return children;
151
+
152
+ const child = children as ReactElement<Record<string, unknown>>;
153
+ const childProps = child.props;
154
+ let injected: Record<string, unknown>;
155
+ if (asGroup) {
156
+ injected = {
157
+ invalid: childProps.invalid ?? invalid,
158
+ required: childProps.required ?? requiredBool,
159
+ };
160
+ } else {
161
+ injected = {
162
+ id: controlId,
163
+ // `||`, not `??`, on both ARIA id references: `aria-labelledby={sectionId ?? ''}`
164
+ // is ordinary consumer code, and an empty id list references nothing — it
165
+ // contributes no name and lets the computation fall through, exactly like an
166
+ // empty `aria-label`. Treating it as an explicit override would suppress
167
+ // `labelId` and leave the control anonymous, which matters more here than
168
+ // anywhere else: Field names every input in the library through
169
+ // `aria-labelledby` rather than `<label for>`. `invalid` / `required` keep `??`
170
+ // — those are booleans, where `false` is a meaningful explicit value.
171
+ 'aria-describedby': childProps['aria-describedby'] || describedBy,
172
+ invalid: childProps.invalid ?? invalid,
173
+ required: childProps.required ?? requiredBool,
174
+ };
175
+ // ROUND 7 — round 6 shipped `if (hasLabel && !childProps['aria-label'])`:
176
+ // skip injecting aria-labelledby whenever the child already carries its
177
+ // own aria-label, reasoning it as the same "child's explicit value wins"
178
+ // rule as the `||` two lines up. Both round-7 reviewers measured that
179
+ // this is the wrong fix, at the wrong altitude: `aria-describedby` is
180
+ // SUPPLEMENTARY (a consumer overriding it loses helper text — nothing
181
+ // breaks), but the accessible NAME is the control's identity, and WCAG
182
+ // 2.5.3 (Level A) requires a control's VISIBLE label text to be
183
+ // contained in that name. `<Field label="Work email"><Input
184
+ // aria-label="Email address" /></Field>` — a completely ordinary,
185
+ // defensive pattern an agent writes reflexively — computed name
186
+ // "Work email" before round 6 and "Email address" after: the visible
187
+ // text silently dropped out of the name on the library's single most
188
+ // common path. Reverted.
189
+ //
190
+ // The REAL fix is hasLabel itself: it now reads hasContent(label), not
191
+ // Boolean(label) — see that function's doc. An empty label
192
+ // (`label={<></>}`, `label={[]}`) no longer renders a `<label>` at all,
193
+ // hasLabel is correctly false, and `labelledBy` above is `undefined` —
194
+ // on BOTH this cloneElement path AND the render-prop `field` object,
195
+ // which reads the same hoisted `hasLabel` (round 6's fix could not
196
+ // reach the render-prop path at all, since that object is built before
197
+ // the child is known and has no childProps to inspect — this fix has
198
+ // no such asymmetry).
199
+ //
200
+ // No `if (hasLabel)` guard here, on purpose, verified by mutation: one
201
+ // was restored in an earlier round-7 draft and stayed green with the
202
+ // condition hardcoded `true`, and again with the `if` deleted outright
203
+ // — because `labelledBy` is already `hasLabel ? labelId : undefined`,
204
+ // so when `!hasLabel` this line reduces to `childProps['aria-labelledby']
205
+ // || undefined`, and `cloneElement` receiving an explicit `undefined`
206
+ // for a key the child never set is indistinguishable from omitting the
207
+ // key — the same argument that killed round 5's and round 6's guards
208
+ // here. Unlike those, this isn't a wrong claim shipped with a live
209
+ // gate; there's no gate left to be wrong about.
210
+ injected['aria-labelledby'] = childProps['aria-labelledby'] || labelledBy;
211
+ }
212
+ return cloneElement(child, injected);
213
+ };
214
+
215
+ return {
216
+ controlId,
217
+ labelId,
218
+ descriptionId,
219
+ errorId,
220
+ describedBy,
221
+ labelledBy,
222
+ invalid,
223
+ wire,
224
+ };
225
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Column-span vocabulary shared by `Grid.Item` and `Sortable.Item` (grid
3
+ * arrangement). Lives in `_internal` so both components reference one source of
4
+ * the fraction→track mapping without either importing the other (which would
5
+ * imply a render-composition edge in the component manifest that doesn't exist).
6
+ */
7
+
8
+ /**
9
+ * Column span for a grid cell. Numbers span that many tracks of whatever
10
+ * `columns` the parent grid declares. Fraction strings assume a 12-column
11
+ * grid (`columns={12}`): `'25%'`→3, `'33%'`→4, `'50%'`→6, `'67%'`→8,
12
+ * `'75%'`→9 tracks. `'100%'` / `'full'` span the entire row (`1 / -1`) and
13
+ * are safe in ANY grid, including auto-fit.
14
+ */
15
+ export type GridItemSpan = number | 'full' | '25%' | '33%' | '50%' | '67%' | '75%' | '100%';
16
+
17
+ /** Fraction → 12-col track count. 100%/full handled separately (1 / -1). */
18
+ const FRACTION_TRACKS: Record<Exclude<GridItemSpan, number | 'full' | '100%'>, number> = {
19
+ '25%': 3,
20
+ '33%': 4,
21
+ '50%': 6,
22
+ '67%': 8,
23
+ '75%': 9,
24
+ };
25
+
26
+ /**
27
+ * Resolve a `GridItemSpan` to a CSS `grid-column` value (or `undefined` when
28
+ * no span is set; callers substitute `'auto'`).
29
+ * - `undefined` → `undefined`
30
+ * - `'full'` / `'100%'` → `'1 / -1'`
31
+ * - number → `'span N'`
32
+ * - fraction → `'span <tracks>'`
33
+ */
34
+ export function resolveGridItemSpan(span: GridItemSpan | undefined): string | undefined {
35
+ if (span === undefined) return undefined;
36
+ if (span === 'full' || span === '100%') return '1 / -1';
37
+ if (typeof span === 'number') return `span ${span}`;
38
+ return `span ${FRACTION_TRACKS[span]}`;
39
+ }
40
+
41
+ /**
42
+ * Resolve a span against a graduated-collapse step's column count: spans that
43
+ * fit keep their track count, spans >= the step's columns clamp to the full
44
+ * row (`1 / -1`), full-row spans stay full-row, span-less stays `auto`.
45
+ */
46
+ export function resolveCollapsedGridItemSpan(
47
+ span: GridItemSpan | undefined,
48
+ columns: number,
49
+ ): string {
50
+ if (span === undefined) return 'auto';
51
+ if (span === 'full' || span === '100%' || columns <= 1) return '1 / -1';
52
+ const tracks = typeof span === 'number' ? span : FRACTION_TRACKS[span];
53
+ return tracks >= columns ? '1 / -1' : `span ${tracks}`;
54
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Calendar days as ISO `'YYYY-MM-DD'` strings, formatted in UTC so the host
3
+ * timezone can never shift a day (a booking's day belongs to the business's
4
+ * timezone, not the browser's). Used by DateStrip.
5
+ */
6
+ const ISO_DAY = /^(\d{4})-(\d{2})-(\d{2})$/;
7
+
8
+ /** `'2026-10-07'` → `Date` at 2026-10-07T00:00:00Z. Throws on anything else. */
9
+ export function parseIsoDay(iso: string): Date {
10
+ const m = ISO_DAY.exec(iso);
11
+ if (!m) throw new Error(`[isoDay] expected 'YYYY-MM-DD', got '${iso}'`);
12
+ return new Date(Date.UTC(Number(m[1]), Number(m[2]) - 1, Number(m[3])));
13
+ }
14
+
15
+ /** Format one ISO day in UTC. */
16
+ export function formatIsoDay(
17
+ iso: string,
18
+ locale: string,
19
+ options: Intl.DateTimeFormatOptions,
20
+ ): string {
21
+ return new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' }).format(parseIsoDay(iso));
22
+ }
23
+
24
+ /** Format a first..last ISO day range in UTC ("October 2026", "September – October 2026"). */
25
+ export function formatIsoRange(
26
+ first: string,
27
+ last: string,
28
+ locale: string,
29
+ options: Intl.DateTimeFormatOptions,
30
+ ): string {
31
+ const f = new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' });
32
+ return first === last
33
+ ? f.format(parseIsoDay(first))
34
+ : f.formatRange(parseIsoDay(first), parseIsoDay(last));
35
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Layout-independent letter-shortcut match (#654).
3
+ *
4
+ * `event.key` is the character the layout produced, so on a Russian layout the
5
+ * K key yields `'л'` and a `key === 'k'` check silently drops the shortcut.
6
+ * `event.code` is the physical key (`'KeyK'`) on every layout — but on a remapped
7
+ * Latin layout (AZERTY, Dvorak) it names the wrong letter. So: trust `key` when
8
+ * it is a Latin letter, fall back to `code` only when it is a non-ASCII
9
+ * character (Cyrillic, Greek, …). ASCII punctuation on a letter position is a
10
+ * real key (Dvorak's `;` sits on KeyZ), so it never falls back.
11
+ *
12
+ * No fallback while Alt is held: Windows reports AltGr as Ctrl+Alt, so AltGr+Z
13
+ * on a Polish layout (`'ż'`, `KeyZ`, ctrlKey) is typing, not ⌘Z; the same goes
14
+ * for macOS Option+letter.
15
+ *
16
+ * `letter` is a single lowercase a–z.
17
+ */
18
+ export function isLetterKey(
19
+ event: { key: string; code: string; altKey?: boolean },
20
+ letter: string,
21
+ ): boolean {
22
+ const key = event.key.toLowerCase();
23
+ if (/^[a-z]$/.test(key)) return key === letter;
24
+ const nonAscii = key.length === 1 && key > '\x7f';
25
+ return nonAscii && !event.altKey && event.code === `Key${letter.toUpperCase()}`;
26
+ }
@@ -0,0 +1,21 @@
1
+ /** Focus is "lost" when nothing live holds it: `<body>`, nothing, or a detached node. */
2
+ export function isFocusLost(): boolean {
3
+ const active = document.activeElement;
4
+ return !active || active === document.body || !active.isConnected;
5
+ }
6
+
7
+ /**
8
+ * Focus `el` on overlay close, retrying once in a microtask if the first
9
+ * `focus()` did not take. A lower overlay in `stackMode="replace"` is still
10
+ * `display: none` when the upper one closes — its `isTop` update renders just
11
+ * after that commit — so focusing an element inside it no-ops (#551). The
12
+ * retry only runs if focus is still lost by then, so it never steals focus
13
+ * from wherever something else put it.
14
+ */
15
+ export function restoreFocusTo(el: HTMLElement): void {
16
+ el.focus({ preventScroll: true });
17
+ if (document.activeElement === el) return;
18
+ queueMicrotask(() => {
19
+ if (el.isConnected && isFocusLost()) el.focus({ preventScroll: true });
20
+ });
21
+ }
@@ -0,0 +1,12 @@
1
+ export { useFocusTrap } from './useFocusTrap';
2
+ export { useInOverlay } from './useInOverlay';
3
+ export { useScrollLock } from './useScrollLock';
4
+ export {
5
+ useFloatingSurface,
6
+ useOverlayStack,
7
+ overlayStack,
8
+ type OverlayStackMode,
9
+ type OverlayStackState,
10
+ } from './useOverlayStack';
11
+ export { isFocusLost, restoreFocusTo } from './focusRestore';
12
+ export { TOUR_CURRENT_TARGET, isTourHeld } from './tourHold';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Set by Tour on the current step's found target (any step kind, modal or
3
+ * not) while the tour is open. Distinct from `data-tour-active-target`, which
4
+ * only marks interactive modal-step targets for overlay elevation (#684).
5
+ */
6
+ export const TOUR_CURRENT_TARGET = 'data-tour-current-target';
7
+
8
+ /**
9
+ * True when a floating surface must ignore a dismiss caused by `node` (a
10
+ * pointerdown target or the element focus moved to): `node` is inside the
11
+ * tour layer AND the tour's current target is inside `panel` or `trigger`.
12
+ * A tour pointing into an open menu/picker must not close it just because
13
+ * the user pressed Next or the tour focused its card (#684).
14
+ */
15
+ export function isTourHeld(
16
+ node: EventTarget | null,
17
+ panel: Element | null,
18
+ trigger: Element | null,
19
+ ): boolean {
20
+ if (!(node instanceof Element) || !node.closest('[data-tour-portal-root]')) return false;
21
+ const target = document.querySelector(`[${TOUR_CURRENT_TARGET}]`);
22
+ return !!target && (!!panel?.contains(target) || !!trigger?.contains(target));
23
+ }
@@ -0,0 +1,120 @@
1
+ import { useEffect, type RefObject } from 'react';
2
+
3
+ export const FOCUSABLE_SELECTOR = [
4
+ 'button:not([disabled])',
5
+ '[href]',
6
+ 'input:not([disabled]):not([type="hidden"])',
7
+ 'select:not([disabled])',
8
+ 'textarea:not([disabled])',
9
+ '[tabindex]:not([tabindex="-1"])',
10
+ ].join(',');
11
+
12
+ // Floating UI surfaces whose portals are direct body-siblings of our modal
13
+ // portal. Focus moving into these should not be redirected back to the modal —
14
+ // the popover / dropdown / tooltip is handling its own focus session.
15
+ // The DatePicker/DateRangePicker calendar popovers rely on the [role="dialog"]
16
+ // entry here: they move real DOM focus into body-portaled grid cells while
17
+ // open inside a Modal (unlike Select's aria-activedescendant pattern), so
18
+ // removing that entry would re-trap their keyboard users (#272).
19
+ const FLOATING_BYPASS_SELECTOR = [
20
+ '[data-popover-content]',
21
+ // RTE link-editor / attachment-config bubbles: form-like, hold their own
22
+ // focus while open inside a Modal (#274).
23
+ '[data-rte-overlay]',
24
+ '[data-dropdown-menu-content]',
25
+ '[role="tooltip"]',
26
+ '[role="menu"]',
27
+ '[role="listbox"]',
28
+ '[role="dialog"]',
29
+ ].join(',');
30
+
31
+ function getFocusables(container: HTMLElement): HTMLElement[] {
32
+ return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));
33
+ }
34
+
35
+ /**
36
+ * Focus trap: keeps Tab focus cycling inside `containerRef`. Attaches a
37
+ * `keydown` listener to detect Tab at the first/last focusable and wrap, plus
38
+ * a `focusin` listener at document level to redirect any focus that escapes
39
+ * the container back to it.
40
+ *
41
+ * `active = false` no-ops the trap (used by Modal when not top of stack — the
42
+ * inner modal mounts but only the topmost modal owns focus).
43
+ *
44
+ * `extra` (optional) — an element outside the container that joins the Tab cycle after it (Tour's interactive target).
45
+ *
46
+ * @example
47
+ * const contentRef = useRef<HTMLDivElement | null>(null);
48
+ * useFocusTrap(contentRef, open);
49
+ */
50
+ export function useFocusTrap(
51
+ containerRef: RefObject<HTMLElement | null>,
52
+ active: boolean,
53
+ extra: HTMLElement | null = null,
54
+ ): void {
55
+ useEffect(() => {
56
+ if (!active) return;
57
+ const container = containerRef.current;
58
+ if (!container) return;
59
+
60
+ // Tour's interactive target joins the cycle AFTER the container's
61
+ // focusables. Its DOM position is arbitrary, so with `extra` the cycle is
62
+ // driven manually instead of by native Tab order.
63
+ function extraFocusables(): HTMLElement[] {
64
+ if (!extra) return [];
65
+ return [extra, ...getFocusables(extra)].filter((el) => el.matches(FOCUSABLE_SELECTOR));
66
+ }
67
+
68
+ function onKeyDown(e: KeyboardEvent) {
69
+ if (e.key !== 'Tab') return;
70
+ const focusables = [...getFocusables(container!), ...extraFocusables()];
71
+ if (focusables.length === 0) {
72
+ // Zero focusables: prevent Tab from escaping the container.
73
+ e.preventDefault();
74
+ container!.focus();
75
+ return;
76
+ }
77
+ if (extra) {
78
+ const n = focusables.length;
79
+ const i = focusables.indexOf(document.activeElement as HTMLElement);
80
+ const next = i === -1 ? (e.shiftKey ? n - 1 : 0) : (i + (e.shiftKey ? -1 : 1) + n) % n;
81
+ e.preventDefault();
82
+ focusables[next]!.focus();
83
+ return;
84
+ }
85
+ const first = focusables[0]!;
86
+ const last = focusables[focusables.length - 1]!;
87
+ if (!e.shiftKey && document.activeElement === last) {
88
+ e.preventDefault();
89
+ first.focus();
90
+ } else if (e.shiftKey && document.activeElement === first) {
91
+ e.preventDefault();
92
+ last.focus();
93
+ }
94
+ // Middle of the cycle: browser handles it natively.
95
+ }
96
+
97
+ function onFocusIn(e: FocusEvent) {
98
+ const target = e.target as HTMLElement | null;
99
+ if (!target || !container) return;
100
+ if (container.contains(target)) return;
101
+ if (extra?.contains(target)) return;
102
+ // Allow focus to live inside floating UI surfaces that were opened
103
+ // from within this modal (Popover, DropdownMenu, Tooltip, nested Modal).
104
+ // Their portals are body-direct siblings of our portal — checking by
105
+ // selector instead of containment.
106
+ if (target.closest(FLOATING_BYPASS_SELECTOR)) return;
107
+ // Focus escaped — redirect to the container.
108
+ container.focus();
109
+ }
110
+
111
+ container.addEventListener('keydown', onKeyDown);
112
+ extra?.addEventListener('keydown', onKeyDown);
113
+ document.addEventListener('focusin', onFocusIn);
114
+ return () => {
115
+ container.removeEventListener('keydown', onKeyDown);
116
+ extra?.removeEventListener('keydown', onKeyDown);
117
+ document.removeEventListener('focusin', onFocusIn);
118
+ };
119
+ }, [containerRef, active, extra]);
120
+ }
@@ -0,0 +1,81 @@
1
+ import { useLayoutEffect, useState, type RefObject } from 'react';
2
+
3
+ // Overlay hosts whose descendants' floating surfaces must stack above them.
4
+ // Modal/Drawer portal roots, plus Popover.Content and DropdownMenu content
5
+ // (so a DropdownMenu/Popover/ConfirmationPopover opened from inside a Popover —
6
+ // or from a DropdownMenu item nested in one — elevates above its host instead
7
+ // of rendering behind it). Reuses the existing content markers; no new attrs.
8
+ // `[data-in-overlay]` makes elevation transitive: a surface nested inside an
9
+ // already-elevated surface (the embedded TimeField clock inside a DatePicker
10
+ // calendar that sits in a Modal, #272) elevates with its host — the host's
11
+ // marker lands on the DOM via the layout effect's setState (a second
12
+ // synchronous commit, still pre-paint) before the nested surface can open,
13
+ // so the chain is observable by the time the child's hook runs.
14
+ // Also the in-place maximized FlowCanvas ([data-flowcanvas-maximized]), so a
15
+ // consumer DropdownMenu/Select/Popover opened from its controls elevates above
16
+ // the fixed maximized surface instead of rendering behind it.
17
+ // Also Tour's portal ([data-tour-portal-root]): a Select/Popover/DropdownMenu/
18
+ // DatePicker opened from inside a Tour step's card body must elevate above
19
+ // the tour (--z-tour) instead of rendering behind it.
20
+ // Also [data-tour-active-target]: an interactive modal-tour step marks its
21
+ // `found` target element with this attribute directly (see Tour.tsx), not a
22
+ // wrapper around it — so unlike `data-in-overlay`, which must never sit on
23
+ // the reference element itself (a marked reference would self-match via
24
+ // closest() on the next recompute), this one is deliberately placed ON the
25
+ // reference. `closest()` including the start node is exactly what's wanted:
26
+ // the interactive target may BE a floating-surface trigger (e.g. a
27
+ // DropdownMenu trigger button carrying `data-tour`) or contain one, and
28
+ // either way its floating surface must elevate above the tour it was opened
29
+ // from.
30
+ const OVERLAY_PORTAL_SELECTOR =
31
+ '[data-drawer-portal-root], [data-modal-portal-root], [data-lightbox-portal-root], [data-flowcanvas-maximized], [data-popover-content], [data-dropdown-menu-content], [data-in-overlay], [data-tour-portal-root], [data-tour-active-target]';
32
+
33
+ /**
34
+ * True when `referenceRef`'s element is rendered inside an overlay host — a
35
+ * `Modal`/`Drawer`/`Lightbox`/`Tour` portal, a `Popover.Content` / `DropdownMenu`
36
+ * content panel, an interactive `Tour` step's target (`[data-tour-active-target]`),
37
+ * or ANY already-elevated surface carrying `[data-in-overlay]`
38
+ * (transitive elevation). Floating surfaces (`Select` / `Popover` /
39
+ * `DropdownMenu` / `DatePicker` / `DateRangePicker` / `TimeField` / the
40
+ * `Rail.Group` collapsed-mode flyout) use this
41
+ * to elevate their portaled content above the host — their default z-index
42
+ * sits below `--z-modal` (and at/below an open Popover, and below `--z-tour`),
43
+ * so without elevation they render behind it. Covers a kebab `DropdownMenu`,
44
+ * nested `Popover`, or `ConfirmationPopover` opened from inside a Popover
45
+ * panel; a floating surface opened from inside a `Tour` step's card body
46
+ * (`[data-tour-portal-root]`) or from an interactive modal-tour step's target
47
+ * (`[data-tour-active-target]`); and, via the transitive marker, the embedded
48
+ * `TimeField` clock inside an elevated `DatePicker` calendar (#272).
49
+ *
50
+ * Consumers MUST place `data-in-overlay` on the portaled FLOATING element,
51
+ * never on the reference element itself — `closest()` includes the start
52
+ * node, so a marked reference would self-match on the next recompute.
53
+ *
54
+ * Recomputed whenever `active` toggles (the trigger is mounted by then). Uses
55
+ * `useLayoutEffect` so the elevation attribute lands in the same pre-paint
56
+ * commit as the opened surface (no flash behind the overlay).
57
+ *
58
+ * @example
59
+ * // `ctx` is the component's own context (e.g. useSelectContext()) — but any
60
+ * // ref to the trigger or a wrapper ancestor works equally well (DatePicker/
61
+ * // DateRangePicker/TimeField pass their wrapperRef).
62
+ * const inOverlay = useInOverlay(ctx.triggerRef, ctx.open);
63
+ * // Empty-string presence idiom — React serializes `{true}` on a data-*
64
+ * // attribute as "true", so use `? '' : undefined` to match the CSS
65
+ * // `[data-in-overlay]` selector and the `data-*-content=""` convention:
66
+ * // <ul data-in-overlay={inOverlay ? '' : undefined} ...>
67
+ */
68
+ export function useInOverlay(
69
+ referenceRef: RefObject<HTMLElement | null>,
70
+ active: boolean,
71
+ ): boolean {
72
+ const [inOverlay, setInOverlay] = useState(false);
73
+ useLayoutEffect(() => {
74
+ if (!active) {
75
+ setInOverlay(false);
76
+ return;
77
+ }
78
+ setInOverlay(Boolean(referenceRef.current?.closest(OVERLAY_PORTAL_SELECTOR)));
79
+ }, [active, referenceRef]);
80
+ return inOverlay;
81
+ }