diff --git a/.stylelintrc.yaml b/.stylelintrc.yaml
index c488d0677f18a..62660fcf94409 100644
--- a/.stylelintrc.yaml
+++ b/.stylelintrc.yaml
@@ -5,8 +5,6 @@ ignoreFiles:
- "**/*.go"
overrides:
- - files: ["**/*.less"]
- customSyntax: postcss-less
- files: ["**/chroma/*", "**/codemirror/*", "**/standalone/*", "**/console/*"]
rules:
scale-unlimited/declaration-strict-value: null
diff --git a/Makefile b/Makefile
index 8bfc7ddcaff8b..a43f53e795e60 100644
--- a/Makefile
+++ b/Makefile
@@ -105,7 +105,7 @@ GO_TEST_PACKAGES ?= $(filter-out $(shell $(GO) list code.gitea.io/gitea/models/m
FOMANTIC_WORK_DIR := web_src/fomantic
-WEBPACK_SOURCES := $(shell find web_src/js web_src/less -type f)
+WEBPACK_SOURCES := $(shell find web_src/js web_src/css -type f)
WEBPACK_CONFIGS := webpack.config.js
WEBPACK_DEST := public/js/index.js public/css/index.css
WEBPACK_DEST_ENTRIES := public/js public/css public/fonts public/img/webpack public/serviceworker.js
@@ -131,7 +131,7 @@ TEST_TAGS ?= sqlite sqlite_unlock_notify
TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(FOMANTIC_WORK_DIR)/node_modules $(DIST) $(MAKE_EVIDENCE_DIR) $(AIR_TMP_DIR) $(GO_LICENSE_TMP_DIR)
GO_DIRS := cmd tests models modules routers build services tools
-WEB_DIRS := web_src/js web_src/less
+WEB_DIRS := web_src/js web_src/css
GO_SOURCES := $(wildcard *.go)
GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" -not -path modules/options/bindata.go -not -path modules/public/bindata.go -not -path modules/templates/bindata.go)
@@ -341,7 +341,7 @@ lint: lint-frontend lint-backend
.PHONY: lint-frontend
lint-frontend: node_modules
npx eslint --color --max-warnings=0 --ext js,vue web_src/js build *.config.js docs/assets/js tests/e2e
- npx stylelint --color --max-warnings=0 web_src/less
+ npx stylelint --color --max-warnings=0 web_src/css
npx spectral lint -q -F hint $(SWAGGER_SPEC)
npx markdownlint docs *.md
diff --git a/docs/content/doc/advanced/customizing-gitea.en-us.md b/docs/content/doc/advanced/customizing-gitea.en-us.md
index bad6342aad44d..4c0235c04aca5 100644
--- a/docs/content/doc/advanced/customizing-gitea.en-us.md
+++ b/docs/content/doc/advanced/customizing-gitea.en-us.md
@@ -354,7 +354,7 @@ To make a custom theme available to all users:
Community themes are listed in [gitea/awesome-gitea#themes](https://gitea.com/gitea/awesome-gitea#themes).
-The `arc-green` theme source can be found [here](https://github.com/go-gitea/gitea/blob/main/web_src/less/themes/theme-arc-green.less).
+The `arc-green` theme source can be found [here](https://github.com/go-gitea/gitea/blob/main/web_src/css/themes/theme-arc-green.css).
If your custom theme is considered a dark theme, set the global css variable `--is-dark-theme` to `true`.
This allows Gitea to adjust the Monaco code editor's theme accordingly.
diff --git a/docs/content/doc/developers/guidelines-frontend.en-us.md b/docs/content/doc/developers/guidelines-frontend.en-us.md
index 7f4d87d9011ed..e801ee4c4bf32 100644
--- a/docs/content/doc/developers/guidelines-frontend.en-us.md
+++ b/docs/content/doc/developers/guidelines-frontend.en-us.md
@@ -21,13 +21,13 @@ menu:
## Background
-Gitea uses [Less CSS](https://lesscss.org), [Fomantic-UI](https://fomantic-ui.com/introduction/getting-started.html) (based on [jQuery](https://api.jquery.com)) and [Vue3](https://vuejs.org/) for its frontend.
+Gitea uses [Fomantic-UI](https://fomantic-ui.com/introduction/getting-started.html) (based on [jQuery](https://api.jquery.com)) and [Vue3](https://vuejs.org/) for its frontend.
The HTML pages are rendered by [Go HTML Template](https://pkg.go.dev/html/template).
The source files can be found in the following directories:
-* **Less styles:** `web_src/less/`
+* **CSS styles:** `web_src/css/`
* **JavaScript files:** `web_src/js/`
* **Vue components:** `web_src/js/components/`
* **Go HTML templates:** `templates/`
diff --git a/package-lock.json b/package-lock.json
index e8dbdea8e9b60..29335dade1a5a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,11 +28,9 @@
"jquery": "3.6.3",
"jquery.are-you-sure": "1.9.0",
"katex": "0.16.4",
- "less": "4.1.3",
- "less-loader": "11.1.0",
"license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.0.2",
- "mini-css-extract-plugin": "2.7.2",
+ "mini-css-extract-plugin": "2.7.4",
"monaco-editor": "0.34.1",
"monaco-editor-webpack-plugin": "7.0.1",
"pretty-ms": "8.0.0",
@@ -45,7 +43,7 @@
"vue-bar-graph": "2.0.0",
"vue-loader": "17.0.1",
"vue3-calendar-heatmap": "2.0.0",
- "webpack": "5.76.0",
+ "webpack": "5.76.2",
"webpack-cli": "5.0.1",
"workbox-routing": "6.5.4",
"workbox-strategies": "6.5.4",
@@ -64,7 +62,6 @@
"eslint-plugin-vue": "9.9.0",
"jsdom": "21.0.0",
"markdownlint-cli": "0.33.0",
- "postcss-less": "6.0.0",
"stylelint": "15.2.0",
"stylelint-declaration-strict-value": "1.9.2",
"svgo": "3.0.2",
@@ -2667,6 +2664,9 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"is-what": "^3.14.1"
},
@@ -3813,7 +3813,9 @@
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"prr": "~1.0.1"
},
@@ -5240,7 +5242,9 @@
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"bin": {
"image-size": "bin/image-size.js"
},
@@ -5675,7 +5679,10 @@
"node_modules/is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
- "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/isarray": {
"version": "0.0.1",
@@ -5933,14 +5940,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/known-css-properties": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz",
@@ -5956,6 +5955,9 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
"integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"copy-anything": "^2.0.1",
"parse-node-version": "^1.0.1",
@@ -5977,25 +5979,6 @@
"source-map": "~0.6.0"
}
},
- "node_modules/less-loader": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz",
- "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==",
- "dependencies": {
- "klona": "^2.0.4"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "less": "^3.5.0 || ^4.0.0",
- "webpack": "^5.0.0"
- }
- },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -6201,7 +6184,9 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"pify": "^4.0.1",
"semver": "^5.6.0"
@@ -6214,7 +6199,9 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"bin": {
"semver": "bin/semver"
}
@@ -6505,7 +6492,9 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
"optional": true,
+ "peer": true,
"bin": {
"mime": "cli.js"
},
@@ -6542,9 +6531,9 @@
}
},
"node_modules/mini-css-extract-plugin": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz",
- "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==",
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.4.tgz",
+ "integrity": "sha512-V5zkjajQx9gnedglDap7ZjD1mNFNISzyllzrc+9+R4iwPRUAR0St20ADflQbWkVUQ2u/QU55t8mKaxUek8Cciw==",
"dependencies": {
"schema-utils": "^4.0.0"
},
@@ -6637,7 +6626,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "devOptional": true
+ "dev": true
},
"node_modules/nanoid": {
"version": "3.3.4",
@@ -6660,7 +6649,9 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
"integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"debug": "^3.2.6",
"iconv-lite": "^0.6.3",
@@ -6677,7 +6668,9 @@
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"ms": "^2.1.1"
}
@@ -7047,6 +7040,9 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 0.10"
}
@@ -7148,7 +7144,9 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
"optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -7288,18 +7286,6 @@
"node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-less": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
- "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "postcss": "^8.3.5"
- }
- },
"node_modules/postcss-media-query-parser": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
@@ -7481,7 +7467,9 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/psl": {
"version": "1.9.0",
@@ -7987,7 +7975,9 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"node_modules/saxes": {
"version": "6.0.0",
@@ -8917,7 +8907,8 @@
"node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -9413,9 +9404,9 @@
}
},
"node_modules/webpack": {
- "version": "5.76.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
- "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
+ "version": "5.76.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
+ "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"dependencies": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^0.0.51",
@@ -11852,6 +11843,9 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
"integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"is-what": "^3.14.1"
}
@@ -12710,7 +12704,9 @@
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
"integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"prr": "~1.0.1"
}
@@ -13783,7 +13779,9 @@
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"immer": {
"version": "9.0.18",
@@ -14076,7 +14074,10 @@
"is-what": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
- "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"isarray": {
"version": "0.0.1",
@@ -14269,11 +14270,6 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
},
- "klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="
- },
"known-css-properties": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz",
@@ -14289,6 +14285,9 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz",
"integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
"requires": {
"copy-anything": "^2.0.1",
"errno": "^0.1.1",
@@ -14302,14 +14301,6 @@
"tslib": "^2.3.0"
}
},
- "less-loader": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz",
- "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==",
- "requires": {
- "klona": "^2.0.4"
- }
- },
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -14484,7 +14475,9 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"pify": "^4.0.1",
"semver": "^5.6.0"
@@ -14494,7 +14487,9 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
}
}
},
@@ -14721,7 +14716,9 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"mime-db": {
"version": "1.52.0",
@@ -14743,9 +14740,9 @@
"dev": true
},
"mini-css-extract-plugin": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz",
- "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==",
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.4.tgz",
+ "integrity": "sha512-V5zkjajQx9gnedglDap7ZjD1mNFNISzyllzrc+9+R4iwPRUAR0St20ADflQbWkVUQ2u/QU55t8mKaxUek8Cciw==",
"requires": {
"schema-utils": "^4.0.0"
}
@@ -14817,7 +14814,7 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "devOptional": true
+ "dev": true
},
"nanoid": {
"version": "3.3.4",
@@ -14834,7 +14831,9 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
"integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"debug": "^3.2.6",
"iconv-lite": "^0.6.3",
@@ -14845,7 +14844,9 @@
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
"optional": true,
+ "peer": true,
"requires": {
"ms": "^2.1.1"
}
@@ -15127,7 +15128,10 @@
"parse-node-version": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
- "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA=="
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"parse5": {
"version": "7.1.2",
@@ -15198,7 +15202,9 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"pkg-dir": {
"version": "4.2.0",
@@ -15296,13 +15302,6 @@
"source-map-js": "^1.0.2"
}
},
- "postcss-less": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz",
- "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==",
- "dev": true,
- "requires": {}
- },
"postcss-media-query-parser": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
@@ -15433,7 +15432,9 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
"integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"psl": {
"version": "1.9.0",
@@ -15792,7 +15793,9 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "optional": true
+ "dev": true,
+ "optional": true,
+ "peer": true
},
"saxes": {
"version": "6.0.0",
@@ -16527,7 +16530,8 @@
"tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
},
"type-check": {
"version": "0.4.0",
@@ -16847,9 +16851,9 @@
"dev": true
},
"webpack": {
- "version": "5.76.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz",
- "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==",
+ "version": "5.76.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz",
+ "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==",
"requires": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^0.0.51",
diff --git a/package.json b/package.json
index 9ced009da8875..afc7752257abc 100644
--- a/package.json
+++ b/package.json
@@ -28,11 +28,9 @@
"jquery": "3.6.3",
"jquery.are-you-sure": "1.9.0",
"katex": "0.16.4",
- "less": "4.1.3",
- "less-loader": "11.1.0",
"license-checker-webpack-plugin": "0.2.1",
"mermaid": "10.0.2",
- "mini-css-extract-plugin": "2.7.2",
+ "mini-css-extract-plugin": "2.7.4",
"monaco-editor": "0.34.1",
"monaco-editor-webpack-plugin": "7.0.1",
"pretty-ms": "8.0.0",
@@ -45,7 +43,7 @@
"vue-bar-graph": "2.0.0",
"vue-loader": "17.0.1",
"vue3-calendar-heatmap": "2.0.0",
- "webpack": "5.76.0",
+ "webpack": "5.76.2",
"webpack-cli": "5.0.1",
"workbox-routing": "6.5.4",
"workbox-strategies": "6.5.4",
@@ -64,7 +62,6 @@
"eslint-plugin-vue": "9.9.0",
"jsdom": "21.0.0",
"markdownlint-cli": "0.33.0",
- "postcss-less": "6.0.0",
"stylelint": "15.2.0",
"stylelint-declaration-strict-value": "1.9.2",
"svgo": "3.0.2",
diff --git a/web_src/css/admin.css b/web_src/css/admin.css
new file mode 100644
index 0000000000000..00ed675e2d572
--- /dev/null
+++ b/web_src/css/admin.css
@@ -0,0 +1,110 @@
+.admin.hooks .list > .item:not(:first-child) {
+ border-top: 1px solid var(--color-secondary);
+ padding: 0.25rem 1rem;
+ margin: 12px -1rem -1rem;
+}
+
+.admin .table.segment {
+ padding: 0;
+ font-size: 13px;
+ overflow-x: auto;
+}
+
+.admin .table.segment:not(.striped) thead th:last-child {
+ padding-right: 5px !important;
+}
+
+.admin .table.segment th {
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+.admin .table.segment:not(.select) th:first-of-type,
+.admin .table.segment:not(.select) td:first-of-type {
+ padding-left: 15px !important;
+}
+
+.admin .table.segment form tbody button[type="submit"] {
+ padding: 5px 8px;
+}
+
+.admin .settings .button.adopt,
+.admin .settings .button.delete {
+ margin-top: -15px;
+ margin-bottom: -15px;
+}
+
+.admin .settings .button.adopt .label,
+.admin .settings .button.delete .label {
+ vertical-align: middle;
+}
+
+.admin.user .email {
+ max-width: 200px;
+}
+
+.admin dl.admin-dl-horizontal {
+ padding: 20px;
+ margin: 0;
+}
+
+.admin dl.admin-dl-horizontal dd {
+ margin-left: 275px;
+}
+
+@media (max-width: 767px) {
+ .admin dl.admin-dl-horizontal dd {
+ margin-left: 5%;
+ }
+}
+
+.admin dl.admin-dl-horizontal dt {
+ font-weight: 600;
+ float: left;
+ width: 285px;
+ clear: left;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+@media (max-width: 767px) {
+ .admin dl.admin-dl-horizontal dt {
+ width: auto;
+ margin-right: 0.5em;
+ }
+}
+
+.admin.config #test-mail-btn {
+ margin-left: 5px;
+}
+
+.admin code,
+.admin pre {
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+@media (max-width: 767px) {
+ .admin #notice-table .notice-description {
+ max-width: 80vw;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+ .admin #notice-table .notice-description {
+ max-width: 360px;
+ }
+}
+
+@media (min-width: 992px) and (max-width: 1200px) {
+ .admin #notice-table .notice-description {
+ max-width: 510px;
+ }
+}
+
+@media (min-width: 1201px) {
+ .admin #notice-table .notice-description {
+ max-width: 640px;
+ }
+}
diff --git a/web_src/less/animations.less b/web_src/css/animations.css
similarity index 100%
rename from web_src/less/animations.less
rename to web_src/css/animations.css
diff --git a/web_src/less/_base.less b/web_src/css/base.css
similarity index 77%
rename from web_src/less/_base.less
rename to web_src/css/base.css
index 1cf65e784cd4d..2e6281391fd82 100644
--- a/web_src/less/_base.less
+++ b/web_src/css/base.css
@@ -7,8 +7,8 @@
--checkbox-mask-checked: url('data:image/svg+xml;utf8,');
--checkbox-mask-indeterminate: url('data:image/svg+xml;utf8,');
/* non-color variables */
- --border-radius: .28571429rem;
- --opacity-disabled: .55;
+ --border-radius: 0.28571429rem;
+ --opacity-disabled: 0.55;
--height-loading: 12rem;
/* base colors */
--color-primary: #4183c4;
@@ -183,7 +183,6 @@
--color-accent: var(--color-primary-light-1);
--color-small-accent: var(--color-primary-light-6);
--color-active-line: #fffbdd;
-
accent-color: var(--color-accent);
color-scheme: light;
}
@@ -200,7 +199,7 @@ pre,
code,
kbd,
samp {
- font-size: .9em; /* compensate for monospace fonts being usually slightly larger */
+ font-size: 0.9em; /* compensate for monospace fonts being usually slightly larger */
font-family: var(--fonts-monospace);
}
@@ -226,7 +225,7 @@ body {
@supports (overflow: overlay) {
body {
- overflow: overlay; // stylelint-disable-line
+ overflow: overlay; /* stylelint-disable-line */
scrollbar-gutter: stable;
}
}
@@ -253,12 +252,15 @@ progress {
border: none;
overflow: hidden;
}
+
progress::-webkit-progress-bar {
background: var(--color-secondary-dark-1);
}
+
progress::-webkit-progress-value {
background-color: var(--color-accent);
}
+
progress::-moz-progress-bar {
background-color: var(--color-accent);
}
@@ -272,17 +274,21 @@ progress::-moz-progress-bar {
width: 10px;
height: 10px;
}
+
::-webkit-scrollbar-thumb {
box-shadow: inset 0 0 0 6px var(--color-primary);
border: 2px solid transparent;
border-radius: 5px !important;
}
+
::-webkit-scrollbar-thumb:window-inactive {
box-shadow: inset 0 0 0 6px var(--color-primary);
}
+
::-webkit-scrollbar-thumb:hover {
box-shadow: inset 0 0 0 6px var(--color-primary-dark-2);
}
+
::-webkit-scrollbar-corner {
background: transparent;
}
@@ -293,6 +299,7 @@ progress::-moz-progress-bar {
background: var(--color-light);
border-radius: var(--border-radius);
}
+
::file-selector-button:hover {
color: var(--color-text);
background: var(--color-hover);
@@ -310,6 +317,17 @@ progress::-moz-progress-bar {
opacity: 1 !important;
}
+.unselectable,
+.button,
+.lines-num,
+.lines-commit,
+.lines-commit .blame-info,
+.ellipsis-button {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
a,
.ui.breadcrumb a {
color: var(--color-primary);
@@ -350,15 +368,18 @@ a.label,
.ui.red.buttons .button {
background: var(--color-red);
}
+
.ui.red.button:hover,
.ui.red.buttons .button:hover {
background: var(--color-red-light);
}
+
.ui.basic.red.buttons .button,
.ui.basic.red.button {
color: var(--color-red);
border-color: var(--color-red);
}
+
.ui.basic.red.buttons .button:hover,
.ui.basic.red.button:hover {
color: var(--color-red-light);
@@ -371,15 +392,18 @@ a.label,
.ui.orange.buttons .button {
background: var(--color-orange);
}
+
.ui.orange.button:hover,
.ui.orange.buttons .button:hover {
background: var(--color-orange-light);
}
+
.ui.basic.orange.buttons .button,
.ui.basic.orange.button {
color: var(--color-orange);
border-color: var(--color-orange);
}
+
.ui.basic.orange.buttons .button:hover,
.ui.basic.orange.button:hover {
color: var(--color-orange-light);
@@ -392,15 +416,18 @@ a.label,
.ui.yellow.buttons .button {
background: var(--color-yellow);
}
+
.ui.yellow.button:hover,
.ui.yellow.buttons .button:hover {
background: var(--color-yellow-light);
}
+
.ui.basic.yellow.buttons .button,
.ui.basic.yellow.button {
color: var(--color-yellow);
border-color: var(--color-yellow);
}
+
.ui.basic.yellow.buttons .button:hover,
.ui.basic.yellow.button:hover {
color: var(--color-yellow-light);
@@ -413,15 +440,18 @@ a.label,
.ui.olive.buttons .button {
background: var(--color-olive);
}
+
.ui.olive.button:hover,
.ui.olive.buttons .button:hover {
background: var(--color-olive-light);
}
+
.ui.basic.olive.buttons .button,
.ui.basic.olive.button {
color: var(--color-olive);
border-color: var(--color-olive);
}
+
.ui.basic.olive.buttons .button:hover,
.ui.basic.olive.button:hover {
color: var(--color-olive-light);
@@ -434,15 +464,18 @@ a.label,
.ui.green.buttons .button {
background: var(--color-green);
}
+
.ui.green.button:hover,
.ui.green.buttons .button:hover {
background: var(--color-green-light);
}
+
.ui.basic.green.buttons .button,
.ui.basic.green.button {
color: var(--color-green);
border-color: var(--color-green);
}
+
.ui.basic.green.buttons .button:hover,
.ui.basic.green.button:hover {
color: var(--color-green-light);
@@ -455,15 +488,18 @@ a.label,
.ui.teal.buttons .button {
background: var(--color-teal);
}
+
.ui.teal.button:hover,
.ui.teal.buttons .button:hover {
background: var(--color-teal-light);
}
+
.ui.basic.teal.buttons .button,
.ui.basic.teal.button {
color: var(--color-teal);
border-color: var(--color-teal);
}
+
.ui.basic.teal.buttons .button:hover,
.ui.basic.teal.button:hover {
color: var(--color-teal-light);
@@ -476,15 +512,18 @@ a.label,
.ui.blue.buttons .button {
background: var(--color-blue);
}
+
.ui.blue.button:hover,
.ui.blue.buttons .button:hover {
background: var(--color-blue-light);
}
+
.ui.basic.blue.buttons .button,
.ui.basic.blue.button {
color: var(--color-blue);
border-color: var(--color-blue);
}
+
.ui.basic.blue.buttons .button:hover,
.ui.basic.blue.button:hover {
color: var(--color-blue-light);
@@ -497,15 +536,18 @@ a.label,
.ui.violet.buttons .button {
background: var(--color-violet);
}
+
.ui.violet.button:hover,
.ui.violet.buttons .button:hover {
background: var(--color-violet-light);
}
+
.ui.basic.violet.buttons .button,
.ui.basic.violet.button {
color: var(--color-violet);
border-color: var(--color-violet);
}
+
.ui.basic.violet.buttons .button:hover,
.ui.basic.violet.button:hover {
color: var(--color-violet-light);
@@ -518,15 +560,18 @@ a.label,
.ui.purple.buttons .button {
background: var(--color-purple);
}
+
.ui.purple.button:hover,
.ui.purple.buttons .button:hover {
background: var(--color-purple-light);
}
+
.ui.basic.purple.buttons .button,
.ui.basic.purple.button {
color: var(--color-purple);
border-color: var(--color-purple);
}
+
.ui.basic.purple.buttons .button:hover,
.ui.basic.purple.button:hover {
color: var(--color-purple-light);
@@ -539,15 +584,18 @@ a.label,
.ui.pink.buttons .button {
background: var(--color-pink);
}
+
.ui.pink.button:hover,
.ui.pink.buttons .button:hover {
background: var(--color-pink-light);
}
+
.ui.basic.pink.buttons .button,
.ui.basic.pink.button {
color: var(--color-pink);
border-color: var(--color-pink);
}
+
.ui.basic.pink.buttons .button:hover,
.ui.basic.pink.button:hover {
color: var(--color-pink-light);
@@ -560,15 +608,18 @@ a.label,
.ui.brown.buttons .button {
background: var(--color-brown);
}
+
.ui.brown.button:hover,
.ui.brown.buttons .button:hover {
background: var(--color-brown-light);
}
+
.ui.basic.brown.buttons .button,
.ui.basic.brown.button {
color: var(--color-brown);
border-color: var(--color-brown);
}
+
.ui.basic.brown.buttons .button:hover,
.ui.basic.brown.button:hover {
color: var(--color-brown-light);
@@ -581,15 +632,18 @@ a.label,
.ui.grey.buttons .button {
background: var(--color-grey);
}
+
.ui.grey.button:hover,
.ui.grey.buttons .button:hover {
background: var(--color-grey-light);
}
+
.ui.basic.grey.buttons .button,
.ui.basic.grey.button {
color: var(--color-grey);
border-color: var(--color-grey);
}
+
.ui.basic.grey.buttons .button:hover,
.ui.basic.grey.button:hover {
color: var(--color-grey-light);
@@ -602,15 +656,18 @@ a.label,
.ui.black.buttons .button {
background: var(--color-black);
}
+
.ui.black.button:hover,
.ui.black.buttons .button:hover {
background: var(--color-black-light);
}
+
.ui.basic.black.buttons .button,
.ui.basic.black.button {
color: var(--color-black);
border-color: var(--color-black);
}
+
.ui.basic.black.buttons .button:hover,
.ui.basic.black.button:hover {
color: var(--color-black-light);
@@ -664,21 +721,12 @@ a.label,
background: var(--color-hover);
}
-.unselectable {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- user-select: none;
-}
-
-.button {
- &:extend(.unselectable);
-}
-
.issue-title code {
padding: 2px 4px;
border-radius: 6px;
background-color: var(--color-markup-code-block);
}
+
/* try to match button with no icons in height */
.icon-button {
padding-top: 7.42px !important;
@@ -720,10 +768,10 @@ a.label,
/* currently used for search bar dropdowns in repo search and explore code */
.ui.action.input:not([class*="left action"]) > .ui.dropdown.selection {
min-width: 10em;
+}
- &:not(:focus,:hover) {
- border-right-color: transparent;
- }
+.ui.action.input:not([class*="left action"]) > .ui.dropdown.selection:not(:focus,:hover) {
+ border-right-color: transparent;
}
.ui.action.input:not([class*="left action"]) > input:focus {
@@ -738,10 +786,11 @@ a.label,
.ui.menu .item {
color: var(--color-text);
+ user-select: auto;
+}
- > .svg {
- margin-right: .35em;
- }
+.ui.menu .item > .svg {
+ margin-right: 0.35em;
}
.ui.menu .item > .label {
@@ -812,11 +861,12 @@ a.label,
/* fix misaligned images in webhook dropdown */
.ui.dropdown .menu > .item > img {
- margin-top: -.25rem;
- margin-bottom: -.25rem;
+ margin-top: -0.25rem;
+ margin-bottom: -0.25rem;
}
+
.ui.dropdown .menu > .item > svg.img {
- margin-right: .78571429rem;
+ margin-right: 0.78571429rem;
}
.ui.selection.dropdown .menu > .item {
@@ -871,8 +921,8 @@ a.label,
}
.ui.secondary.menu.tight .item {
- padding-left: .85714286em;
- padding-right: .85714286em;
+ padding-left: 0.85714286em;
+ padding-right: 0.85714286em;
}
.ui.menu .dropdown.item .menu {
@@ -1179,7 +1229,7 @@ a.ui.card:hover,
}
/* enable fluid page widths for medium size viewports */
-@media @mediaMdAndUp and @mediaLgAndDown {
+@media (min-width: 768px) and (max-width: 1200px) {
.ui.ui.ui.container:not(.fluid) {
width: calc(100vw - 3em);
}
@@ -1189,83 +1239,79 @@ a.ui.card:hover,
z-index: 900;
left: 0;
margin: 0 !important;
+}
- &.light {
- background: var(--color-header-bar);
- border-bottom: 1px solid var(--color-secondary);
- }
+.following.bar.light {
+ background: var(--color-header-bar);
+ border-bottom: 1px solid var(--color-secondary);
+}
- .column .menu {
- margin-top: 0;
- }
+.following.bar .column .menu {
+ margin-top: 0;
+}
- .top.menu a.item.brand {
- padding-left: 0;
- }
+.following.bar .top.menu a.item.brand {
+ padding-left: 0;
+}
- .top.menu a.item:hover,
- .top.menu .dropdown.item:hover,
- .top.menu .dropdown.item.active {
- background-color: transparent;
- }
+.following.bar .top.menu a.item:hover,
+.following.bar .top.menu .dropdown.item:hover,
+.following.bar .top.menu .dropdown.item.active {
+ background-color: transparent;
+}
- .top.menu a.item:hover {
- color: rgba(0, 0, 0, .45);
- }
+.following.bar .top.menu a.item:hover {
+ color: rgba(0, 0, 0, 0.45);
+}
- .top.menu .menu {
- z-index: 900;
- }
+.following.bar .top.menu .menu {
+ z-index: 900;
+}
- .fitted .svg {
- margin-right: 0;
- vertical-align: middle;
- }
+.following.bar .fitted .svg {
+ margin-right: 0;
+ vertical-align: middle;
+}
- .searchbox {
- background-color: var(--color-input-background) !important;
- }
+.following.bar .searchbox {
+ background-color: var(--color-input-background) !important;
+}
- .text .svg {
- width: 16px;
- text-align: center;
- }
+.following.bar .text .svg {
+ width: 16px;
+ text-align: center;
+}
- #navbar {
- width: 100vw;
- min-height: 52px;
- padding: 0 .5rem;
- }
+.following.bar #navbar {
+ width: 100vw;
+ min-height: 52px;
+ padding: 0 0.5rem;
+}
- #navbar .brand {
- margin: 0;
- }
+.following.bar #navbar .brand {
+ margin: 0;
+}
- #navbar .dropdown .avatar {
- margin-right: 0 !important;
- }
+.following.bar #navbar .dropdown .avatar {
+ margin-right: 0 !important;
+}
- @media @mediaSm {
- #navbar:not(.shown) > *:not(:first-child) {
- display: none;
- }
+@media (max-width: 767px) {
+ .following.bar #navbar:not(.shown) > *:not(:first-child) {
+ display: none;
}
}
.right.stackable.menu {
- // responsive fix: this makes sure that the right menu when the page
- // is on mobile view will have elements stacked on top of each other.
- // no, stackable won't work on right menus.
+ /* responsive fix: this makes sure that the right menu when the page */
+ /* is on mobile view will have elements stacked on top of each other. */
+ /* no, stackable won't work on right menus. */
margin-left: auto;
display: flex;
align-items: inherit;
flex-direction: inherit;
}
-.ui.dropdown .menu {
- border-color: var(--color-secondary);
-}
-
.ui.pagination.menu .active.item {
color: var(--color-text);
background: var(--color-active);
@@ -1282,7 +1328,7 @@ a.ui.card:hover,
.ui.loading.form > *,
.ui.loading.segment > * {
- opacity: .35;
+ opacity: 0.35;
}
.ui.form .fields.error .field textarea,
@@ -1358,8 +1404,8 @@ a.ui.card:hover,
border-color: var(--color-error-border) !important;
}
-// A fix for text visibility issue in Chrome autofill in dark mode.
-// It's a problem from Formatic UI, and this rule overrides it.
+/* A fix for text visibility issue in Chrome autofill in dark mode. */
+/* It's a problem from Formatic UI, and this rule overrides it. */
.ui.form .field.field input:-webkit-autofill {
-webkit-text-fill-color: var(--color-black) !important;
}
@@ -1372,372 +1418,384 @@ a.ui.card:hover,
visibility: hidden;
}
-.text.primary { color: var(--color-primary) !important; }
-.text.red { color: var(--color-red) !important; }
-.text.orange { color: var(--color-orange) !important; }
-.text.yellow { color: var(--color-yellow) !important; }
-.text.olive { color: var(--color-olive) !important; }
-.text.green { color: var(--color-green) !important; }
-.text.teal { color: var(--color-teal) !important; }
-.text.blue { color: var(--color-blue) !important; }
-.text.violet { color: var(--color-violet) !important; }
-.text.purple { color: var(--color-purple) !important; }
-.text.pink { color: var(--color-pink) !important; }
-.text.brown { color: var(--color-brown) !important; }
-.text.black { color: var(--color-text) !important; }
-.text.grey { color: var(--color-text-light) !important; }
-.text.light.grey { color: var(--color-grey-light) !important; }
-.text.gold { color: var(--color-gold) !important; }
-
-.ui {
- &.left:not(.action) {
- float: left;
- }
+.text.primary {
+ color: var(--color-primary) !important;
+}
- &.right:not(.action) {
- float: right;
- }
+.text.red {
+ color: var(--color-red) !important;
+}
- &.menu .item {
- user-select: auto;
- }
+.text.orange {
+ color: var(--color-orange) !important;
+}
- &.container {
- &.fluid {
- &.padded {
- padding: 0 10px;
- }
- }
- }
+.text.yellow {
+ color: var(--color-yellow) !important;
+}
- &.form {
- .ui.button {
- font-weight: normal;
- }
- }
+.text.olive {
+ color: var(--color-olive) !important;
+}
- &.floating.label {
- z-index: 10;
- }
+.text.green {
+ color: var(--color-green) !important;
+}
- &.transparent.label {
- background-color: transparent;
- }
+.text.teal {
+ color: var(--color-teal) !important;
+}
- &.menu,
- &.vertical.menu,
- &.segment {
- box-shadow: none;
- }
+.text.blue {
+ color: var(--color-blue) !important;
+}
- /* Override semantic selector '.ui.menu:not(.vertical) .item > .button' */
- /* This fixes the commit graph button on the commits page */
+.text.violet {
+ color: var(--color-violet) !important;
+}
- .menu:not(.vertical) .item > .button.compact {
- padding: .58928571em 1.125em;
- }
+.text.purple {
+ color: var(--color-purple) !important;
+}
- .menu:not(.vertical) .item > .button.small {
- font-size: .92857143rem;
- }
+.text.pink {
+ color: var(--color-pink) !important;
+}
- &.menu .ui.dropdown.item .menu .item {
- width: 100%;
- }
+.text.brown {
+ color: var(--color-brown) !important;
+}
- &.dropdown .menu > .item > .floating.label {
- z-index: 11;
- }
+.text.black {
+ color: var(--color-text) !important;
+}
- &.dropdown .menu .menu > .item > .floating.label {
- z-index: 21;
- }
+.text.grey {
+ color: var(--color-text-light) !important;
+}
- &.dropdown .menu > .header {
- font-size: .8em;
- }
+.text.light.grey {
+ color: var(--color-grey-light) !important;
+}
- .text {
- &.left {
- text-align: left !important;
- }
-
- &.right {
- text-align: right !important;
- }
-
- &.small {
- font-size: .75em;
- }
-
- &.normal {
- font-weight: normal;
- }
-
- &.italic {
- font-style: italic;
- }
-
- &.truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- display: inline-block;
- }
-
- &.thin {
- font-weight: normal;
- }
-
- &.middle {
- vertical-align: middle;
- }
- }
+.text.gold {
+ color: var(--color-gold) !important;
+}
- .message {
- text-align: center;
- }
+.ui.left:not(.action) {
+ float: left;
+}
- .message > ul {
- margin-left: auto;
- margin-right: auto;
- display: table;
- text-align: left;
- }
+.ui.right:not(.action) {
+ float: right;
+}
- .header > i + .content {
- padding-left: .75rem;
- vertical-align: middle;
- }
+.ui.container.fluid.padded {
+ padding: 0 10px;
+}
- .info {
- &.segment {
- &.top {
- h3,
- h4 {
- margin-top: 0;
- }
-
- h3:last-child {
- margin-top: 4px;
- }
-
- > :last-child {
- margin-bottom: 0;
- }
- }
- }
- }
+.ui.form .ui.button {
+ font-weight: normal;
+}
- .normal.header {
- font-weight: normal;
- }
+.ui.floating.label {
+ z-index: 10;
+}
- .form {
- .autofill-dummy {
- position: absolute;
- width: 1px;
- height: 1px;
- overflow: hidden;
- z-index: -10000;
- }
- .sub.field {
- margin-left: 25px;
- }
- }
+.ui.transparent.label {
+ background-color: transparent;
+}
- .sha.label {
- font-family: var(--fonts-monospace);
- font-size: 13px;
- padding: 6px 10px 4px;
- font-weight: normal;
- margin: 0 6px;
- }
+.ui.menu,
+.ui.vertical.menu,
+.ui.segment {
+ box-shadow: none;
+}
- .button.copy-commit-sha {
- border: 1px solid var(--color-light-border);
- margin-right: 3px;
- padding: 6px 6px 4px;
- background: var(--color-light);
- }
+/* Override semantic selector '.ui.menu:not(.vertical) .item > .button' */
+/* This fixes the commit graph button on the commits page */
+/* modal svg icons, copied from fomantic except width and height */
+/* center text in fomantic modal dialogs */
+.ui .menu:not(.vertical) .item > .button.compact {
+ padding: 0.58928571em 1.125em;
+}
- .button.truncate {
- display: inline-block;
- max-width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- vertical-align: top;
- white-space: nowrap;
- margin-right: 6px;
- }
+.ui .menu:not(.vertical) .item > .button.small {
+ font-size: 0.92857143rem;
+}
- &.status.buttons {
- .svg {
- margin-right: 4px;
- }
- }
+.ui.menu .ui.dropdown.item .menu .item {
+ width: 100%;
+}
- &.inline.delete-button {
- padding: 8px 15px;
- font-weight: normal;
- }
+.ui.dropdown .menu > .item > .floating.label {
+ z-index: 11;
+}
- .background {
- &.red {
- background-color: var(--color-red) !important;
- }
+.ui.dropdown .menu .menu > .item > .floating.label {
+ z-index: 21;
+}
- &.blue {
- background-color: var(--color-blue) !important;
- }
+.ui.dropdown .menu > .header {
+ font-size: 0.8em;
+}
- &.black {
- background-color: var(--color-black) !important;
- }
+.ui .text.left {
+ text-align: left !important;
+}
- &.grey {
- background-color: var(--color-grey) !important;
- }
+.ui .text.right {
+ text-align: right !important;
+}
- &.light.grey {
- background-color: var(--color-grey) !important;
- }
+.ui .text.small {
+ font-size: 0.75em;
+}
- &.green {
- background-color: var(--color-green) !important;
- }
+.ui .text.normal {
+ font-weight: normal;
+}
- &.purple {
- background-color: var(--color-purple) !important;
- }
+.ui .text.italic {
+ font-style: italic;
+}
- &.yellow {
- background-color: var(--color-yellow) !important;
- }
+.ui .text.truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: inline-block;
+}
- &.orange {
- background-color: var(--color-orange) !important;
- }
+.ui .text.thin {
+ font-weight: normal;
+}
- &.gold {
- background-color: var(--color-gold) !important;
- }
- }
+.ui .text.middle {
+ vertical-align: middle;
+}
- .migrate {
- color: var(--color-text-light-2) !important;
+.ui .message {
+ text-align: center;
+}
- a {
- color: var(--color-text-light) !important;
+.ui .message > ul {
+ margin-left: auto;
+ margin-right: auto;
+ display: table;
+ text-align: left;
+}
- &:hover {
- color: var(--color-text) !important;
- }
- }
- }
+.ui .header > i + .content {
+ padding-left: 0.75rem;
+ vertical-align: middle;
+}
- .border {
- border: 1px solid;
- &.red {
- border-color: var(--color-red) !important;
- }
+.ui .info.segment.top h3,
+.ui .info.segment.top h4 {
+ margin-top: 0;
+}
- &.blue {
- border-color: var(--color-blue) !important;
- }
+.ui .info.segment.top h3:last-child {
+ margin-top: 4px;
+}
- &.black {
- border-color: var(--color-black) !important;
- }
+.ui .info.segment.top > :last-child {
+ margin-bottom: 0;
+}
- &.grey {
- border-color: var(--color-grey) !important;
- }
+.ui .normal.header {
+ font-weight: normal;
+}
- &.light.grey {
- border-color: var(--color-grey) !important;
- }
+.ui .form .autofill-dummy {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+ z-index: -10000;
+}
- &.green {
- border-color: var(--color-green) !important;
- }
+.ui .form .sub.field {
+ margin-left: 25px;
+}
- &.purple {
- border-color: var(--color-purple) !important;
- }
+.ui .sha.label {
+ font-family: var(--fonts-monospace);
+ font-size: 13px;
+ padding: 6px 10px 4px;
+ font-weight: normal;
+ margin: 0 6px;
+}
- &.yellow {
- border-color: var(--color-yellow) !important;
- }
+.ui .button.copy-commit-sha {
+ border: 1px solid var(--color-light-border);
+ margin-right: 3px;
+ padding: 6px 6px 4px;
+ background: var(--color-light);
+}
- &.orange {
- border-color: var(--color-orange) !important;
- }
+.ui .button.truncate {
+ display: inline-block;
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ vertical-align: top;
+ white-space: nowrap;
+ margin-right: 6px;
+}
- &.gold {
- border-color: var(--color-gold) !important;
- }
- }
+.ui.status.buttons .svg {
+ margin-right: 4px;
+}
- .branch-tag-choice {
- line-height: 20px;
- }
+.ui.inline.delete-button {
+ padding: 8px 15px;
+ font-weight: normal;
+}
- &.pagination.menu {
- @media @mediaSm {
- .item:not(.active,.navigation),
- .item.navigation span.navigation_label {
- display: none;
- }
- }
- &.narrow .item {
- padding-left: 8px;
- padding-right: 8px;
- min-width: 1em;
- text-align: center;
- .icon {
- margin-right: 0;
- }
- }
- }
+.ui .background.red {
+ background-color: var(--color-red) !important;
+}
- /* modal svg icons, copied from fomantic except width and height */
- &.icon.header svg {
- width: 3em;
- height: 3em;
- float: none;
- display: block;
- line-height: 1;
- padding: 0;
- margin: 0 auto .5rem;
- opacity: 1;
- }
+.ui .background.blue {
+ background-color: var(--color-blue) !important;
+}
- /* center text in fomantic modal dialogs */
- &.modal > .content {
- text-align: center;
- }
+.ui .background.black {
+ background-color: var(--color-black) !important;
+}
+
+.ui .background.grey {
+ background-color: var(--color-grey) !important;
+}
+
+.ui .background.light.grey {
+ background-color: var(--color-grey) !important;
+}
+
+.ui .background.green {
+ background-color: var(--color-green) !important;
+}
+
+.ui .background.purple {
+ background-color: var(--color-purple) !important;
+}
+
+.ui .background.yellow {
+ background-color: var(--color-yellow) !important;
+}
+
+.ui .background.orange {
+ background-color: var(--color-orange) !important;
+}
+
+.ui .background.gold {
+ background-color: var(--color-gold) !important;
+}
+
+.ui .migrate {
+ color: var(--color-text-light-2) !important;
+}
+
+.ui .migrate a {
+ color: var(--color-text-light) !important;
+}
+
+.ui .migrate a:hover {
+ color: var(--color-text) !important;
+}
+
+.ui .border {
+ border: 1px solid;
+}
+
+.ui .border.red {
+ border-color: var(--color-red) !important;
+}
+
+.ui .border.blue {
+ border-color: var(--color-blue) !important;
+}
+
+.ui .border.black {
+ border-color: var(--color-black) !important;
+}
+
+.ui .border.grey {
+ border-color: var(--color-grey) !important;
+}
+
+.ui .border.light.grey {
+ border-color: var(--color-grey) !important;
}
-.ui.floating.dropdown {
- .overflow.menu {
- .scrolling.menu.items {
- border-radius: 0 !important;
- box-shadow: none !important;
- border-bottom: 1px solid var(--color-secondary);
- }
+.ui .border.green {
+ border-color: var(--color-green) !important;
+}
+
+.ui .border.purple {
+ border-color: var(--color-purple) !important;
+}
+
+.ui .border.yellow {
+ border-color: var(--color-yellow) !important;
+}
+
+.ui .border.orange {
+ border-color: var(--color-orange) !important;
+}
+
+.ui .border.gold {
+ border-color: var(--color-gold) !important;
+}
+
+.ui .branch-tag-choice {
+ line-height: 20px;
+}
+
+@media (max-width: 767px) {
+ .ui.pagination.menu .item:not(.active,.navigation),
+ .ui.pagination.menu .item.navigation span.navigation_label {
+ display: none;
}
}
+.ui.pagination.menu.narrow .item {
+ padding-left: 8px;
+ padding-right: 8px;
+ min-width: 1em;
+ text-align: center;
+}
+
+.ui.pagination.menu.narrow .item .icon {
+ margin-right: 0;
+}
+
+.ui.icon.header svg {
+ width: 3em;
+ height: 3em;
+ float: none;
+ display: block;
+ line-height: 1;
+ padding: 0;
+ margin: 0 auto 0.5rem;
+ opacity: 1;
+}
+
+.ui.floating.dropdown .overflow.menu .scrolling.menu.items {
+ border-radius: 0 !important;
+ box-shadow: none !important;
+ border-bottom: 1px solid var(--color-secondary);
+}
+
.user-menu > .item {
width: 100%;
border-radius: 0 !important;
}
-.scrolling.menu {
- .item.selected {
- font-weight: 600 !important;
- }
+.scrolling.menu .item.selected {
+ font-weight: 600 !important;
}
.ui.dropdown .scrolling.menu {
@@ -1746,10 +1804,10 @@ a.ui.card:hover,
.color-preview {
display: inline-block;
- margin-left: .4em;
- height: .67em;
- width: .67em;
- border-radius: .15em;
+ margin-left: 0.4em;
+ height: 0.67em;
+ width: 0.67em;
+ border-radius: 0.15em;
}
.attention-icon {
@@ -1772,70 +1830,73 @@ footer {
width: 100%;
flex-basis: 40px;
color: var(--color-text-light);
+}
- .container {
- width: 100vw !important;
- padding: 0 .5rem;
- max-width: calc(100vw - 1rem) !important;
+footer .container {
+ width: 100vw !important;
+ padding: 0 0.5rem;
+ max-width: calc(100vw - 1rem) !important;
+}
- .links > * {
- border-left: 1px solid var(--color-secondary-dark-1);
- padding-left: 8px;
- margin-left: 5px;
+footer .container .links > * {
+ border-left: 1px solid var(--color-secondary-dark-1);
+ padding-left: 8px;
+ margin-left: 5px;
+}
- &:first-child {
- border-left: 0;
- }
- }
- }
+footer .container .links > *:first-child {
+ border-left: 0;
+}
- .ui.language {
- .menu {
- max-height: 500px;
- overflow-y: auto;
- margin-bottom: 7px;
- }
-
- .svg {
- margin-right: .15em;
- vertical-align: top;
- margin-top: calc(2em - 16px);
- }
- }
+footer .ui.language .menu {
+ max-height: 500px;
+ overflow-y: auto;
+ margin-bottom: 7px;
+}
- .ui {
- &.left,
- &.right {
- line-height: 39px; // there is a border-top on the footer, so make the line-height 1px less
- }
- }
+footer .ui.language .svg {
+ margin-right: 0.15em;
+ vertical-align: top;
+ margin-top: calc(2em - 16px);
+}
+
+footer .ui.left,
+footer .ui.right {
+ line-height: 39px; /* there is a border-top on the footer, so make the line-height 1px less */
}
.center:not(.popup) {
text-align: center;
}
-// Conditional display
-@media @mediaMdAndUp {
+/* Conditional display */
+@media (min-width: 768px) {
.mobile-only,
.ui.button.mobile-only {
display: none !important;
}
- // has the same behaviour of sr-only, hiding the content for
- // non-screenreaders, but is shown on mobile devices.
+ /* has the same behaviour of sr-only, hiding the content for */
+ /* non-screenreaders, but is shown on mobile devices. */
.sr-mobile-only {
- .sr-only();
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
}
}
-@media @mediaSm {
+@media (max-width: 767px) {
.not-mobile {
display: none !important;
}
}
-// Accessibility
+/* Accessibility for screen readers */
.sr-only {
position: absolute;
width: 1px;
@@ -1857,7 +1918,7 @@ footer {
clip: auto;
}
-@media @mediaMd {
+@media (min-width: 768px) and (max-width: 991px) {
.ui.container {
width: 95%;
}
@@ -1897,7 +1958,7 @@ footer {
margin: 0 !important;
}
-@media @mediaSm {
+@media (max-width: 767px) {
.ui.menu.new-menu .item {
width: auto !important;
}
@@ -1937,7 +1998,6 @@ footer {
border-bottom-width: 0 !important;
margin-bottom: 2px !important;
justify-content: space-evenly;
-
}
.ui.secondary.pointing.menu.repos-filter .item {
@@ -1952,19 +2012,19 @@ footer {
flex: 1;
word-break: break-all;
color: var(--color-text-light);
+}
- .avatar {
- width: 32px !important;
- height: 32px !important;
- }
+.repo-title .avatar {
+ width: 32px !important;
+ height: 32px !important;
+}
- .labels {
- margin-left: .5rem;
+.repo-title .labels {
+ margin-left: 0.5rem;
+}
- > * + * {
- margin-left: .5rem;
- }
- }
+.repo-title .labels > * + * {
+ margin-left: 0.5rem;
}
.repo-icon {
@@ -1992,16 +2052,16 @@ footer {
.inline-grouped-list {
display: inline-block;
vertical-align: top;
+}
- > .ui {
- display: block;
- margin-top: 5px;
- margin-bottom: 10px;
+.inline-grouped-list > .ui {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+}
- &:first-child {
- margin-top: 1px;
- }
- }
+.inline-grouped-list > .ui:first-child {
+ margin-top: 1px;
}
i.icons .icon:first-child {
@@ -2013,7 +2073,7 @@ i.icon.centerlock {
}
.ui.label {
- padding: .3em .5em;
+ padding: 0.3em 0.5em;
background: var(--color-light);
color: var(--color-text-light);
}
@@ -2026,7 +2086,7 @@ a.ui.label:hover {
}
.ui.label > .detail .icons {
- margin-right: .25em;
+ margin-right: 0.25em;
}
.ui.label > .detail .icons .icon {
@@ -2042,29 +2102,24 @@ a.ui.label:hover {
}
.lines-num {
- &:extend(.unselectable);
padding-left: 10px;
padding-right: 10px;
text-align: right !important;
color: var(--color-text-light-1);
width: 1%;
font-family: var(--fonts-monospace);
+}
- span {
- &.bottom-line {
- &::after {
- border-bottom: 1px solid var(--color-secondary);
- }
- }
-
- &::after {
- content: attr(data-line-number);
- line-height: 20px !important;
- padding: 0 10px;
- cursor: pointer;
- display: block;
- }
- }
+.lines-num span.bottom-line::after {
+ border-bottom: 1px solid var(--color-secondary);
+}
+
+.lines-num span::after {
+ content: attr(data-line-number);
+ line-height: 20px !important;
+ padding: 0 10px;
+ cursor: pointer;
+ display: block;
}
.lines-type-marker {
@@ -2079,19 +2134,24 @@ a.ui.label:hover {
padding-top: 0;
padding-bottom: 0;
vertical-align: top;
+}
- pre,
- ol {
- background-color: inherit;
- margin: 0;
- padding: 0 !important;
-
- li {
- display: block;
- width: calc(100% - 1ch);
- padding-left: 1ch;
- }
- }
+.lines-num pre,
+.lines-code pre,
+.lines-num ol,
+.lines-code ol {
+ background-color: inherit;
+ margin: 0;
+ padding: 0 !important;
+}
+
+.lines-num pre li,
+.lines-code pre li,
+.lines-num ol li,
+.lines-code ol li {
+ display: block;
+ width: calc(100% - 1ch);
+ padding-left: 1ch;
}
.lines-escape {
@@ -2131,64 +2191,61 @@ a.ui.label:hover {
}
.lines-commit {
- &:extend(.unselectable);
vertical-align: top;
color: var(--color-grey);
padding: 0 !important;
background: var(--color-code-sidebar-bg);
width: 1%;
+}
- .blame-info {
- &:extend(.unselectable);
- width: 350px;
- max-width: 350px;
- display: block;
- padding: 0 0 0 10px;
- line-height: 20px;
- box-sizing: content-box;
-
- .blame-data {
- display: flex;
- font-family: var(--fonts-regular);
-
- .blame-message {
- flex-grow: 2;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
-
- .blame-time,
- .blame-avatar {
- flex-shrink: 0;
- }
- }
- }
+.lines-commit .blame-info {
+ width: 350px;
+ max-width: 350px;
+ display: block;
+ padding: 0 0 0 10px;
+ line-height: 20px;
+ box-sizing: content-box;
+}
- .ui.avatar {
- height: 18px;
- width: 18px;
- display: block;
- margin-top: 1px;
- }
+.lines-commit .blame-info .blame-data {
+ display: flex;
+ font-family: var(--fonts-regular);
+}
+
+.lines-commit .blame-info .blame-data .blame-message {
+ flex-grow: 2;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.lines-commit .blame-info .blame-data .blame-time,
+.lines-commit .blame-info .blame-data .blame-avatar {
+ flex-shrink: 0;
+}
+
+.lines-commit .ui.avatar {
+ height: 18px;
+ width: 18px;
+ display: block;
+ margin-top: 1px;
}
.top-line-blame {
border-top: 1px solid var(--color-secondary);
}
-.lines-code,
-.lines-commit {
- .bottom-line {
- border-bottom: 1px solid var(--color-secondary);
- }
+.lines-code .bottom-line,
+.lines-commit .bottom-line {
+ border-bottom: 1px solid var(--color-secondary);
}
+
.code-view table {
width: 100%;
}
.octicon-tiny {
- font-size: .85714286rem;
+ font-size: 0.85714286rem;
}
.ui.button {
@@ -2362,16 +2419,16 @@ a.ui.basic.label:hover {
height: 2.1666em !important;
}
-.svg {
- span.green & {
- color: var(--color-green);
- }
- span.red & {
- color: var(--color-red);
- }
- span.purple & {
- color: var(--color-purple);
- }
+span.green .svg {
+ color: var(--color-green);
+}
+
+span.red .svg {
+ color: var(--color-red);
+}
+
+span.purple .svg {
+ color: var(--color-purple);
}
.migrate .svg.gitea-git {
@@ -2414,17 +2471,17 @@ a.ui.basic.label:hover {
position: relative;
background: var(--color-box-header);
border-color: var(--color-secondary);
+}
- .right .button {
- padding: 8px 10px;
- font-weight: normal;
- }
+.ui.attached.header .right .button {
+ padding: 8px 10px;
+ font-weight: normal;
}
/* fix misaligned right buttons on box headers */
.ui.attached.header .right:not(.dropdown) {
position: absolute;
- right: .78571429rem;
+ right: 0.78571429rem;
top: 0;
bottom: 0;
height: 30px;
@@ -2461,25 +2518,25 @@ a.ui.basic.label:hover {
border-radius: 1em;
font-size: 10px;
font-weight: 700;
- line-height: .7;
+ line-height: 0.7;
}
-table th[data-sortt-asc],
-table th[data-sortt-desc] {
- &:hover {
- background: rgba(0, 0, 0, .1) !important;
- cursor: pointer !important;
- }
- .svg {
- margin-left: .25rem;
- }
+table th[data-sortt-asc]:hover,
+table th[data-sortt-desc]:hover {
+ background: rgba(0, 0, 0, 0.1) !important;
+ cursor: pointer !important;
+}
+
+table th[data-sortt-asc] .svg,
+table th[data-sortt-desc] .svg {
+ margin-left: 0.25rem;
}
.ui.dropdown .svg.dropdown.icon,
.svg.dropdown.icon {
- margin-top: 0 !important; // reset the "ui.selection.dropdown > .dropdown.icon {margin-top}", for the Issue Dependencies dropdown
- margin-right: -.5rem !important; // fix up SVG dropdown triangles because Fomantic thinks they are icon fonts
- height: auto; // reset the ".ui.dropdown > .dropdown.icon {height}", otherwise the icon would be too small
+ margin-top: 0 !important; /* reset the "ui.selection.dropdown > .dropdown.icon {margin-top}", for the Issue Dependencies dropdown */
+ margin-right: -0.5rem !important; /* fix up SVG dropdown triangles because Fomantic thinks they are icon fonts */
+ height: auto; /* reset the ".ui.dropdown > .dropdown.icon {height}", otherwise the icon would be too small */
}
.ui.selection.dropdown > .search.icon,
@@ -2487,6 +2544,7 @@ table th[data-sortt-desc] {
.ui.selection.dropdown > .dropdown.icon {
top: 0 !important;
}
+
.ui.dropdown.no-text > .dropdown.icon {
margin-left: 0 !important;
margin-right: 0 !important;
@@ -2515,17 +2573,19 @@ table th[data-sortt-desc] {
line-height: 1;
font-style: normal !important;
font-weight: normal !important;
- vertical-align: -.075em;
-
- @supports (-webkit-hyphens:none) {
- body:not(.safari-above125) & {
- font-size: inherit;
- vertical-align: inherit;
- img {
- font-size: 1.25em;
- vertical-align: -.225em !important;
- }
- }
+ vertical-align: -0.075em;
+}
+
+@supports (-webkit-hyphens:none) {
+ body:not(.safari-above125) .emoji,
+ body:not(.safari-above125) .reaction {
+ font-size: inherit;
+ vertical-align: inherit;
+ }
+ body:not(.safari-above125) .emoji img,
+ body:not(.safari-above125) .reaction img {
+ font-size: 1.25em;
+ vertical-align: -0.225em !important;
}
}
@@ -2535,7 +2595,7 @@ table th[data-sortt-desc] {
margin: 0 !important;
width: 1em !important;
height: 1em !important;
- vertical-align: -.15em;
+ vertical-align: -0.15em;
}
.minicolors-panel {
@@ -2545,38 +2605,38 @@ table th[data-sortt-desc] {
.labelspage {
list-style: none;
padding-top: 0;
+}
- .item {
- margin-top: 0;
- margin-right: -14px;
- margin-left: -14px;
- padding: 10px;
- border-bottom: 1px solid var(--color-secondary);
- border-top: none;
-
- a {
- font-size: 12px;
- padding-right: 10px;
- color: var(--color-text-light);
-
- &:hover {
- color: var(--color-primary-light-2);
- }
-
- &.open-issues {
- margin-right: 30px;
- }
- }
- }
+.labelspage .item {
+ margin-top: 0;
+ margin-right: -14px;
+ margin-left: -14px;
+ padding: 10px;
+ border-bottom: 1px solid var(--color-secondary);
+ border-top: none;
+}
- .item:last-child {
- border-bottom: none;
- padding-bottom: 0;
- }
+.labelspage .item a {
+ font-size: 12px;
+ padding-right: 10px;
+ color: var(--color-text-light);
+}
- .orglabel {
- opacity: .7;
- }
+.labelspage .item a:hover {
+ color: var(--color-primary-light-2);
+}
+
+.labelspage .item a.open-issues {
+ margin-right: 30px;
+}
+
+.labelspage .item:last-child {
+ border-bottom: none;
+ padding-bottom: 0;
+}
+
+.labelspage .orglabel {
+ opacity: 0.7;
}
/* https://github.com/go-gitea/gitea/pull/11486 */
@@ -2631,7 +2691,7 @@ table th[data-sortt-desc] {
}
.ui.header .ui.label {
- margin-left: .25rem;
+ margin-left: 0.25rem;
}
.ui.header > .ui.label.compact {
@@ -2654,7 +2714,6 @@ table th[data-sortt-desc] {
}
.ellipsis-button {
- &:extend(.unselectable);
padding: 0 5px 8px !important;
display: inline-block !important;
font-weight: 600 !important;
@@ -2667,8 +2726,8 @@ table th[data-sortt-desc] {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
- margin-top: -.5em;
- margin-bottom: -.5em;
+ margin-top: -0.5em;
+ margin-bottom: -0.5em;
}
.precolors {
@@ -2676,32 +2735,29 @@ table th[data-sortt-desc] {
padding-right: 0 !important;
margin: 3px 10px auto !important;
width: 120px !important;
+}
- .color {
- float: left;
- width: 15px;
- height: 15px;
- }
+.precolors .color {
+ float: left;
+ width: 15px;
+ height: 15px;
}
-@media @mediaSm {
+@media (max-width: 767px) {
.ui.stackable.menu:not(.no-vertical-tabs) {
overflow-y: hidden;
overflow-x: auto;
flex-direction: row;
flex-wrap: nowrap !important;
-
- .item {
- width: initial !important;
- }
-
- > .dropdown.item {
- position: initial;
- }
-
- .menu {
- flex-direction: row;
- }
+ }
+ .ui.stackable.menu:not(.no-vertical-tabs) .item {
+ width: initial !important;
+ }
+ .ui.stackable.menu:not(.no-vertical-tabs) > .dropdown.item {
+ position: initial;
+ }
+ .ui.stackable.menu:not(.no-vertical-tabs) .menu {
+ flex-direction: row;
}
}
diff --git a/web_src/less/chroma/base.less b/web_src/css/chroma/base.css
similarity index 87%
rename from web_src/less/chroma/base.less
rename to web_src/css/chroma/base.css
index 597ee2a72d05e..bfd49db7a433a 100644
--- a/web_src/less/chroma/base.less
+++ b/web_src/css/chroma/base.css
@@ -29,14 +29,14 @@
/* LineNumbersTable */
.chroma .lnt {
- margin-right: .4em;
- padding: 0 .4em;
+ margin-right: 0.4em;
+ padding: 0 0.4em;
}
/* LineNumbers */
.chroma .ln {
- margin-right: .4em;
- padding: 0 .4em;
+ margin-right: 0.4em;
+ padding: 0 0.4em;
}
/* GenericStrong */
diff --git a/web_src/less/chroma/dark.less b/web_src/css/chroma/dark.css
similarity index 100%
rename from web_src/less/chroma/dark.less
rename to web_src/css/chroma/dark.css
diff --git a/web_src/less/chroma/light.less b/web_src/css/chroma/light.css
similarity index 100%
rename from web_src/less/chroma/light.less
rename to web_src/css/chroma/light.css
diff --git a/web_src/less/code/linebutton.less b/web_src/css/code/linebutton.css
similarity index 100%
rename from web_src/less/code/linebutton.less
rename to web_src/css/code/linebutton.css
diff --git a/web_src/less/codemirror/base.less b/web_src/css/codemirror/base.css
similarity index 71%
rename from web_src/less/codemirror/base.less
rename to web_src/css/codemirror/base.css
index db0a93f4c74ab..b435fb1342c02 100644
--- a/web_src/less/codemirror/base.less
+++ b/web_src/css/codemirror/base.css
@@ -1,5 +1,5 @@
.ui .field:not(:last-child) .EasyMDEContainer .editor-statusbar {
- margin-bottom: -1em; // when there is a statusbar, the "margin-bottom: 1em" of the "field" is not needed, because the statusbar is likely a blank line
+ margin-bottom: -1em; /* when there is a statusbar, the "margin-bottom: 1em" of the "field" is not needed, because the statusbar is likely a blank line */
}
.EasyMDEContainer .CodeMirror {
@@ -7,15 +7,15 @@
background-color: var(--color-input-background);
border-color: var(--color-secondary);
font: 14px var(--fonts-monospace);
+}
- &.cm-s-default {
- border-radius: var(--border-radius);
- padding: 0 !important;
- }
+.EasyMDEContainer .CodeMirror.cm-s-default {
+ border-radius: var(--border-radius);
+ padding: 0 !important;
+}
- &.CodeMirror-fullscreen.CodeMirror-focused {
- border-right: 1px solid var(--color-primary) !important;
- }
+.EasyMDEContainer .CodeMirror.CodeMirror-fullscreen.CodeMirror-focused {
+ border-right: 1px solid var(--color-primary) !important;
}
.CodeMirror-cursor {
diff --git a/web_src/css/codemirror/dark.css b/web_src/css/codemirror/dark.css
new file mode 100644
index 0000000000000..8a20d1c004337
--- /dev/null
+++ b/web_src/css/codemirror/dark.css
@@ -0,0 +1,106 @@
+.CodeMirror.cm-s-default .cm-property,
+.CodeMirror.cm-s-paper .cm-property {
+ color: #a0cc75;
+}
+
+.CodeMirror.cm-s-default .cm-header,
+.CodeMirror.cm-s-paper .cm-header {
+ color: #9daccc;
+}
+
+.CodeMirror.cm-s-default .cm-quote,
+.CodeMirror.cm-s-paper .cm-quote {
+ color: #009900;
+}
+
+.CodeMirror.cm-s-default .cm-keyword,
+.CodeMirror.cm-s-paper .cm-keyword {
+ color: #cc8a61;
+}
+
+.CodeMirror.cm-s-default .cm-atom,
+.CodeMirror.cm-s-paper .cm-atom {
+ color: #ef5e77;
+}
+
+.CodeMirror.cm-s-default .cm-number,
+.CodeMirror.cm-s-paper .cm-number {
+ color: #ff5656;
+}
+
+.CodeMirror.cm-s-default .cm-def,
+.CodeMirror.cm-s-paper .cm-def {
+ color: #e4e4e4;
+}
+
+.CodeMirror.cm-s-default .cm-variable-2,
+.CodeMirror.cm-s-paper .cm-variable-2 {
+ color: #00bdbf;
+}
+
+.CodeMirror.cm-s-default .cm-variable-3,
+.CodeMirror.cm-s-paper .cm-variable-3 {
+ color: #008855;
+}
+
+.CodeMirror.cm-s-default .cm-comment,
+.CodeMirror.cm-s-paper .cm-comment {
+ color: #8e9ab3;
+}
+
+.CodeMirror.cm-s-default .cm-string,
+.CodeMirror.cm-s-paper .cm-string {
+ color: #a77272;
+}
+
+.CodeMirror.cm-s-default .cm-string-2,
+.CodeMirror.cm-s-paper .cm-string-2 {
+ color: #ff5500;
+}
+
+.CodeMirror.cm-s-default .cm-meta,
+.CodeMirror.cm-s-paper .cm-meta,
+.CodeMirror.cm-s-default .cm-qualifier,
+.CodeMirror.cm-s-paper .cm-qualifier {
+ color: #ffb176;
+}
+
+.CodeMirror.cm-s-default .cm-builtin,
+.CodeMirror.cm-s-paper .cm-builtin {
+ color: #b7c951;
+}
+
+.CodeMirror.cm-s-default .cm-bracket,
+.CodeMirror.cm-s-paper .cm-bracket {
+ color: #999977;
+}
+
+.CodeMirror.cm-s-default .cm-tag,
+.CodeMirror.cm-s-paper .cm-tag {
+ color: #f1d273;
+}
+
+.CodeMirror.cm-s-default .cm-attribute,
+.CodeMirror.cm-s-paper .cm-attribute {
+ color: #bfcc70;
+}
+
+.CodeMirror.cm-s-default .cm-hr,
+.CodeMirror.cm-s-paper .cm-hr {
+ color: #999999;
+}
+
+.CodeMirror.cm-s-default .cm-url,
+.CodeMirror.cm-s-paper .cm-url {
+ color: #c5cfd0;
+}
+
+.CodeMirror.cm-s-default .cm-link,
+.CodeMirror.cm-s-paper .cm-link {
+ color: #d8c792;
+}
+
+.CodeMirror.cm-s-default .cm-error,
+.CodeMirror.cm-s-paper .cm-error {
+ color: #dbdbeb;
+}
diff --git a/web_src/less/codemirror/light.less b/web_src/css/codemirror/light.css
similarity index 100%
rename from web_src/less/codemirror/light.less
rename to web_src/css/codemirror/light.css
diff --git a/web_src/less/console/console.less b/web_src/css/console/console.css
similarity index 98%
rename from web_src/less/console/console.less
rename to web_src/css/console/console.css
index db25a35bacc84..b2d8439f8caeb 100644
--- a/web_src/less/console/console.less
+++ b/web_src/css/console/console.css
@@ -1,4 +1,4 @@
-// Based on https://github.com/buildkite/terminal-to-html/blob/697ff23bd8dc48b9d23f11f259f5256dae2455f0/assets/terminal.css
+/* Based on https://github.com/buildkite/terminal-to-html/blob/697ff23bd8dc48b9d23f11f259f5256dae2455f0/assets/terminal.css */
.console {
background: var(--color-console-bg);
diff --git a/web_src/css/dashboard.css b/web_src/css/dashboard.css
new file mode 100644
index 0000000000000..ced8b3a164aab
--- /dev/null
+++ b/web_src/css/dashboard.css
@@ -0,0 +1,203 @@
+.dashboard.feeds .context.user.menu,
+.dashboard.issues .context.user.menu {
+ z-index: 101;
+ min-width: 200px;
+}
+
+.dashboard.feeds .context.user.menu .ui.header,
+.dashboard.issues .context.user.menu .ui.header {
+ font-size: 1rem;
+ text-transform: none;
+}
+
+.dashboard.feeds .filter.menu,
+.dashboard.issues .filter.menu {
+ width: initial;
+}
+
+.dashboard.feeds .filter.menu .item,
+.dashboard.issues .filter.menu .item {
+ text-align: left;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.dashboard.feeds .filter.menu .item .text,
+.dashboard.issues .filter.menu .item .text {
+ height: 16px;
+ vertical-align: middle;
+}
+
+.dashboard.feeds .filter.menu .item .text.truncate,
+.dashboard.issues .filter.menu .item .text.truncate {
+ width: 75%;
+}
+
+.dashboard.feeds .filter.menu .item .floating.label,
+.dashboard.issues .filter.menu .item .floating.label {
+ top: 7px;
+ left: 90%;
+ width: 15%;
+}
+
+@media (max-width: 767px) {
+ .dashboard.feeds .filter.menu .item .floating.label,
+ .dashboard.issues .filter.menu .item .floating.label {
+ top: 10px;
+ left: auto;
+ width: auto;
+ right: 13px;
+ }
+}
+
+/* Sort */
+.dashboard.feeds .filter.menu .jump.item,
+.dashboard.issues .filter.menu .jump.item {
+ margin: 1px;
+ padding-right: 0;
+}
+
+.dashboard.feeds .filter.menu .menu,
+.dashboard.issues .filter.menu .menu {
+ max-height: 300px;
+ overflow-x: auto;
+ right: 0 !important;
+ left: auto !important;
+}
+
+@media (max-width: 767px) {
+ .dashboard.feeds .filter.menu,
+ .dashboard.issues .filter.menu {
+ width: 100%;
+ }
+}
+
+.dashboard.feeds .right.stackable.menu > .item.active,
+.dashboard.issues .right.stackable.menu > .item.active {
+ color: var(--color-red);
+}
+
+.dashboard .dashboard-repos,
+.dashboard .dashboard-orgs {
+ margin: 0 1px; /* Accommodate for Semantic's 1px hacks on .attached elements */
+}
+
+.dashboard .dashboard-navbar {
+ width: 100vw;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.dashboard .dashboard-navbar .org-visibility .label {
+ margin-left: 5px;
+}
+
+.dashboard .dashboard-navbar .ui.dropdown {
+ max-width: 100%;
+}
+
+@media (max-width: 767px) {
+ .dashboard .dashboard-navbar .ui.dropdown > .menu {
+ position: static;
+ }
+}
+
+.feeds .news li {
+ display: flex;
+ align-items: baseline;
+ margin-top: 0.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.feeds .news li img {
+ align-self: flex-start;
+}
+
+.feeds .news li > * + * {
+ margin-left: 0.35rem;
+}
+
+.feeds .news > .ui.grid {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.feeds .news .left .ui.avatar {
+ margin-top: 13px;
+}
+
+.feeds .news .time-since {
+ font-size: 13px;
+}
+
+.feeds .news .issue.title {
+ width: 80%;
+ margin: 0 0 1em;
+}
+
+.feeds .news .push.news .content ul {
+ line-height: 18px;
+ font-size: 13px;
+ list-style: none;
+ padding-left: 10px;
+}
+
+.feeds .news .push.news .content ul .text.truncate {
+ width: 80%;
+}
+
+.feeds .news .commit-id {
+ font-family: var(--fonts-monospace);
+}
+
+.feeds .news code {
+ padding: 2px 4px;
+ border-radius: 3px;
+ background-color: var(--color-markup-code-block);
+ word-break: break-all;
+}
+
+.feeds .news:last-of-type .divider {
+ display: none !important;
+}
+
+.feeds .list ul {
+ list-style: none;
+ margin: 0;
+ padding-left: 0;
+}
+
+.feeds .list ul li:not(:last-child) {
+ border-bottom: 1px solid var(--color-secondary);
+}
+
+.feeds .list ul li.private {
+ background-color: var(--color-box-body-highlight);
+}
+
+.feeds .list ul li .repo-list-link {
+ padding: 6px 1em;
+ display: block;
+}
+
+.feeds .list ul li .repo-list-link .svg {
+ color: var(--color-text-light-2);
+}
+
+.feeds .list ul li .repo-list-link .star-num {
+ font-size: 12px;
+}
+
+.feeds .list #privateFilterCheckbox .svg {
+ color: var(--color-grey);
+ margin-right: 0.25rem;
+}
+
+.feeds .list .repo-owner-name-list .item-name {
+ min-width: 0;
+}
+
+.feeds .list .repo-owner-name-list .item-name svg {
+ min-width: 16px;
+}
diff --git a/web_src/less/_editor.less b/web_src/css/editor.css
similarity index 100%
rename from web_src/less/_editor.less
rename to web_src/css/editor.css
diff --git a/web_src/css/explore.css b/web_src/css/explore.css
new file mode 100644
index 0000000000000..8543702252470
--- /dev/null
+++ b/web_src/css/explore.css
@@ -0,0 +1,88 @@
+.explore .navbar {
+ justify-content: center;
+ margin-bottom: 15px !important;
+ background-color: var(--color-navbar) !important;
+ border-width: 1px !important;
+}
+
+.explore .navbar .svg {
+ width: 16px;
+ text-align: center;
+ margin-right: 5px;
+}
+
+.ui.repository.list .item {
+ padding-bottom: 1.5rem;
+}
+
+.ui.repository.list .item:not(:first-child) {
+ border-top: 1px solid var(--color-secondary);
+ padding-top: 1.5rem;
+}
+
+.ui.repository.list .item .ui.header {
+ font-size: 1.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.ui.repository.list .item .ui.header .name {
+ word-break: break-all;
+}
+
+.ui.repository.list .item .ui.header .metas {
+ font-size: 14px;
+}
+
+.ui.repository.list .item .time {
+ font-size: 12px;
+}
+
+.ui.repository.list .item .ui.tags {
+ margin-bottom: 0.5rem;
+}
+
+.ui.repository.branches .info {
+ font-size: 12px;
+ color: var(--color-text-light);
+ display: flex;
+ white-space: pre;
+}
+
+.ui.repository.branches .info .commit-message {
+ max-width: 72em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.ui.repository.branches .overflow-visible {
+ overflow: visible;
+}
+
+/* fix alignment of PR popup in branches table */
+.ui.repository.branches table .ui.popup {
+ text-align: left;
+}
+
+.ui.user.list .item {
+ padding-bottom: 25px;
+ display: flex;
+}
+
+.ui.user.list .item:not(:first-child) {
+ border-top: 1px solid var(--color-secondary);
+ padding-top: 25px;
+}
+
+.ui.user.list .item img.ui.avatar {
+ width: 40px;
+ height: 40px;
+ margin-right: 10px;
+}
+
+.ui.user.list .item .description {
+ margin-top: 5px;
+}
+
+.ui.user.list .item .description .svg:not(:first-child) {
+ margin-left: 5px;
+}
diff --git a/web_src/less/features/codeeditor.less b/web_src/css/features/codeeditor.css
similarity index 100%
rename from web_src/less/features/codeeditor.less
rename to web_src/css/features/codeeditor.css
diff --git a/web_src/less/features/dropzone.less b/web_src/css/features/dropzone.css
similarity index 75%
rename from web_src/less/features/dropzone.less
rename to web_src/css/features/dropzone.css
index ee7a5f1b65d44..0ce067ef30ec7 100644
--- a/web_src/less/features/dropzone.less
+++ b/web_src/css/features/dropzone.css
@@ -1,15 +1,14 @@
-.ui .field {
- .dropzone {
- border: 2px dashed var(--color-secondary);
- background: none;
- box-shadow: none;
- padding: 0;
- border-radius: 4px;
- min-height: 0;
- .dz-message {
- margin: 10px 0;
- }
- }
+.ui .field .dropzone {
+ border: 2px dashed var(--color-secondary);
+ background: none;
+ box-shadow: none;
+ padding: 0;
+ border-radius: 4px;
+ min-height: 0;
+}
+
+.ui .field .dropzone .dz-message {
+ margin: 10px 0;
}
.dropzone .dz-button {
@@ -50,5 +49,5 @@
}
.dropzone .dz-preview:hover .dz-image img {
- filter: opacity(.5) !important;
+ filter: opacity(0.5) !important;
}
diff --git a/web_src/css/features/gitgraph.css b/web_src/css/features/gitgraph.css
new file mode 100644
index 0000000000000..f7477997fe0f2
--- /dev/null
+++ b/web_src/css/features/gitgraph.css
@@ -0,0 +1,317 @@
+#git-graph-container {
+ overflow-x: auto;
+ width: 100%;
+ min-height: 350px;
+}
+
+#git-graph-container > .ui.segment.loading {
+ border: 0;
+ z-index: 1;
+ min-height: 246px;
+}
+
+#git-graph-container h2 {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+#git-graph-container .color-buttons {
+ margin-right: 0;
+}
+
+#git-graph-container .ui.header.dividing {
+ padding-bottom: 10px;
+}
+
+#git-graph-container #flow-select-refs-dropdown {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ min-width: 250px;
+ border-right: none;
+}
+
+#git-graph-container #flow-select-refs-dropdown .ui.label {
+ max-width: 180px;
+ display: inline-flex !important;
+ align-items: center;
+}
+
+#git-graph-container #flow-select-refs-dropdown .ui.label .truncate {
+ display: inline-block;
+ max-width: 140px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ vertical-align: top;
+ white-space: nowrap;
+}
+
+#git-graph-container #flow-select-refs-dropdown .dropdown.icon {
+ display: none;
+}
+
+#git-graph-container #flow-select-refs-dropdown .default.text {
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+
+#git-graph-container #flow-select-refs-dropdown input.search {
+ position: relative;
+ top: 1px;
+}
+
+#git-graph-container li {
+ list-style-type: none;
+ height: 24px;
+ line-height: 24px;
+ white-space: nowrap;
+ display: flex;
+ align-items: center;
+}
+
+#git-graph-container li .node-relation {
+ font-family: var(--fonts-monospace);
+}
+
+#git-graph-container li .author {
+ color: var(--color-text-light);
+}
+
+#git-graph-container li .time {
+ color: var(--color-text-light-3);
+ font-size: 80%;
+}
+
+#git-graph-container li a:not(.ui):hover {
+ text-decoration: underline;
+}
+
+#git-graph-container li a em {
+ color: var(--color-red);
+ border-bottom: 1px dotted var(--color-secondary);
+ text-decoration: none;
+ font-style: normal;
+}
+
+#git-graph-container #rel-container {
+ max-width: 30%;
+ overflow-x: auto;
+ float: left;
+}
+
+#git-graph-container #rev-container {
+ width: 100%;
+}
+
+#git-graph-container #rev-list {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+}
+
+#git-graph-container #rev-list li.highlight.hover {
+ background-color: var(--color-secondary-alpha-30);
+}
+
+#git-graph-container #rev-list .tags a.button {
+ padding: 2px 4px;
+}
+
+#git-graph-container #rev-list .sha.label {
+ padding-top: 5px;
+ padding-bottom: 3px;
+}
+
+#git-graph-container #rev-list .sha.label .shortsha {
+ padding-top: 0;
+}
+
+#git-graph-container #rev-list .sha.label .shortsha-pad {
+ padding-right: 10px;
+}
+
+#git-graph-container #rev-list .sha.label .ui.detail.icon.button {
+ padding-top: 3px;
+ margin-top: -5px;
+ padding-bottom: 1px;
+}
+
+#git-graph-container #rev-list .author img.ui.avatar {
+ width: auto;
+ height: 18px;
+ max-width: none;
+}
+
+#git-graph-container #graph-raw-list {
+ margin: 0;
+}
+
+#git-graph-container.monochrome #rel-container .flow-group {
+ stroke: var(--color-secondary-dark-5);
+ fill: var(--color-secondary-dark-5);
+}
+
+#git-graph-container.monochrome #rel-container .flow-group.highlight {
+ stroke: var(--color-secondary-dark-12);
+ fill: var(--color-secondary-dark-12);
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-1 {
+ stroke: #499a37;
+ fill: #499a37;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-2 {
+ stroke: #ce4751;
+ fill: #ce4751;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-3 {
+ stroke: #8f9121;
+ fill: #8f9121;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-4 {
+ stroke: #ac32a6;
+ fill: #ac32a6;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-5 {
+ stroke: #7445e9;
+ fill: #7445e9;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-6 {
+ stroke: #c67d28;
+ fill: #c67d28;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-7 {
+ stroke: #4db392;
+ fill: #4db392;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-8 {
+ stroke: #aa4d30;
+ fill: #aa4d30;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-9 {
+ stroke: #2a6f84;
+ fill: #2a6f84;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-10 {
+ stroke: #c45327;
+ fill: #c45327;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-11 {
+ stroke: #3d965c;
+ fill: #3d965c;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-12 {
+ stroke: #792a93;
+ fill: #792a93;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-13 {
+ stroke: #439d73;
+ fill: #439d73;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-14 {
+ stroke: #103aad;
+ fill: #103aad;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-15 {
+ stroke: #982e85;
+ fill: #982e85;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.flow-color-16-0 {
+ stroke: #7db233;
+ fill: #7db233;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-1 {
+ stroke: #5ac144;
+ fill: #5ac144;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-2 {
+ stroke: #ed5a8b;
+ fill: #ed5a8b;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-3 {
+ stroke: #ced049;
+ fill: #ced048;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-4 {
+ stroke: #db61d7;
+ fill: #db62d6;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-5 {
+ stroke: #8455f9;
+ fill: #8455f9;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-6 {
+ stroke: #e6a151;
+ fill: #e6a151;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-7 {
+ stroke: #44daaa;
+ fill: #44daaa;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-8 {
+ stroke: #dd7a5c;
+ fill: #dd7a5c;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-9 {
+ stroke: #38859c;
+ fill: #38859c;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-10 {
+ stroke: #d95520;
+ fill: #d95520;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-11 {
+ stroke: #42ae68;
+ fill: #42ae68;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-12 {
+ stroke: #9126b5;
+ fill: #9126b5;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-13 {
+ stroke: #4ab080;
+ fill: #4ab080;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-14 {
+ stroke: #284fb8;
+ fill: #284fb8;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-15 {
+ stroke: #971c80;
+ fill: #971c80;
+}
+
+#git-graph-container:not(.monochrome) #rel-container .flow-group.highlight.flow-color-16-0 {
+ stroke: #87ca28;
+ fill: #87ca28;
+}
diff --git a/web_src/css/features/heatmap.css b/web_src/css/features/heatmap.css
new file mode 100644
index 0000000000000..d0cd2b5734a54
--- /dev/null
+++ b/web_src/css/features/heatmap.css
@@ -0,0 +1,68 @@
+#user-heatmap {
+ width: 100%;
+ font-size: 9px;
+ position: relative;
+ min-height: 125px;
+}
+
+#user-heatmap text {
+ fill: currentcolor !important;
+}
+
+/* for the "Less" and "More" legend */
+#user-heatmap .vch__legend .vch__legend {
+ display: flex;
+ font-size: 11px;
+ align-items: center;
+ justify-content: right;
+}
+
+#user-heatmap .vch__legend .vch__legend div:first-child,
+#user-heatmap .vch__legend .vch__legend div:last-child {
+ display: inline-block;
+ padding: 0 5px;
+}
+
+/* move the "? contributions in the last ? months" text from top to bottom */
+#user-heatmap .total-contributions {
+ font-size: 11px;
+ position: absolute;
+ bottom: 0;
+ left: 25px;
+}
+
+@media (max-width: 1200px) {
+ #user-heatmap {
+ min-height: 105px;
+ }
+ #user-heatmap .total-contributions {
+ left: 21px;
+ }
+}
+
+@media (max-width: 1000px) {
+ #user-heatmap {
+ min-height: 80px;
+ }
+ #user-heatmap .total-contributions {
+ font-size: 10px;
+ left: 17px;
+ bottom: -4px;
+ }
+}
+
+.user.profile #user-heatmap {
+ min-height: 135px;
+}
+
+@media (max-width: 1200px) {
+ .user.profile #user-heatmap {
+ min-height: 115px;
+ }
+}
+
+@media (max-width: 1000px) {
+ .user.profile #user-heatmap {
+ min-height: 90px;
+ }
+}
diff --git a/web_src/css/features/imagediff.css b/web_src/css/features/imagediff.css
new file mode 100644
index 0000000000000..f796bc19aea2b
--- /dev/null
+++ b/web_src/css/features/imagediff.css
@@ -0,0 +1,107 @@
+.image-diff-container {
+ text-align: center;
+ padding: 1em 0;
+}
+
+.image-diff-container img {
+ border: 1px solid var(--color-primary-light-7);
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAG0lEQVQYlWN4+vTpf3SMDTAMBYXYBLFpHgoKAeiOf0SGE9kbAAAAAElFTkSuQmCC") right bottom var(--color-primary-light-7);
+}
+
+.image-diff-container .before-container {
+ border: 1px solid var(--color-red);
+ display: block;
+}
+
+.image-diff-container .after-container {
+ border: 1px solid var(--color-green);
+ display: block;
+}
+
+.image-diff-container .diff-side-by-side .side {
+ display: inline-block;
+ line-height: 0;
+ vertical-align: top;
+ margin: 0 1em;
+}
+
+.image-diff-container .diff-side-by-side .side .side-header {
+ font-weight: bold;
+}
+
+.image-diff-container .diff-swipe {
+ margin: auto;
+}
+
+.image-diff-container .diff-swipe .swipe-frame {
+ position: absolute;
+}
+
+.image-diff-container .diff-swipe .swipe-frame .before-container {
+ position: absolute;
+}
+
+.image-diff-container .diff-swipe .swipe-frame .swipe-container {
+ position: absolute;
+ right: 0;
+ display: block;
+ border-left: 2px solid var(--color-secondary-dark-8);
+ height: 100%;
+ overflow: hidden;
+}
+
+.image-diff-container
+ .diff-swipe
+ .swipe-frame
+ .swipe-container
+ .after-container {
+ position: absolute;
+ right: 0;
+}
+
+.image-diff-container .diff-swipe .swipe-frame .swipe-bar {
+ position: absolute;
+ height: 100%;
+ top: 0;
+ left: 0;
+}
+
+.image-diff-container .diff-swipe .swipe-frame .swipe-bar .handle {
+ background: var(--color-secondary-dark-8);
+ left: -5px;
+ height: 12px;
+ width: 12px;
+ position: absolute;
+ transform: rotate(45deg);
+ box-sizing: border-box;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+}
+
+.image-diff-container .diff-swipe .swipe-frame .swipe-bar .top-handle {
+ top: -12px;
+}
+
+.image-diff-container .diff-swipe .swipe-frame .swipe-bar .bottom-handle {
+ bottom: -14px;
+}
+
+.image-diff-container .diff-overlay {
+ margin: 0 auto;
+}
+
+.image-diff-container .diff-overlay .overlay-frame {
+ margin: 0 auto;
+ position: relative;
+}
+
+.image-diff-container .diff-overlay .before-container,
+.image-diff-container .diff-overlay .after-container {
+ position: absolute;
+}
+
+.image-diff-container .diff-overlay input {
+ max-width: 300px;
+}
diff --git a/web_src/less/features/projects.less b/web_src/css/features/projects.css
similarity index 67%
rename from web_src/less/features/projects.less
rename to web_src/css/features/projects.css
index cbdb1a3c9f750..2bc68ccf0dc16 100644
--- a/web_src/less/features/projects.less
+++ b/web_src/css/features/projects.css
@@ -3,14 +3,14 @@
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
- margin: 0 .5em;
+ margin: 0 0.5em;
}
.board-column {
background-color: var(--color-project-board-bg) !important;
border: 1px solid var(--color-secondary) !important;
- margin: 0 .5rem !important;
- padding: .5rem !important;
+ margin: 0 0.5rem !important;
+ padding: 0.5rem !important;
width: 320px;
height: calc(100vh - 450px);
min-height: 60vh;
@@ -24,21 +24,22 @@
.board-column-header {
display: flex;
justify-content: space-between;
+}
- &.dark-label {
- color: var(--color-project-board-dark-label) !important;
+.board-column-header.dark-label {
+ color: var(--color-project-board-dark-label) !important;
+}
- .board-label {
- color: var(--color-project-board-dark-label) !important;
- }
- }
- &.light-label {
- color: var(--color-project-board-light-label) !important;
+.board-column-header.dark-label .board-label {
+ color: var(--color-project-board-dark-label) !important;
+}
+
+.board-column-header.light-label {
+ color: var(--color-project-board-light-label) !important;
+}
- .board-label {
- color: var(--color-project-board-light-label) !important;
- }
- }
+.board-column-header.light-label .board-label {
+ color: var(--color-project-board-light-label) !important;
}
.board-label {
@@ -81,7 +82,7 @@
border-radius: 5px !important;
cursor: move;
width: calc(100% - 4px) !important;
- padding: .5rem !important;
+ padding: 0.5rem !important;
min-height: auto !important;
}
@@ -124,24 +125,23 @@
.color-field .minicolors.minicolors-theme-default {
display: block;
+}
- .minicolors-input {
- height: 38px;
- padding-left: 2rem;
- }
+.color-field .minicolors.minicolors-theme-default .minicolors-input {
+ height: 38px;
+ padding-left: 2rem;
+}
- .minicolors-swatch {
- top: 10px;
- }
+.color-field .minicolors.minicolors-theme-default .minicolors-swatch {
+ top: 10px;
}
-.edit-project-board,
-.new-board-modal {
- .color.picker.column {
- display: flex;
+.edit-project-board .color.picker.column,
+.new-board-modal .color.picker.column {
+ display: flex;
+}
- .minicolors {
- flex: 1;
- }
- }
+.edit-project-board .color.picker.column .minicolors,
+.new-board-modal .color.picker.column .minicolors {
+ flex: 1;
}
diff --git a/web_src/css/font_i18n.css b/web_src/css/font_i18n.css
new file mode 100644
index 0000000000000..e3de90653202f
--- /dev/null
+++ b/web_src/css/font_i18n.css
@@ -0,0 +1,393 @@
+:root :lang(ja) {
+ --fonts-override: var(--fonts-default-override-ja);
+}
+
+:root :lang(zh-CN) {
+ --fonts-override: var(--fonts-default-override-zh-cn);
+}
+
+:root :lang(zh-TW) {
+ --fonts-override: var(--fonts-default-override-zh-tw);
+}
+
+:root :lang(zh-HK) {
+ --fonts-override: var(--fonts-default-override-zh-hk);
+}
+
+:root :lang(ko) {
+ --fonts-override: var(--fonts-default-override-ko);
+}
+
+[lang] {
+ font-family: var(--fonts-regular);
+}
+
+:root {
+ --fonts-default-override-ja: system-ui-ja, var(--fonts-proportional);
+ --fonts-default-override-zh-cn: system-ui-zh-cn, var(--fonts-proportional);
+ --fonts-default-override-zh-tw: system-ui-zh-tw, var(--fonts-proportional);
+ --fonts-default-override-zh-hk: system-ui-zh-hk, var(--fonts-proportional);
+ --fonts-default-override-ko: system-ui-ko, var(--fonts-proportional);
+}
+
+/* Special handling for Firefox on Windows/Linux */
+@supports (-moz-appearance: none) {
+ :root {
+ --fonts-default-override-ja: var(--fonts-proportional), system-ui-ja;
+ --fonts-default-override-zh-cn: var(--fonts-proportional), system-ui-zh-cn;
+ --fonts-default-override-zh-tw: var(--fonts-proportional), system-ui-zh-tw;
+ --fonts-default-override-zh-hk: var(--fonts-proportional), system-ui-zh-hk;
+ --fonts-default-override-ko: var(--fonts-proportional), system-ui-ko;
+ }
+}
+
+@font-face {
+ font-family: system-ui-ja;
+ src: local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN W3"),
+ local("HiraginoSans-W2"), local("Source Han Sans JP Light"),
+ local("SourceHanSansJP-Light"), local("Source Han Sans J Light"),
+ local("SourceHanSansJ-Light"), local("Noto Sans CJK JP Light"),
+ local("NotoSansCJKJP-Light"), local("Source Han Sans Light"),
+ local("SourceHanSans-Light"), local("Yu Gothic Regular"),
+ local("YuGothic Regular"), local("Droid Sans Japanese"), local("Meiryo"),
+ local("MS PGothic");
+ font-weight: 300;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-ja;
+ src: local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN W3"),
+ local("HiraginoSans-W4"), local("Source Han Sans JP Regular"),
+ local("SourceHanSansJP-Regular"), local("Source Han Sans J Regular"),
+ local("SourceHanSansJ-Regular"), local("Noto Sans CJK JP Regular"),
+ local("NotoSansCJKJP-Regular"), local("Source Han Sans Regular"),
+ local("SourceHanSans-Regular"), local("Yu Gothic Medium"),
+ local("YuGothic Medium"), local("Droid Sans Japanese"), local("Meiryo"),
+ local("MS PGothic");
+ font-weight: 400;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-ja;
+ src: local("HiraKakuProN-W3"), local("Hiragino Kaku Gothic ProN W3"),
+ local("HiraginoSans-W5"), local("Source Han Sans JP Medium"),
+ local("SourceHanSansJP-Medium"), local("Source Han Sans J Medium"),
+ local("SourceHanSansJ-Medium"), local("Noto Sans CJK JP Medium"),
+ local("NotoSansCJKJP-Medium"), local("Source Han Sans Medium"),
+ local("SourceHanSans-Medium"), local("Yu Gothic Medium"),
+ local("YuGothic Medium"), local("Droid Sans Japanese"), local("Meiryo"),
+ local("MS PGothic");
+ font-weight: 500;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-ja;
+ src: local("HiraKakuProN-W6"), local("Hiragino Kaku Gothic ProN W6"),
+ local("HiraginoSans-W6"), local("Source Han Sans JP Bold"),
+ local("SourceHanSansJP-Bold"), local("Source Han Sans J Bold"),
+ local("SourceHanSansJ-Bold"), local("Noto Sans CJK JP Bold"),
+ local("NotoSansCJKJP-Bold"), local("Source Han Sans Bold"),
+ local("SourceHanSans-Bold"), local("Yu Gothic Bold"), local("YuGothic Bold"),
+ local("Droid Sans Japanese"), local("Meiryo Bold"), local("MS PGothic");
+ font-weight: 700;
+ 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????;
+}
+
+/* Safari on macOS/iOS */
+@font-face {
+ font-family: system-ui-ja;
+ src: local("HelveticaNeue");
+ unicode-range: U+A0;
+}
+
+/* Other browsers on macOS/iOS */
+@supports not (-webkit-hyphens: none) {
+ @font-face {
+ font-family: system-ui-ja;
+ src: local("HelveticaNeue");
+ unicode-range: U+20;
+ }
+}
+
+@font-face {
+ font-family: system-ui-zh-cn;
+ src: local("PingFangSC-Light"), local("Source Han Sans CN Light"),
+ local("SourceHanSansCN-Light"), local("Source Han Sans SC Light"),
+ local("SourceHanSansSC-Light"), local("Noto Sans CJK SC Light"),
+ local("NotoSansCJKSC-Light"), local("HiraginoSansGB-W3"),
+ local("Hiragino Sans GB W3"), local("Microsoft YaHei Light"),
+ local("Heiti SC Light"), local("SimHei");
+ font-weight: 300;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-cn;
+ src: local("PingFangSC-Regular"), local("Source Han Sans CN Regular"),
+ local("SourceHanSansCN-Regular"), local("Source Han Sans SC Regular"),
+ local("SourceHanSansSC-Regular"), local("Noto Sans CJK SC Regular"),
+ local("NotoSansCJKSC-Regular"), local("HiraginoSansGB-W3"),
+ local("Hiragino Sans GB W3"), local("Microsoft YaHei"),
+ local("Heiti SC Light"), local("SimHei");
+ font-weight: 400;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-cn;
+ src: local("PingFangSC-Medium"), local("Source Han Sans CN Medium"),
+ local("SourceHanSansCN-Medium"), local("Source Han Sans SC Medium"),
+ local("SourceHanSansSC-Medium"), local("Noto Sans CJK SC Medium"),
+ local("NotoSansCJKSC-Medium"), local("HiraginoSansGB-W3"),
+ local("Hiragino Sans GB W3"), local("Microsoft YaHei"),
+ local("Heiti SC Light"), local("SimHei");
+ font-weight: 500;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-cn;
+ src: local("PingFangSC-Semibold"), local("Source Han Sans CN Bold"),
+ local("SourceHanSansCN-Bold"), local("Source Han Sans SC Bold"),
+ local("SourceHanSansSC-Bold"), local("Noto Sans CJK SC Bold"),
+ local("NotoSansCJKSC-Bold"), local("HiraginoSansGB-W6"),
+ local("Hiragino Sans GB W6"), local("Microsoft YaHei Bold"),
+ local("Heiti SC Medium"), local("SimHei");
+ font-weight: 700;
+ 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????;
+}
+
+/* Safari on macOS/iOS */
+@font-face {
+ font-family: system-ui-zh-cn;
+ src: local("HelveticaNeue");
+ unicode-range: U+A0;
+}
+
+/* Other browsers on macOS/iOS */
+@supports not (-webkit-hyphens: none) {
+ @font-face {
+ font-family: system-ui-zh-cn;
+ src: local("HelveticaNeue");
+ unicode-range: U+20;
+ }
+}
+
+@font-face {
+ font-family: system-ui-zh-tw;
+ src: local("PingFangTC-Light"), local("Source Han Sans TW Light"),
+ local("SourceHanSansTW-Light"), local("Source Han Sans TC Light"),
+ local("SourceHanSansTC-Light"), local("Noto Sans CJK TC Light"),
+ local("NotoSansCJKTC-Light"), local("HiraginoSansTC-W3"),
+ local("Hiragino Sans TC W3"), local("Microsoft JhengHei Light"),
+ local("Heiti TC Light"), local("PMingLiU");
+ font-weight: 300;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-tw;
+ src: local("PingFangTC-Regular"), local("Source Han Sans TW Regular"),
+ local("SourceHanSansTW-Regular"), local("Source Han Sans TC Regular"),
+ local("SourceHanSansTC-Regular"), local("Noto Sans CJK TC Regular"),
+ local("NotoSansCJKTC-Regular"), local("HiraginoSansTC-W3"),
+ local("Hiragino Sans TC W3"), local("Microsoft JhengHei"),
+ local("Heiti TC Light"), local("PMingLiU");
+ font-weight: 400;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-tw;
+ src: local("PingFangTC-Medium"), local("Source Han Sans TW Medium"),
+ local("SourceHanSansTW-Medium"), local("Source Han Sans TC Medium"),
+ local("SourceHanSansTC-Medium"), local("Noto Sans CJK TC Medium"),
+ local("NotoSansCJKTC-Medium"), local("HiraginoSansTC-W3"),
+ local("Hiragino Sans TC W3"), local("Microsoft JhengHei"),
+ local("Heiti TC Light"), local("PMingLiU");
+ font-weight: 500;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-tw;
+ src: local("PingFangTC-Semibold"), local("Source Han Sans TW Bold"),
+ local("SourceHanSansTW-Bold"), local("Source Han Sans TC Bold"),
+ local("SourceHanSansTC-Bold"), local("Noto Sans CJK TC Bold"),
+ local("NotoSansCJKTC-Bold"), local("HiraginoSansTC-W6"),
+ local("Hiragino Sans TC W6"), local("Microsoft JhengHei Bold"),
+ local("Heiti TC Medium"), local("PMingLiU");
+ font-weight: 700;
+ 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????;
+}
+
+/* Safari on macOS/iOS */
+@font-face {
+ font-family: system-ui-zh-tw;
+ src: local("HelveticaNeue");
+ unicode-range: U+A0;
+}
+
+/* Other browsers on macOS/iOS */
+@supports not (-webkit-hyphens: none) {
+ @font-face {
+ font-family: system-ui-zh-tw;
+ src: local("HelveticaNeue");
+ unicode-range: U+20;
+ }
+}
+
+@font-face {
+ font-family: system-ui-zh-hk;
+ src: local("PingFangHK-Light"), local("Source Han Sans HK Light"),
+ local("SourceHanSansHK-Light"), local("Source Han Sans HC Light"),
+ local("SourceHanSansHC-Light"), local("Noto Sans CJK HK Light"),
+ local("NotoSansCJKHK-Light"), local("Source Han Sans TC Light"),
+ local("SourceHanSansTC-Light"), local("Noto Sans CJK TC Light"),
+ local("NotoSansCJKTC-Light"), local("HiraginoSansTC-W3"),
+ local("Hiragino Sans TC W3"), local("Microsoft JhengHei Light"),
+ local("Heiti TC Light"), local("PMingLiU_HKSCS"), local("PMingLiU");
+ font-weight: 300;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-hk;
+ src: local("PingFangHK-Regular"), local("Source Han Sans HK Regular"),
+ local("SourceHanSansHK-Regular"), local("Source Han Sans HC Regular"),
+ local("SourceHanSansHC-Regular"), local("Noto Sans CJK HK Regular"),
+ local("NotoSansCJKHK-Regular"), local("Source Han Sans TC Regular"),
+ local("SourceHanSansTC-Regular"), local("Noto Sans CJK TC Regular"),
+ local("NotoSansCJKTC-Regular"), local("HiraginoSansTC-W3"),
+ local("Hiragino Sans TC W3"), local("Microsoft JhengHei"),
+ local("Heiti TC Light"), local("PMingLiU_HKSCS"), local("PMingLiU");
+ font-weight: 400;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-hk;
+ src: local("PingFangHK-Medium"), local("Source Han Sans HK Medium"),
+ local("SourceHanSansHK-Medium"), local("Source Han Sans HC Medium"),
+ local("SourceHanSansHC-Medium"), local("Noto Sans CJK HK Medium"),
+ local("NotoSansCJKHK-Medium"), local("Source Han Sans TC Medium"),
+ local("SourceHanSansTC-Medium"), local("Noto Sans CJK TC Medium"),
+ local("NotoSansCJKTC-Medium"), local("HiraginoSansTC-W3"),
+ local("Hiragino Sans TC W3"), local("Microsoft JhengHei"),
+ local("Heiti TC Light"), local("PMingLiU_HKSCS"), local("PMingLiU");
+ font-weight: 500;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-zh-hk;
+ src: local("PingFangHK-Semibold"), local("Source Han Sans HK Bold"),
+ local("SourceHanSansHK-Bold"), local("Source Han Sans HC Bold"),
+ local("SourceHanSansHC-Bold"), local("Noto Sans CJK HK Bold"),
+ local("NotoSansCJKHK-Bold"), local("Source Han Sans TC Bold"),
+ local("SourceHanSansTC-Bold"), local("Noto Sans CJK TC Bold"),
+ local("NotoSansCJKTC-Bold"), local("HiraginoSansTC-W6"),
+ local("Hiragino Sans TC W6"), local("Microsoft JhengHei Bold"),
+ local("Heiti TC Medium"), local("PMingLiU_HKSCS"), local("PMingLiU");
+ font-weight: 700;
+ 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????;
+}
+
+/* Safari on macOS/iOS */
+@font-face {
+ font-family: system-ui-zh-hk;
+ src: local("HelveticaNeue");
+ unicode-range: U+A0;
+}
+
+/* Other browsers on macOS/iOS */
+@supports not (-webkit-hyphens: none) {
+ @font-face {
+ font-family: system-ui-zh-hk;
+ src: local("HelveticaNeue");
+ unicode-range: U+20;
+ }
+}
+
+@font-face {
+ font-family: system-ui-ko;
+ src: local("AppleSDGothicNeo-Light"), local("Source Han Sans KR Light"),
+ local("SourceHanSansKR-Light"), local("Source Han Sans K Light"),
+ local("SourceHanSansK-Light"), local("Noto Sans CJK KR Light"),
+ local("NotoSansCJKKR-Light"), local("NanumBarunGothic Light"),
+ local("Malgun Gothic Semilight"), local("Nanum Gothic"), local("Dotum");
+ font-weight: 300;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-ko;
+ src: local("AppleSDGothicNeo-Regular"), local("Source Han Sans KR Regular"),
+ local("SourceHanSansKR-Regular"), local("Source Han Sans K Regular"),
+ local("SourceHanSansK-Regular"), local("Noto Sans CJK KR Regular"),
+ local("NotoSansCJKKR-Regular"), local("NanumBarunGothic"),
+ local("Malgun Gothic"), local("Nanum Gothic"), local("Dotum");
+ font-weight: 400;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-ko;
+ src: local("AppleSDGothicNeo-Medium"), local("Source Han Sans KR Medium"),
+ local("SourceHanSansKR-Medium"), local("Source Han Sans K Medium"),
+ local("SourceHanSansK-Medium"), local("Noto Sans CJK KR Medium"),
+ local("NotoSansCJKKR-Medium"), local("NanumBarunGothic"),
+ local("Malgun Gothic"), local("Nanum Gothic"), local("Dotum");
+ font-weight: 500;
+ 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????;
+}
+
+@font-face {
+ font-family: system-ui-ko;
+ src: local("AppleSDGothicNeo-SemiBold"), local("Source Han Sans KR Bold"),
+ local("SourceHanSansKR-Bold"), local("Source Han Sans K Bold"),
+ local("SourceHanSansK-Bold"), local("Noto Sans CJK KR Bold"),
+ local("NotoSansCJKKR-Bold"), local("NanumBarunGothic Bold"),
+ local("Malgun Gothic Bold"), local("Nanum Gothic Bold"), local("Dotum");
+ font-weight: 700;
+ 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????;
+}
+
+/* Safari on macOS/iOS */
+@font-face {
+ font-family: system-ui-ko;
+ src: local("HelveticaNeue");
+ unicode-range: U+A0;
+}
+
+/* Other browsers on macOS/iOS */
+@supports not (-webkit-hyphens: none) {
+ @font-face {
+ font-family: system-ui-ko;
+ src: local("HelveticaNeue");
+ unicode-range: U+20;
+ }
+}
diff --git a/web_src/css/form.css b/web_src/css/form.css
new file mode 100644
index 0000000000000..e325a377f8d8b
--- /dev/null
+++ b/web_src/css/form.css
@@ -0,0 +1,547 @@
+input,
+textarea,
+.ui.input > input,
+.ui.form input:not([type]),
+.ui.form select,
+.ui.form textarea,
+.ui.form input[type="date"],
+.ui.form input[type="datetime-local"],
+.ui.form input[type="email"],
+.ui.form input[type="file"],
+.ui.form input[type="number"],
+.ui.form input[type="password"],
+.ui.form input[type="search"],
+.ui.form input[type="tel"],
+.ui.form input[type="text"],
+.ui.form input[type="time"],
+.ui.form input[type="url"],
+.ui.selection.dropdown,
+.ui.checkbox label::before,
+.ui.checkbox input:checked ~ label::before,
+.ui.checkbox input:not([type="radio"]):indeterminate ~ label::before {
+ background: var(--color-input-background);
+ border-color: var(--color-input-border);
+ color: var(--color-input-text);
+}
+
+input:hover,
+textarea:hover,
+.ui.input input:hover,
+.ui.form input:not([type]):hover,
+.ui.form select:hover,
+.ui.form textarea:hover,
+.ui.form input[type="date"]:hover,
+.ui.form input[type="datetime-local"]:hover,
+.ui.form input[type="email"]:hover,
+.ui.form input[type="file"]:hover,
+.ui.form input[type="number"]:hover,
+.ui.form input[type="password"]:hover,
+.ui.form input[type="search"]:hover,
+.ui.form input[type="tel"]:hover,
+.ui.form input[type="text"]:hover,
+.ui.form input[type="time"]:hover,
+.ui.form input[type="url"]:hover,
+.ui.selection.dropdown:hover,
+.ui.checkbox label:hover::before,
+.ui.checkbox label:active::before,
+.ui.radio.checkbox label::after,
+.ui.radio.checkbox input:focus ~ label::before,
+.ui.radio.checkbox input:checked ~ label::before {
+ background: var(--color-input-background);
+ border-color: var(--color-input-border-hover);
+ color: var(--color-input-text);
+}
+
+input:focus,
+textarea:focus,
+.ui.input input:focus,
+.ui.form input:not([type]):focus,
+.ui.form select:focus,
+.ui.form textarea:focus,
+.ui.form input[type="date"]:focus,
+.ui.form input[type="datetime-local"]:focus,
+.ui.form input[type="email"]:focus,
+.ui.form input[type="file"]:focus,
+.ui.form input[type="number"]:focus,
+.ui.form input[type="password"]:focus,
+.ui.form input[type="search"]:focus,
+.ui.form input[type="tel"]:focus,
+.ui.form input[type="text"]:focus,
+.ui.form input[type="time"]:focus,
+.ui.form input[type="url"]:focus,
+.ui.selection.dropdown:focus,
+.ui.checkbox input:focus ~ label::before,
+.ui.checkbox input:not([type="radio"]):indeterminate:focus ~ label::before,
+.ui.checkbox input:checked:focus ~ label::before,
+.ui.radio.checkbox input:focus:checked ~ label::before {
+ background: var(--color-input-background);
+ border-color: var(--color-primary);
+ color: var(--color-input-text);
+}
+
+.ui.form .field > label,
+.ui.form .inline.fields > label,
+.ui.form .inline.fields .field > label,
+.ui.form .inline.fields .field > p,
+.ui.form .inline.field > label,
+.ui.form .inline.field > p,
+.ui.checkbox label,
+.ui.checkbox + label,
+.ui.checkbox label:hover,
+.ui.checkbox + label:hover,
+.ui.checkbox input:focus ~ label,
+.ui.checkbox input:active ~ label {
+ color: var(--color-text);
+}
+
+.ui.input,
+.ui.checkbox input:focus ~ label::after,
+.ui.checkbox input:checked ~ label::after,
+.ui.checkbox label:active::after,
+.ui.checkbox input:not([type="radio"]):indeterminate ~ label::after,
+.ui.checkbox input:not([type="radio"]):indeterminate:focus ~ label::after,
+.ui.checkbox input:checked:focus ~ label::after,
+.ui.disabled.checkbox label,
+.ui.checkbox input[disabled] ~ label {
+ color: var(--color-input-text);
+}
+
+.ui.radio.checkbox input:focus ~ label::after,
+.ui.radio.checkbox input:checked ~ label::after,
+.ui.radio.checkbox input:focus:checked ~ label::after {
+ background: var(--color-input-text);
+}
+
+.ui.toggle.checkbox label::before {
+ background: var(--color-input-toggle-background);
+}
+
+.ui.toggle.checkbox label,
+.ui.toggle.checkbox input:checked ~ label,
+.ui.toggle.checkbox input:focus:checked ~ label {
+ color: var(--color-text) !important;
+}
+
+.ui.toggle.checkbox input:checked ~ label::before,
+.ui.toggle.checkbox input:focus:checked ~ label::before {
+ background: var(--color-primary) !important;
+}
+
+/* match