diff --git a/.github/agents/copilot-instructions.md b/.github/agents/copilot-instructions.md index 2d34f6d9..3611ae99 100644 --- a/.github/agents/copilot-instructions.md +++ b/.github/agents/copilot-instructions.md @@ -214,6 +214,8 @@ ## Active Technologies - Repository-owned markdown and contract artifacts under `.specify/` and `/Users/ahmeddarrazi/Documents/projects/wt-plattform/specs/201-enforcement-review-guardrails/`; no product database persistence (201-enforcement-review-guardrails) - Astro 6.0.0 templates + TypeScript 5.9 stric + Astro 6, Tailwind CSS v4 via `@tailwindcss/vite`, Astro content collections, local Astro layout/primitive/content helpers, Playwright smoke tests (215-website-core-pages) - Static filesystem pages, content modules, and Astro content collections under `apps/website/src` and `apps/website/public`; no database (215-website-core-pages) +- Astro 6.0.0 templates + TypeScript 5.9.x + Astro 6, Tailwind CSS v4, local Astro layout/section primitives, Astro content collections, Playwright browser smoke tests (216-homepage-structure) +- Static filesystem content, Astro content collections, and assets under `apps/website/src` and `apps/website/public`; no database (216-homepage-structure) - PHP 8.4.15 (feat/005-bulk-operations) @@ -248,8 +250,8 @@ ## Code Style PHP 8.4.15: Follow standard conventions ## Recent Changes +- 216-homepage-structure: Added Astro 6.0.0 templates + TypeScript 5.9.x + Astro 6, Tailwind CSS v4, local Astro layout/section primitives, Astro content collections, Playwright browser smoke tests - 215-website-core-pages: Added Astro 6.0.0 templates + TypeScript 5.9 stric + Astro 6, Tailwind CSS v4 via `@tailwindcss/vite`, Astro content collections, local Astro layout/primitive/content helpers, Playwright smoke tests - 214-website-visual-foundation: Added Astro 6.0.0 templates + TypeScript 5.9 strict + Astro 6, Tailwind CSS v4 via `@tailwindcss/vite`, Astro content collections, local Astro component primitives, Playwright browser smoke tests -- 201-enforcement-review-guardrails: Added Markdown governance artifacts, JSON Schema plus logical OpenAPI planning contracts, and Bash-backed SpecKit scripts inside a PHP 8.4.15 / Laravel 12 / Filament v5 / Livewire v4 repository + `.specify/memory/constitution.md`, `.specify/templates/spec-template.md`, `.specify/templates/plan-template.md`, `.specify/templates/tasks-template.md`, `.specify/templates/checklist-template.md`, `.specify/README.md`, `docs/ui/operator-ux-surface-standards.md`, and Specs 196 through 200 diff --git a/apps/website/public/images/hero-product-visual.svg b/apps/website/public/images/hero-product-visual.svg new file mode 100644 index 00000000..5d9131fa --- /dev/null +++ b/apps/website/public/images/hero-product-visual.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + TenantAtlas + + + + Inventory + + Backup History + + Restore + + Drift Detection + + Governance + + + + + 247 + Policies tracked + + 98.4% + Compliance rate + + 12 + Versions stored + + 3 + Drift alerts + + + POLICY NAME + TYPE + STATUS + LAST BACKUP + + + Windows Compliance Baseline + Compliance + + Synced + 2 min ago + + BitLocker Encryption Policy + Config + + Synced + 15 min ago + + Conditional Access – MFA + Access + + Drift + 1 hr ago + + Autopilot Deployment Profile + Enrollment + + Synced + 30 min ago + + App Protection – iOS Managed + Protection + + Synced + 45 min ago + diff --git a/apps/website/src/components/primitives/Card.astro b/apps/website/src/components/primitives/Card.astro index 9d508a78..0235c690 100644 --- a/apps/website/src/components/primitives/Card.astro +++ b/apps/website/src/components/primitives/Card.astro @@ -3,9 +3,10 @@ interface Props { as?: keyof HTMLElementTagNameMap; class?: string; variant?: 'accent' | 'default' | 'subtle'; + [key: string]: unknown; } -const { as = 'article', class: className = '', variant = 'default' } = Astro.props; +const { as = 'article', class: className = '', variant = 'default', ...rest } = Astro.props; const variantClasses = { default: 'surface-card', @@ -19,6 +20,7 @@ const Tag = as; diff --git a/apps/website/src/components/primitives/Section.astro b/apps/website/src/components/primitives/Section.astro index 92863944..4b5f1f10 100644 --- a/apps/website/src/components/primitives/Section.astro +++ b/apps/website/src/components/primitives/Section.astro @@ -6,6 +6,7 @@ interface Props { id?: string; layer?: '1' | '2' | '3'; tone?: 'default' | 'emphasis' | 'muted'; + [key: string]: unknown; } const { @@ -15,6 +16,7 @@ const { id, layer = '2', tone = 'default', + ...rest } = Astro.props; const Tag = as; const densityClasses = { @@ -37,6 +39,7 @@ const toneClasses = { toneClasses[tone], className, ]} + {...rest} > diff --git a/apps/website/src/components/sections/CapabilityGrid.astro b/apps/website/src/components/sections/CapabilityGrid.astro new file mode 100644 index 00000000..c3e0b0bc --- /dev/null +++ b/apps/website/src/components/sections/CapabilityGrid.astro @@ -0,0 +1,59 @@ +--- +import Badge from '@/components/primitives/Badge.astro'; +import Card from '@/components/primitives/Card.astro'; +import Container from '@/components/primitives/Container.astro'; +import Grid from '@/components/primitives/Grid.astro'; +import Headline from '@/components/content/Headline.astro'; +import Lead from '@/components/content/Lead.astro'; +import Section from '@/components/primitives/Section.astro'; +import SectionHeader from '@/components/primitives/SectionHeader.astro'; +import type { CapabilityClusterContent } from '@/types/site'; + +interface Props { + description?: string; + eyebrow?: string; + items: CapabilityClusterContent[]; + title: string; +} + +const { description, eyebrow, items, title } = Astro.props; +--- + +
+ +
+ + + {items.map((cluster) => ( + +
+
+ + {cluster.title} + + {cluster.meta && ( + {cluster.meta} + )} +
+ + {cluster.description} + +
    + {cluster.capabilities.map((cap) => ( +
  • + {cap} +
  • + ))} +
+ {cluster.href && ( + + Learn more → + + )} +
+
+ ))} +
+
+
+
diff --git a/apps/website/src/components/sections/OutcomeSection.astro b/apps/website/src/components/sections/OutcomeSection.astro new file mode 100644 index 00000000..5a3050b2 --- /dev/null +++ b/apps/website/src/components/sections/OutcomeSection.astro @@ -0,0 +1,40 @@ +--- +import Card from '@/components/primitives/Card.astro'; +import Container from '@/components/primitives/Container.astro'; +import Grid from '@/components/primitives/Grid.astro'; +import Headline from '@/components/content/Headline.astro'; +import Lead from '@/components/content/Lead.astro'; +import Section from '@/components/primitives/Section.astro'; +import SectionHeader from '@/components/primitives/SectionHeader.astro'; +import type { OutcomeSectionContent } from '@/types/site'; + +interface Props { + content: OutcomeSectionContent; +} + +const { content } = Astro.props; +--- + +
+ +
+ + + {content.outcomes.map((outcome) => ( + + + {outcome.title} + + + {outcome.description} + + + ))} + +
+
+
diff --git a/apps/website/src/components/sections/PageHero.astro b/apps/website/src/components/sections/PageHero.astro index ccd505b7..8a5acb90 100644 --- a/apps/website/src/components/sections/PageHero.astro +++ b/apps/website/src/components/sections/PageHero.astro @@ -42,7 +42,18 @@ const { calloutDescription, calloutTitle, hero, metrics = [] } = Astro.props; )} )} - {hero.highlights && hero.highlights.length > 0 && ( + {hero.trustSubclaims && hero.trustSubclaims.length > 0 && ( + + )} + {hero.highlights && hero.highlights.length > 0 && !hero.trustSubclaims?.length && (