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
@@ -1,4 +1,39 @@
1
- export default async function call(method, args, options = {}) {
1
+ declare global {
2
+ interface Window {
3
+ csrf_token?: string
4
+ }
5
+ }
6
+
7
+ export interface CallOptions {
8
+ headers?: Record<string, string>
9
+ onError?: (context: {
10
+ response: Response
11
+ status: number
12
+ error: CallError
13
+ }) => void
14
+ }
15
+
16
+ export interface CallError extends Error {
17
+ exc_type?: string
18
+ exc?: string
19
+ status?: number
20
+ messages: string[]
21
+ }
22
+
23
+ type FrappeCallResponse = {
24
+ docs?: unknown
25
+ exc?: string
26
+ exc_type?: string
27
+ message?: unknown
28
+ _server_messages?: string
29
+ _error_message?: string
30
+ }
31
+
32
+ export default async function call<TResponse = unknown>(
33
+ method: string,
34
+ args: Record<string, any> = {},
35
+ options: CallOptions = {},
36
+ ): Promise<TResponse> {
2
37
  if (!args) {
3
38
  args = {}
4
39
  }
@@ -24,9 +59,9 @@ export default async function call(method, args, options = {}) {
24
59
  })
25
60
 
26
61
  if (res.ok) {
27
- const data = await res.json()
62
+ const data = (await res.json()) as FrappeCallResponse
28
63
  if (data.docs || method === 'login') {
29
- return data
64
+ return data as TResponse
30
65
  }
31
66
  if (data.exc) {
32
67
  try {
@@ -42,10 +77,11 @@ export default async function call(method, args, options = {}) {
42
77
  console.warn('Error printing debug messages', e)
43
78
  }
44
79
  }
45
- return data.message
80
+ return data.message as TResponse
46
81
  } else {
47
82
  let response = await res.text()
48
- let error, exception
83
+ let error: FrappeCallResponse = {}
84
+ let exception
49
85
  try {
50
86
  error = JSON.parse(response)
51
87
  // eslint-disable-next-line no-empty
@@ -61,14 +97,16 @@ export default async function call(method, args, options = {}) {
61
97
  // eslint-disable-next-line no-empty
62
98
  } catch (e) {}
63
99
  }
64
- let e = new Error(errorParts.join('\n'))
100
+ let e = new Error(errorParts.join('\n')) as CallError
65
101
  e.exc_type = error.exc_type
66
102
  e.exc = exception
67
103
  e.status = res.status
68
104
  e.messages = error._server_messages
69
105
  ? JSON.parse(error._server_messages)
70
106
  : []
71
- e.messages = e.messages.concat(error.message)
107
+ if (error.message !== undefined) {
108
+ e.messages = e.messages.concat(error.message as any)
109
+ }
72
110
  e.messages = e.messages.map((m) => {
73
111
  try {
74
112
  return JSON.parse(m).message
@@ -91,8 +129,11 @@ export default async function call(method, args, options = {}) {
91
129
  }
92
130
  }
93
131
 
94
- export function createCall(options) {
95
- return function customCall(method, args) {
132
+ export function createCall(options: CallOptions) {
133
+ return function customCall<TResponse = unknown>(
134
+ method: string,
135
+ args?: Record<string, any>,
136
+ ) {
96
137
  return call(method, args, options)
97
138
  }
98
139
  }
@@ -1,8 +1,11 @@
1
- interface FrappeUIConfig {
1
+ export interface FrappeUIConfig {
2
2
  // Timezone configurations
3
3
  systemTimezone?: string | null
4
4
  localTimezone?: string | null
5
5
 
6
+ // Max upload size in bytes (apps usually source this from their boot data)
7
+ maxFileSize?: number | null
8
+
6
9
  // Resource fetcher function
7
10
  resourceFetcher?: (options: any) => Promise<any>
8
11
 
@@ -18,6 +21,18 @@ interface FrappeUIConfig {
18
21
 
19
22
  // Error handling
20
23
  fallbackErrorHandler?: (error: any) => void
24
+ serverMessagesHandler?: (messages: string[]) => void
25
+
26
+ // Base URL prepended to relative request URLs. Set this for local UI dev
27
+ // against a remote Frappe instance (cross-origin). When set, requests default
28
+ // to `credentials: 'include'` for cookie-based auth; if you use a token via
29
+ // `requestHeaders` instead, pass `credentials: 'omit'` per request.
30
+ requestBaseUrl?: string
31
+
32
+ // Extra headers merged into every frappeRequest. Either a static object or a
33
+ // function returning headers (useful for injecting an Authorization header,
34
+ // e.g. `token <key>:<secret>`).
35
+ requestHeaders?: Record<string, string> | (() => Record<string, string>)
21
36
  }
22
37
 
23
38
  let config: FrappeUIConfig = {}
@@ -0,0 +1,17 @@
1
+ import type { Ref, VNode } from 'vue'
2
+
3
+ export interface ConfirmDialogOptions {
4
+ title?: string
5
+ message?: string
6
+ onConfirm?: () => void | Promise<void>
7
+ onCancel?: () => void | Promise<void>
8
+ }
9
+
10
+ /**
11
+ * @deprecated Use `dialog.confirm()` from `frappe-ui` instead.
12
+ */
13
+ export function confirmDialog(options: ConfirmDialogOptions): void
14
+
15
+ export const dialogs: Ref<Array<VNode & { id?: number }>>
16
+
17
+ export function renderDialog(component: VNode & { id?: number }): void
@@ -1,16 +1,15 @@
1
1
  export default function debounce(
2
- func: Function,
2
+ func: (...args: any[]) => any,
3
3
  wait: number,
4
4
  immediate?: boolean,
5
5
  ) {
6
6
  var timeout: number | undefined
7
- return function () {
7
+ return function (this: unknown, ...args: any[]) {
8
8
  var context = this,
9
- args = arguments
10
- var later = function () {
11
- timeout = undefined
12
- if (!immediate) func.apply(context, args)
13
- }
9
+ later = function () {
10
+ timeout = undefined
11
+ if (!immediate) func.apply(context, args)
12
+ }
14
13
  var callNow = immediate && !timeout
15
14
  clearTimeout(timeout)
16
15
  timeout = window.setTimeout(later, wait)
@@ -83,8 +83,8 @@ describe('dialog.ts — imperative API', () => {
83
83
  confirm({ title: 't', onConfirm })
84
84
  })
85
85
  cy.contains('button', 'Confirm').click()
86
- // loading spinner is rendered as an svg.animate-spin inside the button
87
- cy.contains('button', 'Confirm').find('svg.animate-spin').should('exist')
86
+ // loading spinner is rendered as an [role="status"] inside the button
87
+ cy.contains('button', 'Confirm').find('[role="status"]').should('exist')
88
88
  cy.contains('button', 'Cancel').should('be.disabled')
89
89
  cy.then(() => resolveOuter())
90
90
  cy.get('[role=dialog]').should('not.exist')
@@ -100,7 +100,7 @@ describe('dialog.ts — imperative API', () => {
100
100
  cy.get('[role=dialog]').contains('Network down').should('exist')
101
101
  cy.get('[role=dialog]').should('exist')
102
102
  cy.contains('button', 'Confirm')
103
- .find('svg.animate-spin')
103
+ .find('[role="status"]')
104
104
  .should('not.exist')
105
105
  })
106
106
 
@@ -159,7 +159,7 @@ describe('dialog.ts — imperative API', () => {
159
159
  cy.then(() => capturedSetError?.('Bad password'))
160
160
  cy.get('[role=dialog]').contains('Bad password').should('exist')
161
161
  cy.contains('button', 'Confirm')
162
- .find('svg.animate-spin')
162
+ .find('[role="status"]')
163
163
  .should('not.exist')
164
164
  cy.then(() => capturedSetError?.(null))
165
165
  cy.get('[role=dialog]').contains('Bad password').should('not.exist')
@@ -227,7 +227,7 @@ describe('dialog.ts — imperative API', () => {
227
227
  cy.get('[role=dialog] .lucide-alert-triangle').should('exist')
228
228
  cy.contains('button', 'Confirm').should(
229
229
  'have.class',
230
- 'bg-surface-red-5',
230
+ 'bg-surface-red-7',
231
231
  )
232
232
  })
233
233
 
@@ -297,7 +297,7 @@ describe('dialog.ts — imperative API', () => {
297
297
  })
298
298
  })
299
299
  cy.contains('button', 'A').click()
300
- cy.contains('button', 'A').find('svg.animate-spin').should('exist')
300
+ cy.contains('button', 'A').find('[role="status"]').should('exist')
301
301
  cy.contains('button', 'B').should('be.disabled')
302
302
  cy.contains('button', 'B').click({ force: true })
303
303
  cy.get('@onB').should('not.have.been.called')
@@ -323,7 +323,7 @@ describe('dialog.ts — imperative API', () => {
323
323
  cy.get('[role=dialog]').contains('Save failed').should('exist')
324
324
  cy.get('[role=dialog]').should('exist')
325
325
  cy.contains('button', 'Save')
326
- .find('svg.animate-spin')
326
+ .find('[role="status"]')
327
327
  .should('not.exist')
328
328
  })
329
329
 
@@ -337,7 +337,7 @@ describe('dialog.ts — imperative API', () => {
337
337
  cy.get('[role=dialog] .lucide-alert-triangle').should('exist')
338
338
  cy.contains('button', 'Delete')
339
339
  .should('exist')
340
- .and('have.class', 'bg-surface-red-5')
340
+ .and('have.class', 'bg-surface-red-7')
341
341
  })
342
342
 
343
343
  it('danger lets you override the confirm label', () => {
@@ -451,7 +451,7 @@ describe('dialog.ts — imperative API', () => {
451
451
  cy.get('[role=dialog]').contains('Invalid email').should('exist')
452
452
  cy.get('@onConfirm').should('not.have.been.called')
453
453
  cy.contains('button', 'Submit')
454
- .find('svg.animate-spin')
454
+ .find('[role="status"]')
455
455
  .should('not.exist')
456
456
  })
457
457
 
@@ -0,0 +1,36 @@
1
+ /**
2
+ * File-size helpers shared by every upload path (useFileUpload,
3
+ * FileUploadHandler, and the editor's media upload engine / image-group
4
+ * dialog). Single source of truth for the max-file-size lookup and the
5
+ * user-facing size-limit message.
6
+ *
7
+ * Apps provide the limit explicitly via `setConfig('maxFileSize', bytes)`
8
+ * (usually sourced from their boot data).
9
+ */
10
+ import { getConfig } from './config'
11
+
12
+ /**
13
+ * Max upload size in bytes, or null when unset. Reads the app-provided
14
+ * `maxFileSize` config.
15
+ */
16
+ export function getMaxFileSize(): number | null {
17
+ const size = Number(getConfig('maxFileSize'))
18
+ return Number.isFinite(size) && size > 0 ? size : null
19
+ }
20
+
21
+ export function formatBytes(bytes: number): string {
22
+ if (bytes >= 1024 * 1024) {
23
+ const mb = bytes / 1024 / 1024
24
+ return `${Number.isInteger(mb) ? mb : mb.toFixed(1)} MB`
25
+ }
26
+ if (bytes >= 1024) return `${Math.round(bytes / 1024)} KB`
27
+ return `${bytes} B`
28
+ }
29
+
30
+ /** Human-readable size-limit violation message, or null when the file fits. */
31
+ export function fileSizeLimitMessage(file: File | null): string | null {
32
+ if (!file) return null
33
+ const maxFileSize = getMaxFileSize()
34
+ if (!maxFileSize || file.size <= maxFileSize) return null
35
+ return `This file is ${formatBytes(file.size)}; the limit is ${formatBytes(maxFileSize)}.`
36
+ }
@@ -1,4 +1,5 @@
1
- import { UploadOptions } from "./useFileUpload"
1
+ import { isPrivateUpload, type UploadOptions } from './useFileUpload'
2
+ import { getMaxFileSize, formatBytes, fileSizeLimitMessage } from './fileSize'
2
3
 
3
4
  type EventListenerOption = 'start' | 'progress' | 'finish' | 'error'
4
5
 
@@ -8,6 +9,37 @@ declare global {
8
9
  }
9
10
  }
10
11
 
12
+ function parseServerMessages(error: any): string[] {
13
+ if (!error?._server_messages) return []
14
+ try {
15
+ return JSON.parse(error._server_messages)
16
+ .map((message: string) => {
17
+ try {
18
+ return JSON.parse(message).message
19
+ } catch {
20
+ return message
21
+ }
22
+ })
23
+ .filter(Boolean)
24
+ } catch {
25
+ return []
26
+ }
27
+ }
28
+
29
+ function extractUploadErrorMessage(error: any): string {
30
+ const messages = parseServerMessages(error)
31
+ if (messages.length) return messages.join('\n')
32
+ if (error?.message) return error.message
33
+ if (error?._error_message) return error._error_message
34
+ if (error?.exc_type === 'MaxFileSizeReachedError') {
35
+ const maxFileSize = getMaxFileSize()
36
+ return maxFileSize
37
+ ? `File size exceeded the maximum allowed size of ${formatBytes(maxFileSize)}.`
38
+ : 'File size exceeds the maximum allowed limit.'
39
+ }
40
+ return 'Error Uploading File'
41
+ }
42
+
11
43
  class FileUploadHandler {
12
44
  listeners: { [event: string]: Function[] }
13
45
  failed: boolean
@@ -31,6 +63,11 @@ class FileUploadHandler {
31
63
 
32
64
  upload(file: File | null, options: UploadOptions): Promise<any> {
33
65
  return new Promise((resolve, reject) => {
66
+ const limitMessage = fileSizeLimitMessage(file)
67
+ if (limitMessage) {
68
+ reject(new Error(limitMessage))
69
+ return
70
+ }
34
71
  let xhr = new XMLHttpRequest()
35
72
  xhr.upload.addEventListener('loadstart', () => {
36
73
  this.trigger('start')
@@ -70,7 +107,10 @@ class FileUploadHandler {
70
107
 
71
108
  if (xhr.status === 413 || xhr.status === 0) {
72
109
  error = {
73
- message: 'File size exceeds the maximum allowed limit',
110
+ message:
111
+ getMaxFileSize() != null
112
+ ? `File size exceeded the maximum allowed size of ${formatBytes(getMaxFileSize() as number)}.`
113
+ : 'File size exceeds the maximum allowed limit',
74
114
  httpStatus: 413,
75
115
  }
76
116
  } else {
@@ -85,7 +125,7 @@ class FileUploadHandler {
85
125
  console.error(JSON.parse(error.exc)[0])
86
126
  }
87
127
  this.trigger('error', error)
88
- reject(error)
128
+ reject(new Error(extractUploadErrorMessage(error)))
89
129
  }
90
130
  }
91
131
  }
@@ -103,7 +143,7 @@ class FileUploadHandler {
103
143
  if (file) {
104
144
  form_data.append('file', file, file.name)
105
145
  }
106
- form_data.append('is_private', options.private || false ? '1' : '0')
146
+ form_data.append('is_private', isPrivateUpload(options) ? '1' : '0')
107
147
  form_data.append('folder', options.folder || 'Home')
108
148
 
109
149
  if (options.file_url) {
@@ -133,10 +173,10 @@ class FileUploadHandler {
133
173
  if (options.optimize) {
134
174
  form_data.append('optimize', '1')
135
175
  if (options.max_width) {
136
- form_data.append('max_width', options.max_width.toString())
176
+ form_data.append('max_width', options.max_width.toString())
137
177
  }
138
178
  if (options.max_height) {
139
- form_data.append('max_height', options.max_height.toString())
179
+ form_data.append('max_height', options.max_height.toString())
140
180
  }
141
181
  }
142
182
 
@@ -0,0 +1,79 @@
1
+ // @vitest-environment jsdom
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
3
+ import { frappeRequest } from './frappeRequest'
4
+ import { setConfig } from './config'
5
+
6
+ function mockFetch() {
7
+ const fetchMock = vi.fn(
8
+ async (_input: RequestInfo | URL, _init?: RequestInit) =>
9
+ ({
10
+ ok: true,
11
+ json: async () => ({ message: 'ok' }),
12
+ }) as Response,
13
+ )
14
+ vi.stubGlobal('fetch', fetchMock)
15
+ return fetchMock
16
+ }
17
+
18
+ function getFetchCall(fetchMock: ReturnType<typeof mockFetch>) {
19
+ const [url, opts] = fetchMock.mock.calls[0]!
20
+ return {
21
+ url,
22
+ opts: opts as RequestInit & {
23
+ headers: Record<string, string | undefined>
24
+ },
25
+ }
26
+ }
27
+
28
+ describe('frappeRequest configurable base url and auth headers', () => {
29
+ beforeEach(() => {
30
+ setConfig('requestBaseUrl', undefined)
31
+ setConfig('requestHeaders', undefined)
32
+ })
33
+
34
+ afterEach(() => {
35
+ vi.unstubAllGlobals()
36
+ setConfig('requestBaseUrl', undefined)
37
+ setConfig('requestHeaders', undefined)
38
+ })
39
+
40
+ it('keeps default behavior when nothing is configured', async () => {
41
+ const fetchMock = mockFetch()
42
+ await frappeRequest({ url: 'ping' })
43
+
44
+ const { url, opts } = getFetchCall(fetchMock)
45
+ expect(url).toBe('/api/method/ping')
46
+ expect(opts.credentials).toBeUndefined()
47
+ expect(opts.headers.Authorization).toBeUndefined()
48
+ })
49
+
50
+ it('prepends the configured base url and includes credentials', async () => {
51
+ setConfig('requestBaseUrl', 'https://remote.frappe.test/')
52
+ const fetchMock = mockFetch()
53
+ await frappeRequest({ url: 'ping' })
54
+
55
+ const { url, opts } = getFetchCall(fetchMock)
56
+ expect(url).toBe('https://remote.frappe.test/api/method/ping')
57
+ expect(opts.credentials).toBe('include')
58
+ })
59
+
60
+ it('injects static headers from config', async () => {
61
+ setConfig('requestHeaders', { Authorization: 'token key:secret' })
62
+ const fetchMock = mockFetch()
63
+ await frappeRequest({ url: 'ping' })
64
+
65
+ const { opts } = getFetchCall(fetchMock)
66
+ expect(opts.headers.Authorization).toBe('token key:secret')
67
+ })
68
+
69
+ it('injects headers from a function returning headers', async () => {
70
+ setConfig('requestHeaders', () => ({
71
+ Authorization: 'token dynamic:value',
72
+ }))
73
+ const fetchMock = mockFetch()
74
+ await frappeRequest({ url: 'ping' })
75
+
76
+ const { opts } = getFetchCall(fetchMock)
77
+ expect(opts.headers.Authorization).toBe('token dynamic:value')
78
+ })
79
+ })
@@ -1,19 +1,63 @@
1
1
  import { getConfig } from './config'
2
- import { request } from './request'
2
+ import { request, type RequestOptions } from './request'
3
3
 
4
- export function frappeRequest(options) {
4
+ declare global {
5
+ interface Window {
6
+ csrf_token?: string
7
+ }
8
+ }
9
+
10
+ type ServerMessagesHandler = (messages: string[]) => void
11
+
12
+ export interface FrappeRequestOptions<TResponse = unknown> extends Omit<
13
+ RequestOptions<TResponse>,
14
+ 'transformRequest' | 'transformResponse' | 'transformError'
15
+ > {
16
+ onError?: (error: FrappeRequestError) => void
17
+ onServerMessages?: ServerMessagesHandler
18
+ }
19
+
20
+ export interface FrappeRequestError extends Error {
21
+ exc_type?: string
22
+ exc?: string
23
+ response?: Response
24
+ status?: number
25
+ messages: string[]
26
+ }
27
+
28
+ type FrappeResponseBody = {
29
+ docs?: unknown
30
+ exc?: string
31
+ exc_type?: string
32
+ message?: unknown
33
+ _server_messages?: string
34
+ _error_message?: string
35
+ }
36
+
37
+ export function frappeRequest<TResponse = unknown>(
38
+ options: FrappeRequestOptions<TResponse>,
39
+ ) {
40
+ const originalOptions = options
5
41
  return request({
6
42
  ...options,
7
- transformRequest: (options = {}) => {
43
+ transformRequest: (options) => {
8
44
  if (!options.url) {
9
45
  throw new Error('[frappeRequest] options.url is required')
10
46
  }
47
+ let configHeaders = getConfig('requestHeaders') || {}
48
+ if (typeof configHeaders === 'function') {
49
+ configHeaders = configHeaders()
50
+ }
11
51
  let headers = Object.assign(
12
52
  {
13
53
  Accept: 'application/json',
14
54
  'Content-Type': 'application/json; charset=utf-8',
55
+ // Sent as the local hostname even when requestBaseUrl points at a
56
+ // remote site. Harmless for dev, but pass a `requestHeaders` override
57
+ // if you need the remote site name here.
15
58
  'X-Frappe-Site-Name': window.location.hostname,
16
59
  },
60
+ configHeaders,
17
61
  options.headers || {},
18
62
  )
19
63
  if (window.csrf_token && window.csrf_token !== '{{ csrf_token }}') {
@@ -22,18 +66,31 @@ export function frappeRequest(options) {
22
66
  if (!options.url.startsWith('/') && !options.url.startsWith('http')) {
23
67
  options.url = '/api/method/' + options.url
24
68
  }
69
+ // Prepend a configured base URL to relative URLs for local dev against a
70
+ // remote instance. Default to `credentials: 'include'` so cookie-based
71
+ // cross-origin auth works out of the box (the server must then send
72
+ // Access-Control-Allow-Credentials: true and a non-wildcard origin). If
73
+ // you authenticate with a token via `requestHeaders` instead, you usually
74
+ // want cookies omitted — pass `options.credentials: 'omit'` to override.
75
+ let baseUrl = getConfig('requestBaseUrl')
76
+ let credentials = options.credentials
77
+ if (baseUrl && options.url.startsWith('/')) {
78
+ options.url = baseUrl.replace(/\/$/, '') + options.url
79
+ credentials = credentials || 'include'
80
+ }
25
81
  return {
26
82
  ...options,
27
83
  method: options.method || 'POST',
28
84
  headers,
85
+ credentials,
29
86
  }
30
87
  },
31
88
  transformResponse: async (response, options) => {
32
89
  let url = options.url
33
90
  if (response.ok) {
34
- const data = await response.json()
91
+ const data = (await response.json()) as FrappeResponseBody
35
92
  if (data.docs || url === '/api/method/login') {
36
- return data
93
+ return data as TResponse
37
94
  }
38
95
  if (data.exc) {
39
96
  try {
@@ -51,16 +108,19 @@ export function frappeRequest(options) {
51
108
 
52
109
  if (data._server_messages) {
53
110
  let onMessageHandler =
54
- getConfig('serverMessagesHandler') || options.onServerMessages || null
111
+ getConfig('serverMessagesHandler') ||
112
+ originalOptions.onServerMessages ||
113
+ null
55
114
  if (onMessageHandler) {
56
115
  onMessageHandler(JSON.parse(data?._server_messages) || [])
57
116
  }
58
117
  }
59
118
 
60
- return data.message
119
+ return data.message as TResponse
61
120
  } else {
62
121
  let errorResponse = await response.text()
63
- let error, exception
122
+ let error: FrappeResponseBody = {}
123
+ let exception
64
124
  try {
65
125
  error = JSON.parse(errorResponse)
66
126
  // eslint-disable-next-line no-empty
@@ -78,15 +138,17 @@ export function frappeRequest(options) {
78
138
  // eslint-disable-next-line no-empty
79
139
  } catch (e) {}
80
140
  }
81
- let e = new Error(errorParts.join('\n'))
141
+ let e = new Error(errorParts.join('\n')) as FrappeRequestError
82
142
  e.exc_type = error.exc_type
83
143
  e.exc = exception
84
144
  e.response = response
85
- e.status = errorResponse.status
145
+ e.status = response.status
86
146
  e.messages = error._server_messages
87
147
  ? JSON.parse(error._server_messages)
88
148
  : []
89
- e.messages = e.messages.concat(error.message)
149
+ if (error.message !== undefined) {
150
+ e.messages = e.messages.concat(error.message as any)
151
+ }
90
152
  e.messages = e.messages.map((m) => {
91
153
  try {
92
154
  return JSON.parse(m).message
@@ -100,12 +162,13 @@ export function frappeRequest(options) {
100
162
  ? [error._error_message]
101
163
  : ['Internal Server Error']
102
164
  }
103
- options.onError && options.onError(e)
165
+ originalOptions.onError && originalOptions.onError(e)
104
166
  throw e
105
167
  }
106
168
  },
107
169
  transformError: (error) => {
108
- options.onError && options.onError(error)
170
+ originalOptions.onError &&
171
+ originalOptions.onError(error as FrappeRequestError)
109
172
  throw error
110
173
  },
111
174
  })
@@ -36,7 +36,7 @@ export function usePageMeta(fn: PageMetaFunction): StopWatcherFunction {
36
36
  try {
37
37
  return fn()
38
38
  } catch (error) {
39
- if (process.env.NODE_ENV === 'development') {
39
+ if (import.meta.env.DEV) {
40
40
  console.warn('Failed to parse pageMeta in', fn)
41
41
  console.error(error)
42
42
  }