Compare commits

...

312 Commits

Author SHA1 Message Date
lutinglt
c766a16b08 1.24.7 2025-10-25 13:03:41 +08:00
lutinglt
77faa2ce63 update readme 2025-10-25 10:55:07 +08:00
lutinglt
4267c98dbe update readme 2025-10-25 10:48:44 +08:00
lutinglt
558f75de42 VSCode 和 VSCodium 图标添加颜色 2025-10-13 11:58:48 +08:00
lutinglt
6fe0241007 修复手机下仪表板二级导航栏用户菜单按钮没有居中的问题 2025-10-12 12:21:30 +08:00
lutinglt
b790f73fdf update README 2025-10-12 00:02:28 +08:00
lutinglt
db6ec59a83 update CHANGELOG 2025-10-11 23:39:02 +08:00
lutinglt
23658a4917 统一无搜索结果时的样式 #20 2025-10-11 23:35:34 +08:00
lutinglt
0e3628863e 修复仓库探索无搜索结果时的样式 #20 2025-10-11 22:45:51 +08:00
lutinglt
d178870ea8 update readme 2025-10-11 18:05:13 +08:00
lutinglt
38874d8b43 同步工作流运行页面的运行时间字体样式和重新运行按钮样式 2025-10-11 17:45:08 +08:00
lutinglt
1a5db58b4f 修复差异对比文件路径标题栏的菜单样式问题 2025-10-09 21:29:39 +08:00
lutinglt
05a4dc4f8a 优化下拉菜单的样式&同步亮色和柔和暗色主题下的菜单颜色 2025-09-28 21:37:15 +08:00
lutinglt
c5724f41c5 report 2025-09-27 08:03:55 +08:00
lutinglt
585c57dec2 report github screenshot 2025-09-27 08:02:19 +08:00
lutinglt
6aff05494e 修复导航栏工单/PR等仪表板下筛选等菜单的子项的间距问题 2025-09-25 10:06:38 +08:00
lutinglt
1eaba74c7e update style bug report 2025-09-24 22:34:29 +08:00
lutinglt
fe009734d3 修复并同步工单或 PR 详细页面下的标签菜单样式 #19 2025-09-24 22:23:31 +08:00
lutinglt
89ec60e412 修复仪表板切换用户按钮菜单下无创建组织按钮时的菜单圆角问题 2025-09-21 12:01:30 +08:00
lutinglt
1462ac8724 优化导航栏标识样式 2025-09-21 10:29:21 +08:00
lutinglt
bd568bb621 优化顶部和二级导航栏的样式和颜色 2025-09-21 10:08:19 +08:00
lutinglt
c5e4b50b9b 优化顶部导航栏样式和颜色 2025-09-21 09:02:11 +08:00
lutinglt
e1a65d12df 调整顶部导航栏高度 2025-09-19 10:03:17 +08:00
lutinglt
7665219c4c bug report 2025-09-17 21:08:24 +08:00
lutinglt
4fd2006e6a style bug issue 2025-09-17 16:26:50 +08:00
lutinglt
f7542a9e7f style bug issue 2025-09-17 16:25:14 +08:00
lutinglt
ec8d12a1fd close blank issue 2025-09-17 16:22:57 +08:00
lutinglt
d573d00019 bug issue template 2025-09-17 16:20:51 +08:00
lutinglt
ac8f5fdd24 Issue Template 2025-09-17 16:11:24 +08:00
lutinglt
99c4de26fd style bug issue 2025-09-17 15:44:45 +08:00
鲁汀
059edda22e Update issue templates 2025-09-17 15:13:58 +08:00
lutinglt
719d12c4cb CHANGELOG.md 2025-09-16 20:41:29 +08:00
lutinglt
df9722604e 页脚样式调整 2025-09-16 17:11:00 +08:00
lutinglt
359e83afa5 修复仓库页面下二级导航栏下划线过粗 2025-09-16 17:02:29 +08:00
lutinglt
163794fbe2 同步页脚样式 2025-09-16 16:48:49 +08:00
lutinglt
11e86dc549 注释 2025-09-15 19:58:17 +08:00
lutinglt
1134c53a63 修复 Wiki 页面搜索项目没有正确隐藏的问题 2025-09-15 19:13:56 +08:00
lutinglt
5d7a1c53d5 update README 2025-09-14 19:24:57 +08:00
lutinglt
4632170948 update README 2025-09-14 19:22:55 +08:00
lutinglt
cd99934334 优化创建标签菜单的菜单项的样式 2025-09-14 19:12:34 +08:00
lutinglt
4bdbb764ee fix 2025-09-12 10:26:29 +08:00
lutinglt
ff586c7385 修复合并提交中的主色调按钮组阴影问题 2025-09-12 09:28:23 +08:00
lutinglt
e4cf7abcdc display 主题按钮 hover 颜色亮度错误 2025-09-11 19:08:11 +08:00
lutinglt
5ef97d7fd5 修复一些下拉菜单样式 2025-09-11 18:09:00 +08:00
lutinglt
243cf80a34 template 2025-09-11 14:51:02 +08:00
lutinglt
280ebe1ad2 new version 2025-09-11 14:44:21 +08:00
lutinglt
f41327e42b version 2025-09-11 14:44:07 +08:00
lutinglt
987144a594 version 2025-09-11 14:40:08 +08:00
lutinglt
2caf68e290 1.24.6 2025-09-11 14:36:26 +08:00
lutinglt
e2ccc8c9f7 release 2025-09-11 13:35:21 +08:00
lutinglt
7287aad198 author 2025-09-11 13:31:34 +08:00
lutinglt
b3ce1a8439 简化 release 2025-09-11 12:01:35 +08:00
lutinglt
5d96a6896d 修复display主题下差异对比展开折叠代码按钮颜色 2025-09-11 11:48:35 +08:00
lutinglt
ced954c1d0 精调 display 主题颜色 2025-09-11 11:16:06 +08:00
lutinglt
bfb27ab4a2 perf release ci 2025-09-11 00:07:26 +08:00
lutinglt
3a5306b1a6 就这样吧 2025-09-11 00:05:45 +08:00
lutinglt
6608abc39b 测试 release 中的排序 2025-09-10 23:59:45 +08:00
lutinglt
7eeafae4da fix ci 2025-09-10 23:49:44 +08:00
lutinglt
89ac2720c7 支持猛男粉颜色主题 2025-09-10 23:43:38 +08:00
lutinglt
472647e7c1 修复发布页主色调按钮多余的阴影 2025-09-10 12:32:21 +08:00
lutinglt
84a2f5a1ee 版本号自动生成 2025-09-10 10:59:33 +08:00
lutinglt
e45c73d850 me sb, so fix 2025-09-10 00:25:52 +08:00
lutinglt
10d0a3dbd8 format 2025-09-09 23:50:40 +08:00
lutinglt
ae9bc3cbb5 修改外观设置中显示的主题名称 2025-09-09 23:48:55 +08:00
lutinglt
dc0f43a082 派生栏上下间距 2025-09-09 18:52:51 +08:00
lutinglt
5fb9ef2a61 修复归档仓库 Issue 时间线过长插入归档信息框 2025-09-09 17:47:33 +08:00
lutinglt
247c6fd987 弹窗圆角 2025-09-09 17:14:11 +08:00
lutinglt
865642eb3b 仪表盘页的提交 SHA 标签居中对齐 2025-09-09 17:02:45 +08:00
lutinglt
392c82fcd5 修复新建里程碑切换按钮样式 2025-09-09 14:52:08 +08:00
lutinglt
02087941f4 修复创建工单页面样式 2025-09-09 14:48:57 +08:00
lutinglt
0560aad59e 隐藏热力图和动态的分割线 2025-09-09 14:24:52 +08:00
lutinglt
8e8416507e 同步主色调按钮和红色按钮的阴影样式 2025-09-09 14:14:12 +08:00
lutinglt
1a702c9526 同步提示框样式 2025-09-09 10:41:23 +08:00
lutinglt
46c2d46482 优化分页菜单高度 2025-09-08 22:32:09 +08:00
lutinglt
8b15abe30b 优化动态间隔 2025-09-08 21:05:47 +08:00
lutinglt
9756cbd409 优化仪表板热力图和动态样式 2025-09-08 20:44:39 +08:00
lutinglt
b529cefd04 release 2025-09-08 18:37:59 +08:00
lutinglt
dded6b1948 release 2025-09-08 16:34:06 +08:00
lutinglt
5e8f62c79f release 2025-09-08 16:25:07 +08:00
lutinglt
9b2a1783ef release 2025-09-08 16:11:38 +08:00
lutinglt
6bb138e964 软件包详情页版本标签样式 2025-09-08 15:53:01 +08:00
lutinglt
e387008ee5 同步软件包页面样式 2025-09-08 15:29:01 +08:00
lutinglt
c8634fb14b 微调仓库相关界面元素间隔 2025-09-08 11:02:58 +08:00
lutinglt
fc10a1f54b 优化仪表板动态信息间隔 2025-09-07 23:41:21 +08:00
lutinglt
f08c7a0c8c 修复嵌套下拉菜单样式和双选项切换按钮 2025-09-07 23:05:26 +08:00
lutinglt
6c0fd14119 同步仓库已标星的星星颜色 2025-09-07 18:31:46 +08:00
lutinglt
cb49b12ff0 调整发布页版本间隔 2025-09-07 18:07:57 +08:00
lutinglt
468a97994a 优化仪表板的仓库组织切换按钮样式 2025-09-07 17:02:34 +08:00
lutinglt
1986956191 优化下拉菜单样式 2025-09-07 15:28:00 +08:00
lutinglt
979af2a756 优化通知页面按钮悬浮效果 2025-09-07 14:49:43 +08:00
lutinglt
a34bd93894 同步通知页面样式 2025-09-07 14:44:04 +08:00
lutinglt
64684a51da 同步分支菜单宽度 2025-09-07 13:30:24 +08:00
lutinglt
e89c26e753 同步关注页面样式 2025-09-07 12:52:21 +08:00
lutinglt
796c6f1519 同步差异对比页面文件名标题栏样式 2025-09-07 11:00:53 +08:00
lutinglt
f9d63e6fd1 同步用户菜单样式 2025-09-07 10:31:54 +08:00
lutinglt
08f662497b 同步订阅页面样式 2025-09-06 21:23:47 +08:00
lutinglt
c4bff9fdc1 修复仓库克隆点星按钮高度 2025-09-06 20:53:43 +08:00
lutinglt
a48963c43d 同步置顶 Issue 样式 2025-09-06 20:35:55 +08:00
lutinglt
7366813f02 修复提交列表尾行圆角 2025-09-06 20:08:06 +08:00
lutinglt
dc3047f16a 同步顶部工单等仪表板样式 2025-09-06 19:59:48 +08:00
lutinglt
e0518a2986 同步里程碑页面样式 2025-09-06 16:20:40 +08:00
lutinglt
39727c789b 缩小发布标题和内容的间隔 2025-09-05 17:02:36 +08:00
lutinglt
3c21a98fee 优化发布页面布局和下载列表样式 2025-09-04 20:03:34 +08:00
lutinglt
9bce3797a6 修复文件预览时文件树有边框过粗 2025-08-30 15:37:58 +08:00
lutinglt
9d3e738723 微调一些标签的字体大小 2025-08-29 12:11:15 +08:00
lutinglt
86ac3b73ba 略微减小导航栏创建仓库菜单按钮内的图标间隔 2025-08-25 16:25:29 +08:00
lutinglt
09a4bbdc07 取消修改编辑器字体大小, 避免光标错位 2025-08-23 11:55:33 +08:00
lutinglt
68d632a6b3 update readme 2025-08-19 00:51:02 +08:00
lutinglt
2b5962e1c2 update readme 2025-08-19 00:49:40 +08:00
lutinglt
7cd7a48d17 修复后台管理的运维管理面板的样式 2025-08-17 16:18:57 +08:00
lutinglt
ebc6463c30 修复登录二次验证页面内容位置 2025-08-17 10:46:52 +08:00
lutinglt
77c3842a43 修复登录二次验证页面内容位置 2025-08-17 10:39:50 +08:00
lutinglt
d311072ca0 update readme 2025-08-16 22:50:00 +08:00
lutinglt
8b4102d8d9 同步查看代码文件内容时的样式 2025-08-16 22:33:16 +08:00
lutinglt
73b5397d77 优化文件树的顶部和底部间隔 2025-08-16 20:58:10 +08:00
lutinglt
134c383cdb 优化查看代码文件内容时的体验 2025-08-16 20:51:07 +08:00
lutinglt
c6e73000bd 修复仓库中文 README 时的按钮下划线长度 2025-08-16 13:03:56 +08:00
lutinglt
dbf3547ad5 change default readme 2025-08-16 12:23:43 +08:00
lutinglt
5235dae367 更新英文截图 2025-08-16 12:19:11 +08:00
lutinglt
a9df7a31e1 README_EN 2025-08-16 12:03:10 +08:00
lutinglt
dd6e97be1d update readme 2025-08-15 10:53:02 +08:00
lutinglt
29f983cce6 update readme 2025-08-15 10:51:24 +08:00
鲁汀
fca10130a3 Create FUNDING.yml 2025-08-15 10:45:15 +08:00
lutinglt
8676816342 修复红绿色盲主题的代码高亮色 2025-08-15 09:15:13 +08:00
lutinglt
9bcea89fcb update readme 2025-08-14 23:31:41 +08:00
lutinglt
26deec78ff format code 2025-08-14 21:24:03 +08:00
lutinglt
ffb7fa810b 发布时的主题顺序 2025-08-14 20:51:56 +08:00
lutinglt
2083d3026b version 2025-08-14 20:37:00 +08:00
lutinglt
5037e46447 beta 2025-08-14 20:10:48 +08:00
lutinglt
cd2f7579b1 色盲主题打包 2025-08-14 20:02:57 +08:00
lutinglt
1b237b12f3 update readme 2025-08-14 19:59:57 +08:00
lutinglt
a8453a87a5 支持色盲主题 2025-08-14 19:59:08 +08:00
lutinglt
6aef26cdc8 重叠边框线, 避免过粗 2025-08-14 00:10:46 +08:00
lutinglt
a4c94cb34d 重叠边框线, 避免过粗 2025-08-14 00:09:38 +08:00
lutinglt
8c45f44309 查看代码文件页面文件树头部有时不会固定住 2025-08-13 23:35:03 +08:00
lutinglt
1c9b02ea88 查看代码文件页面路径栏有时内容不会居中 2025-08-13 22:44:19 +08:00
lutinglt
61313d5644 ci tag 2025-08-13 22:39:10 +08:00
lutinglt
d7722cde2f update md 2025-08-13 22:33:53 +08:00
lutinglt
e3366a8406 filetree 默认高度 2025-08-13 22:32:47 +08:00
lutinglt
f6fc6a9702 🎉 release 2025-08-13 22:17:12 +08:00
lutinglt
12d5636fb7 同步查看代码文件页面样式 2025-08-13 22:03:41 +08:00
lutinglt
10c06dad60 仪表板时间 2025-08-13 19:53:27 +08:00
lutinglt
c80dd09828 时间追踪 2025-08-13 18:09:27 +08:00
lutinglt
8f2f45406a 同步 Issue/PR 列表样式 2025-08-13 16:45:53 +08:00
lutinglt
c46d9333ff fix org 2025-08-13 12:13:18 +08:00
lutinglt
7039041d9d 同步编辑器字体大小 2025-08-13 11:34:48 +08:00
lutinglt
9949bdc7bd 优化仪表板样式 & 同步代码编辑器背景色 2025-08-13 11:20:01 +08:00
lutinglt
1b81b6ad93 优化仪表板仓库/组织列表样式, 好看多了, 愿称之为神之一手 2025-08-12 22:32:31 +08:00
lutinglt
62bc2afa2a 同步 Issue/PR 详细页面侧边栏样式 2025-08-12 20:57:03 +08:00
lutinglt
60e873b0e0 同步用户点星仓库列表样式 2025-08-12 16:05:38 +08:00
lutinglt
00737f5203 优化标签样式 2025-08-12 15:34:53 +08:00
lutinglt
a90b72896b 优化热力图和动态样式 2025-08-12 14:43:05 +08:00
lutinglt
f90c488d45 优化消息右上角小图标样式 2025-08-12 11:06:32 +08:00
lutinglt
56c284aec2 同步登录/注册页面样式 2025-08-12 10:29:32 +08:00
lutinglt
0df107a166 优化创建仓库/迁移仓库/创建组织页面的样式与设置页面的样式一致 2025-08-12 09:47:43 +08:00
lutinglt
c5c1ca4a6b fix height 2025-08-12 00:27:23 +08:00
lutinglt
6bbc304a7c 激活字体颜色白色 2025-08-12 00:20:47 +08:00
lutinglt
5c95add059 同步分页菜单样式 2025-08-12 00:16:38 +08:00
lutinglt
2efaeead6b 同步仓库代码文件页 README 导航栏样式 2025-08-11 23:29:48 +08:00
lutinglt
29122e946c 修复顶部导航栏工单管理/请求合并页面搜索框旁的选择下拉框按钮内容过窄 2025-08-11 22:55:05 +08:00
lutinglt
81be016be3 略微增加仓库代码文件列表的单行高度 2025-08-11 22:41:24 +08:00
lutinglt
2ffdf501b3 修复用户公开活动页动态布局问题 2025-08-11 18:12:51 +08:00
lutinglt
9f2e5df49c 代码整理 2025-08-11 17:56:39 +08:00
lutinglt
00eda68f00 修复 Action 作业步骤页面标题选中时滚动固定的高度问题 2025-08-11 17:39:58 +08:00
lutinglt
fc4e6f43bb todo 2025-08-11 09:55:30 +08:00
lutinglt
1f01495a10 update 2025-08-11 09:52:43 +08:00
lutinglt
eae2961989 update contributing 2025-08-11 09:52:18 +08:00
lutinglt
563c20f2cc update todo 2025-08-11 09:45:32 +08:00
lutinglt
058e1b89ee update todo 2025-08-11 09:44:31 +08:00
lutinglt
c431fbadb4 update todo 2025-08-11 09:42:24 +08:00
lutinglt
74254a3f80 update readme 2025-08-11 09:31:57 +08:00
lutinglt
8118706706 update readme 2025-08-11 09:30:01 +08:00
lutinglt
ffbfccd7dc update md 2025-08-11 09:26:10 +08:00
lutinglt
1d8dfdb82b update markdown 2025-08-10 23:04:19 +08:00
lutinglt
11422f3b05 udpate contributing 2025-08-10 23:02:25 +08:00
lutinglt
cca5e4e435 update contributing 2025-08-10 22:58:38 +08:00
lutinglt
780c72919d update README 2025-08-10 22:43:39 +08:00
lutinglt
dc4eff2bd7 update contributing.md 2025-08-10 21:46:30 +08:00
lutinglt
3b5a596b2f fix ci 2025-08-10 17:14:55 +08:00
lutinglt
41deab68c9 支持柔和的暗色主题 2025-08-10 17:12:26 +08:00
lutinglt
a4ae937291 主题打包 2025-08-10 16:40:25 +08:00
lutinglt
babb174b24 自动颜色主题生成 2025-08-10 16:18:30 +08:00
鲁汀
dca1c34518 feat(chroma): 代码高亮重构 (#9)
* feat(chroma): 代码高亮重构

* todo

* release 亮色适配

* 发布页分支按钮高度修正

* chroma变量和修复注册页导航栏

* chroma 重构适配亮色

---------

Co-authored-by: lutinglt <lutinglt@users.noreply.github.com>
2025-08-10 14:06:08 +08:00
lutinglt
065d7893d8 亮色主题适配 2025-08-07 18:26:21 +08:00
lutinglt
0a6770c28e 亮色主题 2025-08-07 16:19:18 +08:00
lutinglt
0825efeb2c update readme 2025-08-06 15:23:48 +08:00
鲁汀
8dcd7cf002 探索/组织/用户仓库样式 github 布局 (#8)
Co-authored-by: lutinglt <lutinglt@users.noreply.github.com>
2025-08-06 15:05:43 +08:00
lutinglt
93e5fa8a7d update todo 2025-08-06 11:10:19 +08:00
lutinglt
8c5020fa09 同步探索页面仓库样式 2025-08-06 11:05:57 +08:00
lutinglt
35520fb3fc 难受 2025-08-05 18:18:54 +08:00
lutinglt
728673ffcd Gitea 大便的 UI 逻辑问题 2025-08-05 18:14:04 +08:00
lutinglt
f7c1cf430f 评论和表情样式同步 2025-08-05 18:08:24 +08:00
lutinglt
c6306a23d4 update readme 2025-08-05 16:04:54 +08:00
lutinglt
f813122573 update readme 2025-08-05 16:00:46 +08:00
lutinglt
603d22d877 支持克隆菜单自定义长度 2025-08-05 15:55:25 +08:00
lutinglt
4f4b99a600 分支菜单项目添加动画效果 2025-08-05 15:25:41 +08:00
lutinglt
a1cc1509ce 移除 react 2025-08-05 12:59:23 +08:00
鲁汀
305b2eca0b 动画迁移 & 部分 PR 样式 (#7)
* 弹窗动画

* 优化 PR 中的合并提交按钮颜色

* 优化按钮样式

* 同步 PR 的合并提交头像样式

* 同步 Issue/PR 的时间线样式

* Issue/PR 的时间线样式间隔和大小

* 同步 PR 的合并提交操作面板样式

* PR 操作间隔

* green

* PR 操作边框色

* 已合并颜色

* 仓库同步派生栏样式同步

* 动画迁移 & 一些圆角修复

* 修复工单下依赖工单选择框

* 评论标题颜色&分支字体&提交栏样式

---------

Co-authored-by: lutinglt <lutinglt@users.noreply.github.com>
2025-08-05 12:39:35 +08:00
lutinglt
f635b30c9c 优化向上弹窗的菜单动画 2025-07-08 22:57:12 +08:00
lutinglt
1434c54ba3 svg 2025-07-08 19:27:50 +08:00
lutinglt
b9b12e7ed2 优化按钮和菜单下的图标颜色 2025-07-08 19:08:54 +08:00
lutinglt
f9755704ec 漏掉的类型筛选 2025-07-08 18:35:35 +08:00
lutinglt
120d24cb10 状态标签位置调整 2025-07-08 18:30:03 +08:00
lutinglt
77e2227029 删除了提交中 Action 状态标签多余的间隔 2025-07-08 18:10:25 +08:00
lutinglt
75fd35480b fantastic clone menu 2025-07-08 15:52:47 +08:00
lutinglt
0516b19982 修复一些下拉菜单缺失边框线 2025-07-08 14:55:38 +08:00
lutinglt
5ac3a3044e 修复一些下拉菜单在向上弹出时与向下弹出不一致的问题 2025-07-08 14:25:32 +08:00
lutinglt
9ccc65ac1c 创建仓库页面下拉菜单选项样式同步 2025-07-07 22:28:45 +08:00
lutinglt
7921a8872b 修复一些输入框在整体元素中不居中 2025-07-07 22:03:18 +08:00
lutinglt
596442d2ef 选择输入框背景色 2025-07-07 20:32:50 +08:00
lutinglt
7248f617c4 修复选择输入框的样式和拥有者按钮高度 2025-07-07 20:28:27 +08:00
lutinglt
6def81fe26 修复顶部导航栏的菜单按钮悬浮颜色 2025-07-07 18:15:22 +08:00
lutinglt
fa08df8eea todo 2025-07-07 16:19:06 +08:00
lutinglt
cc44560f96 微调热力图方块大小 2025-07-07 16:14:03 +08:00
lutinglt
4b2916a75b 修复标签颜色和样式 2025-07-07 14:31:39 +08:00
lutinglt
5116ca5cae 导航栏右侧按钮和头像样式同步 2025-07-07 13:50:03 +08:00
lutinglt
15076d2996 repo 迁移 2025-07-06 23:33:40 +08:00
lutinglt
dc6605d780 一些颜色修复 2025-07-06 20:11:27 +08:00
lutinglt
3b0f481be7 一些按钮样式优化 2025-07-06 19:28:54 +08:00
lutinglt
0f8bfe6201 release 迁移 2025-07-06 17:33:26 +08:00
lutinglt
6421704cda dropdown 样式同步和优化 2025-07-06 15:28:45 +08:00
lutinglt
02ac10ecfc setting 迁移 2025-07-06 14:29:55 +08:00
lutinglt
aa023116ae 确认gitea新版本不再使用codemirror 2025-07-06 11:48:09 +08:00
lutinglt
a6efed8f03 lint 2025-07-06 00:38:24 +08:00
lutinglt
98446a9bb3 heatmap 迁移 2025-07-06 00:27:10 +08:00
lutinglt
7fe76d6444 fix: 切换控制用户按钮缺少边框线 2025-07-05 22:12:59 +08:00
lutinglt
ce1bc3b762 fix: radius 导入顺序 2025-07-05 21:59:28 +08:00
lutinglt
f68ad71ddb dropdown 迁移 2025-07-05 21:48:37 +08:00
lutinglt
49b08975d2 dropdown 样式同步 2025-07-05 18:44:26 +08:00
lutinglt
ee455ac255 部分 dropdown 迁移和其他细节修复 2025-07-05 16:34:40 +08:00
lutinglt
c6d132ef0a issue 迁移 2025-07-05 11:23:09 +08:00
lutinglt
2cceafe5ce dashboard 和 label 迁移 2025-07-04 21:53:59 +08:00
lutinglt
f74211749d radius only-child 生效顺序 2025-07-03 23:51:57 +08:00
lutinglt
1c6b7540f3 部分 label 迁移 2025-07-03 22:38:48 +08:00
lutinglt
186f58815b codemirror 2025-07-03 21:59:02 +08:00
lutinglt
9b07108c44 全局圆角样式同步 2025-07-03 21:54:44 +08:00
lutinglt
0ace99a642 垃圾 ai 2025-07-03 18:26:21 +08:00
lutinglt
c61d8f1506 emoji 迁移 2025-07-03 18:23:22 +08:00
lutinglt
7bc47d0720 输入框, svg, 弹窗样式迁移 2025-07-03 17:50:46 +08:00
lutinglt
3015ce8696 button 样式迁移 2025-07-02 23:02:42 +08:00
lutinglt
0c22591727 format 2025-07-02 13:27:56 +08:00
lutinglt
1cc9b20ffd github 主题 2025-07-02 13:21:12 +08:00
lutinglt
0a353fd572 github 与 gitea 全部颜色映射 2025-07-01 21:59:07 +08:00
lutinglt
c76a8ba7b6 菜单项默认颜色更改 2025-06-30 23:38:02 +08:00
lutinglt
1484496dfb 更新变量和注释 2025-06-30 23:29:05 +08:00
lutinglt
33fbac3c45 action 页面同步 2025-06-30 00:11:27 +08:00
lutinglt
3d34619d79 仅统计源码编程语言 2025-06-29 00:02:26 +08:00
lutinglt
7b363e3e9c diff 细节完善 2025-06-28 23:50:48 +08:00
lutinglt
e113d1c603 diff 页面同步 & Github 全局变量 2025-06-28 23:19:37 +08:00
lutinglt
d2be94ee27 更换themePlugin触发钩子 2025-06-28 19:50:38 +08:00
lutinglt
b4a0c93221 update vite 2025-06-28 19:45:10 +08:00
lutinglt
df6eb8fef8 提取 github 变量 2025-06-28 19:36:06 +08:00
lutinglt
a8bcd45791 更新注释 2025-06-28 16:32:53 +08:00
lutinglt
94c7f81bbf 更新变量注释和颜色分类 2025-06-28 16:32:16 +08:00
lutinglt
59497be05e 添加开发插件建议&.css.tsx兼容插件提示 2025-06-28 14:17:33 +08:00
lutinglt
bedb8befa7 添加开发环境变量 2025-06-28 11:58:36 +08:00
lutinglt
5ae1f2f634 颜色变量计算&颜色主题迁移 2025-06-27 22:55:59 +08:00
lutinglt
16298f2b11 声明全部颜色变量 2025-06-27 01:13:52 +08:00
lutinglt
b5dc00e853 颜色分类 2025-06-24 22:54:16 +08:00
lutinglt
ac17e45069 CI 构建主题 2025-06-24 20:50:12 +08:00
lutinglt
f65338b227 添加版本脚本 2025-06-24 20:48:27 +08:00
lutinglt
711e01b66c src 结构调整, 添加 functions 2025-06-24 20:31:12 +08:00
lutinglt
9a070c5726 添加 sass 预处理 2025-06-24 13:52:03 +08:00
lutinglt
77fe50a4cc test 2025-06-23 01:32:46 +08:00
lutinglt
0f9ee02a7d test 2025-06-23 01:32:02 +08:00
lutinglt
55ac3af9b7 重构基本框架 2025-06-23 01:28:13 +08:00
lutinglt
36a1707b3e 分支按钮高度 2025-06-10 18:04:08 +08:00
lutinglt
2207d56a4e 1.24.0 2025-06-10 17:34:09 +08:00
lutinglt
8e1a01e444 修改编译流程 2025-02-22 10:18:32 +08:00
lutinglt
4365603d56 代码结构调整 2025-02-22 09:53:29 +08:00
lutinglt
8def32e5b9 调整代码结构以支持多种风格 2025-02-21 21:47:54 +08:00
lutinglt
ba895a3f31 Update README.md 2025-02-19 22:38:52 +08:00
lutinglt
04896a3395 支持nodejs 2025-02-19 22:37:25 +08:00
lutinglt
69e0c063de .editorconfig 2025-02-19 12:05:24 +08:00
lutinglt
ce462ff305 Update 2025-02-19 11:53:36 +08:00
lutinglt
af2c71b607 代码布局调整 2025-02-19 11:41:33 +08:00
lutinglt
6a17010a5f 就这样吧 2025-02-19 08:36:57 +08:00
lutinglt
49812f0ee0 Ful佬说的对 2025-02-17 22:22:28 +08:00
lutinglt
5bba897e11 Ful佬说的对 2025-02-17 22:13:15 +08:00
lutinglt
bed93d8777 简化 2025-02-14 00:40:18 +08:00
lutinglt
d83f8e9e10 版本号更改 2025-02-13 01:38:47 +08:00
lutinglt
3ab8c04dee deno 2025-02-13 01:38:00 +08:00
lutinglt
14d79f4e9d deno@v2 2025-02-13 01:32:29 +08:00
lutinglt
d95b59512b deno? 2025-02-13 01:29:08 +08:00
lutinglt
79a1049090 修复工作流 2025-02-13 01:24:45 +08:00
lutinglt
34f72da8b5 nodejs->deno 2025-02-13 01:13:32 +08:00
lutinglt
c0d181278f 发布流程简化 2025-02-12 14:10:25 +08:00
lutinglt
b8d0e43074 Action执行时间位置优化 2025-02-11 12:49:34 +08:00
lutinglt
79f305ee1e 仓库导航栏文字颜色优化 2025-02-11 12:47:07 +08:00
lutinglt
9acfd21a9d Update README.md 2025-02-11 11:11:51 +08:00
lutinglt
a897230f2c 修复英文下Action页面执行时间换行&菜单文字粗细样式优化 2025-02-11 11:06:44 +08:00
lutinglt
1cad42f701 Action工作流页面同步 2025-02-10 22:05:27 +08:00
lutinglt
c5a1c1bdf5 父级目录高度修复 2025-02-10 17:44:50 +08:00
lutinglt
a4958a3539 按钮字体粗细调整 2025-02-10 13:46:54 +08:00
lutinglt
9aae3e7347 父级目录添加悬停颜色 2025-02-10 12:58:38 +08:00
lutinglt
7eff93195b 父级目录图标位置优化 2025-02-10 12:54:41 +08:00
lutinglt
21aa5cdc47 导航栏分割线优化 2025-02-10 12:47:55 +08:00
lutinglt
3119e2f334 首页动态图标大小优化 2025-02-10 12:10:06 +08:00
lutinglt
91f5c77faf 首页动态图标大小优化 2025-02-10 12:08:14 +08:00
lutinglt
0bae3b4533 修复软件包页面下组织标签样式 2025-02-10 11:55:52 +08:00
lutinglt
7a37517034 仓库收藏派生按钮调整 2025-02-10 11:50:18 +08:00
lutinglt
02f22c1f57 输入框大小和颜色优化 2025-02-10 11:38:04 +08:00
lutinglt
aae6409016 动画效果优化 2025-02-10 10:48:46 +08:00
lutinglt
3f34bce95d 修复仓库文件列表整行悬停背景颜色丢失 2025-02-09 23:19:14 +08:00
lutinglt
1b2207a13b 移除字体 2025-02-09 22:58:24 +08:00
lutinglt
cd9a2a504b 仓库导航栏颜色同步&按钮大小优化 2025-02-09 21:42:11 +08:00
lutinglt
7c6ec21e10 顶部导航栏分割线优化 2025-02-09 21:14:54 +08:00
lutinglt
36195e64ee 仓库文件列表文件图标名称位置优化 2025-02-09 21:05:43 +08:00
lutinglt
de133f5aac 手机下隐藏提交信息 2025-02-09 19:19:10 +08:00
lutinglt
e2c52aa95a 加快下拉动画 2025-02-09 14:55:35 +08:00
lutinglt
3f75f5f36b 动画效果优化 2025-02-09 14:27:12 +08:00
lutinglt
6c8f386f9f 代码页侧边栏宽度&下拉菜单分割线调整 2025-02-09 11:14:43 +08:00
154 changed files with 8897 additions and 2331 deletions

18
.editorconfig Normal file
View File

@@ -0,0 +1,18 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# EditorConfig is awesome: https://EditorConfig.org
root = true
[*]
charset = utf-8
indent_size = 2
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
max_line_length = 120
# documentation, utils
[*.{md,mdx,diff}]
trim_trailing_whitespace = false

8
.env.example Normal file
View 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
View 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
View File

@@ -0,0 +1,21 @@
### 🎉
### ✨ Feature
#### CSS 变量
### 🌈 Style
##### 更符合 GitHub 风格
### 🐞 Fix
## 📃 English
#### CSS Variable
##### More GitHub-like style
```text
在 English 下方补充上面 Feature 以下部分的内容的中译英​
```

View 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

View 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

View 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
View 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
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -1,7 +0,0 @@
## 🌈 Style
#### 更符合 GitHub 风格
## 🎈 Perf
## 🐞 Fix

5
.github/release.md vendored
View File

@@ -1,5 +0,0 @@
## 🌈 Style
#### 更符合 GitHub 风格
- 增加克隆协议选择按钮样式

View File

@@ -2,10 +2,6 @@ name: release
on: on:
workflow_dispatch: workflow_dispatch:
inputs:
gitea_version:
required: true
type: string
permissions: permissions:
contents: write contents: write
@@ -15,24 +11,25 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Build theme - name: Build theme
run: | run: |
npm install npm install
npm run build:theme-fonts npm run build
mv dist css
npm run build:theme
tar -czf dist/theme-github-fonts.tar.gz css fonts
- uses: actions/upload-artifact@v4
with:
name: theme-github
path: dist/*
- name: Create release - name: Create release
run: | run: |
export TZ=Asia/Shanghai tar -zcf dist/theme-github-base.tar.gz --remove-files \
TAG="v${{ inputs.gitea_version }}-$(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 }}

4
.gitignore vendored
View File

@@ -1,3 +1,5 @@
dist dist
node_modules node_modules
package-lock.json package-lock.json
.env
.VSCodeCounter

View File

@@ -1,3 +0,0 @@
dist/
node_modules/
package-lock.json

View File

@@ -1,16 +0,0 @@
{
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"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
View File

@@ -0,0 +1,9 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"dbaeumer.vscode-eslint",
"usernamehw.errorlens",
"mikestead.dotenv",
"styled-components.vscode-styled-components"
]
}

51
CHANGELOG.md Normal file
View File

@@ -0,0 +1,51 @@
### 🌈 Style
- 优化顶部和二级导航栏的样式和颜色 #18
##### 更符合 GitHub 风格
- 修复并同步工单或 PR 详细页面下的标签菜单样式 #19
- 统一仓库/用户/组织列表无搜索结果时的样式 #20
- 同步页脚样式
- 优化下拉菜单的样式
- 优化创建标签菜单的菜单项的样式
- 同步亮色和柔和暗色主题下的菜单颜色
- 同步工作流运行页面的运行时间字体样式和重新运行按钮样式
- VSCode 和 VSCodium 图标添加颜色
### 🐞 Fix
- 修复 Wiki 页面搜索项目没有正确隐藏的问题 #15
- 修复后台账户管理排序菜单项的宽度问题
- 修复合并提交中的主色调按钮组阴影问题
- 修复仓库页面下二级导航栏下划线过粗的问题
- 修复仪表板切换用户按钮菜单下无创建组织按钮时的菜单圆角问题
- 修复导航栏工单/PR等仪表板下筛选等菜单的子项的间距问题
- 修复手机下仪表板二级导航栏用户菜单按钮没有居中的问题
## 📃 English
### 🌈 Style
- Optimized styles and colors for top and secondary navigation bars #18
##### More aligned with GitHub style
- Fixed and synchronized label menu styles under issue or PR detail pages #19
- Unified styles for repository/user/organization lists when no search results are found #20
- Synchronized footer styles
- Optimized dropdown menu styles
- Optimized menu item styles for creating label menus
- Synchronized menu colors in light and soft dark themes
- Synchronized font styles for run time and rerun button styles on workflow run pages
- Added colors to VSCode and VSCodium icons
### 🐞 Fix
- Fixed issue where Wiki page search items were not properly hidden #15
- Fixed width issue for sorting menu items in admin account management
- Fixed shadow issue for primary color button groups in merge commits
- Fixed issue where underlines in secondary navigation bars on repository pages were too thick
- Fixed menu corner radius issue when no create organization button exists under dashboard user switching button menu
- Fixed spacing issue for sub-items in filter menus under navigation bar issues/PRs dashboards
- Fixed issue where user menu buttons in secondary navigation bars on mobile dashboards were not centered

171
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,171 @@
# 贡献指南
## 目录结构
| 目录 | 说明 |
| ----------------- | ---------------------------- |
| src | 主题生成框架与辅助工具的包 |
| src/core | 主题生成框架 |
| src/functions | 主题辅助工具 |
| src/types | 主题的颜色变量定义 |
| styles | 主题样式 |
| styles/components | 具体页面的元素的样式 |
| styles/public | 基础元素或跨页面的元素的样式 |
| themes | 颜色主题 |
## 贡献说明
不推荐主题样式贡献, 因为 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}`

179
README.md
View File

@@ -1,81 +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 风格的 Gitea 主题.
添加了短暂的过渡动画优化体验(与 GitHub Code 克隆列表动画一致) </div>
UI 默认字体 [Maple Hand](https://github.com/subframe7536/maple-font/tree/other-resources/cn-resource/maple-hand) & [VictorMono Nerd Font](https://github.com/ryanoasis/nerd-fonts/releases/download/v3.3.0/VictorMono.zip) (优先匹配 `Maple Hand`, 需要系统包含相应字体, 否则使用默认字体) ![Dashboard](screenshots/dashboard.png)
> [!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. 在设置中查看主题
> [!IMPORTANT]
>
> 自动颜色主题需要亮色和暗色的主题文件
例: 主题文件名为 `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 docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea) 详细请查看 Gitea 文档
[Gitea docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea)
### 集成字体
如果不想手动在系统安装字体, 可以将字体放入 Gitea 中, 在访问时拉取字体文件
>[!CAUTION]
>
> 不推荐此行为, 字体文件较大, 且一些字体粗细样式可能会有缺失
>
> 页面会在加载完字体后切换字体
1. 在发布页下载最新的 `theme-github-fonts.tar.gz` 解压后放入 `gitea/public/assets` 目录下
2. 清除浏览器缓存, 强制刷新浏览器查看效果
文件位置如下:
![安装](screenshots/themetree.png)
## 截图 ## 截图
![仓库](screenshots/repo.png) ### 基本主题
![仓库文件列表](screenshots/file_list.png) ```ini
THEMES = github-auto, github-light, github-dark, github-soft-dark
```
![仓库发布](screenshots/release.png) <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>
![仓库提交](screenshots/commit.png) ### 色盲主题 ( Beta )
![Actions](screenshots/actions.png) ```ini
THEMES = github-colorblind-auto, github-colorblind-light, github-colorblind-dark
THEMES = github-tritanopia-auto, github-tritanopia-light, github-tritanopia-dark
```
![Action](screenshots/action.png) <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>
![Dispatch](screenshots/dispatch.png) ### 粉色主题
## 构建 ```ini
THEMES = github-pink-auto, github-pink-light, github-pink-dark, github-pink-soft-dark
```
需要 nodejs 和 npm <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
npm install npm install
npm run build:theme npm run build
``` ```
查看用于 Gitea 的主题文件: `./dist/theme-github.css` 编译完成后, 会在 `dist` 目录下生成主题文件, 你可以将主题文件放入 `gitea/public/assets/css` 目录下, 然后在
`gitea/conf/app.ini` 中添加主题名称到 `THEMES` 末尾
在开发过程中实时构建主题文件
```bash
npm run watch
```
## 贡献
欢迎提交 Issue 或 Pull Request

173
README_EN.md Normal file
View 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>
![Dashboard](screenshots/en/dashboard-en.png)
> [!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
> [!IMPORTANT]
>
> Automatic color theme requires both light and dark theme files.
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)
## 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`

15
eslint.config.js vendored Normal file
View 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,
},
}
);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,26 +1,56 @@
{ {
"name": "gitea-github-theme", "name": "gitea-github-theme",
"version": "1.0.0", "version": "1.24.7",
"description": "尽量保持与 GitHub Dark 相同样式的 Gitea 主题", "type": "module",
"scripts": { "scripts": {
"build": "sass src/theme-github.scss:dist/theme-github.css --no-source-map", "dev": "vite build --mode dev",
"build:theme": "npm run build -- --style=compressed", "build": "tsc -b && vite build",
"build:theme-fonts": "sass src/theme-github-fonts.scss:dist/theme-github.css --no-source-map --style=compressed", "lint": "eslint .",
"build:theme-my": "sass src/theme-github-my.scss:dist/theme-github.css --no-source-map --style=compressed", "format": "prettier --write .",
"watch": "npm run build -- --watch" "commit": "npm run lint && npm run format && npm run build",
"version": "node scripts/version.cjs"
}, },
"repository": {
"type": "git",
"url": "git+https://github.com/lutinglt/gitea-github-theme.git"
},
"keywords": [],
"author": "",
"type": "commonjs",
"bugs": {
"url": "https://github.com/lutinglt/gitea-github-theme/issues"
},
"homepage": "https://github.com/lutinglt/gitea-github-theme#readme",
"devDependencies": { "devDependencies": {
"sass": "^1.83.0" "@babel/preset-typescript": "^7.27.1",
"@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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

BIN
screenshots/colorblind-dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

BIN
screenshots/colorblind-light.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

BIN
screenshots/commit.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 KiB

BIN
screenshots/dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

BIN
screenshots/dashboard.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

BIN
screenshots/en/dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

BIN
screenshots/en/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

BIN
screenshots/light.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

BIN
screenshots/repo.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

BIN
screenshots/soft-dark.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

7
scripts/version.cjs vendored Normal file
View 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);

View File

@@ -1,150 +0,0 @@
// Made by Luting ^-^
// 工作流禁用标签
.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;
}
}
}
}

View File

@@ -1,133 +0,0 @@
// Made by Luting ^-^
.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: 6px 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);
}
}

View File

@@ -1,274 +0,0 @@
// Made by Luting ^-^
.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;
}
}

View File

@@ -1,86 +0,0 @@
// Made by Luting ^-^
.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;
}
}

64
src/core/chroma.ts Normal file
View 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
View 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
View 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
View 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
View File

@@ -0,0 +1 @@
export { createTheme } from "./theme";

127
src/core/prettylights.ts Normal file
View 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
View 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
View 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
View 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.");
},
};
}

View File

@@ -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;
}

View File

@@ -1,197 +0,0 @@
// Made by Luting ^-^
// 下拉菜单动画
@keyframes overlay-appear {
0% {
opacity: 0;
transform: translateY(-5%);
}
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;
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.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;
}
}
}

View File

@@ -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);
}

View File

@@ -1,26 +0,0 @@
// Made by Luting ^-^
.lines-num span:after {
color: var(--color-text);
}
.ui.secondary.pointing.menu {
.active.item {
color: var(--color-text);
}
.active.item,
.dropdown.item,
.link.item,
a.item {
&:hover {
color: var(--color-text);
}
}
}
.ui.cards > .card,
.ui.card {
> .extra a:not(.ui):hover {
color: var(--color-blue);
}
}

View File

@@ -1,48 +0,0 @@
// Made by Luting ^-^
@font-face {
font-family: 'Maple Hand';
src: url('/assets/fonts/MapleHand-Regular.ttf') format('truetype');
font-display: swap;
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Maple Hand';
src: url('/assets/fonts/MapleHand-Bold.ttf') format('truetype');
font-display: swap;
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'VictorMono NF';
src: url('/assets/fonts/VictorMonoNerdFont-Regular.ttf') format('truetype');
font-display: swap;
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'VictorMono NF';
src: url('/assets/fonts/VictorMonoNerdFont-Italic.ttf') format('truetype');
font-display: swap;
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'VictorMono NF';
src: url('/assets/fonts/VictorMonoNerdFont-Bold.ttf') format('truetype');
font-display: swap;
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'VictorMono NF';
src: url('/assets/fonts/VictorMonoNerdFont-BoldItalic.ttf') format('truetype');
font-display: swap;
font-weight: bold;
font-style: italic;
}

2
src/functions/index.ts Normal file
View File

@@ -0,0 +1,2 @@
export { scaleColorLight } from "./scss";
export { fallbackVar } from "./var";

27
src/functions/scss.ts Normal file
View 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
View 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})`;
}

View File

@@ -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;
}
}

5
src/index.ts Normal file
View 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";

View File

@@ -1,27 +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 {
&:focus,
&:focus-visible {
border-radius: var(--border-radius);
border-color: #1f6feb;
outline: none;
box-shadow: inset 0 0 0 1px #1f6feb;
}
}

View File

@@ -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;
}
}

View File

@@ -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,
.secondary-nav .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;
}
}
}
}
}
}

View File

@@ -1,21 +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);
}
}

View File

@@ -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;
}
}

View File

@@ -1,73 +0,0 @@
// Made by Luting ^-^
.page-content.repository.releases {
#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;
}
.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;
}
}
}

View File

@@ -1,291 +0,0 @@
// Made by Luting ^-^
.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;
}
// 仓库页面头部名称
.page-content.repository .repo-header {
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 {
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;
}
.repo-file-line {
height: 3.725rem;
}
#repo-files-table .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;
}
}
.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-item {
.svg.octicon-file-directory-fill,
.svg.octicon-file-submodule {
color: #7d8590;
}
}
}
}
.repository #commits-table {
.author {
a {
color: var(--color-text);
}
img {
margin-right: 8px !important;
}
}
.text.right.aligned {
color: #919894;
}
}
// 仓库代码页面侧边栏
.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: 3px;
}
}
.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;
}
}
}
}

View File

@@ -1,246 +0,0 @@
// Made by Luting ^-^
:root :lang(zh-CN) {
--fonts-override: 'Maple Hand', 'VictorMono NF', 'VictorMono Nerd Font';
}
.job-step-logs {
font-family: 'ui-monospace', 'SFMono-Regular', 'SF Mono', 'Menlo', 'Consolas', 'Liberation Mono', 'monospace', 'Maple Hand' !important;
}
.repository {
#commits-table .text.right,
#repo-files-table .repo-file-cell.age,
#repo-files-table relative-time {
font-family: 'VictorMono NF', 'VictorMono Nerd Font', 'Maple Hand';
font-weight: bold !important;
}
}
: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;
}

View File

@@ -1,121 +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;
font-weight: 500;
background: unset;
padding: 6px 8px;
color: var(--color-white) !important;
}
.item:before {
background: unset;
}
.active.item:after {
@extend %active-item-after-style;
}
details {
&:has(.active.item) {
> summary {
background: #161a21;
&:hover {
background: var(--color-hover);
}
}
&[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;
}
}

View File

@@ -1,9 +0,0 @@
// Made by Luting ^-^
.text {
.purple {
color: #ab7df8 !important;
}
.green {
color: #3fb950 !important;
}
}

View File

@@ -1,3 +0,0 @@
/* Made by Luting ^-^ */
@use 'fontface';
@use 'theme-github';

View File

@@ -1,12 +0,0 @@
/* Made by Luting ^-^ */
// 独家秘制小主题
@use 'theme-github';
.repository {
#commits-table .text.right,
#repo-files-table .repo-file-cell.age,
#repo-files-table relative-time {
font-family: 'Maple Mono NF', 'Maple Hand';
font-weight: normal !important;
}
}

View File

@@ -1,21 +0,0 @@
/* Made by Luting ^-^ */
@use 'chroma';
@use 'codemirror';
@use 'root';
@use 'emoji';
@use 'transition'; // 添加过渡动画
@use 'modal'; // 弹窗
@use 'input'; // 输入框
@use 'repo'; // 仓库
@use 'button'; // 按钮
@use 'issue'; // 工单&拉取请求
@use 'dropdown'; // 下拉菜单
@use 'setting'; // 设置
@use 'label'; // 标签
@use 'release'; // 发布
@use 'actions'; // 操作
@use 'svg'; // svg
@use 'fontcolor'; // 字体颜色
@use 'radius'; // 圆角
@use 'heatmap'; // 热力图
@use 'diff'; // 对比

View File

@@ -1,60 +0,0 @@
// Made by Luting ^-^
@keyframes overlay-appear {
0% {
opacity: 0;
transform: translateY(-5%);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
input,
textarea,
tr,
td,
button,
details summary,
#navbar .item,
.header-wrapper .ui.tabular.menu .item,
.job-step-summary,
.job-step-logs,
.job-brief-item,
.menu .item,
.page-content.repository .flex-item .flex-item-title a,
.tippy-box .flex-items-block .item,
.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.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.button,
.ui.button:hover,
.ui.menu .item,
.ui.vertical.menu .header.item,
.ui.secondary.menu .item {
transition: 0.2s;
animation: 200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running overlay-appear;
}

255
src/types/color/chroma.ts Normal file
View 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实体名 &lt; &gt; &amp;
*/
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,
},
};

View 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
View 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
View 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
View 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
View 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,
};

View 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
View 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,
};

Some files were not shown because too many files have changed in this diff Show More