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,22 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import { Button, Popover } from 'frappe-ui'
4
+
5
+ const open = ref(false)
6
+ </script>
7
+
8
+ <template>
9
+ <div class="flex items-center gap-2">
10
+ <Button @click="open = !open">Toggle from outside</Button>
11
+ <Popover v-model:open="open">
12
+ <template #trigger>
13
+ <Button>Trigger</Button>
14
+ </template>
15
+ <template #default>
16
+ <div class="p-3 text-p-sm text-ink-gray-7">
17
+ Open state is controlled via <code>v-model:open</code>.
18
+ </div>
19
+ </template>
20
+ </Popover>
21
+ </div>
22
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { Button, Popover } from 'frappe-ui'
3
+ </script>
4
+
5
+ <template>
6
+ <Popover :dismissible="false">
7
+ <template #trigger>
8
+ <Button>Stays open</Button>
9
+ </template>
10
+ <template #default="{ close }">
11
+ <div class="p-3 text-ink-gray-9">
12
+ <p class="text-p-sm">
13
+ Clicking outside won't close this. Use the button instead.
14
+ </p>
15
+ <Button class="mt-2" @click="close()">Close</Button>
16
+ </div>
17
+ </template>
18
+ </Popover>
19
+ </template>
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import { Button, Popover } from 'frappe-ui'
3
+ </script>
4
+
5
+ <template>
6
+ <Popover match-trigger-width>
7
+ <template #trigger>
8
+ <Button class="w-64">Wide trigger</Button>
9
+ </template>
10
+ <template #default>
11
+ <div class="p-3 text-p-sm text-ink-gray-7">
12
+ The content's min-width matches the trigger width.
13
+ </div>
14
+ </template>
15
+ </Popover>
16
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import { Button, Popover } from 'frappe-ui'
3
+ </script>
4
+
5
+ <template>
6
+ <Popover side="right" align="center">
7
+ <template #trigger>
8
+ <Button>Open on the right</Button>
9
+ </template>
10
+ <template #default>
11
+ <div class="p-3 text-p-sm text-ink-gray-7">
12
+ Positioned with <code>side="right"</code> and
13
+ <code>align="center"</code>.
14
+ </div>
15
+ </template>
16
+ </Popover>
17
+ </template>
@@ -1,40 +1,118 @@
1
+ export type PopoverSide = 'top' | 'right' | 'bottom' | 'left'
2
+ export type PopoverAlign = 'start' | 'center' | 'end'
3
+
4
+ /** Legacy placement union (deprecated — use `side` + `align`). */
5
+ export type PopoverPlacement =
6
+ | 'top-start'
7
+ | 'top-end'
8
+ | 'bottom-start'
9
+ | 'bottom-end'
10
+ | 'right-start'
11
+ | 'right-end'
12
+ | 'left-start'
13
+ | 'left-end'
14
+ | 'top'
15
+ | 'bottom'
16
+ | 'right'
17
+ | 'left'
18
+
1
19
  export interface PopoverProps {
2
- /** Controls visibility of the popover */
20
+ /** Controls visibility (v-model:open). */
21
+ open?: boolean
22
+
23
+ /** Side of the trigger to render the content on. */
24
+ side?: PopoverSide
25
+
26
+ /** Alignment of the content along the chosen side. */
27
+ align?: PopoverAlign
28
+
29
+ /** Distance in px between the trigger and the content. */
30
+ offset?: number
31
+
32
+ /** Where to portal the content. */
33
+ portalTo?: string | HTMLElement
34
+
35
+ /** Padding in px kept from the viewport edge during collision handling. */
36
+ collisionPadding?: number
37
+
38
+ /** Whether the popover closes on outside interaction (click/focus). */
39
+ dismissible?: boolean
40
+
41
+ /** Whether the content's min-width matches the trigger width. */
42
+ matchTriggerWidth?: boolean
43
+
44
+ /**
45
+ * Render `#default` without the panel shell (no background, border, shadow,
46
+ * or rounding). The content brings its own surface. Mirrors Dialog's `bare`.
47
+ */
48
+ bare?: boolean
49
+
50
+ /**
51
+ * Render a small arrow pointing at the trigger. Styled to match the panel
52
+ * surface.
53
+ */
54
+ arrow?: boolean
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // Deprecated props (kept working through v1.x — see Popover.vue back-compat).
58
+ // ---------------------------------------------------------------------------
59
+
60
+ /** @deprecated Use `open` / `v-model:open`. */
3
61
  show?: boolean
4
62
 
5
- /** Event that triggers the popover */
63
+ /** @deprecated Use `<HoverCard>` for hover behavior. */
6
64
  trigger?: 'click' | 'hover'
7
65
 
8
- /** Delay in ms before showing popover on hover */
66
+ /** @deprecated Use `<HoverCard>` (`hoverDelay`, in seconds). */
9
67
  hoverDelay?: number
10
68
 
11
- /** Delay in ms before hiding popover on hover leave */
69
+ /** @deprecated Use `<HoverCard>` (`leaveDelay`, in seconds). */
12
70
  leaveDelay?: number
13
71
 
14
- /** Placement of the popover relative to the target */
15
- placement?:
16
- | 'top-start'
17
- | 'top-end'
18
- | 'bottom-start'
19
- | 'bottom-end'
20
- | 'right-start'
21
- | 'right-end'
22
- | 'left-start'
23
- | 'left-end'
24
- | 'top'
25
- | 'bottom'
26
- | 'right'
27
- | 'left'
72
+ /** @deprecated Use `side` + `align`. */
73
+ placement?: PopoverPlacement
74
+
75
+ /** @deprecated Use the `data-slot` CSS hooks (no-op). */
28
76
  popoverClass?: string | object | Array<string | object>
29
77
 
30
- /** Transition style to use */
78
+ /** @deprecated Motion is now built in (no-op). */
31
79
  transition?: 'default' | null
32
80
 
33
- /** Whether to hide the popover when clicking outside */
81
+ /** @deprecated Use `dismissible`. */
34
82
  hideOnBlur?: boolean
35
83
 
36
- /** Whether the popover width should match the target element */
84
+ /** @deprecated Use `matchTriggerWidth`. */
37
85
  matchTargetWidth?: boolean
38
- offset?: number
39
- collisionPadding?: number
86
+ }
87
+
88
+ export interface PopoverEmits {
89
+ /** Fired when the open state changes (canonical). */
90
+ (event: 'update:open', value: boolean): void
91
+ /** Fired when the popover opens. */
92
+ (event: 'open'): void
93
+ /** Fired when the popover closes. */
94
+ (event: 'close'): void
95
+ /** @deprecated Use `update:open`. */
96
+ (event: 'update:show', value: boolean): void
97
+ }
98
+
99
+ /** Slot props passed to the new `#trigger` / `#default` slots. */
100
+ export interface PopoverSlotProps {
101
+ open: () => void
102
+ close: () => void
103
+ toggle: (flag?: boolean | Event) => void
104
+ isOpen: boolean
105
+ }
106
+
107
+ /**
108
+ * Slot props passed to the deprecated `#target` / `#body` / `#body-main`
109
+ * slots. Preserved verbatim so existing callers do not double-toggle.
110
+ */
111
+ export interface PopoverLegacySlotProps {
112
+ togglePopover: () => void
113
+ updatePosition: () => void
114
+ open: () => void
115
+ close: () => void
116
+ toggle: (flag?: boolean | Event) => void
117
+ isOpen: boolean
40
118
  }
