srcdev-nuxt-components 9.1.37 → 9.1.39
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.
- package/.claude/settings.json +4 -1
- package/.claude/skills/components/carousel-flip.md +188 -0
- package/.claude/skills/components/data-grid.md +167 -0
- package/.claude/skills/index.md +4 -1
- package/.claude/skills/qa-panel.md +231 -0
- package/app/components/01.atoms/grids/data-grid/DataGrid.vue +39 -0
- package/app/components/01.atoms/grids/data-grid/stories/DataGrid.stories.ts +234 -0
- package/app/components/01.atoms/grids/data-grid/tests/DataGrid.spec.ts +140 -0
- package/app/components/01.atoms/grids/data-grid/tests/__snapshots__/DataGrid.spec.ts.snap +11 -0
- package/app/components/01.atoms/{grid-stack → grids/grid-stack}/stories/GridStack.stories.ts +1 -1
- package/app/components/02.molecules/qr-code/CaptureQrCode.vue +49 -49
- package/app/components/carousels/CarouselFlip.vue +211 -153
- package/app/components/carousels/stories/CarouselFlip.stories.ts +35 -0
- package/app/components/carousels/tests/CarouselFlip.spec.ts +38 -0
- package/app/pages/ui/carousel-flip.vue +222 -17
- package/app/pages/ui/simple-grid.vue +2 -2
- package/package.json +1 -1
- package/app/components/display-grid/DisplayGridCore.vue +0 -22
- /package/app/components/01.atoms/{scroll-reveal-frame → animations/scroll-reveal-frame}/ScrollRevealFrame.vue +0 -0
- /package/app/components/01.atoms/{scroll-reveal-frame → animations/scroll-reveal-frame}/stories/ScrollRevealFrame.stories.ts +0 -0
- /package/app/components/01.atoms/{scroll-reveal-frame → animations/scroll-reveal-frame}/tests/ScrollRevealFrame.spec.ts +0 -0
- /package/app/components/01.atoms/{scroll-reveal-frame → animations/scroll-reveal-frame}/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +0 -0
- /package/app/components/01.atoms/{scroll-reveal-image → animations/scroll-reveal-image}/ScrollRevealImage.vue +0 -0
- /package/app/components/01.atoms/{scroll-reveal-image → animations/scroll-reveal-image}/stories/ScrollRevealImage.stories.ts +0 -0
- /package/app/components/01.atoms/{scroll-reveal-image → animations/scroll-reveal-image}/tests/ScrollRevealImage.spec.ts +0 -0
- /package/app/components/01.atoms/{scroll-reveal-image → animations/scroll-reveal-image}/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +0 -0
- /package/app/components/01.atoms/{grid-stack → grids/grid-stack}/GridStack.vue +0 -0
- /package/app/components/01.atoms/{grid-stack → grids/grid-stack}/tests/GridStack.spec.ts +0 -0
|
@@ -6,24 +6,127 @@
|
|
|
6
6
|
<h1 class="page-heading-2">Carousel</h1>
|
|
7
7
|
</LayoutRow>
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
9
|
+
<!-- ── QA Panel (dev only) ───────────────────────────────── -->
|
|
10
|
+
<div v-if="isDev" class="qa-panel">
|
|
11
|
+
<details class="qa-panel__details">
|
|
12
|
+
<summary class="qa-panel__summary">
|
|
13
|
+
<span class="qa-panel__title">QA — CarouselFlip</span>
|
|
14
|
+
<code class="qa-panel__status">
|
|
15
|
+
overflow:{{ qaAllowOverflow ? "on" : "off" }} · speed:{{ qaTransitionSpeed }}ms · flip:{{
|
|
16
|
+
qaUseFlipAnimation ? "on" : "off"
|
|
17
|
+
}}
|
|
18
|
+
· spring:{{ qaUseSpringEffect ? "on" : "off" }} · {{ qaButtonLayout }} · controls:{{
|
|
19
|
+
qaShowControls ? "on" : "off"
|
|
20
|
+
}}
|
|
21
|
+
</code>
|
|
22
|
+
</summary>
|
|
23
|
+
<div class="qa-panel__body">
|
|
24
|
+
<div class="qa-panel__group">
|
|
25
|
+
<span class="qa-panel__label">Allow Overflow</span>
|
|
26
|
+
<div class="qa-panel__chips">
|
|
27
|
+
<button
|
|
28
|
+
v-for="opt in [true, false]"
|
|
29
|
+
:key="String(opt)"
|
|
30
|
+
class="qa-panel__chip"
|
|
31
|
+
:class="{ 'is-active': qaAllowOverflow === opt }"
|
|
32
|
+
@click="qaAllowOverflow = opt"
|
|
33
|
+
>
|
|
34
|
+
{{ opt ? "on" : "off" }}
|
|
35
|
+
</button>
|
|
36
|
+
</div>
|
|
23
37
|
</div>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
<div class="qa-panel__group">
|
|
39
|
+
<span class="qa-panel__label">Transition Speed</span>
|
|
40
|
+
<div class="qa-panel__chips">
|
|
41
|
+
<button
|
|
42
|
+
v-for="preset in transitionSpeedPresets"
|
|
43
|
+
:key="preset"
|
|
44
|
+
class="qa-panel__chip"
|
|
45
|
+
:class="{ 'is-active': qaTransitionSpeed === preset }"
|
|
46
|
+
@click="qaTransitionSpeed = preset"
|
|
47
|
+
>
|
|
48
|
+
{{ preset }}ms
|
|
49
|
+
</button>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="qa-panel__group">
|
|
53
|
+
<span class="qa-panel__label">Flip Animation</span>
|
|
54
|
+
<div class="qa-panel__chips">
|
|
55
|
+
<button
|
|
56
|
+
v-for="opt in [true, false]"
|
|
57
|
+
:key="String(opt)"
|
|
58
|
+
class="qa-panel__chip"
|
|
59
|
+
:class="{ 'is-active': qaUseFlipAnimation === opt }"
|
|
60
|
+
@click="qaUseFlipAnimation = opt"
|
|
61
|
+
>
|
|
62
|
+
{{ opt ? "on" : "off" }}
|
|
63
|
+
</button>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="qa-panel__group">
|
|
67
|
+
<span class="qa-panel__label">Spring Effect</span>
|
|
68
|
+
<div class="qa-panel__chips">
|
|
69
|
+
<button
|
|
70
|
+
v-for="opt in [true, false]"
|
|
71
|
+
:key="String(opt)"
|
|
72
|
+
class="qa-panel__chip"
|
|
73
|
+
:class="{ 'is-active': qaUseSpringEffect === opt }"
|
|
74
|
+
@click="qaUseSpringEffect = opt"
|
|
75
|
+
>
|
|
76
|
+
{{ opt ? "on" : "off" }}
|
|
77
|
+
</button>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="qa-panel__group">
|
|
81
|
+
<span class="qa-panel__label">Button Layout</span>
|
|
82
|
+
<div class="qa-panel__chips">
|
|
83
|
+
<button
|
|
84
|
+
v-for="layout in buttonLayoutPresets"
|
|
85
|
+
:key="layout"
|
|
86
|
+
class="qa-panel__chip"
|
|
87
|
+
:class="{ 'is-active': qaButtonLayout === layout }"
|
|
88
|
+
@click="qaButtonLayout = layout"
|
|
89
|
+
>
|
|
90
|
+
{{ layout }}
|
|
91
|
+
</button>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="qa-panel__group">
|
|
95
|
+
<span class="qa-panel__label">Show Controls</span>
|
|
96
|
+
<div class="qa-panel__chips">
|
|
97
|
+
<button
|
|
98
|
+
v-for="opt in [true, false]"
|
|
99
|
+
:key="String(opt)"
|
|
100
|
+
class="qa-panel__chip"
|
|
101
|
+
:class="{ 'is-active': qaShowControls === opt }"
|
|
102
|
+
@click="qaShowControls = opt"
|
|
103
|
+
>
|
|
104
|
+
{{ opt ? "on" : "off" }}
|
|
105
|
+
</button>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</details>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<CarouselFlip
|
|
113
|
+
v-if="carouselStatus === 'success'"
|
|
114
|
+
:carousel-data-ids
|
|
115
|
+
:allow-carousel-overflow="qaAllowOverflow"
|
|
116
|
+
:transition-speed="qaTransitionSpeed"
|
|
117
|
+
:use-flip-animation="qaUseFlipAnimation"
|
|
118
|
+
:use-spring-effect="qaUseSpringEffect"
|
|
119
|
+
:button-layout="qaButtonLayout"
|
|
120
|
+
:show-controls="qaShowControls"
|
|
121
|
+
:style-class-passthrough="['carousel-flip-demo', 'mbe-20']"
|
|
122
|
+
>
|
|
123
|
+
<template v-for="(item, index) in carouselData?.items" :key="index" #[item.id]>
|
|
124
|
+
<div class="custom-carousel-item">
|
|
125
|
+
<h3>{{ index + 1 }}</h3>
|
|
126
|
+
<p>{{ item.alt }}</p>
|
|
127
|
+
</div>
|
|
128
|
+
</template>
|
|
129
|
+
</CarouselFlip>
|
|
27
130
|
</template>
|
|
28
131
|
</NuxtLayout>
|
|
29
132
|
</div>
|
|
@@ -32,6 +135,17 @@
|
|
|
32
135
|
<script setup lang="ts">
|
|
33
136
|
import type { ICarouselBasic } from "~/types/components";
|
|
34
137
|
|
|
138
|
+
// ── QA controls (dev only) ────────────────────────────────────────
|
|
139
|
+
const isDev = import.meta.dev;
|
|
140
|
+
const qaAllowOverflow = ref(true);
|
|
141
|
+
const qaTransitionSpeed = ref(1000);
|
|
142
|
+
const qaUseFlipAnimation = ref(true);
|
|
143
|
+
const qaUseSpringEffect = ref(false);
|
|
144
|
+
const qaButtonLayout = ref<"sides" | "controls-flanking" | "controls-grouped-right" | "overlay">("sides");
|
|
145
|
+
const qaShowControls = ref(true);
|
|
146
|
+
const transitionSpeedPresets = [100, 200, 400, 600, 1000, 2000];
|
|
147
|
+
const buttonLayoutPresets = ["sides", "controls-flanking", "controls-grouped-right", "overlay"] as const;
|
|
148
|
+
|
|
35
149
|
definePageMeta({
|
|
36
150
|
layout: false,
|
|
37
151
|
});
|
|
@@ -54,6 +168,97 @@ const carouselDataIds = computed(() => {
|
|
|
54
168
|
</script>
|
|
55
169
|
|
|
56
170
|
<style lang="css">
|
|
171
|
+
.carousel-flip-page {
|
|
172
|
+
/* ── QA Panel ──────────────────────────────────────────────────── */
|
|
173
|
+
|
|
174
|
+
.qa-panel {
|
|
175
|
+
background: oklch(15% 0 0);
|
|
176
|
+
color: white;
|
|
177
|
+
font-size: 1.3rem;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.qa-panel__details {
|
|
181
|
+
padding: 1rem 2rem;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.qa-panel__summary {
|
|
185
|
+
cursor: pointer;
|
|
186
|
+
display: flex;
|
|
187
|
+
align-items: center;
|
|
188
|
+
gap: 1.6rem;
|
|
189
|
+
list-style: none;
|
|
190
|
+
user-select: none;
|
|
191
|
+
|
|
192
|
+
&::-webkit-details-marker {
|
|
193
|
+
display: none;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.qa-panel__title {
|
|
198
|
+
font-weight: 600;
|
|
199
|
+
font-size: 1.1rem;
|
|
200
|
+
text-transform: uppercase;
|
|
201
|
+
letter-spacing: 0.08em;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.qa-panel__status {
|
|
205
|
+
font-family: monospace;
|
|
206
|
+
font-size: 1.2rem;
|
|
207
|
+
background: oklch(0% 0 0 / 0.3);
|
|
208
|
+
padding: 0.2rem 0.8rem;
|
|
209
|
+
border-radius: 0.4rem;
|
|
210
|
+
user-select: text;
|
|
211
|
+
cursor: text;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.qa-panel__body {
|
|
215
|
+
display: flex;
|
|
216
|
+
flex-wrap: wrap;
|
|
217
|
+
gap: 2.4rem;
|
|
218
|
+
padding-block: 1.2rem 0.4rem;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.qa-panel__group {
|
|
222
|
+
display: flex;
|
|
223
|
+
flex-direction: column;
|
|
224
|
+
gap: 0.6rem;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.qa-panel__label {
|
|
228
|
+
font-size: 1.1rem;
|
|
229
|
+
text-transform: uppercase;
|
|
230
|
+
letter-spacing: 0.08em;
|
|
231
|
+
opacity: 0.55;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.qa-panel__chips {
|
|
235
|
+
display: flex;
|
|
236
|
+
flex-wrap: wrap;
|
|
237
|
+
gap: 0.4rem;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.qa-panel__chip {
|
|
241
|
+
font-family: monospace;
|
|
242
|
+
font-size: 1.2rem;
|
|
243
|
+
color: white;
|
|
244
|
+
background: oklch(0% 0 0 / 0.25);
|
|
245
|
+
border: 1px solid oklch(100% 0 0 / 0.18);
|
|
246
|
+
padding: 0.3rem 1rem;
|
|
247
|
+
border-radius: 0.4rem;
|
|
248
|
+
cursor: pointer;
|
|
249
|
+
transition: background 0.15s;
|
|
250
|
+
|
|
251
|
+
&:hover {
|
|
252
|
+
background: oklch(0% 0 0 / 0.4);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
&.is-active {
|
|
256
|
+
background: oklch(55% 0.18 240);
|
|
257
|
+
border-color: oklch(55% 0.18 240);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
57
262
|
@property --glow-deg {
|
|
58
263
|
syntax: "<angle>";
|
|
59
264
|
inherits: true;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<h1 class="page-heading-3">Simple Grid</h1>
|
|
7
7
|
<p class="page-body-normal">Simple grid displaying dummy posts data</p>
|
|
8
8
|
|
|
9
|
-
<
|
|
9
|
+
<GridCore
|
|
10
10
|
v-if="status === 'success'"
|
|
11
11
|
:grid-data="postsData?.posts.slice(0, displayCount) ?? ({} as Posts)"
|
|
12
12
|
:style-class-passthrough="['display-posts']"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<div>{{ item.body }}</div>
|
|
19
19
|
</div>
|
|
20
20
|
</template>
|
|
21
|
-
</
|
|
21
|
+
</GridCore>
|
|
22
22
|
|
|
23
23
|
<p v-else class="page-body-normal">…Loading</p>
|
|
24
24
|
</LayoutRow>
|
package/package.json
CHANGED
|
@@ -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: [String, Array] as PropType<string | string[]>,
|
|
15
|
-
default: () => [],
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
|
|
20
|
-
|
|
21
|
-
const gridData = toRef(() => props.gridData);
|
|
22
|
-
</script>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|