@vc-shell/framework 1.0.290 → 1.0.291

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 (175) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/core/composables/index.ts +1 -0
  3. package/core/composables/useTheme/index.ts +60 -0
  4. package/core/directives/loading/styles.css +6 -1
  5. package/dist/core/composables/index.d.ts +1 -0
  6. package/dist/core/composables/index.d.ts.map +1 -1
  7. package/dist/core/composables/useTheme/index.d.ts +11 -0
  8. package/dist/core/composables/useTheme/index.d.ts.map +1 -0
  9. package/dist/framework.js +27885 -27365
  10. package/dist/index.css +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/locales/en.json +6 -0
  13. package/dist/shared/components/app-bar-button/app-bar-button.vue.d.ts +56 -0
  14. package/dist/shared/components/app-bar-button/app-bar-button.vue.d.ts.map +1 -0
  15. package/dist/shared/components/app-bar-button/index.d.ts +2 -0
  16. package/dist/shared/components/app-bar-button/index.d.ts.map +1 -0
  17. package/dist/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -1
  18. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  19. package/dist/shared/components/index.d.ts +3 -0
  20. package/dist/shared/components/index.d.ts.map +1 -1
  21. package/dist/shared/components/language-selector/language-selector.vue.d.ts.map +1 -1
  22. package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts.map +1 -1
  23. package/dist/shared/components/notification-template/notification-template.vue.d.ts.map +1 -1
  24. package/dist/shared/components/sidebar/index.d.ts +2 -0
  25. package/dist/shared/components/sidebar/index.d.ts.map +1 -0
  26. package/dist/shared/components/sidebar/sidebar.vue.d.ts +49 -0
  27. package/dist/shared/components/sidebar/sidebar.vue.d.ts.map +1 -0
  28. package/dist/shared/components/theme-selector/index.d.ts +2 -0
  29. package/dist/shared/components/theme-selector/index.d.ts.map +1 -0
  30. package/dist/shared/components/theme-selector/theme-selector.vue.d.ts +3 -0
  31. package/dist/shared/components/theme-selector/theme-selector.vue.d.ts.map +1 -0
  32. package/dist/shared/components/user-dropdown-button/user-dropdown-button.vue.d.ts.map +1 -1
  33. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  34. package/dist/shared/modules/dynamic/types/index.d.ts +3 -0
  35. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  36. package/dist/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue.d.ts +16 -3
  37. package/dist/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue.d.ts.map +1 -1
  38. package/dist/shared/pages/ChangePasswordPage/components/change-password/index.d.ts +7 -7
  39. package/dist/shared/pages/ChangePasswordPage/components/change-password/index.d.ts.map +1 -1
  40. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts +24 -3
  41. package/dist/shared/pages/InvitePage/components/invite/Invite.vue.d.ts.map +1 -1
  42. package/dist/shared/pages/InvitePage/components/invite/index.d.ts +24 -1
  43. package/dist/shared/pages/InvitePage/components/invite/index.d.ts.map +1 -1
  44. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts +24 -3
  45. package/dist/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue.d.ts.map +1 -1
  46. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts +24 -1
  47. package/dist/shared/pages/ResetPasswordPage/components/reset-password/index.d.ts.map +1 -1
  48. package/dist/tailwind.config.d.ts +42 -15
  49. package/dist/tailwind.config.d.ts.map +1 -1
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
  52. package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
  53. package/dist/ui/components/atoms/vc-progress/vc-progress.vue.d.ts.map +1 -1
  54. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  55. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
  56. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  57. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  58. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  59. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
  60. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
  61. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  62. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  63. package/dist/ui/components/molecules/vc-slider/vc-slider.vue.d.ts.map +1 -1
  64. 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
  65. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  66. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts +2 -0
  67. package/dist/ui/components/organisms/vc-app/vc-app.stories.d.ts.map +1 -1
  68. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts +2 -0
  69. package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
  70. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  71. 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
  72. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue.d.ts.map +1 -1
  73. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue.d.ts.map +1 -1
  74. package/dist/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue.d.ts.map +1 -1
  75. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts +1 -0
  76. package/dist/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
  77. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  78. package/dist/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue.d.ts.map +1 -1
  79. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts +1 -0
  80. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  81. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue.d.ts.map +1 -1
  82. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +15 -0
  83. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  84. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -0
  85. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  86. package/package.json +4 -4
  87. package/shared/components/app-bar-button/app-bar-button.vue +169 -0
  88. package/shared/components/app-bar-button/index.ts +1 -0
  89. package/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue +138 -38
  90. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +10 -1
  91. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +55 -30
  92. package/shared/components/change-password/change-password.vue +7 -1
  93. package/shared/components/common/popup/vc-popup-error.vue +1 -1
  94. package/shared/components/common/popup/vc-popup-warning.vue +1 -1
  95. package/shared/components/index.ts +3 -0
  96. package/shared/components/language-selector/language-selector.vue +55 -39
  97. package/shared/components/notification-dropdown/_internal/notification/notification.vue +7 -1
  98. package/shared/components/notification-dropdown/notification-dropdown.vue +96 -83
  99. package/shared/components/notification-template/notification-template.vue +66 -22
  100. package/shared/components/notifications/styles/index.scss +1 -0
  101. package/shared/components/sidebar/index.ts +1 -0
  102. package/shared/components/sidebar/sidebar.vue +96 -0
  103. package/shared/components/theme-selector/index.ts +1 -0
  104. package/shared/components/theme-selector/theme-selector.vue +95 -0
  105. package/shared/components/user-dropdown-button/user-dropdown-button.vue +139 -86
  106. package/shared/modules/assets/components/assets-details/assets-details.vue +9 -2
  107. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +16 -6
  108. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +1 -1
  109. package/shared/modules/dynamic/helpers/nodeBuilder.ts +1 -1
  110. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +6 -2
  111. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +16 -2
  112. package/shared/modules/dynamic/types/index.ts +3 -0
  113. package/shared/pages/ChangePasswordPage/components/change-password/ChangePassword.vue +14 -9
  114. package/shared/pages/InvitePage/components/invite/Invite.vue +59 -15
  115. package/shared/pages/LoginPage/components/login/Login.vue +78 -22
  116. package/shared/pages/ResetPasswordPage/components/reset-password/ResetPassword.vue +67 -15
  117. package/tailwind.config.ts +281 -15
  118. package/ui/components/atoms/vc-badge/vc-badge.vue +38 -23
  119. package/ui/components/atoms/vc-button/vc-button.vue +37 -34
  120. package/ui/components/atoms/vc-card/vc-card.vue +17 -11
  121. package/ui/components/atoms/vc-col/vc-col.vue +4 -6
  122. package/ui/components/atoms/vc-container/vc-container.vue +26 -8
  123. package/ui/components/atoms/vc-hint/vc-hint.vue +8 -2
  124. package/ui/components/atoms/vc-icon/vc-icon.vue +3 -3
  125. package/ui/components/atoms/vc-image/vc-image.vue +33 -9
  126. package/ui/components/atoms/vc-label/vc-label.vue +38 -9
  127. package/ui/components/atoms/vc-link/vc-link.vue +15 -8
  128. package/ui/components/atoms/vc-loading/vc-loading.vue +37 -8
  129. package/ui/components/atoms/vc-progress/vc-progress.vue +29 -21
  130. package/ui/components/atoms/vc-row/vc-row.vue +4 -2
  131. package/ui/components/atoms/vc-status/vc-status.vue +29 -20
  132. package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +20 -3
  133. package/ui/components/atoms/vc-switch/vc-switch.vue +41 -17
  134. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +35 -9
  135. package/ui/components/atoms/vc-video/vc-video.vue +28 -6
  136. package/ui/components/atoms/vc-widget/vc-widget.vue +59 -28
  137. package/ui/components/molecules/vc-breadcrumbs/_internal/vc-breadcrumbs-item/vc-breadcrumbs-item.vue +29 -27
  138. package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +34 -11
  139. package/ui/components/molecules/vc-checkbox/vc-checkbox.vue +43 -21
  140. package/ui/components/molecules/vc-editor/vc-editor.vue +70 -32
  141. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +32 -16
  142. package/ui/components/molecules/vc-field/vc-field.vue +36 -13
  143. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +75 -25
  144. package/ui/components/molecules/vc-input/vc-input.vue +279 -218
  145. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +24 -2
  146. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +102 -64
  147. package/ui/components/molecules/vc-notification/vc-notification.vue +40 -15
  148. package/ui/components/molecules/vc-pagination/vc-pagination.vue +19 -15
  149. package/ui/components/molecules/vc-radio-button/vc-radio-button.vue +18 -23
  150. package/ui/components/molecules/vc-rating/vc-rating.vue +9 -5
  151. package/ui/components/molecules/vc-select/vc-select.vue +211 -65
  152. package/ui/components/molecules/vc-slider/vc-slider.vue +32 -13
  153. package/ui/components/molecules/vc-textarea/vc-textarea.vue +17 -12
  154. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +68 -14
  155. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/_internal/vc-app-menu-link.vue +112 -122
  156. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +213 -96
  157. package/ui/components/organisms/vc-app/vc-app.vue +41 -15
  158. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +78 -30
  159. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +81 -59
  160. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +27 -13
  161. package/ui/components/organisms/vc-blade/vc-blade.vue +177 -46
  162. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +40 -11
  163. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-preview/vc-gallery-preview.vue +52 -18
  164. package/ui/components/organisms/vc-gallery/vc-gallery.vue +38 -6
  165. package/ui/components/organisms/vc-login-form/vc-login-form.vue +40 -14
  166. package/ui/components/organisms/vc-popup/vc-popup.vue +186 -44
  167. package/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue +25 -6
  168. package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +48 -12
  169. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +130 -60
  170. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +55 -7
  171. package/ui/components/organisms/vc-table/_internal/vc-table-counter/vc-table-counter.vue +17 -5
  172. package/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue +38 -6
  173. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +111 -62
  174. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue +139 -46
  175. package/ui/components/organisms/vc-table/vc-table.vue +370 -128
