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,93 @@
1
+ <template>
2
+ <div data-slot="list" :role="hasHeader ? 'table' : 'list'" :style="style">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { computed, getCurrentInstance, ref } from 'vue'
9
+ import { provideListContext } from './list-context'
10
+ import type { ListProps } from './types'
11
+
12
+ const props = defineProps<ListProps>()
13
+
14
+ const selection = defineModel<string[]>('selection', { default: () => [] })
15
+ // Single active row. Unlike `selection` there's no explicit mode flag: binding
16
+ // v-model:active is the opt-in, detected via the update listener below so a
17
+ // highlight never appears on a list that doesn't track one.
18
+ const active = defineModel<string | undefined>('active')
19
+
20
+ const instance = getCurrentInstance()
21
+ const activatable = computed(
22
+ () => 'onUpdate:active' in (instance?.vnode.props ?? {}),
23
+ )
24
+
25
+ const hasHeader = ref(false)
26
+
27
+ const style = computed(() => ({
28
+ ...(props.columns ? { '--list-columns-default': props.columns.join(' ') } : {}),
29
+ ...(props.selectable ? { '--list-checkbox-width': '32px' } : {}),
30
+ ...(props.rowHeight ? { '--list-row-height': `${props.rowHeight}px` } : {}),
31
+ }))
32
+
33
+ function isSelected(value: string) {
34
+ return selection.value.includes(value)
35
+ }
36
+
37
+ function toggleSelection(value: string) {
38
+ selection.value = isSelected(value)
39
+ ? selection.value.filter((selected) => selected !== value)
40
+ : [...selection.value, value]
41
+ }
42
+
43
+ function isActive(value: string) {
44
+ return active.value === value
45
+ }
46
+
47
+ function activate(value: string) {
48
+ active.value = value
49
+ }
50
+
51
+ // The full set of selectable row values, fed by <ListRows>. Drives the header
52
+ // select-all without depending on which rows are currently mounted.
53
+ const allValues = ref<string[]>([])
54
+ function setAllValues(values: string[]) {
55
+ allValues.value = values
56
+ }
57
+
58
+ const selectAllState = computed<'none' | 'some' | 'all'>(() => {
59
+ const universe = allValues.value
60
+ if (!universe.length) return 'none'
61
+ const selectedCount = universe.filter((value) =>
62
+ selection.value.includes(value),
63
+ ).length
64
+ if (selectedCount === 0) return 'none'
65
+ return selectedCount === universe.length ? 'all' : 'some'
66
+ })
67
+
68
+ function toggleSelectAll() {
69
+ if (selectAllState.value === 'all') {
70
+ // Clear only the current universe; preserve any selected values outside it
71
+ // (e.g. carried over from a previous filter or page).
72
+ const universe = new Set(allValues.value)
73
+ selection.value = selection.value.filter((value) => !universe.has(value))
74
+ } else {
75
+ selection.value = [...new Set([...selection.value, ...allValues.value])]
76
+ }
77
+ }
78
+
79
+ provideListContext({
80
+ divider: computed(() => props.divider ?? (props.columns ? 'full' : 'inset')),
81
+ selectable: computed(() => !!props.selectable),
82
+ rowHeight: computed(() => props.rowHeight),
83
+ hasHeader,
84
+ isSelected,
85
+ toggleSelection,
86
+ activatable,
87
+ isActive,
88
+ activate,
89
+ setAllValues,
90
+ selectAllState,
91
+ toggleSelectAll,
92
+ })
93
+ </script>
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div
3
+ data-slot="list-cell"
4
+ :role="context?.hasHeader.value ? 'cell' : undefined"
5
+ class="flex min-w-0 items-center"
6
+ >
7
+ <slot />
8
+ </div>
9
+ </template>
10
+
11
+ <script setup lang="ts">
12
+ import { useListContext } from './list-context'
13
+
14
+ const context = useListContext()
15
+ </script>
@@ -0,0 +1,40 @@
1
+ <template>
2
+ <!-- A titled section of rows. `role="rowgroup"` gives assistive tech real
3
+ group structure, and keeping the rows as direct children preserves the
4
+ family's `list-row + list-row` divider adjacency *within* the group —
5
+ something a raw <p> spliced between rows silently breaks. -->
6
+ <div data-slot="list-group" role="rowgroup" :aria-label="ariaLabel">
7
+ <div
8
+ v-if="label || $slots.header"
9
+ data-slot="list-group-header"
10
+ class="flex h-8 items-center text-sm-medium text-ink-gray-5"
11
+ :class="sticky && 'sticky top-0 z-10 bg-surface-base'"
12
+ >
13
+ <slot name="header">{{ label }}</slot>
14
+ </div>
15
+ <slot />
16
+ </div>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ import { computed } from 'vue'
21
+
22
+ const props = defineProps<{
23
+ /** Section label shown in the group header. Overridden by the #header slot. */
24
+ label?: string
25
+ /**
26
+ * Pin the group header to the top of the scroll container while its rows
27
+ * scroll under it. Off by default.
28
+ */
29
+ sticky?: boolean
30
+ }>()
31
+
32
+ defineSlots<{
33
+ /** The group's rows — `<ListRow>` elements. */
34
+ default?: () => unknown
35
+ /** Replaces the header content (the label). */
36
+ header?: () => unknown
37
+ }>()
38
+
39
+ const ariaLabel = computed(() => props.label || undefined)
40
+ </script>
@@ -0,0 +1,62 @@
1
+ <template>
2
+ <div data-slot="list-header" role="row" class="h-8 text-sm text-ink-gray-5">
3
+ <slot />
4
+ <Transition
5
+ enter-active-class="transition-transform duration-75 ease-out"
6
+ leave-active-class="transition-transform duration-75 ease-out"
7
+ enter-from-class="scale-0"
8
+ leave-to-class="scale-0"
9
+ >
10
+ <div
11
+ v-if="context?.selectable.value"
12
+ data-slot="list-header-checkbox"
13
+ role="checkbox"
14
+ :aria-checked="ariaChecked"
15
+ aria-label="Select all"
16
+ tabindex="0"
17
+ @click.stop.prevent="context.toggleSelectAll"
18
+ @keydown.enter.prevent="context.toggleSelectAll"
19
+ @keydown.space.prevent="context.toggleSelectAll"
20
+ >
21
+ <!-- Presentational; the wrapper div is the real role=checkbox control.
22
+ See ListRowBase for why pointer-events-none matters. -->
23
+ <Checkbox
24
+ :modelValue="context.selectAllState.value === 'all'"
25
+ :indeterminate="context.selectAllState.value === 'some'"
26
+ tabindex="-1"
27
+ aria-hidden="true"
28
+ class="pointer-events-none"
29
+ />
30
+ </div>
31
+ </Transition>
32
+ <div
33
+ data-slot="list-header-border"
34
+ aria-hidden="true"
35
+ class="border-b border-outline-gray-1"
36
+ />
37
+ </div>
38
+ </template>
39
+
40
+ <script setup lang="ts">
41
+ import { computed, onBeforeUnmount } from 'vue'
42
+ import Checkbox from '../../components/Checkbox/Checkbox.vue'
43
+ import { useListContext } from './list-context'
44
+
45
+ const context = useListContext()
46
+
47
+ const ariaChecked = computed(() => {
48
+ const state = context?.selectAllState.value
49
+ if (state === 'all') return 'true'
50
+ if (state === 'some') return 'mixed'
51
+ return 'false'
52
+ })
53
+
54
+ // Header presence is the signal that flips the List into table semantics
55
+ // (role table/row/columnheader/cell) — there is no mode prop.
56
+ if (context) {
57
+ context.hasHeader.value = true
58
+ onBeforeUnmount(() => {
59
+ context.hasHeader.value = false
60
+ })
61
+ }
62
+ </script>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <div
3
+ data-slot="list-header-cell"
4
+ role="columnheader"
5
+ class="flex min-w-0 items-center gap-1"
6
+ >
7
+ <span v-if="$slots.prefix" class="shrink-0">
8
+ <slot name="prefix" />
9
+ </span>
10
+ <span class="truncate"><slot /></span>
11
+ <span v-if="$slots.suffix" class="shrink-0">
12
+ <slot name="suffix" />
13
+ </span>
14
+ </div>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ defineSlots<{
19
+ /** Column label. */
20
+ default?: () => unknown
21
+ /** Leading adornment, rendered before the label. */
22
+ prefix?: () => unknown
23
+ /** Trailing adornment, rendered after the label. */
24
+ suffix?: () => unknown
25
+ }>()
26
+ </script>
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <div
3
+ data-slot="list-header-cell"
4
+ role="columnheader"
5
+ :aria-sort="
6
+ direction ? (direction === 'asc' ? 'ascending' : 'descending') : undefined
7
+ "
8
+ :data-sort="direction || undefined"
9
+ class="flex min-w-0 items-center"
10
+ :class="isEnd && 'justify-end'"
11
+ >
12
+ <!-- Controlled: sort state and toggle rules live in the app, surfaced
13
+ back via `direction`. The cell renders only the behavioral chrome —
14
+ real button, aria-sort, tooltip, suffix reveal. -->
15
+ <Tooltip :text="tooltipText" :disabled="!tooltipText">
16
+ <button
17
+ ref="button"
18
+ type="button"
19
+ class="group inline-flex h-7 min-w-0 items-center gap-1 rounded text-sm-medium text-ink-gray-5 transition-colors"
20
+ @click="emit('click', $event)"
21
+ >
22
+ <!-- End-aligned: the glyph leads so the label stays flush with the
23
+ column's right edge (aligned with the values below). A trailing
24
+ glyph would reserve space and push the label off the edge. -->
25
+ <span
26
+ v-if="isEnd"
27
+ class="shrink-0"
28
+ :class="suffixRevealClass"
29
+ aria-hidden="true"
30
+ >
31
+ <slot name="suffix" :direction="direction ?? null">
32
+ <span class="block size-3.5" :class="defaultArrowClass" />
33
+ </slot>
34
+ </span>
35
+ <span v-if="$slots.prefix" class="shrink-0">
36
+ <slot name="prefix" :direction="direction ?? null" />
37
+ </span>
38
+ <span class="truncate"><slot /></span>
39
+ <!-- A built-in arrow derived from `direction` by default, so the common
40
+ case needs no glyph wiring; supply #suffix to override. The cell
41
+ owns the reveal: an inactive column's glyph shows on hover. -->
42
+ <span
43
+ v-if="!isEnd"
44
+ class="shrink-0"
45
+ :class="suffixRevealClass"
46
+ aria-hidden="true"
47
+ >
48
+ <slot name="suffix" :direction="direction ?? null">
49
+ <span class="block size-3.5" :class="defaultArrowClass" />
50
+ </slot>
51
+ </span>
52
+ </button>
53
+ </Tooltip>
54
+ </div>
55
+ </template>
56
+
57
+ <script setup lang="ts">
58
+ import { computed, onMounted, ref, useTemplateRef } from 'vue'
59
+ import { Tooltip } from '../../components/Tooltip'
60
+ import type { ListHeaderCellSortProps } from './types'
61
+
62
+ const props = defineProps<ListHeaderCellSortProps>()
63
+
64
+ const emit = defineEmits<{
65
+ /** Fired on sort button click — update your sort state here. */
66
+ (e: 'click', event: MouseEvent): void
67
+ }>()
68
+
69
+ const isEnd = computed(() => props.align === 'end')
70
+
71
+ // An inactive column's sort glyph is hidden until hover — but with opacity, not
72
+ // display, so revealing it never shifts the label's position.
73
+ const suffixRevealClass = computed(() =>
74
+ props.direction ? '' : 'opacity-0 group-hover:opacity-100',
75
+ )
76
+
77
+ // Built-in sort glyph, used when the consumer supplies no #suffix: a muted
78
+ // up/down when inactive, a directional arrow when the column is the sort key.
79
+ const defaultArrowClass = computed(() => {
80
+ if (!props.direction) return 'lucide-arrow-up-down'
81
+ return props.direction === 'asc' ? 'lucide-arrow-up' : 'lucide-arrow-down'
82
+ })
83
+
84
+ defineSlots<{
85
+ /** Column label. */
86
+ default?: () => unknown
87
+ /** Leading adornment, rendered before the label. */
88
+ prefix?: (props: { direction: 'asc' | 'desc' | null }) => unknown
89
+ /**
90
+ * Sort glyph. Optional — the cell renders a built-in arrow from `direction`
91
+ * by default. Provide this to override (e.g. a custom lucide span). The cell
92
+ * owns the reveal: an inactive column's glyph shows on hover.
93
+ */
94
+ suffix?: (props: { direction: 'asc' | 'desc' | null }) => unknown
95
+ }>()
96
+
97
+ // The label is slot content, so the tooltip reads the rendered text.
98
+ const buttonEl = useTemplateRef('button')
99
+ const label = ref('')
100
+ onMounted(() => {
101
+ label.value = buttonEl.value?.textContent?.trim() ?? ''
102
+ })
103
+ const tooltipText = computed(() =>
104
+ label.value ? `Order by ${label.value.toLowerCase()}` : undefined,
105
+ )
106
+ </script>
@@ -0,0 +1,55 @@
1
+ <template>
2
+ <!-- `custom` so this row's single click handler decides between toggle and
3
+ navigate — with RouterLink's own handler in play, selection could not
4
+ reliably preventDefault before it navigates. -->
5
+ <RouterLink v-if="to" :to="to" custom v-slot="{ href, navigate }">
6
+ <ListRowBase
7
+ tag="a"
8
+ :href="href"
9
+ :value="value"
10
+ @click="onClick($event, navigate)"
11
+ >
12
+ <slot />
13
+ </ListRowBase>
14
+ </RouterLink>
15
+ <ListRowBase
16
+ v-else
17
+ :tag="isInteractive() ? 'button' : 'div'"
18
+ :value="value"
19
+ @click="onClick"
20
+ >
21
+ <slot />
22
+ </ListRowBase>
23
+ </template>
24
+
25
+ <script setup lang="ts">
26
+ import { RouterLink } from 'vue-router'
27
+ import { useListContext } from './list-context'
28
+ import ListRowBase from './ListRowBase.vue'
29
+ import type { ListRowProps } from './types'
30
+
31
+ const props = defineProps<ListRowProps>()
32
+
33
+ const context = useListContext()
34
+
35
+ // A row is interactive — rendered as a button — when it has a click handler or
36
+ // when the list tracks an active row (clicking it sets active).
37
+ function isInteractive() {
38
+ return Boolean(props.onClick) || Boolean(context?.activatable.value)
39
+ }
40
+
41
+ function onClick(event: MouseEvent, navigate?: (e?: MouseEvent) => void) {
42
+ if (context?.selectable.value && props.value !== undefined) {
43
+ event.preventDefault()
44
+ context.toggleSelection(props.value)
45
+ return
46
+ }
47
+ // Activation is additive: it sets the active row but still lets the app's own
48
+ // click handler / navigation run.
49
+ if (context?.activatable.value && props.value !== undefined) {
50
+ context.activate(props.value)
51
+ }
52
+ props.onClick?.(event)
53
+ navigate?.(event)
54
+ }
55
+ </script>
@@ -0,0 +1,103 @@
1
+ <template>
2
+ <NativeElement
3
+ :tag="tag"
4
+ data-slot="list-row"
5
+ :role="context?.hasHeader.value ? 'row' : 'listitem'"
6
+ :data-interactive="interactive || undefined"
7
+ :data-state="selected ? 'selected' : undefined"
8
+ :data-active="active || undefined"
9
+ :aria-current="active || undefined"
10
+ :type="tag === 'button' ? 'button' : undefined"
11
+ :class="[
12
+ interactive && 'cursor-pointer select-none sm:rounded-[10px]',
13
+ // Active is a persistent, stronger surface; suppress the hover/active
14
+ // wash on it so pointing at the open row doesn't read as de-selecting it.
15
+ active
16
+ ? 'bg-surface-gray-3'
17
+ : interactive && 'active:bg-surface-gray-2 sm:hover:bg-surface-gray-1',
18
+ ]"
19
+ >
20
+ <slot />
21
+ <Transition
22
+ enter-active-class="transition-transform duration-75 ease-out"
23
+ leave-active-class="transition-transform duration-75 ease-out"
24
+ enter-from-class="scale-0"
25
+ leave-to-class="scale-0"
26
+ >
27
+ <div
28
+ v-if="selectable"
29
+ data-slot="list-row-checkbox"
30
+ role="checkbox"
31
+ :aria-checked="selected"
32
+ tabindex="0"
33
+ @click.stop.prevent="toggle"
34
+ @keydown.enter.prevent="toggle"
35
+ @keydown.space.prevent="toggle"
36
+ >
37
+ <!-- Purely presentational: the wrapper div is the real role=checkbox
38
+ control. pointer-events-none makes every click (even one landing
39
+ exactly on the native input) resolve to the wrapper's toggle,
40
+ instead of the raw input's native toggle fighting the one-way
41
+ :modelValue binding and netting to no change. -->
42
+ <Checkbox
43
+ :modelValue="selected"
44
+ tabindex="-1"
45
+ aria-hidden="true"
46
+ class="pointer-events-none"
47
+ />
48
+ </div>
49
+ </Transition>
50
+ <div
51
+ v-if="divider !== 'none'"
52
+ data-slot="list-divider"
53
+ aria-hidden="true"
54
+ class="border-t border-outline-gray-1 transition-opacity"
55
+ :style="{ gridColumn: divider === 'inset' ? '2 / -1' : '1 / -1' }"
56
+ />
57
+ </NativeElement>
58
+ </template>
59
+
60
+ <script setup lang="ts">
61
+ import { computed, defineComponent, h } from 'vue'
62
+ import Checkbox from '../../components/Checkbox/Checkbox.vue'
63
+ import { useListContext } from './list-context'
64
+
65
+ // `<component :is="'button'">` resolves the string through the consumer app's
66
+ // component registry (capitalized to 'Button'), so an app that globally
67
+ // registers a Button component hijacks the row element. h() with a tag string
68
+ // always creates the native element and never consults the registry.
69
+ const NativeElement = defineComponent({
70
+ props: { tag: { type: String, required: true } },
71
+ setup(props, { slots }) {
72
+ return () => h(props.tag, null, slots.default?.())
73
+ },
74
+ })
75
+
76
+ const props = defineProps<{
77
+ tag: 'a' | 'button' | 'div'
78
+ value?: string
79
+ }>()
80
+
81
+ const context = useListContext()
82
+
83
+ const divider = computed(() => context?.divider.value ?? 'inset')
84
+ const selectable = computed(
85
+ () => !!context?.selectable.value && props.value !== undefined,
86
+ )
87
+ const selected = computed(
88
+ () => selectable.value && !!context?.isSelected(props.value!),
89
+ )
90
+ const active = computed(
91
+ () =>
92
+ !!context?.activatable.value &&
93
+ props.value !== undefined &&
94
+ !!context?.isActive(props.value),
95
+ )
96
+ const interactive = computed(
97
+ () => props.tag !== 'div' || selectable.value || active.value,
98
+ )
99
+
100
+ function toggle() {
101
+ if (props.value !== undefined) context?.toggleSelection(props.value)
102
+ }
103
+ </script>
@@ -0,0 +1,120 @@
1
+ <template>
2
+ <template v-if="!virtualEnabled">
3
+ <template v-for="(item, index) in items" :key="getItemValue(item, index)">
4
+ <slot :item="item" :index="index" :value="getItemValue(item, index)" />
5
+ </template>
6
+ </template>
7
+ <div v-else ref="anchor" v-bind="wrapperProps" role="presentation">
8
+ <template v-for="row in rows" :key="getItemValue(row.data, row.index)">
9
+ <slot
10
+ :item="row.data"
11
+ :index="row.index"
12
+ :value="getItemValue(row.data, row.index)"
13
+ />
14
+ </template>
15
+ </div>
16
+ </template>
17
+
18
+ <script setup lang="ts" generic="T">
19
+ import { computed, onBeforeUnmount, watch } from 'vue'
20
+ import { useListContext } from './list-context'
21
+ import { useVirtualRows } from './useVirtualRows'
22
+ import type { ListVirtualOptions } from './types'
23
+
24
+ const props = defineProps<{
25
+ /** Items to iterate — one default-slot render per item. */
26
+ items: T[]
27
+
28
+ /**
29
+ * How to derive a row's identity. A string reads that property off the item;
30
+ * a function computes it. Drives the render `:key`, the header select-all
31
+ * universe, and the scoped `value` slot prop. Defaults to the item's `name`,
32
+ * then `id`, then the index.
33
+ */
34
+ rowKey?: string | ((item: T, index: number) => PropertyKey)
35
+
36
+ /**
37
+ * Window the rows (vueuse useVirtualList) so only rows near the viewport
38
+ * mount. `itemHeight` defaults to the List's `rowHeight`; the scroll
39
+ * container is the nearest scrollable ancestor.
40
+ */
41
+ virtual?: boolean | ListVirtualOptions
42
+ }>()
43
+
44
+ defineSlots<{
45
+ default?: (props: { item: T; index: number; value: string }) => unknown
46
+ }>()
47
+
48
+ const context = useListContext()
49
+
50
+ const itemHeight = computed(() => {
51
+ const fromOptions =
52
+ typeof props.virtual === 'object' ? props.virtual.itemHeight : undefined
53
+ return fromOptions ?? context?.rowHeight.value
54
+ })
55
+
56
+ const virtualEnabled = computed(() => {
57
+ if (!props.virtual) return false
58
+ if (!itemHeight.value) {
59
+ console.warn(
60
+ '[frappe-ui] <ListRows virtual> needs a row height — set `rowHeight` on <List> or pass `virtual.itemHeight`.',
61
+ )
62
+ return false
63
+ }
64
+ return true
65
+ })
66
+
67
+ const { rows, wrapperProps, anchor } = useVirtualRows(
68
+ () => (virtualEnabled.value ? props.items : []),
69
+ {
70
+ enabled: () => virtualEnabled.value,
71
+ itemHeight: () => itemHeight.value ?? 0,
72
+ overscan:
73
+ typeof props.virtual === 'object' ? props.virtual.overscan : undefined,
74
+ },
75
+ )
76
+
77
+ // Feed the full selectable universe to the List so the header select-all knows
78
+ // every row's value — even the virtualized ones that aren't mounted. Uses the
79
+ // same `getItemValue` as the render `:key` and scoped `value` slot prop, so
80
+ // row identity has one source.
81
+ watch(
82
+ () => props.items,
83
+ (items) => {
84
+ context?.setAllValues(items.map((item, i) => getItemValue(item, i)))
85
+ },
86
+ { immediate: true },
87
+ )
88
+ onBeforeUnmount(() => context?.setAllValues([]))
89
+
90
+ function getItemValue(item: T, index: number) {
91
+ return String(getItemKey(item, index))
92
+ }
93
+
94
+ function getItemKey(item: T, index: number): PropertyKey {
95
+ if (props.rowKey !== undefined) {
96
+ const key =
97
+ typeof props.rowKey === 'function'
98
+ ? props.rowKey(item, index)
99
+ : isRecord(item)
100
+ ? (item as Record<string, unknown>)[props.rowKey]
101
+ : undefined
102
+ return isPropertyKey(key) ? key : index
103
+ }
104
+ if (!isRecord(item)) return index
105
+ const key = item.name ?? item.id
106
+ return isPropertyKey(key) ? key : index
107
+ }
108
+
109
+ function isRecord(value: unknown): value is { id?: unknown; name?: unknown } {
110
+ return value !== null && typeof value === 'object'
111
+ }
112
+
113
+ function isPropertyKey(value: unknown): value is PropertyKey {
114
+ return (
115
+ typeof value === 'string' ||
116
+ typeof value === 'number' ||
117
+ typeof value === 'symbol'
118
+ )
119
+ }
120
+ </script>
@@ -0,0 +1,24 @@
1
+ // Structural styles ship with the package: importing from `frappe-ui/list`
2
+ // pulls in the grid/divider rules so the family is self-contained.
3
+ import './style.css'
4
+
5
+ export { default as List } from './List.vue'
6
+ export { default as ListRow } from './ListRow.vue'
7
+ export { default as ListCell } from './ListCell.vue'
8
+ export { default as ListHeader } from './ListHeader.vue'
9
+ export { default as ListHeaderCell } from './ListHeaderCell.vue'
10
+ export { default as ListHeaderCellSort } from './ListHeaderCellSort.vue'
11
+ export { default as ListRows } from './ListRows.vue'
12
+ export { default as ListGroup } from './ListGroup.vue'
13
+
14
+ // The windowing composable behind <ListRows virtual>, for exotic cases.
15
+ export { useVirtualRows, type UseVirtualRowsOptions } from './useVirtualRows'
16
+
17
+ export type {
18
+ ListProps,
19
+ ListRowProps,
20
+ ListHeaderCellSortProps,
21
+ ListVirtualOptions,
22
+ ListDivider,
23
+ ListSortDirection,
24
+ } from './types'