@vc-shell/framework 1.0.326 → 1.1.0-alpha.1

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 (272) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/core/types/index.ts +4 -8
  3. package/dist/core/types/index.d.ts +5 -8
  4. package/dist/core/types/index.d.ts.map +1 -1
  5. package/dist/framework.js +231 -218
  6. package/dist/{index-YPa3sZmi.js → index-6afjoxl_.js} +1 -1
  7. package/dist/{index-B0gk_mcS.js → index-BbQdOYmi.js} +1 -1
  8. package/dist/{index-CJmhp9vS.js → index-BrkL9UJR.js} +1 -1
  9. package/dist/{index-CgCz4CyH.js → index-BrmiwSoL.js} +1 -1
  10. package/dist/{index-D2jOZZjY.js → index-C2fcXLd3.js} +1 -1
  11. package/dist/{index-F3Hq-uIf.js → index-CUGEM4hi.js} +1 -1
  12. package/dist/{index-DAPeO06N.js → index-D0rhsYYW.js} +1 -1
  13. package/dist/{index-cnzEckQv.js → index-D8jMD-EZ.js} +1 -1
  14. package/dist/{index-iKZHcZzW.js → index-DQP89JB7.js} +1 -1
  15. package/dist/{index-BzXuUqVu.js → index-DaD28rcu.js} +1 -1
  16. package/dist/{index-uJMg_eoD.js → index-Df8tA8qI.js} +1 -1
  17. package/dist/{index-sB8jPoQD.js → index-Dg25Tarq.js} +1 -1
  18. package/dist/{index-KsWKxMp0.js → index-DrL4GDih.js} +1 -1
  19. package/dist/{index-CimbhNJz.js → index-DrxadmGH.js} +1 -1
  20. package/dist/{index-52C01JSh.js → index-DulPT6l3.js} +1 -1
  21. package/dist/{index-C8ZFV-LP.js → index-Y1Vd-H3g.js} +34754 -34242
  22. package/dist/{index-Dr0Jm59E.js → index-lQO4lsVu.js} +1 -1
  23. package/dist/index.css +1 -1
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/locales/en.json +1 -0
  27. package/dist/shared/components/app-bar-button/app-bar-button.vue.d.ts.map +1 -1
  28. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -1
  29. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
  30. package/dist/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.d.ts +15 -1
  31. package/dist/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.d.ts.map +1 -1
  32. package/dist/shared/components/generic-dropdown/generic-dropdown.vue.d.ts +110 -0
  33. package/dist/shared/components/generic-dropdown/generic-dropdown.vue.d.ts.map +1 -0
  34. package/dist/shared/components/generic-dropdown/index.d.ts +2 -0
  35. package/dist/shared/components/generic-dropdown/index.d.ts.map +1 -0
  36. package/dist/shared/components/index.d.ts +2 -0
  37. package/dist/shared/components/index.d.ts.map +1 -1
  38. package/dist/shared/components/language-selector/language-selector.vue.d.ts.map +1 -1
  39. package/dist/shared/components/menu-item/index.d.ts +2 -0
  40. package/dist/shared/components/menu-item/index.d.ts.map +1 -0
  41. package/dist/shared/components/menu-item/menu-item.vue.d.ts +57 -0
  42. package/dist/shared/components/menu-item/menu-item.vue.d.ts.map +1 -0
  43. package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts.map +1 -1
  44. package/dist/shared/components/notification-template/index.d.ts +0 -6
  45. package/dist/shared/components/notification-template/index.d.ts.map +1 -1
  46. package/dist/shared/components/notification-template/notification-template.vue.d.ts +2 -2
  47. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  48. package/dist/shared/components/sidebar/sidebar.vue.d.ts +1 -0
  49. package/dist/shared/components/sidebar/sidebar.vue.d.ts.map +1 -1
  50. package/dist/shared/components/theme-selector/theme-selector.vue.d.ts.map +1 -1
  51. package/dist/shared/components/user-dropdown-button/_internal/user-actions.vue.d.ts +21 -0
  52. package/dist/shared/components/user-dropdown-button/_internal/user-actions.vue.d.ts.map +1 -0
  53. package/dist/shared/components/user-dropdown-button/_internal/user-info.vue.d.ts +17 -0
  54. package/dist/shared/components/user-dropdown-button/_internal/user-info.vue.d.ts.map +1 -0
  55. package/dist/shared/components/user-dropdown-button/_internal/user-sidebar.vue.d.ts +25 -0
  56. package/dist/shared/components/user-dropdown-button/_internal/user-sidebar.vue.d.ts.map +1 -0
  57. package/dist/shared/components/user-dropdown-button/composables/useUserActions.d.ts +3921 -0
  58. package/dist/shared/components/user-dropdown-button/composables/useUserActions.d.ts.map +1 -0
  59. package/dist/shared/components/user-dropdown-button/index.d.ts +5 -5
  60. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts +4 -4
  61. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  62. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +0 -6
  63. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +0 -6
  65. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +0 -6
  67. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  68. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +0 -6
  69. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  70. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +0 -6
  71. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -1
  72. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +0 -6
  73. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  74. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +0 -6
  75. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  76. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +0 -6
  77. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  78. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +0 -6
  79. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  80. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +0 -6
  81. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  82. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +0 -6
  83. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  84. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +0 -6
  85. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  86. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +0 -6
  87. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  88. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts +0 -6
  89. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts.map +1 -1
  90. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +0 -6
  91. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -1
  92. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +0 -6
  93. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  94. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +0 -6
  95. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  96. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +0 -6
  97. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -1
  98. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +0 -6
  99. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -1
  100. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +0 -6
  101. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  102. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +0 -6
  103. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  104. package/dist/shared/modules/dynamic/components/fields/props.d.ts +0 -6
  105. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  106. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +0 -18
  107. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  108. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts +0 -18
  109. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  110. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts +0 -18
  111. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -1
  112. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts +0 -18
  113. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -1
  114. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +0 -18
  115. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -1
  116. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts +0 -18
  117. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts.map +1 -1
  118. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts +0 -18
  119. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts.map +1 -1
  120. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts +0 -18
  121. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts.map +1 -1
  122. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts +0 -18
  123. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts.map +1 -1
  124. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +0 -18
  125. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -1
  126. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts +0 -18
  127. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts.map +1 -1
  128. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts +0 -18
  129. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts.map +1 -1
  130. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts +0 -18
  131. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts.map +1 -1
  132. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts +0 -18
  133. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts.map +1 -1
  134. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts +0 -18
  135. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts.map +1 -1
  136. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +0 -18
  137. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -1
  138. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts +0 -18
  139. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts.map +1 -1
  140. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +0 -18
  141. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +1 -1
  142. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +0 -12
  143. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  144. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +0 -12
  145. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  146. package/dist/shared/pages/InvitePage/components/invite/index.d.ts +8 -8
  147. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts +8 -8
  148. package/dist/tailwind.config.d.ts +1 -1
  149. package/dist/tsconfig.tsbuildinfo +1 -1
  150. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts +156 -156
  151. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +2 -1
  152. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
  153. package/dist/ui/components/atoms/vc-icon/icons/AppWindowIcon.vue.d.ts +18 -0
  154. package/dist/ui/components/atoms/vc-icon/icons/AppWindowIcon.vue.d.ts.map +1 -0
  155. package/dist/ui/components/atoms/vc-icon/icons/ArrowLeftIcon.vue.d.ts +18 -0
  156. package/dist/ui/components/atoms/vc-icon/icons/ArrowLeftIcon.vue.d.ts.map +1 -0
  157. package/dist/ui/components/atoms/vc-icon/icons/ArrowRightIcon.vue.d.ts +18 -0
  158. package/dist/ui/components/atoms/vc-icon/icons/ArrowRightIcon.vue.d.ts.map +1 -0
  159. package/dist/ui/components/atoms/vc-icon/icons/BellIcon.vue.d.ts +18 -0
  160. package/dist/ui/components/atoms/vc-icon/icons/BellIcon.vue.d.ts.map +1 -0
  161. package/dist/ui/components/atoms/vc-icon/icons/CircleDotsIcon.vue.d.ts +18 -0
  162. package/dist/ui/components/atoms/vc-icon/icons/CircleDotsIcon.vue.d.ts.map +1 -0
  163. package/dist/ui/components/atoms/vc-icon/icons/CrossSignIcon.vue.d.ts +18 -0
  164. package/dist/ui/components/atoms/vc-icon/icons/CrossSignIcon.vue.d.ts.map +1 -0
  165. package/dist/ui/components/atoms/vc-icon/icons/LogoutIcon.vue.d.ts +18 -0
  166. package/dist/ui/components/atoms/vc-icon/icons/LogoutIcon.vue.d.ts.map +1 -0
  167. package/dist/ui/components/atoms/vc-icon/icons/MenuBurgerIcon.vue.d.ts +18 -0
  168. package/dist/ui/components/atoms/vc-icon/icons/MenuBurgerIcon.vue.d.ts.map +1 -0
  169. package/dist/ui/components/atoms/vc-icon/icons/MinusSignIcon.vue.d.ts +18 -0
  170. package/dist/ui/components/atoms/vc-icon/icons/MinusSignIcon.vue.d.ts.map +1 -0
  171. package/dist/ui/components/atoms/vc-icon/icons/PlusSignIcon.vue.d.ts +18 -0
  172. package/dist/ui/components/atoms/vc-icon/icons/PlusSignIcon.vue.d.ts.map +1 -0
  173. package/dist/ui/components/atoms/vc-icon/icons/SettingsBoltIcon.vue.d.ts +18 -0
  174. package/dist/ui/components/atoms/vc-icon/icons/SettingsBoltIcon.vue.d.ts.map +1 -0
  175. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts +12 -0
  176. package/dist/ui/components/atoms/vc-icon/icons/index.d.ts.map +1 -0
  177. package/dist/ui/components/atoms/vc-icon/index.d.ts +1 -0
  178. package/dist/ui/components/atoms/vc-icon/index.d.ts.map +1 -1
  179. package/dist/ui/components/atoms/vc-icon/vc-icon.stories.d.ts +3 -3
  180. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts +3 -2
  181. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
  182. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  183. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts +4 -0
  184. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
  185. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts +996 -0
  186. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts.map +1 -1
  187. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts +332 -0
  188. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  189. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  190. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts +3 -1
  191. package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue.d.ts.map +1 -1
  192. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue.d.ts.map +1 -1
  193. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  194. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts +5 -0
  195. package/dist/ui/components/organisms/vc-app/composables/useToolbarSlots.d.ts.map +1 -0
  196. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +16 -106
  197. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  198. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +16 -106
  199. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  200. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts +0 -2
  201. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  202. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts +0 -3
  203. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  204. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts +13 -2
  205. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
  206. package/dist/ui/components/organisms/vc-blade/vc-blade.stories.d.ts +0 -16
  207. package/dist/ui/components/organisms/vc-blade/vc-blade.stories.d.ts.map +1 -1
  208. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +0 -2
  209. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  210. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  211. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue.d.ts +3 -3
  212. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue.d.ts.map +1 -1
  213. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +30 -30
  214. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +6 -6
  215. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  216. package/package.json +9 -6
  217. package/shared/components/app-bar-button/app-bar-button.vue +62 -45
  218. package/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +31 -134
  219. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +8 -7
  220. package/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.ts +16 -4
  221. package/shared/components/change-password/change-password.vue +2 -1
  222. package/shared/components/generic-dropdown/generic-dropdown.vue +171 -0
  223. package/shared/components/generic-dropdown/index.ts +1 -0
  224. package/shared/components/index.ts +2 -0
  225. package/shared/components/language-selector/language-selector.vue +29 -64
  226. package/shared/components/menu-item/index.ts +1 -0
  227. package/shared/components/menu-item/menu-item.vue +111 -0
  228. package/shared/components/notification-dropdown/notification-dropdown.vue +21 -72
  229. package/shared/components/notification-template/notification-template.vue +23 -34
  230. package/shared/components/sidebar/sidebar.vue +16 -1
  231. package/shared/components/theme-selector/theme-selector.vue +34 -76
  232. package/shared/components/user-dropdown-button/_internal/user-actions.vue +68 -0
  233. package/shared/components/user-dropdown-button/_internal/user-info.vue +74 -0
  234. package/shared/components/user-dropdown-button/_internal/user-sidebar.vue +73 -0
  235. package/shared/components/user-dropdown-button/composables/useUserActions.ts +56 -0
  236. package/shared/components/user-dropdown-button/user-dropdown-button.vue +69 -271
  237. package/tailwind.config.ts +1 -1
  238. package/ui/components/atoms/vc-badge/vc-badge.vue +10 -9
  239. package/ui/components/atoms/vc-button/vc-button.vue +2 -2
  240. package/ui/components/atoms/vc-card/vc-card.vue +4 -7
  241. package/ui/components/atoms/vc-icon/icons/AppWindowIcon.vue +32 -0
  242. package/ui/components/atoms/vc-icon/icons/ArrowLeftIcon.vue +24 -0
  243. package/ui/components/atoms/vc-icon/icons/ArrowRightIcon.vue +24 -0
  244. package/ui/components/atoms/vc-icon/icons/BellIcon.vue +29 -0
  245. package/ui/components/atoms/vc-icon/icons/CircleDotsIcon.vue +41 -0
  246. package/ui/components/atoms/vc-icon/icons/CrossSignIcon.vue +24 -0
  247. package/ui/components/atoms/vc-icon/icons/LogoutIcon.vue +24 -0
  248. package/ui/components/atoms/vc-icon/icons/MenuBurgerIcon.vue +24 -0
  249. package/ui/components/atoms/vc-icon/icons/MinusSignIcon.vue +24 -0
  250. package/ui/components/atoms/vc-icon/icons/PlusSignIcon.vue +24 -0
  251. package/ui/components/atoms/vc-icon/icons/SettingsBoltIcon.vue +31 -0
  252. package/ui/components/atoms/vc-icon/icons/index.ts +11 -0
  253. package/ui/components/atoms/vc-icon/index.ts +1 -0
  254. package/ui/components/atoms/vc-icon/vc-icon.vue +33 -3
  255. package/ui/components/atoms/vc-status/vc-status.vue +17 -4
  256. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +22 -7
  257. package/ui/components/atoms/vc-widget/vc-widget.vue +31 -22
  258. package/ui/components/molecules/vc-pagination/vc-pagination.vue +9 -17
  259. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +196 -33
  260. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +47 -47
  261. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +5 -29
  262. package/ui/components/organisms/vc-app/composables/useToolbarSlots.ts +37 -0
  263. package/ui/components/organisms/vc-app/vc-app.vue +87 -70
  264. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +17 -17
  265. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +9 -69
  266. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +199 -31
  267. package/ui/components/organisms/vc-blade/vc-blade.stories.ts +1 -1
  268. package/ui/components/organisms/vc-blade/vc-blade.vue +129 -38
  269. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +2 -2
  270. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +1 -1
  271. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +34 -23
  272. package/ui/components/organisms/vc-table/vc-table.vue +44 -29