@@ -11,7 +11,7 @@
11
11
  <!-- Input label -->
12
12
  <VcLabel
13
13
  v-if="label"
14
- class="tw-mb-2"
14
+ class="vc-checkbox__label"
15
15
  :required="required"
16
16
  >
17
17
  <span>{{ label }}</span>
@@ -21,7 +21,7 @@
21
21
  >{{ tooltip }}</template
22
22
  >
23
23
  </VcLabel>
24
- <label class="tw-inline-flex tw-select-none tw-cursor-pointer tw-text-base tw-items-center">
24
+ <label class="vc-checkbox__container">
25
25
  <input
26
26
  v-model="value"
27
27
  type="checkbox"
@@ -30,18 +30,18 @@
30
30
  :true-value="trueValue"
31
31
  :false-value="falseValue"
32
32
  :class="{
33
- 'vc-checkbox_error': errorMessage,
33
+ 'vc-checkbox__input--error': errorMessage,
34
34
  }"
35
35
  />
36
36
  <span
37
37
  v-if="$slots['default']"
38
- class="tw-ml-2"
38
+ class="vc-checkbox__text"
39
39
  >
40
40
  <slot></slot>
41
41
  </span>
42
42
  <span
43
43
  v-if="!label && required"
44
- class="tw-text-[color:var(--checkbox-required-color)] tw-ml-1"
44
+ class="vc-checkbox__required"
45
45
  >*</span
