@vc-shell/framework 1.2.2 → 1.2.3-beta.0

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 (231) hide show
  1. package/core/composables/index.ts +2 -0
  2. package/core/composables/useAssets/index.ts +72 -28
  3. package/core/composables/useAsync/index.ts +4 -1
  4. package/core/composables/useBladeRegistry/index.ts +6 -5
  5. package/core/composables/useBreadcrumbs/index.ts +4 -1
  6. package/core/composables/useErrorHandler/index.ts +4 -1
  7. package/core/composables/useFunctions/debounce.ts +0 -1
  8. package/core/composables/useFunctions/delay.ts +0 -1
  9. package/core/composables/useFunctions/index.ts +0 -1
  10. package/core/composables/useFunctions/once.ts +0 -1
  11. package/core/composables/useFunctions/sleep.ts +0 -1
  12. package/core/composables/useFunctions/throttle.ts +0 -1
  13. package/core/composables/useGlobalSearch/index.ts +3 -3
  14. package/core/composables/useMenuService/index.ts +5 -2
  15. package/core/composables/useNotifications/index.ts +5 -2
  16. package/core/composables/useTheme/index.ts +4 -1
  17. package/core/composables/useUser/index.ts +189 -20
  18. package/core/composables/useWidgets/index.ts +5 -2
  19. package/core/constants/defaults.ts +76 -0
  20. package/core/constants/index.ts +2 -0
  21. package/core/constants/ui.ts +68 -0
  22. package/core/interceptors/index.ts +5 -2
  23. package/core/plugins/ai-agent/README.md +336 -0
  24. package/core/plugins/ai-agent/components/VcAiAgentPanel.vue +125 -0
  25. package/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue +182 -0
  26. package/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue +77 -0
  27. package/core/plugins/ai-agent/components/index.ts +1 -0
  28. package/core/plugins/ai-agent/composables/index.ts +4 -0
  29. package/core/plugins/ai-agent/composables/useAiAgent.ts +231 -0
  30. package/core/plugins/ai-agent/composables/useAiAgentContext.ts +280 -0
  31. package/core/plugins/ai-agent/constants.ts +89 -0
  32. package/core/plugins/ai-agent/index.ts +91 -0
  33. package/core/plugins/ai-agent/services/ai-agent-service.ts +598 -0
  34. package/core/plugins/ai-agent/types.ts +310 -0
  35. package/core/plugins/modularity/index.ts +8 -6
  36. package/core/plugins/modularity/loader.ts +36 -33
  37. package/core/plugins/signalR/index.ts +6 -3
  38. package/core/services/app-bar-menu-service.ts +4 -1
  39. package/core/services/dashboard-service.ts +4 -1
  40. package/core/services/index.ts +2 -0
  41. package/core/services/menu-service.ts +4 -1
  42. package/core/services/settings-menu-service.ts +4 -1
  43. package/core/services/toolbar-service.ts +18 -3
  44. package/core/services/widget-service.ts +7 -4
  45. package/core/types/index.ts +3 -0
  46. package/core/types/services.ts +194 -0
  47. package/core/utilities/errorTypes.ts +126 -0
  48. package/core/utilities/index.ts +2 -0
  49. package/core/utilities/logger.ts +120 -0
  50. package/dist/core/composables/useAssets/index.d.ts.map +1 -1
  51. package/dist/core/composables/useAsync/index.d.ts.map +1 -1
  52. package/dist/core/composables/useBladeRegistry/index.d.ts.map +1 -1
  53. package/dist/core/composables/useBreadcrumbs/index.d.ts.map +1 -1
  54. package/dist/core/composables/useErrorHandler/index.d.ts.map +1 -1
  55. package/dist/core/composables/useFunctions/debounce.d.ts.map +1 -1
  56. package/dist/core/composables/useFunctions/delay.d.ts.map +1 -1
  57. package/dist/core/composables/useFunctions/index.d.ts.map +1 -1
  58. package/dist/core/composables/useFunctions/once.d.ts.map +1 -1
  59. package/dist/core/composables/useFunctions/sleep.d.ts.map +1 -1
  60. package/dist/core/composables/useFunctions/throttle.d.ts.map +1 -1
  61. package/dist/core/composables/useGlobalSearch/index.d.ts.map +1 -1
  62. package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
  63. package/dist/core/composables/useNotifications/index.d.ts.map +1 -1
  64. package/dist/core/composables/useTheme/index.d.ts.map +1 -1
  65. package/dist/core/composables/useUser/index.d.ts +8 -0
  66. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  67. package/dist/core/composables/useWidgets/index.d.ts.map +1 -1
  68. package/dist/core/constants/defaults.d.ts +63 -0
  69. package/dist/core/constants/defaults.d.ts.map +1 -0
  70. package/dist/core/constants/index.d.ts +2 -0
  71. package/dist/core/constants/index.d.ts.map +1 -1
  72. package/dist/core/constants/ui.d.ts +50 -0
  73. package/dist/core/constants/ui.d.ts.map +1 -0
  74. package/dist/core/interceptors/index.d.ts.map +1 -1
  75. package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts +3 -0
  76. package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts.map +1 -0
  77. package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue.d.ts +15 -0
  78. package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue.d.ts.map +1 -0
  79. package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue.d.ts +10 -0
  80. package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue.d.ts.map +1 -0
  81. package/dist/core/plugins/ai-agent/components/index.d.ts +2 -0
  82. package/dist/core/plugins/ai-agent/components/index.d.ts.map +1 -0
  83. package/dist/core/plugins/ai-agent/composables/index.d.ts +4 -0
  84. package/dist/core/plugins/ai-agent/composables/index.d.ts.map +1 -0
  85. package/dist/core/plugins/ai-agent/composables/useAiAgent.d.ts +95 -0
  86. package/dist/core/plugins/ai-agent/composables/useAiAgent.d.ts.map +1 -0
  87. package/dist/core/plugins/ai-agent/composables/useAiAgentContext.d.ts +55 -0
  88. package/dist/core/plugins/ai-agent/composables/useAiAgentContext.d.ts.map +1 -0
  89. package/dist/core/plugins/ai-agent/constants.d.ts +47 -0
  90. package/dist/core/plugins/ai-agent/constants.d.ts.map +1 -0
  91. package/dist/core/plugins/ai-agent/index.d.ts +48 -0
  92. package/dist/core/plugins/ai-agent/index.d.ts.map +1 -0
  93. package/dist/core/plugins/ai-agent/services/ai-agent-service.d.ts +45 -0
  94. package/dist/core/plugins/ai-agent/services/ai-agent-service.d.ts.map +1 -0
  95. package/dist/core/plugins/ai-agent/types.d.ts +258 -0
  96. package/dist/core/plugins/ai-agent/types.d.ts.map +1 -0
  97. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  98. package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
  99. package/dist/core/plugins/signalR/index.d.ts.map +1 -1
  100. package/dist/core/services/app-bar-menu-service.d.ts.map +1 -1
  101. package/dist/core/services/dashboard-service.d.ts.map +1 -1
  102. package/dist/core/services/menu-service.d.ts.map +1 -1
  103. package/dist/core/services/settings-menu-service.d.ts.map +1 -1
  104. package/dist/core/services/toolbar-service.d.ts.map +1 -1
  105. package/dist/core/services/widget-service.d.ts.map +1 -1
  106. package/dist/core/types/index.d.ts.map +1 -1
  107. package/dist/core/types/services.d.ts +169 -0
  108. package/dist/core/types/services.d.ts.map +1 -0
  109. package/dist/core/utilities/errorTypes.d.ts +61 -0
  110. package/dist/core/utilities/errorTypes.d.ts.map +1 -0
  111. package/dist/core/utilities/index.d.ts +2 -0
  112. package/dist/core/utilities/index.d.ts.map +1 -1
  113. package/dist/core/utilities/logger.d.ts +259 -0
  114. package/dist/core/utilities/logger.d.ts.map +1 -0
  115. package/dist/framework.js +9623 -8417
  116. package/dist/index.css +1 -1
  117. package/dist/index.d.ts +19 -0
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/injection-keys.d.ts +21 -6
  120. package/dist/injection-keys.d.ts.map +1 -1
  121. package/dist/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -1
  122. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
  123. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  124. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts.map +1 -1
  125. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts.map +1 -1
  126. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts.map +1 -1
  127. package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -1
  128. package/dist/shared/components/draggable-dashboard/composables/useLayoutPersistence.d.ts.map +1 -1
  129. package/dist/shared/components/notifications/composables/useContainer/index.d.ts.map +1 -1
  130. package/dist/shared/components/notifications/composables/useInstance/index.d.ts.map +1 -1
  131. package/dist/shared/components/notifications/core/notification.d.ts.map +1 -1
  132. package/dist/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
  133. package/dist/shared/components/sign-in/useExternalProvider.d.ts.map +1 -1
  134. package/dist/shared/composables/index.d.ts +1 -0
  135. package/dist/shared/composables/index.d.ts.map +1 -1
  136. package/dist/shared/composables/useExternalWidgets.d.ts.map +1 -1
  137. package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
  138. package/dist/shared/composables/useTableSelection.d.ts +57 -0
  139. package/dist/shared/composables/useTableSelection.d.ts.map +1 -0
  140. package/dist/shared/composables/useTableSort.d.ts.map +1 -1
  141. package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -1
  142. package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  143. package/dist/shared/utilities/colorUtils.d.ts +0 -6
  144. package/dist/shared/utilities/colorUtils.d.ts.map +1 -1
  145. package/dist/tsconfig.tsbuildinfo +1 -1
  146. package/dist/ui/components/atoms/vc-banner/vc-banner.vue.d.ts.map +1 -1
  147. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +0 -15
  148. package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
  149. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
  150. package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
  151. package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts.map +1 -1
  152. package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts.map +1 -1
  153. package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
  154. package/dist/ui/components/atoms/vc-loading/vc-loading.vue.d.ts.map +1 -1
  155. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts +0 -5
  156. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  157. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
  158. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  159. package/dist/ui/components/atoms/vc-widget/vc-widget.vue.d.ts.map +1 -1
  160. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  161. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  162. package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
  163. package/dist/ui/components/molecules/vc-toast/vc-toast.vue.d.ts.map +1 -1
  164. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  165. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  166. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  167. package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts.map +1 -1
  168. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  169. package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts.map +1 -1
  170. package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts.map +1 -1
  171. package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
  172. package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts.map +1 -1
  173. package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts.map +1 -1
  174. package/dist/{vendor-lodash-es-BqkGj3Jl.js → vendor-lodash-es-SgOIjJF8.js} +2 -0
  175. package/package.json +5 -5
  176. package/shared/components/app-switcher/composables/useAppSwitcher/index.ts +4 -1
  177. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +67 -4
  178. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +13 -10
  179. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.ts +7 -4
  180. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.ts +4 -1
  181. package/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.ts +4 -1
  182. package/shared/components/change-password/change-password.vue +1 -1
  183. package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +14 -5
  184. package/shared/components/draggable-dashboard/composables/useLayoutPersistence.ts +5 -2
  185. package/shared/components/index.ts +2 -0
  186. package/shared/components/notifications/composables/useContainer/index.ts +8 -6
  187. package/shared/components/notifications/composables/useInstance/index.ts +4 -1
  188. package/shared/components/notifications/core/notification.ts +10 -7
  189. package/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue +20 -1
  190. package/shared/components/sign-in/useExternalProvider.ts +6 -4
  191. package/shared/composables/index.ts +1 -0
  192. package/shared/composables/useExternalWidgets.ts +7 -4
  193. package/shared/composables/useMenuExpanded.ts +15 -1
  194. package/shared/composables/useTableSelection.ts +151 -0
  195. package/shared/composables/useTableSort.ts +4 -4
  196. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +6 -3
  197. package/shared/pages/LoginPage/components/login/Login.vue +4 -1
  198. package/shared/utilities/colorUtils.ts +5 -12
  199. package/ui/components/atoms/vc-banner/vc-banner.vue +4 -1
  200. package/ui/components/atoms/vc-button/vc-button.vue +2 -25
  201. package/ui/components/atoms/vc-container/vc-container.vue +12 -3
  202. package/ui/components/atoms/vc-icon/vc-icon.vue +0 -10
  203. package/ui/components/atoms/vc-icon/vc-lucide-icon.vue +5 -2
  204. package/ui/components/atoms/vc-image/vc-image.vue +4 -1
  205. package/ui/components/atoms/vc-link/vc-link.vue +59 -54
  206. package/ui/components/atoms/vc-loading/vc-loading.vue +4 -0
  207. package/ui/components/atoms/vc-status/vc-status.vue +0 -5
  208. package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +4 -4
  209. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +8 -1
  210. package/ui/components/atoms/vc-video/vc-video.vue +4 -2
  211. package/ui/components/atoms/vc-widget/vc-widget.vue +4 -1
  212. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +7 -2
  213. package/ui/components/molecules/vc-input/vc-input.vue +0 -1
  214. package/ui/components/molecules/vc-pagination/vc-pagination.vue +6 -1
  215. package/ui/components/molecules/vc-rating/vc-rating.vue +1 -1
  216. package/ui/components/molecules/vc-textarea/vc-textarea.vue +1 -1
  217. package/ui/components/molecules/vc-toast/vc-toast.vue +11 -1
  218. package/ui/components/organisms/vc-app/vc-app.vue +22 -3
  219. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +4 -1
  220. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +14 -14
  221. package/ui/components/organisms/vc-blade/vc-blade.vue +3 -1
  222. package/ui/components/organisms/vc-login-form/vc-login-form.vue +3 -1
  223. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +34 -2
  224. package/ui/components/organisms/vc-table/composables/useTableActions.ts +7 -10
  225. package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +4 -1
  226. package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +5 -2
  227. package/ui/components/organisms/vc-table/composables/useTableSelection.ts +26 -18
  228. package/ui/components/organisms/vc-table/composables/useTableState.ts +4 -1
  229. package/core/services/global-search-service.ts +0 -36
  230. package/dist/core/services/global-search-service.d.ts +0 -10
  231. package/dist/core/services/global-search-service.d.ts.map +0 -1
