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
@@ -63,7 +63,7 @@
63
63
  <div class="grid h-full w-20 grid-cols-1">
64
64
  <span
65
65
  v-for="time in 24"
66
- class="flex h-[72px] items-end justify-center text-center text-sm font-normal text-ink-gray-5"
66
+ class="flex h-[72px] items-end justify-center text-center text-sm text-ink-gray-5"
67
67
  :style="{ height: `${hourHeight}px` }"
68
68
  />
69
69
  </div>
@@ -99,9 +99,9 @@
99
99
  :key="calendarEvent.id"
100
100
  :date="currentDate"
101
101
  >
102
- <template #event-popover-content="slotProps">
102
+ <template #event-popover-content="slotProps">
103
103
  <slot name="event-popover-content" v-bind="slotProps" />
104
- </template>
104
+ </template>
105
105
  </CalendarWeekDayEvent>
106
106
  <!-- Current time Marker -->
107
107
  <CalendarTimeMarker :date="currentDate" />
@@ -112,7 +112,7 @@
112
112
  </div>
113
113
  </template>
114
114
 
115
- <script setup>
115
+ <script setup lang="ts">
116
116
  import { computed, inject, onMounted, ref, watch } from 'vue'
117
117
  import CalendarTimeMarker from './CalendarTimeMarker.vue'
118
118
  import { Button } from '../Button'
@@ -123,27 +123,24 @@ import {
123
123
  } from './calendarUtils'
124
124
  import useCalendarData from './composables/useCalendarData'
125
125
  import CalendarWeekDayEvent from './CalendarWeekDayEvent.vue'
126
+ import {
127
+ CALENDAR_ACTIONS_KEY,
128
+ type CalendarConfig,
129
+ type CalendarEvent,
130
+ } from './types'
126
131
 
127
- const props = defineProps({
128
- events: {
129
- type: Object,
130
- required: false,
131
- },
132
- config: {
133
- type: Object,
134
- },
135
- currentDate: {
136
- type: Object,
137
- required: true,
138
- },
139
- })
132
+ const props = defineProps<{
133
+ events?: CalendarEvent[]
134
+ config: CalendarConfig
135
+ currentDate: Date
136
+ }>()
140
137
  const timedEvents = computed(
141
138
  () => useCalendarData(props.events).timedEvents.value,
142
139
  )
143
140
  const fullDayEvents = computed(
144
141
  () => useCalendarData(props.events).fullDayEvents.value,
145
142
  )
146
- const gridRef = ref(null)
143
+ const gridRef = ref<HTMLElement | null>(null)
147
144
  const hourHeight = props.config.hourHeight
148
145
  const minuteHeight = hourHeight / 60
149
146
 
@@ -169,8 +166,12 @@ const timeArray =
169
166
  onMounted(() => {
170
167
  const currentHour = new Date().getHours()
171
168
  const scrollToHour = props.config.scrollToHour || currentHour
172
- gridRef.value.scrollBy(0, scrollToHour * 60 * minuteHeight - 10)
169
+ gridRef.value?.scrollBy(0, scrollToHour * 60 * minuteHeight - 10)
173
170
  })
174
171
 
175
- const calendarActions = inject('calendarActions')
172
+ const calendarActions = inject(CALENDAR_ACTIONS_KEY)
173
+
174
+ if (!calendarActions) {
175
+ throw new Error('CalendarDaily must be rendered inside Calendar.')
176
+ }
176
177
  </script>
@@ -1,10 +1,17 @@
1
1
  <template>
2
- <Popover placement="left" transition="default" @open="registerDeleteShortcut" @close="unregisterDeleteShortcut">
2
+ <Popover
3
+ placement="left"
4
+ transition="default"
5
+ @open="registerDeleteShortcut"
6
+ @close="unregisterDeleteShortcut"
7
+ >
3
8
  <template #target="{ togglePopover, isOpen }">
4
9
  <div