46
46
  >
47
47
  </label>
@@ -50,7 +50,7 @@
50
50
  v-if="errorMessage"
51
51
  name="error"
52
52
  >
53
- <VcHint class="vc-checkbox__error tw-mt-1">
53
+ <VcHint class="vc-checkbox__error">
54
54
  {{ errorMessage }}
55
55
  </VcHint>
56
56
  </slot>
@@ -61,6 +61,7 @@
61
61
  import { MaybeRef, computed, unref } from "vue";
62
62
  import { VcHint } from "./../../atoms/vc-hint";
63
63
  import { VcLabel } from "../../atoms/vc-label";
64
+
64
65
  export interface Props {
65
66
  modelValue: MaybeRef<boolean>;
66
67
  disabled?: boolean;
@@ -103,19 +104,20 @@ const value = computed({
103
104
  --checkbox-size-medium: 18px;
104
105
  --checkbox-size-large: 24px;
105
106
  --checkbox-border-radius: 2px;
106
- --checkbox-background-color: #ffffff;
107
- --checkbox-color-error: #f14e4e;
108
- --checkbox-required-color: #f14e4e;
109
-
110
- --checkbox-active: #43b0e6;
111
- --checkbox-active-inner: #fff;
112
- --checkbox-focus: 2px rgba(39, 94, 254, 0.3);
113
- --checkbox-border: #bbc1e1;
114
- --checkbox-border-hover: #43b0e6;
115
- --checkbox-background: #fff;
116
- --checkbox-disabled: #f6f8ff;
117
- --checkbox-disabled-inner: #e1e6f9;
118
- --checkbox-error: #f14e4e;
107
+ --checkbox-background-color: var(--additional-50);
108
+ --checkbox-color-error: var(--base-error-color, var(--danger-500));
109
+ --checkbox-required-color: var(--danger-500);
110
+
111
+ --checkbox-active: var(--primary-500);
112
+ --checkbox-active-inner: var(--additional-50);
113
+ --checkbox-focus-color: var(--info-400);
114
+ --checkbox-focus: 2px rgb(from var(--checkbox-focus-color) r g b / 30%);
115
+ --checkbox-border: var(--neutrals-300);
116
+ --checkbox-border-hover: var(--primary-500);
117
+ --checkbox-background: var(--additional-50);
118
+ --checkbox-disabled: var(--neutrals-100);
119
+ --checkbox-disabled-inner: var(--base-border-color, var(--neutrals-200));
120
+ --checkbox-error: var(--base-error-color, var(--danger-500));
119
121
  }
120
122
 
121
123
  $sizes: small, medium, large;
@@ -127,8 +129,28 @@ $sizes: small, medium, large;
127
129
  }
128
130
 
129
131
  .vc-checkbox {
132
+ &__label {
133
+ @apply tw-mb-2;
134
+ }
135
+
136
+ &__container {
137
+ @apply tw-inline-flex tw-select-none tw-cursor-pointer tw-text-base tw-items-center;
138
+ }
139
+
140
+ &__text {
141
+ @apply tw-ml-2;
142
+ }
143
+
144
+ &__required {
145
+ @apply tw-text-[color:var(--checkbox-required-color)] tw-ml-1;
146
+ }
147
+
148
+ &__input--error {
149
+ --hint-color: var(--checkbox-error);
150
+ }
151
+
130
152
  input[type="checkbox"] {
131
- border-radius: 2px;
153
+ border-radius: var(--checkbox-border-radius);
132
154
  appearance: none;
133
155
  height: var(--checkbox-size);
134
156
  outline: none;
@@ -140,7 +162,6 @@ $sizes: small, medium, large;
140
162
  border: 1px solid var(--checkbox-border-color, var(--checkbox-border));
141
163
  background: var(--checkbox-bg, var(--checkbox-background));
142
164
  width: var(--checkbox-size);
143
- border-radius: 3px;
144
165
  transition:
145
166
  background 0.3s,
146
167
  border-color 0.3s,
@@ -216,6 +237,7 @@ $sizes: small, medium, large;
216
237
 
217
238
  &__error {
218
239
  --hint-color: var(--checkbox-error);
240
+ @apply tw-mt-1;
219
241
  }
220
242
  }
221
243
  </style>
@@ -1,17 +1,15 @@
1
1
  <template>
2
2
  <div
3
3
  class="vc-editor"
4
- :class="[
5
- {
6
- 'vc-editor_error': errorMessage,
7
- 'vc-editor_disabled': disabled,
8
- },
9
- ]"
4
+ :class="{
5
+ 'vc-editor--error': errorMessage,
6
+ 'vc-editor--disabled': disabled,
7
+ }"
10
8
  >
