@appscode/design-system 1.1.0-beta.3 → 1.1.0-beta.30

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 (84) hide show
  1. package/base/utilities/_colors.scss +81 -186
  2. package/base/utilities/_global.scss +24 -18
  3. package/base/utilities/_typography.scss +2 -2
  4. package/base/utilities/dark-theme.scss +2 -8
  5. package/components/_ac-alert-box.scss +8 -8
  6. package/components/_ac-code-highlight.scss +9 -12
  7. package/components/_ac-drag.scss +4 -4
  8. package/components/_ac-modal.scss +2 -2
  9. package/components/_ac-multi-select.scss +18 -18
  10. package/components/_ac-select-box.scss +5 -5
  11. package/components/_ac-table.scss +10 -10
  12. package/components/_ac-tabs.scss +29 -26
  13. package/components/_all.scss +6 -4
  14. package/components/_buttons.scss +10 -10
  15. package/components/_image-upload.scss +6 -6
  16. package/components/_input-card.scss +232 -0
  17. package/components/_input.scss +947 -0
  18. package/components/_left-sidebar-menu.scss +9 -13
  19. package/components/_monaco-editor.scss +2 -2
  20. package/components/_navbar.scss +7 -7
  21. package/components/_nested-list.scss +2 -2
  22. package/components/_overview-info.scss +3 -3
  23. package/components/_pricing-table.scss +5 -5
  24. package/components/_progress-bar.scss +61 -74
  25. package/components/_subscription-card.scss +8 -10
  26. package/components/_table-of-content.scss +4 -4
  27. package/components/{_ac-terminal.scss → _terminal.scss} +55 -38
  28. package/components/_widget-menu.scss +7 -12
  29. package/components/_wizard.scss +518 -793
  30. package/components/ac-toaster/_ac-toasted.scss +6 -11
  31. package/components/bbum/_information-center.scss +8 -10
  32. package/components/bbum/_mobile-desktop.scss +9 -14
  33. package/components/bbum/_single-post-preview.scss +9 -9
  34. package/components/ui-builder/_ui-builder.scss +163 -9
  35. package/components/ui-builder/_vue-open-api.scss +3 -2
  36. package/layouts/_code-preview.scss +6 -7
  37. package/main.scss +4 -4
  38. package/package.json +1 -1
  39. package/plugins/theme.js +11 -9
  40. package/plugins/vue-toaster.js +1 -1
  41. package/vue-components/types/importFlow.ts +16 -0
  42. package/vue-components/v2/banner/Banner.vue +1 -1
  43. package/vue-components/v2/editor/FilteredFileEditor.vue +2 -2
  44. package/vue-components/v2/modal/Modal.vue +1 -1
  45. package/vue-components/v2/pagination/Pagination.vue +1 -0
  46. package/vue-components/v3/alert/Alert.vue +7 -7
  47. package/vue-components/v3/banner/Banner.vue +2 -2
  48. package/vue-components/v3/breadcrumbs/Breadcrumb.vue +4 -2
  49. package/vue-components/v3/button/Button.vue +26 -11
  50. package/vue-components/v3/cards/Cluster.vue +3 -4
  51. package/vue-components/v3/cards/Counter.vue +12 -0
  52. package/vue-components/v3/cards/FeatureCard.vue +31 -0
  53. package/vue-components/v3/cards/InfoCard.vue +4 -9
  54. package/vue-components/v3/cards/Monitoring.vue +1 -1
  55. package/vue-components/v3/cards/Vendor.vue +67 -5
  56. package/vue-components/v3/content/ContentTable.vue +7 -2
  57. package/vue-components/v3/editor/FilteredFileEditor.vue +200 -3
  58. package/vue-components/v3/footer/Info.vue +10 -8
  59. package/vue-components/v3/footer/Status.vue +21 -23
  60. package/vue-components/v3/footer/Usage.vue +20 -30
  61. package/vue-components/v3/form/Form.vue +0 -3
  62. package/vue-components/v3/form-fields/AcSingleInput.vue +9 -1
  63. package/vue-components/v3/header/Header.vue +5 -4
  64. package/vue-components/v3/loaders/InfoCardLoader.vue +65 -0
  65. package/vue-components/v3/modal/Modal.vue +1 -1
  66. package/vue-components/v3/navbar/Navbar.vue +3 -1
  67. package/vue-components/v3/navbar/User.vue +4 -4
  68. package/vue-components/v3/notification/AlertBox.vue +234 -4
  69. package/vue-components/v3/option-dots/Options.vue +2 -1
  70. package/vue-components/v3/pagination/Pagination.vue +2 -1
  71. package/vue-components/v3/preloader/Preloader.vue +1 -1
  72. package/vue-components/v3/searchbars/SearchBar.vue +10 -2
  73. package/vue-components/v3/sidebar/ClusterSwitcher.vue +35 -31
  74. package/vue-components/v3/sidebar/Sidebar.vue +5 -9
  75. package/vue-components/v3/sidebar/SidebarFooter.vue +3 -3
  76. package/vue-components/v3/sidebar/SidebarHeader.vue +3 -3
  77. package/vue-components/v3/sidebar/Steps.vue +152 -0
  78. package/vue-components/v3/table/InfoTable.vue +6 -4
  79. package/vue-components/v3/table/Table.vue +38 -31
  80. package/vue-components/v3/table/TableRow.vue +2 -2
  81. package/components/_ac-card.scss +0 -589
  82. package/components/_ac-input.scss +0 -394
  83. /package/components/{_ac-accordion.scss → _accordion.scss} +0 -0
  84. /package/components/{_ac-report.scss → _report.scss} +0 -0