@@ -3,6 +3,7 @@
3
3
  <VcTooltip
4
4
  placement="bottom"
5
5
  :offset="{ crossAxis: 0, mainAxis: -10 }"
6
+ :delay="1000"
6
7
  class="tw-w-full"
7
8
  >
8
9
  <template
@@ -35,33 +36,35 @@
35
36
  </slot>
36
37
  </div>
37
38
  </button>
38
-
39
- <div
40
- v-if="isDropdownVisible"
41
- ref="floatingDrop"
42
- v-on-click-outside="[
43
- () => {
44
- isDropdownVisible = false;
45
- },
46
- { ignore: [referenceButton] },
47
- ]"
48
- :style="floatingDropStyle"
49
- :class="['app-bar-button__dropdown']"
50
- >
51
- <slot
52
- name="dropdown-content"
53
- :opened="isDropdownVisible"
54
- :toggle="toggleNotificationsDrop"
55
- ></slot>
56
- </div>
57
39
  </VcTooltip>
40
+
41
+ <div
42
+ v-if="isDropdownVisible"
43
+ v-on-click-outside="[
44
+ () => {
45
+ isDropdownVisible = false;
46
+ },
47
+ { ignore: [referenceButton] },
48
+ ]"
49
+ class="app-bar-button__dropdown"
50
+ >
51
+ <Teleport to="#vc-app-bar__menu-dropdowns">
52
+ <div class="app-bar-button__menu-dropdowns">
53
+ <slot
54
+ name="dropdown-content"
55
+ :opened="isDropdownVisible"
56
+ :toggle="toggleNotificationsDrop"
57
+ ></slot>
58
+ </div>
59
+ </Teleport>
60
+ </div>
58
61
  </div>