@@ -49,11 +49,11 @@ describe('Progress', () => {
49
49
  const filledCount = Math.round((value / 100) * intervalCount)
50
50
 
51
51
  // verify number of intervals divs
52
- // only filled intervals needs gray-7
52
+ // only filled intervals needs gray-10
53
53
  cy.get('[role=progressbar] div')
54
54
  .should('have.length', intervalCount)
55
55
  .each((x, i: number) => {
56
- const bgclass = `bg-surface-gray-${i < filledCount ? 7 : 2}`
56
+ const bgclass = `bg-surface-gray-${i < filledCount ? 10 : 2}`
57
57
  cy.wrap(x).should('have.class', bgclass)
58
58
  })
59
59
  })
@@ -2,6 +2,10 @@
2
2
 
3
3
  Visually represents progress or completion of a task. Updates dynamically to give users clear feedback on status.
4
4
 
5
+ ## Playground
6
+
7
+ <ClientOnly><ProgressBuilder /></ClientOnly>
8
+
5
9
  ## Examples
6
10
  <ComponentPreview name="Progress-Examples" />
7
11
 
@@ -4,7 +4,7 @@
4
4
  v-if="props.label || props.hint"
5
5
  class="flex items-baseline justify-between"
6
6
  >
7
- <span v-if="props.label" class="text-base font-medium text-ink-gray-8">
7
+ <span v-if="props.label" class="text-base-medium text-ink-gray-8">
8
8
  {{ props.label }}
