srcdev-nuxt-components 5.0.3 → 6.0.0

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 (75) hide show
  1. package/README.md +0 -8
  2. package/nuxt.config.ts +5 -2
  3. package/package.json +11 -12
  4. package/assets/styles/extends-layer/srcdev-components/display-prompt-core/index.css +0 -70
  5. package/assets/styles/extends-layer/srcdev-components/index.css +0 -2
  6. package/assets/styles/extends-layer/srcdev-components/themes/_error.css +0 -15
  7. package/assets/styles/extends-layer/srcdev-components/themes/_info.css +0 -15
  8. package/assets/styles/extends-layer/srcdev-components/themes/_success.css +0 -15
  9. package/assets/styles/extends-layer/srcdev-components/themes/_warning.css +0 -15
  10. package/assets/styles/extends-layer/srcdev-components/themes/index.css +0 -4
  11. package/assets/styles/main.css +0 -2
  12. package/assets/styles/setup/_head.css +0 -5
  13. package/assets/styles/setup/a11y/_utils.css +0 -20
  14. package/assets/styles/setup/a11y/_variables.css +0 -10
  15. package/assets/styles/setup/a11y/index.css +0 -2
  16. package/assets/styles/setup/index.css +0 -5
  17. package/assets/styles/setup/typography/index.css +0 -2
  18. package/assets/styles/setup/typography/utility-classes/_generic-font-classes.css +0 -192
  19. package/assets/styles/setup/typography/utility-classes/_generic-font-variation-settings.css +0 -29
  20. package/assets/styles/setup/typography/utility-classes/_generic-font-weights.css +0 -41
  21. package/assets/styles/setup/typography/utility-classes/index.css +0 -3
  22. package/assets/styles/setup/typography/vars/_reponsive-font-sizes.css +0 -10
  23. package/assets/styles/setup/typography/vars/index.css +0 -1
  24. package/assets/styles/setup/utility-classes/_margin-helpers.css +0 -334
  25. package/assets/styles/setup/utility-classes/_padding-helpers.css +0 -308
  26. package/assets/styles/setup/utility-classes/_page.css +0 -50
  27. package/assets/styles/setup/utility-classes/index.css +0 -3
  28. package/assets/styles/setup/variables/colors/_blue.css +0 -15
  29. package/assets/styles/setup/variables/colors/_gray.css +0 -16
  30. package/assets/styles/setup/variables/colors/_green.css +0 -15
  31. package/assets/styles/setup/variables/colors/_orange.css +0 -15
  32. package/assets/styles/setup/variables/colors/_red.css +0 -15
  33. package/assets/styles/setup/variables/colors/_yellow.css +0 -15
  34. package/assets/styles/setup/variables/colors/index.css +0 -6
  35. package/assets/styles/setup/variables/index.css +0 -1
  36. package/components/accordian/AccordianCore.vue +0 -46
  37. package/components/animated-svg-text/AnimatedSvgText.vue +0 -87
  38. package/components/canvas-switcher/CanvasSwitcher.vue +0 -77
  39. package/components/carousel-basic/CarouselBasic.vue +0 -291
  40. package/components/carousel-basic/CarouselFlip.vue +0 -461
  41. package/components/carousel-basic/CarouselInfinite.vue +0 -325
  42. package/components/clip-element/ClipElement.vue +0 -73
  43. package/components/clipped-panels/ClippedPanel.vue +0 -73
  44. package/components/container-glow/ContainerGlowCore.vue +0 -211
  45. package/components/content-grid/ContentGrid.vue +0 -85
  46. package/components/deep-expanding-menu/DeepExpandingMenu.vue +0 -214
  47. package/components/deep-expanding-menu/DeepExpandingMenuOld.vue +0 -218
  48. package/components/display-banner/DisplayBanner.vue +0 -63
  49. package/components/display-details/DisplayDetailsCore.vue +0 -301
  50. package/components/display-dialog/DisplayDialogCore.vue +0 -255
  51. package/components/display-dialog/variants/DisplayDialogConfirm.vue +0 -45
  52. package/components/display-dialog/variants/DisplayDialogScrollableContent.vue +0 -49
  53. package/components/display-grid/DisplayGridCore.vue +0 -22
  54. package/components/display-prompt/DisplayPromptCore.vue +0 -187
  55. package/components/display-prompt/variants/DisplayPromptError.vue +0 -53
  56. package/components/expanding-panel/ExpandingPanel.vue +0 -124
  57. package/components/image-galleries/SliderGallery.vue +0 -784
  58. package/components/layout-grids/LayoutGridA.vue +0 -103
  59. package/components/layout-grids/LayoutGridB.vue +0 -132
  60. package/components/layout-row/LayoutRow.vue +0 -165
  61. package/components/masonry-grid/MasonryGrid.vue +0 -62
  62. package/components/masonry-grid-ordered/MasonryGridOrdered.vue +0 -158
  63. package/components/masonry-grid-sorted/MasonryGridSorted.vue +0 -115
  64. package/components/pop-over/PopOver.vue +0 -88
  65. package/components/responsive-header/NavigationItems.vue +0 -169
  66. package/components/responsive-header/ResponsiveHeader.vue +0 -686
  67. package/components/rotating-carousel/RotatingCarouselImage.vue +0 -200
  68. package/components/skip-links/SkipLinks.vue +0 -92
  69. package/components/tabs/TabsCore.vue +0 -277
  70. package/composables/useDialogControls.ts +0 -44
  71. package/composables/useStyleClassPassthrough.ts +0 -35
  72. package/composables/useTabs.ts +0 -201
  73. package/types/gallery-data.ts +0 -13
  74. package/types/responsiveHeader.ts +0 -38
  75. package/types/types.carousel-basic.ts +0 -19
