init project

This commit is contained in:
root
2026-06-25 19:06:59 -04:00
parent c5dfee6efb
commit 5d017f533a
349 changed files with 31330 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
# Contributing to RentalDriveGo Web
## Required runtime
Use Node.js `24.17.0` and pnpm `11.9.0`. Exact dependency versions and the frozen lockfile are part of the architecture contract, not optional decoration.
## Before editing
1. Read `docs/PHASE_12_HANDOFF_v1.0.md` for component rules.
2. Check `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv` before adding copy, routes, claims, destinations, integrations, or evidence.
3. Preserve `contracts/phase9` byte-for-byte.
4. Consume component-facing tokens from `src/styles/component-tokens.css`.
5. Use translation resources and route IDs rather than hard-coded visible copy or paths.
## Required checks
```bash
pnpm install --frozen-lockfile
pnpm validate
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 a reviewed release candidate:
```bash
pnpm manifest:generate
pnpm validate:package
```
Do not regenerate visual snapshots merely to silence a failure. A consistently wrong screenshot is still wrong, just more organized.
## Architecture changes
Changes to routing, localization loading, token authority, theme persistence, CSP, styling system, state management, metadata generation, or the server/client boundary require an ADR before implementation.
+30
View File
@@ -0,0 +1,30 @@
# syntax=docker/dockerfile:1.7
FROM node:24.17.0-bookworm-slim AS base
ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH
RUN corepack enable && corepack prepare pnpm@11.9.0 --activate
WORKDIR /app
FROM base AS dependencies
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
RUN pnpm install --frozen-lockfile
FROM base AS builder
COPY --from=dependencies /app/node_modules ./node_modules
COPY . .
ENV NEXT_TELEMETRY_DISABLED=1
RUN pnpm validate && pnpm typecheck && pnpm lint && SITE_ORIGIN=http://127.0.0.1:3000 PUBLIC_RELEASE_APPROVED=false pnpm build
FROM node:24.17.0-bookworm-slim AS runner
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=3000
ENV HOSTNAME=0.0.0.0
WORKDIR /app
RUN groupadd --system --gid 1001 nodejs && useradd --system --uid 1001 --gid nodejs nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
+749
View File
@@ -0,0 +1,749 @@
{
"schema_version": "1.0",
"project": "RentalDriveGo",
"phase": 10,
"generated_at": "2026-06-25",
"excludes": [
".git",
".next",
"node_modules",
"coverage",
"playwright-report",
"test-results",
"PHASE_10_PACKAGE_MANIFEST_v1.0.json",
"tsconfig.tsbuildinfo"
],
"file_count": 146,
"files": [
{
"path": ".dockerignore",
"bytes": 97,
"sha256": "d78b037a836881c2d63f074d525b8027b2ecb06fefe3af4d5356327ec01dc5e1"
},
{
"path": ".editorconfig",
"bytes": 188,
"sha256": "a6b98ea7cb6d61ed8d430dd0dffa46c87012b5cf859d4ce7207898954951fdcd"
},
{
"path": ".env.example",
"bytes": 221,
"sha256": "8b9baf40c7a324b56c2b0876f761070a995328843a0f56d7bf97bfeafd06b297"
},
{
"path": ".github/dependabot.yml",
"bytes": 416,
"sha256": "0a9bdd1890c8fcb78f61f91071df45fecbdcfbbd48441f7da0dba266ba168d82"
},
{
"path": ".github/workflows/ci.yml",
"bytes": 1705,
"sha256": "b6778e7919fd7e27c2ab77e460af402bcf170bcedd3a0bc0887af07b9c5890f1"
},
{
"path": ".gitignore",
"bytes": 135,
"sha256": "01c7cded7467134f023106b85684e3ce5df721149fc3ff4af5e02ef79541bb14"
},
{
"path": ".node-version",
"bytes": 8,
"sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9"
},
{
"path": ".npmrc",
"bytes": 146,
"sha256": "e696a3cc1b84316377f18da909b079072ce02383d16c8fed410f8cabbb9ac054"
},
{
"path": ".nvmrc",
"bytes": 8,
"sha256": "98182b41c9ce3357797985cf12dc3b0124490ef88bc918a905373e7688e6aec9"
},
{
"path": ".prettierignore",
"bytes": 129,
"sha256": "272622f9ebbe7cc23717e19053be7c49a6fc63353cad9be57f107cd96b96a142"
},
{
"path": "contracts/phase9/09_DEVELOPER_HANDOFF_v1.0.md",
"bytes": 8091,
"sha256": "e82d486f1e566d1bf0263f1baa7dd8035ae62da5c36bb6bfa417e61331ec8d51"
},
{
"path": "contracts/phase9/annotated/ANNOTATION_INDEX_v1.0.md",
"bytes": 685,
"sha256": "a2e87dfdb138409604cac4cc5f52375cce97940da7363f7778af30490699decd"
},
{
"path": "contracts/phase9/annotated/demo-dialog-en-light_v1.0.png",
"bytes": 51457,
"sha256": "d91bf102100af48feac31478770f8bfdded994ac8b47f60845e4465c50462394"
},
{
"path": "contracts/phase9/annotated/desktop-en-light_v1.0.png",
"bytes": 144908,
"sha256": "a4151a788317aa9bf8f7262f09f645ebdb54d4a3e1254ab5703ae37e8d3cec16"
},
{
"path": "contracts/phase9/annotated/mobile-ar-dark_v1.0.png",
"bytes": 75193,
"sha256": "6adcaf68b48bacbf105b670e71edda078a60aa26b732831bd194e1cb9da11556"
},
{
"path": "contracts/phase9/annotated/mobile-drawer-ar-dark_v1.0.png",
"bytes": 28321,
"sha256": "bc0c14447fb6e80ce904ffcb13c237b51eaa92723702191139bee59b0f7ebdeb"
},
{
"path": "contracts/phase9/annotated/SCREEN_ANNOTATIONS_v1.0.csv",
"bytes": 1457,
"sha256": "d7b8120926a545f472b62a436b87d2a9d20320a4d95fcf90aa96162c50e8a6da"
},
{
"path": "contracts/phase9/annotated/tablet-fr-light_v1.0.png",
"bytes": 102305,
"sha256": "dd526fe6859e470ea4c67b4c1ef511cfe0e11126561f86bcff07e57378084347"
},
{
"path": "contracts/phase9/annotated/tour-dialog-fr-dark_v1.0.png",
"bytes": 94445,
"sha256": "2dd7b24f6505f16a565ac1b5490499ccdae91d0257de608c97c54b7d5b6c2c78"
},
{
"path": "contracts/phase9/assets/ASSET_MANIFEST_v1.0.csv",
"bytes": 1049,
"sha256": "dd77547327096b4c4084ec8b9311aaff719e378a91f16c2b3ea39832d1bc7b3a"
},
{
"path": "contracts/phase9/assets/ASSET_USAGE_RULES_v1.0.md",
"bytes": 747,
"sha256": "46821e8e6588a62eba860e4d228b2910a05aa60124610966bdc524a86921f658"
},
{
"path": "contracts/phase9/assets/brand-mark_v1.0.svg",
"bytes": 443,
"sha256": "bcb3a3fb8037aec69d92da06f0d60fab969547b979a0112f12e6a5c2ab8efdaa"
},
{
"path": "contracts/phase9/assets/logo-horizontal_v1.0.svg",
"bytes": 576,
"sha256": "04be1c45e1b6e85586efc6dbd36bf3e1e9275fa138a36b93cf6532bbd7409b02"
},
{
"path": "contracts/phase9/components/COMPONENT_CONTRACTS_v1.0.md",
"bytes": 9800,
"sha256": "84b455fe725bff11b6ab54bb13373b1aa52991b062a36fad07db47a940187a53"
},
{
"path": "contracts/phase9/components/COMPONENT_STATE_MATRIX_v1.0.csv",
"bytes": 4283,
"sha256": "c85f96f6d5e020a27c2bd44427a2c3aed3f3cad8657d88a22fc2de9ecd3f6cda"
},
{
"path": "contracts/phase9/components/CONTENT_CONSTRAINTS_v1.0.csv",
"bytes": 1147,
"sha256": "f4d32b7775f856ff4aac775791566427e3cc340f39cd3f9845d8a3271167228b"
},
{
"path": "contracts/phase9/components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv",
"bytes": 1416,
"sha256": "0e0e262c0388c37e41f5ab7f3e80835b8edb09e00a9264e81d92953743893353"
},
{
"path": "contracts/phase9/components/RTL_THEME_MATRIX_v1.0.csv",
"bytes": 4048,
"sha256": "b47f4b3b4e50f1fed6b1b69523a05d61952773e95a966288bfba85dd414edb15"
},
{
"path": "contracts/phase9/DECISION_LOG_v9.0.md",
"bytes": 38775,
"sha256": "85569a7418f8cad57d094ee9ec1d83b7727b5ab91a405cbda26de0271a8d76a1"
},
{
"path": "contracts/phase9/DEFINITION_OF_DONE_v1.0.md",
"bytes": 3234,
"sha256": "dfe53a550b7853f015901b83adb960ffb26ab08fa6d7f9f8f8a3386adc705179"
},
{
"path": "contracts/phase9/implementation/component-contracts_v1.0.ts",
"bytes": 2844,
"sha256": "177dd2420b804290cf1296e43f41a7e759c8859b3253073fbdc523a81f6f94c0"
},
{
"path": "contracts/phase9/implementation/hreflang-generator_v1.0.ts",
"bytes": 751,
"sha256": "ab919a36a5d08a28c38ae51b4ddd0d84cef5d3ec3bed13649ebd26c3fb80ac8a"
},
{
"path": "contracts/phase9/implementation/localization-config_v1.0.ts",
"bytes": 772,
"sha256": "bd8ca09f121bfe516ece817948a81d58136e9205fbd2c05dad2ce87f2d7a1782"
},
{
"path": "contracts/phase9/implementation/TECHNOLOGY_PROFILE_v1.0.md",
"bytes": 1953,
"sha256": "a59504c81bdbb6396eb21e68518ca84862ac89c6c65744de710e9ae273e47c7b"
},
{
"path": "contracts/phase9/implementation/theme-config_v1.0.ts",
"bytes": 725,
"sha256": "f56d37da4129d5830ba9ebd77b18cd6084a144e8514bfd8a8152387ecf76607c"
},
{
"path": "contracts/phase9/interaction/ANALYTICS_EVENT_SPEC_v1.0.csv",
"bytes": 1713,
"sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008"
},
{
"path": "contracts/phase9/interaction/analytics-contract_v1.0.ts",
"bytes": 832,
"sha256": "2716eb69cc98032005e068ab7bdc265a4c896a8e1a1bed682c7fdd4f45368123"
},
{
"path": "contracts/phase9/interaction/demo-form-contract_v1.0.ts",
"bytes": 632,
"sha256": "194db77f7cfca417dbe35e6f2c2ea94cdd02806b83b1d0f1993fe509d8c10154"
},
{
"path": "contracts/phase9/interaction/INTERACTION_NOTES_v1.0.md",
"bytes": 2332,
"sha256": "0456815622cbb072f1a7594e6b47f52e572e2570280c3a618876246e1b43d2a7"
},
{
"path": "contracts/phase9/interaction/theme-bootstrap_v1.0.js",
"bytes": 753,
"sha256": "7b89a849bdcd72e1049714ebf76f0c0decb39e44261480f0cb08bb7dfe734e4a"
},
{
"path": "contracts/phase9/localization/locales/ar/homepage.json",
"bytes": 18615,
"sha256": "fe08aabd60203dbdebc718117f5e497b52a453a8a6fb671fe0bca28651bf0d47"
},
{
"path": "contracts/phase9/localization/locales/en/homepage.json",
"bytes": 13869,
"sha256": "a5ed956c7f07fad016ca39b40b770c25e8beeae2799ff0fece82dbf087f18e51"
},
{
"path": "contracts/phase9/localization/locales/fr/homepage.json",
"bytes": 15512,
"sha256": "24079356bd47431ffeb66b7eb2981e108c03080205861b1bb42514b03b945a0a"
},
{
"path": "contracts/phase9/localization/LOCALIZATION_IMPLEMENTATION_v1.0.md",
"bytes": 2062,
"sha256": "87a494d7ef7ed9f5012ed1699edf90e38995aa89a0efc3800db854e1d57e1024"
},
{
"path": "contracts/phase9/localization/ROUTE_MANIFEST_v1.0.json",
"bytes": 1573,
"sha256": "fa29b8d31da1f36f87d216a1228fd1bbe1cde337636950b40b0024a10efaf49a"
},
{
"path": "contracts/phase9/localization/TRANSLATION_KEY_INVENTORY_v1.0.csv",
"bytes": 10599,
"sha256": "01289dc9eb94d546ae717b881b2aed4dfc63b38df38e7767054800122bbb46c2"
},
{
"path": "contracts/phase9/OPEN_ISSUE_REGISTER_v1.0.csv",
"bytes": 3519,
"sha256": "b8778b3dc7d1e47446584cac046d490a9932c3dfdfa03750716f29852694a214"
},
{
"path": "contracts/phase9/OPEN_QUESTIONS_v1.0.md",
"bytes": 1085,
"sha256": "82a2abd71830fa4023d346f3b42b138de9e1bbdff74a827d770e6b660d89bd0e"
},
{
"path": "contracts/phase9/PACKAGE_MANIFEST_v1.0.json",
"bytes": 10649,
"sha256": "1a143f086f40f83414460bd4519e86bd3a34617079e3cfef4c5736375460a24e"
},
{
"path": "contracts/phase9/PHASE_9_HANDOFF_v1.0.md",
"bytes": 939,
"sha256": "90530b4e70d1fd64d5d934429c009431902639c0570e7944cf050e6d67eb73a3"
},
{
"path": "contracts/phase9/qa/ACCESSIBILITY_CHECKLIST_v1.0.csv",
"bytes": 1498,
"sha256": "0d9c108e0c02b78aaf11badf6b5f5125cac2b03876cfddf82bd2e97230fdd28b"
},
{
"path": "contracts/phase9/qa/BROWSER_SUPPORT_MATRIX_v1.0.csv",
"bytes": 986,
"sha256": "5ffb43732fea90530b1b088fb68172b9fc7b2c2683198448734a21cf39c234d1"
},
{
"path": "contracts/phase9/qa/PERFORMANCE_BUDGETS_v1.0.json",
"bytes": 815,
"sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8"
},
{
"path": "contracts/phase9/qa/PLAYWRIGHT_ACCEPTANCE_SPEC_v1.0.md",
"bytes": 800,
"sha256": "b16384a861d06eb76db5a836868d9a6e03cf72a6a896209279330e19a8d1a785"
},
{
"path": "contracts/phase9/qa/QA_MATRIX_v1.0.csv",
"bytes": 3557,
"sha256": "6b14b92ce20a9d706de7d6d4cf9f0bb450ecceed27673ed62ae01e145d2143f8"
},
{
"path": "contracts/phase9/qa/test-ids_v1.0.csv",
"bytes": 598,
"sha256": "6201007ae98632654a2684a0b09ce95d85d9870e0f29774687df0a9876048202"
},
{
"path": "contracts/phase9/qa/validate-phase9-package_v1.0.mjs",
"bytes": 2534,
"sha256": "631892318cf95c0530a605e5bf08def9b06c93af79b555205f3aeb8a2bcd87ed"
},
{
"path": "contracts/phase9/qa/visual-regression-scenarios_v1.0.json",
"bytes": 1401,
"sha256": "08a04f676cbb93e73b4c6bc112a55ebf287cb97be3dd3176ab80161e6de743c2"
},
{
"path": "contracts/phase9/README_v1.0.md",
"bytes": 1258,
"sha256": "ef0010b98ba641c4db453d875171a0d1dad4cb17e991ad23698acde8ac4783ae"
},
{
"path": "contracts/phase9/reference/FINDINGS_REPORT_v1.0.md",
"bytes": 3062,
"sha256": "ba34afd535856d0eaa8ed7e174c23a7b5f0eae87344c8fcee5daafe00c068ce4"
},
{
"path": "contracts/phase9/reference/PHASE_8_HANDOFF_v1.0.md",
"bytes": 1117,
"sha256": "2e51ed6645fcc99f30cd4aa9da11ac59e5c2e331c384bfbd758739ad6f42c788"
},
{
"path": "contracts/phase9/reference/PRIORITIZED_REVISIONS_v1.0.csv",
"bytes": 1071,
"sha256": "65b17813756a2d01c8a9df9faa049b170dca197f243b62a44e070d69f8959df5"
},
{
"path": "contracts/phase9/reference/SUCCESS_METRICS_v1.0.csv",
"bytes": 1552,
"sha256": "e7b734564735ab65dcaf84ab8374ba163472cca48db1257c4c626415a779ecbe"
},
{
"path": "contracts/phase9/reference/VALIDATION_RESULTS_v1.0.md",
"bytes": 2068,
"sha256": "3cb17f099569e5bdf4bcd731fe7f687d1636f0e82623c205e07df2cdc2b7d2f2"
},
{
"path": "contracts/phase9/SOURCE_TRACEABILITY_v1.0.csv",
"bytes": 765,
"sha256": "76dc8677ad0d50263301fd5242bc0649c23bb01d3bbd099bdc8a7e2c04fc2d46"
},
{
"path": "contracts/phase9/tokens/design-tokens_v1.0.json",
"bytes": 3771,
"sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c"
},
{
"path": "contracts/phase9/tokens/semantic-tokens_v1.0.css",
"bytes": 3553,
"sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9"
},
{
"path": "contracts/phase9/tokens/TOKEN_USAGE_RULES_v1.0.md",
"bytes": 1222,
"sha256": "b9f7d9b0a9c0595e6f6df2a53e0bcf4acfb47a56abfc6c590a6281c15b04a7b2"
},
{
"path": "contracts/phase9/tokens/tokens_v1.0.ts",
"bytes": 442,
"sha256": "ec265270251f8dd01d9166aeca3fcec9be2b5e534d825c9058fb6ed3f51e3224"
},
{
"path": "contracts/phase9/validation/CONTENT_AND_STRUCTURE_VALIDATION_v1.0.json",
"bytes": 189,
"sha256": "e055ef15c2de2191a3465d85ed54f4cf6bd9e1cde4d5d2bba787e14873027b73"
},
{
"path": "contracts/phase9/validation/STATIC_VALIDATION_RESULTS_v1.0.json",
"bytes": 56,
"sha256": "b60367adf55cf4c61b705d11131b7adebc0aae6ff53732c8272ec9cf2bc95dd3"
},
{
"path": "contracts/phase9/validation/VALIDATION_RESULTS_v1.0.md",
"bytes": 1179,
"sha256": "6f9df81e75d7149d3826ce215143c21784f39b154660fcefc5325ac114ac70b2"
},
{
"path": "Dockerfile",
"bytes": 1033,
"sha256": "5e586fd24911d9635ac45d36b9dcba24a44c8eb161b61df7d931f1103e0d70f2"
},
{
"path": "docs/architecture/ADR-0001_REPOSITORY_FOUNDATION.md",
"bytes": 8931,
"sha256": "e2933f3ff3bd9c3066027e20049805fbc2e1ce720534998882f110024afba375"
},
{
"path": "docs/BRAND_MIGRATION_v1.0.md",
"bytes": 1322,
"sha256": "b1fb78b8a0c50b629c8f3af36ec841aa2126739008069a80021b18f8219a3d1c"
},
{
"path": "docs/DEPENDENCY_MANIFEST_v1.0.md",
"bytes": 4109,
"sha256": "0dfdaf10352a56b1468ad35436dd873a16d12171e3ea14eac2268359ec02823a"
},
{
"path": "docs/IMPLEMENTATION_ISSUE_REGISTER_v1.0.csv",
"bytes": 5347,
"sha256": "4300820e10088d76f6407ee358a8cc1a3cab89fe6554f658fd770469c8c6c77d"
},
{
"path": "docs/PHASE_10_HANDOFF_v1.0.md",
"bytes": 3370,
"sha256": "8cf52ee1b49cabbf0678da222413b0186ed982fb0c8cfc805482ca18eb1fefc7"
},
{
"path": "docs/PHASE_10_IMPLEMENTATION_REPORT_v1.0.md",
"bytes": 6805,
"sha256": "6a2e5da443bf15351a0e88e5c92117c8f7c780509d51f2e44c4a148a26a6d4e2"
},
{
"path": "docs/quality/VALIDATION_RESULTS_v1.0.json",
"bytes": 1397,
"sha256": "9b663f7667620496bcbd872e3fc06c725adfb7dbbf6d7bfe8848896f400105d7"
},
{
"path": "docs/quality/VALIDATION_RESULTS_v1.0.md",
"bytes": 4623,
"sha256": "47d44ee6095cb0bc68fe23148c98403d39309edbb4dd6acdf4a696019e9f0065"
},
{
"path": "eslint.config.mjs",
"bytes": 1031,
"sha256": "14ef56a9899d4c5440c6fe71e713f321b1e1db3de2041b6ad13cd8f798a5225d"
},
{
"path": "next-env.d.ts",
"bytes": 247,
"sha256": "7b550dda9686c16f36a17bf9051d5dbf31e98555b30d114ac49fc49a1e712651"
},
{
"path": "next.config.ts",
"bytes": 198,
"sha256": "cd5d6988c4b5ba3b924c236876af7df12edf1f6df71d654ed67500ad450a48eb"
},
{
"path": "package.json",
"bytes": 2475,
"sha256": "40f66cebb737aa1c8ddb5d93c1bb8fabdf241a73d66dd28de55f0ecd7bf1b1f5"
},
{
"path": "playwright.config.ts",
"bytes": 1598,
"sha256": "21d4bf2dfc8b8f3b31a411bef9ea2d264f89b21030d778867efff5c8821ad579"
},
{
"path": "pnpm-lock.yaml",
"bytes": 168864,
"sha256": "c8b40337671246d5a691a4c2c322f6ed184c6b7f99c10095519cf768eb1ace3d"
},
{
"path": "pnpm-workspace.yaml",
"bytes": 338,
"sha256": "568eba518a28bcd58534a51483092d0a27919aefaec2446e6dd5c6d6ddd80160"
},
{
"path": "prettier.config.mjs",
"bytes": 164,
"sha256": "2d5316ad27ef10ead128dd2ee82e11b79f067fcf25ea6d504624966739260335"
},
{
"path": "public/.gitkeep",
"bytes": 0,
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": "README.md",
"bytes": 2279,
"sha256": "83218f88d0cebd5c0f27a36c5b0af931437b23d7fb2bde7fe04eb589867311fc"
},
{
"path": "scripts/generate-phase10-manifest.mjs",
"bytes": 1800,
"sha256": "6917fd46f99aacf9de7c89f058380facbf4c8c4adf0baaafb0bf7d1333497808"
},
{
"path": "scripts/lib.mjs",
"bytes": 1446,
"sha256": "81c8af9b271572e92ade805dd317dc8738647efe8e89cb37a7c9d1873b5d5edc"
},
{
"path": "scripts/prepare-standalone.mjs",
"bytes": 813,
"sha256": "f1c1398022048160d71ae14bfa53dd2e431dd2f5aca8f39571de159259af535b"
},
{
"path": "scripts/run-checks.mjs",
"bytes": 600,
"sha256": "aa1d0192134b288c86ffe68b314b2e379d7865d2e8d5ad0d1f7b29c8e744c7ee"
},
{
"path": "scripts/run-validations.mjs",
"bytes": 468,
"sha256": "ebbcc54935bee9cc92d05e0871d31ae0f2218ebbf1712118bfdc5c150a8438bf"
},
{
"path": "scripts/validate-css-logical.mjs",
"bytes": 943,
"sha256": "d47f0346ba94621442c5dc700b53a0219ade3dda7485b4c7f49fb384738c424c"
},
{
"path": "scripts/validate-locales.mjs",
"bytes": 1875,
"sha256": "dfaf3f34079ea571b17dd2d71d0abf47b48be924818b39c5df93495188b95f43"
},
{
"path": "scripts/validate-phase10-manifest.mjs",
"bytes": 1192,
"sha256": "29386f182d08ee9096e51a01ea115ae145023724f3d8527fc3ac550152f34d20"
},
{
"path": "scripts/validate-phase9-contract.mjs",
"bytes": 1424,
"sha256": "5fce16d33bf6cf7d95136b89f62fd595f109c5d003d54652998dfe3e5b866d6e"
},
{
"path": "scripts/validate-prohibited-content.mjs",
"bytes": 1057,
"sha256": "a5977c8dae45a632ee1d90d93bd933a09e0b4bf0be0c4c9d858cb539d2b340cd"
},
{
"path": "scripts/validate-routes.mjs",
"bytes": 1293,
"sha256": "63b4cdf3e4336987563b0e4881843a71381a8ccc6ef0e4fbe182f98ed7055675"
},
{
"path": "scripts/validate-tokens.mjs",
"bytes": 1682,
"sha256": "a508dbee00fe1f991d4f09c2072719e508eb9e14f3ab7d474ba67ca826f45557"
},
{
"path": "src/app/[locale]/layout.tsx",
"bytes": 2188,
"sha256": "f4e261b06bee967dd340f3c456eebcfd2b3f780de28499195d9185a7ecbc165b"
},
{
"path": "src/app/[locale]/page.module.css",
"bytes": 985,
"sha256": "ae34228ae39d572ef8a154f4e4cde305419dab4e967512313ee7255392eec017"
},
{
"path": "src/app/[locale]/page.tsx",
"bytes": 1792,
"sha256": "914d72f687565df88fea30ebf036b5c367682baf0eda35430e125206e552febe"
},
{
"path": "src/app/robots.ts",
"bytes": 397,
"sha256": "6c1e263671da52c65da390bcbf38b2a11ec9c580a0072295cad11028e082900f"
},
{
"path": "src/components/app-shell/LocaleSelector.tsx",
"bytes": 881,
"sha256": "cafa7b4095785297c065a7dcba8e6f0c7deb1a73cb7c7b7cce3b12fa04213b9a"
},
{
"path": "src/components/app-shell/SiteHeader.module.css",
"bytes": 1355,
"sha256": "dd125d995a3f0acc459ac4c71910c065fcda0ea1996e7772683c53e00296c8eb"
},
{
"path": "src/components/app-shell/SiteHeader.tsx",
"bytes": 1380,
"sha256": "953ac72f38b5bacc211adfe626b7c19339fe2c1c97ba60452484e7587688ab55"
},
{
"path": "src/components/app-shell/ThemeController.tsx",
"bytes": 1017,
"sha256": "e3e646ff02c7480a191d4700971ba03b947ddff769687af1f3769e11cd740ce9"
},
{
"path": "src/components/app-shell/ThemeSelector.tsx",
"bytes": 1040,
"sha256": "0f6baf74a2b2f90510d6d1f370f0ac6bdad313efab80c3bee0fc7de308fe5ad1"
},
{
"path": "src/content/locales/ar/homepage.json",
"bytes": 17425,
"sha256": "6f0cba2a159531a55b72f345f760344b44bd670e3cd29685712a9215de5b1721"
},
{
"path": "src/content/locales/ar/shell.json",
"bytes": 197,
"sha256": "80b5fbd63770def8fe1af4b2ae1fe499f4bb80b7c6643ef07f744f490ca534e4"
},
{
"path": "src/content/locales/en/homepage.json",
"bytes": 12775,
"sha256": "c55d2883811bafd7262792169ebc19700e4a39721f9fe63a2baf096593140f8b"
},
{
"path": "src/content/locales/en/shell.json",
"bytes": 130,
"sha256": "c7487774c8df58b6cd27a9a10bfbf092dfd6dc864d69d5d517191ce028496d17"
},
{
"path": "src/content/locales/fr/homepage.json",
"bytes": 14570,
"sha256": "3d1e4143ff05d562bc8a86ff216840f7cb15168c27b982ae90a5e58bb73ecc6e"
},
{
"path": "src/content/locales/fr/shell.json",
"bytes": 138,
"sha256": "f54ea4a7396d6868003db116c88959a0c3cc1ec66ef04b015896d1d088ee14d0"
},
{
"path": "src/contracts/phase9/analytics-contract.ts",
"bytes": 918,
"sha256": "d79b32503a5f8346816c647b8a7f45a62468b96f4fc9525d6d5147b5d2f2ec45"
},
{
"path": "src/contracts/phase9/analytics-event-spec.csv",
"bytes": 1713,
"sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008"
},
{
"path": "src/contracts/phase9/component-contracts.ts",
"bytes": 3041,
"sha256": "45fb0222d99308b2f28014572316b13c2d7308bc16b1bd02f63b6e2257148399"
},
{
"path": "src/contracts/phase9/demo-form-contract.ts",
"bytes": 699,
"sha256": "073cf70224f93312d177f77abd7987704205628209e30c44824ae45f929ee59e"
},
{
"path": "src/contracts/phase9/design-tokens.json",
"bytes": 3771,
"sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c"
},
{
"path": "src/contracts/phase9/performance-budgets.json",
"bytes": 815,
"sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8"
},
{
"path": "src/contracts/phase9/route-manifest.json",
"bytes": 1433,
"sha256": "e08ac94ba1f3899bb02dfa934695f530d1089f9f03b0fadaa0feabd466ad8ec4"
},
{
"path": "src/contracts/phase9/visual-regression-scenarios.json",
"bytes": 1209,
"sha256": "27d961c33c32775485475f7037b8d3bbd13f634b65fe2f59d6eea898860edf5f"
},
{
"path": "src/lib/localization/config.ts",
"bytes": 3907,
"sha256": "3868d2cfbdd9656d0bea1d17df82b2696d78b964712d0e525efa20244e42a186"
},
{
"path": "src/lib/localization/messages.ts",
"bytes": 878,
"sha256": "9307df65a80b08e7e1ea7c4e16358fc5fcbde299a00810076bcb36d0a13f9ced"
},
{
"path": "src/lib/localization/site-origin.ts",
"bytes": 771,
"sha256": "40400ce29fc4adbd9c4490b456968e41fc7596d77ac5bea1c65179e0e4e760ff"
},
{
"path": "src/lib/security/csp.ts",
"bytes": 830,
"sha256": "f9244e061cc397fbe8720a055e5415b6df34e6c74d0c439ae8d25054d1239c5e"
},
{
"path": "src/lib/theme/bootstrap-script.ts",
"bytes": 755,
"sha256": "ad1ac642ca61e133f41a5e5b3c062f1b23046f24a58565c6baaacf8c9b261f12"
},
{
"path": "src/lib/theme/client.ts",
"bytes": 1130,
"sha256": "78663300bbdb2e639d1be58fb3f364171992fa63b720dc34d174e4fda2b7d4a8"
},
{
"path": "src/lib/theme/config.ts",
"bytes": 821,
"sha256": "c04cd00ce7838fc964d5bdbfaa4c2380f7cd774a9d754987946c97ee8849e60c"
},
{
"path": "src/proxy.ts",
"bytes": 2566,
"sha256": "16dcb2bdabd8b5bff91a6b8fe381c6714abd2b8f1d0156a75100c248b7195277"
},
{
"path": "src/styles/globals.css",
"bytes": 1288,
"sha256": "b1ecbb8f758f45b3e9c9447a3f92e3475347bbe5d3e164f525fab6222efd7ff4"
},
{
"path": "src/styles/tokens.css",
"bytes": 3553,
"sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9"
},
{
"path": "tests/a11y/shell.a11y.spec.ts",
"bytes": 781,
"sha256": "9f6299337a822d8e4f6783cbfbb3e5da02e42bcca99d8e4519d7f0193072b205"
},
{
"path": "tests/browser/shell.spec.ts",
"bytes": 1336,
"sha256": "f46239d8bd4c9040f9a11cb85962c340770c941310dbb1eed38d58a91efe5dc8"
},
{
"path": "tests/browser/theme-csp.spec.ts",
"bytes": 1350,
"sha256": "e11eb5c9842fb3c924e30a352c35b31d04159fdd26f8edea525ee1dacce94c73"
},
{
"path": "tests/setup.ts",
"bytes": 43,
"sha256": "91a3c8962a0edcb956206a501d943fe99e1c78c6d4d8b5c9a948a3362c75978c"
},
{
"path": "tests/unit/csp.test.ts",
"bytes": 969,
"sha256": "18e4aa4145976102239e92a9c147cc8f0b8442b1bce37b84888246b137280de9"
},
{
"path": "tests/unit/localization.test.ts",
"bytes": 1860,
"sha256": "501c561559f46f9f599d730aee45d9d6a6880df3a3920f552325c6142e053e40"
},
{
"path": "tests/unit/theme.test.ts",
"bytes": 734,
"sha256": "45f25fd23f69af3df199473053c47fe219c88fb36a58cffac20a125bdbd47433"
},
{
"path": "tests/visual/shell.visual.spec.ts",
"bytes": 1079,
"sha256": "2e0fcfe68b9d056641b8b11256ecfd05219aa9429a2e20d0ec7ecc4db3e376a3"
},
{
"path": "tsconfig.json",
"bytes": 1042,
"sha256": "3d16e624dcc305c31675190a283744e11177f07106f10a60d2e89c753695433b"
},
{
"path": "vitest.config.ts",
"bytes": 699,
"sha256": "c2ac8f10ad2894df28a93e3d2bba2c213f24b9a044db25307078648e010dc3d5"
}
]
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+103
View File
@@ -0,0 +1,103 @@
# RentalDriveGo Web
Phase 11 production foundation for the multilingual RentalDriveGo marketing website.
## Implemented scope
- English, French, and Arabic locale-prefixed routes
- server-rendered `lang` and document-level direction
- immutable Phase 9 tokens plus a documented component-facing token layer
- light, dark, and system themes
- nonce-based CSP-compatible pre-paint theme bootstrap
- CSS-only system-theme fallback
- locale-aware formatters and bidi primitives
- responsive layout primitives
- accessible sticky header and native-dialog mobile navigation
- localized footer
- loading, error, not-found, and pending-destination shells
- localized canonical, reciprocal `hreflang`, Open Graph, and robots foundations
- unit, browser, accessibility, responsive, and visual test definitions
The complete production homepage, demo form, CRM, analytics, pricing, customer evidence, final legal content, login integration, final logo, and external destinations remain outside this phase or explicitly gated.
## Runtime
- Node.js `24.17.0`
- pnpm `11.9.0`
- Next.js `16.2.9`
- React `19.2.7`
Use the exact versions in `.node-version`, `.nvmrc`, `package.json`, and `pnpm-lock.yaml`.
## Local setup
```bash
corepack enable
corepack prepare pnpm@11.9.0 --activate
pnpm install --frozen-lockfile
cp .env.example .env.local
pnpm dev
```
Development routes:
- `/en`
- `/fr`
- `/ar`
Root `/` redirects using the locale cookie, then `Accept-Language`, then English.
## Required checks
```bash
pnpm validate
pnpm validate:package
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
```
Generate reviewed visual baselines only in the pinned browser environment:
```bash
pnpm test:visual:update --project=chromium
```
Do not approve snapshots merely because the pixels repeat reliably. Computers can preserve a mistake with extraordinary discipline.
## Release safety
`PUBLIC_RELEASE_APPROVED` defaults to false. While false, pages emit `noindex` and `robots.txt` disallows crawling.
Do not enable public release until the updated issue register has no blocking release issues. Unapproved login and legal routes render explicit pending shells. Demo and contact actions remain disabled rather than pointing at invented integrations.
## Documentation
- Phase 11 report: `docs/PHASE_11_IMPLEMENTATION_REPORT_v1.0.md`
- Phase 12 handoff: `docs/PHASE_12_HANDOFF_v1.0.md`
- Phase 11 architecture: `docs/architecture/ADR-0002_PHASE_11_FOUNDATIONS.md`
- Token implementation: `docs/TOKEN_IMPLEMENTATION_v1.0.md`
- Updated issue register: `docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv`
- Validation evidence: `docs/quality/PHASE_11_VALIDATION_RESULTS_v1.0.md`
- Manual QA: `docs/quality/MANUAL_QA_RESULTS_v1.0.csv`
- Visual status: `docs/quality/VISUAL_REGRESSION_RESULTS_v1.0.json`
- Contribution rules: `CONTRIBUTING.md`
- Immutable Phase 9 package: `contracts/phase9`
- Phase 11 package manifest: `PHASE_11_PACKAGE_MANIFEST_v1.0.json`
## Phase 12 component system
The repository now contains the reusable RentalDriveGo component system and a guarded component workbench at `/{locale}/component-lab`. Enable it only for development or tests with `COMPONENT_FIXTURES_ENABLED=true`.
Key records:
- `docs/PHASE_12_IMPLEMENTATION_REPORT_v1.0.md`
- `docs/PHASE_13_HANDOFF_v1.0.md`
- `docs/phase12/COMPONENT_CATALOG_v1.0.md`
- `docs/phase12/COMPONENT_INVENTORY_v1.0.json`
- `docs/quality/PHASE_12_VALIDATION_RESULTS_v1.0.md`
Formal acceptance remains gated by the cumulative issue register.
@@ -0,0 +1,147 @@
# Phase 9: Developer Handoff
## 1. Scope
This handoff converts the approved homePageCar design system and Phase 8 prototype into implementation contracts for a multilingual rental-car SaaS marketing website. It covers the homepage, demo-booking flow, guided product tour, responsive navigation, theme selection, locale routing, SEO language relationships, analytics boundaries, accessibility, assets, validation, and release gates.
It does **not** approve unverified capabilities, customer evidence, integrations, certifications, service levels, prices, legal language, CRM behavior, or usability acceptance.
## 2. Implementation authority
Use this precedence when files disagree:
1. `DECISION_LOG_v9.0.md`
2. `09_DEVELOPER_HANDOFF_v1.0.md`
3. component, localization, interaction, token, and QA contracts in this package
4. Phase 8 prototype as behavioral reference only
The prototype is not production source code. Its inline rendering, simulated submission, local research logging, illustrative product UI, and placeholder contact destination must not be copied blindly.
## 3. Required architecture properties
The implementation must:
- render public pages server-side or statically with correct `lang`, `dir`, canonical, and reciprocal `hreflang` before hydration;
- use strict TypeScript for application code;
- consume semantic CSS custom properties, never component-local brand hex values;
- use one component tree for LTR and RTL;
- use locale-prefixed routes and stable route IDs;
- persist explicit theme preference in a first-party cookie and mirror it in local storage;
- run the pre-paint theme bootstrap before blocking styles;
- keep all public strings outside component source except documented proper names and immutable technical identifiers;
- use native semantic controls unless a documented accessibility review approves a replacement;
- provide deterministic state URLs or test fixtures for every visual-regression state;
- gate production analytics behind approved consent rules and exclude form values and free text.
## 4. Breakpoints and layout modes
Breakpoints are layout decisions, not device labels.
| Mode | CSS range | Reference frames | Required behavior |
|---|---:|---|---|
| Compact | 0767 px | 320, 390 | One-column sections; mobile drawer; stacked CTAs; product preview simplified; no horizontal page scroll |
| Medium | 7681119 px | 768, 1024 | Two-column where specified; mobile drawer remains; 4-column workflow allowed; balanced content widths |
| Wide | 1120 px and above | 1280, 1440 | Desktop navigation and controls; 12-column composition; hero 7/5 split; max container 1280 px |
Do not infer new behavior between breakpoints. Follow `components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv`.
## 5. Theme contract
Supported preferences are exactly `light`, `dark`, and `system`. Preference and resolved theme are separate values.
- Cookie: `hpc-theme`, value `light|dark|system`, `Path=/`, `SameSite=Lax`, one-year max age, `Secure` in production.
- Local storage mirror: `hpc.theme.preference`.
- Root attributes: `data-theme-preference` and resolved `data-theme` (`light|dark`).
- Cookie wins if cookie and local storage disagree.
- Default with no stored preference: `system`.
- System updates live on `prefers-color-scheme` changes.
- Theme application has no global transition.
- Set `color-scheme` to the resolved theme.
- The bootstrap must run in `<head>` before blocking CSS and use a CSP nonce or approved hash.
See `interaction/theme-bootstrap_v1.0.js` and `implementation/theme-config_v1.0.ts`.
## 6. Localization and routing contract
Public routes are locale-prefixed: `/en`, `/fr`, `/ar`. English is source/default/fallback, but missing translations fail CI.
- Root `/` may redirect using explicit cookie, then `Accept-Language`, then English.
- Explicit locale URLs are never overridden automatically.
- Arabic renders `<html lang="ar" dir="rtl">`; English and French render `dir="ltr"`.
- Locale switching maps by stable route ID, preserves query parameters approved in the route manifest, and preserves valid section hashes.
- Atomic LTR values inside Arabic use `<bdi dir="ltr">` or an equivalent isolation primitive.
- Language does not determine currency, country, timezone, tax, or phone formatting.
- Reciprocal `hreflang` entries include `en`, `fr`, `ar`, plus `x-default` pointing to `/en`.
See the localization directory for exact rules and generated resources.
## 7. Component implementation
Every public component must implement:
- semantic anatomy and heading rules;
- props and state enums from `implementation/component-contracts_v1.0.ts`;
- explicit compact/medium/wide behavior;
- light/dark behavior via tokens;
- LTR/RTL behavior via logical CSS and selective icon mirroring;
- keyboard and focus behavior;
- visible-copy keys and content bounds;
- stable test IDs only where semantic selectors are insufficient.
No component may introduce a fixed height for translated text, validation messages, cards, buttons, or headings.
## 8. Demo form production contract
Required fields: full name, work email, company, fleet-size range. Optional fields: market/country, preferred language, message.
Submission state machine:
`idle → validating → submitting → success | recoverable_error | terminal_error`
Rules:
- preserve entered data on recoverable service failure;
- focus the first invalid field after summary announcement;
- show inline errors and a form-level summary;
- do not use a toast as the only error record;
- disable duplicate submission while a request is in flight;
- attach an idempotency key to each intentional submission;
- do not log names, emails, company names, messages, or raw server responses;
- render final consent only after Legal approval;
- provide an alternate contact path only after Sales approves a real destination;
- success copy must accurately describe what the backend actually did.
The CRM endpoint, consent language, routing, retries, spam controls, and duplicate policy are release blockers in the issue register.
## 9. Motion and overlays
- Drawer opens from inline-start: left in LTR, right in RTL.
- Drawer and dialogs trap focus, make background inert, support Escape, and return focus to the trigger.
- Backdrop dismissal is allowed for non-destructive dialogs; pending form submission blocks accidental dismissal.
- Animations are 160220 ms and use opacity/transform only.
- `prefers-reduced-motion: reduce` removes smooth scrolling, transforms, shimmer, and non-essential progress animation.
- No information, success, or error state may depend on animation.
## 10. Assets and evidence
Only assets in `assets/ASSET_MANIFEST_v1.0.csv` with status `approved` may ship. The current product preview is `illustrative` and must either receive written approval or be replaced by an evidence-governed product capture before launch.
Product captures require metadata for locale, direction, theme, capture date, product version, approval owner, and expiry/review date. Never mirror, recolor, or invert captures.
## 11. Quality gates
A production candidate must pass:
- locale key parity and linguistic review;
- all listed browser and viewport scenarios;
- keyboard, screen-reader, zoom, reflow, forced-colors, and reduced-motion checks;
- light/dark/system and LTR/RTL visual regression;
- form validation, network failure, duplicate, retry, consent, and CRM integration tests;
- performance budgets in `qa/PERFORMANCE_BUDGETS_v1.0.json`;
- zero open Critical or High issues;
- approved evidence and legal content only;
- the complete definition of done.
## 12. Explicitly unresolved
The final framework, browser policy owner, analytics vendor, CRM, consent implementation, spam protection, product-tour media, market assumptions, multi-location claim, pricing, integrations, security evidence, legal documents, and participant acceptance are not approved. The package supplies a vendor-neutral implementation and a default technical profile, but each unresolved item remains visible and owned in `OPEN_ISSUE_REGISTER_v1.0.csv`.
+198
View File
@@ -0,0 +1,198 @@
# homePageCar — Decision Log
**Version:** 9.0
**Phases:** 1 — Design Foundation through 9 — Developer Handoff
| ID | Decision | Status | Rationale | Consequence |
|---|---|---|---|---|
| D-001 | Use restrained operational blue as the main brand family | Approved | Supports trust, clarity, and product-led presentation | Blue carries navigation, links, selection, and routine primary actions |
| D-002 | Reserve orange for demo conversion and tightly related emphasis | Approved | Preserves conversion salience and prevents visual noise | Orange is not a routine navigation or generic action color |
| D-003 | Use Inter Variable for English and French | Approved | Screen-oriented, broad Latin support, strong UI and marketing utility | One Latin family across website and product-facing UI |
| D-004 | Use Noto Sans Arabic for Arabic | Approved | Broad Arabic-script support and suitable sans-serif structure | Arabic receives separate metrics and locale loading |
| D-005 | Use one token system with separate display and UI roles | Approved | Avoids two unrelated systems while respecting different density needs | Marketing headings and application labels do not share identical sizing |
| D-006 | Adopt blue-600 `#1B5DD8` as brand anchor | Approved | Clear operational blue with useful lighter and darker neighbors | Accessible action background uses blue-700 |
| D-007 | Adopt orange-600 `#EA580C` as accent anchor | Approved | Strong conversion accent without becoming the whole brand | White-text conversion CTA uses orange-700 |
| D-008 | Ban orange-600 with white normal text | Approved restriction | 3.56:1 contrast fails normal-text AA | Use orange-700 in light theme or orange-400 with dark text in dark theme |
| D-009 | Use a 4 px spacing base | Approved | Predictable, scalable, compatible with compact and spacious layouts | Exceptions require explicit optical rationale |
| D-010 | Use 4/8/12 column grids for mobile/tablet/desktop | Approved | Distinct responsive composition without device-specific hacks | Reference frames: 390, 1024, 1440 px |
| D-011 | Cap primary container at 1280 px | Approved | Protects readability while allowing strong product visuals | Wider screens gain outer breathing room, not stretched text |
| D-012 | Use CSS logical properties | Approved | Required for real LTR/RTL parity | Physical left/right spacing tokens are rejected |
| D-013 | Use Lucide as the base icon family | Approved | Consistent 24 px grid and 2 px outline language | Mixing icon families requires a documented exception |
| D-014 | Prefer 44 × 44 px interactive targets | Approved | Exceeds the WCAG 2.2 minimum and improves usability | Compact exceptions must remain accessible |
| D-015 | Require formal Modern Standard Arabic | Approved | Prevents inconsistent regional dialect and preserves professional tone | All Arabic product and marketing copy must be linguistically reviewed |
| D-016 | Avoid automotive racing clichés | Approved | Product is operational software, not performance-car entertainment | No speedometers, racing stripes, carbon fiber, or aggressive neon styling |
| R-001 | Use orange for every primary button | Rejected | Destroys conversion hierarchy | Routine primary actions remain blue |
| R-002 | Force identical line-height across scripts | Rejected | Damages Arabic readability and vertical rhythm | Arabic uses script-specific line heights |
| R-003 | Use fixed-width translated buttons | Rejected | Breaks under French expansion and Arabic content | Buttons are content-driven |
| R-004 | Mirror all icons in RTL | Rejected | Many icons are semantically direction-neutral | Mirror only directional meaning |
| R-005 | Create one type scale for every context | Rejected | Marketing and dense UI have different jobs | Shared foundations, separate role scales |
| D-017 | Use English as source, default, and fallback locale | Approved | Provides one controlled authoring source while all public locales remain independently addressable | Missing translations fail CI; production fallback is logged |
| D-018 | Use locale-prefixed public URLs for every indexable page | Approved | Makes language state shareable, crawlable, and deterministic | All navigation and SEO generation use a central route manifest |
| D-019 | Limit automatic locale detection to root `/` | Approved | Respects explicit URLs and prevents redirect loops or crawler interference | Locale-prefixed pages are never overridden by browser language |
| D-020 | Persist explicit language selection in a first-party cookie | Approved | Allows SSR to honor user choice without relying on client-only state | Manual choice outranks Accept-Language |
| D-021 | Use localized public slugs backed by stable route IDs | Approved | Improves localized readability while preventing routing logic from depending on translated strings | Switchers, sitemaps, and canonicals map by route ID |
| D-022 | Use English/French LTR and Arabic document-level RTL | Approved | Correct browser bidi and layout behavior requires root direction | Arabic pages render `html lang=ar dir=rtl` |
| D-023 | Use formal Modern Standard Arabic only | Approved | Maintains professional, region-neutral baseline | Dialect and colloquial copy fail linguistic review |
| D-024 | Use Latin digits and Gregorian dates in the language-only baseline | Approved | Keeps operational data and identifiers consistent before market-specific preferences exist | Revisit only after Arabic market research |
| D-025 | Use `فحص المركبة` for vehicle inspection | Approved | Clear operational term with broad formal comprehension | `معاينة المركبة` remains a documented secondary term |
| D-026 | Use `عقد الإيجار` for rental agreement | Approved | Concise and standard legal-operational label | Jurisdictional legal review remains required |
| D-027 | Use `مبلغ الضمان` for security deposit | Approved | Avoids confusion between deposit and insurance | Arabic `تأمين` alone is rejected |
| D-028 | Use `معدل استخدام الأسطول` for fleet utilization rate | Approved | Describes use rather than occupancy | Occupancy language is rejected |
| D-029 | Keep currency, country, timezone, tax, and phone behavior independent from language | Approved | Language-only locales do not define business jurisdiction | Formatting consumes explicit data and context |
| D-030 | Use semantic namespaced translation keys | Approved | Supports reuse, context, QA, and refactoring | Source sentences, positions, and visual styles are not keys |
| D-031 | Fail missing translations in CI | Approved | Prevents silent partial localization | Production fallback is a logged safety net, not the workflow |
| D-032 | Use self-canonical locale pages and reciprocal language-only hreflang | Approved | Prevents English from swallowing localized indexing | `x-default` points to `/en` until a neutral selector exists |
| D-033 | Omit regional Open Graph locale until target markets are approved | Approved | Avoids inventing country-region assumptions | Localized OG copy still ships |
| R-006 | Use country flags as language controls | Rejected | Languages are not equivalent to countries | Display language names in their own language |
| R-007 | Redirect explicit locale URLs based on browser language | Rejected | Breaks shareability, intent, crawling, and testing | Detection is root-only |
| R-008 | Use IP geolocation to choose language | Rejected | Country is not language and geolocation is unreliable | Use explicit preference and Accept-Language |
| R-009 | Use English source sentences as translation keys | Rejected | Copy edits become code changes and context is lost | Use semantic namespaced keys |
| R-010 | Simulate Arabic by right-aligning an LTR document | Rejected | Does not provide correct bidi or layout behavior | Set document-level RTL |
| R-011 | Translate check-in/check-out like hotel terminology | Rejected | Misstates rental operational processes | Use pickup, handover, and return terms by perspective |
| R-012 | Infer currency or legal jurisdiction from locale | Rejected | English, French, and Arabic span multiple markets | Use explicit business data |
| R-013 | Publish placeholder logos, metrics, testimonials, or certifications | Rejected | Creates unsupported evidence | Hide evidence sections until approved sources exist |
| D-034 | Organize the library into foundations, behavior primitives, and marketing composites | Approved | Prevents page-specific composition from masquerading as a reusable primitive | Component APIs and ownership follow explicit tiers |
| D-035 | Share behavior primitives with the future product dashboard, not marketing composites by default | Approved | Marketing and operational interfaces have different density and interaction requirements | Dashboard reuse requires a later density specification |
| D-036 | Use one Button component with primary-blue and conversion-orange intents | Approved | Preserves hierarchy and avoids duplicated behavior | Orange remains restricted to demo and related conversion |
| D-037 | Require content-driven dimensions and prohibit truncation of important copy | Approved | French/Arabic expansion and zoom invalidate fixed text geometry | Components change structure before collision |
| D-038 | Require visible labels for all form fields | Approved | Placeholders disappear and are unreliable accessible context | Placeholder-only fields fail review |
| D-039 | Use native HTML semantics as the baseline for controls, tables, disclosures, and dialogs | Approved | Native behavior reduces accessibility defects | Custom widgets require separate interaction contracts |
| D-040 | Use a native date input as the Phase 3 Gregorian baseline | Approved | Custom date pickers are complex and requirements are unresolved | Custom calendar work is deferred |
| D-041 | Use one culturally neutral full-name field in the demo form | Approved | First/last assumptions fail across naming systems | CRM mapping preserves the complete name |
| D-042 | Keep the demo form minimally qualified | Approved | Extra fields increase abandonment and privacy burden | Required: full name, work email, company, fleet-size range |
| D-043 | Evidence-gate metrics, testimonials, case studies, trust marks, and pricing | Approved | A visual component must not make unsupported content publishable | Missing or expired approval suppresses rendering |
| D-044 | Approve pricing cards and pricing comparison as separate components | Approved | Plan orientation and detailed comparison are distinct tasks | Both may coexist; neither ships without approved pricing |
| D-045 | Open mobile navigation from inline-start | Approved | Aligns navigation origin with document direction | Drawer opens left in LTR and right in RTL |
| D-046 | Require overlay focus containment, inert background, Escape policy, and focus return | Approved | Visual layering without focus management is inaccessible | Drawer/modal implementations need behavioral tests |
| D-047 | Place toasts at inline-end and keep critical errors persistent in context | Approved | Locale-aware placement and durable correction prevent missed failures | Error toasts cannot be the sole error record |
| D-048 | Use the same component tree for LTR and RTL | Approved | Direction-specific implementations drift | Direction is resolved through document state, logical CSS, and selective mirroring |
| D-049 | Respect reduced-motion preferences and keep motion non-essential | Approved | Motion should support continuity, not gate understanding | Shimmer and transforms are removed or minimized |
| D-050 | Use English light/LTR only for the initial specimen while requiring full locale/theme tests | Approved | Gives a concrete first specimen without pretending it proves conformance | Acceptance still requires en/fr/ar and light/dark |
| R-014 | Create separate LTR and RTL component implementations | Rejected | Guarantees drift and mismatched behavior | Use one semantic component tree |
| R-015 | Use fixed-height cards, buttons, labels, or validation regions | Rejected | Breaks expansion, zoom, and Arabic metrics | Use content-driven block sizes |
| R-016 | Publish placeholder metrics, logos, testimonials, certifications, or prices | Rejected | Converts missing evidence into deception | Omit until approval exists |
| R-017 | Open navigation or critical content on hover only | Rejected | Excludes keyboard and touch users | Use explicit triggers and focus behavior |
| R-018 | Use placeholder text instead of visible form labels | Rejected | Loses context after input and harms accessibility | Labels remain visible |
| R-019 | Replace native select/date controls for visual consistency alone | Rejected | Adds keyboard, screen-reader, mobile, and localization risk | Native controls are baseline |
| R-020 | Force marketing composites into the future product dashboard | Rejected | Shared appearance is not shared information architecture | Share primitives; specify product compositions later |
| R-021 | Combine pricing cards and comparison into one shape-shifting component | Rejected | Merges distinct tasks and creates brittle responsive behavior | Maintain separate components |
| R-022 | Auto-dismiss critical errors without a persistent correction path | Rejected | Users can miss failure and lose context | Keep errors in the owning form/page |
| D-051 | Expose Light, Dark, and System as explicit appearance choices | Approved | Users need deterministic control while retaining platform preference support | Theme selector and persistence support all three values |
| D-052 | Persist System as an explicit choice | Approved | System is a user preference, not merely missing state | OS changes update resolved theme while the selector remains System |
| D-053 | Use `hpc-theme` cookie as canonical preference and local storage as a mirror | Approved | SSR needs a readable value; client tabs need immediate synchronization | Cookie wins disagreement; both are written together |
| D-054 | Separate theme preference from resolved theme | Approved | System can resolve to Light or Dark without losing the user choice | Root uses `data-theme-preference` and `data-theme` |
| D-055 | Apply theme before first paint with server state and a tiny inline bootstrap | Approved | Prevents incorrect-theme flash and hydration mismatch | Bootstrap runs before blocking CSS and receives a CSP nonce/hash |
| D-056 | Use deep-navy dark surfaces rather than pure black or mechanical inversion | Approved | Preserves operational hierarchy and reduces glare without flattening the UI | Dark surface ladder uses canvas, surface, subtle, and raised roles |
| D-057 | Use light blue with deep-navy text for routine primary actions in dark mode | Approved | Maintains brand recognition and high contrast without a luminous button wall | Dark primary action roles differ from light while preserving intent |
| D-058 | Use orange-400 with dark text for conversion actions in dark mode | Approved | Meets contrast and preserves controlled conversion salience | Orange remains restricted to demo conversion and related emphasis |
| D-059 | Use neutral-black dark shadows and prohibit colored glow elevation | Approved | Glow reduces precision and makes hierarchy noisy | Elevation uses borders, surface steps, and neutral shadows |
| D-060 | Permit semantically equivalent light/dark hero artwork variants | Approved | Dark presentation may need art direction without changing the product claim | Same content/composition; only presentation treatment changes |
| D-061 | Do not make product screenshots automatically follow website theme | Approved | A screenshot is evidence of an actual product state | Store capture theme metadata; never invert or recolor captures |
| D-062 | Allow paired screenshot variants only for equivalent approved product states | Approved | Theme matching is useful only when evidence remains truthful | Content model records capture theme, locale, direction, and approval |
| D-063 | Use theme-specific chart tokens plus redundant non-color encoding | Approved | Color-only data is inaccessible and fragile across themes | Charts use labels, markers, dashes, patterns, or data tables |
| D-064 | Keep theme changes immediate and non-essential motion reduced | Approved | Global cross-fades create flash, noise, and intermediate contrast failures | No global theme transition; reduced motion removes shimmer/rotation |
| D-065 | Update System mode live when the platform preference changes | Approved | System should continue following its stated source | Media-query changes update resolved theme only while preference is System |
| D-066 | Set `color-scheme` from the resolved theme | Approved | Native controls and browser UI must match the rendered appearance | Selects, dates, autofill, scrollbars, and validation UI require browser testing |
| R-023 | Create dark mode by inverting the light palette | Rejected | Numeric inversion destroys semantic hierarchy and brand intent | Map every role explicitly |
| R-024 | Use pure black canvas and pure white text everywhere | Rejected | Produces harsh contrast and flattens hierarchy | Use deep navy and off-white/blue-gray text roles |
| R-025 | Add blue/orange glows to cards, charts, buttons, or dialogs | Rejected | Turns operational software into decorative noise | Use neutral elevation and restrained emphasis |
| R-026 | Store theme only in local storage and apply after hydration | Rejected | Causes incorrect-theme flash and prevents correct SSR | Use cookie, pre-paint bootstrap, and server state |
| R-027 | Treat System as an unpersisted default | Rejected | Loses the users explicit preference | Persist System exactly like Light and Dark |
| R-028 | Recolor, invert, or mirror screenshots for dark mode | Rejected | Misrepresents the product and can corrupt direction/data meaning | Use approved captures or a neutral frame |
| R-029 | Encode chart series or status using color alone | Rejected | Fails accessibility and weakens print/forced-colors behavior | Add labels, markers, patterns, icons, or text |
| D-067 | Use explicit bidi isolation for atomic mixed-direction values | Approved | Arabic labels frequently contain LTR operational identifiers whose punctuation otherwise reorders | Known technical values use `dir=ltr` and `bdi`/isolation at the smallest boundary |
| D-068 | Use `dir=auto` only for genuinely unknown user-authored text | Approved | Known value classes have deterministic direction while free text may not | Translation resources and known identifiers never delegate direction to heuristics |
| D-069 | Mirror icons by semantic metadata rather than global RTL CSS | Approved | Global mirroring corrupts object, status, brand, and evidence assets | Icon instances declare directional, fixed, or contextual behavior |
| D-070 | Keep DOM order aligned with Arabic visual and focus order | Approved | CSS reversal creates inaccessible mismatch and brittle responsive behavior | `row-reverse`, `column-reverse`, CSS `order`, and positive tabindex are prohibited for RTL repair |
| D-071 | Make Arabic mobile navigation enter from inline-start | Approved | Navigation origin should follow document direction | Drawer enters from the right in Arabic and retains full focus management |
| D-072 | Let Arabic workflow progression run from right to left while preserving authored step order | Approved | Process reading should feel native without reversing data or source arrays | Natural RTL layout places step one on the right; mobile remains top-to-bottom |
| D-073 | Keep chronological chart axes and trend meaning independent from RTL | Approved | Data chronology and increase/decrease meaning are domain semantics, not text direction | Charts are not automatically reversed and trend arrows are fixed |
| D-074 | Preserve authoritative license-plate value and segment direction | Approved | Plate formats vary by country and may mix scripts | Latin, Arabic, and segmented plates use explicit direction; country templates remain market configuration |
| D-075 | Require Arabic Light desktop and Arabic Dark mobile validation sheets | Approved | The riskiest direction/theme/responsive combinations need explicit evidence | 1440 Light desktop and 390 Dark mobile become release gates |
| D-076 | Confirm Latin digits and Gregorian dates as the Phase 5 language-only baseline | Approved | Phase 2 already separated language from market formatting | Arabic-Indic digits or alternate calendars require explicit market research and configuration |
| D-077 | Use visual arrow-key movement for horizontal RTL tabs and similar composites | Approved | Keyboard commands should match spatial expectation while preserving authored sequence | ArrowLeft moves visually left and ArrowRight visually right; implementation maps to logical index |
| R-030 | Mirror every SVG or image under `dir=rtl` | Rejected | Reverses logos, vehicles, screenshots, status icons, plates, and evidence | Mirror only explicitly directional icons |
| R-031 | Reverse arrays or use CSS row-reverse to make Arabic look correct | Rejected | Breaks DOM/focus order and causes responsive drift | Preserve authored order and rely on document direction/logical layout |
| R-032 | Insert Unicode bidi override characters into translation strings | Rejected | Hidden controls are fragile, difficult to audit, and can create spoofing risk | Use semantic markup and isolation wrappers |
| R-033 | Reverse chronological charts because the page is RTL | Rejected | Text direction does not redefine time or data chronology | Chart order follows the chart specification |
| R-034 | Infer license-plate format, currency, timezone, or country from Arabic language | Rejected | Arabic spans many jurisdictions | Consume explicit business and market configuration |
| R-035 | Leave technical fields RTL and compensate with right text alignment | Rejected | Caret, punctuation, selection, and copy behavior remain broken | Use explicit LTR direction and isolation for known technical values |
| D-078 | Use content-pressure breakpoints rather than device-name breakpoints | Approved | Translated copy, controls, and product evidence fail at different widths | Shared ranges coordinate layout, while intrinsic sizing and container queries control components |
| D-079 | Validate 1440, 1024, and 390 px frames plus a 320 px reflow gate | Approved | Reference designs alone do not prove intermediate or zoom behavior | Automated tests include intermediate widths and 400% zoom equivalent |
| D-080 | Collapse full navigation below 1120 px | Approved | French and Arabic header pressure makes 1024 too narrow for stable full navigation | The 1024 frame uses compact navigation and an inline-start drawer |
| D-081 | Keep the hero stacked below 1120 px | Approved | A forced 1024 split makes either copy or product preview less informative | Tablet uses claim, CTAs, then a full-width readable preview |
| D-082 | Keep the demo action reachable at every width | Approved | Primary conversion cannot disappear because the header becomes compact | Below 480 px the demo CTA is the first drawer action; above it may remain in the header when it fits |
| D-083 | Use art-directed product previews instead of shrinking desktop screenshots below legibility | Approved | Tiny desktop UI ceases to provide product evidence | Mobile uses a focused crop, mobile capture, or coded responsive state |
| D-084 | Prohibit swipe-only carousels for core modules, trust, testimonials, and case studies | Approved | Hidden slides reduce discoverability and create gesture/accessibility dependence | Core content uses grids or vertical stacks; optional carousels require a later explicit exception |
| D-085 | Prohibit page-level horizontal scrolling | Approved | Horizontal page scroll breaks reflow, focus visibility, and mobile use | Tables and atomic technical values may own bounded, labelled overflow |
| D-086 | Preserve semantic pricing tables at constrained widths | Approved | Plan comparison is genuinely tabular and should not become an image or inaccessible card duplicate | Use internal horizontal scroll and a sticky inline-start feature column |
| D-087 | Use a 45rem container threshold for two-column demo-form fields | Approved | The form may sit in sections of different widths at the same viewport | Field layout responds to its own available space |
| D-088 | Require at least 10rem per step for a horizontal workflow | Approved | Breakpoint width alone does not protect French or Arabic step labels | Workflow stays vertical whenever actual content pressure fails the minimum |
| D-089 | Use 18rem module cards, 20rem pricing cards, and 11rem metric cards as minimum readable widths | Approved | Fixed column counts create unreadable intermediate states | Grids use auto-fit/minmax and reduce column count before compressing content |
| D-090 | Never truncate critical headings, labels, buttons, errors, or evidence for responsive fit | Approved | Truncation hides meaning and disproportionately harms French and Arabic | Components wrap, stack, or change structure before reducing readability |
| D-091 | Keep 44 × 44 px minimum targets across all responsive states | Approved | Compact layouts increase, rather than reduce, touch accuracy needs | Headers, drawers, accordions, pagination, and form controls preserve target size |
| D-092 | Remove evidence sections entirely when approved content is absent | Approved | Empty responsive slots invite placeholder or fabricated evidence | No reserved logo rails, metrics, or testimonial gaps are rendered |
| R-036 | Use one global breakpoint set as the only adaptation mechanism | Rejected | Components fail at different content widths | Use shared coordination ranges plus intrinsic and container rules |
| R-037 | Keep desktop navigation at 1024 by shrinking gaps and labels | Rejected | Creates a fragile header that fails translation and zoom | Use compact navigation below 1120 |
| R-038 | Hide secondary actions on mobile | Rejected | Removes valid user paths and can trap users in one conversion route | Stack or move actions without deleting them |
| R-039 | Scale a full desktop screenshot to fit mobile | Rejected | Makes product evidence unreadable | Use art-directed captures or coded responsive previews |
| R-040 | Convert core module sections into swipe-only carousels | Rejected | Reduces discoverability and accessibility | Use visible grids/stacks |
| R-041 | Allow body horizontal scrolling for comparison tables | Rejected | Breaks page navigation and reflow | Contain overflow inside the table region |
| R-042 | Ellipsize French or Arabic headings and button labels | Rejected | Hides meaning and creates unequal localization quality | Use content-driven size and structural change |
| R-043 | Use CSS order or DOM duplication to rearrange responsive content | Rejected | Creates focus, reading-order, maintenance, and analytics drift | Keep one semantic source order |
| R-044 | Use fixed heights to maintain card and section alignment | Rejected | Translation, zoom, validation, and dynamic data overflow | Use content-driven block sizing |
| D-093 | Use a workflow-first homepage narrative rather than a generic feature dump | Approved | Buyers need to understand the operating model before comparing modules | Hero, problem, workflow, roles, then modules establish the product story |
| D-094 | Use the reservation-to-return promise as the five-second hero message | Approved | It states category, scope, and operating value without unsupported superlatives | Hero copy stays concrete across en/fr/ar |
| D-095 | Render operational-coverage proof instead of unsupported customer-logo proof | Approved | Product scope can be shown without fabricating external trust | Lifecycle cards follow the hero; logos remain blocked |
| D-096 | Show KPI definitions and measurement methodology instead of invented outcome numbers | Approved | Evaluation rigor is more credible than fictional percentages | Results section contains no claimed improvement values |
| D-097 | Omit the case-study section until an approved customer evidence package exists | Approved | Empty or anonymous proof violates the evidence policy | Conditional insertion point remains after Security and before Pricing |
| D-098 | Present integration categories without naming partners until connector availability is verified | Approved | Named logos imply working production support | Discovery confirms market, connector, and data ownership |
| D-099 | Present security as an evidence-request checklist until certifications and reliability claims are approved | Approved | Badges without scope are decoration, not assurance | No certification, uptime, RTO, or SLA claim renders |
| D-100 | Use quote-oriented pricing preview until the commercial model is approved | Approved | Invented tiers or prices create false expectations | Page explains scope factors and routes to pricing request |
| D-101 | Use a coded, localized, explicitly illustrative product preview | Approved | It proves layout, theme, and RTL behavior without pretending to be production evidence | Replace or approve before launch |
| D-102 | Repeat the demo conversion in header, hero, pricing, and final CTA while reserving orange for conversion | Approved | Repetition improves reach without flattening hierarchy | Routine navigation and product emphasis remain blue |
| D-103 | Use a native dialog for the demo form baseline | Approved | Provides a testable accessible interaction with visible labels and error state | Production integration must complete focus, submission, consent, and analytics testing |
| D-104 | Validate six named production frames plus a 320 px reflow gate | Approved | These frames cover the highest-risk locale, direction, theme, and responsive combinations | Screenshots and automated checks are package deliverables |
| R-045 | Fill the trust strip with fictional customer logos | Rejected | Placeholder logos quickly become accidental production claims | Omit logos until approved |
| R-046 | Publish “up to” performance percentages without methodology | Rejected | The qualifier does not rescue unsupported evidence | Publish only after baseline and source approval |
| R-047 | Add anonymous testimonial quotes | Rejected | Anonymous praise is not verifiable customer evidence | Use an attributable approved case study or omit |
| R-048 | Display common integration logos as visual shorthand | Rejected | A familiar logo still implies a connector exists | Show neutral categories until verified |
| R-049 | Add security badges with “pending” labels to the public page | Rejected | Public users should not see internal evidence placeholders | Keep status in the internal asset and copy registers |
| R-050 | Invent three pricing tiers to make the page look complete | Rejected | Visual completeness is not worth commercial misinformation | Use a quote-oriented preview |
| R-051 | Hide unresolved evidence behind vague superlatives | Rejected | “Trusted,” “leading,” and “proven” are still claims | Use concrete scope, workflow, and evaluation language |
| R-052 | Make the Arabic frame by mirroring the English screenshot | Rejected | It violates true RTL and corrupts product evidence | Render localized coded UI in document-level RTL |
| D-105 | Treat Phase 8 as behavior validation, not aesthetic preference collection | Approved | Completion, comprehension, recovery, accessibility, and confidence are actionable; taste polling is not | Script uses task outcomes and neutral probes |
| D-106 | Use a coded local prototype with deterministic query states | Approved | Reproducible states support moderation, accessibility checks, and automation | Demo, tour, locale, theme, navigation, failure, and research modes are addressable |
| D-107 | Persist explicit locale and theme choices while preserving URL state and section hash | Approved | Context loss invalidates language and appearance tasks | Locale reload keeps hash; theme applies immediately and survives reload |
| D-108 | Replace the Phase 7 product-tour anchor with a four-step guided tour | Approved | A control labeled “Watch product tour” must produce tour behavior rather than merely scroll | Final media may replace it after asset approval |
| D-109 | Simulate demo success and service failure without sending participant data | Approved | The flow can be tested before CRM and consent integration without creating accidental leads | Prototype clearly states no request was sent |
| D-110 | Keep prototype analytics session-local and exclude all entered values | Approved | Research needs interaction evidence without collecting names, emails, companies, or free text | Export contains event metadata only |
| D-111 | Require 15 core participants across EN/FR/AR plus dedicated accessibility evidence | Approved | One-language five-user testing cannot establish multilingual or RTL behavior | Pilot and accessibility rounds remain separate evidence classes |
| D-112 | Report locale cohorts separately before aggregating | Approved | An English majority can conceal Arabic or French failure | Acceptance includes per-locale floors |
| D-113 | Treat multi-location support as a comprehension and evidence question until capability is approved | Approved | Existing copy implies location awareness but does not prove feature scope | Task measures over-inference and required clarification |
| D-114 | Block release on unresolved Critical or High usability and accessibility issues | Approved | Conversion averages cannot excuse exclusion or a broken primary path | Fix and retest affected cohorts |
| R-053 | Ask participants whether they like the design | Rejected | Preference is weak evidence and invites politeness bias | Ask users to perform real tasks and explain expectations |
| R-054 | Use five English desktop participants as proof for all locales and devices | Rejected | It ignores translation expansion, RTL, mobile behavior, and cohort differences | Balance language, role, device, and accessibility coverage |
| R-055 | Send prototype form data to a real CRM | Rejected | Creates privacy, consent, routing, and accidental-sales risk | Simulate success and failure locally |
| R-056 | Record participant-entered form values in analytics | Rejected | Names, emails, companies, and free text are unnecessary for interaction analysis | Capture event names and non-PII context only |
| R-057 | Aggregate results before inspecting locale cohorts | Rejected | Strong English results can hide Arabic failure | Apply cohort floors and report separately |
| R-058 | Close a severe issue after designer inspection alone | Rejected | The affected users, device, locale, or access method must prove the repair | Retest with the cohort that exposed it |
| D-115 | Treat the Phase 8 prototype as behavioral reference, not production source code | Approved | Prototype shortcuts and simulations are useful for testing but unsafe to ship | Production rebuild follows typed contracts, real integrations, and release gates |
| D-116 | Use framework-agnostic contracts with a documented default capability profile | Approved | The architecture choice is unresolved, but UI behavior cannot remain ambiguous | Any selected stack must satisfy the same SSR, localization, theme, accessibility, and test contracts |
| D-117 | Separate theme preference from resolved theme in production | Approved | System must remain an explicit persisted choice | Root exposes both preference and resolved theme before paint |
| D-118 | Use `hpc-theme` cookie as canonical and `hpc.theme.preference` as local mirror | Approved | SSR and cross-tab behavior require two coordinated stores | Cookie wins disagreement; values are restricted to light/dark/system |
| D-119 | Use a 768 px medium and 1120 px wide layout boundary | Approved | Matches distinct compact, medium, and wide composition decisions from prior phases | Reference regression frames include 320, 390, 768, 1024, 1280, and 1440 px |
| D-120 | Use typed evidence status on public claim-bearing content | Approved | Rendering copy alone must not imply approval | Pending, expired, or rejected claims are suppressed or use an approved neutral variant |
| D-121 | Keep analytics vendor-neutral and prohibit form values or free text | Approved | Vendor selection is open and PII is unnecessary for conversion analysis | Adapter gates events behind approved consent and schema validation |
| D-122 | Require idempotent demo submission and preserve values on recoverable failure | Approved | Double leads and lost form data damage trust and sales operations | Submit is disabled in flight; backend accepts an idempotency key |
| D-123 | Use relative evergreen browser coverage plus named assistive-technology combinations | Approved provisional baseline | Exact versions decay immediately while coverage obligations remain testable | Product and Engineering must approve an exception/retirement owner before beta |
| D-124 | Adopt explicit project performance budgets for mobile conversion paths | Approved provisional baseline | “Fast” is not a test criterion | Release reports against LCP, INP, CLS, TTFB, transfer, request, and font budgets |
| D-125 | Block release until participant acceptance and native French/Arabic review pass | Approved | Automated behavior checks cannot establish comprehension or linguistic quality | Phase 8 research and locale review remain High/Critical gates |
| D-126 | Suppress unresolved login, sales-contact, pricing, evidence, and legal destinations rather than ship placeholders | Approved | Dead or fictional destinations are worse than omission | Components render only approved links and claims |
| R-059 | Copy the Phase 8 prototype directly into production | Rejected | It contains simulation, placeholder destinations, and research-only instrumentation | Rebuild from contracts |
| R-060 | Let each component choose raw colors or breakpoint values | Rejected | Creates drift across themes and responsive modes | Consume centralized tokens and matrices |
| R-061 | Put locale or direction correction in a client hydration effect | Rejected | Causes incorrect first paint, SEO ambiguity, and accessibility instability | Render document state on the server |
| R-062 | Send form values to analytics for “better funnel insight” | Rejected | PII and free text are unnecessary and risky | Track only non-PII state and source metadata |
| R-063 | Treat a successful HTTP response as permission to publish success copy | Rejected | Backend semantics and operational routing must match the promise | Contract defines accepted state and next-step code |
@@ -0,0 +1,54 @@
# Definition of Done
A release candidate is done only when every statement below is true.
## Build and architecture
- The selected framework, exact dependency versions, repository conventions, owners, and deployment path are recorded.
- Strict TypeScript, linting, tests, production build, and package audit pass.
- Public routes render correct locale, direction, theme attributes, metadata, canonical, and `hreflang` before hydration.
- No research-only code, deterministic query backdoors, placeholder domains, or simulated submission remains.
## Design fidelity
- Components consume the token package without undeclared raw brand values.
- Compact, medium, and wide behavior matches the responsive matrix at 320, 390, 768, 1024, 1280, and 1440 px.
- English, French, and Arabic pass light and dark visual regression; System is behavior-tested.
- No clipped translated text, fixed text height, unintended overflow, or theme flash exists.
## Localization and RTL
- Locale key parity, route parity, metadata, and visible-copy inventory pass CI.
- Native French and Arabic reviewers approve all visible copy, errors, metadata, and terminology.
- Arabic uses document-level RTL, logical CSS, selective icon mirroring, and isolation for atomic LTR values.
- Locale switching preserves only approved query state and valid hashes.
## Accessibility
- WCAG 2.2 AA checklist is complete with evidence.
- Keyboard-only use, focus visibility/order, skip link, drawer, dialogs, form errors, status messages, 200% zoom, 400% reflow, forced colors, text spacing, reduced motion, and target size pass.
- NVDA, VoiceOver, and TalkBack critical-path checks pass in the supported combinations.
- No Critical or High accessibility defect remains open.
## Forms, privacy, and integrations
- Legal approves localized consent and privacy behavior.
- Real CRM routing, duplicate handling, idempotency, retry, spam protection, monitoring, and operational ownership pass integration tests.
- Recoverable failures preserve entered values and provide a retry path.
- Analytics is consent-gated, schema-validated, vendor-approved, and contains no entered form values or free text.
- Success copy truthfully matches backend acceptance and next-step behavior.
## Evidence and content
- Every public capability, metric, logo, testimonial, partner, security statement, price, and legal destination has an approval record or is suppressed.
- The illustrative product preview is approved as such or replaced by a governed product capture.
- Placeholder login and sales-contact destinations are removed or replaced.
- Multi-location wording and product-tour medium are explicitly approved.
## Quality and release
- All QA matrix release gates pass in the supported browser/AT matrix.
- Performance budgets pass for EN, FR, and AR on the defined mobile profile.
- Participant testing reaches the Phase 8 cohort and success thresholds; every S0/S1 finding is fixed and retested with the affected cohort.
- Open issue register contains no Critical or High issue and no overdue unowned item.
- Product, Design, Engineering, Content/Localization, Accessibility, Legal, Security, Analytics, and Sales Operations record release approval for their owned gates.
@@ -0,0 +1,18 @@
Issue_ID,Severity,Area,Problem,Owner,Due_gate,Status,Exit_criteria
P9-001,Critical,Participant acceptance,Phase 8 usability acceptance has not been run with required cohorts.,Research,Before release,Open,"Run pilots, 15-core cohort, accessibility cohort; close/retest S0/S1 issues."
P9-002,High,CRM integration,"Endpoint, routing, duplicate handling, retry, spam controls, and operational ownership are unapproved.",Sales Ops + Engineering,Before production integration,Open,Approve and integration-test complete request lifecycle.
P9-003,High,Legal consent,"Consent text, privacy linkage, retention, and market-specific requirements are unresolved.",Legal,Before production form,Open,Approve localized legal content and consent model.
P9-004,High,Analytics and consent,"Vendor, event authority, consent policy, retention, and session replay are unresolved.",Analytics + Legal,Before beta,Open,Select adapter and validate non-PII payloads and gating.
P9-005,High,Native linguistic review,French and Arabic require native product/marketing review.,Content + Localization,Before release,Open,"Review all visible copy, metadata, errors, and mixed-direction samples."
P9-006,High,Illustrative product preview,Current coded preview is not approved product evidence.,Product + Design,Before release,Open,Approve as illustration or replace with governed capture.
P9-007,High,Multi-location claim,Copy can imply branch/multi-location capability without approval.,Product,Before beta,Open,Approve capability or revise/suppress affected copy.
P9-008,High,Pricing model,Public pricing and included limits are not approved.,Commercial,Before pricing publication,Open,Keep quote-only variant until written approval.
P9-009,High,Security evidence,"Certifications, SLA, backup/recovery, and subprocessors are not approved for public claims.",Security + Legal,Before claims publish,Open,Supply scoped evidence and expiry dates.
P9-010,Medium,Framework selection,Final framework and repository conventions are not approved.,Architecture,Before scaffold merge,Open,Approve stack or adopt default capability profile.
P9-011,Medium,Browser policy owner,Relative browser matrix is specified; owner and exception process need approval.,Product + Engineering,Before beta,Open,Approve matrix and telemetry-based retirement policy.
P9-012,Medium,Product tour medium,Four-step dialog may be replaced by approved media.,Product + Marketing,Before release,Open,Approve fallback or supply accessible localized media/transcript.
P9-013,Medium,Markets and formatting,"French/Arabic commercial markets, currency, timezone, phone, and legal jurisdiction are undefined.",Product + Legal,Before regional campaign,Open,Supply explicit market context independent of locale.
P9-014,Medium,Login destination,Authentication URL and cross-domain behavior are unresolved.,Product + Engineering,Before release,Open,"Approve destination, security, locale return path, and analytics."
P9-015,Medium,Alternate sales contact,Prototype uses a non-routable placeholder address.,Sales Ops,Before release,Open,Provide approved contact route or suppress secondary contact.
P9-016,Medium,Customer evidence,"Logos, metrics, testimonials, and case studies are absent by policy.",Marketing + Legal,Optional post-launch,Open,Publish only with attributable evidence records.
P9-017,Low,Exact dependency versions,Package intentionally avoids volatile version pins.,Engineering,At scaffold,Open,Pin and record versions; enable automated updates with review.
1 Issue_ID Severity Area Problem Owner Due_gate Status Exit_criteria
2 P9-001 Critical Participant acceptance Phase 8 usability acceptance has not been run with required cohorts. Research Before release Open Run pilots, 15-core cohort, accessibility cohort; close/retest S0/S1 issues.
3 P9-002 High CRM integration Endpoint, routing, duplicate handling, retry, spam controls, and operational ownership are unapproved. Sales Ops + Engineering Before production integration Open Approve and integration-test complete request lifecycle.
4 P9-003 High Legal consent Consent text, privacy linkage, retention, and market-specific requirements are unresolved. Legal Before production form Open Approve localized legal content and consent model.
5 P9-004 High Analytics and consent Vendor, event authority, consent policy, retention, and session replay are unresolved. Analytics + Legal Before beta Open Select adapter and validate non-PII payloads and gating.
6 P9-005 High Native linguistic review French and Arabic require native product/marketing review. Content + Localization Before release Open Review all visible copy, metadata, errors, and mixed-direction samples.
7 P9-006 High Illustrative product preview Current coded preview is not approved product evidence. Product + Design Before release Open Approve as illustration or replace with governed capture.
8 P9-007 High Multi-location claim Copy can imply branch/multi-location capability without approval. Product Before beta Open Approve capability or revise/suppress affected copy.
9 P9-008 High Pricing model Public pricing and included limits are not approved. Commercial Before pricing publication Open Keep quote-only variant until written approval.
10 P9-009 High Security evidence Certifications, SLA, backup/recovery, and subprocessors are not approved for public claims. Security + Legal Before claims publish Open Supply scoped evidence and expiry dates.
11 P9-010 Medium Framework selection Final framework and repository conventions are not approved. Architecture Before scaffold merge Open Approve stack or adopt default capability profile.
12 P9-011 Medium Browser policy owner Relative browser matrix is specified; owner and exception process need approval. Product + Engineering Before beta Open Approve matrix and telemetry-based retirement policy.
13 P9-012 Medium Product tour medium Four-step dialog may be replaced by approved media. Product + Marketing Before release Open Approve fallback or supply accessible localized media/transcript.
14 P9-013 Medium Markets and formatting French/Arabic commercial markets, currency, timezone, phone, and legal jurisdiction are undefined. Product + Legal Before regional campaign Open Supply explicit market context independent of locale.
15 P9-014 Medium Login destination Authentication URL and cross-domain behavior are unresolved. Product + Engineering Before release Open Approve destination, security, locale return path, and analytics.
16 P9-015 Medium Alternate sales contact Prototype uses a non-routable placeholder address. Sales Ops Before release Open Provide approved contact route or suppress secondary contact.
17 P9-016 Medium Customer evidence Logos, metrics, testimonials, and case studies are absent by policy. Marketing + Legal Optional post-launch Open Publish only with attributable evidence records.
18 P9-017 Low Exact dependency versions Package intentionally avoids volatile version pins. Engineering At scaffold Open Pin and record versions; enable automated updates with review.
+26
View File
@@ -0,0 +1,26 @@
# Open Questions
The authoritative status is in `OPEN_ISSUE_REGISTER_v1.0.csv`.
## Architecture
- Which framework and repository conventions are approved?
- Who owns browser support and dependency retirement?
- Where will the server-readable theme and locale cookies be set?
## Product and commercial
- Is multi-location operation an approved public capability?
- Is the guided four-step tour final, or will approved media replace it?
- What pricing model, included limits, markets, currencies, and tax assumptions are approved?
- What login destination and return-path behavior are required?
## Integration, privacy, and evidence
- Which CRM, routing rules, duplicate policy, retry policy, and spam control are approved?
- Which consent model, analytics vendor, retention policy, and session replay policy are approved by market?
- Which product captures, customer evidence, integrations, security claims, and legal documents are approved?
## Research
- When will the required participant and assistive-technology rounds run, and who owns severity arbitration and retesting?
+315
View File
@@ -0,0 +1,315 @@
{
"package": "homePageCar_Phase9_Developer_Handoff",
"version": "1.0",
"created": "2026-06-25",
"source_dependency": "homePageCar_Phase8_Interactive_Prototype_Usability_Testing_v1.0.zip",
"status": "handoff-complete; production release blocked by open issues",
"file_count": 61,
"files": [
{
"path": "09_DEVELOPER_HANDOFF_v1.0.md",
"bytes": 8091,
"sha256": "e82d486f1e566d1bf0263f1baa7dd8035ae62da5c36bb6bfa417e61331ec8d51"
},
{
"path": "DECISION_LOG_v9.0.md",
"bytes": 38775,
"sha256": "85569a7418f8cad57d094ee9ec1d83b7727b5ab91a405cbda26de0271a8d76a1"
},
{
"path": "DEFINITION_OF_DONE_v1.0.md",
"bytes": 3234,
"sha256": "dfe53a550b7853f015901b83adb960ffb26ab08fa6d7f9f8f8a3386adc705179"
},
{
"path": "OPEN_ISSUE_REGISTER_v1.0.csv",
"bytes": 3519,
"sha256": "b8778b3dc7d1e47446584cac046d490a9932c3dfdfa03750716f29852694a214"
},
{
"path": "OPEN_QUESTIONS_v1.0.md",
"bytes": 1085,
"sha256": "82a2abd71830fa4023d346f3b42b138de9e1bbdff74a827d770e6b660d89bd0e"
},
{
"path": "PHASE_9_HANDOFF_v1.0.md",
"bytes": 939,
"sha256": "90530b4e70d1fd64d5d934429c009431902639c0570e7944cf050e6d67eb73a3"
},
{
"path": "README_v1.0.md",
"bytes": 1258,
"sha256": "ef0010b98ba641c4db453d875171a0d1dad4cb17e991ad23698acde8ac4783ae"
},
{
"path": "SOURCE_TRACEABILITY_v1.0.csv",
"bytes": 765,
"sha256": "76dc8677ad0d50263301fd5242bc0649c23bb01d3bbd099bdc8a7e2c04fc2d46"
},
{
"path": "annotated/ANNOTATION_INDEX_v1.0.md",
"bytes": 685,
"sha256": "a2e87dfdb138409604cac4cc5f52375cce97940da7363f7778af30490699decd"
},
{
"path": "annotated/SCREEN_ANNOTATIONS_v1.0.csv",
"bytes": 1457,
"sha256": "d7b8120926a545f472b62a436b87d2a9d20320a4d95fcf90aa96162c50e8a6da"
},
{
"path": "annotated/demo-dialog-en-light_v1.0.png",
"bytes": 51457,
"sha256": "d91bf102100af48feac31478770f8bfdded994ac8b47f60845e4465c50462394"
},
{
"path": "annotated/desktop-en-light_v1.0.png",
"bytes": 144908,
"sha256": "a4151a788317aa9bf8f7262f09f645ebdb54d4a3e1254ab5703ae37e8d3cec16"
},
{
"path": "annotated/mobile-ar-dark_v1.0.png",
"bytes": 75193,
"sha256": "6adcaf68b48bacbf105b670e71edda078a60aa26b732831bd194e1cb9da11556"
},
{
"path": "annotated/mobile-drawer-ar-dark_v1.0.png",
"bytes": 28321,
"sha256": "bc0c14447fb6e80ce904ffcb13c237b51eaa92723702191139bee59b0f7ebdeb"
},
{
"path": "annotated/tablet-fr-light_v1.0.png",
"bytes": 102305,
"sha256": "dd526fe6859e470ea4c67b4c1ef511cfe0e11126561f86bcff07e57378084347"
},
{
"path": "annotated/tour-dialog-fr-dark_v1.0.png",
"bytes": 94445,
"sha256": "2dd7b24f6505f16a565ac1b5490499ccdae91d0257de608c97c54b7d5b6c2c78"
},
{
"path": "assets/ASSET_MANIFEST_v1.0.csv",
"bytes": 1049,
"sha256": "dd77547327096b4c4084ec8b9311aaff719e378a91f16c2b3ea39832d1bc7b3a"
},
{
"path": "assets/ASSET_USAGE_RULES_v1.0.md",
"bytes": 747,
"sha256": "46821e8e6588a62eba860e4d228b2910a05aa60124610966bdc524a86921f658"
},
{
"path": "assets/brand-mark_v1.0.svg",
"bytes": 443,
"sha256": "bcb3a3fb8037aec69d92da06f0d60fab969547b979a0112f12e6a5c2ab8efdaa"
},
{
"path": "assets/logo-horizontal_v1.0.svg",
"bytes": 576,
"sha256": "04be1c45e1b6e85586efc6dbd36bf3e1e9275fa138a36b93cf6532bbd7409b02"
},
{
"path": "components/COMPONENT_CONTRACTS_v1.0.md",
"bytes": 9800,
"sha256": "84b455fe725bff11b6ab54bb13373b1aa52991b062a36fad07db47a940187a53"
},
{
"path": "components/COMPONENT_STATE_MATRIX_v1.0.csv",
"bytes": 4283,
"sha256": "c85f96f6d5e020a27c2bd44427a2c3aed3f3cad8657d88a22fc2de9ecd3f6cda"
},
{
"path": "components/CONTENT_CONSTRAINTS_v1.0.csv",
"bytes": 1147,
"sha256": "f4d32b7775f856ff4aac775791566427e3cc340f39cd3f9845d8a3271167228b"
},
{
"path": "components/RESPONSIVE_BEHAVIOR_MATRIX_v1.0.csv",
"bytes": 1416,
"sha256": "0e0e262c0388c37e41f5ab7f3e80835b8edb09e00a9264e81d92953743893353"
},
{
"path": "components/RTL_THEME_MATRIX_v1.0.csv",
"bytes": 4048,
"sha256": "b47f4b3b4e50f1fed6b1b69523a05d61952773e95a966288bfba85dd414edb15"
},
{
"path": "implementation/TECHNOLOGY_PROFILE_v1.0.md",
"bytes": 1953,
"sha256": "a59504c81bdbb6396eb21e68518ca84862ac89c6c65744de710e9ae273e47c7b"
},
{
"path": "implementation/component-contracts_v1.0.ts",
"bytes": 2844,
"sha256": "177dd2420b804290cf1296e43f41a7e759c8859b3253073fbdc523a81f6f94c0"
},
{
"path": "implementation/hreflang-generator_v1.0.ts",
"bytes": 751,
"sha256": "ab919a36a5d08a28c38ae51b4ddd0d84cef5d3ec3bed13649ebd26c3fb80ac8a"
},
{
"path": "implementation/localization-config_v1.0.ts",
"bytes": 772,
"sha256": "bd8ca09f121bfe516ece817948a81d58136e9205fbd2c05dad2ce87f2d7a1782"
},
{
"path": "implementation/theme-config_v1.0.ts",
"bytes": 725,
"sha256": "f56d37da4129d5830ba9ebd77b18cd6084a144e8514bfd8a8152387ecf76607c"
},
{
"path": "interaction/ANALYTICS_EVENT_SPEC_v1.0.csv",
"bytes": 1713,
"sha256": "1282ebca5b031f6267f8139033db437e30b62ac391d25823c8a4783b64151008"
},
{
"path": "interaction/INTERACTION_NOTES_v1.0.md",
"bytes": 2332,
"sha256": "0456815622cbb072f1a7594e6b47f52e572e2570280c3a618876246e1b43d2a7"
},
{
"path": "interaction/analytics-contract_v1.0.ts",
"bytes": 832,
"sha256": "2716eb69cc98032005e068ab7bdc265a4c896a8e1a1bed682c7fdd4f45368123"
},
{
"path": "interaction/demo-form-contract_v1.0.ts",
"bytes": 632,
"sha256": "194db77f7cfca417dbe35e6f2c2ea94cdd02806b83b1d0f1993fe509d8c10154"
},
{
"path": "interaction/theme-bootstrap_v1.0.js",
"bytes": 753,
"sha256": "7b89a849bdcd72e1049714ebf76f0c0decb39e44261480f0cb08bb7dfe734e4a"
},
{
"path": "localization/LOCALIZATION_IMPLEMENTATION_v1.0.md",
"bytes": 2062,
"sha256": "87a494d7ef7ed9f5012ed1699edf90e38995aa89a0efc3800db854e1d57e1024"
},
{
"path": "localization/ROUTE_MANIFEST_v1.0.json",
"bytes": 1573,
"sha256": "fa29b8d31da1f36f87d216a1228fd1bbe1cde337636950b40b0024a10efaf49a"
},
{
"path": "localization/TRANSLATION_KEY_INVENTORY_v1.0.csv",
"bytes": 10599,
"sha256": "01289dc9eb94d546ae717b881b2aed4dfc63b38df38e7767054800122bbb46c2"
},
{
"path": "localization/locales/ar/homepage.json",
"bytes": 18615,
"sha256": "fe08aabd60203dbdebc718117f5e497b52a453a8a6fb671fe0bca28651bf0d47"
},
{
"path": "localization/locales/en/homepage.json",
"bytes": 13869,
"sha256": "a5ed956c7f07fad016ca39b40b770c25e8beeae2799ff0fece82dbf087f18e51"
},
{
"path": "localization/locales/fr/homepage.json",
"bytes": 15512,
"sha256": "24079356bd47431ffeb66b7eb2981e108c03080205861b1bb42514b03b945a0a"
},
{
"path": "qa/ACCESSIBILITY_CHECKLIST_v1.0.csv",
"bytes": 1498,
"sha256": "0d9c108e0c02b78aaf11badf6b5f5125cac2b03876cfddf82bd2e97230fdd28b"
},
{
"path": "qa/BROWSER_SUPPORT_MATRIX_v1.0.csv",
"bytes": 986,
"sha256": "5ffb43732fea90530b1b088fb68172b9fc7b2c2683198448734a21cf39c234d1"
},
{
"path": "qa/PERFORMANCE_BUDGETS_v1.0.json",
"bytes": 815,
"sha256": "e1679ce45d8a1225c46c085c7533d3230a41279c32d0812de5c5f05cb55eefa8"
},
{
"path": "qa/PLAYWRIGHT_ACCEPTANCE_SPEC_v1.0.md",
"bytes": 800,
"sha256": "b16384a861d06eb76db5a836868d9a6e03cf72a6a896209279330e19a8d1a785"
},
{
"path": "qa/QA_MATRIX_v1.0.csv",
"bytes": 3557,
"sha256": "6b14b92ce20a9d706de7d6d4cf9f0bb450ecceed27673ed62ae01e145d2143f8"
},
{
"path": "qa/test-ids_v1.0.csv",
"bytes": 598,
"sha256": "6201007ae98632654a2684a0b09ce95d85d9870e0f29774687df0a9876048202"
},
{
"path": "qa/validate-phase9-package_v1.0.mjs",
"bytes": 2534,
"sha256": "631892318cf95c0530a605e5bf08def9b06c93af79b555205f3aeb8a2bcd87ed"
},
{
"path": "qa/visual-regression-scenarios_v1.0.json",
"bytes": 1401,
"sha256": "08a04f676cbb93e73b4c6bc112a55ebf287cb97be3dd3176ab80161e6de743c2"
},
{
"path": "reference/FINDINGS_REPORT_v1.0.md",
"bytes": 3062,
"sha256": "ba34afd535856d0eaa8ed7e174c23a7b5f0eae87344c8fcee5daafe00c068ce4"
},
{
"path": "reference/PHASE_8_HANDOFF_v1.0.md",
"bytes": 1117,
"sha256": "2e51ed6645fcc99f30cd4aa9da11ac59e5c2e331c384bfbd758739ad6f42c788"
},
{
"path": "reference/PRIORITIZED_REVISIONS_v1.0.csv",
"bytes": 1071,
"sha256": "65b17813756a2d01c8a9df9faa049b170dca197f243b62a44e070d69f8959df5"
},
{
"path": "reference/SUCCESS_METRICS_v1.0.csv",
"bytes": 1552,
"sha256": "e7b734564735ab65dcaf84ab8374ba163472cca48db1257c4c626415a779ecbe"
},
{
"path": "reference/VALIDATION_RESULTS_v1.0.md",
"bytes": 2068,
"sha256": "3cb17f099569e5bdf4bcd731fe7f687d1636f0e82623c205e07df2cdc2b7d2f2"
},
{
"path": "tokens/TOKEN_USAGE_RULES_v1.0.md",
"bytes": 1222,
"sha256": "b9f7d9b0a9c0595e6f6df2a53e0bcf4acfb47a56abfc6c590a6281c15b04a7b2"
},
{
"path": "tokens/design-tokens_v1.0.json",
"bytes": 3771,
"sha256": "470d7bc9d4a466cce4e51f0fdc21fe199ec5b0d4007f5063704c523ce1b9ef0c"
},
{
"path": "tokens/semantic-tokens_v1.0.css",
"bytes": 3553,
"sha256": "99912762e078bfc78b4878fc46b8c7d03d90c073e9c236942a58d83f6585a1b9"
},
{
"path": "tokens/tokens_v1.0.ts",
"bytes": 442,
"sha256": "ec265270251f8dd01d9166aeca3fcec9be2b5e534d825c9058fb6ed3f51e3224"
},
{
"path": "validation/CONTENT_AND_STRUCTURE_VALIDATION_v1.0.json",
"bytes": 189,
"sha256": "e055ef15c2de2191a3465d85ed54f4cf6bd9e1cde4d5d2bba787e14873027b73"
},
{
"path": "validation/STATIC_VALIDATION_RESULTS_v1.0.json",
"bytes": 56,
"sha256": "b60367adf55cf4c61b705d11131b7adebc0aae6ff53732c8272ec9cf2bc95dd3"
},
{
"path": "validation/VALIDATION_RESULTS_v1.0.md",
"bytes": 1179,
"sha256": "6f9df81e75d7149d3826ce215143c21784f39b154660fcefc5325ac114ac70b2"
}
]
}
+9
View File
@@ -0,0 +1,9 @@
# Phase 9 Handoff
Phase 9 is implementation-ready at the specification level.
Use `09_DEVELOPER_HANDOFF_v1.0.md` as the authoritative build specification and `DECISION_LOG_v9.0.md` as the cumulative decision record. The token package, component contracts, locale resources, interaction contracts, assets, QA matrix, issue register, and definition of done are all versioned and machine-readable where practical.
Production implementation may begin against the vendor-neutral contracts. Release may not proceed until all Critical and High issues are closed, participant acceptance is completed, native French and Arabic review passes, real submission/consent/analytics behavior is approved, and every public claim has evidence.
The Phase 8 prototype remains a behavioral reference. It is not a source-code base and its simulated backend, illustrative preview, research instrumentation, and placeholder contact destination must not ship.
+30
View File
@@ -0,0 +1,30 @@
# homePageCar Phase 9 — Developer Handoff
**Package version:** 1.0
**Created:** 2026-06-25
**Source:** `homePageCar_Phase8_Interactive_Prototype_Usability_Testing_v1.0.zip`
**Status:** Build-ready specification with explicit pre-production blockers
## Start here
1. `09_DEVELOPER_HANDOFF_v1.0.md`
2. `implementation/TECHNOLOGY_PROFILE_v1.0.md`
3. `tokens/TOKEN_USAGE_RULES_v1.0.md`
4. `components/COMPONENT_CONTRACTS_v1.0.md`
5. `localization/LOCALIZATION_IMPLEMENTATION_v1.0.md`
6. `interaction/INTERACTION_NOTES_v1.0.md`
7. `qa/QA_MATRIX_v1.0.csv`
8. `OPEN_ISSUE_REGISTER_v1.0.csv`
9. `DEFINITION_OF_DONE_v1.0.md`
## Non-negotiable interpretation
Phase 8 automated checks proved prototype behavior, not production readiness or human comprehension. Participant testing, native linguistic review, CRM integration, consent, analytics approval, evidence approval, and several commercial decisions remain gates. A developer must not convert provisional copy into a public claim merely because it exists in a JSON file.
## Validate this package
```bash
node qa/validate-phase9-package_v1.0.mjs
```
The validator checks required artifacts, JSON syntax, locale key parity, route coverage, token references, issue ownership, and manifest integrity.
@@ -0,0 +1,8 @@
Source,Destination,Transformation
Phase8 prototype,Component contracts,Behavior and states converted to typed production rules
Phase8 copy JSON,Locale resources + key inventory,EN/FR/AR content preserved with parity checks
Phase8 interaction spec,Interaction notes + QA matrix,"Drawer, dialogs, tour, form, selectors made testable"
Phase8 analytics spec,Vendor-neutral analytics contract,Research-only logging replaced by consent-gated interface
Phase8 findings/revisions,Issue register,"Open CRM, evidence, research, and content risks preserved"
Phase8 decision log,Decision log v9,All prior decisions carried forward; Phase 9 decisions appended
Phase8 prototype CSS,Token package + matrices,Visual values normalized into semantic implementation tokens
1 Source Destination Transformation
2 Phase8 prototype Component contracts Behavior and states converted to typed production rules
3 Phase8 copy JSON Locale resources + key inventory EN/FR/AR content preserved with parity checks
4 Phase8 interaction spec Interaction notes + QA matrix Drawer, dialogs, tour, form, selectors made testable
5 Phase8 analytics spec Vendor-neutral analytics contract Research-only logging replaced by consent-gated interface
6 Phase8 findings/revisions Issue register Open CRM, evidence, research, and content risks preserved
7 Phase8 decision log Decision log v9 All prior decisions carried forward; Phase 9 decisions appended
8 Phase8 prototype CSS Token package + matrices Visual values normalized into semantic implementation tokens
@@ -0,0 +1,12 @@
# Annotated Screen Index
The annotated captures are generated from the Phase 8 behavioral prototype and are references for structure and state, not launch evidence.
- `desktop-en-light_v1.0.png`: wide homepage top and primary hierarchy.
- `tablet-fr-light_v1.0.png`: medium French layout and navigation mode.
- `mobile-ar-dark_v1.0.png`: compact Arabic RTL layout and dark theme.
- `mobile-drawer-ar-dark_v1.0.png`: inline-start drawer, focus, and control order.
- `demo-dialog-en-light_v1.0.png`: visible labels, form grid, and modal anatomy.
- `tour-dialog-fr-dark_v1.0.png`: guided tour progress and action anatomy.
Numbered callouts correspond to `SCREEN_ANNOTATIONS_v1.0.csv`.
@@ -0,0 +1,16 @@
Screen,Callout,Region,Rule
desktop-en-light,1,Sticky header,Desktop nav appears only at >=1120px; orange reserved for demo.
desktop-en-light,2,Hero copy,Single h1; primary demo before tour in reading order.
desktop-en-light,3,Product preview,Illustrative status must remain visible internally and approved before launch.
tablet-fr-light,1,Medium navigation,Drawer mode remains below 1120px; avoid squeezed desktop controls.
tablet-fr-light,2,French expansion,Text blocks grow vertically; no fixed card heights or truncation.
mobile-ar-dark,1,Document RTL,Root dir=rtl; content aligns start and order follows Arabic reading.
mobile-ar-dark,2,Compact CTAs,Buttons remain 44px minimum and may stack/content-wrap.
mobile-drawer-ar-dark,1,Inline-start drawer,Drawer opens from right in RTL.
mobile-drawer-ar-dark,2,Focus boundary,Background inert; focus starts at close and loops inside.
demo-dialog-en-light,1,Dialog heading,Programmatic name comes from visible heading.
demo-dialog-en-light,2,Form labels,"Visible labels stay present; required state is announced, not only asterisk."
demo-dialog-en-light,3,Submission area,Persistent errors and submit remain reachable with virtual keyboard.
tour-dialog-fr-dark,1,Progress,Localized step count announced politely.
tour-dialog-fr-dark,2,Step focus,Step heading/article receives focus after navigation.
tour-dialog-fr-dark,3,Actions,Back/Next meaning stays explicit; layout follows direction.
1 Screen Callout Region Rule
2 desktop-en-light 1 Sticky header Desktop nav appears only at >=1120px; orange reserved for demo.
3 desktop-en-light 2 Hero copy Single h1; primary demo before tour in reading order.
4 desktop-en-light 3 Product preview Illustrative status must remain visible internally and approved before launch.
5 tablet-fr-light 1 Medium navigation Drawer mode remains below 1120px; avoid squeezed desktop controls.
6 tablet-fr-light 2 French expansion Text blocks grow vertically; no fixed card heights or truncation.
7 mobile-ar-dark 1 Document RTL Root dir=rtl; content aligns start and order follows Arabic reading.
8 mobile-ar-dark 2 Compact CTAs Buttons remain 44px minimum and may stack/content-wrap.
9 mobile-drawer-ar-dark 1 Inline-start drawer Drawer opens from right in RTL.
10 mobile-drawer-ar-dark 2 Focus boundary Background inert; focus starts at close and loops inside.
11 demo-dialog-en-light 1 Dialog heading Programmatic name comes from visible heading.
12 demo-dialog-en-light 2 Form labels Visible labels stay present; required state is announced, not only asterisk.
13 demo-dialog-en-light 3 Submission area Persistent errors and submit remain reachable with virtual keyboard.
14 tour-dialog-fr-dark 1 Progress Localized step count announced politely.
15 tour-dialog-fr-dark 2 Step focus Step heading/article receives focus after navigation.
16 tour-dialog-fr-dark 3 Actions Back/Next meaning stays explicit; layout follows direction.
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