@@ -29,23 +29,8 @@ export interface Props {
29
29
  variant?: "primary" | "secondary";
30
30
  disabled?: boolean;
31
31
  size?: "xs" | "sm" | "base";
32
- /**
33
- * @deprecated Use `size` instead
34
- * Whether the button is small
35
- * */
36
- small?: boolean;
37
- /**
38
- * @deprecated Use `variant` instead
39
- * Whether the button is outlined
40
- * */
41
- outline?: boolean;
42
32
  selected?: boolean;
43
33
  text?: boolean;
44
- /**
45
- * @deprecated Use `variant` instead
46
- * Whether the button is raised
47
- * */
48
- raised?: boolean;
49
34
  }
50
35
 
51
36
  export interface Emits {
@@ -73,12 +58,9 @@ const buttonClass = computed(() => {
73
58
  {
74
59
  [`vc-button-${props.variant}`]: props.variant,
75
60
  [`vc-button_${props.size}`]: props.size,
76
- // "vc-button_small": props.small,
77
- // "vc-button_outline": props.outline,
78
61
  "vc-button_selected": props.selected,
79
62
  "vc-button_text": props.text,
80
63
  "vc-button_disabled": props.disabled,
81
- // "vc-button_raised": props.raised,
82
64
  },
83
65
  ];
84
66
  });