11
9
  <!-- Editor label -->
12
10
  <VcLabel
13
11
  v-if="label"
14
- class="tw-mb-2"
12
+ class="vc-editor__label"
15
13
  :required="required"
16
14
  :multilanguage="multilanguage"
17
15
  :current-language="currentLanguage"
@@ -20,8 +18,9 @@
20
18
  <template
21
19
  v-if="tooltip"
22
20
  #tooltip
23
- >{{ tooltip }}</template
24
21
  >
22
+ {{ tooltip }}
23
+ </template>
25
24
  </VcLabel>
26
25
 
27
26
  <!-- Editor field -->
@@ -30,8 +29,10 @@
30
29
  :key="`${id}-${disabled}`"
31
30
  ref="quillRef"
32
31
  :content="modelValue"
33
- class="quill-editor tw-border tw-border-solid tw-border-[color:var(--editor-border-color)] tw-rounded-b-[var(--editor-border-radius)] tw-h-[200px]"
34
- :class="{ 'tw-bg-[#fafafa] tw-text-[#424242] tw-cursor-default': disabled }"
32
+ class="quill-editor vc-editor__quill-editor"
33
+ :class="{
34
+ 'vc-editor__quill-editor--disabled': disabled,
35
+ }"
35
36
  theme="snow"
