diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 5a5aae0145ac97d..070b25ba71797ec 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,5 +1,8 @@
blank_issues_enabled: true
contact_links:
+ - name: Baseline issue
+ url: https://github.com/web-platform-dx/web-features
+ about: Baseline issues should be reported in the repository hosting Baseline data.
- name: Content or feature request
url: https://github.com/mdn/mdn/issues/new/choose
about: Propose new content for MDN Web Docs or submit a feature request using this link.
diff --git a/.github/workflows/markdown-lint-fix.yml b/.github/workflows/auto-cleanup-bot.yml
similarity index 69%
rename from .github/workflows/markdown-lint-fix.yml
rename to .github/workflows/auto-cleanup-bot.yml
index feaeb7893138064..25861b4ad0da310 100644
--- a/.github/workflows/markdown-lint-fix.yml
+++ b/.github/workflows/auto-cleanup-bot.yml
@@ -1,4 +1,4 @@
-name: Create Markdownlint auto-fix PR
+name: Create content auto-fix PR
on:
schedule:
@@ -34,25 +34,31 @@ jobs:
- name: Create PR with only fixable issues
if: success()
- uses: peter-evans/create-pull-request@v5
+ uses: peter-evans/create-pull-request@v6
with:
- commit-message: "chore: auto-fix Markdownlint issues"
+ commit-message: "chore: auto-fix Markdownlint, Prettier, and front-matter issues"
branch: markdownlint-auto-cleanup
- title: "Markdownlint auto-cleanup"
+ title: "fix: auto-cleanup by bot"
author: mdn-bot <108879845+mdn-bot@users.noreply.github.com>
+ committer: mdn-bot <108879845+mdn-bot@users.noreply.github.com>
body: |
All issues auto-fixed
+ labels: |
+ automated pr
token: ${{ secrets.AUTOMERGE_TOKEN }}
- name: Create PR with notice on unfixed issues
if: failure()
- uses: peter-evans/create-pull-request@v5
+ uses: peter-evans/create-pull-request@v6
with:
- commit-message: "chore: auto-fix Markdownlint issues"
+ commit-message: "chore: auto-fix Markdownlint, Prettier, and front-matter issues"
branch: markdownlint-auto-cleanup
- title: "Markdownlint auto-cleanup"
+ title: "fix: auto-cleanup by bot"
author: mdn-bot <108879845+mdn-bot@users.noreply.github.com>
+ committer: mdn-bot <108879845+mdn-bot@users.noreply.github.com>
body: |
Auto-fix was run, but additional issues found.
Please review the run log: https://github.com/mdn/content/actions/runs/${{ github.run_id }}
+ labels: |
+ automated pr
token: ${{ secrets.AUTOMERGE_TOKEN }}
diff --git a/.github/workflows/interfacedata-updater.yml b/.github/workflows/interfacedata-updater.yml
index 91c5e3afd221cdf..c02f95d3f87d9c9 100644
--- a/.github/workflows/interfacedata-updater.yml
+++ b/.github/workflows/interfacedata-updater.yml
@@ -22,6 +22,7 @@ jobs:
uses: actions/setup-node@v4
with:
node-version-file: "mdn-content/.nvmrc"
+ cache: yarn
- name: Checkout webref
uses: actions/checkout@v4
@@ -35,13 +36,16 @@ jobs:
run: node scripts/update-interface-data.js ../webref/
- name: Create pull request
- uses: peter-evans/create-pull-request@v5
+ uses: peter-evans/create-pull-request@v6
with:
path: mdn-content
token: ${{ secrets.AUTOMERGE_TOKEN }}
title: Update InterfaceData based on WebRef
author: mdn-bot <108879845+mdn-bot@users.noreply.github.com>
+ committer: mdn-bot <108879845+mdn-bot@users.noreply.github.com>
commit-message: Update InterfaceData based on WebRef
body: Automated changes generated by scripts/update-interface-data via interface-updater github workflow
+ labels: |
+ automated pr
delete-branch: true
branch: interfacedata-update
diff --git a/.github/workflows/issue-regex-labeler.yml b/.github/workflows/issue-regex-labeler.yml
index dd777a5c65711ea..a300a12f776ab69 100644
--- a/.github/workflows/issue-regex-labeler.yml
+++ b/.github/workflows/issue-regex-labeler.yml
@@ -7,7 +7,7 @@ jobs:
issue-labeler:
runs-on: ubuntu-latest
steps:
- - uses: github/issue-labeler@v3.3
+ - uses: github/issue-labeler@v3.4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
configuration-path: .github/issue-regex-labeler.yml
diff --git a/.github/workflows/on-demand-preview-build.yml b/.github/workflows/on-demand-preview-build.yml
index 2a09bf32dd84ee8..0dec5529814a03a 100644
--- a/.github/workflows/on-demand-preview-build.yml
+++ b/.github/workflows/on-demand-preview-build.yml
@@ -108,7 +108,7 @@ jobs:
# See https://www.peterbe.com/plog/install-python-poetry-github-actions-faster
- name: Load cached ~/.local
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ~/.local
# the trailing number is used to increase for getting
@@ -123,7 +123,7 @@ jobs:
- name: Load cached venv
id: cached-poetry-dependencies
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: yari/deployer/.venv
key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }}-${{ hashFiles('.github/workflows/pr-review-companion.yml') }}
diff --git a/.github/workflows/ping-other-repos.yml b/.github/workflows/ping-other-repos.yml
index c5a6dda65c42c30..a49d93c7fd083cb 100644
--- a/.github/workflows/ping-other-repos.yml
+++ b/.github/workflows/ping-other-repos.yml
@@ -22,7 +22,7 @@ jobs:
- name: Ping w3c/mdn-spec-links
# This is one of many possible repos we can ping. When adding other
# repos, you can follow this w3c/mdn-spec-links one as an example.
- uses: peter-evans/repository-dispatch@v2
+ uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.REPO_PINGER_MDN_SPEC_LINKS }}
repository: w3c/mdn-spec-links
diff --git a/.github/workflows/pr-check_redirects.yml b/.github/workflows/pr-check_redirects.yml
index 7338099f039100b..a2dd6e9c46ac8cc 100644
--- a/.github/workflows/pr-check_redirects.yml
+++ b/.github/workflows/pr-check_redirects.yml
@@ -21,7 +21,7 @@ jobs:
# This is a "required" workflow so path filtering can not be used:
# https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks
# We have to rely on a custom filtering mechanism to run the checks only if required files are modified.
- - uses: dorny/paths-filter@v2
+ - uses: dorny/paths-filter@v3
name: See if any file needs checking
id: filter
with:
diff --git a/.github/workflows/pr-check_url-issues.yml b/.github/workflows/pr-check_url-issues.yml
new file mode 100644
index 000000000000000..96398ea0f37e6b5
--- /dev/null
+++ b/.github/workflows/pr-check_url-issues.yml
@@ -0,0 +1,30 @@
+name: Check URL issues
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - "files/**/*.md"
+
+jobs:
+ check_url_issues:
+ #if: github.repository == 'mdn/content'
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Setup Node.js environment
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: ".nvmrc"
+ cache: yarn
+
+ - name: Check URL deletions and broken fragments
+ run: |
+ echo "::add-matcher::.github/workflows/url-issues-problem-matcher.json"
+ git fetch origin main
+ node scripts/log-url-issues.js --workflow
diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml
index ee022815cf67a7a..204899d098e0e1a 100644
--- a/.github/workflows/pr-labeler.yml
+++ b/.github/workflows/pr-labeler.yml
@@ -1,13 +1,48 @@
-name: "Pull request labeler"
+name: PR labeler
+
on:
- pull_request_target
+permissions:
+ issues: write
+ pull-requests: write
+ contents: read
+
jobs:
- triage:
+ # Docs: https://github.com/actions/labeler
+ label-by-path:
# do not run on forks
if: github.repository == 'mdn/content'
+ name: Label by path
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
+
+ # Docs: https://github.com/CodelyTV/pr-size-labeler
+ label-by-size:
+ # do not run on forks
+ if: github.repository == 'mdn/content'
+ needs: label-by-path
+ name: Label by size
+ runs-on: ubuntu-latest
+ steps:
+ - uses: codelytv/pr-size-labeler@v1
+ with:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ github_api_url: "https://api.github.com"
+ xs_label: "size/xs"
+ xs_max_size: "5"
+ s_label: "size/s"
+ s_max_size: "50"
+ m_label: "size/m"
+ m_max_size: "500"
+ l_label: "size/l"
+ l_max_size: "1000"
+ xl_label: "size/xl"
+ fail_if_xl: "false"
+ message_if_xl: ""
+ files_to_ignore: |
+ "files/en-us/_redirects.txt"
+ "files/en-us/_wikihistory.json"
diff --git a/.github/workflows/pr-review-companion.yml b/.github/workflows/pr-review-companion.yml
index dd84e0b469dd82b..4a1fcf3f4921b73 100644
--- a/.github/workflows/pr-review-companion.yml
+++ b/.github/workflows/pr-review-companion.yml
@@ -30,7 +30,7 @@ jobs:
# See https://www.peterbe.com/plog/install-python-poetry-github-actions-faster
- name: Load cached ~/.local
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ~/.local
# the trailing number is used to increase for getting
@@ -45,7 +45,7 @@ jobs:
- name: Load cached venv
id: cached-poetry-dependencies
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: yari/deployer/.venv
# the trailing number is used to increase for getting
diff --git a/.github/workflows/url-issues-problem-matcher.json b/.github/workflows/url-issues-problem-matcher.json
new file mode 100644
index 000000000000000..552686c42e47baf
--- /dev/null
+++ b/.github/workflows/url-issues-problem-matcher.json
@@ -0,0 +1,18 @@
+{
+ "problemMatcher": [
+ {
+ "owner": "log-url-issues",
+ "severity": "error",
+ "pattern": [
+ {
+ "regexp": "^(ERROR|WARN|INFO):(.+):(\\d+):(\\d+):(.+)$",
+ "severity": 1,
+ "file": 2,
+ "line": 3,
+ "column": 4,
+ "message": 5
+ }
+ ]
+ }
+ ]
+}
diff --git a/.husky/post-merge b/.husky/post-merge
new file mode 100644
index 000000000000000..292651593e42a37
--- /dev/null
+++ b/.husky/post-merge
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+
+BRANCH="$(git rev-parse --abbrev-ref HEAD)"
+if [ "$BRANCH" != "main" ]; then
+ exit 0
+fi
+
+if [ -f ".husky/_/history" ]; then
+ lastHash=$(cat ./.husky/_/history)
+ isUpdated=$(git diff $lastHash HEAD -- ./package.json)
+ if [ "$isUpdated" != "" ]; then
+ echo "\n⚠🔥 'package.json' has changed. Please run 'yarn install'! 🔥"
+ fi
+else
+ yarn install
+fi
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 36af219892fda8e..2312dc587f61186 100755
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,4 +1 @@
-#!/bin/sh
-. "$(dirname "$0")/_/husky.sh"
-
npx lint-staged
diff --git a/.husky/update-history b/.husky/update-history
new file mode 100644
index 000000000000000..8acaf333a7f745a
--- /dev/null
+++ b/.husky/update-history
@@ -0,0 +1,9 @@
+#!/usr/bin/env sh
+
+# This script stores the 'main' branch's HEAD commit hash in .husky/_/history
+# The stored commit hash is used by the post-merge script .husky/post-merge
+
+BRANCH="$(git rev-parse --abbrev-ref HEAD)"
+if [ "$BRANCH" = "main" -a -d "./.husky/_" ]; then
+ echo $(git rev-parse HEAD) > ./.husky/_/history
+fi
diff --git a/.lintstagedrc.json b/.lintstagedrc.json
index 9e259f12baf57f8..affa61f1dd480a6 100644
--- a/.lintstagedrc.json
+++ b/.lintstagedrc.json
@@ -3,8 +3,10 @@
"*.md": [
"markdownlint-cli2 --fix",
"node scripts/front-matter_linter.js --fix true",
+ "node scripts/update-moved-file-links.js --check",
"prettier --write"
],
"tests/**/*.*": "yarn test:front-matter-linter",
- "*.{svg,png,jpeg,jpg,gif}": "yarn filecheck"
+ "*.{svg,png,jpeg,jpg,gif}": "yarn filecheck",
+ "*": "node scripts/log-url-issues.js"
}
diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc
index 5e01c3a409f01ec..892510a33078fcb 100644
--- a/.markdownlint-cli2.jsonc
+++ b/.markdownlint-cli2.jsonc
@@ -1,7 +1,7 @@
{
"config": {
- "extends": "./.markdownlint.jsonc"
+ "extends": "./.markdownlint.jsonc",
},
"customRules": ["markdownlint-rule-search-replace"],
- "ignores": ["node_modules", ".git", ".github", "tests"]
+ "ignores": ["node_modules", ".git", ".github", "tests"],
}
diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc
index d07886f1046e24b..2ccae5139144109 100644
--- a/.markdownlint.jsonc
+++ b/.markdownlint.jsonc
@@ -7,29 +7,29 @@
// Disabled, as some callouts include headings.
"heading-increment": false,
"ul-style": {
- "style": "dash"
+ "style": "dash",
},
"ul-indent": {
- "indent": 2
+ "indent": 2,
},
"no-hard-tabs": {
- "spaces_per_tab": 2
+ "spaces_per_tab": 2,
},
"line-length": false,
"no-duplicate-heading": {
- "allow_different_nesting": true
+ "siblings_only": true,
},
"single-title": {
- "front_matter_title": "^\\s*title\\s*[:=]"
+ "front_matter_title": "^\\s*title\\s*[:=]",
},
"no-trailing-punctuation": {
- "punctuation": ".,;:"
+ "punctuation": ".,;:",
},
// Consecutive Notes/Callouts currently don't conform with this rule
"no-blanks-blockquote": false,
// Force ordered numbering to catch accidental list ending from indenting
"ol-prefix": {
- "style": "ordered"
+ "style": "ordered",
},
"no-inline-html": {
"allowed_elements": [
@@ -99,8 +99,8 @@
"thead",
"tr",
"ul",
- "var"
- ]
+ "var",
+ ],
},
"no-bare-urls": false,
// Produces too many false positives
@@ -109,13 +109,13 @@
// See https://github.com/mdn/content/pull/20026, as macros currently break this
"no-empty-links": false,
"code-block-style": {
- "style": "fenced"
+ "style": "fenced",
},
"emphasis-style": {
- "style": "underscore"
+ "style": "underscore",
},
"strong-style": {
- "style": "asterisk"
+ "style": "asterisk",
},
// Disabled, as yari generates link fragments by replacing spaces with underscores, not dashes.
"link-fragments": false,
@@ -128,90 +128,90 @@
"message": "Don't use curly double quotes",
"searchPattern": "/“|”/g",
"replace": "\"",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "curly-single-quotes",
"message": "Don't use curly single quotes",
"searchPattern": "/‘|’/g",
"replace": "'",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "nbsp",
"message": "Don't use no-break spaces",
"searchPattern": "/ /g",
"replace": " ",
- "searchScope": "all"
+ "searchScope": "all",
},
{
"name": "m-dash",
"message": "Don't use '--'. Use m-dash — instead",
"search": " -- ",
"replace": " — ",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "relative-link",
"message": "Internal links should start with '/'",
"searchPattern": "/([\\(\"])en-US\\/docs/g",
"replace": "$1/en-US/docs",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "relative-link-path",
"message": "Don't use relative paths",
"search": "](..",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "trailing-spaces",
"message": "Avoid trailing spaces",
"searchPattern": "/ +$/gm",
"replace": "",
- "searchScope": "all"
+ "searchScope": "all",
},
{
"name": "double-spaces",
"message": "Avoid double spaces",
"searchPattern": "/([^\\s>]) ([^\\s|])/g",
"replace": "$1 $2",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "stuck-definition",
"message": "Character is stuck to definition description marker",
"searchPattern": "/- :(\\w)/g",
"replace": "- : $1",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "fqdn-moz-links",
"message": "Don't use developer.mozilla.org for links, except for blog posts",
"searchPattern": "/\\]\\(https:\\/\\/developer.mozilla.org\\/(?!en-US\\/blog\\/)/g",
"replace": "](/",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "incorrect-spelling",
"message": "Incorrect spelling",
"searchPattern": ["/e-mail/ig", "/(w)eb site/ig"],
"replace": ["email", "$1ebsite"],
- "searchScope": "all"
+ "searchScope": "all",
},
{
"name": "localhost-links",
"message": "Don't use localhost for links",
"searchPattern": "/\\]\\(https?:\\/\\/localhost:\\d+\\//g",
"replace": "](/",
- "searchScope": "text"
+ "searchScope": "text",
},
{
"name": "un-closed-md-link",
- "message": "Missng closing bracket ')'",
+ "message": "Missing closing bracket ')'",
"searchPattern": "/(\\[[^\\]]*?\\]\\(([^\\)\\n]|\\([^\\)\\n]\\)|\\s[\"'])+?)(\\n|\\s|[,:][\\s\\n])/gm",
- "searchScope": "text"
- }
- ]
- }
+ "searchScope": "text",
+ },
+ ],
+ },
}
diff --git a/.vscode/cspell.json b/.vscode/cspell.json
index 3e0061fbdf88f76..0e7391244b949f4 100644
--- a/.vscode/cspell.json
+++ b/.vscode/cspell.json
@@ -68,5 +68,6 @@
"path": "./project-words.txt",
"addWords": true
}
- ]
+ ],
+ "enableFiletypes": ["xml"]
}
diff --git a/.vscode/project-words.txt b/.vscode/project-words.txt
index 827e5b55f869659..3b7b6d8e99f2076 100644
--- a/.vscode/project-words.txt
+++ b/.vscode/project-words.txt
@@ -6,6 +6,7 @@ bézier
Bhattacharya
Brosset
callouts
+cdylib
CEST
CIELAB
cjpeg
@@ -57,6 +58,7 @@ Paciello
prophoto
rgba
ripgrep
+rustc
sctp
srgb
tabak
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 97f7c737e8769c8..b5f7151e1cebeeb 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -223,7 +223,7 @@ To ensure that all MDN documents follow the same formatting, we use both [Pretti
If you have a [local checkout](#forking-and-cloning-the-repository) of the repository and have [installed the dependencies](#preparing-the-project), or you are using [github.dev](https://github.dev), a pre-commit hook will be installed which automatically runs while making a commit. To save some headache and improve your work flow while authoring, you may wish to [configure your editor to automatically run Prettier](https://prettier.io/docs/en/editors.html). Alternatively, you may run `yarn fix:md` in the command line to manually format all Markdown files.
-> **Note:** Automatically formatting changes does not work for pull requests opened using the GitHub Web UI as described in the ["Simple changes" section](#simple-changes). This may result in failed status checks on pull requests. If you're not sure about how to fix this, [get in touch with us](/en-US/docs/MDN/Community/Communication_channels) for help.
+> **Note:** Automatically formatting changes does not work for pull requests opened using the GitHub Web UI as described in the ["Simple changes" section](#simple-changes). This may result in failed status checks on pull requests. If you're not sure about how to fix this, [get in touch with us][]! for help.
### Adding a new document
@@ -274,7 +274,13 @@ Let's say you want to move the entire `/en-US/Learn/Accessibility` tree to `/en-
yarn content move Learn/Accessibility Learn/A11y
```
-3. Commit all of the changes and push your branch to the remote:
+3. Once files are moved we need to update references to those files in the other content files as well. Use following command to update all the references automatically in one go:
+
+ ```bash
+ node scripts/update-moved-file-links.js
+ ```
+
+4. Commit all the changes and push your branch to the remote:
```bash
git add .
@@ -413,7 +419,7 @@ There are some important rules of etiquette to remember that will help during th
When contributing to the content you agree to license your contributions
according to [our license](LICENSE.md).
-[contribute page]: https://developer.mozilla.org/en-US/docs/MDN/Contribute
+[contribute page]: https://developer.mozilla.org/en-US/docs/MDN/Community/Contributing
[getting started with mdn web docs]: https://developer.mozilla.org/en-US/docs/MDN/Community/Contributing/Getting_started
[getting ready to contribute]: https://developer.mozilla.org/en-US/docs/MDN/Community/Contributing/Getting_started#getting_ready_to_contribute
[how to write in markdown]: https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Howto/Markdown_in_MDN
diff --git a/files/en-us/_redirects.txt b/files/en-us/_redirects.txt
index 0578a1896bc58ad..855e0e46bc91fd6 100644
--- a/files/en-us/_redirects.txt
+++ b/files/en-us/_redirects.txt
@@ -114,7 +114,6 @@
/en-US/docs/Accessibility/Accessible_dynamic_content /en-US/docs/Web/Accessibility/An_overview_of_accessible_web_applications_and_widgets
/en-US/docs/Accessibility/Accessible_forms/alerts /en-US/docs/Web/Accessibility/ARIA
/en-US/docs/Accessibility/An_overview_of_accessible_web_applications_and_widgets /en-US/docs/Web/Accessibility/An_overview_of_accessible_web_applications_and_widgets
-/en-US/docs/Accessibility/Architecture /en-US/docs/Web/Accessibility/Architecture
/en-US/docs/Accessibility/Community /en-US/docs/Web/Accessibility
/en-US/docs/Accessibility/FAQ /en-US/docs/Web/Accessibility
/en-US/docs/Accessibility/HTML_To_MSAA /en-US/docs/Web/Accessibility
@@ -123,7 +122,6 @@
/en-US/docs/Accessibility/Keyboard-navigable_JavaScript_widgets /en-US/docs/Web/Accessibility/Keyboard-navigable_JavaScript_widgets
/en-US/docs/Accessibility/Web_Development /en-US/docs/Web/Accessibility
/en-US/docs/Accessibility/Web_applications_and_ARIA_FAQ /en-US/docs/Web/Accessibility/ARIA
-/en-US/docs/Accessibility:Architecture /en-US/docs/Web/Accessibility/Architecture
/en-US/docs/Accessibility:Community /en-US/docs/Web/Accessibility
/en-US/docs/Accessibility_FAQ /en-US/docs/Web/Accessibility
/en-US/docs/Accessibility_Information_for_Web_Authors /en-US/docs/Web/Accessibility/Information_for_Web_authors
@@ -606,7 +604,7 @@
/en-US/docs/CSS/background-position /en-US/docs/Web/CSS/background-position
/en-US/docs/CSS/background-repeat /en-US/docs/Web/CSS/background-repeat
/en-US/docs/CSS/background-size /en-US/docs/Web/CSS/background-size
-/en-US/docs/CSS/block_formatting_context /en-US/docs/Web/Guide/CSS/Block_formatting_context
+/en-US/docs/CSS/block_formatting_context /en-US/docs/Web/CSS/CSS_display/Block_formatting_context
/en-US/docs/CSS/border /en-US/docs/Web/CSS/border
/en-US/docs/CSS/border-bottom /en-US/docs/Web/CSS/border-bottom
/en-US/docs/CSS/border-bottom-color /en-US/docs/Web/CSS/border-bottom-color
@@ -801,7 +799,7 @@
/en-US/docs/CSS/repeating-radial-gradient /en-US/docs/Web/CSS/gradient/repeating-radial-gradient
/en-US/docs/CSS/resize /en-US/docs/Web/CSS/resize
/en-US/docs/CSS/resolution /en-US/docs/Web/CSS/resolution
-/en-US/docs/CSS/rgb /en-US/docs/Web/CSS/color_value#rgb()_and_rgba()
+/en-US/docs/CSS/rgb /en-US/docs/Web/CSS/color_value/rgb
/en-US/docs/CSS/right /en-US/docs/Web/CSS/right
/en-US/docs/CSS/scroll /en-US/docs/Web/CSS/overflow
/en-US/docs/CSS/shape /en-US/docs/Web/CSS/shape
@@ -986,7 +984,7 @@
/en-US/docs/CSS:background-image /en-US/docs/Web/CSS/background-image
/en-US/docs/CSS:background-position /en-US/docs/Web/CSS/background-position
/en-US/docs/CSS:background-repeat /en-US/docs/Web/CSS/background-repeat
-/en-US/docs/CSS:block_formatting_context /en-US/docs/Web/Guide/CSS/Block_formatting_context
+/en-US/docs/CSS:block_formatting_context /en-US/docs/Web/CSS/CSS_display/Block_formatting_context
/en-US/docs/CSS:border /en-US/docs/Web/CSS/border
/en-US/docs/CSS:border-bottom /en-US/docs/Web/CSS/border-bottom
/en-US/docs/CSS:border-bottom-color /en-US/docs/Web/CSS/border-bottom-color
@@ -1232,7 +1230,7 @@
/en-US/docs/DOM/DOM_event_reference/compositionstart /en-US/docs/Web/API/Element/compositionstart_event
/en-US/docs/DOM/DOM_event_reference/compositionupdate /en-US/docs/Web/API/Element/compositionupdate_event
/en-US/docs/DOM/DOM_event_reference/error /en-US/docs/Web/API/HTMLElement/error_event
-/en-US/docs/DOM/DOM_event_reference/input /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/DOM/DOM_event_reference/input /en-US/docs/Web/API/Element/input_event
/en-US/docs/DOM/DOM_event_reference/mouseenter /en-US/docs/Web/API/Element/mouseenter_event
/en-US/docs/DOM/DOM_event_reference/mouseleave /en-US/docs/Web/API/Element/mouseleave_event
/en-US/docs/DOM/DOM_event_reference/mousewheel /en-US/docs/Web/API/Element/mousewheel_event
@@ -1459,7 +1457,7 @@
/en-US/docs/DOM/Mozilla_event_reference/gamepadconnected /en-US/docs/Web/API/Window/gamepadconnected_event
/en-US/docs/DOM/Mozilla_event_reference/gamepaddisconnected /en-US/docs/Web/API/Window/gamepaddisconnected_event
/en-US/docs/DOM/Mozilla_event_reference/hashchange /en-US/docs/Web/API/Window/hashchange_event
-/en-US/docs/DOM/Mozilla_event_reference/input /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/DOM/Mozilla_event_reference/input /en-US/docs/Web/API/Element/input_event
/en-US/docs/DOM/Mozilla_event_reference/invalid /en-US/docs/Web/API/HTMLInputElement/invalid_event
/en-US/docs/DOM/Mozilla_event_reference/keydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/DOM/Mozilla_event_reference/keypress /en-US/docs/Web/API/Element/keypress_event
@@ -1574,7 +1572,6 @@
/en-US/docs/DOM/NodeList /en-US/docs/Web/API/NodeList
/en-US/docs/DOM/NodeList.item /en-US/docs/Web/API/NodeList/item
/en-US/docs/DOM/NodeList.item2 /en-US/docs/Web/API/NodeList/item
-/en-US/docs/DOM/NotifyAudioAvailableEvent /en-US/docs/Web/API/NotifyAudioAvailableEvent
/en-US/docs/DOM/Option /en-US/docs/Web/API/HTMLOptionElement/Option
/en-US/docs/DOM/Orientation_and_motion_data_explained /en-US/docs/Web/API/Device_orientation_events/Orientation_and_motion_data_explained
/en-US/docs/DOM/PannerNode /en-US/docs/Web/API/PannerNode
@@ -2099,7 +2096,6 @@
/en-US/docs/DOM/window.content /en-US/docs/Web/API/Window
/en-US/docs/DOM/window.crypto /en-US/docs/Web/API/crypto_property
/en-US/docs/DOM/window.crypto.getRandomValues /en-US/docs/Web/API/Crypto/getRandomValues
-/en-US/docs/DOM/window.defaultStatus /en-US/docs/Web/API/Window/defaultStatus
/en-US/docs/DOM/window.document /en-US/docs/Web/API/Window/document
/en-US/docs/DOM/window.dump /en-US/docs/Web/API/Window/dump
/en-US/docs/DOM/window.escape /en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
@@ -2177,7 +2173,7 @@
/en-US/docs/DOM/window.onerror /en-US/docs/Web/API/Window/error_event
/en-US/docs/DOM/window.onfocus /en-US/docs/Web/API/Window/focus_event
/en-US/docs/DOM/window.onhashchange /en-US/docs/Web/API/Window/hashchange_event
-/en-US/docs/DOM/window.oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/DOM/window.oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/DOM/window.onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/DOM/window.onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/DOM/window.onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -2559,7 +2555,6 @@
/en-US/docs/DOM:window.confirm /en-US/docs/Web/API/Window/confirm
/en-US/docs/DOM:window.content /en-US/docs/Web/API/Window
/en-US/docs/DOM:window.crypto /en-US/docs/Web/API/crypto_property
-/en-US/docs/DOM:window.defaultStatus /en-US/docs/Web/API/Window/defaultStatus
/en-US/docs/DOM:window.document /en-US/docs/Web/API/Window/document
/en-US/docs/DOM:window.dump /en-US/docs/Web/API/Window/dump
/en-US/docs/DOM:window.escape /en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
@@ -2896,7 +2891,6 @@
/en-US/docs/Document_Object_Model_(DOM)/NodeIterator.root /en-US/docs/Web/API/NodeIterator/root
/en-US/docs/Document_Object_Model_(DOM)/NodeIterator.whatToShow /en-US/docs/Web/API/NodeIterator/whatToShow
/en-US/docs/Document_Object_Model_(DOM)/NodeList /en-US/docs/Web/API/NodeList
-/en-US/docs/Document_Object_Model_(DOM)/NotifyAudioAvailableEvent /en-US/docs/Web/API/NotifyAudioAvailableEvent
/en-US/docs/Document_Object_Model_(DOM)/Orientation_and_motion_data_explained /en-US/docs/Web/API/Device_orientation_events/Orientation_and_motion_data_explained
/en-US/docs/Document_Object_Model_(DOM)/Plugin /en-US/docs/Web/API/Plugin
/en-US/docs/Document_Object_Model_(DOM)/PluginArray /en-US/docs/Web/API/PluginArray
@@ -3274,7 +3268,6 @@
/en-US/docs/Document_Object_Model_(DOM)/window.content /en-US/docs/Web/API/Window
/en-US/docs/Document_Object_Model_(DOM)/window.crypto /en-US/docs/Web/API/crypto_property
/en-US/docs/Document_Object_Model_(DOM)/window.crypto.getRandomValues /en-US/docs/Web/API/Crypto/getRandomValues
-/en-US/docs/Document_Object_Model_(DOM)/window.defaultStatus /en-US/docs/Web/API/Window/defaultStatus
/en-US/docs/Document_Object_Model_(DOM)/window.document /en-US/docs/Web/API/Window/document
/en-US/docs/Document_Object_Model_(DOM)/window.escape /en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
/en-US/docs/Document_Object_Model_(DOM)/window.forward /en-US/docs/Web/API/Window/forward
@@ -3330,7 +3323,7 @@
/en-US/docs/Document_Object_Model_(DOM)/window.onerror /en-US/docs/Web/API/Window/error_event
/en-US/docs/Document_Object_Model_(DOM)/window.onfocus /en-US/docs/Web/API/Window/focus_event
/en-US/docs/Document_Object_Model_(DOM)/window.onhashchange /en-US/docs/Web/API/Window/hashchange_event
-/en-US/docs/Document_Object_Model_(DOM)/window.oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Document_Object_Model_(DOM)/window.oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Document_Object_Model_(DOM)/window.onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Document_Object_Model_(DOM)/window.onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Document_Object_Model_(DOM)/window.onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -4003,7 +3996,7 @@
/en-US/docs/IMAP /en-US/docs/Glossary/IMAP
/en-US/docs/IPv6 /en-US/docs/Glossary/IPv6
/en-US/docs/Inbox/Advance_HTML_Tags /en-US/docs/Learn/Common_questions/Design_and_accessibility/HTML_features_for_accessibility
-/en-US/docs/Inbox/Advanced_layouts_with_flexbox /en-US/docs/Web/CSS/CSS_flexible_box_layout/Backwards_compatibility_of_flexbox
+/en-US/docs/Inbox/Advanced_layouts_with_flexbox /en-US/docs/Glossary/Flexbox
/en-US/docs/Inbox/Using_flexbox_to_lay_out_web_applications /en-US/docs/Web/CSS/CSS_flexible_box_layout/Typical_use_cases_of_flexbox
/en-US/docs/Inbox/Writing_a_WebSocket_server_in_Java /en-US/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java
/en-US/docs/Incorrect_MIME_Type_for_CSS_Files /en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types
@@ -5156,7 +5149,7 @@
/en-US/docs/JavaScript_typed_arrays/Uint16Array /en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array
/en-US/docs/JavaScript_typed_arrays/Uint32Array /en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array
/en-US/docs/JavaScript_typed_arrays/Uint8Array /en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
-/en-US/docs/Learn/Advanced_layouts_with_flexbox /en-US/docs/Web/CSS/CSS_flexible_box_layout/Backwards_compatibility_of_flexbox
+/en-US/docs/Learn/Advanced_layouts_with_flexbox /en-US/docs/Glossary/Flexbox
/en-US/docs/Learn/Anatomy_of_a_web_page /en-US/docs/Learn/Common_questions/Design_and_accessibility/Common_web_layouts
/en-US/docs/Learn/CSS/Basic_text_styling_in_CSS /en-US/docs/Learn/CSS/Styling_text/Fundamentals
/en-US/docs/Learn/CSS/Basics /en-US/docs/Learn/CSS/First_steps
@@ -5403,11 +5396,15 @@
/en-US/docs/Liberty!_Equality!_Validity! /en-US/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML
/en-US/docs/Link_prefetching_FAQ /en-US/docs/Glossary/Prefetch
/en-US/docs/Localization /en-US/docs/Glossary/Localization
-/en-US/docs/MDC:How_to_Help /en-US/docs/MDN/Contribute
+/en-US/docs/MDC:How_to_Help /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/About /en-US/docs/MDN/Writing_guidelines
-/en-US/docs/MDN/At_ten/Contributing_to_MDN /en-US/docs/MDN/Contribute
+/en-US/docs/MDN/At_ten/Contributing_to_MDN /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Community/Issues/Issue_triage /en-US/docs/MDN/Community/Issues
+/en-US/docs/MDN/Community/MDN_content /en-US/docs/MDN/Community/Contributing
+/en-US/docs/MDN/Community/MDN_content/Issues /en-US/docs/MDN/Community/Issues
+/en-US/docs/MDN/Community/MDN_content/Pull_requests /en-US/docs/MDN/Community/Pull_requests
/en-US/docs/MDN/Community/Users_teams /en-US/docs/MDN/Community/Roles_teams
+/en-US/docs/MDN/Contribute /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Contribute/Changelog /en-US/docs/MDN/Changelog
/en-US/docs/MDN/Contribute/Code_sample_guidelines /en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide
/en-US/docs/MDN/Contribute/Content /en-US/docs/MDN/Writing_guidelines
@@ -5417,15 +5414,15 @@
/en-US/docs/MDN/Contribute/Content/Layout/Reference_page /en-US/docs/MDN/Writing_guidelines/Howto/Write_an_API_reference
/en-US/docs/MDN/Contribute/Content/Layout/Reference_subpage /en-US/docs/MDN/Writing_guidelines/Howto/Write_an_API_reference
/en-US/docs/MDN/Contribute/Content/Macros /en-US/docs/MDN/Writing_guidelines/Page_structures/Macros
-/en-US/docs/MDN/Contribute/Content/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Quicklinks
+/en-US/docs/MDN/Contribute/Content/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Sidebars
/en-US/docs/MDN/Contribute/Content/Specification_tables /en-US/docs/MDN/Writing_guidelines/Page_structures/Specification_tables
/en-US/docs/MDN/Contribute/Content/Style_guide /en-US/docs/MDN/Writing_guidelines/Writing_style_guide
/en-US/docs/MDN/Contribute/Creating_and_editing_pages /en-US/docs/MDN/Writing_guidelines/Howto/Creating_moving_deleting
/en-US/docs/MDN/Contribute/Does_this_belong /en-US/docs/MDN/Writing_guidelines/What_we_write
/en-US/docs/MDN/Contribute/Editor/Live_samples /en-US/docs/MDN/Writing_guidelines/Page_structures/Live_samples
-/en-US/docs/MDN/Contribute/FAQ /en-US/docs/MDN/Contribute
+/en-US/docs/MDN/Contribute/FAQ /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Contribute/Feedback /en-US/docs/MDN/Community
-/en-US/docs/MDN/Contribute/Fixing_MDN_content_bugs /en-US/docs/MDN/Community/MDN_content
+/en-US/docs/MDN/Contribute/Fixing_MDN_content_bugs /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Contribute/Getting_started /en-US/docs/MDN/Community/Contributing/Getting_started
/en-US/docs/MDN/Contribute/GitHub_beginners /en-US/docs/MDN/Community/Contributing/Getting_started
/en-US/docs/MDN/Contribute/GitHub_best_practices /en-US/docs/MDN/Community/Issues
@@ -5450,14 +5447,14 @@
/en-US/docs/MDN/Contribute/Guidelines/Layout/Reference_page /en-US/docs/MDN/Writing_guidelines/Howto/Write_an_API_reference
/en-US/docs/MDN/Contribute/Guidelines/Layout/Reference_subpage /en-US/docs/MDN/Writing_guidelines/Howto/Write_an_API_reference
/en-US/docs/MDN/Contribute/Guidelines/Macros /en-US/docs/MDN/Writing_guidelines/Page_structures/Macros
-/en-US/docs/MDN/Contribute/Guidelines/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Quicklinks
+/en-US/docs/MDN/Contribute/Guidelines/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Sidebars
/en-US/docs/MDN/Contribute/Guidelines/Specification_tables /en-US/docs/MDN/Writing_guidelines/Page_structures/Specification_tables
/en-US/docs/MDN/Contribute/Guidelines/Style_guide /en-US/docs/MDN/Writing_guidelines/Writing_style_guide
/en-US/docs/MDN/Contribute/Guidelines/Video /en-US/docs/MDN/Writing_guidelines/Howto/Images_media
/en-US/docs/MDN/Contribute/Guidelines/Writing_style_guide /en-US/docs/MDN/Writing_guidelines/Writing_style_guide
/en-US/docs/MDN/Contribute/Help_beginners /en-US/docs/MDN/Community/Learn_forum
/en-US/docs/MDN/Contribute/How_to_document_a_CSS_property /en-US/docs/MDN/Writing_guidelines/Howto/Document_a_CSS_property
-/en-US/docs/MDN/Contribute/Howto /en-US/docs/MDN/Contribute
+/en-US/docs/MDN/Contribute/Howto /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Contribute/Howto/Add_or_update_browser_compatibility_data https://github.com/mdn/browser-compat-data/blob/main/docs/contributing.md
/en-US/docs/MDN/Contribute/Howto/Compatibility_tables /en-US/docs/MDN/Writing_guidelines/Page_structures/Compatibility_tables
/en-US/docs/MDN/Contribute/Howto/Convert_code_samples_to_be_live /en-US/docs/MDN/Writing_guidelines/Page_structures/Live_samples
@@ -5480,11 +5477,13 @@
/en-US/docs/MDN/Contribute/Localize /en-US/docs/MDN/Community/Contributing/Translated_content
/en-US/docs/MDN/Contribute/Markdown_in_MDN /en-US/docs/MDN/Writing_guidelines/Howto/Markdown_in_MDN
/en-US/docs/MDN/Contribute/Open_source_etiquette /en-US/docs/MDN/Community/Open_source_etiquette
+/en-US/docs/MDN/Contribute/Processes /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Contribute/Processes/Content_bug_triage /en-US/docs/MDN/Community/Issues
/en-US/docs/MDN/Contribute/Processes/Locating_browser-specific_information https://github.com/mdn/browser-compat-data/blob/main/docs/matching-browser-releases/index.md
/en-US/docs/MDN/Contribute/Processes/Matching_features_to_browser_version https://github.com/mdn/browser-compat-data/blob/main/docs/matching-browser-releases/index.md
/en-US/docs/MDN/Contribute/Processes/Matching_features_to_browser_versiosn https://github.com/mdn/browser-compat-data/blob/main/docs/matching-browser-releases/index.md
-/en-US/docs/MDN/Contribute/Processes/Short_surveys /en-US/docs/MDN/Contribute
+/en-US/docs/MDN/Contribute/Processes/Short_surveys /en-US/docs/MDN/Community/Contributing
+/en-US/docs/MDN/Contribute/Processes/Workstream_assessment_project /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN/Contribute/Sample_app_coding_guidelines /en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide
/en-US/docs/MDN/Contribute/Sample_server /en-US/docs/MDN
/en-US/docs/MDN/Contribute/Structures /en-US/docs/MDN/Writing_guidelines/Page_structures
@@ -5513,7 +5512,7 @@
/en-US/docs/MDN/Contribute/Structures/Page_types/HTML_element_page_template /en-US/docs/MDN/Writing_guidelines/Page_structures/Page_types/HTML_element_page_template
/en-US/docs/MDN/Contribute/Structures/Page_types/HTTP_header_page_template /en-US/docs/MDN/Writing_guidelines/Page_structures/Page_types/HTTP_header_page_template
/en-US/docs/MDN/Contribute/Structures/Page_types/SVG_element_page_template /en-US/docs/MDN/Writing_guidelines/Page_structures/Page_types/SVG_element_page_template
-/en-US/docs/MDN/Contribute/Structures/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Quicklinks
+/en-US/docs/MDN/Contribute/Structures/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Sidebars
/en-US/docs/MDN/Contribute/Structures/Specification_tables /en-US/docs/MDN/Writing_guidelines/Page_structures/Specification_tables
/en-US/docs/MDN/Contribute/Structures/Syntax_sections /en-US/docs/MDN/Writing_guidelines/Page_structures/Syntax_sections
/en-US/docs/MDN/Contribute/Style_guide /en-US/docs/MDN/Writing_guidelines
@@ -5522,7 +5521,7 @@
/en-US/docs/MDN/Contribute/Style_guide/Custom_macros /en-US/docs/MDN/Writing_guidelines/Page_structures/Macros/Commonly_used_macros
/en-US/docs/MDN/Contribute/Style_guide/Live_samples /en-US/docs/MDN/Writing_guidelines/Page_structures/Live_samples
/en-US/docs/MDN/Contribute/Style_guide/Macros /en-US/docs/MDN/Writing_guidelines/Page_structures/Macros
-/en-US/docs/MDN/Contribute/Style_guide/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Quicklinks
+/en-US/docs/MDN/Contribute/Style_guide/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Sidebars
/en-US/docs/MDN/Contribute/Style_guide/Specification_tables /en-US/docs/MDN/Writing_guidelines/Page_structures/Specification_tables
/en-US/docs/MDN/Contribute/Tagging /en-US/docs/MDN/Writing_guidelines/Howto
/en-US/docs/MDN/Contribute/Tasks /en-US/docs/MDN/Community/Contributing/Getting_started
@@ -5590,7 +5589,7 @@
/en-US/docs/MDN/Structures/Page_types/HTML_element_page_template /en-US/docs/MDN/Writing_guidelines/Page_structures/Page_types/HTML_element_page_template
/en-US/docs/MDN/Structures/Page_types/HTTP_header_page_template /en-US/docs/MDN/Writing_guidelines/Page_structures/Page_types/HTTP_header_page_template
/en-US/docs/MDN/Structures/Page_types/SVG_element_page_template /en-US/docs/MDN/Writing_guidelines/Page_structures/Page_types/SVG_element_page_template
-/en-US/docs/MDN/Structures/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Quicklinks
+/en-US/docs/MDN/Structures/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Sidebars
/en-US/docs/MDN/Structures/Specification_tables /en-US/docs/MDN/Writing_guidelines/Page_structures/Specification_tables
/en-US/docs/MDN/Structures/Syntax_sections /en-US/docs/MDN/Writing_guidelines/Page_structures/Syntax_sections
/en-US/docs/MDN/Tools https://github.com/mdn/yari/tree/main/docs
@@ -5603,11 +5602,12 @@
/en-US/docs/MDN/User_guide/Troubleshooting_KumaScript_errors https://github.com/mdn/yari/tree/main/docs/kumascript/troubleshooting-errors.md
/en-US/docs/MDN/Writing_guidelines/Creating_moving_deleting /en-US/docs/MDN/Writing_guidelines/Howto/Creating_moving_deleting
/en-US/docs/MDN/Writing_guidelines/Howto/Tag /en-US/docs/MDN/Writing_guidelines/Howto
+/en-US/docs/MDN/Writing_guidelines/Page_structures/Quicklinks /en-US/docs/MDN/Writing_guidelines/Page_structures/Sidebars
/en-US/docs/MDN/Writing_guidelines/Research_technology /en-US/docs/MDN/Writing_guidelines/Howto/Research_technology
/en-US/docs/MDN/Writing_guidelines/What_we_write/Inclusion_criteria /en-US/docs/MDN/Writing_guidelines/What_we_write/Criteria_for_inclusion
/en-US/docs/MDN/Yari https://github.com/mdn/yari/tree/main/docs
/en-US/docs/MDN_at_ten /en-US/docs/MDN/At_ten
-/en-US/docs/MDN_at_ten/Contributing_to_MDN /en-US/docs/MDN/Contribute
+/en-US/docs/MDN_at_ten/Contributing_to_MDN /en-US/docs/MDN/Community/Contributing
/en-US/docs/MDN_at_ten/History /en-US/docs/MDN/At_ten/History_of_MDN
/en-US/docs/MDN_at_ten/History_of_MDN /en-US/docs/MDN/At_ten/History_of_MDN
/en-US/docs/Main_page /en-US/
@@ -5660,7 +5660,7 @@
/en-US/docs/Media_Streams_API /en-US/docs/Web/API/Media_Capture_and_Streams_API
/en-US/docs/Media_formats_supported_by_the_audio_and_video_elements /en-US/docs/Web/Media/Formats
/en-US/docs/Memory_Sanitizer https://firefox-source-docs.mozilla.org/tools/sanitizer/memory_sanitizer.html#memory-sanitizer
-/en-US/docs/Mobile/Mobile_Web_Development /en-US/docs/Web/Guide/Mobile
+/en-US/docs/Mobile/Mobile_Web_Development /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
/en-US/docs/MouseEvent.initMouseEvent /en-US/docs/Web/API/MouseEvent/initMouseEvent
/en-US/docs/Mozilla's_Quirks_Mode /en-US/docs/Web/HTML/Quirks_Mode_and_Standards_Mode
/en-US/docs/Mozilla/Add-ons/AMO/Policy https://extensionworkshop.com/documentation/publish/add-on-policies/
@@ -6269,7 +6269,7 @@
/en-US/docs/Mozilla_event_reference/gamepadconnected /en-US/docs/Web/API/Window/gamepadconnected_event
/en-US/docs/Mozilla_event_reference/gamepaddisconnected /en-US/docs/Web/API/Window/gamepaddisconnected_event
/en-US/docs/Mozilla_event_reference/hashchange /en-US/docs/Web/API/Window/hashchange_event
-/en-US/docs/Mozilla_event_reference/input /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Mozilla_event_reference/input /en-US/docs/Web/API/Element/input_event
/en-US/docs/Mozilla_event_reference/invalid /en-US/docs/Web/API/HTMLInputElement/invalid_event
/en-US/docs/Mozilla_event_reference/keydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Mozilla_event_reference/keypress /en-US/docs/Web/API/Element/keypress_event
@@ -6497,8 +6497,6 @@
/en-US/docs/SVG/Attribute/color-interpolation /en-US/docs/Web/SVG/Attribute/color-interpolation
/en-US/docs/SVG/Attribute/color-interpolation-filters /en-US/docs/Web/SVG/Attribute/color-interpolation-filters
/en-US/docs/SVG/Attribute/color-profile /en-US/docs/Web/SVG/Attribute/color-profile
-/en-US/docs/SVG/Attribute/contentScriptType /en-US/docs/Web/SVG/Attribute/contentScriptType
-/en-US/docs/SVG/Attribute/contentStyleType /en-US/docs/Web/SVG/Attribute/contentStyleType
/en-US/docs/SVG/Attribute/cursor /en-US/docs/Web/SVG/Attribute/cursor
/en-US/docs/SVG/Attribute/cx /en-US/docs/Web/SVG/Attribute/cx
/en-US/docs/SVG/Attribute/cy /en-US/docs/Web/SVG/Attribute/cy
@@ -6518,7 +6516,6 @@
/en-US/docs/SVG/Attribute/fill-opacity /en-US/docs/Web/SVG/Attribute/fill-opacity
/en-US/docs/SVG/Attribute/fill-rule /en-US/docs/Web/SVG/Attribute/fill-rule
/en-US/docs/SVG/Attribute/filter /en-US/docs/Web/SVG/Attribute/filter
-/en-US/docs/SVG/Attribute/filterRes /en-US/docs/Web/SVG/Attribute/filterRes
/en-US/docs/SVG/Attribute/filterUnits /en-US/docs/Web/SVG/Attribute/filterUnits
/en-US/docs/SVG/Attribute/flood-color /en-US/docs/Web/SVG/Attribute/flood-color
/en-US/docs/SVG/Attribute/flood-opacity /en-US/docs/Web/SVG/Attribute/flood-opacity
@@ -7589,7 +7586,6 @@
/en-US/docs/Web/API/BlobBuilder /en-US/docs/Web/API/Blob
/en-US/docs/Web/API/BlobEvent.BlobEvent /en-US/docs/Web/API/BlobEvent/BlobEvent
/en-US/docs/Web/API/BlobEvent.data /en-US/docs/Web/API/BlobEvent/data
-/en-US/docs/Web/API/Bluetooth/onavailabilitychanged /en-US/docs/Web/API/Bluetooth/availabilitychanged_event
/en-US/docs/Web/API/BluetoothAdvertisingData /en-US/docs/Web/API/Web_Bluetooth_API
/en-US/docs/Web/API/BluetoothAdvertisingData/appearance /en-US/docs/Web/API/Web_Bluetooth_API
/en-US/docs/Web/API/BluetoothAdvertisingData/manufacturerData /en-US/docs/Web/API/Web_Bluetooth_API
@@ -7962,6 +7958,7 @@
/en-US/docs/Web/API/Document/keydown_event /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/Document/keypress_event /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Web/API/Document/keyup_event /en-US/docs/Web/API/Element/keyup_event
+/en-US/docs/Web/API/Document/lostpointercapture_event /en-US/docs/Web/API/Element/lostpointercapture_event
/en-US/docs/Web/API/Document/mozCancelFullScreen /en-US/docs/Web/API/Document/exitFullscreen
/en-US/docs/Web/API/Document/mozFullScreenElement /en-US/docs/Web/API/Document/fullscreenElement
/en-US/docs/Web/API/Document/mozFullScreenEnabled /en-US/docs/Web/API/Document/fullscreenEnabled
@@ -7978,7 +7975,7 @@
/en-US/docs/Web/API/Document/onfocus /en-US/docs/Web/API/Window/focus_event
/en-US/docs/Web/API/Document/onfullscreenchange /en-US/docs/Web/API/Document/fullscreenchange_event
/en-US/docs/Web/API/Document/onfullscreenerror /en-US/docs/Web/API/Document/fullscreenerror_event
-/en-US/docs/Web/API/Document/oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/Document/oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/Document/onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/Document/onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Web/API/Document/onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -8266,7 +8263,7 @@
/en-US/docs/Web/API/GlobalEventHandlers.ondblclick /en-US/docs/Web/API/Element/dblclick_event
/en-US/docs/Web/API/GlobalEventHandlers.onerror /en-US/docs/Web/API/Window/error_event
/en-US/docs/Web/API/GlobalEventHandlers.onfocus /en-US/docs/Web/API/Window/focus_event
-/en-US/docs/Web/API/GlobalEventHandlers.oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/GlobalEventHandlers.oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/GlobalEventHandlers.onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/GlobalEventHandlers.onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Web/API/GlobalEventHandlers.onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -8327,7 +8324,7 @@
/en-US/docs/Web/API/GlobalEventHandlers/onfocus /en-US/docs/Web/API/Window/focus_event
/en-US/docs/Web/API/GlobalEventHandlers/onformdata /en-US/docs/Web/API/HTMLFormElement/formdata_event
/en-US/docs/Web/API/GlobalEventHandlers/ongotpointercapture /en-US/docs/Web/API/Element/gotpointercapture_event
-/en-US/docs/Web/API/GlobalEventHandlers/oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/GlobalEventHandlers/oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/GlobalEventHandlers/oninvalid /en-US/docs/Web/API/HTMLInputElement/invalid_event
/en-US/docs/Web/API/GlobalEventHandlers/onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/GlobalEventHandlers/onkeypress /en-US/docs/Web/API/Element/keypress_event
@@ -8411,7 +8408,7 @@
/en-US/docs/Web/API/HTMLContentElement.select /en-US/docs/Web/API/HTMLSlotElement
/en-US/docs/Web/API/HTMLContentElement/getDistributedNodes /en-US/docs/Web/API/HTMLSlotElement
/en-US/docs/Web/API/HTMLContentElement/select /en-US/docs/Web/API/HTMLSlotElement
-/en-US/docs/Web/API/HTMLDialogElement/cancel /en-US/docs/Web/API/HTMLElement/cancel_event
+/en-US/docs/Web/API/HTMLDialogElement/cancel_event /en-US/docs/Web/API/HTMLElement/cancel_event
/en-US/docs/Web/API/HTMLDialogElement/close() /en-US/docs/Web/API/HTMLDialogElement/close
/en-US/docs/Web/API/HTMLDialogElement/returnValue() /en-US/docs/Web/API/HTMLDialogElement/returnValue
/en-US/docs/Web/API/HTMLDialogElement/show() /en-US/docs/Web/API/HTMLDialogElement/show
@@ -8442,8 +8439,10 @@
/en-US/docs/Web/API/HTMLElement/animationend_event /en-US/docs/Web/API/Element/animationend_event
/en-US/docs/Web/API/HTMLElement/animationiteration_event /en-US/docs/Web/API/Element/animationiteration_event
/en-US/docs/Web/API/HTMLElement/animationstart_event /en-US/docs/Web/API/Element/animationstart_event
+/en-US/docs/Web/API/HTMLElement/beforeinput_event /en-US/docs/Web/API/Element/beforeinput_event
/en-US/docs/Web/API/HTMLElement/forceSpellCheck /en-US/docs/Web/HTML/Global_attributes/spellcheck
/en-US/docs/Web/API/HTMLElement/gotpointercapture_event /en-US/docs/Web/API/Element/gotpointercapture_event
+/en-US/docs/Web/API/HTMLElement/input_event /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/HTMLElement/invalid_event /en-US/docs/Web/API/HTMLInputElement/invalid_event
/en-US/docs/Web/API/HTMLElement/lostpointercapture_event /en-US/docs/Web/API/Element/lostpointercapture_event
/en-US/docs/Web/API/HTMLElement/onabort /en-US/docs/Web/API/HTMLMediaElement/abort_event
@@ -8455,7 +8454,7 @@
/en-US/docs/Web/API/HTMLElement/oncut /en-US/docs/Web/API/HTMLElement/cut_event
/en-US/docs/Web/API/HTMLElement/ondblclick /en-US/docs/Web/API/Element/dblclick_event
/en-US/docs/Web/API/HTMLElement/onfocus /en-US/docs/Web/API/Window/focus_event
-/en-US/docs/Web/API/HTMLElement/oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/HTMLElement/oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/HTMLElement/onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/HTMLElement/onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Web/API/HTMLElement/onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -8560,6 +8559,7 @@
/en-US/docs/Web/API/HTMLSelectElement/HTMLSelectElement.disabled /en-US/docs/Web/API/HTMLSelectElement/disabled
/en-US/docs/Web/API/HTMLSelectElement/HTMLSelectElement.form /en-US/docs/Web/API/HTMLSelectElement/form
/en-US/docs/Web/API/HTMLSelectElement/HTMLSelectElement.selectedIndex /en-US/docs/Web/API/HTMLSelectElement/selectedIndex
+/en-US/docs/Web/API/HTMLSelectElement/autofocus /en-US/docs/Web/API/HTMLElement/autofocus
/en-US/docs/Web/API/HTMLStyleElement.media /en-US/docs/Web/API/HTMLStyleElement/media
/en-US/docs/Web/API/HTMLStyleElement.scoped /en-US/docs/Web/API/HTMLStyleElement
/en-US/docs/Web/API/HTMLStyleElement.type /en-US/docs/Web/API/HTMLStyleElement/type
@@ -8617,6 +8617,7 @@
/en-US/docs/Web/API/Headers/getAll /en-US/docs/Web/API/Headers/get
/en-US/docs/Web/API/History.length /en-US/docs/Web/API/History/length
/en-US/docs/Web/API/History_API/Example /en-US/docs/Web/API/History_API/Working_with_the_History_API
+/en-US/docs/Web/API/Houdini /en-US/docs/Web/API/Houdini_APIs
/en-US/docs/Web/API/IDBCursor.advance /en-US/docs/Web/API/IDBCursor/advance
/en-US/docs/Web/API/IDBCursor.continue /en-US/docs/Web/API/IDBCursor/continue
/en-US/docs/Web/API/IDBCursor.delete /en-US/docs/Web/API/IDBCursor/delete
@@ -8694,6 +8695,7 @@
/en-US/docs/Web/API/IDBKeyRange/lowerBound /en-US/docs/Web/API/IDBKeyRange/lowerBound_static
/en-US/docs/Web/API/IDBKeyRange/only /en-US/docs/Web/API/IDBKeyRange/only_static
/en-US/docs/Web/API/IDBKeyRange/upperBound /en-US/docs/Web/API/IDBKeyRange/upperBound_static
+/en-US/docs/Web/API/IDBLocaleAwareKeyRange /en-US/docs/Web/API/IDBIndex
/en-US/docs/Web/API/IDBMutableFile /en-US/docs/Web/API/IndexedDB_API
/en-US/docs/Web/API/IDBMutableFile/abort_event /en-US/docs/Web/API/IndexedDB_API
/en-US/docs/Web/API/IDBMutableFile/error_event /en-US/docs/Web/API/IndexedDB_API
@@ -8795,8 +8797,8 @@
/en-US/docs/Web/API/InputDeviceCapabilities/fireTouchEvents /en-US/docs/Web/API/InputDeviceCapabilities/firesTouchEvents
/en-US/docs/Web/API/InputEvent.InputEvent /en-US/docs/Web/API/InputEvent/InputEvent
/en-US/docs/Web/API/InputEvent.isComposing /en-US/docs/Web/API/InputEvent/isComposing
-/en-US/docs/Web/API/InputEvent/input /en-US/docs/Web/API/HTMLElement/input_event
-/en-US/docs/Web/API/InputEvent/input_event /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/InputEvent/input /en-US/docs/Web/API/Element/input_event
+/en-US/docs/Web/API/InputEvent/input_event /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/InstallEvent/activeWorker /en-US/docs/Web/API/InstallEvent
/en-US/docs/Web/API/Int16Array /en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array
/en-US/docs/Web/API/Int32Array /en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array
@@ -8911,7 +8913,7 @@
/en-US/docs/Web/API/MediaRecorder.onresume /en-US/docs/Web/API/MediaRecorder/resume_event
/en-US/docs/Web/API/MediaRecorder.onstart /en-US/docs/Web/API/MediaRecorder/start_event
/en-US/docs/Web/API/MediaRecorder.onstop /en-US/docs/Web/API/MediaRecorder/stop_event
-/en-US/docs/Web/API/MediaRecorder.onwarning /en-US/docs/Web/API/MediaRecorder/warning_event
+/en-US/docs/Web/API/MediaRecorder.onwarning /en-US/docs/Web/API/MediaRecorder
/en-US/docs/Web/API/MediaRecorder.pause /en-US/docs/Web/API/MediaRecorder/pause
/en-US/docs/Web/API/MediaRecorder.requestData /en-US/docs/Web/API/MediaRecorder/requestData
/en-US/docs/Web/API/MediaRecorder.resume /en-US/docs/Web/API/MediaRecorder/resume
@@ -8927,7 +8929,8 @@
/en-US/docs/Web/API/MediaRecorder/onresume /en-US/docs/Web/API/MediaRecorder/resume_event
/en-US/docs/Web/API/MediaRecorder/onstart /en-US/docs/Web/API/MediaRecorder/start_event
/en-US/docs/Web/API/MediaRecorder/onstop /en-US/docs/Web/API/MediaRecorder/stop_event
-/en-US/docs/Web/API/MediaRecorder/onwarning /en-US/docs/Web/API/MediaRecorder/warning_event
+/en-US/docs/Web/API/MediaRecorder/onwarning /en-US/docs/Web/API/MediaRecorder
+/en-US/docs/Web/API/MediaRecorder/warning_event /en-US/docs/Web/API/MediaRecorder
/en-US/docs/Web/API/MediaRecorder_API /en-US/docs/Web/API/MediaStream_Recording_API
/en-US/docs/Web/API/MediaRecorder_API/Using_the_MediaRecorder_API /en-US/docs/Web/API/MediaStream_Recording_API/Using_the_MediaStream_Recording_API
/en-US/docs/Web/API/MediaSessionAction /en-US/docs/Web/API/MediaSession/setActionHandler
@@ -8960,14 +8963,15 @@
/en-US/docs/Web/API/MediaStreamTrack.kind /en-US/docs/Web/API/MediaStreamTrack/kind
/en-US/docs/Web/API/MediaStreamTrack.label /en-US/docs/Web/API/MediaStreamTrack/label
/en-US/docs/Web/API/MediaStreamTrack.onmute /en-US/docs/Web/API/MediaStreamTrack/mute_event
-/en-US/docs/Web/API/MediaStreamTrack.onoverconstrained /en-US/docs/Web/API/MediaStreamTrack/overconstrained_event
+/en-US/docs/Web/API/MediaStreamTrack.onoverconstrained /en-US/docs/Web/API/MediaStreamTrack
/en-US/docs/Web/API/MediaStreamTrack.onunmute /en-US/docs/Web/API/MediaStreamTrack/unmute_event
/en-US/docs/Web/API/MediaStreamTrack.readyState /en-US/docs/Web/API/MediaStreamTrack/readyState
/en-US/docs/Web/API/MediaStreamTrack.stop /en-US/docs/Web/API/MediaStreamTrack/stop
/en-US/docs/Web/API/MediaStreamTrack/onended /en-US/docs/Web/API/MediaStreamTrack/ended_event
/en-US/docs/Web/API/MediaStreamTrack/onmute /en-US/docs/Web/API/MediaStreamTrack/mute_event
-/en-US/docs/Web/API/MediaStreamTrack/onoverconstrained /en-US/docs/Web/API/MediaStreamTrack/overconstrained_event
+/en-US/docs/Web/API/MediaStreamTrack/onoverconstrained /en-US/docs/Web/API/MediaStreamTrack
/en-US/docs/Web/API/MediaStreamTrack/onunmute /en-US/docs/Web/API/MediaStreamTrack/unmute_event
+/en-US/docs/Web/API/MediaStreamTrack/overconstrained_event /en-US/docs/Web/API/MediaStreamTrack
/en-US/docs/Web/API/MediaStreamTrack/remote /en-US/docs/Web/API/MediaStreamTrack
/en-US/docs/Web/API/MediaStreamTrackAudioSourceOptions /en-US/docs/Web/API/MediaStreamTrackAudioSourceNode
/en-US/docs/Web/API/MediaStreamTrackAudioSourceOptions/mediaStreamTrack /en-US/docs/Web/API/MediaStreamTrackAudioSourceNode
@@ -9604,7 +9608,7 @@
/en-US/docs/Web/API/SVGElement/oncontextmenu /en-US/docs/Web/API/Element/contextmenu_event
/en-US/docs/Web/API/SVGElement/ondblclick /en-US/docs/Web/API/Element/dblclick_event
/en-US/docs/Web/API/SVGElement/onfocus /en-US/docs/Web/API/Window/focus_event
-/en-US/docs/Web/API/SVGElement/oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/SVGElement/oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/SVGElement/onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/SVGElement/onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Web/API/SVGElement/onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -10062,6 +10066,7 @@
/en-US/docs/Web/API/WebRTC_API/Architecture /en-US/docs/Web/API/WebRTC_API/Protocols
/en-US/docs/Web/API/WebRTC_API/Architecture/Connectivity /en-US/docs/Web/API/WebRTC_API/Connectivity
/en-US/docs/Web/API/WebRTC_API/Architecture/Protocols /en-US/docs/Web/API/WebRTC_API/Protocols
+/en-US/docs/Web/API/WebRTC_API/High-level_guide /en-US/docs/Web/API/WebRTC_API
/en-US/docs/Web/API/WebRTC_API/Interface_overview /en-US/docs/Web/API/WebRTC_API#WebRTC_concepts_and_usage
/en-US/docs/Web/API/WebRTC_API/Introduction /en-US/docs/Web/API/WebRTC_API
/en-US/docs/Web/API/WebRTC_API/Overview /en-US/docs/Web/API/WebRTC_API#WebRTC_concepts_and_usage
@@ -10771,7 +10776,6 @@
/en-US/docs/Web/API/window.content /en-US/docs/Web/API/Window
/en-US/docs/Web/API/window.crypto /en-US/docs/Web/API/crypto_property
/en-US/docs/Web/API/window.crypto.getRandomValues /en-US/docs/Web/API/Crypto/getRandomValues
-/en-US/docs/Web/API/window.defaultStatus /en-US/docs/Web/API/Window/defaultStatus
/en-US/docs/Web/API/window.document /en-US/docs/Web/API/Window/document
/en-US/docs/Web/API/window.dump /en-US/docs/Web/API/Window/dump
/en-US/docs/Web/API/window.escape /en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
@@ -10848,7 +10852,7 @@
/en-US/docs/Web/API/window.onerror /en-US/docs/Web/API/Window/error_event
/en-US/docs/Web/API/window.onfocus /en-US/docs/Web/API/Window/focus_event
/en-US/docs/Web/API/window.onhashchange /en-US/docs/Web/API/Window/hashchange_event
-/en-US/docs/Web/API/window.oninput /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/API/window.oninput /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/API/window.onkeydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/API/window.onkeypress /en-US/docs/Web/API/Element/keypress_event
/en-US/docs/Web/API/window.onkeyup /en-US/docs/Web/API/Element/keyup_event
@@ -11329,6 +11333,7 @@
/en-US/docs/Web/CSS/::-ms-browse /en-US/docs/Web/CSS/::file-selector-button
/en-US/docs/Web/CSS/::-webkit-file-upload-button /en-US/docs/Web/CSS/::file-selector-button
/en-US/docs/Web/CSS/::-webkit-input-placeholder /en-US/docs/Web/CSS/::placeholder
+/en-US/docs/Web/CSS/::-webkit-outer-spin-button /en-US/docs/Web/CSS/::-webkit-inner-spin-button
/en-US/docs/Web/CSS/::-webkit-resizer /en-US/docs/Web/CSS/::-webkit-scrollbar
/en-US/docs/Web/CSS/::-webkit-scrollbar-button /en-US/docs/Web/CSS/::-webkit-scrollbar
/en-US/docs/Web/CSS/::-webkit-scrollbar-corner /en-US/docs/Web/CSS/::-webkit-scrollbar
@@ -11375,7 +11380,7 @@
/en-US/docs/Web/CSS/Alias /en-US/docs/Web/CSS/cursor
/en-US/docs/Web/CSS/All_About_The_Containing_Block /en-US/docs/Web/CSS/Containing_block
/en-US/docs/Web/CSS/Aural /en-US/docs/Web/CSS/@media/aural
-/en-US/docs/Web/CSS/Block_formatting_context /en-US/docs/Web/Guide/CSS/Block_formatting_context
+/en-US/docs/Web/CSS/Block_formatting_context /en-US/docs/Web/CSS/CSS_display/Block_formatting_context
/en-US/docs/Web/CSS/CSS3_Columns /en-US/docs/Web/CSS/CSS_multicol_layout/Using_multicol_layouts
/en-US/docs/Web/CSS/CSS_Background_and_Borders /en-US/docs/Web/CSS/CSS_backgrounds_and_borders
/en-US/docs/Web/CSS/CSS_Background_and_Borders/Border-image_generator /en-US/docs/Web/CSS/CSS_backgrounds_and_borders/Border-image_generator
@@ -11401,10 +11406,10 @@
/en-US/docs/Web/CSS/CSS_Columns/Using_multicol_layouts /en-US/docs/Web/CSS/CSS_multicol_layout/Using_multicol_layouts
/en-US/docs/Web/CSS/CSS_Device_Adaptation /en-US/docs/Web/CSS
/en-US/docs/Web/CSS/CSS_Device_Adaptation/Viewport_Concepts /en-US/docs/Web/CSS/Viewport_concepts
-/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Advanced_layouts_with_flexbox /en-US/docs/Web/CSS/CSS_flexible_box_layout/Backwards_compatibility_of_flexbox
+/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Advanced_layouts_with_flexbox /en-US/docs/Glossary/Flexbox
/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Box_Alignment_in_Flexbox /en-US/docs/Web/CSS/CSS_box_alignment/Box_alignment_in_flexbox
/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Controlling_Ratios_of_Flex_Items_Along_the_Main_Ax /en-US/docs/Web/CSS/CSS_flexible_box_layout/Controlling_ratios_of_flex_items_along_the_main_axis
-/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Mixins /en-US/docs/Web/CSS/CSS_flexible_box_layout/Backwards_compatibility_of_flexbox
+/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Mixins /en-US/docs/Glossary/Flexbox
/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes /en-US/docs/Web/CSS/CSS_flexible_box_layout/Basic_concepts_of_flexbox
/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_flexbox_to_lay_out_web_applications /en-US/docs/Web/CSS/CSS_flexible_box_layout/Typical_use_cases_of_flexbox
/en-US/docs/Web/CSS/CSS_Flow_Layout/Formatting_Contexts_Explained /en-US/docs/Web/CSS/CSS_flow_layout/Introduction_to_formatting_contexts
@@ -11475,8 +11480,11 @@
/en-US/docs/Web/CSS/CSS_User_Interface /en-US/docs/Web/CSS/CSS_basic_user_interface
/en-US/docs/Web/CSS/CSS_Variables /en-US/docs/Web/CSS/CSS_cascading_variables
/en-US/docs/Web/CSS/CSS_Viewport /en-US/docs/Web/CSS
+/en-US/docs/Web/CSS/CSS_charsets /en-US/docs/Web/CSS/CSS_syntax
+/en-US/docs/Web/CSS/CSS_container_queries /en-US/docs/Web/CSS/CSS_containment/Container_queries
/en-US/docs/Web/CSS/CSS_descriptor_definition /en-US/docs/Web/CSS
/en-US/docs/Web/CSS/CSS_flex-wrap /en-US/docs/Web/CSS/flex-wrap
+/en-US/docs/Web/CSS/CSS_flexible_box_layout/Backwards_compatibility_of_flexbox /en-US/docs/Glossary/Flexbox
/en-US/docs/Web/CSS/CSS_grid_layout/Layout_using_line-based_placement /en-US/docs/Web/CSS/CSS_grid_layout/Grid_layout_using_line-based_placement
/en-US/docs/Web/CSS/CSS_grid_layout/Layout_using_named_grid_lines /en-US/docs/Web/CSS/CSS_grid_layout/Grid_layout_using_named_grid_lines
/en-US/docs/Web/CSS/CSS_percentage_values /en-US/docs/Web/CSS
@@ -11547,7 +11555,6 @@
/en-US/docs/Web/CSS/calc() /en-US/docs/Web/CSS/calc
/en-US/docs/Web/CSS/clamp() /en-US/docs/Web/CSS/clamp
/en-US/docs/Web/CSS/color-adjust /en-US/docs/Web/CSS/print-color-adjust
-/en-US/docs/Web/CSS/color-interpolation /en-US/docs/Web/SVG/Attribute/color-interpolation
/en-US/docs/Web/CSS/color-interpolation-filters /en-US/docs/Web/SVG/Attribute/color-interpolation-filters
/en-US/docs/Web/CSS/color_value/color() /en-US/docs/Web/CSS/color_value/color
/en-US/docs/Web/CSS/color_value/color-contrast() /en-US/docs/Web/CSS/color_value/color-contrast
@@ -11671,7 +11678,7 @@
/en-US/docs/Web/CSS/repeating-linear-gradient() /en-US/docs/Web/CSS/gradient/repeating-linear-gradient
/en-US/docs/Web/CSS/repeating-radial-gradient /en-US/docs/Web/CSS/gradient/repeating-radial-gradient
/en-US/docs/Web/CSS/repeating-radial-gradient() /en-US/docs/Web/CSS/gradient/repeating-radial-gradient
-/en-US/docs/Web/CSS/rgb /en-US/docs/Web/CSS/color_value#rgb()_and_rgba()
+/en-US/docs/Web/CSS/rgb /en-US/docs/Web/CSS/color_value/rgb
/en-US/docs/Web/CSS/scroll /en-US/docs/Web/CSS/overflow
/en-US/docs/Web/CSS/scrollbar-track-color /en-US/docs/Web/CSS/scrollbar-color
/en-US/docs/Web/CSS/shape-box /en-US/docs/Web/CSS/shape-outside
@@ -11759,7 +11766,7 @@
/en-US/docs/Web/Events/audioprocess /en-US/docs/Web/API/ScriptProcessorNode/audioprocess_event
/en-US/docs/Web/Events/audiostart /en-US/docs/Web/API/SpeechRecognition/audiostart_event
/en-US/docs/Web/Events/auxclick /en-US/docs/Web/API/Element/auxclick_event
-/en-US/docs/Web/Events/beforeinput /en-US/docs/Web/API/HTMLElement/beforeinput_event
+/en-US/docs/Web/Events/beforeinput /en-US/docs/Web/API/Element/beforeinput_event
/en-US/docs/Web/Events/beforeprint /en-US/docs/Web/API/Window/beforeprint_event
/en-US/docs/Web/Events/beforescriptexecute /en-US/docs/Web/API/Element/beforescriptexecute_event
/en-US/docs/Web/Events/beforeunload /en-US/docs/Web/API/Window/beforeunload_event
@@ -11838,7 +11845,7 @@
/en-US/docs/Web/Events/iceconnectionstatechange /en-US/docs/Web/API/RTCPeerConnection/iceconnectionstatechange_event
/en-US/docs/Web/Events/icegatheringstatechange /en-US/docs/Web/API/RTCPeerConnection/icegatheringstatechange_event
/en-US/docs/Web/Events/icegatheringstatechange_event /en-US/docs/Web/API/RTCPeerConnection/icegatheringstatechange_event
-/en-US/docs/Web/Events/input /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/Events/input /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/Events/install /en-US/docs/Web/API/Window/appinstalled_event
/en-US/docs/Web/Events/invalid /en-US/docs/Web/API/HTMLInputElement/invalid_event
/en-US/docs/Web/Events/keydown /en-US/docs/Web/API/Element/keydown_event
@@ -12027,6 +12034,7 @@
/en-US/docs/Web/Guide/Audio_and_video_delivery/cross_browser_video_player /en-US/docs/Web/Media/Audio_and_video_delivery/cross_browser_video_player
/en-US/docs/Web/Guide/Audio_and_video_manipulation /en-US/docs/Web/Media/Audio_and_video_manipulation
/en-US/docs/Web/Guide/CSS /en-US/docs/Learn/CSS
+/en-US/docs/Web/Guide/CSS/Block_formatting_context /en-US/docs/Web/CSS/CSS_display/Block_formatting_context
/en-US/docs/Web/Guide/CSS/CSS_Image_Sprites /en-US/docs/Web/CSS/CSS_images/Implementing_image_sprites_in_CSS
/en-US/docs/Web/Guide/CSS/Consistent_list_indentation /en-US/docs/Web/CSS/CSS_lists/Consistent_list_indentation
/en-US/docs/Web/Guide/CSS/Counters /en-US/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters
@@ -12157,8 +12165,12 @@
/en-US/docs/Web/Guide/HTML/Using_HTML_sections_and_outlines /en-US/docs/Web/HTML/Element/Heading_Elements
/en-US/docs/Web/Guide/HTML/Using_data_attributes /en-US/docs/Learn/HTML/Howto/Use_data_attributes
/en-US/docs/Web/Guide/HTML/XHTML /en-US/docs/Glossary/XHTML
+/en-US/docs/Web/Guide/Houdini /en-US/docs/Web/API/Houdini_APIs
/en-US/docs/Web/Guide/Index /en-US/docs/Web/Guide
/en-US/docs/Web/Guide/Introduction_to_Web_development /en-US/docs/Learn
+/en-US/docs/Web/Guide/Mobile /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
+/en-US/docs/Web/Guide/Mobile/A_hybrid_approach /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
+/en-US/docs/Web/Guide/Mobile/Mobile-friendliness /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
/en-US/docs/Web/Guide/Mobile/Separate_sites /en-US/docs/Web/Progressive_web_apps
/en-US/docs/Web/Guide/Needs_categorization/Functions_available_to_workers /en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers
/en-US/docs/Web/Guide/Parsing_and_serializing_XML /en-US/docs/Web/XML/Parsing_and_serializing_XML
@@ -12333,7 +12345,7 @@
/en-US/docs/Web/HTTP/X-Frame-Options /en-US/docs/Web/HTTP/Headers/X-Frame-Options
/en-US/docs/Web/HTTP/data_URIs /en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
/en-US/docs/Web/HTTP/www_and_non-www_URLs /en-US/docs/Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs
-/en-US/docs/Web/Houdini /en-US/docs/Web/Guide/Houdini
+/en-US/docs/Web/Houdini /en-US/docs/Web/API/Houdini_APIs
/en-US/docs/Web/Houdini/CSS_Painting_API /en-US/docs/Web/API/CSS_Painting_API/Guide
/en-US/docs/Web/Houdini/CSS_Typed_OM /en-US/docs/Web/API/CSS_Typed_OM_API
/en-US/docs/Web/Houdini/Learn/CSS_Painting_API /en-US/docs/Web/API/CSS_Painting_API/Guide
@@ -12870,7 +12882,7 @@
/en-US/docs/Web/Reference/Events/gamepadconnected /en-US/docs/Web/API/Window/gamepadconnected_event
/en-US/docs/Web/Reference/Events/gamepaddisconnected /en-US/docs/Web/API/Window/gamepaddisconnected_event
/en-US/docs/Web/Reference/Events/hashchange /en-US/docs/Web/API/Window/hashchange_event
-/en-US/docs/Web/Reference/Events/input /en-US/docs/Web/API/HTMLElement/input_event
+/en-US/docs/Web/Reference/Events/input /en-US/docs/Web/API/Element/input_event
/en-US/docs/Web/Reference/Events/invalid /en-US/docs/Web/API/HTMLInputElement/invalid_event
/en-US/docs/Web/Reference/Events/keydown /en-US/docs/Web/API/Element/keydown_event
/en-US/docs/Web/Reference/Events/keypress /en-US/docs/Web/API/Element/keypress_event
@@ -13180,9 +13192,9 @@
/en-US/docs/Web_Development /en-US/docs/Web/Guide
/en-US/docs/Web_Development/HTTP_cookies /en-US/docs/Web/HTTP/Cookies
/en-US/docs/Web_Development/Introduction_to_Web_development /en-US/docs/Learn
-/en-US/docs/Web_Development/Mobile /en-US/docs/Web/Guide/Mobile
-/en-US/docs/Web_Development/Mobile/A_hybrid_approach /en-US/docs/Web/Guide/Mobile/A_hybrid_approach
-/en-US/docs/Web_Development/Mobile/Mobile-friendliness /en-US/docs/Web/Guide/Mobile/Mobile-friendliness
+/en-US/docs/Web_Development/Mobile /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
+/en-US/docs/Web_Development/Mobile/A_hybrid_approach /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
+/en-US/docs/Web_Development/Mobile/Mobile-friendliness /en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
/en-US/docs/Web_Development/Mobile/Responsive_design /en-US/docs/Web/Progressive_web_apps
/en-US/docs/Web_Development/Mobile/Responsive_design/Responsive_design_references /en-US/docs/Web/Progressive_web_apps
/en-US/docs/Web_Development/Mobile/Separate_sites /en-US/docs/Glossary/Responsive_web_design
@@ -13686,7 +13698,6 @@
/en-US/docs/window.closed /en-US/docs/Web/API/Window/closed
/en-US/docs/window.confirm /en-US/docs/Web/API/Window/confirm
/en-US/docs/window.crypto /en-US/docs/Web/API/crypto_property
-/en-US/docs/window.defaultStatus /en-US/docs/Web/API/Window/defaultStatus
/en-US/docs/window.document /en-US/docs/Web/API/Window/document
/en-US/docs/window.dump /en-US/docs/Web/API/Window/dump
/en-US/docs/window.escape /en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
diff --git a/files/en-us/_wikihistory.json b/files/en-us/_wikihistory.json
index 60db8e73468ec21..4d356f42503af97 100644
--- a/files/en-us/_wikihistory.json
+++ b/files/en-us/_wikihistory.json
@@ -11697,43 +11697,6 @@
"groovecoder"
]
},
- "MDN/Contribute": {
- "modified": "2020-12-14T09:31:17.213Z",
- "contributors": [
- "sourabhramsingh",
- "maxTarlov",
- "chrisdavidmills",
- "aditibasu",
- "wbamberg",
- "SphinxKnight",
- "shwetabhsuman",
- "jswisher",
- "wdot789",
- "fotografi",
- "Sheppy",
- "vikash111",
- "Kerstomaat",
- "ertogrul",
- "elwakil",
- "Thomskii",
- "Lasantha",
- "jsx",
- "saifulislam1",
- "adi28galaxyak",
- "Volluta",
- "Husaria",
- "klez",
- "pytseng",
- "alispivak",
- "utente-pc",
- "emmanuelodenyire",
- "Mars"
- ]
- },
- "MDN/Contribute/Processes": {
- "modified": "2020-09-30T15:17:09.733Z",
- "contributors": ["wbamberg", "david_ross", "jswisher", "Sheppy"]
- },
"MDN/MDN_Product_Advisory_Board": {
"modified": "2019-06-05T12:41:23.682Z",
"contributors": [
@@ -12954,10 +12917,6 @@
"aswan"
]
},
- "Mozilla/Add-ons/WebExtensions/API/downloads/drag": {
- "modified": "2020-10-15T21:44:35.541Z",
- "contributors": ["wbamberg", "Makyen", "chrisdavidmills"]
- },
"Mozilla/Add-ons/WebExtensions/API/downloads/erase": {
"modified": "2020-10-15T21:44:38.278Z",
"contributors": ["wbamberg", "Makyen", "chrisdavidmills"]
@@ -29268,10 +29227,6 @@
"JesseW"
]
},
- "Web/API/Document/lostpointercapture_event": {
- "modified": "2020-10-15T22:14:52.161Z",
- "contributors": ["Clarkkkk", "mfuji09", "wbamberg"]
- },
"Web/API/Document/mozSetImageElement": {
"modified": "2020-10-15T21:13:49.622Z",
"contributors": [
@@ -31021,6 +30976,17 @@
"jpmedley"
]
},
+ "Web/API/Element/beforeinput_event": {
+ "modified": "2020-11-11T09:54:44.715Z",
+ "contributors": [
+ "Rumyra",
+ "chrisdavidmills",
+ "mfuji09",
+ "Sheppy",
+ "Watilin",
+ "mfluehr"
+ ]
+ },
"Web/API/Element/beforescriptexecute_event": {
"modified": "2020-10-15T21:19:30.700Z",
"contributors": [
@@ -32211,6 +32177,46 @@
"JesseW"
]
},
+ "Web/API/Element/input_event": {
+ "modified": "2020-10-15T21:19:24.780Z",
+ "contributors": [
+ "mfuji09",
+ "dienluong",
+ "chrisdavidmills",
+ "estelle",
+ "Sheppy",
+ "wbamberg",
+ "mfluehr",
+ "matijs",
+ "JLHwung",
+ "Majr",
+ "fscholz",
+ "thatemil",
+ "roryokane",
+ "lsolova",
+ "jchen",
+ "ibmua",
+ "jkoritzinsky",
+ "erikadoyle",
+ "r-o-b",
+ "cvrebert",
+ "Sebastianz",
+ "chrisAnderson",
+ "teoli",
+ "jonkoops",
+ "claudepache",
+ "mkato",
+ "Masayuki",
+ "bending_the_rules",
+ "codepo8",
+ "jimmont",
+ "joeldart",
+ "Nickolay",
+ "parthiv",
+ "louisremi",
+ "ethertank"
+ ]
+ },
"Web/API/Element/insertAdjacentElement": {
"modified": "2020-10-17T17:01:56.118Z",
"contributors": [
@@ -37950,15 +37956,16 @@
"Krinkle"
]
},
- "Web/API/HTMLElement/beforeinput_event": {
- "modified": "2020-11-11T09:54:44.715Z",
+ "Web/API/HTMLElement/autofocus": {
+ "modified": "2020-10-15T21:42:28.924Z",
"contributors": [
- "Rumyra",
- "chrisdavidmills",
- "mfuji09",
- "Sheppy",
- "Watilin",
- "mfluehr"
+ "nali",
+ "sideshowbarker",
+ "connorshea",
+ "libbymc",
+ "Druzion",
+ "teoli",
+ "Rakhisharma"
]
},
"Web/API/HTMLElement/blur": {
@@ -38288,46 +38295,6 @@
"evilpie"
]
},
- "Web/API/HTMLElement/input_event": {
- "modified": "2020-10-15T21:19:24.780Z",
- "contributors": [
- "mfuji09",
- "dienluong",
- "chrisdavidmills",
- "estelle",
- "Sheppy",
- "wbamberg",
- "mfluehr",
- "matijs",
- "JLHwung",
- "Majr",
- "fscholz",
- "thatemil",
- "roryokane",
- "lsolova",
- "jchen",
- "ibmua",
- "jkoritzinsky",
- "erikadoyle",
- "r-o-b",
- "cvrebert",
- "Sebastianz",
- "chrisAnderson",
- "teoli",
- "jonkoops",
- "claudepache",
- "mkato",
- "Masayuki",
- "bending_the_rules",
- "codepo8",
- "jimmont",
- "joeldart",
- "Nickolay",
- "parthiv",
- "louisremi",
- "ethertank"
- ]
- },
"Web/API/HTMLElement/isContentEditable": {
"modified": "2020-10-15T21:12:52.957Z",
"contributors": [
@@ -40835,18 +40802,6 @@
"teoli"
]
},
- "Web/API/HTMLSelectElement/autofocus": {
- "modified": "2020-10-15T21:42:28.924Z",
- "contributors": [
- "nali",
- "sideshowbarker",
- "connorshea",
- "libbymc",
- "Druzion",
- "teoli",
- "Rakhisharma"
- ]
- },
"Web/API/HTMLSelectElement/checkValidity": {
"modified": "2020-10-15T21:29:52.800Z",
"contributors": [
@@ -42348,6 +42303,18 @@
"modified": "2019-03-18T20:56:26.488Z",
"contributors": ["wbamberg", "chrisdavidmills", "rugk"]
},
+ "Web/API/Houdini_APIs": {
+ "modified": "2020-07-16T03:51:08.991Z",
+ "contributors": [
+ "Wind1808",
+ "enva-2-7-1-2",
+ "estelle",
+ "chrisdavidmills",
+ "SphinxKnight",
+ "jason2477",
+ "Sheppy"
+ ]
+ },
"Web/API/IDBCursor": {
"modified": "2020-10-15T21:09:31.954Z",
"contributors": [
@@ -43075,16 +43042,6 @@
"chrisdavidmills"
]
},
- "Web/API/IDBLocaleAwareKeyRange": {
- "modified": "2020-10-15T21:38:45.838Z",
- "contributors": [
- "teoli",
- "fscholz",
- "Sebastianz",
- "Seta00",
- "chrisdavidmills"
- ]
- },
"Web/API/IDBObjectStore": {
"modified": "2020-10-15T21:10:03.883Z",
"contributors": [
@@ -45836,20 +45793,6 @@
"modified": "2020-10-15T21:51:07.748Z",
"contributors": ["fscholz", "david_ross", "jpmedley"]
},
- "Web/API/MediaRecorder/warning_event": {
- "modified": "2020-10-15T21:27:43.833Z",
- "contributors": [
- "Sheppy",
- "sideshowbarker",
- "lucian95",
- "miguelao",
- "jpmedley",
- "Sebastianz",
- "chrisdavidmills",
- "teoli",
- "kscarfone"
- ]
- },
"Web/API/MediaRecorderErrorEvent": {
"modified": "2020-10-15T21:57:11.850Z",
"contributors": ["sideshowbarker", "Sheppy"]
@@ -46302,16 +46245,6 @@
"jpmedley"
]
},
- "Web/API/MediaStreamTrack/overconstrained_event": {
- "modified": "2020-10-15T21:29:32.712Z",
- "contributors": [
- "alattalatta",
- "sideshowbarker",
- "fscholz",
- "libbymc",
- "teoli"
- ]
- },
"Web/API/MediaStreamTrack/readyState": {
"modified": "2020-10-15T21:29:36.532Z",
"contributors": [
@@ -50553,19 +50486,6 @@
"SignpostMarv"
]
},
- "Web/API/NotifyAudioAvailableEvent": {
- "modified": "2019-03-24T00:05:46.158Z",
- "contributors": [
- "Sheppy",
- "alsntjsu",
- "fscholz",
- "teoli",
- "kscarfone",
- "ethertank",
- "jswisher",
- "sebmozilla"
- ]
- },
"Web/API/OES_element_index_uint": {
"modified": "2020-10-15T21:43:51.807Z",
"contributors": ["fscholz", "nmve", "teoli"]
@@ -65026,10 +64946,6 @@
"chrisdavidmills"
]
},
- "Web/API/WebRTC_API/High-level_guide": {
- "modified": "2019-03-23T22:47:43.736Z",
- "contributors": ["Sheppy"]
- },
"Web/API/WebRTC_API/Intro_to_RTP": {
"modified": "2019-03-18T21:41:44.636Z",
"contributors": ["Sheppy"]
@@ -66811,24 +66727,6 @@
"modified": "2020-10-15T22:16:14.635Z",
"contributors": ["mfuji09", "wbamberg"]
},
- "Web/API/Window/defaultStatus": {
- "modified": "2019-04-05T17:00:29.943Z",
- "contributors": [
- "Loirooriol",
- "sarafec",
- "fscholz",
- "teoli",
- "kscarfone",
- "kohei.yoshino",
- "Sheppy",
- "feltronzach",
- "Matej Lednar",
- "Mgjbot",
- "Dria",
- "Callek",
- "JesseW"
- ]
- },
"Web/API/Window/devicePixelRatio": {
"modified": "2020-10-15T21:28:17.748Z",
"contributors": [
@@ -72712,19 +72610,6 @@
"peterbraden"
]
},
- "Web/Accessibility/Architecture": {
- "modified": "2019-03-24T00:11:44.656Z",
- "contributors": [
- "Sheppy",
- "fscholz",
- "badrfoot",
- "Aaronlev",
- "Joanmarie",
- "Parente",
- "Rd4Uix",
- "Nickolay"
- ]
- },
"Web/Accessibility/Cognitive_accessibility": {
"modified": "2019-11-18T16:53:41.344Z",
"contributors": ["Igor-Sangin", "ericwbailey", "estelle", "jswisher"]
@@ -73813,18 +73698,6 @@
"yusufgulled"
]
},
- "Web/CSS/::-webkit-outer-spin-button": {
- "modified": "2020-10-15T21:48:38.043Z",
- "contributors": [
- "Sheppy",
- "wbamberg",
- "fscholz",
- "teoli",
- "mfluehr",
- "Sebastianz",
- "AjayPoshak"
- ]
- },
"Web/CSS/::-webkit-progress-bar": {
"modified": "2020-10-15T21:41:33.061Z",
"contributors": [
@@ -77125,10 +76998,6 @@
"modified": "2020-07-07T12:03:44.891Z",
"contributors": ["wbamberg", "mfluehr"]
},
- "Web/CSS/CSS_charsets": {
- "modified": "2020-10-15T21:38:35.251Z",
- "contributors": ["wbamberg", "fscholz", "mfluehr", "Sebastianz", "teoli"]
- },
"Web/CSS/CSS_colors": {
"modified": "2020-12-02T11:04:05.642Z",
"contributors": ["peterbe", "wbamberg", "fscholz", "Sheppy", "mfluehr"]
@@ -77258,6 +77127,43 @@
"teoli"
]
},
+ "Web/CSS/CSS_display/Block_formatting_context": {
+ "modified": "2020-11-02T20:53:20.927Z",
+ "contributors": [
+ "spollard",
+ "pacexy",
+ "wbamberg",
+ "Mookiepiece",
+ "SelenIT",
+ "TrevorKarjanis",
+ "mfuji09",
+ "Konrud",
+ "estelle",
+ "wavesheep",
+ "jennyevans",
+ "MelvinIdema",
+ "chrisdavidmills",
+ "Ende93",
+ "xiaohanyu",
+ "YvonneZhang",
+ "pythonista27",
+ "S-Dey",
+ "mfluehr",
+ "yisibl",
+ "alberts+",
+ "rainyLeo",
+ "PageYe",
+ "HashemQolami",
+ "Jeremie",
+ "teoli",
+ "kscarfone",
+ "tregagnon",
+ "Sheppy",
+ "cbiesinger",
+ "Kohei",
+ "DBaron"
+ ]
+ },
"Web/CSS/CSS_filter_effects": {
"modified": "2020-12-02T11:05:43.361Z",
"contributors": ["peterbe", "wbamberg", "fscholz", "mfluehr"]
@@ -77295,17 +77201,6 @@
"chrisdavidmills"
]
},
- "Web/CSS/CSS_flexible_box_layout/Backwards_compatibility_of_flexbox": {
- "modified": "2020-07-07T12:06:44.348Z",
- "contributors": [
- "wbamberg",
- "ExE-Boss",
- "mattbrundageMDN",
- "roryokane",
- "chrisdavidmills",
- "rachelandrew"
- ]
- },
"Web/CSS/CSS_flexible_box_layout/Basic_concepts_of_flexbox": {
"modified": "2020-12-11T09:00:07.056Z",
"contributors": [
@@ -78501,6 +78396,10 @@
"modified": "2020-04-27T22:31:21.929Z",
"contributors": ["ExE-Boss", "mfuji09", "rachelandrew"]
},
+ "Web/CSS/CSS_syntax": {
+ "modified": "2020-10-15T21:38:35.251Z",
+ "contributors": ["wbamberg", "fscholz", "mfluehr", "Sebastianz", "teoli"]
+ },
"Web/CSS/CSS_table": {
"modified": "2020-07-07T12:26:58.542Z",
"contributors": ["wbamberg", "fscholz", "mfluehr", "Sebastianz", "teoli"]
@@ -92068,43 +91967,6 @@
"ethertank"
]
},
- "Web/Guide/CSS/Block_formatting_context": {
- "modified": "2020-11-02T20:53:20.927Z",
- "contributors": [
- "spollard",
- "pacexy",
- "wbamberg",
- "Mookiepiece",
- "SelenIT",
- "TrevorKarjanis",
- "mfuji09",
- "Konrud",
- "estelle",
- "wavesheep",
- "jennyevans",
- "MelvinIdema",
- "chrisdavidmills",
- "Ende93",
- "xiaohanyu",
- "YvonneZhang",
- "pythonista27",
- "S-Dey",
- "mfluehr",
- "yisibl",
- "alberts+",
- "rainyLeo",
- "PageYe",
- "HashemQolami",
- "Jeremie",
- "teoli",
- "kscarfone",
- "tregagnon",
- "Sheppy",
- "cbiesinger",
- "Kohei",
- "DBaron"
- ]
- },
"Web/Guide/CSS/Getting_started/Challenge_solutions": {
"modified": "2019-08-29T20:48:33.765Z",
"contributors": [
@@ -92117,54 +91979,6 @@
"jswisher"
]
},
- "Web/Guide/Houdini": {
- "modified": "2020-07-16T03:51:08.991Z",
- "contributors": [
- "Wind1808",
- "enva-2-7-1-2",
- "estelle",
- "chrisdavidmills",
- "SphinxKnight",
- "jason2477",
- "Sheppy"
- ]
- },
- "Web/Guide/Mobile": {
- "modified": "2020-03-07T14:19:21.961Z",
- "contributors": [
- "mfuji09",
- "xfq",
- "Zui",
- "Andrew_Pfeiffer",
- "Jeremie",
- "Sheppy",
- "wbamberg"
- ]
- },
- "Web/Guide/Mobile/A_hybrid_approach": {
- "modified": "2019-03-24T00:12:25.721Z",
- "contributors": [
- "rafrex",
- "teoli",
- "BenB",
- "skimpax",
- "trevorh",
- "caos30",
- "kohei.yoshino",
- "jswisher"
- ]
- },
- "Web/Guide/Mobile/Mobile-friendliness": {
- "modified": "2019-03-24T00:12:20.411Z",
- "contributors": [
- "teoli",
- "BenB",
- "skimpax",
- "kohei.yoshino",
- "wbamberg",
- "jswisher"
- ]
- },
"Web/Guide/Parsing_and_serializing_XML": {
"modified": "2020-09-09T05:19:22.895Z",
"contributors": [
@@ -124185,14 +123999,6 @@
"modified": "2020-10-15T21:04:59.286Z",
"contributors": ["Sebastianz", "connorshea", "Jeremie"]
},
- "Web/SVG/Attribute/contentScriptType": {
- "modified": "2020-10-15T21:09:10.002Z",
- "contributors": ["Sebastianz", "Jeremie"]
- },
- "Web/SVG/Attribute/contentStyleType": {
- "modified": "2020-10-15T21:09:14.670Z",
- "contributors": ["Sebastianz", "George8211", "Jeremie", "pa7"]
- },
"Web/SVG/Attribute/cursor": {
"modified": "2020-10-15T21:18:37.523Z",
"contributors": [
@@ -124406,16 +124212,6 @@
"Jeremie"
]
},
- "Web/SVG/Attribute/filterRes": {
- "modified": "2020-10-15T21:19:12.262Z",
- "contributors": [
- "bershanskiy",
- "Sebastianz",
- "ExE-Boss",
- "jpmedley",
- "Jeremie"
- ]
- },
"Web/SVG/Attribute/filterUnits": {
"modified": "2020-10-15T21:08:01.201Z",
"contributors": ["Sebastianz", "Jeremie"]
@@ -125377,10 +125173,6 @@
"Mogglewump"
]
},
- "Web/SVG/Attribute/viewTarget": {
- "modified": "2020-10-15T22:18:25.792Z",
- "contributors": ["Sebastianz"]
- },
"Web/SVG/Attribute/visibility": {
"modified": "2020-10-15T21:07:30.330Z",
"contributors": [
diff --git a/files/en-us/games/index.md b/files/en-us/games/index.md
index cdff6f5631c67ba..0138768f7e1db12 100644
--- a/files/en-us/games/index.md
+++ b/files/en-us/games/index.md
@@ -42,8 +42,6 @@ For a list of web game examples, see our list of [Tutorials](/en-US/docs/Games/T
- : Weekly newsletter about HTML game development, sent every Friday. Contains the latest articles, tutorials, tools, and resources.
- [HTML5 Game Engine](https://html5gameengine.com/)
- : List of the most popular HTML game frameworks along with their rating, features and samples.
-- [JSBreakouts](https://jsbreakouts.org/)
- - : Compare JavaScript Breakout clones in different frameworks to help you choose the right one for you.
- [Tuts+ Game Development](https://gamedevelopment.tutsplus.com/)
- : Tutorials and articles about game development in general.
- [HTML5 Gamedev Starter](https://html5devstarter.enclavegames.com/)
diff --git a/files/en-us/games/introduction/index.md b/files/en-us/games/introduction/index.md
index 385247eb4f9c60c..08e4827a978f3f0 100644
--- a/files/en-us/games/introduction/index.md
+++ b/files/en-us/games/introduction/index.md
@@ -95,6 +95,8 @@ As a game developer, whether you're an individual or a large game studio, you wa
For the tech folks, let's dig into the APIs the Web brings to the table that cater to game developers. Here's a thorough list to give you a taste of what the Web can do for you:
+- [Fetch API](/en-US/docs/Web/API/Fetch_API)
+ - : Send and receive any kind of data you want from a Web server like downloading new game levels and artwork to transmitting non-real-time game status information back and forth.
- [Full Screen API](/en-US/docs/Web/API/Fullscreen_API)
- : This simple API lets your game take over the entire screen, thereby immersing the player in action.
- [Gamepad API](/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API)
@@ -123,5 +125,3 @@ For the tech folks, let's dig into the APIs the Web brings to the table that cat
- : The WebSocket API lets you connect your app or site to a server to transmit data back and forth in real-time. Perfect for multiplayer gaming action, chat services, and so forth.
- [Web Workers](/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)
- : Workers give you the ability to spawn background threads running their own JavaScript code, to take advantage of modern, multicore processors.
-- [XMLHttpRequest](/en-US/docs/Web/API/XMLHttpRequest) and [File API](/en-US/docs/Web/API/File_and_Directory_Entries_API)
- - : The combination of XMLHttpRequest and the File API lets you send and receive any kind of data you want (don't let the "XML" throw you!) from a Web server. This is a great way to do anything from downloading new game levels and artwork to transmitting non-real-time game status information back and forth.
diff --git a/files/en-us/games/introduction_to_html5_game_development/index.md b/files/en-us/games/introduction_to_html5_game_development/index.md
index fd118101b23864f..c46ec12547f4a6e 100644
--- a/files/en-us/games/introduction_to_html5_game_development/index.md
+++ b/files/en-us/games/introduction_to_html5_game_development/index.md
@@ -84,6 +84,8 @@ page-type: guide
+- [Fetch API](/en-US/docs/Web/API/Fetch_API)
+ - : Send and receive any kind of data you want from a Web server like downloading new game levels and artwork to transmitting non-real-time game status information back and forth.
- [Full Screen API](/en-US/docs/Web/API/Fullscreen_API)
- : Full screen gameplay.
- [Gamepad API](/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API)
@@ -113,5 +115,3 @@ page-type: guide
- : Connect your app or site to a server to transmit data back and forth in real-time. Perfect for multiplayer gaming action, chat services, and so forth.
- [Web Workers](/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)
- : Spawn background threads running their own JavaScript code for multicore processors.
-- [XMLHttpRequest](/en-US/docs/Web/API/XMLHttpRequest) and [File API](/en-US/docs/Web/API/File_API)
- - : Send and receive any kind of data you want from a Web server like downloading new game levels and artwork to transmitting non-real-time game status information back and forth.
diff --git a/files/en-us/games/publishing_games/game_promotion/index.md b/files/en-us/games/publishing_games/game_promotion/index.md
index d51d6e8f4efc47d..336de1afbca3567 100644
--- a/files/en-us/games/publishing_games/game_promotion/index.md
+++ b/files/en-us/games/publishing_games/game_promotion/index.md
@@ -24,33 +24,33 @@ While you can create your website from scratch, there are also tools that can he
## Social media
-Your social media presence is very important — [hashtags](https://twitter.com/hashtag/gamedev) can help find friends and allow you to engage with the community and help other devs in need. Honesty is key and you should be authentic, because nobody likes boring press releases or pushy advertisements. When the time comes, your community will help you spread the word about your shiny new game!
+Your social media presence is very important. The `#gamedev` hashtag can help find friends and allow you to engage with the community and help other devs in need. Honesty is key and you should be authentic; nobody likes boring press releases or pushy advertisements. When the time comes, your community will help you spread the word about your shiny new game!
-Keep an eye on gamers who stream on YouTube and Twitch, engage with Twitter circles and be active on forums such as [HTML5GameDevs.com](https://www.html5gamedevs.com/). Share your news and answer questions so that people will value what you're doing and will know that you're trustworthy. Remember to not be too pushy when it comes to telling everyone about your games — you're not a walking advertisement.
+Keep an eye on gamers who stream on YouTube and Twitch, and be active on forums such as [HTML5GameDevs.com](https://www.html5gamedevs.com/). Share your news and answer questions so that people will value what you're doing and will know that you're trustworthy. Remember to not be too pushy when it comes to telling everyone about your games — you're not a walking advertisement.
Grow your audience by talking to them, sharing tips, offering discounts, giving away prizes in competitions, or just complaining at the weather or buggy browser you have to deal with. Be generous, be yourself and be there for others, and you'll be treated with respect.
## Game portals
-Using game portals is mostly concerned with [monetization](/en-US/docs/Games/Publishing_games/Game_monetization), but if you're not planning to [sell licenses](/en-US/docs/Games/Publishing_games/Game_monetization#licensing) to allow people to purchase your game and are intending to [implement adverts](/en-US/docs/Games/Publishing_games/Game_monetization#advertisements) or in-app purchases instead, promoting your game across free portals can be effective.
+Using game portals is mostly concerned with [monetization](/en-US/docs/Games/Publishing_games/Game_monetization), but if you're not planning to [sell licenses](/en-US/docs/Games/Publishing_games/Game_monetization#licensing) to allow people to purchase your game and intend to [implement adverts](/en-US/docs/Games/Publishing_games/Game_monetization#advertisements) or in-app purchases instead, promoting your game across free portals can be effective.
-There are a number of different game portals to which you can send your games for publication. Some portals have their own APIs that allow you to authorize users, save their progress and process in-app purchases. You can also sell a full version of the game from inside your browser demo version, which will be a great move considering high competition, some developers even manage to make full browser versions. Most portals offer revenue share deals or will buy nonexclusive license.
+There are a number of different game portals to which you can send your games for publication. Some portals have their own APIs that allow you to authorize users, save their progress and process in-app purchases. You can also sell a full version of the game from inside your browser demo version, which will be a great move considering high competition, some developers even manage to make full browser versions. Most portals offer revenue share deals or will buy nonexclusive licenses.
-Free portals offer traffic, but only the best ones are popular enough to generate revenues from advertisements on in-app purchases. On the other hand they are a perfect tool to make games visible to a broader audience if you have no budget and limited time.
+Free portals offer traffic, but only the best ones are popular enough to generate revenues from advertisements on in-app purchases. On the other hand, they are a perfect tool to make games visible to a broader audience if you have no budget and limited time.
## Press
You can try and reach the [press](https://indiegamesplus.com/) about your game, but bear in mind that they get a tonne of requests like this every single day, so be humble and patient if they don't answer right away, and be polite when talking to them. Be sure to check first if they are dealing with specific genres of games or platforms, so you don't send them something that is not relevant to them in the first place. If you're honest with your approach and your game is good, then you've got more of a chance of success.
-If you want to learn more about the etiquette of contacting the press you should definitely check out [How To Contact Press](https://app.box.com/s/p0ft5zdolpi0ydkrykab) - a great guide from Pixel Prospector.
+If you want to learn more about the etiquette of contacting the press you should check out [How To Contact Press](https://app.box.com/s/p0ft5zdolpi0ydkrykab) - a great guide from Pixel Prospector.
## Tutorials
-It's good to share your knowledge with other devs — after all you probably learned a thing or two from online articles, so you take the time to pay that knowledge forward. Talking or writing about something you achieved or problems you overcame is something people would be interested it. And you can use your own game as an example, especially in a tutorial when you're [showing how to do something you've implemented already](/en-US/docs/Games/Techniques/Controls_Gamepad_API). That way everyone benefits — people learn new skills, your game gets promoted, and if you're lucky you can even get paid for writing a tutorial if it's good enough.
+It's good to share your knowledge with other devs — after all, you probably learned a thing or two from online articles, so you take the time to pay that knowledge forward. Talking or writing about something you achieved or problems you overcame is something people would be interested in. Also, you can use your own game as an example, especially in a tutorial when you're [showing how to do something you've implemented already](/en-US/docs/Games/Techniques/Controls_Gamepad_API). That way everyone benefits — people learn new skills, your game gets promoted, and if you're lucky you can even get paid for writing a tutorial if it's good enough.
-There are portals like [Tuts+ Game Development](https://gamedevelopment.tutsplus.com/) which will be more than happy if you write for them - they pay for the content, but not all topic ideas will be accepted. When writing a tutorial remember to focus on delivering something valuable to the reader. They want to learn something - offer your expertise and use your game as a case study. Focus on one aspect and try to explain it throughout and in detail. Also remember to follow up discussion in comments if people have any questions.
+There are portals like [Tuts+ Game Development](https://gamedevelopment.tutsplus.com/) which will be more than happy if you write for them - they pay for the content, but not all topic ideas will be accepted. When writing a tutorial remember to focus on delivering something valuable to the reader. They want to learn something - offer your expertise and use your game as a case study. Focus on one aspect and try to explain it throughout and in detail. Also, remember to follow up on discussions in your comments if people have any questions.
-If portals you contact are not interested in your content because you don't have any experience yet, try writing tutorials and publish them on [your own blog](#website_and_blog) first. It's the easiest way to train your writing skills on your own.
+If portals you contact are not interested in your content because you don't have any experience yet, try writing tutorials and then publish them on [your own blog](#website_and_blog) first. It's the easiest way to train your writing skills on your own.
## Events
@@ -62,7 +62,7 @@ There are many conferences where you can give a talk explaining some technical d
### Fairs
-The other event-related option is fairs (or expos) — at such an event you can get a booth among other devs and promote your game to all the attendees passing by. If you do so, try to be unique and original, so you easily stand from the crowd. Do it the right way and everybody will be talking about you and your game. Having a booth gives you the possibility to interact with your fans directly — besides the promotion part you can also test new builds of your game on regular people and fix any bugs (or incorporate any feedback) they uncover. You can't imagine what people may come up with when playing your game, and what obvious issues you've missed while spending hours polishing it.
+The other event-related option is fairs (or expos) — at such an event you can get a booth among other devs and promote your game to all the attendees passing by. If you do so, try to be unique and original, so you easily stand out from the crowd. Do it the right way and everybody will be talking about you and your game. Having a booth gives you the possibility to interact with your fans directly — besides the promotion part, you can also test new builds of your game on regular people and fix any bugs (or incorporate any feedback) they uncover. You can't imagine what people may come up with when playing your game, and what obvious issues you've missed while spending hours polishing it.
## Promo codes
@@ -74,6 +74,6 @@ You can help community grow and promote yourself and your games at the same time
## Summary
-Any way of promoting your game is good. You have a lot of options to chose from with most of them being free, so it's only about your enthusiasm and available time. Sometimes you have to spend more time promoting a game than actually developing it. Remember that it's no use to have the best game in the world if no one knows it exists.
+Any way of promoting your game is good. You have a lot of options to choose from with most of them being free, so it's only about your enthusiasm and available time. Sometimes you have to spend more time promoting a game than actually developing it. Remember that it's no use to have the best game in the world if no one knows it exists.
-Now lets get on with that [monetization](/en-US/docs/Games/Publishing_games/Game_monetization) part, and earn something for a living.
+Now, let's get on with that [monetization](/en-US/docs/Games/Publishing_games/Game_monetization) part, and earn something for a living.
diff --git a/files/en-us/games/techniques/2d_collision_detection/index.md b/files/en-us/games/techniques/2d_collision_detection/index.md
index 929099bf7e4b29f..e733db70b2d3aa3 100644
--- a/files/en-us/games/techniques/2d_collision_detection/index.md
+++ b/files/en-us/games/techniques/2d_collision_detection/index.md
@@ -131,7 +131,7 @@ circle2.bind("EnterFrame", function () {
## Separating Axis Theorem
-This is a collision algorithm that can detect a collision between any two \*convex\* polygons. It's more complicated to implement than the above methods but is more powerful. The complexity of an algorithm like this means we will need to consider performance optimization, covered in the next section.
+This is a collision algorithm that can detect a collision between any two _convex_ polygons. It's more complicated to implement than the above methods but is more powerful. The complexity of an algorithm like this means we will need to consider performance optimization, covered in the next section.
Implementing SAT is out of scope for this page so see the recommended tutorials below:
@@ -143,11 +143,11 @@ Implementing SAT is out of scope for this page so see the recommended tutorials
## Collision Performance
-While some of these algorithms for collision detection are simple enough to calculate, it can be a waste of cycles to test \*every\* entity with every other entity. Usually games will split collision into two phases, broad and narrow.
+While some of these algorithms for collision detection are simple enough to calculate, it can be a waste of cycles to test _every_ entity with every other entity. Usually games will split collision into two phases, broad and narrow.
### Broad Phase
-Broad phase should give you a list of entities that \*could\* be colliding. This can be implemented with a spacial data structure that will give you a rough idea of where the entity exists and what exist around it. Some examples of spacial data structures are Quad Trees, R-Trees or a Spacial Hashmap.
+Broad phase should give you a list of entities that _could_ be colliding. This can be implemented with a spacial data structure that will give you a rough idea of where the entity exists and what exist around it. Some examples of spacial data structures are Quad Trees, R-Trees or a Spacial Hashmap.
### Narrow Phase
diff --git a/files/en-us/games/techniques/3d_on_the_web/webxr/index.md b/files/en-us/games/techniques/3d_on_the_web/webxr/index.md
index 82d27c467fbce29..0090cbc5b64d6c0 100644
--- a/files/en-us/games/techniques/3d_on_the_web/webxr/index.md
+++ b/files/en-us/games/techniques/3d_on_the_web/webxr/index.md
@@ -18,7 +18,7 @@ With the popularity of existing VR headsets such as Meta Quest, Valve Index, and
### Development of WebVR
-The [WebVR spec](https://mozvr.github.io/webvr-spec/webvr.html), led by [Vladimir Vukicevic](https://twitter.com/vvuk) from Mozilla and [Brandon Jones](https://twitter.com/tojiro) from Google, is being replaced by the [WebXR Device API](/en-US/docs/Web/API/WebXR_Device_API). WebVR may still be available in some browsers while WebXR is finalized.
+The [WebVR spec](https://mozvr.github.io/webvr-spec/webvr.html) is being replaced by the [WebXR Device API](/en-US/docs/Web/API/WebXR_Device_API). WebVR may still be available in some browsers while WebXR is finalized.
For more info, see the [WebVR.info](https://webvr.info/) website.
## The WebXR API
diff --git a/files/en-us/games/techniques/audio_for_web_games/index.md b/files/en-us/games/techniques/audio_for_web_games/index.md
index ada37a835192fd7..a937448f36f0b27 100644
--- a/files/en-us/games/techniques/audio_for_web_games/index.md
+++ b/files/en-us/games/techniques/audio_for_web_games/index.md
@@ -226,7 +226,7 @@ Let's look at some Web Audio API techniques for dynamically adjusting music from
### Loading your tracks
-With the Web Audio API you can load separate tracks and loops individually using {{domxref("XMLHttpRequest")}} or the [Fetch API](/en-US/docs/Web/API/Fetch_API), which means you can load them synchronously or in parallel. Loading synchronously might mean parts of your music are ready earlier and you can start playing them while others load.
+With the Web Audio API you can load separate tracks and loops individually using the [Fetch API](/en-US/docs/Web/API/Fetch_API) or {{domxref("XMLHttpRequest")}}, which means you can load them synchronously or in parallel. Loading synchronously might mean parts of your music are ready earlier and you can start playing them while others load.
Either way you may want to synchronize tracks or loops. The Web Audio API contains the notion of an internal clock that starts ticking the moment you create an audio context. You'll need to take account of the time between creating an audio context and when the first audio track starts playing. Recording this offset and querying the playing track's current time gives you enough information to synchronize separate pieces of audio.
diff --git a/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md b/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md
index 5906380ceedc6fd..eddfdeedad10f08 100644
--- a/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md
+++ b/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md
@@ -51,7 +51,7 @@ function touchHandler(e) {
if (e.touches) {
playerX = e.touches[0].pageX - canvas.offsetLeft - playerWidth / 2;
playerY = e.touches[0].pageY - canvas.offsetTop - playerHeight / 2;
- output.textContent = `Touch: x: ${playerX}, y: ${playerY}`;
+ output.textContent = `Touch:\nx: ${playerX}, y: ${playerY}`;
e.preventDefault();
}
}
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md
index 1173df8394060f3..86eea7d8a4b15de 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/bounce_off_the_walls/index.md
@@ -10,7 +10,7 @@ page-type: guide
This is the **3rd step** out of 10 of the [Gamedev Canvas tutorial](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript). You can find the source code as it should look after completing this lesson at [Gamedev-Canvas-workshop/lesson3.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson03.html).
-It is nice to see our ball moving, but it quickly disappears from the screen, limiting the fun we can have with it! To overcome that we will implement some very simple collision detection (which will be explained [later](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Collision_detection) in more detail) to make the ball bounce off the four edges of the Canvas.
+It is nice to see our ball moving, but it quickly disappears from the screen, limiting the fun we can have with it! To overcome that we will implement some collision detection (which will be explained [later](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Collision_detection) in more detail) to make the ball bounce off the four edges of the Canvas.
## Simple collision detection
@@ -99,7 +99,63 @@ When the distance between the center of the ball and the edge of the wall is exa
Let's again check the finished code for this part against what you've got, and have a play:
-{{JSFiddleEmbed("https://jsfiddle.net/end3r/redj37dc/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBall();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) {
+ dy = -dy;
+ }
+
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+ this.disabled = true;
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:** Try changing the color of the ball to a random color every time it hits the wall.
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md
index 0e97fb25dff05e8..b755357c150afd5 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/build_the_brick_field/index.md
@@ -103,7 +103,147 @@ drawBricks();
At this point, the game has got a little more interesting again:
-{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/Lu3vtejz/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+
+let dx = 2;
+let dy = -2;
+
+const paddleHeight = 10;
+const paddleWidth = 75;
+
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+
+const brickRowCount = 3;
+const brickColumnCount = 5;
+const brickWidth = 75;
+const brickHeight = 20;
+const brickPadding = 10;
+const brickOffsetTop = 30;
+const brickOffsetLeft = 30;
+
+let bricks = [];
+for (let c = 0; c < brickColumnCount; c++) {
+ bricks[c] = [];
+ for (let r = 0; r < brickRowCount; r++) {
+ bricks[c][r] = { x: 0, y: 0 };
+ }
+}
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawBricks() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ let brickX = c * (brickWidth + brickPadding) + brickOffsetLeft;
+ let brickY = r * (brickHeight + brickPadding) + brickOffsetTop;
+ bricks[c][r].x = brickX;
+ bricks[c][r].y = brickY;
+ ctx.beginPath();
+ ctx.rect(brickX, brickY, brickWidth, brickHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+ }
+ }
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBricks();
+ drawBall();
+ drawPaddle();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy < ballRadius) {
+ dy = -dy;
+ } else if (y + dy > canvas.height - ballRadius) {
+ if (x > paddleX && x < paddleX + paddleWidth) {
+ if ((y = y - paddleHeight)) {
+ dy = -dy;
+ }
+ } else {
+ alert("GAME OVER");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+
+ if (rightPressed && paddleX < canvas.width - paddleWidth) {
+ paddleX += 7;
+ } else if (leftPressed && paddleX > 0) {
+ paddleX -= 7;
+ }
+
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+ this.disabled = true;
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:** Try changing the number of bricks in a row or a column, or their positions.
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md
index 45265bcf101ee6a..130a4cdf26ab10b 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/collision_detection/index.md
@@ -58,7 +58,8 @@ Add the above block to your code, below the `keyUpHandler()` function.
The above code will work as desired and the ball changes its direction. The problem is that the bricks are staying where they are. We have to figure out a way to get rid of the ones we've already hit with the ball. We can do that by adding an extra parameter to indicate whether we want to paint each brick on the screen or not. In the part of the code where we initialize the bricks, let's add a `status` property to each brick object. Update the following part of the code as indicated by the highlighted line:
```js
-const bricks = [];
+let bricks = [];
+
for (let c = 0; c < brickColumnCount; c++) {
bricks[c] = [];
for (let r = 0; r < brickRowCount; r++) {
@@ -124,11 +125,168 @@ collisionDetection();
## Compare your code
-The collision detection of the ball is now checked on every frame, with every brick. Now we can destroy bricks! :-
+The collision detection of the ball is now checked on every frame, with every brick. Now we can destroy bricks! :-)
+
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+
+const paddleHeight = 10;
+const paddleWidth = 75;
+
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+
+const brickRowCount = 3;
+const brickColumnCount = 5;
+const brickWidth = 75;
+const brickHeight = 20;
+const brickPadding = 10;
+const brickOffsetTop = 30;
+const brickOffsetLeft = 30;
+
+let bricks = [];
+for (let c = 0; c < brickColumnCount; c++) {
+ bricks[c] = [];
+ for (let r = 0; r < brickRowCount; r++) {
+ bricks[c][r] = { x: 0, y: 0, status: 1 };
+ }
+}
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+function collisionDetection() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ let b = bricks[c][r];
+ if (b.status == 1) {
+ if (
+ x > b.x &&
+ x < b.x + brickWidth &&
+ y > b.y &&
+ y < b.y + brickHeight
+ ) {
+ dy = -dy;
+ b.status = 0;
+ }
+ }
+ }
+ }
+}
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawBricks() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ if (bricks[c][r].status == 1) {
+ let brickX = c * (brickWidth + brickPadding) + brickOffsetLeft;
+ let brickY = r * (brickHeight + brickPadding) + brickOffsetTop;
+ bricks[c][r].x = brickX;
+ bricks[c][r].y = brickY;
+ ctx.beginPath();
+ ctx.rect(brickX, brickY, brickWidth, brickHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+ }
+ }
+ }
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBricks();
+ drawBall();
+ drawPaddle();
+ collisionDetection();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy < ballRadius) {
+ dy = -dy;
+ } else if (y + dy > canvas.height - ballRadius) {
+ if (x > paddleX && x < paddleX + paddleWidth) {
+ if ((y = y - paddleHeight)) {
+ dy = -dy;
+ }
+ } else {
+ alert("GAME OVER");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+
+ if (rightPressed && paddleX < canvas.width - paddleWidth) {
+ paddleX += 7;
+ } else if (leftPressed && paddleX > 0) {
+ paddleX -= 7;
+ }
-{{JSFiddleEmbed("https://jsfiddle.net/yumetodo/kaed3hbu/","","395")}}
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+ this.disabled = true;
+});
+```
-> **Note:** Try changing the color of the ball when it hits the brick.
+{{embedlivesample("compare_your_code", 600, 360)}}
## Next steps
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md
index bffb99ff63ef1a1..0ac2818d772be55 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/create_the_canvas_and_draw_on_it/index.md
@@ -14,7 +14,7 @@ Before we can start writing the game's functionality, we need to create a basic
## The game's HTML
-The HTML document structure is quite simple, as the game will be rendered entirely on the {{htmlelement("canvas")}} element. Using your favorite text editor, create a new HTML document, save it as `index.html`, in a sensible location, and add the following code to it:
+The HTML document structure is quite minimal, as the game will be rendered entirely on the {{htmlelement("canvas")}} element. Using your favorite text editor, create a new HTML document, save it as `index.html`, in a sensible location, and add the following code to it:
```html
@@ -86,25 +86,58 @@ As you can see we're using the {{domxref("CanvasRenderingContext2D.beginPath()",
- start angle and end angle (what angle to start and finish drawing the circle, in radians)
- direction of drawing (`false` for clockwise, the default, or `true` for anti-clockwise.) This last parameter is optional.
-The {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} property looks different than before. This is because, just as with CSS, color can be specified as a hexadecimal value, a color keyword, the `rgba()` function, or any of the other available color methods.
+The {{domxref("CanvasRenderingContext2D.fillStyle","fillStyle")}} property looks different than before. This is because, just as with CSS, color can be specified as a hexadecimal value, a color keyword, the `rgb()` function, or any of the other available color methods.
Instead of using {{domxref("CanvasRenderingContext2D.fill()","fill()")}} and filling the shapes with colors, we can use {{domxref("CanvasRenderingContext2D.stroke()","stroke()")}} to only color the outer stroke. Try adding this code to your JavaScript too:
```js
ctx.beginPath();
ctx.rect(160, 10, 100, 40);
-ctx.strokeStyle = "rgba(0, 0, 255, 0.5)";
+ctx.strokeStyle = "rgb(0 0 255 / 50%)";
ctx.stroke();
ctx.closePath();
```
-The code above prints a blue-stroked empty rectangle. Thanks to the alpha channel in the `rgba()` function, the blue color is semi transparent.
+The code above prints a blue-stroked empty rectangle. Thanks to the alpha channel in the `rgb()` function, the blue color is semi transparent.
## Compare your code
-Here's the full source code of the first lesson, running live in a JSFiddle:
+Here's the full source code of the first lesson, running live:
+
+```html
+
+```
+
+```css
+canvas {
+ background: #eee;
+}
+```
+
+```js
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+
+ctx.beginPath();
+ctx.rect(20, 40, 50, 50);
+ctx.fillStyle = "#FF0000";
+ctx.fill();
+ctx.closePath();
+
+ctx.beginPath();
+ctx.arc(240, 160, 20, 0, Math.PI * 2, false);
+ctx.fillStyle = "green";
+ctx.fill();
+ctx.closePath();
+
+ctx.beginPath();
+ctx.rect(160, 10, 100, 40);
+ctx.strokeStyle = "rgba(0, 0, 255, 0.5)";
+ctx.stroke();
+ctx.closePath();
+```
-{{JSFiddleEmbed("https://jsfiddle.net/end3r/x62h15e2/","","395")}}
+{{embedlivesample("compare_your_code", 600, 340)}}
> **Note:** Try changing the size and color of the given shapes.
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md
index 99fd07e143f0850..fc5b52e09f0db9b 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/finishing_up/index.md
@@ -95,15 +95,207 @@ The `draw()` function is now getting executed again and again within a `requestA
## Compare your code
-That's all — the final version of the game is ready and set to go !
+That's all — the final version of the game is ready and set to go!
-{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/dfh2tpu1/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+
+const paddleHeight = 10;
+const paddleWidth = 75;
+
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+
+const brickRowCount = 5;
+const brickColumnCount = 3;
+const brickWidth = 75;
+const brickHeight = 20;
+const brickPadding = 10;
+const brickOffsetTop = 30;
+const brickOffsetLeft = 30;
+
+let score = 0;
+let lives = 3;
+
+let bricks = [];
+
+for (let c = 0; c < brickColumnCount; c++) {
+ bricks[c] = [];
+ for (let r = 0; r < brickRowCount; r++) {
+ bricks[c][r] = { x: 0, y: 0, status: 1 };
+ }
+}
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+document.addEventListener("mousemove", mouseMoveHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+
+function mouseMoveHandler(e) {
+ let relativeX = e.clientX - canvas.offsetLeft;
+ if (relativeX > 0 && relativeX < canvas.width) {
+ paddleX = relativeX - paddleWidth / 2;
+ }
+}
+function collisionDetection() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ let b = bricks[c][r];
+ if (b.status == 1) {
+ if (
+ x > b.x &&
+ x < b.x + brickWidth &&
+ y > b.y &&
+ y < b.y + brickHeight
+ ) {
+ dy = -dy;
+ b.status = 0;
+ score++;
+ if (score == brickRowCount * brickColumnCount) {
+ alert("YOU WIN, CONGRATS!");
+ document.location.reload();
+ }
+ }
+ }
+ }
+ }
+}
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawBricks() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ if (bricks[c][r].status == 1) {
+ const brickX = r * (brickWidth + brickPadding) + brickOffsetLeft;
+ const brickY = c * (brickHeight + brickPadding) + brickOffsetTop;
+ bricks[c][r].x = brickX;
+ bricks[c][r].y = brickY;
+ ctx.beginPath();
+ ctx.rect(brickX, brickY, brickWidth, brickHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+ }
+ }
+ }
+}
+function drawScore() {
+ ctx.font = "16px Arial";
+ ctx.fillStyle = "#0095DD";
+ ctx.fillText("Score: " + score, 8, 20);
+}
+function drawLives() {
+ ctx.font = "16px Arial";
+ ctx.fillStyle = "#0095DD";
+ ctx.fillText("Lives: " + lives, canvas.width - 65, 20);
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBricks();
+ drawBall();
+ drawPaddle();
+ drawScore();
+ drawLives();
+ collisionDetection();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy < ballRadius) {
+ dy = -dy;
+ } else if (y + dy > canvas.height - ballRadius) {
+ if (x > paddleX && x < paddleX + paddleWidth) {
+ dy = -dy;
+ } else {
+ lives--;
+ if (!lives) {
+ alert("GAME OVER");
+ document.location.reload();
+ } else {
+ x = canvas.width / 2;
+ y = canvas.height - 30;
+ dx = 3;
+ dy = -3;
+ paddleX = (canvas.width - paddleWidth) / 2;
+ }
+ }
+ }
+
+ if (rightPressed && paddleX < canvas.width - paddleWidth) {
+ paddleX += 7;
+ } else if (leftPressed && paddleX > 0) {
+ paddleX -= 7;
+ }
+
+ x += dx;
+ y += dy;
+ requestAnimationFrame(draw);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ draw();
+ this.disabled = true;
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:**: Try changing the number of lives and the angle the ball bounces off the paddle.
## Game over - for now!
-You've finished all the lessons - congratulations! By this point, you should now know the basics of canvas manipulation and the logic behind simple 2D games. Now it's a good time to learn some frameworks and continue game development. You can check out this series' counterpart, [2D breakout game using Phaser](/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser) or the [Cyber Orb built in Phaser](/en-US/docs/Games/Tutorials/HTML5_Gamedev_Phaser_Device_Orientation) tutorial. You can also look through the [Games section on MDN](/en-US/docs/Games) for inspiration and more knowledge.
+You've finished all the lessons - congratulations! By this point, you should now know the basics of canvas manipulation and the logic behind 2D games. Now it's a good time to learn some frameworks and continue game development. You can check out this series' counterpart, [2D breakout game using Phaser](/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser) or the [Cyber Orb built in Phaser](/en-US/docs/Games/Tutorials/HTML5_Gamedev_Phaser_Device_Orientation) tutorial. You can also look through the [Games section on MDN](/en-US/docs/Games) for inspiration and more knowledge.
You could also go back to [this tutorial series' index page](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript). Have fun coding!
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md
index 4909dc144714bde..027cec5f375af61 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/game_over/index.md
@@ -10,7 +10,7 @@ page-type: guide
This is the **5th step** out of 10 of the [Gamedev Canvas tutorial](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript). You can find the source code as it should look after completing this lesson at [Gamedev-Canvas-workshop/lesson5.html](https://github.com/end3r/Gamedev-Canvas-workshop/blob/gh-pages/lesson05.html).
-It's fun to watch the ball bouncing off the walls and be able to move the paddle around, but other than that the game does nothing and doesn't have any progression or end goal. It would be good from the gameplay point of view to be able to lose. The logic behind losing in breakout is simple. If you miss the ball with the paddle and let it reach the bottom edge of the screen, then it's game over.
+It's fun to watch the ball bouncing off the walls and be able to move the paddle around, but other than that the game does nothing and doesn't have any progression or end goal. It would be good from the gameplay point of view to be able to lose. The logic behind losing in breakout is that if you miss the ball with the paddle and let it reach the bottom edge of the screen, then it's game over.
## Implementing game over
@@ -26,7 +26,7 @@ if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) {
}
```
-Instead of allowing the ball to bounce off all four walls, let's only allow three now — left, top and right. Hitting the bottom wall will end the game. We'll edit the second if block so it's an if else block that will trigger our "game over" state upon the ball colliding with the bottom edge of the canvas. For now we'll keep it simple, showing an alert message and restarting the game by reloading the page.
+Instead of allowing the ball to bounce off all four walls, let's only allow three now — left, top and right. Hitting the bottom wall will end the game. We'll edit the second if block so it's an if else block that will trigger our "game over" state upon the ball colliding with the bottom edge of the canvas. For now we'll show an alert message and restarting the game by reloading the page.
First, replace where you initially called `setInterval()`
@@ -74,9 +74,114 @@ If the ball hits the bottom edge of the Canvas we need to check whether it hits
## Compare your code
-Here's the working code for you to compare yours against:
+See how your code compares to the live sample below:
-{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/L61c9y50/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+
+const paddleHeight = 10;
+const paddleWidth = 75;
+
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBall();
+ drawPaddle();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy < ballRadius) {
+ dy = -dy;
+ } else if (y + dy > canvas.height - ballRadius) {
+ if (x > paddleX && x < paddleX + paddleWidth) {
+ dy = -dy;
+ } else {
+ alert("GAME OVER");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+
+ if (rightPressed && paddleX < canvas.width - paddleWidth) {
+ paddleX += 7;
+ } else if (leftPressed && paddleX > 0) {
+ paddleX -= 7;
+ }
+
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ let interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+ this.disabled = true;
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:** Try making the ball move faster when it hits the paddle.
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/index.md
index 61adc1d779a7411..015b4bd1a23d1f6 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/index.md
@@ -8,11 +8,11 @@ page-type: guide
{{Next("Games/Workflows/2D_Breakout_game_pure_JavaScript/Create_the_Canvas_and_draw_on_it")}}
-In this step-by-step tutorial we create a simple **MDN Breakout** game written entirely in pure JavaScript and rendered on HTML {{htmlelement("canvas")}}.
+In this step-by-step tutorial we create an **MDN Breakout** game written entirely in pure JavaScript and rendered on HTML {{htmlelement("canvas")}}.
Every step has editable, live samples available to play with so you can see what the intermediate stages should look like. You will learn the basics of using the {{htmlelement("canvas")}} element to implement fundamental game mechanics like rendering and moving images, collision detection, control mechanisms, and winning and losing states.
-To get the most out of this series of articles you should already have basic to intermediate [JavaScript](/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics) knowledge. After working through this tutorial you should be able to build your own simple Web games.
+To get the most out of this series of articles you should already have basic to intermediate [JavaScript](/en-US/docs/Learn/Getting_started_with_the_web/JavaScript_basics) knowledge. After working through this tutorial you should be able to build your own Web games.
![Gameplay screen from the game MDN Breakout where you can use your paddle to bounce the ball and destroy the brick field, with keeping the score and lives.](mdn-breakout-gameplay.png)
@@ -33,12 +33,13 @@ All the lessons — and the different versions of the [MDN Breakout game](https:
Starting with pure JavaScript is the best way to get a solid knowledge of web game development. After that, you can pick any framework you like and use it for your projects. Frameworks are just tools built with the JavaScript language; so even if you plan on working with them, it's good to learn about the language itself first to know what exactly is going on under the hood. Frameworks speed up development time and help take care of boring parts of the game, but if something is not working as expected, you can always try to debug that or just write your own solutions in pure JavaScript.
-> **Note:** If you are interested in learning about 2D web game development using a game library, consult this series' counterpart, [2D breakout game using Phaser](/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser).
-
-> **Note:** This series of articles can be used as material for hands-on game development workshops. You can also make use of the [Gamedev Canvas Content Kit](https://github.com/end3r/Gamedev-Canvas-Content-Kit) based on this tutorial if you want to give a talk about game development in general.
+> **Note:**
+> This series of articles can be used as material for hands-on game development workshops. You can also make use of the [Gamedev Canvas Content Kit](https://github.com/end3r/Gamedev-Canvas-Content-Kit) based on this tutorial if you want to give a talk about game development in general.
+>
+> If you are interested in using a game library for learning about 2D web game development, see this series' counterpart, [2D breakout game using Phaser](/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser).
## Next steps
-Ok, let's get started! Head to the first chapter— [Create the Canvas and draw on it](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Create_the_Canvas_and_draw_on_it).
+Ok, let's get started! Head to the first chapter [Create the Canvas and draw on it](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Create_the_Canvas_and_draw_on_it).
{{Next("Games/Workflows/2D_Breakout_game_pure_JavaScript/Create_the_Canvas_and_draw_on_it")}}
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md
index 5e53060bc06b5cd..6cbddde3bdb6987 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/mouse_controls/index.md
@@ -41,7 +41,186 @@ The paddle will now follow the position of the mouse cursor, but since we're res
This is the latest state of the code to compare against:
-{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/vt7y5hcp/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+
+const paddleHeight = 10;
+const paddleWidth = 75;
+
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+
+const brickRowCount = 5;
+const brickColumnCount = 3;
+const brickWidth = 75;
+const brickHeight = 20;
+const brickPadding = 10;
+const brickOffsetTop = 30;
+const brickOffsetLeft = 30;
+
+let score = 0;
+let bricks = [];
+
+for (let c = 0; c < brickColumnCount; c++) {
+ bricks[c] = [];
+ for (let r = 0; r < brickRowCount; r++) {
+ bricks[c][r] = { x: 0, y: 0, status: 1 };
+ }
+}
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+document.addEventListener("mousemove", mouseMoveHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+
+function mouseMoveHandler(e) {
+ const relativeX = e.clientX - canvas.offsetLeft;
+ if (relativeX > 0 && relativeX < canvas.width) {
+ paddleX = relativeX - paddleWidth / 2;
+ }
+}
+function collisionDetection() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ let b = bricks[c][r];
+ if (b.status == 1) {
+ if (
+ x > b.x &&
+ x < b.x + brickWidth &&
+ y > b.y &&
+ y < b.y + brickHeight
+ ) {
+ dy = -dy;
+ b.status = 0;
+ score++;
+ if (score == brickRowCount * brickColumnCount) {
+ alert("YOU WIN, CONGRATS!");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+ }
+ }
+ }
+}
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawBricks() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ if (bricks[c][r].status == 1) {
+ const brickX = r * (brickWidth + brickPadding) + brickOffsetLeft;
+ const brickY = c * (brickHeight + brickPadding) + brickOffsetTop;
+ bricks[c][r].x = brickX;
+ bricks[c][r].y = brickY;
+ ctx.beginPath();
+ ctx.rect(brickX, brickY, brickWidth, brickHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+ }
+ }
+ }
+}
+function drawScore() {
+ ctx.font = "16px Arial";
+ ctx.fillStyle = "#0095DD";
+ ctx.fillText("Score: " + score, 8, 20);
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBricks();
+ drawBall();
+ drawPaddle();
+ drawScore();
+ collisionDetection();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy < ballRadius) {
+ dy = -dy;
+ } else if (y + dy > canvas.height - ballRadius) {
+ if (x > paddleX && x < paddleX + paddleWidth) {
+ dy = -dy;
+ } else {
+ alert("GAME OVER");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+
+ if (rightPressed && paddleX < canvas.width - paddleWidth) {
+ paddleX += 7;
+ } else if (leftPressed && paddleX > 0) {
+ paddleX -= 7;
+ }
+
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:** Try adjusting the boundaries of the paddle movement, so the whole paddle will be visible on both edges of the Canvas instead of only half of it.
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md
index 845f0033fb906b4..9b1d492dc57a9d7 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/move_the_ball/index.md
@@ -14,7 +14,8 @@ You already know how to draw a ball from working through the previous article, s
## Defining a drawing loop
-To keep constantly updating the canvas drawing on each frame, we need to define a drawing function that will run over and over again, with a different set of variable values each time to change sprite positions, etc. You can run a function over and over again using a JavaScript timing function such as {{domxref("setInterval()")}} or {{domxref("window.requestAnimationFrame()", "requestAnimationFrame()")}}.
+To keep constantly updating the canvas drawing on each frame, we need to define a drawing function that will run over and over again, with a different set of variable values each time to change sprite positions, etc. You can run a function over and over again using a JavaScript timing function.
+Later on in the tutorial, we'll see how {{domxref("window.requestAnimationFrame()", "requestAnimationFrame()")}} helps with drawing, but we'll start with {{domxref("setInterval()")}} at first to create some looping logic.
Delete all the JavaScript you currently have inside your HTML file except for the first two lines, and add the following below them. The `draw()` function will be executed within `setInterval` every 10 milliseconds:
@@ -108,7 +109,7 @@ Save your code and try again, and this time you'll see the ball move without a t
## Cleaning up our code
-We will be adding more and more commands to the `draw()` function in the next few articles, so it's good to keep it as simple and clean as possible. Let's start by moving the ball drawing code to a separate function.
+We will be adding more and more commands to the `draw()` function in the next few articles, so it's good to keep it as minimal and clean as possible. Let's start by moving the ball drawing code to a separate function.
Replace the existing draw() function with the following two functions:
@@ -131,9 +132,59 @@ function draw() {
## Compare your code
-You can check the finished code for this article for yourself in the live demo below, and play with it to understand better how it works:
+You can check the finished code for this article in the live demo below and play with it to understand better how it works.
-{{JSFiddleEmbed("https://jsfiddle.net/end3r/3x5foxb1/","","395")}}
+> **Note:** Live samples run automatically on these pages, so we've added a "start game" button.
+> This is useful to avoid games starting automatically and triggering alerts or other events too often.
+
+```html
+
+
+```
+
+```css
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+const dx = 2;
+const dy = -2;
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, 10, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBall();
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+ this.disabled = true;
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 350)}}
> **Note:** Try changing the speed of the moving ball, or the direction it moves in.
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md
index 1d0b3d971430862..bc0c7f42c4c5be6 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/paddle_and_keyboard_controls/index.md
@@ -115,14 +115,114 @@ drawPaddle();
## Compare your code
-Here's the working code for you to compare yours against:
+See how your code compares to the live sample below:
-{{JSFiddleEmbed("https://jsfiddle.net/L9xfn4up/1/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+const paddleHeight = 10;
+const paddleWidth = 75;
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBall();
+ drawPaddle();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) {
+ dy = -dy;
+ }
+
+ if (rightPressed) {
+ paddleX += 7;
+ if (paddleX + paddleWidth > canvas.width) {
+ paddleX = canvas.width - paddleWidth;
+ }
+ } else if (leftPressed) {
+ paddleX -= 7;
+ if (paddleX < 0) {
+ paddleX = 0;
+ }
+ }
+
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+ this.disabled = true;
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:** Try making the paddle move faster or slower, or change its size.
## Next steps
-Now we have something resembling a game. The only trouble now is that you can just continue hitting the ball with the paddle forever. This will all change in the fifth chapter, [Game over](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Game_over), when we start to add in an endgame state for our game.
+Now we have something resembling a game. The only trouble now is that you can just continue hitting the ball with the paddle and there's no winning or losing implemented. This will all change in the fifth chapter, [Game over](/en-US/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript/Game_over), when we start to add in an endgame state for our game.
{{PreviousNext("Games/Workflows/2D_Breakout_game_pure_JavaScript/Bounce_off_the_walls", "Games/Workflows/2D_Breakout_game_pure_JavaScript/Game_over")}}
diff --git a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md
index 799e526085ad22f..74434d6a8c68cf8 100644
--- a/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md
+++ b/files/en-us/games/tutorials/2d_breakout_game_pure_javascript/track_the_score_and_win/index.md
@@ -99,7 +99,173 @@ Thanks to this, your users can actually win the game when they destroy all the b
The latest code looks (and works) like this, in case you want to compare and contrast it with yours:
-{{JSFiddleEmbed("https://jsfiddle.net/raymondjplante/b3z2Lpu9/","","395")}}
+```html hidden
+
+
+```
+
+```css hidden
+canvas {
+ background: #eee;
+}
+button {
+ display: block;
+}
+```
+
+```js hidden
+const canvas = document.getElementById("myCanvas");
+const ctx = canvas.getContext("2d");
+const ballRadius = 10;
+let x = canvas.width / 2;
+let y = canvas.height - 30;
+let dx = 2;
+let dy = -2;
+const paddleHeight = 10;
+const paddleWidth = 75;
+let paddleX = (canvas.width - paddleWidth) / 2;
+let rightPressed = false;
+let leftPressed = false;
+const brickRowCount = 5;
+const brickColumnCount = 3;
+const brickWidth = 75;
+const brickHeight = 20;
+const brickPadding = 10;
+const brickOffsetTop = 30;
+const brickOffsetLeft = 30;
+let score = 0;
+
+let bricks = [];
+for (let c = 0; c < brickColumnCount; c++) {
+ bricks[c] = [];
+ for (let r = 0; r < brickRowCount; r++) {
+ bricks[c][r] = { x: 0, y: 0, status: 1 };
+ }
+}
+
+document.addEventListener("keydown", keyDownHandler, false);
+document.addEventListener("keyup", keyUpHandler, false);
+
+function keyDownHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = true;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = true;
+ }
+}
+
+function keyUpHandler(e) {
+ if (e.key == "Right" || e.key == "ArrowRight") {
+ rightPressed = false;
+ } else if (e.key == "Left" || e.key == "ArrowLeft") {
+ leftPressed = false;
+ }
+}
+function collisionDetection() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ let b = bricks[c][r];
+ if (b.status == 1) {
+ if (
+ x > b.x &&
+ x < b.x + brickWidth &&
+ y > b.y &&
+ y < b.y + brickHeight
+ ) {
+ dy = -dy;
+ b.status = 0;
+ score++;
+ if (score == brickRowCount * brickColumnCount) {
+ alert("YOU WIN, CONGRATS!");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+ }
+ }
+ }
+}
+
+function drawBall() {
+ ctx.beginPath();
+ ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawPaddle() {
+ ctx.beginPath();
+ ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+}
+function drawBricks() {
+ for (let c = 0; c < brickColumnCount; c++) {
+ for (let r = 0; r < brickRowCount; r++) {
+ if (bricks[c][r].status == 1) {
+ const brickX = r * (brickWidth + brickPadding) + brickOffsetLeft;
+ const brickY = c * (brickHeight + brickPadding) + brickOffsetTop;
+ bricks[c][r].x = brickX;
+ bricks[c][r].y = brickY;
+ ctx.beginPath();
+ ctx.rect(brickX, brickY, brickWidth, brickHeight);
+ ctx.fillStyle = "#0095DD";
+ ctx.fill();
+ ctx.closePath();
+ }
+ }
+ }
+}
+function drawScore() {
+ ctx.font = "16px Arial";
+ ctx.fillStyle = "#0095DD";
+ ctx.fillText("Score: " + score, 8, 20);
+}
+
+function draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ drawBricks();
+ drawBall();
+ drawPaddle();
+ drawScore();
+ collisionDetection();
+
+ if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
+ dx = -dx;
+ }
+ if (y + dy < ballRadius) {
+ dy = -dy;
+ } else if (y + dy > canvas.height - ballRadius) {
+ if (x > paddleX && x < paddleX + paddleWidth) {
+ dy = -dy;
+ } else {
+ alert("GAME OVER");
+ document.location.reload();
+ clearInterval(interval); // Needed for Chrome to end game
+ }
+ }
+
+ if (rightPressed && paddleX < canvas.width - paddleWidth) {
+ paddleX += 7;
+ } else if (leftPressed && paddleX > 0) {
+ paddleX -= 7;
+ }
+
+ x += dx;
+ y += dy;
+}
+
+function startGame() {
+ const interval = setInterval(draw, 10);
+}
+
+document.getElementById("runButton").addEventListener("click", function () {
+ startGame();
+});
+```
+
+{{embedlivesample("compare_your_code", 600, 360)}}
> **Note:** Try adding more points per brick hit, print out the number of collected points in the end game alert box.
diff --git a/files/en-us/glossary/accessible_description/index.md b/files/en-us/glossary/accessible_description/index.md
new file mode 100644
index 000000000000000..c42ef0e3bf6e701
--- /dev/null
+++ b/files/en-us/glossary/accessible_description/index.md
@@ -0,0 +1,27 @@
+---
+title: Accessible description
+slug: Glossary/Accessible_description
+page-type: glossary-definition
+---
+
+{{GlossarySidebar}}
+
+An **accessible description** is the description of a user interface element that provides additional information to help users of assistive technology understand the UI element and its context. It is a text description associated with an HTML element that provides users of assistive technology with a description for the element beyond what is provided by the element's {{glossary("accessible name")}}.
+
+An element's accessible description is part of the {{glossary("accessibility tree")}} that makes web content available to {{glossary("Screen_reader", "screen readers")}} and other assistive technologies, which, in turn, make that content available to the users of those technologies.
+
+The accessible description for a {{htmlelement("table")}} is its first {{htmlelement("caption")}}, for the {{htmlelement("figure")}}, is the {{htmlelement("figcaption")}}, for the {{htmlelement("summary")}}, is the content of the {{htmlelement("details")}} it is nested in, and for the button {{htmlelement("input")}} elements, it is the `value` attribute's value, unless the element also has a `aria-describedby` or `aria-description` attribute, which takes precedence.
+
+For other elements, the description needs to be programmatically associated with the related element. In these cases, the accessible description is provided by the [`aria-describedby`](/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-describedby) attribute, [`aria-description`](/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-description) attribute, or the [`title`](/en-US/docs/Web/HTML/Global_attributes#title) attribute, if the `title` would not otherwise also be the {{glossary("accessible name")}} for that element, in that order of precedence.
+
+Descriptions are reduced to text strings. For example, if an element's `aria-describedby` attribute value is the `id` of an HTML {{htmlelement("img")}}, the description is the description of the image (usually the image's `alt` attribute).
+
+You can inspect the accessible description for any element on your page: look at your browser's developer tools' accessibility tab, which provides the accessibility information for the currently selected element.
+
+## See also
+
+- {{glossary("accessible name")}} glossary term
+- [ARIA roles](/en-US/docs/Web/Accessibility/ARIA/Roles)
+- [ARIA attribute](/en-US/docs/Web/Accessibility/ARIA/Attributes)
+- [Accessibility](/en-US/docs/Web/Accessibility)
+- [Learn accessibility](/en-US/docs/Learn/Accessibility)
diff --git a/files/en-us/glossary/alpha/index.md b/files/en-us/glossary/alpha/index.md
index 82e5c2874f91add..a977201ce7405ff 100644
--- a/files/en-us/glossary/alpha/index.md
+++ b/files/en-us/glossary/alpha/index.md
@@ -8,7 +8,7 @@ page-type: glossary-definition
The **alpha channel** specifies to opacity of a ({{CSSxRef("<color>")}}). Colors are represented in digital form as a collection of numbers, each representing the strength or intensity level of a given component of the color. Each of these components is called a **channel**. In a typical image file, the color channels describe how much red, green, and blue are used to make up the final color. To represent a color through which the background can be seen to some extent, a fourth channel is added to the color: the alpha channel.
-For example, the color `#8921F2` (also described as `rgb(137 33 242)` or `hsl(270 89% 54)`) is a nice shade of purple. Below you see a small box of that color in the top-left corner and a box of the _same_ color but with an alpha channel set at 0.5 (50% opacity), `#8921F280`, where `80` is the hexadecimal equivalent of 50%. This color is also described as `rgb(137 33 242 / 0.5)` or `hsl(270 89% 54 / 0.5)`. The two boxes are drawn on top of a paragraph of text.
+For example, the color `#8921F2` (also described as `rgb(137 33 242)` or `hsl(270 89% 54)`) is a nice shade of purple. Below you see a small box of that color in the top-left corner and a box of the _same_ color but with an alpha channel set at 50% (or 0.5) opacity, `#8921F280`, where `80` is the hexadecimal equivalent of 50%. This color is also described as `rgb(137 33 242 / 50%)` or `hsl(270 89% 54 / 50%)`. The two boxes are drawn on top of a paragraph of text.
![Image showing the effect of an alpha channel on a color.](alpha-channel-example.png)
diff --git a/files/en-us/glossary/block-level_content/index.md b/files/en-us/glossary/block-level_content/index.md
index 40f124af7e9b4c4..e8ee50a3a8833dc 100644
--- a/files/en-us/glossary/block-level_content/index.md
+++ b/files/en-us/glossary/block-level_content/index.md
@@ -42,6 +42,6 @@ p {
## See also
- [Inline-level content](/en-US/docs/Glossary/Inline-level_content)
-- [Block formatting context](/en-US/docs/Web/Guide/CSS/Block_formatting_context)
+- [Block formatting context](/en-US/docs/Web/CSS/CSS_display/Block_formatting_context)
- {{cssxref("display")}}
- [`writing-mode`](/en-US/docs/Web/CSS/writing-mode)
diff --git a/files/en-us/glossary/cacheable/index.md b/files/en-us/glossary/cacheable/index.md
index 898c037bb44fe9a..864dffa952c213d 100644
--- a/files/en-us/glossary/cacheable/index.md
+++ b/files/en-us/glossary/cacheable/index.md
@@ -6,15 +6,15 @@ page-type: glossary-definition
{{GlossarySidebar}}
-A **cacheable** response is an HTTP response that can be cached, that is stored to be retrieved and used later, saving a new request to the server. Not all HTTP responses can be cached, these are the following constraints for an HTTP response to be cached:
+A **cacheable** response is an HTTP response that can be cached, that is stored to be retrieved and used later, saving a new request to the server. Not all HTTP responses can be cached; these are the constraints for an HTTP response to be cacheable:
-- The method used in the request is itself _cacheable_, that is either a {{HTTPMethod("GET")}} or a {{HTTPMethod("HEAD")}} method. A response to a {{HTTPMethod("POST")}} or {{HTTPMethod("PATCH")}} request can also be cached if freshness is indicated and the {{HTTPHeader("Content-Location")}} header is set, but this is rarely implemented. For example, Firefox does not support it ([Firefox bug 109553](https://bugzil.la/109553)). Other methods, like {{HTTPMethod("PUT")}} or {{HTTPMethod("DELETE")}} are not cacheable and their result cannot be cached.
-- The status code of the response is _known_ by the application caching, and it is considered _cacheable_. The following status code are cacheable: {{HTTPStatus("200")}}, {{HTTPStatus("203")}}, {{HTTPStatus("204")}}, {{HTTPStatus("206")}}, {{HTTPStatus("300")}}, {{HTTPStatus("301")}}, {{HTTPStatus("404")}}, {{HTTPStatus("405")}}, {{HTTPStatus("410")}}, {{HTTPStatus("414")}}, and {{HTTPStatus("501")}}.
-- There are _specific headers_ in the response, like {{HTTPHeader("Cache-Control")}}, that prevents caching.
+- The method used in the request is _cacheable_, that is either a {{HTTPMethod("GET")}} or a {{HTTPMethod("HEAD")}} method. A response to a {{HTTPMethod("POST")}} or {{HTTPMethod("PATCH")}} request can also be cached if freshness is indicated and the {{HTTPHeader("Content-Location")}} header is set, but this is rarely implemented. For example, Firefox does not support it ([Firefox bug 109553](https://bugzil.la/109553)). Other methods, like {{HTTPMethod("PUT")}} or {{HTTPMethod("DELETE")}} are not cacheable and their result cannot be cached.
+- The status code of the response is _known_ by the application caching, and is _cacheable_. The following status codes are cacheable: {{HTTPStatus("200")}}, {{HTTPStatus("203")}}, {{HTTPStatus("204")}}, {{HTTPStatus("206")}}, {{HTTPStatus("300")}}, {{HTTPStatus("301")}}, {{HTTPStatus("404")}}, {{HTTPStatus("405")}}, {{HTTPStatus("410")}}, {{HTTPStatus("414")}}, and {{HTTPStatus("501")}}.
+- There are no specific headers in the response, like {{HTTPHeader("Cache-Control")}}, with values that would prohibit caching.
-Note that some non-cacheable requests/responses to a specific URI may invalidate previously cached responses on the same URI. For example, a {{HTTPMethod("PUT")}} to pageX.html will invalidate all cached {{HTTPMethod("GET")}} or {{HTTPMethod("HEAD")}} requests to the same URI.
+Note that some requests with non-cacheable responses to a specific URI may invalidate previously cached responses from the same URI. For example, a {{HTTPMethod("PUT")}} to `/pageX.html` will invalidate all cached responses to {{HTTPMethod("GET")}} or {{HTTPMethod("HEAD")}} requests to `/pageX.html`.
-When both, the method of the request and the status of the response, are cacheable, the response to the request can be cached:
+When both the method of the request and the status of the response are cacheable, the response to the request can be cached:
```http
GET /pageX.html HTTP/1.1
@@ -24,7 +24,7 @@ GET /pageX.html HTTP/1.1
(…)
```
-A {{HTTPMethod("PUT")}} request cannot be cached. Moreover, it invalidates cached data for request to the same URI done via {{HTTPMethod("HEAD")}} or {{HTTPMethod("GET")}}:
+The response to a {{HTTPMethod("PUT")}} request cannot be cached. Moreover, it invalidates cached data for requests to the same URI using {{HTTPMethod("HEAD")}} or {{HTTPMethod("GET")}} methods:
```http
PUT /pageX.html HTTP/1.1
@@ -34,7 +34,7 @@ PUT /pageX.html HTTP/1.1
(…)
```
-A specific {{HTTPHeader("Cache-Control")}} header in the response can prevent caching:
+The presence of the {{HTTPHeader("Cache-Control")}} header with a particular value in the response can prevent caching:
```http
GET /pageX.html HTTP/1.1
diff --git a/files/en-us/glossary/forbidden_header_name/index.md b/files/en-us/glossary/forbidden_header_name/index.md
index 284bdedc4db527a..ca59da5a9cac37a 100644
--- a/files/en-us/glossary/forbidden_header_name/index.md
+++ b/files/en-us/glossary/forbidden_header_name/index.md
@@ -8,7 +8,7 @@ page-type: glossary-definition
A **forbidden header name** is the name of any [HTTP header](/en-US/docs/Web/HTTP/Headers) that cannot be modified programmatically; specifically, an HTTP **request** header name (in contrast with a {{Glossary("Forbidden response header name")}}).
-Modifying such headers is forbidden because the user agent retains full control over them. Names starting with `Sec-` are reserved for creating new headers safe from {{glossary("API","APIs")}} using the [fetch algorithm](https://fetch.spec.whatwg.org/#concept-fetch) that grant developers control over headers, such as {{domxref("XMLHttpRequest")}}.
+Modifying such headers is forbidden because the user agent retains full control over them. Names starting with `Sec-` are reserved for creating new headers safe from {{glossary("API","APIs")}} that grant developers control over headers, such as {{domxref("fetch()")}}.
Forbidden header names start with `Proxy-` or `Sec-`, or are one of the following names:
diff --git a/files/en-us/glossary/grid_lines/index.md b/files/en-us/glossary/grid_lines/index.md
index b1ac3be923ff6be..5c4c668965891fc 100644
--- a/files/en-us/glossary/grid_lines/index.md
+++ b/files/en-us/glossary/grid_lines/index.md
@@ -6,7 +6,7 @@ page-type: glossary-definition
{{GlossarySidebar}}
-**Grid lines** are created when you define {{glossary("Grid tracks", "tracks")}} in the explicit grid using [CSS Grid Layout](/en-US/docs/Web/CSS/CSS_grid_layout).
+**Grid lines** are created anytime you use a [CSS Grid Layout](/en-US/docs/Web/CSS/CSS_grid_layout).
## Example
diff --git a/files/en-us/glossary/houdini/index.md b/files/en-us/glossary/houdini/index.md
index 3892425bee992e2..d1f9db5c290f1a4 100644
--- a/files/en-us/glossary/houdini/index.md
+++ b/files/en-us/glossary/houdini/index.md
@@ -14,7 +14,7 @@ While many of the features Houdini enables can be created with JavaScript, inter
## See also
-- [Houdini](/en-US/docs/Web/Guide/Houdini)
+- [Houdini APIs](/en-US/docs/Web/API/Houdini_APIs)
- [CSSOM](/en-US/docs/Web/API/CSS_Object_Model)
- [CSS Paint API](/en-US/docs/Web/API/CSS_Painting_API)
- [CSS Typed OM](/en-US/docs/Web/API/CSS_Typed_OM_API)
diff --git a/files/en-us/glossary/http/index.md b/files/en-us/glossary/http/index.md
index 7a52735bdfa21c4..fc661808db22fed 100644
--- a/files/en-us/glossary/http/index.md
+++ b/files/en-us/glossary/http/index.md
@@ -10,7 +10,7 @@ The HyperText Transfer Protocol (**HTTP**) is the underlying network {{glossary(
As part of a {{glossary("URI")}}, the "http" within "http\://example.com/" is called a "scheme". Resources using the "http" schema are typically transported over unencrypted connections using the HTTP protocol. The "https" scheme (as in "https\://developer.mozilla.org") indicates that a resource is transported using the HTTP protocol, but over a secure {{glossary("TLS")}} channel.
-HTTP is textual (all communication is done in plain text) and stateless (no communication is aware of previous communications). This property makes it ideal for humans to read documents (websites) on the world wide web. However, HTTP can also be used as a basis for {{glossary("REST")}} web services from server to server or {{glossary("AJAX")}} requests within websites to make them more dynamic.
+HTTP is textual (all communication is done in plain text) and stateless (no communication is aware of previous communications). This property makes it ideal for humans to read documents (websites) on the world wide web. However, HTTP can also be used as a basis for {{glossary("REST")}} web services from server to server or {{domxref("fetch()")}} requests within websites to make them more dynamic.
## See also
diff --git a/files/en-us/glossary/input_method_editor/index.md b/files/en-us/glossary/input_method_editor/index.md
index 9ca22a9f27edf75..6482ff4a6e3c3de 100644
--- a/files/en-us/glossary/input_method_editor/index.md
+++ b/files/en-us/glossary/input_method_editor/index.md
@@ -6,11 +6,11 @@ page-type: glossary-definition
{{GlossarySidebar}}
-An input method editor (IME) is a program that provides a specialized user interface for text input. Input method editors are used in many situations:
+An Input Method Editor (IME) is a program that provides a specialized user interface for text input. Input method editors are used in many situations:
-- to enter Chinese, Japanese, or Korean text using a Latin keyboard
-- to enter Latin text using a numeric keypad
-- to enter text on a touch screen using handwriting recognition
+- To enter Chinese, Japanese, or Korean text using a Latin keyboard.
+- To enter Latin text using a numeric keypad.
+- To enter text on a touch screen using handwriting recognition.
## See also
diff --git a/files/en-us/glossary/javascript/index.md b/files/en-us/glossary/javascript/index.md
index 288f6a9e8ef1315..3f289767338a52c 100644
--- a/files/en-us/glossary/javascript/index.md
+++ b/files/en-us/glossary/javascript/index.md
@@ -10,7 +10,7 @@ JavaScript (or "JS") is a programming language used most often for dynamic clien
JavaScript **should not** be confused with the [Java programming language](). Although _"Java"_ and _"JavaScript"_ are trademarks (or registered trademarks) of Oracle in the U.S. and other countries, the two programming languages are significantly different in their syntax, semantics, and use cases.
-JavaScript is primarily used in the browser, enabling developers to manipulate webpage content through the {{Glossary("DOM")}}, manipulate data with {{Glossary("AJAX")}} and {{Glossary("IndexedDB")}}, draw graphics with {{Glossary("canvas")}}, interact with the device running the browser through various {{Glossary("API","APIs")}}, and more. JavaScript is one of the world's most commonly-used languages, owing to the recent growth and performance improvement of {{Glossary("API","APIs")}} available in browsers.
+JavaScript is primarily used in the browser, enabling developers to manipulate webpage content through the {{Glossary("DOM")}}, retrieve content from servers using the {{domxref("fetch()")}} API, store complex data using {{Glossary("IndexedDB")}}, draw graphics with {{Glossary("canvas")}}, interact with the device running the browser through various {{Glossary("API","APIs")}}, and more. JavaScript is one of the world's most commonly-used languages, owing to the recent growth and performance improvement of {{Glossary("API","APIs")}} available in browsers.
## Origins and History
diff --git a/files/en-us/glossary/media_query/index.md b/files/en-us/glossary/media_query/index.md
new file mode 100644
index 000000000000000..6535a1398369a47
--- /dev/null
+++ b/files/en-us/glossary/media_query/index.md
@@ -0,0 +1,24 @@
+---
+title: Media query
+slug: Glossary/Media_query
+page-type: glossary-definition
+---
+
+{{GlossarySidebar}}
+
+A **media query** is a logical expression that is a method for CSS, JavaScript, HTML, and other web languages, to check aspects of the user agent or device that the document is being displayed in, independent of the document contents, to determine whether the associated code block or feature should be applied.
+
+Media queries are used to conditionally apply CSS styles with the CSS {{cssxref("@media")}} and {{cssxref("@import")}} at-rules and in JavaScript to test and monitor media states such as with the {{DOMxRef("Window.matchMedia", "matchMedia()")}} method, {{DOMxRef("MediaQueryList.matches", "matches")}} property, and {{DOMxRef("MediaQueryList.change_event", "change")}} event. Media queries are used as values of the [``](/en-US/docs/Web/HTML/Element/link#media), [`