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
@@ -14,6 +14,8 @@
14
14
  */
15
15
  import { describe, it, expect, vi, beforeEach } from 'vitest'
16
16
 
17
+ const createUploadId = vi.hoisted(() => vi.fn(() => 'uid-1'))
18
+
17
19
  vi.mock('#utils/file-to-base64', () => ({
18
20
  default: vi.fn(async () => 'data:image/png;base64,AAAA'),
19
21
  }))
@@ -21,12 +23,16 @@ vi.mock('#molecules/editor/extensions/shared/url-safety', () => ({
21
23
  isSafeUrl: () => true,
22
24
  }))
23
25
  vi.mock('#molecules/editor/extensions/shared/upload-id', () => ({
24
- createUploadId: () => 'uid-1',
26
+ createUploadId,
25
27
  }))
26
28
  vi.mock('#molecules/editor/extensions/shared/media-upload-state', () => ({
27
29
  setLocalFile: vi.fn(),
30
+ updateLocalFile: vi.fn(),
28
31
  getLocalFile: vi.fn(() => ({ file: new File(['x'], 'x.png') })),
29
32
  deleteLocalFile: vi.fn(),
33
+ setUploadProgress: vi.fn(),
34
+ updateUploadProgress: vi.fn(),
35
+ deleteUploadProgress: vi.fn(),
30
36
  }))
