diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df20106e..c06ef861 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] jobs: test: @@ -13,21 +13,23 @@ jobs: permissions: {} steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: false # Currently not necessary + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: false # Currently not necessary - - name: Set up Node - uses: actions/setup-node@v3 - with: - node-version: 18 + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 18 - - name: Install JSON validator - run: npm install -g ajv-cli@5 ajv-formats@2 + - name: Install JSON validator + run: npm install -g ajv-cli@5 ajv-formats@2 - - name: Validate features table - run: ajv -c ajv-formats -s features.schema.json -d features.json --strict=true --errors=text + - name: Validate features table + run: + ajv -c ajv-formats -s features.schema.json -d features.json + --strict=true --errors=text build: name: Build & Deploy @@ -36,26 +38,26 @@ jobs: contents: write steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.7 - bundler-cache: true - - - name: Build - run: bundle exec jekyll build - - - name: Deploy - if: github.event_name == 'push' - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs - user_name: 'github-actions[bot]' - user_email: 'github-actions[bot]@users.noreply.github.com' - exclude_assets: '' + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7 + bundler-cache: true + + - name: Build + run: bundle exec jekyll build + + - name: Deploy + if: github.event_name == 'push' + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs + user_name: 'github-actions[bot]' + user_email: 'github-actions[bot]@users.noreply.github.com' + exclude_assets: '' diff --git a/.github/workflows/purge.yml b/.github/workflows/purge.yml index cffdf14c..4fcc0c61 100644 --- a/.github/workflows/purge.yml +++ b/.github/workflows/purge.yml @@ -4,7 +4,6 @@ on: page_build jobs: purge: - runs-on: ubuntu-latest steps: diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..f15ca4dd --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +_includes/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..f0c527de --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "bracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "always", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false, + "vueIndentScriptAndStyle": false +} diff --git a/README.md b/README.md index b8144df2..f03930bb 100644 --- a/README.md +++ b/README.md @@ -29,21 +29,42 @@ $ bundle exec jekyll build $ bundle exec jekyll serve ``` -> You must run `bundle exec jekyll build` after every change and include the `docs` directory in your commit! +> You must run `bundle exec jekyll build` after every change and include the +> `docs` directory in your commit! ## Publishing -This site uses Jekyll plugins, so GitHub Pages will not build it automatically. To publish, check in manually built static site files to the `docs` directory. +This site uses Jekyll plugins, so GitHub Pages will not build it automatically. +To publish, check in manually built static site files to the `docs` directory. -The static site should be configured to build to the `docs` directory. The `docs` directory is a special directory from which GitHub pages can publish directly. The naming convention is unfortunate given the confusing overlap with the site's own `docs` pages (output to `docs/docs`) which are themselves generated from the design docs submodule located at `design`. +The static site should be configured to build to the `docs` directory. The +`docs` directory is a special directory from which GitHub pages can publish +directly. The naming convention is unfortunate given the confusing overlap with +the site's own `docs` pages (output to `docs/docs`) which are themselves +generated from the design docs submodule located at `design`. ## What is the role of `_config.yml` and the custom Jekyll plugins? -> Note: the following plugins are all hacks to make the workflow of generating website docs from the `design` repo work without updating the sources in the design repo. - -- `gem 'jekyll-optional-front-matter'` loaded directly in the `Gemfile` allows markdown files without YAML frontmatter to be consumed directly. This is included to allow `design` repo `.md` files to be used as pages without modifying their source to add frontmatter. -- `gem 'jemoji'` loaded directly in the `Gemfile` replaces GitHub-style emoji markdown (e.g. `:+1:`) with images for compat. -- The `defaults` section of `_config.yml` adds default values to the YAML frontmatter of documents from the `design` repo. In particular, it specifies that all `.md` files in the design submodule should be labelled as type `doc` and given layout `doc.html`. It also manually moves a few docs into the `community` tree where they fit the site organization better. -- `auto_titles.rb` adds a `title` value to YAML frontmatter by looking for the first header tag in the source files. It also orders the design docs based on a hardcoded list. -- `link_converter.rb` turns the `design` repo's links (e.g. `[threads](FutureFeatures.md#threads)`) into their respective locations on this website (e.g. `[threads](/docs/future-features/#threads)`). -- `underscore_paths.rb` rewrites Jekyll page permalinks to convert `/design/FutureFeatures/` to `/docs/future-features/`. +> Note: the following plugins are all hacks to make the workflow of generating +> website docs from the `design` repo work without updating the sources in the +> design repo. + +- `gem 'jekyll-optional-front-matter'` loaded directly in the `Gemfile` allows + markdown files without YAML frontmatter to be consumed directly. This is + included to allow `design` repo `.md` files to be used as pages without + modifying their source to add frontmatter. +- `gem 'jemoji'` loaded directly in the `Gemfile` replaces GitHub-style emoji + markdown (e.g. `:+1:`) with images for compat. +- The `defaults` section of `_config.yml` adds default values to the YAML + frontmatter of documents from the `design` repo. In particular, it specifies + that all `.md` files in the design submodule should be labelled as type `doc` + and given layout `doc.html`. It also manually moves a few docs into the + `community` tree where they fit the site organization better. +- `auto_titles.rb` adds a `title` value to YAML frontmatter by looking for the + first header tag in the source files. It also orders the design docs based on + a hardcoded list. +- `link_converter.rb` turns the `design` repo's links (e.g. + `[threads](FutureFeatures.md#threads)`) into their respective locations on + this website (e.g. `[threads](/docs/future-features/#threads)`). +- `underscore_paths.rb` rewrites Jekyll page permalinks to convert + `/design/FutureFeatures/` to `/docs/future-features/`. diff --git a/_config.yml b/_config.yml index 1d83ceaf..9d30ca8e 100644 --- a/_config.yml +++ b/_config.yml @@ -1,57 +1,53 @@ name: WebAssembly -include: [ - .github -] +include: [.github] -exclude: [ - README.md, - LICENSE, - Gemfile, - Gemfile.lock, - design/LICENSE, - design/Contributing.md, - design/README.md, - design/tools, - design/JS.md, - design/BinaryEncoding.md, - design/TextFormat.md, - design/Semantics.md, - design/Nondeterminism.md, - design/Rationale.md, - design/MVP.md, - design/Modules.md, - design/FutureFeatures.md, - design/FeatureTest.md, - design/JITLibrary.md, - design/DynamicLinking.md, - design/CAndC++.md, - docs, - vendor -] +exclude: + [ + README.md, + LICENSE, + Gemfile, + Gemfile.lock, + design/LICENSE, + design/Contributing.md, + design/README.md, + design/tools, + design/JS.md, + design/BinaryEncoding.md, + design/TextFormat.md, + design/Semantics.md, + design/Nondeterminism.md, + design/Rationale.md, + design/MVP.md, + design/Modules.md, + design/FutureFeatures.md, + design/FeatureTest.md, + design/JITLibrary.md, + design/DynamicLinking.md, + design/CAndC++.md, + docs, + vendor, + ] destination: docs permalink: pretty defaults: - - - scope: - path: "design" + - scope: + path: 'design' values: - layout: "doc" - type: "doc" - - - scope: - path: "design/CodeOfConduct.md" + layout: 'doc' + type: 'doc' + - scope: + path: 'design/CodeOfConduct.md' values: - layout: "community" - type: "community" - permalink: "/community/code-of-conduct/" - - - scope: - path: "design/Events.md" + layout: 'community' + type: 'community' + permalink: '/community/code-of-conduct/' + - scope: + path: 'design/Events.md' values: - layout: "community" - type: "community" - permalink: "/community/events/" + layout: 'community' + type: 'community' + permalink: '/community/events/' diff --git a/_includes/footer.html b/_includes/footer.html index 308b1d01..b605728e 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,2 +1,2 @@ - + diff --git a/_includes/header.html b/_includes/header.html index 721ee627..da350268 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,32 +1,42 @@ - + - - - - - {% if page.url == "/" %}WebAssembly{% else %}{{ page.title }} - WebAssembly{% endif %} - - - - - -
-
- - -
-
- {% if page.lead %} -
-
-

{{page.lead}}

-
-
- {% endif %} + + + + + + {% if page.url == "/" %}WebAssembly{% else %}{{ page.title }} - + WebAssembly{% endif %} + + + + + + +
+
+ + +
+
+ {% if page.lead %} +
+
+

{{page.lead}}