@@ -1,42 +1,32 @@
1
1
  <script lang="ts" setup>
2
- import { defineAsyncComponent, ref } from "vue";
2
+ import { defineAsyncComponent } from "vue";
3
3
  const FooterItems = defineAsyncComponent(() => import("./FooterItems.vue"));
4
4
  const FooterItem = defineAsyncComponent(() => import("./FooterItem.vue"));
5
5
 
6
- const HeroiconsCpuChip = defineAsyncComponent(
7
- () => import("~icons/heroicons/cpu-chip")
8
- );
6
+ interface Props {
7
+ usages?: Array<{
8
+ icon?: string;
9
+ useData?: {
10
+ limit?: string;
11
+ request?: string;
12
+ };
13
+ }>;
14
+ }
9
15
 
10
- const usages = ref([
11
- {
12
- icon: "HeroiconsCpuChip",
13
- useData: {
14
- limit: "500m",
15
- usage: "500m",
16
- },
17
- },
18
- {
19
- icon: "HeroiconsCpuChip",
20
- useData: {
21
- limit: "1G",
22
- usage: "1G",
23
- },
24
- },
25
- {
26
- icon: "HeroiconsCpuChip",
27
- useData: {
28
- limit: "10Gi",
29
- usage: "10Gi",
30
- },
31
- },
32
- ]);
16
+ withDefaults(defineProps<Props>(), {
17
+ usages: () => [],
18
+ });
33
19
  </script>
34
20
 
35
21
  <template>
36
22
  <footer-items>
37
- <footer-item v-for="(type, idx) in usages" :key="idx">
38
- <span class="icon"><HeroiconsCpuChip :size="20" /></span
39
- ><span>{{ type.useData.limit }}/{{ type.useData.usage }}</span>
23
+ <footer-item v-for="(info, idx) in usages" :key="idx">
24
+ <span class="icon"><img :src="info.icon" /></span
25
+ ><span
26
+ >{{ info.useData?.limit || "N" }}/{{
27
+ info.useData?.request || "A"
28
+ }}</span
29
+ >
40
30
  </footer-item>
41
31
  </footer-items>
42
32
  </template>
