refactor: move public static pages
This commit is contained in:
@@ -88,7 +88,7 @@ When adding, removing, or renaming public indexed pages, update all of these:
|
||||
Public page metadata helper:
|
||||
|
||||
```txt
|
||||
frontend/src/features/landing/publicPageMeta.js
|
||||
frontend/src/static/publicPageMeta.js
|
||||
```
|
||||
|
||||
## Server Routing
|
||||
|
||||
19
docs/TASKS/app-shell/002-move-public-static-pages.md
Normal file
19
docs/TASKS/app-shell/002-move-public-static-pages.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Task: Move public static pages
|
||||
|
||||
## Goal
|
||||
|
||||
Move public marketing/static page code out of `frontend/src/features/landing` into `frontend/src/static` so it is separated from application feature modules.
|
||||
|
||||
## Relevant Files
|
||||
|
||||
- `frontend/src/router/router.js`
|
||||
- `frontend/src/entry-public-ssr.js`
|
||||
- `frontend/src/static/**`
|
||||
- `docs/SEO.md`
|
||||
|
||||
## Validation
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm run build
|
||||
```
|
||||
@@ -6,12 +6,12 @@ import { createI18n } from 'vue-i18n';
|
||||
import { createPinia } from 'pinia';
|
||||
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';
|
||||
import Landing from '@/static/views/Landing.vue';
|
||||
import ProductPage from '@/static/views/ProductPage.vue';
|
||||
import ProductFeaturePage from '@/static/views/ProductFeaturePage.vue';
|
||||
import PricingPage from '@/static/views/PricingPage.vue';
|
||||
import BlogsPage from '@/static/views/BlogsPage.vue';
|
||||
import GuidesPage from '@/static/views/GuidesPage.vue';
|
||||
import './assets/main.css';
|
||||
|
||||
const publicRoutes = [
|
||||
|
||||
@@ -2,12 +2,12 @@ import { useAuthStore } from '@/features/auth/stores/authStore.js';
|
||||
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');
|
||||
const Landing = () => import('@/static/views/Landing.vue');
|
||||
const ProductPage = () => import('@/static/views/ProductPage.vue');
|
||||
const ProductFeaturePage = () => import('@/static/views/ProductFeaturePage.vue');
|
||||
const PricingPage = () => import('@/static/views/PricingPage.vue');
|
||||
const BlogsPage = () => import('@/static/views/BlogsPage.vue');
|
||||
const GuidesPage = () => import('@/static/views/GuidesPage.vue');
|
||||
const RegisterView = () => import('@/features/auth/views/RegisterView.vue');
|
||||
const ForgotPasswordView = () => import('@/features/auth/views/ForgotPasswordView.vue');
|
||||
const ResetPasswordView = () => import('@/features/auth/views/ResetPasswordView.vue');
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useAuthStore } from '@/features/auth/stores/authStore.js';
|
||||
import { productFeatureItems } from '@/features/landing/productFeatures.js';
|
||||
import { productFeatureItems } from '@/static/productFeatures.js';
|
||||
|
||||
const allowedLocales = ['en', 'fr'];
|
||||
const localeStorageKey = 'user-locale';
|
||||
@@ -1,8 +1,8 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
||||
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
||||
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
||||
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
||||
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||
|
||||
const { t } = useI18n();
|
||||
const tierKeys = ['free', 'freelance', 'agency', 'enterprise'];
|
||||
@@ -2,9 +2,9 @@
|
||||
import { computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useRoute } from 'vue-router';
|
||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
||||
import { getProductFeature, productFeatureItems } from '@/features/landing/productFeatures.js';
|
||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
||||
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||
import { getProductFeature, productFeatureItems } from '@/static/productFeatures.js';
|
||||
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||
|
||||
const route = useRoute();
|
||||
const { t } = useI18n();
|
||||
@@ -1,9 +1,9 @@
|
||||
<script setup>
|
||||
import { computed } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
||||
import { productFeatureItems } from '@/features/landing/productFeatures.js';
|
||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
||||
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||
import { productFeatureItems } from '@/static/productFeatures.js';
|
||||
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
Reference in New Issue
Block a user