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
@@ -0,0 +1,58 @@
1
+ import type { App } from 'vue'
2
+ import resourcesPlugin from '../resources/plugin'
3
+ import call from './call'
4
+ import initSocket from './socketio'
5
+ import { setConfig, type FrappeUIConfig } from './config'
6
+
7
+ export interface FrappeUIPluginOptions {
8
+ resources?: boolean | Record<string, any>
9
+ call?: boolean | typeof call
10
+ socketio?: boolean | Parameters<typeof initSocket>[0]
11
+ config?: Partial<FrappeUIConfig>
12
+ }
13
+
14
+ let defaultOptions: Required<
15
+ Pick<FrappeUIPluginOptions, 'resources' | 'call' | 'socketio'>
16
+ > = {
17
+ resources: true,
18
+ call: true,
19
+ socketio: true,
20
+ }
21
+
22
+ export default {
23
+ install(app: App, options: FrappeUIPluginOptions = {}) {
24
+ options = Object.assign({}, defaultOptions, options)
25
+
26
+ // Declarative app-level config — the preferred way for apps to pass values
27
+ // like resourceFetcher, endpoint overrides, maxFileSize, and timezones in
28
+ // one place at app creation:
29
+ //
30
+ // app.use(FrappeUI, { config: { maxFileSize: boot.max_file_size, ... } })
31
+ //
32
+ // `setConfig` remains available for values that arrive later (e.g. after a
33
+ // login response). Null/undefined entries are skipped so callers can pass
34
+ // possibly-unset values without clobbering defaults.
35
+ if (options.config) {
36
+ for (let key of Object.keys(options.config) as Array<
37
+ keyof FrappeUIConfig
38
+ >) {
39
+ if (options.config[key] != null) {
40
+ setConfig(key, options.config[key])
41
+ }
42
+ }
43
+ }
44
+
45
+ options.resources && app.use(resourcesPlugin, options.resources)
46
+
47
+ if (options.call) {
48
+ let callFunction =
49
+ typeof options.call === 'function' ? options.call : call
50
+ app.config.globalProperties.$call = callFunction
51
+ }
52
+ if (options.socketio) {
53
+ app.config.globalProperties.$socket = initSocket(
54
+ typeof options.socketio === 'object' ? options.socketio : {},
55
+ )
56
+ }
57
+ },
58
+ }
@@ -1,4 +1,28 @@
1
- export function request(_options) {
1
+ export interface RequestOptions<TResponse = unknown> {
2
+ url: string
3
+ method?: string
4
+ headers?: HeadersInit
5
+ params?: Record<string, any>
6
+ responseType?: 'json' | 'response'
7
+ signal?: AbortSignal
8
+ credentials?: RequestCredentials
9
+ transformRequest?: (
10
+ options: RequestOptions<TResponse>,
11
+ ) => RequestOptions<TResponse>
12
+ transformResponse?: (
13
+ response: Response,
14
+ options: RequestOptions<TResponse>,
15
+ ) => TResponse | Promise<TResponse>
16
+ transformError?: (error: unknown) => TResponse | Promise<TResponse>
17
+ }
18
+
19
+ export interface RequestError extends Error {
20
+ response?: Response
21
+ }
22
+
23
+ export function request<TResponse = unknown>(
24
+ _options: RequestOptions<TResponse>,
25
+ ): Promise<TResponse> {
2
26
  let options = Object.assign({}, _options)
3
27
  if (!options.url) {
4
28
  throw new Error('[request] options.url is required')
@@ -19,7 +43,7 @@ export function request(_options) {
19
43
  if (options.method === 'GET') {
20
44
  let params = new URLSearchParams()
21
45
  for (let key in options.params) {
22
- params.append(key, options.params[key])
46
+ params.append(key, String(options.params[key]))
23
47
  }
24
48
  url = options.url + '?' + params.toString()
25
49
  } else {
@@ -32,6 +56,7 @@ export function request(_options) {
32
56
  headers: options.headers,
33
57
  body,
34
58
  signal: options.signal,
59
+ ...(options.credentials ? { credentials: options.credentials } : {}),
35
60
  })
36
61
  .then((response) => {
37
62
  if (options.transformResponse) {
@@ -43,7 +68,7 @@ export function request(_options) {
43
68
  }
44
69
  return response
45
70
  } else {
46
- let error = new Error(response.statusText)
71
+ let error: RequestError = new Error(response.statusText)
47
72
  error.response = response
48
73
  throw error
49
74
  }
@@ -1,6 +1,16 @@
1
1
  import { io } from 'socket.io-client'
2
2
 
3
- export default function initSocket(options = {}) {
3
+ declare global {
4
+ interface Window {
5
+ site_name?: string
6
+ }
7
+ }
8
+
9
+ export interface InitSocketOptions {
10
+ port?: number
11
+ }
12
+
13
+ export default function initSocket(options: InitSocketOptions = {}) {
4
14
  let host = window.location.hostname
5
15
  let siteName = import.meta.env.DEV ? host : window.site_name
6
16
  let socketio_port = options.port || 9000
@@ -1,69 +1,60 @@
1
- import { ref, onMounted, Ref } from 'vue'
1
+ import { ref, type Ref } from 'vue'
2
2
 
3
3
  export type Theme = 'light' | 'dark' | 'system'
4
4
 
5
- export function useTheme() {
6
- const currentTheme: Ref<Theme> = ref('light')
7
-
8
- const getSystemTheme = (): 'light' | 'dark' => {
9
- return window.matchMedia('(prefers-color-scheme: dark)').matches
10
- ? 'dark'
11
- : 'light'
12
- }
13
-
14
- const toggleTheme = (): void => {
15
- const theme: Theme = currentTheme.value === 'dark' ? 'light' : 'dark'
16
- setTheme(theme)
17
- }
5
+ const isBrowser = typeof window !== 'undefined'
18
6
 
19
- const setTheme = (theme: Theme): void => {
20
- currentTheme.value = theme
7
+ // Singleton state: hoisted to module scope so every `useTheme()` consumer reads
8
+ // and writes the same ref. The switcher card, a toggle button, and anything
9
+ // else mirror each other in real time, all driving one `<html data-theme>`.
10
+ const currentTheme: Ref<Theme> = ref('light')
21
11
 
22
- if (theme === 'system') {
23
- const systemTheme = getSystemTheme()
24
- document.documentElement.setAttribute('data-theme', systemTheme)
25
- } else {
26
- document.documentElement.setAttribute('data-theme', theme)
27
- }
28
-
29
- localStorage.setItem('theme', theme)
30
- }
12
+ function getSystemTheme(): 'light' | 'dark' {
13
+ if (!isBrowser) return 'light'
14
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
15
+ ? 'dark'
16
+ : 'light'
17
+ }
31
18
 
32
- const initializeTheme = (): void => {
33
- const storedTheme = localStorage.getItem('theme') as Theme | null
34
- if (storedTheme && ['light', 'dark', 'system'].includes(storedTheme)) {
35
- setTheme(storedTheme)
36
- } else {
37
- // Default to system theme
38
- setTheme('system')
39
- }
40
- }
19
+ function applyTheme(theme: Theme): void {
20
+ if (!isBrowser) return
21
+ const resolved = theme === 'system' ? getSystemTheme() : theme
22
+ document.documentElement.setAttribute('data-theme', resolved)
23
+ }
41
24
 
42
- onMounted(() => {
43
- initializeTheme()
25
+ function setTheme(theme: Theme): void {
26
+ currentTheme.value = theme
27
+ applyTheme(theme)
28
+ if (isBrowser) localStorage.setItem('theme', theme)
29
+ }
44
30
 
45
- // Listen for system theme changes
46
- const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
47
- const handleSystemThemeChange = () => {
48
- if (currentTheme.value === 'system') {
49
- const systemTheme = getSystemTheme()
50
- document.documentElement.setAttribute('data-theme', systemTheme)
51
- }
52
- }
31
+ function toggleTheme(): void {
32
+ setTheme(currentTheme.value === 'dark' ? 'light' : 'dark')
33
+ }
53
34
 
54
- mediaQuery.addEventListener('change', handleSystemThemeChange)
35
+ function initializeTheme(): void {
36
+ if (!isBrowser) return
37
+ const storedTheme = localStorage.getItem('theme') as Theme | null
38
+ const isValid = storedTheme && ['light', 'dark', 'system'].includes(storedTheme)
39
+ setTheme(isValid ? (storedTheme as Theme) : 'system')
40
+ }
55
41
 
56
- // Cleanup listener on unmount
57
- return () => {
58
- mediaQuery.removeEventListener('change', handleSystemThemeChange)
59
- }
60
- })
42
+ // Restore the saved theme and keep `system` in sync with the OS. Runs once for
43
+ // the whole app; the listener lives for the app's lifetime by design, so there
44
+ // is no per-component listener to leak.
45
+ let initialized = false
46
+ function ensureInitialized(): void {
47
+ if (initialized || !isBrowser) return
48
+ initialized = true
49
+ initializeTheme()
50
+ window
51
+ .matchMedia('(prefers-color-scheme: dark)')
52
+ .addEventListener('change', () => {
53
+ if (currentTheme.value === 'system') applyTheme('system')
54
+ })
55
+ }
61
56
 
62
- return {
63
- currentTheme,
64
- toggleTheme,
65
- setTheme,
66
- initializeTheme,
67
- getSystemTheme,
68
- }
57
+ export function useTheme() {
58
+ ensureInitialized()
59
+ return { currentTheme, toggleTheme, setTheme, initializeTheme, getSystemTheme }
69
60
  }
@@ -1,7 +1,11 @@
1
1
  import { reactive, computed } from 'vue'
2
+ import { getMaxFileSize, formatBytes, fileSizeLimitMessage } from './fileSize'
3
+
4
+ export type UploadPrivacy = boolean | 0 | 1 | '0' | '1'
2
5
 
3
6
  export interface UploadOptions {
4
7
  private?: boolean
8
+ is_private?: UploadPrivacy
5
9
  folder?: string
6
10
  file_url?: string
7
11
  doctype?: string
@@ -14,6 +18,24 @@ export interface UploadOptions {
14
18
  max_width?: number
15
19
  max_height?: number
16
20
  params?: object
21
+ signal?: AbortSignal
22
+ onProgress?: (progress: {
23
+ loaded: number
24
+ total: number
25
+ percent: number
26
+ }) => void
27
+ }
28
+
29
+ export function isPrivateUpload(options: UploadOptions = {}) {
30
+ if (options.private !== undefined) return options.private
31
+ if (options.is_private !== undefined) {
32
+ return (
33
+ options.is_private === true ||
34
+ options.is_private === 1 ||
35
+ options.is_private === '1'
36
+ )
37
+ }
38
+ return false
17
39
  }
18
40
 
19
41
  export interface UploadState {
@@ -41,6 +63,37 @@ export interface UploadedFile {
41
63
  content_hash?: string
42
64
  }
43
65
 
66
+ function parseServerMessages(error: any): string[] {
67
+ if (!error?._server_messages) return []
68
+ try {
69
+ return JSON.parse(error._server_messages)
70
+ .map((message: string) => {
71
+ try {
72
+ return JSON.parse(message).message
73
+ } catch {
74
+ return message
75
+ }
76
+ })
77
+ .filter(Boolean)
78
+ } catch {
79
+ return []
80
+ }
81
+ }
82
+
83
+ function extractUploadErrorMessage(error: any): string {
84
+ const messages = parseServerMessages(error)
85
+ if (messages.length) return messages.join('\n')
86
+ if (error?._error_message) return error._error_message
87
+ if (error?.message) return error.message
88
+ if (error?.exc_type === 'MaxFileSizeReachedError') {
89
+ const maxFileSize = getMaxFileSize()
90
+ return maxFileSize
91
+ ? `File size exceeded the maximum allowed size of ${formatBytes(maxFileSize)}.`
92
+ : 'File size exceeds the maximum allowed limit.'
93
+ }
94
+ return 'Upload failed'
95
+ }
96
+
44
97
  export function useFileUpload() {
45
98
  const state = reactive<UploadState>({
46
99
  uploading: false,
@@ -86,6 +139,11 @@ async function upload(
86
139
  reset: () => void,
87
140
  ): Promise<UploadedFile> {
88
141
  reset()
142
+ const limitMessage = fileSizeLimitMessage(file)
143
+ if (limitMessage) {
144
+ state.error = new Error(limitMessage)
145
+ return Promise.reject(state.error)
146
+ }
89
147
  state.uploading = true
90
148
 
91
149
  return new Promise((resolve, reject) => {
@@ -97,11 +155,22 @@ async function upload(
97
155
  state.error = null
98
156
  })
99
157
 
158
+ const abort = () => {
159
+ xhr.abort()
160
+ }
161
+
162
+ options.signal?.addEventListener('abort', abort, { once: true })
163
+
100
164
  xhr.upload.addEventListener('progress', (e) => {
101
165
  if (e.lengthComputable) {
102
166
  state.uploaded = e.loaded
103
167
  state.total = e.total
104
168
  state.progress = Math.round((e.loaded / e.total) * 100)
169
+ options.onProgress?.({
170
+ loaded: e.loaded,
171
+ total: e.total,
172
+ percent: state.progress,
173
+ })
105
174
  }
106
175
  })
107
176
 
@@ -112,11 +181,20 @@ async function upload(
112
181
  xhr.addEventListener('error', (error) => {
113
182
  state.uploading = false
114
183
  state.error = 'Upload failed'
184
+ options.signal?.removeEventListener('abort', abort)
115
185
  reject('Upload failed')
116
186
  })
117
187
 
188
+ xhr.addEventListener('abort', () => {
189
+ state.uploading = false
190
+ state.error = 'Upload cancelled'
191
+ options.signal?.removeEventListener('abort', abort)
192
+ reject(new DOMException('Upload cancelled', 'AbortError'))
193
+ })
194
+
118
195
  xhr.onreadystatechange = () => {
119
196
  if (xhr.readyState == XMLHttpRequest.DONE) {
197
+ options.signal?.removeEventListener('abort', abort)
120
198
  let error
121
199
  if (xhr.status === 200) {
122
200
  let r = null
@@ -141,9 +219,6 @@ async function upload(
141
219
 
142
220
  if (error) {
143
221
  let exception
144
- let errorParts = [
145
- [error.exc_type, error._error_message].filter(Boolean).join(' '),
146
- ]
147
222
  if (error.exc) {
148
223
  exception = error.exc
149
224
  try {
@@ -152,25 +227,7 @@ async function upload(
152
227
  // eslint-disable-next-line no-empty
153
228
  } catch (e) {}
154
229
  }
155
- let e = new Error(errorParts.join('\n'))
156
- let messages = error._server_messages
157
- ? JSON.parse(error._server_messages)
158
- : []
159
- messages = messages
160
- .map((m: string) => {
161
- try {
162
- return JSON.parse(m).message
163
- } catch (error) {
164
- return m
165
- }
166
- })
167
- .filter(Boolean)
168
- if (!messages.length) {
169
- messages = error._error_message
170
- ? [error._error_message]
171
- : ['Internal Server Error']
172
- }
173
- e.message = messages.join('\n')
230
+ let e = new Error(extractUploadErrorMessage(error))
174
231
  state.error = e
175
232
  reject(e)
176
233
  }
@@ -192,7 +249,7 @@ async function upload(
192
249
  formData.append('file', file, file.name)
193
250
  }
194
251
 
195
- formData.append('is_private', options.private ? '1' : '0')
252
+ formData.append('is_private', isPrivateUpload(options) ? '1' : '0')
196
253
  formData.append('folder', options.folder || 'Home')
197
254
 
198
255
  if (options.file_url) {
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Token drift audit for the Espresso v2 migration.
4
+ *
5
+ * Source of truth = the Figma export under espresso-v2-design-tokens/.
6
+ * Compares the resolved values of every themed token (surface/ink/outline)
7
+ * against a baseline git ref, and against the Figma token set, then reports:
8
+ *
9
+ * 1. BUILD-BREAKING — a token whose color ref no longer resolves (missing shade).
10
+ * 2. SILENT DRIFT — token kept, but its resolved hex changed baseline -> HEAD.
11
+ * Catches BOTH mapping drift (ref points elsewhere) and
12
+ * primitive drift (same ref, shade hex moved, e.g. the
13
+ * surface-white / gray-900 #0f0f0f -> #1f1f1f case).
14
+ * 3. LEGACY — token present in code but absent from the Figma export.
15
+ * Deprecation candidate; we suggest a replacement by
16
+ * matching resolved hex against live Figma tokens.
17
+ *
18
+ * Usage: node tailwind/audit-token-drift.js [baselineRef]
19
+ * baselineRef defaults to v0.1.278
20
+ */
21
+ const { execSync } = require('child_process')
22
+ const fs = require('fs')
23
+ const path = require('path')
24
+
25
+ const ROOT = path.resolve(__dirname, '..')
26
+ const BASELINE = process.argv[2] || 'v0.1.278'
27
+ const GROUPS = ['surface', 'ink', 'outline']
28
+ const MODES = ['light', 'dark']
29
+
30
+ function loadJSON(p) {
31
+ return JSON.parse(fs.readFileSync(path.join(ROOT, p), 'utf8'))
32
+ }
33
+ function loadFromRef(ref, p) {
34
+ try {
35
+ return JSON.parse(execSync(`git show ${ref}:${p}`, { cwd: ROOT }).toString())
36
+ } catch (e) {
37
+ return null
38
+ }
39
+ }
40
+
41
+ // Resolve a color ref like "lightMode/gray/900" or "neutral/white" to a hex.
42
+ // Returns { hex } on success or { missing: ref } when the shade is absent.
43
+ function resolveRef(ref, palette) {
44
+ if (typeof ref !== 'string') return { hex: null }
45
+ const parts = ref.split('/')
46
+ let node = palette
47
+ for (const part of parts) {
48
+ if (node && typeof node === 'object' && part in node) node = node[part]
49
+ else return { missing: ref }
50
+ }
51
+ if (typeof node === 'string') return { hex: node.toLowerCase() }
52
+ return { missing: ref }
53
+ }
54
+
55
+ // All themed tokens resolved to hex for a given colors.json object.
56
+ function resolveAll(colors) {
57
+ const out = {}
58
+ for (const mode of MODES) {
59
+ for (const group of GROUPS) {
60
+ const map = colors?.themedVariables?.[mode]?.[group] || {}
61
+ for (const key of Object.keys(map)) {
62
+ const id = `${mode}.${group}.${key}`
63
+ out[id] = { ref: map[key], ...resolveRef(map[key], colors) }
64
+ }
65
+ }
66
+ }
67
+ return out
68
+ }
69
+
70
+ // Figma semantic token keys per group (union of Light + Dark styles).
71
+ function figmaKeySet() {
72
+ const fl = loadJSON('espresso-v2-design-tokens/Styles.Light.tokens.json')
73
+ const fd = loadJSON('espresso-v2-design-tokens/Styles.Dark.tokens.json')
74
+ const set = {}
75
+ for (const g of GROUPS) {
76
+ set[g] = new Set([...Object.keys(fl[g] || {}), ...Object.keys(fd[g] || {})])
77
+ }
78
+ return set
79
+ }
80
+
81
+ // Count usages of a `${prefix}-${key}` token across src/ Tailwind classes.
82
+ function usageCount(group, key) {
83
+ const prefix = { surface: 'bg-surface', ink: 'text-ink', outline: '(border|ring|outline)-outline' }[group]
84
+ const pattern = `\\b(${prefix})-${key}\\b`
85
+ try {
86
+ const out = execSync(
87
+ `grep -rhoE '${pattern}' src 2>/dev/null | wc -l`,
88
+ { cwd: ROOT },
89
+ ).toString().trim()
90
+ return parseInt(out, 10) || 0
91
+ } catch {
92
+ return 0
93
+ }
94
+ }
95
+
96
+ function main() {
97
+ const headColors = loadJSON('tailwind/colors.json')
98
+ const baseColors = loadFromRef(BASELINE, 'tailwind/colors.json')
99
+ const head = resolveAll(headColors)
100
+ const base = baseColors ? resolveAll(baseColors) : null
101
+ const figma = figmaKeySet()
102
+
103
+ const broken = []
104
+ const drift = []
105
+ const legacy = []
106
+
107
+ // Build a hex -> figma token index for replacement suggestions.
108
+ const hexToFigma = {}
109
+ for (const id of Object.keys(head)) {
110
+ const [, group, key] = id.split('.')
111
+ if (figma[group].has(key) && head[id].hex) {
112
+ ;(hexToFigma[head[id].hex] ||= new Set()).add(`${group}.${key}`)
113
+ }
114
+ }
115
+
116
+ for (const id of Object.keys(head)) {
117
+ const [, group, key] = id.split('.')
118
+ const h = head[id]
119
+
120
+ if (h.missing) broken.push({ id, ref: h.missing })
121
+
122
+ if (base && base[id] && base[id].hex && h.hex && base[id].hex !== h.hex) {
123
+ const sameRef = base[id].ref === h.ref
124
+ drift.push({
125
+ id,
126
+ from: base[id].hex,
127
+ to: h.hex,
128
+ kind: sameRef ? 'primitive' : 'mapping',
129
+ refFrom: base[id].ref,
130
+ refTo: h.ref,
131
+ })
132
+ }
133
+
134
+ if (!figma[group].has(key)) {
135
+ const suggestions = [...(hexToFigma[h.hex] || [])].filter((s) => s !== `${group}.${key}`)
136
+ legacy.push({ id, group, key, hex: h.hex, uses: usageCount(group, key), suggestions })
137
+ }
138
+ }
139
+
140
+ const seenLegacy = new Set()
141
+ const dedupLegacy = legacy.filter((l) => {
142
+ const k = `${l.group}.${l.key}`
143
+ if (seenLegacy.has(k)) return false
144
+ seenLegacy.add(k)
145
+ return true
146
+ })
147
+
148
+ console.log(`# Token Drift Audit — baseline ${BASELINE} -> HEAD\n`)
149
+
150
+ console.log(`## 1. Build-breaking (ref no longer resolves) — ${broken.length}\n`)
151
+ if (!broken.length) console.log('_none_\n')
152
+ for (const b of broken) console.log(`- \`${b.id}\` → missing shade \`${b.ref}\``)
153
+
154
+ console.log(`\n## 2. Silent drift (resolved hex changed) — ${drift.length}\n`)
155
+ if (!base) console.log(`_baseline ${BASELINE} not available_\n`)
156
+ else if (!drift.length) console.log('_none_\n')
157
+ else {
158
+ console.log('| token | kind | from | to | ref change |')
159
+ console.log('| --- | --- | --- | --- | --- |')
160
+ for (const d of drift) {
161
+ const refCol = d.kind === 'mapping' ? `${d.refFrom} → ${d.refTo}` : d.refTo
162
+ console.log(`| \`${d.id}\` | ${d.kind} | ${d.from} | ${d.to} | ${refCol} |`)
163
+ }
164
+ }
165
+
166
+ console.log(`\n## 3. Legacy tokens (in code, absent from Figma) — ${dedupLegacy.length}\n`)
167
+ console.log('| token | hex | uses in src | suggested replacement (same hex) |')
168
+ console.log('| --- | --- | --- | --- |')
169
+ for (const l of dedupLegacy.sort((a, b) => b.uses - a.uses)) {
170
+ console.log(
171
+ `| \`${l.group}.${l.key}\` | ${l.hex || '?'} | ${l.uses} | ${l.suggestions.join(', ') || '—'} |`,
172
+ )
173
+ }
174
+ }
175
+
176
+ main()