srcdev-nuxt-components 9.3.7 → 9.3.8
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/hooks/check-component-update.sh +30 -1
- package/.claude/skills/components/breadcrumb.md +49 -0
- package/.claude/skills/components/content-docs.md +1 -1
- package/.claude/skills/components/service-detail.md +156 -0
- package/.claude/skills/components/services-card-grid.md +9 -9
- package/.claude/skills/components/services-card.md +82 -30
- package/.claude/skills/index.md +3 -1
- package/.claude/skills/qa-panel.md +2 -2
- package/.vscode/srcdev-component-breadcrumb.code-snippets +14 -0
- package/.vscode/srcdev-component-service-detail.code-snippets +49 -0
- package/.vscode/srcdev-component-services-card.code-snippets +108 -0
- package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +94 -0
- package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +32 -0
- package/app/components/01.atoms/navigation/breadcrumb/stories/Breadcrumb.stories.ts +87 -0
- package/app/components/01.atoms/navigation/breadcrumb/tests/Breadcrumb.spec.ts +87 -0
- package/app/components/01.atoms/navigation/breadcrumb/tests/__snapshots__/Breadcrumb.spec.ts.snap +13 -0
- package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +181 -0
- package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +480 -0
- package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +282 -0
- package/app/components/03.organisms/services/service-detail/tests/ServiceDetail.spec.ts +270 -0
- package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +99 -0
- package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +129 -0
- package/app/components/03.organisms/services/services-card/ServicesCard.vue +153 -39
- package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +65 -0
- package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +82 -0
- package/app/components/03.organisms/services/services-card/tests/__snapshots__/ServicesCard.spec.ts.snap +13 -5
- package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +3 -7
- package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +126 -2
- package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +6 -0
- package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +51 -27
- package/app/types/components/breadcrumb.ts +4 -0
- package/app/types/components/index.ts +1 -0
- package/package.json +2 -2
- package/app/pages/auto-grid.vue +0 -328
- package/app/pages/banner-video.vue +0 -238
- package/app/pages/forms/examples/buttons/index.vue +0 -259
- package/app/pages/forms/examples/material/checkbox-radio-panels.vue +0 -244
- package/app/pages/forms/examples/material/cssbattle.vue +0 -60
- package/app/pages/forms/examples/material/text-fields.vue +0 -910
- package/app/pages/grid-stack.vue +0 -252
- package/app/pages/index.vue +0 -127
- package/app/pages/page-hero-highlights.vue +0 -204
- package/app/pages/samaritan.vue +0 -327
- package/app/pages/typography/hero-text.vue +0 -97
- package/app/pages/typography/index.vue +0 -39
- package/app/pages/typography/page-body.vue +0 -171
- package/app/pages/typography/page-heading.vue +0 -76
- package/app/pages/typography/page-link.vue +0 -103
- package/app/pages/ui/accordian.vue +0 -211
- package/app/pages/ui/anchor-scroll-tab-navigation.vue +0 -191
- package/app/pages/ui/anchor-scroll.vue +0 -367
- package/app/pages/ui/animated-svg-text.vue +0 -85
- package/app/pages/ui/block-decorators.vue +0 -142
- package/app/pages/ui/card-core.vue +0 -82
- package/app/pages/ui/carousel-basic.vue +0 -292
- package/app/pages/ui/carousel-flip.vue +0 -449
- package/app/pages/ui/carousel-infinite.vue +0 -260
- package/app/pages/ui/clipped-panels.vue +0 -101
- package/app/pages/ui/contact-section.vue +0 -323
- package/app/pages/ui/container-glow.vue +0 -106
- package/app/pages/ui/content-width.vue +0 -126
- package/app/pages/ui/deep-expanding-menu.vue +0 -138
- package/app/pages/ui/display-avatar.vue +0 -253
- package/app/pages/ui/display-banner.vue +0 -78
- package/app/pages/ui/display-chip.vue +0 -367
- package/app/pages/ui/display-details.vue +0 -171
- package/app/pages/ui/display-dialog.vue +0 -344
- package/app/pages/ui/display-pill.vue +0 -396
- package/app/pages/ui/display-prompt.vue +0 -284
- package/app/pages/ui/display-toast.vue +0 -311
- package/app/pages/ui/expanding-panel.vue +0 -326
- package/app/pages/ui/glowing-border.vue +0 -111
- package/app/pages/ui/layout-content-docs.vue +0 -72
- package/app/pages/ui/layout-grid-a.vue +0 -96
- package/app/pages/ui/layout-grid-b.vue +0 -132
- package/app/pages/ui/magnetic-navigation.vue +0 -50
- package/app/pages/ui/marquee-scroller.vue +0 -99
- package/app/pages/ui/mask-element.vue +0 -104
- package/app/pages/ui/masonry-columns.vue +0 -55
- package/app/pages/ui/masonry-grid-ordered-experiment.vue +0 -79
- package/app/pages/ui/masonry-grid-ordered.vue +0 -56
- package/app/pages/ui/masonry-grid-sorted.vue +0 -55
- package/app/pages/ui/masonry-grid.vue +0 -55
- package/app/pages/ui/navigation/navigation-horizontal.vue +0 -484
- package/app/pages/ui/navigation/site-navigation/about.vue +0 -36
- package/app/pages/ui/navigation/site-navigation/contact.vue +0 -39
- package/app/pages/ui/navigation/site-navigation/index.vue +0 -38
- package/app/pages/ui/navigation/site-navigation/portfolio.vue +0 -43
- package/app/pages/ui/navigation/site-navigation/services.vue +0 -42
- package/app/pages/ui/navigation/tab-navigation.vue +0 -493
- package/app/pages/ui/page-row.vue +0 -127
- package/app/pages/ui/price-list.vue +0 -65
- package/app/pages/ui/profile-section.vue +0 -142
- package/app/pages/ui/qr-code/[componentName].vue +0 -218
- package/app/pages/ui/rotating-carousel.vue +0 -154
- package/app/pages/ui/scroll-reveal-image.vue +0 -483
- package/app/pages/ui/section-parallax.vue +0 -54
- package/app/pages/ui/services/colour-finder.vue +0 -43
- package/app/pages/ui/services/services-cards.vue +0 -57
- package/app/pages/ui/services/services-section/[slug].vue +0 -61
- package/app/pages/ui/services/services-sections-compact.vue +0 -64
- package/app/pages/ui/settings.vue +0 -54
- package/app/pages/ui/simple-grid.vue +0 -55
- package/app/pages/ui/slider-gallery.vue +0 -261
- package/app/pages/ui/tabs-y.vue +0 -107
- package/app/pages/ui/tabs.vue +0 -189
- package/app/pages/ui/tooltips.vue +0 -104
- package/app/pages/ui/wipe-away-vertical.vue +0 -129
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<NuxtLayout name="default">
|
|
4
|
-
<template #layout-content>
|
|
5
|
-
<PageRow tag="div" variant="content" :style-class-passthrough="['mbe-20']">
|
|
6
|
-
<HeroText
|
|
7
|
-
:tag="'h1'"
|
|
8
|
-
font-size="display"
|
|
9
|
-
:text-content="[{ text: 'Price List' }]"
|
|
10
|
-
:style-class-passthrough="['mbe-20']"
|
|
11
|
-
/>
|
|
12
|
-
<p class="page-body-normal">Example of a services card grid component.</p>
|
|
13
|
-
</PageRow>
|
|
14
|
-
|
|
15
|
-
<PageRow tag="div" variant="content" :style-class-passthrough="['mbe-20']">
|
|
16
|
-
<PriceList :price-list-data="priceListData" :style-class-passthrough="['mbe-20']" />
|
|
17
|
-
</PageRow>
|
|
18
|
-
</template>
|
|
19
|
-
</NuxtLayout>
|
|
20
|
-
</div>
|
|
21
|
-
</template>
|
|
22
|
-
|
|
23
|
-
<script setup lang="ts">
|
|
24
|
-
definePageMeta({
|
|
25
|
-
layout: false,
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
useHead({
|
|
29
|
-
title: "Price List",
|
|
30
|
-
meta: [{ name: "description", content: "Price List" }],
|
|
31
|
-
bodyAttrs: {
|
|
32
|
-
class: "price-list-page",
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const priceListData = [
|
|
37
|
-
{
|
|
38
|
-
headingtext: "Cutting & Treatment",
|
|
39
|
-
headingIcon: "lucide:sparkles",
|
|
40
|
-
items: [
|
|
41
|
-
{ description: "Cut & Blow Dry", price: "£45" },
|
|
42
|
-
{ description: "Restyle", price: "£65" },
|
|
43
|
-
{ description: "Wash & Blow Dry", price: "£35" },
|
|
44
|
-
{ description: "Trim & Tidy", price: "£25" },
|
|
45
|
-
{ description: "Keratin Treatment", price: "£120" },
|
|
46
|
-
],
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
headingtext: "Hair Colouring",
|
|
50
|
-
headingIcon: "lucide:sparkles",
|
|
51
|
-
items: [
|
|
52
|
-
{ description: "Full Head Colour", price: "£75" },
|
|
53
|
-
{ description: "Half Head Highlights", price: "£65" },
|
|
54
|
-
{ description: "Full Head Highlights", price: "£85" },
|
|
55
|
-
{ description: "Balayage", price: "£95" },
|
|
56
|
-
{ description: "Toner", price: "£35" },
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
];
|
|
60
|
-
</script>
|
|
61
|
-
|
|
62
|
-
<style lang="css">
|
|
63
|
-
.price-list-page {
|
|
64
|
-
}
|
|
65
|
-
</style>
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<NuxtLayout name="default">
|
|
4
|
-
<template #layout-content>
|
|
5
|
-
<PageRow tag="div" variant="content" :style-class-passthrough="['mbe-20']">
|
|
6
|
-
<h2 class="page-heading-2">Profile Section</h2>
|
|
7
|
-
</PageRow>
|
|
8
|
-
|
|
9
|
-
<PageRow tag="div" variant="content" :style-class-passthrough="['mbe-20']">
|
|
10
|
-
<ProfileSection
|
|
11
|
-
:profile-picture="{
|
|
12
|
-
src: '/images/services/service-balayage.jpg',
|
|
13
|
-
alt: 'Profile picture of Natasha, the mobile hairdresser in Bath',
|
|
14
|
-
}"
|
|
15
|
-
>
|
|
16
|
-
<template #eyebrowText>
|
|
17
|
-
<EyebrowText tag="p" font-size="large" text-content="About Natasha" :style-class-passthrough="['mb-0']" />
|
|
18
|
-
</template>
|
|
19
|
-
<template #heroText="{ headingId }">
|
|
20
|
-
<HeroText
|
|
21
|
-
:id="headingId"
|
|
22
|
-
tag="h2"
|
|
23
|
-
axis="vertical"
|
|
24
|
-
font-size="display"
|
|
25
|
-
:text-content="[
|
|
26
|
-
{ text: 'Your', styleClass: 'normal' },
|
|
27
|
-
{ text: 'mobile hairdresser', styleClass: 'accent' },
|
|
28
|
-
{ text: 'in Bath', styleClass: 'normal' },
|
|
29
|
-
]"
|
|
30
|
-
:style-class-passthrough="['mb-20']"
|
|
31
|
-
/>
|
|
32
|
-
</template>
|
|
33
|
-
|
|
34
|
-
<template #profile-info-1>
|
|
35
|
-
<p class="page-body-medium experience">
|
|
36
|
-
With over 10 years' experience, I offer a range of professional and luxurious, one-to-one hairdressing
|
|
37
|
-
services - from beautiful blow-drys to classy colours and cuts.
|
|
38
|
-
</p>
|
|
39
|
-
</template>
|
|
40
|
-
|
|
41
|
-
<template #profile-info-2>
|
|
42
|
-
<p class="page-body-normal location">
|
|
43
|
-
Welcome to your trusted mobile hairdresser in Bath, offering expert hair services in the comfort of your
|
|
44
|
-
own home. Whether you're based in the heart of Bath or in nearby areas like
|
|
45
|
-
<span class="highlight">Lansdown</span>
|
|
46
|
-
,
|
|
47
|
-
<span class="highlight">Widcombe</span>
|
|
48
|
-
, or
|
|
49
|
-
<span class="highlight">Oldfield Park</span>
|
|
50
|
-
, I bring high-quality, salon-style hairdressing directly to you.
|
|
51
|
-
</p>
|
|
52
|
-
</template>
|
|
53
|
-
|
|
54
|
-
<template #profile-info-3>
|
|
55
|
-
<p class="page-body-normal services">
|
|
56
|
-
From
|
|
57
|
-
<NuxtLink to="/ui/services/services-section/balayage" class="highlight">balayage</NuxtLink>
|
|
58
|
-
,
|
|
59
|
-
<NuxtLink to="/ui/services/services-section/highlights" class="highlight">highlights</NuxtLink>
|
|
60
|
-
, and
|
|
61
|
-
<NuxtLink to="/ui/services/services-section/lowlights" class="highlight">lowlights</NuxtLink>
|
|
62
|
-
to precision cuts and stylish blow-dries, I provide a full range of personalised hair services without
|
|
63
|
-
the need to step outside. Perfect for busy schedules, home comfort, or anyone who prefers a one-on-one
|
|
64
|
-
hair experience - wherever you are in Bath.
|
|
65
|
-
</p>
|
|
66
|
-
</template>
|
|
67
|
-
|
|
68
|
-
<template #profile-info-4>
|
|
69
|
-
<HeroText
|
|
70
|
-
tag="h3"
|
|
71
|
-
axis="horizontal"
|
|
72
|
-
font-size="heading"
|
|
73
|
-
:text-content="[
|
|
74
|
-
{ text: 'Follow me on', styleClass: 'normal' },
|
|
75
|
-
{ text: 'social media', styleClass: 'accent' },
|
|
76
|
-
]"
|
|
77
|
-
:style-class-passthrough="['mb-20']"
|
|
78
|
-
/>
|
|
79
|
-
<SocialIconsList
|
|
80
|
-
:items="[
|
|
81
|
-
{
|
|
82
|
-
networkName: 'Facebook',
|
|
83
|
-
iconName: 'logos:facebook',
|
|
84
|
-
baseHref: 'https://www.facebook.com/',
|
|
85
|
-
profileId: 'luxurylocsbynatasha',
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
networkName: 'Instagram',
|
|
89
|
-
iconName: 'skill-icons:instagram',
|
|
90
|
-
baseHref: 'https://www.instagram.com/',
|
|
91
|
-
profileId: 'luxurylocsbynatasha',
|
|
92
|
-
},
|
|
93
|
-
]"
|
|
94
|
-
/>
|
|
95
|
-
</template>
|
|
96
|
-
|
|
97
|
-
<template #profileLinks>
|
|
98
|
-
<InputButtonCore
|
|
99
|
-
variant="secondary"
|
|
100
|
-
button-text="View all services"
|
|
101
|
-
href="/ui/services/services-card"
|
|
102
|
-
:style-class-passthrough="['mbs-0']"
|
|
103
|
-
>
|
|
104
|
-
<template #right>
|
|
105
|
-
<Icon name="mdi:arrow-right" class="icon" />
|
|
106
|
-
</template>
|
|
107
|
-
</InputButtonCore>
|
|
108
|
-
</template>
|
|
109
|
-
</ProfileSection>
|
|
110
|
-
</PageRow>
|
|
111
|
-
</template>
|
|
112
|
-
</NuxtLayout>
|
|
113
|
-
</div>
|
|
114
|
-
</template>
|
|
115
|
-
|
|
116
|
-
<script setup lang="ts">
|
|
117
|
-
definePageMeta({
|
|
118
|
-
layout: false,
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
useHead({
|
|
122
|
-
title: "ColourFinder",
|
|
123
|
-
meta: [
|
|
124
|
-
{
|
|
125
|
-
name: "description",
|
|
126
|
-
content: "ColourFinder Meta description content",
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
bodyAttrs: {
|
|
130
|
-
class: "profile-section-page",
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
</script>
|
|
134
|
-
|
|
135
|
-
<style lang="css">
|
|
136
|
-
.profile-section-page {
|
|
137
|
-
.profile-section {
|
|
138
|
-
max-inline-size: 800px;
|
|
139
|
-
margin-inline: auto;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
</style>
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<NuxtLayout name="default">
|
|
4
|
-
<template #layout-content>
|
|
5
|
-
<PageRow tag="div" variant="full" :style-class-passthrough="['mbe-20']">
|
|
6
|
-
<h2 class="page-heading-2">Index</h2>
|
|
7
|
-
<p class="page-body-normal">This is the index page for the QR Code component: {{ componentName }}</p>
|
|
8
|
-
</PageRow>
|
|
9
|
-
|
|
10
|
-
<PageRow tag="div" variant="full" :style-class-passthrough="['mbe-20']">
|
|
11
|
-
<ul class="qr-code-index-links-list">
|
|
12
|
-
<li><NuxtLink to="/ui/qr-code/display">Display QR Code</NuxtLink></li>
|
|
13
|
-
<li><NuxtLink to="/ui/qr-code/capture">Capture QR Code</NuxtLink></li>
|
|
14
|
-
<li><NuxtLink to="/ui/qr-code/decode">Decode QR Code</NuxtLink></li>
|
|
15
|
-
</ul>
|
|
16
|
-
</PageRow>
|
|
17
|
-
|
|
18
|
-
<PageRow tag="div" variant="full" :style-class-passthrough="['mbe-20']">
|
|
19
|
-
<h2 class="page-heading-2 pbe-20">{{ pageHeader }}</h2>
|
|
20
|
-
<div class="demo-panel">
|
|
21
|
-
<div class="qr-code-col">
|
|
22
|
-
<component :is="activeComponent" :key="componentName" v-bind="activeProps" />
|
|
23
|
-
</div>
|
|
24
|
-
<form v-if="componentName === 'display'">
|
|
25
|
-
<div class="form-group mbe-12">
|
|
26
|
-
<label for="qr-value-input">QR Code Value:</label>
|
|
27
|
-
<input id="qr-value-input" v-model="qrValue" type="text" class="form-control" />
|
|
28
|
-
</div>
|
|
29
|
-
|
|
30
|
-
<div class="form-group mbe-12">
|
|
31
|
-
<label for="inner-variant-select">Inner Variant:</label>
|
|
32
|
-
<select id="inner-variant-select" v-model="variant.inner" class="form-control">
|
|
33
|
-
<option value="default">Default</option>
|
|
34
|
-
<option value="circle">Circle</option>
|
|
35
|
-
<option value="pixelated">Pixelated</option>
|
|
36
|
-
<option value="rounded">Rounded</option>
|
|
37
|
-
<option value="dots">Dots</option>
|
|
38
|
-
</select>
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
<div class="form-group mbe-12">
|
|
42
|
-
<label for="marker-variant-select">Marker Variant:</label>
|
|
43
|
-
<select id="marker-variant-select" v-model="variant.marker" class="form-control">
|
|
44
|
-
<option value="default">Default</option>
|
|
45
|
-
<option value="circle">Circle</option>
|
|
46
|
-
<option value="pixelated">Pixelated</option>
|
|
47
|
-
<option value="rounded">Rounded</option>
|
|
48
|
-
<option value="dots">Dots</option>
|
|
49
|
-
</select>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
<div class="form-group mbe-12">
|
|
53
|
-
<label for="pixel-variant-select">Pixel Variant:</label>
|
|
54
|
-
<select id="pixel-variant-select" v-model="variant.pixel" class="form-control">
|
|
55
|
-
<option value="default">Default</option>
|
|
56
|
-
<option value="circle">Circle</option>
|
|
57
|
-
<option value="pixelated">Pixelated</option>
|
|
58
|
-
<option value="rounded">Rounded</option>
|
|
59
|
-
<option value="dots">Dots</option>
|
|
60
|
-
</select>
|
|
61
|
-
</div>
|
|
62
|
-
|
|
63
|
-
<div class="form-group mbe-12">
|
|
64
|
-
<label for="radius-input">Radius:</label>
|
|
65
|
-
<input id="radius-input" v-model.number="radius" type="number" class="form-control" min="0" max="10" />
|
|
66
|
-
</div>
|
|
67
|
-
|
|
68
|
-
<div class="form-group mbe-12">
|
|
69
|
-
<label for="black-color-input">Black Color:</label>
|
|
70
|
-
<input id="black-color-input" v-model="blackColor" type="color" class="form-control" />
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<div class="form-group mbe-12">
|
|
74
|
-
<label for="white-color-input">White Color:</label>
|
|
75
|
-
<input id="white-color-input" v-model="whiteColor" type="color" class="form-control" />
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
<div class="form-group mbe-12">
|
|
79
|
-
<label for="size-slider">Size: {{ sizeValue }}px</label>
|
|
80
|
-
<input
|
|
81
|
-
id="size-slider"
|
|
82
|
-
v-model.number="sizeValue"
|
|
83
|
-
type="range"
|
|
84
|
-
class="form-control"
|
|
85
|
-
min="150"
|
|
86
|
-
max="600"
|
|
87
|
-
step="25"
|
|
88
|
-
/>
|
|
89
|
-
</div>
|
|
90
|
-
</form>
|
|
91
|
-
</div>
|
|
92
|
-
</PageRow>
|
|
93
|
-
</template>
|
|
94
|
-
</NuxtLayout>
|
|
95
|
-
</div>
|
|
96
|
-
</template>
|
|
97
|
-
|
|
98
|
-
<script setup lang="ts">
|
|
99
|
-
import type { QrCodeVariant } from "~/types/components";
|
|
100
|
-
|
|
101
|
-
definePageMeta({
|
|
102
|
-
layout: false,
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
useHead({
|
|
106
|
-
title: "Index",
|
|
107
|
-
meta: [
|
|
108
|
-
{
|
|
109
|
-
name: "description",
|
|
110
|
-
content: "Index Meta description content",
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
bodyAttrs: {
|
|
114
|
-
class: "qr-codes-index-page",
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const route = useRoute();
|
|
119
|
-
|
|
120
|
-
type QrComponentName = "decode" | "capture" | "display";
|
|
121
|
-
const componentName = computed<QrComponentName>(() => route.params.componentName as QrComponentName);
|
|
122
|
-
|
|
123
|
-
// Component set up
|
|
124
|
-
const DecodeQrCode = defineAsyncComponent(() => import("~/components/02.molecules/qr-code/DecodeQrCode.vue"));
|
|
125
|
-
const CaptureQrCode = defineAsyncComponent(() => import("~/components/02.molecules/qr-code/CaptureQrCode.vue"));
|
|
126
|
-
const DisplayQrCode = defineAsyncComponent(() => import("~/components/01.atoms/qr-code/DisplayQrCode.vue"));
|
|
127
|
-
|
|
128
|
-
const components: Record<
|
|
129
|
-
QrComponentName,
|
|
130
|
-
{
|
|
131
|
-
component: ReturnType<typeof defineAsyncComponent>;
|
|
132
|
-
props: () => Record<string, unknown>;
|
|
133
|
-
}
|
|
134
|
-
> = {
|
|
135
|
-
decode: {
|
|
136
|
-
component: DecodeQrCode,
|
|
137
|
-
props: () => ({
|
|
138
|
-
/* none needed */
|
|
139
|
-
}),
|
|
140
|
-
},
|
|
141
|
-
capture: {
|
|
142
|
-
component: CaptureQrCode,
|
|
143
|
-
props: () => ({ facingMode: "environment" }),
|
|
144
|
-
},
|
|
145
|
-
display: {
|
|
146
|
-
component: DisplayQrCode,
|
|
147
|
-
props: () => ({
|
|
148
|
-
qrValue: qrValue.value,
|
|
149
|
-
inputVariant: variant.value,
|
|
150
|
-
radius: radius.value,
|
|
151
|
-
blackColor: blackColor.value,
|
|
152
|
-
whiteColor: whiteColor.value,
|
|
153
|
-
size: size.value,
|
|
154
|
-
}),
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
// Config for display qr code
|
|
159
|
-
const pageHeader = computed(() => {
|
|
160
|
-
switch (componentName.value) {
|
|
161
|
-
case "decode":
|
|
162
|
-
return "Decode QR Code";
|
|
163
|
-
case "capture":
|
|
164
|
-
return "Capture QR Code";
|
|
165
|
-
case "display":
|
|
166
|
-
return "Display QR Code";
|
|
167
|
-
default:
|
|
168
|
-
return "QR Code";
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
const qrValue = ref("P|7450952822|144392");
|
|
173
|
-
const variant = ref<QrCodeVariant>({
|
|
174
|
-
inner: "circle",
|
|
175
|
-
marker: "rounded",
|
|
176
|
-
pixel: "dots",
|
|
177
|
-
});
|
|
178
|
-
const radius = ref(2);
|
|
179
|
-
const blackColor = ref("#000000");
|
|
180
|
-
const whiteColor = ref("#ffffff");
|
|
181
|
-
const sizeValue = ref(300);
|
|
182
|
-
const size = computed(() => `${sizeValue.value}px`);
|
|
183
|
-
|
|
184
|
-
const activeComponent = computed(() => components[componentName.value]?.component);
|
|
185
|
-
const activeProps = computed(() => components[componentName.value]?.props?.() ?? {});
|
|
186
|
-
</script>
|
|
187
|
-
|
|
188
|
-
<style lang="css">
|
|
189
|
-
.qr-codes-index-page {
|
|
190
|
-
.demo-panel {
|
|
191
|
-
display: flex;
|
|
192
|
-
flex-direction: row-reverse;
|
|
193
|
-
gap: 16px;
|
|
194
|
-
align-items: start;
|
|
195
|
-
|
|
196
|
-
.qr-code-col {
|
|
197
|
-
flex-grow: 1;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
form {
|
|
201
|
-
.form-group {
|
|
202
|
-
display: grid;
|
|
203
|
-
grid-template-columns: 150px 1fr;
|
|
204
|
-
gap: 20px;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
.qr-code-index-links-list {
|
|
210
|
-
display: flex;
|
|
211
|
-
gap: 12px;
|
|
212
|
-
|
|
213
|
-
list-style-type: none;
|
|
214
|
-
padding: 0;
|
|
215
|
-
margin: 0;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
</style>
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<NuxtLayout name="default">
|
|
4
|
-
<template #layout-content>
|
|
5
|
-
<PageRow tag="div" variant="full" :styleClassPassthrough="['mbe-20']">
|
|
6
|
-
<h1 class="page-heading-2">Rotating Carousel</h1>
|
|
7
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
8
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
9
|
-
<label for="rotateX">rotateX</label>
|
|
10
|
-
<input type="range" min="-20" max="20" step="1" v-model="rotateX" id="rotateX" />
|
|
11
|
-
<span>{{ rotateX }}deg</span>
|
|
12
|
-
</div>
|
|
13
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
14
|
-
<label for="perspective">perspective</label>
|
|
15
|
-
<input type="range" min="600" max="1500" step="50" v-model="perspective" id="perspective" />
|
|
16
|
-
<span>{{ perspective }}px</span>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
19
|
-
<label for="translateZ">translateZ</label>
|
|
20
|
-
<input type="range" min="350" max="900" step="10" v-model="translateZ" id="translateZ" />
|
|
21
|
-
<span>{{ translateZ }}px</span>
|
|
22
|
-
</div>
|
|
23
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
24
|
-
<label for="pauseOnHover">pauseOnHover</label>
|
|
25
|
-
<input type="checkbox" v-model="pauseOnHover" id="pauseOnHover" />
|
|
26
|
-
<span>{{ pauseOnHover }}</span>
|
|
27
|
-
</div>
|
|
28
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
29
|
-
<label for="useParallaxEffect">useParallaxEffect</label>
|
|
30
|
-
<input type="checkbox" v-model="useParallaxEffect" id="useParallaxEffect" />
|
|
31
|
-
<span>{{ useParallaxEffect }}</span>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
</PageRow>
|
|
35
|
-
|
|
36
|
-
<PageRow tag="div" variant="full" :styleClassPassthrough="['mbe-20']" style="margin-block: 300px">
|
|
37
|
-
<RotatingCarouselImage
|
|
38
|
-
:data
|
|
39
|
-
:rotateX="Number(rotateX)"
|
|
40
|
-
:perspective="Number(perspective)"
|
|
41
|
-
:translateZ="Number(translateZ)"
|
|
42
|
-
:pauseOnHover
|
|
43
|
-
:useParallaxEffect
|
|
44
|
-
/>
|
|
45
|
-
</PageRow>
|
|
46
|
-
|
|
47
|
-
<PageRow tag="div" variant="full" :styleClassPassthrough="['mbe-20']" style="margin-block-end: 600px">
|
|
48
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
49
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
50
|
-
<label for="rotateX">rotateX</label>
|
|
51
|
-
<input type="range" min="-20" max="20" step="1" v-model="rotateX" id="rotateX" />
|
|
52
|
-
<span>{{ rotateX }}deg</span>
|
|
53
|
-
</div>
|
|
54
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
55
|
-
<label for="perspective">perspective</label>
|
|
56
|
-
<input type="range" min="600" max="1500" step="50" v-model="perspective" id="perspective" />
|
|
57
|
-
<span>{{ perspective }}px</span>
|
|
58
|
-
</div>
|
|
59
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
60
|
-
<label for="translateZ">translateZ</label>
|
|
61
|
-
<input type="range" min="350" max="900" step="10" v-model="translateZ" id="translateZ" />
|
|
62
|
-
<span>{{ translateZ }}px</span>
|
|
63
|
-
</div>
|
|
64
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
65
|
-
<label for="pauseOnHover">pauseOnHover</label>
|
|
66
|
-
<input type="checkbox" v-model="pauseOnHover" id="pauseOnHover" />
|
|
67
|
-
<span>{{ pauseOnHover }}</span>
|
|
68
|
-
</div>
|
|
69
|
-
<div class="display-flex mbe-12" align-content="center-center" gap="12px" flex-wrap="wrap">
|
|
70
|
-
<label for="useParallaxEffect">useParallaxEffect</label>
|
|
71
|
-
<input type="checkbox" v-model="useParallaxEffect" id="useParallaxEffect" />
|
|
72
|
-
<span>{{ useParallaxEffect }}</span>
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
</PageRow>
|
|
76
|
-
</template>
|
|
77
|
-
</NuxtLayout>
|
|
78
|
-
</div>
|
|
79
|
-
</template>
|
|
80
|
-
|
|
81
|
-
<script setup lang="ts">
|
|
82
|
-
definePageMeta({
|
|
83
|
-
layout: false,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
useHead({
|
|
87
|
-
title: "Browser title tag",
|
|
88
|
-
meta: [
|
|
89
|
-
{
|
|
90
|
-
name: "description",
|
|
91
|
-
content: "Meta description content",
|
|
92
|
-
},
|
|
93
|
-
],
|
|
94
|
-
bodyAttrs: {
|
|
95
|
-
class: "classname-for-namespacing-if-desired",
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
const perspective = ref<number>(1000);
|
|
100
|
-
const rotateX = ref<number>(-13);
|
|
101
|
-
const translateZ = ref<number>(550);
|
|
102
|
-
const pauseOnHover = ref<boolean>(false);
|
|
103
|
-
const useParallaxEffect = ref<boolean>(true);
|
|
104
|
-
|
|
105
|
-
interface IAccordianData {
|
|
106
|
-
src: string;
|
|
107
|
-
alt: string;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const data = ref<IAccordianData[]>([
|
|
111
|
-
{
|
|
112
|
-
src: "/images/rotating-carousel/image-1.webp",
|
|
113
|
-
alt: "Image 1",
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
src: "/images/rotating-carousel/image-2.webp",
|
|
117
|
-
alt: "Image 2",
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
src: "/images/rotating-carousel/image-3.webp",
|
|
121
|
-
alt: "Image 3",
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
src: "/images/rotating-carousel/image-4.webp",
|
|
125
|
-
alt: "Image 4",
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
src: "/images/rotating-carousel/image-5.webp",
|
|
129
|
-
alt: "Image 5",
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
src: "/images/rotating-carousel/image-6.webp",
|
|
133
|
-
alt: "Image 6",
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
src: "/images/rotating-carousel/image-7.webp",
|
|
137
|
-
alt: "Image 7",
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
src: "/images/rotating-carousel/image-8.webp",
|
|
141
|
-
alt: "Image 8",
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
src: "/images/rotating-carousel/image-9.webp",
|
|
145
|
-
alt: "Image 9",
|
|
146
|
-
},
|
|
147
|
-
]);
|
|
148
|
-
</script>
|
|
149
|
-
|
|
150
|
-
<style lang="css">
|
|
151
|
-
.classname-for-namespacing-if-desired {
|
|
152
|
-
/* CSS styles */
|
|
153
|
-
}
|
|
154
|
-
</style>
|