frappe-ui 1.0.0-beta.2 → 1.0.0-beta.21

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 (692) hide show
  1. package/experimental/FloatingWindow/FloatingWindow.cy.ts +328 -0
  2. package/experimental/FloatingWindow/FloatingWindow.vue +303 -0
  3. package/experimental/FloatingWindow/index.ts +8 -0
  4. package/experimental/FloatingWindow/types.ts +31 -0
  5. package/experimental/FloatingWindow/useFloatingWindow.ts +236 -0
  6. package/experimental/MultiEmailInput/MultiEmailInput.cy.ts +155 -0
  7. package/experimental/MultiEmailInput/MultiEmailInput.vue +472 -0
  8. package/experimental/MultiEmailInput/index.ts +17 -0
  9. package/experimental/MultiEmailInput/stories/AsyncSuggestions.vue +54 -0
  10. package/experimental/MultiEmailInput/stories/Basic.vue +18 -0
  11. package/experimental/MultiEmailInput/stories/CustomChip.vue +39 -0
  12. package/experimental/MultiEmailInput/stories/Labeling.vue +28 -0
  13. package/experimental/MultiEmailInput/types.ts +138 -0
  14. package/experimental/MultiEmailInput/utils.ts +60 -0
  15. package/experimental.ts +12 -0
  16. package/frappe/Billing/SignupBanner.vue +1 -1
  17. package/frappe/Billing/TrialBanner.vue +1 -1
  18. package/frappe/DataImport/DataImport.vue +1 -1
  19. package/frappe/DataImport/DataImportList.vue +1 -1
  20. package/frappe/DataImport/ImportSteps.vue +6 -6
  21. package/frappe/DataImport/MappingStep.vue +1 -1
  22. package/frappe/DataImport/PreviewStep.vue +9 -9
  23. package/frappe/DataImport/TemplateModal.vue +1 -1
  24. package/frappe/DataImport/UploadStep.vue +5 -5
  25. package/frappe/Filter/Filter.vue +1 -1
  26. package/frappe/Help/HelpModal.vue +1 -1
  27. package/frappe/Link/stories/Suffix.vue +2 -2
  28. package/frappe/Onboarding/GettingStartedBanner.vue +1 -1
  29. package/frappe/drive/components/AppSwitcher.vue +1 -1
  30. package/frappe/drive/components/InfoDialog.vue +3 -3
  31. package/frappe/drive/components/MoveDialog.vue +2 -2
  32. package/frappe/drive/components/Select/Select.vue +2 -2
  33. package/frappe/drive/components/ShareDialog.vue +1 -1
  34. package/frappe/telemetry/index.ts +88 -14
  35. package/frappe/telemetry/pulse.ts +78 -164
  36. package/frappe/telemetry/telemetry.test.ts +13 -79
  37. package/icons/IconPicker.vue +1 -1
  38. package/package.json +104 -34
  39. package/src/components/Alert/Alert.md +4 -0
  40. package/src/components/Alert/Alert.vue +4 -4
  41. package/src/components/Autocomplete/Autocomplete.vue +6 -6
  42. package/src/components/Avatar/Avatar.md +4 -0
  43. package/src/components/Avatar/Avatar.vue +23 -4
  44. package/src/components/Badge/Badge.api.md +1 -1
  45. package/src/components/Badge/Badge.cy.ts +34 -16
  46. package/src/components/Badge/Badge.md +20 -4
  47. package/src/components/Badge/Badge.vue +60 -45
  48. package/src/components/Badge/stories/CallMeta.vue +35 -0
  49. package/src/components/Badge/stories/EventStatus.vue +16 -0
  50. package/src/components/Badge/stories/ListStatus.vue +91 -0
  51. package/src/components/Badge/stories/Reactions.vue +33 -0
  52. package/src/components/Badge/stories/RowTags.vue +39 -0
  53. package/src/components/Badge/types.ts +1 -2
  54. package/src/components/BottomSheet/BottomSheet.api.md +57 -0
  55. package/src/components/BottomSheet/BottomSheet.vue +232 -0
  56. package/src/components/BottomSheet/index.ts +6 -0
  57. package/src/components/BottomSheet/types.ts +23 -0
  58. package/src/components/Breadcrumbs/Breadcrumbs.md +4 -0
  59. package/src/components/Breadcrumbs/Breadcrumbs.vue +3 -3
  60. package/src/components/Button/Button.api.md +37 -32
  61. package/src/components/Button/Button.cy.ts +18 -2
  62. package/src/components/Button/Button.md +20 -8
  63. package/src/components/Button/Button.vue +304 -284
  64. package/src/components/Button/stories/InlineActions.vue +10 -0
  65. package/src/components/Button/stories/LiveClassCard.vue +34 -0
  66. package/src/components/Button/stories/SectionAction.vue +17 -0
  67. package/src/components/Button/stories/SectionControls.vue +28 -0
  68. package/src/components/Button/stories/SelectionToolbar.vue +20 -0
  69. package/src/components/Button/stories/StackedActions.vue +10 -0
  70. package/src/components/Button/types.ts +38 -32
  71. package/src/components/Calendar/Calendar.api.md +16 -16
  72. package/src/components/Calendar/Calendar.vue +100 -73
  73. package/src/components/Calendar/CalendarDaily.vue +21 -20
  74. package/src/components/Calendar/CalendarMonthEvent.vue +30 -9
  75. package/src/components/Calendar/CalendarMonthly.vue +60 -39
  76. package/src/components/Calendar/CalendarTimeMarker.vue +9 -8
  77. package/src/components/Calendar/CalendarWeekDayEvent.vue +98 -42
  78. package/src/components/Calendar/CalendarWeekly.vue +77 -41
  79. package/src/components/Calendar/EventModalContent.vue +32 -16
  80. package/src/components/Calendar/NewEventModal.vue +19 -16
  81. package/src/components/Calendar/ShowMoreCalendarEvent.vue +11 -17
  82. package/src/components/Calendar/{calendarUtils.js → calendarUtils.ts} +76 -52
  83. package/src/components/Calendar/composables/{useCalendarData.js → useCalendarData.ts} +23 -11
  84. package/src/components/Calendar/composables/{useEventModal.js → useEventModal.ts} +16 -12
  85. package/src/components/Calendar/index.ts +12 -2
  86. package/src/components/Calendar/stories/CustomHeader.vue +1 -1
  87. package/src/components/Calendar/types.ts +106 -0
  88. package/src/components/Calendar/{useEventBase.js → useEventBase.ts} +40 -26
  89. package/src/components/Card.vue +2 -2
  90. package/src/components/Charts/ECharts.vue +1 -1
  91. package/src/components/Charts/NumberChart.vue +7 -7
  92. package/src/components/Charts/eChartOptions.ts +28 -13
  93. package/src/components/Checkbox/Checkbox.api.md +6 -0
  94. package/src/components/Checkbox/Checkbox.cy.ts +10 -2
  95. package/src/components/Checkbox/Checkbox.md +28 -0
  96. package/src/components/Checkbox/Checkbox.vue +9 -22
  97. package/src/components/Checkbox/stories/Group.vue +27 -0
  98. package/src/components/Checkbox/stories/HorizontalGroup.vue +24 -0
  99. package/src/components/Checkbox/stories/SettingRow.vue +23 -0
  100. package/src/components/Checkbox/stories/WithDescription.vue +27 -0
  101. package/src/components/Checkbox/types.ts +7 -0
  102. package/src/components/CodeEditor/CodeEditor.api.md +139 -0
  103. package/src/components/CodeEditor/CodeEditor.cy.ts +160 -0
  104. package/src/components/CodeEditor/CodeEditor.md +104 -0
  105. package/src/components/CodeEditor/CodeEditor.vue +556 -0
  106. package/src/components/CodeEditor/CodePreview.test.ts +49 -0
  107. package/src/components/CodeEditor/CodePreview.vue +45 -0
  108. package/src/components/CodeEditor/index.ts +17 -0
  109. package/src/components/CodeEditor/languages.ts +63 -0
  110. package/src/components/CodeEditor/stories/Default.vue +16 -0
  111. package/src/components/CodeEditor/stories/Labeling.vue +25 -0
  112. package/src/components/CodeEditor/stories/MaxHeight.vue +24 -0
  113. package/src/components/CodeEditor/stories/Preview.vue +36 -0
  114. package/src/components/CodeEditor/stories/Sizes.vue +15 -0
  115. package/src/components/CodeEditor/stories/Variants.vue +13 -0
  116. package/src/components/CodeEditor/theme.ts +272 -0
  117. package/src/components/CodeEditor/types.ts +69 -0
  118. package/src/components/Combobox/Combobox.api.md +19 -20
  119. package/src/components/Combobox/Combobox.cy.ts +54 -14
  120. package/src/components/Combobox/Combobox.md +4 -0
  121. package/src/components/Combobox/Combobox.vue +233 -247
  122. package/src/components/Combobox/ComboboxResults.vue +1 -1
  123. package/src/components/Combobox/stories/Clearable.vue +2 -2
  124. package/src/components/Combobox/stories/CreateNew.vue +1 -1
  125. package/src/components/Combobox/stories/Footer.vue +10 -2
  126. package/src/components/Combobox/stories/InDialog.vue +1 -1
  127. package/src/components/Combobox/types.ts +8 -29
  128. package/src/components/CommandPalette/CommandPaletteItem.vue +1 -1
  129. package/src/components/ContextMenu/ContextMenu.api.md +52 -0
  130. package/src/components/ContextMenu/ContextMenu.cy.ts +191 -0
  131. package/src/components/ContextMenu/ContextMenu.md +25 -0
  132. package/src/components/ContextMenu/ContextMenu.vue +106 -0
  133. package/src/components/ContextMenu/index.ts +2 -0
  134. package/src/components/ContextMenu/stories/FileList.vue +105 -0
  135. package/src/components/ContextMenu/stories/Groups.vue +95 -0
  136. package/src/components/ContextMenu/stories/Simple.vue +72 -0
  137. package/src/components/ContextMenu/types.ts +39 -0
  138. package/src/components/DatePicker/CalendarPanel.vue +128 -86
  139. package/src/components/DatePicker/DatePicker.vue +3 -9
  140. package/src/components/DatePicker/DateRangePicker.vue +4 -8
  141. package/src/components/DatePicker/DateTimePicker.cy.ts +4 -2
  142. package/src/components/DatePicker/DateTimePicker.vue +3 -9
  143. package/src/components/DatePicker/composables.ts +15 -37
  144. package/src/components/DatePicker/stories/Range.vue +1 -1
  145. package/src/components/DatePicker/types.ts +1 -1
  146. package/src/components/DesktopShell/DesktopShell.api.md +40 -0
  147. package/src/components/DesktopShell/DesktopShell.cy.ts +39 -0
  148. package/src/components/DesktopShell/DesktopShell.md +31 -0
  149. package/src/components/DesktopShell/DesktopShell.vue +81 -0
  150. package/src/components/DesktopShell/index.ts +3 -0
  151. package/src/components/DesktopShell/stories/Default.vue +97 -0
  152. package/src/components/DesktopShell/types.ts +2 -0
  153. package/src/components/Dialog/Dialog.api.md +7 -8
  154. package/src/components/Dialog/Dialog.md +4 -0
  155. package/src/components/Dialog/Dialog.vue +8 -7
  156. package/src/components/Dialog/stories/CommandPalette.vue +1 -1
  157. package/src/components/Dialog/stories/Wizard.vue +1 -1
  158. package/src/components/Dialogs.vue +11 -9
  159. package/src/components/Divider/Divider.api.md +1 -1
  160. package/src/components/Divider/Divider.md +4 -0
  161. package/src/components/Dropdown/Dropdown.api.md +10 -35
  162. package/src/components/Dropdown/Dropdown.md +10 -6
  163. package/src/components/Dropdown/Dropdown.vue +33 -47
  164. package/src/components/Dropdown/stories/{05_KebabMenu.vue → KebabMenu.vue} +3 -1
  165. package/src/components/Dropdown/stories/{06_UserMenu.vue → UserMenu.vue} +1 -1
  166. package/src/components/Dropdown/types.ts +25 -189
  167. package/src/components/Duration/Duration.api.md +92 -0
  168. package/src/components/Duration/Duration.cy.ts +183 -0
  169. package/src/components/Duration/Duration.md +98 -0
  170. package/src/components/Duration/Duration.vue +114 -0
  171. package/src/components/Duration/duration.ts +185 -0
  172. package/src/components/Duration/index.ts +8 -0
  173. package/src/components/Duration/stories/Default.vue +10 -0
  174. package/src/components/Duration/stories/Formats.vue +16 -0
  175. package/src/components/Duration/stories/RealWorld.vue +50 -0
  176. package/src/components/Duration/stories/Sizes.vue +15 -0
  177. package/src/components/Duration/stories/States.vue +21 -0
  178. package/src/components/Duration/types.ts +52 -0
  179. package/src/components/ErrorMessage/ErrorMessage.cy.ts +1 -1
  180. package/src/components/ErrorMessage/ErrorMessage.md +4 -0
  181. package/src/components/ErrorMessage/ErrorMessage.vue +1 -1
  182. package/src/components/FileUploader/FileUploader.api.md +36 -11
  183. package/src/components/FileUploader/FileUploader.cy.ts +66 -0
  184. package/src/components/FileUploader/FileUploader.md +4 -1
  185. package/src/components/FileUploader/FileUploader.vue +147 -106
  186. package/src/components/FileUploader/index.ts +6 -0
  187. package/src/components/FileUploader/types.ts +43 -0
  188. package/src/components/FormControl/FormControl.api.md +3 -4
  189. package/src/components/FormControl/FormControl.md +4 -0
  190. package/src/components/FormControl/stories/RealForm.vue +3 -3
  191. package/src/components/FormLabel.vue +5 -8
  192. package/src/components/HoverCard/HoverCard.api.md +100 -0
  193. package/src/components/HoverCard/HoverCard.cy.ts +103 -0
  194. package/src/components/HoverCard/HoverCard.md +52 -0
  195. package/src/components/HoverCard/HoverCard.vue +91 -0
  196. package/src/components/HoverCard/index.ts +2 -0
  197. package/src/components/HoverCard/stories/Arrow.vue +28 -0
  198. package/src/components/HoverCard/stories/Delays.vue +16 -0
  199. package/src/components/HoverCard/stories/Example.vue +28 -0
  200. package/src/components/HoverCard/types.ts +47 -0
  201. package/src/components/Icon/Icon.cy.ts +78 -0
  202. package/src/components/Icon/Icon.vue +50 -0
  203. package/src/components/Icon/index.ts +1 -0
  204. package/src/components/InputLabeling/InputDescription.vue +1 -1
  205. package/src/components/InputLabeling/InputError.vue +1 -1
  206. package/src/components/InputLabeling/InputLabel.vue +21 -7
  207. package/src/components/InputLabeling/RequiredIndicator.vue +1 -1
  208. package/src/components/ItemListRow/ItemListRow.vue +1 -1
  209. package/src/components/ItemListRow/stories/RowStates.vue +1 -1
  210. package/src/components/KeyboardShortcut.vue +4 -8
  211. package/src/components/KeyboardShortcutsModal/KeyboardShortcutsModal.api.md +22 -14
  212. package/src/components/KeyboardShortcutsModal/KeyboardShortcutsModal.vue +2 -2
  213. package/src/components/ListFilter/ListFilter.api.md +5 -6
  214. package/src/components/ListFilter/ListFilter.vue +161 -57
  215. package/src/components/ListFilter/NestedPopover.vue +17 -10
  216. package/src/components/ListFilter/SearchComplete.vue +31 -38
  217. package/src/components/ListItem.vue +1 -1
  218. package/src/components/ListView/ListEmptyState.vue +1 -1
  219. package/src/components/ListView/ListGroupHeader.vue +2 -2
  220. package/src/components/ListView/ListRow.vue +1 -1
  221. package/src/components/ListView/ListSelectBanner.vue +1 -1
  222. package/src/components/ListView/ListView.api.md +322 -6
  223. package/src/components/ListView/index.ts +25 -0
  224. package/src/components/ListView/stories/CustomList.vue +1 -1
  225. package/src/components/ListView/stories/GroupedRows.vue +1 -1
  226. package/src/components/LoadingIndicator.vue +13 -22
  227. package/src/components/LoadingText.vue +3 -13
  228. package/src/components/{Dropdown/DropdownMenuList.vue → Menu/Menu.vue} +110 -75
  229. package/src/components/{Dropdown/DropdownMenuItemContent.vue → Menu/MenuItemContent.vue} +23 -33
  230. package/src/components/{Dropdown/DropdownRenderContent.vue → Menu/MenuRenderContent.vue} +1 -1
  231. package/src/components/Menu/types.ts +225 -0
  232. package/src/components/{Dropdown → Menu}/utils.ts +36 -40
  233. package/src/components/MobileNav/MobileNav.api.md +70 -0
  234. package/src/components/MobileNav/MobileNav.cy.ts +89 -0
  235. package/src/components/MobileNav/MobileNav.md +34 -0
  236. package/src/components/MobileNav/MobileNav.vue +15 -0
  237. package/src/components/MobileNav/MobileNavItem.vue +125 -0
  238. package/src/components/MobileNav/index.ts +4 -0
  239. package/src/components/MobileNav/stories/Default.vue +40 -0
  240. package/src/components/MobileNav/types.ts +33 -0
  241. package/src/components/MobileShell/MobileShell.api.md +23 -0
  242. package/src/components/MobileShell/MobileShell.cy.ts +25 -0
  243. package/src/components/MobileShell/MobileShell.md +24 -0
  244. package/src/components/MobileShell/MobileShell.vue +41 -0
  245. package/src/components/MobileShell/index.ts +3 -0
  246. package/src/components/MobileShell/stories/Default.vue +75 -0
  247. package/src/components/MobileShell/types.ts +7 -0
  248. package/src/components/MonthPicker/MonthPicker.cy.ts +16 -0
  249. package/src/components/MonthPicker/MonthPicker.vue +19 -8
  250. package/src/components/MultiSelect/MultiSelect.api.md +3 -4
  251. package/src/components/MultiSelect/MultiSelect.md +42 -10
  252. package/src/components/MultiSelect/MultiSelect.vue +199 -227
  253. package/src/components/MultiSelect/MultiSelectResults.vue +1 -1
  254. package/src/components/MultiSelect/stories/Members.vue +1 -1
  255. package/src/components/MultiSelect/stories/TagsTrigger.vue +3 -3
  256. package/src/components/MultiSelect/types.ts +3 -3
  257. package/src/components/PageHeader/PageHeader.api.md +112 -0
  258. package/src/components/PageHeader/PageHeader.cy.ts +68 -0
  259. package/src/components/PageHeader/PageHeader.md +25 -0
  260. package/src/components/PageHeader/PageHeader.vue +13 -0
  261. package/src/components/PageHeader/PageHeaderBackButton.vue +29 -0
  262. package/src/components/PageHeader/PageHeaderBase.vue +51 -0
  263. package/src/components/PageHeader/PageHeaderMobile.vue +68 -0
  264. package/src/components/PageHeader/PageHeaderMobileTitle.vue +16 -0
  265. package/src/components/PageHeader/PageHeaderTarget.vue +13 -0
  266. package/src/components/PageHeader/PageHeaderTitle.vue +12 -0
  267. package/src/components/PageHeader/index.ts +7 -0
  268. package/src/components/PageHeader/stories/Default.vue +19 -0
  269. package/src/components/PageHeader/stories/Mobile.vue +24 -0
  270. package/src/components/PageHeader/target.ts +19 -0
  271. package/src/components/PageHeader/types.ts +19 -0
  272. package/src/components/Password/Password.md +4 -0
  273. package/src/components/Password/Password.vue +2 -2
  274. package/src/components/Popover/Popover.api.md +126 -42
  275. package/src/components/Popover/Popover.cy.ts +425 -41
  276. package/src/components/Popover/Popover.md +99 -4
  277. package/src/components/Popover/Popover.vue +288 -215
  278. package/src/components/Popover/index.ts +8 -1
  279. package/src/components/Popover/stories/Arrow.vue +16 -0
  280. package/src/components/Popover/stories/Bare.vue +20 -0
  281. package/src/components/Popover/stories/Click.vue +7 -4
  282. package/src/components/Popover/stories/Controlled.vue +22 -0
  283. package/src/components/Popover/stories/Dismissible.vue +19 -0
  284. package/src/components/Popover/stories/MatchTriggerWidth.vue +16 -0
  285. package/src/components/Popover/stories/SideAlign.vue +17 -0
  286. package/src/components/Popover/types.ts +101 -23
  287. package/src/components/Progress/Progress.cy.ts +2 -2
  288. package/src/components/Progress/Progress.md +4 -0
  289. package/src/components/Progress/Progress.vue +4 -4
  290. package/src/components/Rail/Rail.api.md +91 -0
  291. package/src/components/Rail/Rail.cy.ts +84 -0
  292. package/src/components/Rail/Rail.md +30 -0
  293. package/src/components/Rail/Rail.vue +16 -0
  294. package/src/components/Rail/RailItem.vue +134 -0
  295. package/src/components/Rail/RailItemBadge.vue +64 -0
  296. package/src/components/Rail/index.ts +2 -0
  297. package/src/components/Rail/stories/Default.vue +44 -0
  298. package/src/components/Rail/types.ts +37 -0
  299. package/src/components/Rating/Rating.md +4 -0
  300. package/src/components/Rating/Rating.vue +5 -8
  301. package/src/components/Rating/stories/CustomSlot.vue +2 -2
  302. package/src/components/ScrollArea/ScrollArea.api.md +59 -0
  303. package/src/components/ScrollArea/ScrollArea.vue +46 -0
  304. package/src/components/ScrollArea/ScrollBar.vue +101 -0
  305. package/src/components/ScrollArea/index.ts +2 -0
  306. package/src/components/Select/Select.cy.ts +16 -15
  307. package/src/components/Select/Select.md +4 -0
  308. package/src/components/Select/Select.vue +217 -203
  309. package/src/components/Select/stories/Example.vue +4 -3
  310. package/src/components/Select/stories/States.vue +1 -1
  311. package/src/components/Select/stories/TriggerSlots.vue +2 -2
  312. package/src/components/Select/utils.ts +4 -3
  313. package/src/components/SettingsDialog/SettingsBody.vue +23 -0
  314. package/src/components/SettingsDialog/SettingsContent.vue +7 -0
  315. package/src/components/SettingsDialog/SettingsDialog.api.md +273 -0
  316. package/src/components/SettingsDialog/SettingsDialog.cy.ts +126 -0
  317. package/src/components/SettingsDialog/SettingsDialog.md +43 -0
  318. package/src/components/SettingsDialog/SettingsDialog.vue +76 -0
  319. package/src/components/SettingsDialog/SettingsHeader.vue +36 -0
  320. package/src/components/SettingsDialog/SettingsNavGroup.vue +20 -0
  321. package/src/components/SettingsDialog/SettingsNavItem.vue +33 -0
  322. package/src/components/SettingsDialog/SettingsPanel.cy.ts +77 -0
  323. package/src/components/SettingsDialog/SettingsPanel.vue +26 -0
  324. package/src/components/SettingsDialog/SettingsRow.vue +52 -0
  325. package/src/components/SettingsDialog/SettingsSidebar.vue +16 -0
  326. package/src/components/SettingsDialog/index.ts +10 -0
  327. package/src/components/SettingsDialog/stories/Default.vue +99 -0
  328. package/src/components/SettingsDialog/stories/PanelBasic.vue +52 -0
  329. package/src/components/SettingsDialog/stories/panels/NotificationsPanel.vue +57 -0
  330. package/src/components/SettingsDialog/stories/panels/PreferencesPanel.vue +57 -0
  331. package/src/components/SettingsDialog/stories/panels/ProfilePanel.vue +38 -0
  332. package/src/components/SettingsDialog/stories/panels/UsersPanel.vue +83 -0
  333. package/src/components/SettingsDialog/types.ts +21 -0
  334. package/src/components/Sidebar/Sidebar.api.md +124 -65
  335. package/src/components/Sidebar/Sidebar.cy.ts +127 -76
  336. package/src/components/Sidebar/Sidebar.md +47 -3
  337. package/src/components/Sidebar/Sidebar.vue +64 -56
  338. package/src/components/Sidebar/SidebarCollapseToggle.vue +23 -0
  339. package/src/components/Sidebar/SidebarHeader.vue +76 -52
  340. package/src/components/Sidebar/SidebarItem.vue +159 -95
  341. package/src/components/Sidebar/SidebarItemIcon.vue +25 -0
  342. package/src/components/Sidebar/SidebarLabel.vue +34 -0
  343. package/src/components/Sidebar/SidebarSection.vue +29 -14
  344. package/src/components/Sidebar/index.ts +13 -2
  345. package/src/components/Sidebar/stories/Collapsed.vue +40 -0
  346. package/src/components/Sidebar/stories/Default.vue +153 -0
  347. package/src/components/Sidebar/stories/Legacy.vue +36 -0
  348. package/src/components/Sidebar/types.ts +105 -20
  349. package/src/components/Skeleton/Skeleton.cy.ts +21 -0
  350. package/src/components/Skeleton/Skeleton.md +21 -0
  351. package/src/components/Skeleton/Skeleton.vue +6 -0
  352. package/src/components/Skeleton/index.ts +1 -0
  353. package/src/components/Skeleton/stories/Card.vue +12 -0
  354. package/src/components/Skeleton/stories/List.vue +15 -0
  355. package/src/components/Skeleton/stories/Text.vue +11 -0
  356. package/src/components/Slider/Slider.api.md +1 -1
  357. package/src/components/Slider/Slider.cy.ts +29 -0
  358. package/src/components/Slider/Slider.md +10 -0
  359. package/src/components/Slider/Slider.vue +37 -9
  360. package/src/components/Slider/stories/NegativeValues.vue +12 -0
  361. package/src/components/Slider/types.ts +1 -1
  362. package/src/components/Spinner/Spinner.api.md +32 -0
  363. package/src/components/Spinner/Spinner.cy.ts +87 -0
  364. package/src/components/Spinner/Spinner.md +21 -0
  365. package/src/components/Spinner/Spinner.vue +168 -0
  366. package/src/components/Spinner/index.ts +2 -0
  367. package/src/components/Spinner/stories/InContext.vue +49 -0
  368. package/src/components/Spinner/stories/Sizes.vue +12 -0
  369. package/src/components/Spinner/stories/Themes.vue +10 -0
  370. package/src/components/Spinner/stories/Track.vue +12 -0
  371. package/src/components/Spinner/types.ts +14 -0
  372. package/src/components/Switch/Switch.md +4 -0
  373. package/src/components/Switch/Switch.vue +6 -23
  374. package/src/components/TabButtons/Pill.vue +161 -0
  375. package/src/components/TabButtons/TabButtons.api.md +52 -2
  376. package/src/components/TabButtons/TabButtons.cy.ts +18 -5
  377. package/src/components/TabButtons/TabButtons.md +49 -0
  378. package/src/components/TabButtons/TabButtons.vue +207 -109
  379. package/src/components/TabButtons/index.ts +11 -1
  380. package/src/components/TabButtons/pillTypes.ts +43 -0
  381. package/src/components/TabButtons/stories/PrefixSuffix.vue +65 -0
  382. package/src/components/TabButtons/stories/Sizes.vue +26 -0
  383. package/src/components/TabButtons/stories/Variants.vue +40 -0
  384. package/src/components/TabButtons/stories/Vertical.vue +64 -0
  385. package/src/components/TabButtons/types.ts +49 -0
  386. package/src/components/Tabs/Tabs.md +4 -0
  387. package/src/components/Tabs/Tabs.vue +1 -1
  388. package/src/components/TextEditor/TextEditor.cy.ts +1 -1
  389. package/src/components/TextEditor/TextEditor.md +3 -0
  390. package/src/components/TextEditor/TextEditor.vue +7 -4
  391. package/src/components/TextEditor/components/CodeBlockComponent.vue +4 -194
  392. package/src/components/TextEditor/components/FontColor.vue +1 -1
  393. package/src/components/TextEditor/components/LinkPopup.vue +1 -1
  394. package/src/components/TextEditor/components/MediaNodeView.vue +17 -17
  395. package/src/components/TextEditor/components/MentionList.vue +1 -1
  396. package/src/components/TextEditor/components/TextEditorBubbleMenu.vue +14 -5
  397. package/src/components/TextEditor/components/TextEditorFixedMenu.vue +3 -3
  398. package/src/components/TextEditor/components/{Menu.vue → TextEditorMenu.vue} +3 -3
  399. package/src/components/TextEditor/extensions/iframe/InsertIframe.vue +2 -2
  400. package/src/components/TextEditor/extensions/iframe/iframe-extension.ts +62 -19
  401. package/src/components/TextEditor/extensions/image-group/ImageGroupNodeView.vue +1 -1
  402. package/src/components/TextEditor/extensions/image-group/ImageGroupUploadDialog.vue +4 -4
  403. package/src/components/TextEditor/extensions/suggestion/SuggestionList.vue +1 -1
  404. package/src/components/TextEditor/extensions/toc-node/TocNodeView.vue +1 -1
  405. package/src/components/TextEditor/hljs-github.css +197 -0
  406. package/src/components/TextEditor/index.ts +13 -0
  407. package/src/components/TextInput/TextInput.cy.ts +8 -3
  408. package/src/components/TextInput/TextInput.md +4 -0
  409. package/src/components/TextInput/TextInput.vue +11 -15
  410. package/src/components/TextInput/stories/Slots.vue +1 -1
  411. package/src/components/Textarea/Textarea.cy.ts +1 -1
  412. package/src/components/Textarea/Textarea.md +4 -0
  413. package/src/components/Textarea/Textarea.vue +11 -15
  414. package/src/components/ThemeSwitcher/ThemePreview.vue +74 -0
  415. package/src/components/ThemeSwitcher/ThemeSwitcher.api.md +82 -0
  416. package/src/components/ThemeSwitcher/ThemeSwitcher.cy.ts +101 -0
  417. package/src/components/ThemeSwitcher/ThemeSwitcher.md +70 -0
  418. package/src/components/ThemeSwitcher/ThemeSwitcher.vue +145 -0
  419. package/src/components/ThemeSwitcher/index.ts +2 -0
  420. package/src/components/ThemeSwitcher/previews/PreviewWindow.vue +74 -0
  421. package/src/components/ThemeSwitcher/stories/Branded.vue +12 -0
  422. package/src/components/ThemeSwitcher/stories/Default.vue +7 -0
  423. package/src/components/ThemeSwitcher/stories/Menu.vue +53 -0
  424. package/src/components/ThemeSwitcher/stories/Toggle.vue +25 -0
  425. package/src/components/ThemeSwitcher/types.ts +35 -0
  426. package/src/components/TimePicker/TimePicker.api.md +67 -15
  427. package/src/components/TimePicker/TimePicker.cy.ts +130 -14
  428. package/src/components/TimePicker/TimePicker.md +6 -0
  429. package/src/components/TimePicker/TimePicker.vue +74 -19
  430. package/src/components/TimePicker/stories/Labeling.vue +21 -0
  431. package/src/components/TimePicker/stories/Range.vue +1 -1
  432. package/src/components/TimePicker/stories/SizesAndVariants.vue +23 -0
  433. package/src/components/TimePicker/stories/TwentyFour.vue +1 -1
  434. package/src/components/TimePicker/types.ts +15 -3
  435. package/src/components/TimePicker/utils.ts +82 -21
  436. package/src/components/Toast/Toast.md +1 -1
  437. package/src/components/Toast/Toast.sanitize.test.ts +50 -0
  438. package/src/components/Toast/Toast.test.ts +5 -0
  439. package/src/components/Toast/Toast.vue +7 -7
  440. package/src/components/Toast/ToastProvider.vue +18 -9
  441. package/src/components/Toast/stories/CustomIcon.vue +1 -1
  442. package/src/components/Toast/toast.ts +32 -8
  443. package/src/components/Tooltip/Tooltip.api.md +43 -5
  444. package/src/components/Tooltip/Tooltip.cy.ts +48 -0
  445. package/src/components/Tooltip/Tooltip.md +10 -0
  446. package/src/components/Tooltip/Tooltip.vue +20 -5
  447. package/src/components/Tooltip/TooltipBubble.vue +2 -2
  448. package/src/components/Tooltip/TooltipProvider.vue +53 -0
  449. package/src/components/Tooltip/index.ts +1 -0
  450. package/src/components/Tooltip/stories/Group.vue +22 -0
  451. package/src/components/Tooltip/stories/Slots.vue +2 -2
  452. package/src/components/Tooltip/types.ts +1 -1
  453. package/src/components/Tree/Tree.api.md +76 -18
  454. package/src/components/Tree/Tree.md +144 -2
  455. package/src/components/Tree/Tree.vue +276 -97
  456. package/src/components/Tree/TreeItem.vue +263 -0
  457. package/src/components/Tree/index.ts +9 -1
  458. package/src/components/Tree/stories/DragDrop.vue +94 -0
  459. package/src/components/Tree/stories/Example.vue +11 -34
  460. package/src/components/Tree/stories/ExpandAll.vue +48 -0
  461. package/src/components/Tree/stories/Guides.vue +49 -0
  462. package/src/components/Tree/stories/ListView.vue +74 -0
  463. package/src/components/Tree/tree.cy.ts +218 -90
  464. package/src/components/Tree/types.ts +114 -24
  465. package/src/components/Tree/useTreeDragDrop.ts +203 -0
  466. package/src/components/Tree/useTreeKeyboard.ts +109 -0
  467. package/src/components/VueGridLayout/Layout.vue +1 -1
  468. package/src/components/shared/picker/PickerShell.vue +20 -15
  469. package/src/components/shared/popover/PopoverPanel.vue +67 -0
  470. package/src/components/shared/popover/popoverPanel.css +102 -0
  471. package/src/components/shared/selection/utils.ts +6 -6
  472. package/src/composables/useAutofocusOnOpen.ts +2 -0
  473. package/src/composables/useScreenSize.ts +46 -0
  474. package/src/composables/useScrollContainer.ts +108 -0
  475. package/src/composables/useShortcut.ts +3 -0
  476. package/src/data-fetching/docStore.test.ts +74 -0
  477. package/src/data-fetching/docStore.ts +18 -7
  478. package/src/data-fetching/useCall/types.ts +1 -0
  479. package/src/data-fetching/useCall/useCall.test.ts +43 -0
  480. package/src/data-fetching/useCall/useCall.ts +17 -4
  481. package/src/data-fetching/useDoc/useDoc.test.ts +61 -2
  482. package/src/data-fetching/useDoc/useDoc.ts +35 -15
  483. package/src/data-fetching/useDoctype/useDoctype.ts +6 -5
  484. package/src/data-fetching/useFrappeFetch.ts +17 -4
  485. package/src/data-fetching/useList/types.ts +1 -0
  486. package/src/data-fetching/useList/useList.test.ts +40 -0
  487. package/src/data-fetching/useList/useList.ts +20 -13
  488. package/src/data-fetching/useNewDoc/useNewDoc.ts +9 -5
  489. package/src/directives/focus.ts +3 -3
  490. package/src/index.ts +105 -74
  491. package/src/mocks/handlers.ts +8 -0
  492. package/src/molecules/editor/Editor.cy.ts +6 -1
  493. package/src/molecules/editor/EditorBubbleMenu.vue +1 -1
  494. package/src/molecules/editor/EditorContent.vue +50 -9
  495. package/src/molecules/editor/EditorFixedMenu.vue +2 -1
  496. package/src/molecules/editor/EditorFloatingMenu.vue +1 -1
  497. package/src/molecules/editor/EditorTableMenu.vue +303 -0
  498. package/src/molecules/editor/MenuItems.vue +81 -69
  499. package/src/molecules/editor/commands.ts +10 -2
  500. package/src/molecules/editor/components/AttachmentNodeView.vue +115 -0
  501. package/src/molecules/editor/components/EditorDropZone.vue +105 -0
  502. package/src/molecules/editor/components/EditorPopover.vue +89 -0
  503. package/src/molecules/editor/components/MediaNodeView.vue +156 -49
  504. package/src/molecules/editor/components/MediaResizeHandles.vue +38 -0
  505. package/src/molecules/editor/components/MediaToolbar.vue +108 -54
  506. package/src/molecules/editor/components/TableContextMenu.vue +144 -0
  507. package/src/molecules/editor/components/UploadProgressIndicator.vue +33 -0
  508. package/src/molecules/editor/components/VideoControls.vue +208 -0
  509. package/src/molecules/editor/components/font-color/ColorSwatchGrid.vue +3 -5
  510. package/src/molecules/editor/components/font-color/fontColorController.ts +28 -23
  511. package/src/molecules/editor/components/font-color/swatches.ts +1 -1
  512. package/src/molecules/editor/components/media-node-view-controller.ts +4 -4
  513. package/src/molecules/editor/components/media-node-view-utils.test.ts +0 -13
  514. package/src/molecules/editor/components/media-node-view-utils.ts +0 -10
  515. package/src/molecules/editor/components/table-color/tableCellColorController.ts +80 -0
  516. package/src/molecules/editor/components/table-size-picker/TableSizePicker.vue +92 -0
  517. package/src/molecules/editor/components/table-size-picker/tableSizePickerController.ts +40 -0
  518. package/src/molecules/editor/composables/useEditorFileDrop.ts +117 -0
  519. package/src/molecules/editor/composables/useFloatingPopup.ts +46 -2
  520. package/src/molecules/editor/composables/useNodeViewResize.test.ts +60 -11
  521. package/src/molecules/editor/composables/useNodeViewResize.ts +80 -21
  522. package/src/molecules/editor/composables/useTableCellColorState.ts +78 -0
  523. package/src/molecules/editor/composables/useWindowFileDragging.ts +68 -0
  524. package/src/molecules/editor/extensions/attachment/attachment-engine.ts +250 -0
  525. package/src/molecules/editor/extensions/attachment/attachment-extension.ts +248 -0
  526. package/src/molecules/editor/extensions/attachment/attachment.flow.test.ts +80 -0
  527. package/src/molecules/editor/extensions/attachment/attachment.roundtrip.test.ts +50 -0
  528. package/src/molecules/editor/extensions/attachment/index.ts +5 -0
  529. package/src/molecules/editor/extensions/code-block/CodeBlockComponent.css +16 -26
  530. package/src/molecules/editor/extensions/code-block/CodeBlockComponent.vue +107 -22
  531. package/src/molecules/editor/extensions/content-paste/content-paste-extension.ts +5 -3
  532. package/src/molecules/editor/extensions/iframe/IframeInsertDialog.vue +34 -7
  533. package/src/molecules/editor/extensions/iframe/IframeNodeView.vue +54 -48
  534. package/src/molecules/editor/extensions/iframe/iframe-allowlist.ts +33 -4
  535. package/src/molecules/editor/extensions/iframe/iframe-commands.ts +49 -5
  536. package/src/molecules/editor/extensions/iframe/iframe-embed-utils.ts +30 -0
  537. package/src/molecules/editor/extensions/iframe/iframe-extension.ts +4 -4
  538. package/src/molecules/editor/extensions/iframe/iframeInsertDialogController.ts +12 -1
  539. package/src/molecules/editor/extensions/iframe/index.ts +4 -4
  540. package/src/molecules/editor/extensions/iframe/useIframeDialog.ts +25 -13
  541. package/src/molecules/editor/extensions/image/image-extension.ts +29 -11
  542. package/src/molecules/editor/extensions/image-group/ImageGroupGrid.vue +27 -11
  543. package/src/molecules/editor/extensions/image-group/ImageGroupGridCell.vue +55 -11
  544. package/src/molecules/editor/extensions/image-group/ImageGroupNodeView.vue +64 -31
  545. package/src/molecules/editor/extensions/image-group/ImageGroupUploadDialog.vue +84 -40
  546. package/src/molecules/editor/extensions/image-group/image-group-extension.ts +4 -3
  547. package/src/molecules/editor/extensions/image-group/useImageGroupDialog.ts +116 -17
  548. package/src/molecules/editor/extensions/link/LinkEditorPopup.vue +214 -71
  549. package/src/molecules/editor/extensions/link/link-click-plugin.ts +10 -15
  550. package/src/molecules/editor/extensions/link/link-commands.ts +24 -3
  551. package/src/molecules/editor/extensions/link/link-extension.ts +11 -2
  552. package/src/molecules/editor/extensions/link/link-popup-controller.test.ts +49 -0
  553. package/src/molecules/editor/extensions/link/link-popup-controller.ts +67 -2
  554. package/src/molecules/editor/extensions/link/link-shortcut-plugin.ts +7 -2
  555. package/src/molecules/editor/extensions/media-drop/media-drop-extension.ts +177 -0
  556. package/src/molecules/editor/extensions/shared/media-dimensions.ts +36 -3
  557. package/src/molecules/editor/extensions/shared/media-node-ops.ts +17 -0
  558. package/src/molecules/editor/extensions/shared/media-plugin.test.ts +60 -0
  559. package/src/molecules/editor/extensions/shared/media-plugin.ts +7 -37
  560. package/src/molecules/editor/extensions/shared/media-upload-engine.test.ts +39 -2
  561. package/src/molecules/editor/extensions/shared/media-upload-engine.ts +104 -10
  562. package/src/molecules/editor/extensions/shared/media-upload-state.ts +55 -0
  563. package/src/molecules/editor/extensions/shared/media-upload-types.ts +52 -1
  564. package/src/molecules/editor/extensions/shared/suggestion-helpers.ts +20 -0
  565. package/src/molecules/editor/extensions/shared/suggestion-types.ts +7 -0
  566. package/src/molecules/editor/extensions/shared/upload-types.ts +1 -0
  567. package/src/molecules/editor/extensions/slash-commands/slash-commands-extension.test.ts +38 -0
  568. package/src/molecules/editor/extensions/slash-commands/slash-commands-extension.ts +119 -55
  569. package/src/molecules/editor/extensions/suggestion/SuggestionList.vue +62 -22
  570. package/src/molecules/editor/extensions/suggestion/SuggestionListItem.vue +1 -1
  571. package/src/molecules/editor/extensions/suggestion/createSuggestionExtension.ts +4 -0
  572. package/src/molecules/editor/extensions/table/drag-scroll.ts +154 -0
  573. package/src/molecules/editor/extensions/table/table-cell-color.ts +188 -0
  574. package/src/molecules/editor/extensions/table/table-navigation.ts +560 -0
  575. package/src/molecules/editor/extensions/table/table-selection-overlay.ts +137 -0
  576. package/src/molecules/editor/extensions/toc-node/TocNodeView.vue +1 -1
  577. package/src/molecules/editor/extensions/toc-node/toc-render.ts +7 -3
  578. package/src/molecules/editor/extensions/video/video-extension.ts +72 -5
  579. package/src/molecules/editor/extensions.ts +176 -8
  580. package/src/molecules/editor/index.ts +9 -4
  581. package/src/molecules/editor/kits.test.ts +21 -1
  582. package/src/molecules/editor/kits.ts +56 -33
  583. package/src/molecules/editor/menu.test.ts +3 -1
  584. package/src/molecules/editor/menu.ts +180 -18
  585. package/src/molecules/editor/stories/Comment.vue +4 -4
  586. package/src/molecules/editor/stories/Inline.vue +1 -1
  587. package/src/molecules/editor/stories/Primitives.vue +1 -1
  588. package/src/molecules/editor/stories/RichText.vue +1 -1
  589. package/src/molecules/editor/style.css +80 -3
  590. package/src/molecules/editor/useEditor.test.ts +4 -0
  591. package/src/molecules/editor/useEditor.ts +7 -3
  592. package/src/molecules/list/List.cy.ts +626 -0
  593. package/src/molecules/list/List.vue +93 -0
  594. package/src/molecules/list/ListCell.vue +15 -0
  595. package/src/molecules/list/ListGroup.vue +40 -0
  596. package/src/molecules/list/ListHeader.vue +62 -0
  597. package/src/molecules/list/ListHeaderCell.vue +26 -0
  598. package/src/molecules/list/ListHeaderCellSort.vue +106 -0
  599. package/src/molecules/list/ListRow.vue +55 -0
  600. package/src/molecules/list/ListRowBase.vue +103 -0
  601. package/src/molecules/list/ListRows.vue +120 -0
  602. package/src/molecules/list/index.ts +24 -0
  603. package/src/molecules/list/list-context.ts +44 -0
  604. package/src/molecules/list/list.api.md +276 -0
  605. package/src/molecules/list/list.md +119 -0
  606. package/src/molecules/list/stories/Columns.vue +103 -0
  607. package/src/molecules/list/stories/Feed.vue +105 -0
  608. package/src/molecules/list/stories/Virtual.vue +31 -0
  609. package/src/molecules/list/style.css +173 -0
  610. package/src/molecules/list/types.ts +82 -0
  611. package/src/molecules/list/useVirtualRows.ts +80 -0
  612. package/src/resources/documentResource.d.ts +28 -0
  613. package/src/resources/documentResource.js +32 -4
  614. package/src/resources/documentResource.test.ts +111 -0
  615. package/src/resources/listResource.d.ts +33 -0
  616. package/src/resources/plugin.d.ts +7 -0
  617. package/src/resources/resources.d.ts +35 -0
  618. package/src/utils/{call.js → call.ts} +50 -9
  619. package/src/utils/config.ts +16 -1
  620. package/src/utils/confirmDialog.d.ts +17 -0
  621. package/src/utils/debounce.ts +6 -7
  622. package/src/utils/dialog.cy.ts +9 -9
  623. package/src/utils/fileSize.ts +36 -0
  624. package/src/utils/fileUploadHandler.ts +46 -6
  625. package/src/utils/frappeRequest.test.ts +79 -0
  626. package/src/utils/{frappeRequest.js → frappeRequest.ts} +76 -13
  627. package/src/utils/pageMeta.ts +1 -1
  628. package/src/utils/plugin.ts +58 -0
  629. package/src/utils/{request.js → request.ts} +28 -3
  630. package/src/utils/{socketio.js → socketio.ts} +11 -1
  631. package/src/utils/theme.ts +48 -57
  632. package/src/utils/useFileUpload.ts +80 -23
  633. package/tailwind/audit-token-drift.cjs +176 -0
  634. package/tailwind/colorPalette.js +69 -8
  635. package/tailwind/colors.json +1115 -397
  636. package/tailwind/figma-tokens-to-theme.js +364 -0
  637. package/tailwind/generated/colors.json +1217 -0
  638. package/tailwind/generated/effects.json +41 -0
  639. package/tailwind/generated/radius.json +20 -0
  640. package/tailwind/generated/typography.json +479 -0
  641. package/tailwind/migrate-tokens-v2.js +453 -0
  642. package/tailwind/migrate-tokens-v2.test.js +55 -0
  643. package/tailwind/plugin.js +220 -15
  644. package/tailwind/preset.js +15 -0
  645. package/tailwind/tokens.js +35 -37
  646. package/tsconfig.base.json +2 -2
  647. package/vitepress/components/Docs/CommandPalette.vue +214 -0
  648. package/vitepress/components/Docs/Demo.vue +60 -0
  649. package/vitepress/components/Docs/EmitsTable.vue +99 -0
  650. package/vitepress/components/Docs/MobileNavSheet.vue +148 -0
  651. package/vitepress/components/Docs/OnThisPage.vue +74 -0
  652. package/vitepress/components/Docs/PrevNextBtns.vue +58 -0
  653. package/vitepress/components/Docs/PropsTable.vue +185 -0
  654. package/vitepress/components/Docs/Search.vue +34 -0
  655. package/vitepress/components/Docs/Sidebar.vue +91 -0
  656. package/vitepress/components/Docs/SlotsTable.vue +99 -0
  657. package/vitepress/components/Docs/index.ts +13 -0
  658. package/vitepress/components/Docs/sidebarList.ts +33 -0
  659. package/vitepress/components/Layout.vue +58 -0
  660. package/vitepress/components/Navbar.vue +126 -0
  661. package/vitepress/components/index.ts +3 -0
  662. package/vitepress/composables/index.ts +3 -0
  663. package/vitepress/composables/useTheme.ts +39 -0
  664. package/vitepress/css/fonts/Inter-Italic.var.woff2 +0 -0
  665. package/vitepress/css/fonts/Inter.var.woff2 +0 -0
  666. package/vitepress/css/style.css +198 -0
  667. package/vitepress/index.d.ts +23 -0
  668. package/vitepress/index.node.ts +175 -0
  669. package/vitepress/index.ts +17 -0
  670. package/vitepress/plugins/colocatedComponentDocs.ts +164 -0
  671. package/vitepress/plugins/componentTransformer.ts +286 -0
  672. package/vitepress/plugins/index.ts +12 -0
  673. package/vitepress/state.ts +10 -0
  674. package/vitepress/theme/index.ts +21 -0
  675. package/frappe/telemetry/utils.ts +0 -15
  676. package/src/components/Badge/stories/Themes.vue +0 -10
  677. package/src/components/Badge/stories/Variants.vue +0 -10
  678. package/src/components/Button/stories/Icons.vue +0 -27
  679. package/src/components/Button/stories/Sizes.vue +0 -11
  680. package/src/components/Button/stories/Themes.vue +0 -10
  681. package/src/components/Button/stories/Variants.vue +0 -10
  682. package/src/components/Popover/stories/Hover.vue +0 -14
  683. package/src/components/Resource.vue +0 -21
  684. package/src/components/Sidebar/stories/Example.vue +0 -76
  685. package/src/components/Spinner.vue +0 -3
  686. package/src/components/TabButtons/TabButtons.story.vue +0 -22
  687. package/src/utils/plugin.js +0 -24
  688. /package/src/components/Dropdown/stories/{02_Shortcuts.vue → Shortcuts.vue} +0 -0
  689. /package/src/components/Dropdown/stories/{01_Simple.vue → Simple.vue} +0 -0
  690. /package/src/components/Dropdown/stories/{03_Submenus.vue → Submenus.vue} +0 -0
  691. /package/src/components/Dropdown/stories/{04_Switches.vue → Switches.vue} +0 -0
  692. /package/src/components/{Dropdown/DropdownRenderContentAsChild.vue → Menu/MenuRenderContentAsChild.vue} +0 -0