59
62
  </template>
60
63
 
61
64
  <script lang="ts" setup>
62
65
  import { ref, computed } from "vue";
63
66
  import { vOnClickOutside } from "@vueuse/components";
64
- import { useFloating, shift, autoUpdate } from "@floating-ui/vue";
67
+ // import { useFloating, shift, autoUpdate } from "@floating-ui/vue";
65
68
 
66
69
  export interface Props {
67
70
  title?: string;
@@ -88,20 +91,19 @@ defineSlots<{
88
91
  const isDropdownVisible = ref(false);
89
92
 
90
93
  const referenceButton = ref<HTMLDivElement | null>(null);
91
- const floatingDrop = ref<HTMLDivElement | null>(null);
92
94
 
93
- const floater = useFloating(referenceButton, floatingDrop, {
94
- placement: props.position,
95
- whileElementsMounted: autoUpdate,
96
- middleware: [shift({ mainAxis: false })],
97
- });
95
+ // const floater = useFloating(referenceButton, null, {
96
+ // placement: props.position,
97
+ // whileElementsMounted: autoUpdate,
98
+ // middleware: [shift({ mainAxis: false })],
99
+ // });
98
100
 
99
- const floatingDropStyle = computed(() => {
100
- return {
101
- top: `${floater.y.value ?? 0}px`,
102
- left: `${floater.x.value ?? 0}px`,
103
- };
104
- });
101
+ // const floatingDropStyle = computed(() => {
102
+ // return {
103
+ // top: `${floater.y.value ?? 0}px`,
104
+ // left: `${floater.x.value ?? 0}px`,
105
+ // };
106
+ // });
105
107
 
106
108
  function toggleNotificationsDrop() {
107
109
  if (props.beforeOpen && typeof props.beforeOpen === "function" && props.beforeOpen() === false) {
@@ -122,38 +124,50 @@ function toggleNotificationsDrop() {
122
124
  --app-bar-button-bg-color: var(--additional-50);
123
125
  --app-bar-button-dropdown-bg-color: var(--additional-50);
124
126
  --app-bar-button-dropdown-button-width: var(--app-bar-button-width);
127
+ --app-bar-button-border-color: var(--accent-500);
125
128
  --app-bar-button-dropdown-button-border: var(--app-bar-button-border-color);
126
129
  --app-bar-button-dropdown-button-color: var(--app-bar-button-color);
127
130
  --app-bar-button-dropdown-button-background-color: var(--app-bar-button-background-color);
128
131
  --app-bar-button-dropdown-button-color-hover: var(--app-bar-button-color-hover);
129
132
  --app-bar-button-dropdown-button-background-color-hover: var(--app-bar-button-background-color-hover);
130
133
  --app-bar-button-mobile-bg-color: var(--neutral-500);
134
+
135
+ --app-bar-button-dropdown-button-color-hover: var(--neutrals-100);
136
+ --app-bar-button-dropdown-button-active-bg: var(--neutrals-200);
137
+ --app-bar-button-border-width: 2px;
131
138
  }
132
139
 
133
140
  .app-bar-button {
134
141
  @apply tw-relative tw-flex;
135
142
 
143
+ &::after {
144
+ content: "";
145
+ @apply tw-absolute tw-left-0 tw-bottom-0 tw-w-full
146
+ tw-border-b-[2px]
147
+ tw-border-[color:var(--app-bar-button-border-color)]
148
+ tw-opacity-0 tw-transition-opacity tw-duration-200 tw-z-[2];
149
+ }
150
+
151
+ &:hover::after {
152
+ @apply tw-opacity-100;
153
+ }
154
+
136
155
  &__button {
137
- @apply tw-flex tw-text-left tw-w-full;
156
+ @apply tw-flex tw-text-left tw-w-full tw-box-border tw-relative;
138
157
  }
139
158
 
140
159
  &__button-container {
141
160
  @apply tw-w-full tw-relative tw-h-full tw-flex tw-items-center tw-justify-center
142
- tw-border-l tw-border-solid
143
- tw-border-l-[color:var(--app-bar-button-dropdown-button-border)] tw-cursor-pointer
161
+ tw-cursor-pointer
144
162
  tw-text-[color:var(--app-bar-button-dropdown-button-color)] tw-bg-[color:var(--app-bar-button-dropdown-button-background-color)]
145
- tw-transition-colors tw-duration-200;
163
+ tw-transition-colors tw-duration-200 tw-box-border;
146
164
 
147
- &:hover {
148
- @apply tw-text-[color:var(--app-bar-button-dropdown-button-color-hover)]
149
- tw-bg-[color:var(--app-bar-button-dropdown-button-background-color-hover)];
165
+ &:hover:not(&--active) {
166
+ @apply tw-bg-[color:var(--app-bar-button-dropdown-button-color-hover)];
150
167
  }
151
168
 
152
169
  &--active {
153
- box-shadow: var(--app-bar-button-shadow);
154
- clip-path: inset(0px -20px 0px -20px);
155
- background-color: var(--app-bar-button-dropdown-bg-color);
156
- z-index: 9999;
170
+ @apply tw-bg-[color:var(--app-bar-button-dropdown-button-active-bg)];
157
171
  }
158
172
  }
159
173
 
@@ -162,8 +176,11 @@ function toggleNotificationsDrop() {
162
176
  }
163
177
 
164
178
  &__dropdown {
165
- @apply tw-absolute tw-top-[var(--app-bar-button-height)] tw-z-[10000] tw-min-w-[100%];
166
- box-shadow: var(--app-bar-button-shadow);
179
+ @apply tw-min-w-[100%];
180
+ }
181
+
182
+ &__menu-dropdowns {
183
+ //@apply tw-w-full tw-h-full tw-border-t-[2px] tw-border-[color:var(--app-bar-button-border-color)] tw-border-solid tw-border-b-[2px] tw-border-b-[color:var(--app-bar-button-border-color)];
167
184
  }
168
185
  }
169
186
  </style>
@@ -1,70 +1,36 @@
1
1
  <template>
2
- <button
3
- class="vc-app-switcher__button"
4
- @click.stop="toggleAppSwitch"
2
+ <div
3
+ v-if="appsList && appsList.length"
4
+ ref="container"
5
+ class="vc-app-switcher"
6
+ @contextmenu.prevent
5
7
  >
6
- <div class="vc-app-switcher__icon"></div>
7
- </button>
8
- <Sidebar
9
- :is-expanded="isVisible"
10
- render="always"
11
- position="left"
12
- @close="onClose"
13
- >
14
- <template #header>
15
- <div
16
- class="vc-app-switcher__button-wrap"
17
- :class="{
18
- 'vc-app-switcher__button-wrap--mobile': $isMobile.value,
19
- }"
20
- >
21
- <button
22
- class="vc-app-switcher__button vc-app-switcher__button--header"
23
- @click.stop="isVisible = false"
24
- >
25
- <div class="vc-app-switcher__icon"></div>
26
- </button>
27
- <p class="vc-app-switcher__title">{{ $t("COMPONENTS.APP_SWITCHER.TITLE") }}</p>
28
- </div>
29
- </template>
30
- <template #content>
31
- <div
32
- v-if="isVisible && appsList && appsList.length"
33
- ref="container"
34
- class="vc-app-switcher"
35
- @contextmenu.prevent
36
- >
37
- <div class="vc-app-switcher__dropdown">
38
- <ul class="vc-app-switcher__list">
39
- <li
40
- v-for="item in appsList"
41
- :key="item.id"
42
- class="vc-app-switcher__list-item"
43
- :class="{
44
- 'vc-app-switcher__list-item--active': locationHandler(item.relativeUrl ?? ''),
45
- }"
46
- @click="switchApp(item)"
47
- >
48
- <img
49
- :src="imageUrl(item.iconUrl ?? '')"
50
- :alt="`icon_${item.id}`"
51
- class="vc-app-switcher__item-icon"
52
- />
53
- <p class="vc-app-switcher__item-title">
54
- {{ item.title }}
55
- </p>
56
- </li>
57
- </ul>
8
+ <GenericDropdown
9
+ :opened="true"
10
+ :items="appsList"
11
+ :is-item-active="(item) => locationHandler(item.relativeUrl ?? '')"
12
+ :on-item-click="switchApp"
13
+ >
14
+ <template #item="{ item }">
15
+ <div class="vc-app-switcher__item">
16
+ <img
17
+ :src="imageUrl(item.iconUrl ?? '')"
18
+ :alt="`icon_${item.id}`"
19
+ class="vc-app-switcher__item-icon"
20
+ />
21
+ <p class="vc-app-switcher__item-title">
22
+ {{ item.title }}
23
+ </p>
58
24
  </div>
59
- </div>
60
- </template>
61
- </Sidebar>
25
+ </template>
26
+ </GenericDropdown>
27
+ </div>
62
28
  </template>
63
29
 
64
30
  <script lang="ts" setup>
65
31
  import { ref } from "vue";
66
32
  import { AppDescriptor } from "../../../../../core/api/platform";
67
- import { Sidebar } from "./../../../sidebar";
33
+ import { GenericDropdown } from "../../../generic-dropdown";
68
34
 
69
35
  export interface Props {
70
36
  appsList: AppDescriptor[];
@@ -80,102 +46,33 @@ const props = withDefaults(defineProps<Props>(), {
80
46
 
81
47
  const emit = defineEmits<Emits>();
82
48
 
83
- const isVisible = ref(false);
84
-
85
49
  const imageUrl = (url: string) => url;
86
50
 
87
51
  const locationHandler = (url: string) => {
88
52
  const cleanUrl = window.location.pathname.replace(/\/+$/, "");
89
53
  const match = url.match(cleanUrl);
90
54
  if (match) {
91
- return match[0];
55
+ return !!match[0];
92
56
  }
93
- return null;
57
+ return false;
94
58
  };
95
59
 
96
60
  const switchApp = (app: AppDescriptor) => {
97
61
  emit("onClick", app);
98
- onClose();
99
- };
100
-
101
- const toggleAppSwitch = () => {
102
- if (props.appsList && props.appsList.length) {
103
- isVisible.value = !isVisible.value;
104
- }
105
- };
106
-
107
- const onClose = () => {
108
- isVisible.value = false;
109
62
  };
110
63
  </script>
111
64
 
112
65
  <style lang="scss">
113
66
  :root {
114
- --app-switcher-button-color: var(--neutrals-400);
115
- --app-switcher-button-color-hover: var(--neutrals-500);
116
67
  --app-switcher-item-text-color: var(--additional-950);
117
- --app-switcher-dropdown-bg-color: var(--additional-50);
118
- --app-switcher-dropdown-shadow: 4px 4px 20px rgba(47, 86, 108, 0.25);
119
68
  --app-switcher-height: var(--app-bar-height);
120
- --app-switcher-item-bg-hover: var(--primary-50);
121
69
  }
122
70
 
123
71
  .vc-app-switcher {
124
- @apply tw-relative tw-flex tw-mx-3 tw-shrink-0 tw-mt-4;
125
-
126
- &__button {
127
- @apply hover:tw-relative tw-p-0 tw-border-0 tw-bg-transparent tw-relative tw-h-full tw-flex tw-items-center tw-justify-center tw-shrink-0 tw-mx-3;
128
-
129
- &:hover .vc-app-switcher__icon {
130
- @apply tw-bg-[color:var(--app-switcher-button-color-hover)];
131
- }
132
-
133
- &--header {
134
- @apply tw-h-auto tw-block tw-mx-0 #{!important};
135
- }
136
- }
137
-
138
- &__button-wrap {
139
- @apply tw-min-h-[--app-switcher-height] tw-px-4 tw-flex tw-items-center tw-justify-between tw-h-[var(--app-switcher-height)] tw-mx-3;
140
-
141
- &--mobile {
142
- @apply tw-mx-2 #{!important};
143
- }
144
- }
145
-
146
- &__title {
147
- @apply tw-text-lg tw-font-bold tw-text-[color:var(--app-switcher-item-text-color)];
148
- }
149
-
150
- &__icon {
151
- @apply tw-h-[22px] tw-w-[22px] tw-bg-[color:var(--app-switcher-button-color)] tw-duration-200;
152
- mask: url(/assets/app-select.svg) no-repeat center;
153
- mask-size: contain;
154
- }
155
-
156
- &__dropdown {
157
- @apply tw-bg-[color:var(--app-switcher-dropdown-bg-color)] tw-w-full;
158
- }
159
-
160
- &__list {
161
- @apply tw-flex tw-flex-col tw-gap-3 tw-overflow-hidden;
162
- }
163
-
164
- &__list-item {
165
- @apply tw-p-3 tw-text-sm tw-text-[color:var(--app-switcher-item-text-color)] tw-flex tw-flex-row tw-items-center tw-cursor-pointer tw-w-full;
166
- transition: background-color 0.2s;
167
-
168
- &--active {
169
- @apply tw-font-extrabold;
170
- }
171
-
172
- &:hover .vc-app-switcher__item-title {
173
- @apply tw-opacity-80;
174
- }
72
+ @apply tw-relative tw-flex tw-shrink-0;
175
73
 
176
- &:hover {
177
- @apply tw-bg-[color:var(--app-switcher-item-bg-hover)];
178
- }
74
+ &__item {
75
+ @apply tw-flex tw-items-center tw-w-full;
179
76
  }
180
77
 
181
78
  &__item-icon {
@@ -183,7 +80,7 @@ const onClose = () => {
183
80
  }
184
81
 
185
82
  &__item-title {
186
- @apply tw-font-normal tw-text-sm tw-truncate;
83
+ @apply tw-font-normal tw-text-sm tw-leading-5 tw-truncate;
187
84
  color: var(--app-switcher-item-text-color);
188
85
  transition: opacity 0.3s ease;
189
86
  }
@@ -3,10 +3,9 @@
3
3
  <VcBreadcrumbs
4
4
  v-if="blades && blades.length > 2"
5
5
  :items="breadcrumbs"
6
- class="tw-bg-[--blade-navigation-bg-color] tw-p-2 [box-shadow:var(--blade-navigation-shadow)] tw-rounded-[var(--blade-navigation-border-radius)]"
6
+ class="tw-bg-[--blade-navigation-bg-color] tw-p-2"
7
7
  :class="[
8
8
  {
9
- 'tw-mt-4 tw-mx-2': !$isMobile.value,
10
9
  'tw-p-4': $isMobile.value,
11
10
  },
12
11
  ]"
@@ -18,7 +17,7 @@
18
17
  </template>
19
18
 
20
19
  <script lang="ts" setup>
21
- import { Ref, computed, inject, withDirectives, h, vShow, toRef, VNode, nextTick } from "vue";
20
+ import { Ref, computed, inject, withDirectives, h, vShow, toRef, VNode, nextTick, provide } from "vue";
22
21
  import { RouterView, useRoute } from "vue-router";
23
22
  import { BladeVNode, IParentCallArgs, useBladeNavigation } from "./../../../../../shared";
24
23
  import { ErrorInterceptor } from "./../../../error-interceptor";
@@ -79,7 +78,6 @@ const render = () => {
79
78
  const hiddenQuantity = blades.value.filter(
80
79
  (x) => x.props.navigation.isVisible === false && x.props.navigation.idx < index,
81
80
  ).length;
82
-
83
81
  arr.push(
84
82
  h(
85
83
  ErrorInterceptor,
@@ -95,13 +93,16 @@ const render = () => {
95
93
  return withDirectives(
96
94
  h(
97
95
  VcBladeView,
98
- { key: `${bladeVNode.type?.name}_${index}` || `blade_${index}`, blade: bladeVNode },
96
+ {
97
+ key: `${bladeVNode.type?.name}_${index}` || `blade_${index}`,
98
+ blade: bladeVNode,
99
+ expandable: quantity.value > 1,
100
+ error,
101
+ },
99
102
  {
100
103
  default: ({ Component }: { Component: BladeVNode }) => {
101
104
  return h(Component, {
102
- error,
103
105
  closable: index >= 1,
104
- expandable: quantity.value > 1,
105
106
  expanded: index - hiddenQuantity === quantity.value - 1,
106
107
  "onClose:blade": () => {
107
108
  if (index === 0) return;
@@ -1,4 +1,4 @@
1
- import { Slot, defineComponent, h, provide, ref, VNode, PropType, Component, reactive } from "vue";
1
+ import { Slot, defineComponent, h, provide, ref, VNode, PropType, Component, reactive, computed } from "vue";
2
2
  import { navigationViewLocation } from "./../../injectionKeys";
3
3
  import { BladeVNode, CoreBladeExposed } from "../../types";
4
4
  import { toRef, watchTriggerable } from "@vueuse/core";
@@ -10,8 +10,15 @@ export const VcBladeView = defineComponent({
10
10
  blade: {
11
11
  type: Object as PropType<BladeVNode>,
12
12
  },
13
+ expandable: {
14
+ type: Boolean,
15
+ },
16
+ error: {
17
+ type: String,
18
+ },
13
19
  },
14
20
  setup(props, { attrs, slots }) {
21
+ const maximized = ref(false);
15
22
  const viewRef = ref<CoreBladeExposed>();
16
23
 
17
24
  const bl = toRef(props.blade);
@@ -34,6 +41,14 @@ export const VcBladeView = defineComponent({
34
41
  );
35
42
 
36
43
  provide(navigationViewLocation, bl.value!);
44
+ provide(
45
+ "$blade",
46
+ computed(() => ({
47
+ expandable: props.expandable,
48
+ maximized: maximized.value,
49
+ error: props.error,
50
+ })),
51
+ );
37
52
  return () => {
38
53
  /**
39
54
  * Callback function onClose, which is passed while opening blade, called when a BladeVNode is unmounted.
@@ -60,8 +75,6 @@ export const VcBladeView = defineComponent({
60
75
  }
61
76
  };
62
77
 
63
- const maximized = ref(false);
64
-
65
78
  function onExpand() {
66
79
  maximized.value = true;
67
80
  }
@@ -79,7 +92,6 @@ export const VcBladeView = defineComponent({
79
92
  onVnodeMounted,
80
93
  "onExpand:blade": onExpand,
81
94
  "onCollapse:blade": onCollapse,
82
- maximized,
83
95
  }),
84
96
  );
85
97
 
@@ -16,7 +16,7 @@
16
16
  :outline="false"
17
17
  variant="info-dark"
18
18
  >
19
- <div class="tw-flex tw-flex-row tw-items-center">
19
+ <div class="tw-flex tw-flex-row tw-items-center tw-text-[color:var(--change-password-text-color)]">
20
20
  <VcIcon
21
21
  icon="far fa-lightbulb"
22
22
  size="l"
@@ -223,5 +223,6 @@ function validate() {
223
223
  <style lang="scss">
224
224
  :root {
225
225
  --change-password-error-color: var(--base-error-color, var(--danger-500));
226
+ --change-password-text-color: var(--base-text-color, var(--additional-950));
226
227
  }
227
228
  </style>
@@ -0,0 +1,171 @@
1
+ <template>
2
+ <div
3
+ ref="referenceEl"
4
+ class="vc-dropdown-wrapper"
5
+ >
6
+ <slot name="trigger"></slot>
7
+
8
+ <teleport
9
+ to="body"
10
+ :disabled="!floating"
11
+ >
12
+ <div
13
+ v-if="opened"
14
+ ref="floatingEl"
15
+ v-on-click-outside="[() => $emit('update:opened', false), { ignore: [referenceEl] }]"
16
+ class="vc-dropdown"
17
+ :class="{
18
+ 'vc-dropdown--mobile': $isMobile.value,
19
+ 'vc-dropdown--floating': floating,
20
+ }"
21
+ :style="floatingStyle"
22
+ >
23
+ <VcContainer
24
+ :no-padding="true"
25
+ @click.stop
26
+ >
27
+ <VcCol v-if="items && items.length">
28
+ <div
29
+ v-for="(item, index) in items"
30
+ :key="index"
31
+ class="vc-dropdown__item"
32
+ :class="{
33
+ 'vc-dropdown__item--mobile': $isMobile.value,
34
+ 'vc-dropdown__item--active': isItemActive?.(item),
35
+ }"
36
+ @click="() => onItemClick?.(item)"
37
+ >
38
+ <slot
39
+ name="item"
40
+ :item="item"
41
+ :click="() => onItemClick?.(item)"
42
+ >
43
+ {{ itemText?.(item) }}
44
+ </slot>
45
+ </div>
46
+ </VcCol>
47
+ <div
48
+ v-else
49
+ class="vc-dropdown__empty"
50
+ >
51
+ <slot name="empty">
52
+ {{ emptyText }}
53
+ </slot>
54
+ </div>
55
+ </VcContainer>
56
+ </div>
57
+ </teleport>
58
+ </div>
59
+ </template>
60
+
61
+ <!-- eslint-disable @typescript-eslint/no-explicit-any -->
62
+ <script lang="ts" setup generic="T">
63
+ import { VcCol, VcContainer } from "../../../ui/components";
64
+ import { ref, computed } from "vue";
65
+ import { useFloating, shift, autoUpdate } from "@floating-ui/vue";
66
+ import { vOnClickOutside } from "@vueuse/components";
67
+
68
+ interface Props {
69
+ opened: boolean;
70
+ items: T[];
71
+ emptyText?: string;
72
+ itemText?: (item: T) => string;
73
+ isItemActive?: (item: T) => boolean;
74
+ onItemClick?: (item: T) => void;
75
+ floating?: boolean;
76
+ placement?: "bottom" | "bottom-end" | "bottom-start";
77
+ }
78
+
79
+ const props = withDefaults(defineProps<Props>(), {
80
+ opened: false,
81
+ items: () => [],
82
+ floating: false,
83
+ placement: "bottom",
84
+ });
85
+
86
+ defineEmits<{
87
+ (e: "item:click", item: T): void;
88
+ (e: "update:opened", opened: boolean): void;
89
+ }>();
90
+
91
+ defineSlots<{
92
+ item: (args: { item: T; click: () => void }) => any;
93
+ empty: () => any;
94
+ trigger: void;
95
+ }>();
96
+
97
+ const referenceEl = ref<HTMLElement | null>(null);
98
+ const floatingEl = ref<HTMLElement | null>(null);
99
+
100
+ const floater = useFloating(referenceEl, floatingEl, {
101
+ placement: props.placement,
102
+ whileElementsMounted: autoUpdate,
103
+ middleware: [shift({ mainAxis: false })],
104
+ });
105
+
106
+ const floatingStyle = computed(() => {
107
+ if (!props.floating) return {};
108
+
109
+ return {
110
+ position: "absolute" as const,
111
+ top: `${floater.y.value ?? 0}px`,
112
+ left: `${floater.x.value ?? 0}px`,
113
+ zIndex: 10000,
114
+ width: "max-content",
115
+ };
116
+ });
117
+ </script>
118
+
119
+ <style lang="scss">
120
+ :root {
121
+ --dropdown-bg-color: var(--neutrals-50);
122
+ --dropdown-text-color: var(--base-text-color, var(--neutrals-950));
123
+ --dropdown-border-color: var(--app-bar-divider-color);
124
+ --dropdown-hover-bg-color: var(--primary-50);
125
+ --dropdown-divider-color: var(--base-border-color, var(--neutrals-200));
126
+ --dropdown-divider-item-color: var(--neutrals-100);
127
+ }
128
+
129
+ .vc-dropdown {
130
+ @apply tw-bg-[color:var(--dropdown-bg-color)] tw-rounded-b-[6px] tw-w-full
131
+ tw-max-h-[350px] tw-overflow-hidden tw-flex tw-flex-col tw-relative;
132
+
133
+ &--mobile {
134
+ @apply tw-max-h-full tw-w-full;
135
+ display: flex !important;
136
+ }
137
+
138
+ &--floating {
139
+ box-shadow: var(--dropdown-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.1));
140
+ }
141
+
142
+ &__item {
143
+ @apply tw-truncate tw-flex tw-items-center tw-p-3 tw-text-sm tw-text-[color:var(--dropdown-text-color)] tw-w-full tw-cursor-pointer tw-border-solid tw-border-b tw-border-b-[color:var(--dropdown-divider-item-color)];
144
+ transition: background-color 0.2s;
145
+
146
+ &:last-of-type {
147
+ @apply tw-border-b-0;
148
+ }
149
+
150
+ &:hover {
151
+ background-color: var(--dropdown-hover-bg-color);
152
+ }
153
+
154
+ &--active {
155
+ @apply tw-bg-[color:var(--dropdown-hover-bg-color)];
156
+ }
157
+
158
+ &--mobile:not(:last-of-type) {
159
+ @apply tw-border-solid tw-border-b tw-border-b-[color:var(--dropdown-divider-color)];
160
+ }
161
+ }
162
+
163
+ &__empty {
164
+ @apply tw-flex tw-justify-center tw-items-center tw-p-4 tw-text-sm;
165
+ }
166
+ }
167
+
168
+ .vc-dropdown-wrapper {
169
+ @apply tw-relative tw-flex tw-w-full;
170
+ }
171
+ </style>
@@ -0,0 +1 @@
1
+ export { default as GenericDropdown } from "./generic-dropdown.vue";
@@ -12,3 +12,5 @@ export * from "./app-bar-button";
12
12
  export * from "./sidebar";
13
13
  export * from "./theme-selector";
14
14
  export * from "./sign-in";
15
+ export * from "./menu-item";
16
+ export * from "./generic-dropdown";