5
10
  v-bind="$attrs"
6
11
  class="event flex gap-1.5 min-h-6 mx-px rounded p-[5px] transition-all duration-75 w-full overflow-hidden"
7
- :class="{ active: activeEvent == (props.event?.id || props.event?.name) }"
12
+ :class="{
13
+ active: activeEvent == (props.event?.id || props.event?.name),
14
+ }"
8
15
  :style="eventBgStyle"
9
16
  @click.stop="handleEventClick($event, togglePopover, isOpen)"
10
17
  @dblclick.prevent="handleEventEdit($event)"
@@ -14,11 +21,16 @@
14
21
  class="event-border w-[2px] rounded shrink-0"
15
22
  :style="eventBorderStyle"
16
23
  />
17
- <div class="relative flex h-full select-none items-start gap-2 overflow-hidden">
18
- <div v-if="config.showIcon && eventIcons[props.event.type]">
19
- <component :is="eventIcons[props.event.type]" class="h-4 w-4 text-black" />
24
+ <div
25
+ class="relative flex h-full select-none items-start gap-2 overflow-hidden"
26
+ >
27
+ <div v-if="config.showIcon && eventIcon">
28
+ <component :is="eventIcon" class="h-4 w-4 text-black" />
20
29
  </div>
21
- <p class="text-sm font-medium truncate" :class="{ italic: !props.event.title }">
30
+ <p
31
+ class="text-sm-medium truncate"
32
+ :class="{ italic: !props.event.title }"
33
+ >
22
34
  {{ props.event.title || '[No title]' }}
23
35
  </p>
24
36
  </div>
@@ -58,15 +70,20 @@
58
70
  <NewEventModal v-model="showEventModal" :event="updatedEvent" />
59
71
  </template>
60
72
 
61
- <script setup>
73
+ <script setup lang="ts">
62
74
  import './style.css'
63
75
 
64
76
  import EventModalContent from './EventModalContent.vue'
65
77
  import NewEventModal from './NewEventModal.vue'
66
78
  import Popover from '../Popover/Popover.vue'
67
- import { eventProps, useEventBase } from './useEventBase.js'
79
+ import { useEventBase } from './useEventBase'
80
+ import { computed } from 'vue'
81
+ import type { CalendarEvent } from './types'
68
82
 
69
- const props = defineProps(eventProps)
83
+ const props = defineProps<{
84
+ event: CalendarEvent
85
+ date: Date
86
+ }>()
70
87
 
71
88
  defineOptions({ inheritAttrs: false })
72
89
 
@@ -85,4 +102,8 @@ const {
85
102
  registerDeleteShortcut,
86
103
  unregisterDeleteShortcut,
87
104
  } = useEventBase(props)
105
+
106
+ const eventIcon = computed(() =>
107
+ props.event.type ? eventIcons[props.event.type] : null,
108
+ )
88
109
  </script>
@@ -32,11 +32,15 @@
32
32
  @click="calendarActions.handleCellClick($event, date)"
33
33
  >
34
34
  <div class="flex justify-center font-normal">
35
- <div class="flex gap-0.5 w-full flex-col items-center text-xs text-right">
35
+ <div
36
+ class="flex gap-0.5 w-full flex-col items-center text-xs text-right"
37
+ >
36
38
  <span
37
39
  class="w-full flex justify-between items-center"
38
40
  :class="[
39
- date.toDateString() === new Date().toDateString() ? 'p-[3px] pb-0.5' : 'p-2',
41
+ date.toDateString() === new Date().toDateString()
42
+ ? 'p-[3px] pb-0.5'
43
+ : 'p-2',
40
44
  ]"
41
45
  >
42
46
  <div></div>
@@ -44,8 +48,8 @@
44
48
  class="cursor-pointer"
45
49
  :class="[
46
50
  date.toDateString() === new Date().toDateString()
