@youcan/celeste 0.6.53 → 0.6.55

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 (43) hide show
  1. package/dist/celeste.css +874 -1348
  2. package/dist/cjs/chunks/index2.js +28 -0
  3. package/dist/cjs/color-picker.js +6 -4
  4. package/dist/cjs/color-swatch.js +3 -3
  5. package/dist/cjs/file-upload-area.js +280 -0
  6. package/dist/cjs/index.js +15 -9
  7. package/dist/components/color-picker/color-picker.d.ts +2 -0
  8. package/dist/components/color-picker/color-swatch.d.ts +1 -2
  9. package/dist/components/combobox/combobox-list.d.ts +1 -1
  10. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +2 -2
  11. package/dist/components/file-upload/file-upload-area.d.ts +43 -0
  12. package/dist/components/file-upload/index.d.ts +2 -0
  13. package/dist/components/index.d.ts +1 -1
  14. package/dist/components/popover/popover-content.d.ts +2 -2
  15. package/dist/es/chunks/index2.js +30 -2
  16. package/dist/es/color-picker.js +6 -4
  17. package/dist/es/color-swatch.js +3 -3
  18. package/dist/es/file-upload-area.js +281 -0
  19. package/dist/es/index.js +66 -60
  20. package/package.json +9 -9
  21. package/src/components/color-picker/color-picker.vue +4 -0
  22. package/src/components/color-picker/color-swatch.vue +1 -2
  23. package/src/components/file-upload/file-upload-area.vue +229 -0
  24. package/src/components/file-upload/index.ts +2 -0
  25. package/src/components/file-upload/stories/file-upload-area.stories.ts +76 -0
  26. package/src/components/index.ts +1 -1
  27. package/dist/cjs/context-menu-item.js +0 -134
  28. package/dist/cjs/dropdown-item.js +0 -99
  29. package/dist/cjs/dropdown.js +0 -290
  30. package/dist/components/dropdown/context-menu-item.d.ts +0 -39
  31. package/dist/components/dropdown/dropdown-item.d.ts +0 -30
  32. package/dist/components/dropdown/dropdown.d.ts +0 -55
  33. package/dist/components/dropdown/index.d.ts +0 -6
  34. package/dist/es/context-menu-item.js +0 -135
  35. package/dist/es/dropdown-item.js +0 -100
  36. package/dist/es/dropdown.js +0 -291
  37. package/src/components/dropdown/context-menu-item.vue +0 -317
  38. package/src/components/dropdown/dropdown-item.vue +0 -184
  39. package/src/components/dropdown/dropdown.vue +0 -650
  40. package/src/components/dropdown/index.ts +0 -8
  41. package/src/components/dropdown/stories/context-menu-item.stories.ts +0 -51
  42. package/src/components/dropdown/stories/dropdown-item.stories.ts +0 -33
  43. package/src/components/dropdown/stories/dropdown.stories.ts +0 -53
