Compare commits

..

No commits in common. "33e556e67a81d8aba1135b60d9945986633fc938" and "4fcf3a3f90ddced158cb31fbb5c1b534c824fc8c" have entirely different histories.

43 changed files with 246 additions and 530 deletions

View File

@ -1,133 +1,44 @@
extends: stylelint-config-standard
plugins: plugins:
- stylelint-declaration-strict-value - stylelint-declaration-strict-value
overrides: overrides:
- files: ["**/*.less"] - files: ["**/*.less"]
customSyntax: postcss-less customSyntax: postcss-less
- files: ["**/*.less"]
rules:
scale-unlimited/declaration-strict-value: [color, {
ignoreValues: /^(inherit|transparent|unset|initial)$/
}]
- files: ["**/chroma/*", "**/codemirror/*", "**/standalone/*", "**/console/*"] - files: ["**/chroma/*", "**/codemirror/*", "**/standalone/*", "**/console/*"]
rules: rules:
scale-unlimited/declaration-strict-value: null scale-unlimited/declaration-strict-value: null
rules: rules:
alpha-value-notation: null alpha-value-notation: null
annotation-no-unknown: true
at-rule-allowed-list: null
at-rule-disallowed-list: null
at-rule-empty-line-before: null at-rule-empty-line-before: null
at-rule-no-unknown: true block-closing-brace-empty-line-before: null
at-rule-no-vendor-prefix: true
at-rule-property-required-list: null
block-no-empty: true
color-function-notation: null color-function-notation: null
color-hex-alpha: null
color-hex-length: null color-hex-length: null
color-named: null
color-no-hex: null
color-no-invalid-hex: true
comment-empty-line-before: null comment-empty-line-before: null
comment-no-empty: true
comment-pattern: null
comment-whitespace-inside: null
comment-word-disallowed-list: null
custom-media-pattern: null
custom-property-empty-line-before: null
custom-property-no-missing-var-function: true
custom-property-pattern: null
declaration-block-no-duplicate-custom-properties: true
declaration-block-no-duplicate-properties: [true, {ignore: [consecutive-duplicates-with-different-values]}]
declaration-block-no-redundant-longhand-properties: null declaration-block-no-redundant-longhand-properties: null
declaration-block-no-shorthand-property-overrides: null
declaration-block-single-line-max-declarations: null declaration-block-single-line-max-declarations: null
declaration-empty-line-before: null declaration-empty-line-before: null
declaration-no-important: null
declaration-property-max-values: null
declaration-property-unit-allowed-list: null
declaration-property-unit-disallowed-list: null
declaration-property-value-allowed-list: null
declaration-property-value-disallowed-list: null
declaration-property-value-no-unknown: true
font-family-name-quotes: always-where-recommended
font-family-no-duplicate-names: true
font-family-no-missing-generic-family-keyword: true
font-weight-notation: null
function-allowed-list: null
function-calc-no-unspaced-operator: true
function-disallowed-list: null
function-linear-gradient-no-nonstandard-direction: true
function-name-case: lower
function-no-unknown: null function-no-unknown: null
function-url-no-scheme-relative: null
function-url-quotes: always
function-url-scheme-allowed-list: null
function-url-scheme-disallowed-list: null
hue-degree-notation: null hue-degree-notation: null
import-notation: string import-notation: string
keyframe-block-no-duplicate-selectors: true indentation: 2
keyframe-declaration-no-important: true max-line-length: null
keyframe-selector-notation: null
keyframes-name-pattern: null
length-zero-no-unit: true
max-nesting-depth: null
media-feature-name-allowed-list: null
media-feature-name-disallowed-list: null
media-feature-name-no-unknown: true
media-feature-name-no-vendor-prefix: true
media-feature-name-unit-allowed-list: null
media-feature-name-value-allowed-list: null
media-feature-range-notation: null
named-grid-areas-no-invalid: true
no-descending-specificity: null no-descending-specificity: null
no-duplicate-at-import-rules: true
no-duplicate-selectors: true
no-empty-source: true
no-invalid-double-slash-comments: true
no-invalid-position-at-import-rule: null no-invalid-position-at-import-rule: null
no-irregular-whitespace: true number-leading-zero: never
no-unknown-animations: null
number-max-precision: null number-max-precision: null
property-allowed-list: null
property-disallowed-list: null
property-no-unknown: true
property-no-vendor-prefix: null property-no-vendor-prefix: null
rule-empty-line-before: null rule-empty-line-before: null
rule-selector-property-disallowed-list: null
scale-unlimited/declaration-strict-value: [color, {ignoreValues: /^(inherit|transparent|unset|initial|currentcolor)$/}]
selector-attribute-name-disallowed-list: null
selector-attribute-operator-allowed-list: null
selector-attribute-operator-disallowed-list: null
selector-attribute-quotes: always
selector-class-pattern: null selector-class-pattern: null
selector-combinator-allowed-list: null
selector-combinator-disallowed-list: null
selector-disallowed-list: null
selector-id-pattern: null selector-id-pattern: null
selector-max-attribute: null
selector-max-class: null
selector-max-combinators: null
selector-max-compound-selectors: null
selector-max-id: null
selector-max-pseudo-class: null
selector-max-specificity: null
selector-max-type: null
selector-max-universal: null
selector-nested-pattern: null
selector-no-qualifying-type: null
selector-no-vendor-prefix: true
selector-not-notation: null
selector-pseudo-class-allowed-list: null
selector-pseudo-class-disallowed-list: null
selector-pseudo-class-no-unknown: true
selector-pseudo-element-allowed-list: null
selector-pseudo-element-colon-notation: double selector-pseudo-element-colon-notation: double
selector-pseudo-element-disallowed-list: null
selector-pseudo-element-no-unknown: true
selector-type-case: lower
selector-type-no-unknown: [true, {ignore: [custom-elements]}]
shorthand-property-no-redundant-values: true shorthand-property-no-redundant-values: true
string-no-newline: true string-quotes: null
time-min-milliseconds: null value-no-vendor-prefix: null
unit-allowed-list: null
unit-disallowed-list: null
unit-no-unknown: true
value-keyword-case: null
value-no-vendor-prefix: [true, {ignoreValues: [box, inline-box]}]

View File