47
- ? 'flex items-center justify-center bg-surface-gray-7 text-ink-white rounded size-[25px]'
48
- : 'bg-surface-white ',
51
+ ? 'flex items-center justify-center bg-surface-gray-10 text-ink-base rounded size-[25px]'
52
+ : 'bg-surface-base ',
49
53
  isCurrentMonth(date) ? 'text-ink-gray-6' : 'text-ink-gray-4',
50
54
  ]"
51
55
  @click.stop="
@@ -87,7 +91,9 @@
87
91
  <ShowMoreCalendarEvent
88
92
  v-if="timedEvents[parseDate(date)]"
89
93
  :draggable="config.isEditMode"
90
- @dragstart="onDragStart($event, timedEvents[parseDate(date)][0].id)"
94
+ @dragstart="
95
+ onDragStart($event, timedEvents[parseDate(date)][0].id)
96
+ "
91
97
  @dragend="$event.target.style.opacity = '1'"
92
98
  @dragover.prevent
93
99
  :events="timedEvents[parseDate(date)]"
@@ -107,42 +113,43 @@
107
113
  </div>
108
114
  </template>
109
115
 
110
- <script setup>
116
+ <script setup lang="ts">
111
117
  import { daysList, parseDate, isWeekend } from './calendarUtils'
112
118
  import { inject } from 'vue'
113
119
  import useCalendarData from './composables/useCalendarData'
114
120
  import { computed } from 'vue'
115
121
  import ShowMoreCalendarEvent from './ShowMoreCalendarEvent.vue'
116
122
  import CalendarMonthEvent from './CalendarMonthEvent.vue'
117
- const props = defineProps({
118
- events: {
119
- type: Object,
120
- required: true,
121
- },
122
- currentMonthDates: {
123
- type: Array,
124
- required: true,
125
- },
126
- currentMonth: {
127
- type: Number,
128
- required: true,
129
- },
130
- config: {
131
- type: Object,
132
- },
133
- })
123
+ import {
124
+ CALENDAR_ACTIONS_KEY,
125
+ type CalendarConfig,
126
+ type CalendarEvent,
127
+ } from './types'
128
+
129
+ const props = defineProps<{
130
+ events: CalendarEvent[]
131
+ currentMonthDates: Date[]
132
+ currentMonth: number
133
+ config: CalendarConfig
134
+ }>()
134
135
 
135
- const emit = defineEmits(['setCurrentDate'])
136
+ const emit = defineEmits<{
137
+ setCurrentDate: [date: Date]
138
+ }>()
136
139
 
137
- const timedEvents = computed(() => useCalendarData(props.events, 'Month').timedEvents.value)
140
+ const timedEvents = computed(
141
+ () => useCalendarData(props.events, 'Month').timedEvents.value,
142
+ )
138
143
 
139
- const maxEventsInCell = computed(() => (props.currentMonthDates.length > 35 ? 1 : 2))
144
+ const maxEventsInCell = computed(() =>
145
+ props.currentMonthDates.length > 35 ? 1 : 2,
146
+ )
140
147
 