31
37
  vi.mock('#molecules/editor/extensions/shared/media-node-ops', () => ({
32
38
  insertPlaceholder: vi.fn(),
@@ -38,7 +44,10 @@ vi.mock('#molecules/editor/extensions/shared/media-node-ops', () => ({
38
44
 
39
45
  import { createMediaUploadEngine } from '#molecules/editor/extensions/shared/media-upload-engine'
40
46
  import fileToBase64 from '#utils/file-to-base64'
41
- import { setLocalFile } from '#molecules/editor/extensions/shared/media-upload-state'
47
+ import {
48
+ setLocalFile,
49
+ deleteLocalFile,
50
+ } from '#molecules/editor/extensions/shared/media-upload-state'
42
51
  import {
43
52
  insertPlaceholder,
44
53
  applyUploadSuccess,
@@ -64,6 +73,8 @@ const config: MediaUploadConfig = {
64
73
  describe('media upload engine — live editor.view', () => {
65
74
  beforeEach(() => {
66
75
  vi.clearAllMocks()
76
+ createUploadId.mockReset()
77
+ createUploadId.mockReturnValue('uid-1')
67
78
  })
68
79
 
69
80
  it('dispatches against the CURRENT editor.view, not the one captured at call time', async () => {
@@ -99,6 +110,7 @@ describe('media upload engine — live editor.view', () => {
99
110
  'replace',
100
111
  'uid-1',
101
112
  expect.anything(),
113
+ expect.anything(),
102
114
  )
103
115
 
104
116
  // Host swaps the editor's view while the upload is in flight.
@@ -141,6 +153,31 @@ describe('media upload engine — live editor.view', () => {
141
153
 
142
154
  expect(applyUploadSuccess).not.toHaveBeenCalled()
143
155
  expect(applyUploadError).not.toHaveBeenCalled()
156
+ expect(deleteLocalFile).toHaveBeenCalledWith('uid-1')
157
+ })
158
+
159
+ it('cleans up the old staged file after reupload creates a replacement upload id', async () => {
160
+ createUploadId.mockReturnValue('uid-2')
161
+ const editor = {
162
+ view: {
163
+ ...makeView(),
164
+ state: {
165
+ doc: {
166
+ nodeAt: () => ({ attrs: { uploadId: 'old-uid' } }),
167
+ },
168
+ selection: { from: 0 },
169
+ },
170
+ },
171
+ isDestroyed: false,
172
+ } as never
173
+
174
+ const engine = createMediaUploadEngine(config)
175
+ await engine.reupload(editor, 0, {
176
+ uploadFunction: async () => ({ file_url: '/files/x.png' }),
177
+ })
178
+
179
+ expect(deleteLocalFile).toHaveBeenCalledWith('uid-2')
180
+ expect(deleteLocalFile).toHaveBeenCalledWith('old-uid')
144
181
  })
145
182
 
146
183
  it('does not base64-encode files when the media config stores only the File', async () => {
@@ -20,12 +20,17 @@
20
20
  */
21
21
  import type { Editor } from '@tiptap/core'
22
22
  import fileToBase64 from '#utils/file-to-base64'
23
+ import { fileSizeLimitMessage } from '#utils/fileSize'
23
24
  import { isSafeUrl } from '#molecules/editor/extensions/shared/url-safety'
24
25
  import { findNodeByUploadId } from '#molecules/editor/extensions/shared/node-view'
25
26
  import {
26
27
  deleteLocalFile,
28
+ deleteUploadProgress,
27
29
  getLocalFile,
30
+ setUploadProgress,
28
31
  setLocalFile,
32
+ updateLocalFile,
33
+ updateUploadProgress,
29
34
  } from '#molecules/editor/extensions/shared/media-upload-state'
30
35
  import { createUploadId } from '#molecules/editor/extensions/shared/upload-id'
31
36
  import {
@@ -34,6 +39,7 @@ import {
34
39
  backfillDimensions,
35
40
  findNodeBySource,
36
41
  insertPlaceholder,
42
+ removeNodeByUploadId,
37
43
  type OptionalDimensions,
38
44
  } from '#molecules/editor/extensions/shared/media-node-ops'
39
45
  import type {
@@ -41,6 +47,7 @@ import type {
41
47
  MediaUploadConfig,
42
48
  MediaUploadEngine,
43
49
  MediaUploadOptions,
50
+ MediaUploadRequestOptions,
44
51
  UploadedFile,
45
52
  UploadResult,
46
53
  } from '#molecules/editor/extensions/shared/media-upload-types'
@@ -49,6 +56,8 @@ export type {
49
56
  MediaUploadConfig,
50
57
  MediaUploadEngine,
51
58
  MediaUploadOptions,
59
+ MediaUploadRequestOptions,
60
+ UploadFunction,
52
61
  UploadedFile,
53
62
  UploadResult,
54
63
  } from '#molecules/editor/extensions/shared/media-upload-types'
@@ -63,7 +72,9 @@ export type {
63
72
  * shared storage.)
64
73
  */
65
74
  export function resolveUploadOptions(
66
- raw: Partial<MediaUploadOptions> & { editor?: { storage?: unknown } | null } = {},
75
+ raw: Partial<MediaUploadOptions> & {
76
+ editor?: { storage?: unknown } | null
77
+ } = {},
67
78
  ): MediaUploadOptions {
68
79
  const { editor, ...options } = raw
69
80
  const storage = editor?.storage as Record<string, unknown> | undefined
@@ -85,11 +96,12 @@ export function resolveUploadOptions(
85
96
  export async function uploadFile(
86
97
  file: File,
87
98
  options: MediaUploadOptions,
99
+ requestOptions?: MediaUploadRequestOptions,
88
100
  ): Promise<UploadedFile> {
89
101
  if (!options.uploadFunction) {
90
102
  throw new Error('uploadFunction option is not provided')
91
103
  }
92
- const uploaded = await options.uploadFunction(file)
104
+ const uploaded = await options.uploadFunction(file, requestOptions)
93
105
  if (
94
106
  !uploaded?.file_url ||
95
107
  !isSafeUrl(uploaded.file_url, { base: window.location.origin })
@@ -129,7 +141,9 @@ export async function dataUrlOrBlobToFile(
129
141
  ): Promise<File> {
130
142
  const response = await fetch(src)
131
143
  const blob = await response.blob()
132
- return new File([blob], filename, { type: blob.type || 'application/octet-stream' })
144
+ return new File([blob], filename, {
145
+ type: blob.type || 'application/octet-stream',
146
+ })
133
147
  }
134
148
 
135
149
  /** Build a media-upload engine for one node type. */
@@ -166,13 +180,45 @@ export function createMediaUploadEngine(
166
180
  pos: number | null | undefined,
167
181
  mode: InsertMode,
168
182
  options: MediaUploadOptions,
183
+ placeholderAttrs: Record<string, unknown> = {},
169
184
  ): Promise<string | null> {
170
185
  if (!options.uploadFunction) {
171
186
  console.error('uploadFunction option is not provided')
172
187
  return null
173
188
  }
174
189
  const uploadId = createUploadId()
190
+ const abortController = new AbortController()
191
+ setUploadProgress(uploadId, {
192
+ loaded: 0,
193
+ total: file.size,
194
+ percent: 0,
195
+ abort: () => abortController.abort(),
196
+ })
175
197
  try {
198
+ // Reject over-limit files before the expensive staging work: no base64
199
+ // encode, no dimension probe — just an error placeholder with the staged
200
+ // file kept so "Try again" / "Choose another" still work.
201
+ const validationError = fileSizeLimitMessage(file)
202
+ if (validationError) {
203
+ setLocalFile(uploadId, { file })
204
+ if (editor.isDestroyed) {
205
+ deleteLocalFile(uploadId)
206
+ deleteUploadProgress(uploadId)
207
+ return uploadId
208
+ }
209
+ insertPlaceholder(
210
+ editor.view,
211
+ nodeName,
212
+ pos,
213
+ mode,
214
+ uploadId,
215
+ { width: null, height: null },
216
+ placeholderAttrs,
217
+ )
218
+ applyUploadError(editor.view, nodeName, uploadId, validationError)
219
+ return uploadId
220
+ }
221
+
176
222
  const b64 = storeBase64 ? await fileToBase64(file) : null
177
223
  const probeSrc = b64 ?? URL.createObjectURL(file)
178
224
  setLocalFile(uploadId, b64 ? { b64, file } : { file })
@@ -182,11 +228,36 @@ export function createMediaUploadEngine(
182
228
  } finally {
183
229
  if (!b64) URL.revokeObjectURL(probeSrc)
184
230
  }
185
- if (editor.isDestroyed) return uploadId
186
- insertPlaceholder(editor.view, nodeName, pos, mode, uploadId, dims)
231
+ if (dims.poster) updateLocalFile(uploadId, { poster: dims.poster })
232
+ if (editor.isDestroyed) {
233
+ deleteLocalFile(uploadId)
234
+ deleteUploadProgress(uploadId)
235
+ return uploadId
236
+ }
237
+ insertPlaceholder(
238
+ editor.view,
239
+ nodeName,
240
+ pos,
241
+ mode,
242
+ uploadId,
243
+ dims,
244
+ placeholderAttrs,
245
+ )
187
246
 
188
- const uploaded = await options.uploadFunction(file)
189
- if (editor.isDestroyed) return uploadId
247
+ const uploaded = await options.uploadFunction(file, {
248
+ signal: abortController.signal,
249
+ onProgress: (progress) => {
250
+ updateUploadProgress(uploadId, {
251
+ ...progress,
252
+ abort: () => abortController.abort(),
253
+ })
254
+ },
255
+ })
256
+ if (editor.isDestroyed) {
257
+ deleteLocalFile(uploadId)
258
+ deleteUploadProgress(uploadId)
259
+ return uploadId
260
+ }
190
261
  if (
191
262
  !uploaded?.file_url ||
192
263
  !isSafeUrl(uploaded.file_url, { base: window.location.origin })
@@ -204,11 +275,23 @@ export function createMediaUploadEngine(
204
275
  // survive so `reupload` ("Try again") can re-read it.
205
276
  deleteLocalFile(uploadId)
206
277
  } catch (error) {
278
+ if (abortController.signal.aborted) {
279
+ if (!editor.isDestroyed) {
280
+ removeNodeByUploadId(editor.view, nodeName, uploadId)
281
+ }
282
+ deleteLocalFile(uploadId)
283
+ deleteUploadProgress(uploadId)
284
+ return uploadId
285
+ }
207
286
  const message =
208
287
  (error as Error)?.message || `Failed to upload ${nodeName}`
209
288
  if (!editor.isDestroyed) {
210
289
  applyUploadError(editor.view, nodeName, uploadId, message)
211
290
  }
291
+ } finally {
292
+ if (!abortController.signal.aborted) {
293
+ deleteUploadProgress(uploadId)
294
+ }
212
295
  }
213
296
  return uploadId
214
297
  }
@@ -226,8 +309,9 @@ export function createMediaUploadEngine(
226
309
  editor: Editor,
227
310
  pos: number,
228
311
  options: MediaUploadOptions,
312
+ attrs: Record<string, unknown> = {},
229
313
  ): Promise<void> {
230
- await run(file, editor, pos, 'replace', options)
314
+ await run(file, editor, pos, 'replace', options, attrs)
231
315
  }
232
316
 
233
317
  async function reupload(
@@ -238,11 +322,21 @@ export function createMediaUploadEngine(
238
322
  const node = editor.view.state.doc.nodeAt(pos)
239
323
  const uploadId = node?.attrs.uploadId as string | undefined
240
324
  const entry = uploadId ? getLocalFile(uploadId) : undefined
241
- if (!entry) {
325
+ if (!uploadId || !entry) {
242
326
  console.error(`reupload: no staged file for node at ${pos}`)
243
327
  return
244
328
  }
245
- await run(entry.file, editor, pos, 'replace', options)
329
+ const replacementUploadId = await run(
330
+ entry.file,
331
+ editor,
332
+ pos,
333
+ 'replace',
334
+ options,
335
+ node?.attrs ?? {},
336
+ )
337
+ if (replacementUploadId) {
338
+ deleteLocalFile(uploadId)
339
+ }
246
340
  }
247
341
 
248
342
  /**
@@ -6,6 +6,7 @@
6
6
  * This module is the lifecycle owner of `localFileMap`; the engine deletes
7
7
  * entries here in a `finally` (covering success, error and mid-upload deletion).
8
8
  */
9
+ import { reactive } from 'vue'
9
10
 
10
11
  /**
11
12
  * A staged local file awaiting upload.
@@ -14,17 +15,38 @@
14
15
  */
15
16
  export interface LocalFileEntry {
16
17
  b64?: string
18
+ poster?: string
17
19
  file: File
18
20
  }
19
21
 
22
+ export interface UploadProgressEntry {
23
+ loaded: number
24
+ total: number
25
+ percent: number
26
+ abort?: () => void
27
+ }
28
+
20
29
  /** uploadId -> staged local file. Read by node views for the loading preview. */
21
30
  export const localFileMap = new Map<string, LocalFileEntry>()
22
31
 
32
+ /** uploadId -> transient progress/cancel state. Reactive for node views. */
33
+ export const uploadProgressMap = reactive(
34
+ new Map<string, UploadProgressEntry>(),
35
+ )
36
+
23
37
  /** Store the staged file for an upload id. */
24
38
  export function setLocalFile(uploadId: string, entry: LocalFileEntry): void {
25
39
  localFileMap.set(uploadId, entry)
26
40
  }
27
41
 
42
+ export function updateLocalFile(
43
+ uploadId: string,
44
+ patch: Partial<LocalFileEntry>,
45
+ ): void {
46
+ const current = localFileMap.get(uploadId)
47
+ if (current) localFileMap.set(uploadId, { ...current, ...patch })
48
+ }
49
+
28
50
  /** Read the staged file for an upload id, if present. */
29
51
  export function getLocalFile(uploadId: string): LocalFileEntry | undefined {
30
52
  return localFileMap.get(uploadId)
@@ -34,3 +56,36 @@ export function getLocalFile(uploadId: string): LocalFileEntry | undefined {
34
56
  export function deleteLocalFile(uploadId: string): void {
35
57
  localFileMap.delete(uploadId)
36
58
  }
59
+
60
+ export function setUploadProgress(
61
+ uploadId: string,
62
+ entry: UploadProgressEntry,
63
+ ): void {
64
+ uploadProgressMap.set(uploadId, entry)
65
+ }
66
+
67
+ export function getUploadProgress(
68
+ uploadId: string,
69
+ ): UploadProgressEntry | undefined {
70
+ return uploadProgressMap.get(uploadId)
71
+ }
72
+
73
+ export function updateUploadProgress(
74
+ uploadId: string,
75
+ patch: Partial<UploadProgressEntry>,
76
+ ): void {
77
+ const current = uploadProgressMap.get(uploadId) ?? {
78
+ loaded: 0,
79
+ total: 0,
80
+ percent: 0,
81
+ }
82
+ uploadProgressMap.set(uploadId, { ...current, ...patch })
83
+ }
84
+
85
+ export function abortUpload(uploadId: string): void {
86
+ uploadProgressMap.get(uploadId)?.abort?.()
87
+ }
88
+
89
+ export function deleteUploadProgress(uploadId: string): void {
90
+ uploadProgressMap.delete(uploadId)
91
+ }
@@ -10,6 +10,35 @@ import type { Editor } from '@tiptap/core'
10
10
  import type { UploadedFile as FrappeUploadedFile } from '#utils/useFileUpload'
11
11
  import type { MediaDimensions } from '#molecules/editor/extensions/shared/media-dimensions'
12
12
 
13
+ /**
14
+ * Programmatic upload commands, declared once in a dedicated `mediaUpload`
15
+ * group (tiptap flattens every group into `RawCommands`, so callers still use
16
+ * the flat `editor.commands.uploadVideoFiles`).
17
+ *
18
+ * Kept out of the `video` group only for symmetry with the legacy-conflict
19
+ * rationale on images: the legacy TextEditor augments `Commands.image`, so a
20
+ * divergent second declaration of a shared group is a TS2717 error. A separate
21
+ * group sidesteps that.
22
+ */
23
+ declare module '@tiptap/core' {
24
+ interface Commands<ReturnType> {
25
+ mediaUpload: {
26
+ /** Upload and insert already-provided video files (e.g. from a drop). */
27
+ uploadVideoFiles: (files: File[], pos?: number | null) => ReturnType
28
+ /** Replace an existing image node while keeping its caption/options. */
29
+ replaceImage: (pos: number, file: File) => ReturnType
30
+ /** Replace an existing video node while keeping its caption/options. */
31
+ replaceVideo: (pos: number, file: File) => ReturnType
32
+ /** Toggle video playback options. */
33
+ setVideoOptions: (options: {
34
+ autoplay?: boolean
35
+ loop?: boolean
36
+ muted?: boolean
37
+ }) => ReturnType
38
+ }
39
+ }
40
+ }
41
+
13
42
  /** Result of a successful upload. Must carry a `file_url`. */
14
43
  export interface UploadedFile extends Partial<FrappeUploadedFile> {
15
44
  file_url: string
@@ -17,13 +46,34 @@ export interface UploadedFile extends Partial<FrappeUploadedFile> {
17
46
  height?: number | null
18
47
  }
19
48
 
49
+ export interface MediaUploadProgress {
50
+ loaded: number
51
+ total: number
52
+ percent: number
53
+ }
54
+
55
+ export interface MediaUploadRequestOptions {
56
+ signal?: AbortSignal
57
+ onProgress?: (progress: MediaUploadProgress) => void
58
+ }
59
+
60
+ /**
61
+ * Host-provided upload function. The engine passes `options` (abort signal +
62
+ * progress callback) on every call; implementations may ignore it, so legacy
63
+ * single-parameter functions remain assignable.
64
+ */
65
+ export type UploadFunction = (
66
+ file: File,
67
+ options?: MediaUploadRequestOptions,
68
+ ) => Promise<UploadedFile>
69
+
20
70
  /**
21
71
  * Effective upload options. Mirrors the legacy extension option shape: the only
22
72
  * field the pipeline reads is `uploadFunction`; `HTMLAttributes` and any extra
23
73
  * keys are carried through untouched.
24
74
  */
25
75
  export interface MediaUploadOptions {
26
- uploadFunction?: ((file: File) => Promise<UploadedFile>) | null
76
+ uploadFunction?: UploadFunction | null
27
77
  HTMLAttributes?: Record<string, unknown>
28
78
  [k: string]: unknown
29
79
  }
@@ -74,6 +124,7 @@ export interface MediaUploadEngine {
74
124
  editor: Editor,
75
125
  pos: number,
76
126
  options: MediaUploadOptions,
127
+ attrs?: Record<string, unknown>,
77
128
  ): Promise<void>
78
129
  /** Re-run an upload for the failed node at `pos` using its staged file. */
79
130
  reupload(
@@ -1,4 +1,5 @@
1
1
  import type { Editor, Range } from '@tiptap/core'
2
+ import type { EditorState } from '@tiptap/pm/state'
2
3
 
3
4
  /**
4
5
  * Shared helpers for slash/emoji/mention/tag suggesters: DRY node-insertion,
@@ -46,6 +47,25 @@ export function filterByQuery<T>(items: T[], query: string, key: keyof T): T[] {
46
47
  })
47
48
  }
48
49
 
50
+ /**
51
+ * True when `pos` sits inside a code context — either a code-block node or text
52
+ * carrying the inline `code` mark. Suggesters (`@`/`#`/`:`) use this to stay
53
+ * inert inside code, where a `:emoji`/`#tag`/`@mention` trigger would otherwise
54
+ * corrupt the literal source the author is typing.
55
+ *
56
+ * Detection is structural: code-block nodes carry `spec.code === true`, and
57
+ * inline code is a mark — so we walk the resolved ancestors for the former and
58
+ * test the position's mark set for the latter.
59
+ */
60
+ export function isInCode(state: EditorState, pos: number): boolean {
61
+ const $pos = state.doc.resolve(pos)
62
+ for (let depth = $pos.depth; depth > 0; depth--) {
63
+ if ($pos.node(depth).type.spec.code) return true
64
+ }
65
+ const codeMark = state.schema.marks.code
66
+ return codeMark ? codeMark.isInSet($pos.marks()) != null : false
67
+ }
68
+
49
69
  /**
50
70
  * Typed replacement for
51
71
  * `editor.extensionManager.extensions.find((e) => e.name === name)!.options`.
@@ -19,6 +19,13 @@ export interface BaseSuggestionItem {
19
19
  display?: string
20
20
  title?: string
21
21
  name?: string
22
+ /**
23
+ * Optional section label (dropdown-group style). Consecutive items sharing
24
+ * a `group` render under one non-interactive header in `SuggestionList`;
25
+ * items without one render headerless. Display-only — keyboard navigation
26
+ * stays flat.
27
+ */
28
+ group?: string
22
29
  [key: string]: unknown
23
30
  }
24
31
 
@@ -11,6 +11,7 @@
11
11
  */
12
12
  export type {
13
13
  MediaUploadOptions,
14
+ UploadFunction,
14
15
  UploadResult,
15
16
  UploadedFile,
16
17
  } from '#molecules/editor/extensions/shared/media-upload-types'
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ */
4
+
5
+ import { describe, it, expect, vi } from 'vitest'
6
+ import { SlashCommands } from './slash-commands-extension'
7
+
8
+ describe('SlashCommands', () => {
9
+ it('opens the link editor for the Link command', () => {
10
+ const chain = {
11
+ focus: vi.fn(() => chain),
12
+ deleteRange: vi.fn(() => chain),
13
+ insertContent: vi.fn(() => chain),
14
+ setTextSelection: vi.fn(() => chain),
15
+ run: vi.fn(() => true),
16
+ }
17
+ const editor = {
18
+ schema: { marks: { link: {} }, nodes: {} },
19
+ commands: { openLinkEditor: vi.fn() },
20
+ chain: vi.fn(() => chain),
21
+ }
22
+ const options = (SlashCommands as any).config.addOptions.call({})
23
+ const [item] = options.suggestion.items({ query: 'link', editor })
24
+
25
+ options.suggestion.command({
26
+ editor,
27
+ range: { from: 3, to: 8 },
28
+ props: item,
29
+ })
30
+
31
+ expect(chain.deleteRange).toHaveBeenCalledWith({ from: 3, to: 8 })
32
+ expect(chain.insertContent).toHaveBeenCalledWith('Link')
33
+ expect(chain.setTextSelection).toHaveBeenCalledWith({ from: 3, to: 7 })
34
+ expect(editor.commands.openLinkEditor).toHaveBeenCalledWith({
35
+ startInEdit: true,
36
+ })
37
+ })
38
+ })