@@ -35,45 +35,6 @@ pnpm test:report # Open HTML coverage report
3535
3636---
3737
38- ## Folder Structure
39-
40- ```
41- app/
42- assets/
43- fonts/ # Self-hosted Roboto & Roboto Mono
44- icons/ # Custom SVG icons used with @nuxt/icon
45- styles/ # Global SCSS partials (imported via main.scss)
46- _colors.scss # CSS custom properties for colour tokens
47- _font-sizes.scss
48- _responsive.scss # CSS variables (DO NOT use in media queries)
49- scss/variables/responsive.scss # SCSS variables — USE THESE in @media queries
50- components/
51- Navigation.vue
52- ProjectList.server.vue # Server component — rendered at build time
53- SiteFooter.vue
54- layouts/
55- default.vue
56- pages/
57- index.vue # Homepage: hero, about, skills, projects preview
58- projects.vue
59- work.vue
60- links.vue
61- [slug].vue # Dynamic pages driven by Nuxt Content
62- utilities/
63- variables.ts # Shared runtime constants (occupation, URLs, year, experience)
64- content/
65- privacy-policy.md
66- public/
67- projects/ # Project screenshots
68- work/ # Work/employer logos
69- nuxt.config.ts
70- content.config.ts
71- vitest.config.ts
72- vitest.setup.ts
73- ```
74-
75- ---
76-
7738## Key Conventions
7839
7940### SCSS
@@ -90,36 +51,21 @@ vitest.setup.ts
9051- Shared constants (occupation title, URLs, computed years of experience, current year) live in ` app/utilities/variables.ts ` .
9152- Runtime env vars are exposed via ` useRuntimeConfig() ` — see ` nuxt.config.ts ` ` runtimeConfig.public ` .
9253
93- ### SEO / Schema
94- - Per-page canonical URLs are set with ` useHead() ` .
95- - Schema.org structured data uses ` useSchemaOrg() ` from ` nuxt-schema-org ` .
96- - Global identity (Person schema for Jack Domleo) is configured in ` nuxt.config.ts ` .
97-
98- ### Components
99- - ` ProjectList.server.vue ` is a Nuxt server component — keep data fetching server-side only.
100- - ` v-once ` is used on static sub-trees (icons, navigation items) for performance.
101-
10254### Content
10355- Markdown pages in ` content/ ` are served via ` [slug].vue ` using ` <ContentRenderer> ` .
10456- Rich text styles are in ` app/assets/styles/rich-text.scss ` .
10557
10658### Performance
10759- ` v-once ` is applied to all static sub-trees (icons, nav items, footer) to prevent unnecessary re-renders.
108- - ` ProjectList .server.vue` is a Nuxt server component — data fetching is server-side only, reducing client JS .
109- - Hero image uses ` loading="eager" ` and ` fetchpriority="high" ` ; all other images use ` loading="lazy" fetchpriority="low" ` .
60+ - Use ` ComponentName .server.vue` where applicable to keep data fetching server-side only.
61+ - Core web vitals are important so consider optimum performance without change behaviour or content .
11062- Fonts are self-hosted (no remote font requests); ` font-display: swap ` is set in ` _fonts.scss ` .
11163- The site is statically generated (` nuxi generate ` ) — all pages are pre-rendered HTML.
112- - Animations are wrapped in ` @media (prefers-reduced-motion: no-preference) ` guards throughout.
11364
11465### Accessibility
11566- Follow WCAG 2.2 AA as a minimum standard.
116- - Use semantic HTML elements ( ` <nav> ` , ` <header> ` , ` <footer> ` , ` <section> ` , ` <main> ` , etc.) rather than divs where appropriate .
67+ - Use semantic HTML.
11768- The ` .sr-only ` global utility class is used to provide screen-reader-only context (e.g. icon button labels, decorative link supplements).
118- - Interactive elements (links, buttons) must always have an accessible label — either visible text or ` aria-label ` / ` .sr-only ` text.
119- - Navigation uses ` aria-label ` , ` aria-expanded ` , ` aria-controls ` , ` aria-hidden ` , and ` role="menu" ` / ` role="menuitem" ` correctly.
120- - All images must have meaningful ` alt ` text; decorative images use ` alt="" ` .
121- - Focus management is handled for mobile nav open/close interactions.
122- - ` touch-action: manipulation ` is applied globally to links and buttons to prevent 300ms tap delay on mobile.
12369
12470---
12571
0 commit comments