@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,235 @@
1
+ // liquidTokenizer.ts — pure, dependency-free Liquid tokenizer.
2
+ //
3
+ // Emits CONTIGUOUS tokens: tokens.map(t => t.value).join('') === source. The
4
+ // highlight overlay relies on this so its <pre> text matches the <textarea>
5
+ // character-for-character. Classification is presentational, not a parser —
6
+ // it never throws on malformed input.
7
+
8
+ export type LiquidTokenType =
9
+ | 'text' // plain text outside {{ }} / {% %}, and neutral punctuation/space inside
10
+ | 'delimiter' // {{ }} {% %}
11
+ | 'variable' // a known (or unvalidated) identifier in value position
12
+ | 'unknown' // an identifier in value position not present in knownCodes
13
+ | 'filter' // an identifier immediately after `|`
14
+ | 'string' // "…" or '…'
15
+ | 'number' // 42, 3.14
16
+ | 'keyword' // if, for, in, and, or, …
17
+ | 'operator'; // | == != <= >= < > = . : , ( )
18
+
19
+ export interface LiquidToken {
20
+ type: LiquidTokenType;
21
+ value: string;
22
+ /** Start index in the source string (inclusive). */
23
+ start: number;
24
+ /** End index in the source string (exclusive). */
25
+ end: number;
26
+ }
27
+
28
+ const KEYWORDS = new Set([
29
+ 'if',
30
+ 'elsif',
31
+ 'else',
32
+ 'endif',
33
+ 'unless',
34
+ 'endunless',
35
+ 'case',
36
+ 'when',
37
+ 'endcase',
38
+ 'for',
39
+ 'endfor',
40
+ 'in',
41
+ 'break',
42
+ 'continue',
43
+ 'and',
44
+ 'or',
45
+ 'not',
46
+ 'contains',
47
+ 'assign',
48
+ 'capture',
49
+ 'endcapture',
50
+ 'true',
51
+ 'false',
52
+ 'nil',
53
+ 'empty',
54
+ 'null',
55
+ ]);
56
+
57
+ const IDENT_START = /[A-Za-z_]/;
58
+ const IDENT_CHAR = /[A-Za-z0-9_]/;
59
+ const DIGIT = /[0-9]/;
60
+
61
+ /**
62
+ * Tokenize a Liquid template string for highlighting + unknown-variable
63
+ * detection.
64
+ *
65
+ * @param source The raw template string.
66
+ * @param knownCodes When provided and non-empty, a root identifier in value
67
+ * position that is not in the set is typed `unknown`. Codes may be dotted
68
+ * paths (e.g., "event.type"); the root identifier (first segment before the
69
+ * first dot) is derived for membership testing. Omit (or pass an empty set)
70
+ * to never flag — the caller cannot assert validity.
71
+ */
72
+ export function tokenize(source: string, knownCodes?: ReadonlySet<string>): LiquidToken[] {
73
+ const tokens: LiquidToken[] = [];
74
+ const n = source.length;
75
+ let i = 0;
76
+ const hasKnown = knownCodes !== undefined && knownCodes.size > 0;
77
+ // #304: `code` is a PATH — "event.type" makes the ROOT `event` known. A
78
+ // reference is checked by its root identifier only, so membership is
79
+ // tested against the set of first dotted segments.
80
+ const knownRoots = hasKnown ? new Set([...knownCodes!].map((c) => c.split('.')[0])) : undefined;
81
+ // #304/#310: `{% for item in … %}` and `{% assign total = … %}` declare a
82
+ // name — collect declared names as the pass encounters them so later
83
+ // references (in tags and {{ }} bodies) aren't flagged unknown. Single
84
+ // forward pass: a use BEFORE its declaration stays flagged — acceptable
85
+ // ceiling, generated snippets always declare first. Names are not scoped
86
+ // to their loop/tag (lenient false negatives on out-of-scope use).
87
+ const declaredVars = new Set<string>();
88
+
89
+ const push = (type: LiquidTokenType, start: number, end: number) => {
90
+ if (end > start) tokens.push({ type, value: source.slice(start, end), start, end });
91
+ };
92
+
93
+ while (i < n) {
94
+ const isOpen = source[i] === '{' && (source[i + 1] === '{' || source[i + 1] === '%');
95
+ if (!isOpen) {
96
+ // Accumulate plain text up to the next tag open or EOF.
97
+ const start = i;
98
+ while (i < n && !(source[i] === '{' && (source[i + 1] === '{' || source[i + 1] === '%'))) {
99
+ i += 1;
100
+ }
101
+ push('text', start, i);
102
+ continue;
103
+ }
104
+
105
+ // Tag: emit the opening delimiter, then the interior, then the close.
106
+ const isOutput = source[i + 1] === '{';
107
+ const close = isOutput ? '}}' : '%}';
108
+ push('delimiter', i, i + 2);
109
+ i += 2;
110
+
111
+ const interiorEnd = (() => {
112
+ const idx = source.indexOf(close, i);
113
+ return idx === -1 ? n : idx;
114
+ })();
115
+
116
+ // `expectFilter` is set right after a `|` so the next identifier is a filter.
117
+ // `seenValue` tracks whether we've already consumed the leading value
118
+ // identifier in this tag (so only the ROOT identifier is unknown-checked).
119
+ let expectFilter = false;
120
+ let seenValue = false;
121
+ // Set right after the `for` / `assign` keyword in a `{% %}` tag — the
122
+ // next identifier is the declared name. Any other intervening keyword
123
+ // cancels the capture so a keyword-named declaration ({% for case in x %})
124
+ // can't mis-record the following identifier.
125
+ let expectDeclaration = false;
126
+ // For `{% if … %}` the first identifier is the tag-name keyword.
127
+
128
+ while (i < interiorEnd) {
129
+ const c = source[i];
130
+
131
+ if (c === ' ' || c === '\t' || c === '\n' || c === '\r') {
132
+ const start = i;
133
+ while (i < interiorEnd && /\s/.test(source[i])) i += 1;
134
+ push('text', start, i);
135
+ continue;
136
+ }
137
+
138
+ if (c === '"' || c === "'") {
139
+ const start = i;
140
+ i += 1;
141
+ while (i < interiorEnd && source[i] !== c) i += 1;
142
+ if (i < interiorEnd) i += 1; // closing quote
143
+ push('string', start, i);
144
+ continue;
145
+ }
146
+
147
+ if (DIGIT.test(c)) {
148
+ const start = i;
149
+ while (i < interiorEnd && (DIGIT.test(source[i]) || source[i] === '.')) i += 1;
150
+ push('number', start, i);
151
+ continue;
152
+ }
153
+
154
+ if (IDENT_START.test(c)) {
155
+ const start = i;
156
+ i += 1;
157
+ while (i < interiorEnd && IDENT_CHAR.test(source[i])) i += 1;
158
+ const word = source.slice(start, i);
159
+ const isDottedProperty = start > 0 && source[start - 1] === '.';
160
+
161
+ if (expectFilter) {
162
+ push('filter', start, i);
163
+ expectFilter = false;
164
+ } else if (KEYWORDS.has(word)) {
165
+ push('keyword', start, i);
166
+ expectDeclaration = !isOutput && (word === 'for' || word === 'assign');
167
+ } else if (isDottedProperty) {
168
+ push('variable', start, i); // neutral property access; not unknown-checked
169
+ } else {
170
+ if (expectDeclaration) declaredVars.add(word);
171
+ const unknown =
172
+ hasKnown &&
173
+ !seenValue &&
174
+ !expectDeclaration &&
175
+ !knownRoots!.has(word) &&
176
+ !declaredVars.has(word);
177
+ // Only the leading value identifier is the "root"; subsequent ones
178
+ // (rare) are treated as variables but not unknown-checked.
179
+ push(unknown ? 'unknown' : 'variable', start, i);
180
+ seenValue = true;
181
+ expectDeclaration = false;
182
+ }
183
+ continue;
184
+ }
185
+
186
+ if (c === '|') {
187
+ push('operator', i, i + 1);
188
+ expectFilter = true;
189
+ i += 1;
190
+ continue;
191
+ }
192
+
193
+ // Multi-char operators (==, !=, <=, >=) then single punctuation.
194
+ const two = source.slice(i, i + 2);
195
+ if (['==', '!=', '<=', '>='].includes(two)) {
196
+ push('operator', i, i + 2);
197
+ i += 2;
198
+ continue;
199
+ }
200
+ if ('<>=.,:()'.includes(c)) {
201
+ push('operator', i, i + 1);
202
+ i += 1;
203
+ continue;
204
+ }
205
+
206
+ // Anything else (neutral) — emit as text so the stream stays contiguous.
207
+ push('text', i, i + 1);
208
+ i += 1;
209
+ }
210
+
211
+ // Closing delimiter (if present).
212
+ if (interiorEnd < n) {
213
+ push('delimiter', interiorEnd, interiorEnd + 2);
214
+ i = interiorEnd + 2;
215
+ } else {
216
+ i = n;
217
+ }
218
+ }
219
+
220
+ return tokens;
221
+ }
222
+
223
+ /**
224
+ * The root variable codes referenced in `{{ }}` / `{% %}` that are NOT in
225
+ * `knownCodes` — i.e. the names the editor flags. Empty when `knownCodes` is
226
+ * omitted/empty. Drives the footer "unknown variable" warning.
227
+ */
228
+ export function unknownVariables(source: string, knownCodes: ReadonlySet<string>): string[] {
229
+ if (knownCodes.size === 0) return [];
230
+ const seen = new Set<string>();
231
+ for (const t of tokenize(source, knownCodes)) {
232
+ if (t.type === 'unknown') seen.add(t.value);
233
+ }
234
+ return [...seen];
235
+ }
@@ -0,0 +1,101 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ /** A variable the editor knows about — drives the insert menu, autocomplete, and unknown flagging. */
4
+ export interface LiquidVariable {
5
+ /** Token inserted and matched, e.g. `"first_name"` → referenced as `{{ first_name }}`. */
6
+ code: string;
7
+ /**
8
+ * Human label shown in the picker + autocomplete. Defaults to `code`.
9
+ *
10
+ * An EMPTY string counts as unset: the label is a menu item's only name
11
+ * source, and `code` is here precisely so every item has something readable.
12
+ */
13
+ label?: string;
14
+ /** Optional type hint rendered as a muted tag in suggestions, e.g. `"text"` | `"date"`. */
15
+ type?: string;
16
+ /** Optional group header that sections the picker + autocomplete. */
17
+ group?: string;
18
+ /**
19
+ * Optional human description. Surfaces as a second muted line in the insert
20
+ * menu and autocomplete suggestions, and in the footer when the caret sits
21
+ * on this variable's reference.
22
+ */
23
+ description?: string;
24
+ /**
25
+ * Marks an array/collection variable meant to be iterated, not interpolated.
26
+ * The insert menu drops a `{% for item in code %}{{ item }}{% endfor %}`
27
+ * snippet instead of `{{ code }}`, and menus show a muted "list" tag.
28
+ * Default `false`.
29
+ */
30
+ collection?: boolean;
31
+ }
32
+
33
+ /** Drives the preview pane chrome. */
34
+ export type LiquidPreviewStatus = 'idle' | 'loading' | 'error';
35
+
36
+ /** Where the preview pane sits relative to the editor. */
37
+ export type LiquidPreviewPlacement = 'bottom' | 'right';
38
+
39
+ export interface LiquidEditorProps {
40
+ /** Controlled template source. */
41
+ value: string;
42
+ /** Fires on every edit (typing, paste, variable insert, autocomplete accept). */
43
+ onChange: (value: string) => void;
44
+ /** Available variables → insert menu, autocomplete, unknown flagging. */
45
+ variables?: LiquidVariable[];
46
+ /** Underline `{{ vars }}` not present in `variables`. Default `true` (no-op when `variables` empty). */
47
+ flagUnknownVariables?: boolean;
48
+ /** External error visual (red border) — set from a backend Liquid syntax error. Default `false`. */
49
+ invalid?: boolean;
50
+ /** External error message shown in the footer. Pairs with `invalid`. */
51
+ error?: ReactNode;
52
+ /** Consumer-rendered preview output. When set (or `previewStatus` ≠ 'idle'), the pane shows. */
53
+ preview?: ReactNode;
54
+ /** Preview pane chrome. Default `'idle'`. */
55
+ previewStatus?: LiquidPreviewStatus;
56
+ /** Preview pane position. Default `'bottom'`. */
57
+ previewPlacement?: LiquidPreviewPlacement;
58
+ /** Show the line-number gutter. Default `true`. */
59
+ showLineNumbers?: boolean;
60
+ /** Show the toolbar (variable-insert menu). Default `true`. */
61
+ showToolbar?: boolean;
62
+ /**
63
+ * Custom action buttons rendered in the toolbar, right-aligned just before the
64
+ * "Insert variable" button (e.g. a Docs / Help link). Pass `<Button size="sm">`
65
+ * elements (or a fragment of them); a `ghost` variant pairs well next to the
66
+ * bordered "Insert variable" button. Only renders when `showToolbar` is true.
67
+ */
68
+ toolbarActions?: ReactNode;
69
+ /** Filter names offered in autocomplete after `|`. Defaults to a common Liquid set. */
70
+ filters?: string[];
71
+ /** Minimum visible rows. Default `4`. */
72
+ minRows?: number;
73
+ /** Maximum visible rows before the editor scrolls internally. Default unbounded. */
74
+ maxRows?: number;
75
+ /** Read-only: caret + selection allowed, no edits. Default `false`. */
76
+ readOnly?: boolean;
77
+ /** Disabled: non-interactive + dimmed. Default `false`. */
78
+ disabled?: boolean;
79
+ /** Optional id forwarded to the textarea (for `<Field>` / label association). */
80
+ id?: string;
81
+ /** Optional name forwarded to the textarea. */
82
+ name?: string;
83
+ /** Placeholder shown when empty. */
84
+ placeholder?: string;
85
+ /**
86
+ * Accessible label (defaults to the i18n `liquidEditor.editorLabel` when
87
+ * omitted OR empty — an empty string is not an explicit name).
88
+ */
89
+ 'aria-label'?: string;
90
+ /** Id of an external label element. */
91
+ 'aria-labelledby'?: string;
92
+ /**
93
+ * Id(s) of external description element(s). Merged with the component's own
94
+ * footer description (the `error` / unknown-variable message), so a screen
95
+ * reader announces both. You usually don't need this — the footer is wired
96
+ * automatically; pass it only to add an extra external description.
97
+ */
98
+ 'aria-describedby'?: string;
99
+ /** Extra class on the root wrapper. */
100
+ className?: string;
101
+ }
@@ -0,0 +1,178 @@
1
+ import { useCallback, useMemo, useState } from 'react';
2
+ import type { LiquidVariable } from './types';
3
+
4
+ /** Whether the caret context expects a variable name or a filter name. */
5
+ export type AutocompleteKind = 'variable' | 'filter';
6
+
7
+ export interface AutocompleteContext {
8
+ /** Variable position (value slot) vs filter position (right after a `|`). */
9
+ kind: AutocompleteKind;
10
+ /** The identifier prefix already typed (may be empty). */
11
+ query: string;
12
+ /** Index in the value where the current word starts. */
13
+ wordStart: number;
14
+ }
15
+
16
+ // #304: the QUERY walk includes dots so a dotted code ("event.type") matches
17
+ // while the user types past the root. Only the walk-back + validity check
18
+ // use it — tokenization/filter detection are unaffected. Exported so callers
19
+ // that need to walk the same "variable reference" word (e.g. the footer's
20
+ // caret-variable lookup) share one definition instead of a second literal.
21
+ export const QUERY_CHAR = /[A-Za-z0-9_.]/;
22
+
23
+ /**
24
+ * Inspect the value + caret and decide if/what to autocomplete. Returns null
25
+ * when the caret is not inside an open `{{ }}` / `{% %}` (no intervening close).
26
+ *
27
+ * @param value The full editor source.
28
+ * @param caret The caret index (`selectionStart`).
29
+ */
30
+ export function getAutocompleteContext(value: string, caret: number): AutocompleteContext | null {
31
+ // Find the nearest opener before the caret.
32
+ const open = Math.max(value.lastIndexOf('{{', caret - 1), value.lastIndexOf('{%', caret - 1));
33
+ if (open === -1) return null;
34
+ // If a close occurs between the opener and the caret, we're outside.
35
+ const closeBetween = Math.max(
36
+ value.lastIndexOf('}}', caret - 1),
37
+ value.lastIndexOf('%}', caret - 1),
38
+ );
39
+ if (closeBetween > open) return null;
40
+
41
+ // Walk back from the caret over identifier chars to get the current word.
42
+ let wordStart = caret;
43
+ while (wordStart > open + 2 && QUERY_CHAR.test(value[wordStart - 1])) wordStart -= 1;
44
+ const query = value.slice(wordStart, caret);
45
+ if (/[^A-Za-z0-9_.]/.test(query)) return null;
46
+
47
+ // Look back (skipping spaces) for a `|` → filter context.
48
+ let j = wordStart - 1;
49
+ while (j > open && value[j] === ' ') j -= 1;
50
+ const kind: AutocompleteKind = value[j] === '|' ? 'filter' : 'variable';
51
+
52
+ return { kind, query, wordStart };
53
+ }
54
+
55
+ /**
56
+ * Replace the word at `ctx.wordStart` (up to the caret) with `completion`.
57
+ *
58
+ * @returns The next value and the caret position after the inserted completion.
59
+ */
60
+ export function applyCompletion(
61
+ value: string,
62
+ caret: number,
63
+ ctx: { wordStart: number; query: string },
64
+ completion: string,
65
+ ): { value: string; caret: number } {
66
+ const before = value.slice(0, ctx.wordStart);
67
+ const after = value.slice(caret);
68
+ const next = before + completion + after;
69
+ return { value: next, caret: before.length + completion.length };
70
+ }
71
+
72
+ export interface AutocompleteItem {
73
+ /** The text inserted on accept. */
74
+ value: string;
75
+ /** Display label. */
76
+ label: string;
77
+ /** Optional type tag (variables only). */
78
+ type?: string;
79
+ /** Optional group header (variables only). */
80
+ group?: string;
81
+ /** Optional description shown as a muted second line (variables only). */
82
+ description?: string;
83
+ /** Collection flag → "list" tag (variables only). */
84
+ collection?: boolean;
85
+ }
86
+
87
+ export interface UseLiquidAutocompleteArgs {
88
+ /** Variables offered in value position. */
89
+ variables: LiquidVariable[];
90
+ /** Filter names offered after a `|`. */
91
+ filters: readonly string[];
92
+ /** Gate the menu off entirely (read-only / disabled editors). */
93
+ enabled: boolean;
94
+ }
95
+
96
+ export interface AutocompleteState {
97
+ /** Whether the listbox should be shown. */
98
+ open: boolean;
99
+ /** The filtered suggestions for the current context. */
100
+ items: AutocompleteItem[];
101
+ /** Index of the highlighted suggestion. */
102
+ activeIndex: number;
103
+ /** The caret context that produced `items` (null when closed). */
104
+ context: AutocompleteContext | null;
105
+ }
106
+
107
+ /**
108
+ * Stateful autocomplete controller. `recompute(value, caret)` is called after
109
+ * every edit / caret move; `move`, `close` drive keyboard handling. The
110
+ * orchestrator reads `state.context` to apply a completion via
111
+ * {@link applyCompletion}.
112
+ *
113
+ * @param args Variables, filter names, and an `enabled` gate.
114
+ */
115
+ export function useLiquidAutocomplete({ variables, filters, enabled }: UseLiquidAutocompleteArgs) {
116
+ const [state, setState] = useState<AutocompleteState>({
117
+ open: false,
118
+ items: [],
119
+ activeIndex: 0,
120
+ context: null,
121
+ });
122
+
123
+ const variableItems = useMemo<AutocompleteItem[]>(
124
+ () =>
125
+ variables.map((v) => ({
126
+ value: v.code,
127
+ // `||`, not `??`. This is the SAME prop as InsertVariableMenu's, and it
128
+ // feeds `AutocompleteMenu`'s `<span>{item.label}</span>` — a
129
+ // `role="option"`'s only name source. `label: ''` rendered a blank
130
+ // option, and the docs in `types.ts` and AI-PRIMER.md promise it cannot.
131
+ label: v.label || v.code,
132
+ type: v.type,
133
+ group: v.group,
134
+ description: v.description,
135
+ collection: v.collection,
136
+ })),
137
+ [variables],
138
+ );
139
+
140
+ const recompute = useCallback(
141
+ (value: string, caret: number) => {
142
+ if (!enabled) {
143
+ setState((s) => (s.open ? { ...s, open: false } : s));
144
+ return;
145
+ }
146
+ const ctx = getAutocompleteContext(value, caret);
147
+ if (!ctx) {
148
+ setState((s) => (s.open ? { ...s, open: false, context: null } : s));
149
+ return;
150
+ }
151
+ const q = ctx.query.toLowerCase();
152
+ const items =
153
+ ctx.kind === 'filter'
154
+ ? filters
155
+ .filter((f) => f.toLowerCase().startsWith(q))
156
+ .map((f) => ({ value: f, label: f }))
157
+ : variableItems.filter(
158
+ (it) => it.value.toLowerCase().startsWith(q) || it.label.toLowerCase().startsWith(q),
159
+ );
160
+ setState({ open: items.length > 0, items, activeIndex: 0, context: ctx });
161
+ },
162
+ [enabled, filters, variableItems],
163
+ );
164
+
165
+ const move = useCallback((delta: number) => {
166
+ setState((s) => {
167
+ if (!s.open || s.items.length === 0) return s;
168
+ const next = (s.activeIndex + delta + s.items.length) % s.items.length;
169
+ return { ...s, activeIndex: next };
170
+ });
171
+ }, []);
172
+
173
+ const close = useCallback(() => {
174
+ setState((s) => (s.open ? { ...s, open: false } : s));
175
+ }, []);
176
+
177
+ return { state, recompute, move, close };
178
+ }
@@ -0,0 +1,105 @@
1
+ @use './List.tokens';
2
+
3
+ .list {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--list-gap-sm);
7
+
8
+ // UA reset — <ul>/<ol> ship with default margin and padding.
9
+ // stylelint-disable-next-line property-disallowed-list -- UA reset for list default margin
10
+ margin: 0;
11
+ padding: 0;
12
+ list-style: none;
13
+ line-height: var(--list-line-height);
14
+ }
15
+
16
+ // Set on this list's own markers, not on the list, so a nested body-size List
17
+ // (rendered inside .content) keeps the :root body values (#711).
18
+ .list[data-size='heading'] > .item > .marker {
19
+ --list-marker-height: var(--list-heading-marker-height);
20
+ --list-marker-width: var(--list-heading-marker-width);
21
+ --list-bullet-size: var(--list-heading-bullet-size);
22
+ --list-number-font-size: var(--list-heading-number-font-size);
23
+ --list-badge-size: var(--list-heading-badge-size);
24
+ --list-badge-radius: var(--list-heading-badge-radius);
25
+ --list-badge-font-size: var(--list-heading-badge-font-size);
26
+ }
27
+
28
+ .list[data-variant='number'] {
29
+ // Nested <ol>s start a fresh counter instance, so numbering restarts per list.
30
+ counter-reset: list-item-number;
31
+ }
32
+
33
+ .list[data-variant='number'] > .item {
34
+ counter-increment: list-item-number;
35
+ }
36
+
37
+ .list[data-gap='xs'] {
38
+ gap: var(--list-gap-xs);
39
+ }
40
+
41
+ .list[data-gap='md'] {
42
+ gap: var(--list-gap-md);
43
+ }
44
+
45
+ .item {
46
+ display: flex;
47
+ align-items: flex-start;
48
+ gap: var(--list-marker-gap);
49
+ }
50
+
51
+ // One line tall, so a marker centres on the FIRST text line of a multi-line item.
52
+ .marker {
53
+ display: flex;
54
+ flex: none;
55
+ align-items: center;
56
+ justify-content: center;
57
+ min-width: var(--list-marker-width);
58
+ height: var(--list-marker-height);
59
+ color: var(--list-marker-fg);
60
+ }
61
+
62
+ .bullet {
63
+ width: var(--list-bullet-size);
64
+ height: var(--list-bullet-size);
65
+ border-radius: 50%;
66
+ background: currentcolor;
67
+ }
68
+
69
+ .number::before,
70
+ .badge::before {
71
+ content: counter(list-item-number);
72
+ }
73
+
74
+ .number {
75
+ font-size: var(--list-number-font-size);
76
+ font-weight: var(--list-number-font-weight);
77
+ font-variant-numeric: tabular-nums;
78
+ }
79
+
80
+ .badge {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ flex: none;
85
+ width: var(--list-badge-size);
86
+ height: var(--list-badge-size);
87
+ border-radius: var(--list-badge-radius);
88
+ background: var(--list-badge-bg);
89
+ color: var(--list-badge-fg);
90
+ font-size: var(--list-badge-font-size);
91
+ font-weight: var(--list-badge-font-weight);
92
+ font-variant-numeric: tabular-nums;
93
+ line-height: 1;
94
+ }
95
+
96
+ // Block, not flex: inline children (text + <code>) must flow as one line of prose.
97
+ // min-width: 0 lets long words wrap inside the flex row instead of overflowing.
98
+ .content {
99
+ min-width: 0;
100
+ }
101
+
102
+ // A nested list sits under its parent's text; padding, not margin, keeps the layout rule.
103
+ .list[data-nested='true'] {
104
+ padding-block-start: var(--list-gap-xs);
105
+ }
@@ -0,0 +1,42 @@
1
+ // List.tokens.scss — Component-scoped tokens for <List>. Item gap per size, marker column, bullet dot, plain-number marker and the badge number.
2
+ :root {
3
+ // Row gap per `gap` size
4
+ --list-gap-xs: var(--space-1);
5
+ --list-gap-sm: var(--space-2);
6
+ --list-gap-md: var(--space-3);
7
+
8
+ // Marker column — hanging indent; item text wraps under itself, not the marker
9
+ --list-marker-gap: var(--space-2);
10
+ --list-marker-width: var(--size-badge);
11
+ --list-line-height: var(--line-height-normal);
12
+ --list-marker-height: calc(var(--list-line-height) * 1em);
13
+
14
+ // Marker colour — muted, a graphic/text on the page surface
15
+ --list-marker-fg: var(--color-fg-muted);
16
+
17
+ // Bullet dot
18
+ --list-bullet-size: var(--size-badge-dot);
19
+
20
+ // Plain number
21
+ --list-number-font-weight: var(--font-weight-medium);
22
+ --list-number-font-size: 1em;
23
+
24
+ // Badge number
25
+ --list-badge-size: var(--size-badge);
26
+ --list-badge-radius: var(--radius-full);
27
+ --list-badge-bg: var(--color-accent-bg-subtle);
28
+ --list-badge-fg: var(--color-accent);
29
+ --list-badge-font-size: var(--font-size-xs);
30
+ --list-badge-font-weight: var(--font-weight-semibold);
31
+
32
+ // size="heading" — marker scaled to the first line of a Title size="xl" (20px x tight line height).
33
+ // Derived from the same globals Title.tokens.scss aliases, not from --title-* themselves: those are only
34
+ // emitted with Title's lazily loaded stylesheet, so they may be undefined when a List renders without a Title.
35
+ --list-heading-marker-height: calc(var(--line-height-tight) * var(--font-size-xl));
36
+ --list-heading-marker-width: var(--space-6);
37
+ --list-heading-bullet-size: var(--space-2);
38
+ --list-heading-number-font-size: var(--font-size-lg);
39
+ --list-heading-badge-size: var(--space-6);
40
+ --list-heading-badge-radius: var(--radius-sm);
41
+ --list-heading-badge-font-size: var(--font-size-md);
42
+ }