edvoyui-component-library-test-flight 0.0.251 → 0.0.254

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.
@@ -0,0 +1,70 @@
1
+ import { PropType } from '../../../node_modules/vue';
2
+ type AccordionMenuItem = {
3
+ id: string;
4
+ label: string;
5
+ };
6
+ type AccordionMenuSection = {
7
+ id: string;
8
+ label: string;
9
+ items: AccordionMenuItem[];
10
+ };
11
+ declare const _default: import('../../../node_modules/vue').DefineComponent<import('../../../node_modules/vue').ExtractPropTypes<{
12
+ items: {
13
+ type: PropType<AccordionMenuSection[]>;
14
+ default: () => never[];
15
+ };
16
+ modelValue: {
17
+ type: StringConstructor;
18
+ default: string;
19
+ };
20
+ defaultOpen: {
21
+ type: StringConstructor;
22
+ default: string;
23
+ };
24
+ /** Controlled expanded category; takes precedence over defaultOpen when set. */
25
+ openSection: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ /** Keep the expanded category title visible while a long menu scrolls. */
30
+ stickySectionHeaders: {
31
+ type: BooleanConstructor;
32
+ default: boolean;
33
+ };
34
+ }>, {}, {}, {}, {}, import('../../../node_modules/vue').ComponentOptionsMixin, import('../../../node_modules/vue').ComponentOptionsMixin, {
35
+ "update:modelValue": (id: string) => any;
36
+ "update:open": (id: string | null) => any;
37
+ }, string, import('../../../node_modules/vue').PublicProps, Readonly<import('../../../node_modules/vue').ExtractPropTypes<{
38
+ items: {
39
+ type: PropType<AccordionMenuSection[]>;
40
+ default: () => never[];
41
+ };
42
+ modelValue: {
43
+ type: StringConstructor;
44
+ default: string;
45
+ };
46
+ defaultOpen: {
47
+ type: StringConstructor;
48
+ default: string;
49
+ };
50
+ /** Controlled expanded category; takes precedence over defaultOpen when set. */
51
+ openSection: {
52
+ type: StringConstructor;
53
+ default: string;
54
+ };
55
+ /** Keep the expanded category title visible while a long menu scrolls. */
56
+ stickySectionHeaders: {
57
+ type: BooleanConstructor;
58
+ default: boolean;
59
+ };
60
+ }>> & Readonly<{
61
+ "onUpdate:modelValue"?: ((id: string) => any) | undefined;
62
+ "onUpdate:open"?: ((id: string | null) => any) | undefined;
63
+ }>, {
64
+ items: AccordionMenuSection[];
65
+ modelValue: string;
66
+ defaultOpen: string;
67
+ openSection: string;
68
+ stickySectionHeaders: boolean;
69
+ }, {}, {}, {}, string, import('../../../node_modules/vue').ComponentProvideOptions, true, {}, HTMLElement>;
70
+ export default _default;
@@ -0,0 +1,160 @@
1
+ <template>
2
+ <nav class="w-full space-y-1" aria-label="Filter categories">
3
+ <section v-for="section in items" :key="section.id">
4
+ <button
5
+ type="button"
6
+ class="flex items-center w-full gap-2 py-1 pl-4 pr-2 text-sm text-left transition-[background-color,color] duration-300 ease-out rounded min-h-8"
7
+ :class="
8
+ [
9
+ expandedSection === section.id
10
+ ? 'bg-gray-100 text-slate-900 font-semibold'
11
+ : 'bg-white text-gray-600 hover:bg-slate-50 font-medium',
12
+ stickySectionHeaders && expandedSection === section.id
13
+ ? 'sticky top-0 z-50 isolate !bg-gray-100'
14
+ : '',
15
+ ]
16
+ "
17
+ :aria-expanded="expandedSection === section.id"
18
+ @click="toggleSection(section.id)"
19
+ >
20
+ <span class="flex-1 min-w-0 truncate">{{ section.label }}</span>
21
+ <svg
22
+ class="size-5 shrink-0 transition-transform duration-350 ease-[cubic-bezier(0.15,0.3,0.25,1)]"
23
+ :class="expandedSection === section.id ? 'rotate-90' : ''"
24
+ viewBox="0 0 24 24"
25
+ fill="none"
26
+ xmlns="http://www.w3.org/2000/svg"
27
+ width="24"
28
+ height="24"
29
+ >
30
+ <path
31
+ d="M10 8.13867C11.4619 9.20073 12.7713 10.4457 13.8942 11.8408C14.0353 12.016 14.0353 12.2613 13.8942 12.4365C12.7713 13.8316 11.4619 15.0766 10 16.1387"
32
+ stroke="currentColor"
33
+ stroke-opacity="0.8"
34
+ stroke-width="2"
35
+ stroke-linecap="round"
36
+ stroke-linejoin="round"
37
+ ></path>
38
+ </svg>
39
+ </button>
40
+
41
+ <div
42
+ class="grid transition-[grid-template-rows,opacity] duration-350 ease-[cubic-bezier(0.15,0.3,0.25,1)] motion-reduce:transition-none"
43
+ :class="
44
+ expandedSection === section.id
45
+ ? 'grid-rows-[1fr] opacity-100'
46
+ : 'grid-rows-[0fr] opacity-0'
47
+ "
48
+ >
49
+ <div class="min-h-0 overflow-hidden">
50
+ <div class="relative flex flex-col gap-1 pb-2 my-1 ml-4">
51
+ <span
52
+ aria-hidden="true"
53
+ class="absolute top-0 left-0 z-0 w-px bg-slate-200"
54
+ :style="treeRailStyle(section.items.length)"
55
+ />
56
+ <span
57
+ aria-hidden="true"
58
+ class="absolute top-0 left-4 right-0 z-[1] h-8 rounded-md bg-violet-50 ring-1 ring-inset ring-violet-100 transition-[transform,opacity] duration-350 ease-[cubic-bezier(0.15,0.3,0.25,1)]"
59
+ :class="
60
+ activeItem &&
61
+ section.items.some((item) => item.id === activeItem)
62
+ ? 'opacity-100'
63
+ : 'opacity-0'
64
+ "
65
+ :style="indicatorStyle(section)"
66
+ />
67
+ <button
68
+ v-for="item in section.items"
69
+ :key="item.id"
70
+ type="button"
71
+ class="relative z-[2] flex items-center w-[calc(100%-1rem)] h-8 py-0 pl-4 pr-3 ml-4 text-xs text-left transition-colors duration-200 rounded-xl before:absolute before:-left-4 before:top-0 before:h-4 before:w-4 before:rounded-bl-lg before:border-b before:border-l before:border-slate-200 before:content-[''] tracking-[-0.015em]"
72
+ :class="
73
+ activeItem === item.id
74
+ ? 'text-violet-900 font-semibold'
75
+ : 'text-gray-600 hover:text-gray-800 font-medium'
76
+ "
77
+ :aria-current="activeItem === item.id ? 'page' : undefined"
78
+ @click="selectItem(section.id, item.id)"
79
+ >
80
+ {{ item.label }}
81
+ </button>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ </section>
86
+ </nav>
87
+ </template>
88
+
89
+ <script setup lang="ts">
90
+ import { computed, ref, watch, type CSSProperties, type PropType } from "vue";
91
+
92
+ type AccordionMenuItem = { id: string; label: string };
93
+ type AccordionMenuSection = {
94
+ id: string;
95
+ label: string;
96
+ items: AccordionMenuItem[];
97
+ };
98
+
99
+ const props = defineProps({
100
+ items: { type: Array as PropType<AccordionMenuSection[]>, default: () => [] },
101
+ modelValue: { type: String, default: "" },
102
+ defaultOpen: { type: String, default: "" },
103
+ /** Controlled expanded category; takes precedence over defaultOpen when set. */
104
+ openSection: { type: String, default: "" },
105
+ /** Keep the expanded category title visible while a long menu scrolls. */
106
+ stickySectionHeaders: { type: Boolean, default: false },
107
+ });
108
+
109
+ const emit = defineEmits<{
110
+ "update:modelValue": [id: string];
111
+ "update:open": [id: string | null];
112
+ }>();
113
+ const expandedSection = ref<string | null>(
114
+ props.openSection || props.defaultOpen || props.items[0]?.id || null,
115
+ );
116
+ const activeItem = computed(() => props.modelValue);
117
+
118
+ watch(
119
+ () => props.items,
120
+ (items) => {
121
+ if (!items.some((item) => item.id === expandedSection.value))
122
+ expandedSection.value = items[0]?.id || null;
123
+ },
124
+ { deep: true },
125
+ );
126
+
127
+ watch(
128
+ () => props.openSection,
129
+ (sectionId) => {
130
+ expandedSection.value = sectionId || null;
131
+ },
132
+ );
133
+
134
+ const toggleSection = (id: string) => {
135
+ expandedSection.value = expandedSection.value === id ? null : id;
136
+ emit("update:open", expandedSection.value);
137
+ };
138
+
139
+ const selectItem = (sectionId: string, itemId: string) => {
140
+ expandedSection.value = sectionId;
141
+ emit("update:open", sectionId);
142
+ emit("update:modelValue", itemId);
143
+ };
144
+
145
+ const SUBMENU_ROW_STEP_REM = 2.25;
146
+
147
+ const indicatorStyle = (
148
+ section: AccordionMenuSection,
149
+ ): CSSProperties => {
150
+ const index = section.items.findIndex((item) => item.id === activeItem.value);
151
+ return {
152
+ transform: `translateY(${Math.max(0, index) * SUBMENU_ROW_STEP_REM}rem)`,
153
+ };
154
+ };
155
+
156
+ /** The rail ends at the start of the final item's curved CSS connector. */
157
+ const treeRailStyle = (itemCount: number): CSSProperties => ({
158
+ height: `${Math.max(0, (itemCount - 1) * SUBMENU_ROW_STEP_REM + 0.75)}rem`,
159
+ });
160
+ </script>
@@ -10,11 +10,11 @@ declare const _default: import('../../../node_modules/vue').DefineComponent<impo
10
10
  };