36
37
  :toolbar="toolbar"
37
38
  :modules="modules"
@@ -41,11 +42,12 @@
41
42
  :options="options"
42
43
  @ready="initializeQuill"
43
44
  />
45
+
44
46
  <slot
45
47
  v-if="errorMessage"
46
48
  name="error"
47
49
  >
48
- <VcHint class="vc-editor__error !tw-text-[color:var(--editor-border-color-error)] tw-mt-1">
50
+ <VcHint class="vc-editor__error">
49
51
  {{ errorMessage }}
50
52
  </VcHint>
51
53
  </slot>
@@ -184,36 +186,66 @@ defineExpose({
184
186
  <style lang="scss">
185
187
  :root {
186
188
  --editor-border-radius: 3px;
187
- --editor-border-color: #d3dbe9;
188
- --editor-border-color-error: #f14e4e;
189
- --editor-placeholder-color: #a5a5a5;
189
+ --editor-border-color: var(--secondary-200);
190
+ --editor-border-color-error: var(--base-error-color, var(--danger-500));
191
+ --editor-disabled-bg: var(--neutrals-50);
192
+ --editor-disabled-text: var(--neutrals-400);
193
+ --editor-placeholder-color: var(--neutrals-400);
190
194
  }
191
195
 
192
196
  .vc-editor {
193
- &_error .quill-editor {
194
- @apply tw-border tw-border-solid tw-border-[color:var(--editor-border-color-error)] #{!important};
197
+ & {
198
+ @apply tw-flex tw-flex-col;
199
+ }
200
+
201
+ &--disabled {
202
+ @apply tw-opacity-50 tw-cursor-not-allowed;
203
+ }
204
+
205
+ &__label {
206
+ @apply tw-mb-2;
195
207
  }
196
208
 
197
- .quill-editor .ql-editor {
198
- &.ql-blank:before {
199
- color: var(--textarea-placeholder-color);
200
- content: attr(data-placeholder);
201
- font-style: inherit;
202
- left: 15px;
203
- pointer-events: none;
204
- position: absolute;
205
- right: 15px;
209
+ &__quill-editor {
210
+ @apply tw-border tw-border-solid tw-border-[color:var(--editor-border-color)] tw-rounded-b-[var(--editor-border-radius)] tw-h-[200px];
211
+ transition:
212
+ background 0.3s,
213
+ color 0.3s,
214
+ cursor 0.3s;
215
+
216
+ &--disabled {
217
+ @apply tw-bg-[color:var(--editor-disabled-bg)] tw-text-[color:var(--editor-disabled-text)] tw-cursor-default;
218
+ }
219
+
220
+ &.vc-editor--error {
221
+ @apply tw-border-[color:var(--editor-border-color-error)];
206
222
  }
207
223
  }
208
224
 
209
- .quill-editor {
210
- & .ql-tooltip {
211
- display: flex;
212
- flex-flow: wrap;
225
+ &__error {
226
+ @apply tw-text-[color:var(--editor-border-color-error)] tw-mt-1;
227
+ }
228
+ }
229
+
230
+ .quill-editor .ql-editor {
231
+ &.ql-blank:before {
232
+ color: var(--editor-placeholder-color);
233
+ content: attr(data-placeholder);
234
+ font-style: inherit;
235
+ left: 15px;
236
+ pointer-events: none;
237
+ position: absolute;
238
+ right: 15px;
239
+ }
240
+ }
213
241
 
214
- &.ql-hidden {
215
- display: none !important;
216
- }
242
+ .quill-editor {
243
+ & .ql-tooltip {
244
+ display: flex;
245
+ flex-flow: wrap;
246
+
247
+ &.ql-hidden {
248
+ display: none !important;
217
249
  }
218
250
  }
219
251
  }
@@ -222,7 +254,13 @@ defineExpose({
222
254
  padding-right: 18px;
223
255
  content: attr(data-value);
224
256
  }
257
+
225
258
  .ql-language.ql-picker .ql-picker-item:before {
226
259
  content: attr(data-value);
227
260
  }
261
+
262
+ .ql-toolbar,
263
+ .quill-editor {
264
+ border-color: var(--editor-border-color) !important;
265
+ }
228
266
  </style>
@@ -1,37 +1,37 @@
1
1
  <template>
2
2
  <!-- Text -->
3
3
  <template v-if="type === 'text'">
4
- <div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
5
- <div class="tw-text-wrap">
6
- <p>{{ value }}</p>
4
+ <div class="vc-field-type">
5
+ <div class="vc-field-type__text-wrap">
6
+ <p class="vc-field-type__text">{{ value }}</p>
7
7
  </div>
8
8
  </div>
9
9
  </template>
10
10
 
11
11
  <!-- Date -->
12
12
  <template v-if="type === 'date'">
13
- <div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
14
- <div class="tw-text-wrap">
15
- <p>{{ value instanceof Date ? value.toLocaleDateString() : value }}</p>
13
+ <div class="vc-field-type">
14
+ <div class="vc-field-type__text-wrap">
15
+ <p class="vc-field-type__text">{{ value instanceof Date ? value.toLocaleDateString() : value }}</p>
16
16
  </div>
17
17
  </div>
18
18
  </template>
19
19
 
20
20
  <!-- Date ago -->
21
21
  <template v-if="type === 'date-ago'">
22
- <div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
23
- <div class="tw-text-wrap">
24
- <p>{{ value instanceof Date ? moment(value).fromNow() ?? "N/A" : value }}</p>
22
+ <div class="vc-field-type">
23
+ <div class="vc-field-type__text-wrap">
24
+ <p class="vc-field-type__text">{{ value instanceof Date ? moment(value).fromNow() ?? "N/A" : value }}</p>
25
25
  </div>
26
26
  </div>
27
27
  </template>
28
28
 
29
29
  <!-- Link -->
30
30
  <template v-if="type === 'link'">
31
- <div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
32
- <div class="tw-truncate tw-text-wrap">
31
+ <div class="vc-field-type">
32
+ <div class="vc-field-type__text-wrap">
33
33
  <VcLink
34
- class="vc-link !tw-text-s tw-truncate tw-w-full"
34
+ class="vc-field-type__link"
35
35
  @click="onLinkClick"
36
36
  >{{ value }}</VcLink
37
37
  >
@@ -42,11 +42,11 @@
42
42
 
43
43
  <!-- Email -->
44
44
  <template v-if="type === 'email'">
45
- <div class="tw-flex tw-flex-row tw-justify-stretch tw-truncate">
46
- <div class="tw-text-wrap">
45
+ <div class="vc-field-type">
46
+ <div class="vc-field-type__text-wrap">
47
47
  <a
48
48
  :href="`mailto:${value}`"
49
- class="vc-link !tw-text-s tw-truncate tw-w-full"
49
+ class="vc-field-type__link"
50
50
  >{{ value }}</a
51
51
  >
52
52
  </div>
@@ -77,4 +77,20 @@ function onLinkClick() {
77
77
  }
78
78
  </script>
79
79
 
80
- <style lang="scss" scoped></style>
80
+ <style lang="scss">
81
+ .vc-field-type {
82
+ @apply tw-flex tw-flex-row tw-justify-stretch tw-truncate;
83
+
84
+ &__text-wrap {
85
+ @apply tw-text-wrap;
86
+ }
87
+
88
+ &__text {
89
+ @apply tw-text-sm;
90
+ }
91
+
92
+ &__link {
93
+ @apply tw-text-sm tw-truncate tw-w-full;
94
+ }
95
+ }
96
+ </style>
@@ -1,34 +1,37 @@
1
1
  <template>
2
2
  <div
3
- :class="[
4
- {
5
- 'tw-flex-col': orientation === 'vertical',
6
- 'tw-flex-row tw-items-center': orientation === 'horizontal',
7
- },
8
- 'tw-flex ',
9
- ]"
3
+ class="vc-field"
4
+ :class="{
5
+ 'vc-field--vertical': orientation === 'vertical',
6
+ 'vc-field--horizontal': orientation === 'horizontal',
7
+ }"
10
8
  >
11
9
  <VcCol :size="aspectRatio[0]">
12
10
  <!-- Field label -->
13
- <VcLabel v-if="label">
11
+ <VcLabel
12
+ v-if="label"
13
+ class="vc-field__label"
14
+ >
14
15
  <span>{{ label }}</span>
15
16
  <template
16
17
  v-if="tooltip"
17
18
  #tooltip
18
- >{{ tooltip }}</template
19
- ></VcLabel
20
- >
19
+ >
20
+ {{ tooltip }}
21
+ </template>
22
+ </VcLabel>
21
23
  </VcCol>
22
24
  <VcCol :size="aspectRatio[1]">
23
25
  <VcFieldType
24
26
  :value="modelValue"
25
27
  :type="type"
28
+ class="vc-field__field-type"
26
29
  >
27
30
  <VcButton
28
31
  v-if="copyable"
29
32
  icon="far fa-copy"
30
33
  size="m"
31
- class="tw-ml-2"
34
+ class="vc-field__copy-button"
32
35
  text
33
36
  @click="copy(modelValue)"
34
37
  ></VcButton>
@@ -84,4 +87,24 @@ function copy(value: string) {
84
87
  }
85
88
  </script>
86
89
 
87
- <style lang="scss" scoped></style>
90
+ <style lang="scss">
91
+ .vc-field {
92
+ @apply tw-flex;
93
+
94
+ &--vertical {
95
+ @apply tw-flex-col;
96
+ }
97
+
98
+ &--horizontal {
99
+ @apply tw-flex-row tw-items-center;
100
+ }
101
+
102
+ &__label {
103
+ @apply tw-mb-2;
104
+ }
105
+
106
+ &__copy-button {
107
+ @apply tw-ml-2;
108
+ }
109
+ }
110
+ </style>
@@ -1,12 +1,12 @@
1
1
  <template>
2
- <div class="tw-flex tw-flex-col tw-flex-1">
2
+ <div class="vc-file-upload__container">
3
3
  <div
4
4
  v-loading="loading"
5
- class="vc-file-upload tw-relative tw-h-[155px] tw-box-border tw-border tw-border-dashed tw-border-[#c8dbea] tw-rounded-[6px] tw-p-4 tw-flex tw-flex-col tw-items-center tw-justify-center"
5
+ class="vc-file-upload__drop-zone"
6
6
  :class="[
7
- `vc-file-upload_${variant}`,
7
+ `vc-file-upload__drop-zone--${variant}`,
8
8
  {
9
- '!tw-bg-[#e8f1f9] !tw-border-solid tw-cursor-copy': isDragging,
9
+ 'vc-file-upload__drop-zone--dragging': isDragging,
10
10
  },
11
11
  ]"
12
12
  @drop.stop.prevent="onDrop"
@@ -18,18 +18,21 @@
18
18
  @dragleave.stop.prevent="dragLeave"
19
19
  >
20
20
  <VcIcon
21
- class="tw-text-[#c8dbea]"
21
+ class="vc-file-upload__icon"
22
22
  :icon="icon"
23
23
  size="xxl"
24
24
  ></VcIcon>
25
25
 
26
- <div class="tw-text-[#9db0be] tw-text-center tw-text-lg tw-leading-lg tw-mt-4">
27
- <span>{{ customText?.dragHere || t("COMPONENTS.MOLECULES.VC_FILE_UPLOAD.DRAG_HERE") }}</span
28
- >&nbsp;
26
+ <div class="vc-file-upload__text">
27
+ <span>{{ customText?.dragHere || t("COMPONENTS.MOLECULES.VC_FILE_UPLOAD.DRAG_HERE") }}</span>
28
+ &nbsp;
29
29
  <br />
30
- <VcLink @click="toggleUploader">{{
31
- customText?.browse || t("COMPONENTS.MOLECULES.VC_FILE_UPLOAD.BROWSE")
32
- }}</VcLink>
30
+ <VcLink
31
+ class="vc-file-upload__link"
32
+ @click="toggleUploader"
33
+ >
34
+ {{ customText?.browse || t("COMPONENTS.MOLECULES.VC_FILE_UPLOAD.BROWSE") }}
35
+ </VcLink>
33
36
  </div>
34
37
 
35
38
  <input
@@ -46,7 +49,7 @@
46
49
  v-if="errorMessage"
47
50
  name="error"
48
51
  >
49
- <VcHint class="vc-input__error">
52
+ <VcHint class="vc-file-upload__error">
50
53
  {{ errorMessage }}
51
54
  </VcHint>
52
55
  </slot>
@@ -84,7 +87,6 @@ const props = withDefaults(defineProps<Props>(), {
84
87
  name: "Gallery",
85
88
  icon: "fas fa-cloud-upload-alt",
86
89
  });
87
-
88
90
  const emit = defineEmits<Emits>();
89
91
 
90
92
  defineSlots<{
@@ -93,20 +95,16 @@ defineSlots<{
93
95
 
94
96
  const { t } = useI18n({ useScope: "global" });
95
97
 
96
- // TODO refactor component and remove field-level validation
97
-
98
98
  const instance = getCurrentInstance();
99
- // Prepare validation rules using required and rules props combination
100
99
  const internalRules = unref(props.rules) || "";
101
100
  const isDragging = ref(false);
102
101
 
103
- // Prepare field-level validation
104
102
  const { errorMessage, handleChange, validate } = useField(
105
103
  `${props.name === "Gallery" ? instance?.uid : props.name}`,
106
104
  internalRules as IValidationRules,
107
105
  );
108
106
 
109
- const uploader = ref();
107
+ const uploader = ref<HTMLInputElement | null>(null);
110
108
 
111
109
  const upload = async (event: Event) => {
112
110
  await handleChange(event.target);
@@ -124,8 +122,10 @@ const upload = async (event: Event) => {
124
122
  };
125
123
 
126
124
  function toggleUploader() {
127
- uploader.value.value = "";
128
- uploader.value.click();
125
+ if (uploader.value) {
126
+ uploader.value.value = "";
127
+ uploader.value.click();
128
+ }
129
129
  }
130
130
 
131
131
  function onDrop(event: DragEvent) {
@@ -147,14 +147,64 @@ function dragLeave() {
147
147
  </script>
148
148
 
149
149
  <style lang="scss">
150
+ :root {
151
+ --file-upload-border-color: var(--secondary-200);
152
+ --file-upload-border-color-hover: var(--secondary-400);
153
+ --file-upload-border-color-error: var(--base-error-color, var(--danger-500));
154
+ --file-upload-border-radius: 6px;
155
+ --file-upload-drag-bg: var(--primary-100);
156
+ --file-upload-icon-color: var(--secondary-200);
157
+ --file-upload-text-color: var(--neutrals-400);
158
+ --file-upload-error-color: var(--base-error-color, var(--danger-500));
159
+ --file-upload-background-color: var(--primary-50);
160
+ }
161
+
150
162
  .vc-file-upload {
151
- // variants
152
- &_gallery {
153
- @apply tw-w-[155px] tw-h-[155px];
163
+ &__container {
164
+ @apply tw-flex tw-flex-col tw-flex-1;
165
+ }
166
+
167
+ &__drop-zone {
168
+ @apply tw-relative tw-h-40 tw-box-border tw-border tw-border-dashed tw-p-4 tw-flex tw-flex-col tw-items-center tw-justify-center;
169
+ @apply tw-border-[color:var(--file-upload-border-color)];
170
+ @apply tw-rounded-lg;
171
+ @apply tw-transition-colors tw-duration-300;
172
+
173
+ &--gallery {
174
+ @apply tw-w-40 tw-h-40;
175
+ }
176
+
177
+ &--file-upload {
178
+ @apply tw-w-full tw-bg-[var(--file-upload-background-color)];
179
+ }
180
+
181
+ &--dragging {
182
+ background-color: var(--file-upload-drag-bg) !important;
183
+ border-style: solid !important;
184
+ cursor: copy !important;
185
+ }
186
+
187
+ &:hover {
188
+ @apply tw-border-[color:var(--file-upload-border-color-hover)] #{!important};
189
+ }
190
+ }
191
+
192
+ &__icon {
193
+ color: var(--file-upload-icon-color);
194
+ }
195
+
196
+ &__text {
197
+ color: var(--file-upload-text-color);
198
+ @apply tw-text-center tw-text-sm tw-mt-4;
199
+ }
200
+
201
+ &__link {
202
+ @apply tw-text-sm tw-truncate tw-w-full;
154
203
  }
155
204
 
156
- &_file-upload {
157
- @apply tw-w-full tw-bg-[#f2f8fd];
205
+ &__error {
206
+ color: var(--file-upload-error-color);
207
+ @apply tw-mt-1;
158
208
  }
159
209
  }
160
210
  </style>