diff --git a/.editorconfig b/.editorconfig index e552c0886f..a8000be409 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,3 +16,7 @@ indent_size = 2 [*.rb] indent_style = space indent_size = 2 + +[*.md] +indent_style = space +indent_size = 2 diff --git a/_config.yml b/_config.yml index fbaefc455e..2530c3ebac 100644 --- a/_config.yml +++ b/_config.yml @@ -26,6 +26,8 @@ collections: download_3: output: true permalink: /download/3.x/:name/ + priorities: + output: true # Build collection items with a future date. future: true diff --git a/_includes/footer.html b/_includes/footer.html index 20ab7f9e64..f2a1b81f7d 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -21,6 +21,7 @@

Project

  • Code of Conduct
  • Governance
  • Teams
  • +
  • Priorities
  • Communities
  • @@ -41,7 +42,7 @@

    Foundation

  • License
  • Privacy Policy
  • Contact us
  • - +
    diff --git a/_sass/common/_release.scss b/_sass/common/_release.scss index 72f618dad9..e860432ff5 100644 --- a/_sass/common/_release.scss +++ b/_sass/common/_release.scss @@ -1,3 +1,6 @@ +// +// Functions +// @function offset-hue($color, $offset, $i: 1) { @return adjust-hue($color, $offset * $i); } @@ -51,3 +54,18 @@ @function r-get-mobile($value) { @return map-get($value, "mobile"); } + +// +// Mixins +// +@mixin is-dark() { + @media screen and (prefers-color-scheme: dark) { + @content; + } +} + +@mixin is-light() { + @media screen and (prefers-color-scheme: light) { + @content; + } +} diff --git a/assets/css/codicon.css b/assets/css/codicon.css deleted file mode 100644 index 6c91ee2d84..0000000000 --- a/assets/css/codicon.css +++ /dev/null @@ -1,630 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -@font-face { - font-family: "codicon"; - font-display: block; - src: url("../fonts/codicon.ttf") format("truetype"); -} - -.codicon[class*='codicon-'] { - font: normal normal normal 16px/1 codicon; - display: inline-block; - text-decoration: none; - text-rendering: auto; - text-align: center; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -/*--------------------- - * Modifiers - *-------------------*/ - -@keyframes codicon-spin { - 100% { - transform:rotate(360deg); - } -} - -.codicon-sync.codicon-modifier-spin, -.codicon-loading.codicon-modifier-spin, -.codicon-gear.codicon-modifier-spin { - /* Use steps to throttle FPS to reduce CPU usage */ - animation: codicon-spin 1.5s steps(30) infinite; -} - -.codicon-modifier-disabled { - opacity: 0.5; -} - -.codicon-modifier-hidden { - opacity: 0; -} - -/* custom speed & easing for loading icon */ -.codicon-loading { - animation-duration: 1s !important; - animation-timing-function: cubic-bezier(0.53, 0.21, 0.29, 0.67) !important; -} - -/*--------------------- - * Icons - *-------------------*/ - -.codicon-add:before { content: "\ea60" } -.codicon-plus:before { content: "\ea60" } -.codicon-gist-new:before { content: "\ea60" } -.codicon-repo-create:before { content: "\ea60" } -.codicon-lightbulb:before { content: "\ea61" } -.codicon-light-bulb:before { content: "\ea61" } -.codicon-repo:before { content: "\ea62" } -.codicon-repo-delete:before { content: "\ea62" } -.codicon-gist-fork:before { content: "\ea63" } -.codicon-repo-forked:before { content: "\ea63" } -.codicon-git-pull-request:before { content: "\ea64" } -.codicon-git-pull-request-abandoned:before { content: "\ea64" } -.codicon-record-keys:before { content: "\ea65" } -.codicon-keyboard:before { content: "\ea65" } -.codicon-tag:before { content: "\ea66" } -.codicon-git-pull-request-label:before { content: "\ea66" } -.codicon-tag-add:before { content: "\ea66" } -.codicon-tag-remove:before { content: "\ea66" } -.codicon-person:before { content: "\ea67" } -.codicon-person-follow:before { content: "\ea67" } -.codicon-person-outline:before { content: "\ea67" } -.codicon-person-filled:before { content: "\ea67" } -.codicon-git-branch:before { content: "\ea68" } -.codicon-git-branch-create:before { content: "\ea68" } -.codicon-git-branch-delete:before { content: "\ea68" } -.codicon-source-control:before { content: "\ea68" } -.codicon-mirror:before { content: "\ea69" } -.codicon-mirror-public:before { content: "\ea69" } -.codicon-star:before { content: "\ea6a" } -.codicon-star-add:before { content: "\ea6a" } -.codicon-star-delete:before { content: "\ea6a" } -.codicon-star-empty:before { content: "\ea6a" } -.codicon-comment:before { content: "\ea6b" } -.codicon-comment-add:before { content: "\ea6b" } -.codicon-alert:before { content: "\ea6c" } -.codicon-warning:before { content: "\ea6c" } -.codicon-search:before { content: "\ea6d" } -.codicon-search-save:before { content: "\ea6d" } -.codicon-log-out:before { content: "\ea6e" } -.codicon-sign-out:before { content: "\ea6e" } -.codicon-log-in:before { content: "\ea6f" } -.codicon-sign-in:before { content: "\ea6f" } -.codicon-eye:before { content: "\ea70" } -.codicon-eye-unwatch:before { content: "\ea70" } -.codicon-eye-watch:before { content: "\ea70" } -.codicon-circle-filled:before { content: "\ea71" } -.codicon-primitive-dot:before { content: "\ea71" } -.codicon-close-dirty:before { content: "\ea71" } -.codicon-debug-breakpoint:before { content: "\ea71" } -.codicon-debug-breakpoint-disabled:before { content: "\ea71" } -.codicon-debug-hint:before { content: "\ea71" } -.codicon-terminal-decoration-success:before { content: "\ea71" } -.codicon-primitive-square:before { content: "\ea72" } -.codicon-edit:before { content: "\ea73" } -.codicon-pencil:before { content: "\ea73" } -.codicon-info:before { content: "\ea74" } -.codicon-issue-opened:before { content: "\ea74" } -.codicon-gist-private:before { content: "\ea75" } -.codicon-git-fork-private:before { content: "\ea75" } -.codicon-lock:before { content: "\ea75" } -.codicon-mirror-private:before { content: "\ea75" } -.codicon-close:before { content: "\ea76" } -.codicon-remove-close:before { content: "\ea76" } -.codicon-x:before { content: "\ea76" } -.codicon-repo-sync:before { content: "\ea77" } -.codicon-sync:before { content: "\ea77" } -.codicon-clone:before { content: "\ea78" } -.codicon-desktop-download:before { content: "\ea78" } -.codicon-beaker:before { content: "\ea79" } -.codicon-microscope:before { content: "\ea79" } -.codicon-vm:before { content: "\ea7a" } -.codicon-device-desktop:before { content: "\ea7a" } -.codicon-file:before { content: "\ea7b" } -.codicon-file-text:before { content: "\ea7b" } -.codicon-more:before { content: "\ea7c" } -.codicon-ellipsis:before { content: "\ea7c" } -.codicon-kebab-horizontal:before { content: "\ea7c" } -.codicon-mail-reply:before { content: "\ea7d" } -.codicon-reply:before { content: "\ea7d" } -.codicon-organization:before { content: "\ea7e" } -.codicon-organization-filled:before { content: "\ea7e" } -.codicon-organization-outline:before { content: "\ea7e" } -.codicon-new-file:before { content: "\ea7f" } -.codicon-file-add:before { content: "\ea7f" } -.codicon-new-folder:before { content: "\ea80" } -.codicon-file-directory-create:before { content: "\ea80" } -.codicon-trash:before { content: "\ea81" } -.codicon-trashcan:before { content: "\ea81" } -.codicon-history:before { content: "\ea82" } -.codicon-clock:before { content: "\ea82" } -.codicon-folder:before { content: "\ea83" } -.codicon-file-directory:before { content: "\ea83" } -.codicon-symbol-folder:before { content: "\ea83" } -.codicon-logo-github:before { content: "\ea84" } -.codicon-mark-github:before { content: "\ea84" } -.codicon-github:before { content: "\ea84" } -.codicon-terminal:before { content: "\ea85" } -.codicon-console:before { content: "\ea85" } -.codicon-repl:before { content: "\ea85" } -.codicon-zap:before { content: "\ea86" } -.codicon-symbol-event:before { content: "\ea86" } -.codicon-error:before { content: "\ea87" } -.codicon-stop:before { content: "\ea87" } -.codicon-variable:before { content: "\ea88" } -.codicon-symbol-variable:before { content: "\ea88" } -.codicon-array:before { content: "\ea8a" } -.codicon-symbol-array:before { content: "\ea8a" } -.codicon-symbol-module:before { content: "\ea8b" } -.codicon-symbol-package:before { content: "\ea8b" } -.codicon-symbol-namespace:before { content: "\ea8b" } -.codicon-symbol-object:before { content: "\ea8b" } -.codicon-symbol-method:before { content: "\ea8c" } -.codicon-symbol-function:before { content: "\ea8c" } -.codicon-symbol-constructor:before { content: "\ea8c" } -.codicon-symbol-boolean:before { content: "\ea8f" } -.codicon-symbol-null:before { content: "\ea8f" } -.codicon-symbol-numeric:before { content: "\ea90" } -.codicon-symbol-number:before { content: "\ea90" } -.codicon-symbol-structure:before { content: "\ea91" } -.codicon-symbol-struct:before { content: "\ea91" } -.codicon-symbol-parameter:before { content: "\ea92" } -.codicon-symbol-type-parameter:before { content: "\ea92" } -.codicon-symbol-key:before { content: "\ea93" } -.codicon-symbol-text:before { content: "\ea93" } -.codicon-symbol-reference:before { content: "\ea94" } -.codicon-go-to-file:before { content: "\ea94" } -.codicon-symbol-enum:before { content: "\ea95" } -.codicon-symbol-value:before { content: "\ea95" } -.codicon-symbol-ruler:before { content: "\ea96" } -.codicon-symbol-unit:before { content: "\ea96" } -.codicon-activate-breakpoints:before { content: "\ea97" } -.codicon-archive:before { content: "\ea98" } -.codicon-arrow-both:before { content: "\ea99" } -.codicon-arrow-down:before { content: "\ea9a" } -.codicon-arrow-left:before { content: "\ea9b" } -.codicon-arrow-right:before { content: "\ea9c" } -.codicon-arrow-small-down:before { content: "\ea9d" } -.codicon-arrow-small-left:before { content: "\ea9e" } -.codicon-arrow-small-right:before { content: "\ea9f" } -.codicon-arrow-small-up:before { content: "\eaa0" } -.codicon-arrow-up:before { content: "\eaa1" } -.codicon-bell:before { content: "\eaa2" } -.codicon-bold:before { content: "\eaa3" } -.codicon-book:before { content: "\eaa4" } -.codicon-bookmark:before { content: "\eaa5" } -.codicon-debug-breakpoint-conditional-unverified:before { content: "\eaa6" } -.codicon-debug-breakpoint-conditional:before { content: "\eaa7" } -.codicon-debug-breakpoint-conditional-disabled:before { content: "\eaa7" } -.codicon-debug-breakpoint-data-unverified:before { content: "\eaa8" } -.codicon-debug-breakpoint-data:before { content: "\eaa9" } -.codicon-debug-breakpoint-data-disabled:before { content: "\eaa9" } -.codicon-debug-breakpoint-log-unverified:before { content: "\eaaa" } -.codicon-debug-breakpoint-log:before { content: "\eaab" } -.codicon-debug-breakpoint-log-disabled:before { content: "\eaab" } -.codicon-briefcase:before { content: "\eaac" } -.codicon-broadcast:before { content: "\eaad" } -.codicon-browser:before { content: "\eaae" } -.codicon-bug:before { content: "\eaaf" } -.codicon-calendar:before { content: "\eab0" } -.codicon-case-sensitive:before { content: "\eab1" } -.codicon-check:before { content: "\eab2" } -.codicon-checklist:before { content: "\eab3" } -.codicon-chevron-down:before { content: "\eab4" } -.codicon-chevron-left:before { content: "\eab5" } -.codicon-chevron-right:before { content: "\eab6" } -.codicon-chevron-up:before { content: "\eab7" } -.codicon-chrome-close:before { content: "\eab8" } -.codicon-chrome-maximize:before { content: "\eab9" } -.codicon-chrome-minimize:before { content: "\eaba" } -.codicon-chrome-restore:before { content: "\eabb" } -.codicon-circle-outline:before { content: "\eabc" } -.codicon-circle:before { content: "\eabc" } -.codicon-debug-breakpoint-unverified:before { content: "\eabc" } -.codicon-terminal-decoration-incomplete:before { content: "\eabc" } -.codicon-circle-slash:before { content: "\eabd" } -.codicon-circuit-board:before { content: "\eabe" } -.codicon-clear-all:before { content: "\eabf" } -.codicon-clippy:before { content: "\eac0" } -.codicon-close-all:before { content: "\eac1" } -.codicon-cloud-download:before { content: "\eac2" } -.codicon-cloud-upload:before { content: "\eac3" } -.codicon-code:before { content: "\eac4" } -.codicon-collapse-all:before { content: "\eac5" } -.codicon-color-mode:before { content: "\eac6" } -.codicon-comment-discussion:before { content: "\eac7" } -.codicon-credit-card:before { content: "\eac9" } -.codicon-dash:before { content: "\eacc" } -.codicon-dashboard:before { content: "\eacd" } -.codicon-database:before { content: "\eace" } -.codicon-debug-continue:before { content: "\eacf" } -.codicon-debug-disconnect:before { content: "\ead0" } -.codicon-debug-pause:before { content: "\ead1" } -.codicon-debug-restart:before { content: "\ead2" } -.codicon-debug-start:before { content: "\ead3" } -.codicon-debug-step-into:before { content: "\ead4" } -.codicon-debug-step-out:before { content: "\ead5" } -.codicon-debug-step-over:before { content: "\ead6" } -.codicon-debug-stop:before { content: "\ead7" } -.codicon-debug:before { content: "\ead8" } -.codicon-device-camera-video:before { content: "\ead9" } -.codicon-device-camera:before { content: "\eada" } -.codicon-device-mobile:before { content: "\eadb" } -.codicon-diff-added:before { content: "\eadc" } -.codicon-diff-ignored:before { content: "\eadd" } -.codicon-diff-modified:before { content: "\eade" } -.codicon-diff-removed:before { content: "\eadf" } -.codicon-diff-renamed:before { content: "\eae0" } -.codicon-diff:before { content: "\eae1" } -.codicon-diff-sidebyside:before { content: "\eae1" } -.codicon-discard:before { content: "\eae2" } -.codicon-editor-layout:before { content: "\eae3" } -.codicon-empty-window:before { content: "\eae4" } -.codicon-exclude:before { content: "\eae5" } -.codicon-extensions:before { content: "\eae6" } -.codicon-eye-closed:before { content: "\eae7" } -.codicon-file-binary:before { content: "\eae8" } -.codicon-file-code:before { content: "\eae9" } -.codicon-file-media:before { content: "\eaea" } -.codicon-file-pdf:before { content: "\eaeb" } -.codicon-file-submodule:before { content: "\eaec" } -.codicon-file-symlink-directory:before { content: "\eaed" } -.codicon-file-symlink-file:before { content: "\eaee" } -.codicon-file-zip:before { content: "\eaef" } -.codicon-files:before { content: "\eaf0" } -.codicon-filter:before { content: "\eaf1" } -.codicon-flame:before { content: "\eaf2" } -.codicon-fold-down:before { content: "\eaf3" } -.codicon-fold-up:before { content: "\eaf4" } -.codicon-fold:before { content: "\eaf5" } -.codicon-folder-active:before { content: "\eaf6" } -.codicon-folder-opened:before { content: "\eaf7" } -.codicon-gear:before { content: "\eaf8" } -.codicon-gift:before { content: "\eaf9" } -.codicon-gist-secret:before { content: "\eafa" } -.codicon-gist:before { content: "\eafb" } -.codicon-git-commit:before { content: "\eafc" } -.codicon-git-compare:before { content: "\eafd" } -.codicon-compare-changes:before { content: "\eafd" } -.codicon-git-merge:before { content: "\eafe" } -.codicon-github-action:before { content: "\eaff" } -.codicon-github-alt:before { content: "\eb00" } -.codicon-globe:before { content: "\eb01" } -.codicon-grabber:before { content: "\eb02" } -.codicon-graph:before { content: "\eb03" } -.codicon-gripper:before { content: "\eb04" } -.codicon-heart:before { content: "\eb05" } -.codicon-home:before { content: "\eb06" } -.codicon-horizontal-rule:before { content: "\eb07" } -.codicon-hubot:before { content: "\eb08" } -.codicon-inbox:before { content: "\eb09" } -.codicon-issue-reopened:before { content: "\eb0b" } -.codicon-issues:before { content: "\eb0c" } -.codicon-italic:before { content: "\eb0d" } -.codicon-jersey:before { content: "\eb0e" } -.codicon-json:before { content: "\eb0f" } -.codicon-kebab-vertical:before { content: "\eb10" } -.codicon-key:before { content: "\eb11" } -.codicon-law:before { content: "\eb12" } -.codicon-lightbulb-autofix:before { content: "\eb13" } -.codicon-link-external:before { content: "\eb14" } -.codicon-link:before { content: "\eb15" } -.codicon-list-ordered:before { content: "\eb16" } -.codicon-list-unordered:before { content: "\eb17" } -.codicon-live-share:before { content: "\eb18" } -.codicon-loading:before { content: "\eb19" } -.codicon-location:before { content: "\eb1a" } -.codicon-mail-read:before { content: "\eb1b" } -.codicon-mail:before { content: "\eb1c" } -.codicon-markdown:before { content: "\eb1d" } -.codicon-megaphone:before { content: "\eb1e" } -.codicon-mention:before { content: "\eb1f" } -.codicon-milestone:before { content: "\eb20" } -.codicon-git-pull-request-milestone:before { content: "\eb20" } -.codicon-mortar-board:before { content: "\eb21" } -.codicon-move:before { content: "\eb22" } -.codicon-multiple-windows:before { content: "\eb23" } -.codicon-mute:before { content: "\eb24" } -.codicon-no-newline:before { content: "\eb25" } -.codicon-note:before { content: "\eb26" } -.codicon-octoface:before { content: "\eb27" } -.codicon-open-preview:before { content: "\eb28" } -.codicon-package:before { content: "\eb29" } -.codicon-paintcan:before { content: "\eb2a" } -.codicon-pin:before { content: "\eb2b" } -.codicon-play:before { content: "\eb2c" } -.codicon-run:before { content: "\eb2c" } -.codicon-plug:before { content: "\eb2d" } -.codicon-preserve-case:before { content: "\eb2e" } -.codicon-preview:before { content: "\eb2f" } -.codicon-project:before { content: "\eb30" } -.codicon-pulse:before { content: "\eb31" } -.codicon-question:before { content: "\eb32" } -.codicon-quote:before { content: "\eb33" } -.codicon-radio-tower:before { content: "\eb34" } -.codicon-reactions:before { content: "\eb35" } -.codicon-references:before { content: "\eb36" } -.codicon-refresh:before { content: "\eb37" } -.codicon-regex:before { content: "\eb38" } -.codicon-remote-explorer:before { content: "\eb39" } -.codicon-remote:before { content: "\eb3a" } -.codicon-remove:before { content: "\eb3b" } -.codicon-replace-all:before { content: "\eb3c" } -.codicon-replace:before { content: "\eb3d" } -.codicon-repo-clone:before { content: "\eb3e" } -.codicon-repo-force-push:before { content: "\eb3f" } -.codicon-repo-pull:before { content: "\eb40" } -.codicon-repo-push:before { content: "\eb41" } -.codicon-report:before { content: "\eb42" } -.codicon-request-changes:before { content: "\eb43" } -.codicon-rocket:before { content: "\eb44" } -.codicon-root-folder-opened:before { content: "\eb45" } -.codicon-root-folder:before { content: "\eb46" } -.codicon-rss:before { content: "\eb47" } -.codicon-ruby:before { content: "\eb48" } -.codicon-save-all:before { content: "\eb49" } -.codicon-save-as:before { content: "\eb4a" } -.codicon-save:before { content: "\eb4b" } -.codicon-screen-full:before { content: "\eb4c" } -.codicon-screen-normal:before { content: "\eb4d" } -.codicon-search-stop:before { content: "\eb4e" } -.codicon-server:before { content: "\eb50" } -.codicon-settings-gear:before { content: "\eb51" } -.codicon-settings:before { content: "\eb52" } -.codicon-shield:before { content: "\eb53" } -.codicon-smiley:before { content: "\eb54" } -.codicon-sort-precedence:before { content: "\eb55" } -.codicon-split-horizontal:before { content: "\eb56" } -.codicon-split-vertical:before { content: "\eb57" } -.codicon-squirrel:before { content: "\eb58" } -.codicon-star-full:before { content: "\eb59" } -.codicon-star-half:before { content: "\eb5a" } -.codicon-symbol-class:before { content: "\eb5b" } -.codicon-symbol-color:before { content: "\eb5c" } -.codicon-symbol-constant:before { content: "\eb5d" } -.codicon-symbol-enum-member:before { content: "\eb5e" } -.codicon-symbol-field:before { content: "\eb5f" } -.codicon-symbol-file:before { content: "\eb60" } -.codicon-symbol-interface:before { content: "\eb61" } -.codicon-symbol-keyword:before { content: "\eb62" } -.codicon-symbol-misc:before { content: "\eb63" } -.codicon-symbol-operator:before { content: "\eb64" } -.codicon-symbol-property:before { content: "\eb65" } -.codicon-wrench:before { content: "\eb65" } -.codicon-wrench-subaction:before { content: "\eb65" } -.codicon-symbol-snippet:before { content: "\eb66" } -.codicon-tasklist:before { content: "\eb67" } -.codicon-telescope:before { content: "\eb68" } -.codicon-text-size:before { content: "\eb69" } -.codicon-three-bars:before { content: "\eb6a" } -.codicon-thumbsdown:before { content: "\eb6b" } -.codicon-thumbsup:before { content: "\eb6c" } -.codicon-tools:before { content: "\eb6d" } -.codicon-triangle-down:before { content: "\eb6e" } -.codicon-triangle-left:before { content: "\eb6f" } -.codicon-triangle-right:before { content: "\eb70" } -.codicon-triangle-up:before { content: "\eb71" } -.codicon-twitter:before { content: "\eb72" } -.codicon-unfold:before { content: "\eb73" } -.codicon-unlock:before { content: "\eb74" } -.codicon-unmute:before { content: "\eb75" } -.codicon-unverified:before { content: "\eb76" } -.codicon-verified:before { content: "\eb77" } -.codicon-versions:before { content: "\eb78" } -.codicon-vm-active:before { content: "\eb79" } -.codicon-vm-outline:before { content: "\eb7a" } -.codicon-vm-running:before { content: "\eb7b" } -.codicon-watch:before { content: "\eb7c" } -.codicon-whitespace:before { content: "\eb7d" } -.codicon-whole-word:before { content: "\eb7e" } -.codicon-window:before { content: "\eb7f" } -.codicon-word-wrap:before { content: "\eb80" } -.codicon-zoom-in:before { content: "\eb81" } -.codicon-zoom-out:before { content: "\eb82" } -.codicon-list-filter:before { content: "\eb83" } -.codicon-list-flat:before { content: "\eb84" } -.codicon-list-selection:before { content: "\eb85" } -.codicon-selection:before { content: "\eb85" } -.codicon-list-tree:before { content: "\eb86" } -.codicon-debug-breakpoint-function-unverified:before { content: "\eb87" } -.codicon-debug-breakpoint-function:before { content: "\eb88" } -.codicon-debug-breakpoint-function-disabled:before { content: "\eb88" } -.codicon-debug-stackframe-active:before { content: "\eb89" } -.codicon-circle-small-filled:before { content: "\eb8a" } -.codicon-debug-stackframe-dot:before { content: "\eb8a" } -.codicon-terminal-decoration-mark:before { content: "\eb8a" } -.codicon-debug-stackframe:before { content: "\eb8b" } -.codicon-debug-stackframe-focused:before { content: "\eb8b" } -.codicon-debug-breakpoint-unsupported:before { content: "\eb8c" } -.codicon-symbol-string:before { content: "\eb8d" } -.codicon-debug-reverse-continue:before { content: "\eb8e" } -.codicon-debug-step-back:before { content: "\eb8f" } -.codicon-debug-restart-frame:before { content: "\eb90" } -.codicon-debug-alt:before { content: "\eb91" } -.codicon-call-incoming:before { content: "\eb92" } -.codicon-call-outgoing:before { content: "\eb93" } -.codicon-menu:before { content: "\eb94" } -.codicon-expand-all:before { content: "\eb95" } -.codicon-feedback:before { content: "\eb96" } -.codicon-git-pull-request-reviewer:before { content: "\eb96" } -.codicon-group-by-ref-type:before { content: "\eb97" } -.codicon-ungroup-by-ref-type:before { content: "\eb98" } -.codicon-account:before { content: "\eb99" } -.codicon-git-pull-request-assignee:before { content: "\eb99" } -.codicon-bell-dot:before { content: "\eb9a" } -.codicon-debug-console:before { content: "\eb9b" } -.codicon-library:before { content: "\eb9c" } -.codicon-output:before { content: "\eb9d" } -.codicon-run-all:before { content: "\eb9e" } -.codicon-sync-ignored:before { content: "\eb9f" } -.codicon-pinned:before { content: "\eba0" } -.codicon-github-inverted:before { content: "\eba1" } -.codicon-server-process:before { content: "\eba2" } -.codicon-server-environment:before { content: "\eba3" } -.codicon-pass:before { content: "\eba4" } -.codicon-issue-closed:before { content: "\eba4" } -.codicon-stop-circle:before { content: "\eba5" } -.codicon-play-circle:before { content: "\eba6" } -.codicon-record:before { content: "\eba7" } -.codicon-debug-alt-small:before { content: "\eba8" } -.codicon-vm-connect:before { content: "\eba9" } -.codicon-cloud:before { content: "\ebaa" } -.codicon-merge:before { content: "\ebab" } -.codicon-export:before { content: "\ebac" } -.codicon-graph-left:before { content: "\ebad" } -.codicon-magnet:before { content: "\ebae" } -.codicon-notebook:before { content: "\ebaf" } -.codicon-redo:before { content: "\ebb0" } -.codicon-check-all:before { content: "\ebb1" } -.codicon-pinned-dirty:before { content: "\ebb2" } -.codicon-pass-filled:before { content: "\ebb3" } -.codicon-circle-large-filled:before { content: "\ebb4" } -.codicon-circle-large:before { content: "\ebb5" } -.codicon-circle-large-outline:before { content: "\ebb5" } -.codicon-combine:before { content: "\ebb6" } -.codicon-gather:before { content: "\ebb6" } -.codicon-table:before { content: "\ebb7" } -.codicon-variable-group:before { content: "\ebb8" } -.codicon-type-hierarchy:before { content: "\ebb9" } -.codicon-type-hierarchy-sub:before { content: "\ebba" } -.codicon-type-hierarchy-super:before { content: "\ebbb" } -.codicon-git-pull-request-create:before { content: "\ebbc" } -.codicon-run-above:before { content: "\ebbd" } -.codicon-run-below:before { content: "\ebbe" } -.codicon-notebook-template:before { content: "\ebbf" } -.codicon-debug-rerun:before { content: "\ebc0" } -.codicon-workspace-trusted:before { content: "\ebc1" } -.codicon-workspace-untrusted:before { content: "\ebc2" } -.codicon-workspace-unknown:before { content: "\ebc3" } -.codicon-terminal-cmd:before { content: "\ebc4" } -.codicon-terminal-debian:before { content: "\ebc5" } -.codicon-terminal-linux:before { content: "\ebc6" } -.codicon-terminal-powershell:before { content: "\ebc7" } -.codicon-terminal-tmux:before { content: "\ebc8" } -.codicon-terminal-ubuntu:before { content: "\ebc9" } -.codicon-terminal-bash:before { content: "\ebca" } -.codicon-arrow-swap:before { content: "\ebcb" } -.codicon-copy:before { content: "\ebcc" } -.codicon-person-add:before { content: "\ebcd" } -.codicon-filter-filled:before { content: "\ebce" } -.codicon-wand:before { content: "\ebcf" } -.codicon-debug-line-by-line:before { content: "\ebd0" } -.codicon-inspect:before { content: "\ebd1" } -.codicon-layers:before { content: "\ebd2" } -.codicon-layers-dot:before { content: "\ebd3" } -.codicon-layers-active:before { content: "\ebd4" } -.codicon-compass:before { content: "\ebd5" } -.codicon-compass-dot:before { content: "\ebd6" } -.codicon-compass-active:before { content: "\ebd7" } -.codicon-azure:before { content: "\ebd8" } -.codicon-issue-draft:before { content: "\ebd9" } -.codicon-git-pull-request-closed:before { content: "\ebda" } -.codicon-git-pull-request-draft:before { content: "\ebdb" } -.codicon-debug-all:before { content: "\ebdc" } -.codicon-debug-coverage:before { content: "\ebdd" } -.codicon-run-errors:before { content: "\ebde" } -.codicon-folder-library:before { content: "\ebdf" } -.codicon-debug-continue-small:before { content: "\ebe0" } -.codicon-beaker-stop:before { content: "\ebe1" } -.codicon-graph-line:before { content: "\ebe2" } -.codicon-graph-scatter:before { content: "\ebe3" } -.codicon-pie-chart:before { content: "\ebe4" } -.codicon-bracket:before { content: "\eb0f" } -.codicon-bracket-dot:before { content: "\ebe5" } -.codicon-bracket-error:before { content: "\ebe6" } -.codicon-lock-small:before { content: "\ebe7" } -.codicon-azure-devops:before { content: "\ebe8" } -.codicon-verified-filled:before { content: "\ebe9" } -.codicon-newline:before { content: "\ebea" } -.codicon-layout:before { content: "\ebeb" } -.codicon-layout-activitybar-left:before { content: "\ebec" } -.codicon-layout-activitybar-right:before { content: "\ebed" } -.codicon-layout-panel-left:before { content: "\ebee" } -.codicon-layout-panel-center:before { content: "\ebef" } -.codicon-layout-panel-justify:before { content: "\ebf0" } -.codicon-layout-panel-right:before { content: "\ebf1" } -.codicon-layout-panel:before { content: "\ebf2" } -.codicon-layout-sidebar-left:before { content: "\ebf3" } -.codicon-layout-sidebar-right:before { content: "\ebf4" } -.codicon-layout-statusbar:before { content: "\ebf5" } -.codicon-layout-menubar:before { content: "\ebf6" } -.codicon-layout-centered:before { content: "\ebf7" } -.codicon-target:before { content: "\ebf8" } -.codicon-indent:before { content: "\ebf9" } -.codicon-record-small:before { content: "\ebfa" } -.codicon-error-small:before { content: "\ebfb" } -.codicon-terminal-decoration-error:before { content: "\ebfb" } -.codicon-arrow-circle-down:before { content: "\ebfc" } -.codicon-arrow-circle-left:before { content: "\ebfd" } -.codicon-arrow-circle-right:before { content: "\ebfe" } -.codicon-arrow-circle-up:before { content: "\ebff" } -.codicon-layout-sidebar-right-off:before { content: "\ec00" } -.codicon-layout-panel-off:before { content: "\ec01" } -.codicon-layout-sidebar-left-off:before { content: "\ec02" } -.codicon-blank:before { content: "\ec03" } -.codicon-heart-filled:before { content: "\ec04" } -.codicon-map:before { content: "\ec05" } -.codicon-map-horizontal:before { content: "\ec05" } -.codicon-fold-horizontal:before { content: "\ec05" } -.codicon-map-filled:before { content: "\ec06" } -.codicon-map-horizontal-filled:before { content: "\ec06" } -.codicon-fold-horizontal-filled:before { content: "\ec06" } -.codicon-circle-small:before { content: "\ec07" } -.codicon-bell-slash:before { content: "\ec08" } -.codicon-bell-slash-dot:before { content: "\ec09" } -.codicon-comment-unresolved:before { content: "\ec0a" } -.codicon-git-pull-request-go-to-changes:before { content: "\ec0b" } -.codicon-git-pull-request-new-changes:before { content: "\ec0c" } -.codicon-search-fuzzy:before { content: "\ec0d" } -.codicon-comment-draft:before { content: "\ec0e" } -.codicon-send:before { content: "\ec0f" } -.codicon-sparkle:before { content: "\ec10" } -.codicon-insert:before { content: "\ec11" } -.codicon-mic:before { content: "\ec12" } -.codicon-thumbsdown-filled:before { content: "\ec13" } -.codicon-thumbsup-filled:before { content: "\ec14" } -.codicon-coffee:before { content: "\ec15" } -.codicon-snake:before { content: "\ec16" } -.codicon-game:before { content: "\ec17" } -.codicon-vr:before { content: "\ec18" } -.codicon-chip:before { content: "\ec19" } -.codicon-piano:before { content: "\ec1a" } -.codicon-music:before { content: "\ec1b" } -.codicon-mic-filled:before { content: "\ec1c" } -.codicon-repo-fetch:before { content: "\ec1d" } -.codicon-copilot:before { content: "\ec1e" } -.codicon-lightbulb-sparkle:before { content: "\ec1f" } -.codicon-robot:before { content: "\ec20" } -.codicon-sparkle-filled:before { content: "\ec21" } -.codicon-diff-single:before { content: "\ec22" } -.codicon-diff-multiple:before { content: "\ec23" } -.codicon-surround-with:before { content: "\ec24" } -.codicon-share:before { content: "\ec25" } -.codicon-git-stash:before { content: "\ec26" } -.codicon-git-stash-apply:before { content: "\ec27" } -.codicon-git-stash-pop:before { content: "\ec28" } -.codicon-vscode:before { content: "\ec29" } -.codicon-vscode-insiders:before { content: "\ec2a" } -.codicon-code-oss:before { content: "\ec2b" } -.codicon-run-coverage:before { content: "\ec2c" } -.codicon-run-all-coverage:before { content: "\ec2d" } -.codicon-coverage:before { content: "\ec2e" } -.codicon-github-project:before { content: "\ec2f" } -.codicon-map-vertical:before { content: "\ec30" } -.codicon-fold-vertical:before { content: "\ec30" } -.codicon-map-vertical-filled:before { content: "\ec31" } -.codicon-fold-vertical-filled:before { content: "\ec31" } -.codicon-go-to-search:before { content: "\ec32" } -.codicon-percentage:before { content: "\ec33" } -.codicon-sort-percentage:before { content: "\ec33" } -.codicon-attach:before { content: "\ec34" } -.codicon-git-fetch:before { content: "\f101" } diff --git a/assets/css/main.scss b/assets/css/main.scss index 7e6df7d85e..83f67399c2 100644 --- a/assets/css/main.scss +++ b/assets/css/main.scss @@ -259,6 +259,7 @@ *:focus { /* More visible outline for better keyboard navigation. */ outline: 0.125rem solid hsl(220, 100%, 62.5%); + outline-color: currentcolor; /* Make the outline always appear above other elements. */ /* Otherwise, one of its sides can be hidden by tabs in the Download and More layouts. */ position: relative; @@ -282,7 +283,6 @@ body a { color: var(--link-color); text-decoration: underline; text-decoration-color: var(--link-underline-color); - text-decoration-thickness: 0.125rem; /* Prevent color transitions from being too fast (for epilepsy). */ transition: 0.1s filter; } @@ -311,7 +311,7 @@ h1, h2, h3, h4, -nav a, +#nav a, .btn, a.btn, .title-font { @@ -437,31 +437,33 @@ header { .container { overflow: initial; } - - .fund { - margin-right: 0px; - &.desktop { - @media (max-width: 1200px) { - display: none; - } - } - &.mobile { - top: -2px; - position: relative; - @media (min-width: 1200px) { - display: none; - } - } - a { - text-decoration: none; - color: var(--fund-color); - color: white; - background-color: var(--fund-color) !important; // avoid hover overwrite - border-radius: var(--button-border-radius); - box-shadow: inset 0 0 0 2px var(--fund-color); - padding: 13px; - } - } + + #nav, #nav_head { + .fund { + margin-right: 0px; + &.desktop { + @media (max-width: 1200px) { + display: none; + } + } + &.mobile { + top: -2px; + position: relative; + @media (min-width: 1200px) { + display: none; + } + } + a { + text-decoration: none; + color: var(--fund-color); + color: white; + background-color: var(--fund-color) !important; // avoid hover overwrite + border-radius: var(--button-border-radius); + box-shadow: inset 0 0 0 2px var(--fund-color); + padding: 13px; + } + } + } #logo-link { /* Make the logo's clickable area as tall as for other navigation links. */ padding: 0.2rem 0.5rem; @@ -496,7 +498,7 @@ header > div.container { align-items: center; } -nav { +#nav { width: 100%; display: flex; justify-content: space-between; @@ -504,7 +506,7 @@ nav { padding-right: 1rem; } -nav a { +#nav a { text-decoration: none; font-size: 16px; font-weight: 400; @@ -513,32 +515,32 @@ nav a { padding: 1.3175rem 1rem; } -nav a:hover, +#nav a:hover, #logo-link:hover { background-color: hsla(0, 0%, 50%, 0.1); } -nav ul { +#nav ul { list-style: none; margin: 0; padding-left: 0; } -nav > ul { +#nav > ul { display: flex; align-items: center; height: 100%; } -nav > ul > :first-child { +#nav > ul > :first-child { padding-left: 0; } -nav > ul > :last-child { +#nav > ul > :last-child { padding-right: 0; } -nav > ul li { +#nav > ul li { padding-left: 1rem; padding-right: 1rem; margin-bottom: 0; @@ -546,11 +548,11 @@ nav > ul li { margin-right: -1rem; } -nav li.active > a { +#nav li.active > a { color: var(--navbar-link-current-color); } -nav > ul ul { +#nav > ul ul { display: none; } @@ -1026,20 +1028,20 @@ pre > code { #nav { display: none; } - nav ul { + #nav ul { align-items: flex-start; flex-direction: column; height: auto; } - nav > ul { + #nav > ul { margin-bottom: 16px; } - nav ul li { + #nav ul li { padding: 0; padding-top: 16px; width: 100%; } - nav ul a { + #nav ul a { width: 100%; display: block; /* Make links easier to click but still close to each other. */ diff --git a/assets/css/priorities/base.scss b/assets/css/priorities/base.scss new file mode 100644 index 0000000000..aef7ce9d57 --- /dev/null +++ b/assets/css/priorities/base.scss @@ -0,0 +1,939 @@ +--- +--- +// Fixes the parsing of the unusual front matter / SCSS file. +*{}; + +// +// Reset +// +ul { + line-height: unset; + padding-left: unset; +} + +// +// Imports +// +@import "./details.css"; + +// +// Variables +// +$large-min-width: 1200px; +$mobile-max-width: 700px; +$mobile-sm-max-width: 450px; +$gap: 1.25rem; +$border-radius: 15px; + +$element-meta-planning-bar-width: 15%; +$element-meta-ongoing-bar-width: 50%; + +$color-background-light: #FFFFFF; +$color-background-dark: rgb(51, 54, 57); +$color-red: #f35774; + +$color-category-level-1: hsl(206, 58%, 52%); +$color-category-level-2-light: rgb(165, 173, 200); +$color-category-level-2-dark: #202325; + +$color-text-light: #4a5365; +$color-text-dark: rgba(255, 255, 255, 0.9); + +$color-element-background-light: + adjust-color(#d5daea, $lightness: +7.5%); +$color-element-background-dark: adjust-color(#202325, $lightness: +2.5%); + +@function create-outline-rule($outline-color) { + @return 0.125rem solid $outline-color; +} +$outline-color: #4080ff; +$outline: create-outline-rule($outline-color: $outline-color); +$outline-inverted: create-outline-rule($outline-color: adjust-color($color: invert($outline-color), $lightness: +10%)); + +$detail-color: ( + note: (rgb(26, 127, 55), rgb(45, 175, 71)), + warning: (rgb(154, 103, 0), rgb(201, 135, 4)), + links: (rgb(9, 105, 218), rgb(34, 119, 247)), + trackers: (rgb(19, 136, 140), rgb(34, 240, 254)), + prs: (rgb(130, 80, 223), rgb(148, 94, 249)), + issues: (rgb(207, 34, 46), rgb(249, 62, 58)), + proposals: (rgb(207, 106, 34), rgb(246, 118, 58)), +); + +// +// Functions +// + +// +// Mixins +// +@mixin is-dark() { + @media screen and (prefers-color-scheme: dark) { + @content; + } +} + +@mixin is-light() { + @media screen and (prefers-color-scheme: light) { + @content; + } +} + +@mixin is-large() { + @media screen and (min-width: #{$large-min-width}) { + @content; + } +} + +@mixin is-mobile() { + @media screen and (max-width: #{$mobile-max-width}) { + @content; + } +} + +@mixin is-mobile-sm() { + @media screen and (max-width: #{$mobile-sm-max-width}) { + @content; + } +} + +@mixin is-retina() { + @media screen and (min-resolution: 2x) { + @content; + } +} + +// --- + +@mixin anchor-icon($icon-color) { + .anchor-icon { + display: inline-block; + + opacity: 0; + transition: opacity 0.2s ease-out; + + $size: 0.8rem; + $min-size: 19px; + mask-image: url(/assets/icons/link.svg); + mask-size: 100% 100%; + mask-repeat: no-repeat; + height: $size; + width: $size; + min-height: $min-size; + min-width: $min-size; + + background-color: $icon-color; + } +} + +@mixin remove-markdown-margins() { + > p { + &:first-child { + margin-top: 0; + } + &:last-child { + margin-bottom: 0; + } + } +} + +@mixin reset-lists() { + > ul { + // Force reset the style for the first list. + list-style-type: disc; + } + + > ol { + // Force reset the style for the first list. + counter-reset: element-details-list-counter; + } +} + +// +// General +// +:root { + scroll-behavior: smooth; + @media (prefers-reduced-motion) { + scroll-behavior: auto; + } + scroll-padding-top: $gap; +} + +// +// Main content. +// +.priorities-container { + font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + background-color: var(--card-background-color); + overflow: visible; + position: relative; + + > .priorities-intro { + @mixin set-background($color, $url) { + $color-with-alpha: change-color($color, $alpha: 0.866667); + background: + linear-gradient(to right, $color-with-alpha, $color-with-alpha), + linear-gradient(to bottom, rgba(0,0,0,0) 25%, $color 100%), + url($url); + background-color: black; + background-size: cover, cover, cover; + background-repeat: repeat, repeat, repeat; + } + + @mixin setup-background($color) { + @include set-background( + $color: $color, + $url: "/storage/priorities/images/page/map2-2048.webp" + ); + @include is-retina() { + @include set-background( + $color: $color, + $url: "/storage/priorities/images/page/map2-4096.webp" + ); + } + } + + @include setup-background($color: $color-background-light); + @include is-dark() { + @include setup-background($color: $color-background-dark); + } + + > .banner { + .container { + padding-top: 7rem; + // padding-bottom: 7rem; + + h1 { + margin-bottom: 0; + } + + .banner-last-updated { + .label { + .last-updated { + display: inline; + } + .recently-updated { + display: none; + font-weight: 600; + color: $color-red; + } + + @at-root #{selector-replace(&, ".banner-last-updated", ".banner-last-updated.recent")} { + .last-updated { + display: none; + } + .recently-updated { + display: inline; + } + } + } + } + } + } + + > .intro { + .intro-text { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: $gap; + margin-bottom: (3 * $gap); + @include is-mobile() { + grid-template-columns: 1fr; + gap: 0; + } + } + .wishlist-btns { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-template-areas: + "donate howto contact"; + gap: $gap; + + margin: (3 * $gap) 0; + font-weight: 600; + + @include is-mobile() { + grid-template-columns: repeat(2, 1fr); + grid-template-areas: + "donate donate" + "howto contact"; + } + + @include is-mobile-sm() { + grid-template-columns: repeat(1, 1fr); + grid-template-areas: + "donate" + "howto" + "contact"; + } + + .donate { + grid-area: donate; + } + + .howto { + grid-area: howto; + } + + .contact { + grid-area: contact; + } + + .wishlist-btn-anchor { + color: $color-red; + + text-decoration: none; + &:hover { + text-decoration: underline; + } + } + + .wishlist-btn-text { + display: flex; + justify-content: center; + align-items: center; + } + } + } + } + + > .navigation { + top: 0px; + z-index: 1000; + background-color: $color-background-light; + @include is-dark() { + background-color: $color-background-dark; + } + + margin: $gap 0; + -webkit-user-select: none; + user-select: none; + + li { + list-style: none; + margin-bottom: 0; + } + + .navigation-list-container { + position: relative; + + .navigation-list { + margin: 0; + + display: flex; + flex-direction: row; + justify-content: space-between; + gap: $gap; + + @include is-mobile() { + display: grid; + grid-template-columns: 1fr 1fr; + } + + @include is-mobile-sm() { + grid-template-columns: 1fr; + } + + > li { + list-style: none; + flex-grow: 1; + width: 100%; + margin: 0; + + .navigation-list-details { + .navigation-list-summary { + display: flex; + flex-direction: row; + + // Disable toggling. + pointer-events: none; + -webkit-user-select: none; + user-select: none; + + background-color: $color-element-background-light; + @include is-dark() { + background-color: $color-element-background-dark; + } + + &:hover { + filter: brightness(117.5%); + @include is-light() { + filter: brightness(102%); + } + + &:has(.label a:hover) { + filter: none; + } + } + + border-radius: $border-radius; + width: calc(100% - #{$gap * 2}); + height: 100%; + padding: $gap $gap; + cursor: pointer; + + &::-webkit-details-marker { + display: none; + } + + .label { + width: 100%; + flex-grow: 1; + + a { + pointer-events: all; + } + } + + .toggle { + // As we disabled the
    tag, we remove the toggle icon visually. + display: none; + + flex-grow: 0; + + .more { + display: block; + } + .less { + display: none; + } + + @at-root #{selector-replace(&, ".navigation-list-details", ".navigation-list-details[open]")} { + .more { + display: none; + } + .less { + display: block; + } + } + } + } + + .navigation-sublist { + display: flex; + flex-direction: column; + gap: $gap / 4; + + margin-top: $gap / 2; + margin-left: $gap; + } + } + } + } + } + } + + // i.e. "core", "rendering", or "physics" + > .priorities { + display: flex; + flex-direction: column; + gap: $gap * 2; + + padding: ($gap * 2) 0; + + .category { + > .container { + > .category-details { + > .category-summary { + display: grid; + grid-template-areas: + "title anchor . icon"; + grid-template-columns: + auto min-content 1fr min-content; + gap: $gap; + align-items: baseline; + + border-radius: $border-radius; + padding: 1rem 2rem; + letter-spacing: -2px; + font-weight: 600; + color: white; + cursor: pointer; + line-height: 3rem; + + list-style: none; + &::-webkit-details-marker { + display: none; + } + + &:focus { + outline: none; + } + + // .category.level-1 + @at-root #{selector-replace(&, ".category", ".category.level-1")} { + font-size: 3rem; + background-color: $color-category-level-1; + } + // .category.level-2 + @at-root #{selector-replace(&, ".category", ".category.level-2")} { + font-size: 2.125rem; + background-color: $color-category-level-2-light; + @include is-dark() { + background-color: $color-category-level-2-dark; + } + @include is-light() { + &:hover { + filter: brightness(105%); + } + } + } + + &:hover { + filter: brightness(117.5%); + } + + > .category-anchor-container { + grid-area: anchor; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + > .category-anchor { + display: block; + position: relative; + text-decoration: none; + color: white; + + .anchor-icon { + @at-root #{selector-replace(&, ".category-summary", ".category-summary:hover")} { + opacity: 0.6; + } + + @at-root #{selector-replace(&, ".category-anchor", ".category-anchor:focus")} { + opacity: 0.6; + } + } + &:focus { + outline: $outline-inverted; + } + + $anchor-icon-color: white; + @include anchor-icon($icon-color: white); + } + } + + .category-title { + grid-area: title; + + position: relative; + margin-bottom: 0; + + @at-root #{selector-replace(&, ".category-summary", ".category-summary:focus")} { + outline: $outline-inverted; + } + + .category-title-text { + flex-grow: 1; + width: 100%; + color: white; + + @include remove-markdown-margins(); + } + + .recent-icon { + display: block; + position: absolute; + $size: 0.75rem; + width: $size; + height: $size; + border-radius: $size; + top: ($size / 4); + left: -(($size / 4) * 3); + background-color: $color-red; + } + } + + .category-accordion-toggle { + grid-area: icon; + + .more { + display: block; + } + .less { + display: none; + } + @at-root #{selector-replace(&, ".category-details", ".category-details[open]")} { + .more { + display: none; + } + .less { + display: block; + } + } + } + } + } + + .category-content { + .element-list { + display: grid; + grid-template-columns: 1fr; + gap: $gap; + @include is-large() { + grid-template-columns: 1fr 1fr; + } + padding-left: 0; + margin-bottom: 0; + + > .element-list-item { + list-style: none; + margin-bottom: 0; + + > .element { + display: grid; + grid-template-areas: + "main"; + grid-template-columns: auto; + grid-template-rows: auto; + gap: $gap; + + border-radius: $border-radius; + background-color: $color-element-background-light; + @include is-dark() { + background-color: $color-element-background-dark; + } + + padding: 1.25rem 0; + + @include is-mobile() { + grid-template-areas: + "main"; + grid-template-columns: auto; + grid-template-rows: auto; + } + + .element-main { + grid-area: main; + + .element-title { + display: grid; + grid-template-areas: + "text toggle"; + grid-template-columns: + 1fr min-content; + align-items: stretch; + gap: $gap; + + cursor: pointer; + border-radius: $border-radius; + color: $color-text-light; + @include is-dark() { + color: $color-text-dark; + } + background-color: $color-element-background-light; + @include is-dark() { + background-color: $color-element-background-dark; + } + + margin-top: -$gap; + margin-bottom: -$gap; + padding: $gap; + + &:focus { + outline: none; + } + + &:hover { + filter: brightness(117.5%); + @include is-light() { + filter: brightness(102%); + } + } + + list-style: none; + &::-webkit-details-marker { + display: none; + } + + .text { + grid-area: text; + + display: flex; + flex-direction: row; + align-items: center; + gap: 0.5rem; + } + + .element-title-container { + display: inline-block; + height: 100%; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .element-title-anchor { + flex-grow: 0; + + display: flex; + flex-direction: row; + align-items: center; + + text-decoration: none; + + @include anchor-icon($icon-color: $color-text-light); + @include is-dark() { + @include anchor-icon($icon-color: $color-text-dark); + } + + @at-root #{selector-replace(&, ".element-title", ".element-title:hover")}, + &:focus { + .anchor-icon { + opacity: 0.6; + } + } + } + + .element-title-text { + flex-grow: 1; + width: 100%; + + display: flex; + flex-direction: row; + align-items: center; + + font-weight: 700; + + @include remove-markdown-margins(); + + @at-root #{selector-replace(&, ".element-title", ".element-title:focus")} { + outline: $outline; + } + } + } + + .element-accordion-toggle { + grid-area: toggle; + + flex-grow: 0; + + display: flex; + flex-direction: row; + align-items: center; + + .less { + display: none; + } + .more { + display: block; + } + + @at-root #{selector-replace(&, ".element-main", ".element-main[open]")} { + .less { + display: block; + } + .more { + display: none; + } + } + } + } + + .element-content { + display: flex; + flex-direction: column; + gap: $gap; + + padding: 0 $gap; + padding-top: $gap; + + .element-description { + font-size: 1rem; + @include remove-markdown-margins(); + } + + .element-details { + display: flex; + flex-direction: column; + gap: $gap; + + &:empty { + display: none; + } + + font-size: 0.9rem; + + .detail-block { + @mixin parent-is-type($current-selector, $type) { + @at-root #{selector-replace($current-selector, ".detail-block", ".detail-block.#{$type}")} { + @content; + } + } + + padding: 1rem 0 1rem 2rem; + border-left: 2px solid; + border-left-color: var(--detail-color); + + p { + &:first-child { + margin-top: 0; + } + &:last-child { + margin-bottom: 0; + } + } + + ul { + padding-left: 1.5rem; + + li { + margin-bottom: 0.45rem; + } + + &:last-child { + li:last-child { + margin-bottom: 0; + } + } + } + + a { + color: $color-text-light; + text-decoration-color: $color-text-light; + @include is-dark() { + color: $color-text-dark; + text-decoration-color: $color-text-dark; + } + } + + @include reset-lists(); + + // Detail types. + @each $type in ("note", "warning", "links", "trackers", "prs", "issues", "proposals") { + &.#{$type} { + --detail-color: #{nth(map-get($detail-color, $type), 1)}; + @include is-dark() { + --detail-color: #{nth(map-get($detail-color, $type), 2)}; + } + } + } + + .detail-block-header { + display: flex; + flex-direction: row; + align-items: center; + gap: $gap / 2; + margin-bottom: $gap / 2; + font-weight: bolder; + + color: var(--detail-color); + + .icon { + @mixin octicon($icon-url) { + display: inline-block; + width: 24px; + height: 24px; + mask-size: 24px; + mask-position: center; + mask-image: url($icon-url); + background-color: currentColor; + } + + span[class^="godot-icon-"], span[class*=" godot-icon-"] { + font-size: 150%; + } + } + } + + .detail-block-content { + @include reset-lists(); + } + } + } + } + + .element-edit { + &:empty { + display: none; + } + + font-size: 0.75rem; + font-style: italic; + color: adjust-color($color-text-light, $alpha: -0.33); + @include is-dark() { + color: adjust-color($color-text-dark, $alpha: -0.33); + } + + .element-edit-title { + font-weight: 500; + } + + .element-edit-entries { + font-style: normal; + border-collapse: collapse; + + .element-edit-entry { + vertical-align: baseline; + + .element-edit-entry-time { + margin-right: 1rem; + } + + .element-edit-entry-content { + @include remove-markdown-margins(); + } + } + } + } + } + } + } + } + } + } + } + } +} + +#scroll-to-top { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + pointer-events: none; + + --card-padding: $gap; + @include is-mobile() { + --card-padding: $gap / 2; + } + + .link { + pointer-events: all; + position: fixed; + bottom: $gap; + right: $gap; + width: 50px; + height: 50px; + margin: var(--card-padding); + text-decoration: none; + background-color: white; + border-radius: $border-radius; + + display: flex; + align-items: center; + justify-content: center; + box-shadow: rgba(0,0,0,25%) 1px 1px 5px; + + color: black; + font-size: 1.5em; + + &:hover { + span { + font-size: 35px; + } + } + + span { + transition: font-size 0.2s ease-out; + transform: + translateY(-3px); + } + } +} diff --git a/assets/css/priorities/details.css b/assets/css/priorities/details.css new file mode 100644 index 0000000000..d20b499218 --- /dev/null +++ b/assets/css/priorities/details.css @@ -0,0 +1,65 @@ +/** + * This file is a workaround for our version of Sass (1.77.5) + * not supporting `@supports selector()` + */ + +@keyframes opening { + from { + transform: + translateY(-50px); + opacity: 0; + } + + to { + transform: + translateY(0); + opacity: 1; + } +} + +/** + * This enables the smooth open/close of details in supported browsers. + */ +@supports selector(details::details-content) and (interpolate-size: allow-keywords) and (content-visibility: visible) { + .priorities-container { + interpolate-size: allow-keywords; + } + + .priorities-container details { + padding: 2px; + } + + .priorities-container details::details-content { + height: 0; + transition: + height 0.3s ease, + content-visibility 0.3s allow-discrete ease; + content-visibility: hidden; + overflow: hidden; + } + + .priorities-container details[open]::details-content { + height: auto; + content-visibility: visible; + } + + @starting-style { + .priorities-container details::details-content { + height: 0; + } + } +} + +/** + * This is the fallback on non-supported browsers. + */ +@supports not (selector(details::details-content) and (interpolate-size: allow-keywords) and (content-visibility: visible)) { + details > summary { + z-index: 100; + } + + details.opening > *:not(summary) { + animation: + opening 0.3s ease; + } +} diff --git a/assets/css/priorities/noscript.scss b/assets/css/priorities/noscript.scss new file mode 100644 index 0000000000..3aa14d9a57 --- /dev/null +++ b/assets/css/priorities/noscript.scss @@ -0,0 +1,5 @@ +--- +--- + +// Fixes the parsing of the unusual front matter / SCSS file. +*{}; diff --git a/assets/css/releases/4.3.scss b/assets/css/releases/4.3.scss index 583ca7595a..8a10469327 100644 --- a/assets/css/releases/4.3.scss +++ b/assets/css/releases/4.3.scss @@ -30,18 +30,6 @@ $mobile-max-width: 700px; } } -@mixin is-dark() { - @media screen and (prefers-color-scheme: dark) { - @content; - } -} - -@mixin is-light() { - @media screen and (prefers-color-scheme: light) { - @content; - } -} - $anchor-offset: 75px; $header-background-color: #25282B; diff --git a/assets/icons/octicons/LICENSE b/assets/icons/octicons/LICENSE new file mode 100644 index 0000000000..7533bc77a7 --- /dev/null +++ b/assets/icons/octicons/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 GitHub Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/assets/icons/octicons/bug-24.svg b/assets/icons/octicons/bug-24.svg new file mode 100644 index 0000000000..b1520a4b2e --- /dev/null +++ b/assets/icons/octicons/bug-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/octicons/git-pull-request-24.svg b/assets/icons/octicons/git-pull-request-24.svg new file mode 100644 index 0000000000..48c2a2c114 --- /dev/null +++ b/assets/icons/octicons/git-pull-request-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/octicons/zap-24.svg b/assets/icons/octicons/zap-24.svg new file mode 100644 index 0000000000..79efca2246 --- /dev/null +++ b/assets/icons/octicons/zap-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/js/modules/fuse.js@7.0.0.min.mjs b/assets/js/modules/fuse.js@7.0.0.min.mjs new file mode 100644 index 0000000000..9ea5dd7e7e --- /dev/null +++ b/assets/js/modules/fuse.js@7.0.0.min.mjs @@ -0,0 +1,9 @@ +/** + * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2023 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +function t(t){return Array.isArray?Array.isArray(t):"[object Array]"===a(t)}const e=1/0;function n(t){return null==t?"":function(t){if("string"==typeof t)return t;let n=t+"";return"0"==n&&1/t==-e?"-0":n}(t)}function s(t){return"string"==typeof t}function i(t){return"number"==typeof t}function r(t){return!0===t||!1===t||function(t){return c(t)&&null!==t}(t)&&"[object Boolean]"==a(t)}function c(t){return"object"==typeof t}function o(t){return null!=t}function h(t){return!t.trim().length}function a(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}const l=t=>`Missing ${t} property in key`,u=t=>`Property 'weight' in key '${t}' must be a positive integer`,d=Object.prototype.hasOwnProperty;class g{constructor(t){this._keys=[],this._keyMap={};let e=0;t.forEach((t=>{let n=f(t);this._keys.push(n),this._keyMap[n.id]=n,e+=n.weight})),this._keys.forEach((t=>{t.weight/=e}))}get(t){return this._keyMap[t]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function f(e){let n=null,i=null,r=null,c=1,o=null;if(s(e)||t(e))r=e,n=p(e),i=m(e);else{if(!d.call(e,"name"))throw new Error(l("name"));const t=e.name;if(r=t,d.call(e,"weight")&&(c=e.weight,c<=0))throw new Error(u(t));n=p(t),i=m(t),o=e.getFn}return{path:n,id:i,weight:c,src:r,getFn:o}}function p(e){return t(e)?e:e.split(".")}function m(e){return t(e)?e.join("."):e}var M={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(t,e)=>t.score===e.score?t.idx{if(o(e))if(c[u]){const d=e[c[u]];if(!o(d))return;if(u===c.length-1&&(s(d)||i(d)||r(d)))h.push(n(d));else if(t(d)){a=!0;for(let t=0,e=d.length;t{this._keysMap[t.id]=e}))}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,s(this.docs[0])?this.docs.forEach(((t,e)=>{this._addString(t,e)})):this.docs.forEach(((t,e)=>{this._addObject(t,e)})),this.norm.clear())}add(t){const e=this.size();s(t)?this._addString(t,e):this._addObject(t,e)}removeAt(t){this.records.splice(t,1);for(let e=t,n=this.size();e{let c=n.getFn?n.getFn(e):this.getFn(e,n.path);if(o(c))if(t(c)){let e=[];const n=[{nestedArrIndex:-1,value:c}];for(;n.length;){const{nestedArrIndex:i,value:r}=n.pop();if(o(r))if(s(r)&&!h(r)){let t={v:r,i:i,n:this.norm.get(r)};e.push(t)}else t(r)&&r.forEach(((t,e)=>{n.push({nestedArrIndex:e,value:t})}))}i.$[r]=e}else if(s(c)&&!h(c)){let t={v:c,n:this.norm.get(c)};i.$[r]=t}})),this.records.push(i)}toJSON(){return{keys:this.keys,records:this.records}}}function L(t,e,{getFn:n=M.getFn,fieldNormWeight:s=M.fieldNormWeight}={}){const i=new y({getFn:n,fieldNormWeight:s});return i.setKeys(t.map(f)),i.setSources(e),i.create(),i}function k(t,{errors:e=0,currentLocation:n=0,expectedLocation:s=0,distance:i=M.distance,ignoreLocation:r=M.ignoreLocation}={}){const c=e/t.length;if(r)return c;const o=Math.abs(s-n);return i?c+o/i:o?1:c}const _=32;function v(t,e,n,{location:s=M.location,distance:i=M.distance,threshold:r=M.threshold,findAllMatches:c=M.findAllMatches,minMatchCharLength:o=M.minMatchCharLength,includeMatches:h=M.includeMatches,ignoreLocation:a=M.ignoreLocation}={}){if(e.length>_)throw new Error(`Pattern length exceeds max of ${_}.`);const l=e.length,u=t.length,d=Math.max(0,Math.min(s,u));let g=r,f=d;const p=o>1||h,m=p?Array(u):[];let x;for(;(x=t.indexOf(e,f))>-1;){let t=k(e,{currentLocation:x,expectedLocation:d,distance:i,ignoreLocation:a});if(g=Math.min(t,g),f=x+l,p){let t=0;for(;t=h;r-=1){let c=r-1,o=n[t.charAt(c)];if(p&&(m[c]=+!!o),x[r]=(x[r+1]<<1|1)&o,s&&(x[r]|=(y[r+1]|y[r])<<1|1|y[r+1]),x[r]&S&&(L=k(e,{errors:s,currentLocation:c,expectedLocation:d,distance:i,ignoreLocation:a}),L<=g)){if(g=L,f=c,f<=d)break;h=Math.max(1,2*d-f)}}if(k(e,{errors:s+1,currentLocation:d,expectedLocation:d,distance:i,ignoreLocation:a})>g)break;y=x}const C={isMatch:f>=0,score:Math.max(.001,L)};if(p){const t=function(t=[],e=M.minMatchCharLength){let n=[],s=-1,i=-1,r=0;for(let c=t.length;r=e&&n.push([s,i]),s=-1)}return t[r-1]&&r-s>=e&&n.push([s,r-1]),n}(m,o);t.length?h&&(C.indices=t):C.isMatch=!1}return C}function S(t){let e={};for(let n=0,s=t.length;n{this.chunks.push({pattern:t,alphabet:S(t),startIndex:e})},l=this.pattern.length;if(l>_){let t=0;const e=l%_,n=l-e;for(;t{const{isMatch:f,score:p,indices:m}=v(t,e,d,{location:s+g,distance:i,threshold:r,findAllMatches:c,minMatchCharLength:o,includeMatches:n,ignoreLocation:h});f&&(u=!0),l+=p,f&&m&&(a=[...a,...m])}));let d={isMatch:u,score:u?l/this.chunks.length:1};return u&&n&&(d.indices=a),d}}class I{constructor(t){this.pattern=t}static isMultiMatch(t){return w(t,this.multiRegex)}static isSingleMatch(t){return w(t,this.singleRegex)}search(){}}function w(t,e){const n=t.match(e);return n?n[1]:null}class $ extends I{constructor(t,{location:e=M.location,threshold:n=M.threshold,distance:s=M.distance,includeMatches:i=M.includeMatches,findAllMatches:r=M.findAllMatches,minMatchCharLength:c=M.minMatchCharLength,isCaseSensitive:o=M.isCaseSensitive,ignoreLocation:h=M.ignoreLocation}={}){super(t),this._bitapSearch=new C(t,{location:e,threshold:n,distance:s,includeMatches:i,findAllMatches:r,minMatchCharLength:c,isCaseSensitive:o,ignoreLocation:h})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(t){return this._bitapSearch.searchIn(t)}}class A extends I{constructor(t){super(t)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(t){let e,n=0;const s=[],i=this.pattern.length;for(;(e=t.indexOf(this.pattern,n))>-1;)n=e+i,s.push([e,n-1]);const r=!!s.length;return{isMatch:r,score:r?0:1,indices:s}}}const E=[class extends I{constructor(t){super(t)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(t){const e=t===this.pattern;return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},A,class extends I{constructor(t){super(t)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(t){const e=t.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,this.pattern.length-1]}}},class extends I{constructor(t){super(t)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(t){const e=!t.startsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}},class extends I{constructor(t){super(t)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(t){const e=!t.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}},class extends I{constructor(t){super(t)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(t){const e=t.endsWith(this.pattern);return{isMatch:e,score:e?0:1,indices:[t.length-this.pattern.length,t.length-1]}}},class extends I{constructor(t){super(t)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(t){const e=-1===t.indexOf(this.pattern);return{isMatch:e,score:e?0:1,indices:[0,t.length-1]}}},$],b=E.length,F=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;const N=new Set([$.type,A.type]);class R{constructor(t,{isCaseSensitive:e=M.isCaseSensitive,includeMatches:n=M.includeMatches,minMatchCharLength:s=M.minMatchCharLength,ignoreLocation:i=M.ignoreLocation,findAllMatches:r=M.findAllMatches,location:c=M.location,threshold:o=M.threshold,distance:h=M.distance}={}){this.query=null,this.options={isCaseSensitive:e,includeMatches:n,minMatchCharLength:s,findAllMatches:r,ignoreLocation:i,location:c,threshold:o,distance:h},this.pattern=e?t:t.toLowerCase(),this.query=function(t,e={}){return t.split("|").map((t=>{let n=t.trim().split(F).filter((t=>t&&!!t.trim())),s=[];for(let t=0,i=n.length;t!(!t[W]&&!t[z]),J=t=>({[W]:Object.keys(t).map((e=>({[e]:t[e]})))});function V(e,n,{auto:i=!0}={}){const r=e=>{let o=Object.keys(e);const h=(t=>!!t[K])(e);if(!h&&o.length>1&&!q(e))return r(J(e));if((e=>!t(e)&&c(e)&&!q(e))(e)){const t=h?e[K]:o[0],r=h?e[P]:e[t];if(!s(r))throw new Error((t=>`Invalid value for key ${t}`)(t));const c={keyId:m(t),pattern:r};return i&&(c.searcher=j(r,n)),c}let a={children:[],operator:o[0]};return o.forEach((n=>{const s=e[n];t(s)&&s.forEach((t=>{a.children.push(r(t))}))})),a};return q(e)||(e=J(e)),r(e)}function B(t,e){const n=t.matches;e.matches=[],o(n)&&n.forEach((t=>{if(!o(t.indices)||!t.indices.length)return;const{indices:n,value:s}=t;let i={indices:n,value:s};t.key&&(i.key=t.key.src),t.idx>-1&&(i.refIndex=t.idx),e.matches.push(i)}))}function U(t,e){e.score=t.score}class D{constructor(t,e={},n){this.options={...M,...e},this.options.useExtendedSearch,this._keyStore=new g(this.options.keys),this.setCollection(t,n)}setCollection(t,e){if(this._docs=t,e&&!(e instanceof y))throw new Error("Incorrect 'index' type");this._myIndex=e||L(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(t){o(t)&&(this._docs.push(t),this._myIndex.add(t))}remove(t=(()=>!1)){const e=[];for(let n=0,s=this._docs.length;n{let n=1;t.matches.forEach((({key:t,norm:s,score:i})=>{const r=t?t.weight:null;n*=Math.pow(0===i&&r?Number.EPSILON:i,(r||1)*(e?1:s))})),t.score=n}))}(a,{ignoreFieldNorm:h}),c&&a.sort(o),i(e)&&e>-1&&(a=a.slice(0,e)),function(t,e,{includeMatches:n=M.includeMatches,includeScore:s=M.includeScore}={}){const i=[];return n&&i.push(B),s&&i.push(U),t.map((t=>{const{idx:n}=t,s={item:e[n],refIndex:n};return i.length&&i.forEach((e=>{e(t,s)})),s}))}(a,this._docs,{includeMatches:n,includeScore:r})}_searchStringList(t){const e=j(t,this.options),{records:n}=this._myIndex,s=[];return n.forEach((({v:t,i:n,n:i})=>{if(!o(t))return;const{isMatch:r,score:c,indices:h}=e.searchIn(t);r&&s.push({item:t,idx:n,matches:[{score:c,value:t,norm:i,indices:h}]})})),s}_searchLogical(t){const e=V(t,this.options),n=(t,e,s)=>{if(!t.children){const{keyId:n,searcher:i}=t,r=this._findMatches({key:this._keyStore.get(n),value:this._myIndex.getValueForItemAtKeyId(e,n),searcher:i});return r&&r.length?[{idx:s,item:e,matches:r}]:[]}const i=[];for(let r=0,c=t.children.length;r{if(o(t)){let c=n(e,t,s);c.length&&(i[s]||(i[s]={idx:s,item:t,matches:[]},r.push(i[s])),c.forEach((({matches:t})=>{i[s].matches.push(...t)})))}})),r}_searchObjectList(t){const e=j(t,this.options),{keys:n,records:s}=this._myIndex,i=[];return s.forEach((({$:t,i:s})=>{if(!o(t))return;let r=[];n.forEach(((n,s)=>{r.push(...this._findMatches({key:n,value:t[s],searcher:e}))})),r.length&&i.push({idx:s,item:t,matches:r})})),i}_findMatches({key:e,value:n,searcher:s}){if(!o(n))return[];let i=[];if(t(n))n.forEach((({v:t,i:n,n:r})=>{if(!o(t))return;const{isMatch:c,score:h,indices:a}=s.searchIn(t);c&&i.push({score:h,key:e,value:t,idx:n,norm:r,indices:a})}));else{const{v:t,n:r}=n,{isMatch:c,score:o,indices:h}=s.searchIn(t);c&&i.push({score:o,key:e,value:t,norm:r,indices:h})}return i}}D.version="7.0.0",D.createIndex=L,D.parseIndex=function(t,{getFn:e=M.getFn,fieldNormWeight:n=M.fieldNormWeight}={}){const{keys:s,records:i}=t,r=new y({getFn:e,fieldNormWeight:n});return r.setKeys(s),r.setIndexRecords(i),r},D.config=M,function(...t){O.push(...t)}(R);export{D as default}; \ No newline at end of file diff --git a/assets/js/priorities.mjs b/assets/js/priorities.mjs new file mode 100644 index 0000000000..72a76a397f --- /dev/null +++ b/assets/js/priorities.mjs @@ -0,0 +1,210 @@ +import { gsap } from "./modules/gsap@3.12.5.min.mjs"; + +// If we need to add a search bar, use this next line: +// import Fuse from "./modules/fuse.js@7.0.0.min.mjs"; + +// ===================== +// Blank target to links +// ===================== + +/** + * Adds `target="_blank"` to element links. This will open links in a new window. + * @returns {void} + */ +function addBlankTargetToElementLinks() { + for (const anchor of document.querySelectorAll(".element-content a")) { + if (!(anchor instanceof HTMLAnchorElement)) { + continue; + } + anchor.target = "_blank"; + } +} + +// ============= +// Scroll to top +// ============= + +/** + * Setups scroll to top functionality. + * @returns {void} + */ +function setupScrollToTop() { + const navElement = document.querySelector("#priorities-navigation"); + const scrollToTopElement = document.querySelector("#scroll-to-top"); + let scrollToTopTween = null; + let scrollState = ""; + const showScrollToTop = () => { + if (scrollState === "show") { + return; + } + scrollState = "show"; + if (scrollToTopTween != null) { + scrollToTopTween.kill(); + } + scrollToTopElement.style.display = "block"; + scrollToTopTween = gsap.to(scrollToTopElement, { + opacity: 1, + duration: 0.5, + }); + }; + const hideScrollToTop = () => { + if (scrollState === "hide") { + return; + } + scrollState = "hide"; + if (scrollToTopTween != null) { + scrollToTopTween.kill(); + } + scrollToTopTween = gsap.to(scrollToTopElement, { + opacity: 0, + duration: 0.5, + onComplete: () => { + scrollToTopElement.style.display = "none"; + } + }); + }; + const scrollToTopObserver = new IntersectionObserver((entries, observer) => { + const entry = entries[0]; + if (entry.isIntersecting) { + hideScrollToTop(); + } else { + const rect = navElement.getBoundingClientRect(); + if (rect.y > window.innerHeight) { + hideScrollToTop(); + } else { + showScrollToTop(); + } + } + }); + scrollToTopObserver.observe(navElement); +} + +// ============================ +// Open details selected in URL +// ============================ +/** + * If there's a hash to the URL, make sure that the appropritate details tag is open. + * @returns {void} + */ +function openDetailsSelectedInUrl() { + if (window.location.hash === "") { + return; + } + + /** @type {HTMLDetailsElement | null} */ + const element = document.querySelector(`${window.location.hash} details.element-main`); + if (element == null) { + return; + } + element.open = true; +} + +// ======================== +// Handle navigation events +// ======================== +/** + * Opens the current hash when the navigation changes. + * The API is still quite new, not supported by some browsers. (2024-11-21) + * @returns {void} + */ +function handleNavigateEvent() { + // The API is not yet supported by all browsers. + if (!("Navigation" in window)) { + //openOnHandleClick(); + handleHashChangeEvent(); + return; + } + + /** + * @param {NavigateEvent} event + */ + navigation.addEventListener("navigate", (event) => { + const url = new URL(event.destination.url); + /** @type {HTMLDetailsElement | null} */ + const element = document.querySelector(`${url.hash} details.element-main`); + if (element == null) { + return; + } + element.open = true; + }); +} + +/** + * More common API, listens to "hashchange" event. + * @returns {void} + */ +function handleHashChangeEvent() { + window.addEventListener("hashchange", () => { + /** @type {HTMLDetailsElement | null} */ + const element = document.querySelector(`${window.location.hash} details.element-main`); + if (element == null) { + return; + } + element.open = true; + }); +} + +// ================= +// Animate
    +// ================= +function animateDetailsTag() { + const prioritiesContainer = document.querySelector(".priorities-container"); + if (!(prioritiesContainer instanceof HTMLElement)) { + throw new Error("Couldn't find .priorities-container"); + } + + /** + * Triggered on opening animation end. + * @param {AnimationEvent} event + */ + const onAnimationEnd = (event) => { + let target = event.target; + while (true) { + if (!(target instanceof HTMLElement)) { + return; + } + if (target instanceof HTMLDetailsElement) { + break; + } + target = target.parentElement; + } + target.classList.remove("opening"); + }; + + const mutationObserver = new MutationObserver((mutationList, _) => { + for (const mutation of mutationList) { + const target = mutation.target; + if (!(target instanceof HTMLDetailsElement)) { + continue; + } + if (mutation.attributeName === "open") { + target.removeEventListener("animationend", onAnimationEnd); + + if (target.open) { + // Just opened. + target.classList.add("opening"); + target.addEventListener("animationend", onAnimationEnd); + } else { + target.classList.remove("opening"); + } + } + } + }); + mutationObserver.observe(prioritiesContainer, { attributes: true, subtree: true }); +} + +// ==== +// Main +// ==== + +/** + * Main function. + */ +function main() { + addBlankTargetToElementLinks(); + setupScrollToTop(); + openDetailsSelectedInUrl(); + handleNavigateEvent(); + animateDetailsTag(); +} +main(); diff --git a/collections/_priorities/android-00-improve-debugging-of-reports-from-google-play.md b/collections/_priorities/android-00-improve-debugging-of-reports-from-google-play.md new file mode 100644 index 0000000000..0ddb3eb606 --- /dev/null +++ b/collections/_priorities/android-00-improve-debugging-of-reports-from-google-play.md @@ -0,0 +1,10 @@ +--- +category: android +rank: 0 +state: "active" +anchor: "improve-debugging-of-reports-from-google-play" +title: "Improve debugging of reports from the Google Play console" +description: | + When your game launches on Google Play, you will start to get automated reports from players highlighting issues like freezes, crashes, or poor performance. Right now that information is hard to make sense of due to the lack of debug symbols. We want to make it easier for users to utilize these reports either by providing debug symbols, or streamlining the process for developers to upload debug symbols themselves. +details: +--- diff --git a/collections/_priorities/android-01-add-support-for-external-textures-for-ar-core.md b/collections/_priorities/android-01-add-support-for-external-textures-for-ar-core.md new file mode 100644 index 0000000000..dbfb0a3150 --- /dev/null +++ b/collections/_priorities/android-01-add-support-for-external-textures-for-ar-core.md @@ -0,0 +1,17 @@ +--- +category: android +rank: 1 +state: "active" +anchor: "add-support-for-external-textures-for-ar-core" +title: "Add support for external textures for AR Core" +description: | + External textures are textures where their data comes from an external source. For AR, it means getting the camera feed (or anything that can be rendered) from the host operating system and displaying it over in Godot. +details: + - type: note + content: | + Link for the [AR Core plugin for Android](https://github.com/godotvr/godot_arcore). + - type: prs + content: | + - [Add external texture support (GLES3) #96982](https://github.com/godotengine/godot/pull/96982) + - [Add external texture support (Vulkan) #97163](https://github.com/godotengine/godot/pull/97163) +--- diff --git a/collections/_priorities/animation-00-improve-and-polish-new-skeletonmodifier3d.md b/collections/_priorities/animation-00-improve-and-polish-new-skeletonmodifier3d.md new file mode 100644 index 0000000000..59f209295b --- /dev/null +++ b/collections/_priorities/animation-00-improve-and-polish-new-skeletonmodifier3d.md @@ -0,0 +1,22 @@ +--- +category: animation +rank: 0 +state: "active" +anchor: "improve-and-polish-new-skeletonmodifier3d" +title: "Improve and polish new SkeletonModifier3D" +description: | + The `SkeletonModifier3D` abstract node [introduced in 4.3](https://godotengine.org/releases/4.3/#animation-skeletonmodifier3d-node) helps users to modify and add new functionality to bones via script. We want to build upon that new structure to add new features to it. +details: + - type: note + content: | + We identified at least two features that we wish to add + - Add a bone constraint (based on the Blender spec) + - Add spring bones (based on the VRM1 spec) + - type: proposals + content: | + - [Implement Skeleton re-targeting node #3379](https://github.com/godotengine/godot-proposals/issues/3379) + - type: prs + content: | + - [Add RetargetModifier3D for realtime retarget to keep original rest #97824](https://github.com/godotengine/godot/pull/97824) + - [Implement LookAtModifier3D #98446](https://github.com/godotengine/godot/pull/98446) +--- diff --git a/collections/_priorities/animation-01-overhaul-skeleton2d-animation.md b/collections/_priorities/animation-01-overhaul-skeleton2d-animation.md new file mode 100644 index 0000000000..8cdfc3cc28 --- /dev/null +++ b/collections/_priorities/animation-01-overhaul-skeleton2d-animation.md @@ -0,0 +1,10 @@ +--- +category: animation +rank: 1 +state: "active" +anchor: "overhaul-skeleton2d-animation" +title: "Overhaul `Skeleton2D` animation" +description: | + While the experience of dealing with 3D skeletons improved greatly upon the years, the same cannot be said of the 2D one. Our wish is to overhaul `Skeleton2D` animation in order to make it easier to animate and develop complex 2D figures. +details: +--- diff --git a/collections/_priorities/assetio-00-improve-compatibility-with-blender.md b/collections/_priorities/assetio-00-improve-compatibility-with-blender.md new file mode 100644 index 0000000000..737a4a5267 --- /dev/null +++ b/collections/_priorities/assetio-00-improve-compatibility-with-blender.md @@ -0,0 +1,18 @@ +--- +category: assetio +rank: 0 +state: "active" +anchor: "improve-compatibility-with-blender" +title: "Improve compatibility with Blender" +description: | + As [Blender](https://blender.org/) is both a FOSS and a very popular 3D editor choice by the majority of our users, it makes sense to improve compatibility with it. You can already import `.blend` files, but it’s limited to models, textures, lights, and cameras. + + Godot imports `.blend` files by calling into Blender and asking Blender to export a `.gltf` file, which Godot then imports. Therefore, everything we want to export from Blender needs to be exported to the glTF data, including glTF extensions, and then Godot needs to import those, all in order for that data to make its way to Godot. +details: + - type: note + content: | + For materials, [Khronos](https://www.khronos.org/) has a [selection of material extensions](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos). Improving compatibility with Blender materials will require Blender exporting data using these extensions, and then Godot adding support for it. + - type: note + content: | + For constraints, VRM has a series of glTF extensions that add feature to glTF, including [`VRMC_node_constraint`](https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_node_constraint-1.0) which adds aim, roll, and rotation constraints. However, note that Khronos and VRM recently announced a collaboration, so some of this functionality may end up being replaced by Khronos extensions. Also, users do not have to wait if they want this feature - [a GDScript implementation of VRM](https://github.com/V-Sekai/godot-vrm) is available thanks to [@lyuma](https://github.com/lyuma). +--- diff --git a/collections/_priorities/assetio-01-improve-import-dialog.md b/collections/_priorities/assetio-01-improve-import-dialog.md new file mode 100644 index 0000000000..74cf9c5e81 --- /dev/null +++ b/collections/_priorities/assetio-01-improve-import-dialog.md @@ -0,0 +1,10 @@ +--- +category: assetio +rank: 1 +state: "active" +anchor: "improve-import-dialog" +title: "Improve import dialog to provide more control over imported resources" +description: | + Godot currently has an advanced import dialogue which allows you to tweak many properties while importing assets. We want to polish and expand this dialogue to be more powerful. At the very least we would like to improve the preview lighting, expose more tools for material editing, and expose many more common properties. +details: +--- diff --git a/collections/_priorities/assetio-02-add-preview-icons-on-imported-scenes.md b/collections/_priorities/assetio-02-add-preview-icons-on-imported-scenes.md new file mode 100644 index 0000000000..92b82135c6 --- /dev/null +++ b/collections/_priorities/assetio-02-add-preview-icons-on-imported-scenes.md @@ -0,0 +1,13 @@ +--- +category: assetio +rank: 2 +state: "active" +anchor: "add-preview-icons-on-imported-scenes" +title: "Add preview icons on imported scenes" +description: | + Currently, imported scenes (such as `.glb`, `.fbx`, and `.blender` files) show the scene icon in the FileSystem tab, making it difficult to filter out these files. Showing a preview icon of the scene would greatly help users in their workflow. +details: + - type: prs + content: | + - [Generate thumbnails on imported scenes. #96544](https://github.com/godotengine/godot/pull/96544) +--- diff --git a/collections/_priorities/assetio-03-improve-importer-performance.md b/collections/_priorities/assetio-03-improve-importer-performance.md new file mode 100644 index 0000000000..ff4237b01d --- /dev/null +++ b/collections/_priorities/assetio-03-improve-importer-performance.md @@ -0,0 +1,10 @@ +--- +category: assetio +rank: 3 +state: "active" +anchor: "improve-importer-performance" +title: "Improve importer performance" +description: | + As users create larger games with more assets, we need to continue improving the performance of our importer to ensure that users spend as little time waiting for import as possible. +details: +--- diff --git a/collections/_priorities/assetio-04-fix-scene-inheritance.md b/collections/_priorities/assetio-04-fix-scene-inheritance.md new file mode 100644 index 0000000000..fa82012f37 --- /dev/null +++ b/collections/_priorities/assetio-04-fix-scene-inheritance.md @@ -0,0 +1,13 @@ +--- +category: assetio +rank: 4 +state: "active" +anchor: "make-scene-inheritance-more-robust" +title: "Make scene inheritance more robust" +description: | + Scene inheritance is the concept of creating a scene based on an existing one. It is a feature that should work well in theory, but can be quite finicky in reality. +details: + - type: note + content: | + One idea is to give nodes unique IDs. See [KhronosGroup/glTF#2337](https://github.com/KhronosGroup/glTF/issues/2337). +--- diff --git a/collections/_priorities/core-00-overhaul-addon-startup.md b/collections/_priorities/core-00-overhaul-addon-startup.md new file mode 100644 index 0000000000..e4410e4428 --- /dev/null +++ b/collections/_priorities/core-00-overhaul-addon-startup.md @@ -0,0 +1,13 @@ +--- +category: core +rank: 0 +state: "active" +anchor: "overhaul-addon-startup" +title: "Overhaul addon startup" +description: | + As the community grows and uses more and more add-ons, we found out that the current add-on startup logic is reaching its limits, as sometimes, you need to reload the editor for new add-ons to work. That’s why we intend to overhaul it to make the experience seamless. +details: + - type: note + content: | + Some research and optimization is needed for the editor file system access. We need to optimize all file access extensions. Ultimately, we need to rethink the current system in order to overhaul it. +--- diff --git a/collections/_priorities/core-01-reliable-headless-command-line-export.md b/collections/_priorities/core-01-reliable-headless-command-line-export.md new file mode 100644 index 0000000000..c02fe4537e --- /dev/null +++ b/collections/_priorities/core-01-reliable-headless-command-line-export.md @@ -0,0 +1,10 @@ +--- +category: core +rank: 1 +state: "active" +anchor: "reliable-headless-command-line-export" +title: "Reliable headless command line export" +description: | + As bigger projects often rely on CI (continuous integration) to test and deploy their projects, they need to be able to export games from lean environments that don’t implement a graphical interface (headless). For this, we need to make headless command line export more reliable, as there’s currently some issues that prevent it from working flawlessly. +details: +--- diff --git a/collections/_priorities/core-02-improve-performance-of-scene-multithreading.md b/collections/_priorities/core-02-improve-performance-of-scene-multithreading.md new file mode 100644 index 0000000000..76cd806946 --- /dev/null +++ b/collections/_priorities/core-02-improve-performance-of-scene-multithreading.md @@ -0,0 +1,13 @@ +--- +category: core +rank: 2 +state: "active" +anchor: "improve-performance-of-scene-multithreading" +title: "Improve performance of scene multithreading" +description: | + We put a lot of effort lately to add ways to split the work of nodes into multiple threads. This can lead to great leaps in terms of performance. Unfortunately, many nodes are structured in a way that makes it difficult for them to take advantage of multiple threads. We need to audit our current nodes and fix the ones that are relying on being single threaded. +details: + - type: note + content: | + As part of this work we need to create high quality tests and benchmarks. Both to ensure that we do not break anything, but also to validate the performance improvements. +--- diff --git a/collections/_priorities/core-03-make-optimizations-throughout-the-core.md b/collections/_priorities/core-03-make-optimizations-throughout-the-core.md new file mode 100644 index 0000000000..330429fc0a --- /dev/null +++ b/collections/_priorities/core-03-make-optimizations-throughout-the-core.md @@ -0,0 +1,13 @@ +--- +category: core +rank: 3 +state: "active" +anchor: "make-optimizations-throughout-the-core" +title: "Make optimizations throughout the core" +description: | + Much of the engine would benefit from a careful evaluation of the current performance bottlenecks and improvements to ensure that it is running as fast as possible. Godot 4.0 drastically improved the overall architecture of Godot, but there is still a lot of legacy code that is not benefitting from the architectural improvements. We need to seek out those areas and fix them. +details: + - type: note + content: | + To aid in this, we want to create more educational materials on profiling performance issues (both for CPU and GPU workloads). +--- diff --git a/collections/_priorities/core-04-create-more-benchmarks.md b/collections/_priorities/core-04-create-more-benchmarks.md new file mode 100644 index 0000000000..18a1833c1d --- /dev/null +++ b/collections/_priorities/core-04-create-more-benchmarks.md @@ -0,0 +1,15 @@ +--- +category: core +rank: 4 +state: "active" +anchor: "create-more-benchmarks" +title: "Create more benchmarks" +description: | + In order to make the best decisions, we need to rely on measurable data. In order to be able to do this, we need to create more benchmarks. It gives the added benefit over time that we can spot regressions more easily, together with unit tests, as we started lately to track performance of nightly builds. +details: + - type: note + content: | + We do have a public benchmark page! You can follow Godot's main branch performance on the following website: + + [https://benchmarks.godotengine.org/](https://benchmarks.godotengine.org/) +--- diff --git a/collections/_priorities/dotnet-00-enable-users-to-export-their-csharp-projects-on-the-web.md b/collections/_priorities/dotnet-00-enable-users-to-export-their-csharp-projects-on-the-web.md new file mode 100644 index 0000000000..627fd432fe --- /dev/null +++ b/collections/_priorities/dotnet-00-enable-users-to-export-their-csharp-projects-on-the-web.md @@ -0,0 +1,10 @@ +--- +category: dotnet +rank: 0 +state: "active" +anchor: "enable-users-to-export-their-csharp-projects-on-the-web" +title: "Enable users to export their C# projects on the Web" +description: | + The technology stars seem to align in order to enable us to export C# projects on the Web. We fully intend to make this a reality as soon as possible. +details: +--- diff --git a/collections/_priorities/dotnet-01-deprecate-dotnet-godot-builds-for-a-dotnet-plugin.md b/collections/_priorities/dotnet-01-deprecate-dotnet-godot-builds-for-a-dotnet-plugin.md new file mode 100644 index 0000000000..866d86aa71 --- /dev/null +++ b/collections/_priorities/dotnet-01-deprecate-dotnet-godot-builds-for-a-dotnet-plugin.md @@ -0,0 +1,12 @@ +--- +category: dotnet +rank: 1 +state: "active" +anchor: "deprecate-dotnet-godot-builds-for-a-dotnet-plugin" +title: "Deprecate .NET Godot builds for a .NET plugin" +description: | + For the time being, users are required to download an entirely separate Godot build in order to use C# features. With our new upcoming .NET module, we intend to support C# with a simple plugin. + + Everyone wins, as users won’t have to choose a special version to run C#. It reduces the number of builds on our side by half. Also, it will simplify .NET maintenance. +details: +--- diff --git a/collections/_priorities/dotnet-02-host-a-dotnet-specific-documentation-website.md b/collections/_priorities/dotnet-02-host-a-dotnet-specific-documentation-website.md new file mode 100644 index 0000000000..c0fd1834c6 --- /dev/null +++ b/collections/_priorities/dotnet-02-host-a-dotnet-specific-documentation-website.md @@ -0,0 +1,12 @@ +--- +category: dotnet +rank: 2 +state: "active" +anchor: "host-a-dotnet-specific-documentation-website" +title: "Host a .NET-specific documentation website" +description: | + While the API documentation is complete, it currently lacks a specific .NET API. Both for newcomers and experienced users, it can be difficult or imprecise to translate the GDScript/C++ API to C#. + + We intend to host a new website that will host an API documentation oriented for .NET users. +details: +--- diff --git a/collections/_priorities/editor-00-make-the-editor-resilient-to-file-changes.md b/collections/_priorities/editor-00-make-the-editor-resilient-to-file-changes.md new file mode 100644 index 0000000000..d3bc701f40 --- /dev/null +++ b/collections/_priorities/editor-00-make-the-editor-resilient-to-file-changes.md @@ -0,0 +1,16 @@ +--- +category: editor +rank: 0 +state: "active" +anchor: "make-the-editor-resilient-to-file-changes" +title: "Make the editor resilient to files changed/added externally" +description: | + Godot doesn’t know how to handle project file changes that happen on non-imported files, such as scripts, when it happens outside of the editor. This can be a common occurrence for users that use an external code editor. This can lead to numerous errors and inconveniences, such as scenes refusing to load. We intend to make this a relic of the past. +details: + - type: note + content: | + We introduced recently UIDs to non-imported files, such as scripts, in Godot 4.4.dev5. We need testing though to fully make sure that it solves our issues. + - type: prs + content: | + - [Universalize UID support in all resource types #97352](https://github.com/godotengine/godot/pull/97352) +--- diff --git a/collections/_priorities/editor-01-provide-some-way-to-access-internal-subresources-of-imported-scenes.md b/collections/_priorities/editor-01-provide-some-way-to-access-internal-subresources-of-imported-scenes.md new file mode 100644 index 0000000000..0d033d4417 --- /dev/null +++ b/collections/_priorities/editor-01-provide-some-way-to-access-internal-subresources-of-imported-scenes.md @@ -0,0 +1,15 @@ +--- +category: editor +rank: 1 +state: "active" +anchor: "provide-some-way-to-access-internal-subresources-of-imported-scenes" +title: "Provide some way to access internal subresources of imported scenes" +description: | + Some file formats are actually containers that hold multiple resources. FBX and GLTF files are one of these, as they not only contain 3D models, but also can contain animations and textures. Currently, the only way to expose these resources is to tell the editor to pull these out on import. + + We are thinking about providing a way to users to access internal subresources. +details: + - type: proposals + content: | + - [Add ability to reference subresources and inspect them in filesystem #8750](https://github.com/godotengine/godot-proposals/issues/8750) +--- diff --git a/collections/_priorities/editor-02-implement-gdscript-refactoring-tools.md b/collections/_priorities/editor-02-implement-gdscript-refactoring-tools.md new file mode 100644 index 0000000000..e5a90fc40b --- /dev/null +++ b/collections/_priorities/editor-02-implement-gdscript-refactoring-tools.md @@ -0,0 +1,13 @@ +--- +category: editor +rank: 2 +state: "active" +anchor: "implement-gdscript-refactoring-tools" +title: "Implement GDScript refactoring tools" +description: | + A lot of modern IDEs offer refactoring tools in order to rename variables and symbols across the codebase. We intend to add this feature to our internal GDScript code editor. +details: + - type: proposals + content: | + - [Add "refactor" tooling to rename symbols in the script editor #899](https://github.com/godotengine/godot-proposals/issues/899) +--- diff --git a/collections/_priorities/editor-03-implement-editor-support-for-creating-updating-source-code-for-gdextensions.md b/collections/_priorities/editor-03-implement-editor-support-for-creating-updating-source-code-for-gdextensions.md new file mode 100644 index 0000000000..09bf2ff49a --- /dev/null +++ b/collections/_priorities/editor-03-implement-editor-support-for-creating-updating-source-code-for-gdextensions.md @@ -0,0 +1,13 @@ +--- +category: editor +rank: 3 +state: "active" +anchor: "implement-editor-support-for-creating-updating-source-code-for-gdextensions" +title: "Implement editor support for creating/updating source code for GDExtensions" +description: | + Right now the editor is not able to open or edit GDExtension classes. It effectively treats them like binary blobs. We want to make opening and editing GDExtension classes easier to do from within the engine and provide some of the comforts from regular scripting to GDExtension. +details: + - type: proposals + content: | + - [Allow creating GDExtension plugins from inside the Godot editor #90979](https://github.com/godotengine/godot/pull/90979) +--- diff --git a/collections/_priorities/gdextension-00-allow-compiling-godot-as-a-library.md b/collections/_priorities/gdextension-00-allow-compiling-godot-as-a-library.md new file mode 100644 index 0000000000..70ef90fa95 --- /dev/null +++ b/collections/_priorities/gdextension-00-allow-compiling-godot-as-a-library.md @@ -0,0 +1,16 @@ +--- +category: gdextension +rank: 0 +state: "active" +anchor: "allow-compiling-godot-as-a-library" +title: "Allow compiling Godot as a library that can be loaded and used by other applications" +description: | + Currently, the engine’s capabilities are only accessible if the application itself is a Godot application. However, there are many situations where an application might want to use Godot as an intermediary. One case would be an application that uses native OS API for it’s UI, but needs Godot to render a complex 3D scene. Our goal is to make Godot available as a library to expand the possible uses of the engine. +details: + - type: note + content: | + This feature is better known as "LibGodot". + - type: prs + content: | + - [Migeran LibGodot Feature #90510](https://github.com/godotengine/godot/pull/90510) +--- diff --git a/collections/_priorities/gdextension-01-allow-gdextensions-to-communicate-with-one-another.md b/collections/_priorities/gdextension-01-allow-gdextensions-to-communicate-with-one-another.md new file mode 100644 index 0000000000..91c45c8b46 --- /dev/null +++ b/collections/_priorities/gdextension-01-allow-gdextensions-to-communicate-with-one-another.md @@ -0,0 +1,10 @@ +--- +category: gdextension +rank: 1 +state: "active" +anchor: "allow-gdextensions-to-communicate-with-one-another" +title: "Allow GDExtensions to communicate with one another" +description: | + GDExtension was created to allow developers to create extensions as if they were coding a module directly in Godot’s source code. Currently, modules can depend on one another, but this is not yet possible for extensions. We aim to expose the necessary API to be able to. So, for example, an extension built with [godot-rust](https://godot-rust.github.io/) would be able to extend an extension built with [godot-cpp](https://github.com/godotengine/godot-cpp). +details: +--- diff --git a/collections/_priorities/gdextension-02-add-the-ability-to-enable-disable-gdextensions-in-project-settings.md b/collections/_priorities/gdextension-02-add-the-ability-to-enable-disable-gdextensions-in-project-settings.md new file mode 100644 index 0000000000..a250219764 --- /dev/null +++ b/collections/_priorities/gdextension-02-add-the-ability-to-enable-disable-gdextensions-in-project-settings.md @@ -0,0 +1,13 @@ +--- +category: gdextension +rank: 2 +state: "active" +anchor: "add-the-ability-to-enable-disable-gdextensions-in-project-settings" +title: "Add the ability to enable/disable GDExtensions in project settings" +description: | + For the time being, there's no way to disable a GDExtension from a project without deleting the related files themselves. We plan to create a dialog akin to the Plugin tab in the Project settings in order to easily enable and disable GDExtensions. +details: + - type: prs + content: | + - [Allow creating GDExtension plugins from inside the Godot editor #90979](https://github.com/godotengine/godot/pull/90979) +--- diff --git a/collections/_priorities/gdscript-00-polish-and-ensure-that-classname-is-robust.md b/collections/_priorities/gdscript-00-polish-and-ensure-that-classname-is-robust.md new file mode 100644 index 0000000000..d1876fdcec --- /dev/null +++ b/collections/_priorities/gdscript-00-polish-and-ensure-that-classname-is-robust.md @@ -0,0 +1,15 @@ +--- +category: gdscript +rank: 0 +state: "active" +anchor: "polish-and-ensure-that-classname-is-robust" +title: "Polish and ensure that `class_name` is robust and works in all cases" +description: | + `class_name` is an handy feature. It permits the user to name their classes and refer to it directly instead of having to preload the class using its path. + + Unfortunately, using `class_name` comes with a few caveats. We do hope to fix these issues in order to give users a better experience with this feature. +details: + - type: trackers + content: | + - [[TRACKER] GDScript `class_name` #99766](https://github.com/godotengine/godot/issues/99766) +--- diff --git a/collections/_priorities/gdscript-01-attain-full-coverage-of-static-type-hints.md b/collections/_priorities/gdscript-01-attain-full-coverage-of-static-type-hints.md new file mode 100644 index 0000000000..c122e48730 --- /dev/null +++ b/collections/_priorities/gdscript-01-attain-full-coverage-of-static-type-hints.md @@ -0,0 +1,15 @@ +--- +category: gdscript +rank: 1 +state: "active" +anchor: "attain-full-coverage-of-static-type-hints" +title: "Attain full coverage of static type hints" +description: | + Static type hints are a well loved feature in GDScript, as not only does it improve performance, but it lowers the amount of possible typing issues. + + We intend to implement static typing for areas that currently lack them. We are thinking about typed dictionaries (already merged for 4.4) and enforcing the typing of signals. +details: + - type: prs + content: | + - [Implement typed dictionaries #78656](https://github.com/godotengine/godot/pull/78656) +--- diff --git a/collections/_priorities/gdscript-02-improve-performance-via-compilation.md b/collections/_priorities/gdscript-02-improve-performance-via-compilation.md new file mode 100644 index 0000000000..88bd68511e --- /dev/null +++ b/collections/_priorities/gdscript-02-improve-performance-via-compilation.md @@ -0,0 +1,13 @@ +--- +category: gdscript +rank: 2 +state: "active" +anchor: "improve-performance-via-compilation" +title: "Improve performance via compilation" +description: | + While GDScript is fast enough to operate as glue between nodes and program basic logic, its performance is lackluster when it comes to pure data crunching. We would like to improve the processing capabilities of the language and its run-time. +details: + - type: note + content: | + We’re currently investigating whether to compile GDScript, or to use [AOT (ahead-of-time)](https://en.wikipedia.org/wiki/Ahead-of-time_compilation) or [JIT (just-in-time)](https://en.wikipedia.org/wiki/Just-in-time_compilation) compilation techniques. +--- diff --git a/collections/_priorities/gdscript-03-add-traits-to-gdscript.md b/collections/_priorities/gdscript-03-add-traits-to-gdscript.md new file mode 100644 index 0000000000..a5dad960d9 --- /dev/null +++ b/collections/_priorities/gdscript-03-add-traits-to-gdscript.md @@ -0,0 +1,13 @@ +--- +category: gdscript +rank: 3 +state: "active" +anchor: "add-traits-to-gdscript" +title: "Add traits to GDScript" +description: | + The main way to reuse code when writing code in GDScript is to use inheritance. While it works well for the most part, it leaves developers to rewrite a lot of code when that method cannot be used. So traits is the path we’re going forward to solve that issue. +details: + - type: proposals + content: | + - [Add a Trait system for GDScript #6416](https://github.com/godotengine/godot-proposals/issues/6416) +--- diff --git a/collections/_priorities/linuxbsd-00-multi-window-support-for-wayland-compositor.md b/collections/_priorities/linuxbsd-00-multi-window-support-for-wayland-compositor.md new file mode 100644 index 0000000000..08ebb200d7 --- /dev/null +++ b/collections/_priorities/linuxbsd-00-multi-window-support-for-wayland-compositor.md @@ -0,0 +1,10 @@ +--- +category: linuxbsd +rank: 0 +state: "active" +anchor: "multi-window-support-for-wayland-compositor" +title: "Multi window support for Wayland compositor" +description: | + Right now the Wayland compositor is limited to making use of a single window. In order to achieve parity with other platforms, we need to add support for creating multiple windows. +details: +--- diff --git a/collections/_priorities/physics-00-integrate-jolt-as-the-default-3d-physics-engine.md b/collections/_priorities/physics-00-integrate-jolt-as-the-default-3d-physics-engine.md new file mode 100644 index 0000000000..38a7a3d335 --- /dev/null +++ b/collections/_priorities/physics-00-integrate-jolt-as-the-default-3d-physics-engine.md @@ -0,0 +1,13 @@ +--- +category: physics +rank: 0 +state: "active" +anchor: "integrate-jolt-as-the-default-3d-physics-engine" +title: "Integrate Jolt as the default 3D physics engine" +description: | + [Jolt](https://github.com/jrouwe/JoltPhysics) is an open-source (MIT licensed) modern, multi core friendly rigid body physics and collision detection library, tailor-made for video games. We want to make it available to users by default, the current GodotPhysics 3D engine would still be available as an option. +details: + - type: prs + content: | + - [Add Jolt Physics as an alternative 3D physics engine #99895](https://github.com/godotengine/godot/pull/99895) +--- diff --git a/collections/_priorities/physics-01-adapt-the-way-godot-exposes-physics-to-mirror-jolt.md b/collections/_priorities/physics-01-adapt-the-way-godot-exposes-physics-to-mirror-jolt.md new file mode 100644 index 0000000000..62870f0562 --- /dev/null +++ b/collections/_priorities/physics-01-adapt-the-way-godot-exposes-physics-to-mirror-jolt.md @@ -0,0 +1,17 @@ +--- +category: physics +rank: 1 +state: "active" +anchor: "adapt-the-way-godot-exposes-physics-to-mirror-jolt" +title: "Adapt the way Godot exposes physics to mirror Jolt" +description: | + As much as our nodes are made to be compatible with multiple physics engines, the existing integration of Jolt (via the [godot-jolt](https://github.com/godot-jolt/godot-jolt) add-on) is not optimal, as there are numerous features that can’t be implemented in Godot due to the current way the system works. In addition to integrating Jolt as the default 3D physics engine, we want to modernize our node bindings in order to fully exploit the new library. +details: + - type: warning + content: | + We do expect it will create some compatibility issues. + - type: proposals + content: | + - [Add per-shape collision filtering to the 3D physics system #7400](https://github.com/godotengine/godot-proposals/issues/7400) + - [Add per-shape physics materials to the 3D physics system #7401](https://github.com/godotengine/godot-proposals/issues/7401) +--- diff --git a/collections/_priorities/platforms-00-add-screen-reader-support-using-accesskit-integration.md b/collections/_priorities/platforms-00-add-screen-reader-support-using-accesskit-integration.md new file mode 100644 index 0000000000..52ee6b84eb --- /dev/null +++ b/collections/_priorities/platforms-00-add-screen-reader-support-using-accesskit-integration.md @@ -0,0 +1,13 @@ +--- +category: platforms +rank: 0 +state: "active" +anchor: "add-screen-reader-support-using-accesskit-integration" +title: "Add screen reader support using AccessKit integration" +description: | + [AccessKit](https://github.com/AccessKit/accesskit) offers a cross-platform way to implement accessibility features for UI toolkits, such as Godot. Integrating screen reader support into Godot will offer us and game developers opportunities to make more accessible products, such as the Godot Editor itself or games made with Godot. +details: + - type: prs + content: | + - [Implement screen reader support using AccessKit library. #76829](https://github.com/godotengine/godot/pull/76829) +--- diff --git a/collections/_priorities/platforms-01-investigate-delays-in-window-creation.md b/collections/_priorities/platforms-01-investigate-delays-in-window-creation.md new file mode 100644 index 0000000000..05c7b2dc17 --- /dev/null +++ b/collections/_priorities/platforms-01-investigate-delays-in-window-creation.md @@ -0,0 +1,13 @@ +--- +category: platforms +rank: 1 +state: "active" +anchor: "investigate-delays-in-window-creation" +title: "Investigate delays in Window creation" +description: | + It is known that compared to Godot 3.x, there’s some delays while creating new `Window`, especially on Windows. +details: + - type: issues + content: | + - [Godot 4 editor UI (menus) significantly slower than 3.x #71795](https://github.com/godotengine/godot/issues/71795) +--- diff --git a/collections/_priorities/platforms-02-distribute-separate-debug-symbols.md b/collections/_priorities/platforms-02-distribute-separate-debug-symbols.md new file mode 100644 index 0000000000..895e67c1c0 --- /dev/null +++ b/collections/_priorities/platforms-02-distribute-separate-debug-symbols.md @@ -0,0 +1,16 @@ +--- +category: platforms +rank: 2 +state: "active" +anchor: "distribute-separate-debug-symbols" +title: "Distribute separate debug symbols" +description: | + Debug symbols allow developers to obtain more information when Godot crashes or logs an error. Currently, developers will only have debug symbols if they compile the engine from scratch. By distributing debug symbols for the official builds, developers would be able to easily diagnose crashes without making a custom build of the engine. +details: + - type: note + content: | + For all platforms that support separated debug symbols. + - type: proposals + content: | + - [Distribute official builds with full debugging symbols #1342](https://github.com/godotengine/godot-proposals/issues/1342) +--- diff --git a/collections/_priorities/platforms-03-improve-gamepad-support.md b/collections/_priorities/platforms-03-improve-gamepad-support.md new file mode 100644 index 0000000000..083ccc770b --- /dev/null +++ b/collections/_priorities/platforms-03-improve-gamepad-support.md @@ -0,0 +1,16 @@ +--- +category: platforms +rank: 3 +state: "active" +anchor: "improve-gamepad-support" +title: "Improve gamepad support" +description: | + We often receive issue reports about gamepad support, as the numbers of gamepads never cease to increase. As we wish to support as many input devices as possible, we want to work towards better support. +details: + - type: note + content: | + We need to investigate how we can do this. One way would be to incorporate more code from SDL, or to integrate SDL_input directly in the engine. + - type: prs + content: | + - [Use SDL for joypad input on Linux #87925](https://github.com/godotengine/godot/pull/87925) +--- diff --git a/collections/_priorities/platforms-04-improve-behavior-of-multiple-monitors-with-different-resolutions.md b/collections/_priorities/platforms-04-improve-behavior-of-multiple-monitors-with-different-resolutions.md new file mode 100644 index 0000000000..14e70b7f2e --- /dev/null +++ b/collections/_priorities/platforms-04-improve-behavior-of-multiple-monitors-with-different-resolutions.md @@ -0,0 +1,13 @@ +--- +category: platforms +rank: 4 +state: "active" +anchor: "improve-behavior-of-multiple-monitors-with-different-resolutions-and-dpi-scaling-factors" +title: "Improve behavior of multiple monitors with different resolutions and DPI scaling factors" +description: | + Godot games should be able to seamlessly work when dragged across multiple monitors even when the monitors have different resolutions and DPI scaling factors. +details: + - type: prs + content: | + - [[WIP] Implement native DPI scaling. #86022](https://github.com/godotengine/godot/pull/86022) +--- diff --git a/collections/_priorities/rendering-00-overhaul-sdfgi.md b/collections/_priorities/rendering-00-overhaul-sdfgi.md new file mode 100644 index 0000000000..48e7a7bd44 --- /dev/null +++ b/collections/_priorities/rendering-00-overhaul-sdfgi.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 0 +state: "active" +anchor: "overhaul-sdfgi" +title: "Overhaul SDFGI to improve performance and quality" +description: | + We’re really proud of our in-house technology for global illumination, but we think that we can push performance and quality even further. This is a long-term effort, but is something we are very excited about and would like to see finished. +details: + - type: prs + content: | + - [Upgrade SDFGI to HDDAGI #86267](https://github.com/godotengine/godot/pull/86267) +--- diff --git a/collections/_priorities/rendering-01-significantly-improve-post-processing-effects.md b/collections/_priorities/rendering-01-significantly-improve-post-processing-effects.md new file mode 100644 index 0000000000..696f989c10 --- /dev/null +++ b/collections/_priorities/rendering-01-significantly-improve-post-processing-effects.md @@ -0,0 +1,10 @@ +--- +category: rendering +rank: 1 +state: "active" +anchor: "significantly-improve-post-processing-effects" +title: "Significantly improve post processing effects and add common effects" +description: | + Post processing effects are a weak spot in Godot’s renderer. The performance and quality are both worse than we would like. We want to overhaul or replace most of our post processing effects in order to achieve both better performance and higher quality. +details: +--- diff --git a/collections/_priorities/rendering-02-add-a-rendering-compositor.md b/collections/_priorities/rendering-02-add-a-rendering-compositor.md new file mode 100644 index 0000000000..22fc004fa4 --- /dev/null +++ b/collections/_priorities/rendering-02-add-a-rendering-compositor.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 2 +state: "active" +anchor: "add-a-rendering-compositor" +title: "Add a rendering compositor to allow controlling render pass order" +description: | + The goal of the rendering compositor is to give users fine control over the order of rendering operations and allow them to implement more custom behavior within the renderer. +details: + - type: proposals + content: | + - [Implement a Rendering Compositor #7916](https://github.com/godotengine/godot-proposals/issues/7916) +--- diff --git a/collections/_priorities/rendering-03-enhanced-graphics-debugging.md b/collections/_priorities/rendering-03-enhanced-graphics-debugging.md new file mode 100644 index 0000000000..e004f4b9f0 --- /dev/null +++ b/collections/_priorities/rendering-03-enhanced-graphics-debugging.md @@ -0,0 +1,10 @@ +--- +category: rendering +rank: 3 +state: "active" +anchor: "enhance-graphics-debugging" +title: "Enhance graphics debugging including VRAM debugging and better information from the current profiler" +description: | + Debugging and profiling are necessary tools to release high-fidelity games. Right now Godot’s debugging and profiling tools are relatively basic and unpolished. We want to make it easier to diagnose rendering issues and pinpoint performance problems instead of users having to rely on guessing and checking. +details: +--- diff --git a/collections/_priorities/rendering-04-add-shader-templates.md b/collections/_priorities/rendering-04-add-shader-templates.md new file mode 100644 index 0000000000..5d32041c55 --- /dev/null +++ b/collections/_priorities/rendering-04-add-shader-templates.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 4 +state: "active" +anchor: "add-shader-templates" +title: "Add shader templates to allow overriding the built-in shaders" +description: | + Shader templates can be used to have full control over the shaders used to render your assets. This allows you to both optimize your shader by removing unnecessary parts and to dramatically change your shader by adding custom behavior. +details: + - type: prs + content: | + - [Custom shader templates #94427](https://github.com/godotengine/godot/pull/94427) +--- diff --git a/collections/_priorities/rendering-05-implement-texture-and-mesh-streaming.md b/collections/_priorities/rendering-05-implement-texture-and-mesh-streaming.md new file mode 100644 index 0000000000..c97718af0e --- /dev/null +++ b/collections/_priorities/rendering-05-implement-texture-and-mesh-streaming.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 5 +state: "active" +anchor: "implement-texture-and-mesh-streaming" +title: "Implement texture and mesh streaming" +description: | + This feature would enable the streaming of assets to progressively load scenes, textures, and models in order to boost performance and loading times. +details: + - type: proposals + content: | + - [Implement Mesh streaming #6109](https://github.com/godotengine/godot-proposals/issues/6109) +--- diff --git a/collections/_priorities/rendering-06-expose-a-ray-tracing-api.md b/collections/_priorities/rendering-06-expose-a-ray-tracing-api.md new file mode 100644 index 0000000000..50f87e6040 --- /dev/null +++ b/collections/_priorities/rendering-06-expose-a-ray-tracing-api.md @@ -0,0 +1,10 @@ +--- +category: rendering +rank: 6 +state: "active" +anchor: "expose-a-ray-tracing-api" +title: "Expose a ray tracing API and eventually use it for built in effects" +description: | + Hardware ray tracing is slowly becoming more widespread. Soon it will be common for all desktop computers to support hardware ray tracing and soon after mobile devices will as well. We want to expose an API for hardware ray tracing through our `RenderingDevice` so that users can begin to make use of it. Then, eventually, we want to use that API to leverage hardware ray tracing in the _Forward+_ renderer. +details: +--- diff --git a/collections/_priorities/rendering-07-add-a-deferred-renderer.md b/collections/_priorities/rendering-07-add-a-deferred-renderer.md new file mode 100644 index 0000000000..a89638d2cc --- /dev/null +++ b/collections/_priorities/rendering-07-add-a-deferred-renderer.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 7 +state: "active" +anchor: "add-a-deferred-renderer" +title: "Add a deferred renderer" +description: | + Deferred rendering is a technique that can be used to increase performance in certain situations at the cost of flexibility. As Godot users create more complex games, we are seeing more games that would benefit from trading the flexibility that comes with our current renderer for more performance. +details: + - type: proposals + content: | + - [Add a project setting to enable deferred rendering #8295](https://github.com/godotengine/godot-proposals/issues/8295) +--- diff --git a/collections/_priorities/rendering-08-overhaul-lightmapgi.md b/collections/_priorities/rendering-08-overhaul-lightmapgi.md new file mode 100644 index 0000000000..20bdf8ed33 --- /dev/null +++ b/collections/_priorities/rendering-08-overhaul-lightmapgi.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 8 +state: "active" +anchor: "overhaul-lightmapgi" +title: "Overhaul `LightmapGI` to improve baking workflow, performance, and features" +description: | + `LightmapGI` needs a lot of polish and improvements for us to meet the goals we have set for it. Baking times are slower than we want and it often takes too much manual effort to get bakes to achieve the quality that users need. +details: + - type: trackers + content: | + - [[TRACKER] LightmapGI (GPU lightmapper) issues #56033](https://github.com/godotengine/godot/issues/56033) +--- diff --git a/collections/_priorities/rendering-09-implement-webgpu-backend-for-web-exports.md b/collections/_priorities/rendering-09-implement-webgpu-backend-for-web-exports.md new file mode 100644 index 0000000000..52b9197710 --- /dev/null +++ b/collections/_priorities/rendering-09-implement-webgpu-backend-for-web-exports.md @@ -0,0 +1,13 @@ +--- +category: rendering +rank: 9 +state: "active" +anchor: "implement-webgpu-backend-for-web-exports" +title: "Implement WebGPU backend for web exports" +description: | + WebGPU is a new and modern API that offers direct access to GPUs, exposing features that are not otherwise available on the web. Once WebGPU is supported, it will be possible to export high-fidelity _Forward+_ and _Mobile_ projects to the Web. +details: + - type: proposals + content: | + - [Add WebGPU support #6646](https://github.com/godotengine/godot-proposals/issues/6646) +--- diff --git a/collections/_priorities/scripting-00-implement-namespaces-for-scripting-languages.md b/collections/_priorities/scripting-00-implement-namespaces-for-scripting-languages.md new file mode 100644 index 0000000000..0ab9abd5b1 --- /dev/null +++ b/collections/_priorities/scripting-00-implement-namespaces-for-scripting-languages.md @@ -0,0 +1,14 @@ +--- +category: scripting +rank: 0 +state: "active" +anchor: "implement-namespaces-for-scripting-languages" +title: "Implement namespaces for scripting languages" +description: | + One of the main complaints of the GDScript language is the lack of namespaces. A namespace is a way to group code by a common name. This permits the reuse of classes using the same name, as long as they can be differentiated by their namespace. + + But the problem can be found with .NET and GDExtension too. The problem occurs at the registration phase of classes in our internal database. + + With namespaces, plugin developers could use their own class names without worrying about clashing with users' internal ones. +details: +--- diff --git a/collections/_priorities/web-00-improve-web-export-size.md b/collections/_priorities/web-00-improve-web-export-size.md new file mode 100644 index 0000000000..0b2010c5ab --- /dev/null +++ b/collections/_priorities/web-00-improve-web-export-size.md @@ -0,0 +1,10 @@ +--- +category: web +rank: 0 +state: "active" +anchor: "improve-web-export-size" +title: "Improve Web export size" +description: | + As Godot grows in features, it also grows in size. Web games need to be as small as possible and the size of the engine is becoming a pain point for web games. We need to find ways to reduce the binary size as much as possible and provide tools to developers to easily cut features and reduce the size further. +details: +--- diff --git a/collections/_priorities/web-01-improve-loading-time-for-web-builds.md b/collections/_priorities/web-01-improve-loading-time-for-web-builds.md new file mode 100644 index 0000000000..4cd1631163 --- /dev/null +++ b/collections/_priorities/web-01-improve-loading-time-for-web-builds.md @@ -0,0 +1,13 @@ +--- +category: web +rank: 1 +state: "active" +anchor: "improve-loading-time-for-web-builds" +title: "Improve loading time for web builds" +description: | + Currently, if no specific steps are taken by the game developer, resources for a game on the Web are bundled into one single `.pck` file. As users need to download the entire game’s assets at front, we need to find a better way to split the loading throughout the game, only when needed. This would greatly improve the starting time of the game. +details: + - type: note + content: | + We need to investigate ways to solve the issue. We think a custom asynchronous filesystem could fix the issue, downloading files individually when needed. +--- diff --git a/collections/_priorities/web-02-customizing-engine-builds-by-detecting-used-features.md b/collections/_priorities/web-02-customizing-engine-builds-by-detecting-used-features.md new file mode 100644 index 0000000000..ef12c76b2f --- /dev/null +++ b/collections/_priorities/web-02-customizing-engine-builds-by-detecting-used-features.md @@ -0,0 +1,18 @@ +--- +category: web +rank: 2 +state: "active" +anchor: "customizing-engine-builds-by-detecting-used-features" +title: "Customizing engine builds by detecting used features from a project" +description: | + For most platforms, the current official Godot builds suffice. Games may not use every feature the build has under the hood, but storage is usually not an issue. But Web platform games require the developer to optimize the load size (as bandwidth can be limited) and the load speed (Internet speed can vary). + + We are investigating how we can reduce the build size, starting by offering an easy way to the users to customize their builds. +details: + - type: note + content: | + We're thinking (out loud) about: + - investigating the gains possible by customizing the engine builds + - documenting the “Edit Compilation Configuration Profile” tool offered in the Editor + - finding a way to offer more official Web exports +--- diff --git a/collections/_priorities/web-03-continue-to-improve-compatibility-across-devices-and-browsers.md b/collections/_priorities/web-03-continue-to-improve-compatibility-across-devices-and-browsers.md new file mode 100644 index 0000000000..f5431cef0d --- /dev/null +++ b/collections/_priorities/web-03-continue-to-improve-compatibility-across-devices-and-browsers.md @@ -0,0 +1,10 @@ +--- +category: web +rank: 3 +state: "active" +anchor: "continue-to-improve-compatibility-across-devices-and-browsers" +title: "Continue to improve compatibility across devices and browsers" +description: | + [Before 4.3’s introduction of single-threaded builds](https://godotengine.org/article/progress-report-web-export-in-4-3/), we had some compatibility issues, especially on macOS and iOS devices. The problem is maybe less important than it once was, but we continue to be alert about compatibility issues that can exist now or at any point in the future. +details: +--- diff --git a/collections/_priorities/xr-00-enhance-openxr-action-map-to-support-binding-modifier.md b/collections/_priorities/xr-00-enhance-openxr-action-map-to-support-binding-modifier.md new file mode 100644 index 0000000000..6406a3633e --- /dev/null +++ b/collections/_priorities/xr-00-enhance-openxr-action-map-to-support-binding-modifier.md @@ -0,0 +1,13 @@ +--- +category: xr +rank: 0 +state: "active" +anchor: "enhance-openxr-action-map-to-support-binding-modifier" +title: "Enhance OpenXR action map to support binding modifier" +description: | + OpenXR's action map is similar to Godot's input map, in that it allows mapping inputs to in-game actions. We'd like to enhance Godot's support of OpenXR action maps by allowing the developer to apply modifiers to the actions, such as setting thresholds, enabling haptics, or converting analog inputs (like thumbsticks and trackpads) to D-Pad-like actions. +details: + - type: prs + content: | + - [OpenXR: Add support for binding modifiers #97140](https://github.com/godotengine/godot/pull/97140) +--- diff --git a/collections/_priorities/xr-01-make-action-map-system-available-to-webxr.md b/collections/_priorities/xr-01-make-action-map-system-available-to-webxr.md new file mode 100644 index 0000000000..5b9c75470e --- /dev/null +++ b/collections/_priorities/xr-01-make-action-map-system-available-to-webxr.md @@ -0,0 +1,16 @@ +--- +category: xr +rank: 1 +state: "active" +anchor: "make-action-map-system-available-to-webxr" +title: "Make action map system available to WebXR" +description: | + OpenXR uses the "OpenXR action map system" for handling input, whereas WebXR (and any other XR SDKs added via GDExtension) will use their own way of handling input. This complicates making a game that will work on both OpenXR and WebXR. We'd like to add a generalized XR action map system, which will use the OpenXR action map system on OpenXR, but provide a fallback implementation that can be used with any XR SDK. +details: + - type: note + content: | + And eventually other platforms. + - type: proposals + content: | + - [Implement generalized XR action map system for use outside OpenXR #6548](https://github.com/godotengine/godot-proposals/issues/6548) +--- diff --git a/collections/_priorities/xr-02-add-openxr-support-for-d3d12-and-metal.md b/collections/_priorities/xr-02-add-openxr-support-for-d3d12-and-metal.md new file mode 100644 index 0000000000..48f57214b9 --- /dev/null +++ b/collections/_priorities/xr-02-add-openxr-support-for-d3d12-and-metal.md @@ -0,0 +1,13 @@ +--- +category: xr +rank: 2 +state: "active" +anchor: "add-openxr-support-for-d3d12-and-metal" +title: "Add OpenXR support for DirectX12 and Metal" +description: | + Currently, when using OpenXR, you can use the Compatibility renderer or the _Forward+_ and _Mobile_ renderers, but only when using Vulkan. We want to add support for DirectX12 and Metal so that users on all platforms can benefit from OpenXR. +details: + - type: prs + content: | + - [Openxr KHR metal enable #98872](https://github.com/godotengine/godot/pull/98872) +--- diff --git a/collections/_priorities/xr-03-move-khronos-loader-from-vendor-to-core.md b/collections/_priorities/xr-03-move-khronos-loader-from-vendor-to-core.md new file mode 100644 index 0000000000..12addcd069 --- /dev/null +++ b/collections/_priorities/xr-03-move-khronos-loader-from-vendor-to-core.md @@ -0,0 +1,16 @@ +--- +category: xr +rank: 3 +state: "active" +anchor: "move-khronos-loader-from-vendor-to-core" +title: "Move Khronos loader support from our vendor plugin to the core of the Godot" +description: | + The end goal is the ability to deploy Godot XR applications made with the executable downloaded from the website on any Android OpenXR conformant device. +details: + - type: note + content: | + The Vendor plugin should only be required to use vendor specific features. + - type: note + content: | + As part of this we will add support for Android to use the Khronos loader. +--- diff --git a/collections/_priorities/xr-04-add-support-for-render-models.md b/collections/_priorities/xr-04-add-support-for-render-models.md new file mode 100644 index 0000000000..3c11a1051d --- /dev/null +++ b/collections/_priorities/xr-04-add-support-for-render-models.md @@ -0,0 +1,10 @@ +--- +category: xr +rank: 4 +state: "active" +anchor: "add-support-for-render-models" +title: "Add support for render models (i.e. displaying the correct controllers and other peripherals)" +description: | + This feature is already supported for the Meta vendor solution. Once a core API is becoming available in OpenXR, we intend to adopt this feature quickly. +details: +--- diff --git a/collections/_priorities/xr-05-continue-development-of-the-godot-xr-tools-library.md b/collections/_priorities/xr-05-continue-development-of-the-godot-xr-tools-library.md new file mode 100644 index 0000000000..8d15a156e4 --- /dev/null +++ b/collections/_priorities/xr-05-continue-development-of-the-godot-xr-tools-library.md @@ -0,0 +1,10 @@ +--- +category: xr +rank: 5 +state: "active" +anchor: "continue-development-of-the-godot-xr-tools-library" +title: "Continue development of the Godot XR Tools library" +description: | + The Godot XR Tools library offers out of the box locomotion and interaction solutions built on top of Godot's core functionality. We intend to continue developing these tools. +details: +--- diff --git a/collections/templates/priority.md b/collections/templates/priority.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/collections/templates/priority.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/pages/priorities/_includes/category.html b/pages/priorities/_includes/category.html new file mode 100644 index 0000000000..ce3b849fbf --- /dev/null +++ b/pages/priorities/_includes/category.html @@ -0,0 +1,38 @@ +{% assign nb_of_priorities = include.elements | size %} + +{% if nb_of_priorities > 0 %} +
    +
    +
    + +
    + + + +
    + {% assign header_number = include.level | to_i | plus: 1 %} + {% assign header_tag = "h" | append: header_number %} + <{{ header_tag }} class="category-title"> +
    {{ include.name }}
    + +
    + unfold_more + unfold_less +
    +
    +
    +
      + {% for element in include.elements %} +
    • + {% + include_relative _includes/element.html + element=element + %} +
    • + {% endfor %} +
    +
    +
    +
    +
    +{% endif %} diff --git a/pages/priorities/_includes/element.html b/pages/priorities/_includes/element.html new file mode 100644 index 0000000000..7d343e4338 --- /dev/null +++ b/pages/priorities/_includes/element.html @@ -0,0 +1,98 @@ +{% assign element = include.element %} + +
    +
    + +
    +
    +
    {{ element.title | markdownify }}
    +
    +
    + + + +
    +
    +
    + unfold_more + unfold_less +
    +
    +
    +
    + {% if element.description == "" %} + ... + {% else %} + {{ element.description | markdownify }} + {% endif %} +
    +
    {% for detail in element.details %} +
    +
    +
    + {% if detail.type == "note" %} + info + {% elsif detail.type == "warning" %} + warning + {% elsif detail.type == "links" %} + file_export + {% elsif detail.type == "trackers" %} + list_alt_check + {% elsif detail.type == "prs" %} + + {% elsif detail.type == "issues" %} + + {% elsif detail.type == "proposals" %} + + {% endif %} +
    +
    + {% if detail.type == "note" %} + Note + {% elsif detail.type == "warning" %} + Warning + {% elsif detail.type == "links" %} + Links + {% elsif detail.type == "trackers" %} + Trackers + {% elsif detail.type == "prs" %} + Pull requests + {% elsif detail.type == "issues" %} + Issues + {% elsif detail.type == "proposals" %} + Proposals + {% endif %} +
    +
    +
    + {{ detail.content | markdownify }} +
    +
    + {% endfor %}
    +
    {% unless element.edits == null %} +
    Edit history
    + + + {% assign edit_elements = element.edits | sort: "date" | reverse %} + {% for edit_element in edit_elements %} + + {% assign date = edit_element["date"] %} + {% assign content = edit_element["content"] %} + + + + {% endfor %} + +
    + + + {{ content | markdownify }} +
    + {% endunless %}
    +
    +
    +
    diff --git a/pages/priorities/_includes/nav_link.html b/pages/priorities/_includes/nav_link.html new file mode 100644 index 0000000000..bf9bff6ab0 --- /dev/null +++ b/pages/priorities/_includes/nav_link.html @@ -0,0 +1,32 @@ +{% assign now = "now" | date: "%s" | plus: 0 %} +{% assign last_updated_duration = include.last_updated_duration | default: 0 %} +{% assign enable_recent_update = include.enable_recent_update %} +{% assign nb_of_priorities = include.priorities | size %} +{% assign is_list_item = include.is_list_item %} + +{% if nb_of_priorities > 0 %} + {% if is_list_item %} +
  • + {% endif %} + + {{ include.title }} + + {% assign is_recent = false %} + {% for element in include.priorities %} + {% if element.last_updated != "" %} + {% assign last_updated = element.last_updated | date: "%s" | plus: 0 %} + {% assign last_updated_time = now | minus: last_updated_duration %} + {% if last_updated > last_updated_time %} + {% assign is_recent = true %} + {% break %} + {% endif %} + {% endif %} + {% endfor %} + {% if is_recent and enable_recent_update %} +
    + {% endif %} +
    + {% if is_list_item %} +
  • + {% endif %} +{% endif %} diff --git a/pages/priorities/index.html b/pages/priorities/index.html new file mode 100644 index 0000000000..6e8efe04c7 --- /dev/null +++ b/pages/priorities/index.html @@ -0,0 +1,650 @@ +--- +permalink: /priorities +title: "Priorities" +description: "Godot Priorities" +layout: default +--- + +{% assign core_priorities = site.priorities | where: "category", "core" | sort: "rank" %} +{% assign physics_priorities = site.priorities | where: "category", "physics" | sort: "rank" %} +{% assign rendering_priorities = site.priorities | where: "category", "rendering" | sort: "rank" %} +{% assign animation_priorities = site.priorities | where: "category", "animation" | sort: "rank" %} +{% assign navigation_priorities = site.priorities | where: "category", "navigation" | sort: "rank" %} +{% assign editor_priorities = site.priorities | where: "category", "editor" | sort: "rank" %} +{% assign assetio_priorities = site.priorities | where: "category", "assetio" | sort: "rank" %} +{% assign platforms_priorities = site.priorities | where: "category", "platforms" | sort: "rank" %} +{% assign android_priorities = site.priorities | where: "category", "android" | sort: "rank" %} +{% assign ios_priorities = site.priorities | where: "category", "ios" | sort: "rank" %} +{% assign linuxbsd_priorities = site.priorities | where: "category", "linuxbsd" | sort: "rank" %} +{% assign macos_priorities = site.priorities | where: "category", "macos" | sort: "rank" %} +{% assign windows_priorities = site.priorities | where: "category", "windows" | sort: "rank" %} +{% assign web_priorities = site.priorities | where: "category", "web" | sort: "rank" %} +{% assign xr_priorities = site.priorities | where: "category", "xr" | sort: "rank" %} +{% assign scripting_priorities = site.priorities | where: "category", "scripting" | sort: "rank" %} +{% assign gdscript_priorities = site.priorities | where: "category", "gdscript" | sort: "rank" %} +{% assign dotnet_priorities = site.priorities | where: "category", "dotnet" | sort: "rank" %} +{% assign gdextension_priorities = site.priorities | where: "category", "gdextension" | sort: "rank" %} +{% assign documentation_priorities = site.priorities | where: "category", "documentation" | sort: "rank" %} + +{% include header.html %} + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    +
    +
    +

    + This page is our wishlist: + it details the improvements that we consider most important to make the Godot Engine a better tool for its users. + The items were created by talking to the volunteer maintainers for each area about the current state of things, + their personal goals, and what kind of contributions they are looking for. +

    +

    + As with any wishlist, these points are an idealized version of what is to come in the project’s future. + To realize them, we will need the support from you, whether you are a representative for a company looking to sponsor Godot + or a game developer capable to contribute to the codebase directly. The Godot Engine has always been a community effort — there is only so much ground we can cover with Godot Foundation contractors at the moment. +

    +
    +
    +

    + We hope that by publishing this list, we can align our communal efforts: by showcasing which areas need to see + improvements the most and what the next steps would be for anyone taking action. Let this list be an indicator of… +

    +
      +
    1. what kind of contractors we would like to hire if donations increase,
    2. +
    3. what areas are ripe with good first issues for new contributors, and
    4. +
    5. where corporate sponsors could lend a helping hand
    6. +
    + +
    +
    +
    +
    +
    + + + + +
    + + {% + include_relative _includes/category.html + level="1" + id="core" + name="Core" + elements=core_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="physics" + name="Physics" + elements=physics_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="rendering" + name="Rendering" + elements=rendering_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="animation" + name="Animation" + elements=animation_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="navigation" + name="Navigation" + elements=navigation_priorities + %} + + + {% + include_relative _includes/category.html + level="1" + id="editor" + name="Editor" + elements=editor_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="assetio" + name="Asset import & export" + elements=assetio_priorities + %} + + + {% + include_relative _includes/category.html + level="1" + id="platforms" + name="Platforms" + elements=platforms_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="android" + name="Android" + elements=android_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="ios" + name="iOS" + elements=ios_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="linuxbsd" + name="Linux/BSDs" + elements=linuxbsd_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="macos" + name="macOS" + elements=macos_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="windows" + name="Windows" + elements=windows_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="web" + name="Web" + elements=web_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="xr" + name="XR" + elements=xr_priorities + %} + + + {% + include_relative _includes/category.html + level="1" + id="scripting" + name="Scripting" + elements=scripting_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="gdscript" + name="GDScript" + elements=gdscript_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="dotnet" + name=".NET" + elements=dotnet_priorities + %} + + + {% + include_relative _includes/category.html + level="2" + id="gdextension" + name="GDExtension" + elements=gdextension_priorities + %} + + + {% + include_relative _includes/category.html + level="1" + id="documentation" + name="Documentation" + elements=documentation_priorities + %} +
    + + +
    + +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    +
    + +{% include footer.html %} diff --git a/storage/priorities/fonts/google-icons.woff2 b/storage/priorities/fonts/google-icons.woff2 new file mode 100644 index 0000000000..be51d3ed0b Binary files /dev/null and b/storage/priorities/fonts/google-icons.woff2 differ diff --git a/storage/priorities/fonts/octicons.woff2 b/storage/priorities/fonts/octicons.woff2 new file mode 100644 index 0000000000..1101f6d036 Binary files /dev/null and b/storage/priorities/fonts/octicons.woff2 differ diff --git a/storage/priorities/images/page/map2-2048.webp b/storage/priorities/images/page/map2-2048.webp new file mode 100644 index 0000000000..d23d2a0d4b Binary files /dev/null and b/storage/priorities/images/page/map2-2048.webp differ diff --git a/storage/priorities/images/page/map2-4096.webp b/storage/priorities/images/page/map2-4096.webp new file mode 100644 index 0000000000..1d223d0c91 Binary files /dev/null and b/storage/priorities/images/page/map2-4096.webp differ