srcdev-nuxt-components 9.2.2 → 9.2.4
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/skills/components/input-copy.md +169 -0
- package/.claude/skills/components/pricing-card.md +163 -0
- package/.claude/skills/index.md +3 -1
- package/.claude/skills/setup-postinstall.md +5 -2
- package/.claude/skills/using-component-skills.md +215 -0
- package/.vscode/extensions.json +15 -0
- package/.vscode/settings.json +45 -0
- package/.vscode/srcdev-component-banner-video.code-snippets +59 -0
- package/.vscode/srcdev-component-dialog.code-snippets +126 -0
- package/.vscode/srcdev-component-display-prompt.code-snippets +66 -0
- package/.vscode/srcdev-component-display-toast.code-snippets +78 -0
- package/.vscode/srcdev-component-input-copy.code-snippets +72 -0
- package/.vscode/srcdev-component-pinia-store.code-snippets +63 -0
- package/.vscode/srcdev-component-pricing-card.code-snippets +129 -0
- package/.vscode/srcdev-component-services-section.code-snippets +84 -0
- package/app/components/02.molecules/pricing-card/PricingCard.vue +24 -21
- package/nuxt.config.ts +6 -1
- package/package.json +3 -1
- package/scripts/copy-snippets.mjs +38 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV ServicesSection Full Mode": {
|
|
3
|
+
"description": "ServicesSection full mode — complete content with CTA",
|
|
4
|
+
"scope": "vue,html",
|
|
5
|
+
"body": [
|
|
6
|
+
"<ServicesSection",
|
|
7
|
+
" :service-data=\"$1service\"",
|
|
8
|
+
" :index=\"$2index\"",
|
|
9
|
+
">",
|
|
10
|
+
" <template #cta>",
|
|
11
|
+
" <button type=\"button\">$3Book Now</button>",
|
|
12
|
+
" </template>",
|
|
13
|
+
"</ServicesSection>"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"SRCDEV ServicesSection Summary Mode": {
|
|
17
|
+
"description": "ServicesSection summary mode — compact card with summary-link slot",
|
|
18
|
+
"scope": "vue,html",
|
|
19
|
+
"body": [
|
|
20
|
+
"<ServicesSection",
|
|
21
|
+
" :service-data=\"$1service\"",
|
|
22
|
+
" is-summary",
|
|
23
|
+
" summary-alignment=\"$2center\"",
|
|
24
|
+
">",
|
|
25
|
+
" <template #summary-link=\"{ serviceData }\">",
|
|
26
|
+
" <NuxtLink :to=\"`/services/${serviceData.slug}`\">$3More about {{ serviceData.title }} →</NuxtLink>",
|
|
27
|
+
" </template>",
|
|
28
|
+
"</ServicesSection>"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"SRCDEV ServicesSection Custom Headings And Cta": {
|
|
32
|
+
"description": "ServicesSection with custom section headings and CTA copy props",
|
|
33
|
+
"scope": "vue,html",
|
|
34
|
+
"body": [
|
|
35
|
+
"<ServicesSection",
|
|
36
|
+
" :service-data=\"$1service\"",
|
|
37
|
+
" process-heading=\"$2How It Works\"",
|
|
38
|
+
" ideal-for-heading=\"$3Who Is This For\"",
|
|
39
|
+
" maintenance-heading=\"$4Aftercare\"",
|
|
40
|
+
" faqs-heading=\"$5FAQs\"",
|
|
41
|
+
" cta-heading=\"$6Ready to book?\"",
|
|
42
|
+
" cta-body=\"$7Get in touch to book your appointment.\"",
|
|
43
|
+
">",
|
|
44
|
+
" <template #cta>",
|
|
45
|
+
" <button type=\"button\">$8Book Now</button>",
|
|
46
|
+
" </template>",
|
|
47
|
+
"</ServicesSection>"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"SRCDEV ServicesSection Custom Cta Panel Slot": {
|
|
51
|
+
"description": "ServicesSection with the cta-panel slot fully replacing the default GlassPanel",
|
|
52
|
+
"scope": "vue,html",
|
|
53
|
+
"body": [
|
|
54
|
+
"<ServicesSection :service-data=\"$1service\">",
|
|
55
|
+
" <template #cta-panel=\"{ serviceData, ctaHeading, ctaBody }\">",
|
|
56
|
+
" $2",
|
|
57
|
+
" </template>",
|
|
58
|
+
"</ServicesSection>"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"SRCDEV ServicesSection CSS Override": {
|
|
62
|
+
"description": "CSS override scaffold for ServicesSection — scope to a page or section class",
|
|
63
|
+
"scope": "css",
|
|
64
|
+
"body": [
|
|
65
|
+
".$1my-page {",
|
|
66
|
+
" .services-section {",
|
|
67
|
+
" --services-section-grid-gap: ;",
|
|
68
|
+
" --services-section-grid-gap-desktop: ;",
|
|
69
|
+
" --services-section-image-border-radius: ;",
|
|
70
|
+
" --services-section-price-duration-gap: ;",
|
|
71
|
+
" --services-section-decorator-size: ;",
|
|
72
|
+
" --services-section-faq-divider-color: ;",
|
|
73
|
+
" --services-section-faq-answer-line-height: ;",
|
|
74
|
+
"",
|
|
75
|
+
" .services-section__image-wrapper {}",
|
|
76
|
+
" .services-section__info-wrapper {}",
|
|
77
|
+
" .services-section__price-duration {}",
|
|
78
|
+
" .services-section__faq {}",
|
|
79
|
+
" .services-section__glass-panel {}",
|
|
80
|
+
" }",
|
|
81
|
+
"}"
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -19,13 +19,21 @@
|
|
|
19
19
|
</slot>
|
|
20
20
|
</ul>
|
|
21
21
|
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
<div class="pricing-card__cta">
|
|
23
|
+
<slot
|
|
24
|
+
name="cta"
|
|
25
|
+
:cta-text="ctaText"
|
|
26
|
+
:is-disabled="ctaDisabled"
|
|
27
|
+
:plan-name="planName"
|
|
28
|
+
:on-select="handleSelect"
|
|
29
|
+
>
|
|
30
|
+
<InputButtonCore
|
|
31
|
+
:button-text="ctaText"
|
|
32
|
+
:readonly="ctaDisabled"
|
|
33
|
+
@click="handleSelect"
|
|
34
|
+
/>
|
|
35
|
+
</slot>
|
|
36
|
+
</div>
|
|
29
37
|
</component>
|
|
30
38
|
</template>
|
|
31
39
|
|
|
@@ -199,22 +207,17 @@ watch(
|
|
|
199
207
|
|
|
200
208
|
.pricing-card__cta {
|
|
201
209
|
align-self: flex-start;
|
|
202
|
-
padding: var(--_cta-padding);
|
|
203
|
-
background-color: var(--_cta-bg);
|
|
204
|
-
color: var(--_cta-text);
|
|
205
|
-
border: none;
|
|
206
|
-
border-radius: var(--_cta-border-radius);
|
|
207
|
-
font-weight: 600;
|
|
208
|
-
cursor: pointer;
|
|
209
|
-
transition: background-color 0.2s ease;
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
211
|
+
:deep(.input-button-core) {
|
|
212
|
+
padding: var(--_cta-padding);
|
|
213
|
+
background-color: var(--_cta-bg);
|
|
214
|
+
color: var(--_cta-text);
|
|
215
|
+
border-radius: var(--_cta-border-radius);
|
|
216
|
+
font-weight: 600;
|
|
214
217
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
+
&:hover:not([aria-disabled="true"]) {
|
|
219
|
+
background-color: var(--_cta-bg-hover);
|
|
220
|
+
}
|
|
218
221
|
}
|
|
219
222
|
}
|
|
220
223
|
}
|
package/nuxt.config.ts
CHANGED
|
@@ -123,7 +123,12 @@ export default defineNuxtConfig({
|
|
|
123
123
|
},
|
|
124
124
|
vite: {
|
|
125
125
|
optimizeDeps: {
|
|
126
|
-
include: [
|
|
126
|
+
include: [
|
|
127
|
+
"@oddbird/css-anchor-positioning",
|
|
128
|
+
"@vue/devtools-core",
|
|
129
|
+
"@vue/devtools-kit",
|
|
130
|
+
...(isStandalone ? ["vue-qrcode-reader"] : []),
|
|
131
|
+
],
|
|
127
132
|
},
|
|
128
133
|
},
|
|
129
134
|
vue: {
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "srcdev-nuxt-components",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "9.2.
|
|
4
|
+
"version": "9.2.4",
|
|
5
5
|
"main": "nuxt.config.ts",
|
|
6
6
|
"types": "types.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"scripts": {
|
|
9
|
+
"postinstall": "node scripts/copy-snippets.mjs",
|
|
9
10
|
"clean": "rm -rf .nuxt && rm -rf .output",
|
|
10
11
|
"cleanall": "rm -rf node_modules && rm -rf .nuxt && rm -rf .output && rm package-lock.json",
|
|
11
12
|
"reinstall": "rm -rf node_modules && npm install",
|
|
@@ -32,6 +33,7 @@
|
|
|
32
33
|
},
|
|
33
34
|
"files": [
|
|
34
35
|
".claude/",
|
|
36
|
+
".vscode/",
|
|
35
37
|
"app/",
|
|
36
38
|
"modules/",
|
|
37
39
|
"scripts/",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { copyFileSync, mkdirSync, readdirSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
|
|
5
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
6
|
+
const srcDir = join(__dirname, '../.vscode');
|
|
7
|
+
const destDir = join(process.cwd(), '.vscode');
|
|
8
|
+
|
|
9
|
+
// Only run when installed as a package (not in the layer's own repo)
|
|
10
|
+
if (process.cwd() === join(__dirname, '..')) {
|
|
11
|
+
console.log('⊘ Skipping snippet copy (running in layer repo)');
|
|
12
|
+
process.exit(0);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
mkdirSync(destDir, { recursive: true });
|
|
16
|
+
|
|
17
|
+
// Find and copy all .code-snippets files
|
|
18
|
+
try {
|
|
19
|
+
const files = readdirSync(srcDir).filter(file => file.endsWith('.code-snippets'));
|
|
20
|
+
|
|
21
|
+
if (files.length === 0) {
|
|
22
|
+
console.log('⊘ No snippet files found');
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
files.forEach(file => {
|
|
27
|
+
try {
|
|
28
|
+
copyFileSync(join(srcDir, file), join(destDir, file));
|
|
29
|
+
console.log(`✓ Copied VSCode snippet: ${file}`);
|
|
30
|
+
} catch (err) {
|
|
31
|
+
console.warn(`⚠ Failed to copy ${file}:`, err.message);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
console.log(`✓ VSCode snippets installed to .vscode/`);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.warn('⚠ Snippet installation skipped:', err.message);
|
|
38
|
+
}
|