9
9
  </span>
10
10
  <!-- Empty for alignment -->
@@ -12,7 +12,7 @@
12
12
 
13
13
  <span class="self-end" v-if="props.hint || $slots.hint">
14
14
  <slot name="hint">
15
- <span class="text-base font-medium text-ink-gray-4">
15
+ <span class="text-base-medium text-ink-gray-4">
16
16
  {{ props.value }}%
17
17
  </span>
18
18
  </slot>
@@ -30,7 +30,7 @@
30
30
  <!-- Continuous Progress Bar -->
31
31
  <div
32
32
  v-if="!props.intervals"
33
- class="h-full bg-surface-gray-7"
33
+ class="h-full bg-surface-gray-10"
34
34
  :style="`width: ${props.value}%`"
35
35
  ></div>
36
36
 
@@ -41,7 +41,7 @@
41
41
  class="h-full w-full"
42
42
  :class="
43
43
  index <= filledIntervalCount
44
- ? 'bg-surface-gray-7'
44
+ ? 'bg-surface-gray-10'
45
45
  : 'bg-surface-gray-2'
46
46
  "
47
47
  ></div>
@@ -0,0 +1,91 @@
1
+ <!-- Auto Generated by scripts/propsgen.ts -->
2
+ <script setup>
3
+ import PropsTable from '@/components/Docs/PropsTable.vue'
4
+ import SlotsTable from '@/components/Docs/SlotsTable.vue'
5
+ import EmitsTable from '@/components/Docs/EmitsTable.vue'
6
+
7
+ const railSlots = [
8
+ {
9
+ name: 'default',
10
+ description: '',
11
+ type: '{}'
12
+ }
13
+ ]
14
+
15
+ const railItemProps = [
16
+ {
17
+ name: 'label',
18
+ description: 'Tooltip text and the base of the item\'s accessible label.',
19
+ required: true,
20
+ type: 'string'
21
+ },
22
+ {
23
+ name: 'icon',
24
+ description: 'Icon CSS class, e.g. `lucide-search`, or a component. Rendered centered in the cell.\nIgnored when the default slot is used (for an image, avatar, or initials).',
25
+ required: false,
26
+ type: 'string | Component'
27
+ },
28
+ {
29
+ name: 'to',
30
+ description: 'Navigation target. When set, the item renders as a router link; otherwise\nit renders as a button. A `click` event fires in both cases.',
31
+ required: false,
32
+ type: 'string | kt | Tt'
33
+ },
34
+ {
35
+ name: 'active',
36
+ description: 'Marks the item as the current destination (indicator bar / active fill).',
37
+ required: false,
38
+ type: 'boolean'
39
+ },
40
+ {
41
+ name: 'badge',
42
+ description: 'Unread count. Drives the badge and folds into the accessible label.',
43
+ required: false,
44
+ type: 'number',
45
+ default: '0'
46
+ },
47
+ {
48
+ name: 'badgeStyle',
49
+ description: 'How the badge renders: a count pill or a small dot.',
50
+ required: false,
51
+ type: '"count" | "dot"',
52
+ default: '"count"'
53
+ },
54
+ {
55
+ name: 'variant',
56
+ description: 'Visual treatment.\n- `tile` (default): a filled cell with a left indicator bar when active —\n for image/avatar items like communities or workspaces.\n- `ghost`: transparent until hovered, a raised highlight when active — for\n icon shortcuts like Search or Notifications.',
57
+ required: false,
58
+ type: '"ghost" | "tile"',
59
+ default: '"tile"'
60
+ }
61
+ ]
62
+
63
+ const railItemSlots = [
64
+ {
65
+ name: 'default',
66
+ description: '',
67
+ type: '{}'
68
+ }
69
+ ]
70
+
71
+ const railItemEmits = [
72
+ {
73
+ name: 'click',
74
+ description: '',
75
+ type: '[event: MouseEvent]'
76
+ }
77
+ ]
78
+ </script>
79
+ ## API Reference
80
+
81
+ ### Rail
82
+
83
+ <SlotsTable :data="railSlots"/>
84
+
85
+ ### RailItem
86
+
87
+ <PropsTable folder="Rail" name="RailItem" :data="railItemProps"/>
88
+
89
+ <SlotsTable :data="railItemSlots"/>
90
+
91
+ <EmitsTable :data="railItemEmits"/>
@@ -0,0 +1,84 @@
1
+ import { h } from 'vue'
2
+ import { createMemoryHistory, createRouter } from 'vue-router'
3
+ import Rail from './Rail.vue'
4
+ import RailItem from './RailItem.vue'
5
+
6
+ function createTestRouter() {
7
+ return createRouter({
8
+ history: createMemoryHistory(),
9
+ routes: [
10
+ { path: '/', component: { template: '<div />' } },
11
+ { path: '/search', component: { template: '<div />' } },
12
+ ],
13
+ })
14
+ }
15
+
16
+ describe('<Rail />', () => {
17
+ it('renders its children in a single column', () => {
18
+ cy.mount(Rail, {
19
+ slots: {
20
+ default: () => [
21
+ h(RailItem, { label: 'Home', icon: 'lucide-house' }),
22
+ h(RailItem, { label: 'Design' }, () => 'DE'),
23
+ h(RailItem, { label: 'Search', icon: 'lucide-search' }),
24
+ ],
25
+ },
26
+ })
27
+ cy.get('[data-slot=rail]').should('exist')
28
+ cy.get('[data-slot=rail] [aria-label=Home]').should('exist')
29
+ cy.get('[data-slot=rail] [aria-label=Design]').should('contain.text', 'DE')
30
+ cy.get('[data-slot=rail] [aria-label=Search]').should('exist')
31
+ })
32
+ })
33
+
34
+ describe('<RailItem />', () => {
35
+ it('renders a button and emits click when there is no `to`', () => {
36
+ const onClick = cy.stub().as('click')
37
+ cy.mount(RailItem, {
38
+ props: { label: 'Search', icon: 'lucide-search', onClick },
39
+ })
40
+ cy.get('button[data-slot=rail-item]').should('exist')
41
+ cy.get('button').click()
42
+ cy.get('@click').should('have.been.calledOnce')
43
+ })
44
+
45
+ it('renders a router link when `to` is set', () => {
46
+ cy.mount(RailItem, {
47
+ props: { label: 'Search', icon: 'lucide-search', to: '/search' },
48
+ global: { plugins: [createTestRouter()] },
49
+ })
50
+ cy.get('a[data-slot=rail-item]').should('have.attr', 'href', '/search')
51
+ })
52
+
53
+ it('shows the indicator bar for an active tile, not an active ghost', () => {
54
+ cy.mount(RailItem, { props: { label: 'Design', active: true } })
55
+ cy.get('[data-slot=rail-item][data-state=active]').should('exist')
56
+ cy.get('[data-slot=rail-item-indicator]').should('exist')
57
+
58
+ cy.mount(RailItem, {
59
+ props: { label: 'Search', icon: 'lucide-search', variant: 'ghost', active: true },
60
+ })
61
+ cy.get('[data-slot=rail-item-indicator]').should('not.exist')
62
+ cy.get('[data-slot=rail-item]').should('have.class', 'shadow-sm')
63
+ })
64
+
65
+ it('renders a dot for badgeStyle=dot and a capped pill for badgeStyle=count', () => {
66
+ cy.mount(RailItem, {
67
+ props: { label: 'Notifications', icon: 'lucide-bell', badge: 3, badgeStyle: 'dot' },
68
+ })
69
+ cy.get('[data-slot=rail-item-badge-dot]').should('exist')
70
+
71
+ cy.mount(RailItem, {
72
+ props: { label: 'Notifications', icon: 'lucide-bell', badge: 142, badgeStyle: 'count' },
73
+ })
74
+ // The pill teleports to <body>.
75
+ cy.get('body').should('contain.text', '99+')
76
+ })
77
+
78
+ it('folds the unread count into the accessible label', () => {
79
+ cy.mount(RailItem, {
80
+ props: { label: 'Notifications', icon: 'lucide-bell', badge: 3 },
81
+ })
82
+ cy.get('[data-slot=rail-item]').should('have.attr', 'aria-label', 'Notifications, 3 unread')
83
+ })
84
+ })
@@ -0,0 +1,30 @@
1
+ # Rail
2
+
3
+ The narrow icon column of an app shell. `Rail` is a bare frame — a fixed 50px
4
+ column with one shared tooltip context and a single slot — and `RailItem` is one
5
+ tooltip'd cell inside it. Lay the children out with plain flex utilities: give
6
+ the middle section `flex-1` to push the anchors above and below it to the edges.
7
+
8
+ <ComponentPreview name="Rail-Default" />
9
+
10
+ There are no layout slots and no built-in scrolling — position is CSS. Put fixed
11
+ anchors (a logo, a user menu) as direct children, and if the middle list can
12
+ overflow, wrap it in your own `overflow-y-auto` container.
13
+
14
+ ## RailItem
15
+
16
+ `RailItem` carries the tooltip (its `label`), the active indicator, and an
17
+ optional unread `badge`. Two visual treatments:
18
+
19
+ - `variant="tile"` (default) — a filled cell with a left indicator bar when
20
+ active. Use the default slot for an image, avatar, or initials.
21
+ - `variant="ghost"` — transparent until hovered, raised when active. Pass an
22
+ `icon` for a shortcut like Search or Notifications.
23
+
24
+ Set `to` to render a router link; omit it to get a button that emits `click`.
25
+ The `badge` count shows as a pill (`badgeStyle="count"`) or a dot
26
+ (`badgeStyle="dot"`); either way it folds into the item's accessible label, and
27
+ a dot surfaces the real number in the tooltip. The badge pill teleports to
28
+ `<body>` so an `overflow-hidden` scroll container can't clip it.
29
+
30
+ <!-- @include: ./Rail.api.md -->
@@ -0,0 +1,16 @@
1
+ <template>
2
+ <div
3
+ data-slot="rail"
4
+ class="flex h-full w-[50px] shrink-0 flex-col items-center bg-surface-sidebar px-[11px] pb-3 pt-2.5"
5
+ >
6
+ <!-- One provider for the whole rail: hovering between items shows their
7
+ tooltips instantly, with no per-item delay. -->
8
+ <TooltipProvider :hover-delay="0">
9
+ <slot />
10
+ </TooltipProvider>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import TooltipProvider from '../Tooltip/TooltipProvider.vue'
16
+ </script>
@@ -0,0 +1,134 @@
1
+ <template>
2
+ <!--
3
+ <Tooltip> reuses Rail's surrounding TooltipProvider when present (instant
4
+ hover between neighbours) and falls back to its own when a RailItem is used
5
+ standalone.
6
+ -->
7
+ <Tooltip placement="right">
8
+ <!--
9
+ Link vs. button are split with v-if/v-else rather than a dynamic
10
+ <component :is>: a raw 'button' string there resolves to a
11
+ globally-registered <Button> in consumer apps, and reka's trigger can't
12
+ forward its element ref through a functional wrapper. The inner content is
13
+ identical in both branches.
14
+ -->
15
+ <RouterLink
16
+ v-if="to"
17
+ :to="to"
18
+ data-slot="rail-item"
19
+ :data-variant="variant"
20
+ :data-state="active ? 'active' : 'inactive'"
21
+ :aria-label="ariaLabel"
22
+ :aria-current="active ? 'page' : undefined"
23
+ :class="cellClasses"
24
+ @click="emit('click', $event)"
25
+ >
26
+ <span
27
+ v-if="showIndicator"
28
+ data-slot="rail-item-indicator"
29
+ aria-hidden="true"
30
+ class="absolute -left-[11px] top-1/2 h-7 w-1 -translate-y-1/2 rounded-r bg-surface-gray-8"
31
+ />
32
+ <slot>
33
+ <span
34
+ v-if="typeof icon === 'string'"
35
+ :class="[icon, 'size-4']"
36
+ aria-hidden="true"
37
+ />
38
+ <component
39
+ v-else-if="icon"
40
+ :is="icon"
41
+ class="size-4"
42
+ aria-hidden="true"
43
+ />
44
+ </slot>
45
+ <RailItemBadge :count="badge" :variant="badgeStyle" />
46
+ </RouterLink>
47
+
48
+ <button
49
+ v-else
50
+ type="button"
51
+ data-slot="rail-item"
52
+ :data-variant="variant"
53
+ :data-state="active ? 'active' : 'inactive'"
54
+ :aria-label="ariaLabel"
55
+ :aria-current="active ? 'page' : undefined"
56
+ :class="cellClasses"
57
+ @click="emit('click', $event)"
58
+ >
59
+ <span
60
+ v-if="showIndicator"
61
+ data-slot="rail-item-indicator"
62
+ aria-hidden="true"
63
+ class="absolute -left-[11px] top-1/2 h-7 w-1 -translate-y-1/2 rounded-r bg-surface-gray-8"
64
+ />
65
+ <slot>
66
+ <span
67
+ v-if="typeof icon === 'string'"
68
+ :class="[icon, 'size-4']"
69
+ aria-hidden="true"
70
+ />
71
+ <component
72
+ v-else-if="icon"
73
+ :is="icon"
74
+ class="size-4"
75
+ aria-hidden="true"
76
+ />
77
+ </slot>
78
+ <RailItemBadge :count="badge" :variant="badgeStyle" />
79
+ </button>
80
+
81
+ <template #content>
82
+ <div class="leading-relaxed">
83
+ <div>{{ label }}</div>
84
+ <div v-if="showTooltipCount" class="text-p-sm text-ink-gray-5">
85
+ {{ badge }} unread
86
+ </div>
87
+ </div>
88
+ </template>
89
+ </Tooltip>
90
+ </template>
91
+
92
+ <script setup lang="ts">
93
+ import { computed } from 'vue'
94
+ import { RouterLink } from 'vue-router'
95
+ import Tooltip from '../Tooltip/Tooltip.vue'
96
+ import RailItemBadge from './RailItemBadge.vue'
97
+ import type { RailItemProps } from './types'
98
+
99
+ const props = withDefaults(defineProps<RailItemProps>(), {
100
+ variant: 'tile',
101
+ badgeStyle: 'count',
102
+ badge: 0,
103
+ })
104
+
105
+ const emit = defineEmits<{ click: [event: MouseEvent] }>()
106
+
107
+ // The left indicator bar is the `tile` variant's active affordance; `ghost`
108
+ // items signal active state through their raised background instead.
109
+ const showIndicator = computed(() => props.variant === 'tile' && props.active)
110
+
111
+ const cellClasses = computed(() => [
112
+ 'relative flex size-7 shrink-0 items-center justify-center text-base transition focus-visible:ring-0 focus-visible:focus-ring',
113
+ // `tile` uses the community-tile radius; `ghost` mirrors frappe-ui's icon
114
+ // button (rounded-4 = 8px).
115
+ props.variant === 'tile' ? 'rounded-[7px]' : 'rounded-4',
116
+ props.variant === 'tile'
117
+ ? props.active
118
+ ? 'bg-surface-gray-4'
119
+ : 'bg-surface-gray-3'
120
+ : props.active
121
+ ? 'text-ink-gray-8 !bg-surface-elevation-3 shadow-sm'
122
+ : 'text-ink-gray-8 bg-transparent hover:bg-surface-gray-3',
123
+ ])
124
+
125
+ /** Folds the unread count into the accessible name, e.g. "Notifications, 3 unread". */
126
+ const ariaLabel = computed(() =>
127
+ props.badge > 0 ? `${props.label}, ${props.badge} unread` : props.label,
128
+ )
129
+
130
+ // The dot badge hides the number, so surface it in the tooltip instead.
131
+ const showTooltipCount = computed(
132
+ () => props.badgeStyle === 'dot' && props.badge > 0,
133
+ )
134
+ </script>