cinqcinqdev-seo 0.1.71 → 0.1.73

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 (123) hide show
  1. package/README.md +39 -2
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/assets/admin-tw.css +1 -1
  4. package/dist/runtime/components/admin-cms/DynamicRenderer.vue +16 -2
  5. package/dist/runtime/components/sections/{BlogHero.vue → cinqcinq/BlogHero.vue} +35 -3
  6. package/dist/runtime/components/sections/{CallToAction.vue → cinqcinq/CallToAction.vue} +35 -3
  7. package/dist/runtime/components/sections/{ContactForm.vue → cinqcinq/ContactForm.vue} +34 -2
  8. package/dist/runtime/components/sections/{FAQ.vue → cinqcinq/FAQ.vue} +35 -3
  9. package/dist/runtime/components/sections/{Features.vue → cinqcinq/Features.vue} +35 -3
  10. package/dist/runtime/components/sections/{HeroSection.vue → cinqcinq/HeroSection.vue} +11 -0
  11. package/dist/runtime/components/sections/{Newsletter.vue → cinqcinq/Newsletter.vue} +35 -3
  12. package/dist/runtime/components/sections/{Pricing.vue → cinqcinq/Pricing.vue} +35 -3
  13. package/dist/runtime/components/sections/{Process.vue → cinqcinq/Process.vue} +35 -3
  14. package/dist/runtime/components/sections/{Quote.vue → cinqcinq/Quote.vue} +35 -3
  15. package/dist/runtime/components/sections/{RichText.vue → cinqcinq/RichText.vue} +32 -4
  16. package/dist/runtime/components/sections/{ServiceGrid.vue → cinqcinq/ServiceGrid.vue} +35 -3
  17. package/dist/runtime/components/sections/{Testimonials.vue → cinqcinq/Testimonials.vue} +35 -3
  18. package/dist/runtime/components/sections/{TextVisual.vue → cinqcinq/TextVisual.vue} +39 -3
  19. package/dist/runtime/components/sections/swiss-style/BlogHero.d.vue.ts +3 -0
  20. package/dist/runtime/components/sections/swiss-style/BlogHero.vue +146 -0
  21. package/dist/runtime/components/sections/swiss-style/BlogHero.vue.d.ts +3 -0
  22. package/dist/runtime/components/sections/swiss-style/CallToAction.d.vue.ts +3 -0
  23. package/dist/runtime/components/sections/swiss-style/CallToAction.vue +138 -0
  24. package/dist/runtime/components/sections/swiss-style/CallToAction.vue.d.ts +3 -0
  25. package/dist/runtime/components/sections/swiss-style/Comparison.d.vue.ts +3 -0
  26. package/dist/runtime/components/sections/swiss-style/Comparison.vue +280 -0
  27. package/dist/runtime/components/sections/swiss-style/Comparison.vue.d.ts +3 -0
  28. package/dist/runtime/components/sections/swiss-style/ContactForm.d.vue.ts +3 -0
  29. package/dist/runtime/components/sections/swiss-style/ContactForm.vue +173 -0
  30. package/dist/runtime/components/sections/swiss-style/ContactForm.vue.d.ts +3 -0
  31. package/dist/runtime/components/sections/swiss-style/DataTable.d.vue.ts +3 -0
  32. package/dist/runtime/components/sections/swiss-style/DataTable.vue +245 -0
  33. package/dist/runtime/components/sections/swiss-style/DataTable.vue.d.ts +3 -0
  34. package/dist/runtime/components/sections/swiss-style/FAQ.d.vue.ts +3 -0
  35. package/dist/runtime/components/sections/swiss-style/FAQ.vue +107 -0
  36. package/dist/runtime/components/sections/swiss-style/FAQ.vue.d.ts +3 -0
  37. package/dist/runtime/components/sections/swiss-style/Features.d.vue.ts +3 -0
  38. package/dist/runtime/components/sections/swiss-style/Features.vue +103 -0
  39. package/dist/runtime/components/sections/swiss-style/Features.vue.d.ts +3 -0
  40. package/dist/runtime/components/sections/swiss-style/HeroFan.d.vue.ts +3 -0
  41. package/dist/runtime/components/sections/swiss-style/HeroFan.vue +108 -0
  42. package/dist/runtime/components/sections/swiss-style/HeroFan.vue.d.ts +3 -0
  43. package/dist/runtime/components/sections/swiss-style/HeroSection.d.vue.ts +3 -0
  44. package/dist/runtime/components/sections/swiss-style/HeroSection.vue +190 -0
  45. package/dist/runtime/components/sections/swiss-style/HeroSection.vue.d.ts +3 -0
  46. package/dist/runtime/components/sections/swiss-style/HeroSlider.d.vue.ts +3 -0
  47. package/dist/runtime/components/sections/swiss-style/HeroSlider.vue +138 -0
  48. package/dist/runtime/components/sections/swiss-style/HeroSlider.vue.d.ts +3 -0
  49. package/dist/runtime/components/sections/swiss-style/Newsletter.d.vue.ts +3 -0
  50. package/dist/runtime/components/sections/swiss-style/Newsletter.vue +125 -0
  51. package/dist/runtime/components/sections/swiss-style/Newsletter.vue.d.ts +3 -0
  52. package/dist/runtime/components/sections/swiss-style/Pricing.d.vue.ts +3 -0
  53. package/dist/runtime/components/sections/swiss-style/Pricing.vue +148 -0
  54. package/dist/runtime/components/sections/swiss-style/Pricing.vue.d.ts +3 -0
  55. package/dist/runtime/components/sections/swiss-style/Process.d.vue.ts +3 -0
  56. package/dist/runtime/components/sections/swiss-style/Process.vue +124 -0
  57. package/dist/runtime/components/sections/swiss-style/Process.vue.d.ts +3 -0
  58. package/dist/runtime/components/sections/swiss-style/Quote.d.vue.ts +3 -0
  59. package/dist/runtime/components/sections/swiss-style/Quote.vue +130 -0
  60. package/dist/runtime/components/sections/swiss-style/Quote.vue.d.ts +3 -0
  61. package/dist/runtime/components/sections/swiss-style/RelatedPages.d.vue.ts +3 -0
  62. package/dist/runtime/components/sections/swiss-style/RelatedPages.vue +212 -0
  63. package/dist/runtime/components/sections/swiss-style/RelatedPages.vue.d.ts +3 -0
  64. package/dist/runtime/components/sections/swiss-style/RichText.d.vue.ts +3 -0
  65. package/dist/runtime/components/sections/swiss-style/RichText.vue +100 -0
  66. package/dist/runtime/components/sections/swiss-style/RichText.vue.d.ts +3 -0
  67. package/dist/runtime/components/sections/swiss-style/ServiceGrid.d.vue.ts +3 -0
  68. package/dist/runtime/components/sections/swiss-style/ServiceGrid.vue +121 -0
  69. package/dist/runtime/components/sections/swiss-style/ServiceGrid.vue.d.ts +3 -0
  70. package/dist/runtime/components/sections/swiss-style/Testimonials.d.vue.ts +3 -0
  71. package/dist/runtime/components/sections/swiss-style/Testimonials.vue +126 -0
  72. package/dist/runtime/components/sections/swiss-style/Testimonials.vue.d.ts +3 -0
  73. package/dist/runtime/components/sections/swiss-style/TextVisual.d.vue.ts +3 -0
  74. package/dist/runtime/components/sections/swiss-style/TextVisual.vue +146 -0
  75. package/dist/runtime/components/sections/swiss-style/TextVisual.vue.d.ts +3 -0
  76. package/dist/runtime/composables/useAdminSections.js +75 -37
  77. package/dist/runtime/composables/useAdminSettings.d.ts +1 -0
  78. package/dist/runtime/pages/admin/editor/[id].vue +15 -1
  79. package/dist/runtime/pages/admin/setup.vue +77 -2
  80. package/package.json +1 -1
  81. /package/dist/runtime/components/sections/{BlogHero.d.vue.ts → cinqcinq/BlogHero.d.vue.ts} +0 -0
  82. /package/dist/runtime/components/sections/{BlogHero.vue.d.ts → cinqcinq/BlogHero.vue.d.ts} +0 -0
  83. /package/dist/runtime/components/sections/{CallToAction.d.vue.ts → cinqcinq/CallToAction.d.vue.ts} +0 -0
  84. /package/dist/runtime/components/sections/{CallToAction.vue.d.ts → cinqcinq/CallToAction.vue.d.ts} +0 -0
  85. /package/dist/runtime/components/sections/{Comparison.d.vue.ts → cinqcinq/Comparison.d.vue.ts} +0 -0
  86. /package/dist/runtime/components/sections/{Comparison.vue → cinqcinq/Comparison.vue} +0 -0
  87. /package/dist/runtime/components/sections/{Comparison.vue.d.ts → cinqcinq/Comparison.vue.d.ts} +0 -0
  88. /package/dist/runtime/components/sections/{ContactForm.d.vue.ts → cinqcinq/ContactForm.d.vue.ts} +0 -0
  89. /package/dist/runtime/components/sections/{ContactForm.vue.d.ts → cinqcinq/ContactForm.vue.d.ts} +0 -0
  90. /package/dist/runtime/components/sections/{DataTable.d.vue.ts → cinqcinq/DataTable.d.vue.ts} +0 -0
  91. /package/dist/runtime/components/sections/{DataTable.vue → cinqcinq/DataTable.vue} +0 -0
  92. /package/dist/runtime/components/sections/{DataTable.vue.d.ts → cinqcinq/DataTable.vue.d.ts} +0 -0
  93. /package/dist/runtime/components/sections/{FAQ.d.vue.ts → cinqcinq/FAQ.d.vue.ts} +0 -0
  94. /package/dist/runtime/components/sections/{FAQ.vue.d.ts → cinqcinq/FAQ.vue.d.ts} +0 -0
  95. /package/dist/runtime/components/sections/{Features.d.vue.ts → cinqcinq/Features.d.vue.ts} +0 -0
  96. /package/dist/runtime/components/sections/{Features.vue.d.ts → cinqcinq/Features.vue.d.ts} +0 -0
  97. /package/dist/runtime/components/sections/{HeroFan.d.vue.ts → cinqcinq/HeroFan.d.vue.ts} +0 -0
  98. /package/dist/runtime/components/sections/{HeroFan.vue → cinqcinq/HeroFan.vue} +0 -0
  99. /package/dist/runtime/components/sections/{HeroFan.vue.d.ts → cinqcinq/HeroFan.vue.d.ts} +0 -0
  100. /package/dist/runtime/components/sections/{HeroSection.d.vue.ts → cinqcinq/HeroSection.d.vue.ts} +0 -0
  101. /package/dist/runtime/components/sections/{HeroSection.vue.d.ts → cinqcinq/HeroSection.vue.d.ts} +0 -0
  102. /package/dist/runtime/components/sections/{HeroSlider.d.vue.ts → cinqcinq/HeroSlider.d.vue.ts} +0 -0
  103. /package/dist/runtime/components/sections/{HeroSlider.vue → cinqcinq/HeroSlider.vue} +0 -0
  104. /package/dist/runtime/components/sections/{HeroSlider.vue.d.ts → cinqcinq/HeroSlider.vue.d.ts} +0 -0
  105. /package/dist/runtime/components/sections/{Newsletter.d.vue.ts → cinqcinq/Newsletter.d.vue.ts} +0 -0
  106. /package/dist/runtime/components/sections/{Newsletter.vue.d.ts → cinqcinq/Newsletter.vue.d.ts} +0 -0
  107. /package/dist/runtime/components/sections/{Pricing.d.vue.ts → cinqcinq/Pricing.d.vue.ts} +0 -0
  108. /package/dist/runtime/components/sections/{Pricing.vue.d.ts → cinqcinq/Pricing.vue.d.ts} +0 -0
  109. /package/dist/runtime/components/sections/{Process.d.vue.ts → cinqcinq/Process.d.vue.ts} +0 -0
  110. /package/dist/runtime/components/sections/{Process.vue.d.ts → cinqcinq/Process.vue.d.ts} +0 -0
  111. /package/dist/runtime/components/sections/{Quote.d.vue.ts → cinqcinq/Quote.d.vue.ts} +0 -0
  112. /package/dist/runtime/components/sections/{Quote.vue.d.ts → cinqcinq/Quote.vue.d.ts} +0 -0
  113. /package/dist/runtime/components/sections/{RelatedPages.d.vue.ts → cinqcinq/RelatedPages.d.vue.ts} +0 -0
  114. /package/dist/runtime/components/sections/{RelatedPages.vue → cinqcinq/RelatedPages.vue} +0 -0
  115. /package/dist/runtime/components/sections/{RelatedPages.vue.d.ts → cinqcinq/RelatedPages.vue.d.ts} +0 -0
  116. /package/dist/runtime/components/sections/{RichText.d.vue.ts → cinqcinq/RichText.d.vue.ts} +0 -0
  117. /package/dist/runtime/components/sections/{RichText.vue.d.ts → cinqcinq/RichText.vue.d.ts} +0 -0
  118. /package/dist/runtime/components/sections/{ServiceGrid.d.vue.ts → cinqcinq/ServiceGrid.d.vue.ts} +0 -0
  119. /package/dist/runtime/components/sections/{ServiceGrid.vue.d.ts → cinqcinq/ServiceGrid.vue.d.ts} +0 -0
  120. /package/dist/runtime/components/sections/{Testimonials.d.vue.ts → cinqcinq/Testimonials.d.vue.ts} +0 -0
  121. /package/dist/runtime/components/sections/{Testimonials.vue.d.ts → cinqcinq/Testimonials.vue.d.ts} +0 -0
  122. /package/dist/runtime/components/sections/{TextVisual.d.vue.ts → cinqcinq/TextVisual.d.vue.ts} +0 -0
  123. /package/dist/runtime/components/sections/{TextVisual.vue.d.ts → cinqcinq/TextVisual.vue.d.ts} +0 -0
