diff --git a/.github/workflows/accessibility.yml b/.github/workflows/accessibility.yml deleted file mode 100644 index b2cd39a..0000000 --- a/.github/workflows/accessibility.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Accessibility Testing -on: - pull_request: - paths: - - 'templates/**' - - 'static/**' - - 'content/**' - workflow_dispatch: -permissions: {} -jobs: - axe-core: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v6 - - - name: Install Zola - run: | - curl -LO https://github.com/getzola/zola/releases/download/v0.22.1/zola-v0.22.1-x86_64-unknown-linux-gnu.tar.gz - tar -xzf zola-v0.22.1-x86_64-unknown-linux-gnu.tar.gz - sudo mv zola /usr/local/bin/ - - - name: Build site - run: zola build - - - name: Set up bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: "latest" - - - name: Install chrome with browser-driver-manager - run: bunx browser-driver-manager@2.0.1 install chrome - - - name: Serve site and run axe-core - run: | - zola serve --port 8000 & - # Test key pages - bunx @axe-core/cli@4.11.1 http://localhost:8000/ \ - http://localhost:8000/providers/ \ - http://localhost:8000/providers/scaleway/ \ - http://localhost:8000/compare.html?providers=aws,google-cloud,microsoft-azure --exit - - - name: Report results - if: always() - run: echo "Accessibility testing completed. Check logs above for any violations." diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5a8358f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,86 @@ +name: CI + +on: + pull_request: + paths: + - 'templates/**' + - 'static/**' + - 'content/**' + push: + +permissions: {} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v6.0.1 + + - name: Build Zola + uses: getzola/github-pages@066755243e69f508fd1a74739fbf1a65f656c790 + with: + zola_version: v0.22.1 + check_links: false + check_flags: "--skip-external-links" + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: public + path: public/ + retention-days: 1 + + axe-core: + needs: build + runs-on: ubuntu-latest + steps: + - name: Download build artifact + uses: actions/download-artifact@v4 + with: + name: public + path: public/ + + - name: Set up bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: "latest" + + - name: Install chrome with browser-driver-manager + run: bunx browser-driver-manager@2.0.1 install chrome + + - name: Serve site and run axe-core + run: | + python3 -m http.server 8000 --directory public & + sleep 2 + bunx @axe-core/cli@4.11.1 http://localhost:8000/ \ + http://localhost:8000/providers/ \ + http://localhost:8000/providers/scaleway/ \ + http://localhost:8000/compare.html?providers=aws,google-cloud,microsoft-azure --exit + + - name: Report results + if: always() + run: echo "Accessibility testing completed. Check logs above for any violations." + + lighthouse: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v6.0.1 + + - name: Download build artifact + uses: actions/download-artifact@v4 + with: + name: public + path: public/ + + - name: Set up bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: "latest" + + - name: Lighthouse analysis + run: bunx @lhci/cli@0.15.x autorun + env: + LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }} diff --git a/.gitignore b/.gitignore index 32cc47a..e5b8db5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ node_modules/ package.json bun.lock +.lighthouseci/ diff --git a/.lighthouserc.json b/.lighthouserc.json new file mode 100644 index 0000000..599b161 --- /dev/null +++ b/.lighthouserc.json @@ -0,0 +1,26 @@ +{ + "ci": { + "collect": { + "staticDistDir": "./public" + }, + "assert": { + "assertions": { + "categories:performance": ["warn", { "minScore": 0.9 }], + "categories:accessibility": ["error", { "minScore": 0.95 }], + "categories:best-practices": ["error", { "minScore": 0.9 }], + "categories:seo": ["error", { "minScore": 0.95 }], + + "network-dependency-tree-insight": "off", + + "render-blocking-resources": ["warn", { "maxLength": 1 }], + "render-blocking-insight": ["warn", { "maxLength": 1 }], + + "label-content-name-mismatch": ["error", { "minScore": 0.9 }], + "html-has-lang": ["error", { "minScore": 1 }], + "meta-description": ["error", { "minScore": 1 }], + "viewport": ["error", { "minScore": 1 }], + "errors-in-console": ["error", { "minScore": 0.9 }] + } + } + } +} diff --git a/README.md b/README.md index 1a7a60a..a73a4f3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ -[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/cloudlandscape/cloudlandscape.github.io/badge)](https://scorecard.dev/viewer/?uri=github.com/cloudlandscape/cloudlandscape.github.io) -[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/12157/badge)](https://www.bestpractices.dev/projects/12157) -[![CodeQL Advanced](https://github.com/cloudlandscape/cloudlandscape.github.io/actions/workflows/codeql.yml/badge.svg)](https://github.com/cloudlandscape/cloudlandscape.github.io/actions/workflows/codeql.yml) -[![Accessibility Testing](https://github.com/cloudlandscape/cloudlandscape.github.io/actions/workflows/accessibility.yml/badge.svg)](https://github.com/cloudlandscape/cloudlandscape.github.io/actions/workflows/accessibility.yml) +[![OpenSSF Scorecard](https://img.shields.io/ossf-scorecard/github.com/cloudlandscape/cloudlandscape.github.io?style=for-the-badge&label=OpenSSF%20Scorecard)](https://scorecard.dev/viewer/?uri=github.com/cloudlandscape/cloudlandscape.github.io) +[![OpenSSF Best Practices](https://img.shields.io/cii/percentage/12157?style=for-the-badge&label=OpenSSF%20Best%20Practices)](https://www.bestpractices.dev/en/projects/12157/passing) +[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/cloudlandscape/cloudlandscape.github.io/codeql.yml?style=for-the-badge&label=CodeQL)](https://github.com/cloudlandscape/cloudlandscape.github.io/actions/workflows/codeql.yml) +[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/cloudlandscape/cloudlandscape.github.io/accessibility.yml?style=for-the-badge&label=Web%20tests)](https://github.com/cloudlandscape/cloudlandscape.github.io/actions/workflows/ci.yml) +[![GitHub License](https://img.shields.io/github/license/cloudlandscape/cloudlandscape.github.io?style=for-the-badge&color=blue)](https://eupl.eu/) # Cloud landscape diff --git a/_bmad-output/implementation-artifacts/3-6-screen-reader-support-for-all-content.md b/_bmad-output/implementation-artifacts/3-6-screen-reader-support-for-all-content.md new file mode 100644 index 0000000..dbacdc5 --- /dev/null +++ b/_bmad-output/implementation-artifacts/3-6-screen-reader-support-for-all-content.md @@ -0,0 +1,150 @@ +# Story 3.6: Screen Reader Support for All Content + +Status: done + +## Story + +As a **blind or low-vision user relying on screen readers**, +I want all content and functionality to be announced correctly, +So that I can independently navigate and use the site. + +## Acceptance Criteria + +1. **Heading hierarchy**: All page headings announced with proper h1→h2→h3 hierarchy +2. **Landmarks**: Navigation, main, and contentinfo (footer) landmarks present on every page +3. **Form labels**: Every input has an associated `