@@ -1,301 +0,0 @@
1
- <template>
2
- <details @click.prevent="handleClick()" :name="name" class="display-details" :class="[elementClasses]" ref="detailsRef">
3
- <summary class="display-details-summary" :id="triggerId" :aria-controls="contentId" ref="summaryRef">
4
- <span class="label">
5
- <slot name="summary"></slot>
6
- </span>
7
- <slot name="summaryIcon">
8
- <Icon name="bi:caret-down-fill" class="icon mi-12" :class="iconSize" />
9
- </slot>
10
- </summary>
11
- <div class="display-details-content" :aria-labelledby="triggerId" :id="contentId" role="region" ref="contentRef">
12
- <slot name="content"></slot>
13
- </div>
14
- </details>
15
- </template>
16
-
17
- <script lang="ts">
18
- // Create a global store to track open details elements by name
19
- const openDetailsByName = reactive(new Map<string, HTMLDetailsElement>());
20
-
21
- export const useDetailsTransition = (
22
- detailsRef: Ref<HTMLDetailsElement | null>,
23
- summaryRef: Ref<HTMLElement | null>,
24
- contentRef: Ref<HTMLDivElement | null>,
25
- name: string,
26
- animationDuration: number
27
- ) => {
28
- // State
29
- const animation = ref<Animation | null>(null);
30
- const isClosing = ref(false);
31
- const isExpanding = ref(false);
32
-
33
- // Check if refs are available
34
- if (!detailsRef.value || !summaryRef.value || !contentRef.value) {
35
- console.warn('Details, summary, or content ref is null');
36
- return {
37
- clickAction: () => console.warn('Component not fully initialized'),
38
- };
39
- }
40
-
41
- const closeOtherDetailsWithSameName = () => {
42
- const currentDetails = detailsRef.value;
43
- if (!currentDetails || !name) return;
44
-
45
- // Get the currently open details with the same name
46
- const openDetails = openDetailsByName.get(name);
47
-
48
- // If there's an open details with the same name and it's not the current one, close it
49
- if (openDetails && openDetails !== currentDetails && openDetails.open) {
50
- // Simulate a click on the other details to close it with animation
51
- const otherSummary = openDetails.querySelector('summary');
52
- if (otherSummary) {
53
- otherSummary.click();
54
- } else {
55
- // Fallback: close directly without animation
56
- openDetails.open = false;
57
- }
58
- }
59
-
60
- // Update the map with the current details if it's open
61
- if (currentDetails.open) {
62
- openDetailsByName.set(name, currentDetails);
63
- } else {
64
- // If it's closed and was the one in the map, remove it
65
- if (openDetailsByName.get(name) === currentDetails) {
66
- openDetailsByName.delete(name);
67
- }
68
- }
69
- };
70
-
71
- const clickAction = () => {
72
- const details = detailsRef.value;
73
- const summary = summaryRef.value;
74
- const content = contentRef.value;
75
-
76
- if (!details || !summary || !content) return;
77
-
78
- // Add overflow hidden to avoid content jumping
79
- details.style.overflow = 'hidden';
80
-
81
- if (isClosing.value || !details.open) {
82
- // Close other details with the same name first
83
- closeOtherDetailsWithSameName();
84
-
85
- // Open the details
86
- details.open = true;
87
- isExpanding.value = true;
88
- isClosing.value = false;
89
-
90
- // Get the height of the content
91
- const detailsHeight = details.offsetHeight;
92
- const contentHeight = content.offsetHeight;
93
- const summaryHeight = summary.offsetHeight;
94
-
95
- const startHeight = `${detailsHeight - contentHeight}px`;
96
- const endHeight = `${summaryHeight + contentHeight}px`;
97
-
98
- // If there's an animation running, cancel it
99
- if (animation.value) {
100
- animation.value.cancel();
101
- }
102
-
103
- // Start animation
104
- animation.value = details.animate(
105
- {
106
- height: [startHeight, endHeight],
107
- },
108
- {
109
- duration: animationDuration,
110
- easing: 'linear',
111
- }
112
- );
113
-
114
- animation.value.onfinish = () => {
115
- // Animation finished - reset everything
116
- details.style.height = 'auto';
117
- details.style.overflow = '';
118
- isExpanding.value = false;
119
- animation.value = null;
120
-
121
- // Register this as the open details for this name
122
- openDetailsByName.set(name, details);
123
- };
124
-
125
- animation.value.oncancel = () => {
126
- isExpanding.value = false;
127
- };
128
- } else if (isExpanding.value || details.open) {
129
- // Close the details
130
- isClosing.value = true;
131
- isExpanding.value = false;
132
-
133
- // Get the height of the content
134
- const startHeight = `${details.offsetHeight}px`;
135
- const endHeight = `${details.offsetHeight - content.offsetHeight}px`;
136
-
137
- // If there's an animation running, cancel it
138
- if (animation.value) {
139
- animation.value.cancel();
140
- }
141
-
142
- // Start animation
143
- animation.value = details.animate(
144
- {
145
- height: [startHeight, endHeight],
146
- },
147
- {
148
- duration: animationDuration,
149
- easing: 'linear',
150
- }
151
- );
152
-
153
- animation.value.onfinish = () => {
154
- // Animation finished - reset everything
155
- details.open = false;
156
- details.style.height = 'auto';
157
- details.style.overflow = '';
158
- isClosing.value = false;
159
- animation.value = null;
160
-
161
- // Remove this from the open details map if it's there
162
- if (openDetailsByName.get(name) === details) {
163
- openDetailsByName.delete(name);
164
- }
165
- };
166
-
167
- animation.value.oncancel = () => {
168
- isClosing.value = false;
169
- };
170
- }
171
- };
172
-
173
- return {
174
- clickAction,
175
- isClosing,
176
- isExpanding,
177
- };
178
- };
179
- </script>
180
-
181
- <script setup lang="ts">
182
- const props = defineProps({
183
- name: {
184
- type: String,
185
- required: true,
186
- },
187
- id: {
188
- type: String,
189
- required: true,
190
- },
191
- animationDuration: {
192
- type: Number,
193
- default: 400,
194
- },
195
- iconSize: {
196
- type: String,
197
- default: 'small',
198
- validator(value: string) {
199
- return ['small', 'medium', 'large'].includes(value);
200
- },
201
- },
202
- styleClassPassthrough: {
203
- type: Array as PropType<string[]>,
204
- default: () => [],
205
- },
206
- });
207
-
208
- const triggerId = computed(() => `${props.id}-trigger`);
209
- const contentId = computed(() => `${props.id}-content`);
210
-
211
- const { elementClasses, resetElementClasses, updateElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
212
-
213
- updateElementClasses([props.iconSize]);
214
-
215
- const detailsRef = ref<HTMLDetailsElement | null>(null);
216
- const summaryRef = ref<HTMLElement | null>(null);
217
- const contentRef = ref<HTMLDivElement | null>(null);
218
-
219
- // Initialize with dummy function that will be replaced when refs are available
220
- let clickAction = () => console.warn('Component not fully initialized');
221
-
222
- // Handle click with the current clickAction function
223
- const handleClick = () => {
224
- clickAction();
225
- };
226
-
227
- watch(
228
- () => props.styleClassPassthrough,
229
- () => {
230
- resetElementClasses(props.styleClassPassthrough);
231
- }
232
- );
233
-
234
- onMounted(() => {
235
- // Initialize the composable once the component is mounted and refs are available
236
- if (detailsRef.value && contentRef.value && summaryRef.value) {
237
- const details = useDetailsTransition(detailsRef, summaryRef, contentRef, props.name, props.animationDuration);
238
- clickAction = details.clickAction; // Assign the real click handler
239
- } else {
240
- console.error('Refs not available after mounting');
241
- }
242
- });
243
- </script>
244
-
245
- <style lang="css">
246
- .display-details {
247
- border: none;
248
- outline: none;
249
- box-shadow: none;
250
- border-radius: 0;
251
-
252
- &[open] {
253
- .display-details-summary {
254
- .icon {
255
- transform: scaleY(-1);
256
- }
257
- }
258
- }
259
-
260
- .display-details-summary {
261
- display: flex;
262
- align-items: center;
263
- justify-content: space-between;
264
- flex-direction: row;
265
- gap: 0;
266
-
267
- list-style: none;
268
-
269
- &::-webkit-details-marker,
270
- &::marker {
271
- display: none;
272
- }
273
-
274
- overflow: clip;
275
-
276
- .label {
277
- display: block;
278
- flex-grow: 1;
279
- }
280
-
281
- .icon {
282
- display: block;
283
-
284
- transform: scaleY(1);
285
- transition: transform 200ms;
286
-
287
- font-size: 1.2rem;
288
- &.medium {
289
- font-size: 1.8rem;
290
- }
291
- &.large {
292
- font-size: 2.4rem;
293
- }
294
- }
295
- }
296
-
297
- .display-details-content {
298
- /* Use an inner element for styling */
299
- }
300
- }
301
- </style>
@@ -1,255 +0,0 @@
1
- <template>
2
- <dialog class="display-dialog-core" :class="[elementClasses]" role="dialog" :align-dialog :justify-dialog :open :data-dialog-id="dataDialogId" ref="dialogRef">
3
- <focus-trap v-model:active="open" :clickOutsideDeactivates="true" @deactivate="closeDialog()">
4
- <div class="inner" :class="[variant]">
5
- <div class="header">
6
- <div v-if="hasDialogTitle" class="col-left">
7
- <slot name="dialogTitle"></slot>
8
- </div>
9
-
10
- <div class="col-center">
11
- <p class="text-normal wght-700">Center col</p>
12
- </div>
13
- <div class="col-right">
14
- <button @click.prevent="closeDialog()" data-test-id="display-dialog-header-close" class="display-prompt-action">
15
- <Icon name="bitcoin-icons:cross-filled" class="icon" />
16
- <span class="sr-only">Really Close</span>
17
- </button>
18
- </div>
19
- </div>
20
- <div v-if="hasDialogContent" class="dialog-content" :class="[{ 'allow-content-scroll': allowContentScroll }]">
21
- <slot name="dialogContent"></slot>
22
- </div>
23
- <div v-if="hasActionButtons" class="footer">
24
- <slot name="actionButtons"></slot>
25
- </div>
26
- </div>
27
- </focus-trap>
28
- </dialog>
29
- </template>
30
-
31
- <script setup lang="ts">
32
- import { FocusTrap } from 'focus-trap-vue';
33
- const props = defineProps({
34
- styleClassPassthrough: {
35
- type: Array as PropType<string[]>,
36
- default: () => [],
37
- },
38
- variant: {
39
- type: String,
40
- default: 'dialog',
41
- validator: (val) => ['dialog', 'modal', 'confirm'].includes(val as string),
42
- },
43
- justifyDialog: {
44
- type: String,
45
- default: 'center',
46
- validator: (val) => ['start', 'center', 'end'].includes(val as string),
47
- },
48
- alignDialog: {
49
- type: String,
50
- default: 'center',
51
- validator: (val) => ['start', 'center', 'end'].includes(val as string),
52
- },
53
- lockViewport: {
54
- type: Boolean,
55
- default: true,
56
- },
57
- allowContentScroll: {
58
- type: Boolean,
59
- default: false,
60
- },
61
- dataDialogId: {
62
- type: String,
63
- required: true,
64
- },
65
- });
66
-
67
- const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
68
-
69
- const open = defineModel<boolean>();
70
- const bodyTag = ref<HTMLBodyElement | null>(null);
71
- const lockViewport = toRef<boolean>(props.lockViewport);
72
-
73
- const closeDialog = () => {
74
- open.value = false;
75
-
76
- if (lockViewport.value && bodyTag.value !== null) {
77
- bodyTag.value.classList.remove('lock');
78
- }
79
- };
80
-
81
- const slots = useSlots();
82
- const hasDialogTitle = computed(() => slots.dialogTitle !== undefined);
83
- const hasDialogContent = computed(() => slots.dialogContent !== undefined);
84
- const hasActionButtons = computed(() => slots.actionButtons !== undefined);
85
-
86
- onMounted(() => {
87
- bodyTag.value = document.querySelector('body');
88
- if (lockViewport.value && bodyTag.value !== null) {
89
- bodyTag.value.classList.add('lock');
90
- }
91
- });
92
- </script>
93
-
94
- <style lang="css">
95
- .display-dialog-core {
96
- display: flex;
97
- position: fixed;
98
- left: 0;
99
- top: 0;
100
- width: 100%;
101
- height: 100%;
102
- backdrop-filter: blur(5px);
103
- background-color: rgba(0, 0, 0, 0.5);
104
- z-index: 999999;
105
- opacity: 0;
106
- border: none;
107
- padding: 0;
108
-
109
- display: none;
110
- transition: opacity 200ms, display 200ms, overlay 200ms;
111
- transition-behavior: allow-discrete;
112
-
113
- &[open] {
114
- display: flex;
115
- opacity: 1;
116
-
117
- @starting-style {
118
- display: flex;
119
- opacity: 0;
120
- }
121
- }
122
-
123
- /* * Positioning the dialog */
124
- &[justify-dialog='start'] {
125
- justify-content: flex-start;
126
- }
127
-
128
- &[justify-dialog='center'] {
129
- justify-content: center;
130
- }
131
-
132
- &[justify-dialog='end'] {
133
- justify-content: flex-end;
134
- }
135
-
136
- &[align-dialog='start'] {
137
- align-items: flex-start;
138
- }
139
-
140
- &[align-dialog='center'] {
141
- align-items: center;
142
- }
143
- &[align-dialog='end'] {
144
- align-items: flex-end;
145
- }
146
-
147
- .inner {
148
- display: grid;
149
- grid-template-rows: auto 1fr auto;
150
-
151
- border-radius: 8px;
152
- border: 1px solid light-dark(var(--gray-10), var(--gray-2));
153
- outline: 1px solid light-dark(var(--gray-12), var(--gray-0));
154
-
155
- background-color: var(--dialog-inner-background);
156
- height: initial;
157
- width: 100vw;
158
- overflow: hidden;
159
-
160
- &.confirm {
161
- width: initial;
162
- }
163
-
164
- &.dialog {
165
- height: 70dvh;
166
- width: min(75%, 720px);
167
- }
168
-
169
- &.form {
170
- width: initial;
171
- }
172
-
173
- &.fullscreen {
174
- width: initial;
175
- }
176
-
177
- &.modal {
178
- width: initial;
179
- }
180
-
181
- .header {
182
- display: grid;
183
- grid-template-columns: auto 1fr auto;
184
- align-items: center;
185
-
186
- padding: 12px;
187
-
188
- .col-left {
189
- /* grid-column: 1; */
190
- /* display: none; */
191
- }
192
-
193
- .col-center {
194
- /* grid-column: 2; */
195
- text-align: center;
196
-
197
- color: var(--color-red-1);
198
- display: none;
199
- }
200
-
201
- .col-right {
202
- grid-column: 3;
203
-
204
- .display-prompt-action {
205
- background-color: transparent;
206
- display: block flex;
207
- align-items: center;
208
- justify-content: center;
209
- margin: var(--dialog-header-button-margin);
210
- padding: var(--dialog-header-button-padding);
211
- border: var(--dialog-header-button-border);
212
- border-radius: var(--dialog-header-button-border-radius);
213
- outline: var(--dialog-header-button-outline);
214
-
215
- transition: border-color 0.2s, outline-color 0.2s;
216
-
217
- &:hover,
218
- &:focus-visible {
219
- cursor: pointer;
220
- border: var(--dialog-header-button-border-hover);
221
- outline: var(--dialog-header-button-outline-hover);
222
- }
223
-
224
- .icon {
225
- color: var(--dialog-header-button-icon-color);
226
- display: block;
227
- font-size: var(--dialog-header-button-icon-font-size);
228
- border: 1px solid green;
229
- padding: 1rem;
230
- }
231
- }
232
- }
233
- }
234
-
235
- .dialog-content {
236
- overflow: hidden;
237
- padding: 12px;
238
-
239
- &.allow-content-scroll {
240
- overflow-y: auto;
241
- &::-webkit-scrollbar {
242
- display: none;
243
- }
244
- }
245
- }
246
-
247
- .footer {
248
- display: flex;
249
- gap: 1.2rem;
250
- justify-content: flex-end;
251
- padding: 12px;
252
- }
253
- }
254
- }
255
- </style>
@@ -1,45 +0,0 @@
1
- <template>
2
- <DisplayDialogCore variant="confirm" :styleClassPassthrough :lockViewport="true" :dataDialogId>
3
- <template #dialogTitle>
4
- <slot name="dialogTitle">
5
- <p class="text-normal wght-700">Confirm</p>
6
- </slot>
7
- </template>
8
- <template #dialogContent>
9
- <slot name="dialogContent"></slot>
10
- </template>
11
- <template #actionButtons>
12
- <slot name="actionButtonLeft"></slot>
13
- <slot name="actionButtonRight"></slot>
14
- </template>
15
- </DisplayDialogCore>
16
- </template>
17
-
18
- <script setup lang="ts">
19
- const props = defineProps({
20
- styleClassPassthrough: {
21
- type: Array as PropType<string[]>,
22
- default: () => [],
23
- },
24
- dataDialogId: {
25
- type: String,
26
- required: true,
27
- },
28
- });
29
- </script>
30
-
31
- <style lang="css">
32
- .display-dialog-core {
33
- .inner {
34
- .header {
35
- /* background-color: aquamarine; */
36
- }
37
- .dialog-content {
38
- /* background-color: bisque; */
39
- }
40
- .footer {
41
- /* background-color: blueviolet; */
42
- }
43
- }
44
- }
45
- </style>
@@ -1,49 +0,0 @@
1
- <template>
2
- <DisplayDialogCore variant="dialog" :styleClassPassthrough :lockViewport="true" :allowContentScroll :dataDialogId>
3
- <template #dialogTitle>
4
- <slot name="dialogTitle">
5
- <p class="text-normal wght-700">Confirm</p>
6
- </slot>
7
- </template>
8
- <template #dialogContent>
9
- <slot name="dialogContent"></slot>
10
- </template>
11
- <template #actionButtons>
12
- <slot name="actionButtonLeft"></slot>
13
- <slot name="actionButtonRight"></slot>
14
- </template>
15
- </DisplayDialogCore>
16
- </template>
17
-
18
- <script setup lang="ts">
19
- const props = defineProps({
20
- styleClassPassthrough: {
21
- type: Array as PropType<string[]>,
22
- default: () => [],
23
- },
24
- allowContentScroll: {
25
- type: Boolean,
26
- default: false,
27
- },
28
- dataDialogId: {
29
- type: String,
30
- required: true,
31
- },
32
- });
33
- </script>
34
-
35
- <style lang="css">
36
- .display-dialog-core {
37
- .inner {
38
- .header {
39
- /* background-color: aquamarine; */
40
- }
41
- .dialog-content {
42
- /* background-color: bisque; */
43
- }
44
- .footer {
45
- /* background-color: blueviolet; */
46
- }
47
- }
48
- }
49
- </style>
@@ -1,22 +0,0 @@
1
- <template>
2
- <div :class="[elementClasses]">
3
- <slot v-for="item in gridData" :key="item.id" :name="item.id"></slot>
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- const props = defineProps({
9
- gridData: {
10
- type: Object,
11
- default: {},
12
- },
13
- styleClassPassthrough: {
14
- type: Array as PropType<string[]>,
15
- default: () => [],
16
- },
17
- });
18
-
19
- const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
20
-
21
- const gridData = toRef(() => props.gridData);
22
- </script>