@dpa-id-components/dpa-shared-components 22.0.0-next.5 → 22.0.0-next.7

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 (44) hide show
  1. package/dist/components/UiBadge/UiBadge.vue.d.ts +1 -1
  2. package/dist/components/UiInput/UiInput.vue.d.ts +35 -32
  3. package/dist/components/UiListItem/UiListItem.vue.d.ts +0 -1
  4. package/dist/components/UiMenu/UiMenu.vue.d.ts +0 -2
  5. package/dist/dpa-shared-components.js +3189 -3171
  6. package/dist/src/components/UiBadge/UiBadge.stories.ts +1 -1
  7. package/dist/src/components/UiBadge/UiBadge.vue +3 -8
  8. package/dist/src/components/UiButton/UiButton.stories.ts +17 -0
  9. package/dist/src/components/UiCheckbox/README.md +9 -9
  10. package/dist/src/components/UiDatePicker/UiDatePicker.spec.ts +2 -2
  11. package/dist/src/components/UiDatePicker/UiDatePicker.vue +20 -20
  12. package/dist/src/components/UiIcon/UiIconLoading.vue +8 -1
  13. package/dist/src/components/UiInput/README.md +28 -17
  14. package/dist/src/components/UiInput/UiInput.spec.ts +20 -0
  15. package/dist/src/components/UiInput/UiInput.stories.ts +15 -1
  16. package/dist/src/components/UiInput/UiInput.vue +7 -4
  17. package/dist/src/components/UiListItem/README.md +0 -1
  18. package/dist/src/components/UiListItem/UiListItem.vue +2 -5
  19. package/dist/src/components/UiMediaTypeIcon/UiMediaTypeIcon.vue +1 -1
  20. package/dist/src/components/UiMenu/README.md +0 -2
  21. package/dist/src/components/UiMenu/UiMenu.stories.ts +0 -3
  22. package/dist/src/components/UiMenu/UiMenu.vue +4 -9
  23. package/dist/src/components/UiPopover/UiPopover.stories.ts +1 -1
  24. package/dist/src/components/UiPopover/UiPopover.vue +18 -15
  25. package/dist/src/components/UiSelect/UiSelect.vue +14 -2
  26. package/dist/src/components/UiSpinner/UiSpinner.spec.ts +1 -1
  27. package/dist/src/components/UiSpinner/UiSpinner.stories.ts +1 -1
  28. package/dist/src/components/UiSpinner/UiSpinner.vue +31 -32
  29. package/dist/style.css +1 -1
  30. package/package.json +15 -8
  31. package/src/components/UiBadge/UiBadge.vue +3 -8
  32. package/src/components/UiCheckbox/README.md +9 -9
  33. package/src/components/UiDatePicker/UiDatePicker.vue +20 -20
  34. package/src/components/UiIcon/UiIconLoading.vue +8 -1
  35. package/src/components/UiInput/README.md +28 -17
  36. package/src/components/UiInput/UiInput.vue +7 -4
  37. package/src/components/UiListItem/README.md +0 -1
  38. package/src/components/UiListItem/UiListItem.vue +2 -5
  39. package/src/components/UiMediaTypeIcon/UiMediaTypeIcon.vue +1 -1
  40. package/src/components/UiMenu/README.md +0 -2
  41. package/src/components/UiMenu/UiMenu.vue +4 -9
  42. package/src/components/UiPopover/UiPopover.vue +18 -15
  43. package/src/components/UiSelect/UiSelect.vue +14 -2
  44. package/src/components/UiSpinner/UiSpinner.vue +31 -32
@@ -3,19 +3,19 @@
3
3
  ## Usage
4
4
 
5
5
  ```vue
6
- <template>
7
- <UiCheckbox required name="terms" appearance="secondary">
8
- Accept terms and conditions
9
- </UiCheckbox>
10
- </template>
11
-
12
- <script setup lang="ts">
13
- import { UiCheckbox } from "@dpa-id-components/dpa-shared-components";
14
- </script>
6
+ <UiCheckbox required name="terms" appearance="secondary">
7
+ Accept terms and conditions
8
+ </UiCheckbox>
15
9
  ```
16
10
 
17
11
  ## API
18
12
 
13
+ ### Models
14
+
15
+ | Name | Type | Default | Description |
16
+ |-----------|--------------------|-------------|----------------------|
17
+ | _default_ | `string[] \| string \| boolean` | `undefined` | Sets the input value |
18
+
19
19
  ### Props
