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,453 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Espresso v2 token migration codemod.
4
+ *
5
+ * Renames old semantic token names (frappe-ui v0.1.278 era) to their espresso
6
+ * v2 equivalents, per the "Frappe tokens v2 migration" mapping from design.
7
+ * Works on any text occurrence of a token name — tailwind utilities
8
+ * (`bg-surface-white`, `text-ink-red-2`, `border-outline-gray-modals`) and CSS
9
+ * variables (`var(--surface-white)`) alike — so it can be pointed at app
10
+ * codebases too.
11
+ *
12
+ * It also merges weight classes: a `text-<size>` + `font-<weight>` in the same
13
+ * static class list collapses to the combined `text-<size>-<weight>` style
14
+ * class, which carries the correct per-weight letter-spacing (see
15
+ * `mergeWeightClasses`).
16
+ *
17
+ * Usage: tokens-v2 [--dry-run] [--force] <dir-or-file...>
18
+ *
19
+ * IMPORTANT: the token replacement is single-pass/simultaneous. Several renames
20
+ * chain (outline red-2→3, red-3→4, red-4→5); applying them sequentially would
21
+ * cascade (red-2 ending up as red-5). Color renames must run exactly once per
22
+ * codebase — the v2 scheme reuses names (e.g. surface-gray-5 exists in both
23
+ * scales with different values), so a second full run would double-shift tokens.
24
+ * As a guard, the script detects already-migrated codebases and runs only the
25
+ * typography correction (`text-lg` → `text-md`, `text-xl` → `text-lg`, ...).
26
+ * Pass --force to run the full migration anyway.
27
+ */
28
+
29
+ import fs from 'fs'
30
+ import path from 'path'
31
+ import { fileURLToPath } from 'url'
32
+
33
+ const USAGE = 'Usage: tokens-v2 [--dry-run] [--force] <dir-or-file...>'
34
+
35
+ // ---------- MAPPING ----------
36
+
37
+ // Per-category renames: old suffix → new suffix.
38
+ // `cards` / `gray-modals` are code-side legacy aliases of Figma's
39
+ // `card` / `gray-modal` — both spellings map to the same v2 token.
40
+ const shift = (families, pairs) =>
41
+ Object.fromEntries(
42
+ families.flatMap((f) => pairs.map(([from, to]) => [`${f}-${from}`, `${f}-${to}`])),
43
+ )
44
+
45
+ const ACCENTS = ['red', 'blue', 'green', 'amber', 'violet']
46
+
47
+ const SURFACE_RENAMES = {
48
+ white: 'base',
49
+ 'menu-bar': 'sidebar',
50
+ card: 'elevation-1',
51
+ cards: 'elevation-1',
52
+ modal: 'elevation-2',
53
+ selected: 'elevation-3',
54
+ // legacy code-side token; resolved to the same values as elevation-3 in both modes
55
+ 'gray-2-contrast': 'elevation-3',
56
+ ...shift(['gray'], [[5, 8], [6, 9], [7, 10]]),
57
+ ...shift(ACCENTS, [[5, 7], [6, 8], [7, 9]]),
58
+ }
59
+
60
+ const INK_RENAMES = {
61
+ white: 'base',
62
+ ...shift(ACCENTS, [[2, 5], [3, 6], [4, 8]]),
63
+ }
64
+
65
+ const OUTLINE_RENAMES = {
66
+ white: 'base',
67
+ 'gray-modal': 'elevation-2',
68
+ 'gray-modals': 'elevation-2',
69
+ ...shift(['gray'], [[5, 7]]),
70
+ ...shift(ACCENTS, [[2, 3], [3, 4], [4, 5]]),
71
+ }
72
+
73
+ // The alpha categories only kept their neutral ramps in v2.
74
+ const SURFACE_ALPHA_RENAMES = {
75
+ white: 'base',
76
+ 'menu-bar': 'sidebar',
77
+ card: 'elevation-1',
78
+ cards: 'elevation-1',
79
+ modal: 'elevation-2',
80
+ selected: 'elevation-3',
81
+ ...shift(['gray'], [[5, 8], [6, 9], [7, 10]]),
82
+ }
83
+
84
+ const OUTLINE_ALPHA_RENAMES = {
85
+ white: 'base',
86
+ 'gray-modal': 'elevation-2',
87
+ 'gray-modals': 'elevation-2',
88
+ ...shift(['gray'], [[5, 7]]),
89
+ }
90
+
91
+ // ---------- TYPOGRAPHY SIZE RENAMES ----------
92
+
93
+ // The espresso text scale gained 15px (`md`) and 17px (`xl`) stops. Each
94
+ // physical size keeps its meaning under a new name, so existing utility classes
95
+ // must be renamed to render identically. These chain and so MUST run in a single
96
+ // simultaneous pass — a sequential pass would cascade.
97
+ //
98
+ // Caveat: these names (`text-lg` … `text-9xl`) coincide with stock Tailwind
99
+ // font-size utilities, so only point this at code using the espresso scale, and
100
+ // run exactly once (see header).
101
+ const UNMIGRATED_TEXT_SIZE_SHIFT = [
102
+ ['xl', '2xl'],
103
+ ['2xl', '3xl'],
104
+ ['3xl', '4xl'],
105
+ ['4xl', '5xl'],
106
+ ['5xl', '6xl'],
107
+ ['6xl', '7xl'],
108
+ ['7xl', '8xl'],
109
+ ['8xl', '9xl'],
110
+ ['9xl', '10xl'],
111
+ ['10xl', '11xl'],
112
+ ['11xl', '12xl'],
113
+ ['12xl', '13xl'],
114
+ ['13xl', '14xl'],
115
+ ['14xl', '15xl'],
116
+ ['15xl', '16xl'],
117
+ ]
118
+
119
+ // Apps that already ran the original v2 codemod use the temporary typography
120
+ // names where `text-lg` was 15px and `text-xl` was 16px. Shift those one step
121
+ // down into the corrected names without touching color tokens.
122
+ const MIGRATED_TEXT_SIZE_SHIFT = [
123
+ ['lg', 'md'],
124
+ ['xl', 'lg'],
125
+ ['2xl', 'xl'],
126
+ ['3xl', '2xl'],
127
+ ['4xl', '3xl'],
128
+ ['5xl', '4xl'],
129
+ ['6xl', '5xl'],
130
+ ['7xl', '6xl'],
131
+ ['8xl', '7xl'],
132
+ ['9xl', '8xl'],
133
+ ['10xl', '9xl'],
134
+ ['11xl', '10xl'],
135
+ ['12xl', '11xl'],
136
+ ['13xl', '12xl'],
137
+ ['14xl', '13xl'],
138
+ ['15xl', '14xl'],
139
+ ['16xl', '15xl'],
140
+ ['17xl', '16xl'],
141
+ ]
142
+
143
+ // Each size surfaces as a bare size utility, a paragraph variant, and weighted
144
+ // component classes. All forms shift together.
145
+ const textSizeRenames = (shift) => Object.fromEntries(
146
+ shift.flatMap(([from, to]) => [
147
+ [`text-${from}`, `text-${to}`],
148
+ [`text-p-${from}`, `text-p-${to}`],
149
+ [`text-${from}-medium`, `text-${to}-medium`],
150
+ [`text-p-${from}-medium`, `text-p-${to}-medium`],
151
+ [`text-${from}-semibold`, `text-${to}-semibold`],
152
+ [`text-p-${from}-semibold`, `text-p-${to}-semibold`],
153
+ [`text-${from}-bold`, `text-${to}-bold`],
154
+ [`text-p-${from}-bold`, `text-p-${to}-bold`],
155
+ [`text-${from}-black`, `text-${to}-black`],
156
+ [`text-p-${from}-black`, `text-p-${to}-black`],
157
+ ]),
158
+ )
159
+
160
+ const UNMIGRATED_TEXT_SIZE_RENAMES = textSizeRenames(UNMIGRATED_TEXT_SIZE_SHIFT)
161
+ const MIGRATED_TEXT_SIZE_RENAMES = textSizeRenames(MIGRATED_TEXT_SIZE_SHIFT)
162
+
163
+ // Full old token name → full new token name. NOTE: alpha categories must come
164
+ // before their base category when building the alternation so that e.g.
165
+ // `surface-alpha-gray-5` is never half-matched by a `surface-…` rule (the
166
+ // longest-first sort below also guarantees this).
167
+ export const COLOR_TOKEN_RENAMES = {
168
+ ...prefix('surface-alpha', SURFACE_ALPHA_RENAMES),
169
+ ...prefix('outline-alpha', OUTLINE_ALPHA_RENAMES),
170
+ ...prefix('surface', SURFACE_RENAMES),
171
+ ...prefix('ink', INK_RENAMES),
172
+ ...prefix('outline', OUTLINE_RENAMES),
173
+ }
174
+
175
+ export const TOKEN_RENAMES = {
176
+ ...COLOR_TOKEN_RENAMES,
177
+ ...UNMIGRATED_TEXT_SIZE_RENAMES,
178
+ }
179
+
180
+ // Tokens dropped in v2 with no replacement — usage is reported, never rewritten.
181
+ export const REMOVED_TOKENS = [
182
+ ...[1, 2, 3, 4, 5, 6, 7].map((n) => `surface-alpha-red-${n}`),
183
+ ...[2, 3, 4].map((n) => `outline-alpha-red-${n}`),
184
+ ]
185
+
186
+ // Legacy names with no v2 mapping decided yet — reported for manual review.
187
+ export const WATCH_TOKENS = []
188
+
189
+ function prefix(category, renames) {
190
+ return Object.fromEntries(
191
+ Object.entries(renames).map(([from, to]) => [
192
+ `${category}-${from}`,
193
+ `${category}-${to}`,
194
+ ]),
195
+ )
196
+ }
197
+
198
+ // ---------- REPLACEMENT ----------
199
+
200
+ // Token names are matched whole: not preceded by a letter/digit (a leading `-`
201
+ // is expected — `bg-surface-white`, `var(--surface-white)`) and not followed by
202
+ // anything that could extend the name (`gray-1` must not match in `gray-10`,
203
+ // `card` not in `cards`, `gray-modal` not in `gray-modals`,
204
+ // `surface-gray-2` not in `surface-gray-2-contrast`).
205
+ const byLengthDesc = (a, b) => b.length - a.length
206
+
207
+ const renameRegexFor = (renames) => new RegExp(
208
+ `(?<![a-zA-Z0-9])(${Object.keys(renames).sort(byLengthDesc).join('|')})(?![a-zA-Z0-9-])`,
209
+ 'g',
210
+ )
211
+ const FLAG_REGEX = new RegExp(
212
+ `(?<![a-zA-Z0-9])(${[...REMOVED_TOKENS, ...WATCH_TOKENS].sort(byLengthDesc).join('|')})(?![a-zA-Z0-9-])`,
213
+ 'g',
214
+ )
215
+
216
+ // ---------- WEIGHT-CLASS MERGE ----------
217
+
218
+ // Collapse a `text-<size>` and a `font-<weight>` that co-occur in the same
219
+ // static class list into the combined `text-<size>-<weight>` style class — the
220
+ // canonical way to express a weighted text style now that letter-spacing is
221
+ // tracked per weight (so `text-base font-medium` is NOT equivalent to
222
+ // `text-base-medium`). The two need not be adjacent; classes in between
223
+ // (`px-2 text-sm font-medium text-ink-gray-7`) are preserved, and color
224
+ // utilities like `text-ink-gray-7` are never mistaken for a size.
225
+ //
226
+ // Only *static* `class="…"` / `className="…"` attributes are touched. Dynamic
227
+ // `:class` / `v-bind:class` and conditional weights are skipped on purpose:
228
+ // merging a conditionally-applied weight into an unconditional size would be
229
+ // wrong. A class list with more than one size or more than one weight is
230
+ // ambiguous and left untouched.
231
+ const WEIGHT_SUFFIX = {
232
+ 'font-medium': 'medium',
233
+ 'font-semibold': 'semibold',
234
+ 'font-bold': 'bold',
235
+ 'font-extrabold': 'black',
236
+ 'font-normal': '', // regular — drop the weight; the bare `text-<size>` is regular
237
+ }
238
+
239
+ const TEXT_SIZES = [
240
+ 'tiny', '2xs', 'xs', 'sm', 'base', 'md', 'lg', 'xl', '2xl', '3xl', '4xl',
241
+ '5xl', '6xl', '7xl', '8xl', '9xl', '10xl', '11xl', '12xl', '13xl', '14xl',
242
+ '15xl', '16xl', '17xl',
243
+ ]
244
+ const SIZE_CLASS = new RegExp(`^text-(?:p-)?(?:${TEXT_SIZES.join('|')})$`)
245
+
246
+ // Static class/className attribute value — not `:class` / `v-bind:class` (the
247
+ // negative lookbehind rejects a preceding `:` or `-`).
248
+ const CLASS_ATTR = /(?<![:\w-])(class(?:Name)?)(\s*=\s*)(["'])([^"']*)\3/g
249
+
250
+ const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
251
+ // Whole-token matcher within a space-separated class list (consumes one leading
252
+ // space so removing a mid-list token doesn't leave a double space).
253
+ const tokenRe = (tok) => new RegExp(`(?:^|\\s)${escapeRe(tok)}(?=\\s|$)`)
254
+
255
+ export function mergeWeightClasses(content) {
256
+ const merges = []
257
+ const migrated = content.replace(CLASS_ATTR, (full, name, eq, quote, value, offset) => {
258
+ const words = value.split(/\s+/).filter(Boolean)
259
+ const sizes = words.filter((w) => SIZE_CLASS.test(w))
260
+ const weights = words.filter((w) => w in WEIGHT_SUFFIX)
261
+ if (sizes.length !== 1 || weights.length !== 1) return full
262
+
263
+ const size = sizes[0]
264
+ const weight = weights[0]
265
+ const suffix = WEIGHT_SUFFIX[weight]
266
+ const merged = suffix ? `${size}-${suffix}` : size
267
+
268
+ const newValue = value
269
+ .replace(new RegExp(`(^|\\s)${escapeRe(size)}(?=\\s|$)`), (m, pre) => `${pre}${merged}`)
270
+ .replace(tokenRe(weight), '')
271
+ merges.push({ from: `${size} + ${weight}`, to: merged, line: lineAt(content, offset) })
272
+ return `${name}${eq}${quote}${newValue}${quote}`
273
+ })
274
+ return { migrated, merges }
275
+ }
276
+
277
+ // ---------- ALREADY-MIGRATED DETECTION ----------
278
+
279
+ // Tokens that exist ONLY pre-migration (renamed away) vs ONLY post-migration. A
280
+ // codebase with post-migration names has almost certainly been migrated already
281
+ // or partially. Re-running color renames is destructive because the color
282
+ // renames reuse names, so default to typography-only when v2 sentinels exist.
283
+ const PRE_MIGRATION_TOKENS = [
284
+ 'surface-white', 'ink-white', 'outline-white', 'surface-menu-bar',
285
+ 'surface-card', 'surface-cards', 'surface-modal', 'surface-selected',
286
+ 'outline-gray-modal', 'outline-gray-modals',
287
+ ]
288
+ const POST_MIGRATION_TOKENS = [
289
+ 'surface-base', 'ink-base', 'outline-base', 'surface-sidebar',
290
+ 'surface-elevation-1', 'surface-elevation-2', 'surface-elevation-3',
291
+ 'outline-elevation-2',
292
+ ]
293
+ const sentinelRegex = (tokens) =>
294
+ new RegExp(`(?<![a-zA-Z0-9])(?:${tokens.slice().sort(byLengthDesc).join('|')})(?![a-zA-Z0-9-])`, 'g')
295
+ const PRE_REGEX = sentinelRegex(PRE_MIGRATION_TOKENS)
296
+ const POST_REGEX = sentinelRegex(POST_MIGRATION_TOKENS)
297
+
298
+ export function detectMigrationState(files) {
299
+ let pre = 0
300
+ let post = 0
301
+ for (const file of files) {
302
+ const content = fs.readFileSync(file, 'utf8')
303
+ pre += (content.match(PRE_REGEX) || []).length
304
+ post += (content.match(POST_REGEX) || []).length
305
+ }
306
+ return { pre, post, likelyMigrated: post > 0 }
307
+ }
308
+
309
+ export function getMigrationMode({ likelyMigrated }, { force = false } = {}) {
310
+ return likelyMigrated && !force ? 'migrated-typography' : 'full'
311
+ }
312
+
313
+ export function migrateTokens(content, { mode = 'full' } = {}) {
314
+ const tokenRenames = mode === 'migrated-typography'
315
+ ? MIGRATED_TEXT_SIZE_RENAMES
316
+ : TOKEN_RENAMES
317
+ const renameRegex = renameRegexFor(tokenRenames)
318
+ const replacements = []
319
+ let migrated = content.replace(renameRegex, (match, _token, offset) => {
320
+ const to = tokenRenames[match]
321
+ replacements.push({ from: match, to, line: lineAt(content, offset) })
322
+ return to
323
+ })
324
+
325
+ let merges = []
326
+ if (mode === 'full') {
327
+ // Merge weight classes on the post-rename text so `text-xl font-medium`
328
+ // becomes `text-2xl-medium` (size shift first, then merge).
329
+ const result = mergeWeightClasses(migrated)
330
+ migrated = result.migrated
331
+ merges = result.merges
332
+ }
333
+
334
+ const flagged = []
335
+ for (const m of content.matchAll(FLAG_REGEX)) {
336
+ flagged.push({ token: m[0], line: lineAt(content, m.index) })
337
+ }
338
+
339
+ return { migrated, replacements, merges, flagged }
340
+ }
341
+
342
+ function lineAt(content, offset) {
343
+ let line = 1
344
+ for (let i = 0; i < offset; i++) if (content[i] === '\n') line++
345
+ return line
346
+ }
347
+
348
+ // ---------- CLI ----------
349
+
350
+ const EXTENSIONS = new Set([
351
+ '.vue', '.ts', '.tsx', '.js', '.jsx', '.md', '.css', '.scss', '.html',
352
+ ])
353
+ const SKIP_DIRS = new Set([
354
+ 'node_modules', '.git', 'dist', 'cache', 'generated', 'espresso-v2-design-tokens',
355
+ ])
356
+
357
+ function* walk(target) {
358
+ const stat = fs.statSync(target)
359
+ if (stat.isFile()) {
360
+ yield target
361
+ return
362
+ }
363
+ for (const entry of fs.readdirSync(target, { withFileTypes: true })) {
364
+ const full = path.join(target, entry.name)
365
+ if (entry.isDirectory()) {
366
+ if (!SKIP_DIRS.has(entry.name)) yield* walk(full)
367
+ } else if (EXTENSIONS.has(path.extname(entry.name))) {
368
+ yield full
369
+ }
370
+ }
371
+ }
372
+
373
+ function main() {
374
+ const args = process.argv.slice(2)
375
+ const help = args.includes('--help') || args.includes('-h')
376
+ const dryRun = args.includes('--dry-run')
377
+ const force = args.includes('--force')
378
+ const targets = args.filter((a) => !a.startsWith('--'))
379
+
380
+ if (help) {
381
+ console.log(USAGE)
382
+ return
383
+ }
384
+
385
+ if (targets.length === 0) {
386
+ console.error(USAGE)
387
+ process.exit(1)
388
+ }
389
+
390
+ const files = []
391
+ for (const target of targets) for (const file of walk(target)) files.push(file)
392
+
393
+ // Guard against a destructive second full pass (the color renames reuse names).
394
+ const { pre, post, likelyMigrated } = detectMigrationState(files)
395
+ const mode = getMigrationMode({ likelyMigrated }, { force })
396
+ if (likelyMigrated) {
397
+ console.warn('\n⚠ This codebase looks already or partially migrated to espresso v2.')
398
+ console.warn(` Found ${post} v2-only token(s) and ${pre} pre-v2 token(s).`)
399
+ if (force) {
400
+ console.warn(' --force set: running the full migration anyway. Color tokens may double-shift.\n')
401
+ } else {
402
+ if (pre > 0) {
403
+ console.warn(` ${pre} pre-v2 color token(s) will be left untouched.`)
404
+ console.warn(' Pass --force to run the color migration too. Review carefully: color tokens may double-shift.')
405
+ }
406
+ console.warn(' Running only the typography correction (`text-lg` → `text-md`, ...).\n')
407
+ }
408
+ }
409
+
410
+ let filesChanged = 0
411
+ let totalReplacements = 0
412
+ let totalMerges = 0
413
+ const allFlagged = []
414
+
415
+ for (const file of files) {
416
+ const content = fs.readFileSync(file, 'utf8')
417
+ const { migrated, replacements, merges, flagged } = migrateTokens(content, { mode })
418
+
419
+ for (const f of flagged) allFlagged.push({ file, ...f })
420
+ const changeCount = replacements.length + merges.length
421
+ if (changeCount === 0) continue
422
+
423
+ filesChanged++
424
+ totalReplacements += replacements.length
425
+ totalMerges += merges.length
426
+ if (dryRun) {
427
+ console.log(`${file} (${changeCount})`)
428
+ for (const r of replacements) console.log(` L${r.line}: ${r.from} -> ${r.to}`)
429
+ for (const m of merges) console.log(` L${m.line}: ${m.from} => ${m.to}`)
430
+ } else {
431
+ fs.writeFileSync(file, migrated)
432
+ console.log(`${file} (${changeCount})`)
433
+ }
434
+ }
435
+
436
+ console.log(
437
+ `\n${dryRun ? '[dry-run] would update' : 'Updated'} ${filesChanged} files, ` +
438
+ `${totalReplacements} token renames, ${totalMerges} weight-class merges` +
439
+ (mode === 'migrated-typography' ? ' (typography correction only)' : ''),
440
+ )
441
+
442
+ if (allFlagged.length > 0) {
443
+ console.log('\n⚠ Tokens needing manual attention (removed in v2 or unmapped):')
444
+ for (const f of allFlagged) {
445
+ console.log(` ${f.file}:L${f.line} ${f.token}`)
446
+ }
447
+ }
448
+ }
449
+
450
+ const scriptPath = fileURLToPath(import.meta.url)
451
+ const invokedPath = process.argv[1]
452
+ const isCLI = invokedPath && fs.realpathSync(invokedPath) === fs.realpathSync(scriptPath)
453
+ if (isCLI) main()
@@ -0,0 +1,55 @@
1
+ import fs from 'node:fs'
2
+ import os from 'node:os'
3
+ import path from 'node:path'
4
+ import { afterEach, describe, expect, it } from 'vitest'
5
+ import {
6
+ detectMigrationState,
7
+ getMigrationMode,
8
+ migrateTokens,
9
+ } from './migrate-tokens-v2.js'
10
+
11
+ const tempDirs = []
12
+
13
+ afterEach(() => {
14
+ for (const dir of tempDirs.splice(0)) {
15
+ fs.rmSync(dir, { recursive: true, force: true })
16
+ }
17
+ })
18
+
19
+ describe('tokens v2 migration', () => {
20
+ it('runs the full migration for unmigrated content', () => {
21
+ const result = migrateTokens('<div class="bg-surface-white text-xl font-medium"></div>')
22
+
23
+ expect(result.migrated).toBe('<div class="bg-surface-base text-2xl-medium"></div>')
24
+ })
25
+
26
+ it('runs typography-only correction for already migrated content', () => {
27
+ const result = migrateTokens(
28
+ '<div class="bg-surface-base text-lg text-xl text-2xl-medium"></div>',
29
+ { mode: 'migrated-typography' },
30
+ )
31
+
32
+ expect(result.migrated).toBe(
33
+ '<div class="bg-surface-base text-md text-lg text-xl-medium"></div>',
34
+ )
35
+ })
36
+
37
+ it('selects typography-only mode when v2 sentinels are present', () => {
38
+ const file = writeTempFile(
39
+ '<div class="bg-surface-base bg-surface-white text-xl"></div>',
40
+ )
41
+ const state = detectMigrationState([file])
42
+
43
+ expect(state).toEqual({ pre: 1, post: 1, likelyMigrated: true })
44
+ expect(getMigrationMode(state)).toBe('migrated-typography')
45
+ expect(getMigrationMode(state, { force: true })).toBe('full')
46
+ })
47
+ })
48
+
49
+ function writeTempFile(content) {
50
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'tokens-v2-'))
51
+ tempDirs.push(dir)
52
+ const file = path.join(dir, 'fixture.vue')
53
+ fs.writeFileSync(file, content)
54
+ return file
55
+ }