@@ -0,0 +1,146 @@
1
+ <template>
2
+ <section ref="sectionEl" :class="[sectionPad, isVisible ? 'sv-in' : 'sv-out']" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
+
4
+ <!-- SPLIT -->
5
+ <div v-if="layout === 'split'" :class="[containerClass, 'grid grid-cols-1 md:grid-cols-2 border divide-x', reverse ? 'md:[direction:rtl]' : '']" :style="{ borderColor: ca(textColor,'15') }">
6
+ <div class="p-10 md:p-14 flex flex-col justify-between" :style="{ direction: 'ltr' }">
7
+ <div>
8
+ <span v-if="badge" class="block text-[9px] font-black uppercase tracking-[0.5em] mb-6" :style="{ opacity: 0.35 }">{{ badge }}</span>
9
+ <component :is="titleTag" class="font-black uppercase leading-[0.88] mb-6" :style="{ fontSize: titleFontSize, letterSpacing: '-0.03em' }">{{ title }}</component>
10
+ <p :class="[bodyClass, 'leading-relaxed max-w-md']" :style="{ opacity: 0.55 }">{{ content }}</p>
11
+ </div>
12
+ <div v-if="ctas && ctas.length" class="flex flex-wrap gap-3 mt-10 pt-8 border-t" :style="{ borderColor: ca(textColor,'12') }">
13
+ <NuxtLink v-for="(cta, i) in ctas" :key="i" :to="cta.link || '#'"
14
+ class="inline-flex items-center gap-3 px-6 py-3 text-[11px] font-black uppercase tracking-widest transition-all hover:gap-6 border"
15
+ :style="i === 0 ? { backgroundColor: textColor, color: bgColor, borderColor: textColor } : { borderColor: ca(textColor,'40'), color: textColor }">
16
+ {{ cta.text }}<span>→</span>
17
+ </NuxtLink>
18
+ </div>
19
+ </div>
20
+ <div class="overflow-hidden min-h-[300px]" :style="{ direction: 'ltr' }">
21
+ <img v-if="image" :src="image" :alt="imageAlt || title" class="w-full h-full object-cover" />
22
+ <div v-else class="w-full h-full" :style="{ backgroundColor: ca(textColor,'06') }"></div>
23
+ </div>
24
+ </div>
25
+
26
+ <!-- STACKED -->
27
+ <div v-else-if="layout === 'stacked'" :class="[containerClass]">
28
+ <div class="border overflow-hidden mb-8" :style="{ borderColor: ca(textColor,'15'), height: '380px' }">
29
+ <img v-if="image" :src="image" class="w-full h-full object-cover" />
30
+ <div v-else class="w-full h-full" :style="{ backgroundColor: ca(textColor,'06') }"></div>
31
+ </div>
32
+ <div class="grid md:grid-cols-2 gap-10 border-t pt-8" :style="{ borderColor: ca(textColor,'12') }">
33
+ <div>
34
+ <span v-if="badge" class="block text-[9px] font-black uppercase tracking-[0.5em] mb-4" :style="{ opacity: 0.35 }">{{ badge }}</span>
35
+ <component :is="titleTag" class="font-black uppercase leading-[0.88]" :style="{ fontSize: titleFontSize, letterSpacing: '-0.03em' }">{{ title }}</component>
36
+ </div>
37
+ <div>
38
+ <p :class="[bodyClass, 'leading-relaxed mb-6']" :style="{ opacity: 0.55 }">{{ content }}</p>
39
+ <div v-if="ctas && ctas.length" class="flex flex-wrap gap-3">
40
+ <NuxtLink v-for="(cta, i) in ctas" :key="i" :to="cta.link || '#'"
41
+ class="inline-flex items-center gap-3 px-6 py-3 text-[11px] font-black uppercase tracking-widest transition-all hover:gap-6 border"
42
+ :style="i === 0 ? { backgroundColor: textColor, color: bgColor, borderColor: textColor } : { borderColor: ca(textColor,'40'), color: textColor }">
43
+ {{ cta.text }}<span>→</span>
44
+ </NuxtLink>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <!-- WIDE (default) -->
51
+ <div v-else :class="[containerClass, 'grid grid-cols-1 md:grid-cols-2 border divide-x', reverse ? 'md:[direction:rtl]' : '']" :style="{ borderColor: ca(textColor,'15') }">
52
+ <div class="overflow-hidden min-h-[280px]" :style="{ direction: 'ltr' }">
53
+ <img v-if="image" :src="image" class="w-full h-full object-cover" />
54
+ <div v-else class="w-full h-full" :style="{ backgroundColor: ca(textColor,'06') }"></div>
55
+ </div>
56
+ <div class="p-10 md:p-14 flex flex-col justify-between" :style="{ direction: 'ltr' }">
57
+ <div>
58
+ <span v-if="badge" class="block text-[9px] font-black uppercase tracking-[0.5em] mb-6" :style="{ opacity: 0.35 }">{{ badge }}</span>
59
+ <component :is="titleTag" class="font-black uppercase leading-[0.88] mb-6" :style="{ fontSize: titleFontSize, letterSpacing: '-0.03em' }">{{ title }}</component>
60
+ <p :class="[bodyClass, 'leading-relaxed']" :style="{ opacity: 0.55 }">{{ content }}</p>
61
+ </div>
62
+ <div v-if="ctas && ctas.length" class="flex flex-wrap gap-3 mt-8 pt-8 border-t" :style="{ borderColor: ca(textColor,'12') }">
63
+ <NuxtLink v-for="(cta, i) in ctas" :key="i" :to="cta.link || '#'"
64
+ class="inline-flex items-center gap-3 px-6 py-3 text-[11px] font-black uppercase tracking-widest transition-all hover:gap-6 border"
65
+ :style="i === 0 ? { backgroundColor: textColor, color: bgColor, borderColor: textColor } : { borderColor: ca(textColor,'40'), color: textColor }">
66
+ {{ cta.text }}<span>→</span>
67
+ </NuxtLink>
68
+ </div>
69
+ </div>
70
+ </div>
71
+
72
+ </section>
73
+ </template>
74
+
75
+ <script setup>
76
+ const ca = (c, h) => {
77
+ const m = c?.match(/rgba\((var\([^)]+\)),\s*[\d.]+\)/);
78
+ return m ? `rgba(${m[1]}, ${Math.round(parseInt(h, 16) / 255 * 1e3) / 1e3})` : (c || "") + h;
79
+ };
80
+ import { ref, computed, onMounted } from "vue";
81
+ const props = defineProps({
82
+ layout: { type: String, default: "split" },
83
+ badge: { type: String, default: "" },
84
+ title: { type: String, default: "" },
85
+ titleTag: { type: String, default: "h2" },
86
+ content: { type: String, default: "" },
87
+ image: { type: String, default: "" },
88
+ imageAlt: { type: String, default: "" },
89
+ reverse: { type: Boolean, default: false },
90
+ ctas: { type: Array, default: () => [] },
91
+ bgColor: { type: String, default: "rgba(var(--body-bg), 1)" },
92
+ textColor: { type: String, default: "rgba(var(--text-color), 1)" },
93
+ spacing: { type: String, default: "normal" },
94
+ radius: { type: String, default: "sharp" },
95
+ textDirection: { type: String, default: "ltr" },
96
+ contentWidth: { type: String, default: "normal" },
97
+ textSize: { type: String, default: "md" },
98
+ paddingTop: { type: String, default: "" },
99
+ paddingBottom: { type: String, default: "" },
100
+ marginTop: { type: String, default: "" },
101
+ marginBottom: { type: String, default: "" },
102
+ paddingX: { type: String, default: "" }
103
+ });
104
+ const sectionEl = ref(null);
105
+ const isVisible = ref(false);
106
+ onMounted(() => {
107
+ const obs = new IntersectionObserver(([e]) => {
108
+ if (e.isIntersecting) {
109
+ isVisible.value = true;
110
+ obs.disconnect();
111
+ }
112
+ }, { threshold: 0.06 });
113
+ if (sectionEl.value) obs.observe(sectionEl.value);
114
+ setTimeout(() => {
115
+ if (!isVisible.value) isVisible.value = true;
116
+ }, 300);
117
+ });
118
+ const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-8 md:px-16", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-8 md:px-16");
119
+ const containerClass = computed(() => ({ narrow: "max-w-3xl mx-auto", normal: "max-w-6xl mx-auto", wide: "max-w-7xl mx-auto", full: "max-w-full" })[props.contentWidth] || "max-w-6xl mx-auto");
120
+ const titleFontSize = computed(() => ({ sm: "clamp(1rem,1.5vw,1.3rem)", md: "clamp(1.5rem,2.5vw,2rem)", lg: "clamp(2rem,4vw,3.5rem)" })[props.textSize] || "clamp(1.5rem,2.5vw,2rem)");
121
+ const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
122
+ const imageContainerClass = computed(() => ({ sm: "aspect-video", md: "aspect-[4/3]", lg: "aspect-square" })["md"] || "aspect-[4/3]");
123
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
124
+ const spacingStyle = computed(() => {
125
+ const s = {};
126
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
127
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
128
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
129
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
130
+ if (props.paddingX && SM[props.paddingX]) {
131
+ const v = SM[props.paddingX];
132
+ if (v.startsWith("-")) {
133
+ s.marginLeft = v;
134
+ s.marginRight = v;
135
+ } else {
136
+ s.paddingLeft = v;
137
+ s.paddingRight = v;
138
+ }
139
+ }
140
+ return s;
141
+ });
142
+ </script>
143
+
144
+ <style scoped>
145
+ .sv-out{opacity:0;transform:translateY(16px)}.sv-in{opacity:1;transform:none;transition:opacity .6s ease,transform .6s ease}
146
+ </style>
@@ -0,0 +1,3 @@
1
+ declare const _default: typeof __VLS_export;
2
+ export default _default;
3
+ declare const __VLS_export: any;
@@ -104,6 +104,7 @@ export const DEFAULT_SECTIONS = {
104
104
  paddingBottom: "",
105
105
  marginTop: "",
106
106
  marginBottom: "",
107
+ paddingX: "",
107
108
  overlay: "auto",
108
109
  overlayDirection: "to top",
109
110
  overlayStrength: "medium",
@@ -165,7 +166,8 @@ export const DEFAULT_SECTIONS = {
165
166
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
166
167
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
167
168
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
168
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
169
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
170
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
169
171
  }
170
172
  },
