diff --git a/client/app.vue b/client/app.vue
index e9a2f33..cdbe80b 100644
--- a/client/app.vue
+++ b/client/app.vue
@@ -44,6 +44,17 @@ export default {
components: {},
setup() {
+ useOpnSeoMeta({
+ title: 'OpnForm',
+ description: 'Create beautiful forms for free. Unlimited fields, unlimited submissions. It\'s free and it takes less than 1 minute to create your first form.',
+ ogImage: '/img/social-preview.jpg',
+ })
+ useHead({
+ titleTemplate: (titleChunk) => {
+ return titleChunk ? `${titleChunk} - OpnForm` : 'OpnForm';
+ }
+ })
+
const appStore = useAppStore()
return {
@@ -57,8 +68,6 @@ export default {
},
data: () => ({
- metaTitle: 'OpnForm',
- metaDescription: 'Create beautiful forms for free. Unlimited fields, unlimited submissions. It\'s free and it takes less than 1 minute to create your first form.',
announcement: false,
alert: {
type: null,
diff --git a/client/components/global/Navbar.vue b/client/components/global/Navbar.vue
index 4016b69..506cfcb 100644
--- a/client/components/global/Navbar.vue
+++ b/client/components/global/Navbar.vue
@@ -203,7 +203,7 @@ export default {
return !this.appStore.navbarHidden
},
userOnboarded() {
- return this.user && this.user.workspaces_count > 0
+ return this.user && this.user.has_forms === true
},
hasCrisp() {
return this.config.crispWebsiteId
diff --git a/client/components/open/forms/components/CopyContent.vue b/client/components/open/forms/components/CopyContent.vue
index 95643b3..9a1fc65 100644
--- a/client/components/open/forms/components/CopyContent.vue
+++ b/client/components/open/forms/components/CopyContent.vue
@@ -6,7 +6,7 @@
-
+
-
diff --git a/client/components/open/forms/components/FormUrlPrefill.vue b/client/components/open/forms/components/FormUrlPrefill.vue
index 46bcbab..18d2c16 100644
--- a/client/components/open/forms/components/FormUrlPrefill.vue
+++ b/client/components/open/forms/components/FormUrlPrefill.vue
@@ -17,72 +17,50 @@
-
diff --git a/client/components/open/forms/components/templates/FormTemplateModal.vue b/client/components/open/forms/components/templates/FormTemplateModal.vue
index c634bc7..b81ce46 100644
--- a/client/components/open/forms/components/templates/FormTemplateModal.vue
+++ b/client/components/open/forms/components/templates/FormTemplateModal.vue
@@ -1,5 +1,5 @@
-
+
-
diff --git a/client/components/pages/forms/show/EmbedFormAsPopupModal.vue b/client/components/pages/forms/show/EmbedFormAsPopupModal.vue
index 63317c5..28c3f4e 100644
--- a/client/components/pages/forms/show/EmbedFormAsPopupModal.vue
+++ b/client/components/pages/forms/show/EmbedFormAsPopupModal.vue
@@ -59,7 +59,7 @@
-
+
@@ -101,99 +101,87 @@
-
diff --git a/client/components/pages/forms/show/ExtraMenu.vue b/client/components/pages/forms/show/ExtraMenu.vue
index 3aa72ef..fbf5b15 100644
--- a/client/components/pages/forms/show/ExtraMenu.vue
+++ b/client/components/pages/forms/show/ExtraMenu.vue
@@ -138,70 +138,51 @@
-
diff --git a/client/composables/useOpnSeoMeta.js b/client/composables/useOpnSeoMeta.js
new file mode 100644
index 0000000..d07dd52
--- /dev/null
+++ b/client/composables/useOpnSeoMeta.js
@@ -0,0 +1,16 @@
+export const useOpnSeoMeta = (meta) => {
+ return useSeoMeta({
+ ...meta.title ? {
+ ogTitle: meta.title,
+ twitterTitle: meta.title,
+ } : {},
+ ...meta.description ? {
+ ogDescription: meta.description,
+ twitterDescription: meta.description,
+ } : {},
+ ...meta.ogImage ? {
+ twitterImage: meta.ogImage,
+ } : {},
+ ...meta,
+ })
+}
diff --git a/client/error.vue b/client/error.vue
new file mode 100644
index 0000000..d98b8fe
--- /dev/null
+++ b/client/error.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+ Page Not Found
+
+
+
+
+ Go Home
+
+
+
+
+
+
+
+
diff --git a/client/mixins/seo-meta.js b/client/mixins/seo-meta.js
deleted file mode 100644
index 2d40447..0000000
--- a/client/mixins/seo-meta.js
+++ /dev/null
@@ -1,23 +0,0 @@
-export default {
- metaInfo () {
- const title = this.metaTitle ?? 'OpnForm'
- const description = this.metaDescription ?? "Create beautiful forms for free. Unlimited fields, unlimited submissions. It's free and it takes less than 1 minute to create your first form."
- const image = this.metaImage ?? this.asset('img/social-preview.jpg')
- const metaTemplate = this.metaTemplate ?? '%s ยท OpnForm'
-
- return {
- title: title,
- titleTemplate: metaTemplate,
- meta: [
- ...(this.metaTags ?? []),
- { vmid: 'og:title', property: 'og:title', content: title },
- { vmid: 'twitter:title', property: 'twitter:title', content: title },
- { vmid: 'description', name: 'description', content: description },
- { vmid: 'og:description', property: 'og:description', content: description },
- { vmid: 'twitter:description', property: 'twitter:description', content: description },
- { vmid: 'twitter:image', property: 'twitter:image', content: image },
- { vmid: 'og:image', property: 'og:image', content: image }
- ]
- }
- }
-}
diff --git a/client/pages/ai-form-builder.vue b/client/pages/ai-form-builder.vue
index 94a1646..ef05cf6 100644
--- a/client/pages/ai-form-builder.vue
+++ b/client/pages/ai-form-builder.vue
@@ -493,39 +493,21 @@
-