cinqcinqdev-seo 0.1.55 → 0.1.57

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/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.0.0"
6
6
  },
7
- "version": "0.1.55",
7
+ "version": "0.1.57",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "unknown"
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
 
4
4
  <!-- ── CENTERED ─────────────────────────────────────────────── -->
5
5
  <div v-if="layout === 'centered'" :class="[sectionPad]">
@@ -140,7 +140,11 @@ const props = defineProps({
140
140
  radius: { type: String, default: "rounded" },
141
141
  textDirection: { type: String, default: "ltr" },
142
142
  contentWidth: { type: String, default: "narrow" },
143
- textSize: { type: String, default: "md" }
143
+ textSize: { type: String, default: "md" },
144
+ paddingTop: { type: String, default: "" },
145
+ paddingBottom: { type: String, default: "" },
146
+ marginTop: { type: String, default: "" },
147
+ marginBottom: { type: String, default: "" }
144
148
  });
145
149
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
146
150
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-[24px]", pill: "rounded-[36px]" })[props.radius] || "rounded-[24px]");
@@ -150,4 +154,13 @@ const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base
150
154
  const alignText = computed(() => ({ left: "text-left", center: "text-center", right: "text-right" })[props.textAlign] || "text-center");
151
155
  const alignFlex = computed(() => ({ left: "justify-start", center: "justify-center", right: "justify-end" })[props.textAlign] || "justify-center");
152
156
  const alignProse = computed(() => ({ left: "max-w-2xl", center: "max-w-2xl mx-auto", right: "max-w-2xl ml-auto" })[props.textAlign] || "max-w-2xl mx-auto");
157
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
158
+ const spacingStyle = computed(() => {
159
+ const s = {};
160
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
161
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
162
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
163
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
164
+ return s;
165
+ });
153
166
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
 
4
4
  <!-- CENTERED -->
5
5
  <div v-if="layout === 'centered'" :class="[containerClass, 'text-center']">
@@ -81,11 +81,24 @@ const props = defineProps({
81
81
  radius: { type: String, default: "rounded" },
82
82
  textDirection: { type: String, default: "ltr" },
83
83
  contentWidth: { type: String, default: "normal" },
84
- textSize: { type: String, default: "md" }
84
+ textSize: { type: String, default: "md" },
85
+ paddingTop: { type: String, default: "" },
86
+ paddingBottom: { type: String, default: "" },
87
+ marginTop: { type: String, default: "" },
88
+ marginBottom: { type: String, default: "" }
85
89
  });
86
90
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
87
91
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-2xl", pill: "rounded-full" })[props.radius] || "rounded-2xl");
88
92
  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");
89
93
  const titleFontSize = computed(() => ({ sm: "clamp(1rem,1.5vw,1.3rem)", md: "clamp(1.3rem,2vw,1.8rem)", lg: "clamp(2.5rem,8vw,5.5rem)" })[props.textSize] || "clamp(1.3rem,2vw,1.8rem)");
90
94
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
95
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
96
+ const spacingStyle = computed(() => {
97
+ const s = {};
98
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
99
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
100
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
101
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
102
+ return s;
103
+ });
91
104
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <!-- Header -->
@@ -238,7 +238,11 @@ const props = defineProps({
238
238
  radius: { type: String, default: "rounded" },
239
239
  textDirection: { type: String, default: "ltr" },
240
240
  contentWidth: { type: String, default: "normal" },
241
- textSize: { type: String, default: "md" }
241
+ textSize: { type: String, default: "md" },
242
+ paddingTop: { type: String, default: "" },
243
+ paddingBottom: { type: String, default: "" },
244
+ marginTop: { type: String, default: "" },
245
+ marginBottom: { type: String, default: "" }
242
246
  });
243
247
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
244
248
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
@@ -261,4 +265,13 @@ const gridCols = computed(() => {
261
265
  if (n === 4) return "grid-cols-1 sm:grid-cols-2 xl:grid-cols-4";
262
266
  return "grid-cols-1 md:grid-cols-3";
263
267
  });