@ -4,19 +4,6 @@ This changelog goes through all the changes that have been made in each release
without substantial changes to our git log; to see the highlights of what has without substantial changes to our git log; to see the highlights of what has
been added to each release, please refer to the [blog](https://blog.gitea.io). been added to each release, please refer to the [blog](https://blog.gitea.io).
## [1.18.5](https://github.com/go-gitea/gitea/releases/tag/v1.18.5) - 2023-02-21
* ENHANCEMENTS
* Hide 2FA status from other members in organization members list (#22999) (#23023)
* BUGFIXES
* Add force_merge to merge request and fix checking mergable (#23010) (#23032)
* Use `--message=%s` for git commit message (#23028) (#23029)
* Render access log template as text instead of HTML (#23013) (#23025)
* Fix the Manually Merged form (#23015) (#23017)
* Use beforeCommit instead of baseCommit (#22949) (#22996)
* Display attachments of review comment when comment content is blank (#23035) (#23046)
* Return empty url for submodule tree entries (#23043) (#23048)
## [1.18.4](https://github.com/go-gitea/gitea/releases/tag/1.18.4) - 2023-02-20 ## [1.18.4](https://github.com/go-gitea/gitea/releases/tag/1.18.4) - 2023-02-20
* SECURITY * SECURITY

View File

@ -299,7 +299,9 @@ known as the release freeze. All the feature pull requests should be
merged before feature freeze. And, during the frozen period, a corresponding merged before feature freeze. And, during the frozen period, a corresponding
release branch is open for fixes backported from main branch. Release candidates release branch is open for fixes backported from main branch. Release candidates
are made during this period for user testing to are made during this period for user testing to
obtain a final version that is maintained in this branch. obtain a final version that is maintained in this branch. A release is
maintained by issuing patch releases to only correct critical problems
such as crashes or security issues.
Major release cycles are seasonal. They always begin on the 25th and end on Major release cycles are seasonal. They always begin on the 25th and end on
the 24th (i.e., the 25th of December to March 24th). the 24th (i.e., the 25th of December to March 24th).
@ -309,16 +311,6 @@ for the previous version. For example, if the latest, published release is
v1.2, then minor changes for the previous release—e.g., v1.1.0 -> v1.1.1—are v1.2, then minor changes for the previous release—e.g., v1.1.0 -> v1.1.1—are
still possible. still possible.
The previous release gets fixes for:
- Security issues
- Critical bugs
- Regressions
- Build issues
- Necessary enhancements (including necessary UI/UX fixes)
The backported fixes should avoid breaking downgrade between minor releases as much as possible.
## Maintainers ## Maintainers
To make sure every PR is checked, we have [team To make sure every PR is checked, we have [team

View File

@ -64,7 +64,5 @@ CMD ["/bin/s6-svscan", "/etc/s6"]
COPY docker/root / COPY docker/root /
COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea COPY --from=build-env /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini COPY --from=build-env /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
RUN chmod 755 /usr/bin/entrypoint /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini RUN chmod 755 /usr/bin/entrypoint /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
RUN chmod 755 /etc/s6/gitea/* /etc/s6/openssh/* /etc/s6/.s6-svscan/* RUN chmod 755 /etc/s6/gitea/* /etc/s6/openssh/* /etc/s6/.s6-svscan/*
RUN chmod 644 /etc/profile.d/gitea_bash_autocomplete.sh

View File

@ -54,9 +54,7 @@ RUN chown git:git /var/lib/gitea /etc/gitea
COPY docker/rootless / COPY docker/rootless /
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea
COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini
COPY --from=build-env /go/src/code.gitea.io/gitea/contrib/autocompletion/bash_autocomplete /etc/profile.d/gitea_bash_autocomplete.sh
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-setup.sh /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/docker-setup.sh /app/gitea/gitea /usr/local/bin/gitea /usr/local/bin/environment-to-ini
RUN chmod 644 /etc/profile.d/gitea_bash_autocomplete.sh
#git:git #git:git
USER 1000:1000 USER 1000:1000

View File

@ -1,17 +0,0 @@
Bash and Zsh completion
=======================
From within the gitea root run:
```bash
source contrib/autocompletion/bash_autocomplete
```
or for zsh run:
```bash
source contrib/autocompletion/zsh_autocomplete
```
These scripts will check if gitea is on the path and if so add autocompletion for `gitea`. Or if not autocompletion will work for `./gitea`.
If gitea has been installed as a different program pass in the `PROG` environment variable to set the correct program name.

View File

@ -1,30 +0,0 @@
#! /bin/bash
# Heavily inspired by https://github.com/urfave/cli
_cli_bash_autocomplete() {
if [[ "${COMP_WORDS[0]}" != "source" ]]; then
local cur opts base
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
if [[ "$cur" == "-"* ]]; then
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion )
else
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
fi
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
if [ -z "$PROG" ] && [ ! "$(command -v gitea &> /dev/null)" ] ; then
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete gitea
elif [ -z "$PROG" ]; then
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete ./gitea
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete "$PWD/gitea"
else
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete "$PROG"
unset PROG
fi

View File

@ -1,30 +0,0 @@
#compdef ${PROG:=gitea}
# Heavily inspired by https://github.com/urfave/cli
_cli_zsh_autocomplete() {
local -a opts
local cur
cur=${words[-1]}
if [[ "$cur" == "-"* ]]; then
opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
else
opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-bash-completion)}")
fi
if [[ "${opts[1]}" != "" ]]; then
_describe 'values' opts
else
_files
fi
return
}
if [ -z $PROG ] ; then
compdef _cli_zsh_autocomplete gitea
else
compdef _cli_zsh_autocomplete $(basename $PROG)
fi

View File

@ -18,7 +18,7 @@ params:
description: Git with a cup of tea description: Git with a cup of tea
author: The Gitea Authors author: The Gitea Authors
website: https://docs.gitea.io website: https://docs.gitea.io
version: 1.18.5 version: 1.18.1
minGoVersion: 1.19 minGoVersion: 1.19
goVersion: 1.20 goVersion: 1.20
minNodeVersion: 16 minNodeVersion: 16

View File

@ -39,20 +39,12 @@ We recommend [Google HTML/CSS Style Guide](https://google.github.io/styleguide/h
### Gitea specific guidelines: ### Gitea specific guidelines:
1. Every feature (Fomantic-UI/jQuery module) should be put in separate files/directories. 1. Every feature (Fomantic-UI/jQuery module) should be put in separate files/directories.
2. HTML ids and classes should use kebab-case, it's preferred to contain 2-3 feature related keywords. 2. HTML ids and classes should use kebab-case.
3. HTML ids and classes used in JavaScript should be unique for the whole project, and should contain 2-3 feature related keywords. We recommend to use the `js-` prefix for classes that are only used in JavaScript. 3. HTML ids and classes used in JavaScript should be unique for the whole project, and should contain 2-3 feature related keywords. We recommend to use the `js-` prefix for classes that are only used in JavaScript.
4. CSS styling for classes provided by frameworks should not be overwritten. Always use new class names with 2-3 feature related keywords to overwrite framework styles. Gitea's helper CSS classes in `helpers.less` could be helpful. 4. jQuery events across different features could use their own namespaces if there are potential conflicts.
5. The backend can pass complex data to the frontend by using `ctx.PageData["myModuleData"] = map[]{}`, but do not expose whole models to the frontend to avoid leaking sensitive data. 5. CSS styling for classes provided by frameworks should not be overwritten. Always use new class-names with 2-3 feature related keywords to overwrite framework styles.
6. Simple pages and SEO-related pages use Go HTML Template render to generate static Fomantic-UI HTML output. Complex pages can use Vue3. 6. The backend can pass complex data to the frontend by using `ctx.PageData["myModuleData"] = map[]{}`
7. Clarify variable types, prefer `elem.disabled = true` instead of `elem.setAttribute('disabled', 'anything')`, prefer `$el.prop('checked', var === 'yes')` instead of `$el.prop('checked', var)`. 7. Simple pages and SEO-related pages use Go HTML Template render to generate static Fomantic-UI HTML output. Complex pages can use Vue3.
8. Use semantic elements, prefer `<button class="ui button">` instead of `<div class="ui button">`.
9. Avoid unnecessary `!important` in CSS, add comments to explain why it's necessary if it can't be avoided.
### Accessibility / ARIA
In history, Gitea heavily uses Fomantic UI which is not an accessibility-friendly framework.
Gitea uses some patches to make Fomantic UI more accessible (see the `aria.js` and `aria.md`),
but there are still many problems which need a lot of work and time to fix.
### Framework Usage ### Framework Usage

View File

@ -129,16 +129,6 @@ export GITEA_WORK_DIR=/var/lib/gitea/
cp gitea /usr/local/bin/gitea cp gitea /usr/local/bin/gitea
``` ```
### Adding bash/zsh autocompletion (from 1.19)
A script to enable bash-completion can be found at [`contrib/autocompletion/bash_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/bash_autocomplete). This can be copied to `/usr/share/bash-completion/completions/gitea`
or sourced within your `.bashrc`.
Similarly a script for zsh-completion can be found at [`contrib/autocompletion/zsh_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/zsh_autocomplete). This can be copied to `/usr/share/zsh/_gitea` or sourced within your
`.zshrc`.
YMMV and these scripts may need further improvement.
## Running Gitea ## Running Gitea
After you complete the above steps, you can run Gitea two ways: After you complete the above steps, you can run Gitea two ways:

View File

@ -193,13 +193,3 @@ LDFLAGS="-linkmode external -extldflags '-static' $LDFLAGS" TAGS="netgo osusergo
``` ```
This can be combined with `CC`, `GOOS`, and `GOARCH` as above. This can be combined with `CC`, `GOOS`, and `GOARCH` as above.
### Adding bash/zsh autocompletion (from 1.19)
A script to enable bash-completion can be found at [`contrib/autocompletion/bash_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/bash_autocomplete). This should be altered as appropriate and can be `source` in your `.bashrc`
or copied as `/usr/share/bash-completion/completions/gitea`.
Similary a script for zsh-completion can be found at [`contrib/autocompletion/zsh_autocomplete`](https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/autocompletion/zsh_autocomplete). This can be copied to `/usr/share/zsh/_gitea` or sourced within your
`.zshrc`.
YMMV and these scripts may need further improvement.

View File

@ -113,8 +113,6 @@ arguments - which can alternatively be run by running the subcommand web.`
setFlagsAndBeforeOnSubcommands(&app.Commands[i], defaultFlags, establishCustomPath) setFlagsAndBeforeOnSubcommands(&app.Commands[i], defaultFlags, establishCustomPath)
} }
app.EnableBashCompletion = true
err := app.Run(os.Args) err := app.Run(os.Args)
if err != nil { if err != nil {
log.Fatal("Failed to run app with %s: %v", os.Args, err) log.Fatal("Failed to run app with %s: %v", os.Args, err)

View File

@ -131,7 +131,7 @@ func CommitChangesWithArgs(repoPath string, args TrustedCmdArgs, opts CommitChan
if opts.Author != nil { if opts.Author != nil {
cmd.AddOptionFormat("--author='%s <%s>'", opts.Author.Name, opts.Author.Email) cmd.AddOptionFormat("--author='%s <%s>'", opts.Author.Name, opts.Author.Email)
} }
cmd.AddOptionFormat("--message=%s", opts.Message) cmd.AddOptionValues("-m", opts.Message)
_, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath}) _, _, err := cmd.RunStdString(&RunOpts{Dir: repoPath})
// No stderr but exit status 1 means nothing to commit. // No stderr but exit status 1 means nothing to commit.

View File

@ -316,8 +316,9 @@ func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Reposi
return fmt.Errorf("git add --all: %w", err) return fmt.Errorf("git add --all: %w", err)
} }
cmd := git.NewCommand(ctx, "commit", "--message=Initial commit"). cmd := git.NewCommand(ctx, "commit").
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email) AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).
AddOptionValues("-m", "Initial commit")
sign, keyID, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u) sign, keyID, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u)
if sign { if sign {

241
package-lock.json generated
View File

@ -65,8 +65,9 @@
"jsdom": "21.0.0", "jsdom": "21.0.0",
"markdownlint-cli": "0.33.0", "markdownlint-cli": "0.33.0",
"postcss-less": "6.0.0", "postcss-less": "6.0.0",
"stylelint": "15.2.0", "stylelint": "14.16.1",
"stylelint-declaration-strict-value": "1.9.2", "stylelint-config-standard": "29.0.0",
"stylelint-declaration-strict-value": "1.9.1",
"svgo": "3.0.2", "svgo": "3.0.2",
"updates": "13.2.7", "updates": "13.2.7",
"vitest": "0.27.2" "vitest": "0.27.2"
@ -296,56 +297,10 @@
"jquery": ">= 1.7.x" "jquery": ">= 1.7.x"
} }
}, },
"node_modules/@csstools/css-parser-algorithms": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
"integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
"dev": true,
"engines": {
"node": "^14 || ^16 || >=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"@csstools/css-tokenizer": "^2.0.0"
}
},
"node_modules/@csstools/css-tokenizer": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.2.tgz",
"integrity": "sha512-prUTipz0NZH7Lc5wyBUy93NFy3QYDMVEQgSeZzNdpMbKRd6V2bgRFyJ+O0S0Dw0MXWuE/H9WXlJk3kzMZRHZ/g==",
"dev": true,
"engines": {
"node": "^14 || ^16 || >=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
}
},
"node_modules/@csstools/media-query-list-parser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
"integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
"dev": true,
"engines": {
"node": "^14 || ^16 || >=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"@csstools/css-parser-algorithms": "^2.0.0",
"@csstools/css-tokenizer": "^2.0.0"
}
},
"node_modules/@csstools/selector-specificity": { "node_modules/@csstools/selector-specificity": {
"version": "2.1.1", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.0.tgz",
"integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", "integrity": "sha512-zJ6hb3FDgBbO8d2e83vg6zq7tNvDqSq9RwdwfzJ8tdm9JHNvANq2fqwyRn6mlpUb7CwTs5ILdUrGwi9Gk4vY5w==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^14 || ^16 || >=18" "node": "^14 || ^16 || >=18"
@ -1573,6 +1528,12 @@
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true "dev": true
}, },
"node_modules/@types/parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true
},
"node_modules/@types/tern": { "node_modules/@types/tern": {
"version": "0.23.4", "version": "0.23.4",
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz",
@ -2681,18 +2642,19 @@
"dev": true "dev": true
}, },
"node_modules/cosmiconfig": { "node_modules/cosmiconfig": {
"version": "8.0.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
"integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"parse-json": "^5.0.0", "parse-json": "^5.0.0",
"path-type": "^4.0.0" "path-type": "^4.0.0",
"yaml": "^1.10.0"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=10"
} }
}, },
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
@ -8381,20 +8343,16 @@
"dev": true "dev": true
}, },
"node_modules/stylelint": { "node_modules/stylelint": {
"version": "15.2.0", "version": "14.16.1",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz",
"integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@csstools/css-parser-algorithms": "^2.0.1", "@csstools/selector-specificity": "^2.0.2",
"@csstools/css-tokenizer": "^2.0.1",
"@csstools/media-query-list-parser": "^2.0.1",
"@csstools/selector-specificity": "^2.1.1",
"balanced-match": "^2.0.0", "balanced-match": "^2.0.0",
"colord": "^2.9.3", "colord": "^2.9.3",
"cosmiconfig": "^8.0.0", "cosmiconfig": "^7.1.0",
"css-functions-list": "^3.1.0", "css-functions-list": "^3.1.0",
"css-tree": "^2.3.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"fast-glob": "^3.2.12", "fast-glob": "^3.2.12",
"fastest-levenshtein": "^1.0.16", "fastest-levenshtein": "^1.0.16",
@ -8403,7 +8361,7 @@
"globby": "^11.1.0", "globby": "^11.1.0",
"globjoin": "^0.1.4", "globjoin": "^0.1.4",
"html-tags": "^3.2.0", "html-tags": "^3.2.0",
"ignore": "^5.2.4", "ignore": "^5.2.1",
"import-lazy": "^4.0.0", "import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4", "imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0", "is-plain-object": "^5.0.0",
@ -8413,7 +8371,7 @@
"micromatch": "^4.0.5", "micromatch": "^4.0.5",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"postcss": "^8.4.21", "postcss": "^8.4.19",
"postcss-media-query-parser": "^0.2.3", "postcss-media-query-parser": "^0.2.3",
"postcss-resolve-nested-selector": "^0.1.1", "postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^6.0.0", "postcss-safe-parser": "^6.0.0",
@ -8427,30 +8385,51 @@
"svg-tags": "^1.0.0", "svg-tags": "^1.0.0",
"table": "^6.8.1", "table": "^6.8.1",
"v8-compile-cache": "^2.3.0", "v8-compile-cache": "^2.3.0",
"write-file-atomic": "^5.0.0" "write-file-atomic": "^4.0.2"
}, },
"bin": { "bin": {
"stylelint": "bin/stylelint.js" "stylelint": "bin/stylelint.js"
}, },
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}, },
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/stylelint" "url": "https://opencollective.com/stylelint"
} }
}, },
"node_modules/stylelint-config-recommended": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
"integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
"dev": true,
"peerDependencies": {
"stylelint": "^14.10.0"
}
},
"node_modules/stylelint-config-standard": {
"version": "29.0.0",
"resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
"integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
"dev": true,
"dependencies": {
"stylelint-config-recommended": "^9.0.0"
},
"peerDependencies": {
"stylelint": "^14.14.0"
}
},
"node_modules/stylelint-declaration-strict-value": { "node_modules/stylelint-declaration-strict-value": {
"version": "1.9.2", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.2.tgz", "resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.1.tgz",
"integrity": "sha512-Z/2yr7g4tq2iGOUWhZLzHL2g2GJYJGcPkfjDh++zI8ukLxW0tcLGJjo64XYCDjja6YcECPDUWbpN+OAoAtAYvw==", "integrity": "sha512-iIkMh2ukIfSTtJoEDgGq5cqUyYWP8NExPk2YSGcePtFikb7KmJoSi0QYajiZRxge/PTbYspci7nIcrtArJlAsw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"css-values": "^0.1.0", "css-values": "^0.1.0",
"shortcss": "^0.1.3" "shortcss": "^0.1.3"
}, },
"peerDependencies": { "peerDependencies": {
"stylelint": ">=7 <=15" "stylelint": ">=7 <=14"
} }
}, },
"node_modules/stylelint/node_modules/balanced-match": { "node_modules/stylelint/node_modules/balanced-match": {
@ -9799,16 +9778,16 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
}, },
"node_modules/write-file-atomic": { "node_modules/write-file-atomic": {
"version": "5.0.0", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
"integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"imurmurhash": "^0.1.4", "imurmurhash": "^0.1.4",
"signal-exit": "^3.0.7" "signal-exit": "^3.0.7"
}, },
"engines": { "engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0" "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
} }
}, },
"node_modules/ws": { "node_modules/ws": {
@ -9871,6 +9850,15 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true "dev": true
}, },
"node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/yargs": { "node_modules/yargs": {
"version": "17.3.1", "version": "17.3.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",
@ -10085,30 +10073,10 @@
"integrity": "sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==", "integrity": "sha512-8Ro6D4GCrmOl41+6w4NFhEOpx8vjxwVRI69bulXsFDt49uVRKhLU5TnzEV7AmOJrylkVq+ugnYNMiGHBieeKUQ==",
"requires": {} "requires": {}
}, },
"@csstools/css-parser-algorithms": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
"integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
"dev": true,
"requires": {}
},
"@csstools/css-tokenizer": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.0.2.tgz",
"integrity": "sha512-prUTipz0NZH7Lc5wyBUy93NFy3QYDMVEQgSeZzNdpMbKRd6V2bgRFyJ+O0S0Dw0MXWuE/H9WXlJk3kzMZRHZ/g==",
"dev": true
},
"@csstools/media-query-list-parser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
"integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
"dev": true,
"requires": {}
},
"@csstools/selector-specificity": { "@csstools/selector-specificity": {
"version": "2.1.1", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.0.tgz",
"integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", "integrity": "sha512-zJ6hb3FDgBbO8d2e83vg6zq7tNvDqSq9RwdwfzJ8tdm9JHNvANq2fqwyRn6mlpUb7CwTs5ILdUrGwi9Gk4vY5w==",
"dev": true, "dev": true,
"requires": {} "requires": {}
}, },
@ -10938,6 +10906,12 @@
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true "dev": true
}, },
"@types/parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
"dev": true
},
"@types/tern": { "@types/tern": {
"version": "0.23.4", "version": "0.23.4",
"resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz",
@ -11775,15 +11749,16 @@
"dev": true "dev": true
}, },
"cosmiconfig": { "cosmiconfig": {
"version": "8.0.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
"integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"parse-json": "^5.0.0", "parse-json": "^5.0.0",
"path-type": "^4.0.0" "path-type": "^4.0.0",
"yaml": "^1.10.0"
} }
}, },
"cross-spawn": { "cross-spawn": {
@ -16018,20 +15993,16 @@
"dev": true "dev": true
}, },
"stylelint": { "stylelint": {
"version": "15.2.0", "version": "14.16.1",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.2.0.tgz", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz",
"integrity": "sha512-wjg5OLn8zQwjlj5cYUgyQpMWKzct42AG5dYlqkHRJQJqsystFFn3onqEc263KH4xfEI0W3lZCnlIhFfS64uwSA==", "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
"dev": true, "dev": true,
"requires": { "requires": {
"@csstools/css-parser-algorithms": "^2.0.1", "@csstools/selector-specificity": "^2.0.2",
"@csstools/css-tokenizer": "^2.0.1",
"@csstools/media-query-list-parser": "^2.0.1",
"@csstools/selector-specificity": "^2.1.1",
"balanced-match": "^2.0.0", "balanced-match": "^2.0.0",
"colord": "^2.9.3", "colord": "^2.9.3",
"cosmiconfig": "^8.0.0", "cosmiconfig": "^7.1.0",
"css-functions-list": "^3.1.0", "css-functions-list": "^3.1.0",
"css-tree": "^2.3.1",
"debug": "^4.3.4", "debug": "^4.3.4",
"fast-glob": "^3.2.12", "fast-glob": "^3.2.12",
"fastest-levenshtein": "^1.0.16", "fastest-levenshtein": "^1.0.16",
@ -16040,7 +16011,7 @@
"globby": "^11.1.0", "globby": "^11.1.0",
"globjoin": "^0.1.4", "globjoin": "^0.1.4",
"html-tags": "^3.2.0", "html-tags": "^3.2.0",
"ignore": "^5.2.4", "ignore": "^5.2.1",
"import-lazy": "^4.0.0", "import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4", "imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0", "is-plain-object": "^5.0.0",
@ -16050,7 +16021,7 @@
"micromatch": "^4.0.5", "micromatch": "^4.0.5",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"postcss": "^8.4.21", "postcss": "^8.4.19",
"postcss-media-query-parser": "^0.2.3", "postcss-media-query-parser": "^0.2.3",
"postcss-resolve-nested-selector": "^0.1.1", "postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^6.0.0", "postcss-safe-parser": "^6.0.0",
@ -16064,7 +16035,7 @@
"svg-tags": "^1.0.0", "svg-tags": "^1.0.0",
"table": "^6.8.1", "table": "^6.8.1",
"v8-compile-cache": "^2.3.0", "v8-compile-cache": "^2.3.0",
"write-file-atomic": "^5.0.0" "write-file-atomic": "^4.0.2"
}, },
"dependencies": { "dependencies": {
"balanced-match": { "balanced-match": {
@ -16081,10 +16052,26 @@
} }
} }
}, },
"stylelint-config-recommended": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
"integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
"dev": true,
"requires": {}
},
"stylelint-config-standard": {
"version": "29.0.0",
"resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
"integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
"dev": true,
"requires": {
"stylelint-config-recommended": "^9.0.0"
}
},
"stylelint-declaration-strict-value": { "stylelint-declaration-strict-value": {
"version": "1.9.2", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.2.tgz", "resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.9.1.tgz",
"integrity": "sha512-Z/2yr7g4tq2iGOUWhZLzHL2g2GJYJGcPkfjDh++zI8ukLxW0tcLGJjo64XYCDjja6YcECPDUWbpN+OAoAtAYvw==", "integrity": "sha512-iIkMh2ukIfSTtJoEDgGq5cqUyYWP8NExPk2YSGcePtFikb7KmJoSi0QYajiZRxge/PTbYspci7nIcrtArJlAsw==",
"dev": true, "dev": true,
"requires": { "requires": {
"css-values": "^0.1.0", "css-values": "^0.1.0",
@ -17010,9 +16997,9 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
}, },
"write-file-atomic": { "write-file-atomic": {
"version": "5.0.0", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
"integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
"dev": true, "dev": true,
"requires": { "requires": {
"imurmurhash": "^0.1.4", "imurmurhash": "^0.1.4",
@ -17056,6 +17043,12 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true "dev": true
}, },
"yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
"dev": true
},
"yargs": { "yargs": {
"version": "17.3.1", "version": "17.3.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz",

View File

@ -65,8 +65,9 @@
"jsdom": "21.0.0", "jsdom": "21.0.0",
"markdownlint-cli": "0.33.0", "markdownlint-cli": "0.33.0",
"postcss-less": "6.0.0", "postcss-less": "6.0.0",
"stylelint": "15.2.0", "stylelint": "14.16.1",
"stylelint-declaration-strict-value": "1.9.2", "stylelint-config-standard": "29.0.0",
"stylelint-declaration-strict-value": "1.9.1",
"svgo": "3.0.2", "svgo": "3.0.2",
"updates": "13.2.7", "updates": "13.2.7",
"vitest": "0.27.2" "vitest": "0.27.2"

View File

@ -767,18 +767,11 @@ func MergePullRequest(ctx *context.APIContext) {
} }
} }
manuallyMerged := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged manuallMerge := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
force := form.ForceMerge != nil && *form.ForceMerge
mergeCheckType := pull_service.MergeCheckTypeGeneral
if form.MergeWhenChecksSucceed {
mergeCheckType = pull_service.MergeCheckTypeAuto
}
if manuallyMerged {
mergeCheckType = pull_service.MergeCheckTypeManually
}
// start with merging by checking // start with merging by checking
if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, mergeCheckType, form.ForceMerge); err != nil { if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, manuallMerge, force); err != nil {
if errors.Is(err, pull_service.ErrIsClosed) { if errors.Is(err, pull_service.ErrIsClosed) {
ctx.NotFound() ctx.NotFound()
} else if errors.Is(err, pull_service.ErrUserNotAllowedToMerge) { } else if errors.Is(err, pull_service.ErrUserNotAllowedToMerge) {
@ -800,7 +793,7 @@ func MergePullRequest(ctx *context.APIContext) {
} }
// handle manually-merged mark // handle manually-merged mark
if manuallyMerged { if manuallMerge {
if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil { if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil {
if models.IsErrInvalidMergeStyle(err) { if models.IsErrInvalidMergeStyle(err) {
ctx.Error(http.StatusMethodNotAllowed, "Invalid merge style", fmt.Errorf("%s is not allowed an allowed merge style for this repository", repo_model.MergeStyle(form.Do))) ctx.Error(http.StatusMethodNotAllowed, "Invalid merge style", fmt.Errorf("%s is not allowed an allowed merge style for this repository", repo_model.MergeStyle(form.Do)))

View File

@ -926,19 +926,11 @@ func MergePullRequest(ctx *context.Context) {
pr := issue.PullRequest pr := issue.PullRequest
pr.Issue = issue pr.Issue = issue
pr.Issue.Repo = ctx.Repo.Repository pr.Issue.Repo = ctx.Repo.Repository
manualMerge := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged
manuallyMerged := repo_model.MergeStyle(form.Do) == repo_model.MergeStyleManuallyMerged forceMerge := form.ForceMerge != nil && *form.ForceMerge
mergeCheckType := pull_service.MergeCheckTypeGeneral
if form.MergeWhenChecksSucceed {
mergeCheckType = pull_service.MergeCheckTypeAuto
}
if manuallyMerged {
mergeCheckType = pull_service.MergeCheckTypeManually
}
// start with merging by checking // start with merging by checking
if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, mergeCheckType, form.ForceMerge); err != nil { if err := pull_service.CheckPullMergable(ctx, ctx.Doer, &ctx.Repo.Permission, pr, manualMerge, forceMerge); err != nil {
switch { switch {
case errors.Is(err, pull_service.ErrIsClosed): case errors.Is(err, pull_service.ErrIsClosed):
if issue.IsPull { if issue.IsPull {
@ -970,7 +962,7 @@ func MergePullRequest(ctx *context.Context) {
} }
// handle manually-merged mark // handle manually-merged mark
if manuallyMerged { if manualMerge {
if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil { if err := pull_service.MergedManually(pr, ctx.Doer, ctx.Repo.GitRepo, form.MergeCommitID); err != nil {
switch { switch {

View File

@ -230,7 +230,7 @@ func handlePull(pullID int64, sha string) {
return return
} }
if err := pull_service.CheckPullMergable(ctx, doer, &perm, pr, pull_service.MergeCheckTypeGeneral, false); err != nil { if err := pull_service.CheckPullMergable(ctx, doer, &perm, pr, false, false); err != nil {
if errors.Is(pull_service.ErrUserNotAllowedToMerge, err) { if errors.Is(pull_service.ErrUserNotAllowedToMerge, err) {
log.Info("%-v was scheduled to automerge by an unauthorized user", pr) log.Info("%-v was scheduled to automerge by an unauthorized user", pr)
return return

View File

@ -604,7 +604,7 @@ type MergePullRequestForm struct {
MergeMessageField string MergeMessageField string
MergeCommitID string // only used for manually-merged MergeCommitID string // only used for manually-merged
HeadCommitID string `json:"head_commit_id,omitempty"` HeadCommitID string `json:"head_commit_id,omitempty"`
ForceMerge bool `json:"force_merge,omitempty"` ForceMerge *bool `json:"force_merge,omitempty"`
MergeWhenChecksSucceed bool `json:"merge_when_checks_succeed,omitempty"` MergeWhenChecksSucceed bool `json:"merge_when_checks_succeed,omitempty"`
DeleteBranchAfterMerge bool `json:"delete_branch_after_merge,omitempty"` DeleteBranchAfterMerge bool `json:"delete_branch_after_merge,omitempty"`
} }

View File

@ -59,16 +59,8 @@ func AddToTaskQueue(pr *issues_model.PullRequest) {
} }
} }
type MergeCheckType int
const (
MergeCheckTypeGeneral MergeCheckType = iota // general merge checks for "merge", "rebase", "squash", etc
MergeCheckTypeManually // Manually Merged button (mark a PR as merged manually)
MergeCheckTypeAuto // Auto Merge (Scheduled Merge) After Checks Succeed
)
// CheckPullMergable check if the pull mergable based on all conditions (branch protection, merge options, ...) // CheckPullMergable check if the pull mergable based on all conditions (branch protection, merge options, ...)
func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *access_model.Permission, pr *issues_model.PullRequest, mergeCheckType MergeCheckType, adminSkipProtectionCheck bool) error { func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *access_model.Permission, pr *issues_model.PullRequest, manuallMerge, force bool) error {
return db.WithTx(stdCtx, func(ctx context.Context) error { return db.WithTx(stdCtx, func(ctx context.Context) error {
if pr.HasMerged { if pr.HasMerged {
return ErrHasMerged return ErrHasMerged
@ -88,8 +80,8 @@ func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *acce
return ErrUserNotAllowedToMerge return ErrUserNotAllowedToMerge
} }
if mergeCheckType == MergeCheckTypeManually { if manuallMerge {
// if doer is doing "manually merge" (mark as merged manually), do not check anything // don't check rules to "auto merge", doer is going to mark this pull as merged manually
return nil return nil
} }
@ -111,25 +103,14 @@ func CheckPullMergable(stdCtx context.Context, doer *user_model.User, perm *acce
return err return err
} }
// Now the branch protection check failed, check whether the failure could be skipped (skip by setting err = nil) if !force {
return err
// * when doing Auto Merge (Scheduled Merge After Checks Succeed), skip the branch protection check
if mergeCheckType == MergeCheckTypeAuto {
err = nil
} }
// * if the doer is admin, they could skip the branch protection check if isRepoAdmin, err2 := access_model.IsUserRepoAdmin(ctx, pr.BaseRepo, doer); err2 != nil {
if adminSkipProtectionCheck { log.Error("Unable to check if %-v is a repo admin in %-v: %v", doer, pr.BaseRepo, err2)
if isRepoAdmin, errCheckAdmin := access_model.IsUserRepoAdmin(ctx, pr.BaseRepo, doer); errCheckAdmin != nil { return err2
log.Error("Unable to check if %-v is a repo admin in %-v: %v", doer, pr.BaseRepo, errCheckAdmin) } else if !isRepoAdmin {
return errCheckAdmin
} else if isRepoAdmin {
err = nil // repo admin can skip the check, so clear the error
}
}
// If there is still a branch protection check error, return it
if err != nil {
return err return err
} }
} }

View File

@ -533,7 +533,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode
if err := git.NewCommand(ctx, "commit"). if err := git.NewCommand(ctx, "commit").
AddArguments(signArgs...). AddArguments(signArgs...).
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email). AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email).
AddOptionFormat("--message=%s", message). AddOptionValues("-m", message).
Run(&git.RunOpts{ Run(&git.RunOpts{
Env: env, Env: env,
Dir: tmpBasePath, Dir: tmpBasePath,
@ -641,7 +641,7 @@ func rawMerge(ctx context.Context, pr *issues_model.PullRequest, doer *user_mode
func commitAndSignNoAuthor(ctx context.Context, pr *issues_model.PullRequest, message string, signArgs git.TrustedCmdArgs, tmpBasePath string, env []string) error { func commitAndSignNoAuthor(ctx context.Context, pr *issues_model.PullRequest, message string, signArgs git.TrustedCmdArgs, tmpBasePath string, env []string) error {
var outbuf, errbuf strings.Builder var outbuf, errbuf strings.Builder
if err := git.NewCommand(ctx, "commit").AddArguments(signArgs...).AddOptionFormat("--message=%s", message). if err := git.NewCommand(ctx, "commit").AddArguments(signArgs...).AddOptionValues("-m", message).
Run(&git.RunOpts{ Run(&git.RunOpts{
Env: env, Env: env,
Dir: tmpBasePath, Dir: tmpBasePath,

View File

@ -85,11 +85,6 @@ func GetTreeBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git
if entries[e].IsDir() { if entries[e].IsDir() {
copy(treeURL[copyPos:], entries[e].ID.String()) copy(treeURL[copyPos:], entries[e].ID.String())
tree.Entries[i].URL = string(treeURL) tree.Entries[i].URL = string(treeURL)
} else if entries[e].IsSubModule() {
// In Github Rest API Version=2022-11-28, if a tree entry is a submodule,
// its url will be returned as an empty string.
// So the URL will be set to "" here.
tree.Entries[i].URL = ""
} else { } else {
copy(blobURL[copyPos:], entries[e].ID.String()) copy(blobURL[copyPos:], entries[e].ID.String())
tree.Entries[i].URL = string(blobURL) tree.Entries[i].URL = string(blobURL)

View File

@ -5,7 +5,7 @@
{{template "base/alert" .}} {{template "base/alert" .}}
{{template "repo/sub_menu" .}} {{template "repo/sub_menu" .}}
{{if .DefaultBranchBranch}} {{if .DefaultBranchBranch}}
<h4 class="ui top attached header gt-mt-4"> <h4 class="ui top attached header">
{{.locale.Tr "repo.default_branch"}} {{.locale.Tr "repo.default_branch"}}
</h4> </h4>

View File

@ -24,10 +24,10 @@
{{svg "octicon-diff" 16 "gt-mr-2"}}{{.locale.Tr "repo.diff.stats_desc" .Diff.NumFiles .Diff.TotalAddition .Diff.TotalDeletion | Str2html}} {{svg "octicon-diff" 16 "gt-mr-2"}}{{.locale.Tr "repo.diff.stats_desc" .Diff.NumFiles .Diff.TotalAddition .Diff.TotalDeletion | Str2html}}
</div> </div>
</div> </div>
<div class="diff-detail-actions gt-df gt-ac gt-w-100"> <div class="diff-detail-actions gt-df gt-ac">
{{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}} {{if and .PageIsPullFiles $.SignedUserID (not .IsArchived)}}
<progress id="viewed-files-summary" class="gt-mr-2" value="{{.Diff.NumViewedFiles}}" max="{{.Diff.NumFiles}}"></progress> <progress id="viewed-files-summary" class="gt-mr-2" value="{{.Diff.NumViewedFiles}}" max="{{.Diff.NumFiles}}"></progress>
<label for="viewed-files-summary" id="viewed-files-summary-label" class="gt-mr-3 gt-f1" data-text-changed-template="{{.locale.Tr "repo.pulls.viewed_files_label"}}"> <label for="viewed-files-summary" id="viewed-files-summary-label" class="gt-mr-3" data-text-changed-template="{{.locale.Tr "repo.pulls.viewed_files_label"}}">
{{.locale.Tr "repo.pulls.viewed_files_label" .Diff.NumViewedFiles .Diff.NumFiles}} {{.locale.Tr "repo.pulls.viewed_files_label" .Diff.NumViewedFiles .Diff.NumFiles}}
</label> </label>
{{end}} {{end}}

View File

@ -1,11 +1,11 @@
<div id="review-box"> <div class="ui top right pointing dropdown custom" id="review-box">
<button class="ui tiny green button gt-ml-2 gt-mr-0 js-btn-review"> <div class="ui tiny green button btn-review gt-ml-2 gt-mr-0">
{{.locale.Tr "repo.diff.review"}} {{.locale.Tr "repo.diff.review"}}
<span class="ui small label review-comments-counter" data-pending-comment-number="{{.PendingCodeCommentNumber}}">{{.PendingCodeCommentNumber}}</span> <span class="ui small label review-comments-counter" data-pending-comment-number="{{.PendingCodeCommentNumber}}">{{.PendingCodeCommentNumber}}</span>
{{svg "octicon-triangle-down" 14 "dropdown icon"}} {{svg "octicon-triangle-down" 14 "dropdown icon"}}
</button> </div>
<div class="review-box-panel gt-hidden"> <div class="menu review-box">
<div class="ui segment"> <div class="ui clearing segment">
<form class="ui form" action="{{.Link}}/reviews/submit" method="post"> <form class="ui form" action="{{.Link}}/reviews/submit" method="post">
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}
<input type="hidden" name="commit_id" value="{{.AfterCommitID}}"/> <input type="hidden" name="commit_id" value="{{.AfterCommitID}}"/>

View File

@ -77,7 +77,7 @@
<a href="{{.Repository.Link}}/find/{{.BranchNameSubURL}}" class="ui compact basic button">{{.locale.Tr "repo.find_file.go_to_file"}}</a> <a href="{{.Repository.Link}}/find/{{.BranchNameSubURL}}" class="ui compact basic button">{{.locale.Tr "repo.find_file.go_to_file"}}</a>
{{end}} {{end}}
{{if or .CanAddFile .CanUploadFile}} {{if or .CanAddFile .CanUploadFile}}
<button class="ui basic compact dropdown jump icon button gt-mr-2"{{if not .Repository.CanEnableEditor}} disabled{{end}}> <button class="ui basic small compact dropdown jump icon button gt-mr-2"{{if not .Repository.CanEnableEditor}} disabled{{end}}>
<span class="text">{{.locale.Tr "repo.editor.add_file"}}</span> <span class="text">{{.locale.Tr "repo.editor.add_file"}}</span>
<div class="menu"> <div class="menu">
{{if .CanAddFile}} {{if .CanAddFile}}

View File

@ -399,7 +399,7 @@
{{end}} {{end}}
</span> </span>
</div> </div>
{{if or .Content .Attachments}} {{if .Content}}
<div class="timeline-item comment" id="{{.HashTag}}"> <div class="timeline-item comment" id="{{.HashTag}}">
<div class="content comment-container"> <div class="content comment-container">
<div class="ui top attached header comment-header gt-df gt-ac gt-sb"> <div class="ui top attached header comment-header gt-df gt-ac gt-sb">
@ -437,7 +437,7 @@
{{end}} {{end}}
{{if not $.Repository.IsArchived}} {{if not $.Repository.IsArchived}}
{{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}} {{template "repo/issue/view_content/add_reaction" Dict "ctx" $ "ActionURL" (Printf "%s/comments/%d/reactions" $.RepoLink .ID)}}
{{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" false "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}} {{template "repo/issue/view_content/context_menu" Dict "ctx" $ "item" . "delete" true "issue" true "diff" false "IsCommentPoster" (and $.IsSigned (eq $.SignedUserID .PosterID))}}
{{end}} {{end}}
</div> </div>
</div> </div>

View File

@ -129,7 +129,6 @@
<div class="content"> <div class="content">
{{template "repo/pulls/status" .}} {{template "repo/pulls/status" .}}
{{$canAutoMerge := false}} {{$canAutoMerge := false}}
{{$showGeneralMergeForm := false}}
<div class="ui attached merge-section segment {{if not $.LatestCommitStatus}}no-header{{end}}"> <div class="ui attached merge-section segment {{if not $.LatestCommitStatus}}no-header{{end}}">
{{if .Issue.PullRequest.HasMerged}} {{if .Issue.PullRequest.HasMerged}}
<div class="item text"> <div class="item text">
@ -321,7 +320,6 @@
'textAutoMergeCancelSchedule': {{$.locale.Tr "repo.pulls.auto_merge_cancel_schedule"}}, 'textAutoMergeCancelSchedule': {{$.locale.Tr "repo.pulls.auto_merge_cancel_schedule"}},
'textClearMergeMessage': {{$.locale.Tr "repo.pulls.clear_merge_message"}}, 'textClearMergeMessage': {{$.locale.Tr "repo.pulls.clear_merge_message"}},
'textClearMergeMessageHint': {{$.locale.Tr "repo.pulls.clear_merge_message_hint"}}, 'textClearMergeMessageHint': {{$.locale.Tr "repo.pulls.clear_merge_message_hint"}},
'textMergeCommitId': {{$.locale.Tr "repo.pulls.merge_commit_id"}},
'canMergeNow': {{$canMergeNow}}, 'canMergeNow': {{$canMergeNow}},
'allOverridableChecksOk': {{not $notAllOverridableChecksOk}}, 'allOverridableChecksOk': {{not $notAllOverridableChecksOk}},
@ -381,7 +379,6 @@
window.config.pageData.pullRequestMergeForm = mergeForm; window.config.pageData.pullRequestMergeForm = mergeForm;
</script> </script>
{{$showGeneralMergeForm = true}}
<div id="pull-request-merge-form"></div> <div id="pull-request-merge-form"></div>
{{else}} {{else}}
{{/* no merge style was set in repo setting: not or ($prUnit.PullRequestsConfig.AllowMerge ...) */}} {{/* no merge style was set in repo setting: not or ($prUnit.PullRequestsConfig.AllowMerge ...) */}}
@ -455,11 +452,11 @@
{{$.locale.Tr "repo.pulls.cannot_auto_merge_helper"}} {{$.locale.Tr "repo.pulls.cannot_auto_merge_helper"}}
</div> </div>
{{end}} {{end}}
{{end}}{{/* end if: pull request status */}} {{end}}
{{if and $.StillCanManualMerge (not $showGeneralMergeForm)}} {{if $.StillCanManualMerge}}
<div class="ui divider"></div> <div class="ui divider"></div>
<div class="ui form"> <div class="ui form manually-merged-fields gt-hidden">
<form action="{{.Link}}/merge" method="post"> <form action="{{.Link}}/merge" method="post">
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}
<div class="field"> <div class="field">
@ -468,8 +465,17 @@
<button class="ui red button" type="submit" name="do" value="manually-merged"> <button class="ui red button" type="submit" name="do" value="manually-merged">
{{$.locale.Tr "repo.pulls.merge_manually"}} {{$.locale.Tr "repo.pulls.merge_manually"}}
</button> </button>
<button class="ui button merge-cancel">
{{$.locale.Tr "cancel"}}
</button>
</form> </form>
</div> </div>
<div class="ui red buttons merge-button">
<button class="ui button" data-do="manually-merged">
{{$.locale.Tr "repo.pulls.merge_manually"}}
</button>
</div>
{{end}} {{end}}
{{if and .ShowMergeInstructions .Issue.PullRequest.HeadRepo}} {{if and .ShowMergeInstructions .Issue.PullRequest.HeadRepo}}

View File

@ -18,7 +18,6 @@
<input type="hidden" name="_csrf" :value="csrfToken"> <input type="hidden" name="_csrf" :value="csrfToken">
<input type="hidden" name="head_commit_id" v-model="mergeForm.pullHeadCommitID"> <input type="hidden" name="head_commit_id" v-model="mergeForm.pullHeadCommitID">
<input type="hidden" name="merge_when_checks_succeed" v-model="autoMergeWhenSucceed"> <input type="hidden" name="merge_when_checks_succeed" v-model="autoMergeWhenSucceed">
<input type="hidden" name="force_merge" v-model="forceMerge">
<template v-if="!mergeStyleDetail.hideMergeMessageTexts"> <template v-if="!mergeStyleDetail.hideMergeMessageTexts">
<div class="field"> <div class="field">
@ -37,10 +36,6 @@
</div> </div>
</template> </template>
<div class="field" v-if="mergeStyle === 'manually-merged'">
<input type="text" name="merge_commit_id" :placeholder="mergeForm.textMergeCommitId">
</div>
<button class="ui button" :class="mergeButtonStyleClass" type="submit" name="do" :value="mergeStyle"> <button class="ui button" :class="mergeButtonStyleClass" type="submit" name="do" :value="mergeStyle">
{{ mergeStyleDetail.textDoMerge }} {{ mergeStyleDetail.textDoMerge }}
<template v-if="autoMergeWhenSucceed"> <template v-if="autoMergeWhenSucceed">
@ -132,7 +127,6 @@ export default {
textDoMerge: '', textDoMerge: '',
mergeTitleFieldText: '', mergeTitleFieldText: '',
mergeMessageFieldText: '', mergeMessageFieldText: '',
hideAutoMerge: false,
}, },
mergeStyleAllowedCount: 0, mergeStyleAllowedCount: 0,
@ -143,10 +137,7 @@ export default {
mergeButtonStyleClass() { mergeButtonStyleClass() {
if (this.mergeForm.allOverridableChecksOk) return 'green'; if (this.mergeForm.allOverridableChecksOk) return 'green';
return this.autoMergeWhenSucceed ? 'blue' : 'red'; return this.autoMergeWhenSucceed ? 'blue' : 'red';
}, }
forceMerge() {
return this.mergeForm.canMergeNow && !this.mergeForm.allOverridableChecksOk;
},
}, },
watch: { watch: {
mergeStyle(val) { mergeStyle(val) {

View File

@ -1,32 +1,5 @@
**This document is used as aria/a11y reference for future developers** **This document is used as aria/a11y reference for future developers**
# Checkbox
## Accessibility-friendly Checkbox
The ideal checkboxes should be:
```html
<label><input type="checkbox"> ... </label>
```
However, related styles aren't supported (not implemented) yet, so at the moment, almost all the checkboxes are still using Fomantic UI checkbox.
## Fomantic UI Checkbox
```html
<div class="ui checkbox">
<input type="checkbox"> <!-- class "hidden" will be added by $.checkbox() -->
<label>...</label>
</div>
```
Then the JS `$.checkbox()` should be called to make it work with keyboard and label-clicking, then it works like the ideal checkboxes.
There is still a problem: Fomantic UI checkbox is not friendly to screen readers, so we add IDs to all the Fomantic UI checkboxes automatically by JS.
# Dropdown
## ARIA Dropdown ## ARIA Dropdown
There are different solutions: There are different solutions:
@ -54,7 +27,7 @@ At the moment, `menu + menuitem` seems to work better with Fomantic UI Dropdown,
<div class="ui dropdown"> <!-- focused here, then it's not perfect to use aria-activedescendant to point to the menu item --> <div class="ui dropdown"> <!-- focused here, then it's not perfect to use aria-activedescendant to point to the menu item -->
<input type="hidden" ...> <input type="hidden" ...>
<div class="text">Default</div> <div class="text">Default</div>
<div class="menu" tabindex="-1"> <!-- "transition hidden|visible" classes will be added by $.dropdown() and when the dropdown is working --> <div class="menu transition hidden" tabindex="-1">
<div class="item active selected">Default</div> <div class="item active selected">Default</div>
<div class="item">...</div> <div class="item">...</div>
</div> </div>
@ -65,7 +38,7 @@ At the moment, `menu + menuitem` seems to work better with Fomantic UI Dropdown,
<input type="hidden" ...> <input type="hidden" ...>
<input class="search" autocomplete="off" tabindex="0"> <!-- focused here --> <input class="search" autocomplete="off" tabindex="0"> <!-- focused here -->
<div class="text"></div> <div class="text"></div>
<div class="menu" tabindex="-1"> <!-- "transition hidden|visible" classes will be added by $.dropdown() and when the dropdown is working --> <div class="menu transition visible" tabindex="-1">
<div class="item selected">...</div> <div class="item selected">...</div>
<div class="item">...</div> <div class="item">...</div>
</div> </div>

View File

@ -60,7 +60,6 @@ export function initGlobalEnterQuickSubmit() {
export function initGlobalButtonClickOnEnter() { export function initGlobalButtonClickOnEnter() {
$(document).on('keypress', '.ui.button', (e) => { $(document).on('keypress', '.ui.button', (e) => {
if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar
if (e.target.nodeName === 'BUTTON') return; // button already handles space&enter correctly
$(e.target).trigger('click'); $(e.target).trigger('click');
e.preventDefault(); e.preventDefault();
} }

View File

@ -470,7 +470,7 @@ export function initRepoPullRequestReview() {
assignMenuAttributes(form.find('.menu')); assignMenuAttributes(form.find('.menu'));
}); });
const $reviewBox = $('.review-box-panel'); const $reviewBox = $('.review-box');
if ($reviewBox.length === 1) { if ($reviewBox.length === 1) {
(async () => { (async () => {
// the editor's height is too large in some cases, and the panel cannot be scrolled with page now because there is `.repository .diff-detail-box.sticky { position: sticky; }` // the editor's height is too large in some cases, and the panel cannot be scrolled with page now because there is `.repository .diff-detail-box.sticky { position: sticky; }`
@ -487,12 +487,12 @@ export function initRepoPullRequestReview() {
return; return;
} }
$('.js-btn-review').on('click', function (e) { $('.btn-review').on('click', function (e) {
e.preventDefault(); e.preventDefault();
toggleElem($(this).parent().find('.review-box-panel')); $(this).closest('.dropdown').find('.menu').toggle('visible'); // eslint-disable-line
}).parent().find('.review-box-panel .close').on('click', function (e) { }).closest('.dropdown').find('.close').on('click', function (e) {
e.preventDefault(); e.preventDefault();
hideElem($(this).closest('.review-box-panel')); $(this).closest('.menu').toggle('visible'); // eslint-disable-line
}); });
$(document).on('click', 'a.add-code-comment', async function (e) { $(document).on('click', 'a.add-code-comment', async function (e) {

View File

@ -19,7 +19,7 @@ function assertShown(el, expectShown) {
} }
function elementsCall(el, func, ...args) { function elementsCall(el, func, ...args) {
if (typeof el === 'string' || el instanceof String) { if (el instanceof String) {
el = document.querySelectorAll(el); el = document.querySelectorAll(el);
} }
if (el instanceof Node) { if (el instanceof Node) {
@ -34,10 +34,6 @@ function elementsCall(el, func, ...args) {
} }
} }
/**
* @param el string (selector), Node, NodeList, HTMLCollection, Array or jQuery
* @param force force=true to show or force=false to hide, undefined to toggle
*/
function toggleShown(el, force) { function toggleShown(el, force) {
if (force === true) { if (force === true) {
el.classList.remove('gt-hidden'); el.classList.remove('gt-hidden');

View File

@ -226,7 +226,7 @@ body {
@supports (overflow: overlay) { @supports (overflow: overlay) {
body { body {
overflow: overlay; // stylelint-disable-line overflow: overlay;
scrollbar-gutter: stable; scrollbar-gutter: stable;
} }
} }
@ -2476,13 +2476,24 @@ table th[data-sortt-desc] {
} }
} }
.ui.dropdown .svg.dropdown.icon, /* fix up SVG dropdown triangles because fomantic thinks they are icon fonts */
.svg.dropdown.icon { /* see https://github.com/go-gitea/gitea/issues/14014 */
margin-top: 0 !important; // reset the "ui.selection.dropdown > .dropdown.icon {margin-top}", for the Issue Dependencies dropdown .ui.dropdown > .dropdown.icon,
margin-right: -.5rem !important; // fix up SVG dropdown triangles because Fomantic thinks they are icon fonts .btn-review > .dropdown.icon {
height: auto; // reset the ".ui.dropdown > .dropdown.icon {height}", otherwise the icon would be too small height: auto !important;
margin-left: .5rem !important;
margin-top: -1px !important;
margin-bottom: -1px !important;
margin-right: -.5rem !important;
} }
.ui.button.dropdown > .dropdown.icon,
.btn-review > .dropdown.icon {
float: right !important;
@media (max-width: 480px) {
display: none;
}
}
.ui.selection.dropdown > .search.icon, .ui.selection.dropdown > .search.icon,
.ui.selection.dropdown > .delete.icon, .ui.selection.dropdown > .delete.icon,
.ui.selection.dropdown > .dropdown.icon { .ui.selection.dropdown > .dropdown.icon {

View File

@ -13,7 +13,7 @@
} }
.editor-toolbar { .editor-toolbar {
max-width: calc(100vw - 80px); opacity: 1 !important;
border-color: var(--color-secondary); border-color: var(--color-secondary);
} }

View File

@ -89,7 +89,7 @@ each(@fonts, {
font-family: @family; font-family: @family;
src: @src; src: @src;
font-weight: @weight; font-weight: @weight;
unicode-range: U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????; unicode-range: ~"U+11??, U+2E80-4DBF, U+4E00-9FFF, U+A960-A97F, U+AC00-D7FF, U+F900-FAFF, U+FE00-FE6F, U+FF00-FFEF, U+1F2??, U+2????";
} }
} }

View File

@ -93,10 +93,6 @@
&.teams, &.teams,
&.profile { &.profile {
.members { .members {
a:hover {
text-decoration: none;
}
.ui.avatar { .ui.avatar {
width: 48px; width: 48px;
height: 48px; height: 48px;

View File

@ -2864,6 +2864,11 @@
margin-top: 10px; margin-top: 10px;
} }
.repo-button-row .dropdown > .dropdown.icon {
margin-left: .25rem !important;
margin-right: 0 !important;
}
.wiki .repo-button-row { .wiki .repo-button-row {
margin-bottom: 0; margin-bottom: 0;
} }

View File

@ -70,7 +70,7 @@
max-width: 1000px; max-width: 1000px;
@media @mediaSm { @media @mediaSm {
max-width: none; max-width: auto;
padding: .75rem !important; padding: .75rem !important;
.code-comment-buttons { .code-comment-buttons {
@ -220,45 +220,47 @@ a.blob-excerpt:hover {
// See the comment of createCommentEasyMDE() for the review editor // See the comment of createCommentEasyMDE() for the review editor
// EasyMDE's options can not handle minHeight & maxHeight together correctly, we have to set minHeight in JS code // EasyMDE's options can not handle minHeight & maxHeight together correctly, we have to set minHeight in JS code
.review-box-panel .CodeMirror-scroll { #review-box .CodeMirror-scroll {
min-height: 80px; min-height: 80px;
max-height: calc(100vh - 360px); max-height: calc(100vh - 360px);
} }
@media @mediaSm { @media @mediaSm {
.review-box-panel .CodeMirror-scroll { #review-box > .menu {
> .ui.segment {
width: 94vw;
}
.editor-toolbar {
overflow-x: auto;
}
}
#review-box .CodeMirror-scroll {
max-width: calc(100vw - 70px); max-width: calc(100vw - 70px);
} }
} }
@media @mediaMd { @media @mediaMd {
.review-box-panel .CodeMirror-scroll { #review-box .CodeMirror-scroll {
max-width: 700px; max-width: 700px;
} }
} }
@media @mediaLg { @media @mediaLg {
.review-box-panel .CodeMirror-scroll { #review-box .CodeMirror-scroll {
max-width: 800px; max-width: 800px;
} }
} }
@media @mediaXl { @media @mediaXl {
.review-box-panel .CodeMirror-scroll { #review-box .CodeMirror-scroll {
max-width: 900px; max-width: 900px;
} }
} }
#review-box { .review-box > .segment {
position: relative; border: none !important;
}
.review-box-panel {
position: absolute;
min-width: max-content;
top: 45px;
right: -5px;
z-index: 2;
} }
#review-box .review-comments-counter { #review-box .review-comments-counter {

View File

@ -281,6 +281,8 @@
table { table {
display: block; display: block;
width: 100%; width: 100%;
width: -webkit-max-content;
width: -moz-max-content;
width: max-content; width: max-content;
max-width: 100%; max-width: 100%;
overflow: auto; overflow: auto;

View File

@ -25,7 +25,7 @@
} }
.tippy-box[data-theme="menu"] { .tippy-box[data-theme="menu"] {
background-color: transparent; background-color: none;
color: var(--color-tooltip-text); color: var(--color-tooltip-text);
} }