+
+
+ {% endif %} diff --git a/_layouts/community.html b/_layouts/community.html index b5ae49ca..e09115dc 100644 --- a/_layouts/community.html +++ b/_layouts/community.html @@ -2,20 +2,26 @@
-{% include footer.html %} \ No newline at end of file +{% include footer.html %} diff --git a/_layouts/default.html b/_layouts/default.html index b7d4b960..f9f6b47a 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -1,7 +1,5 @@ {% include header.html %}
-
- {{content}} -
+
{{content}}
{% include footer.html %} diff --git a/_layouts/doc.html b/_layouts/doc.html index 7b5d6473..2700f1d3 100644 --- a/_layouts/doc.html +++ b/_layouts/doc.html @@ -2,19 +2,17 @@
-
- {{content}} -
+
{{content}}
Documentation
-{% include footer.html %} \ No newline at end of file +{% include footer.html %} diff --git a/_layouts/getting-started.html b/_layouts/getting-started.html index 3d343d3b..67c13c0b 100644 --- a/_layouts/getting-started.html +++ b/_layouts/getting-started.html @@ -2,19 +2,25 @@
-{% include footer.html %} \ No newline at end of file +{% include footer.html %} diff --git a/community/contributing.md b/community/contributing.md index 15533b09..08af641d 100644 --- a/community/contributing.md +++ b/community/contributing.md @@ -16,17 +16,17 @@ Interested in participating? We suggest you start by: 2. Reading the [WebAssembly design][]. 3. Joining the [Discord #cg chat](https://discord.gg/kx5VNQa). -With that background understood and communication set up, feel free to -[file issues][] in the WebAssembly design repository. Please join the -[W3C Community Group][] before sending pull requests: it provides the legal -framework that protects the work in this repository. Make sure you're affiliated -with your company or organization in the Community Group, if any. +With that background understood and communication set up, feel free to [file +issues][] in the WebAssembly design repository. Please join the [W3C Community +Group][] before sending pull requests: it provides the legal framework that +protects the work in this repository. Make sure you're affiliated with your +company or organization in the Community Group, if any. As WebAssembly moves forward we expect to form an official standards body, which will have its own contribution process to the specification. Happy assembly! - [WebAssembly design]: https://github.com/WebAssembly/design - [file issues]: https://github.com/WebAssembly/design/issues - [W3C Community Group]: https://www.w3.org/community/webassembly/ +[WebAssembly design]: https://github.com/WebAssembly/design +[file issues]: https://github.com/WebAssembly/design/issues +[W3C Community Group]: https://www.w3.org/community/webassembly/ diff --git a/community/feedback.md b/community/feedback.md index 77daed41..d6b8b864 100644 --- a/community/feedback.md +++ b/community/feedback.md @@ -4,26 +4,29 @@ layout: community # Submitting Feedback & Issues -We welcome community and developer feedback on all aspects of WebAssembly, including the high-level design, binary format, JS API, developer experience, and browser implementations. - +We welcome community and developer feedback on all aspects of WebAssembly, +including the high-level design, binary format, JS API, developer experience, +and browser implementations. Please contribute your feedback or issues in the following forums: - - High level design feedback: [WebAssembly/design][] - - Specification bugs / suggestions: [WebAssembly/spec][] - - Test suite / reference interpreter issues: [WebAssembly/spec][] - - Emscripten / Binaryen / LLVM issues: [WebAssembly/binaryen][] - - WABT issues: [WebAssembly/wabt][] - - V8 / Chrome bugs: [crbug.com/v8][] - - SpiderMonkey / Firefox bugs: [bugzilla.mozilla.org][] - - Chakra / Edge bugs: [Microsoft/ChakraCore][] - - Website bugs: [WebAssembly/website][] +- High level design feedback: [WebAssembly/design][] +- Specification bugs / suggestions: [WebAssembly/spec][] +- Test suite / reference interpreter issues: [WebAssembly/spec][] +- Emscripten / Binaryen / LLVM issues: [WebAssembly/binaryen][] +- WABT issues: [WebAssembly/wabt][] +- V8 / Chrome bugs: [crbug.com/v8][] +- SpiderMonkey / Firefox bugs: [bugzilla.mozilla.org][] +- Chakra / Edge bugs: [Microsoft/ChakraCore][] +- Website bugs: [WebAssembly/website][] [WebAssembly/design]: https://github.com/WebAssembly/design [WebAssembly/spec]: https://github.com/WebAssembly/spec [WebAssembly/binaryen]: https://github.com/WebAssembly/binaryen [WebAssembly/wabt]: https://github.com/WebAssembly/wabt -[crbug.com/v8]: https://bugs.chromium.org/p/v8/issues/entry?template=WASM%20issue -[bugzilla.mozilla.org]: https://bugzilla.mozilla.org/enter_bug.cgi?component=JavaScript%20Engine&product=Core +[crbug.com/v8]: + https://bugs.chromium.org/p/v8/issues/entry?template=WASM%20issue +[bugzilla.mozilla.org]: + https://bugzilla.mozilla.org/enter_bug.cgi?component=JavaScript%20Engine&product=Core [Microsoft/ChakraCore]: https://github.com/Microsoft/ChakraCore/issues/new [WebAssembly/website]: https://github.com/WebAssembly/website diff --git a/community/resources.md b/community/resources.md index 0b75d5e9..2c08b07a 100644 --- a/community/resources.md +++ b/community/resources.md @@ -4,7 +4,9 @@ layout: community # Resources -There's a lot of community-driven public discussion forums, chats and channels where you can get help with any WebAssembly-related questions, answer them for others, or subscribe to WebAssembly news. +There's a lot of community-driven public discussion forums, chats and channels +where you can get help with any WebAssembly-related questions, answer them for +others, or subscribe to WebAssembly news. Here are just some of the popular ways to get started: @@ -12,6 +14,8 @@ Here are just some of the popular ways to get started: - [Collection of awesome things in the Wasm ecosystem](https://github.com/mbasso/awesome-wasm) - [Reddit: r/WebAssembly](https://www.reddit.com/r/WebAssembly/) - [Stackoverflow: #webassembly tag](https://stackoverflow.com/questions/tagged/webassembly) -- WebAssembly Weekly [newsletter](https://wasmweekly.news/) or [Twitter account](https://twitter.com/WasmWeekly). +- WebAssembly Weekly [newsletter](https://wasmweekly.news/) or + [Twitter account](https://twitter.com/WasmWeekly). -Interesting in contributing to WebAssembly? Check out the [Contributing](/community/contributing/) page. +Interesting in contributing to WebAssembly? Check out the +[Contributing](/community/contributing/) page. diff --git a/css/custom.css b/css/custom.css index bad9fb71..632804d7 100644 --- a/css/custom.css +++ b/css/custom.css @@ -1,1566 +1,1821 @@ -/*! normalize.css v1.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} - +/*! normalize.css v1.1.3 | MIT License | git.io/normalize */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden] { + display: none; +} +html { + font-size: 100%; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} +body { + margin: 0; +} +a:focus { + outline: thin dotted; +} +a:active, +a:hover { + outline: 0; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} +h3 { + font-size: 1.17em; + margin: 1em 0; +} +h4 { + font-size: 1em; + margin: 1.33em 0; +} +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +blockquote { + margin: 1em 40px; +} +dfn { + font-style: italic; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +mark { + background: #ff0; + color: #000; +} +p, +pre { + margin: 1em 0; +} +code, +kbd, +pre, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} +q { + quotes: none; +} +q:before, +q:after { + content: ''; + content: none; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +dl, +menu, +ol, +ul { + margin: 1em 0; +} +dd { + margin: 0 0 0 40px; +} +menu, +ol, +ul { + padding: 0 0 0 40px; +} +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} +img { + border: 0; + -ms-interpolation-mode: bicubic; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +form { + margin: 0; +} +fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; + white-space: normal; + *margin-left: -7px; +} +button, +input, +select, +textarea { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; +} +button, +input { + line-height: normal; +} +button, +select { + text-transform: none; +} +button, +html input[type='button'], +input[type='reset'], +input[type='submit'] { + -webkit-appearance: button; + cursor: pointer; + *overflow: visible; +} +button[disabled], +html input[disabled] { + cursor: default; +} +input[type='checkbox'], +input[type='radio'] { + box-sizing: border-box; + padding: 0; + *height: 13px; + *width: 13px; +} +input[type='search'] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type='search']::-webkit-search-cancel-button, +input[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} :root { - color-scheme: dark light; + color-scheme: dark light; } * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; - line-height: 1.5; - word-wrap: break-word; + font-family: + system-ui, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Open Sans', + 'Helvetica Neue', + sans-serif; + line-height: 1.5; + word-wrap: break-word; } a { - text-decoration: none; + text-decoration: none; } a:hover { - text-decoration: underline; + text-decoration: underline; } -a[href^="http"]::after { - content: ""; - display: inline-block; - vertical-align: middle; - width: 1rem; - height: 1rem; - margin-inline-start: .1rem; - background-image: url(/css/external.svg); +a[href^='http']::after { + content: ''; + display: inline-block; + vertical-align: middle; + width: 1rem; + height: 1rem; + margin-inline-start: 0.1rem; + background-image: url(/css/external.svg); } @media (prefers-color-scheme: dark) { - :not(.flash) > a[href^="http"]::after { - filter: invert(1); - } + :not(.flash) > a[href^='http']::after { + filter: invert(1); + } } nav a:hover { - text-decoration: none; + text-decoration: none; } .container { - margin-left: auto; - margin-right: auto; - padding-left: 15px; - padding-right: 15px; - max-width: 1080px; + margin-left: auto; + margin-right: auto; + padding-left: 15px; + padding-right: 15px; + max-width: 1080px; } .container::after { - content: ""; - display: table; - clear: both + content: ''; + display: table; + clear: both; } @media (min-width: 544px) { - .container { - /* max-width:576px; */ - } + .container { + /* max-width:576px; */ + } } @media (min-width: 768px) { - .container { - /* max-width:800px; */ - } + .container { + /* max-width:800px; */ + } } @media (min-width: 992px) { - .container { - /* max-width:980px */ - } + .container { + /* max-width:980px */ + } } @media (min-width: 1300px) { - .container { - /* max-width:1260px; */ - } + .container { + /* max-width:1260px; */ + } } .container-fluid { - margin-left: auto; - margin-right: auto; - padding-left: 15px; - padding-right: 15px + margin-left: auto; + margin-right: auto; + padding-left: 15px; + padding-right: 15px; } .container-fluid::after { - content: ""; - display: table; - clear: both + content: ''; + display: table; + clear: both; } .container-narrow { - margin-left: auto; - margin-right: auto; - padding-left: 15px; - padding-right: 15px; - max-width: 800px + margin-left: auto; + margin-right: auto; + padding-left: 15px; + padding-right: 15px; + max-width: 800px; } .container-narrow::after { - content: ""; - display: table; - clear: both + content: ''; + display: table; + clear: both; } .container-wide { - margin-left: auto; - margin-right: auto; - padding-left: 15px; - padding-right: 15px; - max-width: 1260px + margin-left: auto; + margin-right: auto; + padding-left: 15px; + padding-right: 15px; + max-width: 1260px; } .container-wide::after { - content: ""; - display: table; - clear: both + content: ''; + display: table; + clear: both; } .row { - margin-left: -15px; - margin-right: -15px + margin-left: -15px; + margin-right: -15px; } .row::after { - content: ""; - display: table; - clear: both + content: ''; + display: table; + clear: both; } .col-xs-1 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 8.33333% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 8.33333%; } .col-xs-2 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 16.66667% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 16.66667%; } .col-xs-3 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 25% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 25%; } .col-xs-4 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 33.33333% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 33.33333%; } .col-xs-5 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 41.66667% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 41.66667%; } .col-xs-6 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 50% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 50%; } .col-xs-7 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 58.33333% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 58.33333%; } .col-xs-8 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 66.66667% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 66.66667%; } .col-xs-9 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 75% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 75%; } .col-xs-10 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 83.33333% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 83.33333%; } .col-xs-11 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 91.66667% + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 91.66667%; } .col-xs-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 100%; + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 100%; } .pull-xs-0 { - right: auto + right: auto; } .pull-xs-1 { - right: 8.33333% + right: 8.33333%; } .pull-xs-2 { - right: 16.66667% + right: 16.66667%; } .pull-xs-3 { - right: 25% + right: 25%; } .pull-xs-4 { - right: 33.33333% + right: 33.33333%; } .pull-xs-5 { - right: 41.66667% + right: 41.66667%; } .pull-xs-6 { - right: 50% + right: 50%; } .pull-xs-7 { - right: 58.33333% + right: 58.33333%; } .pull-xs-8 { - right: 66.66667% + right: 66.66667%; } .pull-xs-9 { - right: 75% + right: 75%; } .pull-xs-10 { - right: 83.33333% + right: 83.33333%; } .pull-xs-11 { - right: 91.66667% + right: 91.66667%; } .pull-xs-12 { - right: 100% + right: 100%; } .push-xs-0 { - left: auto + left: auto; } .push-xs-1 { - left: 8.33333% + left: 8.33333%; } .push-xs-2 { - left: 16.66667% + left: 16.66667%; } .push-xs-3 { - left: 25% + left: 25%; } .push-xs-4 { - left: 33.33333% + left: 33.33333%; } .push-xs-5 { - left: 41.66667% + left: 41.66667%; } .push-xs-6 { - left: 50% + left: 50%; } .push-xs-7 { - left: 58.33333% + left: 58.33333%; } .push-xs-8 { - left: 66.66667% + left: 66.66667%; } .push-xs-9 { - left: 75% + left: 75%; } .push-xs-10 { - left: 83.33333% + left: 83.33333%; } .push-xs-11 { - left: 91.66667% + left: 91.66667%; } .push-xs-12 { - left: 100% + left: 100%; } .offset-xs-1 { - margin-left: 8.33333% + margin-left: 8.33333%; } .offset-xs-2 { - margin-left: 16.66667% + margin-left: 16.66667%; } .offset-xs-3 { - margin-left: 25% + margin-left: 25%; } .offset-xs-4 { - margin-left: 33.33333% + margin-left: 33.33333%; } .offset-xs-5 { - margin-left: 41.66667% + margin-left: 41.66667%; } .offset-xs-6 { - margin-left: 50% + margin-left: 50%; } .offset-xs-7 { - margin-left: 58.33333% + margin-left: 58.33333%; } .offset-xs-8 { - margin-left: 66.66667% + margin-left: 66.66667%; } .offset-xs-9 { - margin-left: 75% + margin-left: 75%; } .offset-xs-10 { - margin-left: 83.33333% + margin-left: 83.33333%; } .offset-xs-11 { - margin-left: 91.66667% + margin-left: 91.66667%; } @media (min-width: 544px) { - .col-sm-1 { - position:relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 8.33333% - } - - .col-sm-2 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 16.66667% - } - - .col-sm-3 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 25% - } - - .col-sm-4 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 33.33333%; - } - - .col-sm-5 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 41.66667% - } - - .col-sm-6 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 50% - } - - .col-sm-7 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 58.33333% - } - - .col-sm-8 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 66.66667% - } - - .col-sm-9 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 75% - } - - .col-sm-10 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 83.33333% - } - - .col-sm-11 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 91.66667% - } - - .col-sm-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 100% - } - - .pull-sm-0 { - right: auto - } - - .pull-sm-1 { - right: 8.33333% - } - - .pull-sm-2 { - right: 16.66667% - } - - .pull-sm-3 { - right: 25% - } - - .pull-sm-4 { - right: 33.33333% - } - - .pull-sm-5 { - right: 41.66667% - } - - .pull-sm-6 { - right: 50% - } - - .pull-sm-7 { - right: 58.33333% - } - - .pull-sm-8 { - right: 66.66667% - } - - .pull-sm-9 { - right: 75% - } - - .pull-sm-10 { - right: 83.33333% - } - - .pull-sm-11 { - right: 91.66667% - } - - .pull-sm-12 { - right: 100% - } - - .push-sm-0 { - left: auto - } - - .push-sm-1 { - left: 8.33333% - } - - .push-sm-2 { - left: 16.66667% - } - - .push-sm-3 { - left: 25% - } - - .push-sm-4 { - left: 33.33333% - } - - .push-sm-5 { - left: 41.66667% - } - - .push-sm-6 { - left: 50% - } - - .push-sm-7 { - left: 58.33333% - } - - .push-sm-8 { - left: 66.66667% - } + .col-sm-1 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 8.33333%; + } - .push-sm-9 { - left: 75% - } + .col-sm-2 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 16.66667%; + } - .push-sm-10 { - left: 83.33333% - } + .col-sm-3 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 25%; + } - .push-sm-11 { - left: 91.66667% - } + .col-sm-4 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 33.33333%; + } - .push-sm-12 { - left: 100% - } + .col-sm-5 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 41.66667%; + } - .offset-sm-0 { - margin-left: 0% - } + .col-sm-6 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 50%; + } - .offset-sm-1 { - margin-left: 8.33333% - } + .col-sm-7 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 58.33333%; + } - .offset-sm-2 { - margin-left: 16.66667% - } + .col-sm-8 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 66.66667%; + } - .offset-sm-3 { - margin-left: 25% - } + .col-sm-9 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 75%; + } - .offset-sm-4 { - margin-left: 33.33333% - } + .col-sm-10 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 83.33333%; + } - .offset-sm-5 { - margin-left: 41.66667% - } + .col-sm-11 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 91.66667%; + } - .offset-sm-6 { - margin-left: 50% - } + .col-sm-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 100%; + } - .offset-sm-7 { - margin-left: 58.33333% - } + .pull-sm-0 { + right: auto; + } - .offset-sm-8 { - margin-left: 66.66667% - } + .pull-sm-1 { + right: 8.33333%; + } + + .pull-sm-2 { + right: 16.66667%; + } + + .pull-sm-3 { + right: 25%; + } + + .pull-sm-4 { + right: 33.33333%; + } + + .pull-sm-5 { + right: 41.66667%; + } + + .pull-sm-6 { + right: 50%; + } + + .pull-sm-7 { + right: 58.33333%; + } + + .pull-sm-8 { + right: 66.66667%; + } + + .pull-sm-9 { + right: 75%; + } + + .pull-sm-10 { + right: 83.33333%; + } + + .pull-sm-11 { + right: 91.66667%; + } + + .pull-sm-12 { + right: 100%; + } + + .push-sm-0 { + left: auto; + } + + .push-sm-1 { + left: 8.33333%; + } + + .push-sm-2 { + left: 16.66667%; + } + + .push-sm-3 { + left: 25%; + } + + .push-sm-4 { + left: 33.33333%; + } + + .push-sm-5 { + left: 41.66667%; + } + + .push-sm-6 { + left: 50%; + } + + .push-sm-7 { + left: 58.33333%; + } + + .push-sm-8 { + left: 66.66667%; + } + + .push-sm-9 { + left: 75%; + } + + .push-sm-10 { + left: 83.33333%; + } + + .push-sm-11 { + left: 91.66667%; + } + + .push-sm-12 { + left: 100%; + } - .offset-sm-9 { - margin-left: 75% - } + .offset-sm-0 { + margin-left: 0%; + } + + .offset-sm-1 { + margin-left: 8.33333%; + } - .offset-sm-10 { - margin-left: 83.33333% - } + .offset-sm-2 { + margin-left: 16.66667%; + } - .offset-sm-11 { - margin-left: 91.66667% - } + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.33333%; + } + + .offset-sm-5 { + margin-left: 41.66667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.33333%; + } + + .offset-sm-8 { + margin-left: 66.66667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.33333%; + } + + .offset-sm-11 { + margin-left: 91.66667%; + } } @media (min-width: 768px) { - .col-md-1 { - position:relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 8.33333% - } - - .col-md-2 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 16.66667% - } - - .col-md-3 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 25% - } - - .col-md-4 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 33.33333% - } - - .col-md-5 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 41.66667% - } - - .col-md-6 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 50% - } - - .col-md-7 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 58.33333% - } - - .col-md-8 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 66.66667% - } - - .col-md-9 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 75% - } - - .col-md-10 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 83.33333% - } - - .col-md-11 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 91.66667% - } - - .col-md-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 100% - } - - .pull-md-0 { - right: auto - } - - .pull-md-1 { - right: 8.33333% - } - - .pull-md-2 { - right: 16.66667% - } - - .pull-md-3 { - right: 25% - } - - .pull-md-4 { - right: 33.33333% - } - - .pull-md-5 { - right: 41.66667% - } - - .pull-md-6 { - right: 50% - } - - .pull-md-7 { - right: 58.33333% - } - - .pull-md-8 { - right: 66.66667% - } - - .pull-md-9 { - right: 75% - } - - .pull-md-10 { - right: 83.33333% - } - - .pull-md-11 { - right: 91.66667% - } - - .pull-md-12 { - right: 100% - } - - .push-md-0 { - left: auto - } - - .push-md-1 { - left: 8.33333% - } - - .push-md-2 { - left: 16.66667% - } - - .push-md-3 { - left: 25% - } - - .push-md-4 { - left: 33.33333% - } - - .push-md-5 { - left: 41.66667% - } - - .push-md-6 { - left: 50% - } - - .push-md-7 { - left: 58.33333% - } - - .push-md-8 { - left: 66.66667% - } + .col-md-1 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 8.33333%; + } + + .col-md-2 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 16.66667%; + } + + .col-md-3 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 25%; + } + + .col-md-4 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 33.33333%; + } + + .col-md-5 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 41.66667%; + } + + .col-md-6 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 50%; + } - .push-md-9 { - left: 75% - } + .col-md-7 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 58.33333%; + } + + .col-md-8 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 66.66667%; + } + + .col-md-9 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 75%; + } + + .col-md-10 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 83.33333%; + } + + .col-md-11 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 91.66667%; + } + + .col-md-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 100%; + } - .push-md-10 { - left: 83.33333% - } + .pull-md-0 { + right: auto; + } + + .pull-md-1 { + right: 8.33333%; + } + + .pull-md-2 { + right: 16.66667%; + } + + .pull-md-3 { + right: 25%; + } - .push-md-11 { - left: 91.66667% - } + .pull-md-4 { + right: 33.33333%; + } - .push-md-12 { - left: 100% - } + .pull-md-5 { + right: 41.66667%; + } - .offset-md-0 { - margin-left: 0% - } + .pull-md-6 { + right: 50%; + } - .offset-md-1 { - margin-left: 8.33333% - } + .pull-md-7 { + right: 58.33333%; + } - .offset-md-2 { - margin-left: 16.66667% - } + .pull-md-8 { + right: 66.66667%; + } + + .pull-md-9 { + right: 75%; + } - .offset-md-3 { - margin-left: 25% - } + .pull-md-10 { + right: 83.33333%; + } + + .pull-md-11 { + right: 91.66667%; + } + + .pull-md-12 { + right: 100%; + } + + .push-md-0 { + left: auto; + } + + .push-md-1 { + left: 8.33333%; + } + + .push-md-2 { + left: 16.66667%; + } + + .push-md-3 { + left: 25%; + } + + .push-md-4 { + left: 33.33333%; + } + + .push-md-5 { + left: 41.66667%; + } + + .push-md-6 { + left: 50%; + } + + .push-md-7 { + left: 58.33333%; + } + + .push-md-8 { + left: 66.66667%; + } + + .push-md-9 { + left: 75%; + } + + .push-md-10 { + left: 83.33333%; + } + + .push-md-11 { + left: 91.66667%; + } + + .push-md-12 { + left: 100%; + } + + .offset-md-0 { + margin-left: 0%; + } + + .offset-md-1 { + margin-left: 8.33333%; + } + + .offset-md-2 { + margin-left: 16.66667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.33333%; + } + + .offset-md-5 { + margin-left: 41.66667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.33333%; + } + + .offset-md-8 { + margin-left: 66.66667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.33333%; + } + + .offset-md-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 992px) { + .col-lg-1 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 8.33333%; + } + + .col-lg-2 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 16.66667%; + } + + .col-lg-3 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 25%; + } + + .col-lg-4 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 33.33333%; + } + + .col-lg-5 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 41.66667%; + } + + .col-lg-6 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 50%; + } + + .col-lg-7 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 58.33333%; + } + + .col-lg-8 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 66.66667%; + } + + .col-lg-9 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 75%; + } + + .col-lg-10 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 83.33333%; + } + + .col-lg-11 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 91.66667%; + } + + .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 100%; + } + + .pull-lg-0 { + right: auto; + } + + .pull-lg-1 { + right: 8.33333%; + } + + .pull-lg-2 { + right: 16.66667%; + } + + .pull-lg-3 { + right: 25%; + } + + .pull-lg-4 { + right: 33.33333%; + } + + .pull-lg-5 { + right: 41.66667%; + } + + .pull-lg-6 { + right: 50%; + } + + .pull-lg-7 { + right: 58.33333%; + } + + .pull-lg-8 { + right: 66.66667%; + } + + .pull-lg-9 { + right: 75%; + } + + .pull-lg-10 { + right: 83.33333%; + } + + .pull-lg-11 { + right: 91.66667%; + } + + .pull-lg-12 { + right: 100%; + } + + .push-lg-0 { + left: auto; + } + + .push-lg-1 { + left: 8.33333%; + } + + .push-lg-2 { + left: 16.66667%; + } + + .push-lg-3 { + left: 25%; + } + + .push-lg-4 { + left: 33.33333%; + } + + .push-lg-5 { + left: 41.66667%; + } + + .push-lg-6 { + left: 50%; + } + + .push-lg-7 { + left: 58.33333%; + } + + .push-lg-8 { + left: 66.66667%; + } + + .push-lg-9 { + left: 75%; + } + + .push-lg-10 { + left: 83.33333%; + } + + .push-lg-11 { + left: 91.66667%; + } + + .push-lg-12 { + left: 100%; + } + + .offset-lg-0 { + margin-left: 0%; + } + + .offset-lg-1 { + margin-left: 8.33333%; + } + + .offset-lg-2 { + margin-left: 16.66667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.33333%; + } + + .offset-lg-5 { + margin-left: 41.66667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.33333%; + } + + .offset-lg-8 { + margin-left: 66.66667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.33333%; + } + + .offset-lg-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 1300px) { + .col-xl-1 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 8.33333%; + } + + .col-xl-2 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 16.66667%; + } + + .col-xl-3 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 25%; + } + + .col-xl-4 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 33.33333%; + } + + .col-xl-5 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 41.66667%; + } + + .col-xl-6 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 50%; + } + + .col-xl-7 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 58.33333%; + } + + .col-xl-8 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 66.66667%; + } - .offset-md-4 { - margin-left: 33.33333% - } + .col-xl-9 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 75%; + } - .offset-md-5 { - margin-left: 41.66667% - } + .col-xl-10 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 83.33333%; + } - .offset-md-6 { - margin-left: 50% - } + .col-xl-11 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 91.66667%; + } - .offset-md-7 { - margin-left: 58.33333% - } + .col-xl-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + float: left; + width: 100%; + } - .offset-md-8 { - margin-left: 66.66667% - } + .pull-xl-0 { + right: auto; + } - .offset-md-9 { - margin-left: 75% - } + .pull-xl-1 { + right: 8.33333%; + } - .offset-md-10 { - margin-left: 83.33333% - } + .pull-xl-2 { + right: 16.66667%; + } - .offset-md-11 { - margin-left: 91.66667% - } -} + .pull-xl-3 { + right: 25%; + } -@media (min-width: 992px) { - .col-lg-1 { - position:relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 8.33333% - } - - .col-lg-2 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 16.66667% - } - - .col-lg-3 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 25% - } - - .col-lg-4 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 33.33333% - } - - .col-lg-5 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 41.66667% - } - - .col-lg-6 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 50% - } - - .col-lg-7 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 58.33333% - } - - .col-lg-8 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 66.66667% - } - - .col-lg-9 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 75% - } - - .col-lg-10 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 83.33333% - } - - .col-lg-11 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 91.66667% - } - - .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 100% - } - - .pull-lg-0 { - right: auto - } - - .pull-lg-1 { - right: 8.33333% - } - - .pull-lg-2 { - right: 16.66667% - } - - .pull-lg-3 { - right: 25% - } - - .pull-lg-4 { - right: 33.33333% - } - - .pull-lg-5 { - right: 41.66667% - } - - .pull-lg-6 { - right: 50% - } - - .pull-lg-7 { - right: 58.33333% - } - - .pull-lg-8 { - right: 66.66667% - } - - .pull-lg-9 { - right: 75% - } - - .pull-lg-10 { - right: 83.33333% - } - - .pull-lg-11 { - right: 91.66667% - } - - .pull-lg-12 { - right: 100% - } - - .push-lg-0 { - left: auto - } - - .push-lg-1 { - left: 8.33333% - } - - .push-lg-2 { - left: 16.66667% - } - - .push-lg-3 { - left: 25% - } - - .push-lg-4 { - left: 33.33333% - } - - .push-lg-5 { - left: 41.66667% - } - - .push-lg-6 { - left: 50% - } - - .push-lg-7 { - left: 58.33333% - } - - .push-lg-8 { - left: 66.66667% - } + .pull-xl-4 { + right: 33.33333%; + } - .push-lg-9 { - left: 75% - } + .pull-xl-5 { + right: 41.66667%; + } - .push-lg-10 { - left: 83.33333% - } + .pull-xl-6 { + right: 50%; + } - .push-lg-11 { - left: 91.66667% - } + .pull-xl-7 { + right: 58.33333%; + } - .push-lg-12 { - left: 100% - } + .pull-xl-8 { + right: 66.66667%; + } - .offset-lg-0 { - margin-left: 0% - } + .pull-xl-9 { + right: 75%; + } - .offset-lg-1 { - margin-left: 8.33333% - } + .pull-xl-10 { + right: 83.33333%; + } - .offset-lg-2 { - margin-left: 16.66667% - } + .pull-xl-11 { + right: 91.66667%; + } - .offset-lg-3 { - margin-left: 25% - } + .pull-xl-12 { + right: 100%; + } - .offset-lg-4 { - margin-left: 33.33333% - } + .push-xl-0 { + left: auto; + } - .offset-lg-5 { - margin-left: 41.66667% - } + .push-xl-1 { + left: 8.33333%; + } - .offset-lg-6 { - margin-left: 50% - } + .push-xl-2 { + left: 16.66667%; + } - .offset-lg-7 { - margin-left: 58.33333% - } + .push-xl-3 { + left: 25%; + } - .offset-lg-8 { - margin-left: 66.66667% - } + .push-xl-4 { + left: 33.33333%; + } - .offset-lg-9 { - margin-left: 75% - } + .push-xl-5 { + left: 41.66667%; + } - .offset-lg-10 { - margin-left: 83.33333% - } + .push-xl-6 { + left: 50%; + } - .offset-lg-11 { - margin-left: 91.66667% - } -} + .push-xl-7 { + left: 58.33333%; + } -@media (min-width: 1300px) { - .col-xl-1 { - position:relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 8.33333% - } - - .col-xl-2 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 16.66667% - } - - .col-xl-3 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 25% - } - - .col-xl-4 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 33.33333% - } - - .col-xl-5 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 41.66667% - } - - .col-xl-6 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 50% - } - - .col-xl-7 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 58.33333% - } - - .col-xl-8 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 66.66667% - } - - .col-xl-9 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 75% - } - - .col-xl-10 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 83.33333% - } - - .col-xl-11 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 91.66667% - } - - .col-xl-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; - float: left; - width: 100% - } - - .pull-xl-0 { - right: auto - } - - .pull-xl-1 { - right: 8.33333% - } - - .pull-xl-2 { - right: 16.66667% - } - - .pull-xl-3 { - right: 25% - } - - .pull-xl-4 { - right: 33.33333% - } - - .pull-xl-5 { - right: 41.66667% - } - - .pull-xl-6 { - right: 50% - } - - .pull-xl-7 { - right: 58.33333% - } - - .pull-xl-8 { - right: 66.66667% - } - - .pull-xl-9 { - right: 75% - } - - .pull-xl-10 { - right: 83.33333% - } - - .pull-xl-11 { - right: 91.66667% - } - - .pull-xl-12 { - right: 100% - } - - .push-xl-0 { - left: auto - } - - .push-xl-1 { - left: 8.33333% - } - - .push-xl-2 { - left: 16.66667% - } - - .push-xl-3 { - left: 25% - } - - .push-xl-4 { - left: 33.33333% - } - - .push-xl-5 { - left: 41.66667% - } - - .push-xl-6 { - left: 50% - } - - .push-xl-7 { - left: 58.33333% - } - - .push-xl-8 { - left: 66.66667% - } + .push-xl-8 { + left: 66.66667%; + } - .push-xl-9 { - left: 75% - } + .push-xl-9 { + left: 75%; + } - .push-xl-10 { - left: 83.33333% - } + .push-xl-10 { + left: 83.33333%; + } - .push-xl-11 { - left: 91.66667% - } + .push-xl-11 { + left: 91.66667%; + } - .push-xl-12 { - left: 100% - } + .push-xl-12 { + left: 100%; + } - .offset-xl-0 { - margin-left: 0% - } + .offset-xl-0 { + margin-left: 0%; + } - .offset-xl-1 { - margin-left: 8.33333% - } + .offset-xl-1 { + margin-left: 8.33333%; + } - .offset-xl-2 { - margin-left: 16.66667% - } + .offset-xl-2 { + margin-left: 16.66667%; + } - .offset-xl-3 { - margin-left: 25% - } + .offset-xl-3 { + margin-left: 25%; + } - .offset-xl-4 { - margin-left: 33.33333% - } + .offset-xl-4 { + margin-left: 33.33333%; + } - .offset-xl-5 { - margin-left: 41.66667% - } + .offset-xl-5 { + margin-left: 41.66667%; + } - .offset-xl-6 { - margin-left: 50% - } + .offset-xl-6 { + margin-left: 50%; + } - .offset-xl-7 { - margin-left: 58.33333% - } + .offset-xl-7 { + margin-left: 58.33333%; + } - .offset-xl-8 { - margin-left: 66.66667% - } + .offset-xl-8 { + margin-left: 66.66667%; + } - .offset-xl-9 { - margin-left: 75% - } + .offset-xl-9 { + margin-left: 75%; + } - .offset-xl-10 { - margin-left: 83.33333% - } + .offset-xl-10 { + margin-left: 83.33333%; + } - .offset-xl-11 { - margin-left: 91.66667% - } + .offset-xl-11 { + margin-left: 91.66667%; + } } .col-pop { - float: right; + float: right; } header { - text-align: center; + text-align: center; } @media (min-width: 900px) { - header { - text-align:left - } + header { + text-align: left; + } } @media (min-width: 900px) { - .site-nav { - margin-top: 35px; - - } + .site-nav { + margin-top: 35px; + } } @media (max-width: 420px) { - .site-nav { - margin-left: -10px; - margin-right: -10px; - } + .site-nav { + margin-left: -10px; + margin-right: -10px; + } } @media (min-width: 900px) { - .site-nav { - float:right; - vertical-align: middle; - } + .site-nav { + float: right; + vertical-align: middle; + } } .btn { - color: #3d3d3e; - text-decoration: none; - display: inline-block; - border: 1px solid #d2d2d2; - border-radius: 3px; - padding: 6px 12px; - font-size: 0.9em; - line-height: 20px; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-appearance: none; - margin-bottom: 6px; + color: #3d3d3e; + text-decoration: none; + display: inline-block; + border: 1px solid #d2d2d2; + border-radius: 3px; + padding: 6px 12px; + font-size: 0.9em; + line-height: 20px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; + margin-bottom: 6px; } .btn:hover { - background: #e6e6e6; + background: #e6e6e6; } -.btn+.btn { - margin-left: 6px; +.btn + .btn { + margin-left: 6px; } .btn.site-nav-item { - padding: 2px 6px; + padding: 2px 6px; } -.btn.site-nav-item+.btn.site-nav-item { - margin-left: 1px; +.btn.site-nav-item + .btn.site-nav-item { + margin-left: 1px; } .btn.btn-primary { - background-color: #48b96c; - border: 1px solid #48b96c; - border: none; - color: #fff; + background-color: #48b96c; + border: 1px solid #48b96c; + border: none; + color: #fff; } .btn.btn-primary:hover { - color: #81f7a6; + color: #81f7a6; } .btn.btn-info { - background-color: #6797e2; - border: 1px solid #6797e2; - border: none; - color: #fff; + background-color: #6797e2; + border: 1px solid #6797e2; + border: none; + color: #fff; } .btn.btn-info:hover { - color: #bfd7ff; + color: #bfd7ff; } -.btn.btn-primary:disabled, .btn.btn-primary:disabled:hover, .btn.btn-primary.disabled, .btn.btn-primary.disabled:hover { - background-color: #a1e6b7; - border: 1px solid #a1e6b7; - color: #fff; +.btn.btn-primary:disabled, +.btn.btn-primary:disabled:hover, +.btn.btn-primary.disabled, +.btn.btn-primary.disabled:hover { + background-color: #a1e6b7; + border: 1px solid #a1e6b7; + color: #fff; } -.btn:disabled, .btn:disabled:hover, .btn.disabled, .btn.disabled:hover { - cursor: default; - color: #adadad; - background-color: #d2d2d2; - border: 1px solid #d2d2d2; - border: none; +.btn:disabled, +.btn:disabled:hover, +.btn.disabled, +.btn.disabled:hover { + cursor: default; + color: #adadad; + background-color: #d2d2d2; + border: 1px solid #d2d2d2; + border: none; } .btn-comment { - padding: 6px 12px; - font-size: 0.9em; - color: #f44336; + padding: 6px 12px; + font-size: 0.9em; + color: #f44336; } .btn-comment a { - text-decoration: underline; + text-decoration: underline; } -.btn-comment.btn-comment-error, .btn-comment.btn-comment-error a { - color: #f44336; +.btn-comment.btn-comment-error, +.btn-comment.btn-comment-error a { + color: #f44336; } .btn-block { - margin-bottom: 1em; + margin-bottom: 1em; } .hide-btn-block { - display: none; + display: none; } .noclick { @@ -1568,463 +1823,477 @@ header { } .side-nav { - } .side-nav-item { - display: list-item; - list-style-type: none; - text-decoration: none; - color: CanvasText; - font-size: 1em; - border-bottom: 1px solid #d2d2d2; - padding-top: 5px; - padding-bottom: 5px; - transition: transform .5s ease; + display: list-item; + list-style-type: none; + text-decoration: none; + color: CanvasText; + font-size: 1em; + border-bottom: 1px solid #d2d2d2; + padding-top: 5px; + padding-bottom: 5px; + transition: transform 0.5s ease; } .side-nav-item:hover { - transform: translateX(5px); + transform: translateX(5px); } .side-title { - text-transform: uppercase; - letter-spacing: 1px; - font-size: 1em; - font-weight: normal; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 1em; + font-weight: normal; } - .site-logo h1 { - text-transform: uppercase; - letter-spacing: 1px; - font-size: 1.25em; - margin: 0px; - font-weight: normal; -} - - .site-logo { - background-image: url("webassembly.svg"); - background-size: 100%; - background-repeat: no-repeat; - background-position: center; - width: 180px; - height: 95px; - float:left; - margin-top: 0px - } + text-transform: uppercase; + letter-spacing: 1px; + font-size: 1.25em; + margin: 0px; + font-weight: normal; +} + +.site-logo { + background-image: url('webassembly.svg'); + background-size: 100%; + background-repeat: no-repeat; + background-position: center; + width: 180px; + height: 95px; + float: left; + margin-top: 0px; +} @media (max-width: 420px) { - .site-logo { - width: 100%; - background-size: 50%; - margin-bottom: 5%; - } + .site-logo { + width: 100%; + background-size: 50%; + margin-bottom: 5%; } -.page-section, section, header { - padding: 12px; +} +.page-section, +section, +header { + padding: 12px; } -.page-section.flush-bottom, section.flush-bottom, header.flush-bottom { - padding-bottom: 0px; +.page-section.flush-bottom, +section.flush-bottom, +header.flush-bottom { + padding-bottom: 0px; } @media (min-width: 900px) { - .page-section, section, header { - padding: 24px - } + .page-section, + section, + header { + padding: 24px; + } } -.page-section.banner-update, section.banner-update { - padding: 12px; +.page-section.banner-update, +section.banner-update { + padding: 12px; } -.page-section .container>*:first-child, .page-section .container-narrow>*:first-child, -section .container>*:first-child, section .container-narrow>*:first-child, -header .container>*:first-child, header .container-narrow>*:first-child, { - margin-top: 0 +.page-section .container > *:first-child, +.page-section .container-narrow > *:first-child, +section .container > *:first-child, +section .container-narrow > *:first-child, +header .container > *:first-child, +header .container-narrow > *:first-child { + margin-top: 0; } .page-section-spacious { - padding: 24px; + padding: 24px; } .page-section-spacious.flush-bottom { - padding-bottom: 0px; + padding-bottom: 0px; } @media (max-width: 420px) { - .page-section-spacious { - padding: 24px 12px; - } + .page-section-spacious { + padding: 24px 12px; + } } @media (min-width: 900px) { - .page-section-spacious { - padding: 36px - } + .page-section-spacious { + padding: 36px; + } } -.page-section hr, section hr, header hr { - margin: 24px 0 +.page-section hr, +section hr, +header hr { + margin: 24px 0; } @media (min-width: 768px) { - .page-section hr, section hr, header hr { - margin:36px 0 - } + .page-section hr, + section hr, + header hr { + margin: 36px 0; + } } @media (min-width: 992px) { - .page-section hr, section hr, header hr { - margin:48px 0 - } + .page-section hr, + section hr, + header hr { + margin: 48px 0; + } } @media (min-width: 1300px) { - .page-section hr, section hr, header hr { - margin:72px 0 - } + .page-section hr, + section hr, + header hr { + margin: 72px 0; + } } header { - background-color: #ebecef; + background-color: #ebecef; } .banner-update { - background-color: #BFD9CC; - color: #030266; + background-color: #bfd9cc; + color: #030266; } .banner-update a { - color: #026635; - text-decoration: none; + color: #026635; + text-decoration: none; } .banner-update a:hover { - text-decoration: underline; + text-decoration: underline; } .flash { - padding: 20px 30px; - border-radius: 4px; - margin-bottom: 16px; - background-color: #ebecef; + padding: 20px 30px; + border-radius: 4px; + margin-bottom: 16px; + background-color: #ebecef; } .flash a { - text-decoration: none; + text-decoration: none; } .flash a:hover { - text-decoration: underline; + text-decoration: underline; } .flash.flash-warn { - color: #000; - background-color: #feffd1; + color: #000; + background-color: #feffd1; } .flash.flash-warn a { - color: #9c8529; + color: #9c8529; } .flash.flash-error { - background-color: #ffcdd2; + background-color: #ffcdd2; } .flash.flash-error a { - color: #f44336; + color: #f44336; } .lead { - font-size: 1.2em; - font-weight: 300; - color: #555; - text-align: center; + font-size: 1.2em; + font-weight: 300; + color: #555; + text-align: center; } @media (prefers-color-scheme: dark) { - .lead { - color: #999; - } + .lead { + color: #999; + } } -.container img, .container-narrow img { - max-width: 100%; +.container img, +.container-narrow img { + max-width: 100%; } /* Syntax highlighting */ .highlight { - background: #fff; - color: #929292 - } - - .highlight .hll { - background-color: #efefef - } - - .highlight .c { - color: #929292 - } - - .highlight .err { - background: #c82829; - color: #fff - } + background: #fff; + color: #929292; +} - .highlight .k { - color: #8959a8 - } +.highlight .hll { + background-color: #efefef; +} - .highlight .l { - color: #f5871f - } +.highlight .c { + color: #929292; +} - .highlight .n { - color: #929292 - } +.highlight .err { + background: #c82829; + color: #fff; +} - .highlight .o { - color: #545454 - } +.highlight .k { + color: #8959a8; +} - .highlight .p { - color: #929292 - } +.highlight .l { + color: #f5871f; +} - .highlight .cm { - color: #929292 - } +.highlight .n { + color: #929292; +} - .highlight .cp { - color: #929292 - } +.highlight .o { + color: #545454; +} - .highlight .c1 { - color: #929292 - } +.highlight .p { + color: #929292; +} - .highlight .cs { - color: #929292 - } +.highlight .cm { + color: #929292; +} - .highlight .cd { - color: #929292 - } +.highlight .cp { + color: #929292; +} - .highlight .gd { - color: #c82829 - } +.highlight .c1 { + color: #929292; +} - .highlight .ge { - font-style: italic - } +.highlight .cs { + color: #929292; +} - .highlight .gh { - color: #545454; - font-weight: bold - } +.highlight .cd { + color: #929292; +} - .highlight .gi { - color: #718c00 - } +.highlight .gd { + color: #c82829; +} - .highlight .gp { - color: #718c00; - font-weight: bold - } +.highlight .ge { + font-style: italic; +} - .highlight .gs { - font-weight: bold - } +.highlight .gh { + color: #545454; + font-weight: bold; +} - .highlight .gu { - color: #3e999f; - font-weight: bold - } +.highlight .gi { + color: #718c00; +} - .highlight .kc { - color: #8959a8 - } +.highlight .gp { + color: #718c00; + font-weight: bold; +} - .highlight .kd { - color: #8959a8 - } +.highlight .gs { + font-weight: bold; +} - .highlight .kn { - color: #3e999f - } +.highlight .gu { + color: #3e999f; + font-weight: bold; +} - .highlight .kp { - color: #4271ae - } +.highlight .kc { + color: #8959a8; +} - .highlight .kr { - color: #8959a8 - } +.highlight .kd { + color: #8959a8; +} - .highlight .kt { - color: #eab700 - } +.highlight .kn { + color: #3e999f; +} - .highlight .ld { - color: #718c00 - } +.highlight .kp { + color: #4271ae; +} - .highlight .m { - color: #f5871f - } +.highlight .kr { + color: #8959a8; +} - .highlight .s { - color: #718c00 - } +.highlight .kt { + color: #eab700; +} - .highlight .na { - color: #4271ae - } +.highlight .ld { + color: #718c00; +} - .highlight .nb { - color: #4271ae - } +.highlight .m { + color: #f5871f; +} - .highlight .nc { - color: #eab700 - } +.highlight .s { + color: #718c00; +} - .highlight .no { - color: #eab700 - } +.highlight .na { + color: #4271ae; +} - .highlight .nd { - color: #3e999f - } +.highlight .nb { + color: #4271ae; +} - .highlight .ni { - color: #545454 - } +.highlight .nc { + color: #eab700; +} - .highlight .ne { - color: #c82829 - } +.highlight .no { + color: #eab700; +} - .highlight .nf { - color: #4271ae - } +.highlight .nd { + color: #3e999f; +} - .highlight .nl { - color: #545454 - } +.highlight .ni { + color: #545454; +} - .highlight .nn { - color: #eab700 - } +.highlight .ne { + color: #c82829; +} - .highlight .nx { - color: #4271ae - } +.highlight .nf { + color: #4271ae; +} - .highlight .py { - color: #545454 - } +.highlight .nl { + color: #545454; +} - .highlight .nt { - color: #3e999f - } +.highlight .nn { + color: #eab700; +} - .highlight .nv { - color: #c82829 - } +.highlight .nx { + color: #4271ae; +} - .highlight .ow { - color: #3e999f - } +.highlight .py { + color: #545454; +} - .highlight .w { - color: #545454 - } +.highlight .nt { + color: #3e999f; +} - .highlight .mf { - color: #f5871f - } +.highlight .nv { + color: #c82829; +} - .highlight .mh { - color: #f5871f - } +.highlight .ow { + color: #3e999f; +} - .highlight .mi { - color: #f5871f - } +.highlight .w { + color: #545454; +} - .highlight .mo { - color: #f5871f - } +.highlight .mf { + color: #f5871f; +} - .highlight .sb { - color: #718c00 - } +.highlight .mh { + color: #f5871f; +} - .highlight .sc { - color: #545454 - } +.highlight .mi { + color: #f5871f; +} - .highlight .sd { - color: #929292 - } +.highlight .mo { + color: #f5871f; +} - .highlight .s2 { - color: #718c00 - } +.highlight .sb { + color: #718c00; +} - .highlight .se { - color: #f5871f - } +.highlight .sc { + color: #545454; +} - .highlight .sh { - color: #718c00 - } +.highlight .sd { + color: #929292; +} - .highlight .si { - color: #f5871f - } +.highlight .s2 { + color: #718c00; +} - .highlight .sx { - color: #718c00 - } +.highlight .se { + color: #f5871f; +} - .highlight .sr { - color: #718c00 - } +.highlight .sh { + color: #718c00; +} - .highlight .s1 { - color: #718c00 - } +.highlight .si { + color: #f5871f; +} - .highlight .ss { - color: #718c00 - } +.highlight .sx { + color: #718c00; +} - .highlight .bp { - color: #545454 - } +.highlight .sr { + color: #718c00; +} - .highlight .vc { - color: #c82829 - } +.highlight .s1 { + color: #718c00; +} - .highlight .vg { - color: #c82829 - } +.highlight .ss { + color: #718c00; +} - .highlight .vi { - color: #c82829 - } +.highlight .bp { + color: #545454; +} - .highlight .il { - color: #f5871f - } +.highlight .vc { + color: #c82829; +} +.highlight .vg { + color: #c82829; +} +.highlight .vi { + color: #c82829; +} +.highlight .il { + color: #f5871f; +} /* replace w github */ @@ -2033,26 +2302,33 @@ table { border-collapse: collapse; } -td, th { +td, +th { padding: 0; } -ul, ol { +ul, +ol { padding-left: 0; margin-top: 0; margin-bottom: 0; } -ol ol, ul ol { +ol ol, +ul ol { list-style-type: lower-roman; } -ul ul ol, ul ol ol, ol ul ol, ol ol ol { +ul ul ol, +ul ol ol, +ol ul ol, +ol ol ol { list-style-type: lower-alpha; } code { - font-family: ui-monospace, Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-family: ui-monospace, Consolas, 'Liberation Mono', Menlo, Courier, + monospace; font-size: 1em; } @@ -2060,7 +2336,8 @@ pre { margin-top: 0; margin-bottom: 0; font-size: 1em; - font-family: ui-monospace, Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-family: ui-monospace, Consolas, 'Liberation Mono', Menlo, Courier, + monospace; } .octicon { @@ -2083,7 +2360,13 @@ input { outline: none; } -p, blockquote, ul, ol, dl, table, pre { +p, +blockquote, +ul, +ol, +dl, +table, +pre { margin-top: 0; margin-bottom: 16px; } @@ -2091,24 +2374,29 @@ p, blockquote, ul, ol, dl, table, pre { blockquote { padding: 0 1em; color: #777; - border-left: .25em solid #ddd; + border-left: 0.25em solid #ddd; } @media (prefers-color-scheme: dark) { - blockquote { - color: #999; - } + blockquote { + color: #999; + } } -blockquote>:first-child { +blockquote > :first-child { margin-top: 0; } -blockquote>:last-child { +blockquote > :last-child { margin-bottom: 0; } -h1, h2, h3, h4, h5, h6 { +h1, +h2, +h3, +h4, +h5, +h6 { margin-top: 24px; margin-bottom: 16px; font-weight: 600; @@ -2141,26 +2429,30 @@ h6 { } @media (prefers-color-scheme: dark) { - h6 { - color: #999; - } + h6 { + color: #999; + } } -ul, ol { +ul, +ol { padding-left: 2em; } -ul ul, ul ol, ol ol, ol ul { +ul ul, +ul ol, +ol ol, +ol ul { margin-top: 0; margin-bottom: 0; } -li>p { +li > p { margin-top: 16px; } -li+li { - margin-top: .25em; +li + li { + margin-top: 0.25em; } dl { @@ -2191,7 +2483,8 @@ table th { font-weight: bold; } -table th, table td { +table th, +table td { padding: 6px 11px; border: 1px solid #ddd; } @@ -2207,24 +2500,25 @@ table tr:nth-child(2n) { code { padding: 0; - padding-top: .2em; - padding-bottom: .2em; + padding-top: 0.2em; + padding-bottom: 0.2em; margin: 0; font-size: 0.85em; background-color: rgba(0, 0, 0, 0.04); border-radius: 3px; } -code::before, code::after { - letter-spacing: -.2em; - content: "\00a0"; +code::before, +code::after { + letter-spacing: -0.2em; + content: '\00a0'; } pre { word-wrap: normal; } -pre>code { +pre > code { padding: 0; margin: 0; font-size: 100%; @@ -2255,7 +2549,8 @@ pre code { border: 0; } -pre code::before, pre code::after { +pre code::before, +pre code::after { content: normal; } @@ -2270,7 +2565,7 @@ pre code::before, pre code::after { margin: 0; } -#feature-support>caption { +#feature-support > caption { text-align: left; } @@ -2278,11 +2573,11 @@ pre code::before, pre code::after { padding-left: 1pt; } -#feature-support tr>* { +#feature-support tr > * { text-align: center; } -#feature-support tr:first-child>th { +#feature-support tr:first-child > th { vertical-align: bottom; white-space: normal; } @@ -2296,8 +2591,10 @@ pre code::before, pre code::after { position: relative; /* for tooltip */ } -#feature-support td:hover, #feature-support td:focus, #feature-support td:focus-within { - background: rgba(0, 0, 0, .04); +#feature-support td:hover, +#feature-support td:focus, +#feature-support td:focus-within { + background: rgba(0, 0, 0, 0.04); } .feature-cell { @@ -2309,7 +2606,7 @@ pre code::before, pre code::after { .feature-cell > sup { font-size: 0.7em; position: absolute; - top: .2em; + top: 0.2em; } .feature-cell > svg { @@ -2318,11 +2615,11 @@ pre code::before, pre code::after { } .feature-cell.icon-yes { - color: #1B5E20; + color: #1b5e20; } .feature-cell.icon-yes > svg .svg-stroke { - fill: #1B5E20; + fill: #1b5e20; } .feature-cell.icon-no { @@ -2342,11 +2639,11 @@ pre code::before, pre code::after { } .feature-cell.icon-na { - color: #78909C; + color: #78909c; } .feature-cell.icon-unknown > svg .svg-stroke { - fill: #78909C; + fill: #78909c; } #feature-support-scrollbox + ol { @@ -2356,11 +2653,11 @@ pre code::before, pre code::after { } #feature-support-scrollbox + ol > li { - transition: background-color .08s ease-in-out; + transition: background-color 0.08s ease-in-out; } #feature-support-scrollbox + ol .ref-highlight { - background: #ECEFF1; + background: #eceff1; } .feature-tooltip { @@ -2384,14 +2681,15 @@ pre code::before, pre code::after { /* Only apply transition after the initial position was set */ .feature-tooltip[data-placement] { - transition: transform .2s ease-in-out; + transition: transform 0.2s ease-in-out; } -.feature-tooltip, .feature-tooltip-arrow { +.feature-tooltip, +.feature-tooltip-arrow { position: absolute; contain: layout style; --shadow-size: 3px; - box-shadow: 0 0 var(--shadow-size) rgba(0, 0, 0, .30); + box-shadow: 0 0 var(--shadow-size) rgba(0, 0, 0, 0.3); } .feature-tooltip-arrow { @@ -2402,10 +2700,26 @@ pre code::before, pre code::after { --c0: calc(var(--shadow-size) * -1); --c1: calc(100% + var(--shadow-size)); - clip-path: polygon(var(--c0) var(--c1), var(--c0) var(--c0), var(--c1) var(--c0)); + clip-path: polygon( + var(--c0) var(--c1), + var(--c0) var(--c0), + var(--c1) var(--c0) + ); } -[data-placement="top"] > .feature-tooltip-arrow { bottom: 0; transform: translateY(50%) rotate(-135deg); } -[data-placement="bottom"] > .feature-tooltip-arrow { top: 0; transform: translateY(-50%) rotate(45deg); } -[data-placement="left"] > .feature-tooltip-arrow { right: 0; transform: translateX(50%) rotate(135deg); } -[data-placement="right"] > .feature-tooltip-arrow { left: 0; transform: translateX(-50%) rotate(-45deg); } +[data-placement='top'] > .feature-tooltip-arrow { + bottom: 0; + transform: translateY(50%) rotate(-135deg); +} +[data-placement='bottom'] > .feature-tooltip-arrow { + top: 0; + transform: translateY(-50%) rotate(45deg); +} +[data-placement='left'] > .feature-tooltip-arrow { + right: 0; + transform: translateX(50%) rotate(135deg); +} +[data-placement='right'] > .feature-tooltip-arrow { + left: 0; + transform: translateX(-50%) rotate(-45deg); +} diff --git a/features.js b/features.js index 37ea87ac..b8c3a7ef 100644 --- a/features.js +++ b/features.js @@ -19,14 +19,20 @@ // Map names to HTML ids. For example, idMap['table-col']('Chrome') will return 'table-col-chrome'. // This is to satisfy the need for unique ids in `headers` attributes. // Hardcoded array makes it easier to find typos, since it would throw an error if the namespace is mistyped. - const idMap = ['table-group', 'table-col', 'table-row'].reduce((map, namespace) => { - map[namespace] = (str) => namespace + '-' + str.toLowerCase().replace(/[^\w\d-_]+/g, '-'); - return map; - }, {}); + const idMap = ['table-group', 'table-col', 'table-row'].reduce( + (map, namespace) => { + map[namespace] = (str) => + namespace + '-' + str.toLowerCase().replace(/[^\w\d-_]+/g, '-'); + return map; + }, + {} + ); // Get a copy of the requested SVG icon. Those are defined in the markdown as templates. function icon(key) { - return document.getElementById(`support-symbol-${key}`).content.firstElementChild.cloneNode(true); + return document + .getElementById(`support-symbol-${key}`) + .content.firstElementChild.cloneNode(true); } const scrollbox = document.getElementById('feature-support-scrollbox'); @@ -37,26 +43,28 @@ const { features, browsers } = await fetch('/features.json', { credentials: 'include', // https://stackoverflow.com/a/63814972 - mode: 'no-cors' - }).then(res => res.json()); + mode: 'no-cors', + }).then((res) => res.json()); const tBody = document.createElement('tbody'); table.append( h('thead', {}, [ h('tr', {}, [ h('th', { id: 'table-blank' }), - h('th', { scope: 'col', id: idMap['table-col']('Your browser') }, ['Your browser']), + h('th', { scope: 'col', id: idMap['table-col']('Your browser') }, [ + 'Your browser', + ]), ...Object.entries(browsers).map(([name, { url, logo }]) => h('th', { scope: 'col', id: idMap['table-col'](name) }, [ h('a', { href: url, target: '_blank' }, [ // https://www.w3.org/WAI/WCAG22/Techniques/html/H2 h('img', { src: logo, width: 48, height: 32, alt: '' }), h('br'), - name - ]) + name, + ]), ]) - ) - ]) + ), + ]), ]), tBody ); @@ -75,36 +83,44 @@ * * This was introduced because of https://github.com/GoogleChromeLabs/wasm-feature-detect/issues/82. */ - Object.groupBy ??= function groupBy (iterable, callbackfn) { - const obj = Object.create(null) - let i = 0 + Object.groupBy ??= function groupBy(iterable, callbackfn) { + const obj = Object.create(null); + let i = 0; for (const value of iterable) { - const key = callbackfn(value, i++) - key in obj ? obj[key].push(value) : (obj[key] = [value]) + const key = callbackfn(value, i++); + key in obj ? obj[key].push(value) : (obj[key] = [value]); } - return obj - } + return obj; + }; let featureGroups = Object.groupBy( - Object.entries(features).map(([name, feature]) => Object.assign(feature, { name })), - f => f.phase, + Object.entries(features).map(([name, feature]) => + Object.assign(feature, { name }) + ), + (f) => f.phase ); featureGroups = [ - { name: 'Phase 5 - The Feature is Standardized', features: featureGroups[5] }, + { + name: 'Phase 5 - The Feature is Standardized', + features: featureGroups[5], + }, { name: 'Phase 4 - Standardize the Feature', features: featureGroups[4] }, { name: 'Phase 3 - Implementation Phase', features: featureGroups[3] }, - { name: 'Phase 2 - Proposed Spec Text Available', features: featureGroups[2] }, + { + name: 'Phase 2 - Proposed Spec Text Available', + features: featureGroups[2], + }, { name: 'Phase 1 - Feature Proposal', features: featureGroups[1] }, - { name: 'Deprecated', features: featureGroups["deprecated"] }, + { name: 'Deprecated', features: featureGroups['deprecated'] }, ]; // Collect all notes and assign an index to each unique item // { "First unique note": 0, "Second unique note": 1, ...} - const notes = Object.values(browsers).flatMap(b => + const notes = Object.values(browsers).flatMap((b) => Object.values(b.features) - .filter(s => Array.isArray(s)) - .map(s => s[1]) + .filter((s) => Array.isArray(s)) + .map((s) => s[1]) ); const note2index = new Map(); let noteIndex = 0; @@ -139,43 +155,68 @@ tBody.append( h('tr', {}, [ - h('th', { - scope: 'colgroup', - colSpan: columnCount, - id: idMap['table-group'](groupName), - headers: 'table-blank', - // Chrome doesn't handle `headers` attribute correctly. - // Just hide the group headers for now... - // https://bugs.chromium.org/p/chromium/issues/detail?id=1081201 - // - // Actually Firefox doesn't support `ariaHidden` attribute. - // This is a happy coincidence, since `headers` works fine on Firefox anyway. - ariaHidden: true - }, [groupName]) + h( + 'th', + { + scope: 'colgroup', + colSpan: columnCount, + id: idMap['table-group'](groupName), + headers: 'table-blank', + // Chrome doesn't handle `headers` attribute correctly. + // Just hide the group headers for now... + // https://bugs.chromium.org/p/chromium/issues/detail?id=1081201 + // + // Actually Firefox doesn't support `ariaHidden` attribute. + // This is a happy coincidence, since `headers` works fine on Firefox anyway. + ariaHidden: true, + }, + [groupName] + ), ]) ); for (const { name: featName, description, url } of features) { - const detectResult = h('td', { - headers: [idMap['table-col']('Your browser'), idMap['table-row'](featName)].join(' ') - }, [buildCellInner('loading')]); - - detectWasmFeature(featName).then(supported => { - detectResult.textContent = ''; - detectResult.appendChild(buildCellInner(supported ? 'yes' : 'no')); - addTooltip(detectResult, supported ? '✓ Supported' : '✗ Not supported', [tBody, scrollbox]); - }, _err => { - detectResult.textContent = ''; - detectResult.appendChild(buildCellInner('unknown')); - addTooltip(detectResult, 'Detection unavailable for this feature', [tBody, scrollbox]); - }); + const detectResult = h( + 'td', + { + headers: [ + idMap['table-col']('Your browser'), + idMap['table-row'](featName), + ].join(' '), + }, + [buildCellInner('loading')] + ); + + detectWasmFeature(featName).then( + (supported) => { + detectResult.textContent = ''; + detectResult.appendChild(buildCellInner(supported ? 'yes' : 'no')); + addTooltip( + detectResult, + supported ? '✓ Supported' : '✗ Not supported', + [tBody, scrollbox] + ); + }, + (_err) => { + detectResult.textContent = ''; + detectResult.appendChild(buildCellInner('unknown')); + addTooltip(detectResult, 'Detection unavailable for this feature', [ + tBody, + scrollbox, + ]); + } + ); tBody.append( h('tr', {}, [ - h('th', { - scope: 'row', - id: idMap['table-row'](featName), - headers: idMap['table-group'](groupName) - }, [h('a', { href: url, target: '_blank' }, [description])]), + h( + 'th', + { + scope: 'row', + id: idMap['table-row'](featName), + headers: idMap['table-group'](groupName), + }, + [h('a', { href: url, target: '_blank' }, [description])] + ), detectResult, ...Object.entries(browsers).map(([browserName, { features }]) => { // Meaning of each entry: @@ -222,9 +263,16 @@ note ||= '✓ Supported, introduced in unknown version'; } - const cell = h('td', { - headers: [idMap['table-col'](browserName), idMap['table-row'](featName)].join(' ') - }, [box]); + const cell = h( + 'td', + { + headers: [ + idMap['table-col'](browserName), + idMap['table-row'](featName), + ].join(' '), + }, + [box] + ); // Give the cell itself an `aria-lebel` to avoid screen readers calling it "empty cell". const icon = box.firstElementChild; @@ -234,15 +282,19 @@ } if (note && note2index.has(note)) { - cell.tabIndex = 0; // focusable + cell.tabIndex = 0; // focusable const index = note2index.get(note); const [noteId, refLink] = createNoteRef(index); box.appendChild(h('sup', {}, [refLink])); const noteItem = document.getElementById(noteId); if (noteItem) { - cell.addEventListener('mouseenter', () => noteItem.classList.add('ref-highlight')); - cell.addEventListener('mouseleave', () => noteItem.classList.remove('ref-highlight')); + cell.addEventListener('mouseenter', () => + noteItem.classList.add('ref-highlight') + ); + cell.addEventListener('mouseleave', () => + noteItem.classList.remove('ref-highlight') + ); } } @@ -251,16 +303,19 @@ // the latter is to keep the tooltip inside the scrollable area addTooltip(cell, note, [tBody, scrollbox]); return cell; - }) + }), ]) ); - tBody.lastElementChild.setAttribute('aria-describedby', idMap['table-row'](featName)); + tBody.lastElementChild.setAttribute( + 'aria-describedby', + idMap['table-row'](featName) + ); } } function buildCellInner(type, text) { const content = text || icon(type); - return h('div', { className: `feature-cell icon-${type}`}, [content]); + return h('div', { className: `feature-cell icon-${type}` }, [content]); } function renderNote(note) { @@ -292,10 +347,16 @@ } if (isMissingData) { - fragment.appendChild(h('a', { - href: 'https://github.com/WebAssembly/website/blob/master/features.json', - target: '_blank' - }, [' (contribute data)'])) + fragment.appendChild( + h( + 'a', + { + href: 'https://github.com/WebAssembly/website/blob/master/features.json', + target: '_blank', + }, + [' (contribute data)'] + ) + ); } return fragment; @@ -311,17 +372,21 @@ const tail = str.substring(end + 1); return [head, body, tail]; } - return [str, '', ''] + return [str, '', '']; } // Lazy-loading function _loadTooltipModule() { // Be sure to change the preloads in markdown when updating url. // The ESM bundle of this package doesn't work with unpkg.com. - const module = import('https://cdn.jsdelivr.net/npm/@floating-ui/dom@1/+esm'); + const module = import( + 'https://cdn.jsdelivr.net/npm/@floating-ui/dom@1/+esm' + ); const subscribers = new Set(); - const updateAll = () => { for (const fn of subscribers) fn(); }; + const updateAll = () => { + for (const fn of subscribers) fn(); + }; document.addEventListener('scroll', updateAll, { passive: true }); scrollbox.addEventListener('scroll', updateAll, { passive: true }); @@ -331,34 +396,39 @@ return (reference, note, boundary) => module.then(({ computePosition, offset, flip, shift, arrow }) => { const tooltipId = `tooltip-${counter++}`; - const tooltip = h('div', { id: tooltipId, className: 'feature-tooltip', role: 'tooltip' }); + const tooltip = h('div', { + id: tooltipId, + className: 'feature-tooltip', + role: 'tooltip', + }); tooltip.appendChild(renderNote(note)); const arrowElement = h('div', { className: 'feature-tooltip-arrow' }); tooltip.appendChild(arrowElement); - const update = () => computePosition(reference, tooltip, { - placement: 'top', - middleware: [ - offset(6), - flip({ boundary }), - shift({ padding: 6, boundary }), - arrow({ element: arrowElement, padding: 3, boundary }) - ], - }).then(({ x, y, placement, middlewareData }) => { - const { x: arrowX, y: arrowY } = middlewareData.arrow; - Object.assign(arrowElement.style, { - left: arrowX !== null ? `${arrowX}px` : '', - top: arrowY !== null ? `${arrowY}px` : '', + const update = () => + computePosition(reference, tooltip, { + placement: 'top', + middleware: [ + offset(6), + flip({ boundary }), + shift({ padding: 6, boundary }), + arrow({ element: arrowElement, padding: 3, boundary }), + ], + }).then(({ x, y, placement, middlewareData }) => { + const { x: arrowX, y: arrowY } = middlewareData.arrow; + Object.assign(arrowElement.style, { + left: arrowX !== null ? `${arrowX}px` : '', + top: arrowY !== null ? `${arrowY}px` : '', + }); + + tooltip.style.transform = `translate(${x}px, ${y}px)`; + // Force the browser to apply CSS changes first + if (tooltip.dataset.placement !== placement) tooltip.offsetHeight; + // This will then enable the transition effect + tooltip.dataset.placement = placement; }); - tooltip.style.transform = `translate(${x}px, ${y}px)`; - // Force the browser to apply CSS changes first - if (tooltip.dataset.placement !== placement) tooltip.offsetHeight; - // This will then enable the transition effect - tooltip.dataset.placement = placement; - }); - const setVisible = (visible) => { if (visible) { tooltip.style.removeProperty('display'); @@ -374,7 +444,7 @@ setVisible(false); const monitor = (name, state, listener = () => setVisible(state)) => - reference.addEventListener(name, listener); + reference.addEventListener(name, listener); monitor('focusin', true); monitor('focusout', false); @@ -404,8 +474,10 @@ // Please cache bust by bumping the `v` parameter whenever `feature.json` is // updated to depend on a new version of the library. See #353 for discussion. // Make sure to also match the preload link in `features.md`. - const module = import('https://unpkg.com/wasm-feature-detect@1/dist/esm/index.js?v=1'); - return (featureName) => module - .then(wasmFeatureDetect => wasmFeatureDetect[featureName]()); + const module = import( + 'https://unpkg.com/wasm-feature-detect@1/dist/esm/index.js?v=1' + ); + return (featureName) => + module.then((wasmFeatureDetect) => wasmFeatureDetect[featureName]()); } })(); diff --git a/features.json b/features.json index bc325732..7b0f2ca2 100644 --- a/features.json +++ b/features.json @@ -1,400 +1,499 @@ { - "$schema": "./features.schema.json", - "features": { - "bigInt": { - "description": "JS BigInt to Wasm i64 Integration", - "url": "https://github.com/WebAssembly/JS-BigInt-integration", - "phase": 5 - }, - "branchHinting": { - "description": "Branch Hinting", - "url": "https://github.com/WebAssembly/branch-hinting/blob/master/proposals/branch-hinting/Overview.md", - "phase": 5 - }, - "bulkMemory": { - "description": "Bulk Memory Operations", - "url": "https://github.com/WebAssembly/bulk-memory-operations/blob/master/proposals/bulk-memory-operations/Overview.md", - "phase": 5 - }, - "customAnnotationSyntaxInTheTextFormat": { - "description": "Custom Text Format Annotations", - "url": "https://github.com/WebAssembly/annotations/blob/main/proposals/annotations/Overview.md", - "phase": 5 - }, - "customPageSizes": { - "description": "Custom Page Sizes", - "url": "https://github.com/WebAssembly/custom-page-sizes/blob/main/proposals/custom-page-sizes/Overview.md", - "phase": 2 - }, - "esmIntegration": { - "description": "ESM Integration", - "url": "https://github.com/WebAssembly/esm-integration", - "phase": 3 - }, - "exceptionsFinal": { - "description": "Exception Handling with exnref", - "url": "https://github.com/WebAssembly/exception-handling/blob/master/proposals/exception-handling/Exceptions.md", - "phase": 4 - }, - "exceptions": { - "description": "Legacy Exception Handling", - "url": "https://github.com/WebAssembly/exception-handling/blob/master/proposals/exception-handling/legacy/Exceptions.md", - "phase": "deprecated" - }, - "extendedConst": { - "description": "Extended Constant Expressions", - "url": "https://github.com/WebAssembly/extended-const/blob/master/proposals/extended-const/Overview.md", - "phase": 5 - }, - "gc": { - "description": "Garbage Collection", - "url":"https://github.com/WebAssembly/gc", - "phase": 5 - }, - "instrumentAndTracingTechnology": { - "description": "Instrument and Tracing Technology", - "url": "https://github.com/WebAssembly/instrument-tracing/blob/main/proposals/instrument-tracing/Overview.md", - "phase": 2 - }, - "jspi": { - "description": "JS Promise Integration", - "url":"https://github.com/WebAssembly/js-promise-integration", - "phase": 3 - }, - "jsStringBuiltins": { - "description": "JS String Builtins", - "url": "https://github.com/WebAssembly/js-string-builtins/blob/main/proposals/js-string-builtins/Overview.md", - "phase": 4 - }, - "memory64": { - "description": "Memory64", - "url": "https://github.com/WebAssembly/memory64/blob/master/proposals/memory64/Overview.md", - "phase": 4 - }, - "multiMemory": { - "description": "Multiple Memories", - "url": "https://github.com/WebAssembly/multi-memory/blob/master/proposals/multi-memory/Overview.md", - "phase": 5 - }, - "multiValue": { - "description": "Multi-value", - "url": "https://github.com/WebAssembly/spec/blob/master/proposals/multi-value/Overview.md", - "phase": 5 - }, - "mutableGlobals": { - "description": "Import/Export of Mutable Globals", - "url": "https://github.com/WebAssembly/mutable-global/blob/master/proposals/mutable-global/Overview.md", - "phase": 5 - }, - "referenceTypes": { - "description": "Reference Types", - "url": "https://github.com/WebAssembly/reference-types/blob/master/proposals/reference-types/Overview.md", - "phase": 5 - }, - "relaxedSimd": { - "description": "Relaxed SIMD", - "url": "https://github.com/WebAssembly/relaxed-simd/tree/main/proposals/relaxed-simd", - "phase": 5 - }, - "saturatedFloatToInt": { - "description": "Non-trapping float-to-int Conversions", - "url": "https://github.com/WebAssembly/spec/blob/master/proposals/nontrapping-float-to-int-conversion/Overview.md", - "phase": 5 - }, - "signExtensions": { - "description": "Sign-extension Operators", - "url": "https://github.com/WebAssembly/spec/blob/master/proposals/sign-extension-ops/Overview.md", - "phase": 5 - }, - "simd": { - "description": "Fixed-width SIMD", - "url": "https://github.com/WebAssembly/simd/blob/master/proposals/simd/SIMD.md", - "phase": 5 - }, - "stackSwitching": { - "description": "Stack Switching", - "url": "https://github.com/WebAssembly/stack-switching", - "phase": 2 - }, - "tailCall": { - "description": "Tail Call", - "url": "https://github.com/WebAssembly/tail-call/blob/master/proposals/tail-call/Overview.md", - "phase": 5 - }, - "threads": { - "description": "Threads", - "url": "https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md", - "phase": 4 - }, - "typedFunctionReferences": { - "description": "Typed Function References", - "url": "https://github.com/WebAssembly/function-references/blob/main/proposals/function-references/Overview.md", - "phase": 5 - }, - "typeReflection": { - "description": "Type Reflection for JS API", - "url": "https://github.com/WebAssembly/js-types/blob/main/proposals/js-types/Overview.md", - "phase": 3 - }, - "webContentSecurityPolicy": { - "description": "Web Content Security Policy", - "url": "https://github.com/WebAssembly/content-security-policy/blob/main/proposals/CSP.md", - "phase": 3 - }, - "wideArithmetic": { - "description": "Wide Arithmetic", - "url": "https://github.com/WebAssembly/wide-arithmetic/blob/main/proposals/wide-arithmetic/Overview.md", - "phase": 2 - } - }, - "browsers": { - "Chrome": { - "url": "https://www.google.com/chrome/", - "logo": "/images/chrome.svg", - "features": { - "bigInt": "85", - "branchHinting": ["flag", "Requires CLI flag `--js-flags=--experimental-wasm-branch-hinting`"], - "bulkMemory": "75", - "customAnnotationSyntaxInTheTextFormat": null, - "exceptionsFinal": ["flag", "Requires flag `chrome://flags/#enable-experimental-webassembly-features`"], - "exceptions": "95", - "extendedConst": "114", - "gc": "119", - "instrumentAndTracingTechnology": ["flag", "Requires CLI flag `--js-flags=--experimental-wasm-instruction-tracing`"], - "jspi": ["flag", "Requires flag `chrome://flags/#enable-experimental-webassembly-jspi`"], - "jsStringBuiltins": "130", - "memory64": "133", - "multiMemory": "120", - "multiValue": "85", - "mutableGlobals": "74", - "referenceTypes": "96", - "relaxedSimd": "114", - "saturatedFloatToInt": "75", - "signExtensions": "74", - "simd": "91", - "stackSwitching": ["flag", "Requires CLI flag `--js-flags=--experimental-wasm-stack-switching`"], - "tailCall": "112", - "threads": "74", - "typedFunctionReferences": "119", - "typeReflection": ["flag", "Requires flag `chrome://flags/#enable-experimental-webassembly-features`"], - "webContentSecurityPolicy": "97" - } - }, - "Firefox": { - "url": "https://www.mozilla.org/firefox/", - "logo": "/images/firefox.svg", - "features": { - "bigInt": "78", - "branchHinting": ["flag", "Enabled in Nightly, requires flag `javascript.options.wasm_branch_hinting` in Beta/Release"], - "bulkMemory": "79", - "customAnnotationSyntaxInTheTextFormat": null, - "exceptionsFinal": "131", - "exceptions": "100", - "extendedConst": "112", - "gc": "120", - "jspi": ["flag", "Requires flag `javascript.options.wasm_js_promise_integration`"], - "jsStringBuiltins": ["flag", "Requires flag `javascript.options.wasm_js_string_builtins`"], - "memory64": "134", - "multiMemory": "125", - "multiValue": "78", - "mutableGlobals": "61", - "referenceTypes": "79", - "relaxedSimd": ["flag", "Enabled in Nightly, requires flag `javascript.options.wasm_relaxed_simd` in Beta/Release"], - "saturatedFloatToInt": "64", - "signExtensions": "62", - "simd": "89", - "tailCall": "121", - "threads": "79", - "typedFunctionReferences": "120", - "typeReflection": ["flag", "Enabled in Nightly, requires flag `--enable-wasm-type-reflections` in Beta/Release"], - "webContentSecurityPolicy": "102" - } - }, - "Safari": { - "url": "https://www.apple.com/safari/", - "logo": "/images/safari.svg", - "features": { - "bigInt": ["15", "wasm-bigint is supported in desktop Safari since 14.1 and iOS Safari since 14.5; however BigInt64Array, which is needed by Emscripten, was released in 15"], - "branchHinting": "16", - "bulkMemory": "15", - "customAnnotationSyntaxInTheTextFormat": null, - "exceptionsFinal": ["flag", "Supported in Safari Technology Preview 205"], - "exceptions": "15.2", - "extendedConst": "17.4", - "gc": "18.2", - "multiValue": "13.1", - "mutableGlobals": "12", - "referenceTypes": "15", - "relaxedSimd": ["flag", "Requires JavaScriptCore flag `useWebAssemblyRelaxedSIMD`"], - "saturatedFloatToInt": "15", - "signExtensions": ["14.1", "Supported in desktop Safari since 14.1 and iOS Safari since 14.5"], - "simd": "16.4", - "tailCall": "18.2", - "threads": ["14.1", "Supported in desktop Safari since 14.1 and iOS Safari since 14.5"], - "typedFunctionReferences": "18", - "typeReflection": ["flag", "Supported in Safari 18.2, only supports `WebAssembly.Module.imports` and `WebAssembly.Module.exports`"], - "webContentSecurityPolicy": "16" - } - }, - "Node.js": { - "url": "https://nodejs.org/", - "logo": "/images/nodejs.svg", - "features": { - "bigInt": "15.0", - "branchHinting": ["flag", "Requires flag `--experimental-wasm-branch-hinting`"], - "bulkMemory": "12.5", - "customAnnotationSyntaxInTheTextFormat": null, - "exceptionsFinal": ["flag", "Requires flag `--experimental-wasm-exnref`"], - "exceptions": "17.0", - "extendedConst": "21.0", - "gc": "22.0", - "instrumentAndTracingTechnology": ["flag", "Requires flag `--experimental-wasm-instruction-tracing`"], - "jspi": ["flag", "Requires flag `--experimental-wasm-jspi`"], - "jsStringBuiltins": ["flag", "Requires flag `--experimental-wasm-imported-strings`"], - "memory64": ["flag", "Requires flag `--experimental-wasm-memory64`"], - "multiMemory": "22.0", - "multiValue": "15.0", - "mutableGlobals": "12.0", - "referenceTypes": "17.2", - "relaxedSimd": "21.0", - "saturatedFloatToInt": "12.5", - "signExtensions": "12.0", - "simd": "16.4", - "stackSwitching": ["flag", "Requires flag `--experimental-wasm-stack-switching`"], - "tailCall": "20.0", - "threads": "16.4", - "typedFunctionReferences": "22.0", - "typeReflection": ["flag", "Requires flag `--experimental-wasm-type-reflection`"], - "webContentSecurityPolicy": null - } - }, - "Deno": { - "url": "https://deno.land/", - "logo": "/images/deno.svg", - "features": { - "bigInt": "1.1.2", - "branchHinting": ["flag", "Requires flag `--v8-flags=--experimental-wasm-branch-hinting`"], - "bulkMemory": "0.4", - "customAnnotationSyntaxInTheTextFormat": null, - "exceptionsFinal": ["flag", "Requires flag `--v8-flags=--experimental-wasm-exnref`"], - "exceptions": "1.16", - "extendedConst": "1.33", - "gc": "1.38", - "instrumentAndTracingTechnology": ["flag", "Requires flag `--v8-flags=--experimental-wasm-instruction-tracing`"], - "jspi": ["flag", "Requires flag `--v8-flags=--experimental-wasm-jspi`"], - "jsStringBuiltins": ["flag", "Requires flag `--v8-flags=--experimental-wasm-imported-strings`"], - "memory64": ["flag", "Requires flag `--v8-flags=--experimental-wasm-memory64`"], - "multiMemory": "1.38", - "multiValue": "1.3.2", - "mutableGlobals": "0.1", - "referenceTypes": "1.16", - "relaxedSimd": "1.33", - "saturatedFloatToInt": "0.4", - "signExtensions": "0.1", - "simd": "1.9", - "stackSwitching": ["flag", "Requires flag `--v8-flags=--experimental-wasm-stack-switching`"], - "tailCall": "1.32", - "threads": "1.9", - "typedFunctionReferences": "1.38", - "typeReflection": ["flag", "Requires flag `--v8-flags=--experimental-wasm-type-reflection`"], - "webContentSecurityPolicy": null - } - }, - "GraalWasm": { - "url": "https://www.graalvm.org/webassembly/", - "logo": "/images/graalvm.svg", - "features": { - "bigInt": "21.3", - "bulkMemory": "23.0", - "customAnnotationSyntaxInTheTextFormat": null, - "extendedConst": ["flag", "Requires flag `--wasm.ExtendedConstExpressions=true`"], - "memory64": ["flag", "Requires flag `--wasm.Memory64=true`"], - "multiMemory": ["flag", "Requires flag `--wasm.MultiMemory=true`"], - "multiValue": "22.3", - "mutableGlobals": "21.3", - "referenceTypes": "23.0", - "saturatedFloatToInt": "22.3", - "signExtensions": "22.3", - "simd": "24.1", - "threads": ["flag", "Requires flag `--wasm.Threads=true`"], - "webContentSecurityPolicy": null - } - }, - "Wasmtime": { - "url": "https://wasmtime.dev/", - "logo": "/images/bca.svg", - "features": { - "bigInt": null, - "bulkMemory": "0.20", - "customAnnotationSyntaxInTheTextFormat": true, - "customPageSizes": ["flag", "Requires flag `--wasm=custom-page-sizes`"], - "esmIntegration": null, - "extendedConst": "25", - "gc": ["flag", "Requires flag `--wasm=gc`"], - "jspi": null, - "jsStringBuiltins": null, - "memory64": ["flag", "Requires flag `--wasm=memory64`"], - "multiMemory": "15", - "multiValue": "0.17", - "mutableGlobals": true, - "referenceTypes": "0.20", - "relaxedSimd": "15", - "saturatedFloatToInt": true, - "signExtensions": true, - "simd": "0.33", - "tailCall": ["22", "Enabled by default when using the Cranelift backend, the s390x architecture supports it since 24"], - "threads": "15", - "typedFunctionReferences": ["flag", "Requires flag `--wasm=function-references`"], - "typeReflection": null, - "webContentSecurityPolicy": null, - "wideArithmetic": ["flag", "Requires flag `--wasm=wide-arithmetic`"] - } - }, - "Wasmer": { - "url": "https://wasmer.io/", - "logo": "/images/wasmer.svg", - "features": { - "bigInt": null, - "bulkMemory": "1.0", - "customAnnotationSyntaxInTheTextFormat": true, - "esmIntegration": null, - "jspi": null, - "jsStringBuiltins": null, - "multiValue": "1.0", - "mutableGlobals": "0.7", - "referenceTypes": "2.0", - "saturatedFloatToInt": true, - "signExtensions": true, - "simd": "2.0", - "typeReflection": "2.0", - "webContentSecurityPolicy": null - } - }, - "wasm2c": { - "url": "https://github.com/WebAssembly/wabt", - "logo": "/images/wasm2c.svg", - "features": { - "bigInt": null, - "bulkMemory": "1.0.30", - "customAnnotationSyntaxInTheTextFormat": null, - "exceptionsFinal": ["flag", "Requires flag `--enable-exceptions`"], - "exceptions": ["flag", "Requires flag `--enable-exceptions`"], - "extendedConst": ["flag", "Requires flag `--enable-extended-const`"], - "esmIntegration": null, - "jspi": null, - "jsStringBuiltins": null, - "memory64": ["flag", "Requires flag `--enable-memory64`"], - "multiMemory": ["flag", "Requires flag `--enable-multi-memory`"], - "tailCall": ["flag", "Requires flag `--enable-tail-call`"], - "multiValue": "1.0.24", - "mutableGlobals": "1.0.1", - "referenceTypes": "1.0.31", - "saturatedFloatToInt": "1.0.24", - "signExtensions": "1.0.24", - "simd": "1.0.33", - "typeReflection": null, - "webContentSecurityPolicy": null - } - } - } + "$schema": "./features.schema.json", + "features": { + "bigInt": { + "description": "JS BigInt to Wasm i64 Integration", + "url": "https://github.com/WebAssembly/JS-BigInt-integration", + "phase": 5 + }, + "branchHinting": { + "description": "Branch Hinting", + "url": "https://github.com/WebAssembly/branch-hinting/blob/master/proposals/branch-hinting/Overview.md", + "phase": 5 + }, + "bulkMemory": { + "description": "Bulk Memory Operations", + "url": "https://github.com/WebAssembly/bulk-memory-operations/blob/master/proposals/bulk-memory-operations/Overview.md", + "phase": 5 + }, + "customAnnotationSyntaxInTheTextFormat": { + "description": "Custom Text Format Annotations", + "url": "https://github.com/WebAssembly/annotations/blob/main/proposals/annotations/Overview.md", + "phase": 5 + }, + "customPageSizes": { + "description": "Custom Page Sizes", + "url": "https://github.com/WebAssembly/custom-page-sizes/blob/main/proposals/custom-page-sizes/Overview.md", + "phase": 2 + }, + "esmIntegration": { + "description": "ESM Integration", + "url": "https://github.com/WebAssembly/esm-integration", + "phase": 3 + }, + "exceptionsFinal": { + "description": "Exception Handling with exnref", + "url": "https://github.com/WebAssembly/exception-handling/blob/master/proposals/exception-handling/Exceptions.md", + "phase": 4 + }, + "exceptions": { + "description": "Legacy Exception Handling", + "url": "https://github.com/WebAssembly/exception-handling/blob/master/proposals/exception-handling/legacy/Exceptions.md", + "phase": "deprecated" + }, + "extendedConst": { + "description": "Extended Constant Expressions", + "url": "https://github.com/WebAssembly/extended-const/blob/master/proposals/extended-const/Overview.md", + "phase": 5 + }, + "gc": { + "description": "Garbage Collection", + "url": "https://github.com/WebAssembly/gc", + "phase": 5 + }, + "instrumentAndTracingTechnology": { + "description": "Instrument and Tracing Technology", + "url": "https://github.com/WebAssembly/instrument-tracing/blob/main/proposals/instrument-tracing/Overview.md", + "phase": 2 + }, + "jspi": { + "description": "JS Promise Integration", + "url": "https://github.com/WebAssembly/js-promise-integration", + "phase": 3 + }, + "jsStringBuiltins": { + "description": "JS String Builtins", + "url": "https://github.com/WebAssembly/js-string-builtins/blob/main/proposals/js-string-builtins/Overview.md", + "phase": 4 + }, + "memory64": { + "description": "Memory64", + "url": "https://github.com/WebAssembly/memory64/blob/master/proposals/memory64/Overview.md", + "phase": 4 + }, + "multiMemory": { + "description": "Multiple Memories", + "url": "https://github.com/WebAssembly/multi-memory/blob/master/proposals/multi-memory/Overview.md", + "phase": 5 + }, + "multiValue": { + "description": "Multi-value", + "url": "https://github.com/WebAssembly/spec/blob/master/proposals/multi-value/Overview.md", + "phase": 5 + }, + "mutableGlobals": { + "description": "Import/Export of Mutable Globals", + "url": "https://github.com/WebAssembly/mutable-global/blob/master/proposals/mutable-global/Overview.md", + "phase": 5 + }, + "referenceTypes": { + "description": "Reference Types", + "url": "https://github.com/WebAssembly/reference-types/blob/master/proposals/reference-types/Overview.md", + "phase": 5 + }, + "relaxedSimd": { + "description": "Relaxed SIMD", + "url": "https://github.com/WebAssembly/relaxed-simd/tree/main/proposals/relaxed-simd", + "phase": 5 + }, + "saturatedFloatToInt": { + "description": "Non-trapping float-to-int Conversions", + "url": "https://github.com/WebAssembly/spec/blob/master/proposals/nontrapping-float-to-int-conversion/Overview.md", + "phase": 5 + }, + "signExtensions": { + "description": "Sign-extension Operators", + "url": "https://github.com/WebAssembly/spec/blob/master/proposals/sign-extension-ops/Overview.md", + "phase": 5 + }, + "simd": { + "description": "Fixed-width SIMD", + "url": "https://github.com/WebAssembly/simd/blob/master/proposals/simd/SIMD.md", + "phase": 5 + }, + "stackSwitching": { + "description": "Stack Switching", + "url": "https://github.com/WebAssembly/stack-switching", + "phase": 2 + }, + "tailCall": { + "description": "Tail Call", + "url": "https://github.com/WebAssembly/tail-call/blob/master/proposals/tail-call/Overview.md", + "phase": 5 + }, + "threads": { + "description": "Threads", + "url": "https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md", + "phase": 4 + }, + "typedFunctionReferences": { + "description": "Typed Function References", + "url": "https://github.com/WebAssembly/function-references/blob/main/proposals/function-references/Overview.md", + "phase": 5 + }, + "typeReflection": { + "description": "Type Reflection for JS API", + "url": "https://github.com/WebAssembly/js-types/blob/main/proposals/js-types/Overview.md", + "phase": 3 + }, + "webContentSecurityPolicy": { + "description": "Web Content Security Policy", + "url": "https://github.com/WebAssembly/content-security-policy/blob/main/proposals/CSP.md", + "phase": 3 + }, + "wideArithmetic": { + "description": "Wide Arithmetic", + "url": "https://github.com/WebAssembly/wide-arithmetic/blob/main/proposals/wide-arithmetic/Overview.md", + "phase": 2 + } + }, + "browsers": { + "Chrome": { + "url": "https://www.google.com/chrome/", + "logo": "/images/chrome.svg", + "features": { + "bigInt": "85", + "branchHinting": [ + "flag", + "Requires CLI flag `--js-flags=--experimental-wasm-branch-hinting`" + ], + "bulkMemory": "75", + "customAnnotationSyntaxInTheTextFormat": null, + "exceptionsFinal": [ + "flag", + "Requires flag `chrome://flags/#enable-experimental-webassembly-features`" + ], + "exceptions": "95", + "extendedConst": "114", + "gc": "119", + "instrumentAndTracingTechnology": [ + "flag", + "Requires CLI flag `--js-flags=--experimental-wasm-instruction-tracing`" + ], + "jspi": [ + "flag", + "Requires flag `chrome://flags/#enable-experimental-webassembly-jspi`" + ], + "jsStringBuiltins": "130", + "memory64": "133", + "multiMemory": "120", + "multiValue": "85", + "mutableGlobals": "74", + "referenceTypes": "96", + "relaxedSimd": "114", + "saturatedFloatToInt": "75", + "signExtensions": "74", + "simd": "91", + "stackSwitching": [ + "flag", + "Requires CLI flag `--js-flags=--experimental-wasm-stack-switching`" + ], + "tailCall": "112", + "threads": "74", + "typedFunctionReferences": "119", + "typeReflection": [ + "flag", + "Requires flag `chrome://flags/#enable-experimental-webassembly-features`" + ], + "webContentSecurityPolicy": "97" + } + }, + "Firefox": { + "url": "https://www.mozilla.org/firefox/", + "logo": "/images/firefox.svg", + "features": { + "bigInt": "78", + "branchHinting": [ + "flag", + "Enabled in Nightly, requires flag `javascript.options.wasm_branch_hinting` in Beta/Release" + ], + "bulkMemory": "79", + "customAnnotationSyntaxInTheTextFormat": null, + "exceptionsFinal": "131", + "exceptions": "100", + "extendedConst": "112", + "gc": "120", + "jspi": [ + "flag", + "Requires flag `javascript.options.wasm_js_promise_integration`" + ], + "jsStringBuiltins": [ + "flag", + "Requires flag `javascript.options.wasm_js_string_builtins`" + ], + "memory64": "134", + "multiMemory": "125", + "multiValue": "78", + "mutableGlobals": "61", + "referenceTypes": "79", + "relaxedSimd": [ + "flag", + "Enabled in Nightly, requires flag `javascript.options.wasm_relaxed_simd` in Beta/Release" + ], + "saturatedFloatToInt": "64", + "signExtensions": "62", + "simd": "89", + "tailCall": "121", + "threads": "79", + "typedFunctionReferences": "120", + "typeReflection": [ + "flag", + "Enabled in Nightly, requires flag `--enable-wasm-type-reflections` in Beta/Release" + ], + "webContentSecurityPolicy": "102" + } + }, + "Safari": { + "url": "https://www.apple.com/safari/", + "logo": "/images/safari.svg", + "features": { + "bigInt": [ + "15", + "wasm-bigint is supported in desktop Safari since 14.1 and iOS Safari since 14.5; however BigInt64Array, which is needed by Emscripten, was released in 15" + ], + "branchHinting": "16", + "bulkMemory": "15", + "customAnnotationSyntaxInTheTextFormat": null, + "exceptionsFinal": [ + "flag", + "Supported in Safari Technology Preview 205" + ], + "exceptions": "15.2", + "extendedConst": "17.4", + "gc": "18.2", + "multiValue": "13.1", + "mutableGlobals": "12", + "referenceTypes": "15", + "relaxedSimd": [ + "flag", + "Requires JavaScriptCore flag `useWebAssemblyRelaxedSIMD`" + ], + "saturatedFloatToInt": "15", + "signExtensions": [ + "14.1", + "Supported in desktop Safari since 14.1 and iOS Safari since 14.5" + ], + "simd": "16.4", + "tailCall": "18.2", + "threads": [ + "14.1", + "Supported in desktop Safari since 14.1 and iOS Safari since 14.5" + ], + "typedFunctionReferences": "18", + "typeReflection": [ + "flag", + "Supported in Safari 18.2, only supports `WebAssembly.Module.imports` and `WebAssembly.Module.exports`" + ], + "webContentSecurityPolicy": "16" + } + }, + "Node.js": { + "url": "https://nodejs.org/", + "logo": "/images/nodejs.svg", + "features": { + "bigInt": "15.0", + "branchHinting": [ + "flag", + "Requires flag `--experimental-wasm-branch-hinting`" + ], + "bulkMemory": "12.5", + "customAnnotationSyntaxInTheTextFormat": null, + "exceptionsFinal": [ + "flag", + "Requires flag `--experimental-wasm-exnref`" + ], + "exceptions": "17.0", + "extendedConst": "21.0", + "gc": "22.0", + "instrumentAndTracingTechnology": [ + "flag", + "Requires flag `--experimental-wasm-instruction-tracing`" + ], + "jspi": ["flag", "Requires flag `--experimental-wasm-jspi`"], + "jsStringBuiltins": [ + "flag", + "Requires flag `--experimental-wasm-imported-strings`" + ], + "memory64": ["flag", "Requires flag `--experimental-wasm-memory64`"], + "multiMemory": "22.0", + "multiValue": "15.0", + "mutableGlobals": "12.0", + "referenceTypes": "17.2", + "relaxedSimd": "21.0", + "saturatedFloatToInt": "12.5", + "signExtensions": "12.0", + "simd": "16.4", + "stackSwitching": [ + "flag", + "Requires flag `--experimental-wasm-stack-switching`" + ], + "tailCall": "20.0", + "threads": "16.4", + "typedFunctionReferences": "22.0", + "typeReflection": [ + "flag", + "Requires flag `--experimental-wasm-type-reflection`" + ], + "webContentSecurityPolicy": null + } + }, + "Deno": { + "url": "https://deno.land/", + "logo": "/images/deno.svg", + "features": { + "bigInt": "1.1.2", + "branchHinting": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-branch-hinting`" + ], + "bulkMemory": "0.4", + "customAnnotationSyntaxInTheTextFormat": null, + "exceptionsFinal": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-exnref`" + ], + "exceptions": "1.16", + "extendedConst": "1.33", + "gc": "1.38", + "instrumentAndTracingTechnology": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-instruction-tracing`" + ], + "jspi": ["flag", "Requires flag `--v8-flags=--experimental-wasm-jspi`"], + "jsStringBuiltins": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-imported-strings`" + ], + "memory64": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-memory64`" + ], + "multiMemory": "1.38", + "multiValue": "1.3.2", + "mutableGlobals": "0.1", + "referenceTypes": "1.16", + "relaxedSimd": "1.33", + "saturatedFloatToInt": "0.4", + "signExtensions": "0.1", + "simd": "1.9", + "stackSwitching": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-stack-switching`" + ], + "tailCall": "1.32", + "threads": "1.9", + "typedFunctionReferences": "1.38", + "typeReflection": [ + "flag", + "Requires flag `--v8-flags=--experimental-wasm-type-reflection`" + ], + "webContentSecurityPolicy": null + } + }, + "GraalWasm": { + "url": "https://www.graalvm.org/webassembly/", + "logo": "/images/graalvm.svg", + "features": { + "bigInt": "21.3", + "bulkMemory": "23.0", + "customAnnotationSyntaxInTheTextFormat": null, + "extendedConst": [ + "flag", + "Requires flag `--wasm.ExtendedConstExpressions=true`" + ], + "memory64": ["flag", "Requires flag `--wasm.Memory64=true`"], + "multiMemory": ["flag", "Requires flag `--wasm.MultiMemory=true`"], + "multiValue": "22.3", + "mutableGlobals": "21.3", + "referenceTypes": "23.0", + "saturatedFloatToInt": "22.3", + "signExtensions": "22.3", + "simd": "24.1", + "threads": ["flag", "Requires flag `--wasm.Threads=true`"], + "webContentSecurityPolicy": null + } + }, + "Wasmtime": { + "url": "https://wasmtime.dev/", + "logo": "/images/bca.svg", + "features": { + "bigInt": null, + "bulkMemory": "0.20", + "customAnnotationSyntaxInTheTextFormat": true, + "customPageSizes": ["flag", "Requires flag `--wasm=custom-page-sizes`"], + "esmIntegration": null, + "extendedConst": "25", + "gc": ["flag", "Requires flag `--wasm=gc`"], + "jspi": null, + "jsStringBuiltins": null, + "memory64": ["flag", "Requires flag `--wasm=memory64`"], + "multiMemory": "15", + "multiValue": "0.17", + "mutableGlobals": true, + "referenceTypes": "0.20", + "relaxedSimd": "15", + "saturatedFloatToInt": true, + "signExtensions": true, + "simd": "0.33", + "tailCall": [ + "22", + "Enabled by default when using the Cranelift backend, the s390x architecture supports it since 24" + ], + "threads": "15", + "typedFunctionReferences": [ + "flag", + "Requires flag `--wasm=function-references`" + ], + "typeReflection": null, + "webContentSecurityPolicy": null, + "wideArithmetic": ["flag", "Requires flag `--wasm=wide-arithmetic`"] + } + }, + "Wasmer": { + "url": "https://wasmer.io/", + "logo": "/images/wasmer.svg", + "features": { + "bigInt": null, + "bulkMemory": "1.0", + "customAnnotationSyntaxInTheTextFormat": true, + "esmIntegration": null, + "jspi": null, + "jsStringBuiltins": null, + "multiValue": "1.0", + "mutableGlobals": "0.7", + "referenceTypes": "2.0", + "saturatedFloatToInt": true, + "signExtensions": true, + "simd": "2.0", + "typeReflection": "2.0", + "webContentSecurityPolicy": null + } + }, + "wasm2c": { + "url": "https://github.com/WebAssembly/wabt", + "logo": "/images/wasm2c.svg", + "features": { + "bigInt": null, + "bulkMemory": "1.0.30", + "customAnnotationSyntaxInTheTextFormat": null, + "exceptionsFinal": ["flag", "Requires flag `--enable-exceptions`"], + "exceptions": ["flag", "Requires flag `--enable-exceptions`"], + "extendedConst": ["flag", "Requires flag `--enable-extended-const`"], + "esmIntegration": null, + "jspi": null, + "jsStringBuiltins": null, + "memory64": ["flag", "Requires flag `--enable-memory64`"], + "multiMemory": ["flag", "Requires flag `--enable-multi-memory`"], + "tailCall": ["flag", "Requires flag `--enable-tail-call`"], + "multiValue": "1.0.24", + "mutableGlobals": "1.0.1", + "referenceTypes": "1.0.31", + "saturatedFloatToInt": "1.0.24", + "signExtensions": "1.0.24", + "simd": "1.0.33", + "typeReflection": null, + "webContentSecurityPolicy": null + } + } + } } diff --git a/features.md b/features.md index 8443acb2..5bc689f8 100644 --- a/features.md +++ b/features.md @@ -1,11 +1,20 @@ --- layout: default --- + # Feature Extensions -In November 2017, WebAssembly CG members representing four browsers, Chrome, Edge, Firefox, and WebKit, reached consensus that the design of the initial (MVP) WebAssembly API and binary format is complete to the extent that no further design work is possible without implementation experience and significant usage. +In November 2017, WebAssembly CG members representing four browsers, Chrome, +Edge, Firefox, and WebKit, reached consensus that the design of the initial +(MVP) WebAssembly API and binary format is complete to the extent that no +further design work is possible without implementation experience and +significant usage. -After the initial release, WebAssembly has been gaining new features through the [standardization process](https://github.com/WebAssembly/meetings/blob/master/process/phases.md). For the complete list of current proposals and their respective stages, check out the [`WebAssembly/proposals` repo](https://github.com/WebAssembly/proposals). +After the initial release, WebAssembly has been gaining new features through the +[standardization process](https://github.com/WebAssembly/meetings/blob/master/process/phases.md). +For the complete list of current proposals and their respective stages, check +out the +[`WebAssembly/proposals` repo](https://github.com/WebAssembly/proposals).