171
173
  HeroSlider: {
@@ -195,7 +197,8 @@ export const DEFAULT_SECTIONS = {
195
197
  paddingTop: "",
196
198
  paddingBottom: "",
197
199
  marginTop: "",
198
- marginBottom: ""
200
+ marginBottom: "",
201
+ paddingX: ""
199
202
  },
200
203
  fields: {
201
204
  slides: { type: "list", label: "Slides", itemLabel: "title", itemFields: {
@@ -247,7 +250,8 @@ export const DEFAULT_SECTIONS = {
247
250
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
248
251
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
249
252
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
250
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
253
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
254
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
251
255
  }
252
256
  },
253
257
  HeroFan: {
@@ -276,7 +280,8 @@ export const DEFAULT_SECTIONS = {
276
280
  paddingTop: "",
277
281
  paddingBottom: "",
278
282
  marginTop: "",
279
- marginBottom: ""
283
+ marginBottom: "",
284
+ paddingX: ""
280
285
  },
281
286
  fields: {
282
287
  titleTag: { type: "select", label: "SEO Tag", options: tagOptions },
@@ -310,7 +315,8 @@ export const DEFAULT_SECTIONS = {
310
315
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
311
316
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
312
317
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
313
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
318
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
319
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
314
320
  }
315
321
  },
316
322
  TextVisual: {
@@ -339,7 +345,8 @@ export const DEFAULT_SECTIONS = {
339
345
  paddingTop: "",
340
346
  paddingBottom: "",
341
347
  marginTop: "",
342
- marginBottom: ""
348
+ marginBottom: "",
349
+ paddingX: ""
343
350
  },
344
351
  fields: {
345
352
  layout: { type: "cards", label: "Layout", options: [
@@ -378,7 +385,8 @@ export const DEFAULT_SECTIONS = {
378
385
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
379
386
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
380
387
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
381
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
388
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
389
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
382
390
  }
383
391
  },
384
392
  ServiceGrid: {
@@ -404,7 +412,8 @@ export const DEFAULT_SECTIONS = {
404
412
  paddingTop: "",
405
413
  paddingBottom: "",
406
414
  marginTop: "",
407
- marginBottom: ""
415
+ marginBottom: "",
416
+ paddingX: ""
408
417
  },
409
418
  fields: {
410
419
  layout: { type: "cards", label: "Layout", options: [
@@ -436,7 +445,8 @@ export const DEFAULT_SECTIONS = {
436
445
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
437
446
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
438
447
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
439
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
448
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
449
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
440
450
  }
441
451
  },
442
452
  Features: {
@@ -455,7 +465,8 @@ export const DEFAULT_SECTIONS = {
455
465
  paddingTop: "",
456
466
  paddingBottom: "",
457
467
  marginTop: "",
458
- marginBottom: ""
468
+ marginBottom: "",
469
+ paddingX: ""
459
470
  },
460
471
  fields: {
461
472
  title: { type: "text", label: "Section Title", i18n: true },
@@ -473,7 +484,8 @@ export const DEFAULT_SECTIONS = {
473
484
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
474
485
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
475
486
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
476
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
487
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
488
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
477
489
  }
478
490
  },
479
491
  FAQ: {
@@ -492,7 +504,8 @@ export const DEFAULT_SECTIONS = {
492
504
  paddingTop: "",
493
505
  paddingBottom: "",
494
506
  marginTop: "",
495
- marginBottom: ""
507
+ marginBottom: "",
508
+ paddingX: ""
496
509
  },
497
510
  fields: {
498
511
  title: { type: "text", label: "Title", i18n: true },
@@ -510,7 +523,8 @@ export const DEFAULT_SECTIONS = {
510
523
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
511
524
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
512
525
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
513
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
526
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
527
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
514
528
  }
515
529
  },
516
530
  Process: {
@@ -533,7 +547,8 @@ export const DEFAULT_SECTIONS = {
533
547
  paddingTop: "",
534
548
  paddingBottom: "",
535
549
  marginTop: "",
536
- marginBottom: ""
550
+ marginBottom: "",
551
+ paddingX: ""
537
552
  },
538
553
  fields: {
539
554
  layout: { type: "cards", label: "Layout", options: [
@@ -562,7 +577,8 @@ export const DEFAULT_SECTIONS = {
562
577
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
563
578
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
564
579
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
565
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
580
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
581
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
566
582
  }
567
583
  },
568
584
  Testimonials: {
@@ -585,7 +601,8 @@ export const DEFAULT_SECTIONS = {
585
601
  paddingTop: "",
586
602
  paddingBottom: "",
587
603
  marginTop: "",
588
- marginBottom: ""
604
+ marginBottom: "",
605
+ paddingX: ""
589
606
  },
590
607
  fields: {
591
608
  layout: { type: "cards", label: "Layout", options: [
@@ -616,7 +633,8 @@ export const DEFAULT_SECTIONS = {
616
633
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
617
634
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
618
635
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
619
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
636
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
637
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
620
638
  }
621
639
  },
622
640
  Pricing: {
@@ -639,7 +657,8 @@ export const DEFAULT_SECTIONS = {
639
657
  paddingTop: "",
640
658
  paddingBottom: "",
641
659
  marginTop: "",
642
- marginBottom: ""
660
+ marginBottom: "",
661
+ paddingX: ""
643
662
  },
644
663
  fields: {
645
664
  layout: { type: "cards", label: "Layout", options: [
@@ -670,7 +689,8 @@ export const DEFAULT_SECTIONS = {
670
689
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
671
690
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
672
691
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
673
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
692
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
693
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
674
694
  }
675
695
  },
676
696
  ContactForm: {
@@ -692,7 +712,8 @@ export const DEFAULT_SECTIONS = {
692
712
  paddingTop: "",
693
713
  paddingBottom: "",
694
714
  marginTop: "",
695
- marginBottom: ""
715
+ marginBottom: "",
716
+ paddingX: ""
696
717
  },
697
718
  fields: {
698
719
  layout: { type: "cards", label: "Layout", options: [
@@ -714,7 +735,8 @@ export const DEFAULT_SECTIONS = {
714
735
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
715
736
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
716
737
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
717
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
738
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
739
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
718
740
  }
719
741
  },
720
742
  // ── Blog sections ─────────────────────────────────────────────────────────
@@ -743,7 +765,8 @@ export const DEFAULT_SECTIONS = {
743
765
  paddingTop: "",
744
766
  paddingBottom: "",
745
767
  marginTop: "",
746
- marginBottom: ""
768
+ marginBottom: "",
769
+ paddingX: ""
747
770
  },
748
771
  fields: {
749
772
  layout: { type: "cards", label: "Layout", options: [
@@ -775,7 +798,8 @@ export const DEFAULT_SECTIONS = {
775
798
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
776
799
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
777
800
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
778
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
801
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
802
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
779
803
  }
780
804
  },
781
805
  RichText: {
@@ -798,7 +822,8 @@ export const DEFAULT_SECTIONS = {
798
822
  paddingTop: "",
799
823
  paddingBottom: "",
800
824
  marginTop: "",
801
- marginBottom: ""
825
+ marginBottom: "",
826
+ paddingX: ""
802
827
  },
803
828
  fields: {
804
829
  layout: { type: "cards", label: "Width", options: [
@@ -826,7 +851,8 @@ export const DEFAULT_SECTIONS = {
826
851
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
827
852
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
828
853
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
829
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
854
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
855
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
830
856
  }
831
857
  },
832
858
  CallToAction: {
@@ -851,7 +877,8 @@ export const DEFAULT_SECTIONS = {
851
877
  paddingTop: "",
852
878
  paddingBottom: "",
853
879
  marginTop: "",
854
- marginBottom: ""
880
+ marginBottom: "",
881
+ paddingX: ""
855
882
  },
856
883
  fields: {
857
884
  layout: { type: "cards", label: "Layout", options: [
@@ -876,7 +903,8 @@ export const DEFAULT_SECTIONS = {
876
903
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
877
904
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
878
905
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
879
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
906
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
907
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
880
908
  }
881
909
  },
882
910
  Quote: {
@@ -897,7 +925,8 @@ export const DEFAULT_SECTIONS = {
897
925
  paddingTop: "",
898
926
  paddingBottom: "",
899
927
  marginTop: "",
900
- marginBottom: ""
928
+ marginBottom: "",
929
+ paddingX: ""
901
930
  },
902
931
  fields: {
903
932
  layout: { type: "cards", label: "Layout", options: [
@@ -918,7 +947,8 @@ export const DEFAULT_SECTIONS = {
918
947
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
919
948
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
920
949
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
921
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
950
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
951
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
922
952
  }
923
953
  },
924
954
  DataTable: {
@@ -960,7 +990,8 @@ export const DEFAULT_SECTIONS = {
960
990
  paddingTop: "",
961
991
  paddingBottom: "",
962
992
  marginTop: "",
963
- marginBottom: ""
993
+ marginBottom: "",
994
+ paddingX: ""
964
995
  },
965
996
  fields: {
966
997
  layout: { type: "cards", label: "Layout", options: [
@@ -1006,7 +1037,8 @@ export const DEFAULT_SECTIONS = {
1006
1037
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
1007
1038
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
1008
1039
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
1009
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
1040
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
1041
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
1010
1042
  }
1011
1043
  },
1012
1044
  Comparison: {
@@ -1036,7 +1068,8 @@ export const DEFAULT_SECTIONS = {
1036
1068
  paddingTop: "",
1037
1069
  paddingBottom: "",
1038
1070
  marginTop: "",
1039
- marginBottom: ""
1071
+ marginBottom: "",
1072
+ paddingX: ""
1040
1073
  },
1041
1074
  fields: {
1042
1075
  layout: { type: "cards", label: "Layout", options: [
@@ -1075,7 +1108,8 @@ export const DEFAULT_SECTIONS = {
1075
1108
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
1076
1109
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
1077
1110
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
1078
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
1111
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
1112
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
1079
1113
  }
1080
1114
  },
1081
1115
  RelatedPages: {
@@ -1101,7 +1135,8 @@ export const DEFAULT_SECTIONS = {
1101
1135
  paddingTop: "",
1102
1136
  paddingBottom: "",
1103
1137
  marginTop: "",
1104
- marginBottom: ""
1138
+ marginBottom: "",
1139
+ paddingX: ""
1105
1140
  },
1106
1141
  fields: {
1107
1142
  layout: { type: "cards", label: "Layout", options: [
@@ -1130,7 +1165,8 @@ export const DEFAULT_SECTIONS = {
1130
1165
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
1131
1166
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
1132
1167
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
1133
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
1168
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
1169
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
1134
1170
  }
1135
1171
  },
1136
1172
  Newsletter: {
@@ -1154,7 +1190,8 @@ export const DEFAULT_SECTIONS = {
1154
1190
  paddingTop: "",
1155
1191
  paddingBottom: "",
1156
1192
  marginTop: "",
1157
- marginBottom: ""
1193
+ marginBottom: "",
1194
+ paddingX: ""
1158
1195
  },
1159
1196
  fields: {
1160
1197
  layout: { type: "cards", label: "Layout", options: [
@@ -1178,7 +1215,8 @@ export const DEFAULT_SECTIONS = {
1178
1215
  paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
1179
1216
  paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
1180
1217
  marginTop: { type: "select", label: "Margin Top", options: marginOptions },
1181
- marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
1218
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions },
1219
+ paddingX: { type: "select", label: "Padding X", options: marginOptions }
1182
1220
  }
1183
1221
  }
1184
1222
  };
@@ -19,6 +19,7 @@ export interface BrandSettings {
19
19
  font_body?: string;
20
20
  ai_context?: string;
21
21
  section_presets?: Record<string, SectionPreset>;
22
+ theme?: 'cinqcinq' | 'swiss-style';
22
23
  updated_at?: string;
23
24
  }
24
25
  export declare const useAdminSettings: () => {
@@ -62,7 +62,21 @@ const selectPage = (item, key, page2) => {
62
62
  pagePickerOpen.value[key] = false;
63
63
  trigger();
64
64
  };
65
- const resolveSection = (type) => vueApp.component(`Sections${type}`) || vueApp.component(type) || null;
65
+ const themePrefix = computed(() => {
66
+ const t = adminSettings.settings.value?.theme || "";
67
+ if (!t) return "";
68
+ return t.split("-").map((s) => s[0].toUpperCase() + s.slice(1)).join("");
69
+ });
70
+ const resolveSection = (type) => {
71
+ const flat = vueApp.component(`Sections${type}`);
72
+ if (flat) return flat;
73
+ const prefix = themePrefix.value;
74
+ if (prefix) {
75
+ const themed = vueApp.component(`Sections${prefix}${type}`);
76
+ if (themed) return themed;
77
+ }
78
+ return vueApp.component(type) || null;
79
+ };
66
80
  const { data: _rawPage } = await useAsyncData(`admin-edit-${pageId}`, async () => {
67
81
  const { data } = await supabase.from(table).select("*").eq("id", pageId).maybeSingle();
68
82
  return data;