Compare commits
	
		
			271 Commits
		
	
	
		
			8e1a01e444
			...
			v1.25.0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					90b618688b | ||
| 
						 | 
					6ddc5057a4 | ||
| 
						 | 
					ceb0fd0b0c | ||
| 
						 | 
					c766a16b08 | ||
| 
						 | 
					77faa2ce63 | ||
| 
						 | 
					4267c98dbe | ||
| 
						 | 
					558f75de42 | ||
| 
						 | 
					6fe0241007 | ||
| 
						 | 
					b790f73fdf | ||
| 
						 | 
					db6ec59a83 | ||
| 
						 | 
					23658a4917 | ||
| 
						 | 
					0e3628863e | ||
| 
						 | 
					d178870ea8 | ||
| 
						 | 
					38874d8b43 | ||
| 
						 | 
					1a5db58b4f | ||
| 
						 | 
					05a4dc4f8a | ||
| 
						 | 
					c5724f41c5 | ||
| 
						 | 
					585c57dec2 | ||
| 
						 | 
					6aff05494e | ||
| 
						 | 
					1eaba74c7e | ||
| 
						 | 
					fe009734d3 | ||
| 
						 | 
					89ec60e412 | ||
| 
						 | 
					1462ac8724 | ||
| 
						 | 
					bd568bb621 | ||
| 
						 | 
					c5e4b50b9b | ||
| 
						 | 
					e1a65d12df | ||
| 
						 | 
					7665219c4c | ||
| 
						 | 
					4fd2006e6a | ||
| 
						 | 
					f7542a9e7f | ||
| 
						 | 
					ec8d12a1fd | ||
| 
						 | 
					d573d00019 | ||
| 
						 | 
					ac8f5fdd24 | ||
| 
						 | 
					99c4de26fd | ||
| 
						 | 
					059edda22e | ||
| 
						 | 
					719d12c4cb | ||
| 
						 | 
					df9722604e | ||
| 
						 | 
					359e83afa5 | ||
| 
						 | 
					163794fbe2 | ||
| 
						 | 
					11e86dc549 | ||
| 
						 | 
					1134c53a63 | ||
| 
						 | 
					5d7a1c53d5 | ||
| 
						 | 
					4632170948 | ||
| 
						 | 
					cd99934334 | ||
| 
						 | 
					4bdbb764ee | ||
| 
						 | 
					ff586c7385 | ||
| 
						 | 
					e4cf7abcdc | ||
| 
						 | 
					5ef97d7fd5 | ||
| 
						 | 
					243cf80a34 | ||
| 
						 | 
					280ebe1ad2 | ||
| 
						 | 
					f41327e42b | ||
| 
						 | 
					987144a594 | ||
| 
						 | 
					2caf68e290 | ||
| 
						 | 
					e2ccc8c9f7 | ||
| 
						 | 
					7287aad198 | ||
| 
						 | 
					b3ce1a8439 | ||
| 
						 | 
					5d96a6896d | ||
| 
						 | 
					ced954c1d0 | ||
| 
						 | 
					bfb27ab4a2 | ||
| 
						 | 
					3a5306b1a6 | ||
| 
						 | 
					6608abc39b | ||
| 
						 | 
					7eeafae4da | ||
| 
						 | 
					89ac2720c7 | ||
| 
						 | 
					472647e7c1 | ||
| 
						 | 
					84a2f5a1ee | ||
| 
						 | 
					e45c73d850 | ||
| 
						 | 
					10d0a3dbd8 | ||
| 
						 | 
					ae9bc3cbb5 | ||
| 
						 | 
					dc0f43a082 | ||
| 
						 | 
					5fb9ef2a61 | ||
| 
						 | 
					247c6fd987 | ||
| 
						 | 
					865642eb3b | ||
| 
						 | 
					392c82fcd5 | ||
| 
						 | 
					02087941f4 | ||
| 
						 | 
					0560aad59e | ||
| 
						 | 
					8e8416507e | ||
| 
						 | 
					1a702c9526 | ||
| 
						 | 
					46c2d46482 | ||
| 
						 | 
					8b15abe30b | ||
| 
						 | 
					9756cbd409 | ||
| 
						 | 
					b529cefd04 | ||
| 
						 | 
					dded6b1948 | ||
| 
						 | 
					5e8f62c79f | ||
| 
						 | 
					9b2a1783ef | ||
| 
						 | 
					6bb138e964 | ||
| 
						 | 
					e387008ee5 | ||
| 
						 | 
					c8634fb14b | ||
| 
						 | 
					fc10a1f54b | ||
| 
						 | 
					f08c7a0c8c | ||
| 
						 | 
					6c0fd14119 | ||
| 
						 | 
					cb49b12ff0 | ||
| 
						 | 
					468a97994a | ||
| 
						 | 
					1986956191 | ||
| 
						 | 
					979af2a756 | ||
| 
						 | 
					a34bd93894 | ||
| 
						 | 
					64684a51da | ||
| 
						 | 
					e89c26e753 | ||
| 
						 | 
					796c6f1519 | ||
| 
						 | 
					f9d63e6fd1 | ||
| 
						 | 
					08f662497b | ||
| 
						 | 
					c4bff9fdc1 | ||
| 
						 | 
					a48963c43d | ||
| 
						 | 
					7366813f02 | ||
| 
						 | 
					dc3047f16a | ||
| 
						 | 
					e0518a2986 | ||
| 
						 | 
					39727c789b | ||
| 
						 | 
					3c21a98fee | ||
| 
						 | 
					9bce3797a6 | ||
| 
						 | 
					9d3e738723 | ||
| 
						 | 
					86ac3b73ba | ||
| 
						 | 
					09a4bbdc07 | ||
| 
						 | 
					68d632a6b3 | ||
| 
						 | 
					2b5962e1c2 | ||
| 
						 | 
					7cd7a48d17 | ||
| 
						 | 
					ebc6463c30 | ||
| 
						 | 
					77c3842a43 | ||
| 
						 | 
					d311072ca0 | ||
| 
						 | 
					8b4102d8d9 | ||
| 
						 | 
					73b5397d77 | ||
| 
						 | 
					134c383cdb | ||
| 
						 | 
					c6e73000bd | ||
| 
						 | 
					dbf3547ad5 | ||
| 
						 | 
					5235dae367 | ||
| 
						 | 
					a9df7a31e1 | ||
| 
						 | 
					dd6e97be1d | ||
| 
						 | 
					29f983cce6 | ||
| 
						 | 
					fca10130a3 | ||
| 
						 | 
					8676816342 | ||
| 
						 | 
					9bcea89fcb | ||
| 
						 | 
					26deec78ff | ||
| 
						 | 
					ffb7fa810b | ||
| 
						 | 
					2083d3026b | ||
| 
						 | 
					5037e46447 | ||
| 
						 | 
					cd2f7579b1 | ||
| 
						 | 
					1b237b12f3 | ||
| 
						 | 
					a8453a87a5 | ||
| 
						 | 
					6aef26cdc8 | ||
| 
						 | 
					a4c94cb34d | ||
| 
						 | 
					8c45f44309 | ||
| 
						 | 
					1c9b02ea88 | ||
| 
						 | 
					61313d5644 | ||
| 
						 | 
					d7722cde2f | ||
| 
						 | 
					e3366a8406 | ||
| 
						 | 
					f6fc6a9702 | ||
| 
						 | 
					12d5636fb7 | ||
| 
						 | 
					10c06dad60 | ||
| 
						 | 
					c80dd09828 | ||
| 
						 | 
					8f2f45406a | ||
| 
						 | 
					c46d9333ff | ||
| 
						 | 
					7039041d9d | ||
| 
						 | 
					9949bdc7bd | ||
| 
						 | 
					1b81b6ad93 | ||
| 
						 | 
					62bc2afa2a | ||
| 
						 | 
					60e873b0e0 | ||
| 
						 | 
					00737f5203 | ||
| 
						 | 
					a90b72896b | ||
| 
						 | 
					f90c488d45 | ||
| 
						 | 
					56c284aec2 | ||
| 
						 | 
					0df107a166 | ||
| 
						 | 
					c5c1ca4a6b | ||
| 
						 | 
					6bbc304a7c | ||
| 
						 | 
					5c95add059 | ||
| 
						 | 
					2efaeead6b | ||
| 
						 | 
					29122e946c | ||
| 
						 | 
					81be016be3 | ||
| 
						 | 
					2ffdf501b3 | ||
| 
						 | 
					9f2e5df49c | ||
| 
						 | 
					00eda68f00 | ||
| 
						 | 
					fc4e6f43bb | ||
| 
						 | 
					1f01495a10 | ||
| 
						 | 
					eae2961989 | ||
| 
						 | 
					563c20f2cc | ||
| 
						 | 
					058e1b89ee | ||
| 
						 | 
					c431fbadb4 | ||
| 
						 | 
					74254a3f80 | ||
| 
						 | 
					8118706706 | ||
| 
						 | 
					ffbfccd7dc | ||
| 
						 | 
					1d8dfdb82b | ||
| 
						 | 
					11422f3b05 | ||
| 
						 | 
					cca5e4e435 | ||
| 
						 | 
					780c72919d | ||
| 
						 | 
					dc4eff2bd7 | ||
| 
						 | 
					3b5a596b2f | ||
| 
						 | 
					41deab68c9 | ||
| 
						 | 
					a4ae937291 | ||
| 
						 | 
					babb174b24 | ||
| 
						 | 
					dca1c34518 | ||
| 
						 | 
					065d7893d8 | ||
| 
						 | 
					0a6770c28e | ||
| 
						 | 
					0825efeb2c | ||
| 
						 | 
					8dcd7cf002 | ||
| 
						 | 
					93e5fa8a7d | ||
| 
						 | 
					8c5020fa09 | ||
| 
						 | 
					35520fb3fc | ||
| 
						 | 
					728673ffcd | ||
| 
						 | 
					f7c1cf430f | ||
| 
						 | 
					c6306a23d4 | ||
| 
						 | 
					f813122573 | ||
| 
						 | 
					603d22d877 | ||
| 
						 | 
					4f4b99a600 | ||
| 
						 | 
					a1cc1509ce | ||
| 
						 | 
					305b2eca0b | ||
| 
						 | 
					f635b30c9c | ||
| 
						 | 
					1434c54ba3 | ||
| 
						 | 
					b9b12e7ed2 | ||
| 
						 | 
					f9755704ec | ||
| 
						 | 
					120d24cb10 | ||
| 
						 | 
					77e2227029 | ||
| 
						 | 
					75fd35480b | ||
| 
						 | 
					0516b19982 | ||
| 
						 | 
					5ac3a3044e | ||
| 
						 | 
					9ccc65ac1c | ||
| 
						 | 
					7921a8872b | ||
| 
						 | 
					596442d2ef | ||
| 
						 | 
					7248f617c4 | ||
| 
						 | 
					6def81fe26 | ||
| 
						 | 
					fa08df8eea | ||
| 
						 | 
					cc44560f96 | ||
| 
						 | 
					4b2916a75b | ||
| 
						 | 
					5116ca5cae | ||
| 
						 | 
					15076d2996 | ||
| 
						 | 
					dc6605d780 | ||
| 
						 | 
					3b0f481be7 | ||
| 
						 | 
					0f8bfe6201 | ||
| 
						 | 
					6421704cda | ||
| 
						 | 
					02ac10ecfc | ||
| 
						 | 
					aa023116ae | ||
| 
						 | 
					a6efed8f03 | ||
| 
						 | 
					98446a9bb3 | ||
| 
						 | 
					7fe76d6444 | ||
| 
						 | 
					ce1bc3b762 | ||
| 
						 | 
					f68ad71ddb | ||
| 
						 | 
					49b08975d2 | ||
| 
						 | 
					ee455ac255 | ||
| 
						 | 
					c6d132ef0a | ||
| 
						 | 
					2cceafe5ce | ||
| 
						 | 
					f74211749d | ||
| 
						 | 
					1c6b7540f3 | ||
| 
						 | 
					186f58815b | ||
| 
						 | 
					9b07108c44 | ||
| 
						 | 
					0ace99a642 | ||
| 
						 | 
					c61d8f1506 | ||
| 
						 | 
					7bc47d0720 | ||
| 
						 | 
					3015ce8696 | ||
| 
						 | 
					0c22591727 | ||
| 
						 | 
					1cc9b20ffd | ||
| 
						 | 
					0a353fd572 | ||
| 
						 | 
					c76a8ba7b6 | ||
| 
						 | 
					1484496dfb | ||
| 
						 | 
					33fbac3c45 | ||
| 
						 | 
					3d34619d79 | ||
| 
						 | 
					7b363e3e9c | ||
| 
						 | 
					e113d1c603 | ||
| 
						 | 
					d2be94ee27 | ||
| 
						 | 
					b4a0c93221 | ||
| 
						 | 
					df6eb8fef8 | ||
| 
						 | 
					a8bcd45791 | ||
| 
						 | 
					94c7f81bbf | ||
| 
						 | 
					59497be05e | ||
| 
						 | 
					bedb8befa7 | ||
| 
						 | 
					5ae1f2f634 | ||
| 
						 | 
					16298f2b11 | ||
| 
						 | 
					b5dc00e853 | ||
| 
						 | 
					ac17e45069 | ||
| 
						 | 
					f65338b227 | ||
| 
						 | 
					711e01b66c | ||
| 
						 | 
					9a070c5726 | ||
| 
						 | 
					77fe50a4cc | ||
| 
						 | 
					0f9ee02a7d | ||
| 
						 | 
					55ac3af9b7 | ||
| 
						 | 
					36a1707b3e | ||
| 
						 | 
					2207d56a4e | 
@@ -11,8 +11,6 @@ indent_style = space
 | 
				
			|||||||
end_of_line = lf
 | 
					end_of_line = lf
 | 
				
			||||||
insert_final_newline = true
 | 
					insert_final_newline = true
 | 
				
			||||||
trim_trailing_whitespace = true
 | 
					trim_trailing_whitespace = true
 | 
				
			||||||
 | 
					 | 
				
			||||||
[*.{css,scss,ts}]
 | 
					 | 
				
			||||||
