init project
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
# Brand Migration Record
|
||||
|
||||
The project name changed from `homePageCar` to `RentalDriveGo` at Phase 10.
|
||||
|
||||
## Preserved historical authority
|
||||
|
||||
`contracts/phase9` is an immutable copy of the approved Phase 9 package. Its names, files, checksums, and historical references are not rewritten. This preserves auditability and prevents a rename from masquerading as retroactive approval.
|
||||
|
||||
## Updated implementation surfaces
|
||||
|
||||
Runtime locale catalogs under `src/content/locales` use `RentalDriveGo`. The application package, page metadata, title, shell label, and documentation use the new name.
|
||||
|
||||
## Intentionally retained identifiers
|
||||
|
||||
The following legacy technical identifiers remain because they are part of the Phase 9 contract and may exist in user storage:
|
||||
|
||||
- `hpc-locale`
|
||||
- `hpc-theme`
|
||||
- `hpc.theme.preference`
|
||||
|
||||
Changing them requires an explicit compatibility migration. Renaming a cookie for cosmetic purity while discarding users' preferences would be branding theater, not engineering.
|
||||
|
||||
## Asset decision
|
||||
|
||||
Phase 9 logo files contain the former name and are retained only inside the immutable contract package. They are not copied into `public`. The repository shell uses a text-based `R` mark as a non-public implementation placeholder. A final RentalDriveGo logo asset requires Product and Design approval before release.
|
||||
@@ -0,0 +1,58 @@
|
||||
# RentalDriveGo Decision Log v12.0
|
||||
|
||||
Date: 2026-06-25
|
||||
Scope: Phase 12 reusable component-system implementation
|
||||
|
||||
## D12-001: Preserve the Phase 11 styling architecture
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Phase 12 uses CSS Modules and Phase 11 semantic tokens exclusively. No utility CSS framework, CSS-in-JS runtime, or arbitrary raw brand-color API was added.
|
||||
|
||||
## D12-002: Prefer native platform semantics
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Buttons, links, form controls, `details`, `progress`, and `dialog` remain native elements. Custom behavior is added only where keyboard state, focus return, browser APIs, or controlled composition require it.
|
||||
|
||||
## D12-003: Guard the component workbench
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
`/[locale]/component-lab` is the Storybook-equivalent fixture route. It is available only when `COMPONENT_FIXTURES_ENABLED=true`, is marked noindex, and uses deterministic fictional content.
|
||||
|
||||
## D12-004: Keep the dependency graph unchanged
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
The component system uses React, browser primitives, and the existing stack. No icon, overlay, form, animation, class-merging, or state-management dependency was added. A small internal SVG icon map avoids shipping an entire icon library for several symbols.
|
||||
|
||||
## D12-005: Use semantic, constrained component APIs
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Public APIs expose intent, status, density, alignment, or meaningful variants. Arbitrary colors and large Boolean prop collections are prohibited. Link and button semantics remain distinct.
|
||||
|
||||
## D12-006: Treat RTL as component behavior, not a global mirror
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
CSS logical properties and document direction control layout. Directional icons opt into mirroring; brands, media, vehicle imagery, process chronology, and universal media controls remain fixed unless explicitly specified.
|
||||
|
||||
## D12-007: Suppress unresolved production evidence and destinations
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Claims, metrics, customer evidence, testimonials, pricing, CRM transmission, login destinations, sales destinations, and final media remain typed blocked states, disabled treatments, or development fixtures tied to existing issue IDs. Compilation is not product approval.
|
||||
|
||||
## D12-008: Keep server rendering as the default
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Only stateful controls and browser-dependent utilities create client boundaries. Static surfaces, typography, media shells, evidence structures, workflow patterns, comparison patterns, and section patterns remain server-compatible.
|
||||
|
||||
## D12-009: Record runtime evidence without laundering environment failures
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Static validation, formatting, lint, strict type checking, unit tests, production build, and direct HTTP route checks are recorded as executed. Browser navigation, visual baselines, frozen pnpm installation, audit, Node 24 verification, and manual assistive-technology checks remain explicit gates.
|
||||
@@ -0,0 +1,52 @@
|
||||
# RentalDriveGo Decision Log v13.0
|
||||
|
||||
Date: 2026-06-25
|
||||
Scope: Phase 13 multilingual homepage assembly
|
||||
|
||||
## D13-001: Assemble rather than fork the component system
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
The homepage is composed from Phase 12 components and semantic layout primitives. No duplicate button, card, accordion, preview, workflow, comparison, or CTA family was introduced.
|
||||
|
||||
## D13-002: Keep route content typed and locale-owned
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
A typed `HomepageContent` model transforms complete EN, FR, and AR catalog messages into stable route-level content objects. Presentation code does not index translation arrays directly.
|
||||
|
||||
## D13-003: Treat unavailable destinations as product state
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Demo, product-tour, pricing, and sales actions remain non-navigable with localized disabled reasons. No empty hash, root fallback, guessed URL, CRM call, or fake submission was added.
|
||||
|
||||
## D13-004: Publish measurement definitions, not fictional results
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
The results section explains KPI definitions and evidence methodology without numeric claims. Customer evidence, testimonials, logos, certifications, SLAs, and partner names remain suppressed.
|
||||
|
||||
## D13-005: Use an illustrative operational preview
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
The hero uses the Phase 12 `ProductPreview` with deterministic fictional rows from localized catalogs. It is explicitly captioned as illustrative and does not impersonate an approved product capture.
|
||||
|
||||
## D13-006: Preserve document-level RTL and identifier isolation
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Arabic uses the existing document-level RTL shell. Layout CSS uses logical declarations, while vehicle identifiers remain isolated left-to-right through `BidiText`. Media and brand elements are not globally mirrored.
|
||||
|
||||
## D13-007: Make section anchors real
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
The existing header and footer hashes now resolve to implemented `product`, `workflow`, `modules`, `pricing`, and `faq` sections. Locale routing continues through the approved route helper.
|
||||
|
||||
## D13-008: Record environment limits without converting them into acceptance
|
||||
|
||||
Status: Accepted.
|
||||
|
||||
Static validation, formatting, lint, strict type checking, unit coverage, production build, and direct HTTP locale responses are recorded as executed. Chromium loopback navigation remains administrator-blocked, so browser, axe, visual, keyboard, touch, screen-reader, zoom, and forced-colors acceptance remain open.
|
||||
@@ -0,0 +1,60 @@
|
||||
# Exact Dependency Manifest
|
||||
|
||||
- **Project:** RentalDriveGo Web
|
||||
- **Recorded:** 2026-06-25
|
||||
- **Authority:** `package.json` and `pnpm-lock.yaml`
|
||||
- **Policy:** Exact direct versions, frozen lockfile in CI, reviewed automated updates
|
||||
|
||||
## Runtime and package manager
|
||||
|
||||
| Component | Exact version | Role |
|
||||
| --------- | ------------: | ------------------------- |
|
||||
| Node.js | 24.17.0 | Production and CI runtime |
|
||||
| pnpm | 11.9.0 | Package manager |
|
||||
|
||||
## Production dependencies
|
||||
|
||||
| Package | Exact version | Role |
|
||||
| --------------------------------------- | ------------: | ----------------------------------------------- |
|
||||
| `next` | 16.2.9 | SSR framework and App Router |
|
||||
| `react` | 19.2.7 | UI runtime |
|
||||
| `react-dom` | 19.2.7 | React DOM renderer |
|
||||
| `zod` | 4.4.3 | Runtime boundary schemas for later integrations |
|
||||
| `@fontsource-variable/inter` | 5.2.8 | Self-hosted Latin variable font |
|
||||
| `@fontsource-variable/noto-sans-arabic` | 5.2.10 | Self-hosted Arabic variable font |
|
||||
|
||||
## Development dependencies
|
||||
|
||||
| Package | Exact version | Role |
|
||||
| ----------------------------- | ------------: | -------------------------------------- |
|
||||
| `typescript` | 6.0.3 | Strict static type checking |
|
||||
| `eslint` | 9.39.4 | Lint engine |
|
||||
| `@eslint/js` | 9.39.4 | Core ESLint rules |
|
||||
| `eslint-config-next` | 16.2.9 | Next.js lint rules |
|
||||
| `eslint-config-prettier` | 10.1.8 | Formatting-rule conflict prevention |
|
||||
| `typescript-eslint` | 8.62.0 | TypeScript lint integration |
|
||||
| `globals` | 17.7.0 | Runtime global definitions |
|
||||
| `prettier` | 3.8.4 | Deterministic formatting |
|
||||
| `vitest` | 4.1.9 | Unit test runner |
|
||||
| `@vitest/coverage-v8` | 4.1.9 | Unit coverage |
|
||||
| `jsdom` | 29.1.1 | DOM test environment |
|
||||
| `@testing-library/react` | 16.3.2 | React test utilities |
|
||||
| `@testing-library/jest-dom` | 6.9.1 | DOM assertions |
|
||||
| `@testing-library/user-event` | 14.6.1 | Interaction simulation |
|
||||
| `@playwright/test` | 1.61.1 | Browser and visual testing |
|
||||
| `@axe-core/playwright` | 4.12.1 | Automated browser accessibility checks |
|
||||
| `@types/node` | 24.10.9 | Node.js type declarations |
|
||||
| `@types/react` | 19.2.17 | React type declarations |
|
||||
| `@types/react-dom` | 19.2.3 | React DOM type declarations |
|
||||
|
||||
## Supply-chain controls
|
||||
|
||||
- `pnpm-lock.yaml` locks all resolved transitive versions and integrity hashes.
|
||||
- CI uses `pnpm install --frozen-lockfile`.
|
||||
- The pnpm workspace enforces `minimumReleaseAge: 1440` minutes for unreviewed new releases.
|
||||
- Native package build scripts are allowlisted rather than globally trusted.
|
||||
- `postcss` is overridden to `8.5.15` to remove the audited vulnerable transitive resolution while retaining framework compatibility.
|
||||
- Dependabot proposes weekly npm and GitHub Actions updates for review.
|
||||
- `pnpm audit --audit-level low` reported no known vulnerabilities on 2026-06-25.
|
||||
|
||||
No dependency range in `package.json` is floating. The lockfile, rather than this narrative table, is the machine authority for the full transitive graph.
|
||||
@@ -0,0 +1,22 @@
|
||||
Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes
|
||||
P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance.
|
||||
P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented.
|
||||
P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed.
|
||||
P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled.
|
||||
P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval.
|
||||
P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed.
|
||||
P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced.
|
||||
P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission.
|
||||
P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims."
|
||||
P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target."
|
||||
P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim."
|
||||
P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed.
|
||||
P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market.
|
||||
P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed.
|
||||
P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime.
|
||||
P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed.
|
||||
P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges.
|
||||
P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing.
|
||||
P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped.
|
||||
P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed.
|
||||
P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0.
|
||||
|
@@ -0,0 +1,26 @@
|
||||
Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes
|
||||
P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance.
|
||||
P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented.
|
||||
P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed.
|
||||
P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled.
|
||||
P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval.
|
||||
P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed.
|
||||
P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced.
|
||||
P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission.
|
||||
P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims."
|
||||
P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target."
|
||||
P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim."
|
||||
P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed.
|
||||
P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market.
|
||||
P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed.
|
||||
P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime.
|
||||
P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed.
|
||||
P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges.
|
||||
P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing.
|
||||
P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped.
|
||||
P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed.
|
||||
P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0.
|
||||
P11-001,High,Phase 11 browser verification,Environment blocked,"tests/browser; tests/a11y; playwright.config.ts",Before Phase 11 acceptance,Engineering + QA,"Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects.",Static implementation is complete; execution evidence is not fabricated.
|
||||
P11-002,High,Visual baseline generation and approval,Environment blocked,"tests/visual; tests/visual/README.md",Before Phase 11 acceptance,Design + QA,"Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines.",Scenario coverage exists but PNG baselines were not generated locally.
|
||||
P11-003,Low,Exact Phase 11 target runtime verification,Open verification,"package.json; .node-version; .github/workflows/ci.yml",Before Phase 11 merge,Engineering,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0.",Local host is Node 22.16.0 and could not download pnpm 11.9.0.
|
||||
P11-004,Medium,Application-shell copy linguistic approval,Inherited open,"src/content/locales/fr/shell.json; src/content/locales/ar/shell.json",Before release,Content + Localization,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy.",Mechanical parity passes; linguistic approval remains P9-005.
|
||||
|
@@ -0,0 +1,31 @@
|
||||
Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes
|
||||
P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance.
|
||||
P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented.
|
||||
P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed.
|
||||
P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled.
|
||||
P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval.
|
||||
P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed.
|
||||
P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced.
|
||||
P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission.
|
||||
P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims."
|
||||
P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target."
|
||||
P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim."
|
||||
P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed.
|
||||
P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market.
|
||||
P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed.
|
||||
P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime.
|
||||
P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed.
|
||||
P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges.
|
||||
P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing.
|
||||
P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped.
|
||||
P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed.
|
||||
P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0.
|
||||
P11-001,High,Phase 11 browser verification,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 11 acceptance,Engineering + QA,Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects.,Static implementation is complete; execution evidence is not fabricated.
|
||||
P11-002,High,Visual baseline generation and approval,Environment blocked,tests/visual; tests/visual/README.md,Before Phase 11 acceptance,Design + QA,Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines.,Scenario coverage exists but PNG baselines were not generated locally.
|
||||
P11-003,Low,Exact Phase 11 target runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 11 merge,Engineering,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0.",Local host is Node 22.16.0 and could not download pnpm 11.9.0.
|
||||
P11-004,Medium,Application-shell copy linguistic approval,Inherited open,src/content/locales/fr/shell.json; src/content/locales/ar/shell.json,Before release,Content + Localization,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy.",Mechanical parity passes; linguistic approval remains P9-005.
|
||||
P12-001,High,Browser and accessibility execution,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 12 acceptance,Engineering + QA,Run all 44 Chromium browser/accessibility scenarios and the approved cross-browser matrix in an environment where loopback navigation is not administrator-blocked; fix product failures.,Chromium launched locally but every loopback navigation was rejected with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response.
|
||||
P12-002,High,Visual regression baselines,Environment blocked,tests/visual; tests/fixtures/component-system/component-matrix.json,Before Phase 12 acceptance,Design + QA,Generate and review stable light/dark EN/FR/AR desktop/mobile/focus/error/long-content baselines with the pinned browser.,Visual scenarios are authored; image capture is blocked by the same Chromium loopback policy.
|
||||
P12-003,Medium,Pinned runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 12 merge,Engineering,"Pass install, static, unit, build, browser, accessibility, visual, audit, and package gates on Node 24.17.0 and pnpm 11.9.0.",Source/static/unit/build checks passed under Node 22.16.0 with exact direct packages installed through npm fallback; target runtime remains unverified.
|
||||
P12-004,Medium,Frozen installation and dependency audit,Environment blocked,pnpm-lock.yaml; package.json; docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md,Before Phase 12 merge,Engineering + Security,Complete pnpm install --frozen-lockfile and pnpm audit --audit-level low with registry access.,Registry DNS returned EAI_AGAIN. npm fallback enabled local checks but does not satisfy the frozen pnpm or audit gates.
|
||||
P12-005,Medium,Manual assistive-technology and zoom QA,Open verification,docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 12 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, and viewport manual matrix; attach evidence.","Static semantics, unit interactions, and server-rendered routes are verified; human browser and assistive-technology observations are not fabricated."
|
||||
|
@@ -0,0 +1,34 @@
|
||||
Issue_ID,Severity,Area,Status,Code_path_or_control,Release_gate,Owner,Exit_criteria,Notes
|
||||
P9-001,Critical,Participant acceptance,Inherited open,contracts/phase9/research; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv,Before release,Research,"Run required pilot, core, and accessibility cohorts; fix/retest S0/S1 findings.",No production claim of usability acceptance.
|
||||
P9-002,High,CRM integration,Inherited open,src/contracts/phase9/demo-form-contract.ts; no endpoint implemented,Before production integration,Sales Ops + Engineering,"Approve and integration-test endpoint, routing, duplicates, idempotency, retry, spam controls, monitoring, and ownership.",Demo submission remains unimplemented.
|
||||
P9-003,High,Legal consent,Inherited open,No production form or legal copy implemented,Before production form,Legal,"Approve localized consent, privacy linkage, retention, and market requirements.",Suppressed rather than guessed.
|
||||
P9-004,High,Analytics and consent,Inherited open,src/contracts/phase9/analytics-contract.ts; no vendor adapter,Before beta,Analytics + Legal,"Approve vendor, event authority, consent policy, retention, replay policy, and non-PII payloads.",Contract imported; collection disabled.
|
||||
P9-005,High,Native linguistic review,Inherited open,"src/content/locales/{fr,ar}; CI locale parity",Before release,Content + Localization,"Native review of all visible copy, metadata, errors, and bidi samples.",Mechanical parity is not linguistic approval.
|
||||
P9-006,High,Illustrative product preview,Inherited open,No preview shipped,Before release,Product + Design,Approve illustration or provide governed product capture.,Suppressed.
|
||||
P9-007,High,Multi-location claim,Inherited open,scripts/validate-prohibited-content.mjs; visible shell only,Before beta,Product,Approve capability or revise/suppress affected copy.,No new claim introduced.
|
||||
P9-008,High,Pricing model,Inherited open,No pricing route or component,Before pricing publication,Commercial,Approve public pricing and limits in writing.,Quote-only posture preserved by omission.
|
||||
P9-009,High,Security evidence,Inherited open,No public security claims,Before claims publish,Security + Legal,"Provide scoped evidence, approvals, and expiry dates.","Security headers are implementation controls, not marketing claims."
|
||||
P9-010,Medium,Framework selection,Resolved in Phase 10,docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md,Scaffold merge,Architecture,Architecture decision accepted and implemented.,"Next.js App Router SSR, strict TypeScript, CSS Modules, OCI target."
|
||||
P9-011,Medium,Browser policy owner,Inherited open,.github/workflows/ci.yml; playwright.config.ts,Before beta,Product + Engineering,"Approve supported browser matrix, owner, telemetry, and exception/retirement process.","Configured matrix is a test baseline, not a policy claim."
|
||||
P9-012,Medium,Product tour medium,Inherited open,No product tour implemented,Before release,Product + Marketing,Approve accessible localized dialog fallback or media/transcript.,Suppressed.
|
||||
P9-013,Medium,Markets and formatting,Inherited open,src/lib/localization; no currency/phone market assumptions,Before regional campaign,Product + Legal,"Define markets, currency, timezone, phone, and jurisdiction independently of locale.",Locale is not treated as market.
|
||||
P9-014,Medium,Login destination,Inherited open,No login link implemented,Before release,Product + Engineering,"Approve destination, security behavior, locale return path, and analytics.",Suppressed.
|
||||
P9-015,Medium,Alternate sales contact,Inherited open,No secondary contact destination,Before release,Sales Ops,Provide approved contact route or approve suppression.,Placeholder address not imported into runtime.
|
||||
P9-016,Medium,Customer evidence,Inherited open,"No logos, metrics, testimonials, or case studies",Optional post-launch,Marketing + Legal,Provide attributable evidence records and approvals.,Suppressed.
|
||||
P9-017,Low,Exact dependency versions,Resolved in Phase 10,package.json; pnpm-lock.yaml; docs/DEPENDENCY_MANIFEST_v1.0.md,Scaffold,Engineering,"Exact versions pinned, audited, locked, and automated update review enabled.",No floating direct dependency ranges.
|
||||
P10-001,High,Canonical production origin,Open,src/lib/localization/site-origin.ts; .env.example,Before production deployment,Product + Infrastructure,Approve public domain/origin and configure SITE_ORIGIN in production.,Build fails closed in production when missing.
|
||||
P10-002,High,RentalDriveGo visual identity,Open,public/.gitkeep; docs/BRAND_MIGRATION_v1.0.md,Before public release,Product + Design,Approve and supply final accessible logo assets for light/dark contexts.,Old-name Phase 9 assets are retained only in immutable contracts and not shipped.
|
||||
P10-003,Medium,Browser suite execution,Environment blocked locally,.github/workflows/ci.yml; tests/browser; tests/a11y; tests/visual,Before Phase 11 acceptance,Engineering + QA,Run configured Playwright matrix in unblocked CI; generate/review baselines; close all failures.,Local Chromium is administrator-blocked and browser download DNS failed.
|
||||
P10-004,Low,Exact target runtime verification,Open verification,.github/workflows/ci.yml; Dockerfile; .node-version,Before scaffold merge,Engineering,Pass full quality and browser workflows on Node.js 24.17.0.,Local host exposes Node.js 22.16.0; target remains pinned to 24.17.0.
|
||||
P11-001,High,Phase 11 browser verification,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 11 acceptance,Engineering + QA,Install pinned dependencies and browsers in unblocked Node 24.17.0 CI; pass all functional and accessibility projects.,Static implementation is complete; execution evidence is not fabricated.
|
||||
P11-002,High,Visual baseline generation and approval,Environment blocked,tests/visual; tests/visual/README.md,Before Phase 11 acceptance,Design + QA,Generate all Chromium snapshots with the pinned browser; review locale/theme/viewport/drawer/focus cases; commit approved baselines.,Scenario coverage exists but PNG baselines were not generated locally.
|
||||
P11-003,Low,Exact Phase 11 target runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 11 merge,Engineering,"Run static, unit, build, package, and browser gates on Node 24.17.0 and pnpm 11.9.0.",Local host is Node 22.16.0 and could not download pnpm 11.9.0.
|
||||
P11-004,Medium,Application-shell copy linguistic approval,Inherited open,src/content/locales/fr/shell.json; src/content/locales/ar/shell.json,Before release,Content + Localization,"Complete native French and Arabic review of Phase 11 shell, state, metadata, and pending-destination copy.",Mechanical parity passes; linguistic approval remains P9-005.
|
||||
P12-001,High,Browser and accessibility execution,Environment blocked,tests/browser; tests/a11y; playwright.config.ts,Before Phase 12 acceptance,Engineering + QA,Run all 44 Chromium browser/accessibility scenarios and the approved cross-browser matrix in an environment where loopback navigation is not administrator-blocked; fix product failures.,Chromium launched locally but every loopback navigation was rejected with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response.
|
||||
P12-002,High,Visual regression baselines,Environment blocked,tests/visual; tests/fixtures/component-system/component-matrix.json,Before Phase 12 acceptance,Design + QA,Generate and review stable light/dark EN/FR/AR desktop/mobile/focus/error/long-content baselines with the pinned browser.,Visual scenarios are authored; image capture is blocked by the same Chromium loopback policy.
|
||||
P12-003,Medium,Pinned runtime verification,Open verification,package.json; .node-version; .github/workflows/ci.yml,Before Phase 12 merge,Engineering,"Pass install, static, unit, build, browser, accessibility, visual, audit, and package gates on Node 24.17.0 and pnpm 11.9.0.",Source/static/unit/build checks passed under Node 22.16.0 with exact direct packages installed through npm fallback; target runtime remains unverified.
|
||||
P12-004,Medium,Frozen installation and dependency audit,Environment blocked,pnpm-lock.yaml; package.json; docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md,Before Phase 12 merge,Engineering + Security,Complete pnpm install --frozen-lockfile and pnpm audit --audit-level low with registry access.,Registry DNS returned EAI_AGAIN. npm fallback enabled local checks but does not satisfy the frozen pnpm or audit gates.
|
||||
P12-005,Medium,Manual assistive-technology and zoom QA,Open verification,docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 12 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, and viewport manual matrix; attach evidence.","Static semantics, unit interactions, and server-rendered routes are verified; human browser and assistive-technology observations are not fabricated."
|
||||
P13-001,High,Homepage browser accessibility and visual execution,Environment blocked,tests/browser/homepage.spec.ts; tests/a11y/homepage.a11y.spec.ts; tests/visual/homepage.visual.spec.ts,Before Phase 13 acceptance,Engineering + QA,"Run the authored homepage scenarios in unblocked pinned-browser CI; fix functional, axe, reflow, focus, and visual failures; approve baselines.",Local Chromium launches but rejects every loopback navigation with net::ERR_BLOCKED_BY_ADMINISTRATOR before application response.
|
||||
P13-002,Medium,Phase 13 manual responsive and assistive-technology QA,Open verification,docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv,Before Phase 13 acceptance,Accessibility + QA,"Complete keyboard, touch, screen-reader, 200/400 percent zoom, reduced-motion, forced-colors, locale, theme, viewport, and content-expansion review; attach evidence.",Source and automated scenarios exist; human observations are not fabricated.
|
||||
P13-003,Medium,Exact Phase 13 target runtime and package verification,Open verification,package.json; .node-version; pnpm-lock.yaml; .github/workflows/ci.yml,Before Phase 13 merge,Engineering + Security,"Pass frozen pnpm install, all validation suites, audit, build, and package verification on Node 24.17.0 and pnpm 11.9.0.",Available host is Node 22.16.0; npm fallback was used only to execute local checks.
|
||||
|
@@ -0,0 +1,68 @@
|
||||
# Phase 10 Handoff to Phase 11
|
||||
|
||||
## Handoff status
|
||||
|
||||
Phase 10 repository bootstrap and architecture are complete. Phase 11 may implement approved homepage components and sections only after the CI browser job passes and must not bypass the inherited release gates.
|
||||
|
||||
## Authoritative inputs for Phase 11
|
||||
|
||||
Read in this order:
|
||||
|
||||
1. `docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md`
|
||||
2. `docs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md`
|
||||
3. `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv`
|
||||
4. `docs/quality/VALIDATION_RESULTS_v1.0.md`
|
||||
5. `contracts/phase9/09_DEVELOPER_HANDOFF_v1.0.md`
|
||||
6. `contracts/phase9/DECISION_LOG_v9.0.md`
|
||||
7. `contracts/phase9/DEFINITION_OF_DONE_v1.0.md`
|
||||
8. `src/contracts/phase9/route-manifest.json`
|
||||
9. `src/contracts/phase9/component-contracts.ts`
|
||||
10. `src/content/locales/{en,fr,ar}`
|
||||
|
||||
When runtime copies and immutable Phase 9 history differ only because of the approved project rename, use the runtime RentalDriveGo copy. For design, behavior, evidence, and release policy, the immutable Phase 9 package remains authoritative unless a later recorded decision supersedes it.
|
||||
|
||||
## Required Phase 11 entry gates
|
||||
|
||||
Before merging homepage implementation:
|
||||
|
||||
- Run the full CI workflow on Node.js 24.17.0.
|
||||
- Install official Playwright browsers and pass functional and accessibility suites.
|
||||
- Generate and review the three initial visual baselines.
|
||||
- Confirm no critical/high regression from the implementation issue register.
|
||||
- Keep `PUBLIC_RELEASE_APPROVED=false`.
|
||||
|
||||
## Implementation rules that may not be weakened
|
||||
|
||||
- Preserve server-rendered locale, `lang`, `dir`, theme, canonical, and `hreflang` behavior.
|
||||
- Keep Arabic at document-level RTL and use logical CSS.
|
||||
- Consume semantic tokens; do not add raw brand colors.
|
||||
- Keep server components as the default and justify every client boundary.
|
||||
- Do not add public claims, evidence, pricing, legal text, CRM behavior, analytics vendors, login destinations, or contact routes without resolving the corresponding issue.
|
||||
- Do not import Phase 8 prototype source as production implementation.
|
||||
- Do not disable validators to make a branch green. Fix the branch.
|
||||
|
||||
## Phase 11 suggested sequence
|
||||
|
||||
1. Pass the scaffold in clean CI and commit reviewed visual baselines.
|
||||
2. Build foundational primitives from the Phase 9 component contracts.
|
||||
3. Add header/navigation behavior without inventing unresolved destinations.
|
||||
4. Implement homepage sections in approved order using locale resources and semantic tokens.
|
||||
5. Add section-level unit, accessibility, RTL, responsive, and visual checks as each section lands.
|
||||
6. Keep unavailable evidence-driven modules suppressed behind explicit approved content gates.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
corepack enable
|
||||
corepack prepare pnpm@11.9.0 --activate
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm check
|
||||
SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false pnpm build
|
||||
pnpm test:e2e
|
||||
```
|
||||
|
||||
`pnpm check` covers static quality and unit gates. Browser tests remain separate because they require installed browser binaries and a network environment not governed by an administrator-wide URL blocklist.
|
||||
|
||||
## Exit condition for Phase 11
|
||||
|
||||
Phase 11 is not complete merely because sections render. It must preserve all Phase 10 gates, pass supported locale/theme/viewport scenarios, and leave every unresolved product or legal decision traceable rather than encoded as anonymous copy or dead links.
|
||||
@@ -0,0 +1,126 @@
|
||||
# Phase 10 Implementation Report
|
||||
|
||||
## Executive status
|
||||
|
||||
The RentalDriveGo repository foundation is implemented and buildable. It imports and validates the complete Phase 9 package, establishes server-rendered locale/direction/theme/metadata behavior, enforces a nonce-based CSP, pins the runtime and dependency graph, and includes CI, unit, browser, accessibility, visual, audit, and custom contract gates.
|
||||
|
||||
**Phase 10 engineering scaffold status: complete with environmental verification exceptions.**
|
||||
|
||||
**Public release status: blocked.** Critical and high Phase 9 product, research, legal, localization, analytics, CRM, evidence, and branding issues remain open. The repository deliberately emits `noindex` and disallows crawling until release approval is explicitly enabled.
|
||||
|
||||
## Phase 9 package audit
|
||||
|
||||
The uploaded package was extracted with path-safety checks and treated as immutable input.
|
||||
|
||||
- Supplied Phase 9 validator: passed, 38 checks over 19 targets.
|
||||
- Manifest: 61 payload entries.
|
||||
- Size and SHA-256 verification: every manifested entry matched.
|
||||
- Extracted package count: 62 files because the package manifest does not list itself.
|
||||
- Immutable copy: `contracts/phase9`.
|
||||
|
||||
No authoritative Phase 9 file was edited during the RentalDriveGo rename.
|
||||
|
||||
## Architecture delivered
|
||||
|
||||
- Next.js 16.2.9 App Router and React 19.2.7.
|
||||
- Dynamic SSR for locale pages because per-request CSP nonces are required.
|
||||
- Strict TypeScript 6.0.3.
|
||||
- CSS Modules plus exact Phase 9 semantic token CSS.
|
||||
- Server-first component boundary with client code limited to locale/theme interaction.
|
||||
- Vendor-neutral OCI standalone deployment artifact.
|
||||
- Node.js 24.17.0 and pnpm 11.9.0 pinned in repository, CI, and container.
|
||||
- Exact direct dependency versions and frozen transitive lockfile.
|
||||
|
||||
The accepted decision is recorded in `docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md`.
|
||||
|
||||
## Imported contract package
|
||||
|
||||
The repository contains:
|
||||
|
||||
- immutable complete Phase 9 package under `contracts/phase9`;
|
||||
- implementation locale catalogs for EN, FR, and AR;
|
||||
- route manifest;
|
||||
- exact design tokens and semantic CSS;
|
||||
- component TypeScript contracts;
|
||||
- analytics contract and event specification;
|
||||
- demo-form contract;
|
||||
- performance budgets;
|
||||
- visual-regression scenarios;
|
||||
- QA matrices, browser policy draft, accessibility checklist, and acceptance specifications.
|
||||
|
||||
Runtime copies are placed under `src/contracts/phase9`. The original package remains the historical authority when a runtime copy is transformed for module naming or product branding.
|
||||
|
||||
## Application shell delivered
|
||||
|
||||
- Locale routes `/en`, `/fr`, `/ar`.
|
||||
- Root negotiation from cookie, then `Accept-Language`, then English.
|
||||
- Server-rendered `lang` and document-level `dir`.
|
||||
- Server-readable theme preference with light/dark/system support.
|
||||
- Pre-paint nonce-bearing theme bootstrap.
|
||||
- CSP nonce propagated through the Next.js request lifecycle.
|
||||
- Production CSP without `unsafe-inline` or `unsafe-eval`.
|
||||
- Canonical and complete `hreflang` set, including `x-default`.
|
||||
- Release-safe robots/noindex behavior.
|
||||
- Locale switching with approved query-state and hash preservation only.
|
||||
- Minimal localized shell and skip link, without beginning full homepage section implementation.
|
||||
|
||||
## Validation and CI delivered
|
||||
|
||||
Custom CI gates detect:
|
||||
|
||||
1. Phase 9 checksum or validator failure.
|
||||
2. Locale key, route, direction, or brand parity failure.
|
||||
3. Route/canonical/`hreflang` divergence.
|
||||
4. Token drift or raw brand-color introduction.
|
||||
5. Physical left/right CSS declarations.
|
||||
6. Placeholder destinations, simulated production success, or research-only production behavior.
|
||||
|
||||
The GitHub Actions workflow runs validation, formatting, linting, strict type checking, unit coverage, package audit, production build, Playwright functional tests, accessibility scans, and visual regression. Dependabot proposes reviewed weekly dependency and action updates.
|
||||
|
||||
## Actual execution results
|
||||
|
||||
Passed locally:
|
||||
|
||||
- Phase 9 supplied package validator.
|
||||
- All Phase 9 file size and SHA-256 checks.
|
||||
- Seven repository validators, including the Phase 10 package manifest gate.
|
||||
- Prettier check.
|
||||
- ESLint with zero warnings.
|
||||
- Strict TypeScript check.
|
||||
- 9 unit tests across 3 files.
|
||||
- Unit coverage: 95.31% statements, 89.18% branches, 100% functions, 94.64% lines.
|
||||
- Production build and standalone asset preparation.
|
||||
- HTTP server-rendered shell smoke check.
|
||||
- Package audit at low severity threshold with no known vulnerabilities.
|
||||
|
||||
Environment-blocked locally:
|
||||
|
||||
- Managed Chromium has an administrator `URLBlocklist` of `*`, causing `ERR_BLOCKED_BY_ADMINISTRATOR` for loopback pages.
|
||||
- Playwright browser download fallback failed because `cdn.playwright.dev` DNS resolution returned `EAI_AGAIN`.
|
||||
- The host exposes Node.js 22.16.0, while the repository, CI, and OCI target are pinned to Node.js 24.17.0.
|
||||
|
||||
Therefore browser, accessibility, visual-baseline, and exact-target-runtime evidence must pass in CI before Phase 11 acceptance. These are recorded as open verification gates rather than falsely marked passed.
|
||||
|
||||
Detailed machine-readable and narrative results are in `docs/quality/VALIDATION_RESULTS_v1.0.*`.
|
||||
|
||||
## Corrections made during implementation
|
||||
|
||||
Initial dependency selection used ESLint 10, but the pinned React/Next lint ecosystem was not compatible. ESLint was pinned to 9.39.4 instead of forcing incompatible peers.
|
||||
|
||||
Next.js experimental typed routes generated a JSX namespace conflict with the pinned React and TypeScript types. The experiment was removed; deterministic route-manifest validation remains the route-safety authority.
|
||||
|
||||
The first standalone test command used `next start`, which conflicts with Next's standalone output mode. The build now prepares static/public assets inside the standalone bundle and starts the generated Node server directly.
|
||||
|
||||
The initial CSP style rule permitted `unsafe-inline`. It was replaced by a request nonce, and inline `colorScheme` mutation was removed in favor of CSS driven by theme data attributes.
|
||||
|
||||
A vulnerable transitive PostCSS resolution was replaced with audited PostCSS 8.5.15 through a workspace override. The final low-threshold package audit is clean.
|
||||
|
||||
## Unresolved release gates
|
||||
|
||||
P9-010 and P9-017 are closed by this phase. All other Phase 9 issues remain explicit. Phase 10 adds gates for the production canonical origin, final RentalDriveGo visual identity, browser-suite execution, and exact target-runtime verification.
|
||||
|
||||
The implementation register is `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv`.
|
||||
|
||||
## Scope boundary respected
|
||||
|
||||
No full homepage sections, CRM endpoint, analytics vendor, public pricing, legal consent, login destination, sales address, customer evidence, security marketing claim, or prototype-only behavior was implemented. Omission here is intentional risk control, not missing enthusiasm.
|
||||
@@ -0,0 +1,346 @@
|
||||
# Phase 11 Implementation Report
|
||||
|
||||
## 1. Executive summary
|
||||
|
||||
Phase 11 implements the production foundation for RentalDriveGo design tokens, themes, localization, directionality, route generation, metadata, typography, responsive layout, application shell, accessibility utilities, and global route states.
|
||||
|
||||
The implementation is integrated into the Phase 10 repository and packaged as a complete repository. Nine static repository gates pass. All 62 TypeScript and TSX source/test files pass a syntax transpilation scan.
|
||||
|
||||
**Formal acceptance remains blocked.** The local host exposes Node.js 22.16.0 instead of the pinned 24.17.0, and `corepack prepare pnpm@11.9.0 --activate` could not fetch the pnpm package. Consequently, frozen installation, Prettier, ESLint, strict TypeScript 6.0.3, Vitest, production build, audit, Playwright, axe execution, and screenshot generation were not run. These are explicit P11 release gates, not imaginary green checks.
|
||||
|
||||
## 2. Input files reviewed
|
||||
|
||||
Primary Phase 10 inputs reviewed:
|
||||
|
||||
- `docs/PHASE_10_HANDOFF_v1.0.md`
|
||||
- `docs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md`
|
||||
- `docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md`
|
||||
- `docs/DEPENDENCY_MANIFEST_v1.0.md`
|
||||
- `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv`
|
||||
- `PHASE_10_PACKAGE_MANIFEST_v1.0.json`
|
||||
- `.github/workflows/ci.yml`
|
||||
- `README.md`
|
||||
- `package.json` and `pnpm-lock.yaml`
|
||||
|
||||
Phase 9 authorities reviewed or consumed:
|
||||
|
||||
- developer handoff and decision log;
|
||||
- definition of done and open issue register;
|
||||
- route manifest and localization implementation;
|
||||
- English, French, and Arabic catalogs;
|
||||
- design tokens, semantic token CSS, and token usage rules;
|
||||
- component contracts, state matrix, responsive matrix, and RTL/theme matrix;
|
||||
- accessibility, browser, performance, Playwright, and visual-regression specifications.
|
||||
|
||||
## 3. Baseline validation results
|
||||
|
||||
The Phase 10 report records a successful static/unit/build baseline with browser-environment exceptions. In this Phase 11 environment:
|
||||
|
||||
```bash
|
||||
node --version
|
||||
# v22.16.0
|
||||
|
||||
corepack prepare pnpm@11.9.0 --activate
|
||||
# failed fetching the pnpm tarball from registry.npmjs.org
|
||||
```
|
||||
|
||||
Because the approved package manager could not be activated, Phase 10 dependency-driven commands were not rerun. The immutable Phase 9 package validator was rerun successfully and all 61 manifested payload checksums match.
|
||||
|
||||
No `.env`, secret, cache, build output, coverage output, browser report, or test-result directory is included in the repository manifest.
|
||||
|
||||
## 4. Architecture decisions applied
|
||||
|
||||
`docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md` records:
|
||||
|
||||
- additive component-token layering without modifying Phase 9;
|
||||
- cookie-canonical theme persistence with local-storage continuity;
|
||||
- nonce-bearing pre-paint resolution plus CSS-only system fallback;
|
||||
- route-ID-driven locale switching and metadata;
|
||||
- typed server catalogs and a minimal client shell-catalog boundary;
|
||||
- explicit market inputs for formatting;
|
||||
- local variable font packages with script-specific metrics;
|
||||
- server-first shell composition with interaction-only client boundaries;
|
||||
- native dialog mobile navigation;
|
||||
- noindex pending route shells instead of invented destinations;
|
||||
- production-route Playwright fixtures instead of a new Storybook dependency.
|
||||
|
||||
## 5. Token implementation
|
||||
|
||||
The traceable token flow is:
|
||||
|
||||
```text
|
||||
Phase 9 raw token JSON
|
||||
-> immutable Phase 9 semantic CSS
|
||||
-> Phase 11 component-facing token layer
|
||||
-> global styles and CSS Modules
|
||||
```
|
||||
|
||||
`src/styles/component-tokens.css` adds required surface, text, border, interactive, focus, status, overlay, disabled, selection, skeleton, shadow, container, layering, typography, and layout roles.
|
||||
|
||||
No Phase 9 token was removed, renamed, or corrected. Phase 11 additions are documented in `docs/TOKEN_IMPLEMENTATION_v1.0.md` and enforced by `scripts/validate-phase11-foundation.mjs`.
|
||||
|
||||
## 6. Theme implementation
|
||||
|
||||
Implemented preferences:
|
||||
|
||||
- `light`
|
||||
- `dark`
|
||||
- `system`
|
||||
|
||||
Behavior:
|
||||
|
||||
- server reads `hpc-theme`;
|
||||
- initial HTML exposes `data-theme-preference` and `data-theme`;
|
||||
- a nonce-bearing head bootstrap resolves storage and system preference before interaction;
|
||||
- explicit preferences ignore later operating-system changes;
|
||||
- system mode tracks operating-system changes;
|
||||
- cookie and local storage persist selection;
|
||||
- same-window controls synchronize through a custom event;
|
||||
- cross-tab changes synchronize through the storage event;
|
||||
- a CSS media fallback keeps system-dark pages readable without JavaScript;
|
||||
- no global theme transition is introduced.
|
||||
|
||||
## 7. Localization and routing implementation
|
||||
|
||||
Implemented:
|
||||
|
||||
- locale roots `/en`, `/fr`, and `/ar`;
|
||||
- route-manifest generation for home, login, privacy, terms, and accessibility;
|
||||
- semantic route resolution from localized slugs and pathnames;
|
||||
- locale switching that preserves only approved campaign parameters and valid hashes;
|
||||
- locale cookie persistence;
|
||||
- exact shell key parity across all three locales;
|
||||
- typed server catalog loading;
|
||||
- localized pending routes for unresolved approved paths;
|
||||
- no hidden English fallback.
|
||||
|
||||
Root detection remains cookie, then `Accept-Language`, then English.
|
||||
|
||||
## 8. RTL implementation
|
||||
|
||||
Arabic receives server-rendered `lang="ar"` and `dir="rtl"` before hydration. Application CSS passed the logical-property validator across 12 CSS files. The mobile drawer uses logical margins so its origin follows direction. Brand identity is not mirrored.
|
||||
|
||||
`BidiText` and identifier-preservation utilities support mixed Latin/Arabic plates, VINs, phones, reservation IDs, URLs, and similar atomic values.
|
||||
|
||||
## 9. Typography implementation
|
||||
|
||||
- Inter Variable for English and French.
|
||||
- Noto Sans Arabic Variable for Arabic.
|
||||
- Component-facing display, heading, body, label, caption, line-height, and tracking roles.
|
||||
- Arabic-specific line height and no forced Latin tracking.
|
||||
- Semantic heading hierarchy independent of visual token size.
|
||||
- Content-driven block sizing and browser zoom compatibility foundations.
|
||||
|
||||
## 10. Application-shell implementation
|
||||
|
||||
Header:
|
||||
|
||||
- provisional text brand identity under the existing P10-002 gate;
|
||||
- route-manifest home navigation;
|
||||
- locale and theme controls;
|
||||
- explicit unavailable login and demo treatments;
|
||||
- sticky responsive composition;
|
||||
- native modal mobile drawer below 1120 CSS px;
|
||||
- Escape close, focus containment, background scroll lock, and focus return.
|
||||
|
||||
Footer:
|
||||
|
||||
- localized semantic groups;
|
||||
- internal hash destinations from the home route;
|
||||
- route-manifest legal and login links that open noindex pending shells;
|
||||
- disabled contact and demo items rather than invented integrations;
|
||||
- responsive stacked/grouped layout.
|
||||
|
||||
The homepage remains a Phase 11 foundation matrix, not the complete production marketing homepage. Approved navigation hashes point to clearly marked deferred-section fixtures.
|
||||
|
||||
## 11. Accessibility implementation
|
||||
|
||||
Implemented:
|
||||
|
||||
- skip link and stable `#main-content` target;
|
||||
- visible `:focus-visible` treatment;
|
||||
- semantic header, nav, main, sections, and footer landmarks;
|
||||
- forced-colors focus support;
|
||||
- reduced-motion behavior;
|
||||
- visually hidden utility;
|
||||
- accessible icon wrapper;
|
||||
- live-region primitive;
|
||||
- bidi isolation primitive;
|
||||
- named icon-only controls;
|
||||
- native dialog mobile navigation;
|
||||
- localized loading, error, not-found, and pending states.
|
||||
|
||||
Automated axe tests are authored for all locale/theme combinations. Execution remains P11-001.
|
||||
|
||||
## 12. Metadata and SEO implementation
|
||||
|
||||
`src/lib/metadata/build-metadata.ts` generates server metadata from locale and route ID:
|
||||
|
||||
- localized title and description;
|
||||
- self-referential canonical;
|
||||
- reciprocal English, French, Arabic, and `x-default` alternates;
|
||||
- Open Graph title, description, URL, site name, locale, and alternates;
|
||||
- social summary metadata;
|
||||
- release-safe robots behavior.
|
||||
|
||||
Pending destinations are always noindex. No organization, review, rating, pricing, legal, address, phone, or contact structured data is emitted.
|
||||
|
||||
## 13. Automated test results
|
||||
|
||||
Executed:
|
||||
|
||||
```bash
|
||||
node scripts/run-validations.mjs
|
||||
```
|
||||
|
||||
Result: **9 passed repository gates**.
|
||||
|
||||
- Phase 9 immutable contract: pass, 61 checksums.
|
||||
- Runtime and direct-dependency pins: pass, Node 24.17.0, pnpm 11.9.0, and 25 exact direct versions represented in the lockfile.
|
||||
- Locale key/direction parity: pass.
|
||||
- Route/runtime/hash/query/`hreflang` parity: pass, 5 route IDs.
|
||||
- Phase 9 token integrity: pass.
|
||||
- Phase 11 foundation token/shell integrity: pass.
|
||||
- Logical CSS: pass, 12 files.
|
||||
- Prohibited content: pass.
|
||||
- Metadata foundation: pass.
|
||||
|
||||
Executed syntax scan:
|
||||
|
||||
- 62 TypeScript/TSX files transpiled without syntax errors using host TypeScript 5.8.3.
|
||||
|
||||
Not executed because dependency installation was unavailable:
|
||||
|
||||
- Prettier check;
|
||||
- ESLint;
|
||||
- strict TypeScript 6.0.3 project check;
|
||||
- Vitest and coverage;
|
||||
- production build;
|
||||
- pnpm audit;
|
||||
- Playwright functional suites;
|
||||
- axe execution;
|
||||
- visual snapshot comparison.
|
||||
|
||||
Authored tests cover formatting, route resolution, theme persistence/system behavior, initial HTML, metadata, locale switching, pending routes, mobile navigation, skip focus, no-JavaScript behavior, responsive overflow, text expansion, accessibility, and visual matrices.
|
||||
|
||||
## 14. Manual QA results
|
||||
|
||||
Manual results are recorded in `docs/quality/MANUAL_QA_RESULTS_v1.0.csv`.
|
||||
|
||||
Static inspections passed for route parity, document RTL, logical CSS, reduced-motion rules, bidi primitives, content-driven layouts, and locale expansion structure.
|
||||
|
||||
Browser, assistive-technology, zoom, back/forward, theme persistence, mobile dialog, and production-build checks remain blocked pending an executable pinned environment.
|
||||
|
||||
## 15. Visual-regression coverage
|
||||
|
||||
Defined canonical scenarios:
|
||||
|
||||
- desktop English light and dark;
|
||||
- tablet French light and dark;
|
||||
- mobile Arabic light and dark;
|
||||
- mobile Arabic dark drawer open;
|
||||
- desktop English keyboard focus.
|
||||
|
||||
Generated baselines: **0**.
|
||||
|
||||
No fake screenshots were created. The exact status is recorded in `docs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json` and P11-002.
|
||||
|
||||
## 16. Performance observations
|
||||
|
||||
- No new runtime dependency was added.
|
||||
- Server components remain the default.
|
||||
- Client boundaries are limited to route-aware navigation, selectors, theme synchronization, global localized client states, and mobile navigation.
|
||||
- Fonts remain self-hosted package assets.
|
||||
- No analytics, CRM, media player, component-workbench, CSS-in-JS, or state-management runtime was introduced.
|
||||
- Dynamic SSR remains inherited because request-specific CSP nonces are required.
|
||||
|
||||
Measured build size and runtime performance were not available because the production build could not execute.
|
||||
|
||||
## 17. Deviations from Phase 9 or Phase 10
|
||||
|
||||
Documented deviations/additions:
|
||||
|
||||
1. A Phase 11 component-facing token layer was added because Phase 9 does not expose all required status, overlay, disabled, selection, skeleton, layout, and typography roles.
|
||||
2. Phase 10’s package manifest remains a historical input. It is not used as the active integrity gate after legitimate Phase 11 source changes. Phase 11 has its own generated manifest and validator.
|
||||
3. Storybook was not added because Phase 10 did not approve a workbench dependency. Production-route Playwright matrices and `tests/fixtures/foundation-matrix.json` are the approved equivalent.
|
||||
4. Route-manifest legal and login paths render explicit pending shells because final content/destinations remain unresolved.
|
||||
|
||||
No immutable Phase 9 file was changed.
|
||||
|
||||
## 18. Open issues and release blockers
|
||||
|
||||
The complete register is `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv`.
|
||||
|
||||
Phase 11-specific blockers:
|
||||
|
||||
- P11-001: browser and accessibility execution;
|
||||
- P11-002: screenshot generation and review;
|
||||
- P11-003: exact Node 24.17.0/pnpm 11.9.0 verification;
|
||||
- P11-004: native French and Arabic shell-copy review.
|
||||
|
||||
Inherited Critical/High product, research, evidence, legal, localization, CRM, analytics, identity, and canonical-origin gates remain open. `PUBLIC_RELEASE_APPROVED` must remain false.
|
||||
|
||||
## 19. Files added, modified, and removed
|
||||
|
||||
The machine-readable list is `docs/quality/PHASE_11_FILE_CHANGES_v1.0.txt`.
|
||||
|
||||
Against the Phase 10 ZIP, the final delta is 55 added files, 24 modified files, and 0 removed files. The exact list is `docs/quality/PHASE_11_FILE_CHANGES_v1.0.txt`; the generated Phase 11 package manifest is the authoritative complete inventory of 201 hashed payload files.
|
||||
|
||||
## 20. Exact commands
|
||||
|
||||
Install:
|
||||
|
||||
```bash
|
||||
corepack enable
|
||||
corepack prepare pnpm@11.9.0 --activate
|
||||
pnpm install --frozen-lockfile
|
||||
```
|
||||
|
||||
Validate static foundations:
|
||||
|
||||
```bash
|
||||
pnpm validate
|
||||
pnpm validate:package
|
||||
```
|
||||
|
||||
Local package-manifest verification completed successfully for 201 payload files after generation.
|
||||
|
||||
Validate quality and unit behavior:
|
||||
|
||||
```bash
|
||||
pnpm format:check
|
||||
pnpm lint
|
||||
pnpm typecheck
|
||||
pnpm test:unit
|
||||
pnpm audit --audit-level low
|
||||
```
|
||||
|
||||
Build and run:
|
||||
|
||||
```bash
|
||||
SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false pnpm build
|
||||
HOSTNAME=127.0.0.1 PORT=3000 SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false pnpm start
|
||||
```
|
||||
|
||||
Browser and accessibility tests:
|
||||
|
||||
```bash
|
||||
pnpm exec playwright install --with-deps chromium firefox webkit
|
||||
pnpm test:browser
|
||||
pnpm test:a11y
|
||||
pnpm test:e2e
|
||||
```
|
||||
|
||||
Visual baselines:
|
||||
|
||||
```bash
|
||||
pnpm test:visual:update --project=chromium
|
||||
pnpm test:visual --project=chromium
|
||||
```
|
||||
|
||||
Regenerate and verify the package manifest only after all reviewed changes:
|
||||
|
||||
```bash
|
||||
pnpm manifest:generate
|
||||
pnpm validate:package
|
||||
```
|
||||
@@ -0,0 +1,193 @@
|
||||
# Phase 12 Handoff: Reusable Product and Marketing Components
|
||||
|
||||
## Handoff status
|
||||
|
||||
Phase 11 source implementation is complete for tokens, theme, localization, routing, metadata, layout primitives, application shell, accessibility foundations, and global state shells.
|
||||
|
||||
Formal Phase 11 acceptance remains blocked by P11-001, P11-002, and P11-003: the pinned Node/pnpm quality suite, browser/accessibility suite, and reviewed visual baselines must run in an unblocked environment. Do not treat a compiled placeholder as evidence that those gates closed.
|
||||
|
||||
## Read first
|
||||
|
||||
1. `docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md`
|
||||
2. `docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md`
|
||||
3. `docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md`
|
||||
4. `docs/TOKEN_IMPLEMENTATION_v1.0.md`
|
||||
5. `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv`
|
||||
6. `docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md`
|
||||
7. `contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md`
|
||||
8. `contracts/phase9/components/RTL_THEME_MATRIX_v1.0.csv`
|
||||
9. `contracts/phase9/components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv`
|
||||
10. `src/content/locales/{en,fr,ar}`
|
||||
|
||||
## Component directories and naming
|
||||
|
||||
```text
|
||||
src/components/app-shell/ persistent header, drawer, footer, controls, global states
|
||||
src/components/foundation/ bidi, icon, live-region, and status primitives
|
||||
src/components/layout/ container, section, stack, cluster, and responsive grid
|
||||
src/components/<domain>/ Phase 12 reusable product or marketing components
|
||||
```
|
||||
|
||||
Use PascalCase component files and matching `ComponentName.module.css` files. Keep one primary component per file. Do not add barrel exports by default.
|
||||
|
||||
## Token consumption rules
|
||||
|
||||
- Components consume roles from `src/styles/component-tokens.css`.
|
||||
- Do not consume raw `--color-blue-*`, `--color-orange-*`, `--color-gray-*`, or other palette variables in component CSS.
|
||||
- Do not add literal color functions or hexadecimal values outside token declarations.
|
||||
- Do not edit `src/styles/tokens.css`; it is checksum-identical to the Phase 9 authority.
|
||||
- New roles require a documented token migration and validator update.
|
||||
- Orange remains limited to conversion and approved focus emphasis.
|
||||
|
||||
## Theme rules
|
||||
|
||||
- Use semantic/component tokens only; do not branch component markup by theme.
|
||||
- Never add a global transition during theme changes.
|
||||
- Test light and dark explicitly. Test system mode with operating-system changes.
|
||||
- Do not write a second theme provider or persistence mechanism.
|
||||
- Do not weaken the nonce-based CSP bootstrap.
|
||||
|
||||
## Translation-key conventions
|
||||
|
||||
- All visible production copy belongs in locale resources.
|
||||
- Use semantic namespaces matching the component contract, such as `workflow.*` or `modules.*`.
|
||||
- English, French, and Arabic must retain exact key and scalar-type parity.
|
||||
- Do not add hidden English fallbacks.
|
||||
- Arabic is formal Modern Standard Arabic and must receive native review under P9-005/P11-004.
|
||||
- Components receive typed content props or the established typed message boundary; they do not fetch unrelated translations internally.
|
||||
|
||||
## Route generation utilities
|
||||
|
||||
Use functions from `src/lib/localization/config.ts`:
|
||||
|
||||
- `localizedPath(routeId, locale)`
|
||||
- `localeSwitchUrl(currentUrl, targetLocale, routeId)`
|
||||
- `routeIdFromPathname(pathname)`
|
||||
- `routeIdFromSlug(locale, slug)`
|
||||
- `hreflangMap(origin, routeId)`
|
||||
|
||||
Do not concatenate locale routes manually. Do not preserve unknown query parameters or unapproved hashes.
|
||||
|
||||
## RTL rules
|
||||
|
||||
- Arabic uses document-level `dir="rtl"` before hydration.
|
||||
- Use logical CSS properties only.
|
||||
- Use one DOM tree for all directions.
|
||||
- Directional arrows and connectors may mirror when their meaning requires it.
|
||||
- Brand marks, vehicle imagery, screenshots, checks, globes, charts, and media controls do not mirror automatically.
|
||||
- Use `BidiText` for plates, VINs, reservation IDs, phones, URLs, email addresses, model codes, and mixed-direction values.
|
||||
|
||||
## Typography utilities
|
||||
|
||||
- Latin: Inter Variable stack.
|
||||
- Arabic: Noto Sans Arabic stack with independent line height.
|
||||
- Use component-facing type sizes and line-height tokens.
|
||||
- Keep heading rank semantic; do not choose an `h` element for its visual size.
|
||||
- Never use fixed text heights or image-based text.
|
||||
|
||||
## Layout primitives
|
||||
|
||||
Use `Container`, `Section`, `Stack`, `Cluster`, and `ResponsiveGrid` from `src/components/layout/LayoutPrimitives.tsx` before inventing local layout abstractions.
|
||||
|
||||
Approved responsive gates remain:
|
||||
|
||||
- compact: 320–767 CSS px
|
||||
- medium: 768–1119 CSS px
|
||||
- wide: 1120 CSS px and above
|
||||
|
||||
Layouts remain content-driven and must pass English, long French, and Arabic independently.
|
||||
|
||||
## Accessibility primitives and patterns
|
||||
|
||||
- `BidiText`
|
||||
- `AccessibleIcon`
|
||||
- `LiveRegion`
|
||||
- `StatusBadge`
|
||||
- global `.visually-hidden`
|
||||
- global skip navigation and `#main-content`
|
||||
- native `<dialog>` pattern demonstrated by `MobileNavigation`
|
||||
- global `:focus-visible`, forced-colors, and reduced-motion foundations
|
||||
|
||||
Icon-only controls require an accessible name. Decorative icons are hidden. Do not remove outlines or disable zoom.
|
||||
|
||||
## Component API conventions
|
||||
|
||||
- Props describe meaning, not visual implementation.
|
||||
- Keep server components as the default.
|
||||
- Add `'use client'` only for interaction, browser APIs, or client navigation state.
|
||||
- Content models must tolerate expansion and missing evidence.
|
||||
- Unsupported evidence suppresses a component or uses an explicitly approved neutral state.
|
||||
- Do not invent destinations, claims, prices, metrics, logos, legal copy, or integrations.
|
||||
|
||||
## Story and test pattern
|
||||
|
||||
Phase 10 did not approve Storybook. Use the production shell and the equivalent fixture matrix in `tests/fixtures/foundation-matrix.json`.
|
||||
|
||||
For each component add:
|
||||
|
||||
1. unit tests for pure behavior and formatting;
|
||||
2. browser keyboard and interaction tests;
|
||||
3. axe coverage on representative rendered states;
|
||||
4. responsive overflow checks at approved widths;
|
||||
5. English, French, and Arabic coverage;
|
||||
6. light and dark coverage;
|
||||
7. RTL behavior checks;
|
||||
8. canonical Chromium snapshots after review.
|
||||
|
||||
## Open issues affecting Phase 12
|
||||
|
||||
At minimum, review P9-001 through P9-016, P10-001 through P10-004, and P11-001 through P11-004 in `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv`.
|
||||
|
||||
Particularly relevant component gates:
|
||||
|
||||
- no demo form until CRM and legal consent are approved;
|
||||
- no analytics adapter until vendor and consent rules are approved;
|
||||
- no preview, customer evidence, security claims, public pricing, login URL, or sales contact until each owner closes its issue;
|
||||
- no final public header/footer identity until RentalDriveGo logo assets are approved.
|
||||
|
||||
## Files requiring an architecture decision before modification
|
||||
|
||||
- `contracts/phase9/**`
|
||||
- `src/styles/tokens.css`
|
||||
- `src/contracts/phase9/**`
|
||||
- `src/lib/security/csp.ts`
|
||||
- `src/lib/theme/bootstrap-script.ts`
|
||||
- `src/lib/theme/config.ts`
|
||||
- `src/lib/localization/config.ts`
|
||||
- `src/lib/metadata/build-metadata.ts`
|
||||
- `src/proxy.ts`
|
||||
- `next.config.ts`
|
||||
- `package.json` dependency graph
|
||||
- `playwright.config.ts` browser policy
|
||||
|
||||
## Commands before and after each component change
|
||||
|
||||
Before:
|
||||
|
||||
```bash
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm validate
|
||||
pnpm typecheck
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```bash
|
||||
pnpm format:check
|
||||
pnpm lint
|
||||
pnpm typecheck
|
||||
pnpm test:unit
|
||||
SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false pnpm build
|
||||
pnpm test:e2e
|
||||
```
|
||||
|
||||
Before packaging:
|
||||
|
||||
```bash
|
||||
pnpm manifest:generate
|
||||
pnpm validate:package
|
||||
```
|
||||
|
||||
## Phase 12 entry condition
|
||||
|
||||
Do not begin merge acceptance until the Phase 11 browser suite and visual baselines run successfully in the pinned environment. Development may proceed behind the explicit gates, but release certainty may not be manufactured from optimism and a green syntax scan.
|
||||
@@ -0,0 +1,177 @@
|
||||
# Phase 12 Implementation Report
|
||||
|
||||
## 1. Executive summary
|
||||
|
||||
Phase 12 implements a reusable, typed, accessible, localization-ready, theme-aware, RTL-native component system on the Phase 11 RentalDriveGo repository. It adds 52 implemented inventory entries across foundation, actions, forms, controls, overlays, feedback, surfaces, typography, navigation, media, product previews, workflows, comparisons, evidence, CTA, and section patterns. Seven entries remain blocked by product decisions and one optional toast component is deliberately excluded.
|
||||
|
||||
The repository passes static validation, formatting, linting, strict TypeScript validation, 22 unit tests, coverage thresholds, and the production build under the available Node 22.16.0 host. Six standalone server routes return HTTP 200 with correct `lang` and `dir` values. Formal Phase 12 acceptance remains blocked because Node 24.17.0 was unavailable, frozen pnpm installation and audit were prevented by registry DNS failures, and Chromium was denied loopback navigation by administrator policy. Those conditions are recorded, not converted into fictional quality evidence.
|
||||
|
||||
## 2. Authoritative inputs reviewed
|
||||
|
||||
- Phase 11 repository and complete handoff package.
|
||||
- `docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md`.
|
||||
- `docs/PHASE_12_HANDOFF_v1.0.md`.
|
||||
- Phase 11 architecture, token, localization, RTL, metadata, CI, test, visual, issue, and package records.
|
||||
- Immutable Phase 9 implementation contracts and 61-file checksum package.
|
||||
- The Phase 12 implementation specification supplied with this task.
|
||||
|
||||
## 3. Baseline repository validation
|
||||
|
||||
The Phase 11 source and static contract were inspected before implementation. The host exposed Node 22.16.0 instead of the pinned 24.17.0. The exact pnpm 11.9.0 CLI was installed, but `pnpm install --frozen-lockfile` could not complete because registry DNS repeatedly returned `EAI_AGAIN`. An npm fallback installed the exact direct dependency versions without changing `package.json` or `pnpm-lock.yaml`, enabling real local compiler, test, and build execution.
|
||||
|
||||
## 4. Component inventory summary
|
||||
|
||||
- Total entries: 60.
|
||||
- Implemented: 52.
|
||||
- Blocked: 7.
|
||||
- Excluded: 1 (`Toast`).
|
||||
- Interactive entries: 19.
|
||||
- Client-runtime entries: 9.
|
||||
- Localization-required entries: 57.
|
||||
|
||||
The machine-readable authority is `docs/phase12/COMPONENT_INVENTORY_v1.0.json`.
|
||||
|
||||
## 5. Architecture and API decisions
|
||||
|
||||
ADR-0003 and `DECISION_LOG_v12.0.md` record semantic CSS Modules, native platform primitives, server-first rendering, constrained intent-based APIs, a guarded component-lab route, an internal reviewed SVG icon map, no dependency additions, and explicit suppression of unresolved production content.
|
||||
|
||||
## 6. Foundational utilities
|
||||
|
||||
Implemented visually hidden content, accessible IDs, hydration-safe client state, media-query and reduced-motion observation, Escape handling, outside-click handling, scroll locking, bidi isolation, ref forwarding, and a reusable internal class-name helper. Focus behavior is kept close to the consuming control rather than buried in a universal abstraction with opinions about everything.
|
||||
|
||||
## 7. Icon implementation
|
||||
|
||||
`Icon` exposes approved names, semantic sizes, decorative/meaningful behavior, accessible labels, and explicit fixed-versus-mirrored direction behavior. Icons use semantic current color and do not automatically mirror brands, media controls, or vehicle/media imagery.
|
||||
|
||||
## 8. Button and link implementation
|
||||
|
||||
Buttons support primary, conversion, secondary, tertiary, ghost, destructive, link-style, icon-only, loading, disabled, icon placement, and responsive full-width treatment. Links support inline, navigation, standalone, external, skip, utility, disabled unresolved destinations, and direction-aware icons. Native semantics are preserved.
|
||||
|
||||
## 9. Form-control implementation
|
||||
|
||||
Implemented field wrappers, labels, required indicators, support/error text, text/email/telephone/URL inputs, textarea, native select, checkbox, radio, switch, fieldset/legend composition, form error summary, and count support. No transmission or final demo-form business logic is present.
|
||||
|
||||
## 10. Selection and overlay implementation
|
||||
|
||||
Implemented tabs, segmented controls, pagination, accordion/disclosure, dropdown menu, tooltip, and native-dialog foundations. Stateful controls expose selection programmatically. Tabs use RTL-aware horizontal keys without changing universal activation expectations. Dialogs define initial focus, constrained focus, Escape dismissal, scroll lock, inert background behavior, and focus return.
|
||||
|
||||
## 11. Feedback and status implementation
|
||||
|
||||
Implemented alert, inline alert, status badge, tag treatment, progress, spinner, skeleton, empty/error/success/information/warning state patterns, and live-region foundations. Toast is excluded because no approved critical use case justifies ephemeral information.
|
||||
|
||||
## 12. Surface and content implementation
|
||||
|
||||
Implemented card, interactive card, feature card, metric shell, evidence shell, media card foundations, comparison surfaces, panels, callouts, content containers, and semantic typography primitives. Fixed content heights and arbitrary colors are prohibited.
|
||||
|
||||
## 13. Navigation implementation
|
||||
|
||||
Implemented breadcrumbs, section/anchor navigation, footer link groups, current-page treatment, primary/mobile item foundations, and localized route-aware link behavior. Long French and Arabic labels wrap instead of losing critical meaning.
|
||||
|
||||
## 14. Media implementation
|
||||
|
||||
Implemented responsive image/media frames, aspect ratios, product screenshot shells, video-poster shells, decorative/meaningful image semantics, captions, and placeholder labeling. No unapproved customer photography, final product capture, or copyrighted asset is included.
|
||||
|
||||
## 15. Product-preview implementation
|
||||
|
||||
Implemented controlled marketing previews for reservation, vehicle/fleet state, workflow, return/maintenance alerts, dashboard stats, booking/calendar-like summaries, and responsive operations tables through composable preview shells and deterministic fictional fixtures. These are not functioning back-office screens and do not imply live data.
|
||||
|
||||
## 16. Workflow and comparison implementation
|
||||
|
||||
Workflow steps, connectors, timelines, numbered/icon sequences, stacked/horizontal presentation, fragmented-versus-connected comparisons, before/after, and capability pairing are implemented. Process chronology remains meaningful in Arabic; decorative connectors do not carry essential information.
|
||||
|
||||
## 17. Evidence and CTA implementation
|
||||
|
||||
Evidence models accept `approved`, `pending-review`, `research-only`, and `prohibited` status. Production rendering suppresses unapproved evidence. CTA patterns support primary, dual-action, inline, card, section, final, and contact-sales shells while preserving disabled unresolved destinations.
|
||||
|
||||
## 18. Section-pattern implementation
|
||||
|
||||
Implemented section headers, split content, media-and-copy, feature grid, metric/workflow/comparison/testimonial/CTA/FAQ shells, and alternating feature composition. Section order is not hard-coded and the complete homepage is intentionally not assembled.
|
||||
|
||||
## 19. Localization validation
|
||||
|
||||
Locale parity validation passes. Component content is supplied through typed props, locale catalogs, or guarded development fixtures. EN, FR, AR, long-content, formal Arabic, and mixed-direction identifiers are represented. Central formatting utilities remain the source of truth.
|
||||
|
||||
## 20. RTL validation
|
||||
|
||||
Arabic server HTML returns `dir="rtl"`. All component CSS passes the logical-property validator. Direction-sensitive icons opt into mirroring. Media, brands, universal controls, identifiers, and process meaning are handled deliberately rather than with blanket transforms.
|
||||
|
||||
## 21. Theme validation
|
||||
|
||||
Components consume semantic Phase 11 tokens and inherit light, dark, and system behavior. No raw brand-color API or second theming layer was introduced.
|
||||
|
||||
## 22. Responsive validation
|
||||
|
||||
CSS is content-driven across wide desktop, desktop, tablet, mobile, and narrow mobile targets. Automated browser scenarios cover 320, 390, 768, 1024, and 1440 CSS-pixel widths plus a 200-percent zoom equivalent, but execution remains environment-blocked. Source and standalone HTML checks pass; manual 200/400-percent zoom remains P12-005.
|
||||
|
||||
## 23. Accessibility validation
|
||||
|
||||
Components define names, roles, values, states, keyboard behavior, focus visibility, error relationships, live-region behavior, reduced-motion behavior, and touch-target foundations. Unit interaction tests pass. Automated axe and manual screen-reader runs are authored/recorded but blocked by the browser environment.
|
||||
|
||||
## 24. Test results
|
||||
|
||||
- Repository/static validation: pass, 10 gates.
|
||||
- Formatting: pass.
|
||||
- ESLint: pass with zero warnings.
|
||||
- Strict TypeScript: pass.
|
||||
- Unit tests: 22 passed, 0 failed, 0 skipped across 8 files.
|
||||
- Coverage: 92.40% statements, 86.04% branches, 95.45% functions, 92.64% lines.
|
||||
- Production build with an explicit local `SITE_ORIGIN`: pass. A build without `SITE_ORIGIN` fails closed as designed.
|
||||
- Standalone HTTP matrix: 6 of 6 routes pass.
|
||||
- Browser/accessibility: 44 scenarios discovered; execution blocked before application response by `ERR_BLOCKED_BY_ADMINISTRATOR`.
|
||||
|
||||
## 25. Visual-regression results
|
||||
|
||||
Representative light/dark, EN/FR/AR, desktop/mobile, focus, error, long-content, and RTL scenarios are authored. No PNG baseline is claimed. Generation and design approval remain P12-002.
|
||||
|
||||
## 26. Manual QA results
|
||||
|
||||
`docs/quality/PHASE_12_MANUAL_QA_RESULTS_v1.0.csv` records source/unit/server checks and explicit blocks for keyboard-only browser flow, touch, screen readers, zoom, and forced colors. Static inspection is not mislabeled as human assistive-technology testing.
|
||||
|
||||
## 27. Performance and bundle impact
|
||||
|
||||
No dependency was added. Only nine inventory entries require client runtime. Source grew from 62 files/148,035 bytes to 135 files/251,655 bytes. The built standalone output is 35 MiB, static output 1.5 MiB, and server output 9.7 MiB. See `docs/phase12/BUNDLE_IMPACT_REPORT_v1.0.md`.
|
||||
|
||||
## 28. Dependency changes
|
||||
|
||||
None. Exact direct versions and the pnpm lockfile remain unchanged. See `docs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md`.
|
||||
|
||||
## 29. Deviations from approved specifications
|
||||
|
||||
- Storybook was not added; the Phase 11 approved guarded production-route fixture strategy remains in use.
|
||||
- Toast is excluded because it is optional and no approved retained-information use case exists.
|
||||
- Final demo form, pricing, testimonials, customer logos, final product media, login URL, and sales destination remain blocked rather than invented.
|
||||
- Browser and visual acceptance evidence could not be generated under the host policy.
|
||||
|
||||
## 30. Open issues and release blockers
|
||||
|
||||
The cumulative register is `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv`. New Phase 12 gates are P12-001 through P12-005. Inherited content, evidence, integration, legal, market, brand, and destination issues remain open.
|
||||
|
||||
## 31. Files added, changed, and removed
|
||||
|
||||
Added component families under `src/components/{actions,controls,feedback,forms,marketing,media,navigation,overlays,surfaces,typography}`, expanded foundations, guarded fixture content and route, tests, validators, ADR, inventories, matrices, reports, and handoff records. Existing shell and localization files were adjusted only to expose reusable component integration and fixture support. No approved Phase 9 contract file was modified. No production source file was removed.
|
||||
|
||||
## 32. Commands required to install, validate, test, build, and run
|
||||
|
||||
```bash
|
||||
corepack enable
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm validate
|
||||
pnpm format:check
|
||||
pnpm lint
|
||||
pnpm typecheck
|
||||
pnpm test:unit
|
||||
pnpm test:browser
|
||||
pnpm test:a11y
|
||||
pnpm test:visual
|
||||
SITE_ORIGIN=https://approved.example pnpm build
|
||||
pnpm audit
|
||||
COMPONENT_FIXTURES_ENABLED=true SITE_ORIGIN=http://127.0.0.1:3000 pnpm start
|
||||
pnpm manifest:generate
|
||||
pnpm validate:package
|
||||
```
|
||||
|
||||
Executed results and evidence paths are in `docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.{md,json}`.
|
||||
|
||||
## 33. Phase 13 readiness assessment
|
||||
|
||||
Phase 13 development may assemble the homepage from the implemented components without redesigning the core system. Merge/release acceptance should not be declared until P12-001 through P12-005 are closed. Phase 13 must preserve the component APIs, semantic tokens, localization and route utilities, evidence-status policy, destination gates, fixture guard, and immutable Phase 9 contracts.
|
||||
@@ -0,0 +1,212 @@
|
||||
# Phase 13 Handoff: Homepage Assembly
|
||||
|
||||
## Handoff status
|
||||
|
||||
The Phase 12 component source is implemented and usable for Phase 13 development. Static validation, formatting, lint, strict type checking, unit tests, coverage, production build, and standalone HTTP locale checks pass in the available environment. Formal Phase 12 acceptance remains gated by P12-001 through P12-005.
|
||||
|
||||
## Authoritative inputs
|
||||
|
||||
Read first:
|
||||
|
||||
1. `docs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md`
|
||||
2. `docs/phase12/COMPONENT_INVENTORY_v1.0.json`
|
||||
3. `docs/phase12/COMPONENT_CATALOG_v1.0.md`
|
||||
4. `docs/phase12/COMPONENT_SPECIFICATION_TRACEABILITY_v1.0.csv`
|
||||
5. `docs/phase12/ACCESSIBILITY_BEHAVIOR_MATRIX_v1.0.csv`
|
||||
6. `docs/phase12/RTL_BEHAVIOR_MATRIX_UPDATE_v1.0.csv`
|
||||
7. `docs/phase12/RESPONSIVE_VALIDATION_MATRIX_v1.0.csv`
|
||||
8. `docs/DECISION_LOG_v12.0.md`
|
||||
9. `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv`
|
||||
10. `PHASE_12_PACKAGE_MANIFEST_v1.0.json`
|
||||
|
||||
Earlier Phase 7 homepage composition, Phase 8 findings, Phase 9 contracts, and Phase 11 token/localization/shell foundations remain authoritative where Phase 12 does not supersede implementation detail.
|
||||
|
||||
## Approved component inventory and import paths
|
||||
|
||||
The exact import path, variants, accessibility behavior, RTL behavior, theme behavior, responsive behavior, prohibited usage, tests, limitations, and expected homepage consumers for every public component are documented in `docs/phase12/COMPONENT_CATALOG_v1.0.md` and the machine-readable inventory.
|
||||
|
||||
Primary families:
|
||||
|
||||
```text
|
||||
@/components/actions/*
|
||||
@/components/controls/*
|
||||
@/components/feedback/*
|
||||
@/components/forms/*
|
||||
@/components/foundation/*
|
||||
@/components/marketing/*
|
||||
@/components/media/*
|
||||
@/components/navigation/*
|
||||
@/components/overlays/*
|
||||
@/components/surfaces/*
|
||||
@/components/typography/*
|
||||
```
|
||||
|
||||
Do not duplicate a component because a page section wants a slightly different margin. Compose it or propose an explicit semantic variant.
|
||||
|
||||
## Variant restrictions
|
||||
|
||||
- Use semantic intents such as `conversion`, `secondary`, `available`, or `warning`.
|
||||
- Do not expose arbitrary raw colors, shadows, radii, spacing, or classes as product APIs.
|
||||
- Use `Button` for actions and `ActionLink` for navigation.
|
||||
- Icon-only controls require accessible labels.
|
||||
- Interactive cards may not contain independent nested interactive controls.
|
||||
- Heading appearance is independent of semantic heading level.
|
||||
- Evidence marked `research-only` or `prohibited` must never render as production proof.
|
||||
|
||||
## Composition guidance
|
||||
|
||||
Use explicit section patterns rather than one universal section with a landfill of Boolean props. Keep route composition responsible for copy, ordering, and content models. Components remain content-independent. The guarded component lab at `/{locale}/component-lab` shows representative composition when `COMPONENT_FIXTURES_ENABLED=true`.
|
||||
|
||||
## Section-pattern inventory
|
||||
|
||||
Approved patterns include `SectionHeader`, split content, media-and-copy, feature grid, workflow section, comparison section, metric/evidence strip, testimonial shell, FAQ shell, CTA section, and alternating feature section. Sticky media and bento layouts require Phase 7 approval before use.
|
||||
|
||||
## Homepage section-to-component mapping
|
||||
|
||||
| Homepage section | Primary components |
|
||||
| --------------------------- | ------------------------------------------------------------------------ |
|
||||
| Header verification | Existing `SiteHeader`, navigation items, locale/theme controls |
|
||||
| Hero | `SectionHeader`, `CTAGroup`, `MediaFrame`, `ProductPreview` |
|
||||
| Trust proof shell | `EvidenceShell`, `Metric`, logo/quote shells with governed status |
|
||||
| Fragmented versus connected | `Comparison`, `ComparisonCard`, `Callout` |
|
||||
| Rental workflow | `Workflow`, `WorkflowStep`, `SectionHeader` |
|
||||
| Feature/capability sections | `FeatureGrid`, `FeatureCard`, media-and-copy pattern |
|
||||
| Product UI previews | `ProductPreview`, responsive table/media shells, `BidiText` |
|
||||
| Operational benefits | `Metric`, `Callout`, `FeatureCard` without unsupported quantified claims |
|
||||
| Evidence/testimonial shells | `EvidenceShell`, quote shell, source note; approved content only |
|
||||
| FAQ | FAQ/accordion section shell |
|
||||
| Final CTA | CTA section, primary conversion action, disabled unresolved alternatives |
|
||||
| Footer verification | Existing `SiteFooter`, footer link groups |
|
||||
|
||||
## Translation and content locations
|
||||
|
||||
- Runtime locale catalogs: `src/content/locales/{en,fr,ar}`.
|
||||
- Guarded development fixtures: `src/content/development/component-lab.ts`.
|
||||
- Homepage copy must be added as complete semantic messages, never concatenated fragments.
|
||||
- Use existing format utilities for dates, numbers, currency, identifiers, and bidi isolation.
|
||||
- Native French and Arabic review remains required under P9-005/P11-004.
|
||||
|
||||
## Typed homepage content models
|
||||
|
||||
Phase 13 should define route-level content objects that reference component semantics rather than presentation accidents. Evidence must use the Phase 12 `EvidenceStatus` model. Actions must distinguish navigational links from button actions and unresolved destinations.
|
||||
|
||||
## Route-generation utilities
|
||||
|
||||
Use the existing localization route manifest and route helpers. Do not hard-code locale prefixes or use `href="#"`. Preserve only approved campaign parameters during locale changes. Unknown login, demo, sales, tour, and contact destinations remain disabled or issue-linked.
|
||||
|
||||
## Theme rules
|
||||
|
||||
Consume semantic tokens only. All sections must pass light, dark, and system. Do not add page-local raw brand colors or global transitions. Conversion orange remains restricted to the dominant approved action.
|
||||
|
||||
## RTL rules
|
||||
|
||||
- Arabic uses true document-level RTL.
|
||||
- Use logical properties.
|
||||
- Mirror only semantically directional icons.
|
||||
- Do not mirror brand marks, vehicle/product media, or universal media controls.
|
||||
- Preserve process chronology and conceptual comparison meaning.
|
||||
- Isolate plates, VINs, reservation IDs, phone numbers, email addresses, URLs, and currency values.
|
||||
|
||||
## Responsive rules
|
||||
|
||||
Validate 1440, 1024, 768, 390, and 320 CSS-pixel widths, reduced viewport height, landscape mobile where relevant, 200-percent zoom, required 400-percent reflow, long French/Arabic text, and RTL at each principal width. No horizontal page overflow is permitted. Component-level overflow must be explicit and accessible.
|
||||
|
||||
## Accessibility rules
|
||||
|
||||
Preserve heading hierarchy, landmarks, focus order, visible focus, touch targets, error descriptions, live-region restraint, reduced motion, forced-colors fallbacks, and logical reading order. Complete the P12 browser/axe/manual gates before acceptance. Automated tests do not replace keyboard and screen-reader review, a fact software teams rediscover with impressive regularity.
|
||||
|
||||
## Image and media rules
|
||||
|
||||
Use approved responsive image behavior with explicit intrinsic dimensions and alt semantics. Do not mirror media automatically. Final product screenshots, customer photography, logos, video, and poster assets remain blocked until approved. Development placeholders must remain unmistakably non-production.
|
||||
|
||||
## Evidence-status handling
|
||||
|
||||
Only approved evidence may render as production proof. Pending review may appear only in governed preview contexts. Research-only and prohibited evidence are suppressed from production rendering. Never invent metrics, quotes, customer names, logos, or quantified improvements to make a section feel complete.
|
||||
|
||||
## CTA destination handling
|
||||
|
||||
Use localized route and destination contracts. A missing destination renders disabled or development-marked behavior, not an empty link or guessed URL. Demo submission, CRM, analytics, consent, login, sales, and product-tour integrations remain outside Phase 13 unless separately approved.
|
||||
|
||||
## Known blockers
|
||||
|
||||
P12-001 through P12-005 plus inherited P9/P10/P11 content, evidence, legal, integration, branding, market, and destination issues. See `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv`.
|
||||
|
||||
## Files Phase 13 may modify
|
||||
|
||||
- Add homepage composition under `src/app/[locale]`.
|
||||
- Add localized homepage catalogs under `src/content/locales/{en,fr,ar}`.
|
||||
- Add typed homepage content models under `src/content` or the approved route-content location.
|
||||
- Add narrowly scoped component variants only when the existing API cannot express an approved design.
|
||||
- Add homepage browser/a11y/visual tests and deterministic fixtures.
|
||||
- Update Phase 13 reports, issue records, decision records, and package manifest.
|
||||
|
||||
## Files Phase 13 must not modify without an architecture decision
|
||||
|
||||
- `contracts/phase9/**`.
|
||||
- Phase 11 semantic token foundations.
|
||||
- Locale and route core utilities.
|
||||
- Theme persistence/bootstrap behavior.
|
||||
- CSP/security foundations.
|
||||
- Existing component semantics or public APIs in breaking ways.
|
||||
- Evidence suppression and unresolved-destination controls.
|
||||
- Package manager, runtime pins, styling method, icon foundation, or testing stack.
|
||||
|
||||
## Required validation commands
|
||||
|
||||
```bash
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm validate
|
||||
pnpm format:check
|
||||
pnpm lint
|
||||
pnpm typecheck
|
||||
pnpm test:unit
|
||||
pnpm test:browser
|
||||
pnpm test:a11y
|
||||
pnpm test:visual
|
||||
SITE_ORIGIN=https://approved.example pnpm build
|
||||
pnpm audit
|
||||
pnpm manifest:generate
|
||||
pnpm validate:package
|
||||
```
|
||||
|
||||
## Screenshot and visual-regression matrix
|
||||
|
||||
At minimum capture the full homepage for:
|
||||
|
||||
- EN light/dark desktop and mobile.
|
||||
- FR light/dark desktop and mobile with long content.
|
||||
- AR light/dark desktop and mobile with true RTL and mixed identifiers.
|
||||
- Focus-visible navigation and primary CTA.
|
||||
- Mobile drawer open.
|
||||
- Evidence pending/suppressed development state.
|
||||
- Error and unavailable destination states.
|
||||
- 320 CSS-pixel and approved tablet widths.
|
||||
|
||||
Stabilize dates, identifiers, animations, fonts, and fixtures before baseline generation.
|
||||
|
||||
## Recommended homepage implementation order
|
||||
|
||||
1. Header integration verification.
|
||||
2. Hero.
|
||||
3. Trust-proof shell.
|
||||
4. Fragmented-versus-connected comparison.
|
||||
5. End-to-end rental workflow.
|
||||
6. Feature or capability sections.
|
||||
7. Product UI previews.
|
||||
8. Operational benefits.
|
||||
9. Evidence or testimonial shells.
|
||||
10. FAQ.
|
||||
11. Final CTA.
|
||||
12. Footer integration verification.
|
||||
|
||||
## Phase 13 definition of done
|
||||
|
||||
- The approved homepage sequence is assembled from Phase 12 components without duplicate component families.
|
||||
- EN, FR, and AR content is externalized and reviewed.
|
||||
- Arabic document RTL and mixed-direction identifiers are correct.
|
||||
- Light, dark, and system themes pass.
|
||||
- All approved responsive widths, zoom/reflow, reduced motion, and forced-colors checks pass.
|
||||
- Browser, axe, visual, keyboard, touch, and screen-reader evidence is recorded.
|
||||
- Unsupported claims, evidence, logos, testimonials, pricing, URLs, CRM, analytics, consent, and media remain blocked or suppressed.
|
||||
- The production build and package manifest pass on Node 24.17.0 and pnpm 11.9.0.
|
||||
- Open Critical/High issues are visible and release gates are not waived by silence.
|
||||
@@ -0,0 +1,106 @@
|
||||
# Phase 13 Implementation Report
|
||||
|
||||
## 1. Executive summary
|
||||
|
||||
Phase 13 replaces the Phase 11 foundation placeholder at `/{locale}` with the complete RentalDriveGo marketing homepage assembled from the Phase 12 component system. The route now renders the approved narrative in English, French, and Arabic: hero, operational coverage, fragmented-versus-connected comparison, reservation-to-return workflow, operating roles, product modules, measurement framework, integrations, security evaluation, pricing preview, FAQ, and final CTA.
|
||||
|
||||
The implementation preserves document-level Arabic RTL, light/dark/system themes, semantic tokens, logical CSS, route helpers, evidence controls, and unavailable-destination behavior. It does not invent customer proof, quantified outcomes, certifications, public prices, partner names, product captures, CRM behavior, analytics, legal consent, login, tour, sales, or demo destinations.
|
||||
|
||||
Static validation, formatting, lint, strict type checking, 27 unit tests, coverage thresholds, production build, standalone preparation, and direct HTTP locale checks pass in the available environment. Formal acceptance remains blocked by browser policy, manual accessibility review, native linguistic approval, exact Node 24.17.0 execution, frozen pnpm completion, audit completion, and inherited product approvals.
|
||||
|
||||
## 2. Authoritative inputs
|
||||
|
||||
- `docs/PHASE_13_HANDOFF_v1.0.md`.
|
||||
- `docs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md`.
|
||||
- Phase 12 component inventory, catalog, accessibility, RTL, responsive, traceability, and issue records.
|
||||
- Existing EN, FR, and AR homepage catalogs.
|
||||
- Immutable Phase 9 contracts and Phase 11 token, theme, localization, route, metadata, security, and shell foundations.
|
||||
|
||||
## 3. Homepage composition
|
||||
|
||||
The route sequence is documented in `docs/phase13/HOMEPAGE_SECTION_MATRIX_v1.0.csv`. Header and footer hashes now resolve to real sections for `product`, `workflow`, `modules`, `pricing`, and `faq`.
|
||||
|
||||
The implementation uses existing `ActionLink`, `Accordion`, `CTA`, `Comparison`, `FeatureCard`, `FeatureGrid`, `ProductPreview`, `SectionHeader`, `Workflow`, `Callout`, `Card`, typography, icon, container, section, and stack primitives. No duplicate public component family was introduced.
|
||||
|
||||
## 4. Typed content model
|
||||
|
||||
`src/content/homepage-model.ts` creates one typed `HomepageContent` object per locale. It converts localized pair and triple arrays into stable IDs and semantic records, fails closed on malformed content, supplies approved icon semantics, isolates product-preview identifiers, and requires unavailable reasons for unresolved actions.
|
||||
|
||||
The route owns order and composition. Components remain locale-independent and content-independent. Details are in `docs/phase13/HOMEPAGE_CONTENT_MODEL_v1.0.md`.
|
||||
|
||||
## 5. Hero and product preview
|
||||
|
||||
The hero uses the approved conversion hierarchy while both actions remain disabled because destinations are unresolved. The product view is a deterministic illustrative `ProductPreview` built from fictional localized fixture content. The caption explicitly states that final screens require approved product data and captures.
|
||||
|
||||
`ProductPreview` received one backward-compatible `headingLevel` prop. The default remains level 3; the hero uses level 2 to avoid a semantic jump from the page heading to a level-3 preview heading. The change is recorded in `docs/phase13/COMPONENT_VARIANT_UPDATE_v1.0.md`.
|
||||
|
||||
## 6. Evidence, claims, pricing, and destinations
|
||||
|
||||
- Operational coverage and capability descriptions are presented without customer proof.
|
||||
- The results section publishes KPI definitions and measurement methodology, not invented values.
|
||||
- Named integration partners are suppressed.
|
||||
- Security certifications and service-level claims are suppressed.
|
||||
- Public prices, discounts, packages, and limits are suppressed.
|
||||
- Demo, tour, pricing, and sales actions are non-navigable and include localized unavailable reasons.
|
||||
- No `href="#"`, guessed URL, root fallback navigation, CRM request, fake success state, or analytics adapter was added.
|
||||
|
||||
## 7. Localization and RTL
|
||||
|
||||
All visible route copy is read from the existing locale catalogs. English and French render LTR; Arabic renders with true document-level RTL. Page CSS uses logical declarations. Directional workflow icons use the existing mirroring contract, while product media and branding remain fixed. Vehicle identifiers remain separate left-to-right `BidiText` values.
|
||||
|
||||
Native French and Arabic review remains required under P9-005 and P11-004.
|
||||
|
||||
## 8. Responsive, theme, and accessibility implementation
|
||||
|
||||
The route uses content-driven grids and switches two-column hero, integration, and pricing layouts to a single column below 768 CSS pixels. Actions become full width on compact mobile. Decorative hero transforms are removed in forced-colors and reduced-motion contexts. The implementation contains one page-level `h1`, coherent subsequent heading levels, native FAQ disclosures, visible focus inherited from the foundation, disabled-action reasons, and no page-local raw palette values.
|
||||
|
||||
Authored tests cover 1440, 1024, 768, 390, and 320 widths through the existing responsive suite plus Phase 13 homepage scenarios. Browser execution remains blocked locally, so these scenarios are not presented as observed passes.
|
||||
|
||||
## 9. Test additions
|
||||
|
||||
- `tests/unit/homepage-content.test.ts`: five content-model and destination-policy tests.
|
||||
- `tests/browser/homepage.spec.ts`: nine locale, section, disabled-action, bidi, anchor, and FAQ scenarios.
|
||||
- `tests/a11y/homepage.a11y.spec.ts`: three locale axe scenarios plus heading-outline validation.
|
||||
- `tests/visual/homepage.visual.spec.ts`: seven EN/FR/AR light/dark desktop/tablet/mobile/320 baselines.
|
||||
|
||||
## 10. Validation results
|
||||
|
||||
Passed:
|
||||
|
||||
- Static repository validation through Phase 13.
|
||||
- Prettier formatting check.
|
||||
- ESLint with zero warnings.
|
||||
- Strict TypeScript validation.
|
||||
- 27 unit tests across 9 files.
|
||||
- Coverage thresholds: 92.4 percent statements, 86.04 percent branches, 95.45 percent functions, and 92.64 percent lines.
|
||||
- Next.js production build and standalone preparation.
|
||||
- Direct HTTP 200 checks for EN, FR, and AR with correct `lang`, `dir`, and localized hero payloads.
|
||||
- Phase 13 package manifest generation and verification.
|
||||
|
||||
Blocked or open:
|
||||
|
||||
- Frozen pnpm installation after registry `EAI_AGAIN` failures.
|
||||
- Dependency audit because registry connectivity did not permit completion.
|
||||
- Exact Node 24.17.0 verification because the available host is Node 22.16.0.
|
||||
- Browser, axe, and visual execution because system Chromium rejects loopback navigation with `net::ERR_BLOCKED_BY_ADMINISTRATOR`.
|
||||
- Manual keyboard, touch, screen-reader, zoom/reflow, reduced-motion, forced-colors, theme, RTL, and visual review.
|
||||
|
||||
Detailed evidence is in `docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.{md,json}`, the HTTP result JSON, command log, manual matrix, and file-change list.
|
||||
|
||||
## 11. Files changed
|
||||
|
||||
The source delta adds the homepage content model, Phase 13 tests, validators, manifest scripts, decision and issue records, composition documentation, and quality evidence. It modifies the homepage route and stylesheet, package scripts and metadata, validation runner, and `ProductPreview` heading semantics. No file was deleted. The exact list is recorded in `docs/quality/PHASE_13_FILE_CHANGES_v1.0.txt`.
|
||||
|
||||
## 12. Open gates
|
||||
|
||||
Inherited P9, P10, P11, and P12 gates remain authoritative. Phase 13 adds:
|
||||
|
||||
- P13-001: browser, axe, and visual execution in unblocked CI.
|
||||
- P13-002: manual responsive and assistive-technology QA.
|
||||
- P13-003: exact target runtime, frozen installation, audit, and package verification in the pinned environment.
|
||||
|
||||
See `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.3.csv`.
|
||||
|
||||
## 13. Phase 14 readiness
|
||||
|
||||
Phase 14 may proceed with approved integration or production-readiness work using this homepage as the assembled route baseline. It must not reinterpret disabled destinations, illustrative media, open evidence, unapproved pricing, or unresolved legal and analytics controls as completed merely because the page now looks like a product rather than a scaffolding accident.
|
||||
@@ -0,0 +1,45 @@
|
||||
# Phase 11 Token Implementation
|
||||
|
||||
## Authority and flow
|
||||
|
||||
The immutable Phase 9 files remain the raw and semantic source authority:
|
||||
|
||||
```text
|
||||
src/contracts/phase9/design-tokens.json
|
||||
-> src/styles/tokens.css
|
||||
-> src/styles/component-tokens.css
|
||||
-> component CSS Modules and global styles
|
||||
```
|
||||
|
||||
`src/styles/tokens.css` remains byte-identical to `contracts/phase9/tokens/semantic-tokens_v1.0.css`. Phase 11 does not rename or edit those variables.
|
||||
|
||||
## Phase 11 additions
|
||||
|
||||
`src/styles/component-tokens.css` adds documented component-facing roles required by the Phase 11 scope:
|
||||
|
||||
- page, primary, elevated, muted, and strong surfaces;
|
||||
- primary, secondary, subdued, and inverse text;
|
||||
- standard and strong borders;
|
||||
- primary, conversion, danger, link, and focus roles;
|
||||
- success, warning, error, and information states;
|
||||
- overlay, disabled, selection, skeleton, and shadow roles;
|
||||
- container, gutter, section spacing, header offset, and layer roles;
|
||||
- display, heading, body, label, caption, line-height, and tracking roles.
|
||||
|
||||
These are aliases over approved Phase 9 values. Status roles use the approved raw status ramps because Phase 9 did not expose complete semantic status aliases. This extension is additive and does not mutate the historical contract.
|
||||
|
||||
## Consumption rules
|
||||
|
||||
1. Component and page CSS consume Phase 11 component-facing tokens.
|
||||
2. Raw palette variables are allowed only in `tokens.css` and `component-tokens.css`.
|
||||
3. Literal color functions and hexadecimal values are prohibited outside token declaration files.
|
||||
4. Orange remains reserved for conversion emphasis and focus where approved.
|
||||
5. Physical directional properties remain prohibited.
|
||||
6. Breakpoint literals remain the approved `768px` and `1120px` values because CSS custom properties cannot be used in media-query conditions.
|
||||
7. Shadows, timing, radius, spacing, typography, and layout roles are centralized rather than repeated through components.
|
||||
|
||||
## Automated enforcement
|
||||
|
||||
- `scripts/validate-tokens.mjs` verifies the immutable Phase 9 token source and detects raw color values.
|
||||
- `scripts/validate-phase11-foundation.mjs` verifies required Phase 11 roles and rejects raw palette consumption or literal colors in component styles.
|
||||
- `scripts/validate-css-logical.mjs` rejects physical directional CSS.
|
||||
@@ -0,0 +1,153 @@
|
||||
# ADR-0001: Repository Foundation and Runtime Architecture
|
||||
|
||||
- **Status:** Accepted for Phase 10
|
||||
- **Date:** 2026-06-25
|
||||
- **Decision owners:** Architecture and Engineering
|
||||
- **Supersedes:** Phase 9 open issues P9-010 and P9-017
|
||||
- **Scope:** Marketing-site repository foundation only
|
||||
|
||||
## Context
|
||||
|
||||
Phase 9 requires a server-rendered multilingual application that establishes locale, document direction, theme, metadata, canonical links, and `hreflang` before hydration. It also requires strict TypeScript, logical CSS, a CSP-compatible no-flash theme strategy, limited browser JavaScript, deterministic validation, and browser-based accessibility and visual checks.
|
||||
|
||||
The project name changed from `homePageCar` to `RentalDriveGo` at Phase 10. The original Phase 9 package is retained byte-for-byte under `contracts/phase9`; implementation copies carry the new product name. Legacy cookie and storage identifiers remain intentionally unchanged because they are part of the approved Phase 9 technical contract and changing them would break continuity without an approved migration.
|
||||
|
||||
## Decision
|
||||
|
||||
### Application framework and rendering
|
||||
|
||||
Use **Next.js 16.2.9 App Router** with **React 19.2.7** and **strict TypeScript 6.0.3**.
|
||||
|
||||
All locale pages use dynamic server rendering. The request proxy creates a unique CSP nonce and forwards it through the request headers so Next.js can attach the nonce to framework scripts and styles. Dynamic rendering is accepted as the cost of correct per-request CSP nonces and pre-hydration locale/theme behavior. Static export is explicitly out of scope.
|
||||
|
||||
The public route model is:
|
||||
|
||||
```text
|
||||
/ -> locale negotiation and redirect
|
||||
/en -> English, LTR
|
||||
/fr -> French, LTR
|
||||
/ar -> Arabic, RTL
|
||||
```
|
||||
|
||||
The route manifest in `src/contracts/phase9/route-manifest.json` is the route authority. The framework's experimental typed-route generator is not enabled because it produced an incompatible generated JSX namespace with the pinned React/TypeScript toolchain. Route integrity is instead enforced by deterministic manifest validation and browser tests.
|
||||
|
||||
### Locale and direction
|
||||
|
||||
The server resolves locale from an explicit route first. Root negotiation uses the first valid value from:
|
||||
|
||||
1. `hpc-locale` cookie
|
||||
2. `Accept-Language`
|
||||
3. English fallback
|
||||
|
||||
Each locale layout renders the correct `<html lang>` and document-level `dir` value before hydration. Arabic uses `dir="rtl"`; application CSS uses logical properties. Atomic LTR values remain subject to the Phase 9 bidi-isolation contract when those components are implemented.
|
||||
|
||||
### Theme and no-flash bootstrap
|
||||
|
||||
Theme preference is `light`, `dark`, or `system` and is read server-side from `hpc-theme`. The server emits an initial theme attribute. A nonce-bearing inline bootstrap executes in `<head>` before interactive components, resolves local storage and system color preference, and updates only `data-theme-preference` and `data-theme`.
|
||||
|
||||
The CSP uses:
|
||||
|
||||
```text
|
||||
script-src 'self' 'nonce-{requestNonce}' 'strict-dynamic'
|
||||
style-src 'self' 'nonce-{requestNonce}'
|
||||
```
|
||||
|
||||
Production CSP does not permit `unsafe-inline` or `unsafe-eval`. Development alone permits `unsafe-eval` for the framework toolchain. Theme color-scheme behavior is expressed in CSS from the resolved data attribute, not through an inline style mutation.
|
||||
|
||||
### Styling
|
||||
|
||||
Use **CSS Modules** for component scope and global semantic CSS custom properties for tokens. `src/styles/tokens.css` remains checksum-identical to the Phase 9 source token file. Application styles may not introduce raw brand colors or physical left/right layout declarations. CI validators enforce both constraints.
|
||||
|
||||
No runtime CSS-in-JS system or utility framework is included. That avoids a second token authority and unnecessary client/runtime cost.
|
||||
|
||||
### Client JavaScript boundary
|
||||
|
||||
Server components are the default. Client components are limited to current interaction boundaries:
|
||||
|
||||
- locale selector
|
||||
- theme controller and selector
|
||||
|
||||
Future Phase 11 components may add client code only where interaction requires it. CRM submission, analytics, dialogs, product tour, and login routing are not implemented until their governing Phase 9 issues are approved.
|
||||
|
||||
### Testing and quality stack
|
||||
|
||||
- Unit and contract behavior: Vitest 4.1.9 with V8 coverage
|
||||
- DOM component utilities: Testing Library
|
||||
- Browser, accessibility, and visual checks: Playwright 1.61.1
|
||||
- Automated accessibility scan: axe-core through `@axe-core/playwright`
|
||||
- Linting: ESLint 9.39.4 with Next.js and TypeScript rules
|
||||
- Formatting: Prettier 3.8.4
|
||||
- Package audit: pnpm audit
|
||||
|
||||
Canonical visual baselines use Chromium. Functional browser coverage is configured for Chromium, Firefox, WebKit, mobile Chromium, and mobile WebKit emulation. Phase 9's browser-policy ownership issue remains open; this configuration is a verification baseline, not a unilateral support-policy claim.
|
||||
|
||||
### Package and runtime management
|
||||
|
||||
Use **Node.js 24.17.0** and **pnpm 11.9.0**, pinned in `package.json`, `.node-version`, `.nvmrc`, and the CI workflow. All direct dependencies use exact versions. The lockfile is committed and CI installs with `--frozen-lockfile`.
|
||||
|
||||
The pnpm workspace applies a 24-hour minimum package-release age, except for explicitly pinned packages selected during this architecture decision. Package build scripts are allowlisted. Dependabot opens reviewed update proposals rather than silently advancing versions.
|
||||
|
||||
### Deployment target
|
||||
|
||||
The deployable artifact is a **vendor-neutral OCI container** running the Next.js standalone Node server on Linux. No cloud provider, domain, CDN, region, or managed service is invented. The container is suitable for an approved OCI-compatible platform once infrastructure ownership is decided.
|
||||
|
||||
Required runtime inputs:
|
||||
|
||||
- `SITE_ORIGIN`: approved absolute public origin
|
||||
- `PUBLIC_RELEASE_APPROVED`: remains `false` until release gates close
|
||||
- `PORT`: defaults to `3000`
|
||||
- `HOSTNAME`: defaults to `0.0.0.0` in the container
|
||||
|
||||
When release approval is false, metadata is `noindex` and `robots.txt` disallows crawling.
|
||||
|
||||
### Repository conventions
|
||||
|
||||
```text
|
||||
contracts/phase9/ immutable authoritative Phase 9 package
|
||||
src/app/ App Router routes and metadata
|
||||
src/components/ reusable application components
|
||||
src/content/locales/ implementation locale resources
|
||||
src/contracts/phase9/ runtime-consumable contract copies
|
||||
src/lib/ localization, theme, and security primitives
|
||||
src/styles/ exact tokens and global semantic CSS
|
||||
scripts/ deterministic repository validators
|
||||
tests/ unit, browser, accessibility, and visual tests
|
||||
docs/ ADR, dependency record, issue register, reports
|
||||
```
|
||||
|
||||
Files use UTF-8, LF line endings, strict TypeScript, named domain modules, and no barrel exports by default. Code paths may not silently resolve product, legal, analytics, security, pricing, evidence, or integration decisions.
|
||||
|
||||
## Consequences
|
||||
|
||||
Positive consequences:
|
||||
|
||||
- Locale, direction, theme, and metadata are correct before hydration.
|
||||
- The Phase 9 contract remains auditable and checksum-verifiable.
|
||||
- CSP nonces work with the framework's server rendering model.
|
||||
- The scaffold does not ship fabricated integrations, destinations, evidence, or claims.
|
||||
- A vendor-neutral container avoids premature infrastructure lock-in.
|
||||
|
||||
Costs and tradeoffs:
|
||||
|
||||
- Per-request nonces force dynamic rendering and reduce static CDN opportunities.
|
||||
- The app cannot be publicly released until critical and high Phase 9 issues close.
|
||||
- The renamed product has no approved final logo asset; the shell uses a temporary text mark only.
|
||||
- Browser and assistive-technology coverage still requires execution in approved CI/device environments.
|
||||
|
||||
## Rejected alternatives
|
||||
|
||||
- **Static export:** rejected because request-specific CSP nonces and server-readable preference cookies would be weakened.
|
||||
- **Client-only locale/theme setup:** rejected because it would permit wrong-language, wrong-direction, or wrong-theme first paint.
|
||||
- **Runtime CSS-in-JS or an unrelated utility token system:** rejected because it would create duplicate token authorities and more browser work.
|
||||
- **Prototype conversion:** rejected by scope and because Phase 8 prototype behavior is research evidence, not production source.
|
||||
- **Invented hosting provider or public domain:** rejected because neither is approved.
|
||||
|
||||
## Primary references
|
||||
|
||||
- Next.js Content Security Policy guide: https://nextjs.org/docs/app/guides/content-security-policy
|
||||
- Next.js Proxy convention: https://nextjs.org/docs/app/getting-started/proxy
|
||||
- Next.js metadata API: https://nextjs.org/docs/app/api-reference/functions/generate-metadata
|
||||
- Next.js 16.2 release: https://nextjs.org/blog/next-16-2
|
||||
- Node.js downloads: https://nodejs.org/en/download/current
|
||||
- pnpm 11 release: https://pnpm.io/blog/releases/11.0
|
||||
- Playwright release notes: https://playwright.dev/docs/release-notes
|
||||
@@ -0,0 +1,63 @@
|
||||
# ADR-0002: Phase 11 Foundation Architecture
|
||||
|
||||
- **Status:** Accepted for implementation; browser evidence pending
|
||||
- **Date:** 2026-06-25
|
||||
- **Scope:** Design tokens, theme, localization, routing, metadata, application shell, and global states
|
||||
- **Supersedes:** No Phase 9 or Phase 10 product decision
|
||||
|
||||
## Context
|
||||
|
||||
Phase 11 must extend the Phase 10 repository without mutating the immutable Phase 9 contract, weakening CSP, inventing unresolved destinations, or creating a second styling, routing, or localization authority.
|
||||
|
||||
## Decisions
|
||||
|
||||
### Token pipeline
|
||||
|
||||
Keep Phase 9 raw and semantic token files unchanged. Add `src/styles/component-tokens.css` as an additive component-facing layer. Application CSS may not consume raw palette tokens or literal colors.
|
||||
|
||||
### Theme persistence and bootstrap
|
||||
|
||||
Keep `hpc-theme` as the server-readable canonical preference and `hpc.theme.preference` as a client continuity copy. Preference remains distinct from resolved theme. The nonce-bearing head bootstrap resolves before paint. A CSS media-query fallback gives readable system-dark behavior when JavaScript is delayed or unavailable. Same-window theme selectors synchronize through a custom event; cross-tab selectors synchronize through the storage event.
|
||||
|
||||
### Locale routing and negotiation
|
||||
|
||||
The route path remains the active locale authority. Root negotiation uses the locale cookie, then `Accept-Language`, then English. Locale switching resolves the current semantic route ID, preserves only allowlisted campaign parameters, and preserves only hashes approved for that route.
|
||||
|
||||
### Translation loading
|
||||
|
||||
Server components load typed catalogs through `getMessages`. Interaction-only global states use a small client shell-catalog map. Missing-key and type parity remain CI failures. No runtime fallback silently substitutes English for French or Arabic.
|
||||
|
||||
### Formatting
|
||||
|
||||
Centralized `Intl` formatters require an explicit locale and, where relevant, time zone or currency. Language never implies market, country, currency, or jurisdiction. Gregorian dates and Latin digits remain the inherited baseline until product research approves alternatives.
|
||||
|
||||
### Font loading
|
||||
|
||||
Use the pinned local Fontsource variable packages for Inter and Noto Sans Arabic. Arabic receives its own line-height and does not inherit forced Latin metrics.
|
||||
|
||||
### Application shell composition
|
||||
|
||||
The locale layout owns document attributes, theme bootstrap, skip navigation, header, footer, and theme controller. The header is server-rendered except for route-aware navigation, selectors, and the native modal mobile drawer. The drawer uses `<dialog>` for modal semantics, Escape behavior, background interaction blocking, and focus containment, with explicit focus return.
|
||||
|
||||
### Unresolved destinations
|
||||
|
||||
Authoritative route-manifest paths are generated for login and legal routes, but those pages render localized noindex pending shells. Demo, contact, and login actions do not receive invented production integrations. They remain visibly disabled or lead to an explicit pending route.
|
||||
|
||||
### Metadata
|
||||
|
||||
A single server helper generates canonical URLs, reciprocal `hreflang`, Open Graph locale data, social summary metadata, and release-safe robots behavior from route IDs. No structured organization, review, rating, pricing, or contact data is emitted.
|
||||
|
||||
### CSS organization
|
||||
|
||||
- `tokens.css`: immutable Phase 9 tokens
|
||||
- `component-tokens.css`: Phase 11 component-facing roles
|
||||
- `globals.css`: reset, typography, focus, selection, accessibility utilities
|
||||
- CSS Modules: component and page layout
|
||||
|
||||
### Visual regression
|
||||
|
||||
Playwright Chromium is the canonical snapshot engine. Functional projects remain Chromium, Firefox, WebKit, mobile Chromium, and mobile WebKit. Snapshot generation and approval are blocked until the pinned browser environment can execute.
|
||||
|
||||
## Consequences
|
||||
|
||||
The application foundation is traceable and does not encode unresolved product decisions. The cost is an explicit set of pending route shells and disabled conversion destinations until owners close the inherited gates. Full acceptance still requires Node 24.17.0 CI, Playwright execution, and reviewed visual snapshots.
|
||||
@@ -0,0 +1,26 @@
|
||||
# ADR-0003: Phase 12 component-system architecture
|
||||
|
||||
- Status: Accepted for implementation; release acceptance remains gated
|
||||
- Date: 2026-06-25
|
||||
- Owners: Frontend architecture, design systems, accessibility
|
||||
|
||||
## Context
|
||||
|
||||
Phase 12 requires a reusable marketing component system without assembling the homepage or inventing unresolved product content. Phase 11 approved semantic CSS modules, native platform behavior, server components by default, and a production shell rather than Storybook.
|
||||
|
||||
## Decision
|
||||
|
||||
1. Keep CSS Modules as the only component styling method and consume only component-facing semantic tokens.
|
||||
2. Use native HTML primitives where they provide reliable behavior: `button`, `a`, `details`, `progress`, form controls, and `dialog`.
|
||||
3. Add client boundaries only to controls with state, browser APIs, keyboard roving focus, or overlays.
|
||||
4. Use a guarded component-lab route as the approved Storybook-equivalent fixture surface. It returns not found unless `COMPONENT_FIXTURES_ENABLED=true`.
|
||||
5. Implement the icon set as a small, tree-shakeable internal SVG map to avoid adding a second dependency or shipping an entire icon library.
|
||||
6. Keep unresolved claims, destinations, customer evidence, pricing, CRM submission, and approved media represented as blocked inventory entries or disabled typed states.
|
||||
7. Add Phase 12 inventory and manifest validators. The package dependency graph remains unchanged.
|
||||
|
||||
## Consequences
|
||||
|
||||
- Phase 13 receives stable import paths and explicit section patterns.
|
||||
- Browser, accessibility, and visual fixtures are deterministic and cannot be exposed accidentally under the default production environment.
|
||||
- The internal icon map requires deliberate review when adding icons, which is preferable to casual dependency archaeology.
|
||||
- Runtime acceptance still depends on executing the pinned Node 24.17.0 and pnpm 11.9.0 suites in an environment with registry and browser access.
|
||||
@@ -0,0 +1,61 @@
|
||||
Component,Interactive,Name_role_state,Keyboard,Focus,Live_region,Touch_target,Automated_coverage,Manual_status
|
||||
VisuallyHidden,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
BidiText,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
LiveRegion,No,Semantic HTML and typed accessible labels,N/A,N/A,"Intentional only for Alert, LiveRegion, loading and progress",44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Icon,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Button,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
ActionLink,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
FormField,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
TextInput,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
TextArea,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Select,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Checkbox,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Radio,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Switch,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Fieldset,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
ErrorSummary,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Tabs,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
SegmentedControl,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Accordion,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Pagination,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Dialog,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
DropdownMenu,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Tooltip,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Alert,No,Semantic HTML and typed accessible labels,N/A,N/A,"Intentional only for Alert, LiveRegion, loading and progress",44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Progress,No,Semantic HTML and typed accessible labels,N/A,N/A,"Intentional only for Alert, LiveRegion, loading and progress",44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Spinner,No,Semantic HTML and typed accessible labels,N/A,N/A,"Intentional only for Alert, LiveRegion, loading and progress",44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Skeleton,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
StateMessage,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
StatusBadge,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Card,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Panel,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Callout,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Heading,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Eyebrow,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Text,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Quote,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Breadcrumbs,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
SectionNavigation,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
FooterLinkGroup,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
MediaFrame,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
ResponsiveImage,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
SectionHeader,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
FeatureCard,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
FeatureGrid,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
SplitContent,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
MetricStrip,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
LogoStripShell,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Workflow,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Comparison,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
Metric,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
EvidenceShell,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
CTA,Yes,Semantic HTML and typed accessible labels,Native or documented arrow/Escape behavior,Visible global focus; return/constrain where applicable,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
ProductPreview,No,Semantic HTML and typed accessible labels,N/A,N/A,None,44 CSS px for controls,Representative axe fixture,Pending pinned browser/manual execution
|
||||
DemoForm,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
Toast,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
PricingCard,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
TestimonialContent,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
CustomerLogoContent,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
ApprovedProductCapture,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
LoginDestination,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
SalesDestination,No,Not rendered,N/A,N/A,N/A,N/A,Not applicable,Blocked
|
||||
|
@@ -0,0 +1,22 @@
|
||||
# Phase 12 Bundle Impact Report
|
||||
|
||||
## Measurement scope
|
||||
|
||||
The repository has no dedicated analyzer plugin, so Phase 12 records reproducible source and production-output measurements rather than inventing treemap precision.
|
||||
|
||||
| Measurement | Phase 11 | Phase 12 | Change |
|
||||
| ----------------------------- | -----------------------------------: | -------: | -------------------: |
|
||||
| Source files under `src` | 62 | 135 | +73 |
|
||||
| Source bytes under `src` | 148,035 | 251,655 | +103,620 |
|
||||
| Component source/style files | 25 | 93 | +68 |
|
||||
| Production `.next/standalone` | Not measured in Phase 11 environment | 35 MiB | Baseline established |
|
||||
| Production `.next/static` | Not measured in Phase 11 environment | 1.5 MiB | Baseline established |
|
||||
| Production `.next/server` | Not measured in Phase 11 environment | 9.7 MiB | Baseline established |
|
||||
|
||||
## Interpretation
|
||||
|
||||
The source increase is expected because Phase 12 adds the reusable component system, fixtures, and documentation surface. No dependency was added. Client boundaries are limited to nine inventory entries, and the component-lab route is environment-gated. The production build completed and preserved route-level code splitting.
|
||||
|
||||
## Follow-up gate
|
||||
|
||||
Run the repository's future bundle analyzer, when configured, against a Phase 11 build produced on the same pinned runtime. Cross-environment directory sizes are not a substitute for JavaScript chunk comparison, despite how tempting that spreadsheet would be.
|
||||
@@ -0,0 +1,77 @@
|
||||
# Phase 12 Component Catalog
|
||||
|
||||
All public components use semantic tokens, logical CSS, one locale-independent DOM tree, and typed semantic variants. The component-lab route is development-only and guarded by `COMPONENT_FIXTURES_ENABLED=true`.
|
||||
|
||||
## Public component reference
|
||||
|
||||
| Component | Import path | Purpose | Variants | Accessibility / RTL / responsive behavior | Do not use when |
|
||||
| ------------------- | ------------------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
|
||||
| `VisuallyHidden` | `@/components/foundation/VisuallyHidden` | Reusable foundational utilities primitive or pattern. | default | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `BidiText` | `@/components/foundation/BidiText` | Reusable foundational utilities primitive or pattern. | default | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `LiveRegion` | `@/components/foundation/LiveRegion` | Reusable foundational utilities primitive or pattern. | polite, assertive | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Icon` | `@/components/foundation/Icon` | Reusable icon system primitive or pattern. | sm, md, lg, fixed, mirror | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Button` | `@/components/actions/Button` | Reusable actions primitive or pattern. | primary, conversion, secondary, tertiary, ghost, destructive, link, icon-only, loading | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `ActionLink` | `@/components/actions/ActionLink` | Reusable actions primitive or pattern. | inline, navigation, standalone, button-primary, button-conversion, muted, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `FormField` | `@/components/forms/FormField` | Reusable forms primitive or pattern. | required, optional, supporting, error | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `TextInput` | `@/components/forms/TextInput` | Reusable forms primitive or pattern. | text, email, telephone, url, search, invalid, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `TextArea` | `@/components/forms/TextInput` | Reusable forms primitive or pattern. | default, character-count, invalid, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Select` | `@/components/forms/TextInput` | Reusable forms primitive or pattern. | default, invalid, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Checkbox` | `@/components/forms/ChoiceControls` | Reusable forms primitive or pattern. | default, checked, invalid, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Radio` | `@/components/forms/ChoiceControls` | Reusable forms primitive or pattern. | default, checked, invalid, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Switch` | `@/components/forms/ChoiceControls` | Reusable forms primitive or pattern. | on, off, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Fieldset` | `@/components/forms/FormField` | Reusable forms primitive or pattern. | default | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `ErrorSummary` | `@/components/forms/ErrorSummary` | Reusable forms primitive or pattern. | error-list | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Tabs` | `@/components/controls/Tabs` | Reusable selection controls primitive or pattern. | automatic, manual, disabled-tab | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `SegmentedControl` | `@/components/controls/SegmentedControl` | Reusable selection controls primitive or pattern. | selected, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Accordion` | `@/components/controls/Accordion` | Reusable selection controls primitive or pattern. | open, closed | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Pagination` | `@/components/controls/Pagination` | Reusable selection controls primitive or pattern. | current, previous, next | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Dialog` | `@/components/overlays/Dialog` | Reusable overlays primitive or pattern. | modal, drawer, dismissible, non-dismissible | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `DropdownMenu` | `@/components/overlays/DropdownMenu` | Reusable overlays primitive or pattern. | open, closed, disabled-item, destructive-item | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Tooltip` | `@/components/overlays/Tooltip` | Reusable overlays primitive or pattern. | hover, focus | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Alert` | `@/components/feedback/Alert` | Reusable feedback primitive or pattern. | info, success, warning, error, inline | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Progress` | `@/components/feedback/Progress` | Reusable feedback primitive or pattern. | determinate, indeterminate | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Spinner` | `@/components/feedback/Loading` | Reusable feedback primitive or pattern. | loading | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Skeleton` | `@/components/feedback/Loading` | Reusable feedback primitive or pattern. | single-line, multi-line, reduced-motion | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `StateMessage` | `@/components/feedback/StateMessage` | Reusable feedback primitive or pattern. | empty, error, success, information | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `StatusBadge` | `@/components/foundation/StatusBadge` | Reusable feedback primitive or pattern. | neutral, info, success, warning, error | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Card` | `@/components/surfaces/Card` | Reusable surfaces primitive or pattern. | default, muted, elevated, strong, interactive | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Panel` | `@/components/surfaces/Card` | Reusable surfaces primitive or pattern. | default, muted, elevated, strong | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Callout` | `@/components/surfaces/Callout` | Reusable surfaces primitive or pattern. | information | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Heading` | `@/components/typography/Typography` | Reusable typography primitive or pattern. | display, section, subheading, levels-1-6 | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Eyebrow` | `@/components/typography/Typography` | Reusable typography primitive or pattern. | default | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Text` | `@/components/typography/Typography` | Reusable typography primitive or pattern. | lead, body, supporting, caption, label | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Quote` | `@/components/typography/Typography` | Reusable typography primitive or pattern. | with-citation, without-citation | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Breadcrumbs` | `@/components/navigation/Breadcrumbs` | Reusable navigation primitive or pattern. | current-page | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `SectionNavigation` | `@/components/navigation/SectionNavigation` | Reusable navigation primitive or pattern. | current-location, overflow | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `FooterLinkGroup` | `@/components/navigation/FooterLinkGroup` | Reusable navigation primitive or pattern. | resolved, disabled | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `MediaFrame` | `@/components/media/MediaFrame` | Reusable media primitive or pattern. | square, landscape, wide, portrait, auto, captioned, decorative | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `ResponsiveImage` | `@/components/media/MediaFrame` | Reusable media primitive or pattern. | meaningful, decorative, captioned | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `SectionHeader` | `@/components/marketing/SectionHeader` | Reusable section patterns primitive or pattern. | start, center | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `FeatureCard` | `@/components/marketing/FeatureCard` | Reusable marketing surfaces primitive or pattern. | default, primary, muted | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `FeatureGrid` | `@/components/marketing/SectionPatterns` | Reusable section patterns primitive or pattern. | responsive-grid | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `SplitContent` | `@/components/marketing/SectionPatterns` | Reusable section patterns primitive or pattern. | default, reverse | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `MetricStrip` | `@/components/marketing/SectionPatterns` | Reusable section patterns primitive or pattern. | responsive-strip | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `LogoStripShell` | `@/components/marketing/SectionPatterns` | Reusable section patterns primitive or pattern. | empty-shell, content | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Workflow` | `@/components/marketing/Workflow` | Reusable workflow primitive or pattern. | numbered, icon, stacked, horizontal | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Comparison` | `@/components/marketing/Comparison` | Reusable comparison primitive or pattern. | problem-solution, stacked, two-column | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A simpler native element or layout primitive already provides the required semantics. |
|
||||
| `Metric` | `@/components/marketing/Evidence` | Reusable evidence primitive or pattern. | approved, pending-review, research-only, prohibited | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A blocked product decision or unsupported claim would be required. |
|
||||
| `EvidenceShell` | `@/components/marketing/Evidence` | Reusable evidence primitive or pattern. | approved, pending-review, research-only, prohibited | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A blocked product decision or unsupported claim would be required. |
|
||||
| `CTA` | `@/components/marketing/CTA` | Reusable calls to action primitive or pattern. | inline, card, section, primary-only, dual-action, disabled-destination | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A blocked product decision or unsupported claim would be required. |
|
||||
| `ProductPreview` | `@/components/marketing/ProductPreview` | Reusable product previews primitive or pattern. | illustrative, empty, responsive-table | Semantic HTML; keyboard support when interactive; visible focus; logical CSS; localized content props; content-driven reflow at compact, medium, and wide gates. | A blocked product decision or unsupported claim would be required. |
|
||||
|
||||
## Representative usage
|
||||
|
||||
```tsx
|
||||
import { Button } from '@/components/actions/Button';
|
||||
import { FeatureCard } from '@/components/marketing/FeatureCard';
|
||||
|
||||
<Button intent="conversion" size="large">{messages.demoLabel}</Button>
|
||||
<FeatureCard title={content.title} description={content.description} icon="car" />
|
||||
```
|
||||
|
||||
## Prohibited usage
|
||||
|
||||
- Do not pass raw colors, arbitrary spacing, untranslated fragments, unresolved URLs, or research-only evidence into production rendering.
|
||||
- Do not use `Card` to turn every layout problem into a rectangle. Humanity has already done enough of that.
|
||||
- Do not use `InteractiveCard` semantics for containers with multiple independent controls. This system intentionally does not provide that invalid abstraction.
|
||||
- Do not enable the component-lab route in a public production deployment.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,61 @@
|
||||
Component,Category,Status,Import_path,Source_specifications,Homepage_consumers,Open_issues
|
||||
VisuallyHidden,foundational utilities,implemented,@/components/foundation/VisuallyHidden,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,global accessibility,
|
||||
BidiText,foundational utilities,implemented,@/components/foundation/BidiText,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product previews; metrics; forms,
|
||||
LiveRegion,foundational utilities,implemented,@/components/foundation/LiveRegion,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,forms; status feedback,
|
||||
Icon,icon system,implemented,@/components/foundation/Icon,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,all sections,
|
||||
Button,actions,implemented,@/components/actions/Button,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; final CTA; dialogs; forms,
|
||||
ActionLink,actions,implemented,@/components/actions/ActionLink,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,header; hero; sections; footer,
|
||||
FormField,forms,implemented,@/components/forms/FormField,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; contact form,
|
||||
TextInput,forms,implemented,@/components/forms/TextInput,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; contact form,
|
||||
TextArea,forms,implemented,@/components/forms/TextInput,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; contact form,
|
||||
Select,forms,implemented,@/components/forms/TextInput,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; filters,
|
||||
Checkbox,forms,implemented,@/components/forms/ChoiceControls,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; consent,
|
||||
Radio,forms,implemented,@/components/forms/ChoiceControls,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; choice groups,
|
||||
Switch,forms,implemented,@/components/forms/ChoiceControls,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,settings controls,
|
||||
Fieldset,forms,implemented,@/components/forms/FormField,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form,
|
||||
ErrorSummary,forms,implemented,@/components/forms/ErrorSummary,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,demo form; contact form,
|
||||
Tabs,selection controls,implemented,@/components/controls/Tabs,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product previews; capability sections,
|
||||
SegmentedControl,selection controls,implemented,@/components/controls/SegmentedControl,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product preview controls,
|
||||
Accordion,selection controls,implemented,@/components/controls/Accordion,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,FAQ,
|
||||
Pagination,selection controls,implemented,@/components/controls/Pagination,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,future resource indexes,
|
||||
Dialog,overlays,implemented,@/components/overlays/Dialog,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product tour; future forms,
|
||||
DropdownMenu,overlays,implemented,@/components/overlays/DropdownMenu,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,navigation; utility actions,
|
||||
Tooltip,overlays,implemented,@/components/overlays/Tooltip,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,icon controls,
|
||||
Alert,feedback,implemented,@/components/feedback/Alert,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,forms; global status,
|
||||
Progress,feedback,implemented,@/components/feedback/Progress,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product tour; forms,
|
||||
Spinner,feedback,implemented,@/components/feedback/Loading,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,buttons; forms,
|
||||
Skeleton,feedback,implemented,@/components/feedback/Loading,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product previews,
|
||||
StateMessage,feedback,implemented,@/components/feedback/StateMessage,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,route states; product previews,
|
||||
StatusBadge,feedback,implemented,@/components/foundation/StatusBadge,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product previews; evidence,
|
||||
Card,surfaces,implemented,@/components/surfaces/Card,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,features; roles; modules; metrics,
|
||||
Panel,surfaces,implemented,@/components/surfaces/Card,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,product previews; forms,
|
||||
Callout,surfaces,implemented,@/components/surfaces/Callout,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,security; pricing notes,
|
||||
Heading,typography,implemented,@/components/typography/Typography,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,all sections,
|
||||
Eyebrow,typography,implemented,@/components/typography/Typography,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; section headers,
|
||||
Text,typography,implemented,@/components/typography/Typography,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,all sections,
|
||||
Quote,typography,implemented,@/components/typography/Typography,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,testimonial shell,
|
||||
Breadcrumbs,navigation,implemented,@/components/navigation/Breadcrumbs,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,secondary routes,
|
||||
SectionNavigation,navigation,implemented,@/components/navigation/SectionNavigation,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,long marketing routes,
|
||||
FooterLinkGroup,navigation,implemented,@/components/navigation/FooterLinkGroup,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,footer,
|
||||
MediaFrame,media,implemented,@/components/media/MediaFrame,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; feature sections,
|
||||
ResponsiveImage,media,implemented,@/components/media/MediaFrame,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; feature sections,
|
||||
SectionHeader,section patterns,implemented,@/components/marketing/SectionHeader,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,all homepage sections,
|
||||
FeatureCard,marketing surfaces,implemented,@/components/marketing/FeatureCard,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,roles; modules; capabilities,
|
||||
FeatureGrid,section patterns,implemented,@/components/marketing/SectionPatterns,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,roles; modules; capabilities,
|
||||
SplitContent,section patterns,implemented,@/components/marketing/SectionPatterns,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; alternating features,
|
||||
MetricStrip,section patterns,implemented,@/components/marketing/SectionPatterns,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,evidence,
|
||||
LogoStripShell,section patterns,implemented,@/components/marketing/SectionPatterns,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,trust proof,
|
||||
Workflow,workflow,implemented,@/components/marketing/Workflow,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,rental lifecycle,
|
||||
Comparison,comparison,implemented,@/components/marketing/Comparison,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,fragmented-versus-connected,
|
||||
Metric,evidence,implemented,@/components/marketing/Evidence,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,evidence; operational benefits,
|
||||
EvidenceShell,evidence,implemented,@/components/marketing/Evidence,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,trust proof; testimonials,
|
||||
CTA,calls to action,implemented,@/components/marketing/CTA,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; final CTA; contact sales,
|
||||
ProductPreview,product previews,implemented,@/components/marketing/ProductPreview,Phase 12 prompt; contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md; docs/PHASE_12_HANDOFF_v1.0.md,hero; product UI previews,
|
||||
DemoForm,forms,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,hero; final CTA,P9-002; P9-003
|
||||
Toast,feedback,excluded,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,none; critical information must remain persistent,
|
||||
PricingCard,surfaces,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,pricing preview,P9-008
|
||||
TestimonialContent,evidence,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,testimonial section,P9-012
|
||||
CustomerLogoContent,evidence,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,trust proof,P9-012
|
||||
ApprovedProductCapture,media,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,hero; product UI previews,P9-006
|
||||
LoginDestination,actions,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,header; footer,P9-015
|
||||
SalesDestination,actions,blocked,Not implemented,Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv,hero; final CTA,P9-016
|
||||
|
@@ -0,0 +1,22 @@
|
||||
# Phase 12 Definition of Done Status
|
||||
|
||||
## Satisfied in this implementation environment
|
||||
|
||||
- Phase 11 static behavior and immutable Phase 9 checks remain intact.
|
||||
- Formatting, linting, strict TypeScript validation, token/locale/route/RTL/component validation, 22 unit tests, coverage thresholds, production build with an explicit local origin, and standalone locale rendering pass.
|
||||
- Required component families are implemented or explicitly blocked/excluded.
|
||||
- Public APIs are typed and documented.
|
||||
- Components consume semantic tokens and support EN, FR, AR, light/dark/system foundations, document RTL, keyboard semantics, focus states, responsive composition, long content, and deterministic fictional fixtures.
|
||||
- No unsupported claim, testimonial, metric, logo, final destination, CRM transmission, analytics collection, consent integration, pricing logic, or authentication was introduced.
|
||||
- Dependency additions: none.
|
||||
- Component inventory, traceability, behavior matrices, reports, issue records, decision records, handoff, and package manifest are present.
|
||||
|
||||
## Acceptance gates still open
|
||||
|
||||
- P12-001: Browser and automated accessibility execution in an unblocked loopback environment.
|
||||
- P12-002: Visual baseline generation and design approval.
|
||||
- P12-003: Full suite on pinned Node 24.17.0.
|
||||
- P12-004: Frozen pnpm installation and dependency audit with registry access.
|
||||
- P12-005: Manual keyboard, touch, screen-reader, zoom, reduced-motion, and forced-colors matrix.
|
||||
|
||||
Phase 13 development may proceed. Phase 12 release acceptance may not be declared until these gates close.
|
||||
@@ -0,0 +1,25 @@
|
||||
# Phase 12 Dependency Change Report
|
||||
|
||||
## Result
|
||||
|
||||
No direct production or development dependency was added, removed, or version-changed in Phase 12. The exact Phase 11 dependency graph and `pnpm-lock.yaml` are retained.
|
||||
|
||||
## Rationale
|
||||
|
||||
- Icons use a reviewed internal SVG map.
|
||||
- Dialog and drawer behavior use native `dialog` plus existing React utilities.
|
||||
- Tabs, accordion, segmented controls, menus, tooltips, and form primitives use platform semantics and existing React.
|
||||
- CSS Modules remain the sole component styling method.
|
||||
- Existing Vitest, Testing Library, Playwright, and axe packages cover automated tests.
|
||||
|
||||
## Verification
|
||||
|
||||
`scripts/validate-runtime-dependencies.mjs` confirms the exact pinned direct versions remain represented in the lockfile. `npm install --engine-strict=false --ignore-scripts --package-lock=false` was used only as a local fallback after registry failures prevented the required frozen pnpm installation.
|
||||
|
||||
## Blocked gates
|
||||
|
||||
- `pnpm install --frozen-lockfile`: blocked by registry DNS failures.
|
||||
- `pnpm audit --audit-level low`: blocked by registry DNS failures and timed out after retry scheduling.
|
||||
- Node 24.17.0 verification: unavailable on this host; Node 22.16.0 was used for local execution.
|
||||
|
||||
These are tracked by P12-003 and P12-004.
|
||||
@@ -0,0 +1,95 @@
|
||||
Component_family,Scenario,Width_css_px,Expected_behavior,Automated_status,Manual_status
|
||||
actions,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
actions,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
actions,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
actions,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
actions,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
calls to action,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
calls to action,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
calls to action,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
calls to action,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
calls to action,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
comparison,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
comparison,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
comparison,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
comparison,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
comparison,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
evidence,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
evidence,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
evidence,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
evidence,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
evidence,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
feedback,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
feedback,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
feedback,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
feedback,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
feedback,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
forms,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
forms,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
forms,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
forms,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
forms,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
foundational utilities,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
foundational utilities,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
foundational utilities,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
foundational utilities,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
foundational utilities,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
icon system,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
icon system,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
icon system,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
icon system,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
icon system,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
marketing surfaces,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
marketing surfaces,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
marketing surfaces,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
marketing surfaces,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
marketing surfaces,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
media,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
media,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
media,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
media,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
media,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
navigation,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
navigation,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
navigation,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
navigation,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
navigation,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
overlays,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
overlays,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
overlays,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
overlays,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
overlays,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
product previews,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
product previews,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
product previews,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
product previews,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
product previews,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
section patterns,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
section patterns,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
section patterns,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
section patterns,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
section patterns,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
selection controls,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
selection controls,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
selection controls,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
selection controls,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
selection controls,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
surfaces,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
surfaces,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
surfaces,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
surfaces,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
surfaces,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
typography,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
typography,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
typography,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
typography,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
typography,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
workflow,Narrow mobile,320,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
workflow,Mobile,390,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
workflow,Tablet,768,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
workflow,Standard desktop,1024,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
workflow,Wide desktop,1440,No page overflow; content-driven reflow; 44px controls; logical order,Fixture test authored; execution blocked by pnpm/browser availability,Pending
|
||||
Cross-component,200% zoom,Variable,"No clipped text, hidden actions, or unexpected horizontal page overflow",Risk-based browser test authored where applicable,Pending
|
||||
Cross-component,400% zoom equivalent at 320 CSS px,Variable,"No clipped text, hidden actions, or unexpected horizontal page overflow",Risk-based browser test authored where applicable,Pending
|
||||
Cross-component,Reduced viewport height,Variable,"No clipped text, hidden actions, or unexpected horizontal page overflow",Risk-based browser test authored where applicable,Pending
|
||||
Cross-component,Landscape mobile,Variable,"No clipped text, hidden actions, or unexpected horizontal page overflow",Risk-based browser test authored where applicable,Pending
|
||||
|
@@ -0,0 +1,61 @@
|
||||
Component,Layout,Content_order,Icon_behavior,Motion,Mixed_direction,Review_status
|
||||
VisuallyHidden,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,Not applicable,Reviewed
|
||||
BidiText,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
LiveRegion,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Icon,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,Not applicable,Reviewed
|
||||
Button,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,Not applicable,Reviewed
|
||||
ActionLink,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
FormField,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
TextInput,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
TextArea,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Select,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Checkbox,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Radio,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Switch,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Fieldset,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
ErrorSummary,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Tabs,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
SegmentedControl,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Accordion,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Pagination,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Dialog,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
DropdownMenu,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Tooltip,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Alert,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Progress,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Spinner,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Skeleton,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
StateMessage,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
StatusBadge,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Card,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Panel,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Callout,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Heading,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Eyebrow,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Text,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Quote,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Breadcrumbs,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
SectionNavigation,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
FooterLinkGroup,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
MediaFrame,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
ResponsiveImage,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
SectionHeader,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
FeatureCard,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
FeatureGrid,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
SplitContent,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
MetricStrip,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
LogoStripShell,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Workflow,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,Directional icons mirror; universal/media/brand symbols remain fixed,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Comparison,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Metric,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
EvidenceShell,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
CTA,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
ProductPreview,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
DemoForm,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
Toast,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
PricingCard,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
TestimonialContent,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
CustomerLogoContent,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
ApprovedProductCapture,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
LoginDestination,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
SalesDestination,Logical CSS properties; one DOM tree,Preserve semantic/process order; flex/grid follows document direction only where meaningful,No automatic mirroring,Direction-aware only where meaning changes,"Use BidiText for identifiers, email, phone, URL, plate and model codes",Reviewed
|
||||
|
@@ -0,0 +1,3 @@
|
||||
Fixture,Components,Locales,Themes,Widths,States,Location,Production_guard
|
||||
Core component lab,"Actions, forms, tabs, accordion, dialog, menu, alerts, workflow, comparison, preview, evidence, CTA",en; fr; ar,light; dark; system,320; 390; 768; 1024; 1440,default; focus; disabled; loading; error; long-content; RTL,src/app/[locale]/component-lab,COMPONENT_FIXTURES_ENABLED=true
|
||||
Deterministic content model,All component-lab copy and fictional IDs,en; fr; ar,N/A,N/A,long French; formal Arabic; mixed identifiers,src/content/development/component-lab.ts,Route guard
|
||||
|
@@ -0,0 +1,9 @@
|
||||
Test_type,Path,Coverage,Artifact_status,Execution_status
|
||||
Unit,tests/unit/components/actions.test.tsx,Button loading/name; icon-only label; disabled destination,Authored,Not executed: package manager unavailable
|
||||
Unit,tests/unit/components/controls.test.tsx,Tabs keyboard; accordion semantics,Authored,Not executed
|
||||
Unit,tests/unit/components/forms.test.tsx,Label/help/error relationships; summary links,Authored,Not executed
|
||||
Unit,tests/unit/components/evidence.test.tsx,Evidence production suppression,Authored,Not executed
|
||||
Type-level,tests/types/component-contracts.test-d.tsx,Icon-only label and metric model,Authored,Not executed
|
||||
Browser,tests/browser/component-system.spec.ts,Locale/RTL/reflow/keyboard/dialog focus,Authored,Not executed
|
||||
Accessibility,tests/a11y/component-system.a11y.spec.ts,Axe on en/fr/ar fixture,Authored,Not executed
|
||||
Visual,tests/visual/component-system.visual.spec.ts,"en-light, fr-dark, ar-dark/mobile",Authored,Baselines not generated or approved
|
||||
|
@@ -0,0 +1,177 @@
|
||||
Component,Status,Variant,Controlled_by,Production_restriction
|
||||
VisuallyHidden,implemented,None,N/A,Blocked or excluded; see issue register
|
||||
BidiText,implemented,None,N/A,Blocked or excluded; see issue register
|
||||
LiveRegion,implemented,polite,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
LiveRegion,implemented,assertive,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Icon,implemented,sm,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Icon,implemented,md,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Icon,implemented,lg,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Icon,implemented,fixed,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Icon,implemented,mirror,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,primary,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,conversion,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,secondary,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,tertiary,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,ghost,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,destructive,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,link,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,icon-only,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Button,implemented,loading,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,inline,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,navigation,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,standalone,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,button-primary,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,button-conversion,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,muted,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ActionLink,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FormField,implemented,required,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FormField,implemented,optional,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FormField,implemented,supporting,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FormField,implemented,error,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,text,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,email,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,telephone,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,url,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,search,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,invalid,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextInput,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextArea,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextArea,implemented,character-count,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextArea,implemented,invalid,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
TextArea,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Select,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Select,implemented,invalid,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Select,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Checkbox,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Checkbox,implemented,checked,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Checkbox,implemented,invalid,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Checkbox,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Radio,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Radio,implemented,checked,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Radio,implemented,invalid,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Radio,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Switch,implemented,on,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Switch,implemented,off,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Switch,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Fieldset,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ErrorSummary,implemented,error-list,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Tabs,implemented,automatic,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Tabs,implemented,manual,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Tabs,implemented,disabled-tab,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SegmentedControl,implemented,selected,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SegmentedControl,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Accordion,implemented,open,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Accordion,implemented,closed,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Pagination,implemented,current,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Pagination,implemented,previous,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Pagination,implemented,next,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Dialog,implemented,modal,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Dialog,implemented,drawer,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Dialog,implemented,dismissible,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Dialog,implemented,non-dismissible,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
DropdownMenu,implemented,open,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
DropdownMenu,implemented,closed,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
DropdownMenu,implemented,disabled-item,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
DropdownMenu,implemented,destructive-item,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Tooltip,implemented,hover,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Tooltip,implemented,focus,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Alert,implemented,info,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Alert,implemented,success,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Alert,implemented,warning,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Alert,implemented,error,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Alert,implemented,inline,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Progress,implemented,determinate,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Progress,implemented,indeterminate,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Spinner,implemented,loading,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Skeleton,implemented,single-line,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Skeleton,implemented,multi-line,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Skeleton,implemented,reduced-motion,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StateMessage,implemented,empty,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StateMessage,implemented,error,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StateMessage,implemented,success,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StateMessage,implemented,information,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StatusBadge,implemented,neutral,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StatusBadge,implemented,info,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StatusBadge,implemented,success,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StatusBadge,implemented,warning,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
StatusBadge,implemented,error,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Card,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Card,implemented,muted,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Card,implemented,elevated,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Card,implemented,strong,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Card,implemented,interactive,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Panel,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Panel,implemented,muted,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Panel,implemented,elevated,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Panel,implemented,strong,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Callout,implemented,information,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Heading,implemented,display,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Heading,implemented,section,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Heading,implemented,subheading,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Heading,implemented,levels-1-6,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Eyebrow,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Text,implemented,lead,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Text,implemented,body,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Text,implemented,supporting,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Text,implemented,caption,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Text,implemented,label,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Quote,implemented,with-citation,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Quote,implemented,without-citation,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Breadcrumbs,implemented,current-page,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SectionNavigation,implemented,current-location,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SectionNavigation,implemented,overflow,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FooterLinkGroup,implemented,resolved,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FooterLinkGroup,implemented,disabled,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,square,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,landscape,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,wide,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,portrait,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,auto,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,captioned,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MediaFrame,implemented,decorative,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ResponsiveImage,implemented,meaningful,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ResponsiveImage,implemented,decorative,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ResponsiveImage,implemented,captioned,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SectionHeader,implemented,start,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SectionHeader,implemented,center,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FeatureCard,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FeatureCard,implemented,primary,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FeatureCard,implemented,muted,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
FeatureGrid,implemented,responsive-grid,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SplitContent,implemented,default,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
SplitContent,implemented,reverse,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
MetricStrip,implemented,responsive-strip,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
LogoStripShell,implemented,empty-shell,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
LogoStripShell,implemented,content,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Workflow,implemented,numbered,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Workflow,implemented,icon,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Workflow,implemented,stacked,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Workflow,implemented,horizontal,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Comparison,implemented,problem-solution,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Comparison,implemented,stacked,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Comparison,implemented,two-column,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Metric,implemented,approved,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Metric,implemented,pending-review,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Metric,implemented,research-only,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
Metric,implemented,prohibited,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
EvidenceShell,implemented,approved,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
EvidenceShell,implemented,pending-review,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
EvidenceShell,implemented,research-only,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
EvidenceShell,implemented,prohibited,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
CTA,implemented,inline,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
CTA,implemented,card,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
CTA,implemented,section,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
CTA,implemented,primary-only,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
CTA,implemented,dual-action,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
CTA,implemented,disabled-destination,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ProductPreview,implemented,illustrative,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ProductPreview,implemented,empty,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
ProductPreview,implemented,responsive-table,Typed prop or semantic state,No arbitrary color or spacing override
|
||||
DemoForm,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
Toast,excluded,None,N/A,Blocked or excluded; see issue register
|
||||
PricingCard,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
TestimonialContent,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
CustomerLogoContent,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
ApprovedProductCapture,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
LoginDestination,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
SalesDestination,blocked,None,N/A,Blocked or excluded; see issue register
|
||||
|
@@ -0,0 +1,7 @@
|
||||
# Phase 13 Component Variant Update
|
||||
|
||||
## ProductPreview semantic heading level
|
||||
|
||||
`ProductPreview` now accepts an optional `headingLevel` prop using the existing `HeadingLevel` type. The default remains level 3, preserving all Phase 12 consumers. Phase 13 passes level 2 in the hero so the document outline moves from the page level-1 heading to the preview heading without skipping a semantic level.
|
||||
|
||||
This is a backward-compatible semantic variant. It does not add styling, raw tokens, duplicate components, or page-specific behavior to the component.
|
||||
@@ -0,0 +1,39 @@
|
||||
# Phase 13 Homepage Content Model
|
||||
|
||||
## Purpose
|
||||
|
||||
`src/content/homepage-model.ts` converts each locale catalog into one typed route-level object. The route consumes component semantics rather than translation-array positions or presentation-only flags.
|
||||
|
||||
## Inputs
|
||||
|
||||
- `src/content/locales/{en,fr,ar}/homepage.json`
|
||||
- `src/content/locales/{en,fr,ar}/shell.json`
|
||||
- Phase 12 component contracts for icons, preview rows, actions, cards, workflow, comparison, and CTA behavior
|
||||
|
||||
## Main types
|
||||
|
||||
- `HomepageContent`: complete route composition contract.
|
||||
- `HomepageAction`: action label plus mandatory unavailable reason for unresolved destinations.
|
||||
- `TitledDescription`: stable ID, title, description, and optional approved icon.
|
||||
- `HomepageWorkflowStep`: stable ID, ordinal, title, and description.
|
||||
- `HomepageFaqItem`: stable ID, question, and answer.
|
||||
|
||||
## Content transformation rules
|
||||
|
||||
1. Catalog messages remain complete localized strings. No runtime concatenation creates translatable sentences.
|
||||
2. Pair and triple helpers fail closed when required tuple content is absent.
|
||||
3. Product preview rows use fictional operational fixtures already present in locale catalogs.
|
||||
4. Vehicle identifiers remain separate `secondary` fields so `ProductPreview` isolates them with `BidiText`.
|
||||
5. Demo, tour, pricing, and sales actions remain disabled and carry localized reasons from the shell contract.
|
||||
6. Outcome metrics are represented as measurement definitions and methodology, not invented numeric values.
|
||||
7. Integrations, security certifications, pricing values, customer names, logos, and testimonials remain absent until governed approval exists.
|
||||
|
||||
## Route responsibilities
|
||||
|
||||
`src/app/[locale]/page.tsx` owns section order, headings, anchors, and composition. Components remain content-independent. Locale prefixes are generated with `localizedPath`; raw or guessed destinations are not permitted.
|
||||
|
||||
## Validation
|
||||
|
||||
- `tests/unit/homepage-content.test.ts` verifies locale completeness, unresolved destination behavior, and identifier isolation.
|
||||
- `scripts/validate-phase13-homepage.mjs` verifies approved composition, anchors, semantic tokens, route helpers, and required test artifacts.
|
||||
- Browser, accessibility, and visual scenarios are authored under `tests/browser`, `tests/a11y`, and `tests/visual`.
|
||||
@@ -0,0 +1,13 @@
|
||||
Order,Section,Anchor,Primary_components,Content_source,Evidence_policy,Destination_policy,Responsive_notes,Status
|
||||
1,Hero,product,"Heading; Text; ActionLink; ProductPreview",homepage.hero and homepage.preview,Illustrative preview only; no production capture,Demo and tour actions disabled until approved,"Two-column to single-column; 320px safe",Implemented
|
||||
2,Operational coverage,,"SectionHeader; FeatureGrid; FeatureCard",homepage.trust,Describes workflow coverage; not customer proof,None,"Four-card responsive grid",Implemented
|
||||
3,Fragmented versus connected,,"SectionHeader; Comparison",homepage.comparison,No quantified claims,None,"Two columns stack below 768px",Implemented
|
||||
4,Rental workflow,workflow,"SectionHeader; Workflow",homepage.workflow,No performance claims,None,"Horizontal adaptive workflow; stacked mobile",Implemented
|
||||
5,Operating roles,,"SectionHeader; FeatureGrid; FeatureCard",homepage.roles,No market-size claim,None,"Four-card responsive grid",Implemented
|
||||
6,Product modules,modules,"SectionHeader; FeatureGrid; FeatureCard",homepage.modules,Capability wording remains subject to product approval,None,"Six-card responsive grid",Implemented
|
||||
7,Measurement framework,,"SectionHeader; FeatureGrid; FeatureCard; Callout",homepage.results,Definitions and methodology only; no outcome values,None,"Cards reflow; methodology remains readable",Implemented
|
||||
8,Integrations,,"SectionHeader; Card; Icon list",homepage.integrations,Named partners suppressed until verified,None,"Two-column split to single-column",Implemented
|
||||
9,Security evaluation,,"SectionHeader; FeatureGrid; FeatureCard",homepage.security,No certification or SLA claims,None,"Four-card responsive grid",Implemented
|
||||
10,Pricing preview,pricing,"SectionHeader; Card; ActionLink",homepage.pricing,No public prices or discounts,Request-pricing action disabled until destination approval,"Two-column split to single-column",Implemented
|
||||
11,FAQ,faq,"SectionHeader; Accordion",homepage.faq,Answers preserve open qualification language,None,"Native details disclosures; reading-width container",Implemented
|
||||
12,Final CTA,,CTA,homepage.final,No unsupported conversion promise,Demo and sales actions disabled until approved,"Actions stack full-width on mobile",Implemented
|
||||
|
@@ -0,0 +1,18 @@
|
||||
Test_ID,Area,Environment,Viewport,Locale,Theme,Result,Evidence_or_blocker
|
||||
P11-MAN-001,Clean first load,Local Node 22.16.0,N/A,en,system,Blocked,"Pinned pnpm could not be downloaded; application server could not be built or started."
|
||||
P11-MAN-002,Theme persistence,Unblocked browser required,Desktop,en,light/dark/system,Blocked,"Covered by automated test code; execution requires installed dependencies and browser."
|
||||
P11-MAN-003,System theme response,Unblocked browser required,Desktop,en,system,Blocked,"CSP bootstrap and CSS fallback reviewed statically; browser execution pending."
|
||||
P11-MAN-004,Locale switching,Unblocked browser required,Desktop,fr,light,Blocked,"Semantic route-switch test authored; execution pending."
|
||||
P11-MAN-005,Direct localized routes,Static repository review,N/A,en/fr/ar,N/A,Pass,"Route manifest and runtime catch-all verified by node scripts/run-validations.mjs."
|
||||
P11-MAN-006,JavaScript delayed or unavailable,Unblocked browser required,Mobile,ar,system,Blocked,"No-JavaScript Playwright test authored; execution pending."
|
||||
P11-MAN-007,Keyboard-only navigation,Unblocked browser required,Desktop,en,light,Blocked,"Skip-link and drawer keyboard tests authored; execution pending."
|
||||
P11-MAN-008,Screen-reader landmarks,Assistive technology environment required,Desktop,en,light,Blocked,"Semantic landmarks and names reviewed; manual announcement test pending."
|
||||
P11-MAN-009,Zoom 200 and 400 percent,Unblocked browser required,320 CSS px,en/fr/ar,light/dark,Blocked,"Reflow tests authored at approved widths; manual browser zoom pending."
|
||||
P11-MAN-010,Arabic reading order,Static source review,All,ar,light/dark,Pass,"Server document dir is rtl; logical CSS validator passes 12 CSS files."
|
||||
P11-MAN-011,Mixed Arabic and Latin identifiers,Static unit design,N/A,ar,N/A,Pass,"BidiText primitive and identifier preservation utility implemented; browser announcement pending."
|
||||
P11-MAN-012,Forced colors,Unblocked Windows browser required,Desktop,en,light,Blocked,"Forced-colors CSS exists; manual Windows verification pending."
|
||||
P11-MAN-013,Reduced motion,Static source review,All,en/fr/ar,light/dark,Pass,"Global and skeleton reduced-motion rules are present and validator-clean."
|
||||
P11-MAN-014,Mobile navigation,Unblocked browser required,390 px,ar,dark,Blocked,"Native dialog, Escape, focus return, and background lock test authored; execution pending."
|
||||
P11-MAN-015,Long French and Arabic labels,Static content review,320 px,fr/ar,light/dark,Pass,"Content-driven layouts, wrapping, and no fixed text heights; browser overflow execution pending."
|
||||
P11-MAN-016,Back and forward navigation,Unblocked browser required,Desktop,en/fr,light,Blocked,"Browser execution pending."
|
||||
P11-MAN-017,Production build,Node 24.17.0 and pnpm 11.9.0 required,N/A,en/fr/ar,light/dark,Blocked,"Current host Node is 22.16.0 and registry fetch failed."
|
||||
|
@@ -0,0 +1,47 @@
|
||||
$ node --version
|
||||
v22.16.0
|
||||
|
||||
$ corepack --version
|
||||
0.32.0
|
||||
|
||||
$ corepack prepare pnpm@11.9.0 --activate
|
||||
Preparing pnpm@11.9.0 for immediate activation...
|
||||
Internal Error: Error when performing the request to https://registry.npmjs.org/pnpm/-/pnpm-11.9.0.tgz; for troubleshooting help, see https://github.com/nodejs/corepack#troubleshooting
|
||||
at fetch (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:22051:11)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
|
||||
at async fetchUrlStream (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:22081:20)
|
||||
at async download (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:22204:18)
|
||||
at async installVersion (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:22296:55)
|
||||
at async Engine.ensurePackageManager (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:22847:32)
|
||||
at async PrepareCommand.execute (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:23567:27)
|
||||
at async PrepareCommand.validateAndExecute (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:20258:22)
|
||||
at async _Cli.run (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:21195:18)
|
||||
at async Object.runMain (/opt/nvm/versions/node/v22.16.0/lib/node_modules/corepack/dist/lib/corepack.cjs:23642:19)
|
||||
exit=1
|
||||
|
||||
$ node scripts/run-validations.mjs
|
||||
PASS: Phase 9 contract package is immutable and 61 payload checksums match.
|
||||
PASS: Pinned Node 24.17.0, pnpm 11.9.0, and 25 exact direct dependency versions match the lockfile.
|
||||
PASS: English, French, and Arabic catalogs have exact key parity and valid direction metadata.
|
||||
PASS: 5 route IDs have complete locale, runtime, hash, query, and hreflang contracts.
|
||||
PASS: Phase 9 semantic tokens are unchanged and application styles contain no raw palette colors.
|
||||
PASS: Phase 11 component tokens, theme fallback, and application-shell foundations are present.
|
||||
PASS: 12 CSS files use direction-safe logical declarations.
|
||||
PASS: Runtime source contains no placeholder destination, simulated submission, or research-only backdoor.
|
||||
PASS: Localized canonical, hreflang, Open Graph, social, and robots foundations are present.
|
||||
exit=0
|
||||
|
||||
$ for f in scripts/*.mjs; do node --check "$f"; done
|
||||
checked=17 failures=0
|
||||
|
||||
$ JSON parse scan
|
||||
parsed=27 failures=0
|
||||
|
||||
$ TypeScript transpileModule syntax scan
|
||||
transpiled=62 compiler=5.8.3 syntax_failures=0
|
||||
|
||||
$ node scripts/generate-phase11-manifest.mjs
|
||||
Generated Phase 11 manifest for 201 files.
|
||||
|
||||
$ node scripts/validate-phase11-manifest.mjs
|
||||
PASS: Phase 11 package manifest verifies 201 repository files with no extras.
|
||||
@@ -0,0 +1,89 @@
|
||||
# Phase 11 repository delta against the authoritative Phase 10 ZIP
|
||||
added=55
|
||||
modified=24
|
||||
removed=0
|
||||
|
||||
[ADDED]
|
||||
CONTRIBUTING.md
|
||||
PHASE_11_PACKAGE_MANIFEST_v1.0.json
|
||||
docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv
|
||||
docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md
|
||||
docs/PHASE_12_HANDOFF_v1.0.md
|
||||
docs/TOKEN_IMPLEMENTATION_v1.0.md
|
||||
docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md
|
||||
docs/quality/MANUAL_QA_RESULTS_v1.0.csv
|
||||
docs/quality/PHASE_11_COMMAND_LOG_v1.0.txt
|
||||
docs/quality/PHASE_11_FILE_CHANGES_v1.0.txt
|
||||
docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.json
|
||||
docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md
|
||||
docs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json
|
||||
scripts/generate-phase11-manifest.mjs
|
||||
scripts/validate-metadata.mjs
|
||||
scripts/validate-phase11-foundation.mjs
|
||||
scripts/validate-phase11-manifest.mjs
|
||||
scripts/validate-runtime-dependencies.mjs
|
||||
src/app/[locale]/[slug]/page.tsx
|
||||
src/app/[locale]/error.tsx
|
||||
src/app/[locale]/loading.tsx
|
||||
src/app/[locale]/not-found.tsx
|
||||
src/components/app-shell/BrandLink.tsx
|
||||
src/components/app-shell/Controls.module.css
|
||||
src/components/app-shell/DisabledAction.tsx
|
||||
src/components/app-shell/HeaderNavigation.tsx
|
||||
src/components/app-shell/LocalizedLoading.tsx
|
||||
src/components/app-shell/LocalizedNotFound.tsx
|
||||
src/components/app-shell/MobileNavigation.tsx
|
||||
src/components/app-shell/SiteFooter.module.css
|
||||
src/components/app-shell/SiteFooter.tsx
|
||||
src/components/app-shell/StateShell.module.css
|
||||
src/components/app-shell/StateShell.tsx
|
||||
src/components/foundation/AccessibleIcon.tsx
|
||||
src/components/foundation/BidiText.module.css
|
||||
src/components/foundation/BidiText.tsx
|
||||
src/components/foundation/LiveRegion.module.css
|
||||
src/components/foundation/LiveRegion.tsx
|
||||
src/components/foundation/StatusBadge.module.css
|
||||
src/components/foundation/StatusBadge.tsx
|
||||
src/components/layout/LayoutPrimitives.module.css
|
||||
src/components/layout/LayoutPrimitives.tsx
|
||||
src/lib/localization/client-messages.ts
|
||||
src/lib/localization/client.ts
|
||||
src/lib/localization/format.ts
|
||||
src/lib/metadata/build-metadata.ts
|
||||
src/styles/component-tokens.css
|
||||
tests/browser/navigation.spec.ts
|
||||
tests/browser/no-javascript.spec.ts
|
||||
tests/browser/responsive.spec.ts
|
||||
tests/browser/text-expansion.spec.ts
|
||||
tests/fixtures/README.md
|
||||
tests/fixtures/foundation-matrix.json
|
||||
tests/unit/format.test.ts
|
||||
tests/visual/README.md
|
||||
|
||||
[MODIFIED]
|
||||
.github/workflows/ci.yml
|
||||
README.md
|
||||
package.json
|
||||
scripts/run-validations.mjs
|
||||
scripts/validate-prohibited-content.mjs
|
||||
scripts/validate-routes.mjs
|
||||
src/app/[locale]/layout.tsx
|
||||
src/app/[locale]/page.module.css
|
||||
src/app/[locale]/page.tsx
|
||||
src/components/app-shell/LocaleSelector.tsx
|
||||
src/components/app-shell/SiteHeader.module.css
|
||||
src/components/app-shell/SiteHeader.tsx
|
||||
src/components/app-shell/ThemeSelector.tsx
|
||||
src/content/locales/ar/shell.json
|
||||
src/content/locales/en/shell.json
|
||||
src/content/locales/fr/shell.json
|
||||
src/lib/localization/config.ts
|
||||
src/lib/theme/client.ts
|
||||
src/proxy.ts
|
||||
src/styles/globals.css
|
||||
tests/browser/shell.spec.ts
|
||||
tests/browser/theme-csp.spec.ts
|
||||
tests/unit/localization.test.ts
|
||||
tests/visual/shell.visual.spec.ts
|
||||
|
||||
[REMOVED]
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"phase": 11,
|
||||
"date": "2026-06-25",
|
||||
"host_runtime": {
|
||||
"node": "22.16.0",
|
||||
"required_node": "24.17.0",
|
||||
"required_pnpm": "11.9.0"
|
||||
},
|
||||
"passed": [
|
||||
{
|
||||
"command": "node scripts/run-validations.mjs",
|
||||
"gates": 9
|
||||
},
|
||||
{
|
||||
"command": "for f in scripts/*.mjs; do node --check \"$f\"; done",
|
||||
"files": 17
|
||||
},
|
||||
{
|
||||
"command": "JSON parse scan",
|
||||
"files": 27
|
||||
},
|
||||
{
|
||||
"command": "TypeScript transpileModule syntax scan",
|
||||
"files": 62,
|
||||
"compiler": "5.8.3"
|
||||
},
|
||||
{
|
||||
"command": "Phase 9 package validator",
|
||||
"checksums": 61
|
||||
},
|
||||
{
|
||||
"command": "node scripts/validate-phase11-manifest.mjs",
|
||||
"files": 201,
|
||||
"unlisted_extras": 0
|
||||
}
|
||||
],
|
||||
"blocked": [
|
||||
"pnpm install --frozen-lockfile",
|
||||
"pnpm format:check",
|
||||
"pnpm lint",
|
||||
"pnpm typecheck",
|
||||
"pnpm test:unit",
|
||||
"pnpm build",
|
||||
"pnpm test:e2e",
|
||||
"pnpm test:visual:update --project=chromium",
|
||||
"pnpm audit --audit-level low"
|
||||
],
|
||||
"blocker": "corepack prepare pnpm@11.9.0 --activate failed while fetching the pnpm tarball from registry.npmjs.org",
|
||||
"all_tests_passed_claimed": false
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
# Phase 11 Validation Results
|
||||
|
||||
## Environment
|
||||
|
||||
- Date: 2026-06-25
|
||||
- Host Node.js: `22.16.0`
|
||||
- Required Node.js: `24.17.0`
|
||||
- Required pnpm: `11.9.0`
|
||||
|
||||
## Executed successfully
|
||||
|
||||
### Repository validation
|
||||
|
||||
```bash
|
||||
node scripts/run-validations.mjs
|
||||
```
|
||||
|
||||
Result: **9 of 9 static gates passed**.
|
||||
|
||||
1. Immutable Phase 9 contract: 61 payload checksums matched.
|
||||
2. Runtime and dependencies: Node 24.17.0, pnpm 11.9.0, and 25 exact direct versions match the lockfile.
|
||||
3. Locale catalogs: exact English, French, and Arabic key parity and direction metadata.
|
||||
4. Routes: 5 route IDs with locale, runtime, hash, query, and `hreflang` coverage.
|
||||
5. Phase 9 tokens: source unchanged and no raw palette literals introduced.
|
||||
6. Phase 11 foundations: required component tokens, CSS system fallback, and shell files present.
|
||||
7. Logical CSS: 12 CSS files passed physical-direction rejection.
|
||||
8. Prohibited content: no placeholder destination, simulated submission, or research backdoor.
|
||||
9. Metadata: canonical, reciprocal `hreflang`, Open Graph, social, and release-safe robots foundations present.
|
||||
|
||||
### TypeScript syntax scan
|
||||
|
||||
All 62 repository `.ts` and `.tsx` implementation/test files were transpiled with the host global TypeScript compiler using `transpileModule`. Result: **syntax passed**.
|
||||
|
||||
This is not a substitute for the repository’s strict TypeScript 6.0.3 project check.
|
||||
|
||||
## Blocked commands
|
||||
|
||||
The following command was attempted:
|
||||
|
||||
```bash
|
||||
corepack prepare pnpm@11.9.0 --activate
|
||||
```
|
||||
|
||||
It failed while fetching `https://registry.npmjs.org/pnpm/-/pnpm-11.9.0.tgz`. Therefore dependency installation was unavailable and these gates were not executed:
|
||||
|
||||
```bash
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm format:check
|
||||
pnpm lint
|
||||
pnpm typecheck
|
||||
pnpm test:unit
|
||||
SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false pnpm build
|
||||
pnpm audit --audit-level low
|
||||
pnpm test:e2e
|
||||
pnpm test:visual:update --project=chromium
|
||||
```
|
||||
|
||||
No claim is made that those tests passed. P11-001, P11-002, and P11-003 remain release gates.
|
||||
|
||||
## Raw command evidence
|
||||
|
||||
Exact local command output is preserved in `docs/quality/PHASE_11_COMMAND_LOG_v1.0.txt`. The generated Phase 11 manifest was also verified successfully against 201 repository payload files with no unlisted extras.
|
||||
@@ -0,0 +1,76 @@
|
||||
Phase 12 command log
|
||||
Date: 2026-06-25
|
||||
Executed host: Node 22.16.0; target: Node 24.17.0; pnpm 11.9.0
|
||||
|
||||
COMMAND: pnpm install --frozen-lockfile
|
||||
STATUS: environment-blocked
|
||||
EXIT: N/A
|
||||
EVIDENCE: docs/quality/logs/pnpm-install-frozen.log
|
||||
WARNINGS: registry DNS EAI_AGAIN; process terminated after retries
|
||||
|
||||
COMMAND: npm install --engine-strict=false --ignore-scripts --package-lock=false --no-audit --no-fund
|
||||
STATUS: fallback-pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/npm-install-fallback.log
|
||||
WARNINGS: Node engine mismatch; does not satisfy frozen pnpm gate
|
||||
|
||||
COMMAND: npm run validate
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/validate.log
|
||||
|
||||
COMMAND: npm run format:check
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/format-check.log
|
||||
|
||||
COMMAND: npm run lint
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/lint.log
|
||||
|
||||
COMMAND: npm run typecheck
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/typecheck.log
|
||||
|
||||
COMMAND: npm run test:unit
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/unit.log
|
||||
|
||||
COMMAND: npm run build (without SITE_ORIGIN)
|
||||
STATUS: expected-fail-closed
|
||||
EXIT: 1
|
||||
EVIDENCE: docs/quality/logs/build-missing-site-origin.log
|
||||
WARNINGS: Production metadata rejected the missing canonical origin as designed.
|
||||
|
||||
COMMAND: SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false npm run build
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/logs/build.log
|
||||
WARNINGS: Local evidence origin only; production origin remains P10-001.
|
||||
|
||||
COMMAND: standalone server + curl locale/component-lab matrix
|
||||
STATUS: pass
|
||||
EXIT: 0
|
||||
EVIDENCE: docs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json
|
||||
|
||||
COMMAND: playwright test tests/browser tests/a11y --project=chromium
|
||||
STATUS: environment-blocked
|
||||
EXIT: N/A
|
||||
EVIDENCE: docs/quality/logs/playwright-browser-a11y.log
|
||||
WARNINGS: Chromium rejected loopback navigation with net::ERR_BLOCKED_BY_ADMINISTRATOR
|
||||
|
||||
COMMAND: playwright test tests/visual --project=chromium --update-snapshots
|
||||
STATUS: not-run-after-shared-blocker
|
||||
EXIT: N/A
|
||||
EVIDENCE: docs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json
|
||||
WARNINGS: Same loopback policy blocks image capture
|
||||
|
||||
COMMAND: pnpm audit --audit-level low
|
||||
STATUS: environment-blocked
|
||||
EXIT: 124
|
||||
EVIDENCE: docs/quality/logs/pnpm-audit.log
|
||||
WARNINGS: registry DNS EAI_AGAIN; timed out during retry delay
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
Phase 11 to Phase 12 repository comparison
|
||||
|
||||
Files /tmp/phase11_original/RentalDriveGo/README.md and /mnt/data/phase12_work/RentalDriveGo/README.md differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs: DECISION_LOG_v12.0.md
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs: IMPLEMENTATION_ISSUE_REGISTER_v1.2.csv
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs: PHASE_12_IMPLEMENTATION_REPORT_v1.0.md
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs: PHASE_13_HANDOFF_v1.0.md
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/architecture: ADR-0003_PHASE_12_COMPONENT_SYSTEM.md
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs: phase12
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: PHASE_12_COMMAND_LOG_v1.0.txt
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: PHASE_12_MANUAL_QA_RESULTS_v1.0.csv
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: PHASE_12_VALIDATION_RESULTS_v1.0.json
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: PHASE_12_VALIDATION_RESULTS_v1.0.md
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/quality: logs
|
||||
Files /tmp/phase11_original/RentalDriveGo/package.json and /mnt/data/phase12_work/RentalDriveGo/package.json differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/playwright.config.ts and /mnt/data/phase12_work/RentalDriveGo/playwright.config.ts differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/scripts: generate-phase12-manifest.mjs
|
||||
Files /tmp/phase11_original/RentalDriveGo/scripts/run-validations.mjs and /mnt/data/phase12_work/RentalDriveGo/scripts/run-validations.mjs differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/scripts: validate-phase12-components.mjs
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/scripts: validate-phase12-manifest.mjs
|
||||
Files /tmp/phase11_original/RentalDriveGo/scripts/validate-runtime-dependencies.mjs and /mnt/data/phase12_work/RentalDriveGo/scripts/validate-runtime-dependencies.mjs differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/app/[locale]: component-lab
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/app/[locale]/layout.tsx and /mnt/data/phase12_work/RentalDriveGo/src/app/[locale]/layout.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: actions
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/app-shell/SiteHeader.tsx and /mnt/data/phase12_work/RentalDriveGo/src/components/app-shell/SiteHeader.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: controls
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: feedback
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: forms
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/foundation/BidiText.tsx and /mnt/data/phase12_work/RentalDriveGo/src/components/foundation/BidiText.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: Icon.module.css
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: Icon.tsx
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/foundation/StatusBadge.module.css and /mnt/data/phase12_work/RentalDriveGo/src/components/foundation/StatusBadge.module.css differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/foundation/StatusBadge.tsx and /mnt/data/phase12_work/RentalDriveGo/src/components/foundation/StatusBadge.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: VisuallyHidden.tsx
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: client-hooks.ts
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: marketing
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: media
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: navigation
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: overlays
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: surfaces
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: typography
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/content: development
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/content/locales/ar/shell.json and /mnt/data/phase12_work/RentalDriveGo/src/content/locales/ar/shell.json differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/content/locales/en/shell.json and /mnt/data/phase12_work/RentalDriveGo/src/content/locales/en/shell.json differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/content/locales/fr/shell.json and /mnt/data/phase12_work/RentalDriveGo/src/content/locales/fr/shell.json differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/lib: components
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/lib/localization/client.ts and /mnt/data/phase12_work/RentalDriveGo/src/lib/localization/client.ts differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/a11y: component-system.a11y.spec.ts
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/browser: component-system.spec.ts
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/browser/responsive.spec.ts and /mnt/data/phase12_work/RentalDriveGo/tests/browser/responsive.spec.ts differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/browser/text-expansion.spec.ts and /mnt/data/phase12_work/RentalDriveGo/tests/browser/text-expansion.spec.ts differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/browser/theme-csp.spec.ts and /mnt/data/phase12_work/RentalDriveGo/tests/browser/theme-csp.spec.ts differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/fixtures: component-system
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/fixtures/foundation-matrix.json and /mnt/data/phase12_work/RentalDriveGo/tests/fixtures/foundation-matrix.json differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests: types
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/unit: components
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/visual: component-system.visual.spec.ts
|
||||
Files /tmp/phase11_original/RentalDriveGo/tsconfig.json and /mnt/data/phase12_work/RentalDriveGo/tsconfig.json differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo: tsconfig.tsbuildinfo
|
||||
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"route": "/en",
|
||||
"curl_exit": 0,
|
||||
"status": "200",
|
||||
"lang": "en",
|
||||
"dir": "ltr",
|
||||
"bytes": 41826,
|
||||
"contains_error_page": false
|
||||
},
|
||||
{
|
||||
"route": "/fr",
|
||||
"curl_exit": 0,
|
||||
"status": "200",
|
||||
"lang": "fr",
|
||||
"dir": "ltr",
|
||||
"bytes": 45433,
|
||||
"contains_error_page": false
|
||||
},
|
||||
{
|
||||
"route": "/ar",
|
||||
"curl_exit": 0,
|
||||
"status": "200",
|
||||
"lang": "ar",
|
||||
"dir": "rtl",
|
||||
"bytes": 48540,
|
||||
"contains_error_page": false
|
||||
},
|
||||
{
|
||||
"route": "/en/component-lab",
|
||||
"curl_exit": 0,
|
||||
"status": "200",
|
||||
"lang": "en",
|
||||
"dir": "ltr",
|
||||
"bytes": 68056,
|
||||
"contains_error_page": false
|
||||
},
|
||||
{
|
||||
"route": "/fr/component-lab",
|
||||
"curl_exit": 0,
|
||||
"status": "200",
|
||||
"lang": "fr",
|
||||
"dir": "ltr",
|
||||
"bytes": 71005,
|
||||
"contains_error_page": false
|
||||
},
|
||||
{
|
||||
"route": "/ar/component-lab",
|
||||
"curl_exit": 0,
|
||||
"status": "200",
|
||||
"lang": "ar",
|
||||
"dir": "rtl",
|
||||
"bytes": 74483,
|
||||
"contains_error_page": false
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,21 @@
|
||||
Test_ID,Area,Environment,Viewport,Locale,Theme,Result,Evidence_or_blocker
|
||||
P12-MAN-001,Buttons and links,Source review + Vitest,N/A,en/fr/ar,light/dark,Pass,"Native semantics, loading protection, accessible icon-only labels, disabled destinations, and directional icon behavior covered by source and unit tests."
|
||||
P12-MAN-002,Form controls,Source review + Vitest,N/A,en/fr/ar,light/dark,Pass,"Programmatic labels, required state, help/error descriptions, invalid state, and field grouping pass unit assertions."
|
||||
P12-MAN-003,Tabs,Source review + Vitest,N/A,en/ar,light/dark,Pass,Roving selection and direction-aware arrow behavior pass unit interaction tests.
|
||||
P12-MAN-004,Accordion,Source review + Vitest,N/A,en/fr/ar,light/dark,Pass,Native details/summary semantics and expanded state verified.
|
||||
P12-MAN-005,Dialog and drawer,Chromium required,Desktop/mobile,en/fr/ar,light/dark,Blocked,"Focus trap, Escape, inert background, scroll lock, and focus return tests are authored; Chromium loopback navigation is administrator-blocked."
|
||||
P12-MAN-006,Dropdown menu and tooltip,Chromium required,Desktop/mobile,en/fr/ar,light/dark,Blocked,Keyboard/pointer/touch and announcement observations require an unblocked browser.
|
||||
P12-MAN-007,Alerts and loading,Source review,All,en/fr/ar,light/dark,Pass,Live-region behavior is explicit; decorative loading is not repeatedly announced; reduced-motion CSS is present.
|
||||
P12-MAN-008,Interactive cards,Source review,All,en/fr/ar,light/dark,Pass,Valid link/button semantics enforced; nested interactive usage prohibited in documentation.
|
||||
P12-MAN-009,Workflow pattern,Source review + server HTML,All,en/fr/ar,light/dark,Pass,DOM and reading order remain chronological; connectors are decorative and logical-property based.
|
||||
P12-MAN-010,Comparison pattern,Source review + server HTML,All,en/fr/ar,light/dark,Pass,Semantic list structure remains understandable without color; mobile order is explicit.
|
||||
P12-MAN-011,Product preview tables,Source review + server HTML,All,en/fr/ar,light/dark,Pass,"Fictional deterministic fixtures, captions, responsive wrapper, and bidi isolation are present."
|
||||
P12-MAN-012,CTA patterns,Source review + server HTML,All,en/fr/ar,light/dark,Pass,"One dominant action, disabled unresolved destinations, stacked layout, and localized content inputs verified."
|
||||
P12-MAN-013,Localized route rendering,Standalone server + curl,Server,en/fr/ar,N/A,Pass,Six routes returned HTTP 200 with correct lang and dir; Arabic returned document-level rtl.
|
||||
P12-MAN-014,Keyboard-only full flow,Chromium + human operator required,Desktop/mobile,en/fr/ar,light/dark,Blocked,"Automated scenarios exist, but browser navigation is rejected before page load."
|
||||
P12-MAN-015,Screen-reader review,NVDA/JAWS/VoiceOver required,Desktop/mobile,en/fr/ar,light/dark,Blocked,Manual announcements and virtual-cursor reading order remain P12-005.
|
||||
P12-MAN-016,Touch simulation,Chromium/WebKit required,Mobile,en/fr/ar,light/dark,Blocked,Browser matrix could not reach loopback pages.
|
||||
P12-MAN-017,200 percent zoom,Browser required,320 CSS px,en/fr/ar,light/dark,Blocked,Reflow scenario authored; browser execution blocked.
|
||||
P12-MAN-018,400 percent zoom,Browser + human operator required,320 CSS px,en/fr/ar,light/dark,Blocked,Manual acceptance remains P12-005.
|
||||
P12-MAN-019,Reduced motion,Static CSS + source review,All,en/fr/ar,light/dark,Pass,Transitions and loading treatments respect prefers-reduced-motion.
|
||||
P12-MAN-020,Forced colors,Windows high-contrast environment required,Desktop,en/fr/ar,light/dark,Blocked,Focus and border fallbacks are authored; manual Windows verification remains open.
|
||||
|
@@ -0,0 +1,162 @@
|
||||
{
|
||||
"phase": 12,
|
||||
"date": "2026-06-25",
|
||||
"runtime": {
|
||||
"executedNode": "22.16.0",
|
||||
"targetNode": "24.17.0",
|
||||
"pnpm": "11.9.0"
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"command": "pnpm install --frozen-lockfile",
|
||||
"exitCode": null,
|
||||
"status": "environment-blocked",
|
||||
"testCount": 0,
|
||||
"passCount": 0,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": ["registry DNS EAI_AGAIN; process terminated after retries"],
|
||||
"evidence": "docs/quality/logs/pnpm-install-frozen.log"
|
||||
},
|
||||
{
|
||||
"command": "npm install --engine-strict=false --ignore-scripts --package-lock=false --no-audit --no-fund",
|
||||
"exitCode": 0,
|
||||
"status": "fallback-pass",
|
||||
"testCount": 0,
|
||||
"passCount": 0,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": ["Node engine mismatch; does not satisfy frozen pnpm gate"],
|
||||
"evidence": "docs/quality/logs/npm-install-fallback.log"
|
||||
},
|
||||
{
|
||||
"command": "npm run validate",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 10,
|
||||
"passCount": 10,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": [],
|
||||
"evidence": "docs/quality/logs/validate.log"
|
||||
},
|
||||
{
|
||||
"command": "npm run format:check",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 1,
|
||||
"passCount": 1,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": [],
|
||||
"evidence": "docs/quality/logs/format-check.log"
|
||||
},
|
||||
{
|
||||
"command": "npm run lint",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 1,
|
||||
"passCount": 1,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": [],
|
||||
"evidence": "docs/quality/logs/lint.log"
|
||||
},
|
||||
{
|
||||
"command": "npm run typecheck",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 1,
|
||||
"passCount": 1,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": [],
|
||||
"evidence": "docs/quality/logs/typecheck.log"
|
||||
},
|
||||
{
|
||||
"command": "npm run test:unit",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 22,
|
||||
"passCount": 22,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": [],
|
||||
"evidence": "docs/quality/logs/unit.log"
|
||||
},
|
||||
{
|
||||
"command": "npm run build (without SITE_ORIGIN)",
|
||||
"exitCode": 1,
|
||||
"status": "expected-fail-closed",
|
||||
"testCount": 1,
|
||||
"passCount": 1,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": ["Production metadata rejected the missing canonical origin as designed."],
|
||||
"evidence": "docs/quality/logs/build-missing-site-origin.log"
|
||||
},
|
||||
{
|
||||
"command": "SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false npm run build",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 1,
|
||||
"passCount": 1,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": ["Local evidence origin only; production origin remains P10-001."],
|
||||
"evidence": "docs/quality/logs/build.log"
|
||||
},
|
||||
{
|
||||
"command": "standalone server + curl locale/component-lab matrix",
|
||||
"exitCode": 0,
|
||||
"status": "pass",
|
||||
"testCount": 6,
|
||||
"passCount": 6,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": [],
|
||||
"evidence": "docs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json"
|
||||
},
|
||||
{
|
||||
"command": "playwright test tests/browser tests/a11y --project=chromium",
|
||||
"exitCode": null,
|
||||
"status": "environment-blocked",
|
||||
"testCount": 44,
|
||||
"passCount": 0,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 44,
|
||||
"warnings": ["Chromium rejected loopback navigation with net::ERR_BLOCKED_BY_ADMINISTRATOR"],
|
||||
"evidence": "docs/quality/logs/playwright-browser-a11y.log"
|
||||
},
|
||||
{
|
||||
"command": "playwright test tests/visual --project=chromium --update-snapshots",
|
||||
"exitCode": null,
|
||||
"status": "not-run-after-shared-blocker",
|
||||
"testCount": 0,
|
||||
"passCount": 0,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": ["Same loopback policy blocks image capture"],
|
||||
"evidence": "docs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json"
|
||||
},
|
||||
{
|
||||
"command": "pnpm audit --audit-level low",
|
||||
"exitCode": 124,
|
||||
"status": "environment-blocked",
|
||||
"testCount": 0,
|
||||
"passCount": 0,
|
||||
"failureCount": 0,
|
||||
"skippedCount": 0,
|
||||
"warnings": ["registry DNS EAI_AGAIN; timed out during retry delay"],
|
||||
"evidence": "docs/quality/logs/pnpm-audit.log"
|
||||
}
|
||||
],
|
||||
"unitCoverage": {
|
||||
"statements": 92.4,
|
||||
"branches": 86.04,
|
||||
"functions": 95.45,
|
||||
"lines": 92.64
|
||||
},
|
||||
"releaseAcceptance": "blocked",
|
||||
"blockingIssues": ["P12-001", "P12-002", "P12-003", "P12-004", "P12-005"]
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
# Phase 12 Validation Results
|
||||
|
||||
Date: 2026-06-25
|
||||
|
||||
| Command | Status | Exit | Tests | Passed | Failed | Skipped | Evidence |
|
||||
| ---------------------------------------------------------------------------------------------- | ---------------------------- | ---: | ----: | -----: | -----: | ------: | ----------------------------------------------------------- |
|
||||
| `pnpm install --frozen-lockfile` | environment-blocked | N/A | 0 | 0 | 0 | 0 | `docs/quality/logs/pnpm-install-frozen.log` |
|
||||
| `npm install --engine-strict=false --ignore-scripts --package-lock=false --no-audit --no-fund` | fallback-pass | 0 | 0 | 0 | 0 | 0 | `docs/quality/logs/npm-install-fallback.log` |
|
||||
| `npm run validate` | pass | 0 | 10 | 10 | 0 | 0 | `docs/quality/logs/validate.log` |
|
||||
| `npm run format:check` | pass | 0 | 1 | 1 | 0 | 0 | `docs/quality/logs/format-check.log` |
|
||||
| `npm run lint` | pass | 0 | 1 | 1 | 0 | 0 | `docs/quality/logs/lint.log` |
|
||||
| `npm run typecheck` | pass | 0 | 1 | 1 | 0 | 0 | `docs/quality/logs/typecheck.log` |
|
||||
| `npm run test:unit` | pass | 0 | 22 | 22 | 0 | 0 | `docs/quality/logs/unit.log` |
|
||||
| `npm run build (without SITE_ORIGIN)` | expected-fail-closed | 1 | 1 | 1 | 0 | 0 | `docs/quality/logs/build-missing-site-origin.log` |
|
||||
| `SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false npm run build` | pass | 0 | 1 | 1 | 0 | 0 | `docs/quality/logs/build.log` |
|
||||
| `standalone server + curl locale/component-lab matrix` | pass | 0 | 6 | 6 | 0 | 0 | `docs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json` |
|
||||
| `playwright test tests/browser tests/a11y --project=chromium` | environment-blocked | N/A | 44 | 0 | 0 | 44 | `docs/quality/logs/playwright-browser-a11y.log` |
|
||||
| `playwright test tests/visual --project=chromium --update-snapshots` | not-run-after-shared-blocker | N/A | 0 | 0 | 0 | 0 | `docs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json` |
|
||||
| `pnpm audit --audit-level low` | environment-blocked | 124 | 0 | 0 | 0 | 0 | `docs/quality/logs/pnpm-audit.log` |
|
||||
|
||||
Unit coverage: 92.40% statements, 86.04% branches, 95.45% functions, and 92.64% lines.
|
||||
|
||||
The production build intentionally fails without `SITE_ORIGIN`; the successful local evidence build used `http://127.0.0.1:3000`. Release acceptance remains blocked by P12-001 through P12-005. The source implementation is ready for Phase 13 development, but browser, visual, target-runtime, audit, and manual assistive-technology evidence still requires an unblocked pinned environment.
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"phase": 12,
|
||||
"date": "2026-06-25",
|
||||
"status": "environment-blocked",
|
||||
"authoredScenarios": [
|
||||
"component variants",
|
||||
"light and dark",
|
||||
"English French Arabic",
|
||||
"desktop and mobile",
|
||||
"focus-visible",
|
||||
"error",
|
||||
"long content",
|
||||
"RTL arrangements"
|
||||
],
|
||||
"execution": {
|
||||
"attempted": true,
|
||||
"browser": "system Chromium",
|
||||
"result": "blocked",
|
||||
"error": "net::ERR_BLOCKED_BY_ADMINISTRATOR for loopback navigation"
|
||||
},
|
||||
"baselinesGenerated": false,
|
||||
"issue": "P12-002"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
2026-06-25 | node --version | PASS | v22.16.0; target 24.17.0 remains unverified
|
||||
2026-06-25 | npx --yes pnpm@11.9.0 --version | PASS | 11.9.0
|
||||
2026-06-25 | pnpm install --frozen-lockfile --config.engine-strict=false | BLOCKED | lockfile current; registry EAI_AGAIN prevented completion
|
||||
2026-06-25 | npm run validate | PASS | Phase 9-13 static controls passed
|
||||
2026-06-25 | npm run format:check | PASS | all files formatted
|
||||
2026-06-25 | npm run lint | PASS | zero warnings
|
||||
2026-06-25 | npm run typecheck | PASS | strict TypeScript passed
|
||||
2026-06-25 | npm run test:unit | PASS | 27 tests, 9 files, thresholds passed
|
||||
2026-06-25 | SITE_ORIGIN=https://approved.invalid npm run build | PASS | production build and standalone preparation passed
|
||||
2026-06-25 | Playwright homepage Chromium suite | BLOCKED | net::ERR_BLOCKED_BY_ADMINISTRATOR for loopback navigation
|
||||
2026-06-25 | standalone HTTP EN/FR/AR checks | PASS | HTTP 200, correct lang/dir, localized hero payload present
|
||||
2026-06-25 | pnpm audit --audit-level low | BLOCKED | registry connectivity did not permit completion
|
||||
2026-06-25 | npm run manifest:generate | PASS | Phase 13 manifest generated
|
||||
2026-06-25 | npm run validate:package | PASS | manifest verified with no extras
|
||||
@@ -0,0 +1,26 @@
|
||||
A PHASE_13_PACKAGE_MANIFEST_v1.0.json
|
||||
A docs/DECISION_LOG_v13.0.md
|
||||
A docs/IMPLEMENTATION_ISSUE_REGISTER_v1.3.csv
|
||||
A docs/PHASE_13_IMPLEMENTATION_REPORT_v1.0.md
|
||||
A docs/phase13/COMPONENT_VARIANT_UPDATE_v1.0.md
|
||||
A docs/phase13/HOMEPAGE_CONTENT_MODEL_v1.0.md
|
||||
A docs/phase13/HOMEPAGE_SECTION_MATRIX_v1.0.csv
|
||||
A docs/quality/PHASE_13_COMMAND_LOG_v1.0.txt
|
||||
A docs/quality/PHASE_13_FILE_CHANGES_v1.0.txt
|
||||
A docs/quality/PHASE_13_HTTP_ROUTE_RESULTS_v1.0.json
|
||||
A docs/quality/PHASE_13_MANUAL_QA_RESULTS_v1.0.csv
|
||||
A docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.json
|
||||
A docs/quality/PHASE_13_VALIDATION_RESULTS_v1.0.md
|
||||
A scripts/generate-phase13-manifest.mjs
|
||||
A scripts/validate-phase13-homepage.mjs
|
||||
A scripts/validate-phase13-manifest.mjs
|
||||
A src/content/homepage-model.ts
|
||||
A tests/a11y/homepage.a11y.spec.ts
|
||||
A tests/browser/homepage.spec.ts
|
||||
A tests/unit/homepage-content.test.ts
|
||||
A tests/visual/homepage.visual.spec.ts
|
||||
M package.json
|
||||
M scripts/run-validations.mjs
|
||||
M src/app/[locale]/page.module.css
|
||||
M src/app/[locale]/page.tsx
|
||||
M src/components/marketing/ProductPreview.tsx
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"generated_at": "2026-06-25",
|
||||
"origin": "http://127.0.0.1:3100",
|
||||
"results": [
|
||||
{
|
||||
"locale": "en",
|
||||
"status": 200,
|
||||
"lang": "en",
|
||||
"dir": "ltr",
|
||||
"hero_payload_present": true,
|
||||
"bytes": 152405
|
||||
},
|
||||
{
|
||||
"locale": "fr",
|
||||
"status": 200,
|
||||
"lang": "fr",
|
||||
"dir": "ltr",
|
||||
"hero_payload_present": true,
|
||||
"bytes": 157175
|
||||
},
|
||||
{
|
||||
"locale": "ar",
|
||||
"status": 200,
|
||||
"lang": "ar",
|
||||
"dir": "rtl",
|
||||
"hero_payload_present": true,
|
||||
"bytes": 165377
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
Check_ID,Area,Scenario,Status,Evidence,Exit_criteria
|
||||
P13-M01,Keyboard,Desktop EN/FR/AR full route navigation,Blocked,Chromium loopback navigation rejected by administrator,Complete keyboard path with visible focus and logical order
|
||||
P13-M02,Screen reader,Landmarks headings disclosures disabled actions,Not run,Requires human assistive-technology session,Record NVDA VoiceOver or approved equivalent observations
|
||||
P13-M03,Zoom,200 percent zoom at 640 CSS pixels,Not run,Browser execution blocked,No horizontal page overflow and all controls operable
|
||||
P13-M04,Reflow,400 percent reflow at 320 CSS pixels,Not run,Browser execution blocked,Single-direction scrolling except explicit component overflow
|
||||
P13-M05,Touch,390 and 320 CSS pixel mobile interactions,Not run,Browser execution blocked,Targets and disclosures operable without overlap
|
||||
P13-M06,Themes,Light dark and system in all locales,Not run,Browser execution blocked,No unreadable contrast or flash regressions
|
||||
P13-M07,RTL,Arabic desktop tablet and mobile,Not run,Browser execution blocked,True RTL with fixed media and isolated identifiers
|
||||
P13-M08,Forced colors,Homepage and disabled actions,Not run,Browser execution blocked,Meaning and focus remain visible
|
||||
P13-M09,Reduced motion,Decorative preview treatment and scrolling,Static pass,Source review confirms transforms are removed and smooth scrolling disabled,Confirm in browser environment
|
||||
P13-M10,Content expansion,Long French and Arabic copy,Automated scenario authored,tests/browser/text-expansion.spec.ts,Execute in unblocked browser and confirm no overflow
|
||||
|
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"phase": 13,
|
||||
"date": "2026-06-25",
|
||||
"environment": {
|
||||
"node": "22.16.0",
|
||||
"target_node": "24.17.0",
|
||||
"pnpm": "11.9.0 via npx",
|
||||
"target_pnpm": "11.9.0",
|
||||
"browser": "System Chromium",
|
||||
"browser_constraint": "Loopback navigation rejected with net::ERR_BLOCKED_BY_ADMINISTRATOR"
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"gate": "pnpm install --frozen-lockfile",
|
||||
"status": "blocked",
|
||||
"detail": "Lockfile verification completed; registry requests failed with EAI_AGAIN before installation completed."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm validate",
|
||||
"status": "passed",
|
||||
"detail": "Phase 9 through Phase 13 static validators passed."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm format:check",
|
||||
"status": "passed",
|
||||
"detail": "All tracked source and documentation files matched Prettier formatting."
|
||||
},
|
||||
{ "gate": "pnpm lint", "status": "passed", "detail": "ESLint completed with zero warnings." },
|
||||
{
|
||||
"gate": "pnpm typecheck",
|
||||
"status": "passed",
|
||||
"detail": "Strict TypeScript validation completed without errors."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm test:unit",
|
||||
"status": "passed",
|
||||
"detail": "27 tests passed across 9 files; configured coverage thresholds passed."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm test:browser",
|
||||
"status": "blocked",
|
||||
"detail": "Homepage scenarios were invoked with video disabled and system Chromium; all navigation attempts were rejected before application response."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm test:a11y",
|
||||
"status": "blocked",
|
||||
"detail": "Authored axe scenarios require the same blocked loopback browser navigation."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm test:visual",
|
||||
"status": "blocked",
|
||||
"detail": "Authored visual scenarios and baseline generation require the same blocked loopback browser navigation."
|
||||
},
|
||||
{
|
||||
"gate": "SITE_ORIGIN=https://approved.invalid pnpm build",
|
||||
"status": "passed",
|
||||
"detail": "Next.js production build, strict type phase, route generation, and standalone preparation passed."
|
||||
},
|
||||
{
|
||||
"gate": "standalone HTTP locale checks",
|
||||
"status": "passed",
|
||||
"detail": "EN, FR, and AR returned HTTP 200 with correct lang and dir and localized hero content in the response payload."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm audit",
|
||||
"status": "blocked",
|
||||
"detail": "Registry connectivity did not permit completion of the pnpm audit request."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm manifest:generate",
|
||||
"status": "passed",
|
||||
"detail": "Phase 13 checksum manifest generated."
|
||||
},
|
||||
{
|
||||
"gate": "pnpm validate:package",
|
||||
"status": "passed",
|
||||
"detail": "Phase 13 checksum manifest verified with no unlisted repository files."
|
||||
},
|
||||
{
|
||||
"gate": "manual accessibility and responsive matrix",
|
||||
"status": "open",
|
||||
"detail": "Keyboard, touch, screen-reader, zoom, forced-colors, and human visual review are documented but not fabricated."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
# Phase 13 Validation Results
|
||||
|
||||
Date: 2026-06-25
|
||||
|
||||
## Environment
|
||||
|
||||
- Available runtime: Node.js 22.16.0.
|
||||
- Required runtime: Node.js 24.17.0.
|
||||
- Exact pnpm CLI used for attempted frozen installation: 11.9.0 through `npx`.
|
||||
- Browser: system Chromium.
|
||||
- Browser restriction: every loopback navigation was rejected with `net::ERR_BLOCKED_BY_ADMINISTRATOR` before an application response.
|
||||
|
||||
## Results
|
||||
|
||||
| Gate | Result | Evidence |
|
||||
| ------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Frozen pnpm installation | Blocked | Lockfile verification completed, then registry requests failed with `EAI_AGAIN`. |
|
||||
| Static validation | Passed | Phase 9 contract, runtime pins, locale parity, routes, tokens, CSS, prohibited content, metadata, Phase 12 components, and Phase 13 homepage controls passed. |
|
||||
| Formatting | Passed | Prettier reported all files formatted. |
|
||||
| Lint | Passed | ESLint completed with zero warnings. |
|
||||
| Strict type checking | Passed | TypeScript completed without errors. |
|
||||
| Unit tests | Passed | 27 tests in 9 files passed; line, statement, branch, and function thresholds passed. |
|
||||
| Production build | Passed | Next.js 16.2.9 compiled, type-checked, generated route data, and prepared standalone assets. |
|
||||
| Standalone HTTP checks | Passed | EN, FR, and AR returned 200, correct `lang` and `dir`, and localized hero payloads. |
|
||||
| Homepage browser tests | Blocked | Nine authored scenarios could not navigate to loopback because Chromium returned the administrator policy error. |
|
||||
| Axe tests | Blocked | Four authored homepage scenarios depend on the same browser navigation. |
|
||||
| Visual tests | Blocked | Seven authored homepage baselines depend on the same browser navigation. |
|
||||
| Dependency audit | Blocked | Registry connectivity prevented a completed pnpm audit. |
|
||||
| Package manifest | Passed | Phase 13 manifest generated and verified after repository cleanup. |
|
||||
| Manual QA | Open | Keyboard, touch, screen-reader, 200/400 percent zoom, reduced motion, forced colors, themes, RTL, and content expansion require human execution. |
|
||||
|
||||
## Coverage summary
|
||||
|
||||
- Statements: 92.4 percent.
|
||||
- Branches: 86.04 percent.
|
||||
- Functions: 95.45 percent.
|
||||
- Lines: 92.64 percent.
|
||||
|
||||
## Acceptance statement
|
||||
|
||||
The implemented source is statically valid, typed, unit-tested, buildable, and directly servable in all three locales. Formal Phase 13 acceptance remains blocked by P12-001 through P12-005 and P13-001 through P13-003. Browser and human accessibility evidence cannot be replaced by source inspection, even when source inspection is substantially less annoying.
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"project": "RentalDriveGo",
|
||||
"executed_at": "2026-06-25",
|
||||
"target_runtime": { "node": "24.17.0", "pnpm": "11.9.0" },
|
||||
"execution_runtime": { "node": "22.16.0", "pnpm": "11.9.0" },
|
||||
"results": [
|
||||
{ "id": "phase9-validator", "status": "passed", "checks": 38, "targets": 19 },
|
||||
{ "id": "phase9-manifest", "status": "passed", "manifested_files": 61, "extracted_files": 62 },
|
||||
{ "id": "repository-validations", "status": "passed", "validators": 7 },
|
||||
{ "id": "phase10-manifest", "status": "passed", "manifested_files": 146 },
|
||||
{ "id": "format", "status": "passed" },
|
||||
{ "id": "lint", "status": "passed", "warnings": 0 },
|
||||
{ "id": "typecheck", "status": "passed" },
|
||||
{
|
||||
"id": "unit-tests",
|
||||
"status": "passed",
|
||||
"files": 3,
|
||||
"tests": 9,
|
||||
"coverage": { "statements": 95.31, "branches": 89.18, "functions": 100, "lines": 94.64 }
|
||||
},
|
||||
{ "id": "production-build", "status": "passed" },
|
||||
{ "id": "package-audit", "status": "passed", "known_vulnerabilities": 0 },
|
||||
{ "id": "http-smoke", "status": "passed" },
|
||||
{
|
||||
"id": "browser-tests",
|
||||
"status": "environment_blocked",
|
||||
"reason": "Managed system Chromium URLBlocklist blocks all navigation and Playwright CDN DNS resolution fails."
|
||||
},
|
||||
{ "id": "target-node-runtime", "status": "environment_blocked", "available_node": "22.16.0" }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
# Phase 10 Validation Results
|
||||
|
||||
- **Execution date:** 2026-06-25
|
||||
- **Execution environment:** Linux container, Node.js 22.16.0 available; repository target is Node.js 24.17.0
|
||||
- **Package manager:** pnpm 11.9.0
|
||||
|
||||
| Check | Result | Evidence / notes |
|
||||
| ------------------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Phase 9 supplied validator | PASS | 38 checks across 19 validator targets |
|
||||
| Phase 9 manifest checksums and sizes | PASS | 61 manifested payload files matched exactly; manifest itself makes 62 extracted files |
|
||||
| Contract immutability validator | PASS | Source manifest and supplied validator executed from `contracts/phase9` |
|
||||
| Locale parity and direction validator | PASS | EN, FR, AR key parity, locale mapping, and implementation brand checks |
|
||||
| Route parity validator | PASS | Locale paths, canonical alternates, query preservation allowlist, and hash rules |
|
||||
| Token integrity validator | PASS | `src/styles/tokens.css` is byte-identical to the Phase 9 token source |
|
||||
| CSS logical-property validator | PASS | No prohibited physical left/right declarations in implementation CSS |
|
||||
| Prohibited-content validator | PASS | No placeholder destinations, research backdoors, simulated production success, or prohibited source behavior |
|
||||
| Prettier check | PASS | Repository formatting accepted |
|
||||
| ESLint | PASS | Zero warnings permitted |
|
||||
| TypeScript | PASS | Strict `tsc --noEmit` |
|
||||
| Unit tests | PASS | 3 files, 9 tests; 95.31% statements, 89.18% branches, 100% functions, 94.64% lines |
|
||||
| Production build | PASS | Next.js dynamic locale route, static robots and not-found routes, standalone output prepared |
|
||||
| Package audit | PASS | `pnpm audit --audit-level low`: no known vulnerabilities |
|
||||
| Server HTTP smoke check | PASS | `/en` returned 200 with `lang`, `dir`, CSP nonce, noindex, canonical, and all `hreflang` links in server HTML |
|
||||
| Browser functional suite | BLOCKED BY ENVIRONMENT | System Chromium has an administrator `URLBlocklist: ["*"]`; navigation returns `ERR_BLOCKED_BY_ADMINISTRATOR` |
|
||||
| Browser installation fallback | BLOCKED BY ENVIRONMENT | Playwright CDN resolution failed with `EAI_AGAIN cdn.playwright.dev` |
|
||||
| Accessibility browser suite | NOT EXECUTED LOCALLY | Configured and required in CI; depends on an unblocked Playwright browser |
|
||||
| Visual regression baselines | NOT GENERATED LOCALLY | Must be generated and reviewed in approved CI/browser environment, not fabricated from failed navigation |
|
||||
| Firefox/WebKit/mobile matrix | NOT EXECUTED LOCALLY | CI installs and runs configured engines; support policy owner remains unresolved under P9-011 |
|
||||
| Exact target-runtime execution | NOT EXECUTED LOCALLY | Host exposes Node.js 22.16.0 only; CI and OCI image are pinned to 24.17.0 |
|
||||
|
||||
## Interpretation
|
||||
|
||||
The source, static validators, unit suite, audit, and production build are green. Browser-dependent evidence is not green; it is unavailable in this host. The CI browser job remains a required release gate and must run successfully before Phase 11 implementation is accepted.
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"phase": 11,
|
||||
"status": "blocked",
|
||||
"canonical_engine": "Playwright Chromium 1.61.1 pinned browser",
|
||||
"reason": "The local environment could not install pnpm 11.9.0 or the repository dependencies, so the application and Playwright snapshot runner could not execute.",
|
||||
"scenarios_defined": [
|
||||
"desktop-en-light",
|
||||
"desktop-en-dark",
|
||||
"tablet-fr-light",
|
||||
"tablet-fr-dark",
|
||||
"mobile-ar-light",
|
||||
"mobile-ar-dark",
|
||||
"mobile-ar-dark-navigation-open",
|
||||
"desktop-en-light-focus"
|
||||
],
|
||||
"baselines_generated": 0,
|
||||
"fabricated_baselines": false,
|
||||
"command": "pnpm test:visual:update --project=chromium",
|
||||
"release_gate": "P11-002"
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 build
|
||||
> next build && node scripts/prepare-standalone.mjs
|
||||
|
||||
▲ Next.js 16.2.9 (Turbopack)
|
||||
|
||||
Creating an optimized production build ...
|
||||
✓ Compiled successfully in 11.6s
|
||||
Running TypeScript ...
|
||||
Finished TypeScript in 7.9s ...
|
||||
Collecting page data using 7 workers ...
|
||||
Generating static pages using 7 workers (0/3) ...
|
||||
✓ Generating static pages using 7 workers (3/3) in 691ms
|
||||
Finalizing page optimization ...
|
||||
|
||||
Route (app)
|
||||
┌ ○ /_not-found
|
||||
├ ƒ /[locale]
|
||||
├ ƒ /[locale]/[slug]
|
||||
├ ƒ /[locale]/component-lab
|
||||
└ ○ /robots.txt
|
||||
|
||||
|
||||
ƒ Proxy (Middleware)
|
||||
|
||||
○ (Static) prerendered as static content
|
||||
ƒ (Dynamic) server-rendered on demand
|
||||
|
||||
Prepared standalone server assets.
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 build
|
||||
> next build && node scripts/prepare-standalone.mjs
|
||||
|
||||
▲ Next.js 16.2.9 (Turbopack)
|
||||
|
||||
Creating an optimized production build ...
|
||||
✓ Compiled successfully in 11.6s
|
||||
Running TypeScript ...
|
||||
Finished TypeScript in 8.6s ...
|
||||
Collecting page data using 7 workers ...
|
||||
Generating static pages using 7 workers (0/3) ...
|
||||
Error occurred prerendering page "/robots.txt". Read more: https://nextjs.org/docs/messages/prerender-error
|
||||
Error: SITE_ORIGIN is required in production. No canonical domain is approved yet.
|
||||
at <unknown> (.next/server/chunks/[root-of-the-server]__14j6iib._.js:26:33652)
|
||||
at tT (.next/server/chunks/[root-of-the-server]__14j6iib._.js:26:33966)
|
||||
at tA (.next/server/chunks/[root-of-the-server]__14j6iib._.js:26:34173)
|
||||
Export encountered an error on /robots.txt/route: /robots.txt, exiting the build.
|
||||
⨯ Next.js build worker exited with code: 1 and signal: null
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,29 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 build
|
||||
> next build && node scripts/prepare-standalone.mjs
|
||||
|
||||
▲ Next.js 16.2.9 (Turbopack)
|
||||
|
||||
Creating an optimized production build ...
|
||||
✓ Compiled successfully in 11.4s
|
||||
Running TypeScript ...
|
||||
Finished TypeScript in 8.2s ...
|
||||
Collecting page data using 7 workers ...
|
||||
Generating static pages using 7 workers (0/3) ...
|
||||
✓ Generating static pages using 7 workers (3/3) in 566ms
|
||||
Finalizing page optimization ...
|
||||
|
||||
Route (app)
|
||||
┌ ○ /_not-found
|
||||
├ ƒ /[locale]
|
||||
├ ƒ /[locale]/[slug]
|
||||
├ ƒ /[locale]/component-lab
|
||||
└ ○ /robots.txt
|
||||
|
||||
|
||||
ƒ Proxy (Middleware)
|
||||
|
||||
○ (Static) prerendered as static content
|
||||
ƒ (Dynamic) server-rendered on demand
|
||||
|
||||
Prepared standalone server assets.
|
||||
@@ -0,0 +1,47 @@
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs/architecture: ADR-0003_PHASE_12_COMPONENT_SYSTEM.md
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/docs: phase12
|
||||
Files /tmp/phase11_original/RentalDriveGo/package.json and /mnt/data/phase12_work/RentalDriveGo/package.json differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/playwright.config.ts and /mnt/data/phase12_work/RentalDriveGo/playwright.config.ts differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/scripts: generate-phase12-manifest.mjs
|
||||
Files /tmp/phase11_original/RentalDriveGo/scripts/run-validations.mjs and /mnt/data/phase12_work/RentalDriveGo/scripts/run-validations.mjs differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/scripts: validate-phase12-components.mjs
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/scripts: validate-phase12-manifest.mjs
|
||||
Files /tmp/phase11_original/RentalDriveGo/scripts/validate-runtime-dependencies.mjs and /mnt/data/phase12_work/RentalDriveGo/scripts/validate-runtime-dependencies.mjs differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/app/[locale]: component-lab
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/app/[locale]/layout.tsx and /mnt/data/phase12_work/RentalDriveGo/src/app/[locale]/layout.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: actions
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/app-shell/SiteHeader.tsx and /mnt/data/phase12_work/RentalDriveGo/src/components/app-shell/SiteHeader.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: controls
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: feedback
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: forms
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/foundation/BidiText.tsx and /mnt/data/phase12_work/RentalDriveGo/src/components/foundation/BidiText.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: Icon.module.css
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: Icon.tsx
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/foundation/StatusBadge.module.css and /mnt/data/phase12_work/RentalDriveGo/src/components/foundation/StatusBadge.module.css differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/components/foundation/StatusBadge.tsx and /mnt/data/phase12_work/RentalDriveGo/src/components/foundation/StatusBadge.tsx differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: VisuallyHidden.tsx
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components/foundation: client-hooks.ts
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: marketing
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: media
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: navigation
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: overlays
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: surfaces
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/components: typography
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/content: development
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/content/locales/ar/shell.json and /mnt/data/phase12_work/RentalDriveGo/src/content/locales/ar/shell.json differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/content/locales/en/shell.json and /mnt/data/phase12_work/RentalDriveGo/src/content/locales/en/shell.json differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/content/locales/fr/shell.json and /mnt/data/phase12_work/RentalDriveGo/src/content/locales/fr/shell.json differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/src/lib: components
|
||||
Files /tmp/phase11_original/RentalDriveGo/src/lib/localization/client.ts and /mnt/data/phase12_work/RentalDriveGo/src/lib/localization/client.ts differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/a11y: component-system.a11y.spec.ts
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/browser: component-system.spec.ts
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/browser/responsive.spec.ts and /mnt/data/phase12_work/RentalDriveGo/tests/browser/responsive.spec.ts differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/browser/text-expansion.spec.ts and /mnt/data/phase12_work/RentalDriveGo/tests/browser/text-expansion.spec.ts differ
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/browser/theme-csp.spec.ts and /mnt/data/phase12_work/RentalDriveGo/tests/browser/theme-csp.spec.ts differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/fixtures: component-system
|
||||
Files /tmp/phase11_original/RentalDriveGo/tests/fixtures/foundation-matrix.json and /mnt/data/phase12_work/RentalDriveGo/tests/fixtures/foundation-matrix.json differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests: types
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/unit: components
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo/tests/visual: component-system.visual.spec.ts
|
||||
Files /tmp/phase11_original/RentalDriveGo/tsconfig.json and /mnt/data/phase12_work/RentalDriveGo/tsconfig.json differ
|
||||
Only in /mnt/data/phase12_work/RentalDriveGo: tsconfig.tsbuildinfo
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 format:check
|
||||
> prettier --check .
|
||||
|
||||
Checking formatting...
|
||||
All matched files use Prettier code style!
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,222 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 format
|
||||
> prettier --write .
|
||||
|
||||
[90m.github/dependabot.yml[39m 20ms (unchanged)
|
||||
[90m.github/workflows/ci.yml[39m 12ms (unchanged)
|
||||
[90mCONTRIBUTING.md[39m 27ms (unchanged)
|
||||
[90mdocs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md[39m 34ms (unchanged)
|
||||
[90mdocs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md[39m 17ms (unchanged)
|
||||
[90mdocs/architecture/ADR-0003_PHASE_12_COMPONENT_SYSTEM.md[39m 4ms (unchanged)
|
||||
[90mdocs/BRAND_MIGRATION_v1.0.md[39m 5ms (unchanged)
|
||||
[90mdocs/DECISION_LOG_v12.0.md[39m 7ms (unchanged)
|
||||
[90mdocs/DEPENDENCY_MANIFEST_v1.0.md[39m 9ms (unchanged)
|
||||
[90mdocs/PHASE_10_HANDOFF_v1.0.md[39m 8ms (unchanged)
|
||||
[90mdocs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md[39m 18ms (unchanged)
|
||||
[90mdocs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md[39m 37ms (unchanged)
|
||||
[90mdocs/PHASE_12_HANDOFF_v1.0.md[39m 17ms (unchanged)
|
||||
[90mdocs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md[39m 24ms (unchanged)
|
||||
docs/PHASE_13_HANDOFF_v1.0.md 26ms
|
||||
docs/phase12/BUNDLE_IMPACT_REPORT_v1.0.md 5ms
|
||||
[90mdocs/phase12/COMPONENT_CATALOG_v1.0.md[39m 70ms (unchanged)
|
||||
[90mdocs/phase12/COMPONENT_INVENTORY_v1.0.json[39m 68ms (unchanged)
|
||||
[90mdocs/phase12/DEPENDENCY_CHANGE_REPORT_v1.0.md[39m 3ms (unchanged)
|
||||
[90mdocs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.json[39m 2ms (unchanged)
|
||||
[90mdocs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md[39m 5ms (unchanged)
|
||||
[90mdocs/quality/PHASE_12_HTTP_ROUTE_RESULTS_v1.0.json[39m 2ms (unchanged)
|
||||
docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.json 4ms
|
||||
docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.md 5ms
|
||||
[90mdocs/quality/PHASE_12_VISUAL_REGRESSION_RESULTS_v1.0.json[39m 1ms (unchanged)
|
||||
[90mdocs/quality/VALIDATION_RESULTS_v1.0.json[39m 2ms (unchanged)
|
||||
[90mdocs/quality/VALIDATION_RESULTS_v1.0.md[39m 7ms (unchanged)
|
||||
[90mdocs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json[39m 1ms (unchanged)
|
||||
[90mdocs/TOKEN_IMPLEMENTATION_v1.0.md[39m 4ms (unchanged)
|
||||
[90meslint.config.mjs[39m 10ms (unchanged)
|
||||
[90mnext.config.ts[39m 10ms (unchanged)
|
||||
[90mpackage.json[39m 2ms (unchanged)
|
||||
[90mPHASE_10_PACKAGE_MANIFEST_v1.0.json[39m 24ms (unchanged)
|
||||
[90mPHASE_11_PACKAGE_MANIFEST_v1.0.json[39m 17ms (unchanged)
|
||||
[90mplaywright.config.ts[39m 12ms (unchanged)
|
||||
[90mpnpm-workspace.yaml[39m 2ms (unchanged)
|
||||
[90mprettier.config.mjs[39m 4ms (unchanged)
|
||||
[90mREADME.md[39m 6ms (unchanged)
|
||||
[90mscripts/generate-phase10-manifest.mjs[39m 14ms (unchanged)
|
||||
[90mscripts/generate-phase11-manifest.mjs[39m 7ms (unchanged)
|
||||
[90mscripts/generate-phase12-manifest.mjs[39m 6ms (unchanged)
|
||||
[90mscripts/lib.mjs[39m 6ms (unchanged)
|
||||
[90mscripts/prepare-standalone.mjs[39m 3ms (unchanged)
|
||||
[90mscripts/run-checks.mjs[39m 2ms (unchanged)
|
||||
[90mscripts/run-validations.mjs[39m 2ms (unchanged)
|
||||
[90mscripts/validate-css-logical.mjs[39m 3ms (unchanged)
|
||||
[90mscripts/validate-locales.mjs[39m 5ms (unchanged)
|
||||
[90mscripts/validate-metadata.mjs[39m 2ms (unchanged)
|
||||
[90mscripts/validate-phase10-manifest.mjs[39m 2ms (unchanged)
|
||||
[90mscripts/validate-phase11-foundation.mjs[39m 4ms (unchanged)
|
||||
[90mscripts/validate-phase11-manifest.mjs[39m 5ms (unchanged)
|
||||
[90mscripts/validate-phase12-components.mjs[39m 5ms (unchanged)
|
||||
[90mscripts/validate-phase12-manifest.mjs[39m 6ms (unchanged)
|
||||
[90mscripts/validate-phase9-contract.mjs[39m 2ms (unchanged)
|
||||
[90mscripts/validate-prohibited-content.mjs[39m 2ms (unchanged)
|
||||
[90mscripts/validate-routes.mjs[39m 3ms (unchanged)
|
||||
[90mscripts/validate-runtime-dependencies.mjs[39m 4ms (unchanged)
|
||||
[90mscripts/validate-tokens.mjs[39m 3ms (unchanged)
|
||||
[90msrc/app/[locale]/[slug]/page.tsx[39m 16ms (unchanged)
|
||||
[90msrc/app/[locale]/component-lab/ComponentLabInteractive.tsx[39m 11ms (unchanged)
|
||||
[90msrc/app/[locale]/component-lab/page.module.css[39m 19ms (unchanged)
|
||||
[90msrc/app/[locale]/component-lab/page.tsx[39m 10ms (unchanged)
|
||||
[90msrc/app/[locale]/error.tsx[39m 5ms (unchanged)
|
||||
[90msrc/app/[locale]/layout.tsx[39m 6ms (unchanged)
|
||||
[90msrc/app/[locale]/loading.tsx[39m 2ms (unchanged)
|
||||
[90msrc/app/[locale]/not-found.tsx[39m 1ms (unchanged)
|
||||
[90msrc/app/[locale]/page.module.css[39m 8ms (unchanged)
|
||||
[90msrc/app/[locale]/page.tsx[39m 12ms (unchanged)
|
||||
[90msrc/app/robots.ts[39m 2ms (unchanged)
|
||||
[90msrc/components/actions/ActionLink.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/actions/ActionLink.tsx[39m 8ms (unchanged)
|
||||
[90msrc/components/actions/Button.module.css[39m 14ms (unchanged)
|
||||
[90msrc/components/actions/Button.tsx[39m 11ms (unchanged)
|
||||
[90msrc/components/app-shell/BrandLink.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/app-shell/Controls.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/app-shell/DisabledAction.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/app-shell/HeaderNavigation.tsx[39m 5ms (unchanged)
|
||||
[90msrc/components/app-shell/LocaleSelector.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/app-shell/LocalizedLoading.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/app-shell/LocalizedNotFound.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/app-shell/MobileNavigation.tsx[39m 9ms (unchanged)
|
||||
[90msrc/components/app-shell/SiteFooter.module.css[39m 6ms (unchanged)
|
||||
[90msrc/components/app-shell/SiteFooter.tsx[39m 11ms (unchanged)
|
||||
[90msrc/components/app-shell/SiteHeader.module.css[39m 11ms (unchanged)
|
||||
[90msrc/components/app-shell/SiteHeader.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/app-shell/StateShell.module.css[39m 5ms (unchanged)
|
||||
[90msrc/components/app-shell/StateShell.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/app-shell/ThemeController.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/app-shell/ThemeSelector.tsx[39m 5ms (unchanged)
|
||||
[90msrc/components/controls/Accordion.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/controls/Accordion.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/controls/Pagination.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/controls/Pagination.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/controls/SegmentedControl.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/controls/SegmentedControl.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/controls/Tabs.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/controls/Tabs.tsx[39m 10ms (unchanged)
|
||||
[90msrc/components/feedback/Alert.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/feedback/Alert.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/feedback/Loading.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/feedback/Loading.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/feedback/Progress.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/feedback/Progress.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/feedback/StateMessage.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/feedback/StateMessage.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/forms/ChoiceControls.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/forms/ChoiceControls.tsx[39m 5ms (unchanged)
|
||||
[90msrc/components/forms/ErrorSummary.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/forms/ErrorSummary.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/forms/FormField.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/forms/FormField.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/forms/TextInput.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/forms/TextInput.tsx[39m 5ms (unchanged)
|
||||
[90msrc/components/foundation/AccessibleIcon.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/foundation/BidiText.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/foundation/BidiText.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/foundation/client-hooks.ts[39m 6ms (unchanged)
|
||||
[90msrc/components/foundation/Icon.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/foundation/Icon.tsx[39m 7ms (unchanged)
|
||||
[90msrc/components/foundation/LiveRegion.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/foundation/LiveRegion.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/foundation/StatusBadge.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/foundation/StatusBadge.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/foundation/VisuallyHidden.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/layout/LayoutPrimitives.module.css[39m 6ms (unchanged)
|
||||
[90msrc/components/layout/LayoutPrimitives.tsx[39m 5ms (unchanged)
|
||||
[90msrc/components/marketing/Comparison.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/marketing/Comparison.tsx[39m 6ms (unchanged)
|
||||
[90msrc/components/marketing/CTA.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/marketing/CTA.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/marketing/Evidence.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/marketing/Evidence.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/marketing/FeatureCard.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/marketing/FeatureCard.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/marketing/ProductPreview.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/marketing/ProductPreview.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/marketing/SectionHeader.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/marketing/SectionHeader.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/marketing/SectionPatterns.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/marketing/SectionPatterns.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/marketing/Workflow.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/marketing/Workflow.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/media/MediaFrame.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/media/MediaFrame.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/navigation/Breadcrumbs.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/navigation/Breadcrumbs.tsx[39m 4ms (unchanged)
|
||||
[90msrc/components/navigation/FooterLinkGroup.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/navigation/FooterLinkGroup.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/navigation/SectionNavigation.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/navigation/SectionNavigation.tsx[39m 2ms (unchanged)
|
||||
[90msrc/components/overlays/Dialog.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/overlays/Dialog.tsx[39m 6ms (unchanged)
|
||||
[90msrc/components/overlays/DropdownMenu.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/overlays/DropdownMenu.tsx[39m 6ms (unchanged)
|
||||
[90msrc/components/overlays/Tooltip.module.css[39m 4ms (unchanged)
|
||||
[90msrc/components/overlays/Tooltip.tsx[39m 1ms (unchanged)
|
||||
[90msrc/components/surfaces/Callout.module.css[39m 1ms (unchanged)
|
||||
[90msrc/components/surfaces/Callout.tsx[39m 1ms (unchanged)
|
||||
[90msrc/components/surfaces/Card.module.css[39m 2ms (unchanged)
|
||||
[90msrc/components/surfaces/Card.tsx[39m 3ms (unchanged)
|
||||
[90msrc/components/typography/Typography.module.css[39m 3ms (unchanged)
|
||||
[90msrc/components/typography/Typography.tsx[39m 3ms (unchanged)
|
||||
[90msrc/content/development/component-lab.ts[39m 19ms (unchanged)
|
||||
[90msrc/content/locales/ar/homepage.json[39m 6ms (unchanged)
|
||||
[90msrc/content/locales/ar/shell.json[39m 2ms (unchanged)
|
||||
[90msrc/content/locales/en/homepage.json[39m 4ms (unchanged)
|
||||
[90msrc/content/locales/en/shell.json[39m 2ms (unchanged)
|
||||
[90msrc/content/locales/fr/homepage.json[39m 6ms (unchanged)
|
||||
[90msrc/content/locales/fr/shell.json[39m 1ms (unchanged)
|
||||
[90msrc/contracts/phase9/analytics-contract.ts[39m 2ms (unchanged)
|
||||
[90msrc/contracts/phase9/component-contracts.ts[39m 6ms (unchanged)
|
||||
[90msrc/contracts/phase9/demo-form-contract.ts[39m 2ms (unchanged)
|
||||
[90msrc/contracts/phase9/design-tokens.json[39m 2ms (unchanged)
|
||||
[90msrc/contracts/phase9/performance-budgets.json[39m 1ms (unchanged)
|
||||
[90msrc/contracts/phase9/route-manifest.json[39m 1ms (unchanged)
|
||||
[90msrc/contracts/phase9/visual-regression-scenarios.json[39m 2ms (unchanged)
|
||||
[90msrc/lib/components/classNames.ts[39m 1ms (unchanged)
|
||||
[90msrc/lib/localization/client-messages.ts[39m 3ms (unchanged)
|
||||
[90msrc/lib/localization/client.ts[39m 3ms (unchanged)
|
||||
[90msrc/lib/localization/config.ts[39m 14ms (unchanged)
|
||||
[90msrc/lib/localization/format.ts[39m 5ms (unchanged)
|
||||
[90msrc/lib/localization/messages.ts[39m 2ms (unchanged)
|
||||
[90msrc/lib/localization/site-origin.ts[39m 3ms (unchanged)
|
||||
[90msrc/lib/metadata/build-metadata.ts[39m 3ms (unchanged)
|
||||
[90msrc/lib/security/csp.ts[39m 2ms (unchanged)
|
||||
[90msrc/lib/theme/bootstrap-script.ts[39m 1ms (unchanged)
|
||||
[90msrc/lib/theme/client.ts[39m 5ms (unchanged)
|
||||
[90msrc/lib/theme/config.ts[39m 3ms (unchanged)
|
||||
[90msrc/proxy.ts[39m 6ms (unchanged)
|
||||
[90msrc/styles/component-tokens.css[39m 10ms (unchanged)
|
||||
[90msrc/styles/globals.css[39m 6ms (unchanged)
|
||||
[90mtests/a11y/component-system.a11y.spec.ts[39m 2ms (unchanged)
|
||||
[90mtests/a11y/shell.a11y.spec.ts[39m 3ms (unchanged)
|
||||
[90mtests/browser/component-system.spec.ts[39m 5ms (unchanged)
|
||||
[90mtests/browser/navigation.spec.ts[39m 3ms (unchanged)
|
||||
[90mtests/browser/no-javascript.spec.ts[39m 2ms (unchanged)
|
||||
[90mtests/browser/responsive.spec.ts[39m 5ms (unchanged)
|
||||
[90mtests/browser/shell.spec.ts[39m 14ms (unchanged)
|
||||
[90mtests/browser/text-expansion.spec.ts[39m 4ms (unchanged)
|
||||
[90mtests/browser/theme-csp.spec.ts[39m 12ms (unchanged)
|
||||
[90mtests/fixtures/component-system/component-matrix.json[39m 1ms (unchanged)
|
||||
[90mtests/fixtures/foundation-matrix.json[39m 3ms (unchanged)
|
||||
[90mtests/fixtures/README.md[39m 5ms (unchanged)
|
||||
[90mtests/setup.ts[39m 1ms (unchanged)
|
||||
[90mtests/types/component-contracts.test-d.tsx[39m 2ms (unchanged)
|
||||
[90mtests/unit/components/actions.test.tsx[39m 3ms (unchanged)
|
||||
[90mtests/unit/components/controls.test.tsx[39m 4ms (unchanged)
|
||||
[90mtests/unit/components/evidence.test.tsx[39m 3ms (unchanged)
|
||||
[90mtests/unit/components/forms.test.tsx[39m 3ms (unchanged)
|
||||
[90mtests/unit/csp.test.ts[39m 2ms (unchanged)
|
||||
[90mtests/unit/format.test.ts[39m 3ms (unchanged)
|
||||
[90mtests/unit/localization.test.ts[39m 4ms (unchanged)
|
||||
[90mtests/unit/theme.test.ts[39m 2ms (unchanged)
|
||||
[90mtests/visual/component-system.visual.spec.ts[39m 3ms (unchanged)
|
||||
[90mtests/visual/README.md[39m 2ms (unchanged)
|
||||
[90mtests/visual/shell.visual.spec.ts[39m 6ms (unchanged)
|
||||
[90mtsconfig.json[39m 1ms (unchanged)
|
||||
[90mvitest.config.ts[39m 2ms (unchanged)
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 lint
|
||||
> eslint . --max-warnings=0
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,2 @@
|
||||
Generating route types...
|
||||
✓ Types generated successfully
|
||||
@@ -0,0 +1,7 @@
|
||||
npm warn EBADENGINE Unsupported engine {
|
||||
npm warn EBADENGINE package: 'rentaldrivego-web@0.3.0',
|
||||
npm warn EBADENGINE required: { node: '24.17.0', pnpm: '11.9.0' },
|
||||
npm warn EBADENGINE current: { node: 'v22.16.0', npm: '10.9.2' }
|
||||
npm warn EBADENGINE }
|
||||
|
||||
added 462 packages in 30s
|
||||
@@ -0,0 +1,57 @@
|
||||
|
||||
Running 44 tests using 2 workers
|
||||
××××F::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations,line=8,col=16:: 1) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations,line=8,col=16:: 1) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations,line=8,col=16:: 1) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
F::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations,line=8,col=16:: 2) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations,line=8,col=16:: 2) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations,line=8,col=16:: 2) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
××××F::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations,line=8,col=16:: 3) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations,line=8,col=16:: 3) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
::error file=tests/a11y/component-system.a11y.spec.ts,title=[chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations,line=8,col=16:: 3) [chromium] › tests/a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar/component-lab", waiting until "load"%0A%0A%0A 6 | page,%0A 7 | }) => {%0A > 8 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 9 | const results = await new AxeBuilder({ page }).analyze();%0A 10 | expect(results.violations).toEqual([]);%0A 11 | });%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/component-system.a11y.spec.ts:8:16
|
||||
F::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations,line=20,col=18:: 4) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations,line=20,col=18:: 4) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations,line=20,col=18:: 4) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
××××F::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 5) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 5) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 5) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
F::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations,line=20,col=18:: 6) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations,line=20,col=18:: 6) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations,line=20,col=18:: 6) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
××××F::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 7) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 7) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 7) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
F::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations,line=20,col=18:: 8) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations,line=20,col=18:: 8) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations,line=20,col=18:: 8) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
××××F::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 9) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 9) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
::error file=tests/a11y/shell.a11y.spec.ts,title=[chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations,line=20,col=18:: 9) [chromium] › tests/a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 18 | },%0A 19 | ]);%0A > 20 | await page.goto(`/${locale}`);%0A | ^%0A 21 | const results = await new AxeBuilder({ page })%0A 22 | .withTags(['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'])%0A 23 | .analyze();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/a11y/shell.a11y.spec.ts:20:18
|
||||
F::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow,line=5,col=16:: 10) [chromium] › tests/browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow,line=5,col=16:: 10) [chromium] › tests/browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow,line=5,col=16:: 10) [chromium] › tests/browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
××××F::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow,line=5,col=16:: 11) [chromium] › tests/browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow,line=5,col=16:: 11) [chromium] › tests/browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow,line=5,col=16:: 11) [chromium] › tests/browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
F::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow,line=5,col=16:: 12) [chromium] › tests/browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow,line=5,col=16:: 12) [chromium] › tests/browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow,line=5,col=16:: 12) [chromium] › tests/browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar/component-lab", waiting until "load"%0A%0A%0A 3 | for (const locale of ['en', 'fr', 'ar'] as const) {%0A 4 | test(`${locale} component fixture renders without horizontal overflow`, async ({ page }) => {%0A > 5 | await page.goto(`/${locale}/component-lab`);%0A | ^%0A 6 | await expect(page.locator('h1')).toBeVisible();%0A 7 | const overflow = await page.evaluate(%0A 8 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:5:16
|
||||
××××F::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return,line=18,col=14:: 13) [chromium] › tests/browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 16 | page,%0A 17 | }) => {%0A > 18 | await page.goto('/en/component-lab');%0A | ^%0A 19 | const firstTab = page.getByRole('tab', { name: 'Reservations' });%0A 20 | await firstTab.focus();%0A 21 | await page.keyboard.press('ArrowRight');%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:18:14
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return,line=18,col=14:: 13) [chromium] › tests/browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 16 | page,%0A 17 | }) => {%0A > 18 | await page.goto('/en/component-lab');%0A | ^%0A 19 | const firstTab = page.getByRole('tab', { name: 'Reservations' });%0A 20 | await firstTab.focus();%0A 21 | await page.keyboard.press('ArrowRight');%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:18:14
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return,line=18,col=14:: 13) [chromium] › tests/browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en/component-lab", waiting until "load"%0A%0A%0A 16 | page,%0A 17 | }) => {%0A > 18 | await page.goto('/en/component-lab');%0A | ^%0A 19 | const firstTab = page.getByRole('tab', { name: 'Reservations' });%0A 20 | await firstTab.focus();%0A 21 | await page.keyboard.press('ArrowRight');%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:18:14
|
||||
F::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent,line=39,col=14:: 14) [chromium] › tests/browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 37 | }) => {%0A 38 | await page.setViewportSize({ width: 320, height: 800 });%0A > 39 | await page.goto('/fr/component-lab');%0A | ^%0A 40 | await page.evaluate(() => (document.body.style.zoom = '2'));%0A 41 | const overflow = await page.evaluate(%0A 42 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth + 1,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:39:14
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent,line=39,col=14:: 14) [chromium] › tests/browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 37 | }) => {%0A 38 | await page.setViewportSize({ width: 320, height: 800 });%0A > 39 | await page.goto('/fr/component-lab');%0A | ^%0A 40 | await page.evaluate(() => (document.body.style.zoom = '2'));%0A 41 | const overflow = await page.evaluate(%0A 42 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth + 1,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:39:14
|
||||
::error file=tests/browser/component-system.spec.ts,title=[chromium] › tests/browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent,line=39,col=14:: 14) [chromium] › tests/browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/fr/component-lab%0A Call log:%0A - navigating to "http://127.0.0.1:3000/fr/component-lab", waiting until "load"%0A%0A%0A 37 | }) => {%0A 38 | await page.setViewportSize({ width: 320, height: 800 });%0A > 39 | await page.goto('/fr/component-lab');%0A | ^%0A 40 | await page.evaluate(() => (document.body.style.zoom = '2'));%0A 41 | const overflow = await page.evaluate(%0A 42 | () => document.documentElement.scrollWidth > document.documentElement.clientWidth + 1,%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/component-system.spec.ts:39:14
|
||||
××××F::error file=tests/browser/navigation.spec.ts,title=[chromium] › tests/browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus,line=6,col=14:: 15) [chromium] › tests/browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 4 |%0A 5 | test('mobile navigation opens modally, closes with Escape, and returns focus', async ({ page }) => {%0A > 6 | await page.goto('/en');%0A | ^%0A 7 | const trigger = page.getByRole('button', { name: 'Open navigation menu' });%0A 8 | await trigger.focus();%0A 9 | await trigger.click();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/navigation.spec.ts:6:14
|
||||
::error file=tests/browser/navigation.spec.ts,title=[chromium] › tests/browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus,line=6,col=14:: 15) [chromium] › tests/browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 4 |%0A 5 | test('mobile navigation opens modally, closes with Escape, and returns focus', async ({ page }) => {%0A > 6 | await page.goto('/en');%0A | ^%0A 7 | const trigger = page.getByRole('button', { name: 'Open navigation menu' });%0A 8 | await trigger.focus();%0A 9 | await trigger.click();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/navigation.spec.ts:6:14
|
||||
::error file=tests/browser/navigation.spec.ts,title=[chromium] › tests/browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus,line=6,col=14:: 15) [chromium] › tests/browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 4 |%0A 5 | test('mobile navigation opens modally, closes with Escape, and returns focus', async ({ page }) => {%0A > 6 | await page.goto('/en');%0A | ^%0A 7 | const trigger = page.getByRole('button', { name: 'Open navigation menu' });%0A 8 | await trigger.focus();%0A 9 | await trigger.click();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/navigation.spec.ts:6:14
|
||||
F::error file=tests/browser/navigation.spec.ts,title=[chromium] › tests/browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark,line=22,col=14:: 16) [chromium] › tests/browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 20 |%0A 21 | test('skip navigation moves focus to the main landmark', async ({ page }) => {%0A > 22 | await page.goto('/en');%0A | ^%0A 23 | await page.keyboard.press('Tab');%0A 24 | const skip = page.getByRole('link', { name: 'Skip to main content' });%0A 25 | await expect(skip).toBeFocused();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/navigation.spec.ts:22:14
|
||||
::error file=tests/browser/navigation.spec.ts,title=[chromium] › tests/browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark,line=22,col=14:: 16) [chromium] › tests/browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 20 |%0A 21 | test('skip navigation moves focus to the main landmark', async ({ page }) => {%0A > 22 | await page.goto('/en');%0A | ^%0A 23 | await page.keyboard.press('Tab');%0A 24 | const skip = page.getByRole('link', { name: 'Skip to main content' });%0A 25 | await expect(skip).toBeFocused();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/navigation.spec.ts:22:14
|
||||
::error file=tests/browser/navigation.spec.ts,title=[chromium] › tests/browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark,line=22,col=14:: 16) [chromium] › tests/browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 20 |%0A 21 | test('skip navigation moves focus to the main landmark', async ({ page }) => {%0A > 22 | await page.goto('/en');%0A | ^%0A 23 | await page.keyboard.press('Tab');%0A 24 | const skip = page.getByRole('link', { name: 'Skip to main content' });%0A 25 | await expect(skip).toBeFocused();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/navigation.spec.ts:22:14
|
||||
××××F::error file=tests/browser/no-javascript.spec.ts,title=[chromium] › tests/browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled,line=6,col=14:: 17) [chromium] › tests/browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled %0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 4 | const context = await browser.newContext({ javaScriptEnabled: false, colorScheme: 'dark' });%0A 5 | const page = await context.newPage();%0A > 6 | await page.goto('/ar');%0A | ^%0A 7 | await expect(page.locator('html')).toHaveAttribute('lang', 'ar');%0A 8 | await expect(page.locator('html')).toHaveAttribute('dir', 'rtl');%0A 9 | await expect(page.locator('h1')).toBeVisible();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/no-javascript.spec.ts:6:14
|
||||
::error file=tests/browser/no-javascript.spec.ts,title=[chromium] › tests/browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled,line=6,col=14:: 17) [chromium] › tests/browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled %0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 4 | const context = await browser.newContext({ javaScriptEnabled: false, colorScheme: 'dark' });%0A 5 | const page = await context.newPage();%0A > 6 | await page.goto('/ar');%0A | ^%0A 7 | await expect(page.locator('html')).toHaveAttribute('lang', 'ar');%0A 8 | await expect(page.locator('html')).toHaveAttribute('dir', 'rtl');%0A 9 | await expect(page.locator('h1')).toBeVisible();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/no-javascript.spec.ts:6:14
|
||||
::error file=tests/browser/no-javascript.spec.ts,title=[chromium] › tests/browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled,line=6,col=14:: 17) [chromium] › tests/browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled %0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/ar%0A Call log:%0A - navigating to "http://127.0.0.1:3000/ar", waiting until "load"%0A%0A%0A 4 | const context = await browser.newContext({ javaScriptEnabled: false, colorScheme: 'dark' });%0A 5 | const page = await context.newPage();%0A > 6 | await page.goto('/ar');%0A | ^%0A 7 | await expect(page.locator('html')).toHaveAttribute('lang', 'ar');%0A 8 | await expect(page.locator('html')).toHaveAttribute('dir', 'rtl');%0A 9 | await expect(page.locator('h1')).toBeVisible();%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/no-javascript.spec.ts:6:14
|
||||
F::error file=tests/browser/responsive.spec.ts,title=[chromium] › tests/browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px,line=9,col=18:: 18) [chromium] › tests/browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px ───%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 7 | test(`${locale} has no horizontal overflow at ${width}px`, async ({ page }) => {%0A 8 | await page.setViewportSize({ width, height: 900 });%0A > 9 | await page.goto(`/${locale}`);%0A | ^%0A 10 | const overflow = await page.evaluate(%0A 11 | () => document.documentElement.scrollWidth - document.documentElement.clientWidth,%0A 12 | );%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/responsive.spec.ts:9:18
|
||||
::error file=tests/browser/responsive.spec.ts,title=[chromium] › tests/browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px,line=9,col=18:: 18) [chromium] › tests/browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px ───%0A%0A Retry #1 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 7 | test(`${locale} has no horizontal overflow at ${width}px`, async ({ page }) => {%0A 8 | await page.setViewportSize({ width, height: 900 });%0A > 9 | await page.goto(`/${locale}`);%0A | ^%0A 10 | const overflow = await page.evaluate(%0A 11 | () => document.documentElement.scrollWidth - document.documentElement.clientWidth,%0A 12 | );%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/responsive.spec.ts:9:18
|
||||
::error file=tests/browser/responsive.spec.ts,title=[chromium] › tests/browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px,line=9,col=18:: 18) [chromium] › tests/browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px ───%0A%0A Retry #2 ───────────────────────────────────────────────────────────────────────────────────────%0A Error: page.goto: net::ERR_BLOCKED_BY_ADMINISTRATOR at http://127.0.0.1:3000/en%0A Call log:%0A - navigating to "http://127.0.0.1:3000/en", waiting until "load"%0A%0A%0A 7 | test(`${locale} has no horizontal overflow at ${width}px`, async ({ page }) => {%0A 8 | await page.setViewportSize({ width, height: 900 });%0A > 9 | await page.goto(`/${locale}`);%0A | ^%0A 10 | const overflow = await page.evaluate(%0A 11 | () => document.documentElement.scrollWidth - document.documentElement.clientWidth,%0A 12 | );%0A at /mnt/data/phase12_work/RentalDriveGo/tests/browser/responsive.spec.ts:9:18
|
||||
××××
|
||||
@@ -0,0 +1,47 @@
|
||||
Listing tests:
|
||||
[chromium] › a11y/component-system.a11y.spec.ts:5:7 › en component fixture has no detectable accessibility violations
|
||||
[chromium] › a11y/component-system.a11y.spec.ts:5:7 › fr component fixture has no detectable accessibility violations
|
||||
[chromium] › a11y/component-system.a11y.spec.ts:5:7 › ar component fixture has no detectable accessibility violations
|
||||
[chromium] › a11y/shell.a11y.spec.ts:6:9 › en light shell has no detectable WCAG A/AA violations
|
||||
[chromium] › a11y/shell.a11y.spec.ts:6:9 › en dark shell has no detectable WCAG A/AA violations
|
||||
[chromium] › a11y/shell.a11y.spec.ts:6:9 › fr light shell has no detectable WCAG A/AA violations
|
||||
[chromium] › a11y/shell.a11y.spec.ts:6:9 › fr dark shell has no detectable WCAG A/AA violations
|
||||
[chromium] › a11y/shell.a11y.spec.ts:6:9 › ar light shell has no detectable WCAG A/AA violations
|
||||
[chromium] › a11y/shell.a11y.spec.ts:6:9 › ar dark shell has no detectable WCAG A/AA violations
|
||||
[chromium] › browser/component-system.spec.ts:4:7 › en component fixture renders without horizontal overflow
|
||||
[chromium] › browser/component-system.spec.ts:4:7 › fr component fixture renders without horizontal overflow
|
||||
[chromium] › browser/component-system.spec.ts:4:7 › ar component fixture renders without horizontal overflow
|
||||
[chromium] › browser/component-system.spec.ts:15:5 › component controls support keyboard interaction and dialog focus return
|
||||
[chromium] › browser/component-system.spec.ts:35:5 › component fixture reflows at narrow mobile and 200 percent zoom equivalent
|
||||
[chromium] › browser/navigation.spec.ts:5:5 › mobile navigation opens modally, closes with Escape, and returns focus
|
||||
[chromium] › browser/navigation.spec.ts:21:5 › skip navigation moves focus to the main landmark
|
||||
[chromium] › browser/no-javascript.spec.ts:3:5 › server shell remains readable with JavaScript disabled
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 320px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 390px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 768px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 1024px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › en has no horizontal overflow at 1440px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › fr has no horizontal overflow at 320px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › fr has no horizontal overflow at 390px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › fr has no horizontal overflow at 768px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › fr has no horizontal overflow at 1024px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › fr has no horizontal overflow at 1440px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › ar has no horizontal overflow at 320px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › ar has no horizontal overflow at 390px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › ar has no horizontal overflow at 768px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › ar has no horizontal overflow at 1024px
|
||||
[chromium] › browser/responsive.spec.ts:7:9 › ar has no horizontal overflow at 1440px
|
||||
[chromium] › browser/responsive.spec.ts:18:5 › shell remains operable at a 320 CSS pixel reflow equivalent to 200 percent zoom
|
||||
[chromium] › browser/shell.spec.ts:8:7 › en shell is server rendered
|
||||
[chromium] › browser/shell.spec.ts:8:7 › fr shell is server rendered
|
||||
[chromium] › browser/shell.spec.ts:8:7 › ar shell is server rendered
|
||||
[chromium] › browser/shell.spec.ts:38:5 › root locale detection honors Accept-Language
|
||||
[chromium] › browser/shell.spec.ts:48:5 › locale switching keeps the semantic route and approved campaign state
|
||||
[chromium] › browser/shell.spec.ts:54:5 › pending route shells are localized and noindex
|
||||
[chromium] › browser/text-expansion.spec.ts:4:7 › fr shell tolerates long content expansion
|
||||
[chromium] › browser/text-expansion.spec.ts:4:7 › ar shell tolerates long content expansion
|
||||
[chromium] › browser/theme-csp.spec.ts:3:5 › explicit dark theme is present on the server-rendered root
|
||||
[chromium] › browser/theme-csp.spec.ts:27:5 › system preference resolves before interaction
|
||||
[chromium] › browser/theme-csp.spec.ts:36:5 › system follows operating-system changes while explicit preferences ignore them
|
||||
Total: 44 tests in 9 files
|
||||
::notice title=🎭 Playwright Run Summary:: 44 did not run
|
||||
@@ -0,0 +1,3 @@
|
||||
[WARN] Unsupported engine: wanted: {"node":"24.17.0"} (current: {"node":"v22.16.0","pnpm":"11.9.0"})
|
||||
[WARN] POST https://registry.npmjs.org/-/npm/v1/security/advisories/bulk error (EAI_AGAIN). Will retry in 10 seconds. 2 retries left.
|
||||
[WARN] POST https://registry.npmjs.org/-/npm/v1/security/advisories/bulk error (EAI_AGAIN). Will retry in 1 minute. 1 retries left.
|
||||
@@ -0,0 +1,30 @@
|
||||
[WARN] Unsupported engine: wanted: {"node":"24.17.0"} (current: {"node":"v22.16.0","pnpm":"11.9.0"})
|
||||
? Verifying lockfile against supply-chain policies (533 entries)...
|
||||
Lockfile is up to date, resolution step is skipped
|
||||
[WARN] GET https://registry.npmjs.org/@adobe%2Fcss-tools error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@asamuzakjp%2Fcss-color error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@asamuzakjp%2Fdom-selector error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
Progress: resolved 1, reused 0, downloaded 0, added 0
|
||||
Packages: +449
|
||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Progress: resolved 449, reused 0, downloaded 0, added 0
|
||||
[WARN] GET https://registry.npmjs.org/@asamuzakjp%2Fgenerational-cache error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@axe-core%2Fplaywright error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@asamuzakjp%2Fnwsapi error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fcode-frame error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fcompat-data error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fgenerator error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fcore error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-globals error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-compilation-targets error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-module-imports error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-module-transforms error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-string-parser error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-validator-identifier error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelper-validator-option error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fhelpers error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fparser error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Fruntime error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Ftemplate error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Ftraverse error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
[WARN] GET https://registry.npmjs.org/@babel%2Ftypes error (EAI_AGAIN). Will retry in 1 second. 4 retries left.
|
||||
@@ -0,0 +1,4 @@
|
||||
▲ Next.js 16.2.9
|
||||
- Local: http://127.0.0.1:3100
|
||||
- Network: http://127.0.0.1:3100
|
||||
✓ Ready in 0ms
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 typecheck
|
||||
> tsc --noEmit
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,34 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 test:unit
|
||||
> vitest run --coverage
|
||||
|
||||
|
||||
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.9 [39m[90m/mnt/data/phase12_work/RentalDriveGo[39m
|
||||
[2mCoverage enabled with [22m[33mv8[39m
|
||||
|
||||
[32m✓[39m tests/unit/theme.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/csp.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/format.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 79[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/localization.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/components/actions.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 234[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/components/evidence.test.tsx [2m([22m[2m3 tests[22m[2m)[22m[32m 217[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/components/forms.test.tsx [2m([22m[2m2 tests[22m[2m)[22m[32m 224[2mms[22m[39m
|
||||
[32m✓[39m tests/unit/components/controls.test.tsx [2m([22m[2m2 tests[22m[2m)[22m[32m 297[2mms[22m[39m
|
||||
|
||||
[2m Test Files [22m [1m[32m8 passed[39m[22m[90m (8)[39m
|
||||
[2m Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
|
||||
[2m Start at [22m 22:37:18
|
||||
[2m Duration [22m 9.12s[2m (transform 2.44s, setup 7.11s, import 3.02s, tests 1.07s, environment 48.19s)[22m
|
||||
|
||||
[34m % [39m[2mCoverage report from [22m[33mv8[39m
|
||||
--------------|---------|----------|---------|---------|-------------------
|
||||
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
|
||||
--------------|---------|----------|---------|---------|-------------------
|
||||
All files | 92.4 | 86.04 | 95.45 | 92.64 |
|
||||
localization | 90.9 | 82.75 | 94.11 | 91.07 |
|
||||
config.ts | 90.9 | 82.75 | 94.11 | 91.07 | 58,67,89,112,127
|
||||
security | 100 | 100 | 100 | 100 |
|
||||
csp.ts | 100 | 100 | 100 | 100 |
|
||||
theme | 100 | 87.5 | 100 | 100 |
|
||||
config.ts | 100 | 87.5 | 100 | 100 | 18
|
||||
--------------|---------|----------|---------|---------|-------------------
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
> rentaldrivego-web@0.3.0 validate
|
||||
> node scripts/run-validations.mjs
|
||||
|
||||
PASS: Phase 9 contract package is immutable and 61 payload checksums match.
|
||||
PASS: Pinned Node 24.17.0, pnpm 11.9.0, and 25 exact direct dependency versions match the lockfile.
|
||||
PASS: English, French, and Arabic catalogs have exact key parity and valid direction metadata.
|
||||
PASS: 5 route IDs have complete locale, runtime, hash, query, and hreflang contracts.
|
||||
PASS: Phase 9 semantic tokens are unchanged and application styles contain no raw palette colors.
|
||||
PASS: Phase 11 component tokens, theme fallback, and application-shell foundations are present.
|
||||
PASS: 46 CSS files use direction-safe logical declarations.
|
||||
PASS: Runtime source contains no placeholder destination, simulated submission, or research-only backdoor.
|
||||
PASS: Localized canonical, hreflang, Open Graph, social, and robots foundations are present.
|
||||
PASS: 60 inventory entries and 93 component source files satisfy Phase 12 static controls.
|
||||
Reference in New Issue
Block a user