@@ -0,0 +1,8 @@
Asset_ID,Path,Type,Status,Usage,Constraint,Owner
brand-mark,assets/brand-mark_v1.0.svg,svg,approved,"Header, favicon source, compact brand",Do not stretch; preserve 1:1 ratio,Design
logo-horizontal,assets/logo-horizontal_v1.0.svg,svg,provisional,Footer or wide co-brand-safe placement,Text color must be tokenized in production rather than edited per theme,Design
lucide-icons,external dependency,svg icon set,approved-family,Interface icons,Pin package version; 24px grid; 2px stroke; selective RTL mirroring,Engineering
product-preview,not included as launch evidence,image or coded UI,illustrative,Hero visual,Must be approved or replaced; never mirror/recolor captures,Product + Design
product-tour-media,not supplied,video/capture,blocked,Secondary CTA,Guided four-step dialog remains fallback until media approval,Product
customer-logos,not supplied,svg/png,blocked,Trust proof,Do not render placeholders,Marketing
security-badges,not supplied,svg/png,blocked,Security section,Do not render pending badges publicly,Security + Legal
1 Asset_ID Path Type Status Usage Constraint Owner
2 brand-mark assets/brand-mark_v1.0.svg svg approved Header, favicon source, compact brand Do not stretch; preserve 1:1 ratio Design
3 logo-horizontal assets/logo-horizontal_v1.0.svg svg provisional Footer or wide co-brand-safe placement Text color must be tokenized in production rather than edited per theme Design
4 lucide-icons external dependency svg icon set approved-family Interface icons Pin package version; 24px grid; 2px stroke; selective RTL mirroring Engineering
5 product-preview not included as launch evidence image or coded UI illustrative Hero visual Must be approved or replaced; never mirror/recolor captures Product + Design
6 product-tour-media not supplied video/capture blocked Secondary CTA Guided four-step dialog remains fallback until media approval Product
7 customer-logos not supplied svg/png blocked Trust proof Do not render placeholders Marketing
8 security-badges not supplied svg/png blocked Security section Do not render pending badges publicly Security + Legal
@@ -0,0 +1,7 @@
# Asset Usage Rules
Only approved assets ship. Provisional assets require an approval record before release; blocked assets must not be rendered, even behind a feature flag visible to public users.
Use SVG for marks and interface illustrations when practical. Raster product captures require 1x/2x variants, responsive dimensions, width/height attributes, modern compression, and evidence metadata. Decorative images use empty alt text. Informative images use localized alt text that describes purpose, not every pixel.
The supplied horizontal logo contains a fixed light-theme text color for review convenience. Production must render the wordmark as live text or use theme-specific approved SVG variants. Do not use CSS filters to invert it.
@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" role="img" aria-labelledby="title">
<title id="title">homePageCar mark</title>
<rect width="32" height="32" rx="8" fill="#174BB5"/>
<g fill="none" stroke="#FFFFFF" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round">
<path d="M7 19h18M9 19l1.8-6.2a3 3 0 0 1 2.9-2.2h4.6a3 3 0 0 1 2.9 2.2L23 19M10 23h.01M22 23h.01M7 19v4a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-4"/>
</g></svg>

