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:
|
Public page metadata helper:
|
||||||
|
|
||||||
```txt
|
```txt
|
||||||
frontend/src/features/landing/publicPageMeta.js
|
frontend/src/static/publicPageMeta.js
|
||||||
```
|
```
|
||||||
|
|
||||||
## Server Routing
|
## 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 { createPinia } from 'pinia';
|
||||||
import en from '@/locales/en.json';
|
import en from '@/locales/en.json';
|
||||||
import fr from '@/locales/fr.json';
|
import fr from '@/locales/fr.json';
|
||||||
import Landing from '@/features/landing/views/Landing.vue';
|
import Landing from '@/static/views/Landing.vue';
|
||||||
import ProductPage from '@/features/landing/views/ProductPage.vue';
|
import ProductPage from '@/static/views/ProductPage.vue';
|
||||||
import ProductFeaturePage from '@/features/landing/views/ProductFeaturePage.vue';
|
import ProductFeaturePage from '@/static/views/ProductFeaturePage.vue';
|
||||||
import PricingPage from '@/features/landing/views/PricingPage.vue';
|
import PricingPage from '@/static/views/PricingPage.vue';
|
||||||
import BlogsPage from '@/features/landing/views/BlogsPage.vue';
|
import BlogsPage from '@/static/views/BlogsPage.vue';
|
||||||
import GuidesPage from '@/features/landing/views/GuidesPage.vue';
|
import GuidesPage from '@/static/views/GuidesPage.vue';
|
||||||
import './assets/main.css';
|
import './assets/main.css';
|
||||||
|
|
||||||
const publicRoutes = [
|
const publicRoutes = [
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ import { useAuthStore } from '@/features/auth/stores/authStore.js';
|
|||||||
import { createRouter, createWebHistory } from 'vue-router';
|
import { createRouter, createWebHistory } from 'vue-router';
|
||||||
|
|
||||||
const LoginView = () => import('@/features/auth/views/LoginView.vue');
|
const LoginView = () => import('@/features/auth/views/LoginView.vue');
|
||||||
const Landing = () => import('@/features/landing/views/Landing.vue');
|
const Landing = () => import('@/static/views/Landing.vue');
|
||||||
const ProductPage = () => import('@/features/landing/views/ProductPage.vue');
|
const ProductPage = () => import('@/static/views/ProductPage.vue');
|
||||||
const ProductFeaturePage = () => import('@/features/landing/views/ProductFeaturePage.vue');
|
const ProductFeaturePage = () => import('@/static/views/ProductFeaturePage.vue');
|
||||||
const PricingPage = () => import('@/features/landing/views/PricingPage.vue');
|
const PricingPage = () => import('@/static/views/PricingPage.vue');
|
||||||
const BlogsPage = () => import('@/features/landing/views/BlogsPage.vue');
|
const BlogsPage = () => import('@/static/views/BlogsPage.vue');
|
||||||
const GuidesPage = () => import('@/features/landing/views/GuidesPage.vue');
|
const GuidesPage = () => import('@/static/views/GuidesPage.vue');
|
||||||
const RegisterView = () => import('@/features/auth/views/RegisterView.vue');
|
const RegisterView = () => import('@/features/auth/views/RegisterView.vue');
|
||||||
const ForgotPasswordView = () => import('@/features/auth/views/ForgotPasswordView.vue');
|
const ForgotPasswordView = () => import('@/features/auth/views/ForgotPasswordView.vue');
|
||||||
const ResetPasswordView = () => import('@/features/auth/views/ResetPasswordView.vue');
|
const ResetPasswordView = () => import('@/features/auth/views/ResetPasswordView.vue');
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
import { computed, onBeforeUnmount, onMounted, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useAuthStore } from '@/features/auth/stores/authStore.js';
|
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 allowedLocales = ['en', 'fr'];
|
||||||
const localeStorageKey = 'user-locale';
|
const localeStorageKey = 'user-locale';
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const tierKeys = ['free', 'freelance', 'agency', 'enterprise'];
|
const tierKeys = ['free', 'freelance', 'agency', 'enterprise'];
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||||
import { getProductFeature, productFeatureItems } from '@/features/landing/productFeatures.js';
|
import { getProductFeature, productFeatureItems } from '@/static/productFeatures.js';
|
||||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { computed } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import LandingSiteMenu from '@/features/landing/components/LandingSiteMenu.vue';
|
import LandingSiteMenu from '@/static/components/LandingSiteMenu.vue';
|
||||||
import { productFeatureItems } from '@/features/landing/productFeatures.js';
|
import { productFeatureItems } from '@/static/productFeatures.js';
|
||||||
import { usePublicPageMeta } from '@/features/landing/publicPageMeta.js';
|
import { usePublicPageMeta } from '@/static/publicPageMeta.js';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
Reference in New Issue
Block a user