diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000000..a7299ffb831 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +features/*.yml linguist-detectable +features/*.yml.dist linguist-language=YAML diff --git a/.github/ISSUE_TEMPLATE/new-feature.yml b/.github/ISSUE_TEMPLATE/new-feature.yml new file mode 100644 index 00000000000..421e7cb2cbe --- /dev/null +++ b/.github/ISSUE_TEMPLATE/new-feature.yml @@ -0,0 +1,32 @@ +name: New feature +description: Suggest a new feature for web-features +labels: feature definition +body: +- type: markdown + attributes: + value: | + Thanks for suggesting a new feature! Whether you suggest a feature here or by sending us a pull request, all contributions are welcome! + + Please see our [contributing guidelines](https://github.com/web-platform-dx/web-features/blob/main/docs/CONTRIBUTING.md). +- type: textarea + attributes: + label: Specification + description: Link to the spec for this feature + validations: + required: true +- type: textarea + attributes: + label: Description + description: Describe the feature in one or two sentences. + validations: + required: true +- type: textarea + attributes: + label: Documentation + description: Link to documentation and demos of the feature. + validations: + required: true +- type: textarea + attributes: + label: Browser support + description: If you have a caniuse.com link or other information about browser support, please share here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 444826ff241..a7e5560e0df 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,14 +1,37 @@ version: 2 updates: - package-ecosystem: npm - directory: / + versioning-strategy: increase + directories: + - / + - packages/web-features + - packages/compute-baseline schedule: interval: daily ignore: - dependency-name: "@types/node" - update-types: - - "version-update:semver-major" - - package-ecosystem: npm - directory: packages/web-features + update-types: ["version-update:semver-major"] + groups: + # Groups are applied in order, so narrowest groups go first + types-node: + patterns: + - "@types/node" + typescript: + patterns: + - "typescript" + production-dependencies: + dependency-type: "production" + exclude-patterns: + # Data packages are excluded from all groups, to get their own PRs + - "@mdn/browser-compat-data" + development-dependencies: + dependency-type: "development" + exclude-patterns: + # Data packages are excluded from all groups, to get their own PRs + - "@mdn/browser-compat-data" + - "web-specs" + - "caniuse-lite" + - package-ecosystem: github-actions + directory: "/" schedule: interval: daily diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 00000000000..ba290a8c911 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,22 @@ +"documentation": + - changed-files: + - all-globs-to-any-file: + - "**/*.md" + +"feature definition": + - changed-files: + - all-globs-to-any-file: + - "features/*.yml" + - "!features/*.yml.dist" + +"tools and infrastructure": + - changed-files: + - any-glob-to-any-file: + - ".eslint.config.js" + - ".github/**" + - ".node-version" + - ".nvmrc" + - ".prettierignore" + - ".prettierrc" + - "scripts/**" + - "tsconfig.json" diff --git a/.github/workflows/audit_consumers.yml b/.github/workflows/audit_consumers.yml new file mode 100644 index 00000000000..ec4340ec933 --- /dev/null +++ b/.github/workflows/audit_consumers.yml @@ -0,0 +1,26 @@ +name: Audit Consumers + +on: + # Runs on the 1st and 15th of every month, at 03:45 UTC, or manually triggered + schedule: + - cron: "45 3 1,15 * *" + workflow_dispatch: + +jobs: + audit-consumers: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm run build + - run: npm run audit-consumers --silent | tee issue-body.md + env: + GH_TOKEN: ${{ github.token }} + - run: gh issue create --title "web-features consumers report for $(date -I)" --label generated --body-file issue-body.md + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/bcd_upgrade_checklist.yml b/.github/workflows/bcd_upgrade_checklist.yml new file mode 100644 index 00000000000..bfe0dceb5ca --- /dev/null +++ b/.github/workflows/bcd_upgrade_checklist.yml @@ -0,0 +1,38 @@ +name: BCD upgrade + +on: + pull_request: + types: [opened] +permissions: + pull-requests: write +jobs: + post-comment: + name: "Post checklist" + runs-on: ubuntu-latest + if: github.event.pull_request.user.login == 'dependabot[bot]' + steps: + - name: Fetch Dependabot metadata + id: dependabot-metadata + continue-on-error: true + uses: dependabot/fetch-metadata@08eff52bf64351f401fb50d4972fa95b9f2c2d1b #v2.4.0 + + - if: ${{ contains(steps.dependabot-metadata.outputs.dependency-names, '@mdn/browser-compat-data') }} + continue-on-error: true + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 #v4.0.0 + with: + issue-number: ${{ github.event.number }} + # TODO: reinstate this post-merge checklist item when https://github.com/web-platform-dx/web-features/issues/1672 is resolved + # - [ ] (Optional) [Trigger a workflow run to remove tagged compat features](https://github.com/web-platform-dx/web-features/actions/workflows/remove_tagged_compat_features.yml). + body: | + Complete this checklist for every `@mdn/browser-compat-data` upgrade PR. + + - [ ] Check out this branch locally. + - [ ] If any keys were removed in the release, delete them from `.yml` files and commit your changes. + - [ ] Run `npm install && npm run dist && npm test && git commit --all --message="Refresh dist" && git push`. + - [ ] Review the diff. Watch out for Baseline regressions; if applicable, add a comment (see [#1971](/web-platform-dx/web-features/issues/1971)). + - [ ] Merge this PR. + + After merging, do these steps: + + - [ ] [Trigger a drafts update workflow run](https://github.com/web-platform-dx/web-features/actions/workflows/update_draft_features_weekly.yml). + - [ ] Start a PR to [publish the next web-features release](https://github.com/web-platform-dx/web-features/blob/main/docs/publishing.md#regular-releases). diff --git a/.github/workflows/gh-pages-build-deploy.yml b/.github/workflows/gh-pages-build-deploy.yml new file mode 100644 index 00000000000..097d89be055 --- /dev/null +++ b/.github/workflows/gh-pages-build-deploy.yml @@ -0,0 +1,74 @@ +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Build and deploy gh-pages website + +on: + # Runs on pushes targeting the default branch + push: + branches: + - "main" + paths: + - "gh-pages/**" + - ".github/workflows/gh-pages-build-deploy.yml" + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Use color in output +env: + FORCE_COLOR: 3 + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build the site + build: + runs-on: ubuntu-latest + outputs: + html_url: ${{ steps.pages.outputs.html_url }} + steps: + - name: Get GitHub Pages URL + id: pages + run: echo "html_url=$(gh api '/repos/{owner}/{repo}/pages' | jq '.html_url // false')" >> "$GITHUB_OUTPUT" + env: + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ github.token }} + - name: Checkout + uses: actions/checkout@v5 + - name: Setup Node + uses: actions/setup-node@v4 + with: + cache: npm + node-version-file: .node-version + - name: NPM Install + run: npm ci + working-directory: gh-pages/ + - name: Build pages + run: npm run build:prod + working-directory: gh-pages/ + - name: Upload artifact + if: ${{ fromJSON(steps.pages.outputs.html_url) }} # Skip if GitHub Pages is not turned on for the current repository + uses: actions/upload-pages-artifact@v3 + + + # Deployment job + deploy: + if: ${{ fromJSON(needs.build.outputs.html_url) }} # Skip if GitHub Pages is not turned on for the current repository + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 00000000000..593d0a39c1c --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,17 @@ +name: "Pull request labeler" +on: + - pull_request_target + +jobs: + labeler: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v5 + - if: github.event.pull_request.user.login == 'dependabot[bot]' + run: gh pr edit ${{ github.event.pull_request.number }} --add-label "generated" + env: + GH_TOKEN: ${{ github.token }} + GH_REPO: ${{ github.repository }} diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml new file mode 100644 index 00000000000..d95829c171f --- /dev/null +++ b/.github/workflows/prepare_release.yml @@ -0,0 +1,36 @@ +name: Prepare web-features release + +on: + workflow_dispatch: + inputs: + semverLevel: + description: "Bump to semver level" + required: true + type: choice + default: "minor" + options: + - patch + - minor + - major + +jobs: + open_pr: + name: Open PR + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - run: | + git config user.name github-actions + git config user.email github-actions@github.com + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - name: ./scripts/release.ts init + run: npx tsx ./scripts/release.ts init --target-repo=$REPO --reviewers=$ACTOR $SEMVER_LEVEL + env: + ACTOR: ${{ github.actor }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} + SEMVER_LEVEL: ${{ inputs.semverLevel }} diff --git a/.github/workflows/publish_next.yml b/.github/workflows/publish_next.yml deleted file mode 100644 index f7c37525abc..00000000000 --- a/.github/workflows/publish_next.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Publish web-features@next - -on: - push: - branches: - - "main" - -env: - package: "web-features" - package_dir: "packages/web-features" - dist_tag: "next" - -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version-file: .node-version - cache: npm - - run: npm ci - - run: npm test - publish: - if: github.repository == 'web-platform-dx/web-features' - runs-on: ubuntu-latest - needs: "test" - steps: - - name: Get timestamp - id: timestamp - run: echo "TIMESTAMP=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version-file: .node-version - cache: npm - registry-url: "https://registry.npmjs.org" - - run: npm ci - - run: npm run build - - name: Get package.json version - id: version - run: echo "VERSION=$(npm version --json | jq --raw-output '.["${{ env.package }}"]')" >> $GITHUB_OUTPUT - working-directory: ${{ env.package_dir }} - - run: npm install - working-directory: ${{ env.package_dir }} - - run: npm version --no-git-tag-version "$VERSION-dev-$TIMESTAMP-$(git rev-parse --short HEAD)" - # The version string template is: -dev-- - # Why not use SemVer build metadata with a plus sign for some of this? - # Because npm completely ignores it. šŸ˜’ - working-directory: ${{ env.package_dir }} - env: - VERSION: ${{ steps.version.outputs.VERSION }} - TIMESTAMP: ${{ steps.timestamp.outputs.TIMESTAMP }} - - run: npm publish --tag ${{ env.dist_tag }} - working-directory: ${{ env.package_dir }} - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish_next_compute-baseline.yml b/.github/workflows/publish_next_compute-baseline.yml new file mode 100644 index 00000000000..a261f7ea50a --- /dev/null +++ b/.github/workflows/publish_next_compute-baseline.yml @@ -0,0 +1,53 @@ +name: Publish compute-baseline@next + +on: + push: + branches: + - "main" + paths: + - packages/compute-baseline/** + +env: + package: "compute-baseline" + package_dir: "packages/compute-baseline" + dist_tag: "next" + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm test + publish: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + needs: "test" + steps: + - name: Get timestamp + id: timestamp + run: echo "TIMESTAMP=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + registry-url: "https://registry.npmjs.org" + - run: npm ci + - name: Get package.json version + id: version + run: echo "VERSION=$(npm version --json --workspace=${{ env.package }} | jq --raw-output '.["${{ env.package }}"]')" >> $GITHUB_OUTPUT + - run: npm version --workspace=${{ env.package }} --no-git-tag-version "$VERSION-dev-$TIMESTAMP-$(git rev-parse --short HEAD)" + # The version string template is: -dev-- + # Why not use SemVer build metadata with a plus sign for some of this? + # Because npm completely ignores it. šŸ˜’ + env: + VERSION: ${{ steps.version.outputs.VERSION }} + TIMESTAMP: ${{ steps.timestamp.outputs.TIMESTAMP }} + - run: npm publish --workspace=${{ env.package }} --tag ${{ env.dist_tag }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/publish_next_web-features.yml b/.github/workflows/publish_next_web-features.yml new file mode 100644 index 00000000000..92272afb4bf --- /dev/null +++ b/.github/workflows/publish_next_web-features.yml @@ -0,0 +1,111 @@ +name: Publish web-features@next + +on: + push: + branches: + - "main" + paths: + - features/** + - groups/** + - packages/web-features/** + - snapshots/** + - index.ts + - scripts/build.ts + +permissions: + contents: write + +env: + package: "web-features" + package_dir: "packages/web-features" + dist_tag: "next" + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm test + publish: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + needs: "test" + steps: + - uses: actions/checkout@v5 + - name: Get timestamp and short hash + id: timestamp_and_hash + run: | + echo "TIMESTAMP=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT + echo "SHORT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + registry-url: "https://registry.npmjs.org" + - run: npm ci + + - run: npm run build + - run: npm run build:extended + + - name: Get package.json version + id: version + run: echo "VERSION=$(npm version --json | jq --raw-output '.["${{ env.package }}"]')" >> $GITHUB_OUTPUT + working-directory: ${{ env.package_dir }} + - run: npm install + working-directory: ${{ env.package_dir }} + - run: npm version --no-git-tag-version "$VERSION-dev-$TIMESTAMP-$SHORT_HASH" + # The version string template is: -dev-- + # Why not use SemVer build metadata with a plus sign for some of this? + # Because npm completely ignores it. šŸ˜’ + working-directory: ${{ env.package_dir }} + env: + VERSION: ${{ steps.version.outputs.VERSION }} + TIMESTAMP: ${{ steps.timestamp_and_hash.outputs.TIMESTAMP }} + SHORT_HASH: ${{ steps.timestamp_and_hash.outputs.SHORT_HASH }} + - if: ${{ env.NODE_AUTH_TOKEN }} + run: npm publish --tag ${{ env.dist_tag }} + working-directory: ${{ env.package_dir }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Set existing release to draft + run: gh release edit --draft "$TAG" + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ env.dist_tag }} + + - name: Update the tag + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git tag --force "$TAG" + git push --force origin "$TAG" + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ env.dist_tag }} + + - name: Publish pre-release on GitHub + run: | + gh release edit \ + --verify-tag \ + --title "$PACKAGE@$TAG" \ + --notes "$NOTES" \ + --prerelease \ + --draft=false \ + "$TAG" + gh release upload --clobber "$TAG" $ARTIFACTS + env: + GH_TOKEN: ${{ github.token }} + PACKAGE: ${{ env.package }} + TAG: ${{ env.dist_tag }} + NOTES: This is a continuously-updated prerelease generated from `main` (currently at ${{ steps.timestamp_and_hash.outputs.SHORT_HASH }}). + ARTIFACTS: > + schemas/data.schema.json + ${{ env.package_dir }}/data.json + data.extended.json diff --git a/.github/workflows/publish_web-features.yml b/.github/workflows/publish_web-features.yml new file mode 100644 index 00000000000..2f8d8075892 --- /dev/null +++ b/.github/workflows/publish_web-features.yml @@ -0,0 +1,56 @@ +name: Publish web-features + +on: + push: + # Tags on the form v1.2.3 are for releases. Any other tags are ignored. + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + +env: + package_dir: "packages/web-features" + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm test + artifacts: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + needs: "test" + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + registry-url: "https://registry.npmjs.org" + - run: npm ci + - run: npm run build + - run: npm run build:extended + - run: gh release upload ${{ github.ref_name }} packages/web-features/data.json schemas/data.schema.json data.extended.json + env: + GH_TOKEN: ${{ github.token }} + publish: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + needs: "test" + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + registry-url: "https://registry.npmjs.org" + - run: npm ci + - run: npm run build + - run: npm publish + working-directory: ${{ env.package_dir }} + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index b19ed320609..23c2d21b9c2 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -10,20 +10,20 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 with: node-version-file: .node-version cache: npm - run: npm ci - run: npm run build - name: Pretty print built JSON - run: jq . packages/web-features/index.json + run: jq . packages/web-features/data.json test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 with: node-version-file: .node-version cache: npm diff --git a/.github/workflows/remove_tagged_compat_features.yml b/.github/workflows/remove_tagged_compat_features.yml new file mode 100644 index 00000000000..82214f70664 --- /dev/null +++ b/.github/workflows/remove_tagged_compat_features.yml @@ -0,0 +1,38 @@ +name: Remove tagged compat features + +on: + # Runs at midnight on Mondays and Thursdays 05:30 UTC, or manually triggered + # schedule: + # - cron: "30 5 * * 1,4" + workflow_dispatch: + +jobs: + remove-tagged-compat-features: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm run remove-tagged-compat-features + - run: npm run dist + - name: Create pull request + uses: peter-evans/create-pull-request@v7 + with: + add-paths: | + features/ + commit-message: Remove tagged compat features + title: "Remove tagged compat features" + body: | + This is an auto-generated PR that compat features that are already tagged in BCD. + + To let the tests run, close this PR then immediately reopen it. + + See https://github.com/web-platform-dx/web-features/blob/main/docs/bcd-sync.md for details. + labels: | + generated + branch: remove-tagged-compat-features-${{ github.run_number }} + delete-branch: true diff --git a/.github/workflows/update_draft_features_weekly.yml b/.github/workflows/update_draft_features_weekly.yml new file mode 100644 index 00000000000..86b08cdebfb --- /dev/null +++ b/.github/workflows/update_draft_features_weekly.yml @@ -0,0 +1,38 @@ +name: Update Draft Features + +on: + # Runs on Mondays and Thursdays 05:30 UTC, or manually triggered + schedule: + - cron: "30 5 * * 1,4" + workflow_dispatch: + +jobs: + update-drafts: + if: github.repository == 'web-platform-dx/web-features' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v4 + with: + node-version-file: .node-version + cache: npm + - run: npm ci + - run: npm run update-drafts + - run: npm run dist + - name: Create pull request + uses: peter-evans/create-pull-request@v7 + with: + add-paths: | + features/draft/spec/ + commit-message: Update draft features + title: "Update draft features" + body: | + This is an auto-generated PR with draft features by spec updates. + + To let the tests run, close this PR then immediately reopen it. + + See https://github.com/web-platform-dx/web-features/blob/main/.github/workflows/update_draft_features_weekly.yml for details. + labels: | + generated + branch: update-draft-features-${{ github.run_number }} + delete-branch: true diff --git a/.gitignore b/.gitignore index fad93cc13ac..d0e387936b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,13 @@ +coverage/ node_modules/ +packages/compute-baseline/dist/ packages/web-features/index.d.ts -packages/web-features/LICENSE.txt +packages/**/LICENSE.txt +packages/web-features/data.json +packages/web-features/data.schema.json packages/web-features/types.ts -index.json +data.extended.json index.js + +# Ignore files created & used by pages & 11ty +/_site/** diff --git a/.node-version b/.node-version index 3c032078a4a..09464731e70 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -18 +20.19 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000000..09464731e70 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20.19 diff --git a/.prettierignore b/.prettierignore index 6cadd9ad570..743a54d17e2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,13 +1,24 @@ -/* +# Exclude any generated files/folders +/**/*.dist +/**/dist -# Opt-ins -!GOVERNANCE.md -!/feature-group-definitions/ -/feature-group-definitions/* -!/feature-group-definitions/*.yml +# Exclude the website includes since these are typically fragments, or include +# things that makes Prettier unhappy. +/gh-pages/src/_includes/** -!/scripts/ -/scripts/* -!/scripts/release.ts -!/scripts/feature-init.ts +# Files/folders that have not yet been formatted +# TODO: Format all these files +README.md +index.ts +types.ts +2022-backgrounder.md +towards-features.md +/.github/** +/docs +!/docs/publishing.md +/features/draft +/schemas +/scripts/caniuse.ts +/scripts/schema.ts +/scripts/specs.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..150a18a5367 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.readonlyInclude": { + "features/**/*.yml.dist": true + } +} diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 59ca68a4e54..6accfc92ab0 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -49,7 +49,7 @@ Peers: - Must follow documented contribution guidelines. - Must submit pull requests for all their changes. - May label and close issues. -- May merge pull requests that add or modify feature descriptions (excluding changes to a feature’s Baseline status or other availability status information). +- May merge pull requests that add or modify features. - Other contributors’ pull requests may be merged by _Peers_. - A _Peer_'s own pull requests may be merged after approval from a fellow _Peer_ or _Owner_. - Must have their status, infrastructure, and documentation work reviewed and merged by [Owners](#owners). @@ -75,8 +75,12 @@ Inactive _Peers_ (no activity on the project for months or more) might be marked #### List of current Peers +- Adriana Jara ([@tropicadri](https://github.com/tropicadri)) - Brian Kardell ([@bkardell](https://github.com/bkardell)) -- Patrick Brosset ([@captainbrosset](https://github.com/captainbrosset)) +- Dietrich Ayala ([@autonome](https://github.com/autonome/)) +- James Stuckey Weber ([@jamesnw](https://github.com/jamesnw)) +- Mariko Kosaka ([@kosamari](https://github.com/kosamari)) +- Pete LePage ([@petele](https://github.com/petele)) A _Peer_ who shows an above-average level of contribution to the project, particularly with respect to its strategic direction and long-term health, may be nominated to become an _Owner_, described below. @@ -89,6 +93,7 @@ The _Owners_ group has final authority over: - Adoption or amendment to the definition of Baseline - Adoption or amendment to the definition of other feature availability statuses +- Resolving disagreements on the scope or status of individual features - Technical direction of the project, especially infrastructure and schema decisions - Project governance and process (including this policy and any updates) - Confirming _Peers_ and _Owners_ @@ -106,7 +111,7 @@ _Owners_ fulfill all requirements of _Peers_, and also: - Must ensure the smooth running of the project. - Should review code contributions, changes to this document, or changes to the licensing of the project or its outputs. -- May merge pull requests that remove feature descriptions. +- May merge pull requests that remove features. - May merge pull requests that change the Baseline definition or its implementation. - May merge pull requests that change Baseline statuses. - May merge pull requests that change other availability statuses. @@ -138,6 +143,7 @@ If the nominee accepts the invitation, then the _Owners_ group adds the new _Own - James Graham ([@jgraham](https://github.com/jgraham)) - Kadir Topal ([@atopal](https://github.com/atopal)) - Leo McArdle ([@LeoMcA](https://github.com/LeoMcA)) +- Patrick Brosset ([@captainbrosset](https://github.com/captainbrosset)) - Philip JƤgenstedt ([@foolip](https://github.com/foolip)) ## Additional paths to becoming a Peer or Owner @@ -150,7 +156,7 @@ Such Peers and Owners are indicated in the Peers or Owners list with the text _Owners_ may, at their discretion, nominate an owner-delegate to carry out a task or make a decision ordinarily carried out by an _Owner_ or _Peer_. Delegation should be limited in duration or scope, or both; delegation may be withdrawn by any _Owner_ at any time. -For example, an _Owner_ may nominate a tool expert as an owner-delegate to approve an infrastructure PR or nominate a feature expert as an owner-delegate to approve a feature description. +For example, an _Owner_ may nominate a tool expert as an owner-delegate to approve an infrastructure PR or nominate a feature expert as an owner-delegate to approve a feature. ## Decision making @@ -281,7 +287,7 @@ The chair is responsible for summarizing the discussion of each agenda item and - Merge new or modified feature descriptions + Merge a new or modified feature @@ -293,19 +299,19 @@ The chair is responsible for summarizing the discussion of each agenda item and - Merge policy changes + Merge changes to a feature’s status - + Yes Yes - Merge schema or infrastructure changes + Merge removal of a feature @@ -317,7 +323,7 @@ The chair is responsible for summarizing the discussion of each agenda item and - Merge changes to a feature’s status + Merge policy changes @@ -329,7 +335,7 @@ The chair is responsible for summarizing the discussion of each agenda item and - Merge removal of a feature + Merge schema or infrastructure changes diff --git a/README.md b/README.md index 9e4a832a167..9a570dfc5f6 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ By the [W3C WebDX Community Group](https://www.w3.org/community/webdx/) and contributors. -`web-features` is an effort to build a shared catalog of features of the web platform. +[`web-features`](https://web-platform-dx.github.io/web-features/web-features/) is an effort to build a shared catalog of features of the web platform. By creating a common list of features and their definitions, `web-features` aims to improve understanding of what web developers get and want from the web. `web-features` does this by: @@ -18,7 +18,7 @@ By creating a common nomenclature for web platform features, `web-features` inte To get feature identifiers, Baseline support data, or cross-references to other resources (such as specifications and caniuse), use [the `web-features` npm package](https://www.npmjs.com/package/web-features). [Read the package README](./packages/web-features/README.md) for more information. -To contribute to feature identification, definition, Baseline support statuses, or to update the status on MDN, jump to [Contribute](#contribute). +To contribute to feature identification, definition, Baseline support statuses, or to update the status on MDN, read [`CONTRIBUTING.md`](./docs/CONTRIBUTING.md). ## Background diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 1bf2923a473..f2ad636db60 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -1,19 +1,319 @@ -# Contributing +# Contributing to the web-features project Thanks for your interest in contributing to this project! Before you contribute, consider the following: -- Help us create a kind, welcoming, and productive project. +* Help us create a kind, welcoming, and productive project. + You can do this in part by following the [W3C Code of Ethics and Professional Conduct](https://www.w3.org/Consortium/cepc/), which governs conduct on this project. -- All contributions to this project are licensed under the terms of the Apache License, Version 2.0. +* All contributions to this project are licensed under the terms of the Apache License, Version 2.0. + [Read `LICENSE.txt` for details](../LICENSE.txt). -## Get started +There are multiple ways to contribute to the web-features repository, such as: -The project is in its early stages, so we’re still developing tools and processes to help improve and expand our work. -To get started contributing, take a look the following: +* Adding a missing feature to the repository, from scratch. +* Adding a missing feature to the repository, by updating a feature that was already drafted. +* Updating an existing feature, for example to change its name, description, support data, or other fields. +* [Reviewing a pull request](./reviewing.md) that was submitted by someone else, to check if the feature is correctly authored. -* Learn more about [the WebDX Community Group](https://www.w3.org/community/webdx/). -* Go to [open issues](https://github.com/web-platform-dx/web-features/issues) to propose new feature groups or report a bug. -* Go to [open PRs](https://github.com/web-platform-dx/web-features/pulls) to review incoming feature groups and updates. +In any case, **thank you** for wanting to help. This document will guide you through the process of contributing to the web-features repository. + +Also consider joining the [WebDX Community Group](https://www.w3.org/community/webdx/). + +## What makes a feature + +Think of features as individual components of the web platform that web developers can use to achieve specific tasks. + +As such, a feature has no specific size. A feature might cover a single CSS property, an entire JavaScript APIs with multiple interfaces, methods, and properties, or a combination of CSS properties, HTML elements, and JavaScript APIs. As long as a web developer would use the feature to achieve a specific goal, it's a feature. + +For example, the `fetch()` API is a feature, the `:has()` CSS pseudo-class function too, and so is the Web Audio API. + +For the time being, this repository focuses only on features that are implemented in some browser and that are already documented on MDN. + +### Hints for distinguishing features + +Sometimes it can be hard to tell whether something (like an HTML attribute or JavaScript method) is a distinct feature or part of another feature. +Here are some questions to ask yourself when deciding whether something is a distinct feature of the web platform: + +- Is there evidence that developers recognize it as a feature? + Blog posts, Stack Overflow questions, and social media posts by developers about the feature are good places to learn whether developers see something as part of a category or as standing alone + (they're also a good source of other information, such as a name for the feature). + +- Do existing publications already describe this as a distinct feature? + For example, an original Can I Use entry (or request for one on [Fyrd/caniuse](https://github.com/Fyrd/caniuse/issues)) is a good sign that developers will recognize this as a feature. + Articles in developer-audience publications (such as CSS-Tricks, DEV.to, and sometimes MDN) are also helpful indicators. + +- Do you _expect_ developers to recognize it as a feature? + Very new features are harder to sort out because developers don't know about them already. + In such cases, you have to make educated guesses. + Sometimes you can use prior features' development and specification process to make good guesses. + For example, TC39 proposals often emerge as distinct features, while CSS specifications often contain several distinct but related features or incremental additions to existing features. + Sometimes you may need to talk to developers or subject matter experts before making a decision. + +Creating features is more art than science. +You won't always get it right. +That's OK! +Features can be renamed, split, or merged later. + +### Feature file name and format + +Features in this repository are authored as **YAML files** that are stored in the [`features`](../features) directory. Each file corresponds to a single feature, and contains metadata about the feature, such as its name, description, specification, or support data. + +For example, the `fetch()` API feature is described in the [`features/fetch.yml`](https://github.com/web-platform-dx/web-features/blob/main/features/fetch.yml) file. + +The name of the file also constitutes the unique ID of the feature. In the example above, the unique ID of the feature is `fetch`. + +Feature IDs must be unique as they are used in other projects to reference the feature. For example, the [browser-compat-data](https://github.com/mdn/browser-compat-data/) project references feature IDs in their compatibility data. + +### Fields in a feature file + +This table lists the fields that can be found in a feature file, and provides a brief description of each field: + +| Field | Description | Type | Mandatory | +|---|---|---|---| +| `name` | The name of the feature. | Plain text string | Yes | +| `description` | A short description of the feature. | Markdown-formatted string | Yes | +| `spec` | One or more specification URLs for this feature. | String, or array of strings | Yes | +| `group` | An optional group, or list of groups that this feature belongs to. See the definition of groups under [Create a new feature from scratch](#create-a-new-feature-from-scratch). | String, or array of strings | No | +| `caniuse` | The feature's ID on the [Can I Use](https://caniuse.com/) website. | String | No | +| `compat_features` | @mdn/browser-compat-data (BCD) entry keys (e.g., `css.properties.background-color`) that make up this feature. If `compat_features` is not set in `.yml`, the `dist` script will populate `compat_features` in `.yml.dist` with BCD entry keys tagged with `web-features:` in BCD, if any exist. | Array of strings | No | +| `status` | An optional object which describes whether the feature is considered baseline, when it achieved this baseline status, and the version number of supported browsers. In the majority of cases, this is calculated from the `compat_features` list or from browser-compat-data entries directly, and therefore not needed. | Object | No | +| `status.compute_from` | An optional field, within the `status` object, to allows you to specify which BCD keys should the overall feature status be computed from. This is useful to list all BCD keys that are related to a feature, but only consider some of them in the baseline status calculation. | String, or array of strings | No | + +### Feature dist files + +The YAML files that are used to author features are also used to generate _dist_ files. The term _dist_ is short for distribution. + +Dist files are also YAML files, but they end with the `.yml.dist` extension. Dist files are part of the data that we publish. + +For example, the `fetch` feature file is `features/fetch.yml`, and its dist file is `features/fetch.yml.dist`. + +You **never edit a dist file** directly. Dist files are generated from the authored YAML files, and are used at build time to generate the final data bundle that's used by other projects. + +To generate a dist file, run `npm run dist` command. +Do this when creating or updating a feature. + +Some fields, such as `status` and `compat_features`, may appear in either the authored YAML file, the generated dist file, or both. +The contents of the authored YAML file overrules all other implicit sources of data. +For example, if you set `compat_features` in an authored YAML file, then the corresponding @mdn/browser-compat-data tag is ignored. +Likewise, setting a `status` value in an authored YAML file overrules a status generated from `compat_features` or tag. + +If the dist file contains only an empty object (`{}`) it means that there is no generated data in addition to the source YAML. +To learn more, see [Set the status of a feature](#set-the-status-of-a-feature), below. + +> [!Important] +> Even if dist files are generated artifacts, they are still checked-in to the repository. This is normal and expected. Because dist files contain the compatibility data and status information for a feature, we review them as part of the pull request process. + +## Finding features to work on + +In some cases, you will already have an idea for a feature to add to the repository. This could be because you've just heard about a feature on a blog post, documentation website, or other source, and noticed it was missing from this repository. + +In other cases, you might want to help but don't have a specific feature in mind. That's okay too. You can find inspiration in the following places: + +* [The list of issues with the **feature definition** label](https://github.com/web-platform-dx/web-features/issues?q=is%3Aopen+is%3Aissue+label%3A%22feature+definition%22). +* [The list of draft features](../features/draft). + +A third case is if you've found a feature that's incorrectly defined. For example if its description is misleading, or you believe the browser support data is incorrect. + +In any case, before starting to work on a feature, make sure it isn't already being worked on by checking the list of [pull requests with the **feature definition** label](https://github.com/web-platform-dx/web-features/pulls?q=is%3Aopen+is%3Apr+label%3A%22feature+definition%22). + +## Contributing features to the repository + +Use the sections below to help you get started with the different ways to contribute to the web-features repository. + +### Fork the repository and set up your local environment + +Before being able to contribute to the repository, you need to fork it, and get accustomed to the GitHub pull request workflow: + +1. Go to the [web-features repository home page](https://github.com/web-platform-dx/web-features). +1. Click **Fork** in the top-right corner of the page. GitHub creates a fork of the repository under your GitHub account. +1. Clone the forked repository locally on your computer. + +To learn more about the fork and pull request process, see [Fork a repository](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo). + +When you have the repository cloned locally, set up your local environment: + +1. [Install Node.js](https://nodejs.org). + See [`.nvmrc`](../.nvmrc) for the minimum required version. + +1. At a command line prompt, navigate to the root of the repository: + + `cd path/to/web-features` + +1. Install the project dependencies: + + `npm install` + +1. Create a new Git branch to track your work: + + `git checkout -b ` + +> [!TIP] +> If your editor supports it, turn on automatic code formatting with Prettier. +> Read Prettier's [Editor Integration](https://prettier.io/docs/en/editors) documentation for more information. + +### Create a new feature from scratch + +To create a new feature from scratch: + +1. Go through the steps in [Fork the repository and set up your local environment](#fork-the-repository-and-set-up-your-local-environment). + +1. Decide what the unique ID for your new feature should be. To help you, check the [Identifiers](./guidelines.md#identifiers) section of the feature guidelines. + +1. Create a file in the `features` directory with the name of your feature ID, and the `.yml` extension. For example, if your feature ID is `my-feature`, create a file named `features/my-feature.yml`. + +1. Open the file in your favorite text editor, and add the following minimum content: + + ```yaml + name: "My feature" + description: "A short description of the feature." + spec: https://urlofthespec.com + ``` + + For guidance, see the [Names](./guidelines.md#names) and [Descriptions](./guidelines.md#descriptions) sections of the feature guidelines. + +1. Optionally add a `group` field to the feature. + + The `group` field is used to categorize features into groups. For example, the Async Clipboard API feature is in the `clipboard` group. Groups are maintained in the [`groups`](../groups) directory, and each group is a YAML file. The name of the file defines the unique ID of a group. + + * If one of the existing groups fits your feature, add the `group` field to your feature, and set it to the ID of the group. + * If none of the existing groups fit your feature, but you believe a new group should be created, then create a new group file in the `groups` directory, then add the `group` field to your feature set to the ID of the new group. + +1. Set the baseline status and browser compatibility data of the feature. This is the most important and difficult step of authoring a feature, which is documented in a separate section. See [Set the status of a feature](#set-the-status-of-a-feature). + +### Create a new feature from a draft feature + +To start from an existing draft feature: + +1. Go through the steps in [Fork the repository and set up your local environment](#fork-the-repository-and-set-up-your-local-environment). + +1. Review the existing draft features by looking at the YAML files in the [`features/draft`](../features/draft) directory and sub-directories. + +1. Find a draft that you want to work on. + +1. Move the `.yml` and `.yml.dist` files to the `features` directory. + +1. Remove the `draft_date` field from the `.yml` file. + +1. Review the feature ID, name, and spec fields for correctness. + +1. Write a new description for the feature, making sure it follows the [Descriptions](./guidelines.md#descriptions) guidelines, and is consistent with other feature descriptions in the repository. + +1. Either review, correct, or set the baseline status and browser compatibility data of the feature. This is the most important and difficult step of authoring a feature, which is documented in a separate section. See [Set the status of a feature](#set-the-status-of-a-feature). + +### Set the status of a feature + +After you've prepared your new feature file with its unique ID, `name`, `description`, and `spec` fields, you must provide the necessary information for this feature's status to be calculated. + +A feature's status consists of: + +* Whether the feature is considered baseline or not, and which level of baseline it has achieved: + + * Baseline _low_ means that the feature is now available on all browsers listed in the core browser set. + * Baseline _high_ means that the feature has been available on all browsers listed in the core browser set for long enough that it's considered _widely_ available. + + For more information about baseline and the actual definition of _long enough_, see [Baseline](./baseline.md). + +* If the feature is considered baseline, the dates at which it has achieved the low and high levels. + +* The browser support data for this feature, which consists of the version number for each of the browsers that support the feature. + +#### Understand where browser support data comes from + +The browser support data for your feature is what determines its baseline status. For example, if your feature is supported on Chrome 66, Chrome Android 66, Edge 79, Firefox 76, Firefox Android 79, Safari 12.1, and Safari iOS 12.2, then it's baseline high, because those versions have been released long enough ago. + +The browser support data that we use comes from the [browser-compat-data project](https://github.com/mdn/browser-compat-data/) (BCD), which you need to understand before continuing to set the status of your feature. + +BCD contains browser support data for individual constituent of web features, such as CSS properties, JavaScript statements, HTML elements and attributes, DOM interfaces, methods, and events. +For example, BCD contains the list of browsers, and their versions, that support the [`grid-template-rows` CSS property](https://github.com/mdn/browser-compat-data/blob/main/css/properties/grid-template-rows.json), which is a constituent of the [grid](https://github.com/web-platform-dx/web-features/blob/main/features/grid.yml) feature. + +We refer to each entry that contains browser support data in BCD as a _BCD key_. In the `grid-template-rows` example, the BCD key is `css.properties.grid-template-rows`. + +Features in the web-features project are associated with one or more BCD keys. For example, the grid feature is associated with multiple BCD keys, which together, describe the overall grid feature: `css.properties.display.grid`, `css.properties.display.inline-grid`, `css.properties.grid`, `css.properties.grid-area`, and more. + +#### Associate BCD keys with your feature + +To set the status of your new feature, you must associate your feature with one or more BCD keys. There are two cases for associating your feature to BCD keys: + +* Either BCD already defines references to your new feature. In this case, you don't need to explicitly list the BCD keys that your feature depends on. + + For example, the [grid](https://github.com/web-platform-dx/web-features/blob/main/features/grid.yml) feature doesn't list any BCD keys, because the BCD project already maps the right BCD keys to the `grid` web-features ID. See the [`web-features:grid` search results](https://github.com/search?q=repo%3Amdn%2Fbrowser-compat-data%20%22web-features%3Agrid%22&type=code) in BCD. + + Here is the grid feature YAML file content, showing that no BCD keys appear in the file: + + ```yaml + name: Grid + description: CSS Grid is a two-dimensional layout system, which lays content out in rows and columns. + spec: https://drafts.csswg.org/css-grid-3/ + group: grid + caniuse: css-grid + ``` + + You should always check first if BCD doesn't already map to your feature ID by running `npm run dist` and checking if the resulting dist file contains supported browser versions. + +* Or BCD doesn't already reference your new feature. In this case, you need to list the BCD keys that make up your feature under the `compat_features` field of your new feature file. + + For example, here are the first few lines of the `@counter-style` feature, which defines a list of BCD keys: + + ```yaml + name: "@counter-style" + description: The `@counter-style` CSS at-rule defines custom counter styles for list items. For example, you can use a sequence of specific symbols instead of numbers for an ordered list. + spec: https://drafts.csswg.org/css-counter-styles-3/ + caniuse: css-at-counter-style + compat_features: + - css.at-rules.counter-style + - css.at-rules.counter-style.additive-symbols + - css.at-rules.counter-style.fallback + - css.at-rules.counter-style.negative + ``` + + To identify the BCD keys that you need, check the browser compatibility tables displayed at the end of the MDN pages that document your new feature, and then search the BCD source code for the names that appear in the table. + + You can also use the `npm run traverse | grep -i ` command in BCD to list all BCD keys that match a certain keyword. + +#### Generate and check the dist file + +To generate your feature's dist file, once your feature is associated with one or more BCD keys: + +1. Run the command `npm run dist`. + Optionally, run `npm run dist -- features/.yml` to regenerate only your feature's dist file. + +1. Check that a new file, named after your feature ID, and with the `.yml.dist` file extension exists, and open the file. + +1. Check that the data in the dist file is correct. In particular, verify that the data is consistent with what developers would find when searching for the same feature on caniuse.com or MDN. + + * Check the `baseline` status. If the feature isn't yet supported in all browsers of the core browsers set, it should be `false`. If the feature is supported on all browsers, it should either be `low` or `high`, depending on how long has passed. + * Check the `baseline_low_date`. Does it seem like the feature should be older? Newer? Or just right? + * Check that the browser versions listed under `support` match what caniuse.com and MDN document too. + +#### Fix data discrepancies in your feature's dist file + +The most likely reason for the data in your new feature's dist file to be incorrect is that your feature is associated with too many BCD keys, or with the wrong BCD keys. BCD keys describe all constituents of a feature, whether they are vital to the feature, or later additions to it. For example, developers have been able to use the Web Audio API for many years even if the AudioWorklet or OfflineAudioContext APIs were added later, and only recently became baseline. + +You might be faced with the following scenarios: + +* Your feature's overall status is too old (e.g., it's a new feature, but it's being reported as long-established). In this case, you might have missing BCD keys. Check that you've covering the complete feature by looking for missing interfaces, CSS property values, and so on. +* Your feature's overall status is too young (e.g., it's a long-established feature, but it's being reported as newly available). In this case, you might have BCD keys that correspond to later additions which are holding the feature back unfairly.\ +* Your feature's overall status and individual BCD keys are yielding incorrect results. In this case, the underlying BCD data might have caveats or errors. Check the data in the [browser-compat-data](https://github.com/mdn/browser-compat-data/) repository for any caveats such as features behind prefixes or flags, or partial implementations. + +To fix data discrepancies in your dist file, open the dist file and, under `compat_features`, review each individual section. Each section corresponds to a group of BCD keys that have the same baseline and support status. + +Look for the feature's entrypoint in the dist file. The entrypoint of a feature is the property, interface, method, or other constituent part of the feature which web developers use first. For example, the Web Audio API feature has the `AudioContext` interface as its entrypoint. Before doing anything else, developers will first instantiate an `AudioContext` object by doing `const audioContext = new AudioContext()`. + +If your feature's entrypoint doesn't have the same status as the overall feature, use the `compute_from` field in your feature file to flag the BCD key (or keys) that represent the minimum viable set of constituent parts of a feature that make it usable. + +### Create a GitHub Pull Request to review and merge your changes + +To get your changes reviewed and, eventually, merged: + +1. Commit all of your local changes: + + `git commit -a -m "Description of your changes"` + +1. Push your new branch to your forked repository: + + `git push origin ` + +1. At https://github.com/web-platform-dx/web-features/pulls, open a new Pull Request. diff --git a/docs/README.md b/docs/README.md index 4791e9e46a5..cc99dd7733f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,40 +1,6 @@ -# Project documentation +# web-features project documentation -## Feature guidelines - -### Identifiers - -Feature identifiers must contain only lowercase alphanumeric characters (`a`-`z` and `0-9`) plus the `-` character (hyphen or minus sign) as a word separator. - -Feature authors should (in descending order of priority): - -- Prefer identifiers to known to be in widespread use by web developers. - Favor describing things as they are most-widely known, even if it's not the most technically correct option. - - - šŸ‘ Recommended: `javascript` - - šŸ‘Ž Not recommended: `ecmascript` - -- Avoid prefixing identifiers that mark a feature as specific to a technology, such as `css-` or `js-`. - Features can and do cross such boundaries. - - - šŸ‘ Recommended: `container-queries` - - šŸ‘Ž Not recommended: `css-container-queries` - -- Avoid frequently-used abbreviations and nouns in identifiers, such as `api` or `web`. - - - šŸ‘ Recommended: `navigation` - - šŸ‘Ž Not recommended: `navigation-api` - -- Prefer common, descriptive noun phrases over abbreviations, metonymy, and syntax. - - - šŸ‘ Recommended: `offscreen-canvas` - - šŸ‘Ž Not recommended: `offscreencanvas` (as in `OffscreenCanvas`) - - šŸ‘ Recommended: `grid` - - šŸ‘Ž Not recommended: `display-grid` (as in `display: grid`) - -- Prefer shorter identifiers to longer identifiers, as long as they're unique and unamibguous. - - - šŸ‘ Recommended: `has` - - šŸ‘Ž Not recommended: `has-pseudo-class` - -Feature identifiers may use common suffixes (such as `-api`) to resolve naming conflicts. +* To learn to contribute to the web-features project, see [Contributing to the web-features project](./CONTRIBUTING.md). +* For guidelines on writing features, see [Feature guidelines](./guidelines.md). +* For guidelines on reviewing and merging changes, see [Pull request and issue management](./reviewing.md). +* For information about what Baseline is and how Baseline status is calculated, see [Baseline](./baseline.md). diff --git a/docs/baseline.md b/docs/baseline.md index 9205721ebd2..e9221c050a0 100644 --- a/docs/baseline.md +++ b/docs/baseline.md @@ -1,4 +1,4 @@ -## Baseline +# Baseline This document describes what Baseline intends to do and specifies how features are to receive a Baseline status. @@ -29,7 +29,7 @@ See [Audience illustration for Baseline status](#audience-illustration-for-basel Goal 2: **Change with the web and web developers’ needs.** Features can and should join and leave Baseline status as their respective interoperability, reliability, commitment, and availability profiles change. -Likewise, Baseline statuses should change as developers’ needs change (for example, developers come to rely on a new browser or an established browser fades from use). +Likewise, Baseline statuses should change as developers’ needs change. For example, if developers come to rely on a new browser or an established browser fades from use. Baseline is not an inert, one-time assessment, nor is it arbitrary, changing form from one day to the next. Goal 3: **Identify interoperability through support across browser implementations.** @@ -59,6 +59,9 @@ Baseline status cannot or will not satisfy the following non-goals: Many Baseline features will not achieve 100% user reach soon or perhaps ever. If a web developer needs to support a globally uncommon or discontinued browser (e.g., Internet Explorer 11), then the developer needs to know the specific limitations of that browser, not a broad overview of developers’ most commonly required browsers. Baseline can’t be both. +* **Identify support in assistive technology.** + Baseline does not cover support for screen readers, screen magnifiers, voice control, and other assistive technology that is not built into browsers. + See also: [Future considerations](#future-considerations). * **Identify support in non-web environments.** Developers use web technologies in non-web settings, such as JavaScript in Node.js, Web APIs in Deno, or HTML and CSS in Electron-based applications. For good reasons, web technologies in non-web settings often depart from interoperability with web browsers. @@ -118,7 +121,7 @@ This is but one of several possible stories to help keep in mind the needs and c The WebDX community group, through the [web-platform-dx/web-features-set owners group](../GOVERNANCE.md), maintains this document. Based on WebDX community group research, the web-features owners group decides matters such as the core browser set, releases, editorial overrides, and so on. -The status definition is due for review by the governance group on 7 November 2024. +The status definition is due for review by the owners group on 1 June 2025. ## Status definition @@ -137,7 +140,7 @@ For each feature definition in `web-features`, an interoperable status shall be 2. The feature definition does not have a value set indicating that: - The specification text contains discouraging language, such as a deprecation notice, obsolescence warning, or legacy tag. - - The governance group is withholding or modifying the status (i.e., there is no editorial override of the feature’s status). + - The owners group is withholding or modifying the status (i.e., there is no editorial override of the feature’s status). If the feature has the interoperable status, then the feature’s _keystone date_ shall be set to the last release date on which a browser introduced support for the feature If there was more than one introduction (e.g., a feature was withdrawn then reintroduced), then only the latest date applies. @@ -150,7 +153,7 @@ The feature’s keystone date is on or before today’s date minus 30 months and * Mozilla Firefox ESR, given by the release date for the latest x.0 release of Firefox ESR (or the previous x.0 release, when there are two active ESR releases). -This duration is selected to approximate developer signals, estimates of browser release uptake over time, an estimate of high total market share support, and the project governance group’s best judgment. +This duration is selected to approximate developer signals, estimates of browser release uptake over time, an estimate of high total market share support, and the project owners group’s best judgment. ### Core browser set @@ -165,6 +168,15 @@ The _core browser set_ shall be defined as: * Mozilla Firefox (Android) * Mozilla Firefox (desktop) +> [!NOTE] +> How Baseline statuses change based on the introduction of a new browser to the existing core browser set is not yet defined. +> If you need this to adopt Baseline in your tool or process, file an issue describing your use case. +> See issue [#2133](https://github.com/web-platform-dx/web-features/issues/2133) for further discussion. + +> [!NOTE] +> Baseline status before the release of Edge 12 (the first release of the newest browser in the core browser set) is not defined. +> If you need Baseline statuses for 2014 or earlier, file an issue describing your use case. + ## Future considerations There are many things Baseline does not cover. @@ -176,5 +188,6 @@ Here are some areas for future consideration and not currently in-scope for Base * Progressive enhancement safe (i.e., limited penalties for support failures) * Developer feedback requested * Buggy (e.g., supported but in ways that are surprising and semi-interoperable) +* Support in assistive technology that is not built into browsers. * Obsolete/deprecated/legacy/etc. (i.e., flagged as such in the specification or dropped from newer versions of the specification) * Having high-quality polyfills available diff --git a/docs/bcd-sync.md b/docs/bcd-sync.md new file mode 100644 index 00000000000..dc48db1945c --- /dev/null +++ b/docs/bcd-sync.md @@ -0,0 +1,48 @@ +# BCD synchronization + +The [web-platform-dx/web-features](https://github.com/web-platform-dx/web-features/) and the [mdn/browser-compat-data](https://github.com/mdn/browser-compat-data/) (BCD) repositories depend on, and complement each other. This document describes how the two projects get synchronized and how BCD and web-features maintainers should work with both repositories. If you are a consumer of web-features data, these internal steps are mostly opaque to you. If you are a web-features maintainer, read this document to decide how to map or tag BCD keys. Note that either way is fine. If you're authoring a new feature, add the keys in web-features. If you're changing keys in BCD, make the change there. The goal is to limit the times where you have to make pull requests (PRs) in both repositories and this document helps you to understand how this is achieved. + +## BCD keys in `compat_features` + +The source YAML files, which define each feature in web-features, might contain a `compat_features` field. + +When present, the `compat_features` field consists of a list of browser-compat-data (BCD) entry keys that make up this feature (e.g., `css.properties.background-color`). + +If the `compat_features` field is not present in a feature's source YAML file, the resulting `.yml.dist` file (generated by the `dist` script) contains a `compat_features` field that contains the BCD entry keys that were tagged with `web-features:` in the BCD repository, if any. + +The `compat_features` field in a feature's source YAML file always takes precedence over tags defined in BCD. +Whatever the origin of the `compat_features` keys, the `.dist` file shows the final, resolved list of keys. + +## Tagging keys in BCD + +One way to map keys to web-features is that keys are tagged in BCD from inception. This is more likely for small, incremental changes to existing features. + +For example, a typical scenario could look like this: + +1. A new key appears in BCD (e.g., via a [Collector](https://github.com/openwebdocs/mdn-bcd-collector) PR). +2. The author of the BCD PR knows which feature the key belongs to (e.g., due to a key being renamed) and tags the key with the correct `web-features:*` tag. +3. A few days later, that data is released by BCD. That triggers the next `@mdn/browser-compat-data` Dependabot upgrade PR in the web-features repository, where we regenerate web-features data based on the updated tag and automatically remove the redundant `compat_features` list from the source YAML file (if the list and tagged keys match). + + If necessary (e.g., a tag was assigned by BCD maintainers in error), a web-features maintainer can update a `compat_features` list in web-features and the data gets synchronized to BCD as described in the next section. + +## Listing keys in web-features source YAML files + +The other way to map keys to web-features is to list them in the source YAML files, which are eventually migrated to BCD as tags through an automated process. In this scenario, web-features receives unaccounted-for keys in the `features/draft` folder, which must be addressed by web-features maintainers. + +For example, a typical scenario would look like this: + +1. A new key appears in BCD (e.g., via a [Collector](https://github.com/openwebdocs/mdn-bcd-collector PR). +2. The author of the BCD PR doesn't know or doesn't care which feature that key belongs to and does not tag it. +3. A few days later, that data is released by BCD. That triggers the next `@mdn/browser-compat-data` Dependabot upgrade PR in the web-features repository. +4. After the Dependabot PR merges, we run the "Update draft features" workflow, which makes the new keys appear in the `features/draft` folder. +5. At this point, a web-features maintainer can assign the key to an existing feature or author a new feature. +6. A few days later, that data is released by web-features. When BCD upgrades `web-features`, it'll automatically add/remove tags to/from each key according to the `compat_features` list. + +## Circular changes + +To prevent circular changes: + +- BCD contributors must never create a new tag before the corresponding ID appears in web-features. (linters in BCD will prevent this from happening). See [Contributing features to web-features](https://github.com/web-platform-dx/web-features/blob/main/docs/CONTRIBUTING.md#contributing-features-to-the-repository) for how to suggest a new feature. +- web-features contributors must never manually remove a `compat_features` list from a feature. + +To ensure ongoing completeness, web-features maintainers must keep generated drafts to an absolute minimum. diff --git a/docs/guidelines.md b/docs/guidelines.md new file mode 100644 index 00000000000..181feb12705 --- /dev/null +++ b/docs/guidelines.md @@ -0,0 +1,350 @@ +# Feature guidelines + +## Names + +The `name` field contains the feature's human-readable plain-text name. + +Feature authors should (in descending order of priority): + +- Prefer names known to be in widespread use by web developers. + Favor describing things as they are most-widely known, even if it's not the most technically correct option. + + - šŸ‘ Recommended: JavaScript + - šŸ‘Ž Not recommended: ECMAScript + - šŸ‘ Recommended: Declarative shadow DOM + - šŸ‘Ž Not recommended: `shadowrootmode` attribute + +- Avoid prefixes that mark a feature as specific to a technology, such as CSS, HTML, or JavaScript. + Features can and do cross such boundaries. + + - šŸ‘ Recommended: Container queries + - šŸ‘Ž Not recommended: CSS container queries + - šŸ‘ Recommended: `` + - šŸ‘Ž Not recommended: HTML `` + +- Avoid frequently-used abbreviations and nouns, such as API and Web. + + - šŸ‘ Recommended: Async clipboard + - šŸ‘Ž Not recommended: Async clipboard API + - šŸ‘ Recommended: Workers + - šŸ‘Ž Not recommended: Web workers + +- Prefer common, descriptive noun phrases over abbreviations, metonymy, and syntax. + + - šŸ‘ Recommended: Offscreen canvas + - šŸ‘Ž Not recommended: `OffscreenCanvas` + - šŸ‘ Recommended: Grid + - šŸ‘Ž Not recommended: `display: grid` + +- Prefer sentence case. + Avoid capitalizing ordinary nouns, but preserve case when it's meaningful. + + - šŸ‘ Recommended: Typed arrays + - šŸ‘Ž Not recommended: Typed Arrays + - šŸ‘ Recommended: View transitions + - šŸ‘Ž Not recommended: View Transitions + - šŸ‘ Recommended: WebDriver BiDi + - šŸ‘Ž Not recommended: Webdriver bidi + +- Prefer frequently-used qualifiers in parentheses at the end of the name. + + - šŸ‘ Recommended: Arrays (initial support) + - šŸ‘Ž Not recommended: Initial support for arrays + +- Prefer shorter names to longer names, as long as they're unique and unambiguous. + + - šŸ‘ Recommended: `:has()` + - šŸ‘Ž Not recommended: `:has()` pseudo-class + - šŸ‘ Recommended: `` + - šŸ‘Ž Not recommended: `` element + +## Identifiers + +A feature's identifier is the feature's filename before the `.yml` extension. + +Feature identifiers must start with a lowercase alphabetic character (a-z) and contain only lowercase alphanumeric characters (a-z and 0-9) plus the `-` character (hyphen or minus sign) as a word separator. + +The identifier should match the name, with these additional guidelines: + +- Prefer shorter identifiers to longer identifiers, by avoiding common qualifiers and repeated words. + + - šŸ‘ Recommended: `aborting` + - šŸ‘Ž Not recommended: `abort-controller-and-abort-signal` + - šŸ‘ Recommended: `arrays` + - šŸ‘Ž Not recommended: `arrays-initial-support` + - šŸ‘ Recommended: `fullscreen` + - šŸ‘Ž Not recommended: `fullscreen-api` + - šŸ‘ Recommended: `user-pseudos` + - šŸ‘Ž Not recommended: `user-valid-and-user-invalid` + +## Descriptions + +The `description` field contains a short description of the feature in Markdown-formatted text, which is converted to HTML in the published package. +Follow the general writing guidelines in this section, but see the [word and phrase list](#word-and-phrase-list) for specific usage instructions. + +* Describe, in the active voice, what a feature does or is. + Think about how developers will use it, not abstract technology relationships. + Start with a template like this: + + - `The the .` + - `The the .` + - `The represents .` + - ` is a or `. + +* Description text must stand alone. + It should not refer to text, images, or other content outside the short description. + Try reading the sentence aloud. + Does it still make sense without mentioning the name or ID? + +* Enclose literal code, such as CSS property names, interface and method names, or other syntax, in backticks. + For example, prefer ```The `addEventListener()` method…``` and avoid ```The addEventListener() method…```. + +* To aid search, include literal text that a web developer would inevitably type if they were to invoke the feature. + If there's no essential entry point to the feature, then include only concise snippets of essential literal code instead. + Never use made-up, idiosyncratic, or non-literal example code. + + * šŸ‘ Recommended: `display: flex`, `fetch()`, etc. + * šŸ‘Ž Not recommended: `(await navigator.serviceWorker.ready).sync` + * šŸ‘ Recommended: "`margin-top`, `margin-right`, `margin-bottom`, and `margin-left`" + * šŸ‘Ž Not recommended: `margin-{top,right,bottom,left}` + +* Start descriptions with words that are distinct to the feature. + For example, prefer "The `some-prop` CSS property…" and avoid "The CSS property `some-prop`…." + +* Avoid circular descriptions. + For example, prefer "The `filter()` method returns the items…" over "The `filter()` method filters the items…." + +* It's OK to use the second person ("you", "your", and "yours") to refer to the audience when needed. + For example, "The interface allows you to…." + ([#738](https://github.com/web-platform-dx/web-features/pull/742)) + +* Never mention support or standards status. + This information *will* go out of date and sooner than you think. + +* For every rule, there's a counterexample. + Use your best judgement before writing something absurd. + +### Word and phrase list + +For general usage recommendations not covered by this list, such as word choice or punctuation, refer to the [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/). + +#### allows + +OK in usage such as "allows you to…." +Avoid where there is no named actor, as in "the feature allows magic to happen." +([#738](https://github.com/web-platform-dx/web-features/pull/738#discussion_r1537760761)) + +You can often omit it with gerunds. +For example, prefer "The widget sends…" over "The widget allows sending…." + +#### also known as + +Use this phrase to call attention to other names this feature has gone by. +Use it at the start of a sentence at the end of the description. +For example: + + > The `some-property` CSS property sets the … value. Also known as ``. +([#628](https://github.com/web-platform-dx/web-features/pull/628/files/a9898862cb631c83ea16f1233b3c5c4353bf7a52#r1516293423)) + +#### declaration + +For CSS, use _declaration_ to refer to property-value pairs. +For example, prefer "The `some-property: none` CSS declaration…" over The `some-property: none` CSS property value…." +([#969](https://github.com/web-platform-dx/web-features/pull/969)) + +#### defines + +Avoid. +See [sets](#sets). +([#727](https://github.com/web-platform-dx/web-features/pull/727#discussion_r1537635491)) + +#### determines + +Avoid. +See [sets](#sets). +([#727](https://github.com/web-platform-dx/web-features/pull/727#discussion_r1537635491)) + +#### device + +Use "device" to refer to the underlying operating system or hardware environment, or combination thereof. +This is to avoid cumbersome phrases like "the operating system or hardware" or specifically enumerating Linux, macOS, and Windows. +For example, write "the device UI" not the "operating system UI." +([#810](https://github.com/web-platform-dx/web-features/pull/810)) + +#### elements + +Avoid "element" in reference to things that are not HTML elements. +For example, an array of objects has "items", not "elements." +([#750](https://github.com/web-platform-dx/web-features/pull/750#discussion_r1543011420)) + +#### enables + +Avoid, except in the sense of to turn on or activate. +See [allows](#allows). +([#750](https://github.com/web-platform-dx/web-features/pull/750#discussion_r1547382081)) + +#### for example + +Don't use it as a coordinating conjunction; start a new sentence instead. +For example, this is an example. +([#738](https://github.com/web-platform-dx/web-features/pull/738#discussion_r1537762579), [#742](https://github.com/web-platform-dx/web-features/pull/742)) + +#### is used to + +Omit "is used" where there's no loss in meaning. +For example, prefer "The feature reads…" over "The feature is used to read…" +([#727](https://github.com/web-platform-dx/web-features/pull/727#discussion_r1537635981)) + +#### longhands and shorthands + +Use the terms "shorthand" and "longhand" to describe the relationship between CSS properties that combine multiple properties into a single declaration and the individual properties. + +Avoid using "shorthand" and "longhand" without the word "property": + +* Prefer "The `text-wrap` CSS property is a shorthand" over "The `text-wrap` CSS shorthand". +* Prefer "It is a longhand property of" over "It is a longhand of". + +Avoid the phrase "constituent properties" for longhand properties, even though this is common on MDN Web Docs. +([#1764](https://github.com/web-platform-dx/web-features/pull/1764#discussion_r1777335770)) + +#### platform + +"platform" is often vague. +Avoid using it by itself. +Instead, prefer more complete phrases that make it clear which platform you're referring to, such as "the web platform." + +#### provides + +Avoid, especially with gerunds. +For example, prefer the "The feature writes to…" over "The feature provides writing to…." +([#727](https://github.com/web-platform-dx/web-features/pull/727#discussion_r1537635491)) + +#### sets + +Prefer this over multisyllabic alternatives, such as "defines", "determines", or "specifies". +Use "The property sets…" but never "The property defines…." +([#727](https://github.com/web-platform-dx/web-features/pull/727#discussion_r1537635491)) + +#### specifies + +Avoid. +See [sets](#sets). +([#727](https://github.com/web-platform-dx/web-features/pull/727#discussion_r1537635491)) + +#### styling … as … by default + +Use this phrase (or using another appropriate preposition, such as "styling in") to note conventional or standardized default styling. +The ellipses stand in for the thing being styled (e.g., "text") and the style itself (e.g., "italic"). +Use it before [_also known as_ text](#also-known-as). +For example: + + > The `` element represents side-comments and small print, like copyright and legal text, styling text in a reduced font size by default. + + ([#1403](https://github.com/web-platform-dx/web-features/pull/1403), [#1379](https://github.com/web-platform-dx/web-features/pull/1379)) + +#### usage + +Never use "usage" in the sense of "using." +For example, instead of "The `input()` method enables the usage of…" write "The `input()` method uses…." +([#753](https://github.com/web-platform-dx/web-features/pull/753#discussion_r1560914869)) + +It's OK to use "usage" only in the sense of "consumption" (as in "mobile data usage") or "customary practice" (as in "the style guide's usage recommendations"). + +#### `window` + +Because `window` is both the global object and represents the browser window, there are cases where it makes sense to refer to either `window.` or `` (such as `window.fetch()` or `fetch()`). +Use the most customary reference in each case. +If you're not sure what's customary, look to high-profile published examples, such as those on MDN reference pages for the feature. +([#913](https://github.com/web-platform-dx/web-features/pull/913#discussion_r1572601975)) + +## `caniuse` values + +The `caniuse` key references one or more [Can I Use](https://caniuse.com/) feature IDs. +This is the part of a Can I Use URL after `https://caniuse.com/`. +For example, the Can I Use feature ID for [Flexbox](https://caniuse.com/flexbox) is `flexbox`. +For a complete list of IDs, run `npx tsx ./scripts/caniuse.ts`. + +Setting a `caniuse` value says that a feature is approximately equivalent to or a superset of a Can I Use feature. +If you set a `caniuse` value, then the Can I Use site shows a status badge based on the feature's top-level headline `status` information. + +Follow these guidelines when setting a `caniuse` value: + +- Do not set a `caniuse` value if the Can I Use feature is merely related to the feature. + For example, in [`grid.yml`](../features/grid.yml), do not set `caniuse: css-subgrid`. + +- Do not set a `caniuse` value if the top-level headline `status` does not match Can I Use on whether each browser supports or does not support the feature. + + For example, if Can I Use shows that one browser of the core browser set does not support a feature but web-features's status reports that the feature is supported across all of the browsers, then do one of these: + + - Do not set the `caniuse` value for that feature. + - Submit a correction to Can I Use. + - Submit a correction to mdn/browser-compat-data. + +- Do not set a `caniuse` value if the top-level headline `status` would not accurately reflect when a feature was last introduced to core browser set (the [keystone release](./baseline.md#interoperable-low-status) version number). + + For example, if Can I Use shows that Edge 79 introduced a feature, then the headline status must also show that Edge 79 introduced the feature. + +- Do use `compute_from` to improve the correspondence of a feature's top-level headline status with Can I Use data. + Use this in cases where later additions, such as the introduction of a minor property or method, brings the statuses out of alignment. + + But don't forget to use your judgement! + Can I Use isn't perfect. + Don't use `compute_from` in a way that would not make sense if the corresponding `caniuse` value didn't exist (for example, by pinning support before the introduction of an essential component of the feature). + In such situations, it's better to comment out the `caniuse` value, make a `TODO` comment, and open an issue about why you did it. + +If you see a discrepancy between Can I Use and a computed status that is less than one year for releases before 2020, please make a note of it in [#1499](https://github.com/web-platform-dx/web-features/issues/1499). + +See also: [#1880](https://github.com/web-platform-dx/web-features/issues/1880). + +## Groups + +The `group` field references one or more groups. +You can find group definitions in the [`groups/`](../groups/) directory. + +Groups are experimental. +It might not be clear how to group features until more features have been defined. + +Don't assign features to two or more groups such that one group is an ancestor of another. +For example, don't assign a feature to both `css` and `fonts`, since `css` is the parent of `fonts`. + +Do assign features to groups when there's an opportunity for future feature composition (see [#971](https://github.com/web-platform-dx/web-features/issues/971)). +For example, several features for the JavaScript `Array` interface are members of the `array` group. + +## Discouraged + +Rarely, the developers should not use a platform feature because it's the consensus of relevant stakeholders (i.e., a standards body and implementers), even if that feature is still implemented in browsers. +Mark a feature as discouraged when: + +- The specification adopts clear language directing developers to stop using that feature or to prefer to an alternative. + This is often through terms like "deprecated", "obsolete", or "legacy." + They can also be in the form of one-off recommendations to use alternatives (such as "[…ought to be used instead](https://dom.spec.whatwg.org/#ref-for-concept-event%E2%91%A4%E2%91%A3)"). + +- The specification removes that feature from the specification without a succession plan (such as moving it to another specification). + +- The specification editors intend to discourage or remove the feature from the specification. + For example, meeting minutes show that a committee achieved consensus to remove a feature from a specification, even if the removal is not complete. + +- All of the (present) implementers issue warnings when using that feature or have published something expressing an intention to unship that feature. + + +Do not mark a feature as discouraged when: + +- The feature is merely old or unpopular, no matter how many [_considered harmful_](https://en.wikipedia.org/wiki/Considered_harmful) blog posts it may have garnered. + For example, despite the existence of `fetch`, `XMLHttpRequest` is not a discouraged feature. + +- The feature is controversial. + Opposition to a feature (without consensus) is not sufficient to mark a feature as discouraged. + For example, do not mark a feature as discouraged because a vendor has given it a negative standards position. + +- The feature is buggy or not implemented in one or more browsers. + Contribute to accurate support data instead. + +When you set a `discouraged` block in a feature file, do: + +- Set a (required) `according_to` URL, linking to evidence that the feature is discouraged. + If possible, use the single most broadly applicable reference, such as specification text. + If a feature is removed from a specification, link to an issue, pull request, or commit showing the removal. + +- Set one or more (optional) `alternative` feature IDs that are whole or partial substitutes for the discouraged feature. + An alternative doesn't have to be a narrow drop-in replacement for the discouraged feature but it must handle some use case of the discouraged feature. + Guide developers to the most relevant features that would help them stop using the discouraged feature. diff --git a/docs/publishing.md b/docs/publishing.md new file mode 100644 index 00000000000..31da59434a4 --- /dev/null +++ b/docs/publishing.md @@ -0,0 +1,143 @@ +# Publishing releases + +## Announcements + +web-features uses a GitHub Discussions thread to give notice of breaking changes and other major changes to interested web-features consumers. + +If you want to receive these announcements, subscribe to the [Upcoming changes](https://github.com/web-platform-dx/web-features/discussions/2613) announcements thread or to all discussions through the repository's _Watch_ menu. + +> [!NOTE] +> The remainder of this section is for [project owners](../GOVERNANCE.md#roles-and-responsibilities). + +If you're planning to publish a breaking release (see [Regular releases](#regular-releases)) in the next two weeks, then post a message to the [Upcoming changes](https://github.com/web-platform-dx/web-features/discussions/2613) announcements thread. +Include a summary of the expected changes, citing relevant issues and pull requests. + +Note that an announcement is not a substitute for seeking consumer feedback early in the design and implementation process. +Announcements should not provoke surprising responses from consumers. + +## Regular releases + +> [!NOTE] +> This section is for [project owners](../GOVERNANCE.md#roles-and-responsibilities). + +These are the steps to publish a regular release on npm and as a GitHub release. +Typically, a maintainer follows these steps shortly after merging a Dependabot PR that upgrades `@mdn/browser-compat-data`. + +> [!TIP] +> +> Running the stats for the `main` branch and previous release can help you determine the next release's version number and writing the release notes. +> Run these commands to get stats for the previous release: +> +> ```sh +> $ PREVIOUS_RELEASE_TAG=$(gh release view --json tagName --jq .tagName) +> $ git fetch --tags && git checkout "$PREVIOUS_RELEASE_TAG" && npm install && npx tsx ./scripts/stats.ts +> ``` +> Run these commands to get stats for the `main` branch: +> +> ```sh +> $ git fetch origin main && git checkout origin/main && npm install && npx tsx ./scripts/stats.ts +> ``` + +To publish a release: + +1. Determine if it should be a major, minor, or patch release. + + A major version is required for releases when: + + - The schema changes such that types have incompatibly narrowed, widened, or otherwise changed (for example, a string value now accepts an array of strings or an ID has become a URL). Changes to `data.schema.json` often indicates a major or minor version is required. + - A group or feature ID is removed, or any other previously valid references becomes undefined. + + A minor version is required for releases that contain only additions, such as new features or new properties on existing types. + + Patch versions are required for releases that contain only routine data changes, such as updates to `compat_features` arrays or `support` objects. + + Check "[major version required][major-version]" and "[minor version required][minor-version]" labels for pull requests or issues that require versioning. + +1. Trigger the [Prepare web-features release workflow](https://github.com/web-platform-dx/web-features/actions/workflows/prepare_release.yml). + + 1. Click the **Run workflow** dropdown. + 1. Choose the semver level. + 1. Click the **Run workflow** button. + + When the workflow finishes, your review is requested on a new release pull request. + +1. Review the PR. + + 1. Close and reopen the release PR, to allow the tests to run. + 1. Review and approve the changes. + 1. When you're ready to complete the remaining steps, merge the PR. + To avoid re-doing release prep (such as having to change the semver level), don't delay any of the remaining steps after merging. + +1. Create the GitHub release. + + 1. Go to https://github.com/web-platform-dx/web-features/releases/new to start a new draft release. + 1. Create a new tag in the pattern `vX.Y.Z`. + 1. Fill in the release title `vX.Y.Z`. + 1. For minor releases, add a `## What's New` section to the top of the release notes, before all other sections. + + 1. In this section, add a line `* X features`, where `X` is the number of features new in this release. + 1. In this section, add a line `* Y% coverage of BCD`, where `Y` is the coverage percentage for this release. + + 1. For major releases, add a `## Breaking Changes` section to the top of the release notes, before all other sections. + 1. Click **Generate release notes**. + 1. In the release description, find unescaped `<` characters and make sure that HTML elements are enclosed with backticks. + + This regular expression can help: + + ```regex + / (? / + ``` + + 1. Remove all generated lines for: + + - `Update draft features by @github-actions` + - Dependabot PRs except `@mdn/browser-compat-data` upgrades + - `šŸ“¦ Release web-features` + + 1. Append this message to the end of the release notes: + + ```markdown + Subscribe to the [Upcoming changes](https://github.com/web-platform-dx/web-features/discussions/2613) announcements thread for news about upcoming releases, such as breaking changes or major features. + ``` + + 1. Click **Publish release**. + + Publishing the GitHub release creates the tag. This triggers the [Publish web-features GitHub Actions workflows](https://github.com/web-platform-dx/web-features/blob/main/.github/workflows/publish_web-features.yml), uploads GitHub release artifacts and publishes the package to npm. + +1. Remove the "[major version required][major-version]" and "[minor version required][minor-version]" labels from any pull requests that were included in the release. + +1. (_Optional_) If this release contained schema changes, notify highly-visible downstream consumers, such as Can I Use (@Fyrd), MDN (@LeoMcA), or webstatus.dev (@jcscottiii). + +1. Post a message to the WebDX Matrix chat to announce the release. + +Congratulations, you've released web-features. šŸŽ‰ + +[major-version]: https://github.com/web-platform-dx/web-features/pulls?q=is%3Apr+is%3Amerged+label%3A%22major+version+required%22+sort%3Aupdated-desc +[minor-version]: https://github.com/web-platform-dx/web-features/pulls?q=is%3Apr+is%3Amerged+label%3A%22minor+version+required%22+sort%3Aupdated-desc + +## `@next` releases + +The [Publish web-features@next GitHub Actions workflows](https://github.com/web-platform-dx/web-features/blob/main/.github/workflows/publish_next_web-features.yml) automatically publish pre-releases on push to the main branch using the `next` [npm dist tag](https://docs.npmjs.com/adding-dist-tags-to-packages). +You can install these prereleases using a command such as `npm install web-features@next`. + +## Secrets + +> [!NOTE] +> This section is for [project owners](../GOVERNANCE.md#roles-and-responsibilities). + +Publishing requires the `NPM_TOKEN` repository secret. + +Set the secret by running `gh secret set --repo=web-platform-dx/web-features NPM_TOKEN`, +which prompts you to paste the secret, +or via the repository settings (_Settings_ → _Secrets and variables_ → _Actions_). + +If you're replacing this token, then use the following settings: + +| Setting | Value | +| ------------------------------- | ---------------------------------------------------------------------------------------------------------- | +| Token type | _Granular Access Token_ | +| Expiration | The first day of the next quarter (1 January, 1 April, 1 July, or 1 October) or the first weekday after it | +| Packages and scopes permissions | _Read and write_ | +| Select packages | _Only select packages and scopes_ | +| Select packages and scopes | `compute-baseline` and `web-features` | +| Organizations | _No access_ | diff --git a/docs/reviewing.md b/docs/reviewing.md new file mode 100644 index 00000000000..3fe8e255bcd --- /dev/null +++ b/docs/reviewing.md @@ -0,0 +1,36 @@ +# Pull request and issue management + +## Merging pull requests + +> [!NOTE] +> This information is for [project peers and owners](../GOVERNANCE.md#roles-and-responsibilities). + +If a pull request has been approved and tests are passing, then you can merge it. +Follow these steps to merge: + +1. Make sure you **should** merge this pull request. + In general, only merge pull requests you are already familiar with, either as an author or reviewer. + +1. Make sure **you** should merge this pull request. + Some changes—most notably, feature removals, tooling and policy changes, and schema changes—require an owner to merge. + See [the privileges and responsibilities matrix](../GOVERNANCE.md#privileges-and-responsibilities-matrix) for more information. + +1. Make sure there are no explicit blockers to merging. + Blockers include: + + - The pull request has the [blocked label](https://github.com/web-platform-dx/web-features/pulls?q=is%3Aopen+is%3Apr+label%3Ablocked). + - A reviewer asked to re-review before merging or has requested changes that have not been addressed with a commit or comment. + - The author explicitly asked to delay merging. + - The author explicitly asked for review from all requested reviewers (the presumption is at least one but not all). + + If a blocker no longer applies, remove the label or [dismiss the stale review](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/dismissing-a-pull-request-review). + +1. If the pull request might require a Semantic Versioning MAJOR or MINOR release, then add the [minor version required](https://github.com/web-platform-dx/web-features/labels/minor%20version%20required) or [major version required](https://github.com/web-platform-dx/web-features/labels/major%20version%20required) label. + +1. Click the **Squash and merge** button, then prepare the commit message. + + Clean up the subject and message fields so they make sense as a single unit. + For example, delete boilerplate messages about applying changes from code review. + Often an imperative-noun subject, such as "Add example feature", is sufficient. + +1. When you're ready to commit the changes, click **Confirm squash and merge**. diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000000..62c7785e02d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,31 @@ +import newWithError from "eslint-plugin-new-with-error"; +import tseslint from "typescript-eslint"; + +export default tseslint.config(tseslint.configs.base, { + plugins: { newWithError }, + rules: { + "@typescript-eslint/no-unused-vars": [ + "error", + { + caughtErrors: "none", + }, + ], + "newWithError/new-with-error": "error", + "no-duplicate-imports": "error", + "no-throw-literal": "error", + }, + files: ["**/*.ts"], +}); + +// TODO: do linting more comprehensively, something like: +// import eslint from "@eslint/js"; +// export default tseslint.config( +// eslint.configs.recommendedTypeChecked, +// ...tseslint.configs.recommended, +// { +// plugins: { newWithError }, +// rules: { +// "no-throw-literal": "error", +// "newWithError/new-with-error": "error", +// }, +// ); diff --git a/feature-group-definitions/README.md b/feature-group-definitions/README.md deleted file mode 100644 index e92e98a8097..00000000000 --- a/feature-group-definitions/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Feature groups - -This directory houses the experiment to provide structured definitions groups of web platform features. -At inception, it consists of this README file only, but it should soon contain data and tools. -See [ddbeck/common-web-feature-mockup](https://github.com/ddbeck/common-web-feature-mockup/) for more information. - -## What is a web platform feature? - -To identify, group, and report on the availability of web platform features, it might be nice to have a working defintion of a web platform feature. -For the purposes of this project, consider this defintion: - -**A _feature_ (or _feature group_) is a logical subset of all the addressable behaviors and interfaces that the web platform, as mediated by browsers and related tools, exposes to web developers.** - -This definition is surely not authoritative, complete, or universally applicable (see [_Limitations of this definition_](#limitations-of-this-definition)). -You could come up with many reasonable alternative definitions. -This definition focuses on things that are useful to this project, but potentially less useful to others. - -Also, it's a mouthful. Take a look at each piece: - - -### A logical subset - -_A logical subset_ means that all web technologies together are not a feature; -all of the web platform features taken together **are** the web. -It also means that a feature does not represent a random or arbitrary selection of web technologies. - -For example, a group of JavaScript’s `Symbol` built-in object, the CSS `border-color` property, and the HTTP `POST` method is not a web feature, but all of the CSS border properties (individually or as a group) might be. - -The definition leaves the size the subset undefined on purpose. Logical subsets may be composed of a single specific feature or hundreds of them. For example, the [range syntax](https://drafts.csswg.org/mediaqueries-4/#mq-ranges) in Media Queries may be a web feature, but so would Media Queries as a whole. - - -### Addressable - -_Addressable_ means that a feature must be identifiable and distinguishable from other features. - -For example, ā€œa formā€ is not a web feature, but the HTML `
` element, the `HTMLFormElement` API, or a group of both (ā€œformsā€) might be. - - -### Behaviors and interfaces - -_Behaviors and interfaces_ means that a feature must represent the things that the web platform can do, not specific instances of those behaviors and interfaces in use. - -For example, the document retrieved from `https://www.wikipedia.org/`, parsed, and turned into a `Document` object is not a feature; -the general browser behavior of retrieving a resource from a URL, parsing its HTML, and turning it into a `Document` object might be. - - -### The web platform - -_The web platform_ means the many technologies developed as open standards with aspirations of compatibility and interoperability that facilitate the use of hypermedia documents and applications on the Internet. -This includes technologies such as HTML, CSS, JavaScript, SVG, WebAssembly, and more, but excludes vendor- or platform-specific exclusive or proprietary technologies. - -For example, a standardized API implemented by web browsers might be a feature; a proprietary API exposed to an operating system’s web views is not a feature (even if the web view otherwise implements web platform technologies). - - -### Mediated by browsers - -_As mediated by web browsers and related tools_ means that features must be implemented (or enjoy a reasonable prospect of being implemented in the near future) by web browsers or closely related tools (e.g., a JavaScript engine). -Immature proposals or long-withdrawn behaviors of web browsers are not features (though they might be in the future or have been in the past). - - -### Exposes to web developers - -_The web platform … exposes to web developers_ means that a feature must be open to inspection or manipulation by web developers via the web documents and applications that they make. - -For example, the ability to request permission to stream video from a webcam might be a feature (i.e., to call the `getUserMedia()` method), but the particular format, placement, or wording of the prompt to the user to grant that permission is not. - -### Limitations of this definition - -This definition has many limitations. -To name just a few: - -- The definition was written to be descriptive of web features, as opposed to prescriptive. - The definition intends to capture things that have the look of a web feature, not describe all of the formal requirements or expectations of a web feature. - -- The definition was written with a narrow application in mind: - to characterize web platform features as they relate to the experience of web developers. - Other definitions might be more useful to specification authors or implementers or technical writers. - -- The definition was written with the understanding that it is necessarily incomplete. - The web, understood broadly, involves many technologies, technologists, and users. - A one-sentence definition cannot capture everything. - Even focusing on web developers as a group requires approximating a great many individual perspectives. - -In other words, don't treat this as the one true definition of a web platform feature because it isn't. diff --git a/feature-group-definitions/aborting.yml b/feature-group-definitions/aborting.yml deleted file mode 100644 index f59f5a27843..00000000000 --- a/feature-group-definitions/aborting.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: AbortController and AbortSignal -spec: https://dom.spec.whatwg.org/#aborting-ongoing-activities -caniuse: abortcontroller -compat_features: - - api.AbortController - - api.AbortController.AbortController - - api.AbortController.abort - - api.AbortController.signal - - api.AbortSignal - - api.AbortSignal.abort_event - - api.AbortSignal.aborted diff --git a/feature-group-definitions/anchor-positioning.yml b/feature-group-definitions/anchor-positioning.yml deleted file mode 100644 index 333cf0ef5b6..00000000000 --- a/feature-group-definitions/anchor-positioning.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Anchor positioning -spec: https://drafts.csswg.org/css-anchor-position-1/#anchoring diff --git a/feature-group-definitions/array-at.yml b/feature-group-definitions/array-at.yml deleted file mode 100644 index 92ff8954cd2..00000000000 --- a/feature-group-definitions/array-at.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Array at() -spec: https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.at -snapshot: ecmascript-2022 -status: - baseline: low - baseline_low_date: 2022-03-14 - support: - chrome: "92" - chrome_android: "92" - edge: "92" - firefox: "90" - firefox_android: "90" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - javascript.builtins.Array.at diff --git a/feature-group-definitions/array-flat.yml b/feature-group-definitions/array-flat.yml deleted file mode 100644 index ddd6dcdefa1..00000000000 --- a/feature-group-definitions/array-flat.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Array flat() and flatMap() -caniuse: array-flat -spec: https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.flat -snapshot: ecmascript-2019 -status: - baseline: high - baseline_low_date: 2020-01-15 - support: - chrome: "69" - chrome_android: "69" - edge: "79" - firefox: "62" - firefox_android: "62" - safari: "12" - safari_ios: "12" -compat_features: - - javascript.builtins.Array.flat - - javascript.builtins.Array.flatMap diff --git a/feature-group-definitions/array-group.yml b/feature-group-definitions/array-group.yml deleted file mode 100644 index 4692e20de66..00000000000 --- a/feature-group-definitions/array-group.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Array grouping -spec: https://tc39.es/proposal-array-grouping/ -status: - baseline: false - support: - chrome: "117" - chrome_android: "117" - edge: "117" - firefox: "119" - firefox_android: "119" -compat_features: - - javascript.builtins.Object.groupBy - - javascript.builtins.Map.groupBy diff --git a/feature-group-definitions/async-await.yml b/feature-group-definitions/async-await.yml deleted file mode 100644 index 404a4758aec..00000000000 --- a/feature-group-definitions/async-await.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Async functions -spec: https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-async-function-definitions -caniuse: async-functions -snapshot: ecmascript-2017 -status: - baseline: high - baseline_low_date: 2017-04-05 - support: - chrome: "55" - chrome_android: "55" - edge: "15" - firefox: "52" - firefox_android: "52" - safari: "10.1" - safari_ios: "10.3" -compat_features: - - javascript.builtins.AsyncFunction - - javascript.builtins.AsyncFunction.AsyncFunction - - javascript.operators.async_function - - javascript.operators.await - - javascript.statements.async_function diff --git a/feature-group-definitions/async-clipboard.yml b/feature-group-definitions/async-clipboard.yml deleted file mode 100644 index d1587366f55..00000000000 --- a/feature-group-definitions/async-clipboard.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Async clipboard -spec: https://w3c.github.io/clipboard-apis/#async-clipboard-api -caniuse: async-clipboard -status: - baseline: false - support: {} -compat_features: - - api.Clipboard - - api.Clipboard.read - - api.Clipboard.readText - - api.Clipboard.write - - api.Clipboard.writeText - - api.ClipboardEvent - - api.ClipboardEvent.ClipboardEvent - - api.ClipboardEvent.clipboardData - - api.ClipboardItem - - api.ClipboardItem.ClipboardItem - - api.ClipboardItem.getType - - api.ClipboardItem.presentationStyle - - api.ClipboardItem.types - - api.Navigator.clipboard - - api.Permissions.permission_clipboard-read - # This one appears to be not actually in the specification - # - api.Permissions.permission_clipboard-write diff --git a/feature-group-definitions/avif.yml b/feature-group-definitions/avif.yml deleted file mode 100644 index 6ebc0d79c24..00000000000 --- a/feature-group-definitions/avif.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: AVIF -spec: https://aomediacodec.github.io/av1-avif/ -caniuse: avif -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/3798 diff --git a/feature-group-definitions/backdrop-filter.yml b/feature-group-definitions/backdrop-filter.yml deleted file mode 100644 index ca568686db8..00000000000 --- a/feature-group-definitions/backdrop-filter.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: backdrop-filter -spec: https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty -caniuse: css-backdrop-filter -compat_features: - - css.properties.backdrop-filter diff --git a/feature-group-definitions/background-fetch.yml b/feature-group-definitions/background-fetch.yml deleted file mode 100644 index f9ee36b78aa..00000000000 --- a/feature-group-definitions/background-fetch.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Background fetch -spec: https://wicg.github.io/background-fetch/ -status: - baseline: false - support: - chrome: "74" - chrome_android: "74" - edge: "79" -compat_features: - - api.BackgroundFetchEvent - - api.BackgroundFetchEvent.BackgroundFetchEvent - - api.BackgroundFetchEvent.registration - - api.BackgroundFetchManager - - api.BackgroundFetchManager - - api.BackgroundFetchManager.fetch - - api.BackgroundFetchManager.get - - api.BackgroundFetchManager.getIds - - api.BackgroundFetchRecord - - api.BackgroundFetchRecord.request - - api.BackgroundFetchRecord.responseReady - - api.BackgroundFetchRegistration.abort - - api.BackgroundFetchRegistration.downloaded - - api.BackgroundFetchRegistration.downloadTotal - - api.BackgroundFetchRegistration.failureReason - - api.BackgroundFetchRegistration.id - - api.BackgroundFetchRegistration.match - - api.BackgroundFetchRegistration.matchAll - - api.BackgroundFetchRegistration.progress_event - - api.BackgroundFetchRegistration.recordsAvailable - - api.BackgroundFetchRegistration.result - - api.BackgroundFetchRegistration.uploaded - - api.BackgroundFetchRegistration.uploadTotal - - api.BackgroundFetchUpdateUIEvent - - api.BackgroundFetchUpdateUIEvent.BackgroundFetchUpdateUIEvent - - api.BackgroundFetchUpdateUIEvent.updateUI - - api.ServiceWorkerGlobalScope.backgroundfetchabort_event - - api.ServiceWorkerGlobalScope.backgroundfetchclick_event - - api.ServiceWorkerGlobalScope.backgroundfetchfail_event - - api.ServiceWorkerGlobalScope.backgroundfetchsuccess_event - - api.ServiceWorkerRegistration.backgroundFetch diff --git a/feature-group-definitions/background-gradients.yml b/feature-group-definitions/background-gradients.yml deleted file mode 100644 index 3b20cb38ab6..00000000000 --- a/feature-group-definitions/background-gradients.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Background gradients -spec: https://drafts.csswg.org/css-images-4/#gradients -caniuse: - - css-gradients - - css-repeating-gradients - - css-conic-gradients -compat_features: - - css.properties.background-image.gradients - # Linear gradients - - css.types.image.gradient.linear-gradient - - css.types.image.gradient.linear-gradient.doubleposition - # - css.types.image.gradient.linear-gradient.hue_interpolation_method - # - css.types.image.gradient.linear-gradient.interpolation_color_space - - css.types.image.gradient.linear-gradient.interpolation_hints - - css.types.image.gradient.linear-gradient.to - - css.types.image.gradient.linear-gradient.unitless_0_angle - # Radial gradients - - css.types.image.gradient.radial-gradient - - css.types.image.gradient.radial-gradient.at - - css.types.image.gradient.radial-gradient.doubleposition - # - css.types.image.gradient.radial-gradient.hue_interpolation_method - # - css.types.image.gradient.radial-gradient.interpolation_color_space - - css.types.image.gradient.radial-gradient.interpolation_hints - # Conic gradients - - css.types.image.gradient.conic-gradient - - css.types.image.gradient.conic-gradient.doubleposition - # - css.types.image.gradient.conic-gradient.hue_interpolation_method - # - css.types.image.gradient.conic-gradient.interpolation_color_space - # Repeating linear gradients - - css.types.image.gradient.repeating-linear-gradient - - css.types.image.gradient.repeating-linear-gradient.doubleposition - # - css.types.image.gradient.repeating-linear-gradient.hue_interpolation_method - # - css.types.image.gradient.repeating-linear-gradient.interpolation_color_space - - css.types.image.gradient.repeating-linear-gradient.interpolation_hints - - css.types.image.gradient.repeating-linear-gradient.to - - css.types.image.gradient.repeating-linear-gradient.unitless_0_angle - # Repeating radial gradients - - css.types.image.gradient.repeating-radial-gradient - - css.types.image.gradient.repeating-radial-gradient.at - - css.types.image.gradient.repeating-radial-gradient.doubleposition - # - css.types.image.gradient.repeating-radial-gradient.hue_interpolation_method - # - css.types.image.gradient.repeating-radial-gradient.interpolation_color_space - - css.types.image.gradient.repeating-radial-gradient.interpolation_hints - # Repeating conic gradients - - css.types.image.gradient.repeating-conic-gradient - # - css.types.image.gradient.repeating-conic-gradient.hue_interpolation_method - # - css.types.image.gradient.repeating-conic-gradient.interpolation_color_space diff --git a/feature-group-definitions/bigint.yml b/feature-group-definitions/bigint.yml deleted file mode 100644 index 9d6f0ed0c35..00000000000 --- a/feature-group-definitions/bigint.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: BigInt -spec: https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-bigint-objects -caniuse: bigint -snapshot: ecmascript-2020 -status: - baseline: high - baseline_low_date: 2020-09-16 - support: - chrome: "67" - chrome_android: "67" - edge: "79" - firefox: "68" - firefox_android: "68" - safari: "14" - safari_ios: "14" -compat_features: - - javascript.builtins.BigInt - # TODO: use a wildcard for these features, once implemented - - javascript.builtins.BigInt.asIntN - - javascript.builtins.BigInt.asUintN - - javascript.builtins.BigInt.BigInt - - javascript.builtins.BigInt.toLocaleString - - javascript.builtins.BigInt.toString - - javascript.builtins.BigInt.valueOf diff --git a/feature-group-definitions/border-image.yml b/feature-group-definitions/border-image.yml deleted file mode 100644 index d2cdcf83a67..00000000000 --- a/feature-group-definitions/border-image.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Border images -spec: https://drafts.csswg.org/css-backgrounds-3/#border-images -caniuse: border-image -usage_stats: https://chromestatus.com/metrics/css/timeline/popularity/43 -status: - baseline: high - baseline_low_date: 2017-02-01 - support: - chrome: "56" - chrome_android: "56" - edge: "12" - firefox: "50" - firefox_android: "50" - safari: "9.1" - safari_ios: "9.3" -compat_features: - - css.properties.border-image - - css.properties.border-image.fill - - css.properties.border-image.gradient - - css.properties.border-image.optional_border_image_slice - - css.properties.border-image-outset - - css.properties.border-image-repeat - - css.properties.border-image-repeat.round - - css.properties.border-image-repeat.space - - css.properties.border-image-slice - - css.properties.border-image-source - - css.properties.border-image-width diff --git a/feature-group-definitions/broadcast-channel.yml b/feature-group-definitions/broadcast-channel.yml deleted file mode 100644 index eb3111f5372..00000000000 --- a/feature-group-definitions/broadcast-channel.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: BroadcastChannel -spec: https://html.spec.whatwg.org/multipage/web-messaging.html#broadcasting-to-other-browsing-contexts -caniuse: broadcastchannel -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/1447 -status: - baseline: low - baseline_low_date: 2022-03-14 - support: - chrome: "60" - chrome_android: "60" - edge: "79" - firefox: "57" - firefox_android: "57" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - api.BroadcastChannel - - api.BroadcastChannel.BroadcastChannel - - api.BroadcastChannel.close - - api.BroadcastChannel.message_event - - api.BroadcastChannel.messageerror_event - - api.BroadcastChannel.name - - api.BroadcastChannel.postMessage diff --git a/feature-group-definitions/canvas-context-lost.yml b/feature-group-definitions/canvas-context-lost.yml deleted file mode 100644 index b75d5cbcf6f..00000000000 --- a/feature-group-definitions/canvas-context-lost.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: contextlost and contextrestored -spec: https://html.spec.whatwg.org/multipage/webappapis.html#context-lost-steps -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/3974 -status: - baseline: false - support: - chrome: "99" - chrome_android: "99" - edge: "99" -compat_features: - - api.CanvasRenderingContext2D.isContextLost - - api.HTMLCanvasElement.contextlost_event - - api.HTMLCanvasElement.contextrestored_event - - api.OffscreenCanvas.contextlost_event - - api.OffscreenCanvas.contextrestored_event - - api.OffscreenCanvasRenderingContext2D.isContextLost diff --git a/feature-group-definitions/cascade-layers.yml b/feature-group-definitions/cascade-layers.yml deleted file mode 100644 index 397e9b035fc..00000000000 --- a/feature-group-definitions/cascade-layers.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Cascade layers -spec: https://drafts.csswg.org/css-cascade-5/#layering -caniuse: css-cascade-layers -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4007 -status: - baseline: low - baseline_low_date: 2022-03-14 - support: - chrome: "99" - chrome_android: "99" - edge: "99" - firefox: "97" - firefox_android: "97" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - css.at-rules.layer - - css.at-rules.import.layer - - api.CSSImportRule.layerName - - api.CSSLayerBlockRule - - api.CSSLayerBlockRule.name - - api.CSSLayerStatementRule - - api.CSSLayerStatementRule.nameList diff --git a/feature-group-definitions/check-visibility.yml b/feature-group-definitions/check-visibility.yml deleted file mode 100644 index 6c8620a105d..00000000000 --- a/feature-group-definitions/check-visibility.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: checkVisibility() -spec: https://drafts.csswg.org/cssom-view-1/#dom-element-checkvisibility -compat_features: - - api.Element.checkVisibility - - api.Element.checkVisibility.options_checkOpacity_parameter - - api.Element.checkVisibility.options_checkVisibilityCSS_parameter diff --git a/feature-group-definitions/class-syntax.yml b/feature-group-definitions/class-syntax.yml deleted file mode 100644 index 020f12ec3d5..00000000000 --- a/feature-group-definitions/class-syntax.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Classes -caniuse: es6-class -spec: https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-class-definitions -snapshot: ecmascript-2015 -status: - baseline: high - baseline_low_date: 2017-03-27 - support: - chrome: "42" - chrome_android: "42" - edge: "13" - firefox: "45" - firefox_android: "45" - safari: "10.1" - safari_ios: "10.3" -compat_features: - - javascript.classes - - javascript.classes.constructor - - javascript.classes.extends - - javascript.classes.static - - javascript.statements.class diff --git a/feature-group-definitions/color-mix.yml b/feature-group-definitions/color-mix.yml deleted file mode 100644 index f38d7aec9b9..00000000000 --- a/feature-group-definitions/color-mix.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: color-mix() -spec: https://drafts.csswg.org/css-color-5/#color-mix -status: - baseline: low - baseline_low_date: 2023-05-09 - support: - chrome: "111" - chrome_android: "111" - edge: "111" - firefox: "113" - firefox_android: "113" - safari: "16.2" - safari_ios: "16.2" -compat_features: - - css.types.color.color-mix diff --git a/feature-group-definitions/colrv1.yml b/feature-group-definitions/colrv1.yml deleted file mode 100644 index 8da9fd3253b..00000000000 --- a/feature-group-definitions/colrv1.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: COLRv1 -spec: https://learn.microsoft.com/en-us/typography/opentype/otspec191alpha/colr -caniuse: colr-v1 -compat_features: - - css.at-rules.font-face.OpenType_COLRv1 diff --git a/feature-group-definitions/compression-streams.yml b/feature-group-definitions/compression-streams.yml deleted file mode 100644 index 88fb77c7f86..00000000000 --- a/feature-group-definitions/compression-streams.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Compression streams -spec: https://wicg.github.io/compression/ -usage_stats: - - https://chromestatus.com/metrics/feature/timeline/popularity/3060 # CompressionStream - - https://chromestatus.com/metrics/feature/timeline/popularity/3061 # DecompressionStream -compat_features: - - api.CompressionStream - - api.CompressionStream.CompressionStream - - api.CompressionStream.readable - - api.CompressionStream.writable - - api.DecompressionStream - - api.DecompressionStream.DecompressionStream - - api.DecompressionStream.readable - - api.DecompressionStream.writable diff --git a/feature-group-definitions/constraint-validation.yml b/feature-group-definitions/constraint-validation.yml deleted file mode 100644 index 137e8aa2082..00000000000 --- a/feature-group-definitions/constraint-validation.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Constraint validation API -spec: https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-constraint-validation-api -caniuse: constraint-validation -status: - baseline: low - baseline_low_date: 2023-03-27 - support: - chrome: "77" - chrome_android: "77" - edge: "79" - firefox: "98" - firefox_android: "98" - safari: "16.4" - safari_ios: "16.4" -compat_features: - - api.ElementInternals.checkValidity - - api.ElementInternals.reportValidity - - api.ElementInternals.setValidity - - api.ElementInternals.validationMessage - - api.ElementInternals.validity - - api.ElementInternals.willValidate - - api.HTMLButtonElement.checkValidity - - api.HTMLButtonElement.reportValidity - - api.HTMLButtonElement.setCustomValidity - - api.HTMLButtonElement.validationMessage - - api.HTMLButtonElement.validity - - api.HTMLButtonElement.willValidate - - api.HTMLFieldSetElement.checkValidity - - api.HTMLFieldSetElement.reportValidity - - api.HTMLFieldSetElement.setCustomValidity - - api.HTMLFieldSetElement.validationMessage - - api.HTMLFieldSetElement.validity - - api.HTMLFieldSetElement.willValidate - - api.HTMLFormElement.checkValidity - - api.HTMLFormElement.reportValidity - - api.HTMLInputElement.checkValidity - - api.HTMLInputElement.reportValidity - - api.HTMLInputElement.setCustomValidity - - api.HTMLInputElement.validationMessage - - api.HTMLInputElement.validity - - api.HTMLInputElement.willValidate - - api.HTMLObjectElement.checkValidity - - api.HTMLObjectElement.reportValidity - - api.HTMLObjectElement.setCustomValidity - - api.HTMLObjectElement.validationMessage - - api.HTMLObjectElement.validity - - api.HTMLObjectElement.willValidate - - api.HTMLOutputElement.checkValidity - - api.HTMLOutputElement.reportValidity - - api.HTMLOutputElement.setCustomValidity - - api.HTMLOutputElement.validationMessage - - api.HTMLOutputElement.validity - - api.HTMLOutputElement.willValidate - - api.HTMLSelectElement.checkValidity - - api.HTMLSelectElement.reportValidity - - api.HTMLSelectElement.setCustomValidity - - api.HTMLSelectElement.validationMessage - - api.HTMLSelectElement.validity - - api.HTMLSelectElement.willValidate - - api.HTMLTextAreaElement.checkValidity - - api.HTMLTextAreaElement.reportValidity - - api.HTMLTextAreaElement.setCustomValidity - - api.HTMLTextAreaElement.validationMessage - - api.HTMLTextAreaElement.validity - - api.HTMLTextAreaElement.willValidate - - api.ValidityState - - api.ValidityState.badInput - - api.ValidityState.customError - - api.ValidityState.patternMismatch - - api.ValidityState.rangeOverflow - - api.ValidityState.rangeUnderflow - - api.ValidityState.stepMismatch - - api.ValidityState.tooLong - - api.ValidityState.tooShort - - api.ValidityState.typeMismatch - - api.ValidityState.valid - - api.ValidityState.valueMissing diff --git a/feature-group-definitions/container-queries.yml b/feature-group-definitions/container-queries.yml deleted file mode 100644 index 28cb8d62647..00000000000 --- a/feature-group-definitions/container-queries.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Container queries -spec: https://drafts.csswg.org/css-contain-3/#container-queries -caniuse: css-container-queries -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4165 -status: - baseline: low - baseline_low_date: 2023-02-14 - support: - # Chrome 105 is an editorial override. The containerName and containerQuery - # CSSOM properties were shipped in Chrome 111, but aren't needed to use the - # feature in the typical way, with `@container` in CSS. - chrome: "105" - chrome_android: "105" - edge: "105" - firefox: "110" - firefox_android: "110" - # Safari 16 is an editorial override. The containerName and containerQuery - # CSSOM properties were shipped in Safari 17, but aren't needed to use the - # feature in the typical way, with `@container` in CSS. - safari: "16" - safari_ios: "16" -compat_features: - - api.CSSContainerRule - - api.CSSContainerRule.containerName - - api.CSSContainerRule.containerQuery - - css.at-rules.container - - css.properties.contain - - css.properties.contain.inline-size - - css.properties.contain.style - - css.properties.container - - css.properties.container-name - - css.properties.container-type - - css.types.length.container_query_length_units diff --git a/feature-group-definitions/container-style-queries.yml b/feature-group-definitions/container-style-queries.yml deleted file mode 100644 index 4bf52c25f09..00000000000 --- a/feature-group-definitions/container-style-queries.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: Container style queries -spec: https://drafts.csswg.org/css-contain-3/#style-container -caniuse: css-container-queries-style -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4550 -compat_features: - - css.at-rules.container.style_queries_for_custom_properties diff --git a/feature-group-definitions/content-visibility.yml b/feature-group-definitions/content-visibility.yml deleted file mode 100644 index d68fcc2a394..00000000000 --- a/feature-group-definitions/content-visibility.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: content-visibility -spec: https://drafts.csswg.org/css-contain-2/#content-visibility -caniuse: css-content-visibility -status: - baseline: false - support: - chrome: "108" - chrome_android: "108" - edge: "108" -compat_features: - - api.ContentVisibilityAutoStateChangeEvent - - api.ContentVisibilityAutoStateChangeEvent.ContentVisibilityAutoStateChangeEvent - - api.ContentVisibilityAutoStateChangeEvent.skipped - - css.properties.content-visibility diff --git a/feature-group-definitions/custom-elements.yml b/feature-group-definitions/custom-elements.yml deleted file mode 100644 index 168d55733c1..00000000000 --- a/feature-group-definitions/custom-elements.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Custom elements -spec: https://html.spec.whatwg.org/multipage/custom-elements.html -caniuse: custom-elementsv1 -status: - baseline: false - support: - chrome: "73" - chrome_android: "73" - edge: "79" -compat_features: - - api.CustomElementRegistry - - api.CustomElementRegistry.builtin_element_support - - api.CustomElementRegistry.define - - api.Window.customElements - - css.selectors.defined - - css.selectors.host - - css.selectors.host-context - - css.selectors.part diff --git a/feature-group-definitions/custom-properties.yml b/feature-group-definitions/custom-properties.yml deleted file mode 100644 index 7e5784107dc..00000000000 --- a/feature-group-definitions/custom-properties.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Custom properties -spec: https://drafts.csswg.org/css-variables-1/ -caniuse: css-variables -status: - baseline: high - baseline_low_date: 2017-04-05 - support: - chrome: "49" - chrome_android: "49" - edge: "15" - firefox: "31" - firefox_android: "31" - safari: "9.1" - safari_ios: "9.3" -compat_features: - - css.properties.custom-property - - css.properties.custom-property.var diff --git a/feature-group-definitions/default.yml b/feature-group-definitions/default.yml deleted file mode 100644 index 97c34eba409..00000000000 --- a/feature-group-definitions/default.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: ":default" -spec: https://drafts.csswg.org/selectors-4/#the-default-pseudo -caniuse: css-default-pseudo -status: - baseline: high - baseline_low_date: 2020-01-15 - support: - chrome: "10" - chrome_android: "18" - edge: "79" - firefox: "4" - firefox_android: "4" - safari: "5" - safari_ios: "5" -compat_features: - - css.selectors.default diff --git a/feature-group-definitions/details-name.yml b/feature-group-definitions/details-name.yml deleted file mode 100644 index 4a412097dca..00000000000 --- a/feature-group-definitions/details-name.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Mutually exclusive
elements -spec: https://html.spec.whatwg.org/multipage/interactive-elements.html#attr-details-name -compat_features: - - api.HTMLDetailsElement.name - - html.elements.details.name diff --git a/feature-group-definitions/details.yml b/feature-group-definitions/details.yml deleted file mode 100644 index 610b78fc640..00000000000 --- a/feature-group-definitions/details.yml +++ /dev/null @@ -1,8 +0,0 @@ -name:
-spec: https://html.spec.whatwg.org/multipage/interactive-elements.html#the-details-element -compat_features: - - api.HTMLDetailsElement - - api.HTMLDetailsElement.open - - api.HTMLDetailsElement.toggle_event - - html.elements.details - - html.elements.details.open diff --git a/feature-group-definitions/device-posture.yml b/feature-group-definitions/device-posture.yml deleted file mode 100644 index e8062874dc0..00000000000 --- a/feature-group-definitions/device-posture.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Device posture -spec: https://w3c.github.io/device-posture/ -status: - baseline: false - support: {} diff --git a/feature-group-definitions/dialog.yml b/feature-group-definitions/dialog.yml deleted file mode 100644 index d40d3d42d05..00000000000 --- a/feature-group-definitions/dialog.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: "" -spec: https://html.spec.whatwg.org/multipage/interactive-elements.html#the-dialog-element -caniuse: dialog -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/481 -status: - baseline: low - baseline_low_date: 2022-03-14 - support: - chrome: "37" - chrome_android: "37" - edge: "79" - firefox: "98" - firefox_android: "98" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - api.HTMLDialogElement - - api.HTMLDialogElement.cancel_event - - api.HTMLDialogElement.close - - api.HTMLDialogElement.close_event - - api.HTMLDialogElement.open - - api.HTMLDialogElement.returnValue - - api.HTMLDialogElement.show - - api.HTMLDialogElement.showModal - - css.selectors.backdrop.dialog - - html.elements.dialog - - html.elements.dialog.open diff --git a/feature-group-definitions/document-picture-in-picture.yml b/feature-group-definitions/document-picture-in-picture.yml deleted file mode 100644 index 3b85d555eb4..00000000000 --- a/feature-group-definitions/document-picture-in-picture.yml +++ /dev/null @@ -1,3 +0,0 @@ -name: Document picture-in-picture -spec: https://wicg.github.io/document-picture-in-picture/ -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4397 diff --git a/feature-group-definitions/edit-context.yml b/feature-group-definitions/edit-context.yml deleted file mode 100644 index 0d998be8e39..00000000000 --- a/feature-group-definitions/edit-context.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: EditContext -spec: https://w3c.github.io/edit-context/ diff --git a/feature-group-definitions/fetch-priority.yml b/feature-group-definitions/fetch-priority.yml deleted file mode 100644 index 17bb8eae423..00000000000 --- a/feature-group-definitions/fetch-priority.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Fetch priority -spec: - - https://fetch.spec.whatwg.org/#request-priority - - https://html.spec.whatwg.org/multipage/urls-and-fetching.html#fetch-priority-attributes -status: - baseline: false - support: - chrome: "102" - chrome_android: "102" - edge: "102" - safari: "17.2" - safari_ios: "17.2" -compat_features: - - api.fetch.init_priority_parameter - - api.HTMLImageElement.fetchPriority - - api.HTMLLinkElement.fetchPriority - - api.HTMLScriptElement.fetchPriority - - api.Request.Request.init_priority_parameter - - html.elements.img.fetchpriority - - html.elements.link.fetchpriority - - html.elements.script.fetchpriority diff --git a/feature-group-definitions/flexbox-gap.yml b/feature-group-definitions/flexbox-gap.yml deleted file mode 100644 index 6872290603b..00000000000 --- a/feature-group-definitions/flexbox-gap.yml +++ /dev/null @@ -1,3 +0,0 @@ -name: Flexbox gap -spec: https://drafts.csswg.org/css-align-3/#gaps -caniuse: flexbox-gap diff --git a/feature-group-definitions/flexbox.yml b/feature-group-definitions/flexbox.yml deleted file mode 100644 index a700a482ef7..00000000000 --- a/feature-group-definitions/flexbox.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Flexbox -spec: https://drafts.csswg.org/css-flexbox-1/ -caniuse: flexbox -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/1692 -status: - baseline: high - baseline_low_date: 2020-09-22 - support: - chrome: "59" - chrome_android: "59" - edge: "79" - firefox: "81" - firefox_android: "81" - safari: "11" - safari_ios: "11" -compat_features: - - css.properties.align-content.flex_context - # - css.properties.align-content.flex_context.center - # - css.properties.align-content.flex_context.flex-end - # - css.properties.align-content.flex_context.flex-start - # - css.properties.align-content.flex_context.space-around - # - css.properties.align-content.flex_context.space-between - - css.properties.align-content.flex_context.stretch - - css.properties.align-items.flex_context - - css.properties.align-items.flex_context.baseline - # - css.properties.align-items.flex_context.center - # - css.properties.align-items.flex_context.flex-end - # - css.properties.align-items.flex_context.flex-start - # - css.properties.align-items.flex_context.stretch - - css.properties.align-self.flex_context - # - css.properties.align-self.flex_context.auto - - css.properties.align-self.flex_context.baseline - # - css.properties.align-self.flex_context.center - # - css.properties.align-self.flex_context.flex-end - # - css.properties.align-self.flex_context.flex-start - - css.properties.align-self.flex_context.stretch - - css.properties.display.flex - - css.properties.display.inline-flex - - css.properties.flex - - css.properties.flex-basis - - css.properties.flex-basis.auto - # - css.properties.flex-basis.max-content - # - css.properties.flex-basis.min-content - - css.properties.flex-direction - # - css.properties.flex-direction.column - # - css.properties.flex-direction.column-reverse - # - css.properties.flex-direction.row - # - css.properties.flex-direction.row-reverse - - css.properties.flex-flow - - css.properties.flex-grow - - css.properties.flex-shrink - - css.properties.flex-wrap - # - css.properties.flex-wrap.nowrap - # - css.properties.flex-wrap.wrap - # - css.properties.flex-wrap.wrap-reverse - - css.properties.justify-content.flex_context - # - css.properties.justify-content.flex_context.center - # - css.properties.justify-content.flex_context.flex-end - # - css.properties.justify-content.flex_context.flex-start - # - css.properties.justify-content.flex_context.space-around - # - css.properties.justify-content.flex_context.space-between - - css.properties.justify-content.flex_context.stretch - - css.properties.justify-items.flex_context - - css.properties.justify-self.flex_context - - css.properties.order - - css.properties.place-content.flex_context - - css.properties.place-items.flex_context - - css.properties.place-self.flex_context diff --git a/feature-group-definitions/focus-visible.yml b/feature-group-definitions/focus-visible.yml deleted file mode 100644 index ef2d916c77f..00000000000 --- a/feature-group-definitions/focus-visible.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: ":focus-visible" -spec: https://drafts.csswg.org/selectors-4/#the-focus-visible-pseudo -caniuse: css-focus-visible -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/2388 -status: - baseline: low - baseline_low_date: 2022-03-14 - support: - chrome: "86" - chrome_android: "86" - edge: "86" - firefox: "85" - firefox_android: "85" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - css.selectors.focus-visible diff --git a/feature-group-definitions/font-palette-animation.yml b/feature-group-definitions/font-palette-animation.yml deleted file mode 100644 index dc40b8e924c..00000000000 --- a/feature-group-definitions/font-palette-animation.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: font-palette animation -spec: https://drafts.csswg.org/css-fonts-4/#font-palette-prop -usage_stats: https://chromestatus.com/metrics/css/timeline/animated/709 -compat_features: - - css.properties.font-palette.palette-mix_function diff --git a/feature-group-definitions/font-palette.yml b/feature-group-definitions/font-palette.yml deleted file mode 100644 index 9439113d449..00000000000 --- a/feature-group-definitions/font-palette.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: font-palette and @font-palette-values -spec: - - https://drafts.csswg.org/css-fonts-4/#font-palette-prop - - https://drafts.csswg.org/css-fonts-4/#font-palette-values -usage_stats: https://chromestatus.com/metrics/css/timeline/popularity/709 -compat_features: - - api.CSSFontPaletteValuesRule - - api.CSSFontPaletteValuesRule.basePalette - - api.CSSFontPaletteValuesRule.fontFamily - - api.CSSFontPaletteValuesRule.name - - api.CSSFontPaletteValuesRule.overrideColors - - css.at-rules.font-palette-values - - css.at-rules.font-palette-values.base-palette - - css.at-rules.font-palette-values.font-family - - css.at-rules.font-palette-values.override-colors - - css.properties.font-palette diff --git a/feature-group-definitions/font-variant-alternates.yml b/feature-group-definitions/font-variant-alternates.yml deleted file mode 100644 index f857be59f9e..00000000000 --- a/feature-group-definitions/font-variant-alternates.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: font-variant-alternates -spec: https://drafts.csswg.org/css-fonts-4/#font-variant-alternates-prop -caniuse: font-variant-alternates -usage_stats: https://chromestatus.com/metrics/css/timeline/popularity/738 -status: - baseline: low - baseline_low_date: 2023-03-13 - support: - chrome: "111" - chrome_android: "111" - edge: "111" - firefox: "34" - firefox_android: "34" - safari: "16.2" - safari_ios: "16.2" -compat_features: - - css.properties.font-variant-alternates - - css.properties.font-variant-alternates.annotation - - css.properties.font-variant-alternates.character_variant - - css.properties.font-variant-alternates.ornaments - - css.properties.font-variant-alternates.styleset - - css.properties.font-variant-alternates.stylistic - - css.properties.font-variant-alternates.swash diff --git a/feature-group-definitions/fonts.yml b/feature-group-definitions/fonts.yml deleted file mode 100644 index 16ff4fe39a2..00000000000 --- a/feature-group-definitions/fonts.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: "@font-face" -spec: https://drafts.csswg.org/css-fonts-5/ -caniuse: fontface -status: - baseline: high - baseline_low_date: 2016-09-20 - support: - chrome: "36" - chrome_android: "36" - edge: "14" - firefox: "39" - firefox_android: "39" - safari: "10" - safari_ios: "10" -compat_features: - - css.at-rules.font-face - - css.at-rules.font-face.font-family - - css.at-rules.font-face.src - - css.at-rules.font-face.WOFF - - css.at-rules.font-face.WOFF_2 diff --git a/feature-group-definitions/fullscreen.yml b/feature-group-definitions/fullscreen.yml deleted file mode 100644 index c4934d07b91..00000000000 --- a/feature-group-definitions/fullscreen.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Fullscreen API -spec: https://fullscreen.spec.whatwg.org/ -caniuse: fullscreen -compat_features: - - api.Document.exitFullscreen - - api.Document.exitFullscreen.returns_promise - - api.Document.fullscreen - - api.Document.fullscreenchange_event - - api.Document.fullscreenElement - - api.Document.fullscreenEnabled - - api.Document.fullscreenerror_event - - api.Element.fullscreenchange_event - - api.Element.fullscreenerror_event - - api.Element.requestFullscreen - - api.Element.requestFullscreen.returns_promise - - api.HTMLIFrameElement.allowFullscreen - - api.ShadowRoot.fullscreenElement - - css.selectors.backdrop.fullscreen - - css.selectors.fullscreen - - css.selectors.fullscreen.all_elements - - html.elements.iframe.allowfullscreen diff --git a/feature-group-definitions/grid-animation.yml b/feature-group-definitions/grid-animation.yml deleted file mode 100644 index f73d42722cd..00000000000 --- a/feature-group-definitions/grid-animation.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Grid animation -spec: https://drafts.csswg.org/css-grid-2/#track-sizing -status: - baseline: low - baseline_low_date: 2022-10-27 - support: - chrome: "107" - chrome_android: "107" - edge: "107" - firefox: "66" - firefox_android: "66" - safari: "16" - safari_ios: "16" -compat_features: - - css.properties.grid-template-columns.animation - - css.properties.grid-template-rows.animation diff --git a/feature-group-definitions/grid.yml b/feature-group-definitions/grid.yml deleted file mode 100644 index 025b9616ba7..00000000000 --- a/feature-group-definitions/grid.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Grid -spec: https://drafts.csswg.org/css-grid-3/ -caniuse: css-grid -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/1693 -status: - baseline: high - baseline_low_date: 2020-07-28 - support: - chrome: "66" - chrome_android: "66" - edge: "79" - firefox: "76" - firefox_android: "79" - safari: "12.1" - safari_ios: "12.2" -compat_features: - - css.properties.align-content.grid_context - - css.properties.align-items.grid_context - - css.properties.align-items.grid_context.start_end - - css.properties.align-self.grid_context - - css.properties.column-gap.grid_context - - css.properties.display.grid - - css.properties.display.inline-grid - - css.properties.gap.grid_context - - css.properties.gap.grid_context.calc_values - - css.properties.gap.grid_context.percentage_values - - css.properties.grid - - css.properties.grid-area - - css.properties.grid-auto-columns - - css.properties.grid-auto-flow - - css.properties.grid-auto-rows - - css.properties.grid-column - - css.properties.grid-column-end - - css.properties.grid-column-start - - css.properties.grid-row - - css.properties.grid-row-end - - css.properties.grid-row-start - - css.properties.grid-template - - css.properties.grid-template-areas - - css.properties.grid-template-columns - - css.properties.grid-template-columns.fit-content - - css.properties.grid-template-columns.minmax - - css.properties.grid-template-columns.repeat - - css.properties.grid-template-rows - - css.properties.grid-template-rows.fit-content - - css.properties.grid-template-rows.minmax - - css.properties.grid-template-rows.repeat - - css.properties.justify-content.grid_context - - css.properties.justify-items.grid_context - - css.properties.justify-self.grid_context - - css.properties.place-content.grid_context - - css.properties.place-items.grid_context - - css.properties.place-self.grid_context - - css.properties.row-gap.grid_context - - css.types.flex diff --git a/feature-group-definitions/has.yml b/feature-group-definitions/has.yml deleted file mode 100644 index 2ccc34e339c..00000000000 --- a/feature-group-definitions/has.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: ":has()" -spec: https://drafts.csswg.org/selectors-4/#relational -caniuse: css-has -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4743 -status: - baseline: low - baseline_low_date: 2023-12-19 - support: - chrome: "105" - chrome_android: "105" - edge: "105" - firefox: "121" - firefox_android: "121" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - css.selectors.has diff --git a/feature-group-definitions/html-media-capture.yml b/feature-group-definitions/html-media-capture.yml deleted file mode 100644 index a4c0f1dd7ea..00000000000 --- a/feature-group-definitions/html-media-capture.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: HTML media capture -spec: https://w3c.github.io/html-media-capture/ -caniuse: html-media-capture -compat_features: - - api.HTMLInputElement.capture - - html.elements.input.capture diff --git a/feature-group-definitions/idle-detection.yml b/feature-group-definitions/idle-detection.yml deleted file mode 100644 index 004909e7ede..00000000000 --- a/feature-group-definitions/idle-detection.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Idle detection -spec: https://wicg.github.io/idle-detection/ -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/2834 -status: - baseline: false - support: - chrome: "94" - chrome_android: "94" - edge: "94" -compat_features: - - api.IdleDetector - - api.IdleDetector.IdleDetector - - api.IdleDetector.change_event - - api.IdleDetector.requestPermission_static - - api.IdleDetector.screenState - - api.IdleDetector.start - - api.IdleDetector.userState - - http.headers.Permissions-Policy.idle-detection diff --git a/feature-group-definitions/image-set.yml b/feature-group-definitions/image-set.yml deleted file mode 100644 index 856dfb1a727..00000000000 --- a/feature-group-definitions/image-set.yml +++ /dev/null @@ -1,3 +0,0 @@ -name: image-set() -spec: https://drafts.csswg.org/css-images-4/#image-set-notation -caniuse: css-image-set diff --git a/feature-group-definitions/import-maps.yml b/feature-group-definitions/import-maps.yml deleted file mode 100644 index 10dd163f31b..00000000000 --- a/feature-group-definitions/import-maps.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Import maps -spec: https://html.spec.whatwg.org/multipage/webappapis.html#import-maps -caniuse: import-maps -status: - baseline: low - baseline_low_date: 2023-03-27 - support: - chrome: "89" - chrome_android: "89" - edge: "89" - firefox: "108" - firefox_android: "108" - safari: "16.4" - safari_ios: "16.4" -compat_features: - - html.elements.script.type.importmap diff --git a/feature-group-definitions/indeterminate.yml b/feature-group-definitions/indeterminate.yml deleted file mode 100644 index b699628410c..00000000000 --- a/feature-group-definitions/indeterminate.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: ":indeterminate()" -spec: - - https://drafts.csswg.org/selectors-4/#indeterminate - - https://html.spec.whatwg.org/multipage/semantics-other.html#selector-indeterminate -caniuse: css-indeterminate-pseudo -status: - baseline: high - baseline_low_date: 2020-01-15 - support: - chrome: "39" - chrome_android: "39" - edge: "79" - firefox: "51" - firefox_android: "51" - safari: "10" - safari_ios: "10" -compat_features: - - css.selectors.indeterminate - - css.selectors.indeterminate.checkbox - - css.selectors.indeterminate.progress - - css.selectors.indeterminate.radio diff --git a/feature-group-definitions/individual-transforms.yml b/feature-group-definitions/individual-transforms.yml deleted file mode 100644 index 3cf79fccacb..00000000000 --- a/feature-group-definitions/individual-transforms.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: Individual transform properties -description: Transform elements with separate `translate`, `rotate`, and `scale` CSS properties. -spec: https://drafts.csswg.org/css-transforms-2/#individual-transforms -usage_stats: - - https://chromestatus.com/metrics/css/timeline/popularity/504 # translate - - https://chromestatus.com/metrics/css/timeline/popularity/505 # rotate - - https://chromestatus.com/metrics/css/timeline/popularity/506 # scale -compat_features: - - css.properties.rotate - - css.properties.scale - - css.properties.translate diff --git a/feature-group-definitions/input-event.yml b/feature-group-definitions/input-event.yml deleted file mode 100644 index b2f27a14e82..00000000000 --- a/feature-group-definitions/input-event.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: input event -description: The `input` event fires when a form control changes or an element with the `contenteditable` attribute changes. -spec: https://w3c.github.io/uievents/#event-type-input -caniuse: input-event -status: - baseline: low - baseline_low_date: 2023-03-27 - support: - chrome: "60" - chrome_android: "60" - edge: "79" - firefox: "87" - firefox_android: "87" - safari: "16.4" - safari_ios: "16.4" -compat_features: - - api.Element.input_event - - api.InputEvent - - api.InputEvent.InputEvent - - api.InputEvent.data - - api.InputEvent.dataTransfer - - api.InputEvent.getTargetRanges - - api.InputEvent.inputType - - api.InputEvent.isComposing diff --git a/feature-group-definitions/is.yml b/feature-group-definitions/is.yml deleted file mode 100644 index 0954e77cc21..00000000000 --- a/feature-group-definitions/is.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: ":is()" -spec: https://drafts.csswg.org/selectors-4/#matches -caniuse: css-matches-pseudo -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/2322 -status: - baseline: high - baseline_low_date: 2021-01-21 - support: - chrome: "88" - chrome_android: "88" - edge: "88" - firefox: "82" - firefox_android: "82" - safari: "14" - safari_ios: "14" -compat_features: - - css.selectors.is - - css.selectors.is.forgiving_selector_list diff --git a/feature-group-definitions/jpegxl.yml b/feature-group-definitions/jpegxl.yml deleted file mode 100644 index 9e26429d460..00000000000 --- a/feature-group-definitions/jpegxl.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: JPEG XL -spec: https://www.iso.org/standard/85253.html -caniuse: jpegxl -status: - baseline: false - support: - safari: "17" - safari_ios: "17" diff --git a/feature-group-definitions/line-clamp.yml b/feature-group-definitions/line-clamp.yml deleted file mode 100644 index 72c30681ff3..00000000000 --- a/feature-group-definitions/line-clamp.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: line-clamp -spec: https://drafts.csswg.org/css-overflow-3/#line-clamp -caniuse: css-line-clamp -compat_features: - # This is a weird one! Specified with a prefix: - # https://drafts.csswg.org/css-overflow-4/#propdef--webkit-line-clamp - - css.properties.-webkit-line-clamp - # This doesn't exist yet, but might in the future: - # - css.properties.line-clamp diff --git a/feature-group-definitions/masonry.yml b/feature-group-definitions/masonry.yml deleted file mode 100644 index d4b618d7c84..00000000000 --- a/feature-group-definitions/masonry.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: Masonry -spec: https://drafts.csswg.org/css-grid-3/ -status: - baseline: false - support: {} -compat_features: - - css.properties.align-tracks - - css.properties.grid-template-columns.masonry - - css.properties.grid-template-rows.masonry - - css.properties.justify-tracks - - css.properties.masonry-auto-flow diff --git a/feature-group-definitions/media-query-range-syntax.yml b/feature-group-definitions/media-query-range-syntax.yml deleted file mode 100644 index d04eaa7ba53..00000000000 --- a/feature-group-definitions/media-query-range-syntax.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Media query range syntax -caniuse: css-media-range-syntax -spec: https://drafts.csswg.org/mediaqueries-4/#mq-range-context -status: - baseline: low - baseline_low_date: 2023-03-27 - support: - chrome: "104" - chrome_android: "104" - edge: "104" - firefox: "102" - firefox_android: "102" - safari: "16.4" - safari_ios: "16.4" -compat_features: - - css.at-rules.media.range_syntax diff --git a/feature-group-definitions/modulepreload.yml b/feature-group-definitions/modulepreload.yml deleted file mode 100644 index 0a429cd5bce..00000000000 --- a/feature-group-definitions/modulepreload.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: '' -spec: https://html.spec.whatwg.org/multipage/links.html#link-type-modulepreload -caniuse: link-rel-modulepreload -compat_features: - - html.elements.link.modulepreload diff --git a/feature-group-definitions/motion-path.yml b/feature-group-definitions/motion-path.yml deleted file mode 100644 index 8e6afb0c412..00000000000 --- a/feature-group-definitions/motion-path.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Motion path -spec: https://drafts.fxtf.org/motion-1/ -caniuse: css-motion-paths -status: - baseline: low - baseline_low_date: 2023-08-21 - support: - chrome: "116" - chrome_android: "116" - edge: "116" - firefox: "72" - firefox_android: "79" - safari: "16" - safari_ios: "16" -compat_features: - - css.properties.offset-anchor - - css.properties.offset-distance - - css.properties.offset-path - - css.properties.offset-path.path - - css.properties.offset-rotate - - css.properties.offset diff --git a/feature-group-definitions/navigation.yml b/feature-group-definitions/navigation.yml deleted file mode 100644 index 095afbfa1d4..00000000000 --- a/feature-group-definitions/navigation.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Navigation API -spec: https://html.spec.whatwg.org/multipage/nav-history-apis.html#navigation-api diff --git a/feature-group-definitions/nesting.yml b/feature-group-definitions/nesting.yml deleted file mode 100644 index dd3b47cfad4..00000000000 --- a/feature-group-definitions/nesting.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Nesting -spec: https://drafts.csswg.org/css-nesting-1/ -caniuse: css-nesting -status: - baseline: low - baseline_low_date: 2023-12-11 - support: - chrome: "120" - chrome_android: "120" - edge: "120" - firefox: "117" - firefox_android: "117" - safari: "17.2" - safari_ios: "17.2" -compat_features: - - css.selectors.nesting - - api.CSSStyleRule.cssRules - - api.CSSStyleRule.deleteRule - - api.CSSStyleRule.insertRule diff --git a/feature-group-definitions/overflow-shorthand.yml b/feature-group-definitions/overflow-shorthand.yml deleted file mode 100644 index febb27fd6a3..00000000000 --- a/feature-group-definitions/overflow-shorthand.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: overflow -spec: https://drafts.csswg.org/css-overflow-3/#propdef-overflow -caniuse: css-overflow -status: - baseline: low - baseline_low_date: 2022-09-12 - support: - chrome: "90" - chrome_android: "90" - edge: "90" - firefox: "81" - firefox_android: "81" - safari: "16" - safari_ios: "16" -compat_features: - - css.properties.overflow-x - - css.properties.overflow-x.clip - - css.properties.overflow-y - - css.properties.overflow-y.clip - - css.properties.overflow - - css.properties.overflow.clip - - css.properties.overflow.multiple_keywords - # BCD appears to represent `` values as both - # 1) keyword subfeatures on properties (above) and - # 2) a type (below) - - css.types.overflow - - css.types.overflow.clip diff --git a/feature-group-definitions/picture-in-picture.yml b/feature-group-definitions/picture-in-picture.yml deleted file mode 100644 index 725dc4dcb09..00000000000 --- a/feature-group-definitions/picture-in-picture.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Picture-in-picture -spec: https://w3c.github.io/picture-in-picture/ -caniuse: picture-in-picture -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/2444 -compat_features: - - api.Document.exitPictureInPicture - - api.Document.pictureInPictureElement - - api.Document.pictureInPictureEnabled - - api.HTMLVideoElement.disablePictureInPicture - - api.HTMLVideoElement.enterpictureinpicture_event - - api.HTMLVideoElement.leavepictureinpicture_event - - api.HTMLVideoElement.requestPictureInPicture - - api.PictureInPictureEvent - - api.PictureInPictureEvent.PictureInPictureEvent - - api.PictureInPictureEvent.pictureInPictureWindow - - api.PictureInPictureWindow - - api.PictureInPictureWindow.height - - api.PictureInPictureWindow.resize_event - - api.PictureInPictureWindow.width - - api.ShadowRoot.pictureInPictureElement - - css.selectors.picture-in-picture - - http.headers.Permissions-Policy.picture-in-picture diff --git a/feature-group-definitions/pointer-lock.yml b/feature-group-definitions/pointer-lock.yml deleted file mode 100644 index 0b92a28ae8e..00000000000 --- a/feature-group-definitions/pointer-lock.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Pointer lock -description: Provides access to raw mouse movement by locking the target of mouse events to a single element and hiding the mouse cursor. -spec: https://w3c.github.io/pointerlock/ -caniuse: pointerlock -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/417 -compat_features: - - api.Document.exitPointerLock - - api.Document.pointerlockchange_event - - api.Document.pointerLockElement - - api.Document.pointerlockerror_event - - api.Element.requestPointerLock - - api.MouseEvent.movementX - - api.MouseEvent.movementY - - api.ShadowRoot.pointerLockElement - - html.elements.iframe.sandbox.allow-pointer-lock diff --git a/feature-group-definitions/popover.yml b/feature-group-definitions/popover.yml deleted file mode 100644 index 5fd27102343..00000000000 --- a/feature-group-definitions/popover.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Popover -spec: https://html.spec.whatwg.org/multipage/popover.html -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4191 -status: - baseline: false - support: - chrome: "114" - chrome_android: "114" - edge: "114" - safari: "17" - safari_ios: "17" -compat_features: - - api.HTMLButtonElement.popoverTargetAction - - api.HTMLButtonElement.popoverTargetElement - - api.HTMLElement.beforetoggle_event - - api.HTMLElement.hidePopover - - api.HTMLElement.popover - - api.HTMLElement.showPopover - - api.HTMLElement.toggle_event - - api.HTMLElement.togglePopover - - api.HTMLInputElement.popoverTargetAction - - api.HTMLInputElement.popoverTargetElement - - api.ToggleEvent - - api.ToggleEvent.ToggleEvent - - api.ToggleEvent.newState - - api.ToggleEvent.oldState - - css.selectors.backdrop.popover - - css.selectors.popover-open - - html.global_attributes.popover - - html.elements.button.popovertarget - - html.elements.button.popovertargetaction - - html.elements.input.popovertarget - - html.elements.input.popovertargetaction diff --git a/feature-group-definitions/read-write-pseudo-classes.yml b/feature-group-definitions/read-write-pseudo-classes.yml deleted file mode 100644 index aec80ecc1b2..00000000000 --- a/feature-group-definitions/read-write-pseudo-classes.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: ":read and :write" -spec: - - https://html.spec.whatwg.org/multipage/semantics-other.html#selector-read-only - - https://drafts.csswg.org/selectors-4/#rw-pseudos -caniuse: css-read-only-write -status: - baseline: high - baseline_low_date: 2020-07-28 - support: - chrome: "1" - chrome_android: "18" - edge: "13" - firefox: "78" - firefox_android: "79" - safari: "4" - safari_ios: "3.2" -compat_features: - - css.selectors.read-only - - css.selectors.read-write diff --git a/feature-group-definitions/registered-custom-properties.yml b/feature-group-definitions/registered-custom-properties.yml deleted file mode 100644 index d3c8f95af1d..00000000000 --- a/feature-group-definitions/registered-custom-properties.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Registered custom properties -spec: https://drafts.css-houdini.org/css-properties-values-api-1/ -status: - baseline: false - support: - chrome: "85" - chrome_android: "85" - edge: "85" - safari: "16.4" - safari_ios: "16.4" -compat_features: - - api.CSS.registerProperty_static - - api.CSSPropertyRule - - api.CSSPropertyRule.inherits - - api.CSSPropertyRule.initialValue - - api.CSSPropertyRule.name - - api.CSSPropertyRule.syntax - - css.at-rules.property - - css.at-rules.property.inherits - - css.at-rules.property.initial-value - - css.at-rules.property.syntax diff --git a/feature-group-definitions/sanitizer.yml b/feature-group-definitions/sanitizer.yml deleted file mode 100644 index 79caab74bb6..00000000000 --- a/feature-group-definitions/sanitizer.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: Sanitizer -spec: https://wicg.github.io/sanitizer-api/ diff --git a/feature-group-definitions/scheduler.yml b/feature-group-definitions/scheduler.yml deleted file mode 100644 index 85196103e60..00000000000 --- a/feature-group-definitions/scheduler.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Scheduler API -spec: https://wicg.github.io/scheduling-apis/ -status: - baseline: false - support: - chrome: "94" - chrome_android: "94" - edge: "94" -compat_features: - - api.Scheduler - - api.Scheduler.postTask - - api.TaskController - - api.TaskController.setPriority - - api.TaskController.TaskController - - api.TaskPriorityChangeEvent - - api.TaskPriorityChangeEvent.previousPriority - - api.TaskPriorityChangeEvent.TaskPriorityChangeEvent - - api.TaskSignal - - api.TaskSignal.priority - - api.scheduler diff --git a/feature-group-definitions/scope.yml b/feature-group-definitions/scope.yml deleted file mode 100644 index 08c26913749..00000000000 --- a/feature-group-definitions/scope.yml +++ /dev/null @@ -1,2 +0,0 @@ -name: "@scope" -spec: https://drafts.csswg.org/css-cascade-6/#scope-atrule diff --git a/feature-group-definitions/scroll-driven-animations.yml b/feature-group-definitions/scroll-driven-animations.yml deleted file mode 100644 index 1d5cd7c19b1..00000000000 --- a/feature-group-definitions/scroll-driven-animations.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Scroll-driven animations -spec: https://drafts.csswg.org/scroll-animations-1/ -compat_features: - - api.ScrollTimeline - - api.ScrollTimeline.axis - - api.ScrollTimeline.ScrollTimeline - - api.ScrollTimeline.source - - api.ViewTimeline - - api.ViewTimeline.endOffset - - api.ViewTimeline.startOffset - - api.ViewTimeline.subject - - api.ViewTimeline.ViewTimeline - - css.properties.animation-range - - css.properties.animation-range-end - - css.properties.animation-range-start - - css.properties.animation-timeline - - css.properties.animation-timeline.scroll - - css.properties.animation-timeline.view - - css.properties.animation.animation-timeline_included - - css.properties.scroll-timeline - - css.properties.scroll-timeline-axis - - css.properties.scroll-timeline-name - - css.properties.timeline-scope - - css.properties.view-timeline - - css.properties.view-timeline-axis - - css.properties.view-timeline-inset - - css.properties.view-timeline-name diff --git a/feature-group-definitions/scrollintoview.yml b/feature-group-definitions/scrollintoview.yml deleted file mode 100644 index 597698ca304..00000000000 --- a/feature-group-definitions/scrollintoview.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: scrollIntoView() -spec: https://drafts.csswg.org/cssom-view-1/#dom-element-scrollintoview -caniuse: scrollintoview -status: - baseline: high - baseline_low_date: 2020-09-16 - support: - chrome: "61" - chrome_android: "61" - edge: "79" - firefox: "36" - firefox_android: "36" - safari: "14" - safari_ios: "14" -compat_features: - - api.Element.scrollIntoView - - api.Element.scrollIntoView.options_parameter diff --git a/feature-group-definitions/search-input-type.yml b/feature-group-definitions/search-input-type.yml deleted file mode 100644 index 95414a4e24d..00000000000 --- a/feature-group-definitions/search-input-type.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: '' -spec: https://html.spec.whatwg.org/multipage/input.html#text-(type=text)-state-and-search-state-(type=search) -caniuse: input-search -compat_features: - - html.elements.input.type_search diff --git a/feature-group-definitions/search.yml b/feature-group-definitions/search.yml deleted file mode 100644 index 83d052d48c9..00000000000 --- a/feature-group-definitions/search.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: -spec: https://html.spec.whatwg.org/multipage/grouping-content.html#the-search-element -compat_features: - - html.elements.search diff --git a/feature-group-definitions/server-timing.yml b/feature-group-definitions/server-timing.yml deleted file mode 100644 index e400dbdbac8..00000000000 --- a/feature-group-definitions/server-timing.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Server timing -spec: https://w3c.github.io/server-timing/ -caniuse: server-timing -status: - baseline: low - baseline_low_date: 2023-03-27 - support: - chrome: "65" - chrome_android: "65" - edge: "79" - firefox: "61" - firefox_android: "61" - safari: "16.4" - safari_ios: "16.4" diff --git a/feature-group-definitions/set-methods.yml b/feature-group-definitions/set-methods.yml deleted file mode 100644 index 94ff8131d47..00000000000 --- a/feature-group-definitions/set-methods.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Set methods -spec: https://tc39.es/proposal-set-methods/ -status: - baseline: false - support: - safari: "17" - safari_ios: "17" -compat_features: - - javascript.builtins.Set.difference - - javascript.builtins.Set.intersection - - javascript.builtins.Set.isDisjointFrom - - javascript.builtins.Set.isSubsetOf - - javascript.builtins.Set.isSupersetOf - - javascript.builtins.Set.symmetricDifference - - javascript.builtins.Set.union diff --git a/feature-group-definitions/shadow-dom.yml b/feature-group-definitions/shadow-dom.yml deleted file mode 100644 index aa2dcc84683..00000000000 --- a/feature-group-definitions/shadow-dom.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Shadow DOM -spec: https://dom.spec.whatwg.org/#shadow-trees -caniuse: shadowdomv1 -status: - baseline: high - baseline_low_date: 2020-01-15 - support: - chrome: "54" - chrome_android: "54" - edge: "79" - firefox: "63" - firefox_android: "63" - safari: "10.1" - safari_ios: "10.3" -compat_features: - - api.Element.attachShadow - - api.Element.shadowRoot - - api.Event.composed - - api.Event.composedPath - - api.HTMLSlotElement - - api.HTMLSlotElement.slotchange_event - - api.Node.getRootNode - - api.Node.isConnected - - api.ShadowRoot - - api.ShadowRoot.host - - api.ShadowRoot.mode - - html.elements.slot diff --git a/feature-group-definitions/slot.yml b/feature-group-definitions/slot.yml deleted file mode 100644 index 980c8936855..00000000000 --- a/feature-group-definitions/slot.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: -spec: https://html.spec.whatwg.org/multipage/scripting.html#the-slot-element -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/1898 -compat_features: - - api.Element.assignedSlot - - api.Element.slot - - api.HTMLSlotElement - - api.HTMLSlotElement.assign - - api.HTMLSlotElement.assignedElements - - api.HTMLSlotElement.assignedNodes - - api.HTMLSlotElement.name - - api.HTMLSlotElement.slotchange_event - - api.ShadowRoot.slotAssignment - - api.Text.assignedSlot - - css.selectors.slotted - - html.elements.slot - - html.elements.slot.name - - html.global_attributes.slot diff --git a/feature-group-definitions/speech-recognition.yml b/feature-group-definitions/speech-recognition.yml deleted file mode 100644 index 8de76f0ffed..00000000000 --- a/feature-group-definitions/speech-recognition.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: Speech recognition -spec: https://wicg.github.io/speech-api/#speechreco-section -caniuse: speech-recognition -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/2014 diff --git a/feature-group-definitions/speech-synthesis.yml b/feature-group-definitions/speech-synthesis.yml deleted file mode 100644 index c635c7914c6..00000000000 --- a/feature-group-definitions/speech-synthesis.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: Speech synthesis -spec: https://wicg.github.io/speech-api/#tts-section -caniuse: speech-synthesis -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/2483 diff --git a/feature-group-definitions/starting-style.yml b/feature-group-definitions/starting-style.yml deleted file mode 100644 index 7197bba7692..00000000000 --- a/feature-group-definitions/starting-style.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: "@starting-style" -spec: https://drafts.csswg.org/css-transitions-2/#defining-before-change-style -compat_features: - - api.CSSStartingStyleRule - - css.at-rules.starting-style diff --git a/feature-group-definitions/sticky-positioning.yml b/feature-group-definitions/sticky-positioning.yml deleted file mode 100644 index ae0d4eae080..00000000000 --- a/feature-group-definitions/sticky-positioning.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Sticky positioning -spec: https://drafts.csswg.org/css-position-3/#stickypos-insets -caniuse: css-sticky -status: - baseline: high - baseline_low_date: 2019-09-19 - support: - chrome: "56" - chrome_android: "56" - edge: "16" - firefox: "59" - firefox_android: "59" - safari: "13" - safari_ios: "13" -compat_features: - - css.properties.position.position_sticky_table_elements - - css.properties.position.sticky diff --git a/feature-group-definitions/storage-buckets.yml b/feature-group-definitions/storage-buckets.yml deleted file mode 100644 index d1e5700b897..00000000000 --- a/feature-group-definitions/storage-buckets.yml +++ /dev/null @@ -1,8 +0,0 @@ -name: Storage buckets -spec: https://wicg.github.io/storage-buckets/ -status: - baseline: false - support: - chrome: "122" - chrome_android: "122" - edge: "122" diff --git a/feature-group-definitions/structured-clone.yml b/feature-group-definitions/structured-clone.yml deleted file mode 100644 index 5c0317b70f7..00000000000 --- a/feature-group-definitions/structured-clone.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: structuredClone() -spec: https://html.spec.whatwg.org/multipage/structured-data.html#structured-cloning -status: - baseline: low - baseline_low_date: 2022-03-14 - support: - chrome: "98" - chrome_android: "98" - edge: "98" - firefox: "94" - firefox_android: "94" - safari: "15.4" - safari_ios: "15.4" -compat_features: - - api.structuredClone diff --git a/feature-group-definitions/subgrid.yml b/feature-group-definitions/subgrid.yml deleted file mode 100644 index f4c4a902a0f..00000000000 --- a/feature-group-definitions/subgrid.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Subgrid -spec: https://drafts.csswg.org/css-grid-2/#subgrids -caniuse: css-subgrid -usage_stats: https://chromestatus.com/metrics/feature/timeline/popularity/4680 -status: - baseline: low - baseline_low_date: 2023-09-15 - support: - chrome: "117" - chrome_android: "117" - edge: "117" - firefox: "71" - firefox_android: "79" - safari: "16" - safari_ios: "16" -compat_features: - - css.properties.grid-template-columns.subgrid - - css.properties.grid-template-rows.subgrid diff --git a/feature-group-definitions/svg2-script-html-equivalence.yml b/feature-group-definitions/svg2-script-html-equivalence.yml deleted file mode 100644 index 4a67740d238..00000000000 --- a/feature-group-definitions/svg2-script-html-equivalence.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: SVG +