@@ -17,11 +17,12 @@ import {
17
17
  type TocRenderNode,
18
18
  } from '#molecules/editor/extensions/shared/heading-tree-utils'
19
19
 
20
- const OL_STYLE = 'list-style-type: decimal; margin: 0.5em 0; padding-left: 1.5em'
20
+ const OL_STYLE =
21
+ 'list-style-type: decimal; margin: 0.5em 0; padding-left: 1.5em'
21
22
  const NESTED_OL_STYLE = 'list-style-type: decimal; padding-left: 1.5em'
22
23
 
23
24
  /** Element-spec tuple: `[tag, attrs, ...children]`. Assignable to DOMOutputSpec. */
24
- type ElementSpec = readonly [string, Record<string, string>, ...DOMOutputSpec[]]
25
+ type ElementSpec = readonly [string, Record<string, string>, ...any[]]
25
26
 
26
27
  function renderNode(node: TocRenderNode): ElementSpec {
27
28
  const paragraph: ElementSpec = ['p', { style: 'margin: 0' }, node.text]
@@ -59,7 +60,10 @@ export function renderTocHTML(
59
60
  return ['div', attrs, 'No headings found in this document.']
60
61
  }
61
62
 
62
- const tree = foldHeadings(headings, (item) => item as (typeof headings)[number])
63
+ const tree = foldHeadings(
64
+ headings,
65
+ (item) => item as (typeof headings)[number],
66
+ )
63
67
  const spec = headingsToRenderSpec(tree)
64
68
  const list: ElementSpec = ['ol', { style: OL_STYLE }, ...spec.map(renderNode)]
65
69
 
@@ -17,13 +17,14 @@ import {
17
17
  Node as NodeExtension,
18
18
  nodeInputRule,
19
19
  mergeAttributes,
20
+ type Editor,
20
21
  } from '@tiptap/core'
21
22
  import { VueNodeViewRenderer } from '@tiptap/vue-3'
22
23
  import MediaNodeView from '#molecules/editor/components/MediaNodeView.vue'
23
- import type { UploadedFile } from '#utils/useFileUpload'
24
24
  import {
25
25
  resolveUploadOptions,
26
26
  type MediaUploadOptions,
27
+ type UploadFunction,
27
28
  } from '#molecules/editor/extensions/shared/media-upload-engine'
28
29
  import { createMediaPlugin } from '#molecules/editor/extensions/shared/media-plugin'
29
30
  import { findNodeByUploadId } from '#molecules/editor/extensions/shared/node-view'
@@ -32,10 +33,11 @@ import { videoConfig, videoEngine } from './video-config'
32
33
 
33
34
  export interface VideoExtensionOptions {
34
35
  /**
35
- * Function to handle video uploads
36
+ * Function to handle video uploads. Receives optional request options
37
+ * (abort signal + progress callback) as the second argument.
36
38
  * @default null
37
39
  */
38
- uploadFunction: ((file: File) => Promise<UploadedFile>) | null
40
+ uploadFunction: UploadFunction | null
39
41
 
40
42
  /**
41
43
  * HTML attributes to add to the video element
@@ -104,6 +106,25 @@ export const VideoExtension = NodeExtension.create<VideoExtensionOptions>({
104
106
  default: false,
105
107
  parseHTML: () => false,
106
108
  },
109
+ align: {
110
+ default: 'center',
111
+ parseHTML: (element) => {
112
+ const align = (
113
+ element.getAttribute('data-align') ||
114
+ element.getAttribute('align') ||
115
+ 'center'
116
+ ).toLowerCase()
117
+ if (['left', 'center', 'right'].includes(align)) {
118
+ return align as 'left' | 'center' | 'right'
119
+ }
120
+ return 'center'
121
+ },
122
+ renderHTML: (attributes) => {
123
+ return {
124
+ 'data-align': attributes.align || 'center',
125
+ }
126
+ },
127
+ },
107
128
  float: {
108
129
  default: null,
109
130
  parseHTML: (element) => {
@@ -177,7 +198,10 @@ export const VideoExtension = NodeExtension.create<VideoExtensionOptions>({
177
198
  (attributes: SetVideoOptions) =>
178
199
  ({ commands }) => {
179
200
  // F4: reject an empty/blank src instead of inserting a broken node.
180
- if (typeof attributes.src !== 'string' || attributes.src.trim() === '') {
201
+ if (
202
+ typeof attributes.src !== 'string' ||
203
+ attributes.src.trim() === ''
204
+ ) {
181
205
  return false
182
206
  }
183
207
  return commands.insertContent({
@@ -193,11 +217,20 @@ export const VideoExtension = NodeExtension.create<VideoExtensionOptions>({
193
217
  return true
194
218
  },
195
219
 
220
+ uploadVideoFiles:
221
+ (files: File[], pos: number | null = null) =>
222
+ ({ editor }) => {
223
+ if (files.length === 0) return false
224
+ void videoEngine.processMultiple(files, editor, pos, resolve())
225
+ return true
226
+ },
227
+
196
228
  selectAndUploadVideo:
197
229
  () =>
198
230
  ({ editor }) => {
199
231
  void pickFiles({ accept: 'video/*' }).then((files) => {
200
- if (!editor.isDestroyed && files[0]) editor.commands.uploadVideo(files[0])
232
+ if (!editor.isDestroyed && files[0])
233
+ editor.commands.uploadVideo(files[0])
201
234
  })
202
235
  return true
203
236
  },
@@ -213,6 +246,40 @@ export const VideoExtension = NodeExtension.create<VideoExtensionOptions>({
213
246
  void videoEngine.reupload(editor, pos, resolve())
214
247
  return true
215
248
  },
249
+
250
+ replaceVideo:
251
+ (pos: number, file: File) =>
252
+ ({ editor }: { editor: Editor }) => {
253
+ const node = editor.view.state.doc.nodeAt(pos)
254
+ if (!node || node.type.name !== this.name) return false
255
+ void videoEngine.uploadReplace(
256
+ file,
257
+ editor,
258
+ pos,
259
+ resolve(),
260
+ node.attrs,
261
+ )
262
+ return true
263
+ },
264
+
265
+ setVideoOptions:
266
+ (
267
+ options: Partial<
268
+ Pick<SetVideoOptions, 'autoplay' | 'loop' | 'muted'>
269
+ >,
270
+ ) =>
271
+ ({
272
+ commands,
273
+ }: {
274
+ commands: {
275
+ updateAttributes: (
276
+ name: string,
277
+ attrs: Record<string, unknown>,
278
+ ) => boolean
279
+ }
280
+ }) => {
281
+ return commands.updateAttributes(this.name, options)
282
+ },
216
283
  }
217
284
  },
218
285
 
@@ -1,7 +1,43 @@
1
- import { type Editor } from '@tiptap/core'
2
- import StarterKitExtension from '@tiptap/starter-kit'
1
+ import { Extension, type Editor, type Extensions } from '@tiptap/core'
2
+ import {
3
+ Blockquote,
4
+ type BlockquoteOptions,
5
+ } from '@tiptap/extension-blockquote'
6
+ import { Bold, type BoldOptions } from '@tiptap/extension-bold'
7
+ import { Document } from '@tiptap/extension-document'
8
+ import { HardBreak, type HardBreakOptions } from '@tiptap/extension-hard-break'
9
+ import {
10
+ HorizontalRule,
11
+ type HorizontalRuleOptions,
12
+ } from '@tiptap/extension-horizontal-rule'
13
+ import { Italic, type ItalicOptions } from '@tiptap/extension-italic'
14
+ import {
15
+ BulletList,
16
+ type BulletListOptions,
17
+ ListItem,
18
+ type ListItemOptions,
19
+ ListKeymap,
20
+ type ListKeymapOptions,
21
+ OrderedList,
22
+ type OrderedListOptions,
23
+ } from '@tiptap/extension-list'
24
+ import { Paragraph, type ParagraphOptions } from '@tiptap/extension-paragraph'
25
+ import { Strike, type StrikeOptions } from '@tiptap/extension-strike'
26
+ import { Text } from '@tiptap/extension-text'
27
+ import { Underline, type UnderlineOptions } from '@tiptap/extension-underline'
28
+ import {
29
+ Dropcursor,
30
+ type DropcursorOptions,
31
+ Gapcursor,
32
+ TrailingNode,
33
+ type TrailingNodeOptions,
34
+ UndoRedo,
35
+ type UndoRedoOptions,
36
+ } from '@tiptap/extensions'
3
37
  import PlaceholderExtension from '@tiptap/extension-placeholder'
4
- import HeadingExtension from '@tiptap/extension-heading'
38
+ import HeadingExtension, {
39
+ type HeadingOptions,
40
+ } from '@tiptap/extension-heading'
5
41
  import HeadingIdsExtension from './extensions/heading/heading-ids'
6
42
  import { LinkExtension } from './extensions/link'
7
43
  // Custom code mark + lowlight code block (input rule, indent keymaps, language
@@ -10,9 +46,15 @@ import { ExtendedCode, ExtendedCodeBlock } from './extensions/code-block'
10
46
  import {
11
47
  Table as TiptapTable,
12
48
  TableRow,
13
- TableCell,
14
- TableHeader,
49
+ TableCell as TiptapTableCell,
50
+ TableHeader as TiptapTableHeader,
15
51
  } from '@tiptap/extension-table'
52
+ import { columnResizing, tableEditing, TableView } from '@tiptap/pm/tables'
53
+ import {
54
+ cellBackgroundAttributes,
55
+ TableCellColor as TableCellColorExtension,
56
+ } from './extensions/table/table-cell-color'
57
+ import { TableSelectionOverlay as TableSelectionOverlayExtension } from './extensions/table/table-selection-overlay'
16
58
  import TaskListExtension from '@tiptap/extension-task-list'
17
59
  import TaskItemExtension from '@tiptap/extension-task-item'
18
60
  import TypographyExtension from '@tiptap/extension-typography'
@@ -26,6 +68,8 @@ import { ImageExtension } from './extensions/image'
26
68
  import { ImageGroup as ImageGroupExtension } from './extensions/image-group'
27
69
  import ImageViewerExtension from './extensions/image-viewer'
28
70
  import { VideoExtension } from './extensions/video'
71
+ import { AttachmentExtension } from './extensions/attachment'
72
+ import { MediaDrop as MediaDropExtension } from './extensions/media-drop/media-drop-extension'
29
73
  import { IframeExtension } from './extensions/iframe'
30
74
  import {
31
75
  MentionExtension,
@@ -44,7 +88,82 @@ export {
44
88
  } from './SuggestionExtension'
45
89
  export type { MentionSuggestionItem, TagSuggestionItem }
46
90
 
47
- export const StarterKit = StarterKitExtension
91
+ type StarterKitMember<O> = Partial<O> | false
92
+
93
+ export interface StarterKitOptions {
94
+ blockquote?: StarterKitMember<BlockquoteOptions>
95
+ bold?: StarterKitMember<BoldOptions>
96
+ bulletList?: StarterKitMember<BulletListOptions>
97
+ code?: false
98
+ codeBlock?: false
99
+ document?: false
100
+ dropcursor?: StarterKitMember<DropcursorOptions>
101
+ gapcursor?: false
102
+ hardBreak?: StarterKitMember<HardBreakOptions>
103
+ heading?: StarterKitMember<HeadingOptions>
104
+ horizontalRule?: StarterKitMember<HorizontalRuleOptions>
105
+ italic?: StarterKitMember<ItalicOptions>
106
+ link?: false
107
+ listItem?: StarterKitMember<ListItemOptions>
108
+ listKeymap?: StarterKitMember<ListKeymapOptions>
109
+ orderedList?: StarterKitMember<OrderedListOptions>
110
+ paragraph?: StarterKitMember<ParagraphOptions>
111
+ strike?: StarterKitMember<StrikeOptions>
112
+ text?: false
113
+ trailingNode?: StarterKitMember<TrailingNodeOptions>
114
+ underline?: StarterKitMember<UnderlineOptions>
115
+ undoRedo?: StarterKitMember<UndoRedoOptions>
116
+ }
117
+
118
+ function pushConfigured<O>(
119
+ list: Extensions,
120
+ extension: { configure: (options?: Partial<O>) => any },
121
+ option: StarterKitMember<O> | undefined,
122
+ ) {
123
+ if (option !== false) list.push(extension.configure(option ?? {}))
124
+ }
125
+
126
+ /**
127
+ * Dropcursor with the design-system drop indicator: a 3px rounded gray bar
128
+ * (rounded corners via `.editor-drop-cursor` in style.css) instead of the
129
+ * default 1px black line.
130
+ */
131
+ export const EditorDropcursor = Dropcursor.configure({
132
+ width: 3,
133
+ color: 'var(--surface-gray-10, #383838)',
134
+ class: 'editor-drop-cursor',
135
+ })
136
+
137
+ export const StarterKit = Extension.create<StarterKitOptions>({
138
+ name: 'frappeStarterKit',
139
+ addOptions() {
140
+ return {}
141
+ },
142
+ addExtensions() {
143
+ const list: Extensions = []
144
+ pushConfigured(list, Bold, this.options.bold)
145
+ pushConfigured(list, Blockquote, this.options.blockquote)
146
+ pushConfigured(list, BulletList, this.options.bulletList)
147
+ if (this.options.document !== false) list.push(Document)
148
+ pushConfigured(list, EditorDropcursor, this.options.dropcursor)
149
+ if (this.options.gapcursor !== false) list.push(Gapcursor)
150
+ pushConfigured(list, HardBreak, this.options.hardBreak)
151
+ pushConfigured(list, HeadingExtension, this.options.heading)
152
+ pushConfigured(list, UndoRedo, this.options.undoRedo)
153
+ pushConfigured(list, HorizontalRule, this.options.horizontalRule)
154
+ pushConfigured(list, Italic, this.options.italic)
155
+ pushConfigured(list, ListItem, this.options.listItem)
156
+ pushConfigured(list, ListKeymap, this.options.listKeymap)
157
+ pushConfigured(list, OrderedList, this.options.orderedList)
158
+ pushConfigured(list, Paragraph, this.options.paragraph)
159
+ pushConfigured(list, Strike, this.options.strike)
160
+ if (this.options.text !== false) list.push(Text)
161
+ pushConfigured(list, Underline, this.options.underline)
162
+ pushConfigured(list, TrailingNode, this.options.trailingNode)
163
+ if (this.options.heading !== false) list.push(HeadingIds)
164
+ return list
165
+ },
166
+ })
48
167
 
49
168
  type PlaceholderStorage = { text: string | null }
50
169
 
@@ -103,8 +222,52 @@ export const HeadingIds = HeadingIdsExtension
103
222
  export const Link = LinkExtension
104
223
  export const Code = ExtendedCode
105
224
  export const CodeBlock = ExtendedCodeBlock
106
- export const Table = TiptapTable.configure({ resizable: true })
107
- export { TableRow, TableCell, TableHeader }
225
+ // Stock @tiptap gates `columnResizing` behind `resizable && editor.isEditable`,
226
+ // evaluated once at editor creation. That has three consequences we don't want:
227
+ // the plugin also owns the `.tableWrapper` scroll container (so read-only and
228
+ // born-read-only editors get a bare table that overflows its bounds), and
229
+ // `setEditable()` never reconfigures plugins (so toggling an existing comment
230
+ // into edit mode never installs resizing). `columnResizing` already no-ops its
231
+ // own pointer handlers when `!view.editable`, so installing it whenever
232
+ // `resizable` is set is safe in read-only and keeps the wrapper in every mode.
233
+ export const Table = TiptapTable.configure({ resizable: true }).extend({
234
+ addProseMirrorPlugins() {
235
+ return [
236
+ ...(this.options.resizable
237
+ ? [
238
+ columnResizing({
239
+ handleWidth: this.options.handleWidth,
240
+ cellMinWidth: this.options.cellMinWidth,
241
+ defaultCellMinWidth: this.options.cellMinWidth,
242
+ View: this.options.View ?? TableView,
243
+ lastColumnResizable: this.options.lastColumnResizable,
244
+ }),
245
+ ]
246
+ : []),
247
+ tableEditing({ allowTableNodeSelection: this.options.allowTableNodeSelection }),
248
+ ]
249
+ },
250
+ })
251
+ // Cell nodes carry a named `backgroundColor` attribute (rendered via
252
+ // `--prose-highlight-*`); see `extensions/table/table-cell-color`.
253
+ export const TableCell = TiptapTableCell.extend({
254
+ addAttributes() {
255
+ return { ...this.parent?.(), ...cellBackgroundAttributes }
256
+ },
257
+ })
258
+ export const TableHeader = TiptapTableHeader.extend({
259
+ addAttributes() {
260
+ return { ...this.parent?.(), ...cellBackgroundAttributes }
261
+ },
262
+ })
263
+ export { TableRow }
264
+ // Spreadsheet-style cell navigation (active-cell highlight, Enter to edit, Esc
265
+ // to exit, arrow keys to move). Loaded alongside Table in the kits.
266
+ export { TableNavigation } from './extensions/table/table-navigation'
267
+ // First-class named cell background + text color commands, and the single-box
268
+ // multi-cell selection overlay. Both loaded alongside Table.
269
+ export const TableCellColor = TableCellColorExtension
270
+ export const TableSelectionOverlay = TableSelectionOverlayExtension
108
271
  export const TaskList = TaskListExtension
109
272
  export const TaskItem = TaskItemExtension.configure({ nested: true })
110
273
  export const Typography = TypographyExtension
@@ -126,6 +289,10 @@ export const Image = ImageExtension
126
289
  export const ImageGroup = ImageGroupExtension
127
290
  export const ImageViewer = ImageViewerExtension
128
291
  export const Video = VideoExtension
292
+ // Inline file attachments (pdf, docx, zip, csv, …). Same shared upload function
293
+ // as image/video; renders a gray chip/link via AttachmentNodeView.
294
+ export const Attachment = AttachmentExtension
295
+ export const MediaDrop = MediaDropExtension
129
296
  export const Iframe = IframeExtension
130
297
  export const Mention = MentionExtension
131
298
 
@@ -143,3 +310,4 @@ export { SlashCommands }
143
310
  export const Toc = TocNodeExtension
144
311
  export const ContentPaste = ContentPasteExtension
145
312
  export const StyleClipboard = StyleClipboardExtension
313
+ export type { MediaUploadRequestOptions } from './extensions/shared/media-upload-engine'
@@ -1,20 +1,25 @@
1
+ // Editor styles ship with the package: importing from `frappe-ui/editor` pulls
2
+ // in the ProseMirror/prose-v3 rules so the editor is self-contained and does not
3
+ // rely on any other component's stylesheet being loaded.
4
+ import './style.css'
5
+
1
6
  // Engine
2
7
  export {
3
8
  useEditor,
4
- type Editor,
9
+ type Editor as TiptapEditor,
5
10
  type JSONContent,
6
11
  type UploadedFile,
7
12
  } from './useEditor'
8
13
 
9
- // The component. NOTE: this is the `Editor` *value*; the `Editor` *type* above
10
- // (the tiptap instance) lives in a separate namespace, so `import { Editor }`
11
- // gets the component and `import type { Editor }` gets the type.
14
+ // The component. Use `TiptapEditor` for the underlying editor instance type.
12
15
  export { default as Editor } from './Editor.vue'
13
16
 
14
17
  // Building blocks (compose without <Editor>)
15
18
  export { default as EditorContent } from './EditorContent.vue'
19
+ export { default as EditorDropZone } from './components/EditorDropZone.vue'
16
20
  export { default as EditorFixedMenu } from './EditorFixedMenu.vue'
17
21
  export { default as EditorBubbleMenu } from './EditorBubbleMenu.vue'
22
+ export { default as EditorTableMenu } from './EditorTableMenu.vue'
18
23
  export { default as EditorFloatingMenu } from './EditorFloatingMenu.vue'
19
24
 
20
25
  // Kits — configurable extension bundles (StarterKit is re-exported from extensions)
@@ -6,7 +6,7 @@ import { describe, it, expect } from 'vitest'
6
6
  import { getSchema, resolveExtensions, Mark } from '@tiptap/core'
7
7
  import type { AnyExtension } from '@tiptap/core'
8
8
  import { CommentKit, RichTextKit, InlineKit } from './kits'
9
- import { StarterKit, Mention, Tag } from './extensions'
9
+ import { StarterKit, Mention, Tag, Link, Code, CodeBlock } from './extensions'
10
10
 
11
11
  function schemaOf(...extensions: AnyExtension[]) {
12
12
  const schema = getSchema(extensions)
@@ -28,6 +28,17 @@ describe('editor kits', () => {
28
28
  expect(nodes.has('heading')).toBe(true)
29
29
  expect(marks.has('bold')).toBe(true)
30
30
  expect(marks.has('italic')).toBe(true)
31
+ expect(marks.has('link')).toBe(false)
32
+ expect(marks.has('code')).toBe(false)
33
+ expect(nodes.has('codeBlock')).toBe(false)
34
+ })
35
+
36
+ it('StarterKit composes with frappe-ui replacements without duplicate stock extensions', () => {
37
+ expect(() => schemaOf(StarterKit, Link, Code, CodeBlock)).not.toThrow()
38
+ const { marks, nodes } = schemaOf(StarterKit, Link, Code, CodeBlock)
39
+ expect(marks.has('link')).toBe(true)
40
+ expect(marks.has('code')).toBe(true)
41
+ expect(nodes.has('codeBlock')).toBe(true)
31
42
  })
32
43
 
33
44
  it('CommentKit bundles comment-grade members and excludes table/toc/slash', () => {
@@ -35,6 +46,7 @@ describe('editor kits', () => {
35
46
  expect(nodes.has('paragraph')).toBe(true)
36
47
  expect(nodes.has('heading')).toBe(true)
37
48
  expect(nodes.has('image')).toBe(true)
49
+ expect(nodes.has('attachment')).toBe(true)
38
50
  expect(nodes.has('mention')).toBe(true)
39
51
  expect(nodes.has('tagItem')).toBe(true)
40
52
  expect(marks.has('link')).toBe(true)
@@ -43,11 +55,19 @@ describe('editor kits', () => {
43
55
 
44
56
  const names = extensionNames(CommentKit)
45
57
  expect(names.has('imageViewer')).toBe(true)
58
+ expect(names.has('mediaDrop')).toBe(true)
46
59
  expect(names.has('table')).toBe(false)
47
60
  expect(names.has('tableOfContents')).toBe(false)
48
61
  expect(names.has('slashCommands')).toBe(false)
49
62
  })
50
63
 
64
+ it('drops the attachment node when removed with `false`', () => {
65
+ expect(schemaOf(CommentKit).nodes.has('attachment')).toBe(true)
66
+ const { nodes } = schemaOf(CommentKit.configure({ attachment: false }))
67
+ expect(nodes.has('attachment')).toBe(false)
68
+ expect(nodes.has('image')).toBe(true) // others remain
69
+ })
70
+
51
71
  it('RichTextKit adds tables, task lists, color, and slash commands', () => {
52
72
  const { marks, nodes } = schemaOf(RichTextKit)
53
73
  expect(nodes.has('table')).toBe(true)
@@ -1,18 +1,26 @@
1
1
  import { Extension, Node, type Extensions } from '@tiptap/core'
2
2
  import type { Component, MaybeRefOrGetter } from 'vue'
3
- import StarterKit, { type StarterKitOptions } from '@tiptap/starter-kit'
3
+ import { Bold } from '@tiptap/extension-bold'
4
+ import { Italic } from '@tiptap/extension-italic'
5
+ import { Paragraph } from '@tiptap/extension-paragraph'
6
+ import { Strike } from '@tiptap/extension-strike'
7
+ import { Text } from '@tiptap/extension-text'
8
+ import { Underline } from '@tiptap/extension-underline'
9
+ import { Gapcursor, UndoRedo } from '@tiptap/extensions'
4
10
  import type { HeadingOptions } from '@tiptap/extension-heading'
5
11
  import type { LinkOptions } from '@tiptap/extension-link'
6
12
  import {
7
13
  Placeholder,
8
14
  Link,
15
+ StarterKit,
9
16
  Code,
10
17
  CodeBlock,
11
- HeadingIds,
12
18
  Image,
13
19
  ImageGroup,
14
20
  ImageViewer,
15
21
  Video,
22
+ Attachment,
23
+ MediaDrop,
16
24
  ContentPaste,
17
25
  Emoji,
18
26
  Mention,
@@ -21,6 +29,9 @@ import {
21
29
  TableRow,
22
30
  TableCell,
23
31
  TableHeader,
32
+ TableNavigation,
33
+ TableCellColor,
34
+ TableSelectionOverlay,
24
35
  TaskList,
25
36
  TaskItem,
26
37
  Iframe,
@@ -32,6 +43,8 @@ import {
32
43
  Typography,
33
44
  TextAlign,
34
45
  StyleClipboard,
46
+ EditorDropcursor,
47
+ type StarterKitOptions,
35
48
  type MentionSuggestionItem,
36
49
  type TagSuggestionItem,
37
50
  } from './extensions'
@@ -66,16 +79,11 @@ function starterKitBase(
66
79
  if (starter === false) return []
67
80
  return [
68
81
  StarterKit.configure({
69
- link: false,
70
- code: false,
71
- codeBlock: false,
72
82
  ...starter,
73
83
  heading: heading as StarterKitOptions['heading'],
74
84
  }),
75
85
  Code,
76
86
  CodeBlock,
77
- // Stable heading ids only matter when headings exist.
78
- ...(heading === false ? [] : [HeadingIds]),
79
87
  ]
80
88
  }
81
89
 
@@ -101,6 +109,10 @@ export interface CommentKitOptions {
101
109
  imageGroup: CustomMember
102
110
  imageViewer: CustomMember
103
111
  video: CustomMember
112
+ attachment: CustomMember
113
+ // Tables. Off by default for CommentKit (the lighter stack); RichTextKit turns
114
+ // it on. Opt in with `CommentKit.configure({ table: {} })`.
115
+ table: CustomMember
104
116
  contentPaste: CustomMember
105
117
  emoji: CustomMember
106
118
  mention: MentionMember
@@ -116,6 +128,8 @@ const commentKitDefaults = (): CommentKitOptions => ({
116
128
  imageGroup: {},
117
129
  imageViewer: {},
118
130
  video: {},
131
+ attachment: {},
132
+ table: false,
119
133
  contentPaste: {},
120
134
  emoji: {},
121
135
  mention: {},
@@ -135,6 +149,29 @@ function commentMembers(options: CommentKitOptions): Extensions {
135
149
  if (options.image !== false)
136
150
  pushMember(list, ImageViewer, options.imageViewer)
137
151
  pushMember(list, Video, options.video)
152
+ pushMember(list, Attachment, options.attachment)
153
+ // The single drop pipeline; only useful when there's a media or attachment
154
+ // node to route to.
155
+ if (
156
+ options.image !== false ||
157
+ options.video !== false ||
158
+ options.attachment !== false
159
+ )
160
+ list.push(MediaDrop)
161
+ // Table needs its row/cell/header companions; TableNavigation adds the
162
+ // spreadsheet-style cell navigation. Shared so both kits get it (off by
163
+ // default for CommentKit, on for RichTextKit).
164
+ if (options.table !== false) {
165
+ list.push(
166
+ Table.configure(options.table),
167
+ TableRow,
168
+ TableCell,
169
+ TableHeader,
170
+ TableNavigation,
171
+ TableCellColor,
172
+ TableSelectionOverlay,
173
+ )
174
+ }
138
175
  pushMember(list, ContentPaste, options.contentPaste)
139
176
  pushMember(list, Emoji, options.emoji)
140
177
  pushMember(list, Mention, options.mention)
@@ -188,17 +225,10 @@ export const RichTextKit = Extension.create<RichTextKitOptions>({
188
225
  },
189
226
  addExtensions() {
190
227
  const options = this.options
228
+ // Table is handled by commentMembers (shared, on for RichTextKit via the
229
+ // `table: {}` default below).
191
230
  const list: Extensions = commentMembers(options)
192
231
 
193
- // Table needs its row/cell/header companions.
194
- if (options.table !== false) {
195
- list.push(
196
- Table.configure(options.table),
197
- TableRow,
198
- TableCell,
199
- TableHeader,
200
- )
201
- }
202
232
  // Task list needs its item companion.
203
233
  if (options.taskList !== false) {
204
234
  list.push(TaskList.configure(options.taskList), TaskItem)
@@ -255,24 +285,17 @@ export const InlineKit = Extension.create<InlineKitOptions>({
255
285
  if (options.starterKit !== false) {
256
286
  list.push(
257
287
  OneLineDocument,
258
- // Keep the inline marks; drop every block-level affordance plus the
259
- // built-in document/link (replaced above / by the Link member).
260
- StarterKit.configure({
261
- document: false,
262
- link: false,
263
- heading: false,
264
- bulletList: false,
265
- orderedList: false,
266
- listItem: false,
267
- listKeymap: false,
268
- blockquote: false,
269
- codeBlock: false,
270
- horizontalRule: false,
271
- hardBreak: false,
272
- trailingNode: false,
273
- ...options.starterKit,
274
- }),
288
+ Text,
289
+ Paragraph,
275
290
  )
291
+ if (options.starterKit.bold !== false) list.push(Bold)
292
+ if (options.starterKit.italic !== false) list.push(Italic)
293
+ if (options.starterKit.strike !== false) list.push(Strike)
294
+ if (options.starterKit.underline !== false) list.push(Underline)
295
+ if (options.starterKit.code !== false) list.push(Code)
296
+ if (options.starterKit.dropcursor !== false) list.push(EditorDropcursor)
297
+ if (options.starterKit.gapcursor !== false) list.push(Gapcursor)
298
+ if (options.starterKit.undoRedo !== false) list.push(UndoRedo)
276
299
  }
277
300
  pushMember(list, Placeholder, options.placeholder)
278
301
  pushMember(list, Link, options.link)
@@ -254,7 +254,9 @@ describe('editor menu primitives and presets', () => {
254
254
  items: [InsertImage, InsertVideo, InsertLink],
255
255
  })
256
256
 
257
- ;(root.querySelector('[aria-label="Image"]') as HTMLButtonElement).click()
257
+ ;(
258
+ root.querySelector('[aria-label="Image / Gallery"]') as HTMLButtonElement
259
+ ).click()
258
260
  ;(root.querySelector('[aria-label="Video"]') as HTMLButtonElement).click()
259
261
  ;(root.querySelector('[aria-label="Link"]') as HTMLButtonElement).click()
260
262