cinqcinqdev-seo 0.1.70 → 0.1.72

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.
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
2
+ <section ref="sectionEl" :class="[sectionPad, isVisible ? 'sec-in' : 'sec-out']" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
3
3
  <div :class="maxW">
4
4
 
5
5
  <!-- Optional title -->
@@ -32,7 +32,7 @@ const ca = (c, h) => {
32
32
  const m = c.match(/rgba\((var\([^)]+\)),\s*[\d.]+\)/);
33
33
  return m ? `rgba(${m[1]}, ${Math.round(parseInt(h, 16) / 255 * 1e3) / 1e3})` : c + h;
34
34
  };
35
- import { computed } from "vue";
35
+ import { ref, computed, onMounted } from "vue";
36
36
  const props = defineProps({
37
37
  layout: { type: String, default: "article" },
38
38
  titleTag: { type: String, default: "h2" },
@@ -50,7 +50,25 @@ const props = defineProps({
50
50
  paddingTop: { type: String, default: "" },
51
51
  paddingBottom: { type: String, default: "" },
52
52
  marginTop: { type: String, default: "" },
53
- marginBottom: { type: String, default: "" }
53
+ marginBottom: { type: String, default: "" },
54
+ paddingX: { type: String, default: "" }
55
+ });
56
+ const sectionEl = ref(null);
57
+ const isVisible = ref(false);
58
+ onMounted(() => {
59
+ const obs = new IntersectionObserver(
60
+ ([e]) => {
61
+ if (e.isIntersecting) {
62
+ isVisible.value = true;
63
+ obs.disconnect();
64
+ }
65
+ },
66
+ { threshold: 0.06 }
67
+ );
68
+ if (sectionEl.value) obs.observe(sectionEl.value);
69
+ setTimeout(() => {
70
+ if (!isVisible.value) isVisible.value = true;
71
+ }, 300);
54
72
  });
55
73
  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");
56
74
  const cardRound = computed(() => ({ sharp: "rounded-lg", rounded: "rounded-xl", pill: "rounded-full" })[props.radius] || "rounded-xl");
@@ -81,10 +99,20 @@ const spacingStyle = computed(() => {
81
99
  if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
82
100
  if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
83
101
  if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
102
+ if (props.paddingX && SM[props.paddingX]) {
103
+ const v = SM[props.paddingX];
104
+ if (v.startsWith("-")) {
105
+ s.marginLeft = v;
106
+ s.marginRight = v;
107
+ } else {
108
+ s.paddingLeft = v;
109
+ s.paddingRight = v;
110
+ }
111
+ }
84
112
  return s;
85
113
  });
86
114
  </script>
87
115
 
88
116
  <style scoped>
89
- .prose-content :deep(h1){font-size:1.9em;font-weight:900;letter-spacing:-.03em;margin:1.6em 0 .5em}.prose-content :deep(h2){font-size:1.4em;font-weight:900;letter-spacing:-.02em;margin:1.5em 0 .5em}.prose-content :deep(h3){font-size:1.15em;font-weight:800;margin:1.2em 0 .4em}.prose-content :deep(h4){font-size:1em;font-weight:700;margin:1em 0 .3em}.prose-content :deep(p){margin-bottom:1em}.prose-content :deep(ul){list-style:disc;margin-bottom:1em;padding-left:1.6em}.prose-content :deep(ol){list-style:decimal;margin-bottom:1em;padding-left:1.6em}.prose-content :deep(li){margin-bottom:.35em}.prose-content :deep(strong){font-weight:700}.prose-content :deep(em){font-style:italic}.prose-content :deep(u){text-decoration:underline}.prose-content :deep(a){opacity:.75;text-decoration:underline}.prose-content :deep(blockquote){border-left:3px solid;font-style:italic;margin:1.2em 0;opacity:.65;padding-left:1em}
117
+ .sec-out{opacity:0;transform:translateY(20px)}.sec-in{opacity:1;transform:none;transition:opacity .7s cubic-bezier(.16,1,.3,1),transform .7s cubic-bezier(.16,1,.3,1)}.prose-content :deep(h1){font-size:1.9em;font-weight:900;letter-spacing:-.03em;margin:1.6em 0 .5em}.prose-content :deep(h2){font-size:1.4em;font-weight:900;letter-spacing:-.02em;margin:1.5em 0 .5em}.prose-content :deep(h3){font-size:1.15em;font-weight:800;margin:1.2em 0 .4em}.prose-content :deep(h4){font-size:1em;font-weight:700;margin:1em 0 .3em}.prose-content :deep(p){margin-bottom:1em}.prose-content :deep(ul){list-style:disc;margin-bottom:1em;padding-left:1.6em}.prose-content :deep(ol){list-style:decimal;margin-bottom:1em;padding-left:1.6em}.prose-content :deep(li){margin-bottom:.35em}.prose-content :deep(strong){font-weight:700}.prose-content :deep(em){font-style:italic}.prose-content :deep(u){text-decoration:underline}.prose-content :deep(a){opacity:.75;text-decoration:underline}.prose-content :deep(blockquote){border-left:3px solid;font-style:italic;margin:1.2em 0;opacity:.65;padding-left:1em}
90
118
  </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
2
+ <section ref="sectionEl" :class="[sectionPad, isVisible ? 'sec-in' : 'sec-out']" :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'">
@@ -80,7 +80,7 @@ const ca = (c, h) => {
80
80
  const m = c.match(/rgba\((var\([^)]+\)),\s*[\d.]+\)/);
81
81
  return m ? `rgba(${m[1]}, ${Math.round(parseInt(h, 16) / 255 * 1e3) / 1e3})` : c + h;
82
82
  };
83
- import { computed } from "vue";
83
+ import { ref, computed, onMounted } from "vue";
84
84
  const props = defineProps({
85
85
  layout: { type: String, default: "grid" },
86
86
  title: { type: String, default: "Our Services" },
@@ -101,7 +101,25 @@ const props = defineProps({
101
101
  paddingTop: { type: String, default: "" },
102
102
  paddingBottom: { type: String, default: "" },
103
103
  marginTop: { type: String, default: "" },
104
- marginBottom: { type: String, default: "" }
104
+ marginBottom: { type: String, default: "" },
105
+ paddingX: { type: String, default: "" }
106
+ });
107
+ const sectionEl = ref(null);
108
+ const isVisible = ref(false);
109
+ onMounted(() => {
110
+ const obs = new IntersectionObserver(
111
+ ([e]) => {
112
+ if (e.isIntersecting) {
113
+ isVisible.value = true;
114
+ obs.disconnect();
115
+ }
116
+ },
117
+ { threshold: 0.06 }
118
+ );
119
+ if (sectionEl.value) obs.observe(sectionEl.value);
120
+ setTimeout(() => {
121
+ if (!isVisible.value) isVisible.value = true;
122
+ }, 300);
105
123
  });
106
124
  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");
107
125
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
@@ -115,6 +133,20 @@ const spacingStyle = computed(() => {
115
133
  if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
116
134
  if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
117
135
  if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
136
+ if (props.paddingX && SM[props.paddingX]) {
137
+ const v = SM[props.paddingX];
138
+ if (v.startsWith("-")) {
139
+ s.marginLeft = v;
140
+ s.marginRight = v;
141
+ } else {
142
+ s.paddingLeft = v;
143
+ s.paddingRight = v;
144
+ }
145
+ }
118
146
  return s;
119
147
  });
120
148
  </script>
149
+
150
+ <style scoped>
151
+ .sec-out{opacity:0;transform:translateY(20px)}.sec-in{opacity:1;transform:none;transition:opacity .7s cubic-bezier(.16,1,.3,1),transform .7s cubic-bezier(.16,1,.3,1)}
152
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
2
+ <section ref="sectionEl" :class="[sectionPad, isVisible ? 'sec-in' : 'sec-out']" :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">
@@ -81,7 +81,7 @@ const ca = (c, h) => {
81
81
  const m = c.match(/rgba\((var\([^)]+\)),\s*[\d.]+\)/);
82
82
  return m ? `rgba(${m[1]}, ${Math.round(parseInt(h, 16) / 255 * 1e3) / 1e3})` : c + h;
83
83
  };
84
- import { computed } from "vue";
84
+ import { ref, computed, onMounted } from "vue";
85
85
  const props = defineProps({
86
86
  layout: { type: String, default: "grid" },
87
87
  title: { type: String, default: "What our clients say" },
@@ -99,7 +99,25 @@ const props = defineProps({
99
99
  paddingTop: { type: String, default: "" },
100
100
  paddingBottom: { type: String, default: "" },
101
101
  marginTop: { type: String, default: "" },
102
- marginBottom: { type: String, default: "" }
102
+ marginBottom: { type: String, default: "" },
103
+ paddingX: { type: String, default: "" }
104
+ });
105
+ const sectionEl = ref(null);
106
+ const isVisible = ref(false);
107
+ onMounted(() => {
108
+ const obs = new IntersectionObserver(
109
+ ([e]) => {
110
+ if (e.isIntersecting) {
111
+ isVisible.value = true;
112
+ obs.disconnect();
113
+ }
114
+ },
115
+ { threshold: 0.06 }
116
+ );
117
+ if (sectionEl.value) obs.observe(sectionEl.value);
118
+ setTimeout(() => {
119
+ if (!isVisible.value) isVisible.value = true;
120
+ }, 300);
103
121
  });
104
122
  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");
105
123
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
@@ -113,6 +131,20 @@ const spacingStyle = computed(() => {
113
131
  if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
114
132
  if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
115
133
  if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
134
+ if (props.paddingX && SM[props.paddingX]) {
135
+ const v = SM[props.paddingX];
136
+ if (v.startsWith("-")) {
137
+ s.marginLeft = v;
138
+ s.marginRight = v;
139
+ } else {
140
+ s.paddingLeft = v;
141
+ s.paddingRight = v;
142
+ }
143
+ }
116
144
  return s;
117
145
  });
118
146
  </script>
147
+
148
+ <style scoped>
149
+ .sec-out{opacity:0;transform:translateY(20px)}.sec-in{opacity:1;transform:none;transition:opacity .7s cubic-bezier(.16,1,.3,1),transform .7s cubic-bezier(.16,1,.3,1)}
150
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section :class="[sectionPad]" :dir="textDirection" :style="[{ backgroundColor: bgColor, color: textColor }, spacingStyle]">
2
+ <section ref="sectionEl" :class="[sectionPad, isVisible ? 'sec-in' : 'sec-out']" :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' : '']">
@@ -69,7 +69,7 @@ const ca = (c, h) => {
69
69
  const m = c.match(/rgba\((var\([^)]+\)),\s*[\d.]+\)/);
70
70
  return m ? `rgba(${m[1]}, ${Math.round(parseInt(h, 16) / 255 * 1e3) / 1e3})` : c + h;
71
71
  };
72
- import { computed } from "vue";
72
+ import { ref, computed, onMounted } from "vue";
73
73
  const props = defineProps({
74
74
  layout: { type: String, default: "split" },
75
75
  title: { type: String, default: "Our Vision" },
@@ -89,7 +89,29 @@ const props = defineProps({
89
89
  radius: { type: String, default: "rounded" },
90
90
  textDirection: { type: String, default: "ltr" },
91
91
  contentWidth: { type: String, default: "normal" },
92
- textSize: { type: String, default: "md" }
92
+ textSize: { type: String, default: "md" },
93
+ paddingTop: { type: String, default: "" },
94
+ paddingBottom: { type: String, default: "" },
95
+ marginTop: { type: String, default: "" },
96
+ marginBottom: { type: String, default: "" },
97
+ paddingX: { type: String, default: "" }
98
+ });
99
+ const sectionEl = ref(null);
100
+ const isVisible = ref(false);
101
+ onMounted(() => {
102
+ const obs = new IntersectionObserver(
103
+ ([e]) => {
104
+ if (e.isIntersecting) {
105
+ isVisible.value = true;
106
+ obs.disconnect();
107
+ }
108
+ },
109
+ { threshold: 0.06 }
110
+ );
111
+ if (sectionEl.value) obs.observe(sectionEl.value);
112
+ setTimeout(() => {
113
+ if (!isVisible.value) isVisible.value = true;
114
+ }, 300);
93
115
  });
94
116
  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");
95
117
  const cardRound = computed(() => ({ sharp: "rounded-xl", rounded: "rounded-3xl", pill: "rounded-[40px]" })[props.radius] || "rounded-3xl");
@@ -108,6 +130,20 @@ const spacingStyle = computed(() => {
108
130
  if (props.paddingBottom && SM[props.paddingBottom]) s.paddingBottom = SM[props.paddingBottom];
109
131
  if (props.marginTop && SM[props.marginTop]) s.marginTop = SM[props.marginTop];
110
132
  if (props.marginBottom && SM[props.marginBottom]) s.marginBottom = SM[props.marginBottom];
133
+ if (props.paddingX && SM[props.paddingX]) {
134
+ const v = SM[props.paddingX];
135
+ if (v.startsWith("-")) {
136
+ s.marginLeft = v;
137
+ s.marginRight = v;
138
+ } else {
139
+ s.paddingLeft = v;
140
+ s.paddingRight = v;
141
+ }
142
+ }
111
143
  return s;
112
144
  });
113
145
  </script>
146
+
147
+ <style scoped>
148
+ .sec-out{opacity:0;transform:translateY(20px)}.sec-in{opacity:1;transform:none;transition:opacity .7s cubic-bezier(.16,1,.3,1),transform .7s cubic-bezier(.16,1,.3,1)}
149
+ </style>