@@ -1,650 +0,0 @@
1
- <script setup lang="ts">
2
- import type { BadgeProps } from '../badge/badge.vue';
3
- import clsx from 'clsx';
4
- import { ComboboxAnchor, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxRoot, ComboboxSeparator, ComboboxTrigger, ComboboxViewport } from 'radix-vue';
5
- import { computed, ref, watch } from 'vue';
6
- import Badge from '../badge/badge.vue';
7
- import TextInput from '../text-input/text-input.vue';
8
- import DropdownItem from './dropdown-item.vue';
9
-
10
- const props = withDefaults(defineProps<Dropdown>(), {
11
- disabled: false,
12
- placeholder: 'Placeholder',
13
- size: 'sm',
14
- type: 'normal',
15
- multiple: false,
16
- searchable: false,
17
- emptyLabel: 'No options available',
18
- position: 'bottom',
19
- align: 'start',
20
- });
21
-
22
- const model = defineModel<SelectedType | SelectedType[] | undefined>();
23
-
24
- const searched = ref<string>('');
25
- const isSearchedFocused = ref(false);
26
- const isOpen = ref<boolean>(false);
27
-
28
- function toggleDropdown() {
29
- isOpen.value = true;
30
- // reset focused index when opening
31
- focusedItemIndex.value = -1;
32
- }
33
-
34
- // Filter options based on search input
35
- const filteredOptions = computed(() => {
36
- if (!props.searchable || !searched.value)
37
- return props.options;
38
- return props.options.filter(option =>
39
- option.label.toLowerCase().includes(searched.value.toLowerCase()),
40
- );
41
- });
42
-
43
- // Check if an option is selected
44
- function optionIsSelected(option: SelectedType): boolean {
45
- if (!props.multiple) {
46
- return model.value && !Array.isArray(model.value)
47
- ? option.value === model.value.value
48
- : false;
49
- }
50
-
51
- return Array.isArray(model.value)
52
- ? model.value.some(selectedOption => selectedOption.value === option.value)
53
- : false;
54
- }
55
-
56
- function toggleSelection(isSelected: boolean, option: SelectedType) {
57
- if (props.multiple && Array.isArray(model.value)) {
58
- model.value = isSelected
59
- ? model.value.filter(o => o.value !== option.value)
60
- : [...model.value, option];
61
-
62
- return;
63
- }
64
-
65
- model.value = isSelected ? undefined : option;
66
- }
67
-
68
- const mergedBadgeProps = computed(() => ({
69
- ...props.badgeProps,
70
- disabled: props.disabled,
71
- }));
72
-
73
- const focusedItemIndex = ref<number>(-1);
74
-
75
- // Add keydown handler for arrow navigation
76
- function handleKeydown(event: KeyboardEvent) {
77
- if (!isOpen.value)
78
- return;
79
-
80
- switch (event.key) {
81
- case 'ArrowDown':
82
- event.preventDefault();
83
- if (focusedItemIndex.value < filteredOptions.value.length - 1) {
84
- focusedItemIndex.value++;
85
- }
86
- else {
87
- focusedItemIndex.value = 0;
88
- }
89
- break;
90
- case 'ArrowUp':
91
- event.preventDefault();
92
- if (focusedItemIndex.value > 0) {
93
- focusedItemIndex.value--;
94
- }
95
- else {
96
- focusedItemIndex.value = filteredOptions.value.length - 1;
97
- }
98
-
99
- break;
100
- case 'Enter':
101
- event.preventDefault();
102
- if (focusedItemIndex.value >= 0 && focusedItemIndex.value < filteredOptions.value.length) {
103
- const option = filteredOptions.value[focusedItemIndex.value];
104
- toggleSelection(optionIsSelected(option), option);
105
- }
106
- break;
107
- }
108
- }
109
-
110
- // Watch for changes in filtered options to reset focus if needed
111
- watch(filteredOptions, () => {
112
- if (focusedItemIndex.value >= filteredOptions.value.length) {
113
- focusedItemIndex.value = filteredOptions.value.length - 1;
114
- }
115
- });
116
- </script>
117
-
118
- <script lang="ts">
119
- export interface Dropdown {
120
- disabled?: boolean;
121
- icon?: string;
122
- placeholder: string;
123
- error?: boolean;
124
- size?: 'xs' | 'sm' | 'md';
125
- type?: 'normal' | 'compact' | 'inline' | 'compact-input';
126
- position?: 'top' | 'bottom';
127
- align?: 'start' | 'end' | 'center';
128
- multiple?: boolean;
129
- emptyLabel?: string;
130
- searchable?: boolean;
131
- options: SelectedType[];
132
- badgeProps?: BadgeProps;
133
- }
134
-
135
- export interface SelectedType {
136
- value: any;
137
- label: string;
138
- icon?: string;
139
- image?: string;
140
- [key: string]: any;
141
- }
142
- </script>
143
-
144
- <template>
145
- <div
146
- class="celeste-dropdown-wrapper"
147
- tabindex="0"
148
- @keydown.enter="toggleDropdown"
149
- @keydown.space="toggleDropdown"
150
- >
151
- <ComboboxRoot
152
- v-model="model"
153
- :open="isOpen"
154
- :disabled="disabled"
155
- :multiple="props.multiple"
156
- class="celeste-dropdown-root"
157
- :display-value="(v) => v.label"
158
- @update:open="(val) => isOpen = val"
159
- @keydown="handleKeydown"
160
- >
161
- <ComboboxAnchor tabindex="0">
162
- <ComboboxTrigger
163
- :class="clsx(
164
- 'celeste-dropdown-anchor-trigger',
165
- `celeste-dropdown-anchor-trigger-size-${props.size}`,
166
- `celeste-dropdown-anchor-trigger-type-${props.type}`,
167
- { 'celeste-dropdown-anchor-trigger-error': props.error },
168
- { 'celeste-dropdown-anchor-trigger-disabled': props.disabled },
169
- { 'celeste-dropdown-anchor-trigger-filled': model },
170
- { 'celeste-dropdown-anchor-trigger-focused': isOpen },
171
- )"
172
- as="div"
173
- :disabled="disabled"
174
- >
175
- <div class="celeste-dropdown-anchor-trigger-prefix">
176
- <div v-if="model && !Array.isArray(model)" class="celeste-dropdown-anchor-trigger-prefix-selected">
177
- <i v-if="model.icon" :class="model.icon" />
178
- <div v-if="model.image">
179
- <slot name="image" v-bind="{ model }">
180
- <img
181
- :src="model.image"
182
- alt="Selected option"
183
- class="selected-dropdown-image"
184
- >
185
- </slot>
186
- </div>
187
- </div>
188
- <slot
189
- v-else
190
- name="prefix"
191
- class="celeste-dropdown-anchor-trigger-prefix-default"
192
- />
193
- </div>
194
- <div
195
- v-if="type !== 'inline'"
196
- class="celeste-dropdown-input"
197
- >
198
- <span v-if="multiple">{{ placeholder }}</span>
199
- <span v-else>
200
- {{ model && !Array.isArray(model) ? model.label : props.placeholder }}
201
- </span>
202
- <span v-if="mergedBadgeProps" class="celeste-input-badge">
203
- <Badge v-bind="mergedBadgeProps" />
204
- </span>
205
- </div>
206
- <div class="celeste-dropdown-trigger">
207
- <i class="i-celeste-arrow-down-s-line" />
208
- </div>
209
- </ComboboxTrigger>
210
- </ComboboxAnchor>
211
-
212
- <ComboboxContent
213
- v-if="!disabled"
214
- dismissable
215
- :avoid-collisions="true"
216
- class="celeste-dropdown-content"
217
- :class="clsx(
218
- 'celeste-dropdown-content',
219
- `celeste-dropdown-content-size-${position}`,
220
- `celeste-dropdown-content-align-${align}`,
221
- )"
222
- >
223
- <ComboboxViewport class="celeste-dropdown-items-viewport">
224
- <div v-if="searchable" class="celeste-dropdown-search">
225
- <TextInput
226
- v-model="searched"
227
- type="search"
228
- size="sm"
229
- placeholder="Search"
230
- @focus="isSearchedFocused = true"
231
- @blur="isSearchedFocused = false"
232
- >
233
- <template #prefix>
234
- <i class="i-celeste-search-2-line" />
235
- </template>
236
- <template v-if="isSearchedFocused" #suffix>
237
- <div
238
- @click="() => searched = ''"
239
- >
240
- <i class="i-celeste-close-line" />
241
- </div>
242
- </template>
243
- </TextInput>
244
- <ComboboxSeparator class="celeste-dropdown-separator" />
245
- </div>
246
- <ComboboxEmpty class="celeste-dropdown-empty-list" />
247
-
248
- <ComboboxGroup class="celeste-dropdown-items-group">
249
- <ComboboxItem
250
- v-for="option, index in filteredOptions"
251
- :key="option.value"
252
- :value="option"
253
- :disabled="disabled"
254
- class="celeste-dropdown-item"
255
- tabindex="0"
256
- >
257
- <DropdownItem
258
- :label="option.label"
259
- :checkbox="props.multiple"
260
- :selected="optionIsSelected(option)"
261
- :disabled="props.disabled"
262
- :focused="index === focusedItemIndex"
263
- >
264
- <template #prefix>
265
- <i v-if="option.icon" :class="option.icon" />
266
- <img
267
- v-if="option.image"
268
- :src="option.image"
269
- alt="option"
270
- class="celeste-dropdown-item-image"
271
- >
272
- </template>
273
- </DropdownItem>
274
- <ComboboxSeparator />
275
- </ComboboxItem>
276
- </ComboboxGroup>
277
- </ComboboxViewport>
278
- </ComboboxContent>
279
- </ComboboxRoot>
280
- </div>
281
- </template>
282
-
283
- <style lang="scss" scoped>
284
- @use 'sass:map';
285
-
286
- @mixin icon-size {
287
- width: 20px;
288
- height: 20px;
289
- }
290
-
291
- @mixin transition-default {
292
- transition-property: background-color, transform, opacity;
293
- transition-duration: var(--animation-fast);
294
- transition-timing-function: ease-out;
295
- }
296
-
297
- * {
298
- box-sizing: border-box;
299
- }
300
-
301
- .celeste-dropdown-wrapper {
302
- --dropdown-width: 100%;
303
- --dropdown-height: 300px;
304
-
305
- position: relative;
306
-
307
- &:focus,
308
- &:focus-visible,
309
- &:focus-within {
310
- border: none;
311
- outline: none;
312
- }
313
-
314
- &:deep(.celeste-dropdown-root) {
315
- display: flex;
316
- position: relative;
317
- flex-direction: column;
318
- width: fit-content;
319
- padding-top: var(--spacing-4);
320
- gap: var(--spacing-10);
321
- }
322
-
323
- .celeste-dropdown-anchor-trigger {
324
- @include transition-default;
325
-
326
- display: flex;
327
- align-items: center;
328
- border: 1px solid var(--color-stroke-soft-200);
329
- background-color: var(--color-bg-white-0);
330
- box-shadow: var(--shadow-regular-xs);
331
- gap: var(--spacing-8);
332
- cursor: pointer;
333
-
334
- :deep(i) {
335
- @include icon-size;
336
-
337
- color: var(--color-icon-soft-400);
338
- }
339
-
340
- &:focus,
341
- &:focus-visible,
342
- &:focus-within {
343
- outline: none;
344
- }
345
-
346
- .celeste-dropdown-anchor-trigger-prefix {
347
- display: flex;
348
- align-items: center;
349
- justify-content: center;
350
-
351
- &-selected {
352
- display: flex;
353
- align-items: center;
354
- justify-content: center;
355
- }
356
- }
357
-
358
- .celeste-dropdown-input {
359
- display: flex;
360
- flex: 1 0 0;
361
- align-items: center;
362
- justify-content: space-between;
363
- background: inherit;
364
- color: var(--color-text-sub-600);
365
- font: var(--paragraph-sm);
366
- cursor: pointer;
367
- gap: var(--spacing-8);
368
- }
369
-
370
- .celeste-dropdown-trigger {
371
- @include transition-default;
372
-
373
- display: flex;
374
- place-items: center center;
375
- border: none;
376
- background: none;
377
- color: var(--color-icon-soft-400);
378
- cursor: pointer;
379
- }
380
-
381
- &[data-state='open']:not([data-disabled]) {
382
- :deep(.celeste-dropdown-trigger) {
383
- transform: rotate(180deg);
384
- }
385
- }
386
-
387
- &:hover {
388
- background: var(--color-bg-weak-50);
389
- }
390
-
391
- &-error:not(.celeste-dropdown-anchor-trigger-type-compact) {
392
- border: 1px solid var(--color-state-error-base);
393
- }
394
-
395
- &-disabled {
396
- background: var(--color-bg-weak-50);
397
- color: var(--color-text-disabled-300);
398
- cursor: not-allowed;
399
-
400
- .celeste-dropdown-input {
401
- color: var(--color-text-disabled-300);
402
- cursor: not-allowed;
403
- }
404
-
405
- &:deep(i),
406
- .celeste-dropdown-trigger {
407
- color: var(--color-icon-disabled-300);
408
- cursor: not-allowed;
409
- }
410
- }
411
-
412
- &-focused:not(.celeste-dropdown-anchor-trigger-disabled, .celeste-dropdown-anchor-trigger-type-compact) {
413
- border: 1px solid var(--color-stroke-strong-950);
414
- box-shadow: var(--shadow-buttons-important-focus);
415
- color: var(--color-text-strong-950);
416
-
417
- .celeste-dropdown-input {
418
- color: var(--color-text-strong-950);
419
- }
420
-
421
- i {
422
- color: var(--color-icon-strong-950);
423
- }
424
- }
425
-
426
- &-filled {
427
- color: var(--color-text-strong-950);
428
- }
429
-
430
- &.celeste-dropdown-anchor-trigger-type-compact {
431
- width: fit-content;
432
- border: none;
433
- background: transparent;
434
- box-shadow: none;
435
-
436
- &:deep(.celeste-dropdown-input) {
437
- flex: inherit;
438
- }
439
-
440
- &:hover:not(.celeste-dropdown-anchor-trigger-disabled),
441
- &.celeste-dropdown-anchor-trigger-focused:not(.celeste-dropdown-anchor-trigger-disabled) {
442
- .celeste-dropdown-input {
443
- color: var(--color-text-strong-950);
444
- }
445
-
446
- &:deep(i) {
447
- color: var(--color-icon-strong-950);
448
- }
449
- }
450
- }
451
-
452
- &.celeste-dropdown-anchor-trigger-type-compact-input {
453
- width: fit-content;
454
- border: none;
455
- border-radius: 0;
456
- box-shadow: none;
457
-
458
- &:deep(.celeste-dropdown-input) {
459
- flex: inherit;
460
- }
461
-
462
- &.celeste-dropdown-anchor-trigger-focused {
463
- box-shadow: none;
464
- }
465
- }
466
-
467
- &.celeste-dropdown-anchor-trigger-type-inline {
468
- width: fit-content;
469
- gap: var(--spacing-4);
470
-
471
- &:deep(.celeste-dropdown-input) {
472
- flex: inherit;
473
- }
474
- }
475
-
476
- &.celeste-dropdown-anchor-trigger-type-normal {
477
- min-width: 300px;
478
- }
479
-
480
- $sizes-map: (
481
- 'xs': (
482
- 'padding': var(--spacing-6),
483
- 'border-radius': var(--radius-8),
484
- 'height': 32px,
485
- ),
486
- 'sm': (
487
- 'padding': var(--spacing-8),
488
- 'border-radius': var(--radius-8),
489
- 'height': 36px,
490
- ),
491
- 'md': (
492
- 'padding': var(--spacing-10),
493
- 'border-radius': var(--radius-10),
494
- 'height': 40px,
495
- ),
496
- );
497
-
498
- @each $size, $values in $sizes-map {
499
- &-size-#{$size} {
500
- height: map.get($values, 'height');
501
- padding: map.get($values, 'padding');
502
- border-radius: map.get($values, 'border-radius');
503
- }
504
- }
505
- }
506
-
507
- .celeste-dropdown-content {
508
- @include transition-default;
509
-
510
- display: flex;
511
- position: absolute;
512
- z-index: 9999;
513
- flex-direction: column;
514
- width: var(--dropdown-width);
515
- min-width: 300px;
516
- max-height: var(--dropdown-height);
517
- margin-top: var(--spacing-10);
518
- padding: var(--spacing-8);
519
- overflow: hidden;
520
- border: 1px solid var(--color-stroke-soft-200);
521
- border-radius: var(--radius-16);
522
- background-color: var(--color-bg-white-0);
523
- box-shadow: var(--shadow-regular-md);
524
- gap: var(--spacing-4);
525
-
526
- &[data-state='closed'] {
527
- transform: translateY(10px);
528
- opacity: 0;
529
- pointer-events: none;
530
- }
531
-
532
- &[data-state='open'] {
533
- transform: translateY(0);
534
- opacity: 1;
535
- }
536
- }
537
-
538
- .celeste-dropdown-content-size-top {
539
- bottom: calc(var(--dropdown-width) + var(--spacing-4));
540
- }
541
-
542
- .celeste-dropdown-content-size-bottom {
543
- top: calc(var(--dropdown-width) + var(--spacing-4));
544
- }
545
-
546
- .celeste-dropdown-content-align-start {
547
- left: 0;
548
- }
549
-
550
- .celeste-dropdown-content-align-end {
551
- right: 0;
552
- }
553
-
554
- :not(:has(.celeste-dropdown-anchor-trigger-type-normal)) {
555
- .celeste-dropdown-content-align-center {
556
- left: 50%;
557
- transform: translateX(-50%);
558
- }
559
- }
560
-
561
- &:deep(.celeste-input-wrapper .celeste-input-prefix) {
562
- @include icon-size;
563
-
564
- display: flex;
565
- align-items: center;
566
- justify-content: center;
567
- border: none;
568
- background: none;
569
- color: var(--color-icon-sub-600);
570
- }
571
-
572
- &:deep(.celeste-input-wrapper) {
573
- border: none;
574
- border-radius: 0;
575
- box-shadow: none;
576
- }
577
-
578
- &:deep(.celeste-input-wrapper:focus-within) {
579
- border: none;
580
- box-shadow: none;
581
- }
582
-
583
- &:deep(.celeste-dropdown-items-viewport) {
584
- display: flex;
585
- position: relative;
586
- flex-direction: column;
587
- gap: var(--spacing-4);
588
- }
589
-
590
- .celeste-dropdown-empty-list {
591
- display: flex;
592
- align-items: center;
593
- padding: var(--spacing-8);
594
- color: var(--color-text-sub-600);
595
- font: var(--paragraph-sm);
596
- }
597
-
598
- &:deep(.celeste-input-wrapper .celeste-input-suffix) {
599
- div {
600
- display: flex;
601
- align-items: center;
602
- justify-content: center;
603
- }
604
-
605
- cursor: pointer;
606
-
607
- &:deep(i) {
608
- @include icon-size;
609
-
610
- color: var(--color-icon-soft-400);
611
- }
612
- }
613
-
614
- .celeste-dropdown-search {
615
- display: flex;
616
- position: sticky;
617
- top: 0;
618
- flex-direction: column;
619
- gap: var(--spacing-4);
620
-
621
- &:deep(.celeste-input-wrapper-type-search) {
622
- border-top-left-radius: var(--radius-8);
623
- border-top-right-radius: var(--radius-8);
624
- }
625
- }
626
-
627
- .celeste-dropdown-separator {
628
- width: 100%;
629
- height: 1px;
630
- background-color: var(--color-stroke-soft-200);
631
- }
632
-
633
- .celeste-dropdown-items-group {
634
- display: flex;
635
- flex-direction: column;
636
- gap: var(--spacing-4);
637
- }
638
-
639
- .celeste-dropdown-item-image,
640
- .selected-dropdown-image {
641
- @include icon-size;
642
-
643
- display: flex;
644
- align-items: center;
645
- justify-content: center;
646
- object-fit: cover;
647
- border-radius: var(--radius-full);
648
- }
649
- }
650
- </style>
@@ -1,8 +0,0 @@
1
- export * from './context-menu-item.vue';
2
- export { default as ContextMenuItem } from './context-menu-item.vue';
3
-
4
- export * from './dropdown-item.vue';
5
- export { default as DropdownItem } from './dropdown-item.vue';
6
-
7
- export * from './dropdown.vue';
8
- export { default as Dropdown } from './dropdown.vue';
@@ -1,51 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
- import { ref } from 'vue';
3
- import ContextMenuItem from '../context-menu-item.vue';
4
-
5
- const meta: Meta<typeof ContextMenuItem> = {
6
- title: 'Components/Context Menu Item',
7
- component: ContextMenuItem,
8
- };
9
-
10
- export default meta;
11
-
12
- type Story = StoryObj<typeof ContextMenuItem>;
13
-
14
- export const Default: Story = {
15
- args: {
16
- label: 'Label',
17
- sublabel: '(Sublabel)',
18
- description: 'Descriptions',
19
- size: 'lg',
20
- badgeProps: {
21
- size: 'md',
22
- variant: 'light',
23
- label: 'Badge',
24
- state: 'information',
25
- type: 'basic',
26
- },
27
- buttonProps: {
28
- intent: 'primary',
29
- },
30
- shortcut: '⌘ ⇧ Z',
31
- rightIcon: 'i-celeste-arrow-right-s-line',
32
- },
33
-
34
- render: args => ({
35
- components: { ContextMenuItem },
36
- setup() {
37
- const selected = ref(false);
38
- return { args, selected };
39
- },
40
- template: `
41
- <ContextMenuItem v-bind="args" v-model:selected="selected">
42
- <template #prefix>
43
- <i class="i-celeste-global-line" />
44
- </template>
45
- <template #button-label>
46
- Button
47
- </template>
48
- </ContextMenuItem>
49
- `,
50
- }),
51
- };