max_line_length = 120
 | 
					max_line_length = 120
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# documentation, utils
 | 
					# documentation, utils
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					# 开发模式下编译的主题 (开发模式仅编译单个主题)
 | 
				
			||||||
 | 
					DEV_THEME=dark
 | 
				
			||||||
 | 
					# 把编译后的主题上传到服务器的服务器名称, 通过 SCP 上传
 | 
				
			||||||
 | 
					SSH_SERVER=localhost
 | 
				
			||||||
 | 
					# 上传到服务器的用户名称, 不支持密码, 请确保有 SSH 免密登录权限
 | 
				
			||||||
 | 
					SSH_USER=root
 | 
				
			||||||
 | 
					# 上传到服务器的主题路径, 请使用绝对路径
 | 
				
			||||||
 | 
					GITEA_THEME_PATH=/data/gitea/public/assets/css/
 | 
				
			||||||
							
								
								
									
										5
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					.github/* linguist-vendored
 | 
				
			||||||
 | 
					.vscode/* linguist-vendored
 | 
				
			||||||
 | 
					screenshots/* linguist-vendored
 | 
				
			||||||
 | 
					scripts/* linguist-vendored
 | 
				
			||||||
 | 
					eslint.config.js linguist-vendored
 | 
				
			||||||
							
								
								
									
										21
									
								
								.github/CHANGELOG.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					### 🎉
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### ✨ Feature
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### CSS 变量
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌈 Style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### 更符合 GitHub 风格
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🐞 Fix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 📃 English
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### CSS Variable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### More GitHub-like style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```text
 | 
				
			||||||
 | 
					在 English 下方补充上面 Feature 以下部分的内容的中译英
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										91
									
								
								.github/ISSUE_TEMPLATE/1-style-bug-report.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					name: 样式错误报告 ( Style bug report )
 | 
				
			||||||
 | 
					description: 安装主题后出现颜色/位置错误等 ( Color/position errors occur after installing the theme )
 | 
				
			||||||
 | 
					labels: ["style bug"]
 | 
				
			||||||
 | 
					body:
 | 
				
			||||||
 | 
					  - type: markdown
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      value: |
 | 
				
			||||||
 | 
					        1. 请使用最新的主题, 并使用 Ctrl+F5 刷新页面查看 Bug 是否消失 ( Please use the latest theme and refresh the page with Ctrl+F5 to see if the Bug has disappeared )
 | 
				
			||||||
 | 
					        2. 请查看项目根目录下的 CHANGELOG.md 文件, 查看是否有修复该 Bug 的相关描述 ( Please check the CHANGELOG.md file in the project root directory for descriptions of fixes related to this Bug )
 | 
				
			||||||
 | 
					        3. 如果有相关描述, 可以查看 README.md 自己编译开发版本是否修复了该 Bug ( If there are related descriptions, you can check if the Bug has been fixed by compiling the development version yourself in the README.md )
 | 
				
			||||||
 | 
					        4. 请查看 Gitea 默认主题下是否有同样的错误, 确认非主题问题 ( Please check if there is the same error in the default Gitea theme, confirming that it is not a theme problem )
 | 
				
			||||||
 | 
					  - type: input
 | 
				
			||||||
 | 
					    id: theme-version
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 主题版本 ( Theme Version )
 | 
				
			||||||
 | 
					      description:
 | 
				
			||||||
 | 
					        主题的版本, 如果是开发版本可以查看 CSS 文件中 `--theme-version` 的值, 或者查看项目根目录下的 `package.json` 文件
 | 
				
			||||||
 | 
					        ( The version of the theme, if it is a development version, you can check the value of `--theme-version` in the
 | 
				
			||||||
 | 
					        CSS file, or check the `package.json` file in the project root directory )
 | 
				
			||||||
 | 
					      placeholder: ex. 1.24.5
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: input
 | 
				
			||||||
 | 
					    id: gitea-version
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: Gitea 版本 ( Gitea Version )
 | 
				
			||||||
 | 
					      description: 应用主题的 Gitea 版本 ( What version of Gitea are you using? )
 | 
				
			||||||
 | 
					      placeholder: ex. 1.24.5
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: input
 | 
				
			||||||
 | 
					    id: page
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 页面 ( Page )
 | 
				
			||||||
 | 
					      description: 错误出现的页面 ( The page where the error occurred )
 | 
				
			||||||
 | 
					      placeholder: 工单列表页 ( Issue list page )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: actual-behavior
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 实际表现 ( Actual Behavior )
 | 
				
			||||||
 | 
					      description: 请描述实际的错误表现 ( Please describe the actual error presentation )
 | 
				
			||||||
 | 
					      placeholder: 页面底部的颜色错误 ( The color of the bottom of the page is incorrect )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: expected-behavior
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 期望表现 ( Expected Behavior )
 | 
				
			||||||
 | 
					      description: 请描述期望的正确表现 ( Please describe the expected correct presentation )
 | 
				
			||||||
 | 
					      placeholder: 页面底部的颜色应该是白色 ( The color of the bottom of the page should be white )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: theme-screenshot
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 应用主题后的截图 ( Screenshot of the theme applied )
 | 
				
			||||||
 | 
					      description: 请上传应用主题后的截图 ( Please upload a screenshot of the theme applied )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: steps-to-reproduce
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 复现步骤 ( Steps to reproduce )
 | 
				
			||||||
 | 
					      description: 请描述如何复现错误 ( Please describe how to reproduce the error )
 | 
				
			||||||
 | 
					      placeholder: 1. 安装主题 2. 刷新页面 3. 查看错误 ( 1. Install the theme 2. Refresh the page 3. View the error )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: bug-description
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 错误描述 ( Bug Description )
 | 
				
			||||||
 | 
					      description: 请描述错误的具体表现 ( Please describe the specific presentation of the error )
 | 
				
			||||||
 | 
					      placeholder: 页面底部的颜色错误 ( The color of the bottom of the page is incorrect )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: gitea-screenshot
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: Gitea 默认主题下的截图 ( Screenshot of the default Gitea theme )
 | 
				
			||||||
 | 
					      description: 请上传 Gitea 默认主题下的截图 ( Please upload a screenshot of the default Gitea theme )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: github-screenshot
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 可供参考的 GitHub 页面对应的截图 ( Screenshot of the corresponding GitHub page )
 | 
				
			||||||
 | 
					      description: 请上传 GitHub 页面对应的截图 ( Please upload a screenshot of the corresponding GitHub page )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
							
								
								
									
										39
									
								
								.github/ISSUE_TEMPLATE/2-feature-request.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					name: 功能请求 ( Feature request )
 | 
				
			||||||
 | 
					description: 提出新的功能建议 ( Suggest new features )
 | 
				
			||||||
 | 
					labels: ["enhancement"]
 | 
				
			||||||
 | 
					body:
 | 
				
			||||||
 | 
					  - type: markdown
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      value: |
 | 
				
			||||||
 | 
					        1. 不接受非 Gitea 和 GitHub 的样式需求 ( We do not accept style requests that are not Gitea or GitHub )
 | 
				
			||||||
 | 
					        2. 颜色需求最好自己实现 ( Color requests are best implemented by yourself )
 | 
				
			||||||
 | 
					  - type: input
 | 
				
			||||||
 | 
					    id: page
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 页面 ( Page )
 | 
				
			||||||
 | 
					      description: 功能涉及的页面 ( The page the feature involves )
 | 
				
			||||||
 | 
					      placeholder: 首页 ( Home page )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: feature-description
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 功能描述 ( Feature Description )
 | 
				
			||||||
 | 
					      description: 请描述你想要的功能 ( Please describe the feature you want )
 | 
				
			||||||
 | 
					      placeholder: 菜单样式修改 ( Menu style modification )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: screenshot
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 截图 ( Screenshot )
 | 
				
			||||||
 | 
					      description: 预期的主题效果 ( Expected theme effect )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: github-screenshot
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 可供参考的 GitHub 页面对应的截图 ( Screenshot of the corresponding GitHub page )
 | 
				
			||||||
 | 
					      description: 请上传 GitHub 页面对应的截图 ( Please upload a screenshot of the corresponding GitHub page )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
							
								
								
									
										44
									
								
								.github/ISSUE_TEMPLATE/3-core-bug-report.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					name: 框架错误报告 ( Core bug report )
 | 
				
			||||||
 | 
					description: 报告框架的错误 ( Report errors in the theme framework )
 | 
				
			||||||
 | 
					labels: ["core bug"]
 | 
				
			||||||
 | 
					body:
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: actual-behavior
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 实际表现 ( Actual Behavior )
 | 
				
			||||||
 | 
					      description: 请描述实际的错误表现 ( Please describe the actual error presentation )
 | 
				
			||||||
 | 
					      placeholder: 未生成自动颜色主题 ( No automatic color theme generated )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: expected-behavior
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 期望表现 ( Expected Behavior )
 | 
				
			||||||
 | 
					      description: 请描述期望的正确表现 ( Please describe the expected correct presentation )
 | 
				
			||||||
 | 
					      placeholder: 生成自动颜色主题 ( Generate automatic color theme )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: steps-to-reproduce
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 复现步骤 ( Steps to reproduce )
 | 
				
			||||||
 | 
					      description: 请描述如何复现错误 ( Please describe how to reproduce the error )
 | 
				
			||||||
 | 
					      placeholder:
 | 
				
			||||||
 | 
					        1. 新建颜色主题 2. 编译主题 3. 查看错误 ( 1. Create a color theme 2. Compile the theme 3. View the error )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: bug-description
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 错误描述 ( Bug Description )
 | 
				
			||||||
 | 
					      description: 请描述错误的具体表现 ( Please describe the specific presentation of the error )
 | 
				
			||||||
 | 
					      placeholder: 未生成自动颜色主题 ( No automatic color theme generated )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: screenshot
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 截图 ( Screenshot )
 | 
				
			||||||
 | 
					      description: 请上传错误的截图 ( Please upload the screenshot of the error )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: false
 | 
				
			||||||
							
								
								
									
										12
									
								
								.github/ISSUE_TEMPLATE/4-doc-report.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					name: 文档报告 ( Document report )
 | 
				
			||||||
 | 
					description: 改进或补充文档 ( Improve or supplement the document )
 | 
				
			||||||
 | 
					labels: ["documentation"]
 | 
				
			||||||
 | 
					body:
 | 
				
			||||||
 | 
					  - type: textarea
 | 
				
			||||||
 | 
					    id: doc-description
 | 
				
			||||||
 | 
					    attributes:
 | 
				
			||||||
 | 
					      label: 文档描述 ( Document Description )
 | 
				
			||||||
 | 
					      description: 请描述文档的具体内容 ( Please describe the specific content of the document )
 | 
				
			||||||
 | 
					      placeholder: 文档内容有误 ( The document content is incorrect )
 | 
				
			||||||
 | 
					    validations:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
							
								
								
									
										1
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					blank_issues_enabled: false
 | 
				
			||||||
							
								
								
									
										7
									
								
								.github/release-template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,7 +0,0 @@
 | 
				
			|||||||
## 🌈 Style
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### 更符合 GitHub 风格
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## 🎈 Perf
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## 🐞 Fix
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								.github/release.md
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,6 +0,0 @@
 | 
				
			|||||||
## 🌈 Style
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#### 更符合 GitHub 风格
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- 仓库导航栏文字颜色优化
 | 
					 | 
				
			||||||
- Action执行时间位置优化
 | 
					 | 
				
			||||||
							
								
								
									
										24
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -11,13 +11,25 @@ jobs:
 | 
				
			|||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v4
 | 
					      - uses: actions/checkout@v4
 | 
				
			||||||
      - uses: denoland/setup-deno@v2
 | 
					      - name: Build theme
 | 
				
			||||||
        with:
 | 
					        run: |
 | 
				
			||||||
          deno-version: v2.x
 | 
					          npm install
 | 
				
			||||||
 | 
					          npm run build
 | 
				
			||||||
      - name: Create release
 | 
					      - name: Create release
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          export TZ=Asia/Shanghai
 | 
					          tar -zcf dist/theme-github-base.tar.gz --remove-files \
 | 
				
			||||||
          TAG="v$(./build.ts).$(date +%y%m%d%H%M)"
 | 
					          dist/theme-github-auto.css dist/theme-github-light.css dist/theme-github-dark.css dist/theme-github-soft-dark.css
 | 
				
			||||||
          gh release create "$TAG" dist/* --notes-file .github/release.md --draft -t $TAG
 | 
					
 | 
				
			||||||
 | 
					          tar -zcf dist/theme-github-colorblindness-colorblind.tar.gz --remove-files \
 | 
				
			||||||
 | 
					          dist/theme-github-colorblind-auto.css dist/theme-github-colorblind-light.css dist/theme-github-colorblind-dark.css
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          tar -zcf dist/theme-github-colorblindness-tritanopia.tar.gz --remove-files \
 | 
				
			||||||
 | 
					          dist/theme-github-tritanopia-auto.css dist/theme-github-tritanopia-light.css dist/theme-github-tritanopia-dark.css
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          tar -zcf dist/theme-github-extra-pink.tar.gz --remove-files \
 | 
				
			||||||
 | 
					          dist/theme-github-pink-auto.css dist/theme-github-pink-light.css dist/theme-github-pink-dark.css dist/theme-github-pink-soft-dark.css
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          TAG="v$(npm run -s version)"
 | 
				
			||||||
 | 
					          gh release create "$TAG" dist/* --notes-file CHANGELOG.md --draft -t $TAG
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          GH_TOKEN: ${{ github.token }}
 | 
					          GH_TOKEN: ${{ github.token }}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,4 +1,5 @@
 | 
				
			|||||||
dist
 | 
					dist
 | 
				
			||||||
node_modules
 | 
					node_modules
 | 
				
			||||||
deno.lock
 | 
					 | 
				
			||||||
package-lock.json
 | 
					package-lock.json
 | 
				
			||||||
 | 
					.env
 | 
				
			||||||
 | 
					.VSCodeCounter
 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
dist/
 | 
					 | 
				
			||||||
node_modules/
 | 
					 | 
				
			||||||
package-lock.json
 | 
					 | 
				
			||||||
deno.json
 | 
					 | 
				
			||||||
deno.lock
 | 
					 | 
				
			||||||
@@ -1,16 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "printWidth": 120,
 | 
					 | 
				
			||||||
  "tabWidth": 2,
 | 
					 | 
				
			||||||
  "useTabs": false,
 | 
					 | 
				
			||||||
  "semi": true,
 | 
					 | 
				
			||||||
  "singleQuote": false,
 | 
					 | 
				
			||||||
  "quoteProps": "as-needed",
 | 
					 | 
				
			||||||
  "jsxSingleQuote": false,
 | 
					 | 
				
			||||||
  "trailingComma": "none",
 | 
					 | 
				
			||||||
  "bracketSpacing": true,
 | 
					 | 
				
			||||||
  "bracketSameLine": true,
 | 
					 | 
				
			||||||
  "arrowParens": "avoid",
 | 
					 | 
				
			||||||
  "proseWrap": "always",
 | 
					 | 
				
			||||||
  "htmlWhitespaceSensitivity": "css",
 | 
					 | 
				
			||||||
  "endOfLine": "lf"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										9
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "recommendations": [
 | 
				
			||||||
 | 
					    "esbenp.prettier-vscode",
 | 
				
			||||||
 | 
					    "dbaeumer.vscode-eslint",
 | 
				
			||||||
 | 
					    "usernamehw.errorlens",
 | 
				
			||||||
 | 
					    "mikestead.dotenv",
 | 
				
			||||||
 | 
					    "styled-components.vscode-styled-components"
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					### 🌈 Style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### 更符合 GitHub 风格
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 优化用户动态
 | 
				
			||||||
 | 
					- 优化顶部导航栏头像
 | 
				
			||||||
 | 
					- 优化设置页面
 | 
				
			||||||
 | 
					- 优化仓库活动页面
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 📃 English
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌈 Style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### More aligned with GitHub style
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Optimized user activity feed
 | 
				
			||||||
 | 
					- Optimized top navigation bar avatars
 | 
				
			||||||
 | 
					- Optimized settings page
 | 
				
			||||||
 | 
					- Optimized repository activity page
 | 
				
			||||||
							
								
								
									
										172
									
								
								CONTRIBUTING.md
									
									
									
									
									
								
							
							
						
						@@ -1,7 +1,171 @@
 | 
				
			|||||||
 | 
					# 贡献指南
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 目录结构
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 目录              | 说明                         |
 | 
					| 目录              | 说明                         |
 | 
				
			||||||
| ----------------- | ---------------------------- |
 | 
					| ----------------- | ---------------------------- |
 | 
				
			||||||
| styles            | 元素 GitHub 风格             |
 | 
					| src               | 主题生成框架与辅助工具的包   |
 | 
				
			||||||
| styles/components | 具体页面的元素单独风格       |
 | 
					| src/core          | 主题生成框架                 |
 | 
				
			||||||
| styles/public     | 适用大部分页面的元素默认风格 |
 | 
					| src/functions     | 主题辅助工具                 |
 | 
				
			||||||
 | 
					| src/types         | 主题的颜色变量定义           |
 | 
				
			||||||
 | 
					| styles            | 主题样式                     |
 | 
				
			||||||
 | 
					| styles/components | 具体页面的元素的样式         |
 | 
				
			||||||
 | 
					| styles/public     | 基础元素或跨页面的元素的样式 |
 | 
				
			||||||
| themes            | 颜色主题                     |
 | 
					| themes            | 颜色主题                     |
 | 
				
			||||||
| themes/\<theme>   | 具体颜色主题自己的颜色或风格 |
 | 
					
 | 
				
			||||||
 | 
					## 贡献说明
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					不推荐主题样式贡献, 因为 Gitea 主题最终是由单个 CSS 文件提供, 所以会有先后顺序覆盖, 样式影响广泛等问题.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					开发者每个人的思路不一样, 审核很难看出这些问题, 会极大增加维护难度.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果确定理解了 Gitea 的样式布局和我的思路, 请先提交 Issue 确认工作量和预期效果, 然后再开发提交 PR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果认为有更好的思路, 欢迎提交 Issue.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!IMPORTANT]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> 提交 PR 时, 请执行 `npm run commit`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 开发环境
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					主题仅依赖于 Node.js 环境, 请确保你的环境中已经安装了 Node.js, 推荐使用 Node.js 20 或以上版本.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					请使用 VSCode 开发, 并安装仓库中推荐的插件.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果不喜欢多余的插件, 请务必安装 `vscode-styled-components` 插件, 此插件用于渲染和检查 TypeScript 中的 CSS 模板字符串.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					推荐使用 VSCode 1.102.0 版本以上开发, 此版本以上提供 TypeScript 代码中 16 进制颜色的支持.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 开发流程
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 安装依赖
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm install
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 设置环境变量
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					在项目根目录下创建 `.env` 文件, 变量参考 `.env.example` 文件.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					环境变量用于发送编译后的主题到服务器上, 快速预览主题.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 编译主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					编译开发中的主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm run dev
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					编译所有主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm run build
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					格式化项目中的代码
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm run format
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					用于 PR, 检查并编译项目中的所有代码并进行格式化
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					npm run commit
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 开发规范
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`src`, `styles`, `themes` 为项目的主目录, 主目录下的第一个目录为模块.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					主目录或主目录下模块互相引用时, 请使用绝对路径, 例如 `import { defineTheme } from "src"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					模块下的文件互相引用时, 请使用相对路径, 例如 `import { defineTheme } from "./theme"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 颜色主题贡献
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					颜色主题名称格式: `主题名称-dark.css.ts` 或 `主题名称-light.css.ts`, 分别表示深色和亮色主题.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果主题有深色和亮色模式, 会自动生成自动颜色主题, 不需要手动添加.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					项目接受自定义主题并会附加到发布的版本中, 但项目所有者不参与维护和审核.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					请在颜色主题文件头部附加自己的作者信息, 方便 Issue 提问者找到你 `@`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					推荐使用 `import { defineTheme, type ThemeColor } from "src"` 导入主题生成框架, 声明主题颜色, 然后使用 `defineTheme`
 | 
				
			||||||
 | 
					函数生成主题所有 CSS 变量, defineTheme 中设置了一些经过计算得到的 Gitea 变量可以减少工作量, 具体请查看函数说明和定义.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					颜色计算函数可以从 `src/functions` 导入, 例如 `import { scaleColorLight } from "src/functions"`, 或者使用 `polished` 库.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					例: `themes/主题名称-dark.css.ts`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ts
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @author 你的名字
 | 
				
			||||||
 | 
					 * @description 主题描述
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					import { defineTheme, type ThemeColor } from "src";
 | 
				
			||||||
 | 
					export const 主题名称DarkColors: ThemeColor = {
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export default defineTheme(主题名称DarkColors);
 | 
				
			||||||
 | 
					// 使用其他主题颜色作为基础
 | 
				
			||||||
 | 
					import dark from "themes/dark";
 | 
				
			||||||
 | 
					import { darkColors } from "themes/dark";
 | 
				
			||||||
 | 
					export const 主题名称DarkColors: ThemeColor = darkColors;
 | 
				
			||||||
 | 
					export default defineTheme({
 | 
				
			||||||
 | 
					  ...dark,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果不需要自定义代码高亮色, 则不传递 chroma 参数, 框架会自动根据主题的暗色或亮色生成代码高亮色.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					如果需要完全自定义每个 Gitea 变量, 请导入 `import type { Theme } from "src"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					例: `themes/主题名称-dark.css.ts`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ts
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @author 你的名字
 | 
				
			||||||
 | 
					 * @description 主题描述
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					import type { Theme, Chroma, Primary, Secondary, ... } from "src";
 | 
				
			||||||
 | 
					export const primary: Primary = ...;
 | 
				
			||||||
 | 
					export const secondary: Secondary =...;
 | 
				
			||||||
 | 
					export const chroma: Chroma =...;
 | 
				
			||||||
 | 
					...
 | 
				
			||||||
 | 
					export default theme: Theme = {
 | 
				
			||||||
 | 
					  primary,
 | 
				
			||||||
 | 
					  secondary,
 | 
				
			||||||
 | 
					  chroma,
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					完成主题颜色开发后, 请在某个仓库的代码文件列表页, 打开 Code 菜单选择 Tea Cli 进行截图, 并放入 `screenshots`
 | 
				
			||||||
 | 
					目录下, 截图名与主题名相同. (推荐克隆本仓库, 避免泄露个人隐私)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					然后将截图信息添加到 `README.md` 文件中, 可以在折叠部分中添加自己的说明.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					主题颜色复用案例可以参考本主题的色盲主题.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 主题样式贡献
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					主题样式使用 TypeScript 的 css 模板字符串开发, 该模板字符串会经过 sass 预处理器处理, 支持 SCSS 语法并且主题只接受 SCSS 嵌套语法, 请不要使用 CSS 语法, 如果一定要用请说明原因.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					请尽量不要使用 SCSS 的函数, `vscode-styled-components` 插件会报错, 请使用 TypeScript 相关库处理, 比如主题自带的
 | 
				
			||||||
 | 
					`polished` 库.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					推荐需要使用复杂处理时, 提取逻辑到 `src/functions` 目录下的函数中, 然后在 `src/styles` 目录下的样式文件中使用.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					主题样式中使用到的所有颜色必须使用颜色变量, 颜色变量导入 `import { themeVars } from "src/types/vars"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					涉及到主题自己的颜色变量 `${themeVars.github.xxx}`, 在使用时请将使用的文件和变量添加到对应变量的注释中
 | 
				
			||||||
 | 
					`src/types/color/github`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					小型圆角(6px)请使用全局圆角变量, 圆角变量导入 `import { otherThemeVars } from "src/types/vars"`
 | 
				
			||||||
 | 
					`${otherThemeVars.border.radius}`
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										163
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,71 +1,166 @@
 | 
				
			|||||||
# gitea-github-theme
 | 
					<h1 align="center">
 | 
				
			||||||
 | 
					  <p>Gitea GitHub Theme</p>
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/issues-raw/lutinglt/gitea-github-theme?style=for-the-badge&labelColor=25292e&color=1a7f37">
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/issues-closed-raw/lutinglt/gitea-github-theme?style=for-the-badge&labelColor=25292e&color=8250df">
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/downloads/lutinglt/gitea-github-theme/total?style=for-the-badge&labelColor=25292e&color=1f6feb">
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/downloads/lutinglt/gitea-github-theme/latest/total?style=for-the-badge&labelColor=25292e&color=238636">
 | 
				
			||||||
 | 
					</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
尽量保持与 GitHub Dark 相同样式的 Gitea 主题
 | 
					<div align="center">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 主题说明
 | 
					中文 • [English](README_EN.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
添加了短暂的过渡动画优化体验(与 GitHub Code 克隆列表动画一致)
 | 
					不仅仅是在颜色上, 在样式细节上也追求 GitHub 风格的 Gitea 主题.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
推荐搭配文件图标浏览器插件一起使用更佳
 | 
					</div>
 | 
				
			||||||
[github-file-explorer-icons](https://github.com/catppuccin/github-file-explorer-icons)
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!TIP]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> 推荐搭配 Catppuccin 文件图标浏览器插件一起使用更佳
 | 
				
			||||||
 | 
					> [web-file-explorer-icons](https://github.com/catppuccin/web-file-explorer-icons)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 版本号说明
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					主题版本号与 Gitea 版本号保持一致
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gitea 版本号格式: `1.大版本号.小版本号`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gitea 理论上小版本号变更不会修改前端布局, 所以主题的小版本号适用于所有 Gitea 大版本号相同的 Gitea 版本.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					比如: 主题版本 `1.24.5` 适用于 Gitea 版本 `>=1.24.0` `<1.25.0`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					仅维护项目发布中的最新的 Gitea 版本, 其他旧版本主题不接受 Issue 和 PR.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> 开发阶段的主题版本号格式: `1.大版本号.小版本号.时间戳`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 主题版本发布规则
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 当 Gitea 发布小版本时, 主题中间如有变更, 则发布新的和 Gitea 小版本相同的主题版本
 | 
				
			||||||
 | 
					- 当 Gitea 发布大版本时, 主题中间如有变更, 会发布 `1.旧大版本号.latest` 的主题版本并不再维护旧版本
 | 
				
			||||||
 | 
					- 适配大版本的预发布版本为 `1.大版本号.rc`, 当无明显 BUG 时发布与 Gitea 大版本相同的主题版本
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 安装
 | 
					## 安装
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 在发布页下载最新的 `theme-github.css` 放入 `gitea/public/assets/css` 目录下
 | 
					1. 在发布页下载最新的 CSS 主题文件放入 `gitea/public/assets/css` 目录下
 | 
				
			||||||
2. 修改 `gitea/conf/app.ini`,并将 `, github` 附加到 `[ui]` 下的 `THEMES` 末尾
 | 
					2. 修改 `gitea/conf/app.ini`,并将 CSS 文件名去掉 `theme-` 的名称附加到 `[ui]` 下的 `THEMES` 末尾
 | 
				
			||||||
3. 重启 Gitea
 | 
					3. 重启 Gitea
 | 
				
			||||||
4. 在设置中查看主题
 | 
					4. 在设置中查看主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					例: 主题文件名为 `theme-github-dark.css`,则添加 `github-dark` 到 `THEMES` 末尾
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`gitea/conf/app.ini` 例:
 | 
					`gitea/conf/app.ini` 例:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```ini
 | 
					```ini
 | 
				
			||||||
[ui]
 | 
					[ui]
 | 
				
			||||||
THEMES = gitea-dark, github
 | 
					THEMES = gitea-auto, gitea-light, gitea-dark, github-auto, github-light, github-dark, github-soft-dark
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
详细请查看 Gitea 文档
 | 
					详细请查看 Gitea 文档
 | 
				
			||||||
[Gitea docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea)
 | 
					[Gitea docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!IMPORTANT]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> 自动颜色主题需要亮色和暗色的主题文件
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 截图
 | 
					## 截图
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					### 基本主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					```ini
 | 
				
			||||||
 | 
					THEMES = github-auto, github-light, github-dark, github-soft-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					<details>
 | 
				
			||||||
 | 
					<summary>Base</summary>
 | 
				
			||||||
 | 
					<h4>theme-github-light.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/light.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/dark.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-soft-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/soft-dark.png"/>
 | 
				
			||||||
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					### 色盲主题 ( Beta )
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					```ini
 | 
				
			||||||
 | 
					THEMES = github-colorblind-auto, github-colorblind-light, github-colorblind-dark
 | 
				
			||||||
 | 
					THEMES = github-tritanopia-auto, github-tritanopia-light, github-tritanopia-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					<details>
 | 
				
			||||||
 | 
					<summary>Colorblind & Tritanopia (红绿色盲 & 蓝色盲)</summary>
 | 
				
			||||||
 | 
					<h4>theme-github-colorblind-light.css & theme-github-tritanopia-light.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/colorblind-light.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-colorblind-dark.css & theme-github-tritanopia-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/colorblind-dark.png"/>
 | 
				
			||||||
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||

 | 
					### 粉色主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 构建
 | 
					```ini
 | 
				
			||||||
 | 
					THEMES = github-pink-auto, github-pink-light, github-pink-dark, github-pink-soft-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 克隆仓库
 | 
					<details>
 | 
				
			||||||
 | 
					<summary>Pink</summary>
 | 
				
			||||||
 | 
					<h4>theme-github-pink-light.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/pink/pink-light.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-pink-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/pink/pink-dark.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-pink-soft-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/pink/pink-soft-dark.png"/>
 | 
				
			||||||
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 自定义 CSS 变量
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					可以根据自己的偏好自定义主题的一部分样式
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 使用方法
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					在主题的 CSS 文件的头部或尾部添加以下代码
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```css
 | 
				
			||||||
 | 
					:root {
 | 
				
			||||||
 | 
					  --custom-clone-menu-width: 150px;
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!IMPORTANT]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> 请确保在 `:root` 选择器中添加自定义变量,否则无法生效
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> 变量之间用 `;` 分隔
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> 建议自定义变量放在单独的文件中, 通过 shell 命令等方式追加到主题文件中
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### CSS 变量
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| 变量名                            | 描述                        | 默认  | Github | 推荐  | 最小  | 最大  |
 | 
				
			||||||
 | 
					| :-------------------------------- | :-------------------------- | :---- | :----- | :---- | :---- | :---- |
 | 
				
			||||||
 | 
					| --custom-branch-menu-width        | 分支菜单的宽度              | 320px | 320px  | 320px | Gitea | 640px |
 | 
				
			||||||
 | 
					| --custom-clone-menu-width         | 克隆按钮的菜单宽度          | Gitea | 332px  | 200px | 150px | 400px |
 | 
				
			||||||
 | 
					| --custom-user-menu-width          | 用户菜单的宽度              | 192px | 256px  |       | Gitea | 320px |
 | 
				
			||||||
 | 
					| --custom-explore-repolist-columns | 探索页面的仓库列表列数      | 2     | 2      | 2     |       |       |
 | 
				
			||||||
 | 
					| --custom-explore-userlist-columns | 探索页面的用户/组织列表列数 | 3     | 1      | 2/3   |       |       |
 | 
				
			||||||
 | 
					| --custom-user-repolist-columns    | 用户页面的仓库列表列数      | 2     | 2      | 1/2   |       |       |
 | 
				
			||||||
 | 
					| --custom-org-repolist-columns     | 组织页面的仓库列表列数      | 1     | 1      | 1/2   |       |       |
 | 
				
			||||||
 | 
					| --custom-org-userlist-columns     | 组织页面的用户列表列数      | 2     | 1      | 1/2   |       |       |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 使用开发中的主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					也许你会想使用开发中的主题, 而不是发布的主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					请确保你已经安装了 Node.js 环境, 推荐使用 Node.js 20 或以上版本
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
git clone https://github.com/lutinglt/gitea-github-theme.git
 | 
					git clone https://github.com/lutinglt/gitea-github-theme.git
 | 
				
			||||||
cd gitea-github-theme
 | 
					cd gitea-github-theme
 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### 使用 deno (推荐)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
deno run build
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### 使用 nodejs & npm
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```bash
 | 
					 | 
				
			||||||
npm install
 | 
					npm install
 | 
				
			||||||
npm run build
 | 
					npm run build
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
查看用于 Gitea 的主题文件: `dist/theme-github.css`
 | 
					编译完成后, 会在 `dist` 目录下生成主题文件, 你可以将主题文件放入 `gitea/public/assets/css` 目录下, 然后在
 | 
				
			||||||
 | 
					`gitea/conf/app.ini` 中添加主题名称到 `THEMES` 末尾
 | 
				
			||||||
## 贡献
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
欢迎提交 Issue 或 Pull Request
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										173
									
								
								README_EN.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,173 @@
 | 
				
			|||||||
 | 
					<h1 align="center">
 | 
				
			||||||
 | 
					  <p>Gitea GitHub Theme</p>
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/issues-raw/lutinglt/gitea-github-theme?style=for-the-badge&labelColor=25292e&color=1a7f37">
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/issues-closed-raw/lutinglt/gitea-github-theme?style=for-the-badge&labelColor=25292e&color=8250df">
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/downloads/lutinglt/gitea-github-theme/total?style=for-the-badge&labelColor=25292e&color=1f6feb">
 | 
				
			||||||
 | 
					  <img src="https://img.shields.io/github/downloads/lutinglt/gitea-github-theme/latest/total?style=for-the-badge&labelColor=25292e&color=238636">
 | 
				
			||||||
 | 
					</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div align="center">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					English • [中文](README.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A Gitea theme that pursues GitHub style not only in colors but also in styling details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!TIP]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> Recommend using Catppuccin file icon browser plugin together for better performance.
 | 
				
			||||||
 | 
					> [web-file-explorer-icons](https://github.com/catppuccin/web-file-explorer-icons)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Version Number Explanation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The theme version number is kept consistent with the Gitea version number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Gitea version number format: `1.major.minor`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Theoretically, minor version changes in Gitea do not modify the frontend layout, so the minor version of the theme is
 | 
				
			||||||
 | 
					applicable to all Gitea versions with the same major version number.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For example: Theme version `1.24.5` is applicable to Gitea versions `>=1.24.0` `<1.25.0`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Only the latest released Gitea version is maintained. Issues and PRs for other older theme versions will not be
 | 
				
			||||||
 | 
					accepted.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> Development stage theme version number format: `1.major.minor.timestamp`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Theme Version Release Rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- When Gitea releases a minor version, if there are changes in the theme, a new theme version with the same minor
 | 
				
			||||||
 | 
					  version as Gitea will be released
 | 
				
			||||||
 | 
					- When Gitea releases a major version, if there are changes in the theme, a theme version `1.old_major_version.latest`
 | 
				
			||||||
 | 
					  will be released and the old version will no longer be maintained
 | 
				
			||||||
 | 
					- The pre-release version for major version adaptation is `1.major_version.rc`, and when there are no obvious bugs, a
 | 
				
			||||||
 | 
					  theme version with the same major version as Gitea will be released
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Download the latest CSS theme file from the release page and place it in the `gitea/public/assets/css` directory
 | 
				
			||||||
 | 
					2. Modify `gitea/conf/app.ini` and append the CSS filename without the `theme-` prefix to the end of `THEMES` under the
 | 
				
			||||||
 | 
					   `[ui]` section
 | 
				
			||||||
 | 
					3. Restart Gitea
 | 
				
			||||||
 | 
					4. Check the theme in the settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example: If the theme filename is `theme-github-dark.css`, add `github-dark` to the end of `THEMES`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example `gitea/conf/app.ini`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ini
 | 
				
			||||||
 | 
					[ui]
 | 
				
			||||||
 | 
					THEMES = gitea-auto, gitea-light, gitea-dark, github-auto, github-light, github-dark, github-soft-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For details, please refer to the Gitea documentation
 | 
				
			||||||
 | 
					[Gitea docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!IMPORTANT]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> Automatic color theme requires both light and dark theme files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Screenshots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Basic Themes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ini
 | 
				
			||||||
 | 
					THEMES = github-auto, github-light, github-dark, github-soft-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<details>
 | 
				
			||||||
 | 
					<summary>Base</summary>
 | 
				
			||||||
 | 
					<h4>theme-github-light.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/en/light.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/en/dark.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-soft-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/en/soft-dark.png"/>
 | 
				
			||||||
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Colorblind Themes (Beta)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ini
 | 
				
			||||||
 | 
					THEMES = github-colorblind-auto, github-colorblind-light, github-colorblind-dark
 | 
				
			||||||
 | 
					THEMES = github-tritanopia-auto, github-tritanopia-light, github-tritanopia-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<details>
 | 
				
			||||||
 | 
					<summary>Colorblind & Tritanopia</summary>
 | 
				
			||||||
 | 
					<h4>theme-github-colorblind-light.css & theme-github-tritanopia-light.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/en/colorblind-light.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-colorblind-dark.css & theme-github-tritanopia-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/en/colorblind-dark.png"/>
 | 
				
			||||||
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Pink Themes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```ini
 | 
				
			||||||
 | 
					THEMES = github-pink-auto, github-pink-light, github-pink-dark, github-pink-soft-dark
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<details>
 | 
				
			||||||
 | 
					<summary>Pink</summary>
 | 
				
			||||||
 | 
					<h4>theme-github-pink-light.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/pink/en/pink-light-en.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-pink-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/pink/en/pink-dark-en.png"/>
 | 
				
			||||||
 | 
					<h4>theme-github-pink-soft-dark.css</h4>
 | 
				
			||||||
 | 
					<img src="screenshots/pink/en/pink-soft-dark-en.png"/>
 | 
				
			||||||
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Custom CSS Variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can customize parts of the theme style according to your preferences
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Usage Method
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add the following code at the beginning or end of the theme's CSS file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```css
 | 
				
			||||||
 | 
					:root {
 | 
				
			||||||
 | 
					  --custom-clone-menu-width: 150px;
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> [!IMPORTANT]
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> Please ensure to add custom variables in the `:root` selector, otherwise they will not take effect
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> Variables are separated by `;`
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					> It is recommended to place custom variables in a separate file and append them to the theme file using shell commands
 | 
				
			||||||
 | 
					> or other methods
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### CSS Variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| Variable Name                     | Description                                              | Default | Github | Recommend | Min   | Max   |
 | 
				
			||||||
 | 
					| :-------------------------------- | :------------------------------------------------------- | :------ | :----- | :-------- | :---- | :---- |
 | 
				
			||||||
 | 
					| --custom-branch-menu-width        | Branch menu width                                        | 320px   | 320px  | 320px     | Gitea | 640px |
 | 
				
			||||||
 | 
					| --custom-clone-menu-width         | Clone button menu width                                  | Gitea   | 332px  | 200px     | 150px | 400px |
 | 
				
			||||||
 | 
					| --custom-user-menu-width          | User menu width                                          | 192px   | 200px  |           | Gitea | 320px |
 | 
				
			||||||
 | 
					| --custom-explore-repolist-columns | Number of repository list columns on explore page        | 2       | 2      | 2         |       |       |
 | 
				
			||||||
 | 
					| --custom-explore-userlist-columns | Number of user/organization list columns on explore page | 3       | 1      | 2/3       |       |       |
 | 
				
			||||||
 | 
					| --custom-user-repolist-columns    | Number of repository list columns on user page           | 2       | 2      | 1/2       |       |       |
 | 
				
			||||||
 | 
					| --custom-org-repolist-columns     | Number of repository list columns on organization page   | 1       | 1      | 1/2       |       |       |
 | 
				
			||||||
 | 
					| --custom-org-userlist-columns     | Number of user list columns on organization page         | 2       | 1      | 1/2       |       |       |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using Development Version of the Theme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You might want to use the development version of the theme instead of the released version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please ensure you have Node.js environment installed, Node.js 20 or above is recommended
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					git clone https://github.com/lutinglt/gitea-github-theme.git
 | 
				
			||||||
 | 
					cd gitea-github-theme
 | 
				
			||||||
 | 
					npm install
 | 
				
			||||||
 | 
					npm run build
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After compilation, theme files will be generated in the `dist` directory. You can place the theme files into the
 | 
				
			||||||
 | 
					`gitea/public/assets/css` directory, then add the theme name to the end of `THEMES` in `gitea/conf/app.ini`
 | 
				
			||||||
							
								
								
									
										34
									
								
								build.js
									
									
									
									
									
								
							
							
						
						@@ -1,34 +0,0 @@
 | 
				
			|||||||
import * as process from "node:process";
 | 
					 | 
				
			||||||
import * as fs from "node:fs";
 | 
					 | 
				
			||||||
import * as sass from "sass";
 | 
					 | 
				
			||||||
import * as yaml from "js-yaml";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
async function compile(inputFile) {
 | 
					 | 
				
			||||||
  return (await sass.compileAsync(inputFile, { sourceMap: false, style: "compressed" })).css;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
async function generateTheme(themePath) {
 | 
					 | 
				
			||||||
  try {
 | 
					 | 
				
			||||||
    const fileContent = fs.readFileSync(themePath);
 | 
					 | 
				
			||||||
    const data = yaml.load(fileContent);
 | 
					 | 
				
			||||||
    console.log(data.gitea.version);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fs.mkdirSync("dist", { recursive: true });
 | 
					 | 
				
			||||||
    const styles = await compile("src/styles/styles.scss");
 | 
					 | 
				
			||||||
    for (const theme of data.gitea.themes) {
 | 
					 | 
				
			||||||
      const inputFile = `src/themes/${theme}.scss`;
 | 
					 | 
				
			||||||
      const outputFile = `dist/theme-github-${theme}.css`;
 | 
					 | 
				
			||||||
      const result = await compile(inputFile);
 | 
					 | 
				
			||||||
      fs.writeFileSync(outputFile, `${styles}${result}`);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } catch (error) {
 | 
					 | 
				
			||||||
    let e = error;
 | 
					 | 
				
			||||||
    if (error instanceof Error) {
 | 
					 | 
				
			||||||
      e = error.message;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    console.error("Build failed:", e);
 | 
					 | 
				
			||||||
    process.exit(1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
generateTheme("theme.yml");
 | 
					 | 
				
			||||||
							
								
								
									
										43
									
								
								build.ts
									
									
									
									
									
								
							
							
						
						@@ -1,43 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/env -S deno run -A --allow-scripts -q
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import * as sass from "npm:sass";
 | 
					 | 
				
			||||||
import * as yaml from "npm:js-yaml";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface Gitea {
 | 
					 | 
				
			||||||
  version: string;
 | 
					 | 
				
			||||||
  themes: [string];
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
interface ThemeInfo {
 | 
					 | 
				
			||||||
  gitea: Gitea;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
async function compile(inputFile: string) {
 | 
					 | 
				
			||||||
  return (await sass.compileAsync(inputFile, { sourceMap: false, style: "compressed" })).css;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
async function generateTheme(themePath: string) {
 | 
					 | 
				
			||||||
  try {
 | 
					 | 
				
			||||||
    const fileContent = await Deno.readTextFile(themePath);
 | 
					 | 
				
			||||||
    const data: ThemeInfo = yaml.load(fileContent);
 | 
					 | 
				
			||||||
    console.log(data.gitea.version);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await Deno.mkdir("dist", { recursive: true });
 | 
					 | 
				
			||||||
    const styles = await compile("src/styles/styles.scss");
 | 
					 | 
				
			||||||
    for (const theme of data.gitea.themes) {
 | 
					 | 
				
			||||||
      const inputFile = `src/themes/${theme}.scss`;
 | 
					 | 
				
			||||||
      const outputFile = `dist/theme-github-${theme}.css`;
 | 
					 | 
				
			||||||
      const result = await compile(inputFile);
 | 
					 | 
				
			||||||
      await Deno.writeTextFile(outputFile, `${styles}${result}`);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } catch (error) {
 | 
					 | 
				
			||||||
    let e = error;
 | 
					 | 
				
			||||||
    if (error instanceof Error) {
 | 
					 | 
				
			||||||
      e = error.message;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    console.error("Build failed:", e);
 | 
					 | 
				
			||||||
    Deno.exit(1);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
generateTheme("theme.yml");
 | 
					 | 
				
			||||||
							
								
								
									
										11
									
								
								deno.json
									
									
									
									
									
								
							
							
						
						@@ -1,11 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "nodeModulesDir": "auto",
 | 
					 | 
				
			||||||
  "fmt": {
 | 
					 | 
				
			||||||
    "options": {
 | 
					 | 
				
			||||||
      "lineWidth": 120
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "tasks": {
 | 
					 | 
				
			||||||
    "build": "deno -A --allow-scripts build.ts"
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										15
									
								
								eslint.config.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					import js from "@eslint/js";
 | 
				
			||||||
 | 
					import globals from "globals";
 | 
				
			||||||
 | 
					import tseslint from "typescript-eslint";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default tseslint.config(
 | 
				
			||||||
 | 
					  { ignores: ["dist"] },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    extends: [js.configs.recommended, ...tseslint.configs.recommended],
 | 
				
			||||||
 | 
					    files: ["**/*.{ts}"],
 | 
				
			||||||
 | 
					    languageOptions: {
 | 
				
			||||||
 | 
					      ecmaVersion: 2020,
 | 
				
			||||||
 | 
					      globals: globals.browser,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										52
									
								
								package.json
									
									
									
									
									
								
							
							
						
						@@ -1,10 +1,56 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  "name": "gitea-github-theme",
 | 
				
			||||||
 | 
					  "version": "1.25.0",
 | 
				
			||||||
  "type": "module",
 | 
					  "type": "module",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "build": "node build.js"
 | 
					    "dev": "vite build --mode dev",
 | 
				
			||||||
 | 
					    "build": "tsc -b && vite build",
 | 
				
			||||||
 | 
					    "lint": "eslint .",
 | 
				
			||||||
 | 
					    "format": "prettier --write .",
 | 
				
			||||||
 | 
					    "commit": "npm run lint && npm run format && npm run build",
 | 
				
			||||||
 | 
					    "version": "node scripts/version.cjs"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "js-yaml": "^4.1.0",
 | 
					    "@babel/preset-typescript": "^7.27.1",
 | 
				
			||||||
    "sass": "^1.83.0"
 | 
					    "@eslint/js": "^9.29.0",
 | 
				
			||||||
 | 
					    "@linaria/core": "^6.3.0",
 | 
				
			||||||
 | 
					    "@types/node": "^24.0.3",
 | 
				
			||||||
 | 
					    "@vanilla-extract/css": "^1.17.4",
 | 
				
			||||||
 | 
					    "@vanilla-extract/vite-plugin": "^5.0.6",
 | 
				
			||||||
 | 
					    "@wyw-in-js/babel-preset": "^0.7.0",
 | 
				
			||||||
 | 
					    "@wyw-in-js/vite": "^0.7.0",
 | 
				
			||||||
 | 
					    "dotenv": "^17.0.0",
 | 
				
			||||||
 | 
					    "eslint": "^9.29.0",
 | 
				
			||||||
 | 
					    "globals": "^16.2.0",
 | 
				
			||||||
 | 
					    "lightningcss": "^1.30.1",
 | 
				
			||||||
 | 
					    "polished": "^4.3.1",
 | 
				
			||||||
 | 
					    "prettier": "3.5.3",
 | 
				
			||||||
 | 
					    "prettier-plugin-organize-imports": "^4.1.0",
 | 
				
			||||||
 | 
					    "sass-embedded": "^1.89.2",
 | 
				
			||||||
 | 
					    "typescript": "^5.8.3",
 | 
				
			||||||
 | 
					    "typescript-eslint": "^8.34.1",
 | 
				
			||||||
 | 
					    "typescript-plugin-css-modules": "^5.1.0",
 | 
				
			||||||
 | 
					    "typescript-styled-plugin": "^0.18.3",
 | 
				
			||||||
 | 
					    "vite": "^7.1.9"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "prettier": {
 | 
				
			||||||
 | 
					    "printWidth": 120,
 | 
				
			||||||
 | 
					    "tabWidth": 2,
 | 
				
			||||||
 | 
					    "useTabs": false,
 | 
				
			||||||
 | 
					    "semi": true,
 | 
				
			||||||
 | 
					    "singleQuote": false,
 | 
				
			||||||
 | 
					    "quoteProps": "as-needed",
 | 
				
			||||||
 | 
					    "jsxSingleQuote": false,
 | 
				
			||||||
 | 
					    "trailingComma": "es5",
 | 
				
			||||||
 | 
					    "bracketSpacing": true,
 | 
				
			||||||
 | 
					    "bracketSameLine": true,
 | 
				
			||||||
 | 
					    "arrowParens": "avoid",
 | 
				
			||||||
 | 
					    "proseWrap": "always",
 | 
				
			||||||
 | 
					    "htmlWhitespaceSensitivity": "css",
 | 
				
			||||||
 | 
					    "endOfLine": "lf",
 | 
				
			||||||
 | 
					    "plugins": [
 | 
				
			||||||
 | 
					      "prettier-plugin-organize-imports"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "organizeImportsSkipDestructiveCodeActions": false
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								screenshots/action.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 109 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/actions.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 176 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/colorblind-dark.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 260 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/colorblind-light.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 259 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/commit.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 394 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/dark.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 260 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/dashboard.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 269 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/dispatch.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 111 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/en/colorblind-dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 278 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/en/colorblind-light.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 278 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/en/dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 278 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/en/dashboard-en.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 295 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/en/light.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 278 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/en/soft-dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 279 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/file_list.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 343 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/light.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 259 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/pink/en/pink-dark-en.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 191 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/pink/en/pink-light-en.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 193 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/pink/en/pink-soft-dark-en.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 190 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/pink/pink-dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 210 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/pink/pink-light.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 191 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/pink/pink-soft-dark.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 210 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/release.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 187 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/repo.png
									
									
									
									
										vendored
									
									
								
							
							
						
						| 
		 Before Width: | Height: | Size: 211 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								screenshots/soft-dark.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 261 KiB  | 
							
								
								
									
										7
									
								
								scripts/version.cjs
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					const fs = require("fs");
 | 
				
			||||||
 | 
					const path = require("path");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const pkgPath = path.join(__dirname, "..", "package.json");
 | 
				
			||||||
 | 
					const pkg = JSON.parse(fs.readFileSync(pkgPath));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(pkg.version);
 | 
				
			||||||
							
								
								
									
										64
									
								
								src/core/chroma.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					import { prettylights2Chroma, type prettylightsColor } from "./prettylights";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const lightPrettylights: prettylightsColor = {
 | 
				
			||||||
 | 
					  syntax: {
 | 
				
			||||||
 | 
					    brackethighlighter: { angle: "#59636e", unmatched: "#82071e" },
 | 
				
			||||||
 | 
					    carriage: { return: { bg: "#cf222e", text: "#f6f8fa" } },
 | 
				
			||||||
 | 
					    comment: "#59636e",
 | 
				
			||||||
 | 
					    constant: "#0550ae",
 | 
				
			||||||
 | 
					    constantOtherReferenceLink: "#0a3069",
 | 
				
			||||||
 | 
					    entity: "#6639ba",
 | 
				
			||||||
 | 
					    entityTag: "#0550ae",
 | 
				
			||||||
 | 
					    invalid: { illegal: { bg: "#82071e", text: "#f6f8fa" } },
 | 
				
			||||||
 | 
					    keyword: "#cf222e",
 | 
				
			||||||
 | 
					    markup: {
 | 
				
			||||||
 | 
					      bold: "#1f2328",
 | 
				
			||||||
 | 
					      changed: { bg: "#ffd8b5", text: "#953800" },
 | 
				
			||||||
 | 
					      deleted: { bg: "#ffebe9", text: "#82071e" },
 | 
				
			||||||
 | 
					      heading: "#0550ae",
 | 
				
			||||||
 | 
					      ignored: { bg: "#0550ae", text: "#d1d9e0" },
 | 
				
			||||||
 | 
					      inserted: { bg: "#dafbe1", text: "#116329" },
 | 
				
			||||||
 | 
					      italic: "#1f2328",
 | 
				
			||||||
 | 
					      list: "#3b2300",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    metaDiffRange: "#8250df",
 | 
				
			||||||
 | 
					    storageModifierImport: "#1f2328",
 | 
				
			||||||
 | 
					    string: "#0a3069",
 | 
				
			||||||
 | 
					    stringRegexp: "#116329",
 | 
				
			||||||
 | 
					    sublimelinterGutterMark: "#818b98",
 | 
				
			||||||
 | 
					    variable: "#953800",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const darkPrettylights: prettylightsColor = {
 | 
				
			||||||
 | 
					  syntax: {
 | 
				
			||||||
 | 
					    brackethighlighter: { angle: "#9198a1", unmatched: "#f85149" },
 | 
				
			||||||
 | 
					    carriage: { return: { bg: "#b62324", text: "#f0f6fc" } },
 | 
				
			||||||
 | 
					    comment: "#9198a1",
 | 
				
			||||||
 | 
					    constant: "#79c0ff",
 | 
				
			||||||
 | 
					    constantOtherReferenceLink: "#a5d6ff",
 | 
				
			||||||
 | 
					    entity: "#d2a8ff",
 | 
				
			||||||
 | 
					    entityTag: "#7ee787",
 | 
				
			||||||
 | 
					    invalid: { illegal: { bg: "#8e1519", text: "#f0f6fc" } },
 | 
				
			||||||
 | 
					    keyword: "#ff7b72",
 | 
				
			||||||
 | 
					    markup: {
 | 
				
			||||||
 | 
					      bold: "#f0f6fc",
 | 
				
			||||||
 | 
					      changed: { bg: "#5a1e02", text: "#ffdfb6" },
 | 
				
			||||||
 | 
					      deleted: { bg: "#67060c", text: "#ffdcd7" },
 | 
				
			||||||
 | 
					      heading: "#1f6feb",
 | 
				
			||||||
 | 
					      ignored: { bg: "#1158c7", text: "#f0f6fc" },
 | 
				
			||||||
 | 
					      inserted: { bg: "#033a16", text: "#aff5b4" },
 | 
				
			||||||
 | 
					      italic: "#f0f6fc",
 | 
				
			||||||
 | 
					      list: "#f2cc60",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    metaDiffRange: "#d2a8ff",
 | 
				
			||||||
 | 
					    storageModifierImport: "#f0f6fc",
 | 
				
			||||||
 | 
					    string: "#a5d6ff",
 | 
				
			||||||
 | 
					    stringRegexp: "#7ee787",
 | 
				
			||||||
 | 
					    sublimelinterGutterMark: "#3d444d",
 | 
				
			||||||
 | 
					    variable: "#ffa657",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const defaultLightChroma = prettylights2Chroma(lightPrettylights);
 | 
				
			||||||
 | 
					export const defaultDarkChroma = prettylights2Chroma(darkPrettylights);
 | 
				
			||||||
							
								
								
									
										389
									
								
								src/core/color.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,389 @@
 | 
				
			|||||||
 | 
					import { rgba, saturate } from "polished";
 | 
				
			||||||
 | 
					import { scaleColorLight } from "src/functions";
 | 
				
			||||||
 | 
					import type { Ansi, Chroma, Console, Diff, Github, Message, Named, Other, Primary, Secondary } from "src/types";
 | 
				
			||||||
 | 
					import { themeVars } from "src/types/vars";
 | 
				
			||||||
 | 
					import { defaultDarkChroma, defaultLightChroma } from "./chroma";
 | 
				
			||||||
 | 
					import type { Theme } from "./theme";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type ThemeColor = {
 | 
				
			||||||
 | 
					  /** 用于标识当前是否为暗色主题: `true` 暗色 `false` 亮色 */
 | 
				
			||||||
 | 
					  isDarkTheme: boolean;
 | 
				
			||||||
 | 
					  /** 主色调(强调色) */
 | 
				
			||||||
 | 
					  primary: string;
 | 
				
			||||||
 | 
					  /** 主色调的对比色, 一般用于 `color` 属性, primary 用于 `background-color` */
 | 
				
			||||||
 | 
					  primaryContrast: string;
 | 
				
			||||||
 | 
					  /** 副色调(边框色) */
 | 
				
			||||||
 | 
					  secondary: string;
 | 
				
			||||||
 | 
					  /** 基础颜色 */
 | 
				
			||||||
 | 
					  base: {
 | 
				
			||||||
 | 
					    /** 红色 */
 | 
				
			||||||
 | 
					    red: string;
 | 
				
			||||||
 | 
					    /** 橙色 */
 | 
				
			||||||
 | 
					    orange: string;
 | 
				
			||||||
 | 
					    /** 黄色 */
 | 
				
			||||||
 | 
					    yellow: string;
 | 
				
			||||||
 | 
					    /** 黄绿色/橄榄色 */
 | 
				
			||||||
 | 
					    olive: string;
 | 
				
			||||||
 | 
					    /** 绿色 */
 | 
				
			||||||
 | 
					    green: string;
 | 
				
			||||||
 | 
					    /** 蓝绿色/青色(偏绿) */
 | 
				
			||||||
 | 
					    teal: string;
 | 
				
			||||||
 | 
					    /** 蓝绿色/青色(偏蓝) */
 | 
				
			||||||
 | 
					    cyan: string;
 | 
				
			||||||
 | 
					    /** 蓝色 */
 | 
				
			||||||
 | 
					    blue: string;
 | 
				
			||||||
 | 
					    /** 蓝紫色/紫罗兰色 */
 | 
				
			||||||
 | 
					    violet: string;
 | 
				
			||||||
 | 
					    /** 紫色 */
 | 
				
			||||||
 | 
					    purple: string;
 | 
				
			||||||
 | 
					    /** 粉红色 */
 | 
				
			||||||
 | 
					    pink: string;
 | 
				
			||||||
 | 
					    /** 棕色 */
 | 
				
			||||||
 | 
					    brown: string;
 | 
				
			||||||
 | 
					    /** 黑色 */
 | 
				
			||||||
 | 
					    black: string;
 | 
				
			||||||
 | 
					    /** 灰色 */
 | 
				
			||||||
 | 
					    grey: string;
 | 
				
			||||||
 | 
					    /** 金色 */
 | 
				
			||||||
 | 
					    gold: string;
 | 
				
			||||||
 | 
					    /** 白色 */
 | 
				
			||||||
 | 
					    white: string;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  /** Action 日志 */
 | 
				
			||||||
 | 
					  console: Console;
 | 
				
			||||||
 | 
					  /** 提交代码对比 */
 | 
				
			||||||
 | 
					  diff: Diff;
 | 
				
			||||||
 | 
					  /** 其他 */
 | 
				
			||||||
 | 
					  other: Other;
 | 
				
			||||||
 | 
					  /** 仅适用于本主题的全局变量, 取自 Github */
 | 
				
			||||||
 | 
					  github: Github;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 定义颜色, 用于生成颜色主题
 | 
				
			||||||
 | 
					 * @example
 | 
				
			||||||
 | 
					 * 文件名: "dark.css.ts"
 | 
				
			||||||
 | 
					 * import type { Console, Diff, Other, Github } from "src/types";
 | 
				
			||||||
 | 
					 * import { defineTheme, themeVars } from "src";
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * const console: Console = {
 | 
				
			||||||
 | 
					 *   fg: {
 | 
				
			||||||
 | 
					 *     self: "#f0f6fc", // self 表示本身等于 --color-console-fg: #f0f6fc, 所有键名为 self 的都将被忽略
 | 
				
			||||||
 | 
					 *     subtle: themeVars.color.body, // 引用别的CSS变量等于 --color-console-fg-subtle: var(--color-body)
 | 
				
			||||||
 | 
					 *     num1: "rgb(125, 133, 144)", // 由于纯数字无法在 TS 中使用点调用, 采用 num 前缀等于 --color-console-fg-1: rgb(125, 133, 144)
 | 
				
			||||||
 | 
					 *   },
 | 
				
			||||||
 | 
					 *   ...
 | 
				
			||||||
 | 
					 * }
 | 
				
			||||||
 | 
					 * ...
 | 
				
			||||||
 | 
					 * export default defineTheme({
 | 
				
			||||||
 | 
					 *   isDarkTheme: true,
 | 
				
			||||||
 | 
					 *   primary: "#0969da",
 | 
				
			||||||
 | 
					 *   ...
 | 
				
			||||||
 | 
					 *   console,
 | 
				
			||||||
 | 
					 *   diff,
 | 
				
			||||||
 | 
					 *   other,
 | 
				
			||||||
 | 
					 *   github,
 | 
				
			||||||
 | 
					 * })
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function defineTheme(themeColor: ThemeColor, chroma?: Chroma): Theme {
 | 
				
			||||||
 | 
					  const brightDir = themeColor.isDarkTheme ? -1 : 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const primary: Primary = {
 | 
				
			||||||
 | 
					    self: themeColor.primary,
 | 
				
			||||||
 | 
					    contrast: themeColor.primaryContrast,
 | 
				
			||||||
 | 
					    dark: {
 | 
				
			||||||
 | 
					      num1: scaleColorLight(themeColor.primary, -12 * brightDir),
 | 
				
			||||||
 | 
					      num2: scaleColorLight(themeColor.primary, -24 * brightDir),
 | 
				
			||||||
 | 
					      num3: scaleColorLight(themeColor.primary, -36 * brightDir),
 | 
				
			||||||
 | 
					      num4: scaleColorLight(themeColor.primary, -48 * brightDir),
 | 
				
			||||||
 | 
					      num5: scaleColorLight(themeColor.primary, -60 * brightDir),
 | 
				
			||||||
 | 
					      num6: scaleColorLight(themeColor.primary, -72 * brightDir),
 | 
				
			||||||
 | 
					      num7: scaleColorLight(themeColor.primary, -84 * brightDir),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    light: {
 | 
				
			||||||
 | 
					      num1: scaleColorLight(themeColor.primary, 12 * brightDir),
 | 
				
			||||||
 | 
					      num2: scaleColorLight(themeColor.primary, 24 * brightDir),
 | 
				
			||||||
 | 
					      num3: scaleColorLight(themeColor.primary, 36 * brightDir),
 | 
				
			||||||
 | 
					      num4: scaleColorLight(themeColor.primary, 48 * brightDir),
 | 
				
			||||||
 | 
					      num5: scaleColorLight(themeColor.primary, 60 * brightDir),
 | 
				
			||||||
 | 
					      num6: scaleColorLight(themeColor.primary, 72 * brightDir),
 | 
				
			||||||
 | 
					      num7: scaleColorLight(themeColor.primary, 84 * brightDir),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    alpha: {
 | 
				
			||||||
 | 
					      num10: rgba(themeColor.primary, 0.1),
 | 
				
			||||||
 | 
					      num20: rgba(themeColor.primary, 0.2),
 | 
				
			||||||
 | 
					      num30: rgba(themeColor.primary, 0.3),
 | 
				
			||||||
 | 
					      num40: rgba(themeColor.primary, 0.4),
 | 
				
			||||||
 | 
					      num50: rgba(themeColor.primary, 0.5),
 | 
				
			||||||
 | 
					      num60: rgba(themeColor.primary, 0.6),
 | 
				
			||||||
 | 
					      num70: rgba(themeColor.primary, 0.7),
 | 
				
			||||||
 | 
					      num80: rgba(themeColor.primary, 0.8),
 | 
				
			||||||
 | 
					      num90: rgba(themeColor.primary, 0.9),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hover: themeColor.isDarkTheme ? themeVars.color.primary.light.num1 : themeVars.color.primary.dark.num1,
 | 
				
			||||||
 | 
					    active: themeColor.isDarkTheme ? themeVars.color.primary.light.num2 : themeVars.color.primary.dark.num2,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const secondary: Secondary = {
 | 
				
			||||||
 | 
					    self: themeColor.secondary,
 | 
				
			||||||
 | 
					    dark: {
 | 
				
			||||||
 | 
					      num1: scaleColorLight(themeColor.secondary, -6 * brightDir),
 | 
				
			||||||
 | 
					      num2: scaleColorLight(themeColor.secondary, -12 * brightDir),
 | 
				
			||||||
 | 
					      num3: scaleColorLight(themeColor.secondary, -18 * brightDir),
 | 
				
			||||||
 | 
					      num4: scaleColorLight(themeColor.secondary, -24 * brightDir),
 | 
				
			||||||
 | 
					      num5: scaleColorLight(themeColor.secondary, -30 * brightDir),
 | 
				
			||||||
 | 
					      num6: scaleColorLight(themeColor.secondary, -36 * brightDir),
 | 
				
			||||||
 | 
					      num7: scaleColorLight(themeColor.secondary, -42 * brightDir),
 | 
				
			||||||
 | 
					      num8: scaleColorLight(themeColor.secondary, -48 * brightDir),
 | 
				
			||||||
 | 
					      num9: scaleColorLight(themeColor.secondary, -54 * brightDir),
 | 
				
			||||||
 | 
					      num10: scaleColorLight(themeColor.secondary, -60 * brightDir),
 | 
				
			||||||
 | 
					      num11: scaleColorLight(themeColor.secondary, -66 * brightDir),
 | 
				
			||||||
 | 
					      num12: scaleColorLight(themeColor.secondary, -72 * brightDir),
 | 
				
			||||||
 | 
					      num13: scaleColorLight(themeColor.secondary, -80 * brightDir),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    light: {
 | 
				
			||||||
 | 
					      num1: scaleColorLight(themeColor.secondary, 18 * brightDir),
 | 
				
			||||||
 | 
					      num2: scaleColorLight(themeColor.secondary, 36 * brightDir),
 | 
				
			||||||
 | 
					      num3: scaleColorLight(themeColor.secondary, 54 * brightDir),
 | 
				
			||||||
 | 
					      num4: scaleColorLight(themeColor.secondary, 72 * brightDir),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    alpha: {
 | 
				
			||||||
 | 
					      num10: rgba(themeColor.secondary, 0.1),
 | 
				
			||||||
 | 
					      num20: rgba(themeColor.secondary, 0.2),
 | 
				
			||||||
 | 
					      num30: rgba(themeColor.secondary, 0.3),
 | 
				
			||||||
 | 
					      num40: rgba(themeColor.secondary, 0.4),
 | 
				
			||||||
 | 
					      num50: rgba(themeColor.secondary, 0.5),
 | 
				
			||||||
 | 
					      num60: rgba(themeColor.secondary, 0.6),
 | 
				
			||||||
 | 
					      num70: rgba(themeColor.secondary, 0.7),
 | 
				
			||||||
 | 
					      num80: rgba(themeColor.secondary, 0.8),
 | 
				
			||||||
 | 
					      num90: rgba(themeColor.secondary, 0.9),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    button: themeVars.color.secondary.dark.num4,
 | 
				
			||||||
 | 
					    hover: themeColor.isDarkTheme ? themeVars.color.secondary.dark.num3 : themeVars.color.secondary.dark.num5,
 | 
				
			||||||
 | 
					    active: themeColor.isDarkTheme ? themeVars.color.secondary.dark.num2 : themeVars.color.secondary.dark.num6,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const named: Named = {
 | 
				
			||||||
 | 
					    red: {
 | 
				
			||||||
 | 
					      self: themeColor.base.red,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.red, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.red, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.red, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.red, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      badge: {
 | 
				
			||||||
 | 
					        self: themeColor.base.red,
 | 
				
			||||||
 | 
					        bg: rgba(themeColor.base.red, 0.1),
 | 
				
			||||||
 | 
					        hover: {
 | 
				
			||||||
 | 
					          bg: rgba(themeColor.base.red, 0.3),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    orange: {
 | 
				
			||||||
 | 
					      self: themeColor.base.orange,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.orange, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.orange, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.orange, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.orange, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      badge: {
 | 
				
			||||||
 | 
					        self: themeColor.base.orange,
 | 
				
			||||||
 | 
					        bg: rgba(themeColor.base.orange, 0.1),
 | 
				
			||||||
 | 
					        hover: {
 | 
				
			||||||
 | 
					          bg: rgba(themeColor.base.orange, 0.3),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    yellow: {
 | 
				
			||||||
 | 
					      self: themeColor.base.yellow,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.yellow, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.yellow, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.yellow, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.yellow, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      badge: {
 | 
				
			||||||
 | 
					        self: themeColor.base.yellow,
 | 
				
			||||||
 | 
					        bg: rgba(themeColor.base.yellow, 0.1),
 | 
				
			||||||
 | 
					        hover: {
 | 
				
			||||||
 | 
					          bg: rgba(themeColor.base.yellow, 0.3),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    olive: {
 | 
				
			||||||
 | 
					      self: themeColor.base.olive,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.olive, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.olive, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.olive, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.olive, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    green: {
 | 
				
			||||||
 | 
					      self: themeColor.base.green,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.green, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.green, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.green, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.green, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      badge: {
 | 
				
			||||||
 | 
					        self: themeColor.base.green,
 | 
				
			||||||
 | 
					        bg: rgba(themeColor.base.green, 0.1),
 | 
				
			||||||
 | 
					        hover: {
 | 
				
			||||||
 | 
					          bg: rgba(themeColor.base.green, 0.3),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    teal: {
 | 
				
			||||||
 | 
					      self: themeColor.base.teal,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.teal, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.teal, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.teal, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.teal, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    blue: {
 | 
				
			||||||
 | 
					      self: themeColor.base.blue,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.blue, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.blue, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.blue, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.blue, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    violet: {
 | 
				
			||||||
 | 
					      self: themeColor.base.violet,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.violet, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.violet, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.violet, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.violet, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    purple: {
 | 
				
			||||||
 | 
					      self: themeColor.base.purple,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.purple, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.purple, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.purple, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.purple, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    pink: {
 | 
				
			||||||
 | 
					      self: themeColor.base.pink,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.pink, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.pink, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.pink, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.pink, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    brown: {
 | 
				
			||||||
 | 
					      self: themeColor.base.brown,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.brown, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.brown, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.brown, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.brown, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    black: {
 | 
				
			||||||
 | 
					      self: themeColor.base.black,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.black, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.black, 25),
 | 
				
			||||||
 | 
					      dark: {
 | 
				
			||||||
 | 
					        num1: scaleColorLight(themeColor.base.black, -10),
 | 
				
			||||||
 | 
					        num2: scaleColorLight(themeColor.base.black, -20),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    grey: {
 | 
				
			||||||
 | 
					      self: themeColor.base.grey,
 | 
				
			||||||
 | 
					      light: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.grey, 15)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.grey, 25),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    gold: themeColor.base.gold,
 | 
				
			||||||
 | 
					    white: themeColor.base.white,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const message: Message = {
 | 
				
			||||||
 | 
					    error: {
 | 
				
			||||||
 | 
					      bg: {
 | 
				
			||||||
 | 
					        self: rgba(themeColor.base.red, 0.1),
 | 
				
			||||||
 | 
					        active: rgba(themeColor.base.red, 0.5),
 | 
				
			||||||
 | 
					        hover: rgba(themeColor.base.red, 0.3),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      border: rgba(themeColor.base.red, 0.4),
 | 
				
			||||||
 | 
					      text: saturate(0.2, themeColor.base.red), // 饱和度提高
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    success: {
 | 
				
			||||||
 | 
					      bg: rgba(themeColor.base.green, 0.1),
 | 
				
			||||||
 | 
					      border: rgba(themeColor.base.green, 0.4),
 | 
				
			||||||
 | 
					      text: saturate(0.2, themeColor.base.green),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    warning: {
 | 
				
			||||||
 | 
					      bg: rgba(themeColor.base.yellow, 0.1),
 | 
				
			||||||
 | 
					      border: rgba(themeColor.base.yellow, 0.4),
 | 
				
			||||||
 | 
					      text: saturate(0.2, themeColor.base.yellow),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    info: {
 | 
				
			||||||
 | 
					      bg: rgba(themeColor.base.blue, 0.1),
 | 
				
			||||||
 | 
					      border: rgba(themeColor.base.blue, 0.4),
 | 
				
			||||||
 | 
					      text: saturate(0.2, themeColor.base.blue),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const ansi: Ansi = {
 | 
				
			||||||
 | 
					    black: themeVars.color.black.self,
 | 
				
			||||||
 | 
					    red: themeVars.color.red.self,
 | 
				
			||||||
 | 
					    green: themeVars.color.green.self,
 | 
				
			||||||
 | 
					    yellow: themeVars.color.yellow.self,
 | 
				
			||||||
 | 
					    blue: themeVars.color.blue.self,
 | 
				
			||||||
 | 
					    magenta: themeVars.color.pink.self,
 | 
				
			||||||
 | 
					    cyan: themeColor.base.cyan,
 | 
				
			||||||
 | 
					    white: themeVars.color.console.fg.subtle,
 | 
				
			||||||
 | 
					    bright: {
 | 
				
			||||||
 | 
					      black: themeVars.color.black.light,
 | 
				
			||||||
 | 
					      red: themeVars.color.red.light,
 | 
				
			||||||
 | 
					      green: themeVars.color.green.light,
 | 
				
			||||||
 | 
					      yellow: themeVars.color.yellow.light,
 | 
				
			||||||
 | 
					      blue: themeVars.color.blue.light,
 | 
				
			||||||
 | 
					      magenta: themeVars.color.pink.light,
 | 
				
			||||||
 | 
					      cyan: themeColor.isDarkTheme
 | 
				
			||||||
 | 
					        ? scaleColorLight(themeColor.base.cyan, 10)
 | 
				
			||||||
 | 
					        : scaleColorLight(themeColor.base.cyan, 25),
 | 
				
			||||||
 | 
					      white: themeVars.color.console.fg.self,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    isDarkTheme: themeColor.isDarkTheme.toString(),
 | 
				
			||||||
 | 
					    chroma: chroma || (themeColor.isDarkTheme ? defaultDarkChroma : defaultLightChroma),
 | 
				
			||||||
 | 
					    color: {
 | 
				
			||||||
 | 
					      primary,
 | 
				
			||||||
 | 
					      secondary,
 | 
				
			||||||
 | 
					      ...named,
 | 
				
			||||||
 | 
					      ansi,
 | 
				
			||||||
 | 
					      console: themeColor.console,
 | 
				
			||||||
 | 
					      diff: themeColor.diff,
 | 
				
			||||||
 | 
					      ...message,
 | 
				
			||||||
 | 
					      ...themeColor.other,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    github: themeColor.github,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										85
									
								
								src/core/display.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					import { saturate } from "polished";
 | 
				
			||||||
 | 
					import { scaleColorLight } from "src/functions";
 | 
				
			||||||
 | 
					import { type GithubColor } from "./github";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type DisplayColor = {
 | 
				
			||||||
 | 
					  num0: string;
 | 
				
			||||||
 | 
					  num1: string;
 | 
				
			||||||
 | 
					  num2: string;
 | 
				
			||||||
 | 
					  num3: string;
 | 
				
			||||||
 | 
					  num4: string;
 | 
				
			||||||
 | 
					  num5: string;
 | 
				
			||||||
 | 
					  num6: string;
 | 
				
			||||||
 | 
					  num7: string;
 | 
				
			||||||
 | 
					  num8: string;
 | 
				
			||||||
 | 
					  num9: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function display2GithubColor(
 | 
				
			||||||
 | 
					  displayColor: DisplayColor,
 | 
				
			||||||
 | 
					  baseGithubColor: GithubColor,
 | 
				
			||||||
 | 
					  soft?: boolean
 | 
				
			||||||
 | 
					): GithubColor {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    ...baseGithubColor,
 | 
				
			||||||
 | 
					    diffBlob: {
 | 
				
			||||||
 | 
					      ...baseGithubColor.diffBlob,
 | 
				
			||||||
 | 
					      hunkNum: { bgColor: { rest: soft ? displayColor.num2 : displayColor.num1 } },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    fgColor: {
 | 
				
			||||||
 | 
					      ...baseGithubColor.fgColor,
 | 
				
			||||||
 | 
					      accent: soft ? displayColor.num7 : displayColor.num6,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    bgColor: {
 | 
				
			||||||
 | 
					      ...baseGithubColor.bgColor,
 | 
				
			||||||
 | 
					      accent: {
 | 
				
			||||||
 | 
					        emphasis: soft ? saturate(-0.1, scaleColorLight(displayColor.num5, -2)) : displayColor.num5,
 | 
				
			||||||
 | 
					        muted: soft ? displayColor.num1 : displayColor.num0,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    borderColor: {
 | 
				
			||||||
 | 
					      ...baseGithubColor.borderColor,
 | 
				
			||||||
 | 
					      accent: {
 | 
				
			||||||
 | 
					        emphasis: soft ? displayColor.num6 : displayColor.num5,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    button: {
 | 
				
			||||||
 | 
					      ...baseGithubColor.button,
 | 
				
			||||||
 | 
					      primary: {
 | 
				
			||||||
 | 
					        ...baseGithubColor.button.primary,
 | 
				
			||||||
 | 
					        fgColor: {
 | 
				
			||||||
 | 
					          ...baseGithubColor.button.primary.fgColor,
 | 
				
			||||||
 | 
					          accent: soft ? displayColor.num7 : displayColor.num6,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          ...baseGithubColor.button.primary.bgColor,
 | 
				
			||||||
 | 
					          rest: soft ? saturate(-0.1, scaleColorLight(displayColor.num5, -2)) : displayColor.num5,
 | 
				
			||||||
 | 
					          hover: soft ? saturate(-0.1, scaleColorLight(displayColor.num5, 3)) : scaleColorLight(displayColor.num5, 5),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      star: {
 | 
				
			||||||
 | 
					        iconColor: soft
 | 
				
			||||||
 | 
					          ? scaleColorLight(displayColor.num6, -2)
 | 
				
			||||||
 | 
					          : saturate(0.1, scaleColorLight(displayColor.num6, -2)),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    underlineNav: {
 | 
				
			||||||
 | 
					      borderColor: {
 | 
				
			||||||
 | 
					        active: soft ? scaleColorLight(saturate(0.1, displayColor.num6), -5) : saturate(0.2, displayColor.num6),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    contribution: {
 | 
				
			||||||
 | 
					      ...baseGithubColor.contribution,
 | 
				
			||||||
 | 
					      default: {
 | 
				
			||||||
 | 
					        ...baseGithubColor.contribution.default,
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          num0: baseGithubColor.contribution.default.bgColor.num0,
 | 
				
			||||||
 | 
					          num1: soft ? displayColor.num2 : displayColor.num1,
 | 
				
			||||||
 | 
					          num2: soft ? displayColor.num3 : displayColor.num2,
 | 
				
			||||||
 | 
					          num3: soft ? displayColor.num5 : displayColor.num4,
 | 
				
			||||||
 | 
					          num4: soft ? displayColor.num7 : displayColor.num6,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										370
									
								
								src/core/github.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,370 @@
 | 
				
			|||||||
 | 
					import { saturate } from "polished";
 | 
				
			||||||
 | 
					import type { Console, Diff, Other } from "src";
 | 
				
			||||||
 | 
					import { scaleColorLight } from "src/functions";
 | 
				
			||||||
 | 
					import type { Github } from "src/types";
 | 
				
			||||||
 | 
					import { themeVars } from "src/types/vars";
 | 
				
			||||||
 | 
					import { type ThemeColor } from "./color";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type GithubColor = {
 | 
				
			||||||
 | 
					  isDarkTheme: boolean;
 | 
				
			||||||
 | 
					  display: {
 | 
				
			||||||
 | 
					    blue: { fgColor: string };
 | 
				
			||||||
 | 
					    brown: { fgColor: string };
 | 
				
			||||||
 | 
					    cyan: { fgColor: string };
 | 
				
			||||||
 | 
					    indigo: { fgColor: string };
 | 
				
			||||||
 | 
					    lemon: { fgColor: string };
 | 
				
			||||||
 | 
					    olive: { fgColor: string };
 | 
				
			||||||
 | 
					    teal: { fgColor: string };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  diffBlob: {
 | 
				
			||||||
 | 
					    addtionNum: { bgColor: string };
 | 
				
			||||||
 | 
					    addtionWord: { bgColor: string };
 | 
				
			||||||
 | 
					    deletionNum: { bgColor: string };
 | 
				
			||||||
 | 
					    deletionWord: { bgColor: string };
 | 
				
			||||||
 | 
					    hunkNum: { bgColor: { rest: string } };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  fgColor: {
 | 
				
			||||||
 | 
					    accent: string;
 | 
				
			||||||
 | 
					    attention: string;
 | 
				
			||||||
 | 
					    danger: string;
 | 
				
			||||||
 | 
					    default: string;
 | 
				
			||||||
 | 
					    disabled: string;
 | 
				
			||||||
 | 
					    done: string;
 | 
				
			||||||
 | 
					    neutral: string;
 | 
				
			||||||
 | 
					    severe: string;
 | 
				
			||||||
 | 
					    sponsors: string;
 | 
				
			||||||
 | 
					    success: string;
 | 
				
			||||||
 | 
					    black: string;
 | 
				
			||||||
 | 
					    white: string;
 | 
				
			||||||
 | 
					    muted: string;
 | 
				
			||||||
 | 
					    onEmphasis: string;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  bgColor: {
 | 
				
			||||||
 | 
					    accent: { emphasis: string; muted: string };
 | 
				
			||||||
 | 
					    attention: { muted: string };
 | 
				
			||||||
 | 
					    emphasis: string;
 | 
				
			||||||
 | 
					    success: { emphasis: string; muted: string };
 | 
				
			||||||
 | 
					    danger: { muted: string };
 | 
				
			||||||
 | 
					    done: { emphasis: string };
 | 
				
			||||||
 | 
					    default: string;
 | 
				
			||||||
 | 
					    inset: string;
 | 
				
			||||||
 | 
					    muted: string;
 | 
				
			||||||
 | 
					    neutral: { muted: string };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  borderColor: {
 | 
				
			||||||
 | 
					    accent: { emphasis: string };
 | 
				
			||||||
 | 
					    attention: { emphasis: string };
 | 
				
			||||||
 | 
					    default: string;
 | 
				
			||||||
 | 
					    success: { emphasis: string };
 | 
				
			||||||
 | 
					    done: { emphasis: string };
 | 
				
			||||||
 | 
					    muted: string;
 | 
				
			||||||
 | 
					    translucent: string;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  button: {
 | 
				
			||||||
 | 
					    primary: { fgColor: { accent: string; rest: string }; bgColor: { rest: string; hover: string } };
 | 
				
			||||||
 | 
					    danger: { fgColor: { rest: string; hover: string }; bgColor: { hover: string } };
 | 
				
			||||||
 | 
					    star: { iconColor: string };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  control: {
 | 
				
			||||||
 | 
					    bgColor: { active: string; hover: string; rest: string };
 | 
				
			||||||
 | 
					    transparent: { bgColor: { active: string; hover: string; selected: string } };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  shadow: { floating: { small: string }; resting: { small: string } };
 | 
				
			||||||
 | 
					  overlay: { backdrop: { bgColor: string }; bgColor: string };
 | 
				
			||||||
 | 
					  underlineNav: { borderColor: { active: string } };
 | 
				
			||||||
 | 
					  contribution: {
 | 
				
			||||||
 | 
					    default: {
 | 
				
			||||||
 | 
					      bgColor: { num0: string; num1: string; num2: string; num3: string; num4: string };
 | 
				
			||||||
 | 
					      borderColor: { num0: string };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function github2ThemeColor(githubColor: GithubColor): ThemeColor {
 | 
				
			||||||
 | 
					  const console: Console = {
 | 
				
			||||||
 | 
					    fg: {
 | 
				
			||||||
 | 
					      self: githubColor.fgColor.default,
 | 
				
			||||||
 | 
					      subtle: githubColor.fgColor.muted,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    bg: githubColor.bgColor.inset,
 | 
				
			||||||
 | 
					    border: githubColor.borderColor.muted,
 | 
				
			||||||
 | 
					    activeBg: githubColor.control.bgColor.active,
 | 
				
			||||||
 | 
					    hoverBg: githubColor.control.transparent.bgColor.hover,
 | 
				
			||||||
 | 
					    menu: {
 | 
				
			||||||
 | 
					      bg: githubColor.overlay.bgColor,
 | 
				
			||||||
 | 
					      border: githubColor.borderColor.muted,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const diff: Diff = {
 | 
				
			||||||
 | 
					    added: {
 | 
				
			||||||
 | 
					      linenum: {
 | 
				
			||||||
 | 
					        bg: githubColor.diffBlob.addtionNum.bgColor,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      row: {
 | 
				
			||||||
 | 
					        bg: githubColor.bgColor.success.muted,
 | 
				
			||||||
 | 
					        border: githubColor.bgColor.success.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      word: {
 | 
				
			||||||
 | 
					        bg: githubColor.diffBlob.addtionWord.bgColor,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    removed: {
 | 
				
			||||||
 | 
					      linenum: {
 | 
				
			||||||
 | 
					        bg: githubColor.diffBlob.deletionNum.bgColor,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      row: {
 | 
				
			||||||
 | 
					        bg: githubColor.bgColor.danger.muted,
 | 
				
			||||||
 | 
					        border: githubColor.bgColor.danger.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      word: {
 | 
				
			||||||
 | 
					        bg: githubColor.diffBlob.deletionWord.bgColor,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    moved: {
 | 
				
			||||||
 | 
					      row: {
 | 
				
			||||||
 | 
					        bg: githubColor.bgColor.attention.muted,
 | 
				
			||||||
 | 
					        border: githubColor.bgColor.attention.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    inactive: githubColor.bgColor.muted,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const other: Other = {
 | 
				
			||||||
 | 
					    body: githubColor.bgColor.default,
 | 
				
			||||||
 | 
					    box: {
 | 
				
			||||||
 | 
					      header: githubColor.bgColor.muted,
 | 
				
			||||||
 | 
					      body: {
 | 
				
			||||||
 | 
					        self: themeVars.color.body,
 | 
				
			||||||
 | 
					        highlight: githubColor.bgColor.accent.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    text: {
 | 
				
			||||||
 | 
					      self: githubColor.fgColor.default,
 | 
				
			||||||
 | 
					      light: {
 | 
				
			||||||
 | 
					        self: githubColor.fgColor.default,
 | 
				
			||||||
 | 
					        num1: githubColor.fgColor.muted,
 | 
				
			||||||
 | 
					        num2: githubColor.fgColor.muted,
 | 
				
			||||||
 | 
					        num3: githubColor.fgColor.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      dark: githubColor.fgColor.default,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    footer: githubColor.bgColor.inset,
 | 
				
			||||||
 | 
					    timeline: githubColor.borderColor.muted,
 | 
				
			||||||
 | 
					    input: {
 | 
				
			||||||
 | 
					      text: themeVars.color.text.self,
 | 
				
			||||||
 | 
					      background: githubColor.bgColor.muted,
 | 
				
			||||||
 | 
					      toggleBackgound: themeVars.color.body,
 | 
				
			||||||
 | 
					      border: {
 | 
				
			||||||
 | 
					        self: themeVars.color.light.border,
 | 
				
			||||||
 | 
					        hover: themeVars.color.light.border,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    light: {
 | 
				
			||||||
 | 
					      self: themeVars.color.body,
 | 
				
			||||||
 | 
					      border: githubColor.borderColor.default,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hover: {
 | 
				
			||||||
 | 
					      self: githubColor.control.bgColor.hover,
 | 
				
			||||||
 | 
					      opaque: themeVars.color.box.header,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    active: githubColor.control.transparent.bgColor.selected,
 | 
				
			||||||
 | 
					    menu: githubColor.overlay.bgColor,
 | 
				
			||||||
 | 
					    card: themeVars.color.body,
 | 
				
			||||||
 | 
					    markup: {
 | 
				
			||||||
 | 
					      tableRow: githubColor.bgColor.muted,
 | 
				
			||||||
 | 
					      code: {
 | 
				
			||||||
 | 
					        block: githubColor.bgColor.muted,
 | 
				
			||||||
 | 
					        inline: githubColor.bgColor.neutral.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    button: githubColor.control.bgColor.rest,
 | 
				
			||||||
 | 
					    codeBg: "unset",
 | 
				
			||||||
 | 
					    shadow: {
 | 
				
			||||||
 | 
					      self: githubColor.shadow.floating.small,
 | 
				
			||||||
 | 
					      opaque: themeVars.color.shadow.self,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    secondaryBg: "unset",
 | 
				
			||||||
 | 
					    expandButton: githubColor.diffBlob.hunkNum.bgColor.rest,
 | 
				
			||||||
 | 
					    placeholderText: themeVars.color.text.light.num3,
 | 
				
			||||||
 | 
					    editorLineHighlight: themeVars.color.primary.light.num5,
 | 
				
			||||||
 | 
					    projectColumnBg: githubColor.bgColor.inset,
 | 
				
			||||||
 | 
					    caret: themeVars.color.text.dark,
 | 
				
			||||||
 | 
					    reaction: {
 | 
				
			||||||
 | 
					      bg: "initial",
 | 
				
			||||||
 | 
					      hoverBg: githubColor.bgColor.accent.muted,
 | 
				
			||||||
 | 
					      activeBg: githubColor.bgColor.accent.muted,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    tooltip: {
 | 
				
			||||||
 | 
					      text: githubColor.fgColor.onEmphasis,
 | 
				
			||||||
 | 
					      bg: githubColor.bgColor.emphasis,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    nav: {
 | 
				
			||||||
 | 
					      bg: githubColor.bgColor.muted,
 | 
				
			||||||
 | 
					      hoverBg: githubColor.control.transparent.bgColor.hover,
 | 
				
			||||||
 | 
					      text: themeVars.color.text.self,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    secondaryNavBg: themeVars.color.body,
 | 
				
			||||||
 | 
					    label: {
 | 
				
			||||||
 | 
					      text: themeVars.color.text.self,
 | 
				
			||||||
 | 
					      bg: githubColor.bgColor.neutral.muted,
 | 
				
			||||||
 | 
					      hoverBg: githubColor.control.transparent.bgColor.active,
 | 
				
			||||||
 | 
					      activeBg: themeVars.color.label.hoverBg,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    accent: themeVars.color.primary.light.num1,
 | 
				
			||||||
 | 
					    smallAccent: themeVars.color.primary.light.num5,
 | 
				
			||||||
 | 
					    highlight: {
 | 
				
			||||||
 | 
					      fg: githubColor.fgColor.attention,
 | 
				
			||||||
 | 
					      bg: githubColor.bgColor.attention.muted,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    overlayBackdrop: githubColor.overlay.backdrop.bgColor,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const github: Github = {
 | 
				
			||||||
 | 
					    fgColor: {
 | 
				
			||||||
 | 
					      accent: githubColor.fgColor.accent,
 | 
				
			||||||
 | 
					      success: githubColor.fgColor.success,
 | 
				
			||||||
 | 
					      done: githubColor.fgColor.done,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    bgColor: {
 | 
				
			||||||
 | 
					      accent: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.bgColor.accent.emphasis,
 | 
				
			||||||
 | 
					        muted: githubColor.bgColor.accent.muted,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      success: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.bgColor.success.emphasis,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      done: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.bgColor.done.emphasis,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    borderColor: {
 | 
				
			||||||
 | 
					      accent: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.borderColor.accent.emphasis,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      attention: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.borderColor.attention.emphasis,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      success: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.borderColor.success.emphasis,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      done: {
 | 
				
			||||||
 | 
					        emphasis: githubColor.borderColor.done.emphasis,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    button: {
 | 
				
			||||||
 | 
					      default: {
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          active: githubColor.control.bgColor.active,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      primary: {
 | 
				
			||||||
 | 
					        fgColor: {
 | 
				
			||||||
 | 
					          accent: saturate(
 | 
				
			||||||
 | 
					            0.1,
 | 
				
			||||||
 | 
					            scaleColorLight(githubColor.button.primary.fgColor.accent, githubColor.isDarkTheme ? 10 : -10)
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					          rest: githubColor.button.primary.fgColor.rest,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          rest: githubColor.button.primary.bgColor.rest,
 | 
				
			||||||
 | 
					          hover: githubColor.button.primary.bgColor.hover,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        borderColor: {
 | 
				
			||||||
 | 
					          rest: githubColor.borderColor.translucent,
 | 
				
			||||||
 | 
					          hover: githubColor.borderColor.translucent,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      danger: {
 | 
				
			||||||
 | 
					        fgColor: {
 | 
				
			||||||
 | 
					          rest: githubColor.button.danger.fgColor.rest,
 | 
				
			||||||
 | 
					          hover: githubColor.button.danger.fgColor.hover,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          rest: githubColor.control.bgColor.rest,
 | 
				
			||||||
 | 
					          hover: githubColor.button.danger.bgColor.hover,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        borderColor: {
 | 
				
			||||||
 | 
					          hover: githubColor.borderColor.translucent,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      star: {
 | 
				
			||||||
 | 
					        iconColor: githubColor.button.star.iconColor,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    control: {
 | 
				
			||||||
 | 
					      bgColor: {
 | 
				
			||||||
 | 
					        rest: githubColor.control.bgColor.rest,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      transparent: {
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          hover: githubColor.control.transparent.bgColor.hover,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    shadow: {
 | 
				
			||||||
 | 
					      floating: {
 | 
				
			||||||
 | 
					        small: `0px 0px 0px 1px ${themeVars.color.light.border}, 0px 6px 12px -3px ${themeVars.color.shadow.self}, 0px 6px 18px 0px ${themeVars.color.shadow.self};`,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      resting: {
 | 
				
			||||||
 | 
					        small: `0px 1px 1px 0px ${githubColor.shadow.resting.small}, 0px 1px 3px 0px ${githubColor.shadow.resting.small};`,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    underlineNav: {
 | 
				
			||||||
 | 
					      borderColor: {
 | 
				
			||||||
 | 
					        active: githubColor.underlineNav.borderColor.active,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    contribution: {
 | 
				
			||||||
 | 
					      default: {
 | 
				
			||||||
 | 
					        bgColor: {
 | 
				
			||||||
 | 
					          num0: githubColor.contribution.default.bgColor.num0,
 | 
				
			||||||
 | 
					          num1: githubColor.contribution.default.bgColor.num1,
 | 
				
			||||||
 | 
					          num2: githubColor.contribution.default.bgColor.num2,
 | 
				
			||||||
 | 
					          num3: githubColor.contribution.default.bgColor.num3,
 | 
				
			||||||
 | 
					          num4: githubColor.contribution.default.bgColor.num4,
 | 
				
			||||||
 | 
					          num5: saturate(
 | 
				
			||||||
 | 
					            0.2,
 | 
				
			||||||
 | 
					            scaleColorLight(githubColor.contribution.default.bgColor.num4, githubColor.isDarkTheme ? 58 : -58)
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        borderColor: {
 | 
				
			||||||
 | 
					          num0: githubColor.contribution.default.borderColor.num0,
 | 
				
			||||||
 | 
					          num1: themeVars.github.contribution.default.borderColor.num0,
 | 
				
			||||||
 | 
					          num2: themeVars.github.contribution.default.borderColor.num0,
 | 
				
			||||||
 | 
					          num3: themeVars.github.contribution.default.borderColor.num0,
 | 
				
			||||||
 | 
					          num4: themeVars.github.contribution.default.borderColor.num0,
 | 
				
			||||||
 | 
					          num5: themeVars.github.contribution.default.borderColor.num0,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    isDarkTheme: githubColor.isDarkTheme,
 | 
				
			||||||
 | 
					    primary: githubColor.fgColor.accent,
 | 
				
			||||||
 | 
					    primaryContrast: githubColor.fgColor.default,
 | 
				
			||||||
 | 
					    secondary: githubColor.borderColor.default,
 | 
				
			||||||
 | 
					    base: {
 | 
				
			||||||
 | 
					      red: githubColor.fgColor.danger,
 | 
				
			||||||
 | 
					      orange: githubColor.fgColor.severe,
 | 
				
			||||||
 | 
					      yellow: githubColor.fgColor.attention,
 | 
				
			||||||
 | 
					      olive: githubColor.display.olive.fgColor,
 | 
				
			||||||
 | 
					      green: githubColor.fgColor.success,
 | 
				
			||||||
 | 
					      cyan: githubColor.display.cyan.fgColor,
 | 
				
			||||||
 | 
					      teal: githubColor.display.teal.fgColor,
 | 
				
			||||||
 | 
					      blue: githubColor.display.blue.fgColor,
 | 
				
			||||||
 | 
					      violet: githubColor.display.indigo.fgColor,
 | 
				
			||||||
 | 
					      purple: githubColor.fgColor.done,
 | 
				
			||||||
 | 
					      pink: githubColor.fgColor.sponsors,
 | 
				
			||||||
 | 
					      brown: githubColor.display.brown.fgColor,
 | 
				
			||||||
 | 
					      black: githubColor.fgColor.black,
 | 
				
			||||||
 | 
					      grey: githubColor.fgColor.neutral,
 | 
				
			||||||
 | 
					      gold: githubColor.display.lemon.fgColor,
 | 
				
			||||||
 | 
					      white: githubColor.fgColor.white,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    console,
 | 
				
			||||||
 | 
					    diff,
 | 
				
			||||||
 | 
					    other,
 | 
				
			||||||
 | 
					    github,
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								src/core/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					export { createTheme } from "./theme";
 | 
				
			||||||
							
								
								
									
										127
									
								
								src/core/prettylights.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,127 @@
 | 
				
			|||||||
 | 
					import type { Chroma } from "src/types";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type prettylightsColor = {
 | 
				
			||||||
 | 
					  syntax: {
 | 
				
			||||||
 | 
					    brackethighlighter: { angle: string; unmatched: string };
 | 
				
			||||||
 | 
					    carriage: { return: { bg: string; text: string } };
 | 
				
			||||||
 | 
					    comment: string;
 | 
				
			||||||
 | 
					    constant: string;
 | 
				
			||||||
 | 
					    constantOtherReferenceLink: string;
 | 
				
			||||||
 | 
					    entity: string;
 | 
				
			||||||
 | 
					    entityTag: string;
 | 
				
			||||||
 | 
					    invalid: { illegal: { bg: string; text: string } };
 | 
				
			||||||
 | 
					    keyword: string;
 | 
				
			||||||
 | 
					    markup: {
 | 
				
			||||||
 | 
					      bold: string;
 | 
				
			||||||
 | 
					      changed: { bg: string; text: string };
 | 
				
			||||||
 | 
					      deleted: { bg: string; text: string };
 | 
				
			||||||
 | 
					      heading: string;
 | 
				
			||||||
 | 
					      ignored: { bg: string; text: string };
 | 
				
			||||||
 | 
					      inserted: { bg: string; text: string };
 | 
				
			||||||
 | 
					      italic: string;
 | 
				
			||||||
 | 
					      list: string;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    metaDiffRange: string;
 | 
				
			||||||
 | 
					    storageModifierImport: string;
 | 
				
			||||||
 | 
					    string: string;
 | 
				
			||||||
 | 
					    stringRegexp: string;
 | 
				
			||||||
 | 
					    sublimelinterGutterMark: string;
 | 
				
			||||||
 | 
					    variable: string;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function prettylights2Chroma(prettylights: prettylightsColor): Chroma {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    textWhiteSpace: prettylights.syntax.brackethighlighter.unmatched,
 | 
				
			||||||
 | 
					    err: prettylights.syntax.brackethighlighter.unmatched,
 | 
				
			||||||
 | 
					    keyword: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.keyword,
 | 
				
			||||||
 | 
					      constant: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      declaration: prettylights.syntax.keyword,
 | 
				
			||||||
 | 
					      namespace: prettylights.syntax.keyword,
 | 
				
			||||||
 | 
					      pseudo: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      reserved: prettylights.syntax.keyword,
 | 
				
			||||||
 | 
					      type: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    name: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      attribute: prettylights.syntax.entityTag,
 | 
				
			||||||
 | 
					      builtin: prettylights.syntax.entity,
 | 
				
			||||||
 | 
					      builtinPseudo: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      class: prettylights.syntax.variable,
 | 
				
			||||||
 | 
					      constant: prettylights.syntax.variable,
 | 
				
			||||||
 | 
					      decorator: prettylights.syntax.entity,
 | 
				
			||||||
 | 
					      entity: prettylights.syntax.variable,
 | 
				
			||||||
 | 
					      exception: prettylights.syntax.variable,
 | 
				
			||||||
 | 
					      function: prettylights.syntax.entity,
 | 
				
			||||||
 | 
					      functionMagic: prettylights.syntax.entity,
 | 
				
			||||||
 | 
					      label: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      other: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      namespace: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      property: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      tag: prettylights.syntax.entityTag,
 | 
				
			||||||
 | 
					      variable: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      variableClass: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      variableGlobal: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      variableInstance: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      variableMagic: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    literal: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      date: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    string: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      affix: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      backtick: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      char: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      delimiter: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      doc: prettylights.syntax.comment,
 | 
				
			||||||
 | 
					      double: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      escape: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      heredoc: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      interpol: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      other: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      regex: prettylights.syntax.stringRegexp,
 | 
				
			||||||
 | 
					      single: prettylights.syntax.string,
 | 
				
			||||||
 | 
					      symbol: prettylights.syntax.string,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    number: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      bin: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      float: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      hex: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      integer: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      integerLong: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      oct: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    operator: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      word: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    punctuation: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					    comment: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.comment,
 | 
				
			||||||
 | 
					      hashbang: prettylights.syntax.comment,
 | 
				
			||||||
 | 
					      multiline: prettylights.syntax.comment,
 | 
				
			||||||
 | 
					      preproc: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      preprocFile: prettylights.syntax.constant,
 | 
				
			||||||
 | 
					      single: prettylights.syntax.comment,
 | 
				
			||||||
 | 
					      special: prettylights.syntax.comment,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    generic: {
 | 
				
			||||||
 | 
					      self: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      deleted: prettylights.syntax.markup.deleted.text,
 | 
				
			||||||
 | 
					      emph: prettylights.syntax.markup.italic,
 | 
				
			||||||
 | 
					      error: prettylights.syntax.invalid.illegal.text,
 | 
				
			||||||
 | 
					      heading: prettylights.syntax.markup.heading,
 | 
				
			||||||
 | 
					      inserted: prettylights.syntax.markup.inserted.text,
 | 
				
			||||||
 | 
					      output: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      prompt: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      strong: prettylights.syntax.markup.bold,
 | 
				
			||||||
 | 
					      subheading: prettylights.syntax.markup.heading,
 | 
				
			||||||
 | 
					      traceback: prettylights.syntax.invalid.illegal.text,
 | 
				
			||||||
 | 
					      underline: prettylights.syntax.markup.italic,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										67
									
								
								src/core/theme.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					import { createGlobalTheme, globalStyle } from "@vanilla-extract/css";
 | 
				
			||||||
 | 
					import fs from "node:fs";
 | 
				
			||||||
 | 
					import path from "node:path";
 | 
				
			||||||
 | 
					import { otherThemeVars, themeInfoVars, themeVars } from "src/types/vars";
 | 
				
			||||||
 | 
					import type { MapLeafNodes, WithOptionalLayer } from "./types";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type Theme = WithOptionalLayer<MapLeafNodes<typeof themeVars, string>>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const overlayAppearDown = "overlay-appear-down";
 | 
				
			||||||
 | 
					export const animationDown = `200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running ${overlayAppearDown}`;
 | 
				
			||||||
 | 
					export const overlayAppearUp = "overlay-appear-up";
 | 
				
			||||||
 | 
					export const animationUp = `200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running ${overlayAppearUp}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emoji = `
 | 
				
			||||||
 | 
					.emoji[aria-label="check mark"],
 | 
				
			||||||
 | 
					.emoji[aria-label="currency exchange"],
 | 
				
			||||||
 | 
					.emoji[aria-label="TOP arrow"],
 | 
				
			||||||
 | 
					.emoji[aria-label="END arrow"],
 | 
				
			||||||
 | 
					.emoji[aria-label="ON! arrow"],
 | 
				
			||||||
 | 
					.emoji[aria-label="SOON arrow"],
 | 
				
			||||||
 | 
					.emoji[aria-label="heavy dollar sign"],
 | 
				
			||||||
 | 
					.emoji[aria-label="copyright"],
 | 
				
			||||||
 | 
					.emoji[aria-label="registered"],
 | 
				
			||||||
 | 
					.emoji[aria-label="trade mark"],
 | 
				
			||||||
 | 
					.emoji[aria-label="multiply"],
 | 
				
			||||||
 | 
					.emoji[aria-label="plus"],
 | 
				
			||||||
 | 
					.emoji[aria-label="minus"],
 | 
				
			||||||
 | 
					.emoji[aria-label="divide"],
 | 
				
			||||||
 | 
					.emoji[aria-label="curly loop"],
 | 
				
			||||||
 | 
					.emoji[aria-label="double curly loop"],
 | 
				
			||||||
 | 
					.emoji[aria-label="wavy dash"],
 | 
				
			||||||
 | 
					.emoji[aria-label="paw prints"],
 | 
				
			||||||
 | 
					.emoji[aria-label="musical note"],
 | 
				
			||||||
 | 
					.emoji[aria-label="musical notes"]
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 版本号: 版本号.YYMMDD
 | 
				
			||||||
 | 
					const now = new Date();
 | 
				
			||||||
 | 
					const year = now.getFullYear().toString().slice(-2);
 | 
				
			||||||
 | 
					const month = (now.getMonth() + 1).toString().padStart(2, "0");
 | 
				
			||||||
 | 
					const day = now.getDate().toString().padStart(2, "0");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const pkgPath = path.join(__dirname, "../..", "package.json");
 | 
				
			||||||
 | 
					const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
 | 
				
			||||||
 | 
					const version = `"${pkg.version}.${year}${month}${day}"`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function createTheme(theme: Theme): void {
 | 
				
			||||||
 | 
					  const isDarkTheme: boolean = JSON.parse(theme.isDarkTheme);
 | 
				
			||||||
 | 
					  createGlobalTheme(":root", themeInfoVars, { version });
 | 
				
			||||||
 | 
					  createGlobalTheme(":root", themeVars, theme);
 | 
				
			||||||
 | 
					  createGlobalTheme(":root", otherThemeVars, {
 | 
				
			||||||
 | 
					    border: { radius: "6px" },
 | 
				
			||||||
 | 
					    color: {
 | 
				
			||||||
 | 
					      git: "#f05133",
 | 
				
			||||||
 | 
					      light: {
 | 
				
			||||||
 | 
					        mimicEnabled: isDarkTheme
 | 
				
			||||||
 | 
					          ? "rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled)))"
 | 
				
			||||||
 | 
					          : "rgba(0, 0, 0, calc(6 / 255 * 222 / 255 / var(--opacity-disabled)))",
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  globalStyle(":root", {
 | 
				
			||||||
 | 
					    accentColor: themeVars.color.accent,
 | 
				
			||||||
 | 
					    colorScheme: isDarkTheme ? "dark" : "light",
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  if (isDarkTheme) globalStyle(emoji, { filter: "invert(100%) hue-rotate(180deg)" });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/core/types.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					type Primitive = string | boolean | number | null | undefined;
 | 
				
			||||||
 | 
					type Tokens = { [key: string]: string | Tokens };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type CSSVarFunction = `var(--${string})`;
 | 
				
			||||||
 | 
					export type WithOptionalLayer<T extends Tokens> = T & { "@layer"?: string };
 | 
				
			||||||
 | 
					export type MapLeafNodes<Obj, LeafType> = {
 | 
				
			||||||
 | 
					  [Prop in keyof Obj]: Obj[Prop] extends Primitive
 | 
				
			||||||
 | 
					    ? LeafType
 | 
				
			||||||
 | 
					    : Obj[Prop] extends Record<string | number, unknown>
 | 
				
			||||||
 | 
					      ? MapLeafNodes<Obj[Prop], LeafType>
 | 
				
			||||||
 | 
					      : never;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										139
									
								
								src/core/vite.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					import { execSync } from "node:child_process";
 | 
				
			||||||
 | 
					import crypto from "node:crypto";
 | 
				
			||||||
 | 
					import fs from "node:fs";
 | 
				
			||||||
 | 
					import path from "node:path";
 | 
				
			||||||
 | 
					import type { Plugin } from "vite";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const suffix = ".css.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 生成主题输入
 | 
				
			||||||
 | 
					 * @param outDir 输出目录与 vite 配置中的 outDir 一致, 用于生成临时目录
 | 
				
			||||||
 | 
					 * @param themeDir 颜色主题目录
 | 
				
			||||||
 | 
					 * @param devTheme 开发模式下的主题, 仅打包该主题
 | 
				
			||||||
 | 
					 * @param mode 模式, 开发模式为 dev `vite build --mode dev`
 | 
				
			||||||
 | 
					 * @returns vite.rollupOptions.input 的配置
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function themeInput(outDir: string, themeDir: string, mode: string): { [key: string]: string } {
 | 
				
			||||||
 | 
					  const hash = crypto.randomBytes(6).toString("hex");
 | 
				
			||||||
 | 
					  const tmpDir = `${outDir}/tmp-${hash}`; // 输出目录下的临时目录
 | 
				
			||||||
 | 
					  fs.mkdirSync(tmpDir, { recursive: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const input: { [key: string]: string } = {};
 | 
				
			||||||
 | 
					  const themeEntries = fs.readdirSync(themeDir, { withFileTypes: true });
 | 
				
			||||||
 | 
					  const devTheme = process.env.DEV_THEME || "dark"; // 开发模式仅打包单个颜色主题
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (const entry of themeEntries) {
 | 
				
			||||||
 | 
					    // 目录下所有的 css.ts 文件都作为主题入口
 | 
				
			||||||
 | 
					    if (entry.isFile() && entry.name.endsWith(suffix)) {
 | 
				
			||||||
 | 
					      const fileName = entry.name.replace(suffix, "");
 | 
				
			||||||
 | 
					      // 开发模式只打包 devTheme 主题
 | 
				
			||||||
 | 
					      if (mode === "dev" && fileName !== devTheme) continue;
 | 
				
			||||||
 | 
					      // 创建颜色主题的 css.ts 文件, vanilla-extract 需要这个文件后缀名并生成 css
 | 
				
			||||||
 | 
					      const tmpCssTs = path.join(tmpDir, `${fileName}${suffix}`);
 | 
				
			||||||
 | 
					      const createImport = `import { createTheme } from "src/core";`;
 | 
				
			||||||
 | 
					      const themeImport = `import theme from "themes/${fileName}";`;
 | 
				
			||||||
 | 
					      const createFn = `createTheme(theme);`;
 | 
				
			||||||
 | 
					      fs.writeFileSync(tmpCssTs, `${createImport}\n${themeImport}\n${createFn}`);
 | 
				
			||||||
 | 
					      // 生成主题入口的 .ts 文件, 合并样式和颜色主题
 | 
				
			||||||
 | 
					      const tmpInputTs = path.join(tmpDir, `${fileName}.ts`);
 | 
				
			||||||
 | 
					      const stylesImport = `import "styles";`;
 | 
				
			||||||
 | 
					      const cssImport = `import "./${fileName}${suffix}";`;
 | 
				
			||||||
 | 
					      fs.writeFileSync(tmpInputTs, `${stylesImport}\n${cssImport}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      input[fileName] = tmpInputTs;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (mode === "dev") {
 | 
				
			||||||
 | 
					    console.log("[themeInput] devTheme:", devTheme);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return input;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function giteaThemeMetaInfo(nameGroup: string[]): string {
 | 
				
			||||||
 | 
					  const displayName = nameGroup.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
 | 
				
			||||||
 | 
					  return `gitea-theme-meta-info{--theme-display-name:"GitHub ${displayName}";}`; // 不要省略分号, 也不要追加任何变量, 否则 Gitea 不识别
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const prefix = "theme-github-";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 生成主题文件
 | 
				
			||||||
 | 
					 * @important vite.rollupOptions.output 配置 `assetFileNames: "[name].[ext]"`
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function themePlugin(): Plugin {
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    name: "themePlugin",
 | 
				
			||||||
 | 
					    generateBundle(this, _, bundle) {
 | 
				
			||||||
 | 
					      let styles = "";
 | 
				
			||||||
 | 
					      for (const [key, value] of Object.entries(bundle)) {
 | 
				
			||||||
 | 
					        if (value.type === "chunk") {
 | 
				
			||||||
 | 
					          delete bundle[key]; // 删除 chunk
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          // 样式文件是通过入口导入的, 没有原始文件名
 | 
				
			||||||
 | 
					          if (value.originalFileNames.length === 0) {
 | 
				
			||||||
 | 
					            // 收集所有的样式文件(逻辑上只有一个)
 | 
				
			||||||
 | 
					            // vite 会在尾部添加注释, 后续会合并到颜色主题, 此处需要删除注释
 | 
				
			||||||
 | 
					            styles += value.source.toString().replace("/*$vite$:1*/", "");
 | 
				
			||||||
 | 
					            delete bundle[key];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // 生成所有的主题文件
 | 
				
			||||||
 | 
					      for (const [key, value] of Object.entries(bundle)) {
 | 
				
			||||||
 | 
					        // 仅为了类型检查, 逻辑上输出中全是 asset 类型
 | 
				
			||||||
 | 
					        if (value.type === "asset") {
 | 
				
			||||||
 | 
					          const name = `${prefix}${key}`;
 | 
				
			||||||
 | 
					          const fileName = `${prefix}${value.fileName}`;
 | 
				
			||||||
 | 
					          const originalFileName = value.originalFileNames.pop();
 | 
				
			||||||
 | 
					          const type = value.type;
 | 
				
			||||||
 | 
					          // 合并样式文件和主题信息
 | 
				
			||||||
 | 
					          const meta = giteaThemeMetaInfo(key.split(".")[0].split("-"));
 | 
				
			||||||
 | 
					          const source = `${meta}${value.source.toString()}${styles}`;
 | 
				
			||||||
 | 
					          // 添加主题到输出
 | 
				
			||||||
 | 
					          this.emitFile({ name, fileName, source, type, originalFileName });
 | 
				
			||||||
 | 
					          // 自动颜色主题
 | 
				
			||||||
 | 
					          const isDark = key.endsWith("dark.css");
 | 
				
			||||||
 | 
					          const darkName = key.replace("light", "dark");
 | 
				
			||||||
 | 
					          const lightName = darkName.replace("dark", "light");
 | 
				
			||||||
 | 
					          const findTheme = isDark ? lightName : darkName;
 | 
				
			||||||
 | 
					          if (findTheme in bundle) {
 | 
				
			||||||
 | 
					            const autoName = `${prefix}${darkName.replace("dark", "auto")}`;
 | 
				
			||||||
 | 
					            const lightContent = `@import "./${prefix}${lightName}" (prefers-color-scheme: light);`;
 | 
				
			||||||
 | 
					            const darkContent = `@import "./${prefix}${darkName}" (prefers-color-scheme: dark);`;
 | 
				
			||||||
 | 
					            const nameGroup = key.split(".")[0].split("-").slice(0, -1);
 | 
				
			||||||
 | 
					            nameGroup.push("auto");
 | 
				
			||||||
 | 
					            const metaInfo = giteaThemeMetaInfo(nameGroup);
 | 
				
			||||||
 | 
					            this.emitFile({
 | 
				
			||||||
 | 
					              name: autoName,
 | 
				
			||||||
 | 
					              fileName: autoName,
 | 
				
			||||||
 | 
					              type: "asset",
 | 
				
			||||||
 | 
					              source: `${lightContent}\n${darkContent}\n${metaInfo}`,
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          // 删除原始的样式文件, 自动颜色主题因为删除, 永远不会生成两次
 | 
				
			||||||
 | 
					          delete bundle[key];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    writeBundle() {
 | 
				
			||||||
 | 
					      // 上传到服务器
 | 
				
			||||||
 | 
					      const server = process.env.SSH_SERVER;
 | 
				
			||||||
 | 
					      const user = process.env.SSH_USER || "root";
 | 
				
			||||||
 | 
					      const theme_path = process.env.GITEA_THEME_PATH;
 | 
				
			||||||
 | 
					      if (server && theme_path) {
 | 
				
			||||||
 | 
					        const cmd = `scp dist/${prefix}*.css ${user}@${server}:${theme_path}`;
 | 
				
			||||||
 | 
					        console.log("[themePlugin] exec:", cmd);
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					          execSync(cmd, { stdio: "inherit" });
 | 
				
			||||||
 | 
					          // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
				
			||||||
 | 
					        } catch (_) {
 | 
				
			||||||
 | 
					          // continue regardless of error
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        console.log("[themePlugin] no SSH_SERVER or GITEA_THEME_PATH, skip upload");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      console.log("[themePlugin] exec end.");
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										2
									
								
								src/functions/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					export { scaleColorLight } from "./scss";
 | 
				
			||||||
 | 
					export { fallbackVar } from "./var";
 | 
				
			||||||
							
								
								
									
										27
									
								
								src/functions/scss.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					import { hsl, parseToHsl } from "polished";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 改变颜色的亮度, 等同于 sass 中的 `color.scale` 函数
 | 
				
			||||||
 | 
					 * @param color 颜色值
 | 
				
			||||||
 | 
					 * @param lightnessScale 亮度变化比例,负数表示变暗,正数表示变亮
 | 
				
			||||||
 | 
					 * @returns 新的颜色值
 | 
				
			||||||
 | 
					 * @example
 | 
				
			||||||
 | 
					 * const newColor = scaleColorLight("#ff0000", 20); // 变亮
 | 
				
			||||||
 | 
					 * const newColor = scaleColorLight("#ff0000", -20); // 变暗
 | 
				
			||||||
 | 
					 * 等同于 sass `@use "sass:color"`;
 | 
				
			||||||
 | 
					 * color: color.scale(#ff0000, $lightness: 20%)
 | 
				
			||||||
 | 
					 * color: color.scale(#ff0000, $lightness: -20%)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function scaleColorLight(color: string, lightness: number) {
 | 
				
			||||||
 | 
					  const hslColor = parseToHsl(color);
 | 
				
			||||||
 | 
					  let newLightness;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (lightness < 0) {
 | 
				
			||||||
 | 
					    newLightness = hslColor.lightness * (1 + lightness / 100); // 变暗
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    newLightness = hslColor.lightness + (1 - hslColor.lightness) * (lightness / 100); // 变亮
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  newLightness = Math.min(1, Math.max(0, newLightness)); // 确保亮度值在 0 到 1 之间
 | 
				
			||||||
 | 
					  return hsl(hslColor.hue, hslColor.saturation, newLightness);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/functions/var.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					import type { CSSVarFunction } from "src/core/types";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CSSFallbackVar = `var(--${string}, ${string})`;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 设置 CSS 变量的回退值
 | 
				
			||||||
 | 
					 * @param cssvar `var(--${string})`
 | 
				
			||||||
 | 
					 * @param fallback
 | 
				
			||||||
 | 
					 * @returns `var(--${string}, fallback)`
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function fallbackVar(cssvar: CSSVarFunction, fallback: string): CSSFallbackVar {
 | 
				
			||||||
 | 
					  const var_name = cssvar.replace("var(--", "").replace(")", "");
 | 
				
			||||||
 | 
					  return `var(--${var_name}, ${fallback})`;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										5
									
								
								src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					export { defaultDarkChroma, defaultLightChroma } from "./core/chroma";
 | 
				
			||||||
 | 
					export { defineTheme, type ThemeColor } from "./core/color";
 | 
				
			||||||
 | 
					export type { Theme } from "./core/theme";
 | 
				
			||||||
 | 
					export type { Ansi, Chroma, Console, Diff, Github, Message, Named, Other, Primary, Secondary } from "./types";
 | 
				
			||||||
 | 
					export { otherThemeVars, themeVars } from "./types/vars";
 | 
				
			||||||
@@ -1,9 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
@use "components/dashboard"; // 首页
 | 
					 | 
				
			||||||
@use "components/repo"; // 仓库
 | 
					 | 
				
			||||||
@use "components/issue"; // 工单&拉取请求
 | 
					 | 
				
			||||||
@use "components/setting"; // 设置
 | 
					 | 
				
			||||||
@use "components/release"; // 发布
 | 
					 | 
				
			||||||
@use "components/actions"; // 操作
 | 
					 | 
				
			||||||
@use "components/heatmap"; // 热力图
 | 
					 | 
				
			||||||
@use "components/diff"; // 对比
 | 
					 | 
				
			||||||
@@ -1,238 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.page-content.repository.actions .ui.grid {
 | 
					 | 
				
			||||||
  .four.wide {
 | 
					 | 
				
			||||||
    border-right: 1px solid var(--color-light-border);
 | 
					 | 
				
			||||||
    min-height: calc(-104px + 100vh);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:before {
 | 
					 | 
				
			||||||
      content: "Actions";
 | 
					 | 
				
			||||||
      display: block;
 | 
					 | 
				
			||||||
      font-size: 20px;
 | 
					 | 
				
			||||||
      font-weight: 600;
 | 
					 | 
				
			||||||
      margin-top: 6px;
 | 
					 | 
				
			||||||
      margin-bottom: 24px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .twelve.wide {
 | 
					 | 
				
			||||||
    &:before {
 | 
					 | 
				
			||||||
      content: "Workflow Runs";
 | 
					 | 
				
			||||||
      display: block;
 | 
					 | 
				
			||||||
      font-size: 20px;
 | 
					 | 
				
			||||||
      margin-top: 6px;
 | 
					 | 
				
			||||||
      margin-bottom: 24px;
 | 
					 | 
				
			||||||
      margin-left: 2px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .ui.secondary.menu {
 | 
					 | 
				
			||||||
      background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
      border: 1px solid var(--color-light-border);
 | 
					 | 
				
			||||||
      border-bottom: 0;
 | 
					 | 
				
			||||||
      border-top-left-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      border-top-right-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      padding: 16px;
 | 
					 | 
				
			||||||
      margin-bottom: 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .item {
 | 
					 | 
				
			||||||
        padding: 6px 12px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .ui.info.message {
 | 
					 | 
				
			||||||
      border-radius: 0;
 | 
					 | 
				
			||||||
      border-left-color: var(--color-light-border);
 | 
					 | 
				
			||||||
      border-right-color: var(--color-light-border);
 | 
					 | 
				
			||||||
      margin: 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      ~ .run-list {
 | 
					 | 
				
			||||||
        border-top: 0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .run-list {
 | 
					 | 
				
			||||||
      border: 1px solid var(--color-light-border);
 | 
					 | 
				
			||||||
      border-bottom-left-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      border-bottom-right-radius: var(--border-radius);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .flex-item {
 | 
					 | 
				
			||||||
        padding: 16px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .flex-item-leading {
 | 
					 | 
				
			||||||
          align-self: flex-start;
 | 
					 | 
				
			||||||
          margin-top: 2px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .flex-item-main {
 | 
					 | 
				
			||||||
          gap: 0.5rem;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .flex-item-trailing {
 | 
					 | 
				
			||||||
          justify-content: space-between;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          > .ui.label {
 | 
					 | 
				
			||||||
            border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
            margin-left: 32px;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@media (max-width: 767.98px) {
 | 
					 | 
				
			||||||
  .page-content.repository.actions .ui.grid .four.wide {
 | 
					 | 
				
			||||||
    min-height: auto;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 工作流禁用标签
 | 
					 | 
				
			||||||
.ui.vertical.menu .item > .ui.red.label {
 | 
					 | 
				
			||||||
  color: var(--color-error-text);
 | 
					 | 
				
			||||||
  border: 1px solid var(--color-error-border);
 | 
					 | 
				
			||||||
  background: var(--color-error-bg);
 | 
					 | 
				
			||||||
  margin-top: 0.5px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 手动工作流下拉列表
 | 
					 | 
				
			||||||
#runWorkflowDispatchForm {
 | 
					 | 
				
			||||||
  // 分支选择按钮
 | 
					 | 
				
			||||||
  .ui.dropdown.button.branch-selector-dropdown {
 | 
					 | 
				
			||||||
    padding: 8px 24px 8px 8px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    svg.octicon-git-branch {
 | 
					 | 
				
			||||||
      margin-right: 6px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 日志
 | 
					 | 
				
			||||||
.ui.container.action-view-container {
 | 
					 | 
				
			||||||
  width: auto;
 | 
					 | 
				
			||||||
  max-width: 100%;
 | 
					 | 
				
			||||||
  padding: 0 24px 0 16px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .action-view-header {
 | 
					 | 
				
			||||||
    margin-top: 20px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .action-info-summary {
 | 
					 | 
				
			||||||
      margin-left: 14px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .action-commit-summary {
 | 
					 | 
				
			||||||
      margin-left: 28 + 14px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.action-view-left.action-view-left {
 | 
					 | 
				
			||||||
  width: 16.5%;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.action-view-right.action-view-right {
 | 
					 | 
				
			||||||
  width: 83.5%;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@media (max-width: 767.98px) {
 | 
					 | 
				
			||||||
  .action-view-left.action-view-left,
 | 
					 | 
				
			||||||
  .action-view-right.action-view-right {
 | 
					 | 
				
			||||||
    width: 100%;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.action-view-left {
 | 
					 | 
				
			||||||
  margin-top: 16px;
 | 
					 | 
				
			||||||
  margin-right: 28px;
 | 
					 | 
				
			||||||
  border-top: 1px solid #2f353d;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:before {
 | 
					 | 
				
			||||||
    content: "Jobs";
 | 
					 | 
				
			||||||
    color: #9198a1;
 | 
					 | 
				
			||||||
    font-size: 12px;
 | 
					 | 
				
			||||||
    font-weight: 600;
 | 
					 | 
				
			||||||
    position: relative;
 | 
					 | 
				
			||||||
    display: inline-block;
 | 
					 | 
				
			||||||
    margin-top: 22px;
 | 
					 | 
				
			||||||
    top: -8px;
 | 
					 | 
				
			||||||
    left: 15px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .job-group-section {
 | 
					 | 
				
			||||||
    padding-right: 8px;
 | 
					 | 
				
			||||||
    padding-bottom: 8px;
 | 
					 | 
				
			||||||
    border-bottom: 1px solid #2f353d;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .job-brief-item {
 | 
					 | 
				
			||||||
      border-radius: 0.5rem !important;
 | 
					 | 
				
			||||||
      padding: 8px;
 | 
					 | 
				
			||||||
      position: relative;
 | 
					 | 
				
			||||||
      margin-left: 0.5rem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.selected {
 | 
					 | 
				
			||||||
        background-color: #161a21;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &:hover {
 | 
					 | 
				
			||||||
          background-color: var(--color-hover);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &:after {
 | 
					 | 
				
			||||||
          overflow: visible;
 | 
					 | 
				
			||||||
          background: #1f6feb;
 | 
					 | 
				
			||||||
          border-radius: 0.375rem;
 | 
					 | 
				
			||||||
          content: "";
 | 
					 | 
				
			||||||
          height: 24px;
 | 
					 | 
				
			||||||
          left: calc(0.5rem * -1);
 | 
					 | 
				
			||||||
          position: absolute;
 | 
					 | 
				
			||||||
          top: calc(50% - 12px);
 | 
					 | 
				
			||||||
          width: 4px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.action-view-right {
 | 
					 | 
				
			||||||
  margin-top: 16px;
 | 
					 | 
				
			||||||
  min-height: calc(100vh - 245px);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .job-info-header {
 | 
					 | 
				
			||||||
    padding: 16px 12px 16px 24px;
 | 
					 | 
				
			||||||
    height: auto;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .job-step-container {
 | 
					 | 
				
			||||||
    .job-step-summary {
 | 
					 | 
				
			||||||
      color: var(--color-console-fg-subtle);
 | 
					 | 
				
			||||||
      padding: 8px 10px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.step-expandable:hover {
 | 
					 | 
				
			||||||
        color: var(--color-console-fg-subtle);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .tw-mr-2:not(.svg) svg.svg {
 | 
					 | 
				
			||||||
        margin: 1.5px 6px 0px 2px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      svg.svg.text.green {
 | 
					 | 
				
			||||||
        color: #9198a1 !important;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.selected {
 | 
					 | 
				
			||||||
        color: var(--color-console-fg) !important;
 | 
					 | 
				
			||||||
        background-color: var(--color-console-active-bg) !important;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        svg.svg.text.green {
 | 
					 | 
				
			||||||
          color: #f0f6fc !important;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .job-log-line {
 | 
					 | 
				
			||||||
      color: #f0f6fc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .log-msg:hover * {
 | 
					 | 
				
			||||||
        color: #f0f6fc !important;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.page-content.dashboard {
 | 
					 | 
				
			||||||
  .flex-item .flex-item-trailing svg {
 | 
					 | 
				
			||||||
    height: 18px;
 | 
					 | 
				
			||||||
    width: 18px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,42 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.added-code,
 | 
					 | 
				
			||||||
.removed-code {
 | 
					 | 
				
			||||||
  color: #fff !important;
 | 
					 | 
				
			||||||
  border-radius: 0.1875rem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * {
 | 
					 | 
				
			||||||
    color: #fff !important;
 | 
					 | 
				
			||||||
    border-radius: 0.1875rem;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.code-diff-unified {
 | 
					 | 
				
			||||||
  .add-code {
 | 
					 | 
				
			||||||
    .lines-num,
 | 
					 | 
				
			||||||
    .lines-escape {
 | 
					 | 
				
			||||||
      background-color: #1c4428;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  .del-code {
 | 
					 | 
				
			||||||
    .lines-num,
 | 
					 | 
				
			||||||
    .lines-escape {
 | 
					 | 
				
			||||||
      background-color: #542426;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.code-diff-unified .tag-code td,
 | 
					 | 
				
			||||||
.diff-file-body tr.tag-code:last-child > td {
 | 
					 | 
				
			||||||
  background-color: #121d2f;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.code-expander-button,
 | 
					 | 
				
			||||||
.code-diff-unified .tag-code .lines-num,
 | 
					 | 
				
			||||||
.code-diff-unified .tag-code .lines-escape,
 | 
					 | 
				
			||||||
.diff-file-body tr.tag-code:last-child > td.lines-num,
 | 
					 | 
				
			||||||
.diff-file-body tr.tag-code:last-child > td.lines-escape {
 | 
					 | 
				
			||||||
  background-color: #0c2d6b;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.code-expander-button:hover {
 | 
					 | 
				
			||||||
  background: #1f6feb;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,51 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.vch__day__square,
 | 
					 | 
				
			||||||
.vch__legend__wrapper rect {
 | 
					 | 
				
			||||||
  rx: 2px;
 | 
					 | 
				
			||||||
  ry: 2px;
 | 
					 | 
				
			||||||
  width: 9px;
 | 
					 | 
				
			||||||
  height: 9px;
 | 
					 | 
				
			||||||
  outline: 1px solid rgba(255, 255, 255, 0.05);
 | 
					 | 
				
			||||||
  border-radius: 0.5px;
 | 
					 | 
				
			||||||
  outline-offset: -1px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.vch__legend__wrapper rect {
 | 
					 | 
				
			||||||
  rx: 3px;
 | 
					 | 
				
			||||||
  ry: 3px;
 | 
					 | 
				
			||||||
  border-radius: 1px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.vch__day__square,
 | 
					 | 
				
			||||||
.vch__legend__wrapper rect {
 | 
					 | 
				
			||||||
  &[style='fill: var(--color-secondary-alpha-60);'] {
 | 
					 | 
				
			||||||
    outline: 1px solid rgba(27, 31, 35, 0.06);
 | 
					 | 
				
			||||||
    background: #161b22;
 | 
					 | 
				
			||||||
    fill: #161b22 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[style='fill: var(--color-primary-light-4);'] {
 | 
					 | 
				
			||||||
    background: #0e4429;
 | 
					 | 
				
			||||||
    fill: #0e4429 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[style='fill: var(--color-primary-light-2);'] {
 | 
					 | 
				
			||||||
    background: #006d32;
 | 
					 | 
				
			||||||
    fill: #006d32 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[style='fill: var(--color-primary);'] {
 | 
					 | 
				
			||||||
    background: #238636;
 | 
					 | 
				
			||||||
    fill: #238636 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[style='fill: var(--color-primary-dark-2);'] {
 | 
					 | 
				
			||||||
    background: #39d353;
 | 
					 | 
				
			||||||
    fill: #39d353 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[style='fill: var(--color-primary-dark-4);'] {
 | 
					 | 
				
			||||||
    background: #44ff61;
 | 
					 | 
				
			||||||
    fill: #44ff61 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,20 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
// PR
 | 
					 | 
				
			||||||
#issue-list .flex-item-body .branches .branch {
 | 
					 | 
				
			||||||
  color: var(--color-blue);
 | 
					 | 
				
			||||||
  background-color: #121d2f;
 | 
					 | 
				
			||||||
  font-size: 12px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 评论焦点
 | 
					 | 
				
			||||||
.comment:target {
 | 
					 | 
				
			||||||
  .comment-container {
 | 
					 | 
				
			||||||
    border-color: #1f6feb !important;
 | 
					 | 
				
			||||||
    box-shadow: 0 0 0 1px #4493f8 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .header:before {
 | 
					 | 
				
			||||||
    border-right-color: #1f6feb !important;
 | 
					 | 
				
			||||||
    filter: drop-shadow(-1px 0 0 #4493f8) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,81 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.page-content.repository.releases {
 | 
					 | 
				
			||||||
  h2 .item {
 | 
					 | 
				
			||||||
    font-weight: 500;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  #release-list .release-entry {
 | 
					 | 
				
			||||||
    .meta {
 | 
					 | 
				
			||||||
      gap: 2px;
 | 
					 | 
				
			||||||
      padding-top: 24px;
 | 
					 | 
				
			||||||
      padding-right: 40px;
 | 
					 | 
				
			||||||
      text-align: left;
 | 
					 | 
				
			||||||
      min-width: 0;
 | 
					 | 
				
			||||||
      flex: 0.125;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      a.muted {
 | 
					 | 
				
			||||||
        color: #9198a1;
 | 
					 | 
				
			||||||
        overflow: hidden;
 | 
					 | 
				
			||||||
        text-overflow: ellipsis;
 | 
					 | 
				
			||||||
        white-space: nowrap;
 | 
					 | 
				
			||||||
        word-break: break-all;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        svg {
 | 
					 | 
				
			||||||
          margin-right: 8px !important;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        svg.tw-mr-1.svg.octicon-tag {
 | 
					 | 
				
			||||||
          margin-top: 1px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .js-branch-tag-selector {
 | 
					 | 
				
			||||||
        margin-top: 8px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .segment.detail {
 | 
					 | 
				
			||||||
      p.text.grey {
 | 
					 | 
				
			||||||
        margin: 16px 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .time {
 | 
					 | 
				
			||||||
          color: #f0f6fc;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .markup {
 | 
					 | 
				
			||||||
        > *:first-child {
 | 
					 | 
				
			||||||
          margin-top: 16px !important;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        > *:last-child {
 | 
					 | 
				
			||||||
          margin-bottom: 16px !important;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ui.small.primary.button {
 | 
					 | 
				
			||||||
    background-color: var(--color-button);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      background-color: #262c36;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.page-content.repository.tags {
 | 
					 | 
				
			||||||
  .tag-list-row .download a.muted:hover {
 | 
					 | 
				
			||||||
    text-decoration: none;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.page-content.repository.tags,
 | 
					 | 
				
			||||||
.page-content.repository.releases {
 | 
					 | 
				
			||||||
  .ui.small.menu {
 | 
					 | 
				
			||||||
    .active.item {
 | 
					 | 
				
			||||||
      color: #fff;
 | 
					 | 
				
			||||||
      background: #1f6feb !important;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,392 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
#navbar {
 | 
					 | 
				
			||||||
  border-bottom-width: 1.5px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.page-content > :first-child.secondary-nav {
 | 
					 | 
				
			||||||
  border-top: 0;
 | 
					 | 
				
			||||||
  background-color: var(--color-nav-bg) !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 修复关注&派生 hover 意外点亮右侧 label 左边框
 | 
					 | 
				
			||||||
.ui.ui.ui.ui.small.button {
 | 
					 | 
				
			||||||
  z-index: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.secondary-nav > .divider {
 | 
					 | 
				
			||||||
  border-top-width: 1.5px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 仓库页面头部名称
 | 
					 | 
				
			||||||
.page-content.repository .repo-header {
 | 
					 | 
				
			||||||
  .ui.compact.button {
 | 
					 | 
				
			||||||
    padding: 3px 12px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    svg {
 | 
					 | 
				
			||||||
      color: #9198a1;
 | 
					 | 
				
			||||||
      margin-right: 6px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  img.ui.avatar {
 | 
					 | 
				
			||||||
    height: 32px;
 | 
					 | 
				
			||||||
    width: 32px;
 | 
					 | 
				
			||||||
    margin-block-start: 0.5rem;
 | 
					 | 
				
			||||||
    margin-block-end: 0.5rem;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .flex-item {
 | 
					 | 
				
			||||||
    .flex-item-title {
 | 
					 | 
				
			||||||
      color: #9198a1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      a {
 | 
					 | 
				
			||||||
        display: flex;
 | 
					 | 
				
			||||||
        align-items: center;
 | 
					 | 
				
			||||||
        color: #f0f6fc;
 | 
					 | 
				
			||||||
        font-size: 16px;
 | 
					 | 
				
			||||||
        text-decoration: none !important;
 | 
					 | 
				
			||||||
        min-width: 3ch;
 | 
					 | 
				
			||||||
        padding: 6px 8px;
 | 
					 | 
				
			||||||
        padding-inline: 0.5rem;
 | 
					 | 
				
			||||||
        padding-block: 6px;
 | 
					 | 
				
			||||||
        border-radius: 0.375rem;
 | 
					 | 
				
			||||||
        margin-top: 0.5rem;
 | 
					 | 
				
			||||||
        margin-bottom: 0.5rem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &:hover {
 | 
					 | 
				
			||||||
          background: #15191f;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &.muted:not(.tw-font-normal) {
 | 
					 | 
				
			||||||
          font-weight: 600;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    a:not(.label, .button):hover {
 | 
					 | 
				
			||||||
      color: #f0f6fc !important;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 仓库导航栏
 | 
					 | 
				
			||||||
.ui.secondary.pointing.menu {
 | 
					 | 
				
			||||||
  .overflow-menu-items {
 | 
					 | 
				
			||||||
    gap: 0.5rem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .item {
 | 
					 | 
				
			||||||
      padding: 5px 8px !important;
 | 
					 | 
				
			||||||
      margin-block-start: 0.5rem;
 | 
					 | 
				
			||||||
      margin-block-end: 0.5rem;
 | 
					 | 
				
			||||||
      margin-bottom: 0.5rem !important;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .active.item,
 | 
					 | 
				
			||||||
  .dropdown.item,
 | 
					 | 
				
			||||||
  .link.item,
 | 
					 | 
				
			||||||
  a.item {
 | 
					 | 
				
			||||||
    color: #f0f6fc;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    svg {
 | 
					 | 
				
			||||||
      color: #9198a1;
 | 
					 | 
				
			||||||
      margin-right: 8px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .active.item {
 | 
					 | 
				
			||||||
    border-color: #ffffff00;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    span:after {
 | 
					 | 
				
			||||||
      background: #f78166;
 | 
					 | 
				
			||||||
      border-radius: 0.375rem;
 | 
					 | 
				
			||||||
      bottom: calc(50% - 1.8rem);
 | 
					 | 
				
			||||||
      content: '';
 | 
					 | 
				
			||||||
      height: 2px;
 | 
					 | 
				
			||||||
      position: absolute;
 | 
					 | 
				
			||||||
      right: 50%;
 | 
					 | 
				
			||||||
      transform: translate(50%, -50%);
 | 
					 | 
				
			||||||
      width: 100%;
 | 
					 | 
				
			||||||
      z-index: 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.header-wrapper .ui.tabular.menu,
 | 
					 | 
				
			||||||
.ui.secondary.pointing.menu {
 | 
					 | 
				
			||||||
  .item:hover {
 | 
					 | 
				
			||||||
    background: #15191f !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 仓库文件&提交列表
 | 
					 | 
				
			||||||
.page-content.repository {
 | 
					 | 
				
			||||||
  // 顶部提交, 标签, 分支
 | 
					 | 
				
			||||||
  .repository-summary .segment.sub-menu {
 | 
					 | 
				
			||||||
    &.ui.segment {
 | 
					 | 
				
			||||||
      background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .item {
 | 
					 | 
				
			||||||
      color: #9198a1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      b {
 | 
					 | 
				
			||||||
        color: #f0f6fc;
 | 
					 | 
				
			||||||
        margin: 0 2px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // clone 按钮调整
 | 
					 | 
				
			||||||
  .repo-button-row .repo-button-row-right .ui.primary.button span {
 | 
					 | 
				
			||||||
    margin: 0px 3px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // 提交的Action状态
 | 
					 | 
				
			||||||
  .commit-list,
 | 
					 | 
				
			||||||
  #repo-files-table {
 | 
					 | 
				
			||||||
    .flex-text-inline:not(img) {
 | 
					 | 
				
			||||||
      padding: 6px;
 | 
					 | 
				
			||||||
      border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      margin-right: 6px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &:hover {
 | 
					 | 
				
			||||||
        background-color: var(--color-hover);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 仓库文件列表
 | 
					 | 
				
			||||||
.repository.file.list {
 | 
					 | 
				
			||||||
  #repo-files-table {
 | 
					 | 
				
			||||||
    // 头部最后一次提交
 | 
					 | 
				
			||||||
    .repo-file-line {
 | 
					 | 
				
			||||||
      padding-right: 16px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.parent-link {
 | 
					 | 
				
			||||||
        gap: 0.5rem;
 | 
					 | 
				
			||||||
        padding-left: 16px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        svg {
 | 
					 | 
				
			||||||
          margin-right: 2px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &:hover {
 | 
					 | 
				
			||||||
          background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.repo-file-last-commit {
 | 
					 | 
				
			||||||
        height: 3.725rem;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .latest-commit {
 | 
					 | 
				
			||||||
          .commit-summary {
 | 
					 | 
				
			||||||
            color: #9198a1;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          img.tw-align-middle {
 | 
					 | 
				
			||||||
            margin-top: -1px;
 | 
					 | 
				
			||||||
            margin-left: 1px;
 | 
					 | 
				
			||||||
            margin-right: 8px !important;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          .author-wrapper {
 | 
					 | 
				
			||||||
            margin-right: 6px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            &:hover {
 | 
					 | 
				
			||||||
              color: var(--color-text);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          .ui.sha.label {
 | 
					 | 
				
			||||||
            display: none;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 文件列表
 | 
					 | 
				
			||||||
    .repo-file-item {
 | 
					 | 
				
			||||||
      .repo-file-cell {
 | 
					 | 
				
			||||||
        &.name {
 | 
					 | 
				
			||||||
          display: flex;
 | 
					 | 
				
			||||||
          align-items: center;
 | 
					 | 
				
			||||||
          gap: 0.5rem;
 | 
					 | 
				
			||||||
          padding-left: 16px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &.age {
 | 
					 | 
				
			||||||
          padding-right: 16px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .svg.octicon-file-directory-fill,
 | 
					 | 
				
			||||||
      .svg.octicon-file-submodule {
 | 
					 | 
				
			||||||
        color: #7d8590;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // 整行背景颜色效果
 | 
					 | 
				
			||||||
      &:hover .repo-file-cell {
 | 
					 | 
				
			||||||
        background-color: var(--color-box-header) !important;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.repository #commits-table {
 | 
					 | 
				
			||||||
  .author {
 | 
					 | 
				
			||||||
    a {
 | 
					 | 
				
			||||||
      color: var(--color-text);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    img {
 | 
					 | 
				
			||||||
      margin-right: 8px !important;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .text.right.aligned {
 | 
					 | 
				
			||||||
    color: #919894;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 手机下隐藏提交信息
 | 
					 | 
				
			||||||
@media (max-width: 767.98px) {
 | 
					 | 
				
			||||||
  #repo-files-table {
 | 
					 | 
				
			||||||
    grid-template-columns: 1fr auto;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .repo-file-line {
 | 
					 | 
				
			||||||
      grid-column: 1 / span 2;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .repo-file-cell {
 | 
					 | 
				
			||||||
      &.name {
 | 
					 | 
				
			||||||
        max-width: none;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.message {
 | 
					 | 
				
			||||||
        display: none;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 仓库代码布局调整, 侧边栏宽度调整
 | 
					 | 
				
			||||||
.repo-grid-filelist-sidebar {
 | 
					 | 
				
			||||||
  grid-template-columns: auto 296px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@media (max-width: 767.98px) {
 | 
					 | 
				
			||||||
  .repo-grid-filelist-sidebar {
 | 
					 | 
				
			||||||
    grid-template-columns: 100%;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 仓库代码页面侧边栏
 | 
					 | 
				
			||||||
.page-content.repository {
 | 
					 | 
				
			||||||
  .repo-home-sidebar-top {
 | 
					 | 
				
			||||||
    a.muted:hover {
 | 
					 | 
				
			||||||
      text-decoration: none;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .flex-item {
 | 
					 | 
				
			||||||
      .flex-item-title {
 | 
					 | 
				
			||||||
        margin-top: 2px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .flex-item-body {
 | 
					 | 
				
			||||||
        padding: 8px 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .repo-description {
 | 
					 | 
				
			||||||
          color: #f0f6fc;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        #repo-topics {
 | 
					 | 
				
			||||||
          margin: 10px 0px !important;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          .repo-topic.ui.label {
 | 
					 | 
				
			||||||
            font-size: 12px;
 | 
					 | 
				
			||||||
            padding: 5px 10px;
 | 
					 | 
				
			||||||
            margin: 0px 1.5px 3.5px 0px;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .flex-text-block {
 | 
					 | 
				
			||||||
          font-size: 14px;
 | 
					 | 
				
			||||||
          font-weight: 600;
 | 
					 | 
				
			||||||
          margin-top: 10px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          &.muted {
 | 
					 | 
				
			||||||
            margin-top: 2px;
 | 
					 | 
				
			||||||
            font-weight: normal;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          svg.svg {
 | 
					 | 
				
			||||||
            margin-right: 4px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            &.octicon-database,
 | 
					 | 
				
			||||||
            &.octicon-law {
 | 
					 | 
				
			||||||
              margin-right: 6px;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .repo-home-sidebar-bottom {
 | 
					 | 
				
			||||||
    a.muted:hover {
 | 
					 | 
				
			||||||
      text-decoration: none;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .flex-item {
 | 
					 | 
				
			||||||
      padding: 16px 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .flex-item {
 | 
					 | 
				
			||||||
        padding: 16px 0 0 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .flex-item-icon {
 | 
					 | 
				
			||||||
          svg.svg.octicon-tag {
 | 
					 | 
				
			||||||
            color: #3fb950;
 | 
					 | 
				
			||||||
            margin-top: 2px;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .flex-item-header .flex-item-title {
 | 
					 | 
				
			||||||
          font-size: 14px;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .flex-item-title .ui.small.label {
 | 
					 | 
				
			||||||
        background: var(--color-label-bg);
 | 
					 | 
				
			||||||
        color: var(--color-label-text);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .flex-item-body {
 | 
					 | 
				
			||||||
        font-size: 12px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 编程语言
 | 
					 | 
				
			||||||
    .language-stats {
 | 
					 | 
				
			||||||
      height: 8px;
 | 
					 | 
				
			||||||
      margin-bottom: 0px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .language-stats-details .item {
 | 
					 | 
				
			||||||
      font-size: 12px;
 | 
					 | 
				
			||||||
      margin-right: 16px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .color-icon {
 | 
					 | 
				
			||||||
        height: 8px;
 | 
					 | 
				
			||||||
        width: 8px;
 | 
					 | 
				
			||||||
        margin-right: 8px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .tw-font-semibold {
 | 
					 | 
				
			||||||
        color: #f0f6fc;
 | 
					 | 
				
			||||||
        margin-right: 2px;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,172 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
// 设置左边栏(包含 Actions 的工作流栏)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%active-item-after-style {
 | 
					 | 
				
			||||||
  background: #1f6feb;
 | 
					 | 
				
			||||||
  border-radius: 0.375rem;
 | 
					 | 
				
			||||||
  content: '';
 | 
					 | 
				
			||||||
  height: 24px;
 | 
					 | 
				
			||||||
  left: calc(0.5rem * -1);
 | 
					 | 
				
			||||||
  position: absolute;
 | 
					 | 
				
			||||||
  top: calc(50% - 12px);
 | 
					 | 
				
			||||||
  width: 4px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.vertical.menu {
 | 
					 | 
				
			||||||
  background: var(--color-body);
 | 
					 | 
				
			||||||
  border: 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .header.item {
 | 
					 | 
				
			||||||
    color: #9198a1 !important;
 | 
					 | 
				
			||||||
    font-size: 1.5rem;
 | 
					 | 
				
			||||||
    font-weight: 700;
 | 
					 | 
				
			||||||
    background: unset;
 | 
					 | 
				
			||||||
    margin-bottom: 0.5rem;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .menu .item:hover {
 | 
					 | 
				
			||||||
    background: var(--color-hover);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .item,
 | 
					 | 
				
			||||||
  .item > summary {
 | 
					 | 
				
			||||||
    font-size: 1.1rem;
 | 
					 | 
				
			||||||
    background: unset;
 | 
					 | 
				
			||||||
    padding: 6px 8px;
 | 
					 | 
				
			||||||
    color: var(--color-white) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .item:before {
 | 
					 | 
				
			||||||
    background: unset;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .active.item,
 | 
					 | 
				
			||||||
  .active.item > summary {
 | 
					 | 
				
			||||||
    font-weight: 600;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .active.item:after {
 | 
					 | 
				
			||||||
    @extend %active-item-after-style;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  details {
 | 
					 | 
				
			||||||
    &:has(.active.item) {
 | 
					 | 
				
			||||||
      > summary {
 | 
					 | 
				
			||||||
        font-weight: 600;
 | 
					 | 
				
			||||||
        background: #161a21;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &:hover {
 | 
					 | 
				
			||||||
          background: var(--color-hover);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      .active.item {
 | 
					 | 
				
			||||||
        font-weight: 400;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &[open] {
 | 
					 | 
				
			||||||
        > summary {
 | 
					 | 
				
			||||||
          background: unset;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          &:hover {
 | 
					 | 
				
			||||||
            background: var(--color-hover);
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        &:after {
 | 
					 | 
				
			||||||
          display: none;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &:after {
 | 
					 | 
				
			||||||
        @extend %active-item-after-style;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.vertical.menu,
 | 
					 | 
				
			||||||
.ui.fluid.vertical.menu {
 | 
					 | 
				
			||||||
  .active.item {
 | 
					 | 
				
			||||||
    background: #161a21 !important;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      background-color: var(--color-hover) !important;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .item,
 | 
					 | 
				
			||||||
  .item > summary {
 | 
					 | 
				
			||||||
    border-radius: 0.5rem !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 设置右面版
 | 
					 | 
				
			||||||
.user-main-content,
 | 
					 | 
				
			||||||
.repo-setting-content,
 | 
					 | 
				
			||||||
.user-setting-content,
 | 
					 | 
				
			||||||
.org-setting-content,
 | 
					 | 
				
			||||||
.admin-setting-content {
 | 
					 | 
				
			||||||
  .ui.top.attached.header {
 | 
					 | 
				
			||||||
    border: 0;
 | 
					 | 
				
			||||||
    font-size: 1.5rem;
 | 
					 | 
				
			||||||
    font-weight: 400;
 | 
					 | 
				
			||||||
    background-color: unset !important;
 | 
					 | 
				
			||||||
    margin-bottom: 0.25rem;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ui.attached.segment {
 | 
					 | 
				
			||||||
    background-color: unset;
 | 
					 | 
				
			||||||
    border-radius: 0.5rem !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ui.attached.segment:not(.error) {
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-light-border) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ui.attached.segment.error {
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-error-border) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  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 {
 | 
					 | 
				
			||||||
    background: var(--color-box-header);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .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'] {
 | 
					 | 
				
			||||||
    padding: 7px 12px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ui.selection.dropdown {
 | 
					 | 
				
			||||||
    padding: 7px 24px 7px 12px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
@use "public/chroma"; // 代码高亮
 | 
					 | 
				
			||||||
@use "public/codemirror";
 | 
					 | 
				
			||||||
@use "public/emoji";
 | 
					 | 
				
			||||||
@use "public/transition"; // 添加过渡动画
 | 
					 | 
				
			||||||
@use "public/modal"; // 弹窗
 | 
					 | 
				
			||||||
@use "public/input"; // 输入框
 | 
					 | 
				
			||||||
@use "public/button"; // 按钮
 | 
					 | 
				
			||||||
@use "public/label"; // 标签
 | 
					 | 
				
			||||||
@use "public/dropdown"; // 下拉菜单
 | 
					 | 
				
			||||||
@use "public/svg"; // svg
 | 
					 | 
				
			||||||
@use "public/fontcolor"; // 字体颜色
 | 
					 | 
				
			||||||
@use "public/radius"; // 圆角
 | 
					 | 
				
			||||||
@@ -1,137 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.ui.button {
 | 
					 | 
				
			||||||
  font-weight: 500;
 | 
					 | 
				
			||||||
  padding: 9px 16px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.ui.primary.button {
 | 
					 | 
				
			||||||
  background-color: #238636;
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    background-color: #29903b;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.basic.button {
 | 
					 | 
				
			||||||
  color: #f0f6fc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.basic.button:hover,
 | 
					 | 
				
			||||||
.ui.labeled.button > .label:hover {
 | 
					 | 
				
			||||||
  color: #f0f6fc;
 | 
					 | 
				
			||||||
  background: #262c36;
 | 
					 | 
				
			||||||
  border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.red.button,
 | 
					 | 
				
			||||||
.ui.basic.red.buttons .button,
 | 
					 | 
				
			||||||
.ui.basic.red.button {
 | 
					 | 
				
			||||||
  color: #fa5e55;
 | 
					 | 
				
			||||||
  background-color: var(--color-button);
 | 
					 | 
				
			||||||
  border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    background-color: #b62324;
 | 
					 | 
				
			||||||
    border-color: #ffffff1a;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.button.branch-dropdown-button {
 | 
					 | 
				
			||||||
  padding: 3px 12px;
 | 
					 | 
				
			||||||
  min-height: 28px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.menu button.item:hover {
 | 
					 | 
				
			||||||
  color: var(--color-text);
 | 
					 | 
				
			||||||
  background: var(--color-hover);
 | 
					 | 
				
			||||||
  border-radius: 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 设置界面
 | 
					 | 
				
			||||||
.user-main-content,
 | 
					 | 
				
			||||||
.repo-setting-content,
 | 
					 | 
				
			||||||
.user-setting-content,
 | 
					 | 
				
			||||||
.org-setting-content {
 | 
					 | 
				
			||||||
  .ui.primary.button {
 | 
					 | 
				
			||||||
    color: #f0f6fc;
 | 
					 | 
				
			||||||
    background-color: var(--color-button);
 | 
					 | 
				
			||||||
    border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      background-color: #262c36;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%button-tiny-style {
 | 
					 | 
				
			||||||
  color: #39d353;
 | 
					 | 
				
			||||||
  background-color: var(--color-button);
 | 
					 | 
				
			||||||
  border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    background-color: #29903b;
 | 
					 | 
				
			||||||
    border-color: #ffffff1a;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.user-main-content,
 | 
					 | 
				
			||||||
.repo-setting-content,
 | 
					 | 
				
			||||||
.user-setting-content,
 | 
					 | 
				
			||||||
.org-setting-content {
 | 
					 | 
				
			||||||
  .ui.primary.button.tiny {
 | 
					 | 
				
			||||||
    @extend %button-tiny-style;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.admin-setting-content .ui.primary.button {
 | 
					 | 
				
			||||||
  @extend %button-tiny-style;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.user-main-content,
 | 
					 | 
				
			||||||
.repo-setting-content,
 | 
					 | 
				
			||||||
.user-setting-content,
 | 
					 | 
				
			||||||
.org-setting-content,
 | 
					 | 
				
			||||||
.admin-setting-content {
 | 
					 | 
				
			||||||
  .ui.right {
 | 
					 | 
				
			||||||
    .ui.primary.button.tiny {
 | 
					 | 
				
			||||||
      color: #fff;
 | 
					 | 
				
			||||||
      background-color: #238636;
 | 
					 | 
				
			||||||
      &:hover {
 | 
					 | 
				
			||||||
        background-color: #29903b;
 | 
					 | 
				
			||||||
        border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 工单侧边栏
 | 
					 | 
				
			||||||
.ui.fluid.ui.button,
 | 
					 | 
				
			||||||
.ui.button.branch-dropdown-button,
 | 
					 | 
				
			||||||
.ui.ui.icon.button,
 | 
					 | 
				
			||||||
.ui.two.wide.button {
 | 
					 | 
				
			||||||
  background-color: var(--color-button);
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    background-color: #262c36;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 关闭工单按钮
 | 
					 | 
				
			||||||
.ui.red.basic.button#status-button {
 | 
					 | 
				
			||||||
  color: #ab7df8;
 | 
					 | 
				
			||||||
  border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
  background-color: var(--color-button);
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    border-color: #ffffff1a;
 | 
					 | 
				
			||||||
    background-color: var(--color-purple);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 重新开启按钮
 | 
					 | 
				
			||||||
.ui.basic.primary.button#status-button {
 | 
					 | 
				
			||||||
  color: #39d353;
 | 
					 | 
				
			||||||
  background-color: var(--color-button);
 | 
					 | 
				
			||||||
  border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    color: #44ff61;
 | 
					 | 
				
			||||||
    background: var(--color-hover);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,274 +0,0 @@
 | 
				
			|||||||
// Made by Rainnny <3
 | 
					 | 
				
			||||||
.chroma {
 | 
					 | 
				
			||||||
  background-color: var(--color-code-bg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .lntd {
 | 
					 | 
				
			||||||
    vertical-align: top;
 | 
					 | 
				
			||||||
    border: 0;
 | 
					 | 
				
			||||||
    margin: 0;
 | 
					 | 
				
			||||||
    padding: 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .lntable {
 | 
					 | 
				
			||||||
    border-spacing: 0;
 | 
					 | 
				
			||||||
    border: 0;
 | 
					 | 
				
			||||||
    width: auto;
 | 
					 | 
				
			||||||
    margin: 0;
 | 
					 | 
				
			||||||
    padding: 0;
 | 
					 | 
				
			||||||
    display: block;
 | 
					 | 
				
			||||||
    overflow: auto;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .hl {
 | 
					 | 
				
			||||||
    width: 100%;
 | 
					 | 
				
			||||||
    display: block;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .lnt,
 | 
					 | 
				
			||||||
  .ln {
 | 
					 | 
				
			||||||
    margin-right: 0.4em;
 | 
					 | 
				
			||||||
    padding: 0 0.4em;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gs {
 | 
					 | 
				
			||||||
    font-weight: var(--font-weight-semibold);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gl {
 | 
					 | 
				
			||||||
    text-decoration: underline;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .bp {
 | 
					 | 
				
			||||||
    color: #fabd2f;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .c,
 | 
					 | 
				
			||||||
  .c1,
 | 
					 | 
				
			||||||
  .ch,
 | 
					 | 
				
			||||||
  .cm {
 | 
					 | 
				
			||||||
    color: #777e94;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cp {
 | 
					 | 
				
			||||||
    color: #8ec07c;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cpf {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cs {
 | 
					 | 
				
			||||||
    color: #9075cd;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .dl {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gd {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    background-color: #5f3737;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ge {
 | 
					 | 
				
			||||||
    color: #ddee30;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gh {
 | 
					 | 
				
			||||||
    color: #ffaa10;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gi {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    background-color: #3a523a;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .go {
 | 
					 | 
				
			||||||
    color: #777e94;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gp {
 | 
					 | 
				
			||||||
    color: #ebdbb2;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gr {
 | 
					 | 
				
			||||||
    color: #f43;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gs {
 | 
					 | 
				
			||||||
    color: #ebdbb2;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gt {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .gu {
 | 
					 | 
				
			||||||
    color: #a5d6ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .il {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .k {
 | 
					 | 
				
			||||||
    color: #ff7b72;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .kc {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .kd {
 | 
					 | 
				
			||||||
    color: #ff7b72;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .kn {
 | 
					 | 
				
			||||||
    color: #ff7b72;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .kp {
 | 
					 | 
				
			||||||
    color: #5f8700;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .kr {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .kt {
 | 
					 | 
				
			||||||
    color: #ff7b72;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .m,
 | 
					 | 
				
			||||||
  .mb,
 | 
					 | 
				
			||||||
  .mf,
 | 
					 | 
				
			||||||
  .mh,
 | 
					 | 
				
			||||||
  .mi,
 | 
					 | 
				
			||||||
  .mo {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .n {
 | 
					 | 
				
			||||||
    color: #c9d1d9;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .na {
 | 
					 | 
				
			||||||
    color: #d2a8ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nb {
 | 
					 | 
				
			||||||
    color: #a5d6ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nc {
 | 
					 | 
				
			||||||
    color: #e6edf3;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nd {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ne {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nf,
 | 
					 | 
				
			||||||
  .ni {
 | 
					 | 
				
			||||||
    color: #d2a8ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nl {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nn {
 | 
					 | 
				
			||||||
    color: #e6edf3;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .no {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nt {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nv {
 | 
					 | 
				
			||||||
    color: #ebdbb2;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .nx {
 | 
					 | 
				
			||||||
    color: #b6bac5;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .o {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ow {
 | 
					 | 
				
			||||||
    color: #5f8700;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .p {
 | 
					 | 
				
			||||||
    color: #d2d4db;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .s,
 | 
					 | 
				
			||||||
  .s1,
 | 
					 | 
				
			||||||
  .s2 {
 | 
					 | 
				
			||||||
    color: #a5d6ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sa {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sb {
 | 
					 | 
				
			||||||
    color: #a5d6ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sc {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sd {
 | 
					 | 
				
			||||||
    color: #777e94;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .se {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sh {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .si {
 | 
					 | 
				
			||||||
    color: #ffaa10;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sr {
 | 
					 | 
				
			||||||
    color: #9075cd;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .ss {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .sx {
 | 
					 | 
				
			||||||
    color: #ffaa10;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .vc {
 | 
					 | 
				
			||||||
    color: #7ee787;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .vg,
 | 
					 | 
				
			||||||
  .vi {
 | 
					 | 
				
			||||||
    color: #ffaa10;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .w {
 | 
					 | 
				
			||||||
    color: #7f8699;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,86 +0,0 @@
 | 
				
			|||||||
// Made by Rainnny <3
 | 
					 | 
				
			||||||
.CodeMirror.cm-s-default,
 | 
					 | 
				
			||||||
.CodeMirror.cm-s-paper {
 | 
					 | 
				
			||||||
  .cm-property {
 | 
					 | 
				
			||||||
    color: #a0cc75;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  .cm-header {
 | 
					 | 
				
			||||||
    color: #9daccc;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-quote {
 | 
					 | 
				
			||||||
    color: #090;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-keyword {
 | 
					 | 
				
			||||||
    color: #cc8a61;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-atom {
 | 
					 | 
				
			||||||
    color: #ef5e77;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-number {
 | 
					 | 
				
			||||||
    color: #ff5656;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-def {
 | 
					 | 
				
			||||||
    color: #e4e4e4;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-variable-2 {
 | 
					 | 
				
			||||||
    color: #00bdbf;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-variable-3 {
 | 
					 | 
				
			||||||
    color: #085;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-comment {
 | 
					 | 
				
			||||||
    color: #8e9ab3;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-string {
 | 
					 | 
				
			||||||
    color: #a77272;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-string-2 {
 | 
					 | 
				
			||||||
    color: #f50;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-meta,
 | 
					 | 
				
			||||||
  .cm-qualifier {
 | 
					 | 
				
			||||||
    color: #ffb176;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-builtin {
 | 
					 | 
				
			||||||
    color: #b7c951;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-bracket {
 | 
					 | 
				
			||||||
    color: #997;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-tag {
 | 
					 | 
				
			||||||
    color: #f1d273;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-attribute {
 | 
					 | 
				
			||||||
    color: #bfcc70;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-hr {
 | 
					 | 
				
			||||||
    color: #999;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-url {
 | 
					 | 
				
			||||||
    color: #c5cfd0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .cm-link {
 | 
					 | 
				
			||||||
    color: #d8c792;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  .cm-error {
 | 
					 | 
				
			||||||
    color: #dbdbeb;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,212 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
// 下拉菜单动画
 | 
					 | 
				
			||||||
@keyframes overlay-appear {
 | 
					 | 
				
			||||||
  0% {
 | 
					 | 
				
			||||||
    opacity: 0;
 | 
					 | 
				
			||||||
    transform: translateY(-12px);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  35% {
 | 
					 | 
				
			||||||
    transform: translateY(-2px);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  100% {
 | 
					 | 
				
			||||||
    opacity: 1;
 | 
					 | 
				
			||||||
    transform: translateY(0);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// clone 下拉菜单
 | 
					 | 
				
			||||||
.tippy-box {
 | 
					 | 
				
			||||||
  margin-top: -3px;
 | 
					 | 
				
			||||||
  background: var(--color-box-header);
 | 
					 | 
				
			||||||
  border-radius: 12px;
 | 
					 | 
				
			||||||
  overflow: hidden;
 | 
					 | 
				
			||||||
  box-shadow: 0px 0px 0px 0.5px #30363d, 0px 6px 12px -3px rgba(1, 4, 9, 0.4), 0px 6px 18px 0px rgba(1, 4, 9, 0.4);
 | 
					 | 
				
			||||||
  animation: 200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running overlay-appear;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .clone-panel-field {
 | 
					 | 
				
			||||||
    margin-top: 16px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .flex-text-block.clone-panel-field {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    font-weight: bold;
 | 
					 | 
				
			||||||
    margin-left: 16px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .clone-panel-tab {
 | 
					 | 
				
			||||||
    margin-left: 16px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    button {
 | 
					 | 
				
			||||||
      color: #f0f6fc !important;
 | 
					 | 
				
			||||||
      font-weight: 600;
 | 
					 | 
				
			||||||
      padding: 6px 8px;
 | 
					 | 
				
			||||||
      margin: 8px 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &:hover {
 | 
					 | 
				
			||||||
        background: var(--color-hover);
 | 
					 | 
				
			||||||
        border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      &.active:after {
 | 
					 | 
				
			||||||
        content: '';
 | 
					 | 
				
			||||||
        display: block;
 | 
					 | 
				
			||||||
        position: absolute;
 | 
					 | 
				
			||||||
        bottom: -8px;
 | 
					 | 
				
			||||||
        left: 0;
 | 
					 | 
				
			||||||
        width: 100%;
 | 
					 | 
				
			||||||
        height: 2px;
 | 
					 | 
				
			||||||
        background: #f78166;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .item.active {
 | 
					 | 
				
			||||||
      border-bottom: 0;
 | 
					 | 
				
			||||||
      position: relative;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .flex-items-block {
 | 
					 | 
				
			||||||
    margin: 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .item {
 | 
					 | 
				
			||||||
      display: block;
 | 
					 | 
				
			||||||
      padding: 11px 16px;
 | 
					 | 
				
			||||||
      text-align: left;
 | 
					 | 
				
			||||||
      text-transform: none;
 | 
					 | 
				
			||||||
      line-height: 1em;
 | 
					 | 
				
			||||||
      margin: 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      svg {
 | 
					 | 
				
			||||||
        margin-right: 0.5rem;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    > .item:hover {
 | 
					 | 
				
			||||||
      color: var(--color-text);
 | 
					 | 
				
			||||||
      text-decoration: none;
 | 
					 | 
				
			||||||
      background: var(--color-hover);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 下拉菜单
 | 
					 | 
				
			||||||
.ui.dropdown .menu {
 | 
					 | 
				
			||||||
  margin-top: 3.75px !important;
 | 
					 | 
				
			||||||
  border-radius: 12px !important;
 | 
					 | 
				
			||||||
  overflow: hidden auto;
 | 
					 | 
				
			||||||
  box-shadow: 0px 0px 0px 0.5px #30363d, 0px 6px 12px -3px #01040966, 0px 6px 18px 0px #01040966;
 | 
					 | 
				
			||||||
  animation: 200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running overlay-appear;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.dropdown .menu,
 | 
					 | 
				
			||||||
.branch-tag-item.active,
 | 
					 | 
				
			||||||
.ui.pointing.dropdown > .menu:not(.hidden):after {
 | 
					 | 
				
			||||||
  background: var(--color-box-header) !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%item-style {
 | 
					 | 
				
			||||||
  background: #1f6feb;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.dropdown .menu > .item.context:hover {
 | 
					 | 
				
			||||||
  @extend %item-style;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.user-main-content,
 | 
					 | 
				
			||||||
.repo-setting-content,
 | 
					 | 
				
			||||||
.user-setting-content,
 | 
					 | 
				
			||||||
.org-setting-content,
 | 
					 | 
				
			||||||
.admin-setting-content {
 | 
					 | 
				
			||||||
  .ui.dropdown .menu > .item {
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      @extend %item-style;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      a {
 | 
					 | 
				
			||||||
        color: var(--color-text);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 按钮菜单选项(主要为仓库)
 | 
					 | 
				
			||||||
.tippy-box .flex-items-block,
 | 
					 | 
				
			||||||
.ui.dropdown > .visible.menu .scrolling.menu,
 | 
					 | 
				
			||||||
.ui.button.dropdown .menu {
 | 
					 | 
				
			||||||
  .item {
 | 
					 | 
				
			||||||
    display: flex;
 | 
					 | 
				
			||||||
    align-items: center;
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
    margin: 0 8px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:first-of-type {
 | 
					 | 
				
			||||||
      border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      margin-top: 8px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:last-of-type {
 | 
					 | 
				
			||||||
      border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
      margin-bottom: 8px;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 下拉菜单分隔线
 | 
					 | 
				
			||||||
.ui.dropdown .menu > .divider {
 | 
					 | 
				
			||||||
  border: 0;
 | 
					 | 
				
			||||||
  height: 1px;
 | 
					 | 
				
			||||||
  background-color: #3d444db3;
 | 
					 | 
				
			||||||
  margin-top: calc(7px);
 | 
					 | 
				
			||||||
  margin-bottom: 8px;
 | 
					 | 
				
			||||||
  list-style: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.dropdown.branch-selector-dropdown > .visible.menu {
 | 
					 | 
				
			||||||
  // 仓库分支列表下查看操作按钮
 | 
					 | 
				
			||||||
  > .item {
 | 
					 | 
				
			||||||
    display: flex;
 | 
					 | 
				
			||||||
    align-items: center;
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
    margin: 8px;
 | 
					 | 
				
			||||||
    padding: 6px 8px !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .scrolling.menu .item {
 | 
					 | 
				
			||||||
    padding: 6px 16px !important;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 分支菜单下划线
 | 
					 | 
				
			||||||
    &:before {
 | 
					 | 
				
			||||||
      content: ' ';
 | 
					 | 
				
			||||||
      display: block;
 | 
					 | 
				
			||||||
      position: absolute;
 | 
					 | 
				
			||||||
      width: 100%;
 | 
					 | 
				
			||||||
      top: 0px;
 | 
					 | 
				
			||||||
      left: 0px;
 | 
					 | 
				
			||||||
      border-width: 1px 0px 0px;
 | 
					 | 
				
			||||||
      border-style: solid;
 | 
					 | 
				
			||||||
      border-image: initial;
 | 
					 | 
				
			||||||
      border-color: #3d444db3;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:first-of-type:before {
 | 
					 | 
				
			||||||
      border-color: transparent;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      &:before {
 | 
					 | 
				
			||||||
        border-color: transparent;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      + :before {
 | 
					 | 
				
			||||||
        border-color: transparent;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .ui.label {
 | 
					 | 
				
			||||||
      margin-top: 1px;
 | 
					 | 
				
			||||||
      margin-left: auto;
 | 
					 | 
				
			||||||
      margin-right: 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,23 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.emoji[aria-label='check\\ mark'],
 | 
					 | 
				
			||||||
.emoji[aria-label='currency\\ exchange'],
 | 
					 | 
				
			||||||
.emoji[aria-label='TOP\\ arrow'],
 | 
					 | 
				
			||||||
.emoji[aria-label='END\\ arrow'],
 | 
					 | 
				
			||||||
.emoji[aria-label='ON! arrow'],
 | 
					 | 
				
			||||||
.emoji[aria-label='SOON\\ arrow'],
 | 
					 | 
				
			||||||
.emoji[aria-label='heavy dollar sign'],
 | 
					 | 
				
			||||||
.emoji[aria-label='copyright'],
 | 
					 | 
				
			||||||
.emoji[aria-label='registered'],
 | 
					 | 
				
			||||||
.emoji[aria-label='trade\\ mark'],
 | 
					 | 
				
			||||||
.emoji[aria-label='multiply'],
 | 
					 | 
				
			||||||
.emoji[aria-label='plus'],
 | 
					 | 
				
			||||||
.emoji[aria-label='minus'],
 | 
					 | 
				
			||||||
.emoji[aria-label='divide'],
 | 
					 | 
				
			||||||
.emoji[aria-label='curly\\ loop'],
 | 
					 | 
				
			||||||
.emoji[aria-label='double curly loop'],
 | 
					 | 
				
			||||||
.emoji[aria-label='wavy\\ dash'],
 | 
					 | 
				
			||||||
.emoji[aria-label='paw\\ prints'],
 | 
					 | 
				
			||||||
.emoji[aria-label='musical\\ note'],
 | 
					 | 
				
			||||||
.emoji[aria-label='musical\\ notes'] {
 | 
					 | 
				
			||||||
  filter: invert(100%) hue-rotate(180deg);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,11 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.lines-num span:after {
 | 
					 | 
				
			||||||
  color: var(--color-text);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.cards > .card,
 | 
					 | 
				
			||||||
.ui.card {
 | 
					 | 
				
			||||||
  > .extra a:not(.ui):hover {
 | 
					 | 
				
			||||||
    color: var(--color-blue);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,34 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
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 {
 | 
					 | 
				
			||||||
  background: unset;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:hover {
 | 
					 | 
				
			||||||
    background: unset;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:focus,
 | 
					 | 
				
			||||||
  &:focus-visible {
 | 
					 | 
				
			||||||
    background: unset !important;
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
    border-color: #1f6feb;
 | 
					 | 
				
			||||||
    outline: none;
 | 
					 | 
				
			||||||
    box-shadow: inset 0 0 0 1px #1f6feb;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,182 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.repo-buttons .ui.basic.label {
 | 
					 | 
				
			||||||
  color: #f0f6fc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
a.ui.basic.label:hover {
 | 
					 | 
				
			||||||
  color: #f0f6fc;
 | 
					 | 
				
			||||||
  background-color: #262c36;
 | 
					 | 
				
			||||||
  border-color: var(--color-light-border);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
span,
 | 
					 | 
				
			||||||
.org-visibility div {
 | 
					 | 
				
			||||||
  &.ui.basic.label {
 | 
					 | 
				
			||||||
    border-radius: 25px;
 | 
					 | 
				
			||||||
    background-color: unset;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.badge.tw-bg-green,
 | 
					 | 
				
			||||||
.ui.green.label.issue-state-label {
 | 
					 | 
				
			||||||
  background-color: #238636 !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.badge.tw-bg-red {
 | 
					 | 
				
			||||||
  background-color: var(--color-purple) !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.ui.ui {
 | 
					 | 
				
			||||||
  &.purple.label {
 | 
					 | 
				
			||||||
    border-radius: 25px !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.green.label.issue-state-label {
 | 
					 | 
				
			||||||
    background: var(--color-primary);
 | 
					 | 
				
			||||||
    border-radius: 25px !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.red.label.issue-state-label {
 | 
					 | 
				
			||||||
    background: var(--color-purple);
 | 
					 | 
				
			||||||
    border-radius: 25px !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.primary.label {
 | 
					 | 
				
			||||||
    color: var(--color-blue);
 | 
					 | 
				
			||||||
    background-color: #388bfd33;
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-blue);
 | 
					 | 
				
			||||||
    border-radius: 25px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.basic.primary.label {
 | 
					 | 
				
			||||||
    color: var(--color-blue);
 | 
					 | 
				
			||||||
    background-color: #388bfd33 !important;
 | 
					 | 
				
			||||||
    border-color: #1f6feb !important;
 | 
					 | 
				
			||||||
    border-radius: 25px !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // 发布&Runner 状态标签
 | 
					 | 
				
			||||||
  &.green.label:not(.issue-state-label) {
 | 
					 | 
				
			||||||
    background: unset;
 | 
					 | 
				
			||||||
    border-color: #238636;
 | 
					 | 
				
			||||||
    border-width: 1px;
 | 
					 | 
				
			||||||
    border-style: solid;
 | 
					 | 
				
			||||||
    border-radius: 25px;
 | 
					 | 
				
			||||||
    color: #3fb950;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.orange.label:not(.issue-state-label) {
 | 
					 | 
				
			||||||
    background: unset;
 | 
					 | 
				
			||||||
    border-color: #9e6a03;
 | 
					 | 
				
			||||||
    border-width: 1px;
 | 
					 | 
				
			||||||
    border-style: solid;
 | 
					 | 
				
			||||||
    border-radius: 25px;
 | 
					 | 
				
			||||||
    color: #d29922;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
a.ui.ui.ui {
 | 
					 | 
				
			||||||
  &.primary.label:hover {
 | 
					 | 
				
			||||||
    color: #fff;
 | 
					 | 
				
			||||||
    background: #1f6feb;
 | 
					 | 
				
			||||||
    border-color: #1f6feb;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.basic.primary.label:hover {
 | 
					 | 
				
			||||||
    color: #79c0ff;
 | 
					 | 
				
			||||||
    background-color: #3a83fd5c !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.issue-list .text.red {
 | 
					 | 
				
			||||||
  color: #ab7df8 !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Runner&软件包&提交 标签
 | 
					 | 
				
			||||||
.ui.label {
 | 
					 | 
				
			||||||
  &.sha {
 | 
					 | 
				
			||||||
    color: #919894;
 | 
					 | 
				
			||||||
    background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    &:hover {
 | 
					 | 
				
			||||||
      background-color: var(--color-hover);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:not(.basic, .sha) {
 | 
					 | 
				
			||||||
    color: var(--color-blue);
 | 
					 | 
				
			||||||
    background: #121d2f;
 | 
					 | 
				
			||||||
    border-radius: 25px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.task-status-success {
 | 
					 | 
				
			||||||
    color: var(--color-success-text);
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-success-border);
 | 
					 | 
				
			||||||
    background: var(--color-success-bg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.task-status-failure {
 | 
					 | 
				
			||||||
    color: var(--color-error-text);
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-error-border);
 | 
					 | 
				
			||||||
    background: var(--color-error-bg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.task-status-running,
 | 
					 | 
				
			||||||
  &.task-status-skipped {
 | 
					 | 
				
			||||||
    color: var(--color-info-text);
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-info-border);
 | 
					 | 
				
			||||||
    background: var(--color-info-bg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.task-status-cancelled,
 | 
					 | 
				
			||||||
  &.task-status-blocked {
 | 
					 | 
				
			||||||
    color: var(--color-warning-text);
 | 
					 | 
				
			||||||
    border: 1px solid var(--color-warning-border);
 | 
					 | 
				
			||||||
    background: var(--color-warning-bg);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  > a {
 | 
					 | 
				
			||||||
    opacity: 1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
a.ui.label:not(.basic, .sha):hover {
 | 
					 | 
				
			||||||
  color: #fff;
 | 
					 | 
				
			||||||
  background: #1f6feb;
 | 
					 | 
				
			||||||
  border-radius: 25px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
.sha .ui.label.sha {
 | 
					 | 
				
			||||||
  border: 0 !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.repository #commits-table .commit-list .ui.label.sha {
 | 
					 | 
				
			||||||
  line-height: 18px;
 | 
					 | 
				
			||||||
  margin-top: 0.375rem;
 | 
					 | 
				
			||||||
  margin-bottom: 0.375rem;
 | 
					 | 
				
			||||||
  margin-left: -2px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.repository {
 | 
					 | 
				
			||||||
  #commits-table td.sha,
 | 
					 | 
				
			||||||
  #repo-files-table,
 | 
					 | 
				
			||||||
  #repo-file-commit-box,
 | 
					 | 
				
			||||||
  #rev-list,
 | 
					 | 
				
			||||||
  .timeline-item.commits-list .singular-commit {
 | 
					 | 
				
			||||||
    .sha.label {
 | 
					 | 
				
			||||||
      .detail.icon {
 | 
					 | 
				
			||||||
        border: 0;
 | 
					 | 
				
			||||||
        background: unset;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      &.isSigned {
 | 
					 | 
				
			||||||
        &.isWarning,
 | 
					 | 
				
			||||||
        &.isVerified,
 | 
					 | 
				
			||||||
        &.isVerifiedUntrusted,
 | 
					 | 
				
			||||||
        &.isVerifiedUnmatched {
 | 
					 | 
				
			||||||
          .detail.icon {
 | 
					 | 
				
			||||||
            border: 0;
 | 
					 | 
				
			||||||
            background: unset;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,45 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.ui.modal {
 | 
					 | 
				
			||||||
  border: 1.5px solid var(--color-light-border);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  > .header {
 | 
					 | 
				
			||||||
    background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
    border-bottom: 1.5px solid var(--color-light-border);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  > .content,
 | 
					 | 
				
			||||||
  form > .content {
 | 
					 | 
				
			||||||
    background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  > .actions,
 | 
					 | 
				
			||||||
  .content + .actions,
 | 
					 | 
				
			||||||
  .content + form > .actions {
 | 
					 | 
				
			||||||
    background-color: var(--color-box-header);
 | 
					 | 
				
			||||||
    border-top: 1.5px solid var(--color-light-border);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  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 {
 | 
					 | 
				
			||||||
    &:focus,
 | 
					 | 
				
			||||||
    &:focus-visible {
 | 
					 | 
				
			||||||
      background: #0d1117 !important;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,99 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.ui {
 | 
					 | 
				
			||||||
  &.button,
 | 
					 | 
				
			||||||
  &.basic.buttons .button,
 | 
					 | 
				
			||||||
  &.basic.button,
 | 
					 | 
				
			||||||
  &.dropdown .menu,
 | 
					 | 
				
			||||||
  &.form input:not([type]),
 | 
					 | 
				
			||||||
  &.form input[type='date'],
 | 
					 | 
				
			||||||
  &.form input[type='datetime-local'],
 | 
					 | 
				
			||||||
  &.form input[type='email'],
 | 
					 | 
				
			||||||
  &.form input[type='number'],
 | 
					 | 
				
			||||||
  &.form input[type='password'],
 | 
					 | 
				
			||||||
  &.form input[type='search'],
 | 
					 | 
				
			||||||
  &.form input[type='tel'],
 | 
					 | 
				
			||||||
  &.form input[type='time'],
 | 
					 | 
				
			||||||
  &.form input[type='text'],
 | 
					 | 
				
			||||||
  &.form input[type='file'],
 | 
					 | 
				
			||||||
  &.form input[type='url'],
 | 
					 | 
				
			||||||
  &.form textarea,
 | 
					 | 
				
			||||||
  &.input textarea,
 | 
					 | 
				
			||||||
  &.ui.input > input,
 | 
					 | 
				
			||||||
  &.label,
 | 
					 | 
				
			||||||
  &.menu,
 | 
					 | 
				
			||||||
  &.segment,
 | 
					 | 
				
			||||||
  &.segments,
 | 
					 | 
				
			||||||
  &.segments:not(.horizontal) > .segment:only-child,
 | 
					 | 
				
			||||||
  &.secondary.menu .dropdown.item > .menu,
 | 
					 | 
				
			||||||
  &.selection.dropdown,
 | 
					 | 
				
			||||||
  &.selection.dropdown .menu,
 | 
					 | 
				
			||||||
  &.table,
 | 
					 | 
				
			||||||
  &.text.menu .dropdown.item > .menu {
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .floating.dropdown > .menu {
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  .repository.view.issue .comment-list .comment > .content > div:last-child {
 | 
					 | 
				
			||||||
    border-bottom-right-radius: var(--border-radius);
 | 
					 | 
				
			||||||
    border-bottom-left-radius: var(--border-radius);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 左边框圆角
 | 
					 | 
				
			||||||
.ui {
 | 
					 | 
				
			||||||
  &.action.input > .dropdown:first-child,
 | 
					 | 
				
			||||||
  &.action.input > .button:first-child,
 | 
					 | 
				
			||||||
  &.action.input > .buttons:first-child > .button,
 | 
					 | 
				
			||||||
  &.compact.menu:not(.secondary) .item:first-child,
 | 
					 | 
				
			||||||
  &.horizontal.segments > .segment:first-child {
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius) 0 0 var(--border-radius);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 右边框圆角
 | 
					 | 
				
			||||||
.ui {
 | 
					 | 
				
			||||||
  &.action.input > .dropdown:last-child,
 | 
					 | 
				
			||||||
  &.action.input > .button:last-child,
 | 
					 | 
				
			||||||
  &.action.input > .buttons:last-child > .button,
 | 
					 | 
				
			||||||
  &.compact.menu:not(.secondary) .item:last-child,
 | 
					 | 
				
			||||||
  &.horizontal.segments > .segment:last-child {
 | 
					 | 
				
			||||||
    border-radius: 0 var(--border-radius) var(--border-radius) 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 上边框圆角
 | 
					 | 
				
			||||||
.ui.secondary.pointing.menu {
 | 
					 | 
				
			||||||
  .active.item,
 | 
					 | 
				
			||||||
  .item:hover {
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.tabular.menu .active.item,
 | 
					 | 
				
			||||||
.repository.view.issue .comment-list .comment > .content > div:first-child {
 | 
					 | 
				
			||||||
  border-top-left-radius: var(--border-radius) !important;
 | 
					 | 
				
			||||||
  border-top-right-radius: var(--border-radius) !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 按钮边框圆角
 | 
					 | 
				
			||||||
.ui.active.selection.dropdown {
 | 
					 | 
				
			||||||
  border-bottom-left-radius: var(--border-radius) !important;
 | 
					 | 
				
			||||||
  border-bottom-right-radius: var(--border-radius) !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.segment[class*='bottom attached'] {
 | 
					 | 
				
			||||||
  border-radius: 0 0 var(--border-radius) var(--border-radius);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.ui.table > thead > tr:first-child > th {
 | 
					 | 
				
			||||||
  &:first-child {
 | 
					 | 
				
			||||||
    border-radius: var(--border-radius) 0 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &:last-child {
 | 
					 | 
				
			||||||
    border-radius: 0 var(--border-radius) 0 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,9 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
.text {
 | 
					 | 
				
			||||||
  .purple {
 | 
					 | 
				
			||||||
    color: #ab7df8 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  .green {
 | 
					 | 
				
			||||||
    color: #3fb950 !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,45 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
@keyframes overlay-appear {
 | 
					 | 
				
			||||||
  0% {
 | 
					 | 
				
			||||||
    opacity: 0;
 | 
					 | 
				
			||||||
    transform: translateY(-12px);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  100% {
 | 
					 | 
				
			||||||
    opacity: 1;
 | 
					 | 
				
			||||||
    transform: translateY(0);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#navbar .item,
 | 
					 | 
				
			||||||
.header-wrapper .ui.tabular.menu .item,
 | 
					 | 
				
			||||||
.job-step-summary,
 | 
					 | 
				
			||||||
.job-step-logs,
 | 
					 | 
				
			||||||
.job-brief-item,
 | 
					 | 
				
			||||||
.tippy-box .flex-items-block .item,
 | 
					 | 
				
			||||||
.clone-panel-tab .item,
 | 
					 | 
				
			||||||
.ui.form select,
 | 
					 | 
				
			||||||
.ui.label,
 | 
					 | 
				
			||||||
.ui.modal,
 | 
					 | 
				
			||||||
.ui.selection.dropdown,
 | 
					 | 
				
			||||||
.ui.checkbox label:before,
 | 
					 | 
				
			||||||
.ui.checkbox input:checked ~ label:before,
 | 
					 | 
				
			||||||
.ui.checkbox input:not([type='radio']):indeterminate ~ label:before,
 | 
					 | 
				
			||||||
.ui.selection.active.dropdown,
 | 
					 | 
				
			||||||
.ui.selection.active.dropdown:hover,
 | 
					 | 
				
			||||||
.ui.selection.active.dropdown .menu,
 | 
					 | 
				
			||||||
.ui.selection.active.dropdown:hover .menu,
 | 
					 | 
				
			||||||
.ui.vertical.menu .header.item,
 | 
					 | 
				
			||||||
.ui.secondary.menu .item {
 | 
					 | 
				
			||||||
  transition: 0.12s ease-out;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
textarea,
 | 
					 | 
				
			||||||
.ui.form input,
 | 
					 | 
				
			||||||
.menu .item,
 | 
					 | 
				
			||||||
.ui.modal,
 | 
					 | 
				
			||||||
.job-step-summary,
 | 
					 | 
				
			||||||
.job-step-logs,
 | 
					 | 
				
			||||||
.job-brief-item {
 | 
					 | 
				
			||||||
  animation: 200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running overlay-appear;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
/* Made by Luting ^-^ */
 | 
					 | 
				
			||||||
@use "public";
 | 
					 | 
				
			||||||
@use "components";
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
// Made by Luting ^-^
 | 
					 | 
				
			||||||
@use "dark/github-dark.css"; // GitHub 变量(仅主题内部使用的变量)
 | 
					 | 
				
			||||||
@use "dark/gitea-dark.css"; // Gitea 变量(元素默认使用的变量)
 | 
					 | 
				
			||||||
@@ -1,229 +0,0 @@
 | 
				
			|||||||
/* Made by Luting ^-^ */
 | 
					 | 
				
			||||||
:root {
 | 
					 | 
				
			||||||
  --is-dark-theme: true;
 | 
					 | 
				
			||||||
  --border-radius: 6px;
 | 
					 | 
				
			||||||
  --color-primary: var(--color-blue);
 | 
					 | 
				
			||||||
  --color-primary-contrast: #fff;
 | 
					 | 
				
			||||||
  --color-primary-dark-1: #739cb3;
 | 
					 | 
				
			||||||
  --color-primary-dark-2: #40aaff;
 | 
					 | 
				
			||||||
  --color-primary-dark-3: #92b4c4;
 | 
					 | 
				
			||||||
  --color-primary-dark-4: #a1bbcd;
 | 
					 | 
				
			||||||
  --color-primary-dark-5: #cfddc1;
 | 
					 | 
				
			||||||
  --color-primary-dark-6: #e7eee0;
 | 
					 | 
				
			||||||
  --color-primary-dark-7: #f8faf6;
 | 
					 | 
				
			||||||
  --color-primary-light-1: var(--color-blue);
 | 
					 | 
				
			||||||
  --color-primary-light-2: #437aad;
 | 
					 | 
				
			||||||
  --color-primary-light-3: #415b8b;
 | 
					 | 
				
			||||||
  --color-primary-light-4: #25425a;
 | 
					 | 
				
			||||||
  --color-primary-light-5: #223546;
 | 
					 | 
				
			||||||
  --color-primary-light-6: #131923;
 | 
					 | 
				
			||||||
  --color-primary-light-7: #06090b;
 | 
					 | 
				
			||||||
  --color-primary-alpha-10: #3683c019;
 | 
					 | 
				
			||||||
  --color-primary-alpha-20: #3683c033;
 | 
					 | 
				
			||||||
  --color-primary-alpha-30: #3683c04b;
 | 
					 | 
				
			||||||
  --color-primary-alpha-40: #3683c066;
 | 
					 | 
				
			||||||
  --color-primary-alpha-50: #3683c080;
 | 
					 | 
				
			||||||
  --color-primary-alpha-60: #3683c099;
 | 
					 | 
				
			||||||
  --color-primary-alpha-70: #3683c0b3;
 | 
					 | 
				
			||||||
  --color-primary-alpha-80: #3683c0cc;
 | 
					 | 
				
			||||||
  --color-primary-alpha-90: #3683c0e1;
 | 
					 | 
				
			||||||
  --color-primary-hover: var(--color-primary-light-1);
 | 
					 | 
				
			||||||
  --color-primary-active: var(--color-primary-light-2);
 | 
					 | 
				
			||||||
  --color-secondary: #3d444d;
 | 
					 | 
				
			||||||
  --color-secondary-dark-1: #505665;
 | 
					 | 
				
			||||||
  --color-secondary-dark-2: #5b6273;
 | 
					 | 
				
			||||||
  --color-secondary-dark-3: #71798e;
 | 
					 | 
				
			||||||
  --color-secondary-dark-4: #7f8699;
 | 
					 | 
				
			||||||
  --color-secondary-dark-5: #8c93a4;
 | 
					 | 
				
			||||||
  --color-secondary-dark-6: #9aa0af;
 | 
					 | 
				
			||||||
  --color-secondary-dark-7: #a8adba;
 | 
					 | 
				
			||||||
  --color-secondary-dark-8: #c4c7d0;
 | 
					 | 
				
			||||||
  --color-secondary-dark-9: #dfe1e6;
 | 
					 | 
				
			||||||
  --color-secondary-dark-10: #edeef1;
 | 
					 | 
				
			||||||
  --color-secondary-dark-11: #fbfbfc;
 | 
					 | 
				
			||||||
  --color-secondary-dark-12: #eeeff2;
 | 
					 | 
				
			||||||
  --color-secondary-dark-13: #fbfbfc;
 | 
					 | 
				
			||||||
  --color-secondary-light-1: #373b46;
 | 
					 | 
				
			||||||
  --color-secondary-light-2: #292c34;
 | 
					 | 
				
			||||||
  --color-secondary-light-3: #1c1e23;
 | 
					 | 
				
			||||||
  --color-secondary-light-4: #0e0f11;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-10: #2c2f35;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-20: #2c2f3533;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-30: #2c2f354b;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-40: #2c2f3566;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-50: #ffffff28;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-60: #161b22;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-70: #2c2f35b3;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-80: #2c2f35cc;
 | 
					 | 
				
			||||||
  --color-secondary-alpha-90: #2c2f35e1;
 | 
					 | 
				
			||||||
  --color-red: #da3737;
 | 
					 | 
				
			||||||
  --color-orange: #f17a2b;
 | 
					 | 
				
			||||||
  --color-yellow: #f3c640;
 | 
					 | 
				
			||||||
  --color-olive: #c8df36;
 | 
					 | 
				
			||||||
  --color-green: #39d353;
 | 
					 | 
				
			||||||
  --color-teal: #69d4cf;
 | 
					 | 
				
			||||||
  --color-blue: #4493f8;
 | 
					 | 
				
			||||||
  --color-violet: #754ad3;
 | 
					 | 
				
			||||||
  --color-purple: #8957e5;
 | 
					 | 
				
			||||||
  --color-pink: #e04b9f;
 | 
					 | 
				
			||||||
  --color-brown: #a86d45;
 | 
					 | 
				
			||||||
  --color-black: #141516;
 | 
					 | 
				
			||||||
  --color-grey: #797c85;
 | 
					 | 
				
			||||||
  --color-gold: #d4b74c;
 | 
					 | 
				
			||||||
  --color-white: #ffffff;
 | 
					 | 
				
			||||||
  --color-red-light: #d15a5a;
 | 
					 | 
				
			||||||
  --color-orange-light: #f6a066;
 | 
					 | 
				
			||||||
  --color-yellow-light: #eaaf03;
 | 
					 | 
				
			||||||
  --color-olive-light: #abc016;
 | 
					 | 
				
			||||||
  --color-green-light: #93b373;
 | 
					 | 
				
			||||||
  --color-teal-light: #00b6ad;
 | 
					 | 
				
			||||||
  --color-blue-light: #4e96cc;
 | 
					 | 
				
			||||||
  --color-violet-light: #9b79e4;
 | 
					 | 
				
			||||||
  --color-purple-light: #ba6ad5;
 | 
					 | 
				
			||||||
  --color-pink-light: #d74397;
 | 
					 | 
				
			||||||
  --color-brown-light: #b08061;
 | 
					 | 
				
			||||||
  --color-black-light: #3f4555;
 | 
					 | 
				
			||||||
  --color-red-dark-1: #c23636;
 | 
					 | 
				
			||||||
  --color-orange-dark-1: #f38236;
 | 
					 | 
				
			||||||
  --color-yellow-dark-1: #b88a03;
 | 
					 | 
				
			||||||
  --color-olive-dark-1: #839311;
 | 
					 | 
				
			||||||
  --color-green-dark-1: #238636;
 | 
					 | 
				
			||||||
  --color-teal-dark-1: #00837c;
 | 
					 | 
				
			||||||
  --color-blue-dark-1: #347cb3;
 | 
					 | 
				
			||||||
  --color-violet-dark-1: #7b4edb;
 | 
					 | 
				
			||||||
  --color-purple-dark-1: #a742c9;
 | 
					 | 
				
			||||||
  --color-pink-dark-1: #be297d;
 | 
					 | 
				
			||||||
  --color-brown-dark-1: #94674a;
 | 
					 | 
				
			||||||
  --color-black-dark-1: #292d38;
 | 
					 | 
				
			||||||
  --color-red-dark-2: #ad3030;
 | 
					 | 
				
			||||||
  --color-orange-dark-2: #f16e17;
 | 
					 | 
				
			||||||
  --color-yellow-dark-2: #a37a02;
 | 
					 | 
				
			||||||
  --color-olive-dark-2: #74820f;
 | 
					 | 
				
			||||||
  --color-green-dark-2: #6c8c4c;
 | 
					 | 
				
			||||||
  --color-teal-dark-2: #00746e;
 | 
					 | 
				
			||||||
  --color-blue-dark-2: #2e6e9f;
 | 
					 | 
				
			||||||
  --color-violet-dark-2: #6733d6;
 | 
					 | 
				
			||||||
  --color-purple-dark-2: #9834b9;
 | 
					 | 
				
			||||||
  --color-pink-dark-2: #a9246f;
 | 
					 | 
				
			||||||
  --color-brown-dark-2: #835b42;
 | 
					 | 
				
			||||||
  --color-black-dark-2: #252832;
 | 
					 | 
				
			||||||
  --color-ansi-black: var(--color-black);
 | 
					 | 
				
			||||||
  --color-ansi-red: var(--color-red);
 | 
					 | 
				
			||||||
  --color-ansi-green: var(--color-green);
 | 
					 | 
				
			||||||
  --color-ansi-yellow: var(--color-yellow);
 | 
					 | 
				
			||||||
  --color-ansi-blue: var(--color-blue);
 | 
					 | 
				
			||||||
  --color-ansi-magenta: var(--color-pink);
 | 
					 | 
				
			||||||
  --color-ansi-cyan: var(--color-teal);
 | 
					 | 
				
			||||||
  --color-ansi-white: var(--color-console-fg-subtle);
 | 
					 | 
				
			||||||
  --color-ansi-bright-black: var(--color-black-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-red: var(--color-red-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-green: var(--color-green-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-yellow: var(--color-yellow-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-blue: var(--color-blue-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-magenta: var(--color-pink-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-cyan: var(--color-teal-light);
 | 
					 | 
				
			||||||
  --color-ansi-bright-white: var(--color-console-fg);
 | 
					 | 
				
			||||||
  --color-console-fg: #f0f6fc;
 | 
					 | 
				
			||||||
  --color-console-fg-subtle: #9198a1;
 | 
					 | 
				
			||||||
  --color-console-bg: #010409;
 | 
					 | 
				
			||||||
  --color-console-border: #2b3139;
 | 
					 | 
				
			||||||
  --color-console-active-bg: #2a313c;
 | 
					 | 
				
			||||||
  --color-console-hover-bg: #15191f;
 | 
					 | 
				
			||||||
  --color-console-menu-bg: var(--color-body);
 | 
					 | 
				
			||||||
  --color-console-menu-border: var(--color-light-border);
 | 
					 | 
				
			||||||
  --color-grey: #505665;
 | 
					 | 
				
			||||||
  --color-grey-light: #a1a6b7;
 | 
					 | 
				
			||||||
  --color-gold: #b1983b;
 | 
					 | 
				
			||||||
  --color-white: #fff;
 | 
					 | 
				
			||||||
  --color-diff-removed-word-bg: #792e2d;
 | 
					 | 
				
			||||||
  --color-diff-added-word-bg: #1d572d;
 | 
					 | 
				
			||||||
  --color-diff-removed-row-bg: #25171c;
 | 
					 | 
				
			||||||
  --color-diff-moved-row-bg: #818044;
 | 
					 | 
				
			||||||
  --color-diff-added-row-bg: #12261e;
 | 
					 | 
				
			||||||
  --color-diff-removed-row-border: #634343;
 | 
					 | 
				
			||||||
  --color-diff-moved-row-border: #bcca6f;
 | 
					 | 
				
			||||||
  --color-diff-added-row-border: #314a37;
 | 
					 | 
				
			||||||
  --color-diff-inactive: #353846;
 | 
					 | 
				
			||||||
  --color-error-border: #792e2e;
 | 
					 | 
				
			||||||
  --color-error-bg: #26181d;
 | 
					 | 
				
			||||||
  --color-error-bg-active: #744;
 | 
					 | 
				
			||||||
  --color-error-bg-hover: #633;
 | 
					 | 
				
			||||||
  --color-error-text: #f85149;
 | 
					 | 
				
			||||||
  --color-success-border: #1d572d;
 | 
					 | 
				
			||||||
  --color-success-bg: #12261e;
 | 
					 | 
				
			||||||
  --color-success-text: #39d353;
 | 
					 | 
				
			||||||
  --color-warning-border: #624711;
 | 
					 | 
				
			||||||
  --color-warning-bg: #272115;
 | 
					 | 
				
			||||||
  --color-warning-text: #fbbd08;
 | 
					 | 
				
			||||||
  --color-info-border: #214a81;
 | 
					 | 
				
			||||||
  --color-info-bg: #121d2f;
 | 
					 | 
				
			||||||
  --color-info-text: #4493f8;
 | 
					 | 
				
			||||||
  --color-red-badge: #db2828;
 | 
					 | 
				
			||||||
  --color-red-badge-bg: #db28281a;
 | 
					 | 
				
			||||||
  --color-red-badge-hover-bg: #db28284d;
 | 
					 | 
				
			||||||
  --color-green-badge: #39d353;
 | 
					 | 
				
			||||||
  --color-green-badge-bg: #12261e;
 | 
					 | 
				
			||||||
  --color-green-badge-hover-bg: #153d22;
 | 
					 | 
				
			||||||
  --color-yellow-badge: #fbbd08;
 | 
					 | 
				
			||||||
  --color-yellow-badge-bg: #fbbd081a;
 | 
					 | 
				
			||||||
  --color-yellow-badge-hover-bg: #fbbd084d;
 | 
					 | 
				
			||||||
  --color-orange-badge: #f2711c;
 | 
					 | 
				
			||||||
  --color-orange-badge-bg: #f2711c1a;
 | 
					 | 
				
			||||||
  --color-orange-badge-hover-bg: #f2711c4d;
 | 
					 | 
				
			||||||
  --color-git: #f05133;
 | 
					 | 
				
			||||||
  --color-body: #0d1117;
 | 
					 | 
				
			||||||
  --color-box-header: #151b23;
 | 
					 | 
				
			||||||
  --color-box-body: #0d1117;
 | 
					 | 
				
			||||||
  --color-box-body-highlight: #262c36;
 | 
					 | 
				
			||||||
  --color-text-dark: #dbe0ea;
 | 
					 | 
				
			||||||
  --color-text: #dce2e7;
 | 
					 | 
				
			||||||
  --color-text-light: #a6aab5;
 | 
					 | 
				
			||||||
  --color-text-light-1: rgb(125, 133, 144);
 | 
					 | 
				
			||||||
  --color-text-light-2: #8a8e99;
 | 
					 | 
				
			||||||
  --color-text-light-3: #707687;
 | 
					 | 
				
			||||||
  --color-footer: #010409;
 | 
					 | 
				
			||||||
  --color-timeline: #4c525e;
 | 
					 | 
				
			||||||
  --color-input-text: #d5dbe6;
 | 
					 | 
				
			||||||
  --color-input-background: #2c2f35;
 | 
					 | 
				
			||||||
  --color-input-toggle-background: #454a57;
 | 
					 | 
				
			||||||
  --color-input-border: var(--color-light-border);
 | 
					 | 
				
			||||||
  --color-input-border-hover: var(--color-light-border);
 | 
					 | 
				
			||||||
  --color-header-wrapper: #0d1117;
 | 
					 | 
				
			||||||
  --color-header-wrapper-transparent: #20243000;
 | 
					 | 
				
			||||||
  --color-light: #00000028;
 | 
					 | 
				
			||||||
  --color-light-mimic-enabled: rgba(0, 0, 0, calc(40 / 255 * 222 / 255 / var(--opacity-disabled)));
 | 
					 | 
				
			||||||
  --color-light-border: #3d444d;
 | 
					 | 
				
			||||||
  --color-hover: #656c7633;
 | 
					 | 
				
			||||||
  --color-active: #161a21;
 | 
					 | 
				
			||||||
  --color-menu: #0d1117;
 | 
					 | 
				
			||||||
  --color-card: #0d1117;
 | 
					 | 
				
			||||||
  --color-markup-table-row: #ffffff06;
 | 
					 | 
				
			||||||
  --color-markup-code-block: #ffffff16;
 | 
					 | 
				
			||||||
  --color-button: #212830;
 | 
					 | 
				
			||||||
  --color-code-bg: #0d1117;
 | 
					 | 
				
			||||||
  --color-code-sidebar-bg: #232834;
 | 
					 | 
				
			||||||
  --color-shadow: #00000060;
 | 
					 | 
				
			||||||
  --color-secondary-bg: #ffffff26;
 | 
					 | 
				
			||||||
  --color-text-focus: #fff;
 | 
					 | 
				
			||||||
  --color-expand-button: #3c404d;
 | 
					 | 
				
			||||||
  --color-placeholder-text: #8a8e99;
 | 
					 | 
				
			||||||
  --color-editor-line-highlight: var(--color-primary-light-5);
 | 
					 | 
				
			||||||
  --color-project-board-bg: var(--color-secondary-light-2);
 | 
					 | 
				
			||||||
  --color-caret: var(--color-text);
 | 
					 | 
				
			||||||
  --color-reaction-bg: #ffffff12;
 | 
					 | 
				
			||||||
  --color-reaction-hover-bg: var(--color-primary-light-4);
 | 
					 | 
				
			||||||
  --color-reaction-active-bg: var(--color-primary-light-5);
 | 
					 | 
				
			||||||
  --color-tooltip-text: #fff;
 | 
					 | 
				
			||||||
  --color-tooltip-bg: #000000f0;
 | 
					 | 
				
			||||||
  --color-nav-bg: #010409;
 | 
					 | 
				
			||||||
  --color-nav-hover-bg: var(--color-hover);
 | 
					 | 
				
			||||||
  --color-label-text: #fff;
 | 
					 | 
				
			||||||
  --color-label-bg: #7c84974b;
 | 
					 | 
				
			||||||
  --color-label-hover-bg: #7c8497a0;
 | 
					 | 
				
			||||||
  --color-label-active-bg: #7c8497;
 | 
					 | 
				
			||||||
  --color-accent: var(--color-primary-light-1);
 | 
					 | 
				
			||||||
  --color-small-accent: var(--color-primary-light-5);
 | 
					 | 
				
			||||||
  --color-active-line: #534d1b;
 | 
					 | 
				
			||||||
  accent-color: var(--color-accent);
 | 
					 | 
				
			||||||
  color-scheme: dark;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
/* Made by Luting ^-^ */
 | 
					 | 
				
			||||||
							
								
								
									
										255
									
								
								src/types/color/chroma.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,255 @@
 | 
				
			|||||||
 | 
					// 注释来自 AI
 | 
				
			||||||
 | 
					export const chroma = {
 | 
				
			||||||
 | 
					  textWhiteSpace: "text-white-space",
 | 
				
			||||||
 | 
					  err: null,
 | 
				
			||||||
 | 
					  keyword: {
 | 
				
			||||||
 | 
					    /** 所有关键字
 | 
				
			||||||
 | 
					     * @example class function var if else return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 常量关键字
 | 
				
			||||||
 | 
					     * @example true false null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    constant: null,
 | 
				
			||||||
 | 
					    /** 声明关键字
 | 
				
			||||||
 | 
					     * @example var let const
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    declaration: null,
 | 
				
			||||||
 | 
					    /** 命名空间关键字
 | 
				
			||||||
 | 
					     * @example package import export
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    namespace: null,
 | 
				
			||||||
 | 
					    /** 伪关键字
 | 
				
			||||||
 | 
					     * @example this super __init__
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    pseudo: null,
 | 
				
			||||||
 | 
					    /** 保留关键字
 | 
				
			||||||
 | 
					     * @example yield await goto
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    reserved: null,
 | 
				
			||||||
 | 
					    /** 类型关键字
 | 
				
			||||||
 | 
					     * @example int float string bool
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    type: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  name: {
 | 
				
			||||||
 | 
					    /** 通用标识符 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 属性名
 | 
				
			||||||
 | 
					     * @example obj.foo HTML/XML 属性名 id="foo"
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    attribute: null,
 | 
				
			||||||
 | 
					    /** 内置函数/对象
 | 
				
			||||||
 | 
					     * @example Math.PI Math.max
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    builtin: null,
 | 
				
			||||||
 | 
					    /** 内置伪标识符
 | 
				
			||||||
 | 
					     * @example this super self
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    builtinPseudo: null,
 | 
				
			||||||
 | 
					    /** 类名 */
 | 
				
			||||||
 | 
					    class: null,
 | 
				
			||||||
 | 
					    /** 常量名 */
 | 
				
			||||||
 | 
					    constant: null,
 | 
				
			||||||
 | 
					    /** 装饰器 */
 | 
				
			||||||
 | 
					    decorator: null,
 | 
				
			||||||
 | 
					    /** 实体名
 | 
				
			||||||
 | 
					     * @example HTML实体名 < > &
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    entity: null,
 | 
				
			||||||
 | 
					    /** 异常类名 */
 | 
				
			||||||
 | 
					    exception: null,
 | 
				
			||||||
 | 
					    /** 函数名 */
 | 
				
			||||||
 | 
					    function: null,
 | 
				
			||||||
 | 
					    /** 魔术方法名
 | 
				
			||||||
 | 
					     * @example __init__ __str__
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    functionMagic: null,
 | 
				
			||||||
 | 
					    /** 对象属性 */
 | 
				
			||||||
 | 
					    property: null,
 | 
				
			||||||
 | 
					    /** 标签名
 | 
				
			||||||
 | 
					     * @example 跳转标签
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    label: null,
 | 
				
			||||||
 | 
					    /** 命名空间 */
 | 
				
			||||||
 | 
					    namespace: null,
 | 
				
			||||||
 | 
					    /** 其他未归类的标识符 */
 | 
				
			||||||
 | 
					    other: null,
 | 
				
			||||||
 | 
					    /** 标签名
 | 
				
			||||||
 | 
					     * @example 跳转标签
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    tag: null,
 | 
				
			||||||
 | 
					    /** 变量名 */
 | 
				
			||||||
 | 
					    variable: null,
 | 
				
			||||||
 | 
					    /** 类变量 */
 | 
				
			||||||
 | 
					    variableClass: null,
 | 
				
			||||||
 | 
					    /** 全局变量 */
 | 
				
			||||||
 | 
					    variableGlobal: null,
 | 
				
			||||||
 | 
					    /** 实例变量 */
 | 
				
			||||||
 | 
					    variableInstance: null,
 | 
				
			||||||
 | 
					    /** 魔术变量
 | 
				
			||||||
 | 
					     * @example __name__ __doc__
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    variableMagic: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  literal: {
 | 
				
			||||||
 | 
					    /** 通用字面量 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 日期字面量
 | 
				
			||||||
 | 
					     * @example SQL 日期
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    date: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  string: {
 | 
				
			||||||
 | 
					    /** 通用字符串 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 字符串前缀/后缀
 | 
				
			||||||
 | 
					     * @example f"..." 的 f
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    affix: null,
 | 
				
			||||||
 | 
					    /** 反引号字符串
 | 
				
			||||||
 | 
					     * @example `string`
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    backtick: null,
 | 
				
			||||||
 | 
					    /** 字符字面量
 | 
				
			||||||
 | 
					     * @example 'a'
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    char: null,
 | 
				
			||||||
 | 
					    /** 字符串分隔符
 | 
				
			||||||
 | 
					     * @example 引号自身
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    delimiter: null,
 | 
				
			||||||
 | 
					    /** 文档字符串
 | 
				
			||||||
 | 
					     * @example """docstring"""
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    doc: null,
 | 
				
			||||||
 | 
					    /** 双引号字符串
 | 
				
			||||||
 | 
					     * @example "string"
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    double: null,
 | 
				
			||||||
 | 
					    /** 转义字符
 | 
				
			||||||
 | 
					     * @example \n \t
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    escape: null,
 | 
				
			||||||
 | 
					    /** 定界字符串
 | 
				
			||||||
 | 
					     * @example <<EOF EOF>>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    heredoc: null,
 | 
				
			||||||
 | 
					    /** 插值字符串
 | 
				
			||||||
 | 
					     * @example ${name}
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    interpol: null,
 | 
				
			||||||
 | 
					    /** 其他类型字符串 */
 | 
				
			||||||
 | 
					    other: null,
 | 
				
			||||||
 | 
					    /** 正则表达式字面量
 | 
				
			||||||
 | 
					     * @example /^abc/
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    regex: null,
 | 
				
			||||||
 | 
					    /** 单引号字符串
 | 
				
			||||||
 | 
					     * @example 'string'
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    single: null,
 | 
				
			||||||
 | 
					    /** 符号字符串
 | 
				
			||||||
 | 
					     * @example ruby 的 :symbol
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    symbol: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  number: {
 | 
				
			||||||
 | 
					    /** 通用数字 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 二进制数字
 | 
				
			||||||
 | 
					     * @example 0b1010
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bin: null,
 | 
				
			||||||
 | 
					    /** 浮点数
 | 
				
			||||||
 | 
					     * @example 1.23
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    float: null,
 | 
				
			||||||
 | 
					    /** 十六进制数字
 | 
				
			||||||
 | 
					     * @example 0x123
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    hex: null,
 | 
				
			||||||
 | 
					    /** 普通整数
 | 
				
			||||||
 | 
					     * @example 123
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    integer: null,
 | 
				
			||||||
 | 
					    /** 长整数
 | 
				
			||||||
 | 
					     * @example 123L
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    integerLong: null,
 | 
				
			||||||
 | 
					    /** 八进制数字
 | 
				
			||||||
 | 
					     * @example 0o123
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    oct: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  operator: {
 | 
				
			||||||
 | 
					    /** 运算符
 | 
				
			||||||
 | 
					     * @example + - * / =
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 单词运算符
 | 
				
			||||||
 | 
					     * @example and or not in is
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    word: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 标点符号
 | 
				
			||||||
 | 
					   * @example , . : ; ( ) [ ] { }
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  punctuation: null,
 | 
				
			||||||
 | 
					  comment: {
 | 
				
			||||||
 | 
					    /** 通用注释 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** Hashbang 注释
 | 
				
			||||||
 | 
					     * @example #!/bin/bash
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    hashbang: null,
 | 
				
			||||||
 | 
					    /** 多行注释 */
 | 
				
			||||||
 | 
					    multiline: null,
 | 
				
			||||||
 | 
					    /** 预处理器注释
 | 
				
			||||||
 | 
					     * @example #include <stdio.h>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    preproc: null,
 | 
				
			||||||
 | 
					    /** 预处理器文件注释
 | 
				
			||||||
 | 
					     * @example 如 python 的编码声明 # -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    preprocFile: null,
 | 
				
			||||||
 | 
					    /** 单行注释 */
 | 
				
			||||||
 | 
					    single: null,
 | 
				
			||||||
 | 
					    /** 特殊注释
 | 
				
			||||||
 | 
					     * @example JavaDoc 的 `@param`
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    special: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  generic: {
 | 
				
			||||||
 | 
					    /** 通用文本容器 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 被删除的内容 */
 | 
				
			||||||
 | 
					    deleted: null,
 | 
				
			||||||
 | 
					    /** 强调文本 (斜体) */
 | 
				
			||||||
 | 
					    emph: null,
 | 
				
			||||||
 | 
					    /** 错误信息 */
 | 
				
			||||||
 | 
					    error: null,
 | 
				
			||||||
 | 
					    /** 标题
 | 
				
			||||||
 | 
					     * @example Markdown 标题 #
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    heading: null,
 | 
				
			||||||
 | 
					    /** 新增内容 */
 | 
				
			||||||
 | 
					    inserted: null,
 | 
				
			||||||
 | 
					    /** 程序输出文本 */
 | 
				
			||||||
 | 
					    output: null,
 | 
				
			||||||
 | 
					    /** 交互式提示符
 | 
				
			||||||
 | 
					     * @example shell 的 $
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    prompt: null,
 | 
				
			||||||
 | 
					    /** 强调文本 (粗体) */
 | 
				
			||||||
 | 
					    strong: null,
 | 
				
			||||||
 | 
					    /** 子标题
 | 
				
			||||||
 | 
					     * @example Markdown 子标题 ##
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    subheading: null,
 | 
				
			||||||
 | 
					    /** 堆栈跟踪信息 */
 | 
				
			||||||
 | 
					    traceback: null,
 | 
				
			||||||
 | 
					    /** 下划线文本 */
 | 
				
			||||||
 | 
					    underline: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										49
									
								
								src/types/color/console.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					const ansiColor = {
 | 
				
			||||||
 | 
					  /** 黑色 */
 | 
				
			||||||
 | 
					  black: null,
 | 
				
			||||||
 | 
					  /** 红色 */
 | 
				
			||||||
 | 
					  red: null,
 | 
				
			||||||
 | 
					  /** 绿色 */
 | 
				
			||||||
 | 
					  green: null,
 | 
				
			||||||
 | 
					  /** 黄色 */
 | 
				
			||||||
 | 
					  yellow: null,
 | 
				
			||||||
 | 
					  /** 蓝色 */
 | 
				
			||||||
 | 
					  blue: null,
 | 
				
			||||||
 | 
					  /** 品红 */
 | 
				
			||||||
 | 
					  magenta: null,
 | 
				
			||||||
 | 
					  /** 青色 */
 | 
				
			||||||
 | 
					  cyan: null,
 | 
				
			||||||
 | 
					  /** 白色 */
 | 
				
			||||||
 | 
					  white: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const ansi = {
 | 
				
			||||||
 | 
					  /** 亮色 */
 | 
				
			||||||
 | 
					  bright: ansiColor,
 | 
				
			||||||
 | 
					  ...ansiColor,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const console = {
 | 
				
			||||||
 | 
					  /** Action 页面日志部分字体颜色 */
 | 
				
			||||||
 | 
					  fg: {
 | 
				
			||||||
 | 
					    /** 亮色用于标题或步骤标题激活时 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 暗色用于副标题或步骤标题 */
 | 
				
			||||||
 | 
					    subtle: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** Action 页面日志部分背景色 */
 | 
				
			||||||
 | 
					  bg: null,
 | 
				
			||||||
 | 
					  /** Action 页面日志部分边框色 */
 | 
				
			||||||
 | 
					  border: null,
 | 
				
			||||||
 | 
					  /** Action 页面日志部分步骤标题激活颜色 */
 | 
				
			||||||
 | 
					  activeBg: "color-console-active-bg",
 | 
				
			||||||
 | 
					  /** Action 页面日志部分步骤标题悬停颜色 */
 | 
				
			||||||
 | 
					  hoverBg: "color-console-hover-bg",
 | 
				
			||||||
 | 
					  /** Action 页面日志部分设置菜单颜色 */
 | 
				
			||||||
 | 
					  menu: {
 | 
				
			||||||
 | 
					    /** 菜单背景色 */
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					    /** 菜单边框色 */
 | 
				
			||||||
 | 
					    border: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										30
									
								
								src/types/color/diff.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					const row = {
 | 
				
			||||||
 | 
					  bg: null,
 | 
				
			||||||
 | 
					  border: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const line = {
 | 
				
			||||||
 | 
					  /** 行号 */
 | 
				
			||||||
 | 
					  linenum: {
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 代码行 */
 | 
				
			||||||
 | 
					  row: row,
 | 
				
			||||||
 | 
					  /** 代码 */
 | 
				
			||||||
 | 
					  word: {
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const diff = {
 | 
				
			||||||
 | 
					  /** 添加 */
 | 
				
			||||||
 | 
					  added: line,
 | 
				
			||||||
 | 
					  /** 移动 */
 | 
				
			||||||
 | 
					  moved: {
 | 
				
			||||||
 | 
					    row: row,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 删除 */
 | 
				
			||||||
 | 
					  removed: line,
 | 
				
			||||||
 | 
					  /** 对比空白部分背景色 */
 | 
				
			||||||
 | 
					  inactive: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										253
									
								
								src/types/color/github.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,253 @@
 | 
				
			|||||||
 | 
					export const github = {
 | 
				
			||||||
 | 
					  /** 用于 color 属性的颜色 */
 | 
				
			||||||
 | 
					  fgColor: {
 | 
				
			||||||
 | 
					    /** 强调色
 | 
				
			||||||
 | 
					     * @actions `actionViewRight` 右侧日志标题颜色
 | 
				
			||||||
 | 
					     * @issue `prBranch` 分支名称文本颜色
 | 
				
			||||||
 | 
					     * @repo `repoTopic` 仓库主题标签文本颜色
 | 
				
			||||||
 | 
					     * @actions `actions` 分支标签按钮文本颜色
 | 
				
			||||||
 | 
					     * @actions `actionViewHeader` 分支标签按钮文本颜色
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    accent: null,
 | 
				
			||||||
 | 
					    /** 成功的文本颜色
 | 
				
			||||||
 | 
					     * @issue `button` 重新开启按钮文本颜色
 | 
				
			||||||
 | 
					     * @label `label` 绿色标签的文本颜色
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    success: null,
 | 
				
			||||||
 | 
					    /** 完成的文本颜色
 | 
				
			||||||
 | 
					     * @issue `button` 关闭工单按钮文本颜色
 | 
				
			||||||
 | 
					     * @svg `issueClosed` 工单已关闭图标颜色
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    done: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 用于 background 属性的颜色 */
 | 
				
			||||||
 | 
					  bgColor: {
 | 
				
			||||||
 | 
					    accent: {
 | 
				
			||||||
 | 
					      /** 强调色
 | 
				
			||||||
 | 
					       * @diff 折叠/展开按钮的悬停颜色
 | 
				
			||||||
 | 
					       * @release `releaseTagMenu` 顶部栏左侧按钮激活背景色
 | 
				
			||||||
 | 
					       * @navbar `navbarRight` 头像管理员标识背景颜色
 | 
				
			||||||
 | 
					       * @dropdown `dropdown` emoji 的悬停背景色
 | 
				
			||||||
 | 
					       * @menu `paginationMenu` 分页菜单的激活背景色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					      /** 暗淡的背景颜色
 | 
				
			||||||
 | 
					       * @issue `prBranch` 分支名称背景颜色
 | 
				
			||||||
 | 
					       * @repo `repoTopic` 仓库主题标签背景颜色
 | 
				
			||||||
 | 
					       * @actions `actions` 分支标签按钮背景颜色
 | 
				
			||||||
 | 
					       * @actions `actionViewHeader` 分支标签按钮背景颜色
 | 
				
			||||||
 | 
					       * @notification `notification` 通知列表悬停时的背景颜色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      muted: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    success: {
 | 
				
			||||||
 | 
					      /** 成功的背景颜色
 | 
				
			||||||
 | 
					       * @issue `babel` 重新开启图标背景颜色
 | 
				
			||||||
 | 
					       * @issue `prMerge` 合并提交的图标背景色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    done: {
 | 
				
			||||||
 | 
					      /** 完成的背景颜色
 | 
				
			||||||
 | 
					       * @issue `babel` 工单已关闭图标背景颜色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  borderColor: {
 | 
				
			||||||
 | 
					    accent: {
 | 
				
			||||||
 | 
					      /** 强调色
 | 
				
			||||||
 | 
					       * @input `input` 输入框被选中时的边框颜色
 | 
				
			||||||
 | 
					       * @clone `clone` 克隆地址框被选中时的边框颜色
 | 
				
			||||||
 | 
					       * @issue `comment` 评论框被选中时的边框颜色
 | 
				
			||||||
 | 
					       * @actions `actionViewLeft` 左侧子作业激活伪元素颜色
 | 
				
			||||||
 | 
					       * @menu `verticalMenu` 垂直菜单项激活时左侧的伪元素颜色
 | 
				
			||||||
 | 
					       * @dropdown `selectionDropdown` 选择输入框的内部边框颜色
 | 
				
			||||||
 | 
					       * @notification `notification` 通知列表悬停时的左边框颜色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    attention: {
 | 
				
			||||||
 | 
					      /** 注意的边框颜色
 | 
				
			||||||
 | 
					       * @label `label` 黄色/橙色标签的边框色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    success: {
 | 
				
			||||||
 | 
					      /** 成功的边框颜色
 | 
				
			||||||
 | 
					       * @label `label` 绿色标签的边框色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    done: {
 | 
				
			||||||
 | 
					      /** 完成的边框颜色
 | 
				
			||||||
 | 
					       * @label `label` 红色/紫色标签的边框色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      emphasis: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  button: {
 | 
				
			||||||
 | 
					    /** 普通按钮 */
 | 
				
			||||||
 | 
					    default: {
 | 
				
			||||||
 | 
					      bgColor: {
 | 
				
			||||||
 | 
					        /** 静止色
 | 
				
			||||||
 | 
					         * @button `baseButton` 默认按钮激活颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        active: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    /** 主色调按钮 */
 | 
				
			||||||
 | 
					    primary: {
 | 
				
			||||||
 | 
					      fgColor: {
 | 
				
			||||||
 | 
					        /** 静止色
 | 
				
			||||||
 | 
					         * @button `primaryStyle` `primaryHoverStyle` 按钮文本颜色
 | 
				
			||||||
 | 
					         * @setting `tinyHoverStyle` 按钮的悬停文本颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        rest: null,
 | 
				
			||||||
 | 
					        /** 强调色 (Github 没有此颜色, 为本主题自定义, 需自行设置)
 | 
				
			||||||
 | 
					         * @setting `tinyStyle` 按钮的文本颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        accent: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      bgColor: {
 | 
				
			||||||
 | 
					        /** 静止色
 | 
				
			||||||
 | 
					         * @button `primaryStyle` 按钮颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        rest: null,
 | 
				
			||||||
 | 
					        /** 悬停色
 | 
				
			||||||
 | 
					         * @button `primaryHoverStyle` 按钮悬停颜色
 | 
				
			||||||
 | 
					         * @setting `tinyHoverStyle` 按钮的悬停背景颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        hover: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      borderColor: {
 | 
				
			||||||
 | 
					        /** 静止色
 | 
				
			||||||
 | 
					         * @button `primaryStyle` 按钮边框颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        rest: null,
 | 
				
			||||||
 | 
					        /** 悬停色
 | 
				
			||||||
 | 
					         * @button `primaryHoverStyle` 按钮悬停边框颜色
 | 
				
			||||||
 | 
					         * @setting `tinyHoverStyle` 按钮的悬停边框颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        hover: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    danger: {
 | 
				
			||||||
 | 
					      fgColor: {
 | 
				
			||||||
 | 
					        /** 静止色
 | 
				
			||||||
 | 
					         * @button `redButton` 红色按钮文本颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        rest: null,
 | 
				
			||||||
 | 
					        /** 悬停色
 | 
				
			||||||
 | 
					         * @button `redButton` 红色按钮悬停文本颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        hover: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      bgColor: {
 | 
				
			||||||
 | 
					        /** 静止色
 | 
				
			||||||
 | 
					         * @button `redButton` 红色按钮颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        rest: null,
 | 
				
			||||||
 | 
					        /** 悬停色
 | 
				
			||||||
 | 
					         * @button `redButton` 红色按钮悬停颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        hover: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      borderColor: {
 | 
				
			||||||
 | 
					        /** 悬停色
 | 
				
			||||||
 | 
					         * @button `redButton` 红色按钮悬停边框颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        hover: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    star: {
 | 
				
			||||||
 | 
					      /** 已标星的星星颜色 */
 | 
				
			||||||
 | 
					      iconColor: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  control: {
 | 
				
			||||||
 | 
					    bgColor: {
 | 
				
			||||||
 | 
					      /** 背景色
 | 
				
			||||||
 | 
					       * @issue `timeline` 时间线标签背景色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      rest: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    transparent: {
 | 
				
			||||||
 | 
					      bgColor: {
 | 
				
			||||||
 | 
					        /** 悬停色
 | 
				
			||||||
 | 
					         * @clone `clone` 克隆按钮下按钮组和面板操作列表的悬停背景颜色
 | 
				
			||||||
 | 
					         * @input `inputAction` 输入框动作按钮的悬停背景颜色
 | 
				
			||||||
 | 
					         * @dropdown `dropdown` 下拉框子项的悬停背景颜色
 | 
				
			||||||
 | 
					         * @menu `verticalMenu` 垂直菜单项的悬停背景颜色
 | 
				
			||||||
 | 
					         * @menu `menu` 菜单项的悬停背景颜色
 | 
				
			||||||
 | 
					         * @menu `secondaryMenu` 二级菜单按钮的悬停背景颜色
 | 
				
			||||||
 | 
					         * @repo `repoHeader` 仓库标题的悬停背景颜色
 | 
				
			||||||
 | 
					         * @commit `commit` 提交信息的 Action 按钮的悬停背景颜色
 | 
				
			||||||
 | 
					         * @filelist `repoFiles` README 栏的按钮的悬停背景颜色
 | 
				
			||||||
 | 
					         * @issue `issueSidebar` 操作按钮的悬停背景颜色
 | 
				
			||||||
 | 
					         * @issue `issueList` 头部菜单左侧开启关闭菜单的悬停背景颜色
 | 
				
			||||||
 | 
					         * @dashboard `dashboard` 仓库列表项目的悬停背景颜色
 | 
				
			||||||
 | 
					         * @notification `notification` 通知列表的按钮悬停背景颜色
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        hover: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  shadow: {
 | 
				
			||||||
 | 
					    floating: {
 | 
				
			||||||
 | 
					      /** 悬浮阴影
 | 
				
			||||||
 | 
					       * @tippy `tippyBox` 悬浮框阴影
 | 
				
			||||||
 | 
					       * @dropdown `dropdown` 下拉框阴影
 | 
				
			||||||
 | 
					       * @dashboard `dashboard` 仓库/组织切换按钮和列表边框和阴影
 | 
				
			||||||
 | 
					       * @heatmap `heatmap` 热力图阴影
 | 
				
			||||||
 | 
					       * @heatmap `activity` 动态活动阴影
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      small: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    resting: {
 | 
				
			||||||
 | 
					      /** 静止阴影
 | 
				
			||||||
 | 
					       * @button `primaryStyle` 主色调按钮阴影
 | 
				
			||||||
 | 
					       * @button `redButton` 红色按钮悬浮阴影
 | 
				
			||||||
 | 
					       * @setting `button` 红色按钮阴影
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      small: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  underlineNav: {
 | 
				
			||||||
 | 
					    borderColor: {
 | 
				
			||||||
 | 
					      /** 下划线导航栏的边框颜色
 | 
				
			||||||
 | 
					       * @clone `clone` 按钮组的按钮下划线颜色
 | 
				
			||||||
 | 
					       * @menu `secondaryMenu` 二级菜单按钮的下划线颜色
 | 
				
			||||||
 | 
					       * @filelist `repoFiles` README 栏的左边按钮下划线颜色
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      active: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 热力图 */
 | 
				
			||||||
 | 
					  contribution: {
 | 
				
			||||||
 | 
					    default: {
 | 
				
			||||||
 | 
					      /** 热力图方块的颜色 */
 | 
				
			||||||
 | 
					      bgColor: {
 | 
				
			||||||
 | 
					        num0: null,
 | 
				
			||||||
 | 
					        num1: null,
 | 
				
			||||||
 | 
					        num2: null,
 | 
				
			||||||
 | 
					        num3: null,
 | 
				
			||||||
 | 
					        num4: null,
 | 
				
			||||||
 | 
					        /** github 无此颜色需自行计算 */
 | 
				
			||||||
 | 
					        num5: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      /** 热力图方块的内边框颜色 */
 | 
				
			||||||
 | 
					      borderColor: {
 | 
				
			||||||
 | 
					        num0: null,
 | 
				
			||||||
 | 
					        num1: null,
 | 
				
			||||||
 | 
					        num2: null,
 | 
				
			||||||
 | 
					        num3: null,
 | 
				
			||||||
 | 
					        num4: null,
 | 
				
			||||||
 | 
					        /** github 无此颜色需自行计算
 | 
				
			||||||
 | 
					         * @example 目前均取 num0 的值
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        num5: null,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/types/color/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					export { chroma } from "./chroma";
 | 
				
			||||||
 | 
					export { ansi, console } from "./console";
 | 
				
			||||||
 | 
					export { diff } from "./diff";
 | 
				
			||||||
 | 
					export { github } from "./github";
 | 
				
			||||||
 | 
					export { primary, secondary } from "./main";
 | 
				
			||||||
 | 
					export { message } from "./message";
 | 
				
			||||||
 | 
					export { named } from "./named";
 | 
				
			||||||
 | 
					export { other, otherAuto } from "./other";
 | 
				
			||||||
							
								
								
									
										25
									
								
								src/types/color/main.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					const num = { num1: null, num2: null, num3: null, num4: null, num5: null, num6: null, num7: null };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const alpha = {
 | 
				
			||||||
 | 
					  num10: null,
 | 
				
			||||||
 | 
					  num20: null,
 | 
				
			||||||
 | 
					  num30: null,
 | 
				
			||||||
 | 
					  num40: null,
 | 
				
			||||||
 | 
					  num50: null,
 | 
				
			||||||
 | 
					  num60: null,
 | 
				
			||||||
 | 
					  num70: null,
 | 
				
			||||||
 | 
					  num80: null,
 | 
				
			||||||
 | 
					  num90: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const primary = { self: null, contrast: null, dark: num, light: num, alpha: alpha, hover: null, active: null };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const secondary = {
 | 
				
			||||||
 | 
					  self: null,
 | 
				
			||||||
 | 
					  dark: { num8: null, num9: null, num10: null, num11: null, num12: null, num13: null, ...num },
 | 
				
			||||||
 | 
					  light: { num1: null, num2: null, num3: null, num4: null },
 | 
				
			||||||
 | 
					  alpha: alpha,
 | 
				
			||||||
 | 
					  button: null,
 | 
				
			||||||
 | 
					  hover: null,
 | 
				
			||||||
 | 
					  active: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/types/color/message.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					const msg = { bg: null, border: null, text: null };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const error = { ...msg, bg: { self: null, active: null, hover: null } };
 | 
				
			||||||
 | 
					const success = { ...msg };
 | 
				
			||||||
 | 
					const warning = { ...msg };
 | 
				
			||||||
 | 
					const info = { ...msg };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const message = { error, success, warning, info };
 | 
				
			||||||
							
								
								
									
										37
									
								
								src/types/color/named.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					const baseColor = { self: null, light: null, dark: { num1: null, num2: null } };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const commitColor = {
 | 
				
			||||||
 | 
					  /** 提交哈希值颜色 */
 | 
				
			||||||
 | 
					  badge: {
 | 
				
			||||||
 | 
					    /** 边框色 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 背景色 */
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					    /** 悬停时背景色 */
 | 
				
			||||||
 | 
					    hover: {
 | 
				
			||||||
 | 
					      bg: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const named = {
 | 
				
			||||||
 | 
					  /** 红色/提交警告签名颜色 */
 | 
				
			||||||
 | 
					  red: { ...commitColor, ...baseColor },
 | 
				
			||||||
 | 
					  /** 橙色/提交未匹配签名颜色 */
 | 
				
			||||||
 | 
					  orange: { ...commitColor, ...baseColor },
 | 
				
			||||||
 | 
					  /** 黄色/提交未信任签名颜色 */
 | 
				
			||||||
 | 
					  yellow: { ...commitColor, ...baseColor },
 | 
				
			||||||
 | 
					  olive: baseColor,
 | 
				
			||||||
 | 
					  /** 绿色/提交信任签名颜色 */
 | 
				
			||||||
 | 
					  green: { ...commitColor, ...baseColor },
 | 
				
			||||||
 | 
					  teal: baseColor,
 | 
				
			||||||
 | 
					  blue: baseColor,
 | 
				
			||||||
 | 
					  violet: baseColor,
 | 
				
			||||||
 | 
					  purple: baseColor,
 | 
				
			||||||
 | 
					  pink: baseColor,
 | 
				
			||||||
 | 
					  brown: baseColor,
 | 
				
			||||||
 | 
					  black: baseColor,
 | 
				
			||||||
 | 
					  grey: { self: null, light: null },
 | 
				
			||||||
 | 
					  gold: null,
 | 
				
			||||||
 | 
					  white: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										154
									
								
								src/types/color/other.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,154 @@
 | 
				
			|||||||
 | 
					export const otherAuto = {
 | 
				
			||||||
 | 
					  /** 未知 */
 | 
				
			||||||
 | 
					  git: null,
 | 
				
			||||||
 | 
					  light: {
 | 
				
			||||||
 | 
					    /** 不知道什么用, gitea css 中没有使用这个属性的 */
 | 
				
			||||||
 | 
					    mimicEnabled: "color-light-mimic-enabled",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const other = {
 | 
				
			||||||
 | 
					  /** 主要背景色 */
 | 
				
			||||||
 | 
					  body: null,
 | 
				
			||||||
 | 
					  /** 页面底部状态栏背景色 */
 | 
				
			||||||
 | 
					  footer: null,
 | 
				
			||||||
 | 
					  /** Issue 等页面时间线的线颜色 */
 | 
				
			||||||
 | 
					  timeline: null,
 | 
				
			||||||
 | 
					  /** 一些盒子颜色, 比如仓库文件列表 */
 | 
				
			||||||
 | 
					  box: {
 | 
				
			||||||
 | 
					    /** 仓库文件列表最后一次提交, 头行背景色 */
 | 
				
			||||||
 | 
					    header: null,
 | 
				
			||||||
 | 
					    body: {
 | 
				
			||||||
 | 
					      /** 仓库文件列表背景色 */
 | 
				
			||||||
 | 
					      self: null,
 | 
				
			||||||
 | 
					      /** diff 按钮行行色 */
 | 
				
			||||||
 | 
					      highlight: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 文本 */
 | 
				
			||||||
 | 
					  text: {
 | 
				
			||||||
 | 
					    /** 主文本/主标题颜色 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    light: {
 | 
				
			||||||
 | 
					      /** 普通basic按钮的文本颜色 */
 | 
				
			||||||
 | 
					      self: null,
 | 
				
			||||||
 | 
					      /** 仓库文件列表的commit信息和时间文本 */
 | 
				
			||||||
 | 
					      num1: null,
 | 
				
			||||||
 | 
					      /** 副标题颜色 */
 | 
				
			||||||
 | 
					      num2: null,
 | 
				
			||||||
 | 
					      /** git 提交图里的提交时间文本 */
 | 
				
			||||||
 | 
					      num3: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    /** 弹窗标题色/一些激活的标题色 */
 | 
				
			||||||
 | 
					    dark: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 输入框 */
 | 
				
			||||||
 | 
					  input: {
 | 
				
			||||||
 | 
					    /** 选中时的文字颜色 */
 | 
				
			||||||
 | 
					    text: null,
 | 
				
			||||||
 | 
					    background: null,
 | 
				
			||||||
 | 
					    /** 找不到, 不知道啥玩意, 似乎是和复选框有关的东西 */
 | 
				
			||||||
 | 
					    toggleBackgound: "color-input-toggle-background",
 | 
				
			||||||
 | 
					    border: {
 | 
				
			||||||
 | 
					      self: null,
 | 
				
			||||||
 | 
					      hover: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  light: {
 | 
				
			||||||
 | 
					    /** 多行下交替行的强调色, 例提交历史 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 基础按钮/标签的边框色 */
 | 
				
			||||||
 | 
					    border: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  hover: {
 | 
				
			||||||
 | 
					    /** 按钮悬停背景色 */
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** 仓库文件列表悬停背景色 */
 | 
				
			||||||
 | 
					    opaque: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 设置页面菜单项当前项的背景色 */
 | 
				
			||||||
 | 
					  active: null,
 | 
				
			||||||
 | 
					  /** 菜单背景色 */
 | 
				
			||||||
 | 
					  menu: null,
 | 
				
			||||||
 | 
					  /** 卡片背景色, 但是找不到元素, 可能是个人 README */
 | 
				
			||||||
 | 
					  card: null,
 | 
				
			||||||
 | 
					  /** Markdown 颜色 */
 | 
				
			||||||
 | 
					  markup: {
 | 
				
			||||||
 | 
					    /** 隔行背景色 */
 | 
				
			||||||
 | 
					    tableRow: "color-markup-table-row",
 | 
				
			||||||
 | 
					    code: {
 | 
				
			||||||
 | 
					      /** 代码块背景色 */
 | 
				
			||||||
 | 
					      block: null,
 | 
				
			||||||
 | 
					      /** 代码行背景色 */
 | 
				
			||||||
 | 
					      inline: null,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 普通按钮的背景色 (basic 非 primary) */
 | 
				
			||||||
 | 
					  button: null,
 | 
				
			||||||
 | 
					  /** 代码页面背景色 */
 | 
				
			||||||
 | 
					  codeBg: "color-code-bg",
 | 
				
			||||||
 | 
					  /** 弹窗阴影 */
 | 
				
			||||||
 | 
					  shadow: {
 | 
				
			||||||
 | 
					    self: null,
 | 
				
			||||||
 | 
					    /** css 没有使用 */
 | 
				
			||||||
 | 
					    opaque: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 弹窗按钮行的背景色 */
 | 
				
			||||||
 | 
					  secondaryBg: "color-secondary-bg",
 | 
				
			||||||
 | 
					  /** 代码差异对比折叠行按钮背景色 */
 | 
				
			||||||
 | 
					  expandButton: "color-expand-button",
 | 
				
			||||||
 | 
					  /** 不知道 */
 | 
				
			||||||
 | 
					  placeholderText: "color-placeholder-text",
 | 
				
			||||||
 | 
					  /** 不知道, css 没有 */
 | 
				
			||||||
 | 
					  editorLineHighlight: "color-editor-line-highlight",
 | 
				
			||||||
 | 
					  /** 仓库项目页面列的背景色 */
 | 
				
			||||||
 | 
					  projectColumnBg: "color-project-column-bg",
 | 
				
			||||||
 | 
					  /** caret-color 属性 */
 | 
				
			||||||
 | 
					  caret: null,
 | 
				
			||||||
 | 
					  /** Issue 表情按钮 */
 | 
				
			||||||
 | 
					  reaction: {
 | 
				
			||||||
 | 
					    /** css 里没用 */
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					    /** 悬停时颜色 */
 | 
				
			||||||
 | 
					    hoverBg: "color-reaction-hover-bg",
 | 
				
			||||||
 | 
					    /** 点击后颜色 */
 | 
				
			||||||
 | 
					    activeBg: "color-reaction-active-bg",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 鼠标悬浮时的提示文本, 比如提交的具体时间, 任务状态等 */
 | 
				
			||||||
 | 
					  tooltip: {
 | 
				
			||||||
 | 
					    text: null,
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 顶部导航栏(用户导航栏) */
 | 
				
			||||||
 | 
					  nav: {
 | 
				
			||||||
 | 
					    /** 背景色 */
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					    /** 悬停时背景色 */
 | 
				
			||||||
 | 
					    hoverBg: "color-nav-hover-bg",
 | 
				
			||||||
 | 
					    /** color 颜色 */
 | 
				
			||||||
 | 
					    text: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 顶部二级导航栏背景色(仓库导航栏等) */
 | 
				
			||||||
 | 
					  secondaryNavBg: "color-secondary-nav-bg",
 | 
				
			||||||
 | 
					  /** 普通标签 */
 | 
				
			||||||
 | 
					  label: {
 | 
				
			||||||
 | 
					    text: null,
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					    hoverBg: "color-label-hover-bg",
 | 
				
			||||||
 | 
					    /** css 没用 */
 | 
				
			||||||
 | 
					    activeBg: "color-label-active-bg",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 不知道. 似乎和最后一次 review 相关的边框色 */
 | 
				
			||||||
 | 
					  accent: null,
 | 
				
			||||||
 | 
					  /** 不知道. 似乎和最后一次 review 相关的背景色 */
 | 
				
			||||||
 | 
					  smallAccent: "color-small-accent",
 | 
				
			||||||
 | 
					  /** 不知道啥玩意, 跟文件预览内容行颜色有关系 */
 | 
				
			||||||
 | 
					  highlight: {
 | 
				
			||||||
 | 
					    /** 在行号前追加的伪元素颜色 */
 | 
				
			||||||
 | 
					    fg: null,
 | 
				
			||||||
 | 
					    /** 背景色 */
 | 
				
			||||||
 | 
					    bg: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 叠加背景色, 比如弹窗时遮蔽页面其他部分的背景色 */
 | 
				
			||||||
 | 
					  overlayBackdrop: "color-overlay-backdrop",
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										23
									
								
								src/types/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					import type { MapLeafNodes } from "src/core/types";
 | 
				
			||||||
 | 
					import * as color from "./color";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 代码高亮色 */
 | 
				
			||||||
 | 
					export type Chroma = MapLeafNodes<typeof color.chroma, string>;
 | 
				
			||||||
 | 
					/** 主色调(强调色) */
 | 
				
			||||||
 | 
					export type Primary = MapLeafNodes<typeof color.primary, string>;
 | 
				
			||||||
 | 
					/** 副色调(边框色) */
 | 
				
			||||||
 | 
					export type Secondary = MapLeafNodes<typeof color.secondary, string>;
 | 
				
			||||||
 | 
					/** 基础颜色 */
 | 
				
			||||||
 | 
					export type Named = MapLeafNodes<typeof color.named, string>;
 | 
				
			||||||
 | 
					/** 提示消息 */
 | 
				
			||||||
 | 
					export type Message = MapLeafNodes<typeof color.message, string>;
 | 
				
			||||||
 | 
					/** Actions 日志 ANSI 颜色 */
 | 
				
			||||||
 | 
					export type Ansi = MapLeafNodes<typeof color.ansi, string>;
 | 
				
			||||||
 | 
					/** Actions 颜色 */
 | 
				
			||||||
 | 
					export type Console = MapLeafNodes<typeof color.console, string>;
 | 
				
			||||||
 | 
					/** 代码差异对比颜色 */
 | 
				
			||||||
 | 
					export type Diff = MapLeafNodes<typeof color.diff, string>;
 | 
				
			||||||
 | 
					/** 其他颜色 */
 | 
				
			||||||
 | 
					export type Other = MapLeafNodes<typeof color.other, string>;
 | 
				
			||||||
 | 
					/** 仅限本主题的 Github 颜色 */
 | 
				
			||||||
 | 
					export type Github = MapLeafNodes<typeof color.github, string>;
 | 
				
			||||||