141
- function isCurrentMonth(date) {
148
+ function isCurrentMonth(date: Date) {
142
149
  return date.getMonth() === props.currentMonth
143
150
  }
144
151
 
145
- function isPreviousMonth(date) {
152
+ function isPreviousMonth(date: Date) {
146
153
  let previousMonth = false
147
154
  if (date.getMonth() === props.currentMonth - 1) {
148
155
  previousMonth = true
@@ -150,7 +157,7 @@ function isPreviousMonth(date) {
150
157
  return previousMonth
151
158
  }
152
159
 
153
- function isNextMonth(date) {
160
+ function isNextMonth(date: Date) {
154
161
  let nextMonth = false
155
162
  if (date.getMonth() === props.currentMonth + 1) {
156
163
  nextMonth = true
@@ -158,25 +165,39 @@ function isNextMonth(date) {
158
165
  return nextMonth
159
166
  }
160
167
 
161
- const calendarActions = inject('calendarActions')
168
+ const calendarActions = inject(CALENDAR_ACTIONS_KEY)
162
169
 
163
- const onDragStart = (event, calendarEventID) => {
170
+ if (!calendarActions) {
171
+ throw new Error('CalendarMonthly must be rendered inside Calendar.')
172
+ }
173
+
174
+ const onDragStart = (
175
+ event: DragEvent,
176
+ calendarEventID?: CalendarEvent['id'],
177
+ ) => {
164
178
  if (!calendarEventID) return
165
- event.target.style.opacity = '0.5'
166
- event.target.style.cursor = 'move'
179
+ const target = event.target as HTMLElement | null
180
+ if (target) {
181
+ target.style.opacity = '0.5'
182
+ target.style.cursor = 'move'
183
+ }
184
+ if (!event.dataTransfer) return
167
185
  event.dataTransfer.dropEffect = 'move'
168
186
  event.dataTransfer.effectAllowed = 'move'
169
- event.dataTransfer.setData('calendarEventID', calendarEventID)
187
+ event.dataTransfer.setData('calendarEventID', String(calendarEventID))
170
188
  }
171
189
 
172
- const onDrop = (event, date) => {
173
- let calendarEventID = event.dataTransfer.getData('calendarEventID')
190
+ const onDrop = (event: DragEvent, date: Date) => {
191
+ let calendarEventID = event.dataTransfer?.getData('calendarEventID')
174
192
  if (!calendarEventID) return
175
- event.target.style.cursor = 'default'
193
+ const target = event.target as HTMLElement | null
194
+ if (target) target.style.cursor = 'default'
176
195
  // if same date then return
177
- let e = props.events.find((e) => e.id === calendarEventID)
196
+ let e = props.events.find((e) => String(e.id) === calendarEventID)
197
+ if (!e) return
178
198
  if (parseDate(date) === e.date) return
179
- let calendarEvent = props.events.find((e) => e.id === calendarEventID)
199
+ let calendarEvent = props.events.find((e) => String(e.id) === calendarEventID)
200
+ if (!calendarEvent) return
180
201
  calendarEvent.date = parseDate(date)
181
202
  calendarEvent.fromDate = calendarEvent.date
182
203
  calendarEvent.toDate = calendarEvent.date
@@ -9,19 +9,20 @@
9
9
  </Tooltip>
10
10
  </div>
11
11
  </template>
12
- <script setup>
12
+ <script setup lang="ts">
13
13
  import Tooltip from '../Tooltip/Tooltip.vue'
14
14
  import { dayjs } from '../../utils/dayjs'
15
15
  import { computed, inject } from 'vue'
16
+ import { CALENDAR_CONFIG_KEY } from './types'
16
17
 
17
- const props = defineProps({
18
- date: {
19
- type: [String, Date],
20
- required: true,
21
- },
22
- })
18
+ const props = defineProps<{
19
+ date: string | Date
20
+ }>()
23
21
 
24
- const config = inject('config')
22
+ const config = inject(CALENDAR_CONFIG_KEY)
23
+ if (!config) {
24
+ throw new Error('CalendarTimeMarker must be rendered inside Calendar.')
25
+ }
25
26
  const hourHeight = config.hourHeight
26
27
  const minuteHeight = hourHeight / 60
27
28
 
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <Popover
3
- :placement="activeView === 'Week' ? 'left' : 'center'"
3
+ :placement="popoverPlacement"
4
4
  transition="default"
5
5
  :style="containerStyle"
6
6
  @open="registerDeleteShortcut"
@@ -10,7 +10,9 @@
10
10
  <div
11
11
  ref="eventRef"
12
12
  class="event min-h-6 mx-px shadow rounded transition-all duration-75 shrink-0"
13
- :class="{ active: activeEvent == (props.event?.id || props.event?.name) }"
13
+ :class="{
14
+ active: activeEvent == (props.event?.id || props.event?.name),
15
+ }"
14
16
  :style="innerStyle"
15
17
  @click.prevent="handleEventClick($event, togglePopover)"
16
18
  @dblclick.prevent="handleEventEdit($event)"
@@ -22,14 +24,16 @@
22
24
  class="event-border h-full w-[2px] rounded shrink-0"
23
25
  :style="eventBorderStyle"
24
26
  />
25
- <div class="relative flex h-full select-none items-start gap-2 overflow-hidden">
26
- <div v-if="config.showIcon && eventIcons[props.event.type]">
27
- <component :is="eventIcons[props.event.type]" class="h-4 w-4" />
27
+ <div
28
+ class="relative flex h-full select-none items-start gap-2 overflow-hidden"
29
+ >
30
+ <div v-if="config.showIcon && eventIcon">
31
+ <component :is="eventIcon" class="h-4 w-4" />
28
32
  </div>
29
33
  <div class="flex w-fit flex-col gap-0.5 overflow-hidden">
30
34
  <p
31
35
  ref="eventTitleRef"
32
- class="text-sm font-medium event-title"
36
+ class="text-sm-medium event-title"
33
37
  :class="lineClampClass"
34
38
  >
35
39
  {{ props.event.title || '[No title]' }}
@@ -37,17 +41,21 @@
37
41
  <p
38
42
  ref="eventTimeRef"
39
43
  v-if="!props.event.isFullDay"
40
- class="text-xs font-normal event-subtitle"
44
+ class="text-xs event-subtitle"
41
45
  >
42
46
  {{
43
- formattedDuration(updatedEvent.fromTime, updatedEvent.toTime, config.timeFormat)
47
+ formattedDuration(
48
+ updatedEvent.fromTime || '',
49
+ updatedEvent.toTime || '',
50
+ config.timeFormat,
51
+ )
44
52
  }}
45
53
  </p>
46
54
  </div>
47
55
  </div>
48
56
  </div>
49
57
  <div
50
- v-if="config.isEditMode && !event.isFullDay"
58
+ v-if="config.isEditMode && !props.event.isFullDay"
51
59
  class="absolute -bottom-1 h-3 w-full cursor-ns-resize"
52
60
  @mousedown="handleResizeMouseDown"
53
61
  />
@@ -87,14 +95,14 @@
87
95
  <NewEventModal v-model="showEventModal" :event="updatedEvent" />
88
96
  </template>
89
97
 
90
- <script setup>
98
+ <script setup lang="ts">
91
99
  import './style.css'
92
100
 
93
101
  import { ref, inject, computed, reactive } from 'vue'
94
102
  import EventModalContent from './EventModalContent.vue'
95
103
  import NewEventModal from './NewEventModal.vue'
96
104
  import Popover from '../Popover/Popover.vue'
97
- import { eventProps, useEventBase } from './useEventBase.js'
105
+ import { useEventBase } from './useEventBase'
98
106
  import {
99
107
  calculateMinutes,
100
108
  convertMinutesToHours,
@@ -102,8 +110,12 @@ import {
102
110
  parseDate,
103
111
  formattedDuration,
104
112
  } from './calendarUtils'
113
+ import { ACTIVE_VIEW_KEY, type CalendarEvent } from './types'
105
114
 
106
- const props = defineProps(eventProps)
115
+ const props = defineProps<{
116
+ event: CalendarEvent
117
+ date: Date
118
+ }>()
107
119
 
108
120
  const {
109
121
  activeEvent,
@@ -123,18 +135,29 @@ const {
123
135
  unregisterDeleteShortcut,
124
136
  } = useEventBase(props)
125
137
 
126
- const activeView = inject('activeView')
138
+ const activeView = inject(ACTIVE_VIEW_KEY)!
139
+
140
+ if (!activeView) {
141
+ throw new Error('CalendarWeekDayEvent must be rendered inside Calendar.')
142
+ }
127
143
 
128
144
  const minuteHeight = config.hourHeight / 60
129
145
  const height15Min = minuteHeight * 15
130
146
  const heightThreshold = 40
131
147
  const minimumHeight = 32.5
132
148
 
149
+ const popoverPlacement = computed(
150
+ () => (activeView.value === 'Week' ? 'left' : 'center') as any,
151
+ )
152
+ const eventIcon = computed(() =>
153
+ props.event.type ? eventIcons[props.event.type] : null,
154
+ )
155
+
133
156
  // ── Refs ─────────────────────────────────────────────────────────────────
134
157
 
135
- const eventRef = ref(null)
136
- const eventTitleRef = ref(null)
137
- const eventTimeRef = ref(null)
158
+ const eventRef = ref<HTMLElement | null>(null)
159
+ const eventTitleRef = ref<HTMLElement | null>(null)
160
+ const eventTimeRef = ref<HTMLElement | null>(null)
138
161
 
139
162
  // ── Drag state ────────────────────────────────────────────────────────────
140
163
 
@@ -153,15 +176,23 @@ const containerStyle = computed(() => {
153
176
  }
154
177
  }
155
178
 
156
- const diff = calculateDiff(calendarEvent.value.fromTime, calendarEvent.value.toTime)
179
+ const diff = calculateDiff(
180
+ calendarEvent.value.fromTime || '00:00',
181
+ calendarEvent.value.toTime || '00:00',
182
+ )
157
183
  let height = diff * minuteHeight
158
184
  if (height < heightThreshold) height = minimumHeight
159
185
 
160
- const top = calculateMinutes(calendarEvent.value.fromTime) * minuteHeight
186
+ const top =
187
+ calculateMinutes(calendarEvent.value.fromTime || '00:00') * minuteHeight
161
188
  const hallNumber = calendarEvent.value.hallNumber || 0
162
189
 
163
- const width = isResizing.value || isRepositioning.value ? '100%' : `${93 - hallNumber * 20}%`
164
- const left = isResizing.value || isRepositioning.value ? '0' : `${hallNumber * 20}%`
190
+ const width =
191
+ isResizing.value || isRepositioning.value
192
+ ? '100%'
193
+ : `${93 - hallNumber * 20}%`
194
+ const left =
195
+ isResizing.value || isRepositioning.value ? '0' : `${hallNumber * 20}%`
165
196
 
166
197
  return {
167
198
  position: 'absolute',
@@ -171,7 +202,8 @@ const containerStyle = computed(() => {
171
202
  height: `${height}px`,
172
203
  zIndex: isResizing.value || isRepositioning.value ? 100 : 0,
173
204
  transform: `translate(${state.xAxis}px, ${state.yAxis}px)`,
174
- transition: isResizing.value || isRepositioning.value ? 'none' : 'all 0.1s ease',
205
+ transition:
206
+ isResizing.value || isRepositioning.value ? 'none' : 'all 0.1s ease',
175
207
  }
176
208
  })
177
209
 
@@ -196,7 +228,7 @@ const lineClampClass = computed(() => {
196
228
  const computedStyle = getComputedStyle(eventTitleRef.value)
197
229
  const lineHeight = parseFloat(computedStyle.lineHeight)
198
230
  const maxLines = Math.max(1, Math.floor(availableHeightForTitle / lineHeight))
199
- const clampMap = {
231
+ const clampMap: Record<number, string> = {
200
232
  1: 'line-clamp-1',
201
233
  2: 'line-clamp-2',
202
234
  3: 'line-clamp-3',
@@ -209,15 +241,17 @@ const lineClampClass = computed(() => {
209
241
 
210
242
  // ── Resize ────────────────────────────────────────────────────────────────
211
243
 
212
- function newEventEndTime(newHeight) {
244
+ function newEventEndTime(newHeight: string) {
213
245
  let newEndTime =
214
- parseFloat(newHeight) / minuteHeight + calculateMinutes(calendarEvent.value.fromTime)
246
+ parseFloat(newHeight) / minuteHeight +
247
+ calculateMinutes(calendarEvent.value.fromTime || '00:00')
215
248
  newEndTime = Math.floor(newEndTime)
216
249
  if (newEndTime > 1440) newEndTime = 1440
217
250
  return convertMinutesToHours(newEndTime)
218
251
  }
219
252
 
220
253
  function handleResizeMouseDown() {
254
+ if (!eventRef.value) return
221
255
  isResizing.value = true
222
256
  isRepositioning.value = false
223
257
 
@@ -225,10 +259,12 @@ function handleResizeMouseDown() {
225
259
  window.addEventListener('mousemove', resize)
226
260
  window.addEventListener('mouseup', stopResize, { once: true })
227
261
 
228
- function resize(e) {
262
+ function resize(e: MouseEvent) {
229
263
  preventClick.value = true
264
+ if (!eventRef.value) return
230
265
  const diffX = e.clientY - eventRef.value.getBoundingClientRect().top
231
- eventRef.value.style.height = Math.round(diffX / height15Min) * height15Min + 'px'
266
+ eventRef.value.style.height =
267
+ Math.round(diffX / height15Min) * height15Min + 'px'
232
268
  eventRef.value.style.width = '100%'
233
269
  updatedEvent.toTime = newEventEndTime(eventRef.value.style.height)
234
270
  calendarEvent.value.toTime = newEventEndTime(eventRef.value.style.height)
@@ -245,11 +281,16 @@ function handleResizeMouseDown() {
245
281
 
246
282
  // ── Reposition ────────────────────────────────────────────────────────────
247
283
 
248
- function handleRepositionMouseDown(e, isPopoverOpen, closePopover) {
284
+ function handleRepositionMouseDown(
285
+ e: MouseEvent,
286
+ isPopoverOpen: boolean,
287
+ closePopover: () => void,
288
+ ) {
249
289
  if (!config.isEditMode) return
250
290
 
251
291
  e.preventDefault()
252
292
  const prevY = e.clientY
293
+ if (!eventRef.value) return
253
294
  const rect = eventRef.value.getBoundingClientRect()
254
295
 
255
296
  if (isResizing.value) return
@@ -257,7 +298,7 @@ function handleRepositionMouseDown(e, isPopoverOpen, closePopover) {
257
298
  window.addEventListener('mousemove', mousemove)
258
299
  window.addEventListener('mouseup', mouseup)
259
300
 
260
- function mousemove(e) {
301
+ function mousemove(e: MouseEvent) {
261
302
  if (isPopoverOpen) closePopover()
262
303
  isRepositioning.value = true
263
304
  preventClick.value = true
@@ -271,7 +312,7 @@ function handleRepositionMouseDown(e, isPopoverOpen, closePopover) {
271
312
  calendarEvent.value.toTime !== updatedEvent.toTime
272
313
  }
273
314
 
274
- function mouseup(e) {
315
+ function mouseup(e: MouseEvent) {
275
316
  e.preventDefault()
276
317
  isRepositioning.value = false
277
318
  if (!eventRef.value) return
@@ -279,14 +320,17 @@ function handleRepositionMouseDown(e, isPopoverOpen, closePopover) {
279
320
  if (calendarEvent.value.isFullDay && activeView.value === 'Week') {
280
321
  eventRef.value.style.width = '90%'
281
322
  }
282
- if (calendarEvent.value.date !== updatedEvent.date) isEventUpdated.value = true
323
+ if (calendarEvent.value.date !== updatedEvent.date)
324
+ isEventUpdated.value = true
283
325
 
284
326
  if (isEventUpdated.value) {
285
327
  calendarEvent.value.date = updatedEvent.date
286
328
  calendarEvent.value.fromDate = updatedEvent.date
287
329
  calendarEvent.value.toDate = updatedEvent.date
288
- calendarEvent.value.fromDateTime = updatedEvent.date + ' ' + updatedEvent.fromTime
289
- calendarEvent.value.toDateTime = updatedEvent.date + ' ' + updatedEvent.toTime
330
+ calendarEvent.value.fromDateTime =
331
+ updatedEvent.date + ' ' + updatedEvent.fromTime
332
+ calendarEvent.value.toDateTime =
333
+ updatedEvent.date + ' ' + updatedEvent.toTime
290
334
  calendarEvent.value.fromTime = updatedEvent.fromTime
291
335
  calendarEvent.value.toTime = updatedEvent.toTime
292
336
  calendarActions.updateEventState(calendarEvent.value)
@@ -300,8 +344,9 @@ function handleRepositionMouseDown(e, isPopoverOpen, closePopover) {
300
344
  }
301
345
  }
302
346
 
303
- function handleHorizontalMovement(clientX, rect) {
304
- const currentDate = new Date(props.event.date)
347
+ function handleHorizontalMovement(clientX: number, rect: DOMRect) {
348
+ const currentDate = new Date(props.event.date || props.date)
349
+ if (!eventRef.value) return
305
350
  if (props.event.isFullDay) eventRef.value.style.width = '100%'
306
351
 
307
352
  const eventWidth = eventRef.value.clientWidth
@@ -313,14 +358,22 @@ function handleHorizontalMovement(clientX, rect) {
313
358
 
314
359
  state.xAxis = Math.ceil(diff * eventWidth)
315
360
  updatedEvent.date = parseDate(
316
- new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate() + diff),
361
+ new Date(
362
+ currentDate.getFullYear(),
363
+ currentDate.getMonth(),
364
+ currentDate.getDate() + diff,
365
+ ),
317
366
  )
318
367
  }
319
368
 
320
- function handleVerticalMovement(clientY, prevY, rect) {
369
+ function handleVerticalMovement(clientY: number, prevY: number, rect: DOMRect) {
370
+ if (!eventRef.value) return
321
371
  let diffY = clientY - prevY
322
372
 
323
- const parentRect = eventRef.value.closest('[data-time-grid]').getBoundingClientRect()
373
+ const parentRect = eventRef.value
374
+ .closest('[data-time-grid]')
375
+ ?.getBoundingClientRect()
376
+ if (!parentRect) return
324
377
  if (clientY < parentRect.top) diffY = parentRect.top - rect.top
325
378
  if (clientY > parentRect.bottom) diffY = parentRect.bottom - rect.bottom
326
379
 
@@ -328,15 +381,18 @@ function handleVerticalMovement(clientY, prevY, rect) {
328
381
  state.yAxis = diffY
329
382
 
330
383
  updatedEvent.fromTime = convertMinutesToHours(
331
- calculateMinutes(calendarEvent.value.fromTime) + Math.round(diffY / minuteHeight),
384
+ calculateMinutes(calendarEvent.value.fromTime || '00:00') +
385
+ Math.round(diffY / minuteHeight),
332
386
  )
333
387
  updatedEvent.toTime = convertMinutesToHours(
334
- calculateMinutes(calendarEvent.value.toTime) + Math.round(diffY / minuteHeight),
388
+ calculateMinutes(calendarEvent.value.toTime || '00:00') +
389
+ Math.round(diffY / minuteHeight),
335
390
  )
336
391
 
337
- for (const key of ['fromTime', 'toTime']) {
338
- if (updatedEvent[key] < '00:00:00') updatedEvent[key] = '00:00:00'
339
- if (updatedEvent[key] > '24:00:00') updatedEvent[key] = '24:00:00'
392
+ for (const key of ['fromTime', 'toTime'] as const) {
393
+ const value = updatedEvent[key] || ''
394
+ if (value < '00:00:00') updatedEvent[key] = '00:00:00'
395
+ if (value > '24:00:00') updatedEvent[key] = '24:00:00'
340
396
  }
341
397
  }
342
398
  </script>