diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..8c52ff9
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..aca3fa0
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,6 @@
+* text=auto eol=lf
+
+*.jpg binary
+*.jpeg binary
+*.png binary
+*.webp binary
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..d4cb2eb
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,39 @@
+version: 2
+
+updates:
+ - package-ecosystem: npm
+ directory: /
+ schedule:
+ interval: monthly
+ day: monday
+ time: "03:00"
+ timezone: Asia/Shanghai
+ open-pull-requests-limit: 5
+ groups:
+ development-dependencies:
+ dependency-type: development
+ patterns:
+ - "*"
+ commit-message:
+ prefix: chore
+ include: scope
+ labels:
+ - dependencies
+
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: monthly
+ day: monday
+ time: "03:30"
+ timezone: Asia/Shanghai
+ open-pull-requests-limit: 5
+ groups:
+ github-actions:
+ patterns:
+ - "*"
+ commit-message:
+ prefix: chore
+ include: scope
+ labels:
+ - dependencies
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..554426a
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,183 @@
+name: Verify and deploy
+
+on:
+ pull_request:
+ push:
+ branches:
+ - master
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: html-sample-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ validate:
+ name: Validate (${{ matrix.os }})
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-latest
+ - windows-latest
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+
+ - name: Set up Node.js
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version: 24
+ cache: npm
+
+ - name: Install locked dependencies
+ run: npm ci
+
+ - name: Run static checks
+ run: npm run check
+
+ - name: Run unit tests
+ run: npm run test:unit
+
+ - name: Audit high-severity dependencies
+ run: npm audit --audit-level=high
+
+ browser-linux:
+ name: Browser tests (Ubuntu)
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+
+ - name: Set up Node.js
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version: 24
+ cache: npm
+
+ - name: Install locked dependencies
+ run: npm ci
+
+ - name: Install browser engines
+ run: npx playwright install --with-deps chromium firefox webkit
+
+ - name: Run Linux browser and visual tests
+ run: npm run test:e2e:linux
+
+ - name: Upload browser diagnostics
+ if: failure()
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
+ with:
+ name: playwright-ubuntu
+ path: test-results/
+ if-no-files-found: ignore
+ retention-days: 7
+
+ browser-windows:
+ name: Browser tests (Windows)
+ runs-on: windows-latest
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+
+ - name: Set up Node.js
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version: 24
+ cache: npm
+
+ - name: Install locked dependencies
+ run: npm.cmd ci
+
+ - name: Install browser engines
+ run: npx.cmd playwright install chromium firefox
+
+ - name: Run Windows browser tests
+ run: npm.cmd run test:e2e:windows
+
+ - name: Upload browser diagnostics
+ if: failure()
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
+ with:
+ name: playwright-windows
+ path: test-results/
+ if-no-files-found: ignore
+ retention-days: 7
+
+ lighthouse:
+ name: Lighthouse budgets
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+
+ - name: Set up Node.js
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version: 24
+ cache: npm
+
+ - name: Install locked dependencies
+ run: npm ci
+
+ - name: Run Lighthouse
+ run: npm run test:lighthouse
+
+ - name: Upload Lighthouse reports
+ if: always()
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
+ with:
+ name: lighthouse
+ path: test-results/lighthouse/
+ if-no-files-found: ignore
+ retention-days: 7
+
+ deploy:
+ name: Deploy GitHub Pages
+ if: github.event_name == 'push' && github.ref == 'refs/heads/master'
+ needs:
+ - validate
+ - browser-linux
+ - browser-windows
+ - lighthouse
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ permissions:
+ contents: read
+ id-token: write
+ pages: write
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
+
+ - name: Set up Node.js
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
+ with:
+ node-version: 24
+ cache: npm
+
+ - name: Install locked dependencies
+ run: npm ci
+
+ - name: Build publish directory
+ run: npm run build
+
+ - name: Configure Pages
+ uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
+ with:
+ enablement: true
+
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
+ with:
+ path: _site
+
+ - name: Deploy Pages
+ id: deployment
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0d14236
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+node_modules/
+_site/
+test-results/
+playwright-report/
+.lighthouseci/
+
+.DS_Store
+Thumbs.db
+*.log
diff --git a/.htmlvalidate.json b/.htmlvalidate.json
new file mode 100644
index 0000000..c2f87de
--- /dev/null
+++ b/.htmlvalidate.json
@@ -0,0 +1,17 @@
+{
+ "extends": ["html-validate:recommended"],
+ "rules": {
+ "attribute-boolean-style": ["error", { "style": "omit" }],
+ "attribute-empty-style": ["error", { "style": "omit" }],
+ "doctype-style": ["error", { "style": "lowercase" }],
+ "no-inline-style": "error",
+ "no-redundant-role": "error",
+ "prefer-native-element": "error",
+ "void-style": ["error", { "style": "selfclosing" }],
+ "wcag/h30": "error",
+ "wcag/h32": "error",
+ "wcag/h37": "error",
+ "wcag/h63": "error",
+ "wcag/h71": "error"
+ }
+}
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..a45fd52
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+24
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..9b23623
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,9 @@
+node_modules/
+_site/
+test-results/
+playwright-report/
+.lighthouseci/
+
+assignment-1 2/css/Mutual evaluation.css
+assignment-1 2/css/hw1 - old.css
+assignment-1 2/css/hw1 - old2.css
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..8b6083f
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,19 @@
+# Changelog
+
+All notable changes to this project are documented here.
+
+## [Unreleased]
+
+### Added
+
+- Unified bilingual gallery entry point.
+- Accessible Learning Profile, Ultimate Field Notes, and Signal Conference examples.
+- Zero-data registration form demonstration.
+- Windows and Ubuntu CI, browser tests, visual snapshots, accessibility checks, and Lighthouse budgets.
+- GitHub Pages deployment workflow and project documentation.
+
+### Changed
+
+- Replaced remote and unverified media with locally owned artwork.
+- Rewrote course-derived copy and demo data with original content.
+- Preserved every historical public path while modernizing active pages.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..b28a3f7
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,56 @@
+# Contributing
+
+## Requirements
+
+- Node.js 24 LTS
+- npm supplied with Node.js
+- Current Chrome, Edge, and Firefox on Windows for the full local matrix
+
+Do not change Windows execution policy or environment variables for this project. In PowerShell, use `npm.cmd` when `npm.ps1` is disabled.
+
+## Workflow
+
+1. Create a focused branch from `master`.
+2. Install exactly from the lockfile with `npm.cmd ci`.
+3. Keep all existing compatibility paths available.
+4. Add or update tests under `test/`.
+5. Run the complete relevant test set before committing.
+6. Open a pull request and wait for Windows and Ubuntu checks to pass.
+
+## Required checks
+
+```powershell
+npm.cmd run check
+npm.cmd run test:unit
+npm.cmd run test:e2e:windows
+npm.cmd run test:lighthouse
+npm.cmd run build
+```
+
+Ubuntu CI additionally runs Chromium, Firefox, WebKit, mobile Chromium, and the committed screenshot baselines.
+
+## Visual snapshots
+
+Stable baselines live in `test/snapshots/`. Normal tests never overwrite them. Update them only after reviewing the visual change:
+
+```powershell
+npm.cmd run test:visual:update
+```
+
+Generated reports, failure screenshots, traces, and videos belong in `test-results/` and must not be committed.
+
+## Content and privacy
+
+- Use original copy and locally owned or clearly licensed assets.
+- Record any third-party material in `THIRD_PARTY_NOTICES.md`.
+- Do not add analytics, remote fonts, tracking pixels, form endpoints, cookies, or browser storage.
+- Keep external links deliberate, HTTPS-only, and limited to authoritative references.
+
+## HTML and accessibility
+
+- Preserve landmark and heading order.
+- Provide visible keyboard focus.
+- Use native elements before ARIA.
+- Give every form control a persistent label and useful error message.
+- Verify layouts at 200% zoom and with Windows forced colors.
+- Update `test/manual-accessibility.md` when behavior changes materially.
diff --git a/Html5-Final-Project.html b/Html5-Final-Project.html
index 44fd32b..d8c7cef 100644
--- a/Html5-Final-Project.html
+++ b/Html5-Final-Project.html
@@ -1,53 +1,171 @@
-
-
-
-
-
-
- Html5 Final Project
-
-
-
-
-
Wenlu Zhao
-
-
-
-
-
-
Favorite Foods
-
-
Apple
-
Pear
-
Banana
-
Peach
-
-
-
-
-
Achievements
-
Progress in this course (100%)
- Progress in the Specialization capstone (20%)
- Progress in life goals (40%)
-
-
-
-
More About Me
-
- My Childhood
-
I grew up in a small city in northern China. There is a small forest next to the house, and I often play there.
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Learning Profile · HTML Sample
+
+
+
+
+ Skip to main content
+
+
+
+
+
+
SEMANTIC HTML EXERCISE · 01
+
Learning the web, one meaningful element at a time.
+
+ A small profile for zhaowl94, built with native HTML
+ elements and progressive enhancement.
+
+
+
+
+
+
+
+
01 · Practice
+
Patterns worth repeating
+
+
+
+ A
+
Clear structure
+
+ Use headings, landmarks, and lists to make a page understandable
+ before adding visual polish.
+
+
+
+ B
+
Keyboard first
+
+ Every destination and disclosure should work without a mouse or
+ touch screen.
+
+
+
+ C
+
Resilient by default
+
+ Keep the core experience useful when scripts, networks, or
+ advanced browser features are unavailable.
+
+
+
+
+
+
+
+
02 · Progress
+
A learning snapshot
+
+
+
+
+ Semantic page structure
+ 100%
+
+
+
+
+
+ Responsive CSS systems
+ 72%
+
+
+
+
+
+ Automated accessibility testing
+ 58%
+
+
+
+
+
+
+
+
+
03 · Next
+
What comes after the markup?
+
+
+ Build for more ways of using the web
+
+
+ The next step is not another framework. It is learning how zoom,
+ high contrast, screen readers, slow networks, and different input
+ methods change the experience.
+
+
+ This repository uses those constraints as design inputs and
+ verifies them before publishing.
+
+ This short timeline highlights widely documented milestones rather
+ than attempting to catalogue every league, division, and event.
+
+
-
Background
-
Ultimate Frisbee/Ultimate has been around in some fashion since the 1960s. Joel Silver is credited with introducing the game to his high school in 1968 after learning about the game at summer camp. The game spread to more college campuses
- soon afterward.
-
The Ultimate Players Association was founded in 1979 and began organizing touraments across the country. In 2010, UPA because the USA Ultimate.
-
Other than professional tournaments, games of Ultimate are typically played without referess. Instead, players rely on "The Spirit of the Game" to encourage sportsmanship and self-officiating.
-
Sources
+
+
+
1968
+
+
The game takes shape
+
+ Students at Columbia High School in Maplewood, New Jersey,
+ establish the sport that becomes ultimate.
+
+
+
+
+
1979
+
+
A national organization forms
+
+ The Ultimate Players Association is founded, creating a
+ structure for organized competition in the United States.
+
+
+
+
+
1985
+
+
International coordination grows
+
+ The World Flying Disc Federation is founded to support flying
+ disc sports across national borders.
+
+
+
+
+
Today
+
+
Many formats, one shared spirit
+
+ Communities play on grass, sand, and indoor surfaces while
+ adapting field size and player counts to their setting.
+