diff --git a/docs/SEO.md b/docs/SEO.md index f351969..8aaf4fb 100644 --- a/docs/SEO.md +++ b/docs/SEO.md @@ -8,6 +8,15 @@ These routes are treated as public site pages: - `/` - `/product` +- `/product/content-planning` +- `/product/asset-revisions` +- `/product/comment-threads` +- `/product/approval-workflows` +- `/product/client-review` +- `/product/review-queues` +- `/product/audit-trail` +- `/product/workspace-access` +- `/product/team-collaboration` - `/pricing` - `/blogs` - `/guides` diff --git a/frontend/scripts/prerender-public.mjs b/frontend/scripts/prerender-public.mjs index 51d40e3..49fb883 100644 --- a/frontend/scripts/prerender-public.mjs +++ b/frontend/scripts/prerender-public.mjs @@ -2,7 +2,19 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { dirname, resolve } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -const publicRoutes = ['/', '/product', '/pricing', '/blogs', '/guides']; +const productFeatureRoutes = [ + '/product/content-planning', + '/product/asset-revisions', + '/product/comment-threads', + '/product/approval-workflows', + '/product/client-review', + '/product/review-queues', + '/product/audit-trail', + '/product/workspace-access', + '/product/team-collaboration', +]; + +const publicRoutes = ['/', '/product', ...productFeatureRoutes, '/pricing', '/blogs', '/guides']; const rootDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); const distDir = resolve(rootDir, 'dist'); diff --git a/frontend/scripts/write-public-seo.mjs b/frontend/scripts/write-public-seo.mjs index d4ac8f5..ce964f0 100644 --- a/frontend/scripts/write-public-seo.mjs +++ b/frontend/scripts/write-public-seo.mjs @@ -4,6 +4,15 @@ import { resolve } from 'node:path'; const publicRoutes = [ { path: '/', changefreq: 'weekly', priority: '1.0' }, { path: '/product', changefreq: 'weekly', priority: '0.8' }, + { path: '/product/content-planning', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/asset-revisions', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/comment-threads', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/approval-workflows', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/client-review', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/review-queues', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/audit-trail', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/workspace-access', changefreq: 'weekly', priority: '0.7' }, + { path: '/product/team-collaboration', changefreq: 'weekly', priority: '0.7' }, { path: '/pricing', changefreq: 'monthly', priority: '0.7' }, { path: '/blogs', changefreq: 'weekly', priority: '0.6' }, { path: '/guides', changefreq: 'weekly', priority: '0.6' }, diff --git a/frontend/src/entry-public-ssr.js b/frontend/src/entry-public-ssr.js index fa07212..3df0466 100644 --- a/frontend/src/entry-public-ssr.js +++ b/frontend/src/entry-public-ssr.js @@ -8,6 +8,7 @@ import en from '@/locales/en.json'; import fr from '@/locales/fr.json'; import Landing from '@/features/landing/views/Landing.vue'; import ProductPage from '@/features/landing/views/ProductPage.vue'; +import ProductFeaturePage from '@/features/landing/views/ProductFeaturePage.vue'; import PricingPage from '@/features/landing/views/PricingPage.vue'; import BlogsPage from '@/features/landing/views/BlogsPage.vue'; import GuidesPage from '@/features/landing/views/GuidesPage.vue'; @@ -16,6 +17,7 @@ import './assets/main.css'; const publicRoutes = [ { path: '/', component: Landing }, { path: '/product', component: ProductPage }, + { path: '/product/:featureSlug', component: ProductFeaturePage }, { path: '/pricing', component: PricingPage }, { path: '/blogs', component: BlogsPage }, { path: '/guides', component: GuidesPage }, diff --git a/frontend/src/features/content/views/ContentItemsView.vue b/frontend/src/features/content/views/ContentItemsView.vue index a398759..75467d9 100644 --- a/frontend/src/features/content/views/ContentItemsView.vue +++ b/frontend/src/features/content/views/ContentItemsView.vue @@ -281,9 +281,7 @@
-
{{ t('contentItems.eyebrow') }}

{{ t('contentItems.title') }}

-

{{ t('contentItems.description') }}

@@ -462,17 +460,11 @@ @apply flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between; } - .eyebrow { - @apply text-xs font-bold uppercase tracking-[0.24em]; - color: #0f766e; - } - .header h1 { - @apply mt-2 text-4xl font-black; + @apply text-4xl font-black; color: #172033; } - .header p, .item-card span, .status-row em, .status-row small { diff --git a/frontend/src/features/landing/components/LandingSiteMenu.vue b/frontend/src/features/landing/components/LandingSiteMenu.vue index 2802d6a..fbfba0c 100644 --- a/frontend/src/features/landing/components/LandingSiteMenu.vue +++ b/frontend/src/features/landing/components/LandingSiteMenu.vue @@ -11,19 +11,62 @@ +
+ + +
+
diff --git a/frontend/src/features/landing/views/GuidesPage.vue b/frontend/src/features/landing/views/GuidesPage.vue index b5ec73b..220e0b0 100644 --- a/frontend/src/features/landing/views/GuidesPage.vue +++ b/frontend/src/features/landing/views/GuidesPage.vue @@ -1,10 +1,14 @@ @@ -15,12 +19,9 @@
-
Guides
-

Reusable guides for managing review and approval work.

-

- Guides are coming soon. This area will collect repeatable playbooks for content intake, - review rounds, approval decisions, and delivery readiness. -

+
{{ t('public.guides.eyebrow') }}
+

{{ t('public.guides.title') }}

+

{{ t('public.guides.description') }}

diff --git a/frontend/src/features/landing/views/Landing.vue b/frontend/src/features/landing/views/Landing.vue index 98dd5f7..07b5219 100644 --- a/frontend/src/features/landing/views/Landing.vue +++ b/frontend/src/features/landing/views/Landing.vue @@ -1,35 +1,50 @@ @@ -129,7 +163,7 @@ } .hero-card { - @apply grid gap-6 rounded-[2rem] p-6 md:grid-cols-[1.4fr_0.9fr] md:p-10; + @apply grid gap-8 overflow-hidden rounded-[2rem] p-6 md:grid-cols-[1fr_0.88fr] md:p-10; background: linear-gradient(145deg, #172033 0%, #25324b 65%, #314766 100%); color: #fffaf2; box-shadow: 0 30px 80px rgba(23, 32, 51, 0.18); @@ -157,23 +191,91 @@ @apply flex flex-col gap-3 sm:flex-row; } - .hero-panel { - @apply rounded-[1.5rem] p-6; - background: rgba(255, 250, 242, 0.08); - border: 1px solid rgba(255, 250, 242, 0.12); + .hero-actions .primary, + .final-cta .primary { + @apply min-h-12 px-7 text-base; + box-shadow: 0 18px 40px rgba(255, 138, 61, 0.28); } - .hero-panel-title { - @apply mb-4 text-sm font-bold uppercase tracking-[0.22em]; + .cta-note { + @apply text-sm font-semibold; + color: rgba(255, 250, 242, 0.72); + } + + .proof-row { + @apply grid max-w-2xl gap-3 sm:grid-cols-3; + } + + .proof-row div { + @apply rounded-[1rem] border p-4; + background: rgba(255, 250, 242, 0.08); + border-color: rgba(255, 250, 242, 0.12); + } + + .proof-row strong { + @apply block text-2xl font-black; color: #7dd3c7; } - .workflow-list { - @apply flex list-decimal flex-col gap-4 pl-5; + .proof-row span { + @apply mt-1 block text-xs font-bold uppercase leading-5 tracking-[0.12em]; + color: rgba(255, 250, 242, 0.72); } - .workflow-list li { - @apply text-sm leading-6 md:text-base; + .workflow-preview { + @apply flex flex-col gap-4 rounded-[1.5rem] p-4; + background: rgba(255, 250, 242, 0.1); + border: 1px solid rgba(255, 250, 242, 0.14); + } + + .preview-bar { + @apply flex items-center justify-between gap-3 rounded-[1rem] bg-white/90 px-4 py-3; + color: #172033; + } + + .preview-bar span, + .approval-card span { + @apply text-xs font-black uppercase tracking-[0.18em]; + color: #0f766e; + } + + .preview-bar strong { + @apply rounded-full px-3 py-1 text-xs font-black; + background: rgba(255, 138, 61, 0.14); + color: #b45309; + } + + .preview-list { + @apply flex flex-col gap-3; + } + + .preview-row { + @apply flex items-center justify-between gap-4 rounded-[1rem] bg-white/90 p-4; + color: #172033; + } + + .preview-row strong { + @apply block text-sm font-black; + } + + .preview-row span { + @apply mt-1 block text-xs font-semibold; + color: #44516a; + } + + .preview-row em { + @apply rounded-full px-3 py-1 text-xs font-black not-italic; + background: rgba(15, 118, 110, 0.1); + color: #0f766e; + } + + .approval-card { + @apply rounded-[1rem] bg-white/95 p-5; + color: #172033; + } + + .approval-card strong { + @apply mt-2 block text-2xl font-black leading-tight; } .pillars-grid { @@ -203,6 +305,16 @@ color: #172033; } + .inline-cta { + @apply mt-5 inline-flex h-11 items-center rounded-full px-5 text-sm font-black no-underline transition-colors; + background: #172033; + color: #fffaf2; + } + + .inline-cta:hover { + background: #0f766e; + } + .focus-metrics { @apply grid gap-4 md:grid-cols-3; } @@ -222,19 +334,20 @@ color: #3f4d63; } - .pricing-card { - @apply flex flex-col gap-5 rounded-[1.75rem] p-6 md:flex-row md:items-center md:justify-between md:p-8; - background: rgba(255, 255, 255, 0.84); - border: 1px solid rgba(23, 32, 51, 0.08); - box-shadow: 0 18px 40px rgba(23, 32, 51, 0.06); + .final-cta { + @apply flex flex-col gap-6 rounded-[2rem] p-6 md:flex-row md:items-center md:justify-between md:p-10; + background: #172033; + color: #fffaf2; + box-shadow: 0 30px 80px rgba(23, 32, 51, 0.18); } - .pricing-card h2 { - @apply mt-3 max-w-3xl text-2xl font-black leading-tight md:text-3xl; - color: #172033; + .final-cta h2 { + @apply mt-3 max-w-3xl text-3xl font-black leading-tight md:text-5xl; } - .pricing-action { - @apply w-full sm:w-auto; + .final-cta p { + @apply mt-4 max-w-2xl text-base leading-7; + color: rgba(255, 250, 242, 0.78); } + diff --git a/frontend/src/features/landing/views/PricingPage.vue b/frontend/src/features/landing/views/PricingPage.vue index 48daec3..783506d 100644 --- a/frontend/src/features/landing/views/PricingPage.vue +++ b/frontend/src/features/landing/views/PricingPage.vue @@ -1,10 +1,26 @@ @@ -15,18 +31,65 @@
-
Pricing
-

Simple workspace pricing for teams managing client approvals.

-

- Pricing details are coming soon. For now, Socialize is focused on the core review workflow: - workspaces, content items, assets, comments, and approval decisions. -

-
+ +
+
- Login - +
+ + {{ t('public.pricing.bestValue') }} + +

{{ t(`public.pricing.tiers.${tier.key}.name`) }}

+

{{ t(`public.pricing.tiers.${tier.key}.description`) }}

+
+ +
+ {{ t(`public.pricing.tiers.${tier.key}.price`) }} + {{ t(`public.pricing.tiers.${tier.key}.priceNote`) }} +
+ + + {{ t(`public.pricing.tiers.${tier.key}.action`) }} + + +
+

{{ t('public.pricing.includedLabel') }}

+
    +
  • + {{ feature }} +
  • +
+
+ +
+

{{ t('public.pricing.limitsLabel') }}

+
    +
  • + {{ limit }} +
  • +
+
+
@@ -38,7 +101,7 @@ } .public-page-content { - @apply mx-auto flex w-full max-w-7xl flex-col px-5 py-8 md:px-8 md:py-12; + @apply mx-auto flex w-full max-w-7xl flex-col gap-8 px-5 py-8 md:px-8 md:py-12; } .public-page-panel { @@ -63,13 +126,124 @@ color: #44516a; } - .pricing-login { - @apply mt-8 inline-flex h-11 w-fit items-center rounded-full px-5 text-sm font-bold no-underline transition-colors; + .pricing-grid { + @apply grid gap-4 lg:grid-cols-4; + } + + .pricing-tier { + @apply relative flex min-h-[42rem] flex-col gap-6 rounded-[1.5rem] border bg-white/85 p-5; + border-color: rgba(23, 32, 51, 0.08); + box-shadow: 0 18px 40px rgba(23, 32, 51, 0.06); + } + + .pricing-tier.featured { + background: #172033; + color: #fffaf2; + border-color: rgba(255, 178, 107, 0.44); + box-shadow: 0 28px 70px rgba(23, 32, 51, 0.2); + } + + .tier-badge { + @apply mb-4 inline-flex w-fit rounded-full px-3 py-1 text-xs font-black uppercase tracking-[0.16em]; + background: #ffb26b; + color: #172033; + } + + .tier-top h2 { + @apply text-2xl font-black; + color: #172033; + } + + .featured .tier-top h2 { + color: #fffaf2; + } + + .tier-top p { + @apply mt-3 text-sm leading-6; + color: #44516a; + } + + .featured .tier-top p, + .featured .tier-price span, + .featured .tier-section li { + color: rgba(255, 250, 242, 0.78); + } + + .tier-price { + @apply flex items-end gap-2; + } + + .tier-price strong { + @apply text-4xl font-black leading-none; + color: #172033; + } + + .featured .tier-price strong { + color: #fffaf2; + } + + .tier-price span { + @apply pb-1 text-sm font-semibold; + color: #44516a; + } + + .tier-action { + @apply flex h-11 items-center justify-center rounded-full px-5 text-sm font-black no-underline transition-colors; background: #172033; color: #fffaf2; } - .pricing-login:hover { + .tier-action:hover { background: #0f766e; } + + .featured .tier-action { + background: #ffb26b; + color: #172033; + } + + .featured .tier-action:hover { + background: #fffaf2; + } + + .tier-section { + @apply flex flex-col gap-3; + } + + .tier-section h3 { + @apply text-xs font-black uppercase tracking-[0.18em]; + color: #0f766e; + } + + .featured .tier-section h3 { + color: #ffb26b; + } + + .tier-section ul { + @apply flex flex-col gap-2; + } + + .tier-section li { + @apply text-sm leading-6; + color: #172033; + } + + .tier-section li::before { + content: "✓"; + @apply mr-2 font-black; + color: #0f766e; + } + + .featured .tier-section li::before { + color: #ffb26b; + } + + .limits { + @apply mt-auto border-t pt-5; + border-color: rgba(23, 32, 51, 0.08); + } + + .featured .limits { + border-color: rgba(255, 250, 242, 0.14); + } diff --git a/frontend/src/features/landing/views/ProductFeaturePage.vue b/frontend/src/features/landing/views/ProductFeaturePage.vue new file mode 100644 index 0000000..8fab3d2 --- /dev/null +++ b/frontend/src/features/landing/views/ProductFeaturePage.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/frontend/src/features/landing/views/ProductPage.vue b/frontend/src/features/landing/views/ProductPage.vue index 9ad5c32..007426e 100644 --- a/frontend/src/features/landing/views/ProductPage.vue +++ b/frontend/src/features/landing/views/ProductPage.vue @@ -1,10 +1,15 @@ @@ -15,12 +20,36 @@
-
Product
-

Social media content approval, organized around the work itself.

-

- Socialize keeps content items, assets, revisions, comments, approval decisions, and publishing - handoff details in one workspace so teams do not have to coordinate review across scattered tools. -

+
{{ t('public.product.eyebrow') }}
+

{{ t('public.product.title') }}

+

{{ t('public.product.description') }}

+
+ +
+
+
{{ t('public.product.featureEyebrow') }}
+

{{ t('public.product.featureTitle') }}

+
+ +
+ + + + + {{ t(`public.features.${feature.slug}.title`) }} + {{ t(`public.features.${feature.slug}.description`) }} + +
@@ -32,7 +61,7 @@ } .public-page-content { - @apply mx-auto flex w-full max-w-7xl flex-col px-5 py-8 md:px-8 md:py-12; + @apply mx-auto flex w-full max-w-7xl flex-col gap-8 px-5 py-8 md:px-8 md:py-12; } .public-page-panel { @@ -56,4 +85,49 @@ @apply mt-5 max-w-3xl text-base leading-7 md:text-lg; color: #44516a; } + + .product-features { + @apply flex flex-col gap-5; + } + + .product-features h2 { + @apply mt-3 max-w-3xl text-2xl font-black leading-tight md:text-3xl; + color: #172033; + } + + .feature-grid { + @apply grid gap-4 md:grid-cols-3; + } + + .feature-card { + @apply flex min-h-48 flex-col gap-3 rounded-[1.25rem] border bg-white/80 p-5 no-underline transition-colors; + border-color: rgba(23, 32, 51, 0.08); + box-shadow: 0 18px 40px rgba(23, 32, 51, 0.05); + } + + .feature-card:hover { + background: #fff; + border-color: rgba(15, 118, 110, 0.28); + } + + .feature-icon { + @apply flex h-11 w-11 items-center justify-center rounded-[0.85rem]; + background: rgba(15, 118, 110, 0.1); + color: #0f766e; + } + + .feature-icon svg { + @apply h-5 w-5; + fill: currentColor; + } + + .feature-card strong { + @apply text-base font-black; + color: #172033; + } + + .feature-card span:last-child { + @apply text-sm leading-6; + color: #44516a; + } diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 366824b..79bceb6 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -33,6 +33,327 @@ "x": "X (Twitter)", "youtube": "YouTube", "website": "Website", + "public": { + "nav": { + "product": "Product", + "pricing": "Pricing", + "resources": "Resources", + "blogs": "Blogs", + "guides": "Guides", + "ariaLabel": "Public site navigation", + "language": "Language", + "openApp": "Open app", + "login": "Login" + }, + "landing": { + "meta": { + "title": "Socialize | Try a faster social media approval workflow", + "description": "Try Socialize to centralize social media content review, revisions, client approvals, and publication handoff in one workflow." + }, + "hero": { + "eyebrow": "Client approvals without the chase", + "title": "Get social content approved before another deadline slips.", + "description": "Stop hunting through Drive links, email threads, chat comments, and spreadsheets. Socialize gives agencies and content teams one focused workflow for review, revisions, approvals, and publishing handoff.", + "primaryAction": "Try the app", + "secondaryAction": "Try the app", + "ctaNote": "Start with your next client review. No publishing migration required." + }, + "proof": { + "reviews": { + "value": "1 place", + "label": "for every review" + }, + "handoff": { + "value": "0 guesswork", + "label": "at publishing handoff" + }, + "traceability": { + "value": "Full context", + "label": "for every approval" + } + }, + "mockup": { + "title": "Review queue", + "badge": "Live workflow", + "reel": { + "title": "May launch reel", + "meta": "Instagram · Client review", + "status": "Needs approval" + }, + "launch": { + "title": "Product announcement", + "meta": "LinkedIn · Internal review", + "status": "Changes logged" + }, + "newsletter": { + "title": "June newsletter", + "meta": "Email · Ready for handoff", + "status": "Approved" + }, + "approvalLabel": "Latest decision", + "approvalValue": "Approved version is clear, traceable, and ready to schedule." + }, + "pillars": { + "singleSource": { + "eyebrow": "End the status meeting", + "title": "Every comment, revision, decision, and due date stays attached to the content item." + }, + "collaboration": { + "eyebrow": "Collaboration that closes loops", + "title": "Give agency teams, providers, and client approvers one obvious place to review and approve." + }, + "ownership": { + "eyebrow": "Keep ownership of your data", + "title": "Keep client files where they belong while Socialize organizes the workflow around them." + } + }, + "focus": { + "eyebrow": "Why teams try it", + "title": "The fastest way to feel the difference is to run one real approval through Socialize.", + "clients": { + "label": "Clients", + "description": "Keep each brand or business in a clean review workspace" + }, + "campaigns": { + "label": "Campaigns", + "description": "Group related work around timelines, approvals, and delivery goals" + }, + "contentItems": { + "label": "Content items", + "description": "Make every post, asset, and approval easy to find again" + } + }, + "finalCta": { + "eyebrow": "Try it on your next approval", + "title": "You already have content waiting for feedback. Put the next one in Socialize.", + "description": "Bring one client review into a workspace and see how much easier it is when feedback, versions, and approvals stay together." + } + }, + "product": { + "meta": { + "title": "Product | Socialize", + "description": "Socialize keeps content items, assets, revisions, comments, approval decisions, and publishing handoff details in one workspace." + }, + "eyebrow": "Product", + "title": "Social media content approval, organized around the work itself.", + "description": "Socialize keeps content items, assets, revisions, comments, approval decisions, and publishing handoff details in one workspace so teams do not have to coordinate review across scattered tools.", + "featureEyebrow": "Features", + "featureTitle": "Follow the work from request to approval." + }, + "features": { + "content-planning": { + "title": "Content planning", + "description": "Shape upcoming work around clients, campaigns, channels, owners, and due dates.", + "detailTitle": "Plan social content before review starts.", + "detailDescription": "Create content items with the context reviewers need: copy, channels, timing, campaign relationships, and production notes.", + "bullets": [ + "Organize work by workspace, client, and campaign.", + "Track planned dates, channels, and review readiness.", + "Keep the request, brief, and reviewable content together." + ] + }, + "asset-revisions": { + "title": "Asset revisions", + "description": "Keep files and versions traceable without forcing teams to abandon their storage.", + "detailTitle": "Make the latest asset version obvious.", + "detailDescription": "Link creative assets, preserve revision history, and keep feedback connected to the version being reviewed.", + "bullets": [ + "Attach images, videos, documents, and file references.", + "Preserve earlier revisions instead of overwriting context.", + "Help reviewers understand which version is current." + ] + }, + "comment-threads": { + "title": "Comment threads", + "description": "Keep feedback attached to the content instead of scattered across chat and email.", + "detailTitle": "Put review conversations where the work lives.", + "detailDescription": "Centralize feedback, questions, internal notes, and client comments around the content item.", + "bullets": [ + "Keep discussion tied to the relevant item or revision.", + "Separate workflow comments from formal approval decisions.", + "Reduce follow-up by keeping context visible to the team." + ] + }, + "approval-workflows": { + "title": "Approval workflows", + "description": "Record clear approval decisions before content moves to publishing handoff.", + "detailTitle": "Turn review into a clear decision.", + "detailDescription": "Support required, optional, and multi-step approval patterns so teams know when content is actually approved.", + "bullets": [ + "Track who approved and when.", + "Support internal review before client approval.", + "Keep approval state separate from informal feedback." + ] + }, + "client-review": { + "title": "Client review", + "description": "Give external approvers a focused way to review content without full workspace access.", + "detailTitle": "Make client review easier to complete.", + "detailDescription": "Share focused review access so clients can comment and approve the content they are responsible for.", + "bullets": [ + "Keep clients focused on the content they need to review.", + "Avoid exposing internal workspace details.", + "Reduce back-and-forth with a clear approval surface." + ] + }, + "review-queues": { + "title": "Review queues", + "description": "Show teams what needs attention, what is blocked, and what can move forward.", + "detailTitle": "Know what needs review next.", + "detailDescription": "Surface pending approvals, overdue work, and items waiting for feedback so teams can act quickly.", + "bullets": [ + "Track items waiting on internal or client review.", + "Spot blockers before deadlines slip.", + "Keep approval work visible across the workspace." + ] + }, + "audit-trail": { + "title": "Audit trail", + "description": "Preserve the history of uploads, comments, status changes, and approvals.", + "detailTitle": "Keep a record teams can trust.", + "detailDescription": "Socialize keeps workflow history attached to the content item so decisions and revisions remain traceable.", + "bullets": [ + "See status changes and approval history.", + "Preserve revision context after content changes.", + "Make handoff decisions easier to verify." + ] + }, + "workspace-access": { + "title": "Workspace access", + "description": "Separate organization members, workspace collaborators, clients, and approvers.", + "detailTitle": "Give the right people the right scope.", + "detailDescription": "Use workspaces as the brand or client boundary while keeping organization access, collaborators, and external reviewers distinct.", + "bullets": [ + "Keep each client or brand in its own workspace.", + "Invite external collaborators without making them organization members.", + "Preserve workspace-level scoping for review data." + ] + }, + "team-collaboration": { + "title": "Team collaboration", + "description": "Coordinate agencies, producers, providers, and client approvers in one workflow.", + "detailTitle": "Bring every reviewer into one workflow.", + "detailDescription": "Help internal teams, production partners, and clients work from the same review state without losing ownership of their part of the process.", + "bullets": [ + "Coordinate internal and external contributors.", + "Keep team review and client review connected.", + "Make ownership and next steps easier to see." + ] + } + }, + "pricing": { + "meta": { + "title": "Pricing | Socialize", + "description": "Socialize pricing for freelancers, agencies, and teams managing social media content approvals with clients." + }, + "eyebrow": "Pricing", + "title": "Start free. Upgrade when approvals become client work.", + "description": "Choose the plan that matches your review volume. Every tier keeps content, feedback, revisions, and approvals in one workflow.", + "bestValue": "Best value", + "includedLabel": "Included", + "limitsLabel": "Limits", + "tiers": { + "free": { + "name": "Free", + "description": "For trying Socialize on one real approval workflow.", + "price": "$0", + "priceNote": "forever", + "action": "Try the app", + "features": [ + "Content items with copy and asset links", + "Basic comments and review history", + "One approval workflow", + "Client-ready review view", + "Email-ready handoff notes" + ], + "limits": [ + "1 workspace", + "3 active content items", + "2 team members", + "1 external reviewer" + ] + }, + "freelance": { + "name": "Freelance", + "description": "For solo operators managing recurring client reviews.", + "price": "$19", + "priceNote": "per month", + "action": "Start Freelance", + "features": [ + "Everything in Free", + "Revision tracking for assets and copy", + "Reusable client approval workflow", + "Review queue for active work", + "Activity history for approvals" + ], + "limits": [ + "3 workspaces", + "25 active content items", + "5 team members", + "10 external reviewers" + ] + }, + "agency": { + "name": "Agency", + "description": "For agencies that need repeatable client approval operations.", + "price": "$79", + "priceNote": "per month", + "action": "Start Agency", + "features": [ + "Everything in Freelance", + "Multi-client workspace management", + "Internal review before client approval", + "Multi-step approval workflows", + "Priority review queues and audit trail" + ], + "limits": [ + "15 workspaces", + "250 active content items", + "25 team members", + "Unlimited external reviewers" + ] + }, + "enterprise": { + "name": "Enterprise", + "description": "For larger organizations with governance and access needs.", + "price": "Custom", + "priceNote": "tailored plan", + "action": "Start Enterprise", + "features": [ + "Everything in Agency", + "Organization-level access controls", + "Advanced approval configuration", + "Dedicated onboarding support", + "Custom usage and workspace limits" + ], + "limits": [ + "Unlimited workspaces", + "Unlimited active content items", + "Custom member limits", + "Custom reviewer limits" + ] + } + } + }, + "blogs": { + "meta": { + "title": "Blogs | Socialize", + "description": "Practical articles on content review workflows, client approval, revision tracking, and publication handoff." + }, + "eyebrow": "Blogs", + "title": "Practical notes on content review workflows.", + "description": "Articles are coming soon. This area will cover approval operations, client review habits, revision tracking, and publication handoff." + }, + "guides": { + "meta": { + "title": "Guides | Socialize", + "description": "Reusable guides for content intake, review rounds, approval decisions, and delivery readiness." + }, + "eyebrow": "Guides", + "title": "Reusable guides for managing review and approval work.", + "description": "Guides are coming soon. This area will collect repeatable playbooks for content intake, review rounds, approval decisions, and delivery readiness." + } + }, "common": { "cancel": "Cancel", "creating": "Creating...", @@ -484,9 +805,7 @@ "empty": "No review items are available for the active workspace." }, "contentItems": { - "eyebrow": "Content workflow", "title": "Content items", - "description": "Reviewable units with assets, copy, and approval status inside the active workspace.", "newItem": "New content item", "createTitle": "Create content item", "upcoming": "Upcoming", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 63ba9ba..a3ba309 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -33,6 +33,327 @@ "x": "X (Twitter)", "youtube": "YouTube", "website": "Site web", + "public": { + "nav": { + "product": "Produit", + "pricing": "Tarifs", + "resources": "Ressources", + "blogs": "Articles", + "guides": "Guides", + "ariaLabel": "Navigation du site public", + "language": "Langue", + "openApp": "Ouvrir l'app", + "login": "Connexion" + }, + "landing": { + "meta": { + "title": "Socialize | Essayez un workflow d'approbation social plus rapide", + "description": "Essayez Socialize pour centraliser la révision de contenu social, les versions, les approbations client et la remise pour publication dans un seul workflow." + }, + "hero": { + "eyebrow": "Approbations client sans relance", + "title": "Faites approuver le contenu social avant que la prochaine échéance glisse.", + "description": "Arrêtez de fouiller dans les liens Drive, emails, chats et tableurs. Socialize donne aux agences et aux équipes de contenu un workflow ciblé pour les révisions, les versions, les approbations et la remise pour publication.", + "primaryAction": "Essayer l'app", + "secondaryAction": "Essayer l'app", + "ctaNote": "Commencez avec votre prochaine révision client. Aucune migration de publication requise." + }, + "proof": { + "reviews": { + "value": "1 endroit", + "label": "pour chaque révision" + }, + "handoff": { + "value": "0 flou", + "label": "à la remise publication" + }, + "traceability": { + "value": "Contexte complet", + "label": "pour chaque approbation" + } + }, + "mockup": { + "title": "File de révision", + "badge": "Workflow actif", + "reel": { + "title": "Reel lancement mai", + "meta": "Instagram · Révision client", + "status": "À approuver" + }, + "launch": { + "title": "Annonce produit", + "meta": "LinkedIn · Révision interne", + "status": "Retours notés" + }, + "newsletter": { + "title": "Infolettre juin", + "meta": "Email · Prêt pour remise", + "status": "Approuvé" + }, + "approvalLabel": "Dernière décision", + "approvalValue": "La version approuvée est claire, traçable et prête à planifier." + }, + "pillars": { + "singleSource": { + "eyebrow": "Moins de suivis", + "title": "Chaque commentaire, version, décision et échéance reste attaché au contenu." + }, + "collaboration": { + "eyebrow": "Collaboration qui avance", + "title": "Donnez aux équipes d'agence, aux fournisseurs et aux approbateurs client un endroit évident pour réviser et approuver." + }, + "ownership": { + "eyebrow": "Gardez le contrôle de vos données", + "title": "Gardez les fichiers client là où ils doivent être pendant que Socialize organise le workflow autour d'eux." + } + }, + "focus": { + "eyebrow": "Pourquoi l'essayer", + "title": "Le moyen le plus rapide de sentir la différence est de passer une vraie approbation dans Socialize.", + "clients": { + "label": "Clients", + "description": "Gardez chaque marque ou entreprise dans un espace de révision propre" + }, + "campaigns": { + "label": "Campagnes", + "description": "Regroupez le travail autour des échéances, approbations et objectifs de livraison" + }, + "contentItems": { + "label": "Contenus", + "description": "Rendez chaque post, asset et approbation facile à retrouver" + } + }, + "finalCta": { + "eyebrow": "Essayez-le sur votre prochaine approbation", + "title": "Vous avez déjà du contenu qui attend des retours. Mettez le prochain dans Socialize.", + "description": "Ajoutez une révision client dans un espace et voyez comme c'est plus simple quand les retours, versions et approbations restent ensemble." + } + }, + "product": { + "meta": { + "title": "Produit | Socialize", + "description": "Socialize garde les contenus, les assets, les versions, les commentaires, les décisions d'approbation et la remise pour publication dans un seul espace." + }, + "eyebrow": "Produit", + "title": "L'approbation de contenu social, organisée autour du travail lui-même.", + "description": "Socialize garde les contenus, les assets, les versions, les commentaires, les décisions d'approbation et la remise pour publication dans un seul espace afin que les équipes n'aient plus à coordonner les révisions dans des outils dispersés.", + "featureEyebrow": "Fonctionnalités", + "featureTitle": "Suivez le travail de la demande à l'approbation." + }, + "features": { + "content-planning": { + "title": "Planification de contenu", + "description": "Structurez le travail à venir autour des clients, campagnes, canaux, responsables et échéances.", + "detailTitle": "Planifiez le contenu social avant la révision.", + "detailDescription": "Créez des contenus avec le contexte dont les réviseurs ont besoin : texte, canaux, dates, campagnes et notes de production.", + "bullets": [ + "Organisez le travail par espace, client et campagne.", + "Suivez les dates prévues, les canaux et la préparation à la révision.", + "Gardez la demande, le brief et le contenu à réviser ensemble." + ] + }, + "asset-revisions": { + "title": "Versions d'assets", + "description": "Gardez les fichiers et les versions traçables sans obliger les équipes à changer de stockage.", + "detailTitle": "Rendez la dernière version évidente.", + "detailDescription": "Liez les assets créatifs, conservez l'historique des versions et gardez les retours connectés à la version révisée.", + "bullets": [ + "Ajoutez images, vidéos, documents et références de fichiers.", + "Préservez les anciennes versions au lieu d'effacer le contexte.", + "Aidez les réviseurs à savoir quelle version est courante." + ] + }, + "comment-threads": { + "title": "Fils de commentaires", + "description": "Gardez les retours attachés au contenu plutôt que dispersés dans les chats et emails.", + "detailTitle": "Placez les conversations de révision avec le travail.", + "detailDescription": "Centralisez les retours, questions, notes internes et commentaires client autour du contenu.", + "bullets": [ + "Gardez la discussion liée au bon contenu ou à la bonne version.", + "Séparez les commentaires de workflow des décisions d'approbation.", + "Réduisez les suivis en gardant le contexte visible." + ] + }, + "approval-workflows": { + "title": "Workflows d'approbation", + "description": "Enregistrez des décisions claires avant la remise pour publication.", + "detailTitle": "Transformez la révision en décision claire.", + "detailDescription": "Prenez en charge des approbations requises, optionnelles ou à plusieurs étapes pour savoir quand le contenu est vraiment approuvé.", + "bullets": [ + "Suivez qui a approuvé et quand.", + "Soutenez la révision interne avant l'approbation client.", + "Gardez l'état d'approbation séparé des retours informels." + ] + }, + "client-review": { + "title": "Révision client", + "description": "Donnez aux approbateurs externes une manière ciblée de réviser sans accès complet à l'espace.", + "detailTitle": "Rendez la révision client plus simple à terminer.", + "detailDescription": "Partagez un accès de révision ciblé pour que les clients puissent commenter et approuver le contenu qui les concerne.", + "bullets": [ + "Gardez les clients concentrés sur le contenu à réviser.", + "Évitez d'exposer les détails internes de l'espace.", + "Réduisez les allers-retours avec une surface d'approbation claire." + ] + }, + "review-queues": { + "title": "Files de révision", + "description": "Montrez ce qui demande attention, ce qui bloque et ce qui peut avancer.", + "detailTitle": "Sachez quoi réviser ensuite.", + "detailDescription": "Faites ressortir les approbations en attente, le travail en retard et les contenus qui attendent un retour.", + "bullets": [ + "Suivez les contenus en attente de révision interne ou client.", + "Repérez les blocages avant que les échéances glissent.", + "Gardez le travail d'approbation visible dans l'espace." + ] + }, + "audit-trail": { + "title": "Historique d'audit", + "description": "Préservez l'historique des uploads, commentaires, changements de statut et approbations.", + "detailTitle": "Gardez un historique fiable.", + "detailDescription": "Socialize garde l'historique du workflow attaché au contenu afin que les décisions et versions restent traçables.", + "bullets": [ + "Consultez les changements de statut et l'historique d'approbation.", + "Préservez le contexte des versions après les changements.", + "Vérifiez plus facilement les décisions de remise." + ] + }, + "workspace-access": { + "title": "Accès par espace", + "description": "Séparez membres de l'organisation, collaborateurs, clients et approbateurs.", + "detailTitle": "Donnez le bon périmètre aux bonnes personnes.", + "detailDescription": "Utilisez les espaces comme limite de marque ou de client tout en séparant l'accès organisation, les collaborateurs et les réviseurs externes.", + "bullets": [ + "Gardez chaque client ou marque dans son propre espace.", + "Invitez des collaborateurs externes sans les ajouter à l'organisation.", + "Préservez le périmètre des données de révision par espace." + ] + }, + "team-collaboration": { + "title": "Collaboration d'équipe", + "description": "Coordonnez agences, producteurs, fournisseurs et approbateurs client dans un même workflow.", + "detailTitle": "Rassemblez tous les réviseurs dans un même workflow.", + "detailDescription": "Aidez les équipes internes, partenaires de production et clients à travailler depuis le même état de révision sans perdre la propriété de leur partie du processus.", + "bullets": [ + "Coordonnez contributeurs internes et externes.", + "Gardez la révision d'équipe et la révision client connectées.", + "Rendez les responsabilités et prochaines étapes plus visibles." + ] + } + }, + "pricing": { + "meta": { + "title": "Tarifs | Socialize", + "description": "Tarifs Socialize pour freelances, agences et équipes qui gèrent les approbations de contenu social avec leurs clients." + }, + "eyebrow": "Tarifs", + "title": "Commencez gratuitement. Passez au niveau supérieur quand les approbations deviennent du travail client.", + "description": "Choisissez le forfait adapté à votre volume de révision. Chaque niveau garde contenus, retours, versions et approbations dans un seul workflow.", + "bestValue": "Meilleure offre", + "includedLabel": "Inclus", + "limitsLabel": "Limites", + "tiers": { + "free": { + "name": "Free", + "description": "Pour essayer Socialize sur un vrai workflow d'approbation.", + "price": "0 $", + "priceNote": "pour toujours", + "action": "Essayer l'app", + "features": [ + "Contenus avec texte et liens d'assets", + "Commentaires de base et historique de révision", + "Un workflow d'approbation", + "Vue de révision prête pour le client", + "Notes de remise prêtes à envoyer" + ], + "limits": [ + "1 espace", + "3 contenus actifs", + "2 membres d'équipe", + "1 réviseur externe" + ] + }, + "freelance": { + "name": "Freelance", + "description": "Pour les indépendants qui gèrent des révisions client récurrentes.", + "price": "19 $", + "priceNote": "par mois", + "action": "Choisir Freelance", + "features": [ + "Tout le forfait Free", + "Suivi des versions pour assets et texte", + "Workflow d'approbation client réutilisable", + "File de révision pour le travail actif", + "Historique d'activité des approbations" + ], + "limits": [ + "3 espaces", + "25 contenus actifs", + "5 membres d'équipe", + "10 réviseurs externes" + ] + }, + "agency": { + "name": "Agency", + "description": "Pour les agences qui veulent des opérations d'approbation client répétables.", + "price": "79 $", + "priceNote": "par mois", + "action": "Choisir Agency", + "features": [ + "Tout le forfait Freelance", + "Gestion de plusieurs espaces client", + "Révision interne avant approbation client", + "Workflows d'approbation multi-étapes", + "Files prioritaires et historique d'audit" + ], + "limits": [ + "15 espaces", + "250 contenus actifs", + "25 membres d'équipe", + "Réviseurs externes illimités" + ] + }, + "enterprise": { + "name": "Enterprise", + "description": "Pour les grandes organisations avec des besoins de gouvernance et d'accès.", + "price": "Sur mesure", + "priceNote": "forfait adapté", + "action": "Choisir Enterprise", + "features": [ + "Tout le forfait Agency", + "Contrôles d'accès au niveau organisation", + "Configuration avancée des approbations", + "Accompagnement dédié à l'onboarding", + "Limites personnalisées d'usage et d'espaces" + ], + "limits": [ + "Espaces illimités", + "Contenus actifs illimités", + "Limites de membres personnalisées", + "Limites de réviseurs personnalisées" + ] + } + } + }, + "blogs": { + "meta": { + "title": "Articles | Socialize", + "description": "Articles pratiques sur les workflows de révision, l'approbation client, le suivi des versions et la remise pour publication." + }, + "eyebrow": "Articles", + "title": "Notes pratiques sur les workflows de révision de contenu.", + "description": "Les articles arrivent bientôt. Cette section couvrira les opérations d'approbation, les habitudes de révision client, le suivi des versions et la remise pour publication." + }, + "guides": { + "meta": { + "title": "Guides | Socialize", + "description": "Guides réutilisables pour l'intake de contenu, les cycles de révision, les décisions d'approbation et la préparation à la livraison." + }, + "eyebrow": "Guides", + "title": "Guides réutilisables pour gérer les révisions et les approbations.", + "description": "Les guides arrivent bientôt. Cette section rassemblera des playbooks répétables pour l'intake de contenu, les cycles de révision, les décisions d'approbation et la préparation à la livraison." + } + }, "common": { "cancel": "Annuler", "creating": "Création...", @@ -484,9 +805,7 @@ "empty": "Aucun élément de révision n'est disponible pour l'espace actif." }, "contentItems": { - "eyebrow": "Flux de contenu", "title": "Éléments de contenu", - "description": "Unités révisables avec ressources, texte et statut d'approbation dans l'espace actif.", "newItem": "Nouvel élément de contenu", "createTitle": "Créer un élément de contenu", "upcoming": "À venir", diff --git a/frontend/src/router/router.js b/frontend/src/router/router.js index be0c649..c2c3076 100644 --- a/frontend/src/router/router.js +++ b/frontend/src/router/router.js @@ -4,6 +4,7 @@ import { createRouter, createWebHistory } from 'vue-router'; const LoginView = () => import('@/features/auth/views/LoginView.vue'); const Landing = () => import('@/features/landing/views/Landing.vue'); const ProductPage = () => import('@/features/landing/views/ProductPage.vue'); +const ProductFeaturePage = () => import('@/features/landing/views/ProductFeaturePage.vue'); const PricingPage = () => import('@/features/landing/views/PricingPage.vue'); const BlogsPage = () => import('@/features/landing/views/BlogsPage.vue'); const GuidesPage = () => import('@/features/landing/views/GuidesPage.vue'); @@ -41,6 +42,11 @@ const routes = [ name: 'product', component: ProductPage, }, + { + path: '/product/:featureSlug', + name: 'product-feature', + component: ProductFeaturePage, + }, { path: '/pricing', name: 'pricing',