Add CI lint configs (html-validate, linkinator), fix nav a11y and URL routing
- .htmlvalidate.json with relaxed rules for design-system inline styles - linkinator.config.json skipping mail, external auth/platform origins - Fix lint:html npm script quoting for Windows-shell compatibility - Switch astro build.format to 'directory' so /pricing resolves without MultiViews - trailingSlash: 'ignore' lets both /pricing and /pricing/ work naturally - Add aria-label to both <nav> landmarks (Primary, Footer) to satisfy html-validate Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
8
.htmlvalidate.json
Normal file
8
.htmlvalidate.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": ["html-validate:recommended"],
|
||||
"rules": {
|
||||
"require-sri": "off",
|
||||
"no-inline-style": "off",
|
||||
"void-style": "off"
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,11 @@ import tailwind from '@astrojs/tailwind';
|
||||
export default defineConfig({
|
||||
site: 'https://www.cameleer.io',
|
||||
output: 'static',
|
||||
trailingSlash: 'never',
|
||||
trailingSlash: 'ignore',
|
||||
build: {
|
||||
format: 'file',
|
||||
// 'directory' outputs <page>/index.html so extensionless URLs like /pricing
|
||||
// resolve natively under Apache without MultiViews or rewrite rules.
|
||||
format: 'directory',
|
||||
assets: 'assets',
|
||||
inlineStylesheets: 'auto',
|
||||
},
|
||||
|
||||
13
linkinator.config.json
Normal file
13
linkinator.config.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"recurse": true,
|
||||
"silent": true,
|
||||
"skip": [
|
||||
"^https://auth\\.cameleer\\.io",
|
||||
"^https://platform\\.cameleer\\.io",
|
||||
"^https://www\\.cameleer\\.io",
|
||||
"^mailto:",
|
||||
"^https://ec\\.europa\\.eu"
|
||||
],
|
||||
"retry": true,
|
||||
"concurrency": 10
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
"astro": "astro",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest",
|
||||
"lint:html": "html-validate 'dist/**/*.html'",
|
||||
"lint:html": "html-validate \"dist/**/*.html\"",
|
||||
"lint:links": "linkinator dist --recurse --silent",
|
||||
"lh": "lhci autorun"
|
||||
},
|
||||
|
||||
@@ -14,7 +14,7 @@ const year = new Date().getFullYear();
|
||||
</svg>
|
||||
<span class="text-text-muted text-sm">© {year} Cameleer</span>
|
||||
</div>
|
||||
<nav class="flex items-center gap-8 text-sm text-text-muted">
|
||||
<nav class="flex items-center gap-8 text-sm text-text-muted" aria-label="Footer">
|
||||
<a href="/pricing" class="hover:text-text transition-colors">Pricing</a>
|
||||
<a href="/imprint" class="hover:text-text transition-colors">Imprint</a>
|
||||
<a href="/privacy" class="hover:text-text transition-colors">Privacy</a>
|
||||
|
||||
@@ -14,7 +14,7 @@ import CTAButtons from './CTAButtons.astro';
|
||||
</svg>
|
||||
<span class="font-sans font-bold text-lg tracking-tight text-text group-hover:text-accent transition-colors">Cameleer</span>
|
||||
</a>
|
||||
<nav class="flex items-center gap-8 text-sm">
|
||||
<nav class="flex items-center gap-8 text-sm" aria-label="Primary">
|
||||
<a href="/pricing" class="text-text-muted hover:text-text transition-colors">Pricing</a>
|
||||
</nav>
|
||||
<CTAButtons size="md" />
|
||||
|
||||
Reference in New Issue
Block a user