@@ -22,9 +22,6 @@ withDefaults(defineProps<Props>(), {
22
22
  <div class="form-wrapper">
23
23
  <div
24
24
  :class="{
25
- 'pt-20': !reducePaddingTop,
26
- 'pt-10': reducePaddingTop,
27
- 'pl-20': !isContainer,
28
25
  'form-content': !isContainer,
29
26
  container: isContainer,
30
27
  }"
@@ -187,6 +187,7 @@ withDefaults(defineProps<Props>(), {
187
187
  label {
188
188
  top: 8px;
189
189
  font-size: 13px;
190
+
190
191
  &.switch-label {
191
192
  top: 0;
192
193
  }
@@ -196,6 +197,7 @@ withDefaults(defineProps<Props>(), {
196
197
  top: -9px;
197
198
  font-weight: 500;
198
199
  color: $black-40;
200
+
199
201
  &.is-required {
200
202
  &:after {
201
203
  width: calc(100% + 10px);
@@ -241,6 +243,7 @@ withDefaults(defineProps<Props>(), {
241
243
  align-items: center;
242
244
  width: 40px;
243
245
  justify-content: center;
246
+
244
247
  svg {
245
248
  width: 18px;
246
249
  }
@@ -249,6 +252,7 @@ withDefaults(defineProps<Props>(), {
249
252
  label {
250
253
  top: 8px;
251
254
  font-size: 13px;
255
+
252
256
  &.switch-label {
253
257
  top: 0;
254
258
  }
@@ -411,11 +415,13 @@ withDefaults(defineProps<Props>(), {
411
415
  }
412
416
  }
413
417
  }
418
+
414
419
  textarea {
415
420
  border: 1px solid $primary-80;
416
421
  background-color: transparent;
417
422
  padding: 10px 15px;
418
423
  min-height: 50px;
424
+
419
425
  &.bg-white {
420
426
  background-color: transparent;
421
427
  }
@@ -447,9 +453,11 @@ withDefaults(defineProps<Props>(), {
447
453
  &.bg-white {
448
454
  background-color: $white-100;
449
455
  }
456
+
450
457
  &.StripeElement--focus {
451
458
  border: 1px solid $primary;
452
459
  }
460
+
453
461
  &:focus {
454
462
  border: 1px solid $primary;
455
463
  outline: none;
@@ -495,7 +503,7 @@ withDefaults(defineProps<Props>(), {
495
503
  }
496
504
  }
497
505
 
498
- .is-error {
506
+ .is-danger {
499
507
  font-size: 12px;
500
508
  line-height: 22px;
501
509
  color: $danger;
@@ -7,16 +7,18 @@ const HeaderItems = defineAsyncComponent(() => import("./HeaderItems.vue"));
7
7
  interface Props {
8
8
  title?: string;
9
9
  isContainer?: boolean;
10
+ topValue?: string;
10
11
  }
11
12
 
12
13
  withDefaults(defineProps<Props>(), {
13
14
  title: "No Title",
14
15
  isContainer: false,
16
+ topValue: "86px",
15
17
  });
16
18
  </script>
17
19
 
18
20
  <template>
19
- <div class="inner-header">
21
+ <div class="inner-header" :style="{ top: topValue }">
20
22
  <div
21
23
  class="is-flex is-justify-content-space-between"
22
24
  :class="{ container: isContainer }"
@@ -24,7 +26,7 @@ withDefaults(defineProps<Props>(), {
24
26
  <header-items>
25
27
  <header-item>
26
28
  <transition name="fade" mode="out-in" appear>
27
- <h5 :key="title">{{ title }}</h5>
29
+ <h4 :key="title">{{ title }}</h4>
28
30
  </transition>
29
31
  </header-item>
30
32
  <slot name="header-left-controls" />
@@ -39,9 +41,8 @@ withDefaults(defineProps<Props>(), {
39
41
  <style lang="scss" scoped>
40
42
  .inner-header {
41
43
  padding: 6px 20px;
42
- border-bottom: 1px solid $primary-90;
44
+ border-bottom: 1px solid $primary-93;
43
45
  position: sticky;
44
- top: 86px;
45
46
  background: $white-100;
46
47
  z-index: 99;
47
48
  }
@@ -0,0 +1,65 @@
1
+ <script setup lang="ts">
2
+ import { ContentLoader } from "vue-content-loader";
3
+ </script>
4
+
5
+ <template>
6
+ <div>
7
+ <svg
8
+ role="img"
9
+ width="230"
10
+ height="115"
11
+ aria-labelledby="loading-aria"
12
+ viewBox="0 0 230 115"
13
+ preserveAspectRatio="none"
14
+ >
15
+ <title id="loading-aria">Loading...</title>
16
+ <rect
17
+ x="0"
18
+ y="0"
19
+ width="100%"
20
+ height="100%"
21
+ clip-path="url(#clip-path)"
22
+ style="fill: url('#fill')"
23
+ ></rect>
24
+ <defs>
25
+ <clipPath id="clip-path">
26
+ <rect x="150" y="40" rx="3" ry="3" width="60" height="50" />
27
+ <rect x="10" y="70" rx="3" ry="3" width="120" height="11" />
28
+ <rect x="10" y="100" rx="3" ry="3" width="120" height="11" />
29
+ <rect x="150" y="100" rx="3" ry="3" width="60" height="11" />
30
+ <rect x="10" y="1" rx="3" ry="3" width="200" height="22" />
31
+ <rect x="10" y="40" rx="3" ry="3" width="120" height="11" />
32
+ </clipPath>
33
+ <linearGradient id="fill">
34
+ <stop offset="0.599964" stop-color="#cfcfcf" stop-opacity="1">
35
+ <animate
36
+ attributeName="offset"
37
+ values="-2; -2; 1"
38
+ keyTimes="0; 0.25; 1"
39
+ dur="2s"
40
+ repeatCount="indefinite"
41
+ ></animate>
42
+ </stop>
43
+ <stop offset="1.59996" stop-color="#ecebeb" stop-opacity="1">
44
+ <animate
45
+ attributeName="offset"
46
+ values="-1; -1; 2"
47
+ keyTimes="0; 0.25; 1"
48
+ dur="2s"
49
+ repeatCount="indefinite"
50
+ ></animate>
51
+ </stop>
52
+ <stop offset="2.59996" stop-color="#cfcfcf" stop-opacity="1">
53
+ <animate
54
+ attributeName="offset"
55
+ values="0; 0; 3"
56
+ keyTimes="0; 0.25; 1"
57
+ dur="2s"
58
+ repeatCount="indefinite"
59
+ ></animate>
60
+ </stop>
61
+ </linearGradient>
62
+ </defs>
63
+ </svg>
64
+ </div>
65
+ </template>
@@ -97,7 +97,7 @@ watch(
97
97
  <div class="ac-modal-inner">
98
98
  <!-- modal header start -->
99
99
  <div class="ac-modal-header">
100
- <h6>{{ title }}</h6>
100
+ <h5>{{ title }}</h5>
101
101
  <header-items>
102
102
  <slot name="modal-header-controls" />
103
103
  <header-item>
@@ -90,7 +90,9 @@ withDefaults(defineProps<Props>(), {
90
90
  height: 30px;
91
91
  }
92
92
  }
93
-
93
+ .ac-navbar-cluster-switcher {
94
+ max-width: 350px;
95
+ }
94
96
  .ac-navbar-menu {
95
97
  display: flex;
96
98
  align-items: center;
@@ -1,8 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import { defineAsyncComponent, ref, watch, computed, nextTick } from "vue";
3
- import type { User, Organization } from "../../types/user";
3
+ import type { User } from "../../types/user";
4
4
 
5
- interface FormatedOrgs extends Organization {
5
+ interface FormatedOrgs extends User {
6
6
  isPersonalAccount?: boolean;
7
7
  }
8
8
 
@@ -93,13 +93,13 @@ watch(dropDownStatus, (n) => {
93
93
  <navbar-item :modifierClasses="'ac-profile-button'">
94
94
  <template #navbar-item>
95
95
  <div class="ac-user-profile mr-8">
96
- <img :src="(user.avatar_url as string)" alt="User Photo" />
96
+ <img :src="user.avatar_url" alt="User Photo" />
97
97
  </div>
98
98
  {{ user.full_name || user.username }}
99
99
  <i class="fa fa-angle-down" aria-hidden="true"></i>
100
100
  </template>
101
101
  <!-- <button class="button ac-nav-button ac-profile-button">
102
-
102
+
103
103
  </button> -->
104
104
 
105
105
  <template #navbar-content>
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
- import { toRefs, computed, defineAsyncComponent } from "vue";
3
2
  import DOMPurify from "dompurify";
3
+ import { computed, defineAsyncComponent, toRefs } from "vue";
4
4
 
5
5
  const AcButton = defineAsyncComponent(() => import("../button/Button.vue"));
6
6
 
@@ -27,10 +27,15 @@ const { notificationType, content, hideIcon, actionButton } = toRefs(props);
27
27
 
28
28
  const iconClass = computed(() => {
29
29
  if (notificationType.value === "success") return "fa-check-circle";
30
- else if (notificationType.value === "info") return "fa-info-circle";
30
+ else if (notificationType.value === "info") return "fa-info-circle ";
31
31
  else if (notificationType.value === "error") return "fa-times-circle";
32
32
  else return "fa-info-circle";
33
33
  });
34
+ const backgroundColor = computed(() => {
35
+ if (notificationType.value === "success") return "is-success";
36
+ else if (notificationType.value === "error") return "is-danger";
37
+ else return "";
38
+ });
34
39
 
35
40
  const getSanitizedHtml = (content: string) => {
36
41
  return DOMPurify.sanitize(content || "");
@@ -39,8 +44,11 @@ const getSanitizedHtml = (content: string) => {
39
44
 
40
45
  <template>
41
46
  <!-- alert-message area start -->
42
- <!-- plsease, use this class name ('.is-info' 'is-success', 'is-error', 'is-warning') -->
43
- <div :class="`ac-notification is-${notificationType} mb-15`">
47
+ <!-- plsease, use this class name ('.is-info' 'is-success', 'is-danger', 'is-warning') -->
48
+ <div
49
+ class="ac-notification is-${notificationType} mb-15"
50
+ :class="backgroundColor"
51
+ >
44
52
  <p>
45
53
  <i v-if="!hideIcon" :class="`fa ${iconClass} mr-5`"></i
46
54
  ><span v-html="getSanitizedHtml(content)"></span>
@@ -56,3 +64,225 @@ const getSanitizedHtml = (content: string) => {
56
64
  </div>
57
65
  <!-- alert-message area end -->
58
66
  </template>
67
+
68
+ <style lang="scss" scoped>
69
+ // for alert message
70
+ .ac-notification {
71
+ background-color: #dee7f5;
72
+ font-size: 13px;
73
+ color: $primary;
74
+ min-height: 36px;
75
+ display: flex;
76
+ align-items: center;
77
+ padding: 8px 16px;
78
+ overflow: hidden;
79
+ border: 1px solid $primary;
80
+ border-radius: 4px;
81
+ justify-content: flex-start;
82
+ position: relative;
83
+ z-index: 1;
84
+ min-width: 280px;
85
+
86
+ p {
87
+ color: $primary;
88
+ margin-bottom: 0;
89
+
90
+ .close-icon {
91
+ padding-right: 10px;
92
+ font-size: 15px;
93
+ }
94
+
95
+ a {
96
+ text-decoration: underline;
97
+ color: $primary;
98
+
99
+ &:hover {
100
+ color: hsla(
101
+ var(--hsl-hue),
102
+ var(--hsl-saturation),
103
+ calc(var(--hsl-lightness) - 10%),
104
+ 1
105
+ );
106
+ }
107
+ }
108
+ }
109
+
110
+ button.close {
111
+ background-color: transparent;
112
+ cursor: pointer;
113
+ right: 0px;
114
+ position: absolute;
115
+ box-shadow: none;
116
+ border: none;
117
+ font-size: 14px;
118
+ color: $danger;
119
+ width: 40px;
120
+ height: 100%;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ }
125
+ }
126
+
127
+ // mixin for .ac-notification
128
+ @mixin acNotification($colorName) {
129
+ background-color: scale-color($color: $colorName, $lightness: 80%);
130
+ color: $white-100;
131
+ border-color: $colorName;
132
+
133
+ p {
134
+ color: $colorName;
135
+
136
+ a {
137
+ color: $colorName;
138
+
139
+ &:hover {
140
+ color: $colorName;
141
+ opacity: 0.8;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ @mixin acPrimaryNotification() {
147
+ background-color: hsla(
148
+ var(--hsl-hue),
149
+ var(--hsl-saturation),
150
+ var(--hsl-lightness),
151
+ 0.2
152
+ );
153
+ color: $white-100;
154
+ border-color: $primary;
155
+
156
+ p {
157
+ color: $primary;
158
+
159
+ a {
160
+ color: $primary;
161
+
162
+ &:hover {
163
+ color: $primary;
164
+ opacity: 0.8;
165
+ }
166
+ }
167
+ }
168
+ }
169
+
170
+ // is-primary
171
+ .ac-notification.is-primary {
172
+ @include acPrimaryNotification();
173
+ }
174
+
175
+ // is.info
176
+ .ac-notification.is-info {
177
+ @include acNotification($info);
178
+ }
179
+
180
+ // is.success
181
+ .ac-notification.is-success {
182
+ @include acNotification($success);
183
+ }
184
+
185
+ // is-danger
186
+ .ac-notification.is-danger {
187
+ @include acNotification($danger);
188
+ }
189
+
190
+ // is-warning
191
+ .ac-notification.is-warning {
192
+ @include acNotification($warning);
193
+ }
194
+
195
+ /*====================================
196
+ AC Toast
197
+ =====================================*/
198
+
199
+ .ac-toast {
200
+ width: 350px;
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: space-between;
204
+ font-size: 13px;
205
+ border-radius: 4px;
206
+ position: relative;
207
+ padding-right: 30px;
208
+ margin-bottom: 10px;
209
+
210
+ * {
211
+ color: $white-100;
212
+ }
213
+
214
+ p {
215
+ padding-left: 16px;
216
+
217
+ i.fa {
218
+ padding-right: 0 !important;
219
+ margin-right: 4px;
220
+ }
221
+ }
222
+
223
+ a {
224
+ font-weight: 500;
225
+ text-decoration: underline;
226
+ padding: 0 15px;
227
+
228
+ &:hover {
229
+ color: $black-70;
230
+ }
231
+ }
232
+
233
+ button.close-button {
234
+ border-radius: 0px;
235
+ background-color: transparent;
236
+ border: none;
237
+ color: $white-100;
238
+ position: absolute;
239
+ right: 0;
240
+ top: 0;
241
+ padding: 5px;
242
+ height: 100%;
243
+ width: 30px;
244
+ z-index: 1;
245
+ cursor: pointer;
246
+ border-left: 1px solid #dddddd;
247
+ }
248
+ }
249
+
250
+ // mixin for .ac-toast
251
+ @mixin acToast($colorName) {
252
+ background-color: $colorName;
253
+ color: $white-100;
254
+ border-color: $colorName;
255
+ }
256
+
257
+ // is-primary
258
+ .ac-toast.is-primary {
259
+ @include acToast($primary);
260
+ }
261
+
262
+ // is-info
263
+ .ac-toast.is-info {
264
+ @include acToast($info);
265
+ }
266
+
267
+ // is.success
268
+ .ac-toast.is-success {
269
+ @include acToast($success);
270
+ }
271
+
272
+ // is-danger
273
+ .ac-toast.is-danger {
274
+ @include acToast($danger);
275
+ }
276
+
277
+ // is-warning
278
+ .ac-toast.is-warning {
279
+ @include acToast($warning);
280
+ }
281
+
282
+ // dark theme start
283
+ // .is-dark-theme {
284
+ // .ac-notification.is-danger {
285
+ // background-color: $black-80;
286
+ // }
287
+ // }
288
+ </style>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { type Ref, onMounted, onUnmounted, ref } from "vue";
2
+ import { onMounted, onUnmounted, ref, type Ref } from "vue";
3
3
 
4
4
  interface Props {
5
5
  modifierClasses?: string;
@@ -131,6 +131,7 @@ const documentClick = (e: Event) => {
131
131
  opacity: 0;
132
132
  visibility: hidden;
133
133
  transition: 0.3s ease-in-out;
134
+ text-align: left;
134
135
 
135
136
  li {
136
137
  .list-button {
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { ref, computed, watch } from "vue";
2
+ import { computed, ref, watch } from "vue";
3
3
 
4
4
  interface Props {
5
5
  hideRowsPerPageSelection?: boolean;
@@ -224,6 +224,7 @@ watch(selectedItemCountPerPage, () => {
224
224
  &:active,
225
225
  &:focus-visible {
226
226
  border: 1px solid $primary;
227
+ outline: none;
227
228
  }
228
229
  }
229
230
  }
@@ -12,7 +12,7 @@ withDefaults(defineProps<Props>(), {
12
12
 
13
13
  <template>
14
14
  <div
15
- class="is-flex is-justify-content-center is-align-items-center is-flex-direction-column ac-preloader"
15
+ class="is-flex is-justify-content-center is-align-items-center is-flex-direction-column ac-preloader page-loader"
16
16
  style="height: calc(100vh - 200px)"
17
17
  >
18
18
  <span v-if="showSpinner" class="spinner"></span>
@@ -7,6 +7,14 @@ const AcSingleInput = defineAsyncComponent(
7
7
 
8
8
  const AcInput = defineAsyncComponent(() => import("../form-fields/Input.vue"));
9
9
 
10
+ interface Props {
11
+ acInputId?: string;
12
+ }
13
+
14
+ withDefaults(defineProps<Props>(), {
15
+ acInputId: "search",
16
+ });
17
+
10
18
  const emit = defineEmits(["search"]);
11
19
 
12
20
  const searchText = ref("");
@@ -19,7 +27,7 @@ watch(searchText, (n) => {
19
27
  <template>
20
28
  <ac-single-input modifier-classes="is-extra-small width-auto">
21
29
  <template #button>
22
- <label class="ac-search-button" for="search">
30
+ <label class="ac-search-button" :for="acInputId">
23
31
  <svg
24
32
  xmlns="http://www.w3.org/2000/svg"
25
33
  viewBox="0 0 20 20"
@@ -39,7 +47,7 @@ watch(searchText, (n) => {
39
47
  placeholder="Search"
40
48
  type="search"
41
49
  class="ac-search"
42
- id="search"
50
+ :id="acInputId"
43
51
  v-model="searchText"
44
52
  />
45
53
  </ac-single-input>