+ This page uses data from + web-features to + determine which browser versions support all of the features in the selected + Baseline target. +

+
+ + + + +
+ +
+ +
+

Core browser set

+
+
+ +
+

Downstream browsers

+

+ These browsers are not part of the main Baseline definition, + but are based on the engine from one of the core browsers listed above. This + information is provided on a best-effort basis, and you should always test + in these browsers if they make up a significant portion of your user base. + To learn more about how these version mappings were calculated, see + baseline-browser-mapping. +

+
+
diff --git a/gh-pages/src/use-baseline.md b/gh-pages/src/use-baseline.md new file mode 100644 index 00000000000..c35cf7cd0dc --- /dev/null +++ b/gh-pages/src/use-baseline.md @@ -0,0 +1,20 @@ +--- +title: Baseline in your project +description: How to use the Baseline in your project. +layout: "default.html" +--- + +You can use Baseline to: + +- Make decisions about what web platform features to use in your sites and applications +- Tell others whether features work across browsers + +## Check if a feature works across browsers + +When visiting sites like [Can I Use](https://caniuse.com), [MDN Web Docs](https://developer.mozilla.org/), and [RUM Archive Insights](https://rumarchive.com/insights/#baseline) check the status of a feature to learn if it is available across browsers. + +## Let others know when a feature works across browsers + +Are you writing a blog post or article or presenting at a conference? Use the [Baseline logos](/name-and-logo-usage-guidelines/) as a shorthand to let your audience know the status of a feature. + +The [`` web component](https://github.com/web-platform-dx/baseline-status) is also available to include on your site or pages to indicate the status of a web feature. It renders at run-time, so it’s always up to date with the latest Baseline status. diff --git a/gh-pages/src/web-features.md b/gh-pages/src/web-features.md new file mode 100644 index 00000000000..51b456d1b21 --- /dev/null +++ b/gh-pages/src/web-features.md @@ -0,0 +1,26 @@ +--- +title: web-features +layout: "default.html" +--- + +web-features is an effort to build a shared catalog of features of the web platform. By creating a common list of features and their definitions, web-features aims to improve understanding of what web developers get and want from the web. web-features does this by: + +- Creating feature definitions, which identify and describe capabilities of the web. +- Generating Baseline support data, which summarizes the availability of web features across key browsers and releases. +- Publishing the [web-features npm package](https://www.npmjs.com/package/web-features), which bundles feature identifiers with Baseline statuses. + +## What is a feature? + +Think of features as individual components of the web platform that web developers can use to achieve specific tasks. + +As such, a feature has no specific size. A feature might cover a single CSS property, an entire JavaScript API with multiple interfaces, methods, and properties, or a combination of CSS properties, HTML elements, and JavaScript APIs. As long as a web developer would use the feature to achieve a specific goal, it's a feature. + +For example, the `fetch()` API is a feature, the `:has()` CSS pseudo-class function too, and so is the Web Audio API. + +## How does web-features relate to Baseline? + +The web-features project computes, reviews, and publishes Baseline statuses. Therefore, web-features is the source of truth for Baseline statuses. + +## Get involved + +It’s a huge effort to describe the entire web platform in this way and will be an ongoing one given that new web platform features are released every month. Help out by contributing feature definitions. See the [contributing information](https://github.com/web-platform-dx/web-features/blob/main/docs/CONTRIBUTING.md) for more details. diff --git a/gh-pages/src/webdx-cg.md b/gh-pages/src/webdx-cg.md new file mode 100644 index 00000000000..93c8420939c --- /dev/null +++ b/gh-pages/src/webdx-cg.md @@ -0,0 +1,14 @@ +--- +title: The WebDX Community Group +layout: "default.html" +--- + +> The mission of the [Web Developer Experience (WebDX) Community Group](https://www.w3.org/community/webdx/) is to facilitate coordinated approaches to improve the overall experience of developing for the Web platform when such coordination provides unique opportunities for these improvements. — [WebDX Community Group charter](https://github.com/web-platform-dx/admin/blob/main/charter.md). + +The web-features project grew out of the work of the WebDX Community Group. WebDX plays an important part in coordinating the web-features project by hosting meetings and making connections to research, standardization work, and other efforts. + +View the [current members and their affiliations](https://www.w3.org/community/webdx/participants) to see the different companies represented in the group. + +## Get involved + +As a W3C community group, anyone can become involved in the work of the WebDX Community Group, by [joining through the W3C](https://www.w3.org/community/webdx/join). This is how to take a more active role in Baseline, or in other web developer experience initiatives. If you work for a company that is a W3C member, your membership needs to be approved by your representative, otherwise you can join as an individual. diff --git a/groups/animation.yml b/groups/animation.yml new file mode 100644 index 00000000000..ad8e7d09cdc --- /dev/null +++ b/groups/animation.yml @@ -0,0 +1,2 @@ +name: Animation +#description: Methods of moving elements. diff --git a/groups/arrays.yml b/groups/arrays.yml new file mode 100644 index 00000000000..5f4d840f11f --- /dev/null +++ b/groups/arrays.yml @@ -0,0 +1,2 @@ +name: Arrays +parent: collections diff --git a/groups/background.yml b/groups/background.yml new file mode 100644 index 00000000000..8d5d7f64309 --- /dev/null +++ b/groups/background.yml @@ -0,0 +1,3 @@ +name: Background +parent: css +#description: The background CSS properties set the display of the layers behind an element's main content. diff --git a/groups/blend-mode.yml b/groups/blend-mode.yml new file mode 100644 index 00000000000..09253e72ea5 --- /dev/null +++ b/groups/blend-mode.yml @@ -0,0 +1,4 @@ +# https://drafts.fxtf.org/compositing-1/ +# Blend modes control how parts of an element are composited, or visually mixed. +name: Blend mode +parent: css diff --git a/groups/borders-outlines.yml b/groups/borders-outlines.yml new file mode 100644 index 00000000000..e8a242824c2 --- /dev/null +++ b/groups/borders-outlines.yml @@ -0,0 +1,3 @@ +name: Borders and outlines +#description: Properties related to the lines drawn around an element. +parent: css diff --git a/groups/canvas.yml b/groups/canvas.yml new file mode 100644 index 00000000000..510a592057d --- /dev/null +++ b/groups/canvas.yml @@ -0,0 +1,2 @@ +# including 2D and WebGL rendering contexts, and offscreen canvas. +name: Canvas diff --git a/groups/clipboard.yml b/groups/clipboard.yml new file mode 100644 index 00000000000..31cbbbc24e3 --- /dev/null +++ b/groups/clipboard.yml @@ -0,0 +1 @@ +name: Clipboard diff --git a/groups/clipping-shapes-masking.yml b/groups/clipping-shapes-masking.yml new file mode 100644 index 00000000000..462f910de5f --- /dev/null +++ b/groups/clipping-shapes-masking.yml @@ -0,0 +1,3 @@ +# Methods of clipping, masking and creating shapes with CSS and SVG. +# Based on CSS-Next CSS 4 group +name: Clipping, shapes and masking diff --git a/groups/collections.yml b/groups/collections.yml new file mode 100644 index 00000000000..70893ec2156 --- /dev/null +++ b/groups/collections.yml @@ -0,0 +1,2 @@ +name: Collections +parent: javascript diff --git a/groups/color-types.yml b/groups/color-types.yml new file mode 100644 index 00000000000..f809f7fcc03 --- /dev/null +++ b/groups/color-types.yml @@ -0,0 +1,3 @@ +# https://drafts.csswg.org/css-color/#introduction +name: Color types +parent: css diff --git a/groups/compute-pressure.yml b/groups/compute-pressure.yml new file mode 100644 index 00000000000..6e3ef1f5d6a --- /dev/null +++ b/groups/compute-pressure.yml @@ -0,0 +1 @@ +name: Compute pressure diff --git a/groups/container-queries.yml b/groups/container-queries.yml new file mode 100644 index 00000000000..9fdda00a11b --- /dev/null +++ b/groups/container-queries.yml @@ -0,0 +1,3 @@ +# https://drafts.csswg.org/css-conditional-5/#container-queries +name: Container queries +parent: css diff --git a/groups/containment.yml b/groups/containment.yml new file mode 100644 index 00000000000..d20150fa169 --- /dev/null +++ b/groups/containment.yml @@ -0,0 +1,4 @@ +# https://drafts.csswg.org/css-contain/ (any level) and containment-specific +# things in other specs, like contain-intrinsic-size. +name: Containment +parent: css diff --git a/groups/counters.yml b/groups/counters.yml new file mode 100644 index 00000000000..04e0d8e2f9f --- /dev/null +++ b/groups/counters.yml @@ -0,0 +1,3 @@ +name: Counters +# description: Counters in CSS track and display the number of times they are used in a document, for instance with counting list items or headings. +parent: css diff --git a/groups/credential-management.yml b/groups/credential-management.yml new file mode 100644 index 00000000000..1fcbe374954 --- /dev/null +++ b/groups/credential-management.yml @@ -0,0 +1,2 @@ +# Scope: anything accessed via `navigator.credentials` +name: Credential management diff --git a/groups/css.yml b/groups/css.yml new file mode 100644 index 00000000000..094a6c5643f --- /dev/null +++ b/groups/css.yml @@ -0,0 +1,7 @@ +# This group is intended for everything that can be done with CSS syntax and its +# associated APIs. Almost all such features are defined by the CSSWG, but there +# are exceptions: https://compat.spec.whatwg.org/#css-compat-section +# +# Additionally, not every deliverable of the CSSWG is a CSS feature: +# https://drafts.fxtf.org/geometry/ +name: CSS diff --git a/groups/cssom.yml b/groups/cssom.yml new file mode 100644 index 00000000000..4706c361dcc --- /dev/null +++ b/groups/cssom.yml @@ -0,0 +1,3 @@ +name: CSS object models +# description: The CSS Object Model (CSSOM) and CSS Typed Object Model allow authors to programmatically interact with CSS with JavaScript. +parent: css diff --git a/groups/custom-elements.yml b/groups/custom-elements.yml new file mode 100644 index 00000000000..5be4b56844b --- /dev/null +++ b/groups/custom-elements.yml @@ -0,0 +1,3 @@ +# https://html.spec.whatwg.org/multipage/custom-elements.html +name: Custom elements +parent: html diff --git a/groups/dom.yml b/groups/dom.yml new file mode 100644 index 00000000000..b1ac3b0fe42 --- /dev/null +++ b/groups/dom.yml @@ -0,0 +1,2 @@ +# Features that manipulate the tree of nodes that make up a document. +name: DOM diff --git a/groups/environment-variables.yml b/groups/environment-variables.yml new file mode 100644 index 00000000000..ab2a91f4548 --- /dev/null +++ b/groups/environment-variables.yml @@ -0,0 +1,3 @@ +name: CSS environment variables +# description: CSS environment variables expose system-specific values using the `env()` function. +parent: css diff --git a/groups/explicit-defaults.yml b/groups/explicit-defaults.yml new file mode 100644 index 00000000000..ee618cd83c1 --- /dev/null +++ b/groups/explicit-defaults.yml @@ -0,0 +1,3 @@ +# https://drafts.csswg.org/css-cascade/ +name: Explicit defaults +parent: css diff --git a/groups/file-system.yml b/groups/file-system.yml new file mode 100644 index 00000000000..cc9f5d71b8e --- /dev/null +++ b/groups/file-system.yml @@ -0,0 +1 @@ +name: File system access diff --git a/groups/flexbox.yml b/groups/flexbox.yml new file mode 100644 index 00000000000..bfcdb84d771 --- /dev/null +++ b/groups/flexbox.yml @@ -0,0 +1,3 @@ +# https://drafts.csswg.org/css-flexbox-1/ +name: Flexbox +parent: layout diff --git a/groups/font-features.yml b/groups/font-features.yml new file mode 100644 index 00000000000..0cf250cd5d3 --- /dev/null +++ b/groups/font-features.yml @@ -0,0 +1,4 @@ +# Typographic font features control how a font chooses glyphs to display. For example, you could request zeroes displayed with slashes, small capitals, or a font-specific character. +# https://drafts.csswg.org/css-fonts-4/#font-rend-props +name: Typographic font features +parent: fonts diff --git a/groups/font-synthesis.yml b/groups/font-synthesis.yml new file mode 100644 index 00000000000..fb2fcbfdfa6 --- /dev/null +++ b/groups/font-synthesis.yml @@ -0,0 +1,3 @@ +# https://drafts.csswg.org/css-fonts-4/#font-synthesis-intro +name: Font synthesis +parent: fonts diff --git a/groups/fonts.yml b/groups/fonts.yml new file mode 100644 index 00000000000..79370a5f7c1 --- /dev/null +++ b/groups/fonts.yml @@ -0,0 +1,3 @@ +# Everything related to web fonts and font rendering control. +name: Fonts +parent: css diff --git a/groups/forms.yml b/groups/forms.yml new file mode 100644 index 00000000000..68c4bd2b3a5 --- /dev/null +++ b/groups/forms.yml @@ -0,0 +1,4 @@ +# This group is for , all form controls, and APIs or CSS features +# specific to them. +name: Forms +parent: html diff --git a/groups/gamepad.yml b/groups/gamepad.yml new file mode 100644 index 00000000000..82013df8157 --- /dev/null +++ b/groups/gamepad.yml @@ -0,0 +1 @@ +name: Gamepad diff --git a/groups/gradients.yml b/groups/gradients.yml new file mode 100644 index 00000000000..2f7b2d79630 --- /dev/null +++ b/groups/gradients.yml @@ -0,0 +1,3 @@ +# https://drafts.csswg.org/css-images-4/#gradients +name: Gradients +parent: css diff --git a/groups/grid.yml b/groups/grid.yml new file mode 100644 index 00000000000..6fafef46691 --- /dev/null +++ b/groups/grid.yml @@ -0,0 +1,6 @@ +# https://drafts.csswg.org/css-grid/ (any level) but excluding Masonry, as it's +# currently being debated if it should be part of Grid or not: +# https://webkit.org/blog/15269/help-us-invent-masonry-layouts-for-css-grid-level-3/ +# https://developer.chrome.com/blog/masonry +name: Grid +parent: layout diff --git a/groups/html-elements.yml b/groups/html-elements.yml new file mode 100644 index 00000000000..e5e17ae7485 --- /dev/null +++ b/groups/html-elements.yml @@ -0,0 +1,2 @@ +name: HTML elements +parent: html diff --git a/groups/html.yml b/groups/html.yml new file mode 100644 index 00000000000..2b46ca2180c --- /dev/null +++ b/groups/html.yml @@ -0,0 +1,8 @@ +# This group isn't intended for everything defined in HTML: +# spec: https://html.spec.whatwg.org/multipage/ +# +# It is for the markup language, and not for all APIs and infrastructure +# defined in HTML. For example, structuredClone() should not be in this group. +# APIs on HTML*Element and CSS features specific to an HTML element generally +# do make sense to group under HTML, however. +name: HTML diff --git a/groups/image-scaling.yml b/groups/image-scaling.yml new file mode 100644 index 00000000000..7a4724d637b --- /dev/null +++ b/groups/image-scaling.yml @@ -0,0 +1,3 @@ +name: Image scaling +# description: The `image-rendering` CSS property sets how images are scaled. +parent: images diff --git a/groups/images.yml b/groups/images.yml new file mode 100644 index 00000000000..579e6b2547a --- /dev/null +++ b/groups/images.yml @@ -0,0 +1,2 @@ +name: Images +# description: Features relating to how images are displayed. diff --git a/groups/intl.yml b/groups/intl.yml new file mode 100644 index 00000000000..4b42afd5f8f --- /dev/null +++ b/groups/intl.yml @@ -0,0 +1,3 @@ +# JavaScript APIs for language- and region-specific string, number, and date handling. Also known as the Internationalization API. +name: Internationalization +parent: javascript diff --git a/groups/iterators.yml b/groups/iterators.yml new file mode 100644 index 00000000000..5f44f84c343 --- /dev/null +++ b/groups/iterators.yml @@ -0,0 +1,2 @@ +name: Iterators +parent: javascript diff --git a/groups/javascript.yml b/groups/javascript.yml new file mode 100644 index 00000000000..27b9f2996ed --- /dev/null +++ b/groups/javascript.yml @@ -0,0 +1,2 @@ +# https://tc39.es/ecma262/ (any edition) +name: JavaScript diff --git a/groups/js-modules.yml b/groups/js-modules.yml new file mode 100644 index 00000000000..00af6906ed2 --- /dev/null +++ b/groups/js-modules.yml @@ -0,0 +1 @@ +name: JavaScript modules diff --git a/groups/json.yml b/groups/json.yml new file mode 100644 index 00000000000..4e7a97cd17b --- /dev/null +++ b/groups/json.yml @@ -0,0 +1,3 @@ +name: JSON +parent: javascript +# description: Features for the JSON format itself and related features, such as the JSON JavaScript namespace and JSON import attributes. diff --git a/groups/layout.yml b/groups/layout.yml new file mode 100644 index 00000000000..20028a32f2b --- /dev/null +++ b/groups/layout.yml @@ -0,0 +1,3 @@ +# CSS layout features which give size and positions to boxes. +name: Layout +parent: css diff --git a/groups/lists.yml b/groups/lists.yml new file mode 100644 index 00000000000..0bd41cd30f1 --- /dev/null +++ b/groups/lists.yml @@ -0,0 +1,3 @@ +name: Lists +# description: Features related to the display of lists of items. +parent: css diff --git a/groups/maps.yml b/groups/maps.yml new file mode 100644 index 00000000000..71bfccc9af6 --- /dev/null +++ b/groups/maps.yml @@ -0,0 +1,2 @@ +name: Maps +parent: collections diff --git a/groups/media-elements.yml b/groups/media-elements.yml new file mode 100644 index 00000000000..08bb9e7f3ef --- /dev/null +++ b/groups/media-elements.yml @@ -0,0 +1,4 @@ +# Media elements are