Compare commits
2 Commits
main
...
gitea-1.21
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0377ec43b0 | ||
|
|
291e5b85d9 |
38
README.md
38
README.md
@@ -10,41 +10,3 @@
|
|||||||
- --custom-path pointing to the repo directory
|
- --custom-path pointing to the repo directory
|
||||||
- --config pointing to the custom app.ini
|
- --config pointing to the custom app.ini
|
||||||
- Update your user preferences to set the new theme, or it will keep showing the old one.
|
- Update your user preferences to set the new theme, or it will keep showing the old one.
|
||||||
|
|
||||||
## Alternative setup with Docker
|
|
||||||
|
|
||||||
- Initialize `docker-compose.yml` following Gitea's [basic instructions](https://docs.gitea.com/installation/install-with-docker#basics).
|
|
||||||
- Install Gitea following Gitea's [installation instructions](https://docs.gitea.com/installation/install-with-docker#installation).
|
|
||||||
- Edit `app.ini` in `[Gitea's root]/conf` to append the following:
|
|
||||||
```
|
|
||||||
[ui]
|
|
||||||
DEFAULT_THEME = bthree-dark
|
|
||||||
THEMES = bthree-dark
|
|
||||||
```
|
|
||||||
(Docker Gitea's root directory defaults to `/gitea/gitea/` from installation root.)
|
|
||||||
- Clone this repository to Gitea's root directory, so that its contents are merged. (Gitea's _custom_ directory defaults to Gitea's root.)
|
|
||||||
|
|
||||||
Gitea's root flat directory tree should look similar to the following, if done correctly:
|
|
||||||
```
|
|
||||||
.
|
|
||||||
├── actions_artifacts
|
|
||||||
├── actions_log
|
|
||||||
├── attachments
|
|
||||||
├── avatars
|
|
||||||
├── conf
|
|
||||||
├── gitea.db
|
|
||||||
├── home
|
|
||||||
├── indexers
|
|
||||||
├── jwt
|
|
||||||
├── log
|
|
||||||
├── packages
|
|
||||||
├── public
|
|
||||||
├── queues
|
|
||||||
├── README.md
|
|
||||||
├── repo-archive
|
|
||||||
├── repo-avatars
|
|
||||||
├── sessions
|
|
||||||
├── sphinx
|
|
||||||
├── templates
|
|
||||||
└── tmp
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
${CommitTitle}
|
|
||||||
|
|
||||||
${CommitBody}
|
|
||||||
|
|
||||||
Pull Request: https://projects.blender.org/infrastructure/blender-devops/pulls/${PullRequestIndex}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
${PullRequestTitle}
|
|
||||||
|
|
||||||
Pull Request: https://projects.blender.org/infrastructure/blender-devops/pulls/${PullRequestIndex}
|
|
||||||
1
hooks/.gitignore
vendored
1
hooks/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
test/**/tmp
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# Git Hooks
|
|
||||||
|
|
||||||
## Tests
|
|
||||||
|
|
||||||
For our `deny_binary` Git hook, we have several test cases. They can be run locally:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ ./test/run_deny_binary_tests.sh
|
|
||||||
== Running tests in directory deny_binary ==
|
|
||||||
Running 10_initial_text_file_test.sh... ok
|
|
||||||
Running 11_add_text_file_test.sh... ok
|
|
||||||
Running 20_initial_binary_file_test.sh... ok
|
|
||||||
Running 21_add_binary_file_test.sh... ok
|
|
||||||
Running 22_add_suspicious_binary_file_test.sh... ok
|
|
||||||
Running 30_add_binary_lfs_file_test.sh... ok
|
|
||||||
Running 40_add_binary_file_and_convert_test.sh... ok
|
|
||||||
Running 50_migrate_legacy_file_to_lfs_test.sh... ok
|
|
||||||
Running 51_move_legacy_file_with_binary.sh... ok
|
|
||||||
All tests passed.
|
|
||||||
```
|
|
||||||
|
|
||||||
Or they can be run using the Gitea image to do end-to-end testing (see `compose.yml` for changing the image).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ docker compose up
|
|
||||||
...
|
|
||||||
Attaching to gitea_deny_binary_tests
|
|
||||||
gitea_deny_binary_tests | == Running tests in directory deny_binary ==
|
|
||||||
gitea_deny_binary_tests | Running 10_initial_text_file_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 11_add_text_file_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 20_initial_binary_file_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 21_add_binary_file_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 22_add_suspicious_binary_file_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 30_add_binary_lfs_file_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 40_add_binary_file_and_convert_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 50_migrate_legacy_file_to_lfs_test.sh... ok
|
|
||||||
gitea_deny_binary_tests | Running 51_move_legacy_file_with_binary.sh... ok
|
|
||||||
gitea_deny_binary_tests | All tests passed.
|
|
||||||
gitea_deny_binary_tests exited with code 0
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reject Merge Commits
|
|
||||||
|
|
||||||
The `blender_merged_hook` script rejects merge commits to branches were we don't want them. It is installed as an `pre-receive` hook in the following repositories:
|
|
||||||
|
|
||||||
- `blender/blender`
|
|
||||||
- `blender/blender-addons`
|
|
||||||
- `blender/blender-addons-contrib`
|
|
||||||
- `blender/blender-assets`
|
|
||||||
- `blender/blender-benchmarks`
|
|
||||||
- `blender/blender-developer-docs`
|
|
||||||
- `blender/blender-manual`
|
|
||||||
- `blender/blender-test-data`
|
|
||||||
- `blender/lib-linux_x64`
|
|
||||||
- `blender/lib-macos_arm64`
|
|
||||||
- `blender/lib-macos_x64`
|
|
||||||
- `blender/lib-source`
|
|
||||||
- `blender/lib-windows_arm64`
|
|
||||||
- `blender/lib-windows_x64`
|
|
||||||
- `brecht/test-hooks`
|
|
||||||
|
|
||||||
## Deny Binary Files
|
|
||||||
|
|
||||||
The `deny_binary` script rejects commit that add binary files that should have been tracked as Git LFS object instead. We also provide some tests, which can be run using Docker Compose inside our Gitea container image. It has been installed as a `pre-receive` hook in the following repositories:
|
|
||||||
|
|
||||||
- `blender/blender`
|
|
||||||
- `blender/blender-assets`
|
|
||||||
- `blender/blender-benchmarks`
|
|
||||||
- `blender/blender-developer-docs`
|
|
||||||
- `blender/blender-manual`
|
|
||||||
- `blender/blender-test-data`
|
|
||||||
- `blender/lib-linux_x64`
|
|
||||||
- `blender/lib-macos_arm64`
|
|
||||||
- `blender/lib-macos_x64`
|
|
||||||
- `blender/lib-source`
|
|
||||||
- `blender/lib-windows_arm64`
|
|
||||||
- `blender/lib-windows_x64`
|
|
||||||
- `studio/dogwalk`
|
|
||||||
|
|
||||||
To circumvent the rejection you can add `override restrictions` anywhere in the commit message.
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
#!/bin/bash -eu
|
|
||||||
#
|
|
||||||
# Blender: modified version of update.sample in hooks directory to:
|
|
||||||
# - Deny merge commits to release branches
|
|
||||||
# - Deny merge of non-release branches to main
|
|
||||||
#
|
|
||||||
# This indirectly checks for accidentally merging main into release
|
|
||||||
# branches, as main is almost certain to contain merge commits not
|
|
||||||
# in the release branch.
|
|
||||||
#
|
|
||||||
# To enable this hook, rename this file to "pre-receive" or place it in
|
|
||||||
# an "pre-receive.d" folder.
|
|
||||||
|
|
||||||
# No revision indicator.
|
|
||||||
zero_revision="0000000000000000000000000000000000000000"
|
|
||||||
|
|
||||||
# Check if we need to verify merge commits for this branch.
|
|
||||||
need_verify_merge_commit()
|
|
||||||
{
|
|
||||||
local branch="$1"
|
|
||||||
local old_revision="$2"
|
|
||||||
|
|
||||||
if [ "$old_revision" = "$zero_revision" ]; then
|
|
||||||
# New branch, always ok to push.
|
|
||||||
false
|
|
||||||
elif [ "$branch" = "main" ]; then
|
|
||||||
# Some merge commits allowed in main branch.
|
|
||||||
true
|
|
||||||
elif (echo "${branch}" | grep -Eq ^blender-v[0-9]\.[0-9][0-9]?-release$); then
|
|
||||||
# No merge commits in release branch.
|
|
||||||
true
|
|
||||||
else
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if this is an invalid merge commit.
|
|
||||||
is_invalid_merge_commit()
|
|
||||||
{
|
|
||||||
local branch="$1"
|
|
||||||
local revision="$2"
|
|
||||||
|
|
||||||
# Detect if this revision is a merge commit. It's based on the commit merge
|
|
||||||
# message which is weak, but not clear how to do it otherwise.
|
|
||||||
if git show -s --format=%B ${revision} | grep -Eq "Merge (remote-tracking )?branch '"; then
|
|
||||||
if (echo "${branch}" | grep -Eq ^blender-v[0-9]\.[0-9][0-9]?-release$); then
|
|
||||||
# In release branch, all merge commits are invalid.
|
|
||||||
true
|
|
||||||
elif [ "$branch" = "main" ]; then
|
|
||||||
# In main branch, only merge commits from release branches.
|
|
||||||
if git show -s --format=%B ${revision} | grep -Eq "Merge (remote-tracking )?branch '(origin\/)?blender-v[0-9]\.[0-9][0-9]?-release'"; then
|
|
||||||
false
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
false
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Read stdin for ref information.
|
|
||||||
while read oldrev newrev refname; do
|
|
||||||
# Detect type of update.
|
|
||||||
if [ "$newrev" = "$zero_revision" ]; then
|
|
||||||
newrev_type=delete
|
|
||||||
else
|
|
||||||
newrev_type=$(git cat-file -t $newrev)
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$refname","$newrev_type" in
|
|
||||||
refs/tags/*,commit)
|
|
||||||
# un-annotated tag
|
|
||||||
;;
|
|
||||||
refs/tags/*,delete)
|
|
||||||
# delete tag
|
|
||||||
;;
|
|
||||||
refs/tags/*,tag)
|
|
||||||
# annotated tag
|
|
||||||
;;
|
|
||||||
refs/heads/*,commit)
|
|
||||||
# branch
|
|
||||||
branch=${refname##refs/heads/}
|
|
||||||
|
|
||||||
if need_verify_merge_commit "$branch" "$oldrev"; then
|
|
||||||
for r in $(test "$oldrev" = $zero_revision \
|
|
||||||
&& git rev-list $newrev \
|
|
||||||
|| git rev-list $newrev ^$oldrev); do
|
|
||||||
is_invalid_merge_commit ${branch} ${r} && {
|
|
||||||
printf "error: *** %s\n" \
|
|
||||||
"You may only merge release branches into main, no other merge commits are allowed." \
|
|
||||||
"See Blender's release branch developer documentation for details." >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
;;
|
|
||||||
refs/heads/*,delete)
|
|
||||||
# delete branch
|
|
||||||
;;
|
|
||||||
refs/remotes/*,commit)
|
|
||||||
# tracking branch
|
|
||||||
;;
|
|
||||||
refs/remotes/*,delete)
|
|
||||||
# delete tracking branch
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# Anything else (is there anything else?)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
services:
|
|
||||||
gitea_deny_binary_tests:
|
|
||||||
image: ghcr.io/blender/gitea:v1.25.3
|
|
||||||
container_name: gitea_deny_binary_tests
|
|
||||||
working_dir: /workspace
|
|
||||||
command: bash -c "./test/run_deny_binary_tests.sh"
|
|
||||||
volumes:
|
|
||||||
- ./:/workspace
|
|
||||||
user: root
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
#!/bin/bash -eu
|
|
||||||
#
|
|
||||||
# Reject commits with binary files, which should have used LFS instead. Allow
|
|
||||||
# overriding when "override restrictions" is in the commit message.
|
|
||||||
#
|
|
||||||
# To enable this hook, rename this file to "pre-receive" or place it in
|
|
||||||
# a "pre-receive.d" folder.
|
|
||||||
|
|
||||||
# Use 'strict mode': http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
nullsha="0000000000000000000000000000000000000000"
|
|
||||||
status=0
|
|
||||||
# This is the message to include in your commit to override.
|
|
||||||
commit_override_msg="override restrictions"
|
|
||||||
|
|
||||||
handle_pipefails() {
|
|
||||||
# ignore exit code 141 from simple command pipes
|
|
||||||
# - use with: cmd1 | cmd2 || handle_pipefails $?
|
|
||||||
(( $1 == 141 )) && return 0
|
|
||||||
return $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Read stdin for ref information.
|
|
||||||
while read oldrev newrev refname; do
|
|
||||||
# Skip branch deletions.
|
|
||||||
if [ "$newrev" = "$nullsha" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$oldrev" = "$nullsha" ]; then
|
|
||||||
if [ $(git rev-parse HEAD) = "HEAD" ]; then
|
|
||||||
# Iterate over all commits if there is no HEAD.
|
|
||||||
# This happens when the repo has just been initalized
|
|
||||||
rev_range=${newrev}
|
|
||||||
else
|
|
||||||
# Don't iterate over any commits already in the default branch of the repo
|
|
||||||
rev_range=HEAD..${newrev}
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
rev_range=${oldrev}..${newrev}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for branches and tags, but not pull requests in refs/pull. Otherwise Gitea
|
|
||||||
# fails to create a pull request without explaining why.
|
|
||||||
if [[ "$refname" == refs/heads/* ]]; then
|
|
||||||
:
|
|
||||||
elif [[ "$refname" == refs/tags/* ]]; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Loop over each commit.
|
|
||||||
for commit in $(git rev-list --objects ${rev_range} --filter=object:type=commit); do
|
|
||||||
|
|
||||||
# Get list of potentially binary files in this commit
|
|
||||||
mapfile -t binary_files < <(
|
|
||||||
git log --diff-filter=d --pretty=format:%H -M100% --numstat ${commit}^! |
|
|
||||||
awk -F'\t' '$1=="-" && $2=="-" {print $3}'
|
|
||||||
)
|
|
||||||
|
|
||||||
if [ ${#binary_files[@]} -eq 0 ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for override message
|
|
||||||
override=0
|
|
||||||
if git log --pretty=format:%B ${commit}^! | grep -qi "${commit_override_msg}"; then
|
|
||||||
override=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
rejected_files=()
|
|
||||||
for file in "${binary_files[@]}"; do
|
|
||||||
if [[ $file == *" => "* ]]; then
|
|
||||||
# If the name contains " => " then this probably means the file was moved.
|
|
||||||
# If it was just moved, then it must still be a binary file.
|
|
||||||
rejected_files+=("$file")
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
# Check if it's an LFS pointer
|
|
||||||
# Use handle_pipefails as we may run into SIGPIPE error code
|
|
||||||
if git show "${commit}:${file}" | git lfs pointer --check --stdin || handle_pipefails $?; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
rejected_files+=("$file")
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ ${#rejected_files[@]} -gt 0 ]; then
|
|
||||||
if [ "$override" -gt 0 ]; then
|
|
||||||
echo "Your push contains binary files but was accepted because of override commit message:"
|
|
||||||
else
|
|
||||||
status=1
|
|
||||||
echo "Your push was rejected because it contains binary files not tracked by Git LFS:"
|
|
||||||
fi
|
|
||||||
echo "Commit: $commit"
|
|
||||||
for file in "${rejected_files[@]}"; do
|
|
||||||
echo "File: $file"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$status" -ne "0" ]; then
|
|
||||||
echo
|
|
||||||
echo "You must make sure that the binary files are tracked with Git LFS or seek help from the repo administrators."
|
|
||||||
echo "(Perhaps you did not setup Git LFS with 'git lfs install'?)"
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
exit $status
|
|
||||||
17
hooks/notice
17
hooks/notice
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
REPO_PATH=$(pwd)
|
|
||||||
REPO_NAME=$(basename "$REPO_PATH" .git)
|
|
||||||
ORG_NAME=$(basename "$(dirname "$REPO_PATH")")
|
|
||||||
NEW_SERVER="git.blender.org"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "*********************************************************************************"
|
|
||||||
echo "* IMPORTANT NOTICE *"
|
|
||||||
echo "* Blender Projects is moving its Git SSH domain to git.blender.org! *"
|
|
||||||
echo "* If you haven't already, please update your Git remote to use the *"
|
|
||||||
echo "* git@git.blender.org host instead of the git@projects.blender.org one. *"
|
|
||||||
echo "* *"
|
|
||||||
echo "* More information: https://devtalk.blender.org/t/-/41098 *"
|
|
||||||
echo "*********************************************************************************"
|
|
||||||
echo ""
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Run single test provided via $1.
|
|
||||||
# Prints "ok" on success, "FAIL" on failure, and returns the appropriate status code.
|
|
||||||
run_test() {
|
|
||||||
local TEST_SCRIPT=$1
|
|
||||||
printf '%s' "Running $(basename "${TEST_SCRIPT}")... "
|
|
||||||
|
|
||||||
# Run test silently.
|
|
||||||
# Return 0 on success, 1 on failure.
|
|
||||||
if "${TEST_SCRIPT}" > /dev/null 2>&1; then
|
|
||||||
echo "ok"
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
echo "FAIL"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run all tests in the given directory (specified as $1).
|
|
||||||
# All .sh tests are executed in sorted order.
|
|
||||||
# The script reports how many tests failed and exits with non-zero status if any did.
|
|
||||||
run_tests_in_directory() {
|
|
||||||
local DIR=$1
|
|
||||||
local failed=0
|
|
||||||
|
|
||||||
echo "== Running tests in directory $(basename "${DIR}") =="
|
|
||||||
|
|
||||||
# Iterate over all .sh files and run them one by one.
|
|
||||||
for test_script in $(ls "${DIR}" | sort); do
|
|
||||||
case "${test_script}" in
|
|
||||||
*.sh)
|
|
||||||
if ! run_test "${DIR}/${test_script}"; then
|
|
||||||
failed=$((failed + 1))
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# After running all tests, report overall result.
|
|
||||||
if [ "$failed" -ne 0 ]; then
|
|
||||||
echo "$failed test(s) failed."
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "All tests passed."
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: create text file in the empty repository and try to push it.
|
|
||||||
#
|
|
||||||
# It is expected to pass as it is perfectly nomial usage of Git for text
|
|
||||||
# based files.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: add text file to the existing repository and try to push it.
|
|
||||||
#
|
|
||||||
# It is expected to pass as it is perfectly nomial usage of Git for text
|
|
||||||
# based files.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/NOTES.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add NOTES.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add file"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: Add binary file to an empty repository and try to push.
|
|
||||||
#
|
|
||||||
# It should fail as we should block binary files from be pushed.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: add binary file to the existing repository and try to push it.
|
|
||||||
#
|
|
||||||
# This test is expected to fail as new binary files are expected to be
|
|
||||||
# using Git LFS.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add binary file"
|
|
||||||
if git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: add binary file that starts with Git LFS reference content.
|
|
||||||
#
|
|
||||||
# This test is expected to fail as it is actually a binary file.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
echo "version https://git-lfs.github.com/spec/v1" > "${WORK_GIT_DIR}/data.bin"
|
|
||||||
echo "oid sha256:c35020473aed1b4642cd726cad727b63fff2824ad68cedd7ffb73c7cbd890479" >> "${WORK_GIT_DIR}/data.bin"
|
|
||||||
echo "size 32768" >> "${WORK_GIT_DIR}/data.bin"
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k oflag=append conv=notrunc
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add binary file"
|
|
||||||
if git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: Add binary file to an empty repository and push it by bypassing the hook.
|
|
||||||
#
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit, override restrictions"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: add binary file to the existing repository with proper LFS filters
|
|
||||||
# installed prior to adding a binary file.
|
|
||||||
#
|
|
||||||
# This test is expected to pass as it is an expected usage of Git LFS.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs install
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs track "*.bin"
|
|
||||||
git -C "${WORK_GIT_DIR}" add .gitattributes
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Track .bin files with Git LFS"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add binary file"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: add binary file to the existing repository before LFS filters is
|
|
||||||
# configured, configure filter, and convert to LFS.
|
|
||||||
#
|
|
||||||
# This test is expected to fail as all new files after adding filter are
|
|
||||||
# supposed to be covered by Git LFS.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add binary file"
|
|
||||||
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs install
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs track "*.bin"
|
|
||||||
git -C "${WORK_GIT_DIR}" add .gitattributes
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Track .bin files with Git LFS"
|
|
||||||
|
|
||||||
if git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: Add filter and convert binary file to LFS on an existing repository.
|
|
||||||
#
|
|
||||||
# This test is expected to pass since it is perfectly nominal operation to do
|
|
||||||
# when dealing with legacy code base where binary files were added before LFS
|
|
||||||
# was configured, and when conversion is needed after the install of the deny
|
|
||||||
# hook.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
echo "Hello, World!" > "${WORK_GIT_DIR}/README.txt"
|
|
||||||
git -C "${WORK_GIT_DIR}" add README.txt
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add binary file"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs install
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs track "*.bin"
|
|
||||||
git -C "${WORK_GIT_DIR}" add .gitattributes
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Track .bin files with Git LFS"
|
|
||||||
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs migrate import --no-rewrite --yes data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" reset --soft HEAD~1
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --amend --message "Track .bin files with Git LFS and convert existing file"
|
|
||||||
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: Show rejected files correctly when moving binary files
|
|
||||||
#
|
|
||||||
# This test is expected to fail since the binary file is supposed
|
|
||||||
# to be covered by Git LFS. This test verifies the reject message
|
|
||||||
# for correctly parsing and displaying the file move.
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
mkdir -p "${WORK_GIT_DIR}/bindata"
|
|
||||||
git -C "${WORK_GIT_DIR}" mv data.bin bindata/data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Move binary file"
|
|
||||||
|
|
||||||
set +e
|
|
||||||
PUSH_OUTPUT=$(git -C "${WORK_GIT_DIR}" push 2>&1)
|
|
||||||
PUSH_STATUS=$?
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ "${PUSH_STATUS}" -eq 0 ] || echo "${PUSH_OUTPUT}" | grep -q "fatal:"; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Test: Ensure that we don't iterate over legacy files when branching
|
|
||||||
#
|
|
||||||
# Ensure that we don't iterate over legacy commits when pushing new branches
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. ${SCRIPT_PATH}/functions
|
|
||||||
|
|
||||||
setup_temp_git_identity
|
|
||||||
|
|
||||||
ORIGIN_REPO_DIR=`setup_bare_origin_repository`
|
|
||||||
WORK_GIT_DIR=`clone_repository "${ORIGIN_REPO_DIR}"`
|
|
||||||
|
|
||||||
dd if=/dev/zero of="${WORK_GIT_DIR}/data.bin" bs=1 count=32k
|
|
||||||
git -C "${WORK_GIT_DIR}" add data.bin
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Initial commit"
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
install_hook "${ORIGIN_REPO_DIR}" "${SCRIPT_PATH}/../../deny_binary" "pre-receive"
|
|
||||||
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs install
|
|
||||||
git -C "${WORK_GIT_DIR}" lfs track "*.bin"
|
|
||||||
git -C "${WORK_GIT_DIR}" add .gitattributes
|
|
||||||
touch "${WORK_GIT_DIR}/data.bin"
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Track .bin files with Git LFS"
|
|
||||||
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
git -C "${WORK_GIT_DIR}" branch new_branch
|
|
||||||
git -C "${WORK_GIT_DIR}" switch new_branch
|
|
||||||
touch "${WORK_GIT_DIR}/text_file"
|
|
||||||
git -C "${WORK_GIT_DIR}" add text_file
|
|
||||||
git -C "${WORK_GIT_DIR}" commit --message "Add regular text file"
|
|
||||||
|
|
||||||
if ! git -C "${WORK_GIT_DIR}" push --set-upstream origin new_branch; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Test passed!"
|
|
||||||
exit 0
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# Set up temp Git identity if none is set
|
|
||||||
setup_temp_git_identity() {
|
|
||||||
export GIT_AUTHOR_NAME="Test User"
|
|
||||||
export GIT_AUTHOR_EMAIL="tests@example.com"
|
|
||||||
export GIT_COMMITTER_NAME="Test User"
|
|
||||||
export GIT_COMMITTER_EMAIL="tests@example.com"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get temporary directory where test data will be generated.
|
|
||||||
# The function echo's the directory.
|
|
||||||
get_tmp_dir() {
|
|
||||||
local SCRIPT=$(readlink -f "$0")
|
|
||||||
local SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
echo "$(dirname ${0})/tmp/$(basename "${SCRIPT%.*}")"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Setup bare repository which could be used as a server-side upstream.
|
|
||||||
# The function echo's the path to the repository.
|
|
||||||
setup_bare_origin_repository() {
|
|
||||||
local TMP_DIR=`get_tmp_dir`
|
|
||||||
local REPO_DIR="${TMP_DIR}/origin/test-repo.git"
|
|
||||||
rm -rf "${REPO_DIR}"
|
|
||||||
mkdir -p "${REPO_DIR}"
|
|
||||||
git -C "${REPO_DIR}" init --bare --initial-branch=main > /dev/null 2>&1
|
|
||||||
echo "${REPO_DIR}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install hook to the given bare repository.
|
|
||||||
# The bare git repository is provided as $1, hook script is provided as $2,
|
|
||||||
# and the hook name is provided as $3.
|
|
||||||
install_hook() {
|
|
||||||
local GIT_DIR="${1}"
|
|
||||||
local HOOK_SCRIPT="${2}"
|
|
||||||
local HOOK_NAME="${3}"
|
|
||||||
cp "${HOOK_SCRIPT}" "${GIT_DIR}/hooks/${HOOK_NAME}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clone repository provided via $1. The path to the working directory is
|
|
||||||
# echo'd.
|
|
||||||
clone_repository() {
|
|
||||||
local TMP_DIR=`get_tmp_dir`
|
|
||||||
local WORK_GIT_DIR="${TMP_DIR}/checkout/test-repo"
|
|
||||||
rm -rf "${WORK_GIT_DIR}"
|
|
||||||
git clone "${1}" "${WORK_GIT_DIR}" > /dev/null 2>&1
|
|
||||||
echo "${WORK_GIT_DIR}"
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT=$(readlink -f "$0")
|
|
||||||
SCRIPT_PATH=$(dirname "$SCRIPT")
|
|
||||||
|
|
||||||
. "${SCRIPT_PATH}/common/functions"
|
|
||||||
|
|
||||||
run_tests_in_directory "${SCRIPT_PATH}/deny_binary"
|
|
||||||
rm -rf "${SCRIPT_PATH}/deny_binary/tmp"
|
|
||||||
@@ -2,14 +2,16 @@
|
|||||||
:root {
|
:root {
|
||||||
--is-dark-theme: true;
|
--is-dark-theme: true;
|
||||||
|
|
||||||
|
/* Borders. */
|
||||||
|
--border-radius: .33rem;
|
||||||
|
--border-radius-outer: .28571429rem;
|
||||||
|
|
||||||
/* Colors. */
|
/* Colors. */
|
||||||
/* Some colors must be set as HEX, due to the monaco-editor no supporting
|
/* Some colors must be set as HEX, due to the monaco-editor no supporting
|
||||||
* conversion of non-hex colors. https: //github.com/microsoft/monaco-editor/issues/1815 */
|
* conversion of non-hex colors. https: //github.com/microsoft/monaco-editor/issues/1815 */
|
||||||
color-scheme: dark;
|
color-scheme: dark;
|
||||||
--color-primary: hsl(204deg, 90%, 60%);
|
--color-primary: hsl(204deg, 90%, 56%);
|
||||||
--color-primary-hover: hsl(204deg, 90%, 50%);
|
--color-primary-bg: hsla(204deg, 100%, 36%, .2);
|
||||||
--color-primary-bg: hsla(204deg, 100%, 36%, .6);
|
|
||||||
--color-primary-text: hsl(204deg, 90%, 72%);
|
|
||||||
|
|
||||||
--color-primary-contrast: hsl(0, 0%, 100%);
|
--color-primary-contrast: hsl(0, 0%, 100%);
|
||||||
--color-primary-dark-1: #14a1ff;
|
--color-primary-dark-1: #14a1ff;
|
||||||
@@ -72,7 +74,6 @@
|
|||||||
/* Colors for buttons, labels, etc. */
|
/* Colors for buttons, labels, etc. */
|
||||||
--color-red: hsl(0, 56.4%, 54.1%);
|
--color-red: hsl(0, 56.4%, 54.1%);
|
||||||
--color-red-light: hsl(0, 56.5%, 48.6%);
|
--color-red-light: hsl(0, 56.5%, 48.6%);
|
||||||
--color-red-dark-1: hsl(3deg, 75%, 59%);
|
|
||||||
--color-orange: hsl(23.8, 89%, 42.4%);
|
--color-orange: hsl(23.8, 89%, 42.4%);
|
||||||
--color-orange-light: hsl(23.6, 88.7%, 38%);
|
--color-orange-light: hsl(23.6, 88.7%, 38%);
|
||||||
--color-yellow: hsl(44.8, 97%, 40.6%);
|
--color-yellow: hsl(44.8, 97%, 40.6%);
|
||||||
@@ -85,12 +86,8 @@
|
|||||||
--color-teal-light: hsl(176.8, 100%, 26%);
|
--color-teal-light: hsl(176.8, 100%, 26%);
|
||||||
--color-blue: hsl(206, 56%, 50.2%);
|
--color-blue: hsl(206, 56%, 50.2%);
|
||||||
--color-blue-light: hsl(206, 55%, 45.3%);
|
--color-blue-light: hsl(206, 55%, 45.3%);
|
||||||
--color-blue-dark-1: hsl(213deg, 89%, 64%);
|
|
||||||
--color-blue-dark-bg: hsla(213deg, 89%, 64%, .15);
|
|
||||||
--color-violet: hsl(259.2, 66.5%, 65%);
|
--color-violet: hsl(259.2, 66.5%, 65%);
|
||||||
--color-violet-light: hsl(259.1, 66.2%, 58%);
|
--color-violet-light: hsl(259.1, 66.2%, 58%);
|
||||||
--color-violet-dark-1: hsl(262deg, 66%, 66%);
|
|
||||||
--color-violet-dark-bg: hsla(262deg, 66%, 66%, .15);
|
|
||||||
--color-purple: hsl(285, 55.9%, 58%);
|
--color-purple: hsl(285, 55.9%, 58%);
|
||||||
--color-purple-light: hsl(285, 55.6%, 52%);
|
--color-purple-light: hsl(285, 55.6%, 52%);
|
||||||
--color-pink: hsl(326, 64.6%, 50.2%);
|
--color-pink: hsl(326, 64.6%, 50.2%);
|
||||||
@@ -133,7 +130,7 @@
|
|||||||
--color-warning-text: hsl(44.7, 96.8%, 50.8%);
|
--color-warning-text: hsl(44.7, 96.8%, 50.8%);
|
||||||
--color-info-border: hsl(210, 50%, 37.6%);
|
--color-info-border: hsl(210, 50%, 37.6%);
|
||||||
--color-info-bg: hsl(216.3, 33.3%, 22.4%);
|
--color-info-bg: hsl(216.3, 33.3%, 22.4%);
|
||||||
--color-info-text: hsl(213deg, 89%, 64%);
|
--color-info-text: hsl(201.8, 79.3%, 56.5%);
|
||||||
|
|
||||||
--color-body: #202327;
|
--color-body: #202327;
|
||||||
|
|
||||||
@@ -158,18 +155,16 @@
|
|||||||
--color-active: hsla(213, 18%, 90%, .1);
|
--color-active: hsla(213, 18%, 90%, .1);
|
||||||
|
|
||||||
--color-menu: hsl(213, 12%, 21%);
|
--color-menu: hsl(213, 12%, 21%);
|
||||||
--color-card: #202327;
|
--color-card: transparent;
|
||||||
|
|
||||||
--color-markup-table-row: hsla(0, 0%, 100%, 0);
|
--color-markup-table-row: hsla(0, 0%, 100%, 0);
|
||||||
--color-markup-code-block: hsla(0, 0%, 100%, 0.1);
|
--color-markup-code-block: hsla(0, 0%, 100%, 0.1);
|
||||||
--color-markup-code-inline: hsla(0, 0%, 100%, 0.1);
|
|
||||||
|
|
||||||
--color-code-bg: #1e2329;
|
--color-code-bg: #1e2329;
|
||||||
--color-code-line-bg-hover: hsl(213, 16%, 16%);
|
--color-code-line-bg-hover: hsl(213, 16%, 16%);
|
||||||
--color-code-sidebar-bg: hsl(213, 15%, 21%);
|
--color-code-sidebar-bg: hsl(213, 15%, 21%);
|
||||||
|
|
||||||
--color-tooltip-text: #fbfdff;
|
--color-timeline: hsl(220, 10%, 33%);
|
||||||
--color-tooltip-bg: #000017f0;
|
|
||||||
|
|
||||||
/* Navbar. */
|
/* Navbar. */
|
||||||
--color-navbar: hsl(213, 10%, 18%);
|
--color-navbar: hsl(213, 10%, 18%);
|
||||||
@@ -179,6 +174,15 @@
|
|||||||
--color-navbar-transparent: hsla(213, 10%, 14%, 0);
|
--color-navbar-transparent: hsla(213, 10%, 14%, 0);
|
||||||
--color-header-bar: hsl(213, 10%, 18%);
|
--color-header-bar: hsl(213, 10%, 18%);
|
||||||
|
|
||||||
|
/* Buttons. */
|
||||||
|
--color-button: hsl(213, 14%, 24%);
|
||||||
|
--color-expand-button: hsl(213.9, 12.4%, 26.9%);
|
||||||
|
|
||||||
|
--color-button-basic-border: hsl(213, 14%, 30%);
|
||||||
|
--color-button-basic-bg: hsl(213, 14%, 22%);
|
||||||
|
--color-button-basic-bg: var(--color-light);
|
||||||
|
--color-button-basic-text: var(--color-text);
|
||||||
|
|
||||||
/* Inputs. */
|
/* Inputs. */
|
||||||
--color-input-text: #d6dbe6;
|
--color-input-text: #d6dbe6;
|
||||||
--color-input-background: #17191c;
|
--color-input-background: #17191c;
|
||||||
@@ -190,57 +194,164 @@
|
|||||||
--color-editor-line-highlight: var(--color-primary-light-5);
|
--color-editor-line-highlight: var(--color-primary-light-5);
|
||||||
--color-project-board-bg: var(--color-secondary-light-2);
|
--color-project-board-bg: var(--color-secondary-light-2);
|
||||||
|
|
||||||
--color-highlight-fg: #87651e;
|
|
||||||
--color-highlight-bg: #352c1c;
|
|
||||||
--color-overlay-backdrop: #080808c0;
|
|
||||||
|
|
||||||
--color-button: #282d33;
|
|
||||||
|
|
||||||
--color-caret: var(--color-text);
|
--color-caret: var(--color-text);
|
||||||
--color-border: var(--color-secondary-alpha-40);
|
--color-border: var(--color-secondary-alpha-40);
|
||||||
|
|
||||||
--color-reaction-bg: hsla(0, 0%, 100%, 0.1);
|
--color-reaction-bg: hsla(0, 0%, 100%, 0.1);
|
||||||
--color-reaction-active-bg: var(--color-primary-alpha-30);
|
--color-reaction-active-bg: var(--color-primary-alpha-40);
|
||||||
|
|
||||||
--color-small-accent: var(--color-primary-light-5);
|
--color-small-accent: var(--color-primary-light-5);
|
||||||
--color-active-line: hsl(53.6, 50.9%, 22%);
|
--color-active-line: hsl(53.6, 50.9%, 22%);
|
||||||
|
|
||||||
/* Labels. e.g. issues count indicator in repo tabs. */
|
/* Labels. e.g. issues count indicator in repo tabs. */
|
||||||
--color-label-text: var(--color-text-light);
|
--color-label-text: var(--color-text-light);
|
||||||
--color-label-bg: var(--color-secondary-alpha-60);
|
|
||||||
--color-label-active-bg: hsl(220, 10.6%, 33.3%);
|
--color-label-active-bg: hsl(220, 10.6%, 33.3%);
|
||||||
|
|
||||||
/* Footer. */
|
/* Footer. */
|
||||||
--color-footer: hsl(213, 14.8%, 21%);
|
--color-footer: hsl(213, 14.8%, 21%);
|
||||||
--color-footer-text: var(--color-text-light-3);
|
--color-footer-text: var(--color-text-light-3);
|
||||||
--color-footer-links: var(--color-text-light-1);
|
--color-footer-links: var(--color-text-light-1);
|
||||||
|
|
||||||
/* Color aliases. */
|
|
||||||
--color-accent: var(--color-primary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Custom styling of individual elements.
|
/* Custom styling of individual elements.
|
||||||
* Using !important is bad, but unfortunately gitea does it already in _base.less. */
|
* Using !important is bad, but unfortunately gitea does it already in _base.less. */
|
||||||
|
|
||||||
/* Primary button. */
|
/* Buttons. */
|
||||||
|
.ui.basic.button {
|
||||||
|
color: var(--color-button-basic-text);
|
||||||
|
background: var(--color-button-basic-bg);
|
||||||
|
border-color: var(--color-button-basic-border);
|
||||||
|
}
|
||||||
|
|
||||||
.ui.primary.button,
|
.ui.primary.button,
|
||||||
.ui.primary.buttons .button {
|
.ui.primary.buttons .button {
|
||||||
background-color: var(--color-primary-bg) !important;
|
background-color: var(--color-primary-bg) !important;
|
||||||
border-color: var(--color-primary-bg) !important;
|
border-color: var(--color-primary-bg) !important;
|
||||||
color: var(--color-primary-text) !important;
|
color: var(--color-primary) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
a.ui.primary.label:hover,
|
|
||||||
.ui.primary.button:hover,
|
.ui.primary.button:hover,
|
||||||
.ui.primary.buttons .button:hover {
|
.ui.primary.buttons .button:hover {
|
||||||
background-color: var(--color-primary-hover) !important;
|
background-color: var(--color-primary) !important;
|
||||||
color: var(--color-primary-contrast) !important;
|
color: var(--color-primary-contrast) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui.primary.label {
|
/* Small buttons
|
||||||
background-color: var(--color-primary-bg) !important;
|
* e.g. HTTP/SSH clone buttons in repo homepage. */
|
||||||
border-color: var(--color-primary-bg) !important;
|
.ui.basic.primary.button,
|
||||||
color: var(--color-primary) !important;
|
.ui.basic.primary.buttons .button {
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.menu,
|
||||||
|
.ui.vertical.menu {
|
||||||
|
border-color: var(--color-secondary-alpha-30) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vertical menu.
|
||||||
|
* Used in: /issues */
|
||||||
|
.ui.vertical.menu {
|
||||||
|
padding: var(--spacer-1);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vertical menu: active item.
|
||||||
|
* Gitea adds a "primary" class to what would be the active item. */
|
||||||
|
.ui.vertical.menu > .item.primary {
|
||||||
|
background-color: var(--color-active) !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dropdown menus.
|
||||||
|
* e.g. user menu. */
|
||||||
|
.ui.dropdown .menu {
|
||||||
|
border-radius: var(--border-radius) !important;
|
||||||
|
box-shadow: var(--box-shadow-dropdown-menu) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Replace gitea's hardcoded border-radius with variables. */
|
||||||
|
.ui.compact.menu {
|
||||||
|
border-radius: var(--border-radius-outer);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.compact.menu>.item:first-child {
|
||||||
|
border-radius: var(--border-radius) 0 0 var(--border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.compact.menu>.item:last-child {
|
||||||
|
border-radius: 0 var(--border-radius) var(--border-radius) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.menu.new-menu {
|
||||||
|
border-color: var(--color-secondary-alpha-50) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Top navigation bar.
|
||||||
|
* e.g. Issues, Pull Requests, etc. */
|
||||||
|
.ui.menu.bar {
|
||||||
|
border-color: var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.menu .item>.label {
|
||||||
|
color: var(--color-label-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.tabular.menu {
|
||||||
|
border-color: var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.breadcrumb a {
|
||||||
|
color: var(--color-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cards. */
|
||||||
|
.ui.cards>.card .meta,
|
||||||
|
.ui.card .meta {
|
||||||
|
color: var(--color-text-dark-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.card.card-with-icon .icon svg {
|
||||||
|
margin: 0 var(--spacer) 0 0;
|
||||||
|
width: 50px;
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Users/Organizations list. */
|
||||||
|
/* Fix alignment issue since */
|
||||||
|
.ui.user.list img.avatar,
|
||||||
|
.ui.user.list img.avatar+.content {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.user.list img.avatar {
|
||||||
|
position: relative;
|
||||||
|
top: 3px;
|
||||||
|
vertical-align: initial !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.user.list .content {
|
||||||
|
margin-left: var(--spacer-2);
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.user.list .content .description .svg {
|
||||||
|
margin-right: var(--spacer-1);
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.issue.list>.item+.item {
|
||||||
|
border-color: var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Divider. */
|
||||||
|
.ui.divider:not(.vertical, .horizontal) {
|
||||||
|
border-top-color: var(--color-border) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Homepage. */
|
||||||
|
.home a {
|
||||||
|
color: var(--color-accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (from arc-green)
|
/* (from arc-green)
|
||||||
@@ -520,17 +631,3 @@ a.ui.primary.label:hover,
|
|||||||
.CodeMirror.cm-s-default .cm-error, .CodeMirror.cm-s-paper .cm-error {
|
.CodeMirror.cm-s-default .cm-error, .CodeMirror.cm-s-paper .cm-error {
|
||||||
color: #dbdbeb;
|
color: #dbdbeb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Progress bar. */
|
|
||||||
progress::-moz-progress-bar,
|
|
||||||
progress::-webkit-progress-value {
|
|
||||||
background-color: var(--color-primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.issue-list-toolbar-left a.item {
|
|
||||||
opacity: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.issue-list-toolbar-left a.active.item {
|
|
||||||
opacity: 100%;
|
|
||||||
}
|
|
||||||
BIN
public/assets/fonts/Heebo-VariableFont_wght.ttf
Executable file
BIN
public/assets/fonts/Heebo-VariableFont_wght.ttf
Executable file
Binary file not shown.
@@ -5,13 +5,13 @@
|
|||||||
<p>Blender development is split into the following modules and projects.</p>
|
<p>Blender development is split into the following modules and projects.</p>
|
||||||
<ul class="mb-0">
|
<ul class="mb-0">
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Animation & Rigging">Animation & Rigging</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Animation & Rigging">Animation & Rigging</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Asset System">Asset System</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Asset Browser">Asset Browser</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Core">Core</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Core">Core</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Grease Pencil">Grease Pencil</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Grease Pencil">Grease Pencil</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Modeling">Modeling</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Modeling">Modeling</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Nodes & Physics">Nodes & Physics</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Nodes & Physics">Nodes & Physics</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Pipeline & I/O">Pipeline & I/O</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Pipeline, Assets & I/O">Pipeline, Assets & I/O</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Platforms & Builds">Platforms & Builds</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Platforms, Builds, Tests & Devices">Platforms, Builds, Tests & Devices</a></li>
|
||||||
<li>
|
<li>
|
||||||
Python & Add-ons
|
Python & Add-ons
|
||||||
<ul>
|
<ul>
|
||||||
@@ -23,8 +23,8 @@
|
|||||||
<li>
|
<li>
|
||||||
Rendering
|
Rendering
|
||||||
<ul>
|
<ul>
|
||||||
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: EEVEE & Viewport">EEVEE & Viewport</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Render & Cycles">Render & Cycles</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Render & Cycles">Render & Cycles</a></li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Viewport & EEVEE">Viewport & EEVEE</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Sculpt, Paint & Texture">Sculpt, Paint & Texture</a></li>
|
<li><a href="{{AppSubUrl}}/blender/blender/wiki/Module: Sculpt, Paint & Texture">Sculpt, Paint & Texture</a></li>
|
||||||
|
|||||||
@@ -1,111 +1,27 @@
|
|||||||
<div class="ui fluid card" style="width: 100%;">
|
<div class="ui fluid card" style="width: 100%;">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="ui grid">
|
|
||||||
<div class="eight wide column">
|
|
||||||
<h3>Ongoing Projects</h3>
|
<h3>Ongoing Projects</h3>
|
||||||
</div>
|
<p>Focused activities to advance Blender.</p>
|
||||||
<div class="eight wide column right" style="text-align: right">
|
|
||||||
<h3>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/">
|
|
||||||
<svg data-v-9113ce96="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"
|
|
||||||
class="svg octicon-repo repo-list-icon" style="margin-top: .333rem;">
|
|
||||||
<path
|
|
||||||
d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.5 2.5 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.5 2.5 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.25.25 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z">
|
|
||||||
</path>
|
|
||||||
</svg>
|
|
||||||
blender/blender
|
|
||||||
</a>
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table class="ui celled striped table">
|
<div class="description">
|
||||||
<thead>
|
<ul>
|
||||||
<tr>
|
<li>
|
||||||
<th>Project</th>
|
<a href="https://code.blender.org/2022/11/the-future-of-character-animation-rigging/">
|
||||||
<th>Description</th>
|
The Future of Character Animation
|
||||||
<th>Status</th>
|
</a>
|
||||||
</tr>
|
<li>
|
||||||
</thead>
|
<a href="https://code.blender.org/2022/12/brush-assets-workflow/">
|
||||||
<tbody>
|
Brush Assets
|
||||||
<tr>
|
</a>
|
||||||
<td>
|
</li>
|
||||||
<a href="{{AppSubUrl}}/studio/flamenco/issues/104437">Blender Asset Tracer</a>
|
</ul>
|
||||||
</td>
|
</div>
|
||||||
<td>
|
</div>
|
||||||
BAT version 2 for Flamenco
|
<div class="extra content">
|
||||||
</td>
|
<span class="right floated">
|
||||||
<td>
|
<a href="https://code.blender.org">
|
||||||
<a href="{{AppSubUrl}}/studio/flamenco/issues/104437">Under Development</a>
|
See all articles {{svg "octicon-chevron-right" 18}}
|
||||||
</td>
|
</a>
|
||||||
</tr>
|
</span>
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/141609">Hair Dynamics</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
High quality hair dynamics modifier.
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/141609">Under Development</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/153880">Modeling: Looptools</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Porting Looptools into core Blender.
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/153880">Under Development</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/133001">Project Setup</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Shared "project" environment for different blend-files.
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/133001">Under Development</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/134495">Remote Asset Libraries</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Add support for online / remote hosted asset libraries.
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/projects/707">Under Development</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/141089">VR Location Scouting</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Support blocking camera vantage points while immersed in VR (Virtual Reality)
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/141089">Under Development</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/148059">VSE: Compositor Modifier</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Implement a compositor modifier in the Video Sequencer.
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{AppSubUrl}}/blender/blender/issues/148059">Under Development</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,27 +6,27 @@
|
|||||||
<div class="description">
|
<div class="description">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{AppSubUrl}}/blender/blender/milestone/33">Blender 5.2 LTS</a>
|
<a href="{{AppSubUrl}}/blender/blender/milestone/18">Blender 4.1</a>
|
||||||
— <strong>Alpha</strong>: New features and changes
|
— <strong>Bcon1</strong>: New features and changes
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{AppSubUrl}}/blender/blender/milestone/32">Blender 5.1</a>
|
<a href="{{AppSubUrl}}/blender/blender/milestone/7">Blender 4.0</a>
|
||||||
— Released March 17, 2026
|
— <strong>Bcon3</strong>: Bug fixing only
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{AppSubUrl}}/blender/blender/milestone/25">Blender 4.5 LTS</a>
|
<a href="{{AppSubUrl}}/blender/blender/milestone/5">Blender 3.6 LTS</a>
|
||||||
— Released July 15, 2025
|
— Released on Jun 27, 2023
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{AppSubUrl}}/blender/blender/milestone/19">Blender 4.2 LTS</a>
|
<a href="{{AppSubUrl}}/blender/blender/milestone/3">Blender 3.3 LTS</a>
|
||||||
— Released Jul 16, 2024
|
— Released on Sep 7, 2022
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="extra content">
|
<div class="extra content">
|
||||||
<span class="right floated">
|
<span class="right floated">
|
||||||
<a href="https://developer.blender.org/docs/handbook/release_process/release_cycle/">
|
<a href="https://wiki.blender.org/wiki/Process/Release_Cycle">
|
||||||
Read more {{svg "octicon-chevron-right" 18}}
|
Read more {{svg "octicon-chevron-right" 18}}
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1,49 +1,47 @@
|
|||||||
<!-- @build Blender Web Assets v2.0.0-beta.2 - Do not remove comment -->
|
|
||||||
<style>
|
<style>
|
||||||
|
/* This style block is copied across all sites using the developer navbar.
|
||||||
|
* For custom styling on this website, add a <style> block after this one. */
|
||||||
|
|
||||||
/* Variables. */
|
/* Variables. */
|
||||||
.nav-global {
|
.nav-global {
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
|
|
||||||
/*
|
--nav-global-color-bg: hsl(213, 10%, 14%);
|
||||||
*Variables come from, and match partial _variables, and are prefixed with 'bwa-'.
|
--nav-global-color-text: hsl(213, 5%, 64%);
|
||||||
*Sizes must be defined in pixels as default rem-sizing might vary in projects.
|
--nav-global-color-text-secondary: hsl(213, 5%, 44%);
|
||||||
*/
|
--nav-global-color-text-highlight: hsl(213, 5%, 84%);
|
||||||
|
--nav-global-color-text-hover: white;
|
||||||
|
--nav-global-color-text-active: white;
|
||||||
|
|
||||||
--bwa-color-bg-primary: hsl(213, 10%, 21%);
|
--nav-global-color-primary: hsl(204, 98%, 54%);
|
||||||
--bwa-color-bg-tertiary: hsl(213, 10%, 14%);
|
--nav-global-color-primary-bg: hsla(204, 100%, 46%, .1);
|
||||||
|
|
||||||
--bwa-color-text: hsl(213, 10%, 80%);
|
--nav-global-color-button-bg-hover: hsl(213, 10%, 24%);
|
||||||
--bwa-color-text-primary: hsl(213, 10%, 98%);
|
--nav-global-color-button-text: var(--nav-global-color-text);
|
||||||
|
|
||||||
/* Colours Components. */
|
--nav-global-color-menu-bg: var(--nav-global-color-bg);
|
||||||
--bwa-border-color: hsla(213, 10%, 80%, .15);
|
--nav-global-color-menu-border: hsl(213, 10%, 18%);
|
||||||
|
|
||||||
--bwa-btn-color-bg-hover: hsl(213, 10%, 30%);
|
--nav-global-color-menu-zindex: 1040;
|
||||||
|
|
||||||
/* Colours Status. */
|
--nav-global-box-shadow-menu: 0px 5px 15px -2px rgba(0, 0, 0, 0.33), 0px 5px 15px -5px rgba(0, 0, 0, 0.33);
|
||||||
--bwa-color-accent: hsl(204deg, 100%, 50%);
|
--nav-global-box-shadow-menu-item: 0px 1px 4px 0px rgba(0, 0, 0, 0.05), 0px 15px 20px -1px rgba(0, 0, 0, 0.025);
|
||||||
--bwa-color-accent-bg: hsla(204deg, 100%, 50%, .1);
|
|
||||||
--bwa-color-accent-bg-hover: hsla(204deg, 100%, 50%, .2);
|
|
||||||
|
|
||||||
--bwa-border-radius: 6px;
|
--nav-global-navbar-height: var(--navbar-primary-height, 56px);
|
||||||
--bwa-border-radius-lg: 12px;
|
|
||||||
|
|
||||||
--bwa-transition-speed: 150ms;
|
--nav-global-spacer: 15px;
|
||||||
|
--nav-global-spacer-sm: 10px;
|
||||||
|
--nav-global-spacer-xs: 5px;
|
||||||
|
|
||||||
--bwa-zindex-dropdown: 1040;
|
--nav-global-border-radius: 6px;
|
||||||
--bwa-zindex-fixed: 1030;
|
--nav-global-border-radius-lg: 10px;
|
||||||
|
|
||||||
/* Grid. */
|
--nav-global-button-height: 35px;
|
||||||
--bwa-spacer: 16px;
|
--nav-global-link-padding-x: var(--nav-global-spacer);
|
||||||
--bwa-spacer-1: calc(var(--bwa-spacer) * 0.25);
|
--nav-global-link-padding-y: var(--nav-global-spacer-sm);
|
||||||
--bwa-spacer-2: calc(var(--bwa-spacer) * 0.5);
|
|
||||||
--bwa-spacer-3: var(--bwa-spacer);
|
|
||||||
|
|
||||||
/* Type. */
|
--nav-global-font-size: 14px;
|
||||||
--bwa-fs-base: 14px;
|
--nav-global-transition-speed: 150ms;
|
||||||
|
|
||||||
/* Components. */
|
|
||||||
--bwa-navbar-zindex: calc(var(--bwa-zindex-fixed) + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset. */
|
/* Reset. */
|
||||||
@@ -52,6 +50,8 @@
|
|||||||
.nav-global :not(svg|*),
|
.nav-global :not(svg|*),
|
||||||
.nav-global *::before,
|
.nav-global *::before,
|
||||||
.nav-global *::after {
|
.nav-global *::after {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
|
||||||
all: unset;
|
all: unset;
|
||||||
display: revert;
|
display: revert;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@@ -64,17 +64,17 @@
|
|||||||
.nav-global * {
|
.nav-global * {
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
|
|
||||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
font-family: 'Heebo', -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
font-variation-settings: 'wght' 400;
|
font-variation-settings: 'wght' 400;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global {
|
.nav-global {
|
||||||
background-color: var(--bwa-color-bg-tertiary);
|
background-color: var(--nav-global-color-bg);
|
||||||
color: var(--bwa-color-text);
|
color: var(--nav-global-color-text);
|
||||||
display: flex;
|
display: flex;
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: var(--bwa-navbar-zindex);
|
z-index: var(--zindex-fixed);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global h3,
|
.nav-global h3,
|
||||||
@@ -102,12 +102,11 @@
|
|||||||
.nav-global nav {
|
.nav-global nav {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: flex;
|
display: flex;
|
||||||
line-height: var(--bwa-fs-base);
|
line-height: var(--nav-global-font-size);
|
||||||
font-size: var(--bwa-fs-base);
|
font-size: var(--nav-global-font-size);
|
||||||
justify-content: space-between;
|
height: var(--nav-global-navbar-height);
|
||||||
min-height: calc(var(--bwa-spacer) * 4);
|
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: 0 var(--bwa-spacer);
|
padding: 0 var(--nav-global-spacer);
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,34 +115,23 @@
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
transition: background-color var(--bwa-transition-speed) ease-out, color var(--bwa-transition-speed) ease-out;
|
transition: background-color var(--nav-global-transition-speed) ease-out, color var(--nav-global-transition-speed) ease-out;
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global-nav-links {
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global-nav-links a:not(.dropdown-item) {
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global a:not(.dropdown-item):hover {
|
.nav-global a:not(.dropdown-item):hover {
|
||||||
color: var(--bwa-color-text-primary);
|
color: var(--nav-global-color-text-hover);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Navigation items. */
|
/* Navigation items. */
|
||||||
.nav-global nav>ul {
|
.nav-global nav > ul {
|
||||||
flex-wrap: wrap;
|
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global nav>ul,
|
.nav-global nav > ul,
|
||||||
.nav-global nav>ul>li,
|
.nav-global nav > ul > li,
|
||||||
.nav-global nav>ul>li>a,
|
.nav-global nav > ul > li > a,
|
||||||
.nav-global-apps-dropdown-container {
|
.nav-global-apps-dropdown-container {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
@@ -154,143 +142,98 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global nav>ul>li>a {
|
.nav-global nav > ul > li > a {
|
||||||
padding: var(--bwa-spacer-2);
|
padding: var(--nav-global-link-padding-y) var(--nav-global-link-padding-x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1320px) {
|
.nav-global nav > a.is-active,
|
||||||
.nav-global nav>ul>li>a {
|
.nav-global nav > a.is-active svg,
|
||||||
padding-left: var(--bwa-spacer);
|
.nav-global nav > ul > li > a.is-active,
|
||||||
padding-right: var(--bwa-spacer);
|
.nav-global .nav-global-link-active,
|
||||||
}
|
.nav-global .nav-global-link-active svg {
|
||||||
}
|
color: var(--nav-global-color-text-active) !important;
|
||||||
|
fill: var(--nav-global-color-text-active);
|
||||||
.nav-global nav>a.is-active,
|
font-variation-settings: 'wght' 500;
|
||||||
.nav-global nav>a.is-active svg,
|
|
||||||
.nav-global nav>ul>li>a.is-active {
|
|
||||||
color: var(--bwa-color-text-primary) !important;
|
|
||||||
fill: var(--bwa-color-text-primary);
|
|
||||||
font-variation-settings: 'wght', 500;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-links-right {
|
.nav-global .nav-global-links-right {
|
||||||
flex-wrap: nowrap;
|
margin-left: auto;
|
||||||
gap: 0 var(--bwa-spacer-2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Logo. */
|
/* Logo. */
|
||||||
.nav-global a.nav-global-logo {
|
.nav-global a.nav-global-logo {
|
||||||
margin-right: var(--bwa-spacer);
|
margin-right: var(--nav-global-spacer);
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 2px;
|
top: 2px;
|
||||||
white-space: nowrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global a.nav-global-logo strong {
|
.nav-global a.nav-global-logo strong {
|
||||||
margin-inline: var(--bwa-spacer-2);
|
margin-inline: var(--nav-global-spacer-sm);
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-logo svg,
|
.nav-global .nav-global-logo svg {
|
||||||
.nav-global .nav-global-logo img {
|
|
||||||
height: 21px;
|
height: 21px;
|
||||||
pointer-events: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global a.nav-global-logo svg {
|
.nav-global a.nav-global-logo svg {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: calc(var(--bwa-spacer-1) * -1);
|
top: -4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global svg {
|
.nav-global svg {
|
||||||
fill: var(--bwa-color-text);
|
fill: var(--nav-global-color-text);
|
||||||
transition: fill var(--bwa-transition-speed) ease-out;
|
transition: fill var(--nav-global-transition-speed) ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-logo:hover svg {
|
.nav-global .nav-global-logo:hover svg {
|
||||||
fill: var(--bwa-color-text-primary);
|
fill: white;
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .nav-global-logo.is-active,
|
|
||||||
.nav-global .nav-global-logo.is-active svg,
|
|
||||||
// TODO: make classes 'is-active' and 'nav-global-btn-active' consistent
|
|
||||||
.nav-global button.nav-global-btn-active svg {
|
|
||||||
color: var(--bwa-color-text-primary);
|
|
||||||
fill: var(--bwa-color-text-primary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apps button. */
|
/* Apps button. */
|
||||||
.nav-global {
|
|
||||||
--bwa-nav-global-btn-height: calc(var(--bwa-spacer) * 2.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global button,
|
.nav-global button,
|
||||||
.nav-global .nav-global-btn {
|
.nav-global .nav-global-btn {
|
||||||
-webkit-appearance: button;
|
-webkit-appearance: button;
|
||||||
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
border-radius: var(--bwa-border-radius);
|
border-radius: var(--nav-global-border-radius);
|
||||||
border: 0;
|
border: 0;
|
||||||
color: var(--bwa-btn-color-text);
|
color: var(--nav-global-color-button-text);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
font: inherit;
|
font: inherit;
|
||||||
height: var(--bwa-nav-global-btn-height);
|
height: var(--nav-global-button-height);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
padding: var(--bwa-spacer-1) var(--bwa-spacer-2);
|
padding: var(--nav-global-spacer-xs) var(--nav-global-spacer);
|
||||||
text-transform: none;
|
text-transform: none;
|
||||||
transition: background-color var(--bwa-transition-speed) ease-out, color var(--bwa-transition-speed) ease-out, transform var(--bwa-transition-speed) ease-out;
|
transition: background-color var(--nav-global-transition-speed) ease-out, color var(--nav-global-transition-speed) ease-out, transform var(--nav-global-transition-speed) ease-out;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Button overrides. */
|
|
||||||
/*
|
|
||||||
*Button overrides for Web Assets button components for BWA projects.
|
|
||||||
*/
|
|
||||||
.nav-global button,
|
|
||||||
.nav-global .btn {
|
|
||||||
height: var(--bwa-nav-global-btn-height);
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .btn-accent {
|
|
||||||
color: white !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .nav-global-btn.nav-global-btn-primary {
|
|
||||||
padding-left: var(--bwa-spacer);
|
|
||||||
padding-right: var(--bwa-spacer);
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global button span,
|
.nav-global button span,
|
||||||
.nav-global .nav-global-btn span {
|
.nav-global .nav-global-btn span {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global button:hover,
|
.nav-global button:hover,
|
||||||
.nav-global .nav-global-btn:hover,
|
.nav-global .nav-global-btn:hover {
|
||||||
.nav-global button.nav-global-btn-active,
|
background-color: var(--nav-global-color-button-bg-hover);
|
||||||
.nav-global .nav-global-btn.nav-global-btn-active {
|
color: var(--nav-global-color-text-hover);
|
||||||
background-color: var(--bwa-btn-color-bg-hover);
|
|
||||||
color: var(--bwa-color-text-primary);
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-btn span {
|
.nav-global button.nav-global-btn-active,
|
||||||
margin-left: var(--bwa-spacer-2);
|
.nav-global .nav-global-btn.nav-global-btn-active {
|
||||||
|
background-color: var(--nav-global-color-primary-bg);
|
||||||
|
color: var(--nav-global-color-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-btn-primary {
|
.nav-global button.nav-global-btn-active svg,
|
||||||
background-color: var(--bwa-color-accent-bg);
|
.nav-global .nav-global-btn.nav-global-btn-active svg {
|
||||||
color: var(--bwa-color-accent) !important;
|
fill: var(--nav-global-color-primary);
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .nav-global-btn-primary:hover {
|
|
||||||
background-color: var(--bwa-color-accent-bg-hover);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-icon {
|
.nav-global .nav-global-icon {
|
||||||
@@ -299,12 +242,8 @@
|
|||||||
width: 20px;
|
width: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-icon-alt {
|
.nav-global-icon-dropdown-toggle {
|
||||||
transform: rotate(90deg);
|
margin-left: var(--nav-global-spacer-xs);
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .dropdown-toggle.active {
|
|
||||||
color: var(--bwa-color-text-primary)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global button:hover svg,
|
.nav-global button:hover svg,
|
||||||
@@ -314,18 +253,18 @@
|
|||||||
|
|
||||||
/* Apps dropdown menu. */
|
/* Apps dropdown menu. */
|
||||||
.nav-global .nav-global-apps-menu {
|
.nav-global .nav-global-apps-menu {
|
||||||
background-color: var(--bwa-color-bg-tertiary);
|
background-color: var(--nav-global-color-menu-bg);
|
||||||
border-radius: var(--bwa-border-radius-lg);
|
border-radius: var(--nav-global-border-radius-lg);
|
||||||
border: thin solid var(--bwa-border-color);
|
border: thin solid var(--nav-global-color-menu-border);
|
||||||
box-shadow: 0 var(--bwa-spacer-1) var(--bwa-spacer) -2px rgba(0, 0, 0, 0.33), 0px var(--bwa-spacer-1) var(--bwa-spacer) calc(var(--bwa-spacer-1) * -1) rgba(0, 0, 0, 0.33);
|
box-shadow: var(--nav-global-box-shadow-menu);
|
||||||
display: none;
|
display: none;
|
||||||
padding: var(--bwa-spacer-2);
|
padding: var(--nav-global-spacer-sm);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
top: calc(100% + var(--bwa-spacer));
|
top: calc(100% + 15px);
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
width: 640px;
|
width: 640px;
|
||||||
z-index: var(--bwa-zindex-dropdown);
|
z-index: var(--nav-global-color-menu-zindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-dropdown.is-visible {
|
.nav-global .nav-global-dropdown.is-visible {
|
||||||
@@ -334,11 +273,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Tiny triangle in the corner. */
|
/* Tiny triangle in the corner. */
|
||||||
// TODO: consider removing for consistency
|
|
||||||
.nav-global .nav-global-apps-menu::before {
|
.nav-global .nav-global-apps-menu::before {
|
||||||
background-color: var(--bwa-color-bg-tertiary);
|
background-color: var(--nav-global-color-menu-bg);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
border: 2px var(--bwa-color-bg-tertiary) solid;
|
border: 2px var(--nav-global-color-menu-bg) solid;
|
||||||
content: '';
|
content: '';
|
||||||
display: block;
|
display: block;
|
||||||
height: .85rem;
|
height: .85rem;
|
||||||
@@ -353,15 +291,15 @@
|
|||||||
.nav-global .nav-global-apps-menu ul {
|
.nav-global .nav-global-apps-menu ul {
|
||||||
border-bottom: 2px solid rgba(255, 255, 255, .05);
|
border-bottom: 2px solid rgba(255, 255, 255, .05);
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: var(--bwa-spacer-2);
|
gap: var(--nav-global-spacer-sm);
|
||||||
grid-template-columns: repeat(2, 1fr);
|
grid-template-columns: repeat(2, 1fr);
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0 0 var(--bwa-spacer-1) 0;
|
margin: 0 0 var(--nav-global-spacer-xs) 0;
|
||||||
padding: var(--bwa-spacer-1) 0 var(--bwa-spacer-2) 0;
|
padding: var(--nav-global-spacer-xs) 0 var(--nav-global-spacer-sm) 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu ul>li>a {
|
.nav-global .nav-global-apps-menu ul>li>a {
|
||||||
border-radius: var(--bwa-border-radius-lg);
|
border-radius: var(--nav-global-border-radius-lg);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -369,46 +307,45 @@
|
|||||||
|
|
||||||
.nav-global .nav-global-apps-menu ul>li>a:hover {
|
.nav-global .nav-global-apps-menu ul>li>a:hover {
|
||||||
background-color: rgba(255, 255, 255, .05);
|
background-color: rgba(255, 255, 255, .05);
|
||||||
color: var(--bwa-color-text-primary);
|
color: var(--nav-global-color-text-active);
|
||||||
box-shadow: 0px 1px var(--bwa-spacer-1) 0 rgba(0, 0, 0, 0.05), 0 var(--bwa-spacer) 20px -1px rgba(0, 0, 0, 0.025);
|
box-shadow: var(--nav-global-box-shadow-menu-item);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu ul>li>a:hover h4,
|
.nav-global .nav-global-apps-menu ul>li>a:hover h4,
|
||||||
.nav-global .nav-global-apps-menu ul>li>a:hover svg {
|
.nav-global .nav-global-apps-menu ul>li>a:hover svg {
|
||||||
color: var(--bwa-color-accent);
|
color: var(--nav-global-color-primary);
|
||||||
fill: var(--bwa-color-accent);
|
fill: var(--nav-global-color-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu h3 {
|
.nav-global .nav-global-apps-menu h3 {
|
||||||
color: white;
|
color: white;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 12px;
|
font-size: 13px;
|
||||||
line-height: var(--bwa-spacer);
|
line-height: 18px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
margin-top: 2px;
|
|
||||||
opacity: .3;
|
opacity: .3;
|
||||||
padding-left: var(--bwa-spacer);
|
padding-left: var(--nav-global-spacer);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu h4 {
|
.nav-global .nav-global-apps-menu h4 {
|
||||||
color: var(--bwa-color-text-primary);
|
color: var(--nav-global-color-text-highlight);
|
||||||
font-size: 18px;
|
font-size: 17px;
|
||||||
line-height: 20px;
|
line-height: 18px;
|
||||||
margin: var(--bwa-spacer-1) 0 0;
|
margin: var(--nav-global-spacer-xs) 0 0;
|
||||||
padding: var(--bwa-spacer-2) var(--bwa-spacer) 0;
|
padding: var(--nav-global-spacer-sm) var(--nav-global-spacer) 0;
|
||||||
transition: color var(--bwa-transition-speed) ease-out;
|
transition: color var(--nav-global-transition-speed) ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu p {
|
.nav-global .nav-global-apps-menu p {
|
||||||
font-size: var(--bwa-fs-base);
|
font-size: 15px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
opacity: .8;
|
opacity: .8;
|
||||||
padding: var(--bwa-spacer-1) var(--bwa-spacer) var(--bwa-spacer-2);
|
padding: var(--nav-global-spacer-xs) var(--nav-global-spacer) var(--nav-global-spacer-sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu figure {
|
.nav-global .nav-global-apps-menu figure {
|
||||||
margin: var(--bwa-spacer) 0 0 var(--bwa-spacer);
|
margin: var(--nav-global-spacer) 0 0 var(--nav-global-spacer);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu ul>li>a svg {
|
.nav-global .nav-global-apps-menu ul>li>a svg {
|
||||||
@@ -425,7 +362,7 @@
|
|||||||
|
|
||||||
.nav-global .nav-global-apps-menu-section-donate a svg {
|
.nav-global .nav-global-apps-menu-section-donate a svg {
|
||||||
fill: hsl(352, 90%, 62%) !important;
|
fill: hsl(352, 90%, 62%) !important;
|
||||||
transition: transform var(--bwa-transition-speed) ease-out;
|
transition: transform var(--nav-global-transition-speed) ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-apps-menu-section-donate ul>li:first-child>a {
|
.nav-global .nav-global-apps-menu-section-donate ul>li:first-child>a {
|
||||||
@@ -445,96 +382,107 @@
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mobile. */
|
/* Mobile. */
|
||||||
.nav-global button.nav-global-logo {
|
.nav-global button.nav-global-logo {
|
||||||
display: none;
|
display: none;
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
.nav-global-apps-dropdown-container,
|
.nav-global-apps-dropdown-container,
|
||||||
.nav-global a.nav-global-logo {
|
.nav-global a.nav-global-logo {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global button.nav-global-logo {
|
.nav-global button.nav-global-logo {
|
||||||
display: flex;
|
display: block;
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global button.nav-global-logo strong,
|
|
||||||
.nav-global button.nav-global-logo svg {
|
|
||||||
margin-right: var(--bwa-spacer-2)
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .nav-global-nav-links {
|
.nav-global .nav-global-nav-links {
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
background-color: var(--bwa-color-bg-primary);
|
background-color: var(--nav-global-color-menu-bg);
|
||||||
border-radius: 6px;
|
border-radius: var(--nav-global-border-radius-lg);
|
||||||
display: none;
|
display: none;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: auto;
|
left: 1rem;
|
||||||
padding: var(--bwa-spacer-1);
|
padding: 0 var(--nav-global-spacer-sm);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 72px;
|
top: calc(100% + .5rem);
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
z-index: var(--bwa-zindex-dropdown);
|
width: 10rem;
|
||||||
|
z-index: var(--nav-global-color-menu-zindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-nav-links.is-visible {
|
.nav-global .nav-global-nav-links.is-visible {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-nav-links li {
|
.nav-global .nav-global-nav-links::before {
|
||||||
align-items: center;
|
background-color: var(--nav-global-color-menu-bg);
|
||||||
display: flex;
|
border-radius: 3px;
|
||||||
margin-bottom: var(--bwa-spacer-1);
|
border: 2px var(--nav-global-color-menu-bg) solid;
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
height: 0.8rem;
|
||||||
|
position: absolute;
|
||||||
|
left: 1.5rem;
|
||||||
|
top: -0.133rem;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
width: 1rem;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-global nav>ul {
|
||||||
|
height: initial;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-global .nav-global-nav-links>li {
|
||||||
|
border-bottom: 2px solid rgba(255, 255, 255, .05);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-nav-links li:last-child {
|
.nav-global .nav-global-nav-links>li:last-child {
|
||||||
margin-bottom: 0;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-global .nav-global-nav-links li a {
|
.nav-global .nav-global-nav-links>li>a {
|
||||||
border-radius: 6px;
|
padding-inline: 0;
|
||||||
color: var(--bwa-color-text);
|
|
||||||
display: inline-flex;
|
|
||||||
flex: 1;
|
|
||||||
line-height: initial;
|
|
||||||
padding: var(--bwa-spacer-2) var(--bwa-spacer);
|
|
||||||
transition: background-color var(--bwa-transition-speed) var(--bwa-transition-timing-fast), color var(--bwa-transition-speed) var(--bwa-transition-timing-fast);
|
|
||||||
text-decoration: none;
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style>
|
||||||
.nav-global .nav-global-nav-links li a:hover,
|
/* Custom styling for projects.blender.org */
|
||||||
.nav-global .nav-global-nav-links li a.nav-global-link-active {
|
|
||||||
background-color: var(--bwa-color-accent-bg);
|
|
||||||
color: var(--bwa-color-accent);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-global .nav-global-nav-links li a.nav-global-link-active {
|
|
||||||
font-variation-settings: 'wght' 700;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Site-specific tweaks. */
|
|
||||||
/* Make sure to start every line with ".nav-global"
|
/* Make sure to start every line with ".nav-global"
|
||||||
* so changes affect the developer navbar only. */
|
* so changes affect the developer navbar only. */
|
||||||
|
|
||||||
/* Limit navbar width on large screens (optional). */
|
/* Limit navbar width on large screens. */
|
||||||
/*
|
@media (min-width: 1200px) {
|
||||||
@media (min-width: 1380px) { // grid breakpoint 'xl'
|
[role="main"] > .dashboard-navbar,
|
||||||
|
.full.height > .menu.bar > [role="navigation"],
|
||||||
.nav-global .nav-global-container {
|
.nav-global .nav-global-container {
|
||||||
max-width: var(--container-width);
|
max-width: 1170px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
/* Override Gitea's default navbar height. */
|
||||||
|
#navbar {
|
||||||
|
min-height: 46px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide the site logo. */
|
||||||
|
#navbar .item:first-child {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix alignment of text in dropdown items. */
|
||||||
|
.ui.dropdown>.text {
|
||||||
|
position: relative;
|
||||||
|
top: -2px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="nav-global">
|
<div class="nav-global">
|
||||||
@@ -544,28 +492,26 @@
|
|||||||
<svg fill-rule="nonzero" viewBox="0 0 200 162.05">
|
<svg fill-rule="nonzero" viewBox="0 0 200 162.05">
|
||||||
<path
|
<path
|
||||||
d="M61.1 104.56c.05 2.6.88 7.66 2.12 11.61a61.27 61.27 0 0 0 13.24 22.92 68.39 68.39 0 0 0 23.17 16.64 74.46 74.46 0 0 0 30.42 6.32 74.52 74.52 0 0 0 30.4-6.42 68.87 68.87 0 0 0 23.15-16.7 61.79 61.79 0 0 0 13.23-22.97 58.06 58.06 0 0 0 2.07-25.55 59.18 59.18 0 0 0-8.44-23.1 64.45 64.45 0 0 0-15.4-16.98h.02L112.76 2.46l-.16-.12c-4.09-3.14-10.96-3.13-15.46.02-4.55 3.18-5.07 8.44-1.02 11.75l-.02.02 26 21.14-79.23.08h-.1c-6.55.01-12.85 4.3-14.1 9.74-1.27 5.53 3.17 10.11 9.98 10.14v.02l40.15-.07-71.66 55-.27.2c-6.76 5.18-8.94 13.78-4.69 19.23 4.32 5.54 13.51 5.55 20.34.03l39.1-32s-.56 4.32-.52 6.91zm100.49 14.47c-8.06 8.2-19.34 12.86-31.54 12.89-12.23.02-23.5-4.6-31.57-12.79-3.93-4-6.83-8.59-8.61-13.48a35.57 35.57 0 0 1 2.34-29.25 39.1 39.1 0 0 1 9.58-11.4 44.68 44.68 0 0 1 28.24-9.85 44.59 44.59 0 0 1 28.24 9.77 38.94 38.94 0 0 1 9.58 11.36 35.58 35.58 0 0 1 4.33 14.18 35.1 35.1 0 0 1-1.98 15.05 37.7 37.7 0 0 1-8.61 13.52zm-57.6-27.91a23.55 23.55 0 0 1 8.55-16.68 28.45 28.45 0 0 1 18.39-6.57 28.5 28.5 0 0 1 18.38 6.57 23.57 23.57 0 0 1 8.55 16.67c.37 6.83-2.37 13.19-7.2 17.9a28.18 28.18 0 0 1-19.73 7.79c-7.83 0-14.84-3-19.75-7.8a23.13 23.13 0 0 1-7.19-17.88z" />
|
d="M61.1 104.56c.05 2.6.88 7.66 2.12 11.61a61.27 61.27 0 0 0 13.24 22.92 68.39 68.39 0 0 0 23.17 16.64 74.46 74.46 0 0 0 30.42 6.32 74.52 74.52 0 0 0 30.4-6.42 68.87 68.87 0 0 0 23.15-16.7 61.79 61.79 0 0 0 13.23-22.97 58.06 58.06 0 0 0 2.07-25.55 59.18 59.18 0 0 0-8.44-23.1 64.45 64.45 0 0 0-15.4-16.98h.02L112.76 2.46l-.16-.12c-4.09-3.14-10.96-3.13-15.46.02-4.55 3.18-5.07 8.44-1.02 11.75l-.02.02 26 21.14-79.23.08h-.1c-6.55.01-12.85 4.3-14.1 9.74-1.27 5.53 3.17 10.11 9.98 10.14v.02l40.15-.07-71.66 55-.27.2c-6.76 5.18-8.94 13.78-4.69 19.23 4.32 5.54 13.51 5.55 20.34.03l39.1-32s-.56 4.32-.52 6.91zm100.49 14.47c-8.06 8.2-19.34 12.86-31.54 12.89-12.23.02-23.5-4.6-31.57-12.79-3.93-4-6.83-8.59-8.61-13.48a35.57 35.57 0 0 1 2.34-29.25 39.1 39.1 0 0 1 9.58-11.4 44.68 44.68 0 0 1 28.24-9.85 44.59 44.59 0 0 1 28.24 9.77 38.94 38.94 0 0 1 9.58 11.36 35.58 35.58 0 0 1 4.33 14.18 35.1 35.1 0 0 1-1.98 15.05 37.7 37.7 0 0 1-8.61 13.52zm-57.6-27.91a23.55 23.55 0 0 1 8.55-16.68 28.45 28.45 0 0 1 18.39-6.57 28.5 28.5 0 0 1 18.38 6.57 23.57 23.57 0 0 1 8.55 16.67c.37 6.83-2.37 13.19-7.2 17.9a28.18 28.18 0 0 1-19.73 7.79c-7.83 0-14.84-3-19.75-7.8a23.13 23.13 0 0 1-7.19-17.88z" />
|
||||||
</svg>
|
|
||||||
<strong>Developer</strong>
|
<strong>Developer</strong>
|
||||||
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<button class="nav-global-logo js-dropdown-toggle" data-toggle-menu-id="nav-global-nav-links">
|
<button class="nav-global-logo js-dropdown-toggle" data-toggle-menu-id="nav-global-nav-links">
|
||||||
<svg fill-rule="nonzero" viewBox="0 0 200 162.05">
|
<svg fill-rule="nonzero" viewBox="0 0 850.2 162.05">
|
||||||
<path
|
<path d="M61.1 104.56c.05 2.6.88 7.66 2.12 11.61a61.27 61.27 0 0 0 13.24 22.92 68.39 68.39 0 0 0 23.17 16.64 74.46 74.46 0 0 0 30.42 6.32 74.52 74.52 0 0 0 30.4-6.42 68.87 68.87 0 0 0 23.15-16.7 61.79 61.79 0 0 0 13.23-22.97 58.06 58.06 0 0 0 2.07-25.55 59.18 59.18 0 0 0-8.44-23.1 64.45 64.45 0 0 0-15.4-16.98h.02L112.76 2.46l-.16-.12c-4.09-3.14-10.96-3.13-15.46.02-4.55 3.18-5.07 8.44-1.02 11.75l-.02.02 26 21.14-79.23.08h-.1c-6.55.01-12.85 4.3-14.1 9.74-1.27 5.53 3.17 10.11 9.98 10.14v.02l40.15-.07-71.66 55-.27.2c-6.76 5.18-8.94 13.78-4.69 19.23 4.32 5.54 13.51 5.55 20.34.03l39.1-32s-.56 4.32-.52 6.91zm100.49 14.47c-8.06 8.2-19.34 12.86-31.54 12.89-12.23.02-23.5-4.6-31.57-12.79-3.93-4-6.83-8.59-8.61-13.48a35.57 35.57 0 0 1 2.34-29.25 39.1 39.1 0 0 1 9.58-11.4 44.68 44.68 0 0 1 28.24-9.85 44.59 44.59 0 0 1 28.24 9.77 38.94 38.94 0 0 1 9.58 11.36 35.58 35.58 0 0 1 4.33 14.18 35.1 35.1 0 0 1-1.98 15.05 37.7 37.7 0 0 1-8.61 13.52zm-57.6-27.91a23.55 23.55 0 0 1 8.55-16.68 28.45 28.45 0 0 1 18.39-6.57 28.5 28.5 0 0 1 18.38 6.57 23.57 23.57 0 0 1 8.55 16.67c.37 6.83-2.37 13.19-7.2 17.9a28.18 28.18 0 0 1-19.73 7.79c-7.83 0-14.84-3-19.75-7.8a23.13 23.13 0 0 1-7.19-17.88z" />
|
||||||
d="M61.1 104.56c.05 2.6.88 7.66 2.12 11.61a61.27 61.27 0 0 0 13.24 22.92 68.39 68.39 0 0 0 23.17 16.64 74.46 74.46 0 0 0 30.42 6.32 74.52 74.52 0 0 0 30.4-6.42 68.87 68.87 0 0 0 23.15-16.7 61.79 61.79 0 0 0 13.23-22.97 58.06 58.06 0 0 0 2.07-25.55 59.18 59.18 0 0 0-8.44-23.1 64.45 64.45 0 0 0-15.4-16.98h.02L112.76 2.46l-.16-.12c-4.09-3.14-10.96-3.13-15.46.02-4.55 3.18-5.07 8.44-1.02 11.75l-.02.02 26 21.14-79.23.08h-.1c-6.55.01-12.85 4.3-14.1 9.74-1.27 5.53 3.17 10.11 9.98 10.14v.02l40.15-.07-71.66 55-.27.2c-6.76 5.18-8.94 13.78-4.69 19.23 4.32 5.54 13.51 5.55 20.34.03l39.1-32s-.56 4.32-.52 6.91zm100.49 14.47c-8.06 8.2-19.34 12.86-31.54 12.89-12.23.02-23.5-4.6-31.57-12.79-3.93-4-6.83-8.59-8.61-13.48a35.57 35.57 0 0 1 2.34-29.25 39.1 39.1 0 0 1 9.58-11.4 44.68 44.68 0 0 1 28.24-9.85 44.59 44.59 0 0 1 28.24 9.77 38.94 38.94 0 0 1 9.58 11.36 35.58 35.58 0 0 1 4.33 14.18 35.1 35.1 0 0 1-1.98 15.05 37.7 37.7 0 0 1-8.61 13.52zm-57.6-27.91a23.55 23.55 0 0 1 8.55-16.68 28.45 28.45 0 0 1 18.39-6.57 28.5 28.5 0 0 1 18.38 6.57 23.57 23.57 0 0 1 8.55 16.67c.37 6.83-2.37 13.19-7.2 17.9a28.18 28.18 0 0 1-19.73 7.79c-7.83 0-14.84-3-19.75-7.8a23.13 23.13 0 0 1-7.19-17.88z" />
|
<path d="M829.17 133.76h-15.9V64.39h15.13l.77 13.59zM850.07 79q-1.47-.25-3.14-.38-1.6-.13-3.2-.13-5.26 0-8.8 1.92-3.45 1.86-5.25 5.39-1.8 3.46-2.11 8.2l-3.66.07q0-8.78 2.31-15.77 2.3-6.99 6.92-11.1 4.62-4.1 11.54-4.1 1.35 0 3.02.26 1.66.26 2.5.58zm-76.55 56.04q-10.32 0-17.82-4.42-7.5-4.5-11.55-12.06-4.03-7.63-4.03-17.05v-2.63q0-10.84 4.1-18.85 4.1-8.08 11.22-12.5 7.18-4.43 16.22-4.43 10 0 16.6 4.36 6.6 4.3 9.88 12 3.27 7.62 3.27 17.69V104h-53.67V92.53h37.96v-1.22q-.13-4.04-1.54-7.56-1.4-3.53-4.49-5.7-3.01-2.19-8.07-2.19-5.07 0-8.53 2.89-3.46 2.82-5.26 8.01-1.8 5.13-1.8 12.12v2.63q0 5.9 2.19 10.58 2.18 4.68 6.34 7.43 4.17 2.7 9.94 2.7 5.58 0 9.87-2.18 4.36-2.18 7.5-6.29l8.34 8.34q-3.27 4.93-9.87 8.97-6.54 3.98-16.8 3.98zm-88.67 25.39h-15.9V64.39h14.68l1.22 13.33zm45-60.72q0 10.13-3.13 18.15-3.08 7.95-9.1 12.56-5.97 4.62-14.63 4.62-8.72 0-14.49-4.23-5.7-4.3-8.9-11.8-3.21-7.5-4.43-17.12v-4.55q1.22-10.26 4.42-17.89 3.2-7.7 8.91-11.99 5.71-4.36 14.3-4.36 8.79 0 14.81 4.43 6.03 4.42 9.1 12.37 3.15 7.95 3.15 18.47zm-15.9-1.34q0-6.22-1.6-11.29-1.53-5.06-5-8.01-3.4-2.95-8.9-2.95-3.98 0-6.87 1.35-2.88 1.28-4.87 3.65-1.92 2.37-3.01 5.64-1.1 3.2-1.54 7.05v11.6q.77 4.62 2.56 8.47 1.8 3.85 5.13 6.16 3.4 2.24 8.72 2.24 5.51 0 8.91-3.08 3.4-3.14 4.94-8.2 1.54-5.13 1.54-11.29zm-122.51.06q0-10.13 3.84-18.08 3.85-7.95 11.03-12.57 7.25-4.68 17.38-4.68 10.25 0 17.5 4.68 7.24 4.62 11.03 12.57 3.84 7.95 3.84 18.08v1.35q0 10.06-3.84 18.08-3.79 7.95-11.03 12.56-7.18 4.62-17.38 4.62-10.19 0-17.43-4.62-7.25-4.61-11.1-12.56-3.84-8.02-3.84-18.08zm15.9 1.35q0 6.15 1.73 11.28 1.73 5.07 5.32 8.14 3.65 3.08 9.42 3.08 5.71 0 9.3-3.08 3.65-3.07 5.32-8.14 1.73-5.13 1.73-11.28v-1.35q0-6.09-1.73-11.22-1.67-5.13-5.32-8.2-3.65-3.15-9.42-3.15-5.71 0-9.36 3.14-3.6 3.08-5.33 8.21-1.66 5.13-1.66 11.22zm-29.69 33.98h-15.9V35.28h15.9zm-56.67 1.28q-10.33 0-17.83-4.42-7.5-4.5-11.54-12.06-4.04-7.63-4.04-17.05v-2.63q0-10.84 4.1-18.85 4.11-8.08 11.23-12.5 7.18-4.43 16.22-4.43 10 0 16.6 4.36 6.6 4.3 9.88 12 3.27 7.62 3.27 17.69V104H495.2V92.53h37.96v-1.22q-.13-4.04-1.54-7.56-1.41-3.53-4.49-5.7-3.01-2.19-8.08-2.19-5.06 0-8.52 2.89-3.47 2.82-5.26 8.01-1.8 5.13-1.8 12.12v2.63q0 5.9 2.18 10.58t6.35 7.43q4.17 2.7 9.94 2.7 5.58 0 9.87-2.18 4.36-2.18 7.5-6.29l8.34 8.34q-3.27 4.93-9.88 8.97-6.54 3.98-16.8 3.98zM464.3 64.39h16.48l-23.98 69.37h-10.26l1.03-12.57zm-12.25 57 .77 12.37h-10.19l-24.17-69.37H435zm-65.88 13.65q-10.32 0-17.82-4.42-7.5-4.5-11.54-12.06-4.04-7.63-4.04-17.05v-2.63q0-10.84 4.1-18.85 4.1-8.08 11.22-12.5 7.18-4.43 16.22-4.43 10 0 16.6 4.36 6.61 4.3 9.88 12 3.27 7.62 3.27 17.69V104H360.4V92.53h37.95v-1.22q-.12-4.04-1.53-7.56-1.42-3.53-4.5-5.7-3-2.19-8.07-2.19t-8.53 2.89q-3.46 2.82-5.26 8.01-1.8 5.13-1.8 12.12v2.63q0 5.9 2.19 10.58 2.18 4.68 6.35 7.43 4.16 2.7 9.93 2.7 5.58 0 9.88-2.18 4.36-2.18 7.5-6.29l8.33 8.34q-3.27 4.93-9.87 8.97-6.54 3.98-16.8 3.98zm-107.64-1.28.12-13.27h19.75q8.6 0 14.36-3.72 5.77-3.72 8.72-10.65 2.95-6.98 2.95-16.67v-4.87q0-9.94-2.95-16.8-2.88-6.86-8.59-10.45-5.7-3.59-13.91-3.59h-20.84V40.41h20.84q12.5 0 21.93 5.51 9.48 5.52 14.8 15.45 5.33 9.94 5.33 23.34v4.74q0 13.47-5.32 23.4-5.33 9.94-14.94 15.46-9.56 5.45-22.38 5.45zm9.23 0h-16.54V40.4h16.54z" />
|
||||||
</svg>
|
</svg>
|
||||||
<strong>Developer</strong>
|
<svg class="nav-global-icon nav-global-icon-dropdown-toggle" height="100px" width="100px" viewBox="0 0 1000 1000">
|
||||||
<svg class="nav-global-icon nav-global-icon-dropdown-toggle" height="100" width="100" viewBox="0 0 1000 1000">
|
<path d="m 206.53824,376.41174 a 42,42 0 0 1 71,-29 l 221,220 220,-220 a 42,42 0 1 1 59,59 l -250,250 a 42,42 0 0 1 -59,0 l -250,-250 a 42,42 0 0 1 -12,-30 z"/>
|
||||||
<path
|
|
||||||
d="m 206.53824,376.41174 a 42,42 0 0 1 71,-29 l 221,220 220,-220 a 42,42 0 1 1 59,59 l -250,250 a 42,42 0 0 1 -59,0 l -250,-250 a 42,42 0 0 1 -12,-30 z" />
|
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<ul class="nav-global-nav-links nav-global-dropdown" id="nav-global-nav-links">
|
<ul class="nav-global-nav-links nav-global-dropdown js-dropdown-menu" id="nav-global-nav-links">
|
||||||
<li>
|
<li>
|
||||||
<a href="/" class="is-active">Projects</a>
|
<a href="https://projects.blender.org" class="is-active">Projects</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://developer.blender.org/docs/">Docs</a>
|
<a href="https://wiki.blender.org">Docs</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://code.blender.org">Blog</a>
|
<a href="https://code.blender.org">Blog</a>
|
||||||
@@ -582,9 +528,9 @@
|
|||||||
<li>
|
<li>
|
||||||
<div class="nav-global-apps-dropdown-container">
|
<div class="nav-global-apps-dropdown-container">
|
||||||
<button class="js-dropdown-toggle" data-toggle-menu-id="nav-global-apps-menu">
|
<button class="js-dropdown-toggle" data-toggle-menu-id="nav-global-apps-menu">
|
||||||
<svg class="nav-global-icon" height="100" width="100" viewBox="0 0 1000 1000">
|
<svg class="nav-global-icon" height="100px" width="100px" viewBox="0 0 1000 1000">
|
||||||
<path
|
<path
|
||||||
d="m 150.5,899 a 50,50 0 0 1 -49,-50 V 749 a 50,50 0 0 1 49,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 749 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 749 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m -598,-299 a 50,50 0 0 1 -49,-50 V 450 a 50,50 0 0 1 49,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 450 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 450 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m -598,-299 a 50,50 0 0 1 -49,-50 V 151 a 50,50 0 0 1 49,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 151 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 151 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z" />
|
d="m 150.5,899 a 50,50 0 0 1 -49,-50 V 749 a 50,50 0 0 1 49,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 749 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 749 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m -598,-299 a 50,50 0 0 1 -49,-50 V 450 a 50,50 0 0 1 49,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 450 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 450 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m -598,-299 a 50,50 0 0 1 -49,-50 V 151 a 50,50 0 0 1 49,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 151 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z m 299,0 a 50,50 0 0 1 -50,-50 V 151 a 50,50 0 0 1 50,-50 h 100 a 50,50 0 0 1 50,50 v 100 a 50,50 0 0 1 -50,50 z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
@@ -659,7 +605,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://developer.blender.org/docs/?utm_medium=nav-global" target="_blank">
|
<a href="https://wiki.blender.org/?utm_medium=nav-global" target="_blank">
|
||||||
<div>
|
<div>
|
||||||
<h4>Documentation</h4>
|
<h4>Documentation</h4>
|
||||||
<p>Guidelines, release notes and development docs.</p>
|
<p>Guidelines, release notes and development docs.</p>
|
||||||
@@ -719,6 +665,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -726,88 +673,58 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
|
||||||
/* Custom styling for projects.blender.org */
|
|
||||||
/* Make sure to start every line with ".nav-global"
|
|
||||||
* so changes affect the developer navbar only. */
|
|
||||||
|
|
||||||
|
|
||||||
/* TODO: remove if custom font 'Inter' is added to Gitea
|
|
||||||
* Don't try to load custom font 'Inter' */
|
|
||||||
.nav-global * {
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Limit navbar width on large screens. */
|
|
||||||
@media(min-width: 1200px) {
|
|
||||||
.nav-global .nav-global-container {
|
|
||||||
max-width: 1170px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: @web-assets incriease nav-global-logo height for better antialising on low pixel density screens
|
|
||||||
* .nav-global .nav-global-logo svg,
|
|
||||||
* .nav-global .nav-global-logo img {
|
|
||||||
* height: 22px;
|
|
||||||
* pointer-events: none;
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
/* Simple dropdown toggle.
|
const dropdownToggles = document.getElementsByClassName("js-dropdown-toggle");
|
||||||
* Synced with 'navbar.js' manually. */
|
const btnActiveClass = 'nav-global-btn-active';
|
||||||
function dropdownToggle() {
|
const isVisibleClass = 'is-visible';
|
||||||
let dropdownToggleBtn = this;
|
|
||||||
let dropdownMenuName;
|
|
||||||
let dropdownMenuItem;
|
|
||||||
|
|
||||||
if (dropdownToggleBtn.hasAttribute('data-toggle-menu-id')) {
|
/* Hide all dropdowns. */
|
||||||
dropdownMenuName = dropdownToggleBtn.getAttribute('data-toggle-menu-id');
|
function dropdownHideAll() {
|
||||||
dropdownMenuItem = document.getElementById(dropdownMenuName);
|
const dropdownMenus = document.getElementsByClassName("js-dropdown-menu");
|
||||||
|
|
||||||
|
if (dropdownMenus) {
|
||||||
|
for (let i = 0; i < dropdownMenus.length; i++) {
|
||||||
|
dropdownMenus[i].classList.remove(isVisibleClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove styling from all dropdown toggles. */
|
||||||
|
for (let i = 0; i < dropdownToggles.length; i++) {
|
||||||
|
dropdownToggles[i].classList.remove(btnActiveClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < dropdownToggles.length; i++) {
|
||||||
|
dropdownToggles[i].addEventListener("click", function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
const dropdownId = this.getAttribute('data-toggle-menu-id');
|
||||||
|
const el = document.getElementById(dropdownId);
|
||||||
|
|
||||||
|
if (el) {
|
||||||
|
/* If the button is already active, remove styling. */
|
||||||
|
if (el.classList.contains(isVisibleClass)) {
|
||||||
|
dropdownHideAll();
|
||||||
} else {
|
} else {
|
||||||
dropdownMenuItem = dropdownToggleBtn.nextElementSibling;
|
/* Style button as active and show menu. */
|
||||||
}
|
this.classList.add(btnActiveClass);
|
||||||
|
el.classList.add(isVisibleClass);
|
||||||
if (!dropdownMenuItem) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dropdownToggleBtn.classList.toggle('active');
|
|
||||||
dropdownMenuItem.classList.toggle('is-visible');
|
|
||||||
}
|
|
||||||
|
|
||||||
window.onload = function(e) {
|
|
||||||
const dropdownToggles = document.querySelectorAll('.js-dropdown-toggle, .js-show-toggle');
|
|
||||||
|
|
||||||
for (var i = 0; i < dropdownToggles.length; i++) {
|
|
||||||
dropdownToggles[i].addEventListener('click', dropdownToggle, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Close all menus, to prevent multiple menus open at the same time. */
|
|
||||||
document.onclick = function (e) {
|
|
||||||
const targetMenuId = e.target.getAttribute('data-toggle-menu-id');
|
|
||||||
const targetMenuElement = document.getElementById(targetMenuId);
|
|
||||||
|
|
||||||
/* If the clicked element is not a menu, or it's not the menu
|
|
||||||
* that we are trying to open, close it. */
|
|
||||||
if (!e.target.classList.contains('.js-dropdown-toggle') || targetMenuElement && targetMenuElement.classList.contains('is-visible')) {
|
|
||||||
const dropdownMenus = document.querySelectorAll('.dropdown-menu, .js-dropdown-menu');
|
|
||||||
|
|
||||||
if (dropdownMenus.length == 0) { return };
|
|
||||||
|
|
||||||
for (var i = 0; i < dropdownMenus.length; i++) {
|
|
||||||
if (dropdownMenus[i].id && dropdownMenus[i].id != targetMenuId) {
|
|
||||||
dropdownMenus[i].classList.remove('is-visible', 'active');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
for (var i = 0; i < dropdownToggles.length; i++) {
|
/* Hide all dropdowns when clicking anywhere except menus. */
|
||||||
if (dropdownToggles[i].id && dropdownToggles[i].id != targetMenuId) {
|
document.body.addEventListener("click", function (e) {
|
||||||
dropdownToggles[i].classList.remove('is-active', 'active');
|
if (!e.target.classList.contains("js-dropdown-menu")) {
|
||||||
|
dropdownHideAll();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Hide all dropdowns when pressing Esc. */
|
||||||
|
window.addEventListener('keydown', function (event) {
|
||||||
|
if (event.key === 'Escape') {
|
||||||
|
dropdownHideAll();
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,43 +1,35 @@
|
|||||||
<div class="ui dropdown jump item tooltip" data-content="Products">
|
|
||||||
Products
|
|
||||||
<span class="fitted not-mobile">{{svg "octicon-triangle-down"}}</span>
|
|
||||||
<div class="menu">
|
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/">Blender</a>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender-manual/">User Manual</a>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender-developer-docs/">Developer Documentation</a>
|
|
||||||
<div class="divider"></div>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/infrastructure/blender-open-data/">Blender Benchmark</a>
|
|
||||||
<div class="divider"></div>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/studio/">Blender Studio Tools</a>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/studio/flamenco/">Flamenco</a>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/studio/watchtower/">Watchtower</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="ui dropdown jump item tooltip" data-content="Modules">
|
<div class="ui dropdown jump item tooltip" data-content="Modules">
|
||||||
|
<span class="text">
|
||||||
Modules
|
Modules
|
||||||
<span class="fitted not-mobile">{{svg "octicon-triangle-down"}}</span>
|
<span class="fitted not-mobile">{{svg "octicon-triangle-down"}}</span>
|
||||||
|
</span>
|
||||||
<div class="menu">
|
<div class="menu">
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Animation & Rigging">Animation & Rigging</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Animation & Rigging">Animation & Rigging</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Asset System">Asset System</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Asset Browser">Asset Browser</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Core">Core</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Core">Core</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Grease Pencil">Grease Pencil</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Grease Pencil">Grease Pencil</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Modeling">Modeling</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Modeling">Modeling</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Nodes & Physics">Nodes & Physics</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Nodes & Physics">Nodes & Physics</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Pipeline & I/O">Pipeline & I/O</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Pipeline, Assets & I/O">Pipeline, Assets & I/O</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Platforms & Builds">Platforms & Builds</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Platforms, Builds, Tests & Devices">Platforms, Builds, Tests & Devices</a>
|
||||||
|
|
||||||
|
<div class="divider"></div>
|
||||||
|
<div class="header">Python & Add-ons</div>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Python API & Text Editor">Python API & Text Editor</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Python API & Text Editor">Python API & Text Editor</a>
|
||||||
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Officially Maintained Add-ons">Officially Maintained Add-ons</a>
|
||||||
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Community Maintained Add-ons">Community Maintained Add-ons</a>
|
||||||
|
<div class="divider"></div>
|
||||||
|
|
||||||
|
<div class="header">Rendering</div>
|
||||||
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: EEVEE & Viewport">EEVEE & Viewport</a>
|
||||||
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Render & Cycles">Render & Cycles</a>
|
||||||
|
<div class="divider"></div>
|
||||||
|
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Sculpt, Paint & Texture">Sculpt, Paint & Texture</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Sculpt, Paint & Texture">Sculpt, Paint & Texture</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Triaging">Triaging</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Triaging">Triaging</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: User Interface">User Interface</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: User Interface">User Interface</a>
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: VFX & Video">VFX & Video</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: VFX & Video">VFX & Video</a>
|
||||||
|
|
||||||
<div class="divider"></div>
|
|
||||||
<div class="header">Rendering</div>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Render & Cycles">Render & Cycles</a>
|
|
||||||
<a class="item" href="{{AppSubUrl}}/blender/blender/wiki/Module: Viewport & EEVEE">Viewport & EEVEE</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a class="item hide-on-mid" href="{{AppSubUrl}}/blender/blender/issues/new?template=.gitea%2fissue_template%2fbug.yaml">Report a Bug</a>
|
<a class="item" href="{{AppSubUrl}}/blender/blender/issues/new?template=.gitea%2fissue_template%2fbug.yaml">Report a Bug</a>
|
||||||
<a class="item hide-on-mid" href="{{AppSubUrl}}/paste/">Paste Code</a>
|
|
||||||
|
|||||||
@@ -1,9 +1,33 @@
|
|||||||
<style>
|
<style>
|
||||||
:root {
|
/* bthree dark theme */
|
||||||
--border-radius: .33rem;
|
@font-face {
|
||||||
--transition-speed: 150ms;
|
font-family: "Heebo";
|
||||||
|
src: url("/assets/fonts/Heebo-VariableFont_wght.ttf") format("truetype-variations");
|
||||||
|
font-weight: normal;
|
||||||
|
font-variation-settings: "wght" var(--font-weight);
|
||||||
|
font-style: normal
|
||||||
|
}
|
||||||
|
|
||||||
--color-timeline: var(--color-secondary);
|
:root {
|
||||||
|
/* Spacing. */
|
||||||
|
--spacer: 1rem;
|
||||||
|
--spacer-1: .25rem;
|
||||||
|
--spacer-2: .5rem;
|
||||||
|
--spacer-3: var(--spacer);
|
||||||
|
--spacer-4: 1.5rem;
|
||||||
|
--spacer-5: 3rem;
|
||||||
|
|
||||||
|
/* Override fonts. */
|
||||||
|
--fonts-override: 'Heebo', -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
--font-weight-thin: 300;
|
||||||
|
--font-weight-bold: 600;
|
||||||
|
|
||||||
|
--border-radius: .33rem;
|
||||||
|
|
||||||
|
--color-border: var(--color-secondary);
|
||||||
|
|
||||||
|
/* Transitions. */
|
||||||
|
--transition-speed: 150ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Light-theme specific. */
|
/* Light-theme specific. */
|
||||||
@@ -11,28 +35,65 @@
|
|||||||
--color-primary: hsl(204deg, 90%, 52%);
|
--color-primary: hsl(204deg, 90%, 52%);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Revert the red color in dashboard header buttons. */
|
/* Set weight variations. */
|
||||||
|
strong, b, h1, h2, h3, h4, h5, h6, .bold,
|
||||||
|
a.issue-title,
|
||||||
|
.ui.tabular.menu .active.item {
|
||||||
|
font-weight: normal !important;
|
||||||
|
font-variation-settings: "wght" var(--font-weight-bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
.repository.view.issue .title .issue-title h1 {
|
||||||
|
font-variation-settings: "wght" var(--font-weight-thin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
/* Limit navbar width on large screens. */
|
||||||
|
.dashboard-navbar {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
max-width: 1170px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Revert the red color in dashboard eader buttons. */
|
||||||
.dashboard.feeds .right.stackable.menu>.item.active,
|
.dashboard.feeds .right.stackable.menu>.item.active,
|
||||||
.dashboard.issues .right.stackable.menu>.item.active {
|
.dashboard.issues .right.stackable.menu>.item.active {
|
||||||
color: unset;
|
color: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Global tweaks (all themes) */
|
/* Global tweaks (all themes) */
|
||||||
/* Buttons. */
|
.ui.avatar {
|
||||||
.ui.button,
|
|
||||||
a.ui.label {
|
|
||||||
transition: background-color var(--transition-speed), color var(--transition-speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Avatars. */
|
|
||||||
img.ui.avatar {
|
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Emoji. */
|
.ui.user.list .ui.avatar,
|
||||||
.markup .emoji {
|
.ui.user.list .ui.avatar+.content {
|
||||||
margin-right: .075em;
|
display: inline-block;
|
||||||
vertical-align: -.075em;
|
}
|
||||||
|
|
||||||
|
/* Fix alignment and margin issues in avatars. */
|
||||||
|
.user.list img.avatar,
|
||||||
|
.comment-list .code-comment img.avatar,
|
||||||
|
.comment-list .comment img.avatar {
|
||||||
|
vertical-align: unset !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user.list img.avatar,
|
||||||
|
.commit-list img.avatar,
|
||||||
|
.comment-list .code-comment img.avatar,
|
||||||
|
.comment-list .comment img.avatar,
|
||||||
|
.comment-list .timeline-item img.avatar {
|
||||||
|
margin-right: var(--spacer-2) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.commit-list .author img.avatar {
|
||||||
|
margin-right: var(--spacer-3) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Labels. e.g. issues count indicator in repo tabs. */
|
||||||
|
.ui.small.label {
|
||||||
|
border-radius: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hide the app logo (first link in "brand" div). */
|
/* Hide the app logo (first link in "brand" div). */
|
||||||
@@ -40,22 +101,8 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dim the "header" of sections in dropdown menus. */
|
.following.bar #navbar .brand #navbar-expand-toggle {
|
||||||
.ui.dropdown .menu>.header:not(.ui) {
|
margin-left: var(--spacer-4);
|
||||||
color: var(--color-text-light-3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Markup. */
|
|
||||||
/* Slight highlight on strong and heading elements, to improve readability. */
|
|
||||||
.markup strong,
|
|
||||||
.markup h1, .markup h2, .markup h3, .markup h4, .markup h5, .markup h6 {
|
|
||||||
color: var(--color-text-dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Homepage. */
|
|
||||||
/* By default Gitea colors links green */
|
|
||||||
.home a {
|
|
||||||
color: var(--color-primary);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hide brand navbar completely when not in mobile. */
|
/* Hide brand navbar completely when not in mobile. */
|
||||||
@@ -65,18 +112,56 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hide the navbar logo. */
|
/* Notifications indicator. */
|
||||||
#navbar #navbar-logo {
|
.notification_count {
|
||||||
display: none;
|
border-radius: 0.6em;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: normal !important;
|
||||||
|
font-variation-settings: "wght" var(--font-weight-bold);
|
||||||
|
line-height: unset;
|
||||||
|
margin-left: var(--spacer-1);
|
||||||
|
padding: 2px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1000px) {
|
/* Navigation tabs.
|
||||||
.hide-on-mid {
|
* e.g. Code, Issues pages in a repository. */
|
||||||
display: none !important;
|
.ui.tabular.menu .item {
|
||||||
|
border: none;
|
||||||
|
border-bottom: 3px solid transparent;
|
||||||
|
border-radius: 0;
|
||||||
|
transition: border-bottom-color var(--transition-speed) ease-in-out, color var(--transition-speed) ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ui.tabular.menu .item:hover {
|
||||||
|
border-bottom-color: var(--color-text-dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.tabular.menu .active.item {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-bottom: 3px solid currentColor;
|
||||||
|
margin-bottom: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.tabular.menu .active.item:hover {
|
||||||
|
background: transparent;
|
||||||
|
border-color: var(--color-text-dark);
|
||||||
|
color: var(--color-text-dark);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Repository page. */
|
/* Repository page. */
|
||||||
|
.repository .repo-title .repo-icon svg {
|
||||||
|
max-width: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui.table {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repository .ui.table a {
|
||||||
|
color: var(--color-text);
|
||||||
|
}
|
||||||
|
|
||||||
.repository .file-view.markdown a {
|
.repository .file-view.markdown a {
|
||||||
color: var(--color-primary);
|
color: var(--color-primary);
|
||||||
}
|
}
|
||||||
@@ -90,6 +175,10 @@
|
|||||||
color: currentColor;
|
color: currentColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ui.repo-topic.label {
|
||||||
|
border-radius: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
/* Repository stats. */
|
/* Repository stats. */
|
||||||
.repository-summary-language-stats {
|
.repository-summary-language-stats {
|
||||||
height: unset;
|
height: unset;
|
||||||
@@ -101,7 +190,18 @@
|
|||||||
|
|
||||||
/* Repository: Activity page. */
|
/* Repository: Activity page. */
|
||||||
.stats-table {
|
.stats-table {
|
||||||
|
border-radius: 2em;
|
||||||
margin-bottom: var(--spacer);
|
margin-bottom: var(--spacer);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.issue.list {
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
border: thin solid var(--color-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.issue.list > .item {
|
||||||
|
padding: var(--spacer-2) var(--spacer) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hide branches from PR list. */
|
/* Hide branches from PR list. */
|
||||||
@@ -109,6 +209,17 @@
|
|||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.issue.list a.project,
|
||||||
|
.issue.list a.milestone {
|
||||||
|
margin-inline: var(--spacer-2) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.issue.list a.project svg {
|
||||||
|
margin-right: var(--spacer-2) !important;
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Footer. */
|
/* Footer. */
|
||||||
footer {
|
footer {
|
||||||
color: var(--color-footer-text);
|
color: var(--color-footer-text);
|
||||||
@@ -144,77 +255,6 @@
|
|||||||
.restructuredtext section dl dt {
|
.restructuredtext section dl dt {
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Alert blocks. */
|
|
||||||
blockquote.attention-note {
|
|
||||||
background-color: var(--color-info-bg);
|
|
||||||
border-left-color: var(--color-blue-dark-1);
|
|
||||||
}
|
|
||||||
strong.attention-note, span.attention-note {
|
|
||||||
color: var(--color-blue-dark-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote.attention-tip {
|
|
||||||
background-color: var(--color-success-bg);
|
|
||||||
border-left-color: var(--color-success-text);
|
|
||||||
}
|
|
||||||
strong.attention-tip, span.attention-tip {
|
|
||||||
color: var(--color-success-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote.attention-important {
|
|
||||||
background-color: var(--color-violet-dark-bg);
|
|
||||||
border-left-color: var(--color-violet-dark-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
strong.attention-important, span.attention-important {
|
|
||||||
color: var(--color-violet-dark-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote.attention-warning {
|
|
||||||
background-color: var(--color-warning-bg);
|
|
||||||
border-left-color: var(--color-warning-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
strong.attention-warning, span.attention-warning {
|
|
||||||
color: var(--color-warning-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote.attention-caution {
|
|
||||||
background-color: var(--color-error-bg);
|
|
||||||
border-left-color: var(--color-red-dark-1);
|
|
||||||
}
|
|
||||||
strong.attention-caution, span.attention-caution {
|
|
||||||
color: var(--color-red-dark-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make Navbar dropdown item left-aligned. Needed from Chromium v133.x. */
|
|
||||||
#navbar .dropdown .item {
|
|
||||||
justify-content: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* User badges */
|
|
||||||
.user-badges {
|
|
||||||
/* Some rules override Gitea defaults. */
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: center;
|
|
||||||
gap: 16px; /* --spacer */
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-badges li {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
form[action="/blender/blender/issues/new"] {
|
|
||||||
--min-height-textarea: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
form[action="/blender/blender/issues/new"] .combo-markdown-editor textarea.markdown-text-editor {
|
|
||||||
max-height: calc(100vh - 132px) !important;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script defer data-domain="projects.blender.org" src="https://analytics.blender.org/js/script.js"></script>
|
<script defer data-domain="projects.blender.org" src="https://analytics.blender.org/js/script.js"></script>
|
||||||
|
|||||||
@@ -19,12 +19,12 @@
|
|||||||
<p>This portal hosts more than just the Blender sources, bug and patch tracker. Explore the other repositories and get involved!</p>
|
<p>This portal hosts more than just the Blender sources, bug and patch tracker. Explore the other repositories and get involved!</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{template "blender_components/card_projects" .}}
|
|
||||||
{{template "blender_components/card_repos" .}}
|
{{template "blender_components/card_repos" .}}
|
||||||
|
|
||||||
<div class="ui stackable two column grid mb-4 pt-0">
|
<div class="ui stackable two column grid mb-4 pt-0">
|
||||||
<div class="column">
|
<div class="column">
|
||||||
{{template "blender_components/card_releases" .}}
|
{{template "blender_components/card_releases" .}}
|
||||||
|
{{template "blender_components/card_projects" .}}
|
||||||
</div>
|
</div>
|
||||||
<div class="column">
|
<div class="column">
|
||||||
{{template "blender_components/card_modules" .}}
|
{{template "blender_components/card_modules" .}}
|
||||||
|
|||||||
@@ -4,7 +4,57 @@
|
|||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
<div class="ui stackable grid">
|
<div class="ui stackable grid">
|
||||||
<div class="ui container ten wide column">
|
<div class="ui container ten wide column">
|
||||||
{{template "blender_components/card_projects" .}}
|
|
||||||
|
<div class="ui">
|
||||||
|
<div class="ui stackable three column grid">
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui card card-with-image card-with-icon">
|
||||||
|
<a href="{{AppSubUrl}}/blender/blender" class="image">
|
||||||
|
<img src="/assets/img/thumb_blender.jpg" style="width: 100%; height: 100%;">
|
||||||
|
</a>
|
||||||
|
<div class="content">
|
||||||
|
<a href="{{AppSubUrl}}/blender/blender">
|
||||||
|
<h4>Blender</h4>
|
||||||
|
</a>
|
||||||
|
<div class="description">
|
||||||
|
<p>The main repository for Blender's code and all its branches.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui card card-with-image card-with-icon">
|
||||||
|
<a href="{{AppSubUrl}}/blender/documentation" class="image">
|
||||||
|
<img src="/assets/img/thumb_manual.jpg" style="width: 100%; height: 100%;">
|
||||||
|
</a>
|
||||||
|
<div class="content">
|
||||||
|
<a href="{{AppSubUrl}}/blender/documentation">
|
||||||
|
<h4>User Manual</h4>
|
||||||
|
</a>
|
||||||
|
<div class="description">
|
||||||
|
<p>The official Blender manual, with references and examples.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui card card-with-image card-with-icon">
|
||||||
|
<a href="{{AppSubUrl}}/studio/flamenco" class="image">
|
||||||
|
<img src="/assets/img/thumb_flamenco.jpg" style="width: 100%; height: 100%;">
|
||||||
|
</a>
|
||||||
|
<div class="content">
|
||||||
|
<a href="{{AppSubUrl}}/studio/flamenco">
|
||||||
|
<h4>Flamenco</h4>
|
||||||
|
</a>
|
||||||
|
<div class="description">
|
||||||
|
<p>Free and open source render management software.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="six wide column">
|
<div class="six wide column">
|
||||||
{{template "blender_components/card_releases" .}}
|
{{template "blender_components/card_releases" .}}
|
||||||
|
|||||||
Reference in New Issue
Block a user