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.
@@ -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
- <button
23
- class="pricing-card__cta"
24
- :disabled="ctaDisabled"
25
- @click="handleSelect"
26
- >
27
- {{ ctaText }}
28
- </button>
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
- &:hover:not(:disabled) {
212
- background-color: var(--_cta-bg-hover);
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
- &:disabled {
216
- opacity: 0.5;
217
- cursor: not-allowed;
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: ["@oddbird/css-anchor-positioning", "@vue/devtools-core", "@vue/devtools-kit", "vue-qrcode-reader"],
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.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
+ }