11
11
  maxDate: {
12
12
  type: any;
13
- default: string;
13
+ default: undefined;
14
14
  };
15
15
  minDate: {
16
16
  type: any;
17
- default: string;
17
+ default: undefined;
18
18
  };
19
19
  name: {
20
20
  type: StringConstructor;
@@ -86,11 +86,11 @@ declare const _default: import('../../../node_modules/vue').DefineComponent<impo
86
86
  };
87
87
  maxDate: {
88
88
  type: any;
89
- default: string;
89
+ default: undefined;
90
90
  };
91
91
  minDate: {
92
92
  type: any;
93
- default: string;
93
+ default: undefined;
94
94
  };
95
95
  name: {
96
96
  type: StringConstructor;
@@ -113,11 +113,11 @@ const props = defineProps({
113
113
  },
114
114
  maxDate: {
115
115
  type: Date as any,
116
- default: '',
116
+ default: undefined,
117
117
  },
118
118
  minDate: {
119
119
  type: Date as any,
120
- default: '',
120
+ default: undefined,
121
121
  },
122
122
  name: {
123
123
  type: String,
@@ -14,6 +14,7 @@ export { default as EUIStepperTimeline } from './stepperTimeline/EUIStepperTimel
14
14
  export { default as EUIStepperVertical } from './stepperTimeline/EUIStepperVertical';
15
15
  export { default as EUIStepperHorizontal } from './stepperTimeline/EUIStepperHorizontal';
16
16
  export { default as EUIAccordion } from './accordion/EUIAccordion';
17
+ export { default as EUIAccordionMenu } from './accordion/EUIAccordionMenu';
17
18
  export { default as EUIPopover } from './popover/EUIPopover';
18
19
  export { default as EUIModal } from './modal/EUIModal';
19
20
  export { default as EUISlideover } from './slideover/EUISlideover';
@@ -36,6 +36,8 @@ interface Props {
36
36
  /** Maximum selected tags shown before the More/Less control; 0 shows all. */
37
37
  maxVisibleTags?: number;
38
38
  tagSize?: "sm" | "md" | "lg";
39
+ /** Hide options until the user has entered this many non-whitespace characters. */
40
+ minimumSearchLength?: number;
39
41
  dropdownWidth?: string;
40
42
  /** Render the menu at body level to escape clipping scroll containers. */
41
43
  teleported?: boolean;
@@ -254,6 +256,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
254
256
  selectAllLabel: string;
255
257
  maxVisibleTags: number;
256
258
  tagSize: "sm" | "md" | "lg";
259
+ minimumSearchLength: number;
257
260
  dropdownWidth: string;
258
261
  }, {}, {}, {}, string, import('../../../node_modules/vue').ComponentProvideOptions, false, {
259
262
  componentRef: HTMLDivElement;
@@ -159,6 +159,9 @@
159
159
  <template v-if="internalSearch?.trim()">
160
160
  No results found for "<strong>{{ internalSearch }}</strong>"
161
161
  </template>
162
+ <template v-else-if="minimumSearchLength > 0">
163
+ Type at least {{ minimumSearchLength }} character<span v-if="minimumSearchLength !== 1">s</span> to search
164
+ </template>
162
165
  <template v-else-if="backendPagination">
163
166
  Type in the search box to see results
164
167
  </template>
@@ -403,6 +406,8 @@ interface Props {
403
406
  /** Maximum selected tags shown before the More/Less control; 0 shows all. */
404
407
  maxVisibleTags?: number;
405
408
  tagSize?: "sm" | "md" | "lg";
409
+ /** Hide options until the user has entered this many non-whitespace characters. */
410
+ minimumSearchLength?: number;
406
411
  dropdownWidth?: string,
407
412
  /** Render the menu at body level to escape clipping scroll containers. */
408
413
  teleported?: boolean;
@@ -437,6 +442,7 @@ const props = withDefaults(defineProps<Props>(), {
437
442
  selectAllLabel: "All",
438
443
  maxVisibleTags: 0,
439
444
  tagSize: "md",
445
+ minimumSearchLength: 0,
440
446
  dropdownWidth: '',
441
447
  teleported: false,
442
448
  });
@@ -594,6 +600,8 @@ const filteredItems = computed(() => {
594
600
  const searchValue = String(internalSearch.value ?? "");
595
601
  const search = searchValue.trim().toLowerCase();
596
602
 
603
+ if (search.length < props.minimumSearchLength) return [];
604
+
597
605
  if (searchValue !== "") {
598
606
  if (search === "") return [];
599
607
  if (props.backendPagination) return props.items;
@@ -60,7 +60,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
60
60
  checkedRows: {
61
61
  type: ArrayConstructor;
62
62
  default: () => never[];
63
- required: true;
63
+ required: false;
64
64
  };
65
65
  headers: {
66
66
  type: PropType<Header[]>;
@@ -152,7 +152,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
152
152
  checkedRows: {
153
153
  type: ArrayConstructor;
154
154
  default: () => never[];
155
- required: true;
155
+ required: false;
156
156
  };
157
157
  headers: {
158
158
  type: PropType<Header[]>;
@@ -21,7 +21,7 @@
21
21
  </div>
22
22
  </Transition>
23
23
 
24
- <div class="relative w-full mx-auto overflow-hidden">
24
+ <div class="overflow-hidden relative mx-auto w-full">
25
25
  <div
26
26
  id="student-table"
27
27
  :class="[
@@ -67,7 +67,7 @@
67
67
  @click="sortBy(header, $event)"
68
68
  >
69
69
  <div
70
- class="flex items-center justify-between gap-2 text-sm font-medium text-current font-inter"
70
+ class="flex gap-2 justify-between items-center text-sm font-medium text-current font-inter"
71
71
  >
72
72
  <slot name="header" :header="header" :index="headerIndex">
73
73
  {{ capitalizeText(header?.text ?? header?.name ?? "") }}
@@ -122,11 +122,10 @@
122
122
  >
123
123
  <tr
124
124
  :id="`row-${rowIndex}`"
125
- :class="
126
- activeRowIndex == rowIndex
127
- ? '!bg-violet-50 !ring-1 !ring-violet-100 !ring-inset'
128
- : ''
129
- "
125
+ :class="{
126
+ 'is-active-row':
127
+ activeRowIndex != null && activeRowIndex === rowIndex,
128
+ }"
130
129
  @mouseenter="
131
130
  $attrs.mouseenter
132
131
  ? $emit('mouseenter', row, rowIndex)
@@ -139,14 +138,7 @@
139
138
  "
140
139
  >
141
140
  <template v-if="checkable">
142
- <td
143
- class="checkable"
144
- :class="
145
- activeRowIndex == rowIndex
146
- ? '!bg-violet-50 !ring-1 !ring-violet-100 !ring-inset'
147
- : ''
148
- "
149
- >
141
+ <td class="checkable">
150
142
  <EUITableCheckbox
151
143
  :disabled="!isRowCheckable(row)"
152
144
  :checked="isRowChecked(row)"
@@ -161,9 +153,6 @@
161
153
  :key="headerIndex"
162
154
  :class="[
163
155
  isScrolled && headerIndex === 0 ? stickyClass.body : '',
164
- activeRowIndex == rowIndex
165
- ? '!bg-violet-50 !ring-1 !ring-violet-100 !ring-inset'
166
- : '',
167
156
  ]"
168
157
  >
169
158
  <slot
@@ -204,7 +193,7 @@
204
193
  class="sticky bottom-0 left-0 z-50 flex items-center justify-between px-2 py-1 bg-white shadow-[0_-6px_24px_-6px_#0c0c0d1c]"
205
194
  >
206
195
  <slot name="tableCount">
207
- <div class="inline-flex items-center gap-x-2">
196
+ <div class="inline-flex gap-x-2 items-center">
208
197
  <div class="text-sm font-medium text-gray-900">
209
198
  Total {{ total }}
210
199
  </div>
@@ -271,7 +260,7 @@ const props = defineProps({
271
260
  paginated: { type: Boolean, default: false },
272
261
  tableExpanded: { type: Boolean, default: false },
273
262
  backendPagination: { type: Boolean, default: false },
274
- checkedRows: { type: Array, default: () => [], required: true },
263
+ checkedRows: { type: Array, default: () => [], required: false },
275
264
  headers: {
276
265
  type: Array as PropType<Header[]>,
277
266
  default: () => ({}),
@@ -548,26 +537,39 @@ watch(() => tableContainer.value?.clientWidth, checkOverflow);
548
537
  }
549
538
 
550
539
  tbody {
551
- @apply snap-y snap-mandatory snap-always;
540
+ @apply snap-y snap-mandatory snap-always;
552
541
  tr:not(.norecords) {
553
- @apply text-gray-600 transition-colors duration-100 bg-white snap-start ease-in-out snap-x snap-mandatory rounded-sm h-12;
542
+ @apply text-gray-600 bg-white snap-mandatory snap-start rounded-sm h-12;
543
+
554
544
  td {
555
- @apply px-3 py-1 text-sm font-normal transition-colors duration-100 ease-in-out snap-start snap-always border-solid border-gray-100 border-b;
545
+ // Keep border widths stable in every state. Changing border width on
546
+ // hover causes table row geometry to shift and produces a jump.
547
+ @apply box-border px-3 py-1 text-sm font-normal snap-start snap-always border-solid border-b border-t border-gray-100 border-t-transparent;
548
+
549
+ &:first-child {
550
+ @apply border-l border-l-transparent;
551
+ }
552
+
553
+ &:last-child {
554
+ @apply border-r border-r-transparent;
555
+ }
556
+
556
557
  &:first-of-type.checkable {
557
558
  @apply w-12 text-center sticky left-0 top-0 z-[11] bg-white;
558
559
  }
559
560
  }
560
561
 
561
- &:hover td {
562
- @apply font-medium text-gray-900 bg-violet-50 border-violet-200 first-of-type:rounded-s-sm last-of-type:rounded-e-sm border-b border-t first:border-l last:border-r;
562
+ // Do not transition background/border colors between rows. When the
563
+ // pointer moves quickly, the previous row would otherwise fade out while
564
+ // the next row fades in, making two rows look highlighted at once.
565
+ &:hover td,
566
+ &.is-active-row td {
567
+ @apply text-gray-900 bg-violet-50 border-violet-200 first-of-type:rounded-s-sm last-of-type:rounded-e-sm;
568
+
563
569
  &:first-of-type.checkable {
564
570
  @apply bg-violet-50;
565
571
  }
566
572
  }
567
-
568
- &:has(+ tr:hover) td {
569
- @apply border-b-0;
570
- }
571
573
  }
572
574
  }
573
575
  }
@@ -20,7 +20,7 @@
20
20
  </slot>
21
21
  </div>
22
22
  </Transition>
23
- <div class="relative max-w-full mx-auto overflow-hidden">
23
+ <div class="overflow-hidden relative mx-auto max-w-full">
24
24
  <div
25
25
  :class="[
26
26
  'ui-table scrollbar--auto',
@@ -67,7 +67,7 @@
67
67
  { '!bg-gray-200': currentSort === header.value },
68
68
  ]"
69
69
  :style="
70
- headers.length > 6
70
+ headers.length > 5
71
71
  ? headerStyle(header)
72
72
  : 'width: 100%;min-width: 250px;background-color: rgb(243 244 246);'
73
73
  "
@@ -97,7 +97,7 @@
97
97
  </template>
98
98
  <template v-slot:tooltip>
99
99
  <div
100
- class="z-50 max-w-xs break-words whitespace-normal min-w-max"
100
+ class="z-50 min-w-max max-w-xs whitespace-normal break-words"
101
101
  >
102
102
  {{ header?.showHeaderInfoText }}
103
103
  </div>
@@ -106,7 +106,7 @@
106
106
  </div>
107
107
  <div
108
108
  v-if="header?.sortable"
109
- class="absolute -top-0.5 -right-6 size-6 z-10"
109
+ class="absolute -top-0.5 -right-6 z-10 size-6"
110
110
  >
111
111
  <svg
112
112
  width="24"
@@ -215,7 +215,7 @@
215
215
  </template>
216
216
  <template v-slot:tooltip>
217
217
  <div
218
- class="z-50 max-w-xs break-words whitespace-normal min-w-max"
218
+ class="z-50 min-w-max max-w-xs whitespace-normal break-words"
219
219
  >
220
220
  {{ header?.showInfoText }}
221
221
  </div>
@@ -252,12 +252,12 @@
252
252
  >
253
253
  <div class="text-center">
254
254
  <div
255
- class="mx-auto overflow-hidden rounded-md size-56"
255
+ class="overflow-hidden mx-auto rounded-md size-56"
256
256
  >
257
257
  <img
258
258
  src="@/assets/images/search-nodata.png"
259
259
  alt=""
260
- class="block object-contain object-center h-auto max-w-full opacity-90"
260
+ class="block object-contain object-center max-w-full h-auto opacity-90"
261
261
  />
262
262
  </div>
263
263
  <div class="my-2 text-xl font-medium text-gray-500">
@@ -274,7 +274,7 @@
274
274
  </div>
275
275
  <div
276
276
  v-if="stickyFooter"
277
- class="sticky bottom-0 left-0 z-50 flex items-center justify-between px-2 py-1 bg-white border-t border-gray-300"
277
+ class="flex sticky bottom-0 left-0 z-50 justify-between items-center px-2 py-1 bg-white border-t border-gray-300"
278
278
  >
279
279
  <slot
280
280
  name="tableCount"
@@ -282,12 +282,12 @@
282
282
  :from="rangeFrom"
283
283
  :to="rangeTo"
284
284
  >
285
- <div class="inline-flex items-center self-stretch gap-x-3">
285
+ <div class="inline-flex gap-x-3 items-center self-stretch">
286
286
  <div class="text-sm font-normal text-gray-600">
287
287
  {{ rangeFrom }} - {{ rangeTo }} of {{ total }}
288
288
  </div>
289
- <div class="self-stretch w-px h-4 my-auto bg-gray-300"></div>
290
- <div class="inline-flex items-center gap-0">
289
+ <div class="self-stretch my-auto w-px h-4 bg-gray-300"></div>
290
+ <div class="inline-flex gap-0 items-center">
291
291
  <span class="text-sm font-normal text-gray-600"
292
292
  > Items per page:</span>
293
293
  <EUIPageLimit
@@ -10,17 +10,12 @@
10
10
  <button
11
11
  v-if="closeIcon"
12
12
  type="button"
13
- class="relative flex-shrink-0 -mr-1 rounded group hover:bg-red-300/50 active:bg-red-300"
14
- :class="[props.size === 'lg' ? 'size-6' : props.size === 'md'? 'size-5' : 'size-3.5']"
13
+ class="relative inline-flex items-center justify-center flex-shrink-0 -mr-1 rounded group hover:bg-red-100 active:bg-red-200"
14
+ :class="[props.size === 'lg' ? 'size-6' : props.size === 'md'? 'size-5' : 'size-4']"
15
15
  @click.stop="removeTag"
16
16
  >
17
17
  <span class="sr-only">Remove</span>
18
- <svg
19
- viewBox="0 0 14 14"
20
- class="stroke-gray-400 group-hover:stroke-red-600/75 text-violet-600"
21
- >
22
- <path d="M4 4l6 6m0-6l-6 6" />
23
- </svg>
18
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="text-gray-400 group-hover:text-red-600/75" :class="[props.size === 'lg' ? 'size-5' : props.size === 'md'? 'size-4' : 'size-3']"><path d="M6 18L12 12M12 12L18 6M12 12L6 6M12 12L18 18" stroke="currentColor" stroke-opacity="0.9" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>
24
19
  </button>
25
20
  </div>
26
21
  </template>
@@ -69,7 +64,7 @@ const tagClass = computed(() => {
69
64
  : "bg-white hover:bg-gray-100 text-black cursor-pointer active:shadow-white/50 active:bg-transparent",
70
65
  secondary: btnDisabled
71
66
  ? "bg-opacity-75 cursor-not-allowed text-gray-400 bg-violet-50"
72
- : "bg-violet-100 hover:bg-violet-50 active:bg-violet-100 cursor-pointer text-violet-500 active:shadow-violet-200",
67
+ : "bg-violet-100 hover:bg-violet-50 active:bg-violet-100 cursor-pointer text-violet-600 active:shadow-violet-200",
73
68
  tertiary: btnDisabled
74
69
  ? "bg-opacity-75 cursor-not-allowed text-gray-400 bg-gray-50 ring-1 ring-gray-400/20"
75
70
  : "bg-gray-100 hover:bg-gray-50 active:bg-gray-100 text-gray-700 cursor-pointer active:shadow-bg-gray-200/50 ring-1 ring-gray-200",