After

Width:  |  Height:  |  Size: 443 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 40" role="img" aria-labelledby="title">
<title id="title">homePageCar</title>
<rect x="0" y="4" width="32" height="32" rx="8" fill="#174BB5"/>
<g fill="none" stroke="#FFFFFF" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M7 23h18M9 23l1.8-6.2a3 3 0 0 1 2.9-2.2h4.6a3 3 0 0 1 2.9 2.2L23 23M10 27h.01M22 27h.01M7 23v4a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-4"/></g>
<text x="43" y="27" font-family="Inter, Arial, sans-serif" font-size="22" font-weight="750" fill="#102035">homePageCar</text>
</svg>

After

Width:  |  Height:  |  Size: 576 B

@@ -0,0 +1,385 @@
# Component Contracts
Every component below is implemented once for all locales, directions, and themes. Props are semantic; components do not fetch translations internally unless the architecture establishes a single typed content boundary.
## SiteHeader
**Purpose:** Primary navigation, brand, locale/theme controls, login, demo CTA
**States:** `default,scrolled`
**Typed data:** `HeaderModel`
**Copy namespace:** `header.*`
**Responsive:** Desktop at >=1120; drawer trigger below
**RTL:** Nav order reverses naturally; logo unchanged; directional icons selective
**Accessibility:** Sticky; 44px targets; skip-link precedes it
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## MobileDrawer
**Purpose:** Compact/medium navigation overlay
**States:** `closed,open`
**Typed data:** `DrawerModel`
**Copy namespace:** `header.*`
**Responsive:** Inline-start fixed drawer <=384px or 88vw
**RTL:** Opens right in RTL
**Accessibility:** Trap focus; inert background; Escape; focus return
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## LocaleSelector
**Purpose:** Switch locale by stable route ID
**States:** `closed,open,disabled`
**Typed data:** `LocaleSelectorProps`
**Copy namespace:** `language names`
**Responsive:** Native select baseline
**RTL:** Order EN/FR/AR; control follows document direction
**Accessibility:** Labelled; current locale selected; preserves route/hash
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## ThemeSelector
**Purpose:** Set Light/Dark/System preference
**States:** `light,dark,system`
**Typed data:** `ThemeSelectorProps`
**Copy namespace:** `header.light/dark/system`
**Responsive:** Native select or accessible segmented control
**RTL:** No mirroring needed
**Accessibility:** Cookie+storage; immediate; live system updates
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## HeroSection
**Purpose:** Communicate category, promise, primary and secondary actions
**States:** `default`
**Typed data:** `HeroModel`
**Copy namespace:** `hero.*`
**Responsive:** 1 column <1120; 7/5 split wide
**RTL:** Text aligns start; preview uses actual RTL rendering
**Accessibility:** One h1; CTA order follows document direction
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## ProductPreview
**Purpose:** Illustrative/evidence-governed product visual
**States:** `illustrative,approved-capture`
**Typed data:** `ProductPreviewModel`
**Copy namespace:** `preview.*`
**Responsive:** Simplify data table on compact
**RTL:** Do not mirror screenshots; coded preview renders RTL
**Accessibility:** Accessible caption; no false product claim
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## LifecycleProof
**Purpose:** Show operational coverage without customer logos
**States:** `default`
**Typed data:** `LifecycleItem[]`
**Copy namespace:** `trust.*`
**Responsive:** 1/2/4 columns by available width
**RTL:** Sequence follows reading direction
**Accessibility:** List semantics; icons decorative
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## ComparisonSection
**Purpose:** Fragmented versus connected workflow
**States:** `default`
**Typed data:** `ComparisonModel`
**Copy namespace:** `comparison.*`
**Responsive:** Stack compact; two columns medium+
**RTL:** Order follows locale reading direction
**Accessibility:** Headings identify both columns; do not rely on color
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## WorkflowSteps
**Purpose:** Four-step rental flow and tour source
**States:** `default`
**Typed data:** `WorkflowStep[]`
**Copy namespace:** `workflow.*`
**Responsive:** 1 column compact; 4 columns >=768
**RTL:** Step order follows reading direction
**Accessibility:** Ordered list; numerals isolated if needed
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## RoleCards
**Purpose:** Explain value by operating role
**States:** `default`
**Typed data:** `RoleCard[]`
**Copy namespace:** `roles.*`
**Responsive:** 1/2/4 columns content-driven
**RTL:** Same tree; start alignment
**Accessibility:** Heading hierarchy and readable card order
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## ModuleGrid
**Purpose:** Describe approved product modules
**States:** `default`
**Typed data:** `ModuleCard[]`
**Copy namespace:** `modules.*`
**Responsive:** 1/2/3 columns
**RTL:** Same tree; directional icons selective
**Accessibility:** No capability beyond approved copy
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## MeasurementPlan
**Purpose:** Show KPI definitions without invented outcomes
**States:** `default`
**Typed data:** `MetricDefinition[]`
**Copy namespace:** `results.*`
**Responsive:** Cards plus methodology block
**RTL:** Same tree
**Accessibility:** No unapproved numbers; ordered methodology
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## IntegrationCategories
**Purpose:** Neutral category list
**States:** `default`
**Typed data:** `IntegrationCategory[]`
**Copy namespace:** `integrations.*`
**Responsive:** Cloud/list adapts without clipping
**RTL:** Same tree
**Accessibility:** No partner logos until verified
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## SecurityChecklist
**Purpose:** Evidence-request checklist
**States:** `default`
**Typed data:** `SecurityCheck[]`
**Copy namespace:** `security.*`
**Responsive:** 1/2 columns
**RTL:** Same tree
**Accessibility:** No badges/certifications without approval
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## PricingPreview
**Purpose:** Explain pricing factors and demo route
**States:** `quote-only,approved-pricing`
**Typed data:** `PricingModel`
**Copy namespace:** `pricing.*`
**Responsive:** Stack compact; 2 columns >=768
**RTL:** Same tree
**Accessibility:** Never imply public price when absent
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## FAQAccordion
**Purpose:** Localized questions and answers
**States:** `closed,open`
**Typed data:** `FaqItem[]`
**Copy namespace:** `faq.*`
**Responsive:** Single column
**RTL:** Chevron mirrors only if it conveys expansion direction
**Accessibility:** Native details baseline; keyboard and SR tested
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## FinalCTA
**Purpose:** Final conversion block and approved secondary contact
**States:** `default`
**Typed data:** `FinalCtaModel`
**Copy namespace:** `finalCta.*`
**Responsive:** Stack compact; 2 columns >=768
**RTL:** CTA order follows document direction
**Accessibility:** Secondary link suppressed until real destination approved
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## SiteFooter
**Purpose:** Localized navigation, legal, evidence status internal only
**States:** `default`
**Typed data:** `FooterModel`
**Copy namespace:** `footer.*`
**Responsive:** Stack then grouped columns
**RTL:** Same tree
**Accessibility:** No public internal proof-status label
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## DemoDialog
**Purpose:** Qualification form and submission states
**States:** `idle,invalid,submitting,success,recoverable-error,terminal-error`
**Typed data:** `DemoFormProps`
**Copy namespace:** `form.*`
**Responsive:** Modal max width; full-screen-safe compact
**RTL:** Field order follows reading direction; emails isolated
**Accessibility:** Focus trap, summary, inline errors, return focus
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
## ProductTourDialog
**Purpose:** Four-step guided overview
**States:** `step-1,step-2,step-3,step-4,complete`
**Typed data:** `TourProps`
**Copy namespace:** `tour.*`
**Responsive:** Modal max width; compact-safe
**RTL:** Back/next positions follow reading direction but meaning stays explicit
**Accessibility:** Progress announced; focus moves to step heading
**Content rule:** Block size is content-driven. Unsupported evidence suppresses the component or uses the explicitly approved neutral variant.
@@ -0,0 +1,21 @@
Component,Purpose,States,Data_contract,Copy_namespace,Responsive_rule,RTL_rule,Accessibility_rule
SiteHeader,"Primary navigation, brand, locale/theme controls, login, demo CTA","default,scrolled",HeaderModel,header.*,Desktop at >=1120; drawer trigger below,Nav order reverses naturally; logo unchanged; directional icons selective,Sticky; 44px targets; skip-link precedes it
MobileDrawer,Compact/medium navigation overlay,"closed,open",DrawerModel,header.*,Inline-start fixed drawer <=384px or 88vw,Opens right in RTL,Trap focus; inert background; Escape; focus return
LocaleSelector,Switch locale by stable route ID,"closed,open,disabled",LocaleSelectorProps,language names,Native select baseline,Order EN/FR/AR; control follows document direction,Labelled; current locale selected; preserves route/hash
ThemeSelector,Set Light/Dark/System preference,"light,dark,system",ThemeSelectorProps,header.light/dark/system,Native select or accessible segmented control,No mirroring needed,Cookie+storage; immediate; live system updates
HeroSection,"Communicate category, promise, primary and secondary actions",default,HeroModel,hero.*,1 column <1120; 7/5 split wide,Text aligns start; preview uses actual RTL rendering,One h1; CTA order follows document direction
ProductPreview,Illustrative/evidence-governed product visual,"illustrative,approved-capture",ProductPreviewModel,preview.*,Simplify data table on compact,Do not mirror screenshots; coded preview renders RTL,Accessible caption; no false product claim
LifecycleProof,Show operational coverage without customer logos,default,LifecycleItem[],trust.*,1/2/4 columns by available width,Sequence follows reading direction,List semantics; icons decorative
ComparisonSection,Fragmented versus connected workflow,default,ComparisonModel,comparison.*,Stack compact; two columns medium+,Order follows locale reading direction,Headings identify both columns; do not rely on color
WorkflowSteps,Four-step rental flow and tour source,default,WorkflowStep[],workflow.*,1 column compact; 4 columns >=768,Step order follows reading direction,Ordered list; numerals isolated if needed
RoleCards,Explain value by operating role,default,RoleCard[],roles.*,1/2/4 columns content-driven,Same tree; start alignment,Heading hierarchy and readable card order
ModuleGrid,Describe approved product modules,default,ModuleCard[],modules.*,1/2/3 columns,Same tree; directional icons selective,No capability beyond approved copy
MeasurementPlan,Show KPI definitions without invented outcomes,default,MetricDefinition[],results.*,Cards plus methodology block,Same tree,No unapproved numbers; ordered methodology
IntegrationCategories,Neutral category list,default,IntegrationCategory[],integrations.*,Cloud/list adapts without clipping,Same tree,No partner logos until verified
SecurityChecklist,Evidence-request checklist,default,SecurityCheck[],security.*,1/2 columns,Same tree,No badges/certifications without approval
PricingPreview,Explain pricing factors and demo route,"quote-only,approved-pricing",PricingModel,pricing.*,Stack compact; 2 columns >=768,Same tree,Never imply public price when absent
FAQAccordion,Localized questions and answers,"closed,open",FaqItem[],faq.*,Single column,Chevron mirrors only if it conveys expansion direction,Native details baseline; keyboard and SR tested
FinalCTA,Final conversion block and approved secondary contact,default,FinalCtaModel,finalCta.*,Stack compact; 2 columns >=768,CTA order follows document direction,Secondary link suppressed until real destination approved
SiteFooter,"Localized navigation, legal, evidence status internal only",default,FooterModel,footer.*,Stack then grouped columns,Same tree,No public internal proof-status label
DemoDialog,Qualification form and submission states,"idle,invalid,submitting,success,recoverable-error,terminal-error",DemoFormProps,form.*,Modal max width; full-screen-safe compact,Field order follows reading direction; emails isolated,"Focus trap, summary, inline errors, return focus"
ProductTourDialog,Four-step guided overview,"step-1,step-2,step-3,step-4,complete",TourProps,tour.*,Modal max width; compact-safe,Back/next positions follow reading direction but meaning stays explicit,Progress announced; focus moves to step heading
1 Component Purpose States Data_contract Copy_namespace Responsive_rule RTL_rule Accessibility_rule
2 SiteHeader Primary navigation, brand, locale/theme controls, login, demo CTA default,scrolled HeaderModel header.* Desktop at >=1120; drawer trigger below Nav order reverses naturally; logo unchanged; directional icons selective Sticky; 44px targets; skip-link precedes it
3 MobileDrawer Compact/medium navigation overlay closed,open DrawerModel header.* Inline-start fixed drawer <=384px or 88vw Opens right in RTL Trap focus; inert background; Escape; focus return
4 LocaleSelector Switch locale by stable route ID closed,open,disabled LocaleSelectorProps language names Native select baseline Order EN/FR/AR; control follows document direction Labelled; current locale selected; preserves route/hash
5 ThemeSelector Set Light/Dark/System preference light,dark,system ThemeSelectorProps header.light/dark/system Native select or accessible segmented control No mirroring needed Cookie+storage; immediate; live system updates
6 HeroSection Communicate category, promise, primary and secondary actions default HeroModel hero.* 1 column <1120; 7/5 split wide Text aligns start; preview uses actual RTL rendering One h1; CTA order follows document direction
7 ProductPreview Illustrative/evidence-governed product visual illustrative,approved-capture ProductPreviewModel preview.* Simplify data table on compact Do not mirror screenshots; coded preview renders RTL Accessible caption; no false product claim
8 LifecycleProof Show operational coverage without customer logos default LifecycleItem[] trust.* 1/2/4 columns by available width Sequence follows reading direction List semantics; icons decorative
9 ComparisonSection Fragmented versus connected workflow default ComparisonModel comparison.* Stack compact; two columns medium+ Order follows locale reading direction Headings identify both columns; do not rely on color
10 WorkflowSteps Four-step rental flow and tour source default WorkflowStep[] workflow.* 1 column compact; 4 columns >=768 Step order follows reading direction Ordered list; numerals isolated if needed
11 RoleCards Explain value by operating role default RoleCard[] roles.* 1/2/4 columns content-driven Same tree; start alignment Heading hierarchy and readable card order
12 ModuleGrid Describe approved product modules default ModuleCard[] modules.* 1/2/3 columns Same tree; directional icons selective No capability beyond approved copy
13 MeasurementPlan Show KPI definitions without invented outcomes default MetricDefinition[] results.* Cards plus methodology block Same tree No unapproved numbers; ordered methodology
14 IntegrationCategories Neutral category list default IntegrationCategory[] integrations.* Cloud/list adapts without clipping Same tree No partner logos until verified
15 SecurityChecklist Evidence-request checklist default SecurityCheck[] security.* 1/2 columns Same tree No badges/certifications without approval
16 PricingPreview Explain pricing factors and demo route quote-only,approved-pricing PricingModel pricing.* Stack compact; 2 columns >=768 Same tree Never imply public price when absent
17 FAQAccordion Localized questions and answers closed,open FaqItem[] faq.* Single column Chevron mirrors only if it conveys expansion direction Native details baseline; keyboard and SR tested
18 FinalCTA Final conversion block and approved secondary contact default FinalCtaModel finalCta.* Stack compact; 2 columns >=768 CTA order follows document direction Secondary link suppressed until real destination approved
19 SiteFooter Localized navigation, legal, evidence status internal only default FooterModel footer.* Stack then grouped columns Same tree No public internal proof-status label
20 DemoDialog Qualification form and submission states idle,invalid,submitting,success,recoverable-error,terminal-error DemoFormProps form.* Modal max width; full-screen-safe compact Field order follows reading direction; emails isolated Focus trap, summary, inline errors, return focus
21 ProductTourDialog Four-step guided overview step-1,step-2,step-3,step-4,complete TourProps tour.* Modal max width; compact-safe Back/next positions follow reading direction but meaning stays explicit Progress announced; focus moves to step heading
@@ -0,0 +1,13 @@
Content_type,Key_pattern,Planning_bound,Rendering_rule
Hero title,hero.title,90 Unicode characters target; no hard truncation,Maximum 3 lines at 320px in each locale; copy review if exceeded
Hero body,hero.body,220 characters target,No clamp; readable measure <=65ch
Navigation label,header.nav.*,24 characters target,No ellipsis; header switches mode before collision
Button label,*.primary|*.secondary,40 characters target,Content-width; may wrap to 2 lines on compact only
Card title,*.items.*.title,70 characters target,No fixed height
Card body,*.items.*.body,220 characters target,No line clamp
FAQ question,faq.items.*.question,160 characters target,Whole trigger remains visible
FAQ answer,faq.items.*.answer,900 characters target,Paragraph/list semantics allowed
Form error,form.*Error,180 characters target,Inline and summary can wrap
Meta title,meta.title,50-60 Latin-character planning range,Localized SEO review; never truncate in source
Meta description,meta.description,140-160 Latin-character planning range,Localized SEO review
Atomic identifier,runtime value,Data-defined,Wrap with bdi/isolation; never translate
1 Content_type Key_pattern Planning_bound Rendering_rule
2 Hero title hero.title 90 Unicode characters target; no hard truncation Maximum 3 lines at 320px in each locale; copy review if exceeded
3 Hero body hero.body 220 characters target No clamp; readable measure <=65ch
4 Navigation label header.nav.* 24 characters target No ellipsis; header switches mode before collision
5 Button label *.primary|*.secondary 40 characters target Content-width; may wrap to 2 lines on compact only
6 Card title *.items.*.title 70 characters target No fixed height
7 Card body *.items.*.body 220 characters target No line clamp
8 FAQ question faq.items.*.question 160 characters target Whole trigger remains visible
9 FAQ answer faq.items.*.answer 900 characters target Paragraph/list semantics allowed
10 Form error form.*Error 180 characters target Inline and summary can wrap
11 Meta title meta.title 50-60 Latin-character planning range Localized SEO review; never truncate in source
12 Meta description meta.description 140-160 Latin-character planning range Localized SEO review
13 Atomic identifier runtime value Data-defined Wrap with bdi/isolation; never translate
@@ -0,0 +1,20 @@
Component,Range_px,Layout,Constraint
Global,0-767,16px minimum gutter; 1 column; 320px reflow gate,No horizontal overflow at 320 CSS px and 400% zoom
Global,768-1119,24-32px gutter; 4/8-column compositions,Drawer navigation remains
Global,1120+,40px max gutter; 12-column composition; 1280px container,Desktop header visible
Header,0-1119,Brand + demo CTA where space permits + menu button,Language/theme/login live in drawer
Header,1120+,"Brand, center nav, locale/theme, login, demo CTA",Header min block 76px
Hero,0-1119,Copy then product visual; CTA wraps/stacks as needed,"Title <=14ch target, never forced"
Hero,1120+,7/5 grid; vertically centered,Visual may not reduce copy below readable measure
Lifecycle,0-479,1 column,Cards auto height
Lifecycle,480-767,2 columns,Odd last card spans only if approved
Lifecycle,768+,4 columns,"Equal visual rhythm, not fixed height"
Workflow,0-767,1 column ordered list,Connectors omitted
Workflow,768+,4 columns,Connectors direction-aware
Cards,0-767,1 column,No carousel substitution
Cards,768-1119,2 columns,Content-driven
Cards,1120+,2-3 columns by component contract,No text truncation
Dialogs,0-479,Viewport-safe margin 8-16px; internal scroll; no hidden submit,Virtual keyboard tested
Dialogs,480+,Max inline size 720px,Centered native dialog
Footer,0-767,Stacked groups,Logical order
Footer,768+,Brand column + grouped links,No fixed widths
1 Component Range_px Layout Constraint
2 Global 0-767 16px minimum gutter; 1 column; 320px reflow gate No horizontal overflow at 320 CSS px and 400% zoom
3 Global 768-1119 24-32px gutter; 4/8-column compositions Drawer navigation remains
4 Global 1120+ 40px max gutter; 12-column composition; 1280px container Desktop header visible
5 Header 0-1119 Brand + demo CTA where space permits + menu button Language/theme/login live in drawer
6 Header 1120+ Brand, center nav, locale/theme, login, demo CTA Header min block 76px
7 Hero 0-1119 Copy then product visual; CTA wraps/stacks as needed Title <=14ch target, never forced
8 Hero 1120+ 7/5 grid; vertically centered Visual may not reduce copy below readable measure
9 Lifecycle 0-479 1 column Cards auto height
10 Lifecycle 480-767 2 columns Odd last card spans only if approved
11 Lifecycle 768+ 4 columns Equal visual rhythm, not fixed height
12 Workflow 0-767 1 column ordered list Connectors omitted
13 Workflow 768+ 4 columns Connectors direction-aware
14 Cards 0-767 1 column No carousel substitution
15 Cards 768-1119 2 columns Content-driven
16 Cards 1120+ 2-3 columns by component contract No text truncation
17 Dialogs 0-479 Viewport-safe margin 8-16px; internal scroll; no hidden submit Virtual keyboard tested
18 Dialogs 480+ Max inline size 720px Centered native dialog
19 Footer 0-767 Stacked groups Logical order
20 Footer 768+ Brand column + grouped links No fixed widths
@@ -0,0 +1,21 @@
Component,RTL_layout,Mirroring,Theme_behavior,Required_variants
SiteHeader,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
MobileDrawer,Use logical CSS; start alignment; one DOM tree.,Drawer origin and slide transform mirror.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
LocaleSelector,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
ThemeSelector,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
HeroSection,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
ProductPreview,Use logical CSS; start alignment; one DOM tree.,Coded preview may reflow in RTL. Captured screenshots never mirror.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
LifecycleProof,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
ComparisonSection,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
WorkflowSteps,Use logical CSS; start alignment; one DOM tree.,"Mirror directional arrows/connectors only; do not mirror check, vehicle, globe, or media icons.",Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
RoleCards,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
ModuleGrid,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
MeasurementPlan,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
IntegrationCategories,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
SecurityChecklist,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
PricingPreview,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
FAQAccordion,Use logical CSS; start alignment; one DOM tree.,"Mirror directional arrows/connectors only; do not mirror check, vehicle, globe, or media icons.",Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
FinalCTA,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
SiteFooter,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
DemoDialog,Use logical CSS; start alignment; one DOM tree.,None by default.,Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
ProductTourDialog,Use logical CSS; start alignment; one DOM tree.,"Mirror directional arrows/connectors only; do not mirror check, vehicle, globe, or media icons.",Consume semantic tokens; no component-owned theme palette.,"Test en-light, fr-dark, ar-light, ar-dark"
1 Component RTL_layout Mirroring Theme_behavior Required_variants
2 SiteHeader Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
3 MobileDrawer Use logical CSS; start alignment; one DOM tree. Drawer origin and slide transform mirror. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
4 LocaleSelector Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
5 ThemeSelector Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
6 HeroSection Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
7 ProductPreview Use logical CSS; start alignment; one DOM tree. Coded preview may reflow in RTL. Captured screenshots never mirror. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
8 LifecycleProof Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
9 ComparisonSection Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
10 WorkflowSteps Use logical CSS; start alignment; one DOM tree. Mirror directional arrows/connectors only; do not mirror check, vehicle, globe, or media icons. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
11 RoleCards Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
12 ModuleGrid Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
13 MeasurementPlan Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
14 IntegrationCategories Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
15 SecurityChecklist Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
16 PricingPreview Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
17 FAQAccordion Use logical CSS; start alignment; one DOM tree. Mirror directional arrows/connectors only; do not mirror check, vehicle, globe, or media icons. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
18 FinalCTA Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
19 SiteFooter Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
20 DemoDialog Use logical CSS; start alignment; one DOM tree. None by default. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
21 ProductTourDialog Use logical CSS; start alignment; one DOM tree. Mirror directional arrows/connectors only; do not mirror check, vehicle, globe, or media icons. Consume semantic tokens; no component-owned theme palette. Test en-light, fr-dark, ar-light, ar-dark
@@ -0,0 +1,43 @@
# Technology Profile
## Required capabilities
The production stack must support SSR or SSG, strict TypeScript, locale-aware route generation, server-readable cookies, CSP nonces or hashes, accessible native dialogs or an equivalent proven overlay primitive, CSS logical properties, automated component tests, Playwright-style browser tests, and deterministic visual-regression fixtures.
## Default profile when architecture has not selected a stack
This profile is a default, not a retroactive approval:
- React-compatible SSR framework with file-based routing
- TypeScript in strict mode
- CSS Modules plus global semantic custom properties
- no runtime CSS-in-JS dependency for static marketing layout
- server components or server rendering for page shell, metadata, locale, and theme attributes
- client code limited to navigation drawer, theme selector, locale selector, tour, demo form, and analytics adapter
- schema validation at network boundaries
- first-party API endpoint or server action for demo submission
- Playwright-compatible browser testing
Exact framework and dependency versions are pinned at repository creation and recorded in the decision log. Do not let the package manager quietly select floating major versions, because apparently version drift enjoys surprise appearances during deadlines.
## Styling constraints
CSS variables contain all visual tokens. Components may use CSS Modules, scoped styles, or an equivalent build-time strategy, but may not embed raw brand colors, physical left/right spacing, or duplicated light/dark values. Utility classes are permitted only if generated from the same semantic token source and if class ordering does not become the design system.
## Repository baseline
```text
src/
app-or-pages/
components/
content/locales/
lib/analytics/
lib/localization/
lib/theme/
styles/tokens.css
styles/globals.css
public/assets/
tests/a11y/
tests/browser/
tests/visual/
```
@@ -0,0 +1,26 @@
export type Locale = "en" | "fr" | "ar";
export type Direction = "ltr" | "rtl";
export type EvidenceStatus = "approved" | "illustrative" | "pending" | "expired" | "rejected";
export type ThemePreference = "light" | "dark" | "system";
export interface LinkModel { id: string; label: string; href: string; external?: boolean; }
export interface SiteHeaderProps { locale: Locale; direction: Direction; links: LinkModel[]; login?: LinkModel; onDemo(): void; }
export interface DrawerProps extends SiteHeaderProps { open: boolean; onOpenChange(open: boolean): void; returnFocusRef?: HTMLElement | null; }
export interface LocaleSelectorProps { locale: Locale; routeId: string; hash?: string; onLocaleChange(locale: Locale): void; }
export interface ThemeSelectorProps { preference: ThemePreference; onPreferenceChange(value: ThemePreference): void; }
export interface HeroModel { eyebrow: string; title: string; body: string; primaryLabel: string; secondaryLabel: string; }
export interface ProductPreviewModel { status: EvidenceStatus; caption: string; locale: Locale; direction: Direction; theme: "light"|"dark"; assetId?: string; }
export interface LifecycleItem { id: string; title: string; description: string; icon: string; }
export interface ComparisonModel { title: string; body: string; before: { title: string; items: string[] }; after: { title: string; items: string[] }; }
export interface WorkflowStep { id: string; ordinal: string; title: string; description: string; }
export interface RoleCard { id: string; title: string; description: string; }
export interface ModuleCard { id: string; title: string; description: string; evidenceStatus: EvidenceStatus; }
export interface MetricDefinition { id: string; title: string; definition: string; publishedValue?: never; }
export interface IntegrationCategory { id: string; label: string; verifiedPartners?: never; }
export interface SecurityCheck { id: string; title: string; description: string; certificationBadge?: never; }
export interface PricingModel { mode: "quote-only" | "approved-pricing"; title: string; body: string; factors: string[]; note: string; }
export interface FaqItem { id: string; question: string; answer: string; }
export interface DemoFormValues { fullName: string; workEmail: string; company: string; fleetSize: string; market?: string; preferredLanguage?: Locale; message?: string; }
export type DemoFormState = "idle"|"validating"|"submitting"|"success"|"recoverable_error"|"terminal_error";
export interface DemoFormProps { state: DemoFormState; values: DemoFormValues; fieldErrors: Partial<Record<keyof DemoFormValues,string>>; formError?: string; onSubmit(values: DemoFormValues): Promise<void>; }
export interface TourProps { steps: WorkflowStep[]; activeIndex: number; open: boolean; onOpenChange(open:boolean): void; onStepChange(index:number): void; }
@@ -0,0 +1,13 @@
import manifest from "../localization/ROUTE_MANIFEST_v1.0.json";
type Locale = "en"|"fr"|"ar";
export function localizedPath(routeId:string, locale:Locale):string {
const route = manifest.routes.find((item) => item.id === routeId);
if (!route) throw new Error(`Unknown route: ${routeId}`);
const slug = route.slugs[locale];
return slug ? `/${locale}/${slug}` : `/${locale}`;
}
export function hreflangLinks(origin:string, routeId:string) {
const alternates = manifest.locales.map((locale) => ({ rel:"alternate", hreflang:locale, href:new URL(localizedPath(routeId, locale as Locale),origin).href }));
alternates.push({ rel:"alternate", hreflang:"x-default", href:new URL(localizedPath(routeId,"en"),origin).href });
return alternates;
}
@@ -0,0 +1,10 @@
export const locales = ["en", "fr", "ar"] as const;
export type Locale = typeof locales[number];
export const defaultLocale: Locale = "en";
export const directionByLocale: Record<Locale,"ltr"|"rtl"> = { en:"ltr", fr:"ltr", ar:"rtl" };
export const localeCookie = "hpc-locale";
export const localeStorageKey = "hpc.locale";
export const campaignQueryAllowlist = ["utm_source","utm_medium","utm_campaign","utm_content","gclid"] as const;
export const rootDetectionOrder = ["cookie","accept-language","default-en"] as const;
export function isLocale(value: unknown): value is Locale { return typeof value === "string" && (locales as readonly string[]).includes(value); }
export function isolateLtr(value: string): { dir:"ltr"; value:string } { return { dir:"ltr", value }; }
@@ -0,0 +1,8 @@
export const themeCookie = "hpc-theme";
export const themeStorageKey = "hpc.theme.preference";
export const themePreferences = ["light","dark","system"] as const;
export type ThemePreference = typeof themePreferences[number];
export type ResolvedTheme = "light"|"dark";
export function isThemePreference(v:unknown): v is ThemePreference { return typeof v === "string" && (themePreferences as readonly string[]).includes(v); }
export function resolveTheme(preference:ThemePreference, systemDark:boolean):ResolvedTheme { return preference === "system" ? (systemDark ? "dark" : "light") : preference; }
export const themeCookieAttributes = { path:"/", sameSite:"lax" as const, maxAgeSeconds:31536000, secureInProduction:true };
@@ -0,0 +1,19 @@
Event,Trigger,Properties,PII_Allowed,Purpose
page_view,Prototype loaded,"locale,theme,path,hash,session_id,test_mode,referrer_origin",No,Session start and denominator
section_view,Section reaches 35% visibility,"section,locale,theme,hash,session_id",No,Discovery sequence
navigation_click,Primary/mobile nav link used,"target,locale,theme,hash,session_id",No,Navigation path
product_tour_open,Tour opened,"locale,theme,hash,session_id",No,Tour discovery
product_tour_step,Tour step rendered,"step,locale,theme,session_id",No,Progress/drop-off
product_tour_complete,Final tour step completed,"locale,theme,session_id",No,Completion
product_tour_close,Tour closed,"reason,last_step,locale,theme,session_id",No,Abandonment point
locale_change,Language selected,"from,to,context,session_id",No,Locale use/context preservation
theme_change,Theme selected,"from,to,locale,session_id",No,Theme use
mobile_nav_open,Drawer opened,"locale,theme,session_id",No,Mobile discovery
mobile_nav_close,Drawer closed,"locale,theme,session_id",No,Drawer completion
demo_open,Demo opened,"source,locale,theme,session_id",No,CTA source
demo_validation_error,Validation blocked submit,"source,error_count,locale,theme,session_id",No,Error rate; never field values
demo_submit_attempt,Submit activated,"source,locale,theme,session_id",No,Funnel attempt
demo_submit_failure,Simulated service failure,"source,scenario,locale,theme,session_id",No,Failure recovery
demo_submit_success,Prototype confirmation reached,"source,locale,theme,session_id",No,Completion
demo_close,Demo closed,"reason,locale,theme,session_id",No,Abandonment
faq_open,FAQ disclosure opened,"index,locale,theme,session_id",No,Question discovery
1 Event Trigger Properties PII_Allowed Purpose
2 page_view Prototype loaded locale,theme,path,hash,session_id,test_mode,referrer_origin No Session start and denominator
3 section_view Section reaches 35% visibility section,locale,theme,hash,session_id No Discovery sequence
4 navigation_click Primary/mobile nav link used target,locale,theme,hash,session_id No Navigation path
5 product_tour_open Tour opened locale,theme,hash,session_id No Tour discovery
6 product_tour_step Tour step rendered step,locale,theme,session_id No Progress/drop-off
7 product_tour_complete Final tour step completed locale,theme,session_id No Completion
8 product_tour_close Tour closed reason,last_step,locale,theme,session_id No Abandonment point
9 locale_change Language selected from,to,context,session_id No Locale use/context preservation
10 theme_change Theme selected from,to,locale,session_id No Theme use
11 mobile_nav_open Drawer opened locale,theme,session_id No Mobile discovery
12 mobile_nav_close Drawer closed locale,theme,session_id No Drawer completion
13 demo_open Demo opened source,locale,theme,session_id No CTA source
14 demo_validation_error Validation blocked submit source,error_count,locale,theme,session_id No Error rate; never field values
15 demo_submit_attempt Submit activated source,locale,theme,session_id No Funnel attempt
16 demo_submit_failure Simulated service failure source,scenario,locale,theme,session_id No Failure recovery
17 demo_submit_success Prototype confirmation reached source,locale,theme,session_id No Completion
18 demo_close Demo closed reason,locale,theme,session_id No Abandonment
19 faq_open FAQ disclosure opened index,locale,theme,session_id No Question discovery
@@ -0,0 +1,33 @@
# Interaction Notes
## Navigation
Anchor navigation updates the URL hash and lands the target below the sticky header using `scroll-margin-block-start`. Locale switching preserves only hashes listed for the route. Mobile navigation closes after an internal destination activates. Focus is returned only when the close action does not immediately navigate.
## Drawer
`closed → opening → open → closing → closed`. Opening stores the active element, sets `aria-expanded=true`, reveals backdrop, makes page landmarks inert, locks body scroll without layout shift, and focuses the close control. Tab and Shift+Tab remain inside. Escape and backdrop close unless a nested blocking dialog is active.
## Dialogs
Use native `<dialog>` when browser support and QA pass; otherwise use a proven accessible primitive. The trigger regains focus on close. Backdrop click is permitted when the form is idle. During submission, closing requires an explicit cancel decision so an in-flight request is not silently duplicated.
## Demo validation
Validation occurs on submit, then on change/blur for fields that are already invalid. A form summary uses `role=alert` or an announced live region. First invalid field receives focus after the summary is updated. Native input semantics remain. Email syntax validation is deliberately modest; the server remains authoritative.
## Theme
Apply preference immediately. Persist cookie and storage in one transaction. Broadcast changes through the `storage` event. In System mode, respond to `prefers-color-scheme` changes. Never animate the entire page between themes.
## Product tour
Opening starts at step one. Back is disabled on the first step. Next becomes Finish on the last. Step heading receives programmatic focus after each change. Progress text is localized and announced politely. Completion does not imply a video was watched.
## FAQ
Native `details/summary` is the baseline. Multiple items may remain open. Do not introduce accordion exclusivity without a content reason and a new decision.
## Analytics
Events are emitted through a vendor-neutral adapter after consent. Event payloads contain route, locale, resolved theme, direction, component/source ID, and non-PII state. Form field values and free text are forbidden. Development logs must be disabled in production.
@@ -0,0 +1,9 @@
export type AnalyticsEventName =
| "page_view" | "section_view" | "navigation_click"
| "locale_change" | "theme_change" | "mobile_nav_open" | "mobile_nav_close"
| "product_tour_open" | "product_tour_step" | "product_tour_complete" | "product_tour_close"
| "demo_open" | "demo_submit_attempt" | "demo_validation_error" | "demo_submit_success" | "demo_submit_failure" | "demo_close"
| "faq_open";
export interface AnalyticsContext { routeId:string; locale:"en"|"fr"|"ar"; direction:"ltr"|"rtl"; resolvedTheme:"light"|"dark"; source?:string; step?:number; errorCode?:string; }
export interface AnalyticsAdapter { consentGranted():boolean; track(name:AnalyticsEventName, context:AnalyticsContext):void; }
export const forbiddenPayloadKeys = ["name","email","company","message","phone","fieldValue","serverResponse"] as const;
@@ -0,0 +1,5 @@
export const fleetSizeValues = ["1-9","10-24","25-49","50-99","100-249","250+"] as const;
export type FleetSize = typeof fleetSizeValues[number];
export interface DemoRequest { fullName:string; workEmail:string; company:string; fleetSize:FleetSize; market?:string; preferredLanguage?:"en"|"fr"|"ar"; message?:string; idempotencyKey:string; source:string; }
export interface DemoSuccess { requestId:string; acceptedAt:string; nextStepCode:"sales_followup"|"manual_review"; }
export interface DemoFailure { code:"validation"|"rate_limited"|"duplicate"|"unavailable"|"unknown"; retryable:boolean; fieldErrors?:Record<string,string>; }
@@ -0,0 +1,14 @@
(function () {
var allowed = { light: true, dark: true, system: true };
var cookieMatch = document.cookie.match(/(?:^|; )hpc-theme=([^;]+)/);
var cookieValue = cookieMatch ? decodeURIComponent(cookieMatch[1]) : null;
var stored = null;
try { stored = localStorage.getItem("hpc.theme.preference"); } catch (_) {}
var preference = allowed[cookieValue] ? cookieValue : (allowed[stored] ? stored : "system");
var dark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches;
var resolved = preference === "system" ? (dark ? "dark" : "light") : preference;
var root = document.documentElement;
root.dataset.themePreference = preference;
root.dataset.theme = resolved;
root.style.colorScheme = resolved;
})();
@@ -0,0 +1,39 @@
# Localization Implementation
## Source and parity
English is the authoring source. French and Arabic are independent production resources, not machine-generated runtime fallbacks. CI compares complete key shape, scalar types, required arrays, empty values, and route coverage. A missing translation blocks merge.
## Document state
Set document attributes on the server:
```html
<html lang="ar" dir="rtl" data-theme-preference="system" data-theme="dark">
```
Do not wait for hydration to set language, direction, or resolved theme.
## Route behavior
- Public indexable pages use locale prefixes.
- Root `/` is the only route eligible for browser-language detection.
- Explicit locale URLs remain explicit.
- Switch by route ID, not string substitution.
- Preserve only allowlisted campaign parameters and valid section hashes.
- Canonicals are self-referential locale URLs.
- Every indexable locale page outputs reciprocal `en`, `fr`, `ar`, and `x-default` alternatives.
## Arabic and mixed direction
Use formal Modern Standard Arabic. Apply document-level RTL and CSS logical properties. Wrap plates, VINs, emails, phone numbers, URLs, currency codes, dates with Latin digits, model numbers, and analytics identifiers in `bdi dir="ltr"` or a typed isolation component. Do not add directional Unicode marks manually inside translation strings unless linguistic review documents the exception.
Icons mirror only when their meaning is directional. Product screenshots never mirror.
## Formatting
Language does not imply market. Formatters receive locale plus explicit currency, timezone, country, and numbering policy. The baseline uses Gregorian dates and Latin digits for all three language-only locales until market research approves another rule.
## Copy governance
Every visible string has a semantic key. Exceptions are the `homePageCar` proper name, immutable technical identifiers, and data supplied at runtime. Public evidence-bearing blocks include evidence status in their content model; pending or expired evidence suppresses the claim.
@@ -0,0 +1,90 @@
{
"version": "1.0",
"defaultLocale": "en",
"locales": [
"en",
"fr",
"ar"
],
"rootDetection": true,
"routes": [
{
"id": "home",
"slugs": {
"en": "",
"fr": "",
"ar": ""
},
"indexable": true,
"hashes": [
"top",
"product",
"workflow",
"modules",
"pricing",
"faq",
"contact"
]
},
{
"id": "login",
"slugs": {
"en": "login",
"fr": "connexion",
"ar": "تسجيل-الدخول"
},
"indexable": false,
"hashes": []
},
{
"id": "privacy",
"slugs": {
"en": "privacy",
"fr": "confidentialite",
"ar": "الخصوصية"
},
"indexable": true,
"hashes": []
},
{
"id": "terms",
"slugs": {
"en": "terms",
"fr": "conditions",
"ar": "الشروط"
},
"indexable": true,
"hashes": []
},
{
"id": "accessibility",
"slugs": {
"en": "accessibility",
"fr": "accessibilite",
"ar": "إمكانية-الوصول"
},
"indexable": true,
"hashes": []
}
],
"switching": {
"preserveQueryAllowlist": [
"utm_source",
"utm_medium",
"utm_campaign",
"utm_content",
"gclid"
],
"preserveValidHash": true,
"dropUnknownQuery": true
},
"hreflang": {
"values": [
"en",
"fr",
"ar"
],
"xDefaultLocale": "en",
"selfCanonical": true
}
}
@@ -0,0 +1,247 @@
Key,EN,FR,AR,Value_type,Usage
comparison.afterItems[0],yes,yes,yes,str,visible
comparison.afterItems[1],yes,yes,yes,str,visible
comparison.afterItems[2],yes,yes,yes,str,visible
comparison.afterItems[3],yes,yes,yes,str,visible
comparison.afterTitle,yes,yes,yes,str,visible
comparison.beforeItems[0],yes,yes,yes,str,visible
comparison.beforeItems[1],yes,yes,yes,str,visible
comparison.beforeItems[2],yes,yes,yes,str,visible
comparison.beforeItems[3],yes,yes,yes,str,visible
comparison.beforeTitle,yes,yes,yes,str,visible
comparison.body,yes,yes,yes,str,visible
comparison.eyebrow,yes,yes,yes,str,visible
comparison.title,yes,yes,yes,str,visible
faq.eyebrow,yes,yes,yes,str,visible
faq.items[0][0],yes,yes,yes,str,visible
faq.items[0][1],yes,yes,yes,str,visible
faq.items[1][0],yes,yes,yes,str,visible
faq.items[1][1],yes,yes,yes,str,visible
faq.items[2][0],yes,yes,yes,str,visible
faq.items[2][1],yes,yes,yes,str,visible
faq.items[3][0],yes,yes,yes,str,visible
faq.items[3][1],yes,yes,yes,str,visible
faq.items[4][0],yes,yes,yes,str,visible
faq.items[4][1],yes,yes,yes,str,visible
faq.items[5][0],yes,yes,yes,str,visible
faq.items[5][1],yes,yes,yes,str,visible
faq.title,yes,yes,yes,str,visible
final.body,yes,yes,yes,str,visible
final.eyebrow,yes,yes,yes,str,visible
final.primary,yes,yes,yes,str,visible
final.secondary,yes,yes,yes,str,visible
final.title,yes,yes,yes,str,visible
footer.copyright,yes,yes,yes,str,visible
footer.groups[0][0],yes,yes,yes,str,visible
footer.groups[0][1][0][0],yes,yes,yes,str,visible
footer.groups[0][1][0][1],yes,yes,yes,str,visible
footer.groups[0][1][1][0],yes,yes,yes,str,visible
footer.groups[0][1][1][1],yes,yes,yes,str,visible
footer.groups[0][1][2][0],yes,yes,yes,str,visible
footer.groups[0][1][2][1],yes,yes,yes,str,visible
footer.groups[1][0],yes,yes,yes,str,visible
footer.groups[1][1][0][0],yes,yes,yes,str,visible
footer.groups[1][1][0][1],yes,yes,yes,str,visible
footer.groups[1][1][1][0],yes,yes,yes,str,visible
footer.groups[1][1][1][1],yes,yes,yes,str,visible
footer.groups[2][0],yes,yes,yes,str,visible
footer.groups[2][1][0][0],yes,yes,yes,str,visible
footer.groups[2][1][0][1],yes,yes,yes,str,visible
footer.groups[2][1][1][0],yes,yes,yes,str,visible
footer.groups[2][1][1][1],yes,yes,yes,str,visible
footer.groups[2][1][2][0],yes,yes,yes,str,visible
footer.groups[2][1][2][1],yes,yes,yes,str,visible
footer.groups[3][0],yes,yes,yes,str,visible
footer.groups[3][1][0][0],yes,yes,yes,str,visible
footer.groups[3][1][0][1],yes,yes,yes,str,visible
footer.groups[3][1][1][0],yes,yes,yes,str,visible
footer.groups[3][1][1][1],yes,yes,yes,str,visible
footer.groups[3][1][2][0],yes,yes,yes,str,visible
footer.groups[3][1][2][1],yes,yes,yes,str,visible
footer.tagline,yes,yes,yes,str,visible
form.body,yes,yes,yes,str,visible
form.close,yes,yes,yes,str,visible
form.company,yes,yes,yes,str,visible
form.email,yes,yes,yes,str,visible
form.emailError,yes,yes,yes,str,visible
form.errorSummary,yes,yes,yes,str,visible
form.fleet,yes,yes,yes,str,visible
form.fleetOptions[0],yes,yes,yes,str,visible
form.fleetOptions[1],yes,yes,yes,str,visible
form.fleetOptions[2],yes,yes,yes,str,visible
form.fleetOptions[3],yes,yes,yes,str,visible
form.fleetOptions[4],yes,yes,yes,str,visible
form.fleetOptions[5],yes,yes,yes,str,visible
form.langOptions[0],yes,yes,yes,str,visible
form.langOptions[1],yes,yes,yes,str,visible
form.langOptions[2],yes,yes,yes,str,visible
form.language,yes,yes,yes,str,visible
form.market,yes,yes,yes,str,visible
form.message,yes,yes,yes,str,visible
form.name,yes,yes,yes,str,visible
form.privacy,yes,yes,yes,str,visible
form.required,yes,yes,yes,str,visible
form.requiredError,yes,yes,yes,str,visible
form.submissionError,yes,yes,yes,str,visible
form.submit,yes,yes,yes,str,visible
form.submitAnother,yes,yes,yes,str,visible
form.successBody,yes,yes,yes,str,visible
form.successTitle,yes,yes,yes,str,visible
form.title,yes,yes,yes,str,visible
header.dark,yes,yes,yes,str,visible
header.demo,yes,yes,yes,str,visible
header.language,yes,yes,yes,str,visible
header.light,yes,yes,yes,str,visible
header.login,yes,yes,yes,str,visible
header.menu,yes,yes,yes,str,visible
header.nav[0][0],yes,yes,yes,str,visible
header.nav[0][1],yes,yes,yes,str,visible
header.nav[1][0],yes,yes,yes,str,visible
header.nav[1][1],yes,yes,yes,str,visible
header.nav[2][0],yes,yes,yes,str,visible
header.nav[2][1],yes,yes,yes,str,visible
header.nav[3][0],yes,yes,yes,str,visible
header.nav[3][1],yes,yes,yes,str,visible
header.nav[4][0],yes,yes,yes,str,visible
header.nav[4][1],yes,yes,yes,str,visible
header.system,yes,yes,yes,str,visible
header.theme,yes,yes,yes,str,visible
hero.body,yes,yes,yes,str,visible
hero.caption,yes,yes,yes,str,visible
hero.eyebrow,yes,yes,yes,str,visible
hero.primary,yes,yes,yes,str,visible
hero.secondary,yes,yes,yes,str,visible
hero.title,yes,yes,yes,str,visible
integrations.body,yes,yes,yes,str,visible
integrations.eyebrow,yes,yes,yes,str,visible
integrations.items[0],yes,yes,yes,str,visible
integrations.items[1],yes,yes,yes,str,visible
integrations.items[2],yes,yes,yes,str,visible
integrations.items[3],yes,yes,yes,str,visible
integrations.items[4],yes,yes,yes,str,visible
integrations.items[5],yes,yes,yes,str,visible
integrations.title,yes,yes,yes,str,visible
meta.description,yes,yes,yes,str,metadata
meta.dir,yes,yes,yes,str,metadata
meta.langName,yes,yes,yes,str,metadata
meta.title,yes,yes,yes,str,metadata
modules.body,yes,yes,yes,str,visible
modules.eyebrow,yes,yes,yes,str,visible
modules.items[0][0],yes,yes,yes,str,visible
modules.items[0][1],yes,yes,yes,str,visible
modules.items[1][0],yes,yes,yes,str,visible
modules.items[1][1],yes,yes,yes,str,visible
modules.items[2][0],yes,yes,yes,str,visible
modules.items[2][1],yes,yes,yes,str,visible
modules.items[3][0],yes,yes,yes,str,visible
modules.items[3][1],yes,yes,yes,str,visible
modules.items[4][0],yes,yes,yes,str,visible
modules.items[4][1],yes,yes,yes,str,visible
modules.items[5][0],yes,yes,yes,str,visible
modules.items[5][1],yes,yes,yes,str,visible
modules.title,yes,yes,yes,str,visible
preview.active,yes,yes,yes,str,visible
preview.attention,yes,yes,yes,str,visible
preview.branch,yes,yes,yes,str,visible
preview.customer,yes,yes,yes,str,visible
preview.plate1,yes,yes,yes,str,visible
preview.plate2,yes,yes,yes,str,visible
preview.r1,yes,yes,yes,str,visible
preview.r2,yes,yes,yes,str,visible
preview.r3,yes,yes,yes,str,visible
preview.ready,yes,yes,yes,str,visible
preview.reservations,yes,yes,yes,str,visible
preview.status,yes,yes,yes,str,visible
preview.statusDue,yes,yes,yes,str,visible
preview.statusReady,yes,yes,yes,str,visible
preview.task,yes,yes,yes,str,visible
preview.taskAssign,yes,yes,yes,str,visible
preview.taskInspect,yes,yes,yes,str,visible
preview.title,yes,yes,yes,str,visible
preview.today,yes,yes,yes,str,visible
preview.vehicle,yes,yes,yes,str,visible
pricing.body,yes,yes,yes,str,visible
pricing.eyebrow,yes,yes,yes,str,visible
pricing.factors[0],yes,yes,yes,str,visible
pricing.factors[1],yes,yes,yes,str,visible
pricing.factors[2],yes,yes,yes,str,visible
pricing.factors[3],yes,yes,yes,str,visible
pricing.note,yes,yes,yes,str,visible
pricing.primary,yes,yes,yes,str,visible
pricing.title,yes,yes,yes,str,visible
research.clear,yes,yes,yes,str,visible
research.close,yes,yes,yes,str,visible
research.events,yes,yes,yes,str,visible
research.export,yes,yes,yes,str,visible
research.title,yes,yes,yes,str,visible
results.body,yes,yes,yes,str,visible
results.eyebrow,yes,yes,yes,str,visible
results.methodTitle,yes,yes,yes,str,visible
results.method[0],yes,yes,yes,str,visible
results.method[1],yes,yes,yes,str,visible
results.method[2],yes,yes,yes,str,visible
results.method[3],yes,yes,yes,str,visible
results.metrics[0][0],yes,yes,yes,str,visible
results.metrics[0][1],yes,yes,yes,str,visible
results.metrics[1][0],yes,yes,yes,str,visible
results.metrics[1][1],yes,yes,yes,str,visible
results.metrics[2][0],yes,yes,yes,str,visible
results.metrics[2][1],yes,yes,yes,str,visible
results.metrics[3][0],yes,yes,yes,str,visible
results.metrics[3][1],yes,yes,yes,str,visible
results.title,yes,yes,yes,str,visible
roles.eyebrow,yes,yes,yes,str,visible
roles.roles[0][0],yes,yes,yes,str,visible
roles.roles[0][1],yes,yes,yes,str,visible
roles.roles[1][0],yes,yes,yes,str,visible
roles.roles[1][1],yes,yes,yes,str,visible
roles.roles[2][0],yes,yes,yes,str,visible
roles.roles[2][1],yes,yes,yes,str,visible
roles.roles[3][0],yes,yes,yes,str,visible
roles.roles[3][1],yes,yes,yes,str,visible
roles.title,yes,yes,yes,str,visible
security.body,yes,yes,yes,str,visible
security.checks[0][0],yes,yes,yes,str,visible
security.checks[0][1],yes,yes,yes,str,visible
security.checks[1][0],yes,yes,yes,str,visible
security.checks[1][1],yes,yes,yes,str,visible
security.checks[2][0],yes,yes,yes,str,visible
security.checks[2][1],yes,yes,yes,str,visible
security.checks[3][0],yes,yes,yes,str,visible
security.checks[3][1],yes,yes,yes,str,visible
security.eyebrow,yes,yes,yes,str,visible
security.title,yes,yes,yes,str,visible
tour.back,yes,yes,yes,str,visible
tour.close,yes,yes,yes,str,visible
tour.finish,yes,yes,yes,str,visible
tour.intro,yes,yes,yes,str,visible
tour.next,yes,yes,yes,str,visible
tour.of,yes,yes,yes,str,visible
tour.step,yes,yes,yes,str,visible
tour.title,yes,yes,yes,str,visible
trust.body,yes,yes,yes,str,visible
trust.eyebrow,yes,yes,yes,str,visible
trust.items[0][0],yes,yes,yes,str,visible
trust.items[0][1],yes,yes,yes,str,visible
trust.items[1][0],yes,yes,yes,str,visible
trust.items[1][1],yes,yes,yes,str,visible
trust.items[2][0],yes,yes,yes,str,visible
trust.items[2][1],yes,yes,yes,str,visible
trust.items[3][0],yes,yes,yes,str,visible
trust.items[3][1],yes,yes,yes,str,visible
trust.title,yes,yes,yes,str,visible
workflow.body,yes,yes,yes,str,visible
workflow.eyebrow,yes,yes,yes,str,visible
workflow.steps[0][0],yes,yes,yes,str,visible
workflow.steps[0][1],yes,yes,yes,str,visible
workflow.steps[0][2],yes,yes,yes,str,visible
workflow.steps[1][0],yes,yes,yes,str,visible
workflow.steps[1][1],yes,yes,yes,str,visible
workflow.steps[1][2],yes,yes,yes,str,visible
workflow.steps[2][0],yes,yes,yes,str,visible
workflow.steps[2][1],yes,yes,yes,str,visible
workflow.steps[2][2],yes,yes,yes,str,visible
workflow.steps[3][0],yes,yes,yes,str,visible
workflow.steps[3][1],yes,yes,yes,str,visible
workflow.steps[3][2],yes,yes,yes,str,visible
workflow.title,yes,yes,yes,str,visible
1 Key EN FR AR Value_type Usage
2 comparison.afterItems[0] yes yes yes str visible
3 comparison.afterItems[1] yes yes yes str visible
4 comparison.afterItems[2] yes yes yes str visible
5 comparison.afterItems[3] yes yes yes str visible
6 comparison.afterTitle yes yes yes str visible
7 comparison.beforeItems[0] yes yes yes str visible
8 comparison.beforeItems[1] yes yes yes str visible
9 comparison.beforeItems[2] yes yes yes str visible
10 comparison.beforeItems[3] yes yes yes str visible
11 comparison.beforeTitle yes yes yes str visible
12 comparison.body yes yes yes str visible
13 comparison.eyebrow yes yes yes str visible
14 comparison.title yes yes yes str visible
15 faq.eyebrow yes yes yes str visible
16 faq.items[0][0] yes yes yes str visible
17 faq.items[0][1] yes yes yes str visible
18 faq.items[1][0] yes yes yes str visible
19 faq.items[1][1] yes yes yes str visible
20 faq.items[2][0] yes yes yes str visible
21 faq.items[2][1] yes yes yes str visible
22 faq.items[3][0] yes yes yes str visible
23 faq.items[3][1] yes yes yes str visible
24 faq.items[4][0] yes yes yes str visible
25 faq.items[4][1] yes yes yes str visible
26 faq.items[5][0] yes yes yes str visible
27 faq.items[5][1] yes yes yes str visible
28 faq.title yes yes yes str visible
29 final.body yes yes yes str visible
30 final.eyebrow yes yes yes str visible
31 final.primary yes yes yes str visible
32 final.secondary yes yes yes str visible
33 final.title yes yes yes str visible
34 footer.copyright yes yes yes str visible
35 footer.groups[0][0] yes yes yes str visible
36 footer.groups[0][1][0][0] yes yes yes str visible
37 footer.groups[0][1][0][1] yes yes yes str visible
38 footer.groups[0][1][1][0] yes yes yes str visible
39 footer.groups[0][1][1][1] yes yes yes str visible
40 footer.groups[0][1][2][0] yes yes yes str visible
41 footer.groups[0][1][2][1] yes yes yes str visible
42 footer.groups[1][0] yes yes yes str visible
43 footer.groups[1][1][0][0] yes yes yes str visible
44 footer.groups[1][1][0][1] yes yes yes str visible
45 footer.groups[1][1][1][0] yes yes yes str visible
46 footer.groups[1][1][1][1] yes yes yes str visible
47 footer.groups[2][0] yes yes yes str visible
48 footer.groups[2][1][0][0] yes yes yes str visible
49 footer.groups[2][1][0][1] yes yes yes str visible
50 footer.groups[2][1][1][0] yes yes yes str visible
51 footer.groups[2][1][1][1] yes yes yes str visible
52 footer.groups[2][1][2][0] yes yes yes str visible
53 footer.groups[2][1][2][1] yes yes yes str visible
54 footer.groups[3][0] yes yes yes str visible
55 footer.groups[3][1][0][0] yes yes yes str visible
56 footer.groups[3][1][0][1] yes yes yes str visible
57 footer.groups[3][1][1][0] yes yes yes str visible
58 footer.groups[3][1][1][1] yes yes yes str visible
59 footer.groups[3][1][2][0] yes yes yes str visible
60 footer.groups[3][1][2][1] yes yes yes str visible
61 footer.tagline yes yes yes str visible
62 form.body yes yes yes str visible
63 form.close yes yes yes str visible
64 form.company yes yes yes str visible
65 form.email yes yes yes str visible
66 form.emailError yes yes yes str visible
67 form.errorSummary yes yes yes str visible
68 form.fleet yes yes yes str visible
69 form.fleetOptions[0] yes yes yes str visible
70 form.fleetOptions[1] yes yes yes str visible
71 form.fleetOptions[2] yes yes yes str visible
72 form.fleetOptions[3] yes yes yes str visible
73 form.fleetOptions[4] yes yes yes str visible
74 form.fleetOptions[5] yes yes yes str visible
75 form.langOptions[0] yes yes yes str visible
76 form.langOptions[1] yes yes yes str visible
77 form.langOptions[2] yes yes yes str visible
78 form.language yes yes yes str visible
79 form.market yes yes yes str visible
80 form.message yes yes yes str visible
81 form.name yes yes yes str visible
82 form.privacy yes yes yes str visible
83 form.required yes yes yes str visible
84 form.requiredError yes yes yes str visible
85 form.submissionError yes yes yes str visible
86 form.submit yes yes yes str visible
87 form.submitAnother yes yes yes str visible
88 form.successBody yes yes yes str visible
89 form.successTitle yes yes yes str visible
90 form.title yes yes yes str visible
91 header.dark yes yes yes str visible
92 header.demo yes yes yes str visible
93 header.language yes yes yes str visible
94 header.light yes yes yes str visible
95 header.login yes yes yes str visible
96 header.menu yes yes yes str visible
97 header.nav[0][0] yes yes yes str visible
98 header.nav[0][1] yes yes yes str visible
99 header.nav[1][0] yes yes yes str visible
100 header.nav[1][1] yes yes yes str visible
101 header.nav[2][0] yes yes yes str visible
102 header.nav[2][1] yes yes yes str visible
103 header.nav[3][0] yes yes yes str visible
104 header.nav[3][1] yes yes yes str visible
105 header.nav[4][0] yes yes yes str visible
106 header.nav[4][1] yes yes yes str visible
107 header.system yes yes yes str visible
108 header.theme yes yes yes str visible
109 hero.body yes yes yes str visible
110 hero.caption yes yes yes str visible
111 hero.eyebrow yes yes yes str visible
112 hero.primary yes yes yes str visible
113 hero.secondary yes yes yes str visible
114 hero.title yes yes yes str visible
115 integrations.body yes yes yes str visible
116 integrations.eyebrow yes yes yes str visible
117 integrations.items[0] yes yes yes str visible
118 integrations.items[1] yes yes yes str visible
119 integrations.items[2] yes yes yes str visible
120 integrations.items[3] yes yes yes str visible
121 integrations.items[4] yes yes yes str visible
122 integrations.items[5] yes yes yes str visible
123 integrations.title yes yes yes str visible
124 meta.description yes yes yes str metadata
125 meta.dir yes yes yes str metadata
126 meta.langName yes yes yes str metadata
127 meta.title yes yes yes str metadata
128 modules.body yes yes yes str visible
129 modules.eyebrow yes yes yes str visible
130 modules.items[0][0] yes yes yes str visible
131 modules.items[0][1] yes yes yes str visible
132 modules.items[1][0] yes yes yes str visible
133 modules.items[1][1] yes yes yes str visible
134 modules.items[2][0] yes yes yes str visible
135 modules.items[2][1] yes yes yes str visible
136 modules.items[3][0] yes yes yes str visible
137 modules.items[3][1] yes yes yes str visible
138 modules.items[4][0] yes yes yes str visible
139 modules.items[4][1] yes yes yes str visible
140 modules.items[5][0] yes yes yes str visible
141 modules.items[5][1] yes yes yes str visible
142 modules.title yes yes yes str visible
143 preview.active yes yes yes str visible
144 preview.attention yes yes yes str visible
145 preview.branch yes yes yes str visible
146 preview.customer yes yes yes str visible
147 preview.plate1 yes yes yes str visible
148 preview.plate2 yes yes yes str visible
149 preview.r1 yes yes yes str visible
150 preview.r2 yes yes yes str visible
151 preview.r3 yes yes yes str visible
152 preview.ready yes yes yes str visible
153 preview.reservations yes yes yes str visible
154 preview.status yes yes yes str visible
155 preview.statusDue yes yes yes str visible
156 preview.statusReady yes yes yes str visible
157 preview.task yes yes yes str visible
158 preview.taskAssign yes yes yes str visible
159 preview.taskInspect yes yes yes str visible
160 preview.title yes yes yes str visible
161 preview.today yes yes yes str visible
162 preview.vehicle yes yes yes str visible
163 pricing.body yes yes yes str visible
164 pricing.eyebrow yes yes yes str visible
165 pricing.factors[0] yes yes yes str visible
166 pricing.factors[1] yes yes yes str visible
167 pricing.factors[2] yes yes yes str visible
168 pricing.factors[3] yes yes yes str visible
169 pricing.note yes yes yes str visible
170 pricing.primary yes yes yes str visible
171 pricing.title yes yes yes str visible
172 research.clear yes yes yes str visible
173 research.close yes yes yes str visible
174 research.events yes yes yes str visible
175 research.export yes yes yes str visible
176 research.title yes yes yes str visible
177 results.body yes yes yes str visible
178 results.eyebrow yes yes yes str visible
179 results.methodTitle yes yes yes str visible
180 results.method[0] yes yes yes str visible
181 results.method[1] yes yes yes str visible
182 results.method[2] yes yes yes str visible
183 results.method[3] yes yes yes str visible
184 results.metrics[0][0] yes yes yes str visible
185 results.metrics[0][1] yes yes yes str visible
186 results.metrics[1][0] yes yes yes str visible
187 results.metrics[1][1] yes yes yes str visible
188 results.metrics[2][0] yes yes yes str visible
189 results.metrics[2][1] yes yes yes str visible
190 results.metrics[3][0] yes yes yes str visible
191 results.metrics[3][1] yes yes yes str visible
192 results.title yes yes yes str visible
193 roles.eyebrow yes yes yes str visible
194 roles.roles[0][0] yes yes yes str visible
195 roles.roles[0][1] yes yes yes str visible
196 roles.roles[1][0] yes yes yes str visible
197 roles.roles[1][1] yes yes yes str visible
198 roles.roles[2][0] yes yes yes str visible
199 roles.roles[2][1] yes yes yes str visible
200 roles.roles[3][0] yes yes yes str visible
201 roles.roles[3][1] yes yes yes str visible
202 roles.title yes yes yes str visible
203 security.body yes yes yes str visible
204 security.checks[0][0] yes yes yes str visible
205 security.checks[0][1] yes yes yes str visible
206 security.checks[1][0] yes yes yes str visible
207 security.checks[1][1] yes yes yes str visible
208 security.checks[2][0] yes yes yes str visible
209 security.checks[2][1] yes yes yes str visible
210 security.checks[3][0] yes yes yes str visible
211 security.checks[3][1] yes yes yes str visible
212 security.eyebrow yes yes yes str visible
213 security.title yes yes yes str visible
214 tour.back yes yes yes str visible
215 tour.close yes yes yes str visible
216 tour.finish yes yes yes str visible
217 tour.intro yes yes yes str visible
218 tour.next yes yes yes str visible
219 tour.of yes yes yes str visible
220 tour.step yes yes yes str visible
221 tour.title yes yes yes str visible
222 trust.body yes yes yes str visible
223 trust.eyebrow yes yes yes str visible
224 trust.items[0][0] yes yes yes str visible
225 trust.items[0][1] yes yes yes str visible
226 trust.items[1][0] yes yes yes str visible
227 trust.items[1][1] yes yes yes str visible
228 trust.items[2][0] yes yes yes str visible
229 trust.items[2][1] yes yes yes str visible
230 trust.items[3][0] yes yes yes str visible
231 trust.items[3][1] yes yes yes str visible
232 trust.title yes yes yes str visible
233 workflow.body yes yes yes str visible
234 workflow.eyebrow yes yes yes str visible
235 workflow.steps[0][0] yes yes yes str visible
236 workflow.steps[0][1] yes yes yes str visible
237 workflow.steps[0][2] yes yes yes str visible
238 workflow.steps[1][0] yes yes yes str visible
239 workflow.steps[1][1] yes yes yes str visible
240 workflow.steps[1][2] yes yes yes str visible
241 workflow.steps[2][0] yes yes yes str visible
242 workflow.steps[2][1] yes yes yes str visible
243 workflow.steps[2][2] yes yes yes str visible
244 workflow.steps[3][0] yes yes yes str visible
245 workflow.steps[3][1] yes yes yes str visible
246 workflow.steps[3][2] yes yes yes str visible
247 workflow.title yes yes yes str visible
@@ -0,0 +1,430 @@
{
"meta": {
"langName": "العربية",
"dir": "rtl",
"title": "homePageCar | تشغيل مترابط لتأجير السيارات",
"description": "أدِر الحجوزات والمركبات والعقود والتسليم والإرجاع ضمن منصة تشغيل مترابطة."
},
"header": {
"nav": [
[
"product",
"المنتج"
],
[
"workflow",
"سير العمل"
],
[
"modules",
"الوحدات"
],
[
"pricing",
"التسعير"
],
[
"faq",
"الأسئلة الشائعة"
]
],
"login": "تسجيل الدخول",
"demo": "احجز عرضًا توضيحيًا",
"menu": "فتح القائمة",
"language": "اللغة",
"theme": "المظهر",
"light": "فاتح",
"dark": "داكن",
"system": "النظام"
},
"hero": {
"eyebrow": "تشغيل تأجير السيارات ضمن نظام مترابط",
"title": "أدِر كل عملية تأجير من الحجز حتى إعادة المركبة في نظام واحد.",
"body": "اجمع الحجوزات والمركبات والعقود والتسليم والإرجاع في سجل تشغيلي واحد، كي يرى كل فريق ما يتطلب المتابعة بعد ذلك.",
"primary": "احجز عرضًا توضيحيًا للمنتج",
"secondary": "شاهد جولة المنتج",
"caption": "واجهة توضيحية للمنتج. يجب أن تستخدم الشاشات النهائية بيانات ولقطات معتمدة."
},
"trust": {
"eyebrow": "تغطية تشغيلية",
"title": "سير عمل واحد يغطي دورة التأجير كاملة.",
"body": "حافظ على ترابط سياق العميل والمركبة والعقد والمهام مع تقدم عملية التأجير.",
"items": [
[
"الحجز",
"سجّل الطلب والبيانات المطلوبة."
],
[
"المركبة",
"تابع التوافر والجاهزية."
],
[
"العقد",
"اجمع مهام التسليم والسجلات في موضع واحد."
],
[
"الإرجاع",
"سجّل الحالة وأغلق أعمال المتابعة."
]
]
},
"comparison": {
"eyebrow": "لماذا التغيير",
"title": "استبدل عمليات التسليم المجزأة بسير تشغيلي مشترك.",
"body": "تكلفة الأدوات المنفصلة لا تظهر دائمًا في عطل كبير، بل تتراكم يوميًا عبر تكرار الإدخال وضياع السياق وتأخر المتابعة.",
"beforeTitle": "تشغيل مجزأ",
"beforeItems": [
"نسخ بيانات الحجز بين أدوات متعددة",
"تأكيد حالة المركبة عبر الرسائل",
"متابعة مهام العقد بالاعتماد على الذاكرة",
"اكتشاف مشكلات الإرجاع بعد مغادرة العميل"
],
"afterTitle": "تشغيل مترابط",
"afterItems": [
"حالة حجز واحدة يراها الفريق",
"ربط جاهزية المركبة بعملية التأجير",
"إظهار متطلبات التسليم قبل تسليم المركبة",
"إنشاء متابعة الإرجاع بينما لا يزال السياق واضحًا"
]
},
"workflow": {
"eyebrow": "سير عمل متكامل",
"title": "حرّك عملية التأجير إلى الأمام من دون فقدان السياق.",
"body": "توضح كل خطوة القرار والمسؤول والإجراء التالي بدل دفن التشغيل داخل قائمة عامة من الميزات.",
"steps": [
[
"01",
"تسجيل الحجز",
"سجّل التواريخ وبيانات السائق والمتطلبات والمصدر."
],
[
"02",
"تخصيص مركبة جاهزة",
"طابق التوافر مع الفئة والموقع وحالة الجاهزية."
],
[
"03",
"إكمال التسليم",
"تحقق من المستندات والفحص والعقد ومهام تسليم المركبة."
],
[
"04",
"معالجة الإرجاع",
"سجّل الحالة وأغلق الأعمال المفتوحة وأعد المركبة إلى التوافر."
]
]
},
"roles": {
"eyebrow": "مصمم لفريق التشغيل",
"title": "امنح كل دور السياق الذي يحتاجه من دون إنشاء نسخ متعددة من الحقيقة.",
"roles": [
[
"المالك أو المدير",
"اطّلع على عبء العمل والاستثناءات والمؤشرات التشغيلية عبر النشاط."
],
[
"فريق الحجوزات",
"حوّل الطلبات إلى حجوزات مؤكدة مع عدد أقل من عمليات التسليم."
],
[
"الأسطول والتشغيل",
"اعرف المركبات المتاحة أو المحجوبة أو المستحقة أو التي تنتظر إجراءً."
],
[
"مكتب الاستقبال",
"حضّر مهام التسليم والإرجاع قبل انتظار العميل."
]
]
},
"modules": {
"eyebrow": "وحدات المنتج",
"title": "نواة مترابطة منظّمة حول أعمال التأجير الفعلية.",
"body": "توضح حدود الوحدات المسؤوليات، بينما تمنع السجلات المشتركة فوضى النسخ واللصق المعتادة.",
"items": [
[
"الحجوزات",
"التوافر والتواريخ ومتطلبات العميل والحالة ضمن سير واحد."
],
[
"جاهزية الأسطول",
"توافر المركبات والحجوزات التشغيلية وحالة الخدمة وسياق الموقع."
],
[
"عقود الإيجار",
"متطلبات التسليم وحالة العقد والسجلات التشغيلية."
],
[
"فحص المركبة",
"فحوص منظمة عند التسليم والإرجاع مع مهام متابعة."
],
[
"سجلات العملاء",
"سجل التأجير وبيانات الاتصال المرتبطة بالعمل الجاري."
],
[
"التقارير التشغيلية",
"تعريفات وعروض تشغيلية يمكن التحقق منها مقابل النشاط المصدر."
]
]
},
"results": {
"eyebrow": "نتائج قابلة للقياس",
"title": "قِس التغيير، لا الخطاب التسويقي.",
"body": "لا ينبغي نشر أي نتيجة قبل اعتماد خط أساس حقيقي لعميل وفترة مقارنة وتعريف واضح للبيانات. لذلك تعرض هذه النسخة منهجية القياس بدل نسب مئوية مختلقة.",
"metrics": [
[
"زمن معالجة الحجز",
"من استلام طلب صالح للعمل حتى تأكيد الحجز."
],
[
"زمن إعادة المركبة إلى الجاهزية",
"من تسجيل الإرجاع حتى حالة جاهز للتأجير."
],
[
"معدل استخدام الأسطول",
"مقارنة أيام التوافر بأيام التأجير وفق تعريف واحد معتمد."
],
[
"متابعة حالات التأخير",
"عمليات التأجير المتأخرة المفتوحة مع مسؤول وإجراء تالٍ."
]
],
"methodTitle": "المنهجية المطلوبة قبل نشر أي نتيجة",
"method": [
"سجّل خط أساس قبل الإطلاق باستخدام تعريفات المؤشرات نفسها.",
"قارن مواقع وفئات أسطول وفترات تشغيل متكافئة.",
"انشر حجم العينة والاستثناءات وفترة القياس.",
"اربط كل نتيجة منشورة بسجل دليل معتمد."
]
},
"integrations": {
"eyebrow": "التكاملات",
"title": "اربط الأنظمة التي يعتمد عليها تشغيلك حاليًا.",
"body": "يُعتمد نطاق التكامل خلال مرحلة الاستكشاف ليتوافق مع سوقك وبنيتك الحالية وملكية البيانات. لا تُعرض أسماء شركاء قبل التحقق من توافر الموصل.",
"items": [
"المحاسبة والمالية",
"المدفوعات ومبالغ الضمان",
"الاتصال بالمركبات وبياناتها",
"خدمات الهوية والمستندات",
"البريد الإلكتروني والرسائل والإشعارات",
"الموقع الإلكتروني وقنوات الحجز"
]
},
"security": {
"eyebrow": "الأمن والموثوقية",
"title": "قيّم المنصة بالأدلة، لا بالشعارات.",
"body": "لا تُنشر شهادات أو وعود بمستوى الخدمة قبل وجود وثائق معتمدة. أثناء التقييم، اطلب إجابات محددة حول الضوابط المهمة لنشاطك.",
"checks": [
[
"التحكم في الوصول",
"الأدوار والصلاحيات وإجراءات المسؤول وإنهاء وصول المستخدم."
],
[
"قابلية التدقيق",
"التغييرات المسجلة والقابلة للبحث والتصدير."
],
[
"معالجة البيانات",
"الملكية والاحتفاظ والتصدير والحذف والجهات الفرعية."
],
[
"استمرارية العمل",
"النسخ الاحتياطي والاستعادة والتواصل عند الحوادث والدعم."
]
]
},
"pricing": {
"eyebrow": "معاينة التسعير",
"title": "يجب أن يعكس التسعير طبيعة التشغيل الفعلية.",
"body": "لا يُعرض سعر عام قبل اعتماد النموذج التجاري والحدود المشمولة. يبدأ التقييم بالعوامل التي تؤثر فعلًا في النطاق.",
"factors": [
"حجم الأسطول وعدد المواقع النشطة",
"الوحدات المطلوبة وأدوار المستخدمين",
"نطاق ترحيل البيانات والتهيئة",
"متطلبات التكامل والدعم"
],
"primary": "اطلب عرض سعر",
"note": "لا تنشر هذه النسخة أسعار بطاقات أو خصومات أو حدود باقات."
},
"faq": {
"eyebrow": "الأسئلة الشائعة",
"title": "أسئلة ينبغي للمشتري طرحها قبل حجز العرض التوضيحي.",
"items": [
[
"هل homePageCar مخصص فقط لشركات التأجير الكبيرة؟",
"لا يزال السوق المستهدف وهيكل الباقات قيد الاعتماد. يجب أن يحدد العرض حجم الأسطول والمواقع وسير العمل والوحدات المطلوبة بدل افتراض أن إعدادًا واحدًا يناسب الجميع."
],
[
"هل يمكننا الاحتفاظ بأنظمتنا الحالية؟",
"تُراجع التكاملات المحتملة خلال الاستكشاف. يجب تأكيد توافر الموصل وملكية البيانات وجهد الترحيل والمزامنة المستمرة قبل تقديم أي وعد."
],
[
"هل تدعم المنصة لغات متعددة؟",
"يدعم الموقع ونظام التصميم المعتمد الإنجليزية والفرنسية والعربية. تستخدم العربية اتجاهًا حقيقيًا للمستند من اليمين إلى اليسار، لا مجرد محاذاة شكلية."
],
[
"كيف يُحسب السعر؟",
"النموذج التجاري قيد الاعتماد. حتى ذلك الحين، يجب أن يوضح كل عرض النطاق والوحدات والحدود والتهيئة والتكاملات والدعم."
],
[
"ما الشهادات الأمنية المتوفرة؟",
"لا تدّعي هذه النسخة وجود أي شهادة. يجب تقديم الأدلة الأمنية عبر وثائق معتمدة أثناء التقييم وعدم نشرها إلا بعد التحقق."
],
[
"ماذا يحدث أثناء العرض التوضيحي؟",
"ينبغي أن ترسم الجلسة سير عملك من الحجز حتى الإرجاع، وتعرض المسار المناسب في المنتج، وتحدد احتياجات التكامل، وتوثق أسئلة الملاءمة غير المحسومة."
]
]
},
"final": {
"eyebrow": "شاهد سير العمل كاملًا",
"title": "أحضر عملية تأجير حقيقية إلى العرض التوضيحي.",
"body": "سنتتبع عمليات التسليم والاستثناءات والمعلومات التي يحتاجها فريقك من الحجز حتى إعادة المركبة.",
"primary": "احجز عرضًا توضيحيًا للمنتج",
"secondary": "تواصل مع المبيعات"
},
"footer": {
"tagline": "تشغيل مترابط لتأجير السيارات من الحجز حتى الإرجاع.",
"groups": [
[
"المنتج",
[
[
"سير العمل",
"#workflow"
],
[
"الوحدات",
"#modules"
],
[
"التسعير",
"#pricing"
]
]
],
[
"الشركة",
[
[
"تواصل مع المبيعات",
"#contact"
],
[
"احجز عرضًا توضيحيًا",
"#demo"
]
]
],
[
"الحساب",
[
[
"تسجيل الدخول",
"#login"
],
[
"اللغة",
"#language"
],
[
"المظهر",
"#theme"
]
]
],
[
"قانوني",
[
[
"الخصوصية",
"#!"
],
[
"الشروط",
"#!"
],
[
"إمكانية الوصول",
"#!"
]
]
]
],
"copyright": "© 2026 homePageCar. تظل الأدلة والادعاءات التجارية خاضعة للاعتماد."
},
"form": {
"title": "احجز عرضًا توضيحيًا للمنتج",
"body": "أخبرنا كيف يعمل نشاط تأجير السيارات لديك. الحقول المطلوبة مميزة.",
"name": "الاسم الكامل",
"email": "البريد الإلكتروني للعمل",
"company": "الشركة",
"fleet": "الحجم التقريبي للأسطول",
"market": "الدولة أو سوق التشغيل",
"language": "لغة العرض المفضلة",
"message": "ما الموضوع الذي ينبغي أن يركز عليه العرض؟",
"submit": "إرسال طلب العرض",
"privacy": "بإرسال النموذج، فإنك توافق على التواصل معك بخصوص هذا الطلب. يحتاج نص إشعار الخصوصية إلى اعتماد قانوني.",
"close": "إغلاق",
"required": "مطلوب",
"emailError": "أدخل عنوان بريد إلكتروني صالحًا للعمل.",
"requiredError": "هذا الحقل مطلوب.",
"fleetOptions": [
"اختر خيارًا",
"من 1 إلى 25 مركبة",
"من 26 إلى 100 مركبة",
"من 101 إلى 500 مركبة",
"أكثر من 500 مركبة",
"غير متأكد بعد"
],
"langOptions": [
"English",
"Français",
"العربية"
],
"successTitle": "تم تسجيل طلب العرض",
"successBody": "اكتمل مسار الحجز في هذا النموذج الأولي. لم يُرسل أي طلب إلى نظام مبيعات فعلي.",
"submitAnother": "إرسال طلب آخر",
"submissionError": "تعذر على النموذج الأولي إكمال الطلب. ما زالت بياناتك متاحة. حاول مرة أخرى.",
"errorSummary": "راجع الحقول المميزة ثم حاول مرة أخرى."
},
"preview": {
"today": "اليوم",
"branch": "الفرع المركزي",
"title": "نظرة عامة على التشغيل",
"reservations": "الحجوزات",
"ready": "مركبات جاهزة",
"attention": "تحتاج متابعة",
"active": "عمليات تأجير نشطة",
"r1": "تسليم الساعة 10:30",
"r2": "إرجاع مستحق الساعة 14:00",
"r3": "الفحص مطلوب",
"vehicle": "المركبة",
"customer": "العميل",
"status": "الحالة",
"task": "الإجراء التالي",
"plate1": "ABC-2048",
"plate2": "RNT-7712",
"statusReady": "جاهزة",
"statusDue": "مستحقة اليوم",
"taskAssign": "تأكيد مستندات السائق",
"taskInspect": "إكمال فحص الإرجاع"
},
"tour": {
"title": "جولة في المنتج",
"intro": "تابع عملية تأجير واحدة من الحجز حتى الإرجاع.",
"back": "السابق",
"next": "التالي",
"finish": "إنهاء الجولة",
"close": "إغلاق جولة المنتج",
"step": "الخطوة",
"of": "من"
},
"research": {
"title": "وضع البحث",
"events": "أحداث",
"export": "تصدير الأحداث",
"clear": "مسح",
"close": "إغلاق"
}
}
@@ -0,0 +1,430 @@
{
"meta": {
"langName": "English",
"dir": "ltr",
"title": "homePageCar | Connected rental-car operations",
"description": "Run reservations, vehicles, agreements, handovers, and returns in one connected rental operations platform."
},
"header": {
"nav": [
[
"product",
"Product"
],
[
"workflow",
"Workflow"
],
[
"modules",
"Modules"
],
[
"pricing",
"Pricing"
],
[
"faq",
"FAQ"
]
],
"login": "Log in",
"demo": "Book a demo",
"menu": "Open menu",
"language": "Language",
"theme": "Theme",
"light": "Light",
"dark": "Dark",
"system": "System"
},
"hero": {
"eyebrow": "Rental operations, connected",
"title": "Run every rental from reservation to return in one system.",
"body": "Give reservations, fleet, agreements, handovers, and returns one operational record, so each team sees what needs attention next.",
"primary": "Book a product demo",
"secondary": "Watch product tour",
"caption": "Illustrative product interface. Final screens must use approved product data and captures."
},
"trust": {
"eyebrow": "Operational coverage",
"title": "One workflow across the rental lifecycle.",
"body": "Keep the customer, vehicle, agreement, and task context connected as the rental moves forward.",
"items": [
[
"Reservation",
"Capture the request and required details."
],
[
"Vehicle",
"Track availability and readiness."
],
[
"Agreement",
"Keep pickup tasks and records together."
],
[
"Return",
"Record condition and close follow-up work."
]
]
},
"comparison": {
"eyebrow": "Why change",
"title": "Replace fragmented handoffs with a shared operating flow.",
"body": "The cost of disconnected tools is rarely one dramatic failure. It is the daily accumulation of duplicate entry, missing context, and delayed follow-up.",
"beforeTitle": "Fragmented operation",
"beforeItems": [
"Reservation details copied between tools",
"Vehicle status confirmed through messages",
"Agreement tasks tracked from memory",
"Return issues discovered after the customer leaves"
],
"afterTitle": "Connected operation",
"afterItems": [
"One reservation status visible to the team",
"Vehicle readiness attached to the rental",
"Pickup requirements shown before handover",
"Return follow-up created while context is fresh"
]
},
"workflow": {
"eyebrow": "End-to-end workflow",
"title": "Move the rental forward without losing the thread.",
"body": "Each step exposes the decision, owner, and next action instead of burying operations inside a generic feature list.",
"steps": [
[
"01",
"Capture the reservation",
"Record dates, driver details, requirements, and source."
],
[
"02",
"Assign a ready vehicle",
"Match availability with class, location, and readiness."
],
[
"03",
"Complete pickup",
"Confirm documents, inspection, agreement, and handover tasks."
],
[
"04",
"Process the return",
"Record condition, close open work, and release the vehicle."
]
]
},
"roles": {
"eyebrow": "Built for the operating team",
"title": "Give each role the context it needs, without creating separate versions of the truth.",
"roles": [
[
"Owner or manager",
"See workload, exceptions, and operating signals across the business."
],
[
"Reservations team",
"Move requests from inquiry to confirmed rental with fewer handoffs."
],
[
"Fleet and operations",
"Know which vehicles are available, blocked, due, or awaiting action."
],
[
"Front desk",
"Prepare pickup and return tasks before the customer is waiting."
]
]
},
"modules": {
"eyebrow": "Product modules",
"title": "A connected core, organized around real rental work.",
"body": "Module boundaries clarify responsibility while shared records prevent the usual copy-and-paste archaeology.",
"items": [
[
"Reservations",
"Availability, dates, customer requirements, and status in one flow."
],
[
"Fleet readiness",
"Vehicle availability, blocks, service state, and location context."
],
[
"Rental agreements",
"Pickup requirements, agreement status, and operational records."
],
[
"Vehicle inspections",
"Structured pickup and return condition checks with follow-up tasks."
],
[
"Customer records",
"Rental history and contact context attached to active work."
],
[
"Operations reporting",
"Definitions and operational views that can be validated against source activity."
]
]
},
"results": {
"eyebrow": "Measured results",
"title": "Measure the change, not the marketing.",
"body": "No outcome claim should appear until a real customer baseline, comparison period, and data definition are approved. The production page therefore shows the measurement plan instead of fictional percentages.",
"metrics": [
[
"Reservation handling time",
"From usable request to confirmed reservation."
],
[
"Vehicle turnaround time",
"From return recorded to ready-for-rental status."
],
[
"Fleet utilization",
"Available rental days compared with rented days, using one approved definition."
],
[
"Overdue follow-up",
"Open overdue rentals with an assigned owner and next action."
]
],
"methodTitle": "Methodology required before publishing results",
"method": [
"Capture a pre-launch baseline using the same KPI definitions.",
"Compare equivalent locations, fleet classes, and operating periods.",
"Report sample size, exclusions, and measurement window.",
"Link every public result to an approved evidence record."
]
},
"integrations": {
"eyebrow": "Integrations",
"title": "Connect the systems your operation already depends on.",
"body": "Integration scope is confirmed during discovery so the proposal reflects your market, current stack, and data ownership. Named partners are not shown until connector availability is verified.",
"items": [
"Accounting and finance",
"Payments and deposits",
"Telematics and vehicle data",
"Identity and document services",
"Email, SMS, and notifications",
"Website and booking channels"
]
},
"security": {
"eyebrow": "Security and reliability",
"title": "Evaluate the platform with evidence, not badges.",
"body": "Certifications and service-level claims remain unpublished until approved documentation exists. During evaluation, request concrete answers for the controls that matter to your operation.",
"checks": [
[
"Access control",
"Roles, permissions, administrator actions, and offboarding."
],
[
"Auditability",
"Which changes are recorded, searchable, and exportable."
],
[
"Data handling",
"Ownership, retention, export, deletion, and subprocessors."
],
[
"Continuity",
"Backup, recovery, incident communication, and support process."
]
]
},
"pricing": {
"eyebrow": "Pricing preview",
"title": "Pricing should match the operation you actually run.",
"body": "A public price is not shown until the commercial model and included limits are approved. The evaluation starts with the factors that materially affect scope.",
"factors": [
"Fleet size and active locations",
"Required modules and user roles",
"Migration and onboarding scope",
"Integration and support requirements"
],
"primary": "Request pricing",
"note": "No card prices, discounts, or package limits are published in this baseline."
},
"faq": {
"eyebrow": "FAQ",
"title": "Questions buyers should ask before booking a demo.",
"items": [
[
"Is homePageCar only for large rental companies?",
"The final market and packaging are still being defined. The demo should qualify fleet size, locations, workflows, and required modules rather than pretend one setup fits everyone."
],
[
"Can we keep our existing systems?",
"Potential integrations are reviewed during discovery. Connector availability, data ownership, migration effort, and ongoing synchronization must be confirmed before they are promised."
],
[
"Does the platform support multiple languages?",
"The website and approved design system support English, French, and Arabic. Arabic uses true document-level right-to-left behavior rather than a mirrored-looking patch."
],
[
"How is pricing calculated?",
"The commercial model is pending approval. Until then, proposals should state the scope, included modules, limits, onboarding, integrations, and support explicitly."
],
[
"What security certifications do you have?",
"No certification is claimed in this baseline. Security evidence should be supplied through approved documentation during evaluation and published only after verification."
],
[
"What happens during the demo?",
"The session should map your current reservation-to-return flow, show the relevant product path, identify integration needs, and document unresolved fit questions."
]
]
},
"final": {
"eyebrow": "See the full workflow",
"title": "Bring one real rental process to the demo.",
"body": "We will trace the handoffs, exceptions, and information your team needs from reservation through vehicle return.",
"primary": "Book a product demo",
"secondary": "Contact sales"
},
"footer": {
"tagline": "Connected rental-car operations from reservation to return.",
"groups": [
[
"Product",
[
[
"Workflow",
"#workflow"
],
[
"Modules",
"#modules"
],
[
"Pricing",
"#pricing"
]
]
],
[
"Company",
[
[
"Contact sales",
"#contact"
],
[
"Book a demo",
"#demo"
]
]
],
[
"Account",
[
[
"Log in",
"#login"
],
[
"Language",
"#language"
],
[
"Theme",
"#theme"
]
]
],
[
"Legal",
[
[
"Privacy",
"#!"
],
[
"Terms",
"#!"
],
[
"Accessibility",
"#!"
]
]
]
],
"copyright": "© 2026 homePageCar. Evidence and commercial claims remain subject to approval."
},
"form": {
"title": "Book a product demo",
"body": "Tell us how your rental operation works. Required fields are marked.",
"name": "Full name",
"email": "Work email",
"company": "Company",
"fleet": "Approximate fleet size",
"market": "Country or operating market",
"language": "Preferred demo language",
"message": "What should the demo focus on?",
"submit": "Request my demo",
"privacy": "By submitting, you agree to be contacted about this request. Privacy notice text requires legal approval.",
"close": "Close",
"required": "Required",
"emailError": "Enter a valid work email address.",
"requiredError": "This field is required.",
"fleetOptions": [
"Select an option",
"125 vehicles",
"26100 vehicles",
"101500 vehicles",
"More than 500 vehicles",
"Not sure yet"
],
"langOptions": [
"English",
"Français",
"العربية"
],
"successTitle": "Demo request recorded",
"successBody": "This prototype has completed the booking flow. No request was sent to a real sales system.",
"submitAnother": "Submit another request",
"submissionError": "The prototype could not complete the request. Your entries are still available. Try again.",
"errorSummary": "Review the highlighted fields and try again."
},
"preview": {
"today": "Today",
"branch": "Central branch",
"title": "Operations overview",
"reservations": "Reservations",
"ready": "Vehicles ready",
"attention": "Needs attention",
"active": "Active rentals",
"r1": "Pickup at 10:30",
"r2": "Return due at 14:00",
"r3": "Inspection required",
"vehicle": "Vehicle",
"customer": "Customer",
"status": "Status",
"task": "Next action",
"plate1": "ABC-2048",
"plate2": "RNT-7712",
"statusReady": "Ready",
"statusDue": "Due today",
"taskAssign": "Confirm driver documents",
"taskInspect": "Complete return inspection"
},
"tour": {
"title": "Product tour",
"intro": "Follow one rental from reservation through return.",
"back": "Previous",
"next": "Next",
"finish": "Finish tour",
"close": "Close product tour",
"step": "Step",
"of": "of"
},
"research": {
"title": "Research mode",
"events": "events",
"export": "Export events",
"clear": "Clear",
"close": "Close"
}
}
@@ -0,0 +1,430 @@
{
"meta": {
"langName": "Français",
"dir": "ltr",
"title": "homePageCar | Opérations de location connectées",
"description": "Pilotez les réservations, véhicules, contrats, remises et retours dans une plateforme connectée."
},
"header": {
"nav": [
[
"product",
"Produit"
],
[
"workflow",
"Parcours"
],
[
"modules",
"Modules"
],
[
"pricing",
"Tarifs"
],
[
"faq",
"FAQ"
]
],
"login": "Se connecter",
"demo": "Réserver une démo",
"menu": "Ouvrir le menu",
"language": "Langue",
"theme": "Thème",
"light": "Clair",
"dark": "Sombre",
"system": "Système"
},
"hero": {
"eyebrow": "Opérations de location connectées",
"title": "Pilotez chaque location, de la réservation au retour du véhicule, dans un seul système.",
"body": "Reliez les réservations, le parc, les contrats, les remises et les retours dans un même dossier opérationnel, afin que chaque équipe sache quelle action vient ensuite.",
"primary": "Réserver une démonstration",
"secondary": "Voir la visite du produit",
"caption": "Interface produit illustrative. Les écrans définitifs doivent utiliser des données et captures approuvées."
},
"trust": {
"eyebrow": "Couverture opérationnelle",
"title": "Un même parcours pour tout le cycle de location.",
"body": "Conservez le contexte du client, du véhicule, du contrat et des tâches au fil de la location.",
"items": [
[
"Réservation",
"Saisir la demande et les informations nécessaires."
],
[
"Véhicule",
"Suivre la disponibilité et l’état de préparation."
],
[
"Contrat",
"Regrouper les tâches de départ et les documents."
],
[
"Retour",
"Enregistrer l’état et clôturer les actions de suivi."
]
]
},
"comparison": {
"eyebrow": "Pourquoi changer",
"title": "Remplacez les transmissions fragmentées par un flux opérationnel partagé.",
"body": "Le coût des outils déconnectés nest pas toujours une panne spectaculaire. Il saccumule dans les doubles saisies, le contexte perdu et les suivis tardifs.",
"beforeTitle": "Fonctionnement fragmenté",
"beforeItems": [
"Informations de réservation recopiées entre plusieurs outils",
"État du véhicule confirmé par messages",
"Tâches contractuelles suivies de mémoire",
"Problèmes de retour découverts après le départ du client"
],
"afterTitle": "Fonctionnement connecté",
"afterItems": [
"Un statut de réservation visible par l’équipe",
"Préparation du véhicule rattachée à la location",
"Exigences de départ affichées avant la remise",
"Suivi du retour créé pendant que le contexte est encore précis"
]
},
"workflow": {
"eyebrow": "Parcours de bout en bout",
"title": "Faites avancer la location sans perdre le fil.",
"body": "Chaque étape met en évidence la décision, le responsable et laction suivante, au lieu denfouir le travail dans une liste générique de fonctionnalités.",
"steps": [
[
"01",
"Saisir la réservation",
"Enregistrer les dates, le conducteur, les exigences et la source."
],
[
"02",
"Affecter un véhicule prêt",
"Faire correspondre disponibilité, catégorie, agence et état de préparation."
],
[
"03",
"Finaliser le départ",
"Confirmer documents, inspection, contrat et tâches de remise."
],
[
"04",
"Traiter le retour",
"Enregistrer l’état, clôturer les actions et libérer le véhicule."
]
]
},
"roles": {
"eyebrow": "Conçu pour l’équipe opérationnelle",
"title": "Donnez à chaque rôle le contexte utile, sans multiplier les versions de la vérité.",
"roles": [
[
"Direction ou responsable",
"Voir la charge, les exceptions et les signaux dexploitation."
],
[
"Équipe réservations",
"Faire passer les demandes vers une location confirmée avec moins de transmissions."
],
[
"Parc et opérations",
"Savoir quels véhicules sont disponibles, bloqués, attendus ou en attente daction."
],
[
"Comptoir",
"Préparer les tâches de départ et de retour avant que le client nattende."
]
]
},
"modules": {
"eyebrow": "Modules produit",
"title": "Un socle connecté, organisé autour du travail réel de location.",
"body": "Les modules clarifient les responsabilités, tandis que les dossiers partagés évitent larchéologie du copier-coller.",
"items": [
[
"Réservations",
"Disponibilités, dates, besoins du client et statut dans un même flux."
],
[
"Préparation du parc",
"Disponibilité, blocages, état de service et contexte dagence."
],
[
"Contrats de location",
"Exigences de départ, état du contrat et dossiers opérationnels."
],
[
"Inspections des véhicules",
"Contrôles structurés au départ et au retour avec actions de suivi."
],
[
"Dossiers clients",
"Historique de location et coordonnées rattachés au travail en cours."
],
[
"Rapports opérationnels",
"Définitions et vues vérifiables par rapport à lactivité source."
]
]
},
"results": {
"eyebrow": "Résultats mesurés",
"title": "Mesurez le changement, pas le discours commercial.",
"body": "Aucun résultat ne doit être publié sans référence client, période de comparaison et définition de données approuvées. Cette version présente donc la méthode plutôt que des pourcentages fictifs.",
"metrics": [
[
"Temps de traitement des réservations",
"De la demande exploitable à la réservation confirmée."
],
[
"Temps de remise en service",
"Du retour enregistré au statut prêt à louer."
],
[
"Taux dutilisation du parc",
"Jours louables comparés aux jours loués, selon une définition approuvée."
],
[
"Suivi des retards",
"Locations en retard avec responsable et prochaine action."
]
],
"methodTitle": "Méthode requise avant toute publication",
"method": [
"Établir une référence avant lancement avec les mêmes définitions de KPI.",
"Comparer des agences, catégories de parc et périodes équivalentes.",
"Publier la taille de l’échantillon, les exclusions et la fenêtre de mesure.",
"Relier chaque résultat public à une preuve approuvée."
]
},
"integrations": {
"eyebrow": "Intégrations",
"title": "Reliez les systèmes dont votre exploitation dépend déjà.",
"body": "Le périmètre dintégration est confirmé pendant la découverte afin de refléter votre marché, votre environnement actuel et la propriété des données. Aucun partenaire nest nommé avant vérification du connecteur.",
"items": [
"Comptabilité et finance",
"Paiements et dépôts",
"Télématique et données véhicules",
"Identité et documents",
"E-mail, SMS et notifications",
"Site web et canaux de réservation"
]
},
"security": {
"eyebrow": "Sécurité et fiabilité",
"title": "Évaluez la plateforme avec des preuves, pas avec des badges.",
"body": "Aucune certification ni promesse de niveau de service nest publiée sans documentation approuvée. Pendant l’évaluation, demandez des réponses concrètes sur les contrôles utiles à votre activité.",
"checks": [
[
"Contrôle des accès",
"Rôles, autorisations, actions administrateur et départs."
],
[
"Traçabilité",
"Modifications enregistrées, recherchables et exportables."
],
[
"Gestion des données",
"Propriété, conservation, export, suppression et sous-traitants."
],
[
"Continuité",
"Sauvegarde, reprise, communication dincident et support."
]
]
},
"pricing": {
"eyebrow": "Aperçu des tarifs",
"title": "Le tarif doit correspondre à lexploitation que vous gérez réellement.",
"body": "Aucun prix public nest affiché tant que le modèle commercial et les limites incluses ne sont pas approuvés. L’évaluation commence par les facteurs qui influencent réellement le périmètre.",
"factors": [
"Taille du parc et agences actives",
"Modules requis et rôles utilisateurs",
"Migration et accompagnement au démarrage",
"Intégrations et niveau de support"
],
"primary": "Demander un tarif",
"note": "Aucun prix, remise ou plafond de forfait nest publié dans cette version."
},
"faq": {
"eyebrow": "FAQ",
"title": "Les questions à poser avant de réserver une démonstration.",
"items": [
[
"homePageCar est-il réservé aux grands loueurs ?",
"Le marché cible et les offres finales restent à définir. La démonstration doit qualifier la taille du parc, les agences, les flux et les modules nécessaires au lieu de prétendre quune configuration convient à tous."
],
[
"Pouvons-nous conserver nos systèmes actuels ?",
"Les intégrations possibles sont examinées pendant la découverte. La disponibilité du connecteur, la propriété des données, leffort de migration et la synchronisation doivent être confirmés avant toute promesse."
],
[
"La plateforme prend-elle en charge plusieurs langues ?",
"Le site et le système de design approuvé prennent en charge langlais, le français et larabe. Larabe utilise une vraie direction de document de droite à gauche."
],
[
"Comment les tarifs sont-ils calculés ?",
"Le modèle commercial est en attente dapprobation. En attendant, toute proposition doit préciser le périmètre, les modules, les limites, laccompagnement, les intégrations et le support."
],
[
"Quelles certifications de sécurité possédez-vous ?",
"Aucune certification nest revendiquée dans cette version. Les preuves de sécurité doivent être fournies pendant l’évaluation puis publiées uniquement après vérification."
],
[
"Que se passe-t-il pendant la démonstration ?",
"La session doit cartographier votre flux de la réservation au retour, montrer le parcours produit pertinent, identifier les intégrations et consigner les questions de compatibilité non résolues."
]
]
},
"final": {
"eyebrow": "Voir le parcours complet",
"title": "Apportez un processus de location réel à la démonstration.",
"body": "Nous suivrons les transmissions, les exceptions et les informations dont votre équipe a besoin de la réservation au retour du véhicule.",
"primary": "Réserver une démonstration",
"secondary": "Contacter le service commercial"
},
"footer": {
"tagline": "Des opérations de location connectées, de la réservation au retour.",
"groups": [
[
"Produit",
[
[
"Parcours",
"#workflow"
],
[
"Modules",
"#modules"
],
[
"Tarifs",
"#pricing"
]
]
],
[
"Entreprise",
[
[
"Contacter le service commercial",
"#contact"
],
[
"Réserver une démo",
"#demo"
]
]
],
[
"Compte",
[
[
"Se connecter",
"#login"
],
[
"Langue",
"#language"
],
[
"Thème",
"#theme"
]
]
],
[
"Mentions légales",
[
[
"Confidentialité",
"#!"
],
[
"Conditions",
"#!"
],
[
"Accessibilité",
"#!"
]
]
]
],
"copyright": "© 2026 homePageCar. Les preuves et conditions commerciales restent soumises à approbation."
},
"form": {
"title": "Réserver une démonstration du produit",
"body": "Décrivez-nous le fonctionnement de votre activité de location. Les champs obligatoires sont signalés.",
"name": "Nom complet",
"email": "Adresse e-mail professionnelle",
"company": "Entreprise",
"fleet": "Taille approximative du parc",
"market": "Pays ou marché dexploitation",
"language": "Langue souhaitée pour la démonstration",
"message": "Sur quoi la démonstration doit-elle se concentrer ?",
"submit": "Demander ma démonstration",
"privacy": "En envoyant ce formulaire, vous acceptez d’être contacté au sujet de cette demande. Le texte de confidentialité nécessite une validation juridique.",
"close": "Fermer",
"required": "Obligatoire",
"emailError": "Saisissez une adresse e-mail professionnelle valide.",
"requiredError": "Ce champ est obligatoire.",
"fleetOptions": [
"Sélectionnez une option",
"1 à 25 véhicules",
"26 à 100 véhicules",
"101 à 500 véhicules",
"Plus de 500 véhicules",
"Je ne sais pas encore"
],
"langOptions": [
"English",
"Français",
"العربية"
],
"successTitle": "Demande de démonstration enregistrée",
"successBody": "Ce prototype a terminé le parcours de réservation. Aucune demande na été envoyée à un véritable système commercial.",
"submitAnother": "Envoyer une autre demande",
"submissionError": "Le prototype na pas pu terminer la demande. Vos informations sont conservées. Réessayez.",
"errorSummary": "Vérifiez les champs signalés, puis réessayez."
},
"preview": {
"today": "Aujourdhui",
"branch": "Agence centrale",
"title": "Vue des opérations",
"reservations": "Réservations",
"ready": "Véhicules prêts",
"attention": "À traiter",
"active": "Locations actives",
"r1": "Départ à 10 h 30",
"r2": "Retour prévu à 14 h 00",
"r3": "Inspection requise",
"vehicle": "Véhicule",
"customer": "Client",
"status": "Statut",
"task": "Prochaine action",
"plate1": "ABC-2048",
"plate2": "RNT-7712",
"statusReady": "Prêt",
"statusDue": "Prévu aujourdhui",
"taskAssign": "Confirmer les documents du conducteur",
"taskInspect": "Finaliser linspection de retour"
},
"tour": {
"title": "Visite du produit",
"intro": "Suivez une location de la réservation au retour.",
"back": "Précédent",
"next": "Suivant",
"finish": "Terminer la visite",
"close": "Fermer la visite du produit",
"step": "Étape",
"of": "sur"
},
"research": {
"title": "Mode recherche",
"events": "événements",
"export": "Exporter les événements",
"clear": "Effacer",
"close": "Fermer"
}
}
@@ -0,0 +1,17 @@
ID,Area,Check,Method,Criterion,Status
A11Y-001,Page,One h1 and logical heading order,Automated + manual,WCAG 1.3.1,Required
A11Y-002,Keyboard,All interactive controls reachable and operable,Manual,WCAG 2.1.1,Required
A11Y-003,Focus,Visible focus and logical order,Manual,"WCAG 2.4.7, 2.4.11",Required
A11Y-004,Skip link,Moves focus/viewport to main content,Manual,WCAG 2.4.1,Required
A11Y-005,Drawer/dialog,"Containment, inert background, Escape, return focus",Manual + browser,"WCAG 2.4.3, 3.2.1",Required
A11Y-006,Forms,"Visible labels, programmatic names, instructions",Automated + SR,"WCAG 1.3.1, 3.3.2",Required
A11Y-007,Errors,"Summary, inline association, first invalid focus",SR + manual,"WCAG 3.3.1, 3.3.3",Required
A11Y-008,Status,Success/failure announced without focus theft,SR,WCAG 4.1.3,Required
A11Y-009,Contrast,"Text, UI, focus in both themes",Automated + manual,"WCAG 1.4.3, 1.4.11",Required
A11Y-010,Reflow,320px and 400% zoom,Manual,WCAG 1.4.10,Required
A11Y-011,Text spacing,User overrides do not clip,Bookmarklet/manual,WCAG 1.4.12,Required
A11Y-012,Motion,Reduced-motion honored,Manual,WCAG 2.3.3,Required
A11Y-013,Language,Page and language changes identified,DOM + SR,"WCAG 3.1.1, 3.1.2",Required
A11Y-014,Bidi,Mixed-direction values remain intelligible,Visual + SR,WCAG 1.3.2,Required
A11Y-015,Targets,Target spacing and size tested,Automated + manual,WCAG 2.5.8,Required
A11Y-016,Autofill,Correct autocomplete tokens,DOM + browser,WCAG 1.3.5,Required
1 ID Area Check Method Criterion Status
2 A11Y-001 Page One h1 and logical heading order Automated + manual WCAG 1.3.1 Required
3 A11Y-002 Keyboard All interactive controls reachable and operable Manual WCAG 2.1.1 Required
4 A11Y-003 Focus Visible focus and logical order Manual WCAG 2.4.7, 2.4.11 Required
5 A11Y-004 Skip link Moves focus/viewport to main content Manual WCAG 2.4.1 Required
6 A11Y-005 Drawer/dialog Containment, inert background, Escape, return focus Manual + browser WCAG 2.4.3, 3.2.1 Required
7 A11Y-006 Forms Visible labels, programmatic names, instructions Automated + SR WCAG 1.3.1, 3.3.2 Required
8 A11Y-007 Errors Summary, inline association, first invalid focus SR + manual WCAG 3.3.1, 3.3.3 Required
9 A11Y-008 Status Success/failure announced without focus theft SR WCAG 4.1.3 Required
10 A11Y-009 Contrast Text, UI, focus in both themes Automated + manual WCAG 1.4.3, 1.4.11 Required
11 A11Y-010 Reflow 320px and 400% zoom Manual WCAG 1.4.10 Required
12 A11Y-011 Text spacing User overrides do not clip Bookmarklet/manual WCAG 1.4.12 Required
13 A11Y-012 Motion Reduced-motion honored Manual WCAG 2.3.3 Required
14 A11Y-013 Language Page and language changes identified DOM + SR WCAG 3.1.1, 3.1.2 Required
15 A11Y-014 Bidi Mixed-direction values remain intelligible Visual + SR WCAG 1.3.2 Required
16 A11Y-015 Targets Target spacing and size tested Automated + manual WCAG 2.5.8 Required
17 A11Y-016 Autofill Correct autocomplete tokens DOM + browser WCAG 1.3.5 Required
@@ -0,0 +1,10 @@
Browser_or_AT,Version_policy,Platform,Coverage
Chrome desktop,Latest stable and previous major,"Windows 11, macOS","All functional, visual, performance smoke"
Edge desktop,Latest stable and previous major,Windows 11,All functional and visual smoke
Firefox desktop,Latest stable and previous major,"Windows 11, macOS","Functional, keyboard, layout, forced-colors where supported"
Safari desktop,Latest stable and previous major,macOS,"Functional, dialog, storage, typography, visual"
Safari iOS,Latest stable and previous major,Representative iPhone compact and large,"Navigation, dialogs, virtual keyboard, form, viewport"
Chrome Android,Latest stable and previous major,Representative Android phone,"Navigation, dialogs, virtual keyboard, form, viewport"
Assistive technology,NVDA + Firefox/Chrome current,Windows,Critical paths
Assistive technology,VoiceOver + Safari current,macOS/iOS,Critical paths
Assistive technology,TalkBack + Chrome current,Android,Critical paths
1 Browser_or_AT Version_policy Platform Coverage
2 Chrome desktop Latest stable and previous major Windows 11, macOS All functional, visual, performance smoke
3 Edge desktop Latest stable and previous major Windows 11 All functional and visual smoke
4 Firefox desktop Latest stable and previous major Windows 11, macOS Functional, keyboard, layout, forced-colors where supported
5 Safari desktop Latest stable and previous major macOS Functional, dialog, storage, typography, visual
6 Safari iOS Latest stable and previous major Representative iPhone compact and large Navigation, dialogs, virtual keyboard, form, viewport
7 Chrome Android Latest stable and previous major Representative Android phone Navigation, dialogs, virtual keyboard, form, viewport
8 Assistive technology NVDA + Firefox/Chrome current Windows Critical paths
9 Assistive technology VoiceOver + Safari current macOS/iOS Critical paths
10 Assistive technology TalkBack + Chrome current Android Critical paths
@@ -0,0 +1,28 @@
{
"version": "1.0",
"measurement": "75th percentile real-user data where available; otherwise repeatable lab median on defined mobile profile",
"core": {
"LCP_ms_max": 2500,
"INP_ms_max": 200,
"CLS_max": 0.1,
"TTFB_ms_max": 800
},
"transfer_gzip": {
"initial_javascript_kb_max": 180,
"initial_css_kb_max": 60,
"initial_html_kb_max": 100,
"hero_media_kb_max": 250,
"font_total_kb_max": 220
},
"requests": {
"initial_third_party_max": 2,
"initial_font_files_max": 2
},
"rules": [
"No marketing tag may block first paint.",
"Load analytics after consent and idle where possible.",
"Reserve media dimensions to prevent layout shift.",
"No autoplay video on initial load.",
"Test EN, FR, and AR because font and copy costs differ."
]
}
@@ -0,0 +1,7 @@
# Browser Acceptance Specification
Automated browser tests must cover the scenarios in `visual-regression-scenarios_v1.0.json` plus behavioral assertions from `QA_MATRIX_v1.0.csv`.
Use semantic locators first: role, accessible name, label, heading, and visible text. Add `data-testid` only where locale-independent state cannot be selected reliably. Never use generated class names as test contracts.
At minimum, assert server HTML attributes, locale switching with preserved hash, root-only detection, theme no-flash state before app hydration, cookie precedence, system live update, drawer focus loop and inert state, dialog focus return, invalid form focus, recoverable failure value retention, idempotent submit, tour progress, reduced motion, and prohibited PII absence from analytics calls.
+27
View File
@@ -0,0 +1,27 @@
ID,Area,Scenario,Variants,Method,Expected,Gate
QA-001,Routing,Each locale route renders server-correct lang/dir/canonical/hreflang,en/fr/ar,Automated HTML assertion,No hydration correction required,Release
QA-002,Localization,Key parity and scalar/array type parity,en/fr/ar,CI validator,"Zero missing, empty, or extra production keys",Release
QA-003,Localization,Translation overflow,320/390/768/1024/1440; all locales,Visual + manual,"No clipping, ellipsis, fixed-height collision, or horizontal page scroll",Release
QA-004,RTL,Full homepage direction,ar light/dark,Visual + DOM,"Logical order, correct start alignment, selective mirroring",Release
QA-005,Mixed direction,"Plate, email, URL, phone, date, currency",ar,Screen reader + visual,Atomic value order remains correct,Release
QA-006,Theme,Preference persistence and cookie/storage disagreement,light/dark/system,Browser automation,Cookie wins; no flash; system stays system,Release
QA-007,Theme,OS theme changes while System selected,system,Browser automation,Resolved theme updates without changing preference,Release
QA-008,Navigation,Desktop header collision and keyboard use,1120/1280/1440; all locales,Visual + keyboard,No overlap; visible focus; logical order,Release
QA-009,Navigation,Drawer open/close containment,390/1024; ltr/rtl,Keyboard + SR,"Focus trapped, background inert, Escape and focus return work",Release
QA-010,Hero,Primary demo and tour actions,all locales/themes,Browser,Correct dialogs open; analytics source accurate,Release
QA-011,Demo form,Empty/invalid submission,all locales,Browser + SR,Summary announced; first invalid focused; inline errors associated,Release
QA-012,Demo form,Recoverable server failure,all locales,Integration,Values preserved; retry possible; persistent error,Release
QA-013,Demo form,Duplicate click/network retry,all locales,Integration,Single lead due to disabled submit and idempotency,Release
QA-014,Demo form,Success,all locales,Integration,Accurate localized confirmation; no PII in analytics,Release
QA-015,Tour,Four-step keyboard flow,all locales,Browser + SR,Progress announced; back/next/finish correct; focus moves,Release
QA-016,FAQ,Toggle by keyboard and screen reader,all locales,Manual + browser,Summary semantics and state announced,Release
QA-017,Accessibility,200% zoom and 400% reflow,320-equivalent; all locales,Manual,No two-dimensional scrolling except data regions,Release
QA-018,Accessibility,Forced colors,Windows,Manual,"Controls, focus, boundaries, status remain perceivable",Release
QA-019,Accessibility,Reduced motion,all,Browser + manual,No smooth scrolling or essential animation,Release
QA-020,Accessibility,Touch target size,compact,Automated + manual,44x44 preferred; WCAG minimum not violated,Release
QA-021,Evidence,Claims and assets,production content,Content audit,Every claim has approval or is suppressed,Release
QA-022,SEO,Metadata and language alternates,indexable routes,Automated,Unique localized metadata; reciprocal alternates; self-canonical,Release
QA-023,Performance,Budgets,mobile + desktop; each locale,Lighthouse/WebPageTest/RUM,All budgets met or approved exception,Release
QA-024,Security,CSP and bootstrap,production,Header inspection,Nonce/hash accepted; no unsafe inline expansion,Release
QA-025,Privacy,Consent and analytics gating,regions in scope,Integration/manual,No non-essential analytics before required consent,Release
QA-026,Visual regression,Named screen states,scenario manifest,Automated screenshots,No unapproved diffs above threshold,Release
1 ID Area Scenario Variants Method Expected Gate
2 QA-001 Routing Each locale route renders server-correct lang/dir/canonical/hreflang en/fr/ar Automated HTML assertion No hydration correction required Release
3 QA-002 Localization Key parity and scalar/array type parity en/fr/ar CI validator Zero missing, empty, or extra production keys Release
4 QA-003 Localization Translation overflow 320/390/768/1024/1440; all locales Visual + manual No clipping, ellipsis, fixed-height collision, or horizontal page scroll Release
5 QA-004 RTL Full homepage direction ar light/dark Visual + DOM Logical order, correct start alignment, selective mirroring Release
6 QA-005 Mixed direction Plate, email, URL, phone, date, currency ar Screen reader + visual Atomic value order remains correct Release
7 QA-006 Theme Preference persistence and cookie/storage disagreement light/dark/system Browser automation Cookie wins; no flash; system stays system Release
8 QA-007 Theme OS theme changes while System selected system Browser automation Resolved theme updates without changing preference Release
9 QA-008 Navigation Desktop header collision and keyboard use 1120/1280/1440; all locales Visual + keyboard No overlap; visible focus; logical order Release
10 QA-009 Navigation Drawer open/close containment 390/1024; ltr/rtl Keyboard + SR Focus trapped, background inert, Escape and focus return work Release
11 QA-010 Hero Primary demo and tour actions all locales/themes Browser Correct dialogs open; analytics source accurate Release
12 QA-011 Demo form Empty/invalid submission all locales Browser + SR Summary announced; first invalid focused; inline errors associated Release
13 QA-012 Demo form Recoverable server failure all locales Integration Values preserved; retry possible; persistent error Release
14 QA-013 Demo form Duplicate click/network retry all locales Integration Single lead due to disabled submit and idempotency Release
15 QA-014 Demo form Success all locales Integration Accurate localized confirmation; no PII in analytics Release
16 QA-015 Tour Four-step keyboard flow all locales Browser + SR Progress announced; back/next/finish correct; focus moves Release
17 QA-016 FAQ Toggle by keyboard and screen reader all locales Manual + browser Summary semantics and state announced Release
18 QA-017 Accessibility 200% zoom and 400% reflow 320-equivalent; all locales Manual No two-dimensional scrolling except data regions Release
19 QA-018 Accessibility Forced colors Windows Manual Controls, focus, boundaries, status remain perceivable Release
20 QA-019 Accessibility Reduced motion all Browser + manual No smooth scrolling or essential animation Release
21 QA-020 Accessibility Touch target size compact Automated + manual 44x44 preferred; WCAG minimum not violated Release
22 QA-021 Evidence Claims and assets production content Content audit Every claim has approval or is suppressed Release
23 QA-022 SEO Metadata and language alternates indexable routes Automated Unique localized metadata; reciprocal alternates; self-canonical Release
24 QA-023 Performance Budgets mobile + desktop; each locale Lighthouse/WebPageTest/RUM All budgets met or approved exception Release
25 QA-024 Security CSP and bootstrap production Header inspection Nonce/hash accepted; no unsafe inline expansion Release
26 QA-025 Privacy Consent and analytics gating regions in scope Integration/manual No non-essential analytics before required consent Release
27 QA-026 Visual regression Named screen states scenario manifest Automated screenshots No unapproved diffs above threshold Release
+14
View File
@@ -0,0 +1,14 @@
Test_ID,Element,Justification
site-header,Header root,Only for visual anchor
mobile-drawer,Drawer root,State assertion
locale-selector,Locale control,State assertion
theme-selector,Theme control,State assertion
hero-demo,Hero demo CTA,Source attribution
hero-tour,Hero tour CTA,Source attribution
demo-dialog,Demo dialog,Overlay state
demo-form,Demo form,Submission state
demo-alert,Form summary,Error assertion
tour-dialog,Tour dialog,Overlay state
tour-step,Current tour step,Progress assertion
pricing-demo,Pricing CTA,Source attribution
final-demo,Final CTA,Source attribution
1 Test_ID Element Justification
2 site-header Header root Only for visual anchor
3 mobile-drawer Drawer root State assertion
4 locale-selector Locale control State assertion
5 theme-selector Theme control State assertion
6 hero-demo Hero demo CTA Source attribution
7 hero-tour Hero tour CTA Source attribution
8 demo-dialog Demo dialog Overlay state
9 demo-form Demo form Submission state
10 demo-alert Form summary Error assertion
11 tour-dialog Tour dialog Overlay state
12 tour-step Current tour step Progress assertion
13 pricing-demo Pricing CTA Source attribution
14 final-demo Final CTA Source attribution
@@ -0,0 +1,24 @@
import fs from 'node:fs';
import path from 'node:path';
import crypto from 'node:crypto';
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..');
const required = [
'09_DEVELOPER_HANDOFF_v1.0.md','DECISION_LOG_v9.0.md','DEFINITION_OF_DONE_v1.0.md','OPEN_ISSUE_REGISTER_v1.0.csv',
'tokens/design-tokens_v1.0.json','tokens/semantic-tokens_v1.0.css','components/COMPONENT_CONTRACTS_v1.0.md',
'localization/ROUTE_MANIFEST_v1.0.json','localization/locales/en/homepage.json','localization/locales/fr/homepage.json','localization/locales/ar/homepage.json',
'interaction/theme-bootstrap_v1.0.js','qa/QA_MATRIX_v1.0.csv','qa/ACCESSIBILITY_CHECKLIST_v1.0.csv','qa/PERFORMANCE_BUDGETS_v1.0.json'
];
const errors=[]; let checks=0;
for (const file of required){ checks++; if(!fs.existsSync(path.join(root,file))) errors.push(`Missing ${file}`); }
const readJson=(f)=>JSON.parse(fs.readFileSync(path.join(root,f),'utf8'));
for (const file of ['tokens/design-tokens_v1.0.json','localization/ROUTE_MANIFEST_v1.0.json','qa/PERFORMANCE_BUDGETS_v1.0.json','qa/visual-regression-scenarios_v1.0.json']) { try{readJson(file);checks++;}catch(e){errors.push(`${file}: ${e.message}`);} }
function shape(value){ if(Array.isArray(value)) return value.map(shape); if(value && typeof value==='object') return Object.fromEntries(Object.keys(value).sort().map(k=>[k,shape(value[k])])); return typeof value; }
const locales=['en','fr','ar'].map(l=>readJson(`localization/locales/${l}/homepage.json`));
const base=JSON.stringify(shape(locales[0]));
for (let i=1;i<locales.length;i++){ checks++; if(JSON.stringify(shape(locales[i]))!==base) errors.push(`Locale shape mismatch: ${['en','fr','ar'][i]}`); }
const routes=readJson('localization/ROUTE_MANIFEST_v1.0.json');
for (const route of routes.routes){ for (const locale of routes.locales){ checks++; if(!(locale in route.slugs)) errors.push(`Route ${route.id} missing ${locale}`); } }
const issueCsv=fs.readFileSync(path.join(root,'OPEN_ISSUE_REGISTER_v1.0.csv'),'utf8'); checks++; if(/,(Critical|High),[^\n]*,,/.test(issueCsv)) errors.push('Critical/High issue missing ownership data');
const css=fs.readFileSync(path.join(root,'tokens/semantic-tokens_v1.0.css'),'utf8'); checks++; if(!css.includes('--color-action-conversion')) errors.push('Conversion semantic token missing');
if(errors.length){ console.error(JSON.stringify({status:'FAILED',checks,errors},null,2)); process.exit(1); }
console.log(JSON.stringify({status:'PASSED',checks,files:fs.readdirSync(root).length},null,2));
@@ -0,0 +1,86 @@
{
"version": "1.0",
"pixelDiffThreshold": 0.01,
"scenarios": [
{
"id": "VR-001",
"route": "/en",
"viewport": [
1440,
1000
],
"theme": "light",
"state": "homepage-top"
},
{
"id": "VR-002",
"route": "/fr",
"viewport": [
1024,
900
],
"theme": "dark",
"state": "homepage-top"
},
{
"id": "VR-003",
"route": "/ar",
"viewport": [
390,
844
],
"theme": "light",
"state": "homepage-top"
},
{
"id": "VR-004",
"route": "/ar",
"viewport": [
390,
844
],
"theme": "dark",
"state": "drawer-open"
},
{
"id": "VR-005",
"route": "/en",
"viewport": [
390,
844
],
"theme": "light",
"state": "demo-invalid"
},
{
"id": "VR-006",
"route": "/fr",
"viewport": [
768,
1024
],
"theme": "dark",
"state": "tour-step-3"
},
{
"id": "VR-007",
"route": "/ar",
"viewport": [
320,
800
],
"theme": "dark",
"state": "reflow-gate"
},
{
"id": "VR-008",
"route": "/en",
"viewport": [
1440,
1000
],
"theme": "dark",
"state": "pricing-and-final-cta"
}
]
}
@@ -0,0 +1,37 @@
# Findings Report
**Version:** 1.0
**Evidence status:** Pre-test expert review and automated validation only
**Participant sessions completed:** 0
## Executive assessment
The Phase 8 prototype is ready for pilot testing. The Phase 7 baseline exposed several behavioral gaps that would have invalidated primary-flow testing: inert form submission, no product-tour interaction behind a “Watch product tour” promise, incomplete mobile drawer focus containment, and no durable theme preference. These were corrected in the Phase 8 prototype.
No claim is made that users understand the product, find the CTA, or complete the form. Those are hypotheses until representative participants attempt the tasks.
## Pre-test findings
| ID | Evidence | Finding | Severity | Status |
|---|---|---|---|---|
| P8-001 | Expert + code review | Demo submission in Phase 7 prevented default and produced no success, failure, or recovery state. | S0/C | Fixed in prototype |
| P8-002 | Expert + code review | “Watch product tour” navigated to a workflow section rather than opening a tour, creating an expectation mismatch. | S1/C | Fixed with four-step tour |
| P8-003 | Expert + code review | Mobile drawer moved focus initially but did not contain focus or make background content inert. | S0/C | Fixed in prototype |
| P8-004 | Expert + code review | Theme existed in URL state but did not persist reliably when revisiting without the query parameter. | S1/C | Fixed with local persistence |
| P8-005 | Expert review | Multi-location support is implied by branch/location copy but is not an approved capability claim. Users may over-infer. | S2/C | Test explicitly; content approval pending |
| P8-006 | Expert review | Final legal consent, alternate failure contact, CRM routing, and spam controls are unresolved. | S1/C for production | Prototype limitation; open |
| P8-007 | Automated browser test | EN/FR/AR direction, tour completion, form validation/success, locale hash preservation, theme persistence, and mobile focus return pass the scripted browser checks. | S4/A | Passed |
## Hypotheses requiring participant evidence
1. The first viewport communicates rental operations and reservation-to-return scope within five seconds.
2. Orange CTA hierarchy yields unprompted demo discovery.
3. The four-step tour improves workflow comprehension without being mistaken for a full product demo.
4. Arabic users understand menu origin, control order, and mixed LTR identifiers.
5. Users distinguish “pricing factors” from public pricing.
6. Users do not mistake neutral integration and security evaluation content for confirmed capability or certification.
7. Form error recovery preserves confidence and entered data.
## Participant-results section
After sessions, add cohort counts, task-level completion, median time, error and rescue rates, abandonment, confidence, accessibility outcomes, repeated behavior patterns, anonymized quotes where consented, issue table, and recommended revisions. Report locale results separately before any aggregate.
@@ -0,0 +1,19 @@
# Phase 8 Handoff — Interactive Prototype and Usability Testing
Phase 8 is test-ready.
Use `08_INTERACTIVE_PROTOTYPE_USABILITY_TESTING_v1.0.md` as the authoritative research specification, `prototype/` as the clickable test build, and `DECISION_LOG_v8.0.md` as the cumulative decision record.
The prototype provides:
- EN/FR/AR content with true Arabic RTL;
- Light/Dark/System selection with persistence;
- context-preserving locale changes;
- demo form validation, simulated service failure, confirmation, and reset;
- four-step product tour;
- mobile navigation with focus containment, inert background, Escape handling, and focus return;
- session-local, non-PII research events and export in `?test=1` mode.
Research must begin with three pilot sessions, then the balanced core and accessibility cohorts defined in `PARTICIPANT_PROFILE_v1.0.md`. Do not mark Phase 8 accepted until the thresholds in `SUCCESS_METRICS_v1.0.csv` pass and every Critical/High issue is fixed and retested.
Unresolved product, recruitment, market, analytics, CRM, legal, and content matters remain in `OPEN_QUESTIONS_v1.0.md`.
@@ -0,0 +1,8 @@
Revision_ID,Finding_ID,Revision,Severity,Status,Owner,Target,Retest
REV-001,P8-001,"Implement validation, failure, success, and reset states",S0,Done,Prototype,Phase 8 v1.0,Automated + participant retest
REV-002,P8-002,Replace misleading tour anchor with four-step tour dialog,S1,Done,Prototype,Phase 8 v1.0,Tour task
REV-003,P8-003,"Add drawer focus containment, inert background, and focus return",S0,Done,Prototype,Phase 8 v1.0,Keyboard + screen reader
REV-004,P8-004,Persist theme and restore it after reload,S1,Done,Prototype,Phase 8 v1.0,Theme task
REV-005,P8-005,Test and then clarify multi-location capability language using approved product evidence,S2,Pending evidence,Product + Content,Before beta,Affected cohort retest
REV-006,P8-006,"Approve consent, CRM routing, spam protection, alternate contact, retry and duplicate handling",S1,Open,Legal + Sales Ops + Engineering,Before production,Integration test
REV-007,Analytics open question,Map provisional events to approved analytics/consent platform,S2,Open,Analytics + Legal,Before beta,Event QA
1 Revision_ID Finding_ID Revision Severity Status Owner Target Retest
2 REV-001 P8-001 Implement validation, failure, success, and reset states S0 Done Prototype Phase 8 v1.0 Automated + participant retest
3 REV-002 P8-002 Replace misleading tour anchor with four-step tour dialog S1 Done Prototype Phase 8 v1.0 Tour task
4 REV-003 P8-003 Add drawer focus containment, inert background, and focus return S0 Done Prototype Phase 8 v1.0 Keyboard + screen reader
5 REV-004 P8-004 Persist theme and restore it after reload S1 Done Prototype Phase 8 v1.0 Theme task
6 REV-005 P8-005 Test and then clarify multi-location capability language using approved product evidence S2 Pending evidence Product + Content Before beta Affected cohort retest
7 REV-006 P8-006 Approve consent, CRM routing, spam protection, alternate contact, retry and duplicate handling S1 Open Legal + Sales Ops + Engineering Before production Integration test
8 REV-007 Analytics open question Map provisional events to approved analytics/consent platform S2 Open Analytics + Legal Before beta Event QA
@@ -0,0 +1,13 @@
ID,Metric,Definition,Threshold,Collection,Segmentation
M-01,Five-second comprehension,Correct category + audience + reservation-to-return scope,>=80% overall; no locale <70%,Exact unprompted response,Per locale
M-02,Primary CTA discovery,Book demo activated without prompt,>=90% within 10 seconds,Time and first action,Per locale/device
M-03,Product tour completion,All four steps completed and sequence paraphrased,>=85%,"Completion, time, errors",Per locale
M-04,Module discovery,Vehicle inspections located and explained,>=85% without rescue,"Completion, path, time",Per role
M-05,Multi-location interpretation,Finds evidence and separates confirmed from unresolved,>=80%; overclaim <=10%,Response and cited evidence,Multi-location vs single
M-06,Pricing discovery,Finds quote model and >=2 factors,>=85%,Completion and time,Per locale
M-07,Locale context,Switch preserves current section and task,100% technical; >=90% participant continuation,"Hash, section, errors",EN↔FR; EN↔AR
M-08,Theme persistence,Selection survives reload,100%,State before/after reload,Browser/OS
M-09,Demo completion,Reaches confirmation,>=90%,Completion and abandonment,Per locale/device
M-10,Validation recovery,Corrects error without losing other data,>=85%,"Errors, recovery time, rescue",Per locale/access method
M-11,Keyboard critical path,Completes navigation/theme/demo with keyboard,100%; zero traps,Focus order and completion,Desktop/mobile keyboard
M-12,Confidence,Post-task rating,Median >=4/5; no locale <3.5,Rating plus reason,Per locale
1 ID Metric Definition Threshold Collection Segmentation
2 M-01 Five-second comprehension Correct category + audience + reservation-to-return scope >=80% overall; no locale <70% Exact unprompted response Per locale
3 M-02 Primary CTA discovery Book demo activated without prompt >=90% within 10 seconds Time and first action Per locale/device
4 M-03 Product tour completion All four steps completed and sequence paraphrased >=85% Completion, time, errors Per locale
5 M-04 Module discovery Vehicle inspections located and explained >=85% without rescue Completion, path, time Per role
6 M-05 Multi-location interpretation Finds evidence and separates confirmed from unresolved >=80%; overclaim <=10% Response and cited evidence Multi-location vs single
7 M-06 Pricing discovery Finds quote model and >=2 factors >=85% Completion and time Per locale
8 M-07 Locale context Switch preserves current section and task 100% technical; >=90% participant continuation Hash, section, errors EN↔FR; EN↔AR
9 M-08 Theme persistence Selection survives reload 100% State before/after reload Browser/OS
10 M-09 Demo completion Reaches confirmation >=90% Completion and abandonment Per locale/device
11 M-10 Validation recovery Corrects error without losing other data >=85% Errors, recovery time, rescue Per locale/access method
12 M-11 Keyboard critical path Completes navigation/theme/demo with keyboard 100%; zero traps Focus order and completion Desktop/mobile keyboard
13 M-12 Confidence Post-task rating Median >=4/5; no locale <3.5 Rating plus reason Per locale
@@ -0,0 +1,35 @@
# homePageCar — Phase 8 Validation Results
**Version:** 1.0
**Package status:** PASSED for prototype readiness
**Usability acceptance status:** NOT YET TESTED WITH PARTICIPANTS
## Automated package validation
- 63 static package and behavior-contract checks passed.
- Required deliverables, locale copy parity, form state copy, tour state copy, interaction hooks, privacy constraints, and decision continuity are present.
- JavaScript syntax and browser execution completed successfully in Chromium.
## Scripted browser validation
Six checks passed:
1. English homepage and four-step product-tour completion.
2. French demo-form validation recovery and confirmation.
3. Locale switch preserves the pricing-section context.
4. Explicit theme selection persists after reload/revisit.
5. Arabic dark mobile drawer opens in RTL, moves focus, closes with Escape, and returns focus.
6. Simulated service failure retains entered values and presents a persistent error.
The execution environment blocks browser navigation to local HTTP and file URLs by administrator policy. The browser harness therefore injects the exact packaged HTML, CSS, copy, and JavaScript into Chromium and supplies deterministic query state in memory. This validates behavior but does not replace manual testing from a normal local server, real browser storage, assistive technology, zoom, virtual keyboards, or network conditions.
## Manual gates still required
- Moderated pilot and core participant sessions.
- Native Arabic and French linguistic review.
- NVDA, VoiceOver, TalkBack, and real keyboard/switch-user testing.
- 200% zoom, 400% reflow, forced colors, reduced motion, and mobile virtual keyboard.
- Real CRM submission, consent, duplicate handling, retry, spam protection, and analytics consent.
- Final multi-location, pricing, integrations, security, legal, and evidence approvals.
Automated checks establish that the prototype behaves as specified. They do not establish that people understand it, trust it, or refrain from inventing capabilities between the lines.
@@ -0,0 +1,12 @@
# Token Usage Rules
1. Components consume semantic tokens such as `--color-text`, `--color-surface`, and `--color-action-conversion`. Raw palette values are allowed only in token declaration files, approved asset files, and documented data visualizations.
2. Orange is reserved for demo conversion and tightly related emphasis. Routine primary actions use the primary-action token.
3. White normal text may not use orange-600. Light conversion uses orange-700 with white; dark conversion uses orange-400 with dark text.
4. Spacing uses the 4 px scale. Optical exceptions require a comment and design approval.
5. Interactive targets are 44 × 44 px minimum unless the target is an inline text link with sufficient surrounding line height.
6. Use logical properties: `margin-inline`, `padding-block`, `inset-inline-start`, `border-inline-end`. Physical left/right properties fail review unless they describe an intrinsically physical asset.
7. Shadows are neutral. Colored glow is prohibited.
8. No global transition is applied during theme changes.
9. Text and surfaces must meet WCAG 2.2 AA in both themes. Focus indicators must remain visible in forced-colors mode.
10. Product screenshots are not recolored by tokens.
@@ -0,0 +1,150 @@
{
"$schema": "https://design-tokens.github.io/community-group/format/",
"version": "1.0",
"raw": {
"color": {
"blue": {
"50": "#eff6ff",
"100": "#dbeafe",
"200": "#bfdbfe",
"500": "#2874e8",
"600": "#1b5dd8",
"700": "#174bb5",
"800": "#183d88"
},
"orange": {
"100": "#ffedd5",
"400": "#fb923c",
"600": "#ea580c",
"700": "#c2410c"
},
"navy": {
"950": "#081426",
"900": "#0d1b2e",
"850": "#11233b",
"800": "#162b46"
},
"gray": {
"25": "#fbfdff",
"50": "#f7f9fc",
"100": "#eef2f7",
"200": "#dbe3ed",
"300": "#c6d0dc",
"500": "#64748b",
"600": "#475569",
"700": "#334155",
"800": "#1e293b",
"900": "#0f172a"
},
"green": {
"100": "#dcfce7",
"700": "#15803d"
},
"amber": {
"100": "#fef3c7",
"800": "#92400e"
},
"red": {
"100": "#fee2e2",
"700": "#b91c1c"
}
},
"space": {
"0": "0px",
"1": "4px",
"2": "8px",
"3": "12px",
"4": "16px",
"5": "20px",
"6": "24px",
"7": "28px",
"8": "32px",
"9": "36px",
"10": "40px",
"11": "44px",
"12": "48px",
"13": "52px",
"14": "56px",
"15": "60px",
"16": "64px",
"17": "68px",
"18": "72px",
"19": "76px",
"20": "80px",
"21": "84px",
"22": "88px",
"23": "92px",
"24": "96px"
},
"radius": {
"sm": "10px",
"md": "16px",
"lg": "24px",
"xl": "32px",
"pill": "999px"
},
"size": {
"touch-min": "44px",
"container-max": "1280px"
},
"duration": {
"fast": "120ms",
"standard": "160ms",
"overlay": "220ms"
},
"easing": {
"standard": "ease",
"productive": "cubic-bezier(.2,0,0,1)"
},
"font": {
"latin": "Inter Variable, Inter, Arial, sans-serif",
"arabic": "Noto Sans Arabic, Arial, sans-serif"
},
"breakpoint": {
"medium": "768px",
"wide": "1120px"
}
},
"semantic": {
"light": {
"color.canvas": "{color.gray.25}",
"color.surface": "#ffffff",
"color.surface.raised": "#ffffff",
"color.surface.muted": "#f2f6fb",
"color.surface.strong": "#e8f0fa",
"color.text": "#102035",
"color.text.muted": "#52647a",
"color.border": "#d8e2ee",
"color.border.strong": "#bdcad9",
"color.action.primary": "{color.blue.700}",
"color.action.primary.hover": "{color.blue.800}",
"color.action.conversion": "{color.orange.700}",
"color.action.conversion.hover": "#9a3412",
"color.focus": "#f97316",
"color.on.inverse": "#f8fafc",
"color.soft.blue": "#eef5ff",
"color.soft.orange": "#fff7ed",
"shadow.color": "rgba(8,20,38,.12)"
},
"dark": {
"color.canvas": "{color.navy.950}",
"color.surface": "{color.navy.900}",
"color.surface.raised": "{color.navy.850}",
"color.surface.muted": "#0b1a2d",
"color.surface.strong": "#172d48",
"color.text": "#eef5ff",
"color.text.muted": "#adbed2",
"color.border": "#263c56",
"color.border.strong": "#3a536e",
"color.action.primary": "#76a9ff",
"color.action.primary.hover": "#9bc2ff",
"color.action.conversion": "{color.orange.400}",
"color.action.conversion.hover": "#fdba74",
"color.focus": "{color.orange.400}",
"color.on.inverse": "{color.navy.950}",
"color.soft.blue": "#10284a",
"color.soft.orange": "#3a2015",
"shadow.color": "rgba(0,0,0,.36)"
}
}
}
@@ -0,0 +1,122 @@
:root {
--color-blue-50: #eff6ff;
--color-blue-100: #dbeafe;
--color-blue-200: #bfdbfe;
--color-blue-500: #2874e8;
--color-blue-600: #1b5dd8;
--color-blue-700: #174bb5;
--color-blue-800: #183d88;
--color-orange-100: #ffedd5;
--color-orange-400: #fb923c;
--color-orange-600: #ea580c;
--color-orange-700: #c2410c;
--color-navy-950: #081426;
--color-navy-900: #0d1b2e;
--color-navy-850: #11233b;
--color-navy-800: #162b46;
--color-gray-25: #fbfdff;
--color-gray-50: #f7f9fc;
--color-gray-100: #eef2f7;
--color-gray-200: #dbe3ed;
--color-gray-300: #c6d0dc;
--color-gray-500: #64748b;
--color-gray-600: #475569;
--color-gray-700: #334155;
--color-gray-800: #1e293b;
--color-gray-900: #0f172a;
--color-green-100: #dcfce7;
--color-green-700: #15803d;
--color-amber-100: #fef3c7;
--color-amber-800: #92400e;
--color-red-100: #fee2e2;
--color-red-700: #b91c1c;
--space-0: 0px;
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-7: 28px;
--space-8: 32px;
--space-9: 36px;
--space-10: 40px;
--space-11: 44px;
--space-12: 48px;
--space-13: 52px;
--space-14: 56px;
--space-15: 60px;
--space-16: 64px;
--space-17: 68px;
--space-18: 72px;
--space-19: 76px;
--space-20: 80px;
--space-21: 84px;
--space-22: 88px;
--space-23: 92px;
--space-24: 96px;
--radius-sm: 10px;
--radius-md: 16px;
--radius-lg: 24px;
--radius-xl: 32px;
--radius-pill: 999px;
--size-touch-min: 44px;
--size-container-max: 1280px;
--duration-fast: 120ms;
--duration-standard: 160ms;
--duration-overlay: 220ms;
--easing-standard: ease;
--easing-productive: cubic-bezier(.2,0,0,1);
--font-latin: Inter Variable, Inter, Arial, sans-serif;
--font-arabic: Noto Sans Arabic, Arial, sans-serif;
--breakpoint-medium: 768px;
--breakpoint-wide: 1120px;
}
html[data-theme="light"] {
--color-canvas: var(--color-gray-25);
--color-surface: #ffffff;
--color-surface-raised: #ffffff;
--color-surface-muted: #f2f6fb;
--color-surface-strong: #e8f0fa;
--color-text: #102035;
--color-text-muted: #52647a;
--color-border: #d8e2ee;
--color-border-strong: #bdcad9;
--color-action-primary: var(--color-blue-700);
--color-action-primary-hover: var(--color-blue-800);
--color-action-conversion: var(--color-orange-700);
--color-action-conversion-hover: #9a3412;
--color-focus: #f97316;
--color-on-inverse: #f8fafc;
--color-soft-blue: #eef5ff;
--color-soft-orange: #fff7ed;
--shadow-color: rgba(8,20,38,.12);
color-scheme: light;
}
html[data-theme="dark"] {
--color-canvas: var(--color-navy-950);
--color-surface: var(--color-navy-900);
--color-surface-raised: var(--color-navy-850);
--color-surface-muted: #0b1a2d;
--color-surface-strong: #172d48;
--color-text: #eef5ff;
--color-text-muted: #adbed2;
--color-border: #263c56;
--color-border-strong: #3a536e;
--color-action-primary: #76a9ff;
--color-action-primary-hover: #9bc2ff;
--color-action-conversion: var(--color-orange-400);
--color-action-conversion-hover: #fdba74;
--color-focus: var(--color-orange-400);
--color-on-inverse: var(--color-navy-950);
--color-soft-blue: #10284a;
--color-soft-orange: #3a2015;
--shadow-color: rgba(0,0,0,.36);
color-scheme: dark;
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
*, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
}
+6
View File
@@ -0,0 +1,6 @@
export const breakpoints = { medium: 768, wide: 1120 } as const;
export const themePreferences = ["light", "dark", "system"] as const;
export type ThemePreference = (typeof themePreferences)[number];
export type ResolvedTheme = Exclude<ThemePreference, "system">;
export const layout = { containerMaxPx: 1280, touchTargetMinPx: 44, spacingBasePx: 4 } as const;
export const motion = { fastMs: 120, standardMs: 160, overlayMs: 220 } as const;
@@ -0,0 +1,11 @@
{
"status": "PASSED",
"checks": 33,
"contrast": {
"light conversion": 5.18,
"dark conversion": 7.54,
"light primary": 7.75,
"dark primary": 7.81
},
"errors": []
}
@@ -0,0 +1,5 @@
{
"status": "PASSED",
"checks": 38,
"files": 18
}
@@ -0,0 +1,18 @@
# homePageCar — Phase 9 Validation Results
**Version:** 1.0
**Package status:** PASSED for developer handoff completeness
**Production release status:** BLOCKED by the explicit issue register
## Automated results
- Required artifact, route, locale-shape, token, and issue-owner checks passed.
- JSON syntax and CSV column consistency passed across the package.
- English, French, and Arabic locale structures are identical and contain no empty scalar values.
- Theme bootstrap and package validator JavaScript passed syntax checks.
- Key action contrast checks passed: light conversion 5.18:1, dark conversion 7.54:1, light primary 7.75:1, and dark primary 7.81:1.
- Six annotated reference captures were generated for desktop, tablet, mobile RTL, RTL drawer, demo dialog, and product tour states.
## What this validation does not prove
It does not prove participant comprehension, native French or Arabic quality, production CRM behavior, legal consent, analytics compliance, real browser/assistive-technology coverage, approved product evidence, or deployed performance. Those remain release gates in `OPEN_ISSUE_REGISTER_v1.0.csv` and `DEFINITION_OF_DONE_v1.0.md`.
+25
View File
@@ -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.
+58
View File
@@ -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.
+52
View File
@@ -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.
+60
View File
@@ -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.
1 Issue_ID Severity Area Status Code_path_or_control Release_gate Owner Exit_criteria Notes
2 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.
3 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.
4 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.
5 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.
6 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.
7 P9-006 High Illustrative product preview Inherited open No preview shipped Before release Product + Design Approve illustration or provide governed product capture. Suppressed.
8 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.
9 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.
10 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.
11 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.
12 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.
13 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.
14 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.
15 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.
16 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.
17 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.
18 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.
19 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.
20 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.
21 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.
22 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.
1 Issue_ID Severity Area Status Code_path_or_control Release_gate Owner Exit_criteria Notes
2 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.
3 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.
4 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.
5 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.
6 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.
7 P9-006 High Illustrative product preview Inherited open No preview shipped Before release Product + Design Approve illustration or provide governed product capture. Suppressed.
8 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.
9 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.
10 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.
11 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.
12 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.
13 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.
14 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.
15 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.
16 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.
17 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.
18 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.
19 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.
20 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.
21 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.
22 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.
23 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.
24 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.
25 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.
26 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."
1 Issue_ID Severity Area Status Code_path_or_control Release_gate Owner Exit_criteria Notes
2 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.
3 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.
4 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.
5 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.
6 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.
7 P9-006 High Illustrative product preview Inherited open No preview shipped Before release Product + Design Approve illustration or provide governed product capture. Suppressed.
8 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.
9 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.
10 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.
11 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.
12 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.
13 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.
14 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.
15 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.
16 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.
17 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.
18 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.
19 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.
20 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.
21 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.
22 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.
23 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.
24 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.
25 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.
26 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.
27 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.
28 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.
29 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.
30 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.
31 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.
1 Issue_ID Severity Area Status Code_path_or_control Release_gate Owner Exit_criteria Notes
2 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.
3 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.
4 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.
5 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.
6 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.
7 P9-006 High Illustrative product preview Inherited open No preview shipped Before release Product + Design Approve illustration or provide governed product capture. Suppressed.
8 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.
9 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.
10 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.
11 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.
12 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.
13 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.
14 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.
15 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.
16 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.
17 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.
18 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.
19 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.
20 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.
21 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.
22 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.
23 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.
24 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.
25 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.
26 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.
27 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.
28 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.
29 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.
30 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.
31 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.
32 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.
33 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.
34 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.
+68
View File
@@ -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.
+126
View File
@@ -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.
+346
View File
@@ -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 10s 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
```
+193
View File
@@ -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: 320767 CSS px
- medium: 7681119 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.
+177
View File
@@ -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.
+212
View File
@@ -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.
+106
View File
@@ -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.
+45
View File
@@ -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
1 Component Interactive Name_role_state Keyboard Focus Live_region Touch_target Automated_coverage Manual_status
2 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
3 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
4 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
5 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
6 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
7 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
8 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
9 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
10 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
11 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
12 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
13 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
14 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
15 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
16 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
17 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
18 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
19 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
20 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
21 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
22 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
23 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
24 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
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 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
33 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
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 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
44 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
45 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
46 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
47 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
48 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
49 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
50 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
51 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
52 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
53 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
54 DemoForm No Not rendered N/A N/A N/A N/A Not applicable Blocked
55 Toast No Not rendered N/A N/A N/A N/A Not applicable Blocked
56 PricingCard No Not rendered N/A N/A N/A N/A Not applicable Blocked
57 TestimonialContent No Not rendered N/A N/A N/A N/A Not applicable Blocked
58 CustomerLogoContent No Not rendered N/A N/A N/A N/A Not applicable Blocked
59 ApprovedProductCapture No Not rendered N/A N/A N/A N/A Not applicable Blocked
60 LoginDestination No Not rendered N/A N/A N/A N/A Not applicable Blocked
61 SalesDestination No Not rendered N/A N/A N/A N/A Not applicable Blocked
+22
View File
@@ -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.
+77
View File
@@ -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
1 Component Category Status Import_path Source_specifications Homepage_consumers Open_issues
2 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
3 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
4 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
5 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
6 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
7 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
8 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
9 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
10 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
11 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
12 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
13 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
14 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
15 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
16 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
17 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
18 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
19 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
20 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
21 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
22 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
23 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
24 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
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 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
33 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
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 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
44 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
45 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
46 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
47 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
48 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
49 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
50 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
51 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
52 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
53 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
54 DemoForm forms blocked Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv hero; final CTA P9-002; P9-003
55 Toast feedback excluded Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv none; critical information must remain persistent
56 PricingCard surfaces blocked Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv pricing preview P9-008
57 TestimonialContent evidence blocked Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv testimonial section P9-012
58 CustomerLogoContent evidence blocked Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv trust proof P9-012
59 ApprovedProductCapture media blocked Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv hero; product UI previews P9-006
60 LoginDestination actions blocked Not implemented Phase 12 prompt; docs/IMPLEMENTATION_ISSUE_REGISTER_v1.1.csv header; footer P9-015
61 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
1 Component_family Scenario Width_css_px Expected_behavior Automated_status Manual_status
2 actions Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
3 actions Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
4 actions Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
5 actions Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
6 actions Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
7 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
8 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
9 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
10 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
11 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
12 comparison Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
13 comparison Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
14 comparison Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
15 comparison Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
16 comparison Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
17 evidence Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
18 evidence Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
19 evidence Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
20 evidence Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
21 evidence Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
22 feedback Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
23 feedback Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
24 feedback Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
25 feedback Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
26 feedback Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
27 forms Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
28 forms Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
29 forms Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
30 forms Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
31 forms Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
32 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
33 foundational utilities Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
34 foundational utilities Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
35 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
36 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
37 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
38 icon system Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
39 icon system Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
40 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
41 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
42 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
43 marketing surfaces Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
44 marketing surfaces Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
45 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
46 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
47 media Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
48 media Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
49 media Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
50 media Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
51 media Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
52 navigation Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
53 navigation Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
54 navigation Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
55 navigation Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
56 navigation Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
57 overlays Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
58 overlays Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
59 overlays Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
60 overlays Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
61 overlays Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
62 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
63 product previews Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
64 product previews Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
65 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
66 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
67 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
68 section patterns Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
69 section patterns Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
70 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
71 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
72 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
73 selection controls Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
74 selection controls Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
75 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
76 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
77 surfaces Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
78 surfaces Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
79 surfaces Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
80 surfaces Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
81 surfaces Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
82 typography Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
83 typography Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
84 typography Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
85 typography Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
86 typography Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
87 workflow Narrow mobile 320 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
88 workflow Mobile 390 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
89 workflow Tablet 768 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
90 workflow Standard desktop 1024 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
91 workflow Wide desktop 1440 No page overflow; content-driven reflow; 44px controls; logical order Fixture test authored; execution blocked by pnpm/browser availability Pending
92 Cross-component 200% zoom Variable No clipped text, hidden actions, or unexpected horizontal page overflow Risk-based browser test authored where applicable Pending
93 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
94 Cross-component Reduced viewport height Variable No clipped text, hidden actions, or unexpected horizontal page overflow Risk-based browser test authored where applicable Pending
95 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
1 Component Layout Content_order Icon_behavior Motion Mixed_direction Review_status
2 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
3 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
4 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
5 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
6 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
7 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
8 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
9 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
10 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
11 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
12 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
13 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
14 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
15 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
16 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
17 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
18 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
19 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
20 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
21 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
22 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
23 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
24 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
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 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
33 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
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 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
44 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
45 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
46 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
47 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
48 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
49 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
50 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
51 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
52 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
53 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
54 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
55 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
56 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
57 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
58 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
59 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
60 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
61 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
1 Fixture Components Locales Themes Widths States Location Production_guard
2 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
3 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
1 Test_type Path Coverage Artifact_status Execution_status
2 Unit tests/unit/components/actions.test.tsx Button loading/name; icon-only label; disabled destination Authored Not executed: package manager unavailable
3 Unit tests/unit/components/controls.test.tsx Tabs keyboard; accordion semantics Authored Not executed
4 Unit tests/unit/components/forms.test.tsx Label/help/error relationships; summary links Authored Not executed
5 Unit tests/unit/components/evidence.test.tsx Evidence production suppression Authored Not executed
6 Type-level tests/types/component-contracts.test-d.tsx Icon-only label and metric model Authored Not executed
7 Browser tests/browser/component-system.spec.ts Locale/RTL/reflow/keyboard/dialog focus Authored Not executed
8 Accessibility tests/a11y/component-system.a11y.spec.ts Axe on en/fr/ar fixture Authored Not executed
9 Visual tests/visual/component-system.visual.spec.ts en-light, fr-dark, ar-dark/mobile Authored Baselines not generated or approved
+177
View File
@@ -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
1 Component Status Variant Controlled_by Production_restriction
2 VisuallyHidden implemented None N/A Blocked or excluded; see issue register
3 BidiText implemented None N/A Blocked or excluded; see issue register
4 LiveRegion implemented polite Typed prop or semantic state No arbitrary color or spacing override
5 LiveRegion implemented assertive Typed prop or semantic state No arbitrary color or spacing override
6 Icon implemented sm Typed prop or semantic state No arbitrary color or spacing override
7 Icon implemented md Typed prop or semantic state No arbitrary color or spacing override
8 Icon implemented lg Typed prop or semantic state No arbitrary color or spacing override
9 Icon implemented fixed Typed prop or semantic state No arbitrary color or spacing override
10 Icon implemented mirror Typed prop or semantic state No arbitrary color or spacing override
11 Button implemented primary Typed prop or semantic state No arbitrary color or spacing override
12 Button implemented conversion Typed prop or semantic state No arbitrary color or spacing override
13 Button implemented secondary Typed prop or semantic state No arbitrary color or spacing override
14 Button implemented tertiary Typed prop or semantic state No arbitrary color or spacing override
15 Button implemented ghost Typed prop or semantic state No arbitrary color or spacing override
16 Button implemented destructive Typed prop or semantic state No arbitrary color or spacing override
17 Button implemented link Typed prop or semantic state No arbitrary color or spacing override
18 Button implemented icon-only Typed prop or semantic state No arbitrary color or spacing override
19 Button implemented loading Typed prop or semantic state No arbitrary color or spacing override
20 ActionLink implemented inline Typed prop or semantic state No arbitrary color or spacing override
21 ActionLink implemented navigation Typed prop or semantic state No arbitrary color or spacing override
22 ActionLink implemented standalone Typed prop or semantic state No arbitrary color or spacing override
23 ActionLink implemented button-primary Typed prop or semantic state No arbitrary color or spacing override
24 ActionLink implemented button-conversion Typed prop or semantic state No arbitrary color or spacing override
25 ActionLink implemented muted Typed prop or semantic state No arbitrary color or spacing override
26 ActionLink implemented disabled Typed prop or semantic state No arbitrary color or spacing override
27 FormField implemented required Typed prop or semantic state No arbitrary color or spacing override
28 FormField implemented optional Typed prop or semantic state No arbitrary color or spacing override
29 FormField implemented supporting Typed prop or semantic state No arbitrary color or spacing override
30 FormField implemented error Typed prop or semantic state No arbitrary color or spacing override
31 TextInput implemented text Typed prop or semantic state No arbitrary color or spacing override
32 TextInput implemented email Typed prop or semantic state No arbitrary color or spacing override
33 TextInput implemented telephone Typed prop or semantic state No arbitrary color or spacing override
34 TextInput implemented url Typed prop or semantic state No arbitrary color or spacing override
35 TextInput implemented search Typed prop or semantic state No arbitrary color or spacing override
36 TextInput implemented invalid Typed prop or semantic state No arbitrary color or spacing override
37 TextInput implemented disabled Typed prop or semantic state No arbitrary color or spacing override
38 TextArea implemented default Typed prop or semantic state No arbitrary color or spacing override
39 TextArea implemented character-count Typed prop or semantic state No arbitrary color or spacing override
40 TextArea implemented invalid Typed prop or semantic state No arbitrary color or spacing override
41 TextArea implemented disabled Typed prop or semantic state No arbitrary color or spacing override
42 Select implemented default Typed prop or semantic state No arbitrary color or spacing override
43 Select implemented invalid Typed prop or semantic state No arbitrary color or spacing override
44 Select implemented disabled Typed prop or semantic state No arbitrary color or spacing override
45 Checkbox implemented default Typed prop or semantic state No arbitrary color or spacing override
46 Checkbox implemented checked Typed prop or semantic state No arbitrary color or spacing override
47 Checkbox implemented invalid Typed prop or semantic state No arbitrary color or spacing override
48 Checkbox implemented disabled Typed prop or semantic state No arbitrary color or spacing override
49 Radio implemented default Typed prop or semantic state No arbitrary color or spacing override
50 Radio implemented checked Typed prop or semantic state No arbitrary color or spacing override
51 Radio implemented invalid Typed prop or semantic state No arbitrary color or spacing override
52 Radio implemented disabled Typed prop or semantic state No arbitrary color or spacing override
53 Switch implemented on Typed prop or semantic state No arbitrary color or spacing override
54 Switch implemented off Typed prop or semantic state No arbitrary color or spacing override
55 Switch implemented disabled Typed prop or semantic state No arbitrary color or spacing override
56 Fieldset implemented default Typed prop or semantic state No arbitrary color or spacing override
57 ErrorSummary implemented error-list Typed prop or semantic state No arbitrary color or spacing override
58 Tabs implemented automatic Typed prop or semantic state No arbitrary color or spacing override
59 Tabs implemented manual Typed prop or semantic state No arbitrary color or spacing override
60 Tabs implemented disabled-tab Typed prop or semantic state No arbitrary color or spacing override
61 SegmentedControl implemented selected Typed prop or semantic state No arbitrary color or spacing override
62 SegmentedControl implemented disabled Typed prop or semantic state No arbitrary color or spacing override
63 Accordion implemented open Typed prop or semantic state No arbitrary color or spacing override
64 Accordion implemented closed Typed prop or semantic state No arbitrary color or spacing override
65 Pagination implemented current Typed prop or semantic state No arbitrary color or spacing override
66 Pagination implemented previous Typed prop or semantic state No arbitrary color or spacing override
67 Pagination implemented next Typed prop or semantic state No arbitrary color or spacing override
68 Dialog implemented modal Typed prop or semantic state No arbitrary color or spacing override
69 Dialog implemented drawer Typed prop or semantic state No arbitrary color or spacing override
70 Dialog implemented dismissible Typed prop or semantic state No arbitrary color or spacing override
71 Dialog implemented non-dismissible Typed prop or semantic state No arbitrary color or spacing override
72 DropdownMenu implemented open Typed prop or semantic state No arbitrary color or spacing override
73 DropdownMenu implemented closed Typed prop or semantic state No arbitrary color or spacing override
74 DropdownMenu implemented disabled-item Typed prop or semantic state No arbitrary color or spacing override
75 DropdownMenu implemented destructive-item Typed prop or semantic state No arbitrary color or spacing override
76 Tooltip implemented hover Typed prop or semantic state No arbitrary color or spacing override
77 Tooltip implemented focus Typed prop or semantic state No arbitrary color or spacing override
78 Alert implemented info Typed prop or semantic state No arbitrary color or spacing override
79 Alert implemented success Typed prop or semantic state No arbitrary color or spacing override
80 Alert implemented warning Typed prop or semantic state No arbitrary color or spacing override
81 Alert implemented error Typed prop or semantic state No arbitrary color or spacing override
82 Alert implemented inline Typed prop or semantic state No arbitrary color or spacing override
83 Progress implemented determinate Typed prop or semantic state No arbitrary color or spacing override
84 Progress implemented indeterminate Typed prop or semantic state No arbitrary color or spacing override
85 Spinner implemented loading Typed prop or semantic state No arbitrary color or spacing override
86 Skeleton implemented single-line Typed prop or semantic state No arbitrary color or spacing override
87 Skeleton implemented multi-line Typed prop or semantic state No arbitrary color or spacing override
88 Skeleton implemented reduced-motion Typed prop or semantic state No arbitrary color or spacing override
89 StateMessage implemented empty Typed prop or semantic state No arbitrary color or spacing override
90 StateMessage implemented error Typed prop or semantic state No arbitrary color or spacing override
91 StateMessage implemented success Typed prop or semantic state No arbitrary color or spacing override
92 StateMessage implemented information Typed prop or semantic state No arbitrary color or spacing override
93 StatusBadge implemented neutral Typed prop or semantic state No arbitrary color or spacing override
94 StatusBadge implemented info Typed prop or semantic state No arbitrary color or spacing override
95 StatusBadge implemented success Typed prop or semantic state No arbitrary color or spacing override
96 StatusBadge implemented warning Typed prop or semantic state No arbitrary color or spacing override
97 StatusBadge implemented error Typed prop or semantic state No arbitrary color or spacing override
98 Card implemented default Typed prop or semantic state No arbitrary color or spacing override
99 Card implemented muted Typed prop or semantic state No arbitrary color or spacing override
100 Card implemented elevated Typed prop or semantic state No arbitrary color or spacing override
101 Card implemented strong Typed prop or semantic state No arbitrary color or spacing override
102 Card implemented interactive Typed prop or semantic state No arbitrary color or spacing override
103 Panel implemented default Typed prop or semantic state No arbitrary color or spacing override
104 Panel implemented muted Typed prop or semantic state No arbitrary color or spacing override
105 Panel implemented elevated Typed prop or semantic state No arbitrary color or spacing override
106 Panel implemented strong Typed prop or semantic state No arbitrary color or spacing override
107 Callout implemented information Typed prop or semantic state No arbitrary color or spacing override
108 Heading implemented display Typed prop or semantic state No arbitrary color or spacing override
109 Heading implemented section Typed prop or semantic state No arbitrary color or spacing override
110 Heading implemented subheading Typed prop or semantic state No arbitrary color or spacing override
111 Heading implemented levels-1-6 Typed prop or semantic state No arbitrary color or spacing override
112 Eyebrow implemented default Typed prop or semantic state No arbitrary color or spacing override
113 Text implemented lead Typed prop or semantic state No arbitrary color or spacing override
114 Text implemented body Typed prop or semantic state No arbitrary color or spacing override
115 Text implemented supporting Typed prop or semantic state No arbitrary color or spacing override
116 Text implemented caption Typed prop or semantic state No arbitrary color or spacing override
117 Text implemented label Typed prop or semantic state No arbitrary color or spacing override
118 Quote implemented with-citation Typed prop or semantic state No arbitrary color or spacing override
119 Quote implemented without-citation Typed prop or semantic state No arbitrary color or spacing override
120 Breadcrumbs implemented current-page Typed prop or semantic state No arbitrary color or spacing override
121 SectionNavigation implemented current-location Typed prop or semantic state No arbitrary color or spacing override
122 SectionNavigation implemented overflow Typed prop or semantic state No arbitrary color or spacing override
123 FooterLinkGroup implemented resolved Typed prop or semantic state No arbitrary color or spacing override
124 FooterLinkGroup implemented disabled Typed prop or semantic state No arbitrary color or spacing override
125 MediaFrame implemented square Typed prop or semantic state No arbitrary color or spacing override
126 MediaFrame implemented landscape Typed prop or semantic state No arbitrary color or spacing override
127 MediaFrame implemented wide Typed prop or semantic state No arbitrary color or spacing override
128 MediaFrame implemented portrait Typed prop or semantic state No arbitrary color or spacing override
129 MediaFrame implemented auto Typed prop or semantic state No arbitrary color or spacing override
130 MediaFrame implemented captioned Typed prop or semantic state No arbitrary color or spacing override
131 MediaFrame implemented decorative Typed prop or semantic state No arbitrary color or spacing override
132 ResponsiveImage implemented meaningful Typed prop or semantic state No arbitrary color or spacing override
133 ResponsiveImage implemented decorative Typed prop or semantic state No arbitrary color or spacing override
134 ResponsiveImage implemented captioned Typed prop or semantic state No arbitrary color or spacing override
135 SectionHeader implemented start Typed prop or semantic state No arbitrary color or spacing override
136 SectionHeader implemented center Typed prop or semantic state No arbitrary color or spacing override
137 FeatureCard implemented default Typed prop or semantic state No arbitrary color or spacing override
138 FeatureCard implemented primary Typed prop or semantic state No arbitrary color or spacing override
139 FeatureCard implemented muted Typed prop or semantic state No arbitrary color or spacing override
140 FeatureGrid implemented responsive-grid Typed prop or semantic state No arbitrary color or spacing override
141 SplitContent implemented default Typed prop or semantic state No arbitrary color or spacing override
142 SplitContent implemented reverse Typed prop or semantic state No arbitrary color or spacing override
143 MetricStrip implemented responsive-strip Typed prop or semantic state No arbitrary color or spacing override
144 LogoStripShell implemented empty-shell Typed prop or semantic state No arbitrary color or spacing override
145 LogoStripShell implemented content Typed prop or semantic state No arbitrary color or spacing override
146 Workflow implemented numbered Typed prop or semantic state No arbitrary color or spacing override
147 Workflow implemented icon Typed prop or semantic state No arbitrary color or spacing override
148 Workflow implemented stacked Typed prop or semantic state No arbitrary color or spacing override
149 Workflow implemented horizontal Typed prop or semantic state No arbitrary color or spacing override
150 Comparison implemented problem-solution Typed prop or semantic state No arbitrary color or spacing override
151 Comparison implemented stacked Typed prop or semantic state No arbitrary color or spacing override
152 Comparison implemented two-column Typed prop or semantic state No arbitrary color or spacing override
153 Metric implemented approved Typed prop or semantic state No arbitrary color or spacing override
154 Metric implemented pending-review Typed prop or semantic state No arbitrary color or spacing override
155 Metric implemented research-only Typed prop or semantic state No arbitrary color or spacing override
156 Metric implemented prohibited Typed prop or semantic state No arbitrary color or spacing override
157 EvidenceShell implemented approved Typed prop or semantic state No arbitrary color or spacing override
158 EvidenceShell implemented pending-review Typed prop or semantic state No arbitrary color or spacing override
159 EvidenceShell implemented research-only Typed prop or semantic state No arbitrary color or spacing override
160 EvidenceShell implemented prohibited Typed prop or semantic state No arbitrary color or spacing override
161 CTA implemented inline Typed prop or semantic state No arbitrary color or spacing override
162 CTA implemented card Typed prop or semantic state No arbitrary color or spacing override
163 CTA implemented section Typed prop or semantic state No arbitrary color or spacing override
164 CTA implemented primary-only Typed prop or semantic state No arbitrary color or spacing override
165 CTA implemented dual-action Typed prop or semantic state No arbitrary color or spacing override
166 CTA implemented disabled-destination Typed prop or semantic state No arbitrary color or spacing override
167 ProductPreview implemented illustrative Typed prop or semantic state No arbitrary color or spacing override
168 ProductPreview implemented empty Typed prop or semantic state No arbitrary color or spacing override
169 ProductPreview implemented responsive-table Typed prop or semantic state No arbitrary color or spacing override
170 DemoForm blocked None N/A Blocked or excluded; see issue register
171 Toast excluded None N/A Blocked or excluded; see issue register
172 PricingCard blocked None N/A Blocked or excluded; see issue register
173 TestimonialContent blocked None N/A Blocked or excluded; see issue register
174 CustomerLogoContent blocked None N/A Blocked or excluded; see issue register
175 ApprovedProductCapture blocked None N/A Blocked or excluded; see issue register
176 LoginDestination blocked None N/A Blocked or excluded; see issue register
177 SalesDestination blocked None N/A Blocked or excluded; see issue register

Some files were not shown because too many files have changed in this diff Show More