20
20
 
21
21
  **Note**: This component binds all non-prop attributes (apart from `class`) on its principal element (`input[type="checkbox"]`) instead of the root element. This allows you to add arbitrary HTML attributes (and event listeners) on the principal element without them being explicitly supported by the component.
@@ -130,7 +130,7 @@
130
130
  <UiIcon class="text-neutral-subtle" name="chevron-right" size="sm" />
131
131
  </template>
132
132
  <template #arrow>
133
- <div ref="menuArrow" class="dp__arrow_top"></div>
133
+ <div ref="menuArrow" class="dp--arrow-top"></div>
134
134
  </template>
135
135
  </VueDatePicker>
136
136
  </div>
@@ -306,17 +306,17 @@ function formatInput(date: Date | [Date, Date]): string {
306
306
  <style>
307
307
  @reference "../../tailwindPreset.css";
308
308
 
309
- .dp__arrow_top {
309
+ .dp--arrow-top {
310
310
  left: 10%;
311
311
  }
312
312
 
313
- .dp__menu {
313
+ .dp--menu {
314
314
  border-radius: var(--radius-2xl);
315
315
  box-shadow: var(--shadow-lg);
316
316
  }
317
317
 
318
318
  .dp--year-select,
319
- .dp__month_year_select {
319
+ .dp--month-year-select {
320
320
  border-radius: var(--radius-2xl);
321
321
  }
322
322
 
@@ -325,45 +325,45 @@ function formatInput(date: Date | [Date, Date]): string {
325
325
  padding: 0.25rem;
326
326
  }
327
327
 
328
- .dp__flex_display {
328
+ .dp--flex-display {
329
329
  gap: 2rem;
330
330
  }
331
331
 
332
- .dp__sidebar_left {
332
+ .dp--sidebar-left {
333
333
  padding: 0;
334
334
  }
335
335
 
336
- .dp__cell_inner {
336
+ .dp--cell-inner {
337
337
  border-radius: calc(infinity * 1px);
338
338
  }
339
339
 
340
- .dp__cell_inner:hover {
340
+ .dp--cell-inner:hover {
341
341
  border-radius: calc(infinity * 1px);
342
342
  }
343
343
 
344
- .dp__today {
344
+ .dp--today {
345
345
  border: 1px solid var(--color-neutral-primary);
346
346
  }
347
347
 
348
- .dp__cell_auto_range,
349
- .dp__cell_auto_range_start,
350
- .dp__cell_auto_range_end {
348
+ .dp--cell-auto-range,
349
+ .dp--cell-auto-range-start,
350
+ .dp--cell-auto-range-end {
351
351
  border: none;
352
352
  color: var(--color-neutral-primary);
353
353
  background-color: var(--color-neutral-faint);
354
354
  }
355
355
 
356
- .dp__month_year_select {
356
+ .dp--month-year-select {
357
357
  font-size: var(--text-base);
358
358
  font-weight: var(--font-weight-semibold);
359
359
  color: var(--color-neutral-primary);
360
360
  }
361
361
 
362
- .dp__calendar_header_separator {
362
+ .dp--calendar-header-separator {
363
363
  display: none;
364
364
  }
365
365
 
366
- .dp__calendar_header {
366
+ .dp--calendar-header {
367
367
  gap: 0.25rem;
368
368
  align-items: center;
369
369
  font-size: var(--text-xs);
@@ -371,26 +371,26 @@ function formatInput(date: Date | [Date, Date]): string {
371
371
  font-weight: var(--font-weight-semibold);
372
372
  }
373
373
 
374
- .dp__calendar_header_item {
374
+ .dp--calendar-header-item {
375
375
  display: flex;
376
376
  align-items: center;
377
377
  justify-content: center;
378
378
  color: var(--color-neutral-subtle);
379
379
  }
380
380
 
381
- .dp__calendar_row {
381
+ .dp--calendar-row {
382
382
  gap: 0.25rem;
383
383
  }
384
384
 
385
- .dp__action_row,
386
- .dp__action_extra {
385
+ .dp--action-row,
386
+ .dp--action-extra {
387
387
  justify-content: end;
388
388
  gap: 1rem;
389
389
  border-top: 1px solid var(--color-neutral-faint);
390
390
  padding: 0.5rem 1rem;
391
391
  }
392
392
 
393
- .dp__theme_light {
393
+ .dp--theme-light {
394
394
  --dp-font-family: var(--font-sans);
395
395
  --dp-month-year-row-height: 2rem; /*Height of the month-year select row*/
396
396
  --dp-button-icon-height: 1.5rem; /*Icon sizing in buttons*/
@@ -1 +1,8 @@
1
- <template><div></div></template>
1
+ <template>
2
+ <svg
3
+ width="24"
4
+ height="24"
5
+ viewBox="0 0 24 24"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ ></svg>
8
+ </template>
@@ -3,29 +3,40 @@
3
3
  ## Usage
4
4
 
5
5
  ```vue
6
- <template>
7
- <UiInput
8
- label="Postal code"
9
- id="postal_code-1"
10
- name="postal_code"
11
- value="04277"
12
- required
13
- placeholder="12345"
14
- ></UiInput>
15
- </template>
16
-
17
- <script setup lang="ts">
18
- import { UiInput } from "@dpa-id-components/dpa-shared-components";
19
- </script>
6
+ <UiInput
7
+ id="postal-code"
8
+ name="postal_code"
9
+ value="04277"
10
+ required
11
+ placeholder="12345"
12
+ >
13
+ Postal code
14
+ </UiInput>
15
+ ```
16
+
17
+ **Using `v-model`**:
18
+
19
+ ```vue
20
+ <UiInput v-model="postalCode">
21
+ Postal code
22
+ </UiInput>
23
+ ```
24
+
25
+ **With `number` value**:
26
+
27
+ ```vue
28
+ <UiInput v-model="count" type="number">
29
+ Count
30
+ </UiInput>
20
31
  ```
21
32
 
22
33
  ## API
23
34
 
24
35
  ### Models
25
36
 
26
- | Name | Type | Default | Description |
27
- |-----------|----------|-------------|----------------------|
28
- | _default_ | `string` | `undefined` | Sets the input value |
37
+ | Name | Type | Default | Description |
38
+ |-----------|--------------------|-------------|----------------------|
39
+ | _default_ | `string \| number` | `undefined` | Sets the input value |
29
40
 
30
41
  ### Props
31
42
 
@@ -34,7 +34,7 @@
34
34
  data-testid="input-value"
35
35
  v-bind="{ ...$attrs, class: null }"
36
36
  :data-is-label-raised="
37
- $attrs.placeholder || isFocused || model ? '' : undefined
37
+ $attrs.placeholder || isFocused || hasInput ? '' : undefined
38
38
  "
39
39
  @focus="isFocused = true"
40
40
  @blur="isFocused = false"
@@ -55,7 +55,7 @@
55
55
  data-testid="input-value"
56
56
  v-bind="{ ...$attrs, class: null }"
57
57
  :data-is-label-raised="
58
- $attrs.placeholder || isFocused || model ? '' : undefined
58
+ $attrs.placeholder || isFocused || hasInput ? '' : undefined
59
59
  "
60
60
  @focus="isFocused = true"
61
61
  @blur="isFocused = false"
@@ -82,7 +82,7 @@
82
82
  </div>
83
83
  </template>
84
84
 
85
- <script setup lang="ts">
85
+ <script setup lang="ts" generic="ModelValue extends string | number">
86
86
  import { computed, ref, useId } from "vue";
87
87
 
88
88
  import { cn } from "../../utils/cn.ts";
@@ -130,8 +130,11 @@ const {
130
130
  inputStatus?: "info" | "warning" | "error";
131
131
  }>();
132
132
 
133
- const model = defineModel<string>();
133
+ const model = defineModel<ModelValue>();
134
134
 
135
+ const hasInput = computed(
136
+ () => model.value !== undefined && model.value !== "",
137
+ );
135
138
  const isFocused = ref(false);
136
139
 
137
140
  const defaultId = useId();
@@ -31,7 +31,6 @@
31
31
  | `imageSrc` | `String` | `""` | Image to be displayed at the beginning of the list item. |
32
32
  | `imageShape` | `"rounded" &#124; "square"` | `"square"` | Shape pf the image to be displayed. |
33
33
  | `checkboxColor` | `"blue" &#124; "gray"` | `"blue"` | Checkbox color style. |
34
- | `checkboxSize` | `"small" &#124; "medium"` | `"medium"` | Checkbox size style. |
35
34
 
36
35
  ### Events
37
36
 
@@ -2,11 +2,10 @@
2
2
  <li
3
3
  :class="
4
4
  cn(
5
- 'flex cursor-pointer list-none items-center gap-2 px-4 py-2 text-sm/normal text-neutral-emphasis select-none hover:text-primary focus:outline-hidden focus-visible:focus-outline focus-visible:-outline-offset-2',
5
+ 'flex cursor-pointer list-none items-center gap-2 px-4 py-1.5 text-sm/normal text-neutral-emphasis select-none hover:text-primary focus:outline-hidden focus-visible:focus-outline focus-visible:-outline-offset-2',
6
6
  {
7
7
  'cursor-default text-neutral-medium': disabled,
8
8
  'is-selected': selected,
9
- 'py-3': checkboxSize === 'md',
10
9
  },
11
10
  overrideClasses,
12
11
  $attrs.class,
@@ -20,7 +19,7 @@
20
19
  :appearance="checkboxAppearance"
21
20
  :model-value="isChecked"
22
21
  :disabled="disabled"
23
- :size="checkboxSize"
22
+ size="sm"
24
23
  @click.stop="$emit('list-item-click', value)"
25
24
  >
26
25
  <span class="sr-only"><slot /></span>
@@ -65,7 +64,6 @@ const {
65
64
  imageSrc = undefined,
66
65
  imageShape = "rounded",
67
66
  checkboxAppearance = "primary",
68
- checkboxSize = "md",
69
67
  isChecked = false,
70
68
  disabled = false,
71
69
  } = defineProps<{
@@ -79,7 +77,6 @@ const {
79
77
  imageShape?: "rounded" | "square";
80
78
  iconSize?: "sm" | "md" | "lg";
81
79
  checkboxAppearance?: "primary" | "secondary";
82
- checkboxSize?: "sm" | "md";
83
80
  isChecked?: boolean;
84
81
  disabled?: boolean;
85
82
  }>();
@@ -42,7 +42,7 @@ const iconComponent = computed(() =>
42
42
 
43
43
  watchEffect(() => {
44
44
  if (!icons[name]) {
45
- throw new Error(`UiMediaFormatIcon: No icon named “${name}” exists.`);
45
+ throw new Error(`UiMediaTypeIcon: No icon named “${name}” exists.`);
46
46
  }
47
47
  });
48
48
  </script>
@@ -89,7 +89,6 @@ const options = ref([
89
89
  | `buttonAppearance` | `"primary"`, `"secondary"`, `"secondary-alt"`, or `"ghost"` | `"secondary-alt"` | |
90
90
  | `listVariant` | `"checkbox" &#124; "selectable" &#124; "blank"` | `"blank"` | Menu style. |
91
91
  | `checkboxColor` | `"blue" &#124; "gray"` | `"blue"` | Checkbox color style. |
92
- | `checkboxSize` | `"small" &#124; "medium"` | `"medium"` | Checkbox size style. |
93
92
  | `imageShape` | `"rounded" &#124; "square"` | `"square"` | shape of image. |
94
93
  | `hasResetOption` | `boolean` | `false` | Toggles option for a reset button |
95
94
  | `resetLabel` | `string` | `""` | Sets text of reset button. |
@@ -142,7 +141,6 @@ Wraps the UiListItem and uses the same settings as in the original UiMenu, helps
142
141
  | `listVariant?` | `"checkbox" &#124; "selectable" &#124; "blank"` | `blank` | Provide the list variant, same as in UiMenu.vue |
143
142
  | `iconSize?` | `"small" &#124; "medium" &#124; "large"` | `small` | Provide the icon size, same as in UiMenu.vue |
144
143
  | `imageShape?` | `"rounded" &#124; "square"` | `square` | Provide the imageShape, same as in UiMenu.vue |
145
- | `checkboxSize?` | `"small" &#124; "medium"` | `medium` | Provide the checkboxSize, same as in UiMenu.vue |
146
144
  | `checkboxColor?` | `"blue" &#124; "gray"` | `blue` | Provide the checkboxColor, same as in UiMenu.vue |
147
145
 
148
146
  #### Slots
@@ -26,11 +26,11 @@
26
26
  </template>
27
27
 
28
28
  <div
29
- class="block w-max max-w-full divide-y overflow-hidden rounded-sm text-base/6 shadow-lg focus:outline-hidden sm:text-sm/5"
29
+ class="block w-max max-w-full divide-y overflow-hidden rounded-lg border border-neutral-faint bg-neutral text-base/6 shadow-md focus:outline-hidden sm:text-sm/5"
30
30
  >
31
31
  <div
32
32
  v-if="hasSearch"
33
- class="flex items-center gap-2 rounded-t-sm px-4 py-2 text-neutral-primary [&:has(>input:focus-visible)]:focus-outline [&:has(>input:focus-visible)]:-outline-offset-2"
33
+ class="flex items-center gap-2 rounded-t-lg px-4 pt-2.5 pb-1.5 text-neutral-primary [&:has(>input:focus-visible)]:focus-outline [&:has(>input:focus-visible)]:-outline-offset-2"
34
34
  >
35
35
  <UiIcon
36
36
  class="shrink-0 text-neutral-emphasis"
@@ -51,7 +51,6 @@
51
51
  <slot
52
52
  v-bind="{
53
53
  checkboxAppearance,
54
- checkboxSize,
55
54
  iconSize,
56
55
  imageShape,
57
56
  listVariant,
@@ -71,7 +70,7 @@
71
70
  <template v-if="group.options.length > 0">
72
71
  <li
73
72
  v-if="group.groupLabel"
74
- class="flex h-6 items-center bg-neutral-whisper px-4 text-xs font-semibold tracking-wider text-neutral-subtle uppercase"
73
+ class="flex h-6 items-center bg-neutral-faint px-4 text-xs font-semibold tracking-wider text-neutral-subtle uppercase"
75
74
  >
76
75
  {{ group.groupLabel }}
77
76
  </li>
@@ -87,7 +86,6 @@
87
86
  :image-shape="imageShape"
88
87
  :image-src="option.imageSrc"
89
88
  :icon-name="option.iconName"
90
- :checkbox-size="checkboxSize"
91
89
  :checkbox-appearance="checkboxAppearance"
92
90
  class="hover:bg-neutral-whisper focus:bg-neutral-faint"
93
91
  :class="{
@@ -102,7 +100,7 @@
102
100
  </ul>
103
101
  </slot>
104
102
 
105
- <div v-if="hasResetOption" class="px-4 py-2 text-neutral-primary">
103
+ <div v-if="hasResetOption" class="px-2 pt-1.5 pb-2 text-neutral-primary">
106
104
  <UiButton
107
105
  appearance="secondary"
108
106
  :disabled="disabledReset"
@@ -154,7 +152,6 @@ export type UiMenuGroupedOption<Value = unknown> = {
154
152
  defineSlots<{
155
153
  default?: (props: {
156
154
  checkboxAppearance: typeof checkboxAppearance;
157
- checkboxSize: typeof checkboxSize;
158
155
  iconSize: typeof iconSize;
159
156
  imageShape: typeof imageShape;
160
157
  listVariant: typeof listVariant;
@@ -192,7 +189,6 @@ const {
192
189
  // Menu
193
190
  iconSize = "sm",
194
191
  imageShape = "square",
195
- checkboxSize = "md",
196
192
  checkboxAppearance = "primary",
197
193
  listVariant = "blank",
198
194
  } = defineProps<{
@@ -222,7 +218,6 @@ const {
222
218
  // Menu
223
219
  iconSize?: "sm" | "md" | "lg";
224
220
  imageShape?: "rounded" | "square";
225
- checkboxSize?: "sm" | "md";
226
221
  checkboxAppearance?: "primary" | "secondary";
227
222
  listVariant?: "checkbox" | "selectable" | "blank";
228
223
  }>();
@@ -1,16 +1,5 @@
1
1
  <template>
2
- <div
3
- ref="reference"
4
- v-click-away="
5
- () => {
6
- if (isOpen) {
7
- close();
8
- }
9
- }
10
- "
11
- class="w-fit"
12
- @click="update"
13
- >
2
+ <div ref="reference" class="w-fit" @click="update">
14
3
  <slot name="button" v-bind="{ open, close, toggle, isOpen }" />
15
4
 
16
5
  <Transition :name="animate ? 'fade-up' : 'none'">
@@ -18,7 +7,7 @@
18
7
  v-show="isOpen"
19
8
  ref="floating"
20
9
  :style="floatingStyles"
21
- class="z-10 w-fit rounded-sm bg-neutral [text-align:initial] [--transition-close-duration:100ms] [--transition-duration:200ms]"
10
+ class="z-10 w-fit [text-align:initial] [--transition-close-duration:100ms] [--transition-duration:200ms]"
22
11
  :data-side="placement"
23
12
  >
24
13
  <slot v-bind="{ close }" />
@@ -36,10 +25,9 @@ import {
36
25
  shift,
37
26
  useFloating,
38
27
  } from "@floating-ui/vue";
28
+ import { onClickOutside } from "@vueuse/core";
39
29
  import { ref, useTemplateRef, watch } from "vue";
40
30
 
41
- import { vClickAway } from "../../directives/vClickAway.ts";
42
-
43
31
  defineSlots<{
44
32
  button: (props: {
45
33
  open: typeof open;
@@ -103,6 +91,21 @@ function toggle() {
103
91
  isOpen.value = !isOpen.value;
104
92
  }
105
93
 
94
+ onClickOutside(
95
+ floating,
96
+ () => {
97
+ if (isOpen.value) {
98
+ close();
99
+ }
100
+ },
101
+ {
102
+ ignore: [
103
+ // Ignore clicks on the reference element
104
+ reference,
105
+ ],
106
+ },
107
+ );
108
+
106
109
  defineExpose({ open, close });
107
110
  </script>
108
111
 
@@ -89,7 +89,7 @@ select,
89
89
  }
90
90
 
91
91
  ::picker(select) {
92
- @apply shadow-lg border border-neutral-whisper;
92
+ @apply mt-1 overscroll-none rounded-lg border border-neutral-faint shadow-md;
93
93
  }
94
94
 
95
95
  select::picker-icon {
@@ -97,12 +97,24 @@ select::picker-icon {
97
97
  }
98
98
 
99
99
  select > :deep(option) {
100
- @apply flex justify-between items-center px-4 py-3;
100
+ @apply flex items-center justify-between px-4 py-1.5 focus-visible:focus-outline;
101
+
102
+ &:first-child {
103
+ @apply rounded-t-lg;
104
+ }
105
+
106
+ &:last-child {
107
+ @apply rounded-b-lg;
108
+ }
101
109
 
102
110
  &:enabled:hover {
103
111
  @apply bg-neutral-pale;
104
112
  }
105
113
 
114
+ &:focus-visible {
115
+ @apply -outline-offset-2;
116
+ }
117
+
106
118
  &::checkmark {
107
119
  @apply order-1 text-lg;
108
120
  }
@@ -1,37 +1,36 @@
1
1
  <template>
2
- <div :class="sizeClass">
3
- <svg
4
- class="animate-spin"
5
- width="32"
6
- height="32"
7
- viewBox="0 0 32 32"
2
+ <svg
3
+ class="inline-flex animate-spin"
4
+ :class="sizeClass"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 32 32"
8
+ fill="none"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ >
11
+ <circle
12
+ cx="16"
13
+ cy="16"
14
+ r="14.5"
15
+ data-testid="background-circle"
16
+ stroke="currentColor"
17
+ :class="backgroundClass"
18
+ stroke-width="3"
8
19
  fill="none"
9
- xmlns="http://www.w3.org/2000/svg"
10
- >
11
- <circle
12
- cx="16"
13
- cy="16"
14
- r="14.5"
15
- data-testid="background-circle"
16
- stroke="currentColor"
17
- :class="backgroundClass"
18
- stroke-width="3"
19
- fill="none"
20
- />
21
- <circle
22
- cx="16"
23
- cy="16"
24
- r="14.5"
25
- data-testid="arc-circle"
26
- stroke="currentColor"
27
- :class="arcClass"
28
- stroke-width="3"
29
- fill="none"
30
- stroke-dasharray="22.78 68.33"
31
- stroke-linecap="square"
32
- />
33
- </svg>
34
- </div>
20
+ />
21
+ <circle
22
+ cx="16"
23
+ cy="16"
24
+ r="14.5"
25
+ data-testid="arc-circle"
26
+ stroke="currentColor"
27
+ :class="arcClass"
28
+ stroke-width="3"
29
+ fill="none"
30
+ stroke-dasharray="22.78 68.33"
31
+ stroke-linecap="square"
32
+ />
33
+ </svg>
35
34
  </template>
36
35
 
37
36
  <script setup lang="ts">