268
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
269
+ const spacingStyle = computed(() => {
270
+ const s = {};
271
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
272
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
273
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
274
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
275
+ return s;
276
+ });
264
277
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <!-- SPLIT layout -->
@@ -112,6 +112,10 @@ const props = defineProps({
112
112
  textDirection: { type: String, default: "ltr" },
113
113
  contentWidth: { type: String, default: "normal" },
114
114
  textSize: { type: String, default: "md" },
115
+ paddingTop: { type: String, default: "" },
116
+ paddingBottom: { type: String, default: "" },
117
+ marginTop: { type: String, default: "" },
118
+ marginBottom: { type: String, default: "" },
115
119
  fields: {
116
120
  type: Array,
117
121
  default: () => [
@@ -145,4 +149,13 @@ const handleSubmit = async () => {
145
149
  sent.value = false;
146
150
  }, 4e3);
147
151
  };
152
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
153
+ const spacingStyle = computed(() => {
154
+ const s = {};
155
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
156
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
157
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
158
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
159
+ return s;
160
+ });
148
161
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <!-- Header row: title + search -->
@@ -204,4 +204,13 @@ const gridCols = computed(() => {
204
204
  if (n <= 3) return "grid-cols-1 md:grid-cols-2";
205
205
  return "grid-cols-1 md:grid-cols-2 lg:grid-cols-3";
206
206
  });
207
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
208
+ const spacingStyle = computed(() => {
209
+ const s = {};
210
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
211
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
212
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
213
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
214
+ return s;
215
+ });
207
216
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
  <div class="text-center mb-16">
5
5
  <component :is="titleTag" class="font-black uppercase tracking-tighter italic" :style="{ fontSize: titleFontSize }">{{ title }}</component>
@@ -42,7 +42,11 @@ const props = defineProps({
42
42
  radius: { type: String, default: "rounded" },
43
43
  textDirection: { type: String, default: "ltr" },
44
44
  contentWidth: { type: String, default: "narrow" },
45
- textSize: { type: String, default: "md" }
45
+ textSize: { type: String, default: "md" },
46
+ paddingTop: { type: String, default: "" },
47
+ paddingBottom: { type: String, default: "" },
48
+ marginTop: { type: String, default: "" },
49
+ marginBottom: { type: String, default: "" }
46
50
  });
47
51
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
48
52
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-[24px]", pill: "rounded-[36px]" })[props.radius] || "rounded-[24px]");
@@ -53,4 +57,13 @@ const openIndex = ref(null);
53
57
  const toggle = (index) => {
54
58
  openIndex.value = openIndex.value === index ? null : index;
55
59
  };
60
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
61
+ const spacingStyle = computed(() => {
62
+ const s = {};
63
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
64
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
65
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
66
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
67
+ return s;
68
+ });
56
69
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad, 'overflow-hidden']" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad, 'overflow-hidden']" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
  <div class="mb-16 md:mb-20">
5
5
  <component :is="titleTag" class="font-black uppercase tracking-tighter leading-none italic" :style="{ fontSize: titleFontSize }">{{ title }}</component>
@@ -41,11 +41,24 @@ const props = defineProps({
41
41
  radius: { type: String, default: "rounded" },
42
42
  textDirection: { type: String, default: "ltr" },
43
43
  contentWidth: { type: String, default: "normal" },
44
- textSize: { type: String, default: "md" }
44
+ textSize: { type: String, default: "md" },
45
+ paddingTop: { type: String, default: "" },
46
+ paddingBottom: { type: String, default: "" },
47
+ marginTop: { type: String, default: "" },
48
+ marginBottom: { type: String, default: "" }
45
49
  });
46
50
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
47
51
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-[32px]", pill: "rounded-[48px]" })[props.radius] || "rounded-[32px]");
48
52
  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");
49
53
  const titleFontSize = computed(() => ({ sm: "clamp(1rem,1.5vw,1.3rem)", md: "clamp(1.3rem,2vw,1.8rem)", lg: "clamp(2.5rem,7vw,6rem)" })[props.textSize] || "clamp(1.3rem,2vw,1.8rem)");
50
54
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
55
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
56
+ const spacingStyle = computed(() => {
57
+ const s = {};
58
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
59
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
60
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
61
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
62
+ return s;
63
+ });
51
64
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section class="relative overflow-hidden" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section class="relative overflow-hidden" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
 
4
4
  <!-- CENTERED -->
5
5
  <div v-if="layout === 'centered'" class="px-6 md:px-12 pt-20 pb-16 text-center">
@@ -134,9 +134,22 @@ const props = defineProps({
134
134
  radius: { type: String, default: "rounded" },
135
135
  textDirection: { type: String, default: "ltr" },
136
136
  contentWidth: { type: String, default: "normal" },
137
- textSize: { type: String, default: "md" }
137
+ textSize: { type: String, default: "md" },
138
+ paddingTop: { type: String, default: "" },
139
+ paddingBottom: { type: String, default: "" },
140
+ marginTop: { type: String, default: "" },
141
+ marginBottom: { type: String, default: "" }
138
142
  });
139
143
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
140
144
  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");
141
145
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
146
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
147
+ const spacingStyle = computed(() => {
148
+ const s = {};
149
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
150
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
151
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
152
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
153
+ return s;
154
+ });
142
155
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
 
4
4
  <!-- CENTERED -->
5
5
  <div v-if="layout === 'centered'" :class="[containerClass, 'text-center']">
@@ -66,11 +66,24 @@ const props = defineProps({
66
66
  radius: { type: String, default: "rounded" },
67
67
  textDirection: { type: String, default: "ltr" },
68
68
  contentWidth: { type: String, default: "normal" },
69
- textSize: { type: String, default: "md" }
69
+ textSize: { type: String, default: "md" },
70
+ paddingTop: { type: String, default: "" },
71
+ paddingBottom: { type: String, default: "" },
72
+ marginTop: { type: String, default: "" },
73
+ marginBottom: { type: String, default: "" }
70
74
  });
71
75
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
72
76
  const cardRound = computed(() => ({ sharp: "rounded-lg", rounded: "rounded-xl", pill: "rounded-full" })[props.radius] || "rounded-xl");
73
77
  const containerClass = computed(() => ({ narrow: "max-w-3xl mx-auto", normal: "max-w-5xl mx-auto", wide: "max-w-7xl mx-auto", full: "max-w-full" })[props.contentWidth] || "max-w-5xl mx-auto");
74
78
  const titleFontSize = computed(() => ({ sm: "clamp(0.9rem,1.2vw,1.1rem)", md: "clamp(1.1rem,1.8vw,1.6rem)", lg: "clamp(2.2rem,6vw,4.5rem)" })[props.textSize] || "clamp(1.1rem,1.8vw,1.6rem)");
75
79
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
80
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
81
+ const spacingStyle = computed(() => {
82
+ const s = {};
83
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
84
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
85
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
86
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
87
+ return s;
88
+ });
76
89
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <div v-if="title || description" class="mb-12 text-center max-w-2xl mx-auto">
@@ -102,7 +102,11 @@ const props = defineProps({
102
102
  radius: { type: String, default: "rounded" },
103
103
  textDirection: { type: String, default: "ltr" },
104
104
  contentWidth: { type: String, default: "normal" },
105
- textSize: { type: String, default: "md" }
105
+ textSize: { type: String, default: "md" },
106
+ paddingTop: { type: String, default: "" },
107
+ paddingBottom: { type: String, default: "" },
108
+ marginTop: { type: String, default: "" },
109
+ marginBottom: { type: String, default: "" }
106
110
  });
107
111
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
108
112
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
@@ -115,4 +119,13 @@ const allFeatures = computed(() => {
115
119
  return [...set];
116
120
  });
117
121
  const planHasFeature = (plan, feat) => (plan.features || []).some((f) => (typeof f === "object" ? f.fr || JSON.stringify(f) : f) === (typeof feat === "object" ? feat.fr || JSON.stringify(feat) : feat));
122
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
123
+ const spacingStyle = computed(() => {
124
+ const s = {};
125
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
126
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
127
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
128
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
129
+ return s;
130
+ });
118
131
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <div v-if="title || description" class="mb-12" :class="['horizontal','cards'].includes(layout) ? 'text-center max-w-2xl mx-auto' : 'max-w-xl'">
@@ -95,11 +95,24 @@ const props = defineProps({
95
95
  radius: { type: String, default: "rounded" },
96
96
  textDirection: { type: String, default: "ltr" },
97
97
  contentWidth: { type: String, default: "normal" },
98
- textSize: { type: String, default: "md" }
98
+ textSize: { type: String, default: "md" },
99
+ paddingTop: { type: String, default: "" },
100
+ paddingBottom: { type: String, default: "" },
101
+ marginTop: { type: String, default: "" },
102
+ marginBottom: { type: String, default: "" }
99
103
  });
100
104
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
101
105
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
102
106
  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");
103
107
  const titleFontSize = computed(() => ({ sm: "clamp(1rem,1.5vw,1.3rem)", md: "clamp(1.3rem,2vw,1.8rem)", lg: "clamp(2.5rem,6vw,5rem)" })[props.textSize] || "clamp(1.3rem,2vw,1.8rem)");
104
108
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
109
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
110
+ const spacingStyle = computed(() => {
111
+ const s = {};
112
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
113
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
114
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
115
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
116
+ return s;
117
+ });
105
118
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
 
4
4
  <!-- CENTERED -->
5
5
  <div v-if="layout === 'centered'" :class="[containerClass, 'text-center']">
@@ -75,9 +75,22 @@ const props = defineProps({
75
75
  radius: { type: String, default: "rounded" },
76
76
  textDirection: { type: String, default: "ltr" },
77
77
  contentWidth: { type: String, default: "narrow" },
78
- textSize: { type: String, default: "md" }
78
+ textSize: { type: String, default: "md" },
79
+ paddingTop: { type: String, default: "" },
80
+ paddingBottom: { type: String, default: "" },
81
+ marginTop: { type: String, default: "" },
82
+ marginBottom: { type: String, default: "" }
79
83
  });
80
84
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
81
85
  const containerClass = computed(() => ({ narrow: "max-w-3xl mx-auto", normal: "max-w-5xl mx-auto", wide: "max-w-7xl mx-auto", full: "max-w-full" })[props.contentWidth] || "max-w-3xl mx-auto");
82
86
  const quoteFontSize = computed(() => ({ sm: "clamp(0.95rem,1.2vw,1.1rem)", md: "clamp(1.1rem,1.8vw,1.6rem)", lg: "clamp(2rem,6vw,5rem)" })[props.textSize] || "clamp(1.1rem,1.8vw,1.6rem)");
87
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
88
+ const spacingStyle = computed(() => {
89
+ const s = {};
90
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
91
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
92
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
93
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
94
+ return s;
95
+ });
83
96
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <!-- Header -->
@@ -161,7 +161,11 @@ const props = defineProps({
161
161
  radius: { type: String, default: "rounded" },
162
162
  textDirection: { type: String, default: "ltr" },
163
163
  contentWidth: { type: String, default: "normal" },
164
- textSize: { type: String, default: "md" }
164
+ textSize: { type: String, default: "md" },
165
+ paddingTop: { type: String, default: "" },
166
+ paddingBottom: { type: String, default: "" },
167
+ marginTop: { type: String, default: "" },
168
+ marginBottom: { type: String, default: "" }
165
169
  });
166
170
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
167
171
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-2xl", pill: "rounded-3xl" })[props.radius] || "rounded-2xl");
@@ -174,4 +178,13 @@ const gridCols = computed(() => {
174
178
  if (n === 2) return "grid-cols-1 sm:grid-cols-2";
175
179
  return "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3";
176
180
  });
181
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
182
+ const spacingStyle = computed(() => {
183
+ const s = {};
184
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
185
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
186
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
187
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
188
+ return s;
189
+ });
177
190
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="maxW">
4
4
 
5
5
  <!-- Optional title -->
@@ -46,7 +46,11 @@ const props = defineProps({
46
46
  radius: { type: String, default: "rounded" },
47
47
  textDirection: { type: String, default: "ltr" },
48
48
  contentWidth: { type: String, default: "normal" },
49
- textSize: { type: String, default: "md" }
49
+ textSize: { type: String, default: "md" },
50
+ paddingTop: { type: String, default: "" },
51
+ paddingBottom: { type: String, default: "" },
52
+ marginTop: { type: String, default: "" },
53
+ marginBottom: { type: String, default: "" }
50
54
  });
51
55
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
52
56
  const cardRound = computed(() => ({ sharp: "rounded-lg", rounded: "rounded-xl", pill: "rounded-full" })[props.radius] || "rounded-xl");
@@ -60,6 +64,15 @@ const rendered = computed(() => {
60
64
  if (typeof props.content === "object") return props.content.fr || "";
61
65
  return props.content;
62
66
  });
67
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
68
+ const spacingStyle = computed(() => {
69
+ const s = {};
70
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
71
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
72
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
73
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
74
+ return s;
75
+ });
63
76
  </script>
64
77
 
65
78
  <style scoped>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <div v-if="title || description" class="mb-12" :class="headerAlign === 'center' ? 'text-center max-w-2xl mx-auto' : 'max-w-xl'">
@@ -97,11 +97,24 @@ const props = defineProps({
97
97
  radius: { type: String, default: "rounded" },
98
98
  textDirection: { type: String, default: "ltr" },
99
99
  contentWidth: { type: String, default: "normal" },
100
- textSize: { type: String, default: "md" }
100
+ textSize: { type: String, default: "md" },
101
+ paddingTop: { type: String, default: "" },
102
+ paddingBottom: { type: String, default: "" },
103
+ marginTop: { type: String, default: "" },
104
+ marginBottom: { type: String, default: "" }
101
105
  });
102
106
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
103
107
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
104
108
  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");
105
109
  const titleFontSize = computed(() => ({ sm: "clamp(1rem,1.5vw,1.3rem)", md: "clamp(1.3rem,2vw,1.8rem)", lg: "clamp(2.5rem,6vw,5rem)" })[props.textSize] || "clamp(1.3rem,2vw,1.8rem)");
106
110
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
111
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
112
+ const spacingStyle = computed(() => {
113
+ const s = {};
114
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
115
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
116
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
117
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
118
+ return s;
119
+ });
107
120
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="[containerClass]">
4
4
 
5
5
  <div v-if="title || description" class="mb-12 max-w-xl">
@@ -95,11 +95,24 @@ const props = defineProps({
95
95
  radius: { type: String, default: "rounded" },
96
96
  textDirection: { type: String, default: "ltr" },
97
97
  contentWidth: { type: String, default: "normal" },
98
- textSize: { type: String, default: "md" }
98
+ textSize: { type: String, default: "md" },
99
+ paddingTop: { type: String, default: "" },
100
+ paddingBottom: { type: String, default: "" },
101
+ marginTop: { type: String, default: "" },
102
+ marginBottom: { type: String, default: "" }
99
103
  });
100
104
  const sectionPad = computed(() => ({ compact: "py-8 px-4 md:px-8", normal: "py-14 px-6 md:px-12", spacious: "py-24 px-8 md:px-16" })[props.spacing] || "py-14 px-6 md:px-12");
101
105
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
102
106
  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");
103
107
  const titleFontSize = computed(() => ({ sm: "clamp(1rem,1.5vw,1.3rem)", md: "clamp(1.3rem,2vw,1.8rem)", lg: "clamp(2.5rem,6vw,5rem)" })[props.textSize] || "clamp(1.3rem,2vw,1.8rem)");
104
108
  const bodyClass = computed(() => ({ sm: "text-xs", md: "text-sm", lg: "text-base" })[props.textSize] || "text-sm");
109
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
110
+ const spacingStyle = computed(() => {
111
+ const s = {};
112
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
113
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
114
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
115
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
116
+ return s;
117
+ });
105
118
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="{ backgroundColor: bgColor, color: textColor }">
2
+ <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
 
4
4
  <!-- SPLIT -->
5
5
  <div v-if="layout === 'split'" :class="[containerClass, 'flex flex-col md:flex-row gap-12 items-center', reverse ? 'md:flex-row-reverse' : '']">
@@ -101,4 +101,13 @@ const imageContainerClass = computed(() => {
101
101
  const styles = { rounded: `aspect-[4/3] ${r}`, square: "aspect-square rounded-xl", circle: "aspect-square rounded-full max-w-[360px] mx-auto", portrait: `aspect-[3/4] ${r} max-w-sm mx-auto` };
102
102
  return styles[props.imageStyle] ?? styles.rounded;
103
103
  });
104
+ const SM = { none: "0", xs: "8px", sm: "24px", md: "48px", lg: "80px", xl: "128px", "-xs": "-8px", "-sm": "-24px", "-md": "-48px", "-lg": "-80px", "-xl": "-128px" };
105
+ const spacingStyle = computed(() => {
106
+ const s = {};
107
+ if (props.paddingTop && SM[props.paddingTop]) s.paddingTop = SM[props.paddingTop];
108
+ if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
109
+ if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
110
+ if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
111
+ return s;
112
+ });
104
113
  </script>
@@ -48,6 +48,29 @@ const textSizeOptions = [
48
48
  { value: "md", label: "Normal", icon: "M" },
49
49
  { value: "lg", label: "Large", icon: "L" }
50
50
  ];
51
+ const paddingOptions = [
52
+ { value: "", label: "Auto" },
53
+ { value: "none", label: "None (0)" },
54
+ { value: "xs", label: "XS (8px)" },
55
+ { value: "sm", label: "SM (24px)" },
56
+ { value: "md", label: "MD (48px)" },
57
+ { value: "lg", label: "LG (80px)" },
58
+ { value: "xl", label: "XL (128px)" }
59
+ ];
60
+ const marginOptions = [
61
+ { value: "", label: "Auto" },
62
+ { value: "none", label: "None (0)" },
63
+ { value: "xs", label: "XS (8px)" },
64
+ { value: "sm", label: "SM (24px)" },
65
+ { value: "md", label: "MD (48px)" },
66
+ { value: "lg", label: "LG (80px)" },
67
+ { value: "xl", label: "XL (128px)" },
68
+ { value: "-xs", label: "-XS (-8px)" },
69
+ { value: "-sm", label: "-SM (-24px)" },
70
+ { value: "-md", label: "-MD (-48px)" },
71
+ { value: "-lg", label: "-LG (-80px)" },
72
+ { value: "-xl", label: "-XL (-128px)" }
73
+ ];
51
74
  const i18n0 = (fr = "") => ({ fr, ar: "", en: "" });
52
75
  export const DEFAULT_SECTIONS = {
53
76
  HeroSection: {
@@ -72,7 +95,11 @@ export const DEFAULT_SECTIONS = {
72
95
  radius: "rounded",
73
96
  textDirection: "ltr",
74
97
  contentWidth: "normal",
75
- textSize: "md"
98
+ textSize: "md",
99
+ paddingTop: "",
100
+ paddingBottom: "",
101
+ marginTop: "",
102
+ marginBottom: ""
76
103
  },
77
104
  groups: [
78
105
  { key: "design", label: "Design" },
@@ -105,7 +132,11 @@ export const DEFAULT_SECTIONS = {
105
132
  textDirection: { type: "cards", label: "Direction", group: "design", options: directionOptions },
106
133
  contentWidth: { type: "cards", label: "Content Width", group: "design", options: contentWidthOptions },
107
134
  textSize: { type: "cards", label: "Text Size", group: "design", options: textSizeOptions },
108
- animation: { type: "cards", label: "Animation", group: "animation", options: animationOptions }
135
+ animation: { type: "cards", label: "Animation", group: "animation", options: animationOptions },
136
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
137
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
138
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
139
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
109
140
  }
110
141
  },
111
142
  TextVisual: {
@@ -130,7 +161,11 @@ export const DEFAULT_SECTIONS = {
130
161
  radius: "rounded",
131
162
  textDirection: "ltr",
132
163
  contentWidth: "normal",
133
- textSize: "md"
164
+ textSize: "md",
165
+ paddingTop: "",
166
+ paddingBottom: "",
167
+ marginTop: "",
168
+ marginBottom: ""
134
169
  },
135
170
  fields: {
136
171
  layout: { type: "cards", label: "Layout", options: [
@@ -165,7 +200,11 @@ export const DEFAULT_SECTIONS = {
165
200
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
166
201
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
167
202
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
168
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
203
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
204
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
205
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
206
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
207
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
169
208
  }
170
209
  },
171
210
  ServiceGrid: {
@@ -187,7 +226,11 @@ export const DEFAULT_SECTIONS = {
187
226
  radius: "rounded",
188
227
  textDirection: "ltr",
189
228
  contentWidth: "normal",
190
- textSize: "md"
229
+ textSize: "md",
230
+ paddingTop: "",
231
+ paddingBottom: "",
232
+ marginTop: "",
233
+ marginBottom: ""
191
234
  },
192
235
  fields: {
193
236
  layout: { type: "cards", label: "Layout", options: [
@@ -215,7 +258,11 @@ export const DEFAULT_SECTIONS = {
215
258
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
216
259
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
217
260
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
218
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
261
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
262
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
263
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
264
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
265
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
219
266
  }
220
267
  },
221
268
  Features: {
@@ -230,7 +277,11 @@ export const DEFAULT_SECTIONS = {
230
277
  radius: "rounded",
231
278
  textDirection: "ltr",
232
279
  contentWidth: "normal",
233
- textSize: "md"
280
+ textSize: "md",
281
+ paddingTop: "",
282
+ paddingBottom: "",
283
+ marginTop: "",
284
+ marginBottom: ""
234
285
  },
235
286
  fields: {
236
287
  title: { type: "text", label: "Section Title", i18n: true },
@@ -244,7 +295,11 @@ export const DEFAULT_SECTIONS = {
244
295
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
245
296
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
246
297
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
247
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
298
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
299
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
300
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
301
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
302
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
248
303
  }
249
304
  },
250
305
  FAQ: {
@@ -259,7 +314,11 @@ export const DEFAULT_SECTIONS = {
259
314
  radius: "rounded",
260
315
  textDirection: "ltr",
261
316
  contentWidth: "narrow",
262
- textSize: "md"
317
+ textSize: "md",
318
+ paddingTop: "",
319
+ paddingBottom: "",
320
+ marginTop: "",
321
+ marginBottom: ""
263
322
  },
264
323
  fields: {
265
324
  title: { type: "text", label: "Title", i18n: true },
@@ -273,7 +332,11 @@ export const DEFAULT_SECTIONS = {
273
332
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
274
333
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
275
334
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
276
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
335
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
336
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
337
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
338
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
339
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
277
340
  }
278
341
  },
279
342
  Process: {
@@ -292,7 +355,11 @@ export const DEFAULT_SECTIONS = {
292
355
  radius: "rounded",
293
356
  textDirection: "ltr",
294
357
  contentWidth: "normal",
295
- textSize: "md"
358
+ textSize: "md",
359
+ paddingTop: "",
360
+ paddingBottom: "",
361
+ marginTop: "",
362
+ marginBottom: ""
296
363
  },
297
364
  fields: {
298
365
  layout: { type: "cards", label: "Layout", options: [
@@ -317,7 +384,11 @@ export const DEFAULT_SECTIONS = {
317
384
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
318
385
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
319
386
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
320
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
387
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
388
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
389
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
390
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
391
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
321
392
  }
322
393
  },
323
394
  Testimonials: {
@@ -336,7 +407,11 @@ export const DEFAULT_SECTIONS = {
336
407
  radius: "rounded",
337
408
  textDirection: "ltr",
338
409
  contentWidth: "normal",
339
- textSize: "md"
410
+ textSize: "md",
411
+ paddingTop: "",
412
+ paddingBottom: "",
413
+ marginTop: "",
414
+ marginBottom: ""
340
415
  },
341
416
  fields: {
342
417
  layout: { type: "cards", label: "Layout", options: [
@@ -363,7 +438,11 @@ export const DEFAULT_SECTIONS = {
363
438
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
364
439
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
365
440
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
366
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
441
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
442
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
443
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
444
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
445
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
367
446
  }
368
447
  },
369
448
  Pricing: {
@@ -382,7 +461,11 @@ export const DEFAULT_SECTIONS = {
382
461
  radius: "rounded",
383
462
  textDirection: "ltr",
384
463
  contentWidth: "normal",
385
- textSize: "md"
464
+ textSize: "md",
465
+ paddingTop: "",
466
+ paddingBottom: "",
467
+ marginTop: "",
468
+ marginBottom: ""
386
469
  },
387
470
  fields: {
388
471
  layout: { type: "cards", label: "Layout", options: [
@@ -409,7 +492,11 @@ export const DEFAULT_SECTIONS = {
409
492
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
410
493
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
411
494
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
412
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
495
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
496
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
497
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
498
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
499
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
413
500
  }
414
501
  },
415
502
  ContactForm: {
@@ -427,7 +514,11 @@ export const DEFAULT_SECTIONS = {
427
514
  radius: "rounded",
428
515
  textDirection: "ltr",
429
516
  contentWidth: "normal",
430
- textSize: "md"
517
+ textSize: "md",
518
+ paddingTop: "",
519
+ paddingBottom: "",
520
+ marginTop: "",
521
+ marginBottom: ""
431
522
  },
432
523
  fields: {
433
524
  layout: { type: "cards", label: "Layout", options: [
@@ -445,7 +536,11 @@ export const DEFAULT_SECTIONS = {
445
536
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
446
537
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
447
538
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
448
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
539
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
540
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
541
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
542
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
543
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
449
544
  }
450
545
  },
451
546
  // ── Blog sections ─────────────────────────────────────────────────────────
@@ -470,7 +565,11 @@ export const DEFAULT_SECTIONS = {
470
565
  textDirection: "ltr",
471
566
  contentWidth: "narrow",
472
567
  textSize: "md",
473
- textAlign: "center"
568
+ textAlign: "center",
569
+ paddingTop: "",
570
+ paddingBottom: "",
571
+ marginTop: "",
572
+ marginBottom: ""
474
573
  },
475
574
  fields: {
476
575
  layout: { type: "cards", label: "Layout", options: [
@@ -498,7 +597,11 @@ export const DEFAULT_SECTIONS = {
498
597
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
499
598
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
500
599
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
501
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
600
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
601
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
602
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
603
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
604
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
502
605
  }
503
606
  },
504
607
  RichText: {
@@ -516,7 +619,11 @@ export const DEFAULT_SECTIONS = {
516
619
  radius: "rounded",
517
620
  textDirection: "ltr",
518
621
  contentWidth: "normal",
519
- textSize: "md"
622
+ textSize: "md",
623
+ paddingTop: "",
624
+ paddingBottom: "",
625
+ marginTop: "",
626
+ marginBottom: ""
520
627
  },
521
628
  fields: {
522
629
  layout: { type: "cards", label: "Width", options: [
@@ -536,7 +643,11 @@ export const DEFAULT_SECTIONS = {
536
643
  spacing: { type: "cards", label: "Espacement", options: spacingOptions },
537
644
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
538
645
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
539
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
646
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
647
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
648
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
649
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
650
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
540
651
  }
541
652
  },
542
653
  CallToAction: {
@@ -557,7 +668,11 @@ export const DEFAULT_SECTIONS = {
557
668
  radius: "rounded",
558
669
  textDirection: "ltr",
559
670
  contentWidth: "normal",
560
- textSize: "md"
671
+ textSize: "md",
672
+ paddingTop: "",
673
+ paddingBottom: "",
674
+ marginTop: "",
675
+ marginBottom: ""
561
676
  },
562
677
  fields: {
563
678
  layout: { type: "cards", label: "Layout", options: [
@@ -578,7 +693,11 @@ export const DEFAULT_SECTIONS = {
578
693
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
579
694
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
580
695
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
581
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
696
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
697
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
698
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
699
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
700
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
582
701
  }
583
702
  },
584
703
  Quote: {
@@ -595,7 +714,11 @@ export const DEFAULT_SECTIONS = {
595
714
  spacing: "normal",
596
715
  textDirection: "ltr",
597
716
  contentWidth: "narrow",
598
- textSize: "md"
717
+ textSize: "md",
718
+ paddingTop: "",
719
+ paddingBottom: "",
720
+ marginTop: "",
721
+ marginBottom: ""
599
722
  },
600
723
  fields: {
601
724
  layout: { type: "cards", label: "Layout", options: [
@@ -612,7 +735,11 @@ export const DEFAULT_SECTIONS = {
612
735
  spacing: { type: "cards", label: "Espacement", options: spacingOptions },
613
736
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
614
737
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
615
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
738
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
739
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
740
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
741
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
742
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
616
743
  }
617
744
  },
618
745
  DataTable: {
@@ -650,7 +777,11 @@ export const DEFAULT_SECTIONS = {
650
777
  radius: "rounded",
651
778
  textDirection: "ltr",
652
779
  contentWidth: "normal",
653
- textSize: "md"
780
+ textSize: "md",
781
+ paddingTop: "",
782
+ paddingBottom: "",
783
+ marginTop: "",
784
+ marginBottom: ""
654
785
  },
655
786
  fields: {
656
787
  layout: { type: "cards", label: "Layout", options: [
@@ -692,7 +823,11 @@ export const DEFAULT_SECTIONS = {
692
823
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
693
824
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
694
825
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
695
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
826
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
827
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
828
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
829
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
830
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
696
831
  }
697
832
  },
698
833
  Comparison: {
@@ -718,7 +853,11 @@ export const DEFAULT_SECTIONS = {
718
853
  radius: "rounded",
719
854
  textDirection: "ltr",
720
855
  contentWidth: "normal",
721
- textSize: "md"
856
+ textSize: "md",
857
+ paddingTop: "",
858
+ paddingBottom: "",
859
+ marginTop: "",
860
+ marginBottom: ""
722
861
  },
723
862
  fields: {
724
863
  layout: { type: "cards", label: "Layout", options: [
@@ -753,7 +892,11 @@ export const DEFAULT_SECTIONS = {
753
892
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
754
893
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
755
894
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
756
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
895
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
896
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
897
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
898
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
899
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
757
900
  }
758
901
  },
759
902
  RelatedPages: {
@@ -775,7 +918,11 @@ export const DEFAULT_SECTIONS = {
775
918
  radius: "rounded",
776
919
  textDirection: "ltr",
777
920
  contentWidth: "normal",
778
- textSize: "md"
921
+ textSize: "md",
922
+ paddingTop: "",
923
+ paddingBottom: "",
924
+ marginTop: "",
925
+ marginBottom: ""
779
926
  },
780
927
  fields: {
781
928
  layout: { type: "cards", label: "Layout", options: [
@@ -800,7 +947,11 @@ export const DEFAULT_SECTIONS = {
800
947
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
801
948
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
802
949
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
803
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
950
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
951
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
952
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
953
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
954
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
804
955
  }
805
956
  },
806
957
  Newsletter: {
@@ -820,7 +971,11 @@ export const DEFAULT_SECTIONS = {
820
971
  radius: "rounded",
821
972
  textDirection: "ltr",
822
973
  contentWidth: "normal",
823
- textSize: "md"
974
+ textSize: "md",
975
+ paddingTop: "",
976
+ paddingBottom: "",
977
+ marginTop: "",
978
+ marginBottom: ""
824
979
  },
825
980
  fields: {
826
981
  layout: { type: "cards", label: "Layout", options: [
@@ -840,7 +995,11 @@ export const DEFAULT_SECTIONS = {
840
995
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
841
996
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
842
997
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
843
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
998
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
999
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
1000
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
1001
+ marginTop: { type: "select", label: "Margin Top", options: marginOptions },
1002
+ marginBottom: { type: "select", label: "Margin Bottom", options: marginOptions }
844
1003
  }
845
1004
  }
846
1005
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cinqcinqdev-seo",
3
- "version": "0.1.55",
3
+ "version": "0.1.57",
4
4
  "description": "A reusable Nuxt 3 admin CMS module with visual page editor powered by Supabase",
5
5
  "license": "MIT",
6
6
  "module": "./dist/module.mjs",