cinqcinqdev-seo 0.1.54 → 0.1.56

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.54",
7
+ "version": "0.1.56",
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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" };
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,15 @@ 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
+ ];
51
60
  const i18n0 = (fr = "") => ({ fr, ar: "", en: "" });
52
61
  export const DEFAULT_SECTIONS = {
53
62
  HeroSection: {
@@ -72,7 +81,11 @@ export const DEFAULT_SECTIONS = {
72
81
  radius: "rounded",
73
82
  textDirection: "ltr",
74
83
  contentWidth: "normal",
75
- textSize: "md"
84
+ textSize: "md",
85
+ paddingTop: "",
86
+ paddingBottom: "",
87
+ marginTop: "",
88
+ marginBottom: ""
76
89
  },
77
90
  groups: [
78
91
  { key: "design", label: "Design" },
@@ -105,7 +118,11 @@ export const DEFAULT_SECTIONS = {
105
118
  textDirection: { type: "cards", label: "Direction", group: "design", options: directionOptions },
106
119
  contentWidth: { type: "cards", label: "Content Width", group: "design", options: contentWidthOptions },
107
120
  textSize: { type: "cards", label: "Text Size", group: "design", options: textSizeOptions },
108
- animation: { type: "cards", label: "Animation", group: "animation", options: animationOptions }
121
+ animation: { type: "cards", label: "Animation", group: "animation", options: animationOptions },
122
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
123
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
124
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
125
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
109
126
  }
110
127
  },
111
128
  TextVisual: {
@@ -130,7 +147,11 @@ export const DEFAULT_SECTIONS = {
130
147
  radius: "rounded",
131
148
  textDirection: "ltr",
132
149
  contentWidth: "normal",
133
- textSize: "md"
150
+ textSize: "md",
151
+ paddingTop: "",
152
+ paddingBottom: "",
153
+ marginTop: "",
154
+ marginBottom: ""
134
155
  },
135
156
  fields: {
136
157
  layout: { type: "cards", label: "Layout", options: [
@@ -165,7 +186,11 @@ export const DEFAULT_SECTIONS = {
165
186
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
166
187
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
167
188
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
168
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
189
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
190
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
191
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
192
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
193
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
169
194
  }
170
195
  },
171
196
  ServiceGrid: {
@@ -187,7 +212,11 @@ export const DEFAULT_SECTIONS = {
187
212
  radius: "rounded",
188
213
  textDirection: "ltr",
189
214
  contentWidth: "normal",
190
- textSize: "md"
215
+ textSize: "md",
216
+ paddingTop: "",
217
+ paddingBottom: "",
218
+ marginTop: "",
219
+ marginBottom: ""
191
220
  },
192
221
  fields: {
193
222
  layout: { type: "cards", label: "Layout", options: [
@@ -215,7 +244,11 @@ export const DEFAULT_SECTIONS = {
215
244
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
216
245
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
217
246
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
218
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
247
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
248
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
249
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
250
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
251
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
219
252
  }
220
253
  },
221
254
  Features: {
@@ -230,7 +263,11 @@ export const DEFAULT_SECTIONS = {
230
263
  radius: "rounded",
231
264
  textDirection: "ltr",
232
265
  contentWidth: "normal",
233
- textSize: "md"
266
+ textSize: "md",
267
+ paddingTop: "",
268
+ paddingBottom: "",
269
+ marginTop: "",
270
+ marginBottom: ""
234
271
  },
235
272
  fields: {
236
273
  title: { type: "text", label: "Section Title", i18n: true },
@@ -244,7 +281,11 @@ export const DEFAULT_SECTIONS = {
244
281
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
245
282
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
246
283
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
247
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
284
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
285
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
286
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
287
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
288
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
248
289
  }
249
290
  },
250
291
  FAQ: {
@@ -259,7 +300,11 @@ export const DEFAULT_SECTIONS = {
259
300
  radius: "rounded",
260
301
  textDirection: "ltr",
261
302
  contentWidth: "narrow",
262
- textSize: "md"
303
+ textSize: "md",
304
+ paddingTop: "",
305
+ paddingBottom: "",
306
+ marginTop: "",
307
+ marginBottom: ""
263
308
  },
264
309
  fields: {
265
310
  title: { type: "text", label: "Title", i18n: true },
@@ -273,7 +318,11 @@ export const DEFAULT_SECTIONS = {
273
318
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
274
319
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
275
320
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
276
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
321
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
322
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
323
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
324
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
325
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
277
326
  }
278
327
  },
279
328
  Process: {
@@ -292,7 +341,11 @@ export const DEFAULT_SECTIONS = {
292
341
  radius: "rounded",
293
342
  textDirection: "ltr",
294
343
  contentWidth: "normal",
295
- textSize: "md"
344
+ textSize: "md",
345
+ paddingTop: "",
346
+ paddingBottom: "",
347
+ marginTop: "",
348
+ marginBottom: ""
296
349
  },
297
350
  fields: {
298
351
  layout: { type: "cards", label: "Layout", options: [
@@ -317,7 +370,11 @@ export const DEFAULT_SECTIONS = {
317
370
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
318
371
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
319
372
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
320
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
373
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
374
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
375
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
376
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
377
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
321
378
  }
322
379
  },
323
380
  Testimonials: {
@@ -336,7 +393,11 @@ export const DEFAULT_SECTIONS = {
336
393
  radius: "rounded",
337
394
  textDirection: "ltr",
338
395
  contentWidth: "normal",
339
- textSize: "md"
396
+ textSize: "md",
397
+ paddingTop: "",
398
+ paddingBottom: "",
399
+ marginTop: "",
400
+ marginBottom: ""
340
401
  },
341
402
  fields: {
342
403
  layout: { type: "cards", label: "Layout", options: [
@@ -363,7 +424,11 @@ export const DEFAULT_SECTIONS = {
363
424
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
364
425
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
365
426
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
366
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
427
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
428
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
429
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
430
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
431
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
367
432
  }
368
433
  },
369
434
  Pricing: {
@@ -382,7 +447,11 @@ export const DEFAULT_SECTIONS = {
382
447
  radius: "rounded",
383
448
  textDirection: "ltr",
384
449
  contentWidth: "normal",
385
- textSize: "md"
450
+ textSize: "md",
451
+ paddingTop: "",
452
+ paddingBottom: "",
453
+ marginTop: "",
454
+ marginBottom: ""
386
455
  },
387
456
  fields: {
388
457
  layout: { type: "cards", label: "Layout", options: [
@@ -409,7 +478,11 @@ export const DEFAULT_SECTIONS = {
409
478
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
410
479
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
411
480
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
412
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
481
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
482
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
483
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
484
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
485
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
413
486
  }
414
487
  },
415
488
  ContactForm: {
@@ -427,7 +500,11 @@ export const DEFAULT_SECTIONS = {
427
500
  radius: "rounded",
428
501
  textDirection: "ltr",
429
502
  contentWidth: "normal",
430
- textSize: "md"
503
+ textSize: "md",
504
+ paddingTop: "",
505
+ paddingBottom: "",
506
+ marginTop: "",
507
+ marginBottom: ""
431
508
  },
432
509
  fields: {
433
510
  layout: { type: "cards", label: "Layout", options: [
@@ -445,7 +522,11 @@ export const DEFAULT_SECTIONS = {
445
522
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
446
523
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
447
524
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
448
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
525
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
526
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
527
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
528
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
529
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
449
530
  }
450
531
  },
451
532
  // ── Blog sections ─────────────────────────────────────────────────────────
@@ -470,7 +551,11 @@ export const DEFAULT_SECTIONS = {
470
551
  textDirection: "ltr",
471
552
  contentWidth: "narrow",
472
553
  textSize: "md",
473
- textAlign: "center"
554
+ textAlign: "center",
555
+ paddingTop: "",
556
+ paddingBottom: "",
557
+ marginTop: "",
558
+ marginBottom: ""
474
559
  },
475
560
  fields: {
476
561
  layout: { type: "cards", label: "Layout", options: [
@@ -498,7 +583,11 @@ export const DEFAULT_SECTIONS = {
498
583
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
499
584
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
500
585
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
501
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
586
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
587
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
588
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
589
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
590
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
502
591
  }
503
592
  },
504
593
  RichText: {
@@ -516,7 +605,11 @@ export const DEFAULT_SECTIONS = {
516
605
  radius: "rounded",
517
606
  textDirection: "ltr",
518
607
  contentWidth: "normal",
519
- textSize: "md"
608
+ textSize: "md",
609
+ paddingTop: "",
610
+ paddingBottom: "",
611
+ marginTop: "",
612
+ marginBottom: ""
520
613
  },
521
614
  fields: {
522
615
  layout: { type: "cards", label: "Width", options: [
@@ -536,7 +629,11 @@ export const DEFAULT_SECTIONS = {
536
629
  spacing: { type: "cards", label: "Espacement", options: spacingOptions },
537
630
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
538
631
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
539
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
632
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
633
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
634
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
635
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
636
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
540
637
  }
541
638
  },
542
639
  CallToAction: {
@@ -557,7 +654,11 @@ export const DEFAULT_SECTIONS = {
557
654
  radius: "rounded",
558
655
  textDirection: "ltr",
559
656
  contentWidth: "normal",
560
- textSize: "md"
657
+ textSize: "md",
658
+ paddingTop: "",
659
+ paddingBottom: "",
660
+ marginTop: "",
661
+ marginBottom: ""
561
662
  },
562
663
  fields: {
563
664
  layout: { type: "cards", label: "Layout", options: [
@@ -578,7 +679,11 @@ export const DEFAULT_SECTIONS = {
578
679
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
579
680
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
580
681
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
581
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
682
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
683
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
684
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
685
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
686
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
582
687
  }
583
688
  },
584
689
  Quote: {
@@ -595,7 +700,11 @@ export const DEFAULT_SECTIONS = {
595
700
  spacing: "normal",
596
701
  textDirection: "ltr",
597
702
  contentWidth: "narrow",
598
- textSize: "md"
703
+ textSize: "md",
704
+ paddingTop: "",
705
+ paddingBottom: "",
706
+ marginTop: "",
707
+ marginBottom: ""
599
708
  },
600
709
  fields: {
601
710
  layout: { type: "cards", label: "Layout", options: [
@@ -612,7 +721,11 @@ export const DEFAULT_SECTIONS = {
612
721
  spacing: { type: "cards", label: "Espacement", options: spacingOptions },
613
722
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
614
723
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
615
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
724
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
725
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
726
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
727
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
728
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
616
729
  }
617
730
  },
618
731
  DataTable: {
@@ -650,7 +763,11 @@ export const DEFAULT_SECTIONS = {
650
763
  radius: "rounded",
651
764
  textDirection: "ltr",
652
765
  contentWidth: "normal",
653
- textSize: "md"
766
+ textSize: "md",
767
+ paddingTop: "",
768
+ paddingBottom: "",
769
+ marginTop: "",
770
+ marginBottom: ""
654
771
  },
655
772
  fields: {
656
773
  layout: { type: "cards", label: "Layout", options: [
@@ -692,7 +809,11 @@ export const DEFAULT_SECTIONS = {
692
809
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
693
810
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
694
811
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
695
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
812
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
813
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
814
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
815
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
816
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
696
817
  }
697
818
  },
698
819
  Comparison: {
@@ -718,7 +839,11 @@ export const DEFAULT_SECTIONS = {
718
839
  radius: "rounded",
719
840
  textDirection: "ltr",
720
841
  contentWidth: "normal",
721
- textSize: "md"
842
+ textSize: "md",
843
+ paddingTop: "",
844
+ paddingBottom: "",
845
+ marginTop: "",
846
+ marginBottom: ""
722
847
  },
723
848
  fields: {
724
849
  layout: { type: "cards", label: "Layout", options: [
@@ -753,7 +878,11 @@ export const DEFAULT_SECTIONS = {
753
878
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
754
879
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
755
880
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
756
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
881
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
882
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
883
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
884
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
885
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
757
886
  }
758
887
  },
759
888
  RelatedPages: {
@@ -775,7 +904,11 @@ export const DEFAULT_SECTIONS = {
775
904
  radius: "rounded",
776
905
  textDirection: "ltr",
777
906
  contentWidth: "normal",
778
- textSize: "md"
907
+ textSize: "md",
908
+ paddingTop: "",
909
+ paddingBottom: "",
910
+ marginTop: "",
911
+ marginBottom: ""
779
912
  },
780
913
  fields: {
781
914
  layout: { type: "cards", label: "Layout", options: [
@@ -800,7 +933,11 @@ export const DEFAULT_SECTIONS = {
800
933
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
801
934
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
802
935
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
803
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
936
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
937
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
938
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
939
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
940
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
804
941
  }
805
942
  },
806
943
  Newsletter: {
@@ -820,7 +957,11 @@ export const DEFAULT_SECTIONS = {
820
957
  radius: "rounded",
821
958
  textDirection: "ltr",
822
959
  contentWidth: "normal",
823
- textSize: "md"
960
+ textSize: "md",
961
+ paddingTop: "",
962
+ paddingBottom: "",
963
+ marginTop: "",
964
+ marginBottom: ""
824
965
  },
825
966
  fields: {
826
967
  layout: { type: "cards", label: "Layout", options: [
@@ -840,7 +981,11 @@ export const DEFAULT_SECTIONS = {
840
981
  radius: { type: "cards", label: "Arrondis", options: radiusOptions },
841
982
  textDirection: { type: "cards", label: "Direction", options: directionOptions },
842
983
  contentWidth: { type: "cards", label: "Content Width", options: contentWidthOptions },
843
- textSize: { type: "cards", label: "Text Size", options: textSizeOptions }
984
+ textSize: { type: "cards", label: "Text Size", options: textSizeOptions },
985
+ paddingTop: { type: "select", label: "Padding Top", options: paddingOptions },
986
+ paddingBottom: { type: "select", label: "Padding Bottom", options: paddingOptions },
987
+ marginTop: { type: "select", label: "Margin Top", options: paddingOptions },
988
+ marginBottom: { type: "select", label: "Margin Bottom", options: paddingOptions }
844
989
  }
845
990
  }
846
991
  };
@@ -480,7 +480,7 @@ const savePage = async () => {
480
480
  <!-- ── Top Bar ── -->
481
481
  <header class="h-12 bg-white/80 backdrop-blur-md border-b px-6 flex items-center justify-between z-[60] shrink-0">
482
482
  <div class="flex items-center gap-4">
483
- <NuxtLink :to="basePath" class="text-gray-400 hover:text-black transition-colors">←</NuxtLink>
483
+ <NuxtLink :to="page?.type ? `${basePath}/pages/${page.type}` : basePath" class="text-gray-400 hover:text-black transition-colors">←</NuxtLink>
484
484
  <div class="flex gap-1 bg-gray-100 p-1 rounded-md">
485
485
  <button @click="isLeftSidebarOpen = !isLeftSidebarOpen" :class="['p-1.5 rounded transition-all', isLeftSidebarOpen ? 'bg-white shadow-sm text-[#3d35ff]' : 'text-gray-400']" title="Structure">
486
486
  <svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M4 6h16M4 12h10M4 18h16"/></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cinqcinqdev-seo",
3
- "version": "0.1.54",
3
+ "version": "0.1.56",
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",