@@ -156,17 +138,12 @@ $variants: primary, secondary;
156
138
  @apply tw-text-[color:var(--button-#{$variant}-text-color-disabled)] tw-bg-[color:var(--button-#{$variant}-background-color-disabled)] tw-border-[color:var(--button-#{$variant}-border-color-disabled)] tw-cursor-not-allowed;
157
139
  }
158
140
 
159
- // TODO: remove this after the migration
160
- // &.vc-button_small {
161
- // @apply tw-py-[var(--button-padding-vert-extra-small)] tw-min-h-[var(--button-height-extra-small)] tw-px-[var(--button-padding-hor-extra-small)] tw-text-xxs #{!important};
162
- // }
163
-
164
141
  &.vc-button_text {
165
142
  @apply tw-border-none tw-bg-transparent
166
143
  tw-text-[color:var(--button-#{$variant}-background-color)]
167
144
  hover:tw-text-[color:var(--button-#{$variant}-background-color-hover)]
168
145
  focus:tw-text-[color:var(--button-#{$variant}-background-color-hover)]
169
- disabled:tw-text-[color:rgb(from_var(--button-#{$variant}-background-color)_r_g_b/50%)];
146
+ disabled:tw-text-[color:var(--button-#{$variant}-text-color-disabled)] disabled:tw-opacity-50;
170
147
 
171
148
  @apply tw-p-0 tw-min-h-0 #{!important};
172
149
  }
@@ -175,7 +152,7 @@ $variants: primary, secondary;
175
152
  @apply tw-bg-[color:var(--button-#{$variant}-background-color-hover)];
176
153
 
177
154
  &.vc-button_text {
178
- @apply tw-bg-[color:rgb(from_var(--button-#{$variant}-background-color-hover)_r_g_b/7%)] tw-p-1;
155
+ @apply tw-bg-[color:var(--button-#{$variant}-background-color-hover)] tw-bg-opacity-[0.07] tw-p-1;
179
156
  }
180
157
  }
181
158
 
@@ -42,7 +42,7 @@
42
42
  </template>
43
43
 
44
44
  <script lang="ts" setup>
45
- import { ref, onMounted, computed, shallowRef, watch, inject, Ref } from "vue";
45
+ import { ref, onMounted, onBeforeUnmount, computed, shallowRef, watch, inject, Ref } from "vue";
46
46
  import { VcIcon } from "./../vc-icon";
47
47
 
48
48
  export interface Props {
@@ -70,6 +70,8 @@ const goingUp = shallowRef(false);
70
70
  const touching = shallowRef(false);
71
71
  const isMobile = inject("isMobile") as Ref<boolean>;
72
72
 
73
+ let resizeObserver: ResizeObserver | null = null;
74
+
73
75
  const topOffset = computed(() => Math.max(0, Math.min(pullDist.value, touchDiff.value)));
74
76
  const canRefresh = computed(() => touchDiff.value >= pullDist.value && !refreshing.value);
75
77
 
@@ -116,12 +118,19 @@ function onScroll(e: Event) {
116
118
  }
117
119
 
118
120
  onMounted(() => {
119
- const observer = new ResizeObserver(() => {
121
+ resizeObserver = new ResizeObserver(() => {
120
122
  scroll.value = (component.value && component.value.clientHeight < component.value.scrollHeight) as boolean;
121
123
  });
122
124
 
123
125
  if (component.value) {
124
- observer.observe(component.value);
126
+ resizeObserver.observe(component.value);
127
+ }
128
+ });
129
+
130
+ onBeforeUnmount(() => {
131
+ if (resizeObserver) {
132
+ resizeObserver.disconnect();
133
+ resizeObserver = null;
125
134
  }
126
135
  });
127
136
 
@@ -110,16 +110,6 @@ const sizeMap = {
110
110
  xxxl: 64,
111
111
  } as const;
112
112
 
113
- // Scaling factors for different icon types to make them visually equal
114
- const scalingFactors = {
115
- fontawesome: 1, // base reference
116
- material: 1.1,
117
- bootstrap: 0.95,
118
- lucide: 1.2,
119
- custom: 1,
120
- svg: 1,
121
- };
122
-
123
113
  // Function to detect icon type if not explicitly specified
124
114
  const detectIconType = computed((): IconType => {
125
115
  if (typeof props.icon !== "string") {
@@ -23,6 +23,9 @@ import { computed, markRaw, onMounted, ref } from "vue";
23
23
  import type { IconSize, IconVariant } from "./types";
24
24
  import type { Component } from "vue";
25
25
  import { useIcon } from "./composables";
26
+ import { createLogger } from "../../../../core/utilities";
27
+
28
+ const logger = createLogger("vc-lucide-icon");
26
29
 
27
30
  interface Props {
28
31
  /**
@@ -125,10 +128,10 @@ onMounted(async () => {
125
128
  if (module && typeof module === "object" && iconName in module) {
126
129
  resolvedIconComponent.value = markRaw(module[iconName as keyof typeof module] as Component);
127
130
  } else {
128
- console.warn(`Lucide icon not found: ${iconName}`);
131
+ logger.warn(`Lucide icon not found: ${iconName}`);
129
132
  }
130
133
  } catch (error) {
131
- console.error(`Error loading Lucide icon: ${normalizedIconName.value}`, error);
134
+ logger.error(`Error loading Lucide icon: ${normalizedIconName.value}`, error);
132
135
  }
133
136
  });
134
137
  </script>
@@ -32,6 +32,9 @@
32
32
  <script lang="ts" setup>
33
33
  import { VcIcon } from "./../vc-icon";
34
34
  import { computed } from "vue";
35
+ import { createLogger } from "../../../../core/utilities";
36
+
37
+ const logger = createLogger("vc-image");
35
38
 
36
39
  export interface Props {
37
40
  aspect?: "1x1" | "16x9" | "4x3" | "3x2";
@@ -67,7 +70,7 @@ function ensureHttps(url: string): string {
67
70
  return urlObject.href;
68
71
  }
69
72
  } catch (e) {
70
- console.warn("Invalid URL:", url);
73
+ logger.warn("Invalid URL:", url);
71
74
  }
72
75
  return url;
73
76
  }
@@ -1,54 +1,59 @@
1
- <template>
2
- <div
3
- class="vc-link"
4
- :class="{
5
- 'vc-link--active': active,
6
- 'vc-link--disabled': disabled,
7
- }"
8
- @click="onClickFn"
9
- >
10
- <slot></slot>
11
- </div>
12
- </template>
13
-
14
- <script lang="ts" setup>
15
- export interface Props {
16
- active?: boolean;
17
- disabled?: boolean;
18
- onClick?: () => void;
19
- }
20
-
21
- export interface Emits {
22
- (event: "click"): void;
23
- }
24
-
25
- const props = defineProps<Props>();
26
- const emit = defineEmits<Emits>();
27
-
28
- function onClickFn(): void {
29
- if (!props.disabled) {
30
- emit("click");
31
- }
32
- }
33
- </script>
34
-
35
- <style lang="scss">
36
- :root {
37
- --link-text-color: var(--primary-500);
38
- --link-text-color-hover: var(--primary-400);
39
- --link-text-color-active: var(--primary-700);
40
- --link-text-color-disabled: var(--neutrals-300);
41
- }
42
-
43
- .vc-link {
44
- @apply tw-text-[color:var(--link-text-color)] tw-no-underline tw-cursor-pointer tw-transition tw-duration-200 tw-inline-block hover:tw-text-[color:var(--link-text-color-hover)] hover:tw-underline;
45
-
46
- &--active {
47
- @apply tw-text-[color:var(--link-text-color-active)] tw-no-underline hover:tw-text-[color:var(--link-text-color-active)] hover:tw-no-underline;
48
- }
49
-
50
- &--disabled {
51
- @apply tw-cursor-not-allowed tw-text-[color:var(--link-text-color-disabled)] tw-no-underline hover:tw-text-[color:var(--link-text-color-disabled)] hover:tw-no-underline;
52
- }
53
- }
54
- </style>
1
+ <template>
2
+ <button
3
+ type="button"
4
+ class="vc-link"
5
+ :class="{
6
+ 'vc-link--active': active,
7
+ 'vc-link--disabled': disabled,
8
+ }"
9
+ :disabled="disabled"
10
+ :aria-disabled="disabled"
11
+ @click="onClickFn"
12
+ >
13
+ <slot></slot>
14
+ </button>
15
+ </template>
16
+
17
+ <script lang="ts" setup>
18
+ export interface Props {
19
+ active?: boolean;
20
+ disabled?: boolean;
21
+ onClick?: () => void;
22
+ }
23
+
24
+ export interface Emits {
25
+ (event: "click"): void;
26
+ }
27
+
28
+ const props = defineProps<Props>();
29
+ const emit = defineEmits<Emits>();
30
+
31
+ function onClickFn(): void {
32
+ if (!props.disabled) {
33
+ emit("click");
34
+ }
35
+ }
36
+ </script>
37
+
38
+ <style lang="scss">
39
+ :root {
40
+ --link-text-color: var(--primary-500);
41
+ --link-text-color-hover: var(--primary-400);
42
+ --link-text-color-active: var(--primary-700);
43
+ --link-text-color-disabled: var(--neutrals-300);
44
+ }
45
+
46
+ .vc-link {
47
+ @apply tw-text-[color:var(--link-text-color)] tw-no-underline tw-cursor-pointer tw-transition tw-duration-200 tw-inline-block hover:tw-text-[color:var(--link-text-color-hover)] hover:tw-underline;
48
+ /* Reset button styles for link appearance */
49
+ @apply tw-bg-transparent tw-border-none tw-p-0 tw-font-[inherit] tw-text-[inherit];
50
+
51
+ &--active {
52
+ @apply tw-text-[color:var(--link-text-color-active)] tw-no-underline hover:tw-text-[color:var(--link-text-color-active)] hover:tw-no-underline;
53
+ }
54
+
55
+ &--disabled {
56
+ @apply tw-cursor-not-allowed tw-text-[color:var(--link-text-color-disabled)] tw-no-underline hover:tw-text-[color:var(--link-text-color-disabled)] hover:tw-no-underline;
57
+ }
58
+ }
59
+ </style>
@@ -4,6 +4,9 @@
4
4
  :class="{
5
5
  'vc-loading-overlay--active': active,
6
6
  }"
7
+ role="status"
8
+ :aria-busy="active"
9
+ aria-live="polite"
7
10
  >
8
11
  <div class="vc-loading-overlay__content">
9
12
  <span class="vc-loading-overlay__main-marker"></span>
@@ -14,6 +17,7 @@
14
17
  class="vc-loading-overlay__marker"
15
18
  ></span>
16
19
  </div>
20
+ <span class="tw-sr-only">{{ active ? 'Loading...' : '' }}</span>
17
21
  </div>
18
22
  </div>
19
23
  </template>
@@ -18,17 +18,12 @@
18
18
  <script lang="ts" setup>
19
19
  export interface Props {
20
20
  variant?: "info" | "warning" | "danger" | "success" | "light-danger" | "info-dark" | "primary";
21
- /**
22
- * @deprecated
23
- */
24
- outline?: boolean;
25
21
  extend?: boolean;
26
22
  dot?: boolean;
27
23
  }
28
24
 
29
25
  withDefaults(defineProps<Props>(), {
30
26
  variant: "info",
31
- outline: false,
32
27
  dot: false,
33
28
  });
34
29
 
@@ -9,7 +9,7 @@
9
9
  <template v-else>
10
10
  <VcIcon
11
11
  icon="material-cancel"
12
- class="vc-status-icon__icon vc-status-icon__icon--info"
12
+ class="vc-status-icon__icon vc-status-icon__icon--inactive"
13
13
  ></VcIcon>
14
14
  </template>
15
15
  </div>
@@ -27,7 +27,7 @@ defineProps<Props>();
27
27
  <style lang="scss">
28
28
  :root {
29
29
  --status-success-main-color: var(--success-400);
30
- --status-info-main-color: var(--info-300);
30
+ --status-inactive-main-color: var(--info-300);
31
31
  }
32
32
 
33
33
  .vc-status-icon {
@@ -35,8 +35,8 @@ defineProps<Props>();
35
35
  @apply tw-text-[color:var(--status-success-main-color)];
36
36
  }
37
37
 
38
- &__icon--info {
39
- @apply tw-text-[color:var(--status-info-main-color)];
38
+ &__icon--inactive {
39
+ @apply tw-text-[color:var(--status-inactive-main-color)];
40
40
  }
41
41
  }
42
42
  </style>
@@ -27,7 +27,7 @@
27
27
  <!-- eslint-disable @typescript-eslint/no-explicit-any -->
28
28
  <script lang="ts" setup>
29
29
  import { useFloating, shift, Placement, offset as floatingOffset } from "@floating-ui/vue";
30
- import { getCurrentInstance, ref, computed } from "vue";
30
+ import { getCurrentInstance, ref, computed, onBeforeUnmount } from "vue";
31
31
 
32
32
  export interface Props {
33
33
  placement?: "top" | "right" | "bottom" | "left" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end";
@@ -83,6 +83,13 @@ const hideTooltip = () => {
83
83
  }
84
84
  tooltipVisible.value = false;
85
85
  };
86
+
87
+ onBeforeUnmount(() => {
88
+ if (showTimeout) {
89
+ clearTimeout(showTimeout);
90
+ showTimeout = null;
91
+ }
92
+ });
86
93
  </script>
87
94
 
88
95
  <style lang="scss">
@@ -16,12 +16,14 @@
16
16
  <div class="vc-video__container">
17
17
  <div v-if="source">
18
18
  <iframe
19
- :src="`${source}`"
19
+ :src="source"
20
20
  width="100%"
21
21
  height="300px"
22
22
  frameborder="0"
23
+ sandbox="allow-scripts allow-same-origin allow-presentation allow-popups"
23
24
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
24
- allowfullscreen="false"
25
+ allowfullscreen
26
+ loading="lazy"
25
27
  >
26
28
  </iframe>
27
29
  </div>
@@ -41,6 +41,9 @@
41
41
  import { computed, getCurrentInstance, useAttrs } from "vue";
42
42
  import { VcIcon } from "./../vc-icon";
43
43
  import { useWidgets } from "../../../../core/composables";
44
+ import { createLogger } from "../../../../core/utilities";
45
+
46
+ const logger = createLogger("vc-widget");
44
47
 
45
48
  export interface Props {
46
49
  icon?: string;
@@ -72,7 +75,7 @@ function onClick() {
72
75
  widgetId: actualWidgetId.value,
73
76
  });
74
77
  } else if (!actualWidgetId.value) {
75
- console.warn("VcWidget: widgetId is missing from attrs. Widget activation might not work as expected.");
78
+ logger.warn("widgetId is missing from attrs. Widget activation might not work as expected.");
76
79
  }
77
80
  emit("click");
78
81
  }
@@ -102,6 +102,11 @@ defineSlots<{
102
102
  trigger: (props: { click: () => void; isActive: boolean }) => VNode;
103
103
  }>();
104
104
 
105
+ /** Default width for the "more" button in pixels */
106
+ const MORE_BUTTON_WIDTH = 100;
107
+ /** Default initial item width for calculation in pixels */
108
+ const INITIAL_ITEM_WIDTH = 100;
109
+
105
110
  const el = ref<HTMLElement | null>(null);
106
111
  const showBreadcrumbs = ref(false);
107
112
 
@@ -109,9 +114,9 @@ const { visibleItems, hiddenItems, showMoreButton, recalculate } = useAdaptiveIt
109
114
  containerRef: el,
110
115
  items: toRef(props, "items"),
111
116
  getItemKey: (item) => item.id!,
112
- moreButtonWidth: 100,
117
+ moreButtonWidth: MORE_BUTTON_WIDTH,
113
118
  calculationStrategy: "reverse",
114
- initialItemWidth: 100,
119
+ initialItemWidth: INITIAL_ITEM_WIDTH,
115
120
  });
116
121
 
117
122
  function toggleBreadcrumbs() {
@@ -269,7 +269,6 @@ import VueDatePicker, { VueDatePickerProps, ModelValue } from "@vuepic/vue-datep
269
269
  import "@vuepic/vue-datepicker/dist/main.css";
270
270
  import {
271
271
  convertColorNameToHex,
272
- convertHexToColorName,
273
272
  isValidHexColor,
274
273
  normalizeHexColor,
275
274
  } from "../../../../shared/utilities";
@@ -79,6 +79,11 @@ const emit = defineEmits<Emits>();
79
79
 
80
80
  const isMobile = inject("isMobile") as Ref<boolean>;
81
81
 
82
+ /** Number of page buttons to show on mobile devices */
83
+ const MAX_PAGES_MOBILE = 3;
84
+ /** Number of page buttons to show on desktop devices */
85
+ const MAX_PAGES_DESKTOP = 5;
86
+
82
87
  const { variant } = toRefs(props);
83
88
  const localCurrentPage = ref(props.currentPage);
84
89
 
@@ -102,7 +107,7 @@ const pagesToShow = computed(() => {
102
107
  const pages = [];
103
108
  const totalPages = props.pages;
104
109
  const current = localCurrentPage.value;
105
- const maxPages = isMobile.value ? 3 : 5;
110
+ const maxPages = isMobile.value ? MAX_PAGES_MOBILE : MAX_PAGES_DESKTOP;
106
111
 
107
112
  if (totalPages <= maxPages) {
108
113
  for (let i = 1; i <= totalPages; i++) {
@@ -10,7 +10,7 @@
10
10
  v-if="tooltip"
11
11
  #tooltip
12
12
  >
13
- <span v-html="tooltip"></span>
13
+ <span>{{ tooltip }}</span>
14
14
  </template>
15
15
  </VcLabel>
16
16
 
@@ -21,7 +21,7 @@
21
21
  v-if="tooltip"
22
22
  #tooltip
23
23
  >
24
- <span v-html="tooltip"></span>
24
+ <span>{{ tooltip }}</span>
25
25
  </template>
26
26
  </VcLabel>
27
27
 
@@ -37,7 +37,7 @@
37
37
  <script lang="ts" setup>
38
38
  import { Content, NotificationType, NotificationPosition } from "../../../../shared/components/notifications";
39
39
  import { VcIcon } from "../..";
40
- import { Ref, onMounted, ref, toRefs, watch } from "vue";
40
+ import { Ref, onMounted, onBeforeUnmount, ref, toRefs, watch } from "vue";
41
41
 
42
42
  export interface Props {
43
43
  content?: Content;
@@ -70,6 +70,7 @@ interface NotificationTimer {
70
70
  pause: () => void;
71
71
  resume: () => void;
72
72
  start: () => void;
73
+ clear: () => void;
73
74
  }
74
75
 
75
76
  const timer = ref<NotificationTimer | null>(null);
@@ -120,13 +121,22 @@ function Timer(callback: (...args: unknown[]) => unknown, delay: number): Notifi
120
121
  resume();
121
122
  }
122
123
 
124
+ function clear() {
125
+ window.clearTimeout(timerId);
126
+ }
127
+
123
128
  return {
124
129
  pause,
125
130
  resume,
126
131
  start,
132
+ clear,
127
133
  };
128
134
  }
129
135
 
136
+ onBeforeUnmount(() => {
137
+ timer.value?.clear();
138
+ });
139
+
130
140
  function onMouseEnter() {
131
141
  if (props.timeout) {
132
142
  timer.value?.pause();
@@ -30,6 +30,8 @@
30
30
  class="vc-app__workspace"
31
31
  >
32
32
  <VcBladeNavigation />
33
+ <!-- AI Agent Panel (shown when plugin is installed) -->
34
+ <VcAiAgentPanel v-if="aiAgentConfig?.url" />
33
35
  </div>
34
36
 
35
37
  <!-- Popup container -->
@@ -49,6 +51,8 @@ import {
49
51
  BladeRoutesRecord,
50
52
  } from "./../../../../shared/components";
51
53
  import { useAppSwitcher } from "../../../../shared/components/app-switcher/composables/useAppSwitcher";
54
+ import { VcAiAgentPanel, provideAiAgentService } from "../../../../core/plugins/ai-agent";
55
+ import type { IAiAgentConfig } from "../../../../core/plugins/ai-agent";
52
56
  import { provideAppBarWidget, useNotifications } from "../../../../core/composables";
53
57
  import { useRoute, useRouter } from "vue-router";
54
58
  import { watchOnce } from "@vueuse/core";
@@ -64,6 +68,7 @@ import { DynamicModulesKey, EMBEDDED_MODE } from "../../../../injection-keys";
64
68
  import { provideMenuService } from "../../../../core/composables/useMenuService";
65
69
  import { provideAppBarMobileButtonsService } from "../../../../core/composables/useAppBarMobileButtons";
66
70
  import { useUserManagement } from "../../../../core/composables/useUserManagement";
71
+ import { createLogger } from "../../../../core/utilities";
67
72
 
68
73
  export interface Props {
69
74
  isReady: boolean;
@@ -92,10 +97,13 @@ defineSlots<{
92
97
  const props = defineProps<Props>();
93
98
  const slots = useSlots();
94
99
 
95
- console.debug("vc-app: Init vc-app");
100
+ const logger = createLogger("vc-app");
101
+ logger.debug("Init vc-app");
96
102
 
97
103
  const internalRoutes = inject("bladeRoutes") as BladeRoutesRecord[];
98
104
  const dynamicModules = inject(DynamicModulesKey, undefined);
105
+ const aiAgentConfig = inject<IAiAgentConfig | undefined>("aiAgentConfig", undefined);
106
+ const aiAgentAddGlobalToolbarButton = inject<boolean>("aiAgentAddGlobalToolbarButton", true);
99
107
 
100
108
  const isAppReady = ref(props.isReady);
101
109
 
@@ -163,7 +171,7 @@ registerMobileButton({
163
171
  });
164
172
 
165
173
  const onMenuItemClick = function (item: MenuItem) {
166
- console.debug(`vc-app#onMenuItemClick() called.`);
174
+ logger.debug("onMenuItemClick() called");
167
175
 
168
176
  if (item.routeId) {
169
177
  const bladeComponent = resolveBladeByName(item.routeId);
@@ -175,7 +183,7 @@ const onMenuItemClick = function (item: MenuItem) {
175
183
  true,
176
184
  );
177
185
  } else {
178
- console.error(`Blade component with routeId '${item.routeId}' not found.`);
186
+ logger.error(`Blade component with routeId '${item.routeId}' not found.`);
179
187
  }
180
188
  } else if (!item.routeId && item.url) {
181
189
  const menuRoute = routes.find((r) => {
@@ -218,6 +226,14 @@ provideDashboardService();
218
226
  provideMenuService();
219
227
  provideGlobalSearch();
220
228
  provide(EMBEDDED_MODE, isEmbedded);
229
+
230
+ // Provide AI Agent service if config is available (via plugin)
231
+ if (aiAgentConfig?.url) {
232
+ provideAiAgentService({
233
+ config: aiAgentConfig,
234
+ addGlobalToolbarButton: aiAgentAddGlobalToolbarButton,
235
+ });
236
+ }
221
237
  // Provide slots to child components with all necessary props and handlers
222
238
  provideAppSlots(
223
239
  slots,
@@ -245,6 +261,9 @@ onUnmounted(() => {
245
261
  <style lang="scss">
246
262
  :root {
247
263
  --app-background: var(--secondary-200);
264
+ // Shared transition timing for synchronized animations
265
+ --app-panel-transition-duration: 0.3s;
266
+ --app-panel-transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
248
267
  }
249
268
 
250
269
  .vc-app {
@@ -43,6 +43,9 @@
43
43
  <script lang="ts" setup>
44
44
  import { ref } from "vue";
45
45
  import { VcIcon, VcTooltip } from "../../../../../../../../";
46
+ import { createLogger } from "../../../../../../../../../../core/utilities";
47
+
48
+ const logger = createLogger("vc-blade-toolbar-button");
46
49
 
47
50
  export interface Props {
48
51
  isExpanded: boolean;
@@ -81,7 +84,7 @@ const emit = defineEmits<Emits>();
81
84
  const isWaiting = ref(false);
82
85
 
83
86
  async function onClick(): Promise<void> {
84
- console.debug("vc-blade-toolbar-item#onClick()");
87
+ logger.debug("onClick()");
85
88
 
86
89
  if (!props.disabled && !isWaiting.value) {
87
90
  if (props.clickHandler && typeof props.clickHandler === "function") {