Compare commits

...

229 Commits

Author SHA1 Message Date
lutinglt
ec0f8660e9 update readme 2025-12-22 20:34:26 +08:00
lutinglt
673b7a13de version change & update readme 2025-12-22 20:29:44 +08:00
lutinglt
de0cac06b2 1.25.3 release 2025-12-22 20:09:01 +08:00
lutinglt
bd7899114b Optimize the width of the left side of the workflow details page in different zoom levels 2025-12-10 10:21:14 +08:00
lutinglt
9c67ea1697 fix ci 2025-12-05 09:35:55 +08:00
lutinglt
4a60775c32 vite 8.0 2025-12-05 09:29:26 +08:00
lutinglt
d27376a800 typescript 7.0 (tsgo) 2025-12-04 15:38:22 +08:00
lutinglt
6494e4468b optimize readme header 2025-12-04 11:25:43 +08:00
lutinglt
1729cfe2df fix ci 2025-12-03 11:39:20 +08:00
lutinglt
7a4851eb21 optimize action view 2025-12-03 10:56:46 +08:00
lutinglt
a0b51b863d tmpl Handlebars 2025-12-02 22:18:04 +08:00
lutinglt
13cd887d97 add translate 2025-12-02 17:33:57 +08:00
lutinglt
824eb26f1d build 2025-12-02 14:41:44 +08:00
lutinglt
6a0a92cd94 build test 2025-12-02 14:39:12 +08:00
lutinglt
76e547987b build test 2025-12-02 14:37:32 +08:00
lutinglt
86e488aafb fix issue/pr element styles 2025-12-02 13:43:36 +08:00
lutinglt
b3cc3ab82f sign badge icon -> font 2025-11-30 14:15:34 +08:00
lutinglt
f2787efcd9 optimize sign badge style 2025-11-30 12:09:21 +08:00
lutinglt
2b2f2e8a1e format 2025-11-29 21:14:51 +08:00
lutinglt
2a95d85fb6 fix commit sign badge style 2025-11-29 21:12:38 +08:00
lutinglt
e2838df051 Supplement the PR operation panel status style in PR 2025-11-29 21:04:40 +08:00
lutinglt
c1a0f96b6c optimize commit style 2025-11-29 20:04:31 +08:00
lutinglt
3084a5f54e Synchronized repository commit page layout and styles 2025-11-29 18:09:27 +08:00
lutinglt
ca7207db06 update readme 2025-11-28 19:30:41 +08:00
lutinglt
7d5c600f18 rc version 2025-11-28 16:17:16 +08:00
lutinglt
24f541180f Optimize menu item & code block styles 2025-11-28 16:11:37 +08:00
lutinglt
15d741ff66 optimize latest commit style 2025-11-28 11:51:42 +08:00
lutinglt
91ef8da69c remove pr button 2025-11-27 18:23:46 +08:00
lutinglt
47519afe4a Synchronized repository template 2025-11-27 17:50:57 +08:00
lutinglt
2da9dda3af Fixed extra lines under heatmap 2025-11-23 12:22:09 +08:00
lutinglt
8216986aef version change 2025-11-23 11:11:49 +08:00
lutinglt
f91d295b42 1.25.2 2025-11-23 11:07:46 +08:00
lutinglt
6e3f207c6c Fix the spacing of Issue WIP prompts 2025-11-22 17:46:45 +08:00
lutinglt
5c36998d5e release templates 2025-11-21 14:31:31 +08:00
lutinglt
a83fe43cbb Navigation bar Issue & PR moved to the right side. 2025-11-21 14:28:40 +08:00
lutinglt
678beb2c0d Optimize pr branch label 2025-11-13 20:44:55 +08:00
lutinglt
fd12236144 Optimize top navbar style on mobile 2025-11-13 20:32:45 +08:00
lutinglt
f33a0ae81c Optimize action list line height 2025-11-13 18:40:52 +08:00
鲁汀
a1d531ba36 Remove Downloads History from README
Removed Downloads History section and associated images.
2025-11-12 00:10:40 +08:00
lutinglt
32d0274b56 star history 2025-11-09 23:14:30 +08:00
lutinglt
74c98fbd5d update 2025-11-09 23:07:23 +08:00
lutinglt
d6567618d9 update readme 2025-11-09 23:04:29 +08:00
lutinglt
0cc4f61984 update readme 2025-11-09 22:59:42 +08:00
lutinglt
fd20862833 add --color-logo 2025-11-09 22:15:45 +08:00
lutinglt
ea49cf94dd Fix packages details page style 2025-11-09 10:04:35 +08:00
lutinglt
4fd01c50b0 Optimize organization detail page style 2025-11-09 09:50:25 +08:00
lutinglt
f500f2aae3 remove org label style 2025-11-08 23:56:21 +08:00
lutinglt
b220a17829 fix label 2025-11-08 23:51:20 +08:00
lutinglt
0a0cd77b3f Optimize repository header name style 2025-11-08 20:38:26 +08:00
lutinglt
aa36f52d83 Optimize repository header style 2025-11-08 20:37:23 +08:00
lutinglt
a841636737 Optimize global line height 2025-11-08 20:09:13 +08:00
lutinglt
fb1ebd6f18 fuck issue 2025-11-07 09:00:54 +08:00
lutinglt
4ae9a2754f Optimize the workflow log page style 2025-11-06 19:24:51 +08:00
lutinglt
914d5228e3 perf action step container 2025-11-06 18:05:12 +08:00
lutinglt
efec911021 Fix fixed height when scrolling through step titles on workflow detail pages 2025-11-06 17:43:10 +08:00
lutinglt
5e3f2ec2c2 Fix the disabled operation button interval in the code preview interface 2025-11-06 17:36:09 +08:00
lutinglt
ce1ebf0c53 h3 -> h4 2025-11-06 10:18:45 +08:00
lutinglt
63e05b09b1 update readme 2025-11-06 10:16:23 +08:00
lutinglt
2d0da89248 update issue order 2025-11-06 10:11:52 +08:00
lutinglt
687c7711ae update issue 2025-11-06 10:10:40 +08:00
lutinglt
1cf6252847 readme change 2025-11-06 09:31:26 +08:00
lutinglt
3851dc2449 fix code 2025-11-06 09:26:02 +08:00
lutinglt
adfa315484 修复差异对比下当有 unicode 字符提示时丢失的背景颜色和宽度问题 2025-11-05 18:49:12 +08:00
lutinglt
d91e6223dd version change 2025-11-05 09:08:58 +08:00
lutinglt
55cbf235d5 release 2025-11-05 09:05:20 +08:00
lutinglt
976949aa2e 修复对比视图内容中的圆角和背景溢出 2025-11-04 13:45:01 +08:00
lutinglt
0a7d5970c9 优化 diff 的行号宽度调整逻辑 2025-11-02 12:18:43 +08:00
lutinglt
98630773fb diff 代码行高度微调 2025-11-02 11:20:01 +08:00
lutinglt
f71dccb0c1 同步差异对比代码块的样式 2025-11-01 23:27:17 +08:00
lutinglt
925068c962 fix underline-offset 2025-11-01 21:59:15 +08:00
lutinglt
2901ef5fef 0.2rem -> 3.2px 2025-11-01 21:45:13 +08:00
lutinglt
4ac74837b3 全局 a 标签下划线偏移 2025-11-01 21:36:30 +08:00
lutinglt
b8c6eced7f changelog 2025-11-01 18:53:46 +08:00
lutinglt
a8a3cd5546 优化提示框动画速度 2025-11-01 18:51:02 +08:00
lutinglt
41e209c257 +1 2025-11-01 15:56:17 +08:00
lutinglt
d22c46e96f perf activity hover underline 2025-11-01 15:53:03 +08:00
lutinglt
97f602435c 修复仓库代码页的发布图标颜色 2025-11-01 14:19:12 +08:00
lutinglt
fede39c6eb 同步字符提示的提示框动画 2025-11-01 14:16:36 +08:00
lutinglt
493657bcb5 优化 Diff/Actions 的三点菜单按钮样式 2025-11-01 14:08:02 +08:00
lutinglt
e537b75bad 修复 Issue/PR 详细页面中时间线上的标签样式 2025-11-01 13:49:37 +08:00
lutinglt
07c6f0a78e 修复一些选择输入框的排列问题 2025-11-01 13:36:27 +08:00
lutinglt
b057060b05 fix readme 2025-10-31 23:23:14 +08:00
lutinglt
394a53d963 update screenshot 2025-10-31 23:21:48 +08:00
lutinglt
0f7a1d85c9 test readme 2025-10-31 22:49:00 +08:00
lutinglt
baa59d60a7 update screenshot 2025-10-31 22:43:54 +08:00
lutinglt
a62f65700c update screenshot 2025-10-31 22:39:56 +08:00
lutinglt
f2580e6c77 优化用户动态页 2025-10-31 19:11:13 +08:00
lutinglt
7f51f4b2eb 同步最后一次提交信息中的头像大小 2025-10-31 15:41:57 +08:00
lutinglt
93485dc5f7 头像和动态样式 & Issue 样式修复 2025-10-31 12:51:50 +08:00
lutinglt
90b618688b 1.25.0 2025-10-30 22:07:41 +08:00
lutinglt
6ddc5057a4 update readme 2025-10-25 15:25:19 +08:00
lutinglt
ceb0fd0b0c version change 2025-10-25 13:07:09 +08:00
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
120 changed files with 5490 additions and 1099 deletions

View File

@@ -14,5 +14,5 @@ trim_trailing_whitespace = true
max_line_length = 120 max_line_length = 120
# documentation, utils # documentation, utils
[*.{md,mdx,diff}] [*.{md,diff}]
trim_trailing_whitespace = false trim_trailing_whitespace = false

View File

@@ -6,3 +6,5 @@ SSH_SERVER=localhost
SSH_USER=root SSH_USER=root
# 上传到服务器的主题路径, 请使用绝对路径 # 上传到服务器的主题路径, 请使用绝对路径
GITEA_THEME_PATH=/data/gitea/public/assets/css/ GITEA_THEME_PATH=/data/gitea/public/assets/css/
# Gitea 数据路径, 用于上传到服务器的模板路径, 请使用绝对路径
GITEA_PATH=/data/gitea/

6
.gitattributes vendored
View File

@@ -1,5 +1 @@
.github/* linguist-vendored *.tmpl linguist-language=Handlebars
.vscode/* linguist-vendored
screenshots/* linguist-vendored
scripts/* linguist-vendored
eslint.config.js linguist-vendored

25
.github/CHANGELOG.md vendored Normal file
View File

@@ -0,0 +1,25 @@
### 🎉
### ✨ Feature
#### CSS 变量
### 🌈 Style
#### 更符合 GitHub 风格
##### 模板文件
### 🐞 Fix
## 📃 English
#### CSS Variable
#### More GitHub-like style
##### Template File
```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: |
!!! Please read the readme and ensure that the theme is used correctly before submitting !!!
1. Please use the latest theme and refresh the page with Ctrl+F5 to see if the Bug has disappeared.
2. Please check the CHANGELOG.md file in the project root directory for descriptions of fixes related to this Bug.
3. 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. 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:
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 Version
description: 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. 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: Screenshot of the default Gitea theme
description: Please upload a screenshot of the default Gitea theme.
validations:
required: false
- type: textarea
id: github-screenshot
attributes:
label: Screenshot of the corresponding GitHub page
description: Please upload a screenshot of the corresponding GitHub page.
validations:
required: false

View File

@@ -0,0 +1,43 @@
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. 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/3-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

View File

@@ -0,0 +1,39 @@
name: Feature request
description: Suggest new features.
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
1. 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: Screenshot of the corresponding GitHub page
description: Please upload a screenshot of the corresponding GitHub page.
validations:
required: false

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

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

View File

@@ -1,11 +0,0 @@
## 🎉
## ✨ Feature
#### CSS 变量
## 🌈 Style
#### 更符合 GitHub 风格
## 🐞 Fix

36
.github/release.md vendored
View File

@@ -1,36 +0,0 @@
## 🎉 项目已毕业! (这是最后一版开发版本)
目前项目的主要功能开发已全部完成, 进入维护阶段.
维护阶段项目发版频率与 Gitea 发版频率保持一致, 版本号将与 Gitea 保持一致(不再附带时间戳).
每逢 Gitea 大版本更新时, 项目中间如有修复, 会发布当前版本的最后一个 `.latest` 版本. 之后会发布适配第一个大版本的 `.rc`
预发布版本, 问题不多时会发布正式版本, 正式版本之后的修复会等 Gitea 发布下一个小版本时再发布.
## 🌈 Style
- 优化创建仓库/派生仓库/迁移仓库/创建组织页面的样式与设置页面的样式一致
- 优化消息右上角小图标样式
- 优化组织页面下的 RSS 订阅按钮样式
#### 更符合 GitHub 风格
- 同步代码编辑器背景色和字体大小 (修复亮色模式下编辑器背景色问题) #12
- 同步查看代码文件内容页面/文件树样式 (包括滚动时固定的导航栏, 尽量与 GitHub 一致)
- 同步分页菜单样式
- 同步登录/注册页面样式
- 同步 Issue/PR 列表样式
- 同步 Issue/PR 详细页面侧边栏样式
- 同步仓库代码文件页 README 导航栏样式
- 同步用户点星仓库列表样式
- 优化私有标签样式
- 优化热力图和动态样式
- 优化仪表板仓库/组织列表样式
- 略微增加仓库代码文件列表的单行高度
## 🐞 Fix
- Action 作业步骤页面标题选中时滚动固定的高度
- 用户公开活动页动态布局
- 顶部导航栏工单管理/请求合并页面搜索框旁的选择下拉框按钮内容过窄
- 手机页面下注册/登录页导航栏注册按钮换行

56
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,56 @@
name: build
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
src:
- "scripts/*"
- "src/**/*.ts"
- "styles/**/*.ts"
- "themes/*.css.ts"
- "vite.config.ts"
- "package.json"
- name: Build theme
id: build
if: steps.changes.outputs.src == 'true'
run: |
npm run install:vite8
npm run build
- name: Upload css assets
if: steps.build.outcome == 'success'
uses: actions/upload-artifact@v4
with:
name: themes
path: dist/*.css
- name: Upload templates assets
if: steps.build.outcome == 'success'
uses: actions/upload-artifact@v4
with:
name: templates
path: templates
- name: Build locales
id: locales
if: steps.build.outcome =='success'
run: npm run tr
- name: Upload locales assets
if: steps.locales.outcome =='success'
uses: actions/upload-artifact@v4
with:
name: locales
path: dist/options/locale

View File

@@ -13,13 +13,25 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build theme - name: Build theme
run: | run: |
npm install npm run install:vite8
npm run build npm run release
- name: Create release - name: Create release
run: | run: |
export TZ=Asia/Shanghai tar -zcf dist/theme-github-base.tar.gz --remove-files \
TAG="v$(npm run -s 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
tar -zcf dist/theme-github.tar.gz --remove-files 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
tar -zcf dist/theme-github-templates.tar.gz templates
tar -zcf dist/theme-github-translations.tar.gz --remove-files dist/options
TAG="v$(npm run -s version)"
gh release create "$TAG" dist/*.tar.gz --notes-file CHANGELOG.md --draft -t $TAG
env: env:
GH_TOKEN: ${{ github.token }} GH_TOKEN: ${{ github.token }}

View File

@@ -4,6 +4,7 @@
"dbaeumer.vscode-eslint", "dbaeumer.vscode-eslint",
"usernamehw.errorlens", "usernamehw.errorlens",
"mikestead.dotenv", "mikestead.dotenv",
"styled-components.vscode-styled-components" "styled-components.vscode-styled-components",
"typescriptteam.native-preview"
] ]
} }

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"typescript.experimental.useTsgo": false
}

7
CHANGELOG.md Normal file
View File

@@ -0,0 +1,7 @@
### 🌈 Style
#### More aligned with GitHub style
##### Template File
### 🐞 Fix

View File

@@ -95,8 +95,8 @@ npm run commit
请在颜色主题文件头部附加自己的作者信息, 方便 Issue 提问者找到你 `@`. 请在颜色主题文件头部附加自己的作者信息, 方便 Issue 提问者找到你 `@`.
推荐使用 `import { defineTheme } from "src"` 导入主题生成框架, 然后使用 `defineTheme` 函数生成主题, 推荐使用 `import { defineTheme, type ThemeColor } from "src"` 导入主题生成框架, 声明主题颜色, 然后使用 `defineTheme`
defineTheme 中设置了一些经过计算得到的 Gitea 变量可以减少工作量, 具体请查看函数说明. 函数生成主题所有 CSS 变量, defineTheme 中设置了一些经过计算得到的 Gitea 变量可以减少工作量, 具体请查看函数说明和定义.
颜色计算函数可以从 `src/functions` 导入, 例如 `import { scaleColorLight } from "src/functions"`, 或者使用 `polished` 库. 颜色计算函数可以从 `src/functions` 导入, 例如 `import { scaleColorLight } from "src/functions"`, 或者使用 `polished` 库.
@@ -107,12 +107,15 @@ defineTheme 中设置了一些经过计算得到的 Gitea 变量可以减少工
* @author 你的名字 * @author 你的名字
* @description 主题描述 * @description 主题描述
*/ */
import { defineTheme } from "src"; import { defineTheme, type ThemeColor } from "src";
export default defineTheme({ export const 主题名称DarkColors: ThemeColor = {
... ...
}); }
export default defineTheme(DarkColors);
// 使用其他主题颜色作为基础 // 使用其他主题颜色作为基础
import dark from "themes/dark"; import dark from "themes/dark";
import { darkColors } from "themes/dark";
export const 主题名称DarkColors: ThemeColor = darkColors;
export default defineTheme({ export default defineTheme({
...dark, ...dark,
... ...
@@ -130,17 +133,26 @@ export default defineTheme({
* @author 你的名字 * @author 你的名字
* @description 主题描述 * @description 主题描述
*/ */
import type { Theme } from "src"; import type { Theme, Chroma, Primary, Secondary, ... } from "src";
export const primary: Primary = ...;
export const secondary: Secondary =...;
export const chroma: Chroma =...;
...
export default theme: Theme = { export default theme: Theme = {
... primary,
secondary,
chroma,
...
}; };
``` ```
完成主题颜色开发后, 请在某个仓库的代码文件列表页, 打开 Code 菜单选择 Tea Cli 进行截图, 并放入 `screenshots` 完成主题颜色开发后, 请在某个仓库的代码文件列表页, 打开 Code 菜单选择 Tea Cli 进行截图, 并放入 `screenshots`
目录下, 截图名与主题名相同. (推荐克隆 Github 的 actions/checkout 仓库, 该仓库信息较全, 避免泄露个人隐私) 目录下, 截图名与主题名相同. (推荐克隆本仓库, 避免泄露个人隐私)
然后将截图信息添加到 `README.md` 文件中, 可以在折叠部分中添加自己的说明. 然后将截图信息添加到 `README.md` 文件中, 可以在折叠部分中添加自己的说明.
主题颜色复用案例可以参考本主题的色盲主题.
## 主题样式贡献 ## 主题样式贡献
主题样式使用 TypeScript 的 css 模板字符串开发, 该模板字符串会经过 sass 预处理器处理, 支持 SCSS 语法并且主题只接受 SCSS 嵌套语法, 请不要使用 CSS 语法, 如果一定要用请说明原因. 主题样式使用 TypeScript 的 css 模板字符串开发, 该模板字符串会经过 sass 预处理器处理, 支持 SCSS 语法并且主题只接受 SCSS 嵌套语法, 请不要使用 CSS 语法, 如果一定要用请说明原因.

203
README.md
View File

@@ -1,73 +1,155 @@
# 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 风格的 Gitea 主题 <h4 align="center">
A Gitea theme that pursues GitHub style not only in colors but also in styling details.
</h4>
![Dashboard](screenshots/en/dashboard-en.png)
> [!TIP] > [!TIP]
> >
> 推荐搭配文件图标浏览器插件一起使用更佳 > Recommend using Catppuccin file icon browser plugin together for better performance.
> [web-file-explorer-icons](https://github.com/catppuccin/web-file-explorer-icons) > [web-file-explorer-icons](https://github.com/catppuccin/web-file-explorer-icons)
## 版本号说明 ## Version Number Explanation
主题版本号与 Gitea 版本号保持一致 The theme version number is kept consistent with the Gitea version number
Gitea 版本号格式: `1.大版本号.小版本号` Gitea version number format: `1.major.minor`
Gitea 理论上小版本号变更不会修改前端布局, 所以主题的小版本号适用于所有 Gitea 大版本号相同的 Gitea 版本. 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.
比如: 主题版本 `1.24.4` 适用于 Gitea 版本 `>=1.24.0` ~ `<1.25.0` For example: Theme version `1.24.5` is applicable to Gitea versions `>=1.24.0` `<1.25.0`
仅维护项目发布中的最新的 Gitea 版本, 其他旧版本主题不接受 Issue 和 PR. Only the latest released Gitea version is maintained. Issues and PRs for other older theme versions will not be
accepted.
> 开发阶段的主题版本号格式: `1.大版本号.小版本号.时间戳` > Development stage theme version number format: `1.major.minor.timestamp`
## 安装 ### Theme Version Release Rules
1. 在发布页下载最新的 CSS 主题文件放入 `gitea/public/assets/css` 目录下 - When Gitea releases a minor version, if there are changes in the theme, a new theme version with the same minor
2. 修改 `gitea/conf/app.ini`,并将 CSS 文件名去掉 `theme-` 的名称附加到 `[ui]` 下的 `THEMES` 末尾 version as Gitea will be released
3. 重启 Gitea - When Gitea releases a major version, if there are changes in the theme, a theme version `1.old_major_version.latest`
4. 在设置中查看主题 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
> [!IMPORTANT] ## Installation
>
> 自动颜色主题需要亮色和暗色的主题文件
例: 主题文件名为 `theme-github-dark.css`,则添加 `github-dark``THEMES` 末尾 1. Download the latest CSS theme file from the release page and place it in the `data/gitea/public/assets/css` directory
(This directory may not be available by default and needs to be manually created)
2. Modify `data/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
`gitea/conf/app.ini` 例: Example: If the theme filename is `theme-github-dark.css`, add `github-dark` to the end of `THEMES`
Example `data/gitea/conf/app.ini`:
```ini ```ini
[ui] [ui]
THEMES = gitea-auto, gitea-light, gitea-dark, github-auto, github-light, github-dark, github-soft-dark THEMES = gitea-auto, gitea-light, gitea-dark, github-auto, github-light, github-dark, github-soft-dark
``` ```
详细请查看 Gitea 文档 For details, please refer to the Gitea documentation
[Gitea docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea) [Gitea docs](https://docs.gitea.com/next/administration/customizing-gitea#customizing-the-look-of-gitea)
## 截图 > [!IMPORTANT]
>
> Automatic color theme requires both light and dark theme files.
<details open> ### Template File Installation (Optional)
<summary>GitHub</summary>
<h4>theme-github-light.css</h4> 1. Download the latest template files from the release page and place them in the `data/gitea/templates` directory (This
<img src="screenshots/light.png"/> directory may not be available by default and needs to be manually created)
<h4>theme-github-dark.css</h4> 2. Restart Gitea
<img src="screenshots/dark.png"/>
<h4>theme-github-soft-dark.css</h4> > [!IMPORTANT]
<img src="screenshots/soft-dark.png"/> >
</details> > The template modifies Gitea's layout to make it closer to GitHub's layout. Do not use template files across versions,
> as this may lead to missing functionality and other issues.
>
> Template layout is bound to the Gitea instance and will affect all themes, impacting the experience of other
> non-project themes.
### Translation File Installation (Optional)
> [!TIP]
>
> Translation files are only needed when using this project's template files to provide support for non-English
> languages.
1. Download the latest translation files from the release page and place them in the `data/gitea/options/locale`
directory (This directory may not be available by default and needs to be manually created)
2. Restart Gitea
## Screenshots
### Basic Themes
```ini
THEMES = github-auto, github-light, github-dark, github-soft-dark
```
<details> <details>
<summary>其他主题</summary> <summary>Base</summary>
等待贡献者ing... <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> </details>
## 自定义 CSS 变量 ### 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>
在主题的 CSS 文件的头部或尾部添加以下代码 ### 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 ```css
:root { :root {
@@ -78,28 +160,31 @@ THEMES = gitea-auto, gitea-light, gitea-dark, github-auto, github-light, github-
> [!IMPORTANT] > [!IMPORTANT]
> >
> 请确保在 `:root` 选择器中添加自定义变量,否则无法生效 > Please ensure to add custom variables in the `:root` selector, otherwise they will not take effect
> >
> 变量之间用 `;` 分隔 > Variables are separated by `;`
> >
> 建议自定义变量放在单独的文件中, 通过 shell 命令等方式追加到主题文件中 > 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 变量 ### CSS Variables
| 变量名 | 描述 | 默认 | Github | 推荐 | 最小 | 最大 | | Variable Name | Description | Default | Github | Recommend | Min | Max |
| :-------------------------------- | :-------------------------- | :---- | :----- | :---- | :---- | :---- | | :-------------------------------- | :------------------------------------------------------- | :------ | :----- | :-------- | :---- | :---- |
| --custom-clone-menu-width | 克隆菜单宽度 | Gitea | 332px | 200px | 150px | 400px | | --custom-branch-menu-width | Branch menu width | 320px | 320px | 320px | Gitea | 640px |
| --custom-explore-repolist-columns | 探索页面的仓库列表列数 | 2 | 2 | 2 | | | | --custom-clone-menu-width | Clone button menu width | Gitea | 332px | 200px | 150px | 400px |
| --custom-explore-userlist-columns | 探索页面的用户/组织列表列数 | 3 | 1 | 2/3 | | | | --custom-user-menu-width | User menu width | 192px | 200px | | Gitea | 320px |
| --custom-user-repolist-columns | 用户页面的仓库列表列数 | 2 | 2 | 1/2 | | | | --custom-explore-repolist-columns | Number of repository list columns on explore page | 2 | 2 | 2 | | |
| --custom-org-repolist-columns | 组织页面的仓库列表列数 | 1 | 1 | 1/2 | | | | --custom-explore-userlist-columns | Number of user/organization list columns on explore page | 3 | 1 | 2/3 | | |
| --custom-org-userlist-columns | 组织页面的用户列表列数 | 2 | 1 | 1/2 | | | | --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
请确保你已经安装了 Node.js 环境, 推荐使用 Node.js 20 或以上版本 Please ensure you have Node.js environment installed, Node.js 20 or above is recommended
```bash ```bash
git clone https://github.com/lutinglt/gitea-github-theme.git git clone https://github.com/lutinglt/gitea-github-theme.git
@@ -108,9 +193,15 @@ npm install
npm run build npm run build
``` ```
编译完成后, 会在 `dist` 目录下生成主题文件, 你可以将主题文件放入 `gitea/public/assets/css` 目录下, 然后在 After compilation, theme files will be generated in the `dist` directory. You can place the theme files into the
`gitea/conf/app.ini` 中添加主题名称到 `THEMES` 末尾 `gitea/public/assets/css` directory, then add the theme name to the end of `THEMES` in `gitea/conf/app.ini`
## 贡献 ## Star History
请查看 [CONTRIBUTING](CONTRIBUTING.md) <a href="https://www.star-history.com/#lutinglt/gitea-github-theme&type=date&legend=top-left">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=lutinglt/gitea-github-theme&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=lutinglt/gitea-github-theme&type=date&legend=top-left" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=lutinglt/gitea-github-theme&type=date&legend=top-left" />
</picture>
</a>

188
README_CN.md Normal file
View File

@@ -0,0 +1,188 @@
<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>
<h4 align="center">
不仅仅是在颜色上, 在样式细节上也追求 GitHub 风格的 Gitea 主题
</h4>
![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. 在发布页下载最新的 CSS 主题文件放入 `data/gitea/public/assets/css` 目录下 (默认可能没有此目录需手动创建)
2. 修改 `data/gitea/conf/app.ini`,并将 CSS 文件名去掉 `theme-` 的名称附加到 `[ui]` 下的 `THEMES` 末尾
3. 重启 Gitea
4. 在设置中查看主题
例: 主题文件名为 `theme-github-dark.css`,则添加 `github-dark``THEMES` 末尾
`data/gitea/conf/app.ini` 例:
```ini
[ui]
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)
> [!IMPORTANT]
>
> 自动颜色主题需要亮色和暗色的主题文件
### 模板文件安装 (可选)
1. 在发布页下载最新的模板文件放入 `data/gitea/templates` 目录下 (默认可能没有此目录需手动创建)
2. 重启 Gitea
> [!IMPORTANT]
>
> 模板修改了 Gitea 的布局, 使其更接近 GitHub 的布局, 请勿跨版本使用模板文件, 可能会导致功能缺失等问题
>
> 模板布局跟 Gitea 实例绑定, 所有主题都会生效, 会影响其他非本项目的主题的体验
### 翻译文件安装 (可选)
> [!TIP]
>
> 仅在使用本项目的模板文件时需要安装翻译文件以提供非英文语言的支持
1. 在发布页下载最新的翻译文件放入 `data/gitea/options/locale` 目录下 (默认可能没有此目录需手动创建)
2. 重启 Gitea
> [!NOTE]
>
> 中文翻译中还额外将 "工单" 替换为 "议题", "合并请求" 替换为 "拉取请求", 以与 GitHub 手机版中文保持一致
## 截图
### 基本主题
```ini
THEMES = github-auto, github-light, github-dark, github-soft-dark
```
<details>
<summary>Base</summary>
<h4>theme-github-light.css</h4>
<img src="screenshots/light.png"/>
<h4>theme-github-dark.css</h4>
<img src="screenshots/dark.png"/>
<h4>theme-github-soft-dark.css</h4>
<img src="screenshots/soft-dark.png"/>
</details>
### 色盲主题 ( Beta )
```ini
THEMES = github-colorblind-auto, github-colorblind-light, github-colorblind-dark
THEMES = github-tritanopia-auto, github-tritanopia-light, github-tritanopia-dark
```
<details>
<summary>Colorblind & Tritanopia (红绿色盲 & 蓝色盲)</summary>
<h4>theme-github-colorblind-light.css & theme-github-tritanopia-light.css</h4>
<img src="screenshots/colorblind-light.png"/>
<h4>theme-github-colorblind-dark.css & theme-github-tritanopia-dark.css</h4>
<img src="screenshots/colorblind-dark.png"/>
</details>
### 粉色主题
```ini
THEMES = github-pink-auto, github-pink-light, github-pink-dark, github-pink-soft-dark
```
<details>
<summary>Pink</summary>
<h4>theme-github-pink-light.css</h4>
<img src="screenshots/pink/pink-light.png"/>
<h4>theme-github-pink-dark.css</h4>
<img src="screenshots/pink/pink-dark.png"/>
<h4>theme-github-pink-soft-dark.css</h4>
<img src="screenshots/pink/pink-soft-dark.png"/>
</details>
## 自定义 CSS 变量
可以根据自己的偏好自定义主题的一部分样式
### 使用方法
在主题的 CSS 文件的头部或尾部添加以下代码
```css
:root {
--custom-clone-menu-width: 150px;
...
}
```
> [!IMPORTANT]
>
> 请确保在 `:root` 选择器中添加自定义变量,否则无法生效
>
> 变量之间用 `;` 分隔
>
> 建议自定义变量放在单独的文件中, 通过 shell 命令等方式追加到主题文件中
### CSS 变量
| 变量名 | 描述 | 默认 | Github | 推荐 | 最小 | 最大 |
| :-------------------------------- | :-------------------------- | :---- | :----- | :---- | :---- | :---- |
| --custom-branch-menu-width | 分支菜单的宽度 | 320px | 320px | 320px | Gitea | 640px |
| --custom-clone-menu-width | 克隆按钮的菜单宽度 | Gitea | 332px | 200px | 150px | 400px |
| --custom-user-menu-width | 用户菜单的宽度 | 192px | 256px | | Gitea | 320px |
| --custom-explore-repolist-columns | 探索页面的仓库列表列数 | 2 | 2 | 2 | | |
| --custom-explore-userlist-columns | 探索页面的用户/组织列表列数 | 3 | 1 | 2/3 | | |
| --custom-user-repolist-columns | 用户页面的仓库列表列数 | 2 | 2 | 1/2 | | |
| --custom-org-repolist-columns | 组织页面的仓库列表列数 | 1 | 1 | 1/2 | | |
| --custom-org-userlist-columns | 组织页面的用户列表列数 | 2 | 1 | 1/2 | | |
## 使用开发中的主题
也许你会想使用开发中的主题, 而不是发布的主题
请确保你已经安装了 Node.js 环境, 推荐使用 Node.js 20 或以上版本
```bash
git clone https://github.com/lutinglt/gitea-github-theme.git
cd gitea-github-theme
npm install
npm run build
```
编译完成后, 会在 `dist` 目录下生成主题文件, 你可以将主题文件放入 `gitea/public/assets/css` 目录下, 然后在
`gitea/conf/app.ini` 中添加主题名称到 `THEMES` 末尾

View File

@@ -1,15 +1,14 @@
import js from "@eslint/js"; import js from "@eslint/js";
import { defineConfig } from "eslint/config";
import globals from "globals"; import globals from "globals";
import tseslint from "typescript-eslint"; import tseslint from "typescript-eslint";
export default tseslint.config( export default defineConfig({
{ ignores: ["dist"] }, ignores: ["dist"],
{ extends: [js.configs.recommended, ...tseslint.configs.recommended],
extends: [js.configs.recommended, ...tseslint.configs.recommended], files: ["**/*.{ts}"],
files: ["**/*.{ts}"], languageOptions: {
languageOptions: { ecmaVersion: 2020,
ecmaVersion: 2020, globals: globals.browser,
globals: globals.browser, },
}, });
}
);

1
gitea/README.md Normal file
View File

@@ -0,0 +1 @@
模板的原始文件

View File

@@ -0,0 +1,180 @@
<nav id="navbar" aria-label="{{ctx.Locale.Tr "aria.navbar"}}">
<div class="navbar-left">
<!-- the logo -->
<a class="item" id="navbar-logo" href="{{AppSubUrl}}/" aria-label="{{if .IsSigned}}{{ctx.Locale.Tr "dashboard"}}{{else}}{{ctx.Locale.Tr "home"}}{{end}}">
<img width="30" height="30" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}" aria-hidden="true">
</a>
<!-- mobile right menu, it must be here because in mobile view, each item is a flex column, the first item is a full row column -->
<div class="ui secondary menu navbar-mobile-right only-mobile">
{{template "base/head_navbar_icons" dict "PageGlobalData" .PageGlobalData}}
<button class="item ui icon mini button tw-m-0" id="navbar-expand-toggle" aria-label="{{ctx.Locale.Tr "home.nav_menu"}}">{{svg "octicon-three-bars"}}</button>
</div>
<!-- navbar links non-mobile -->
{{if and .IsSigned .MustChangePassword}}
{{/* No links */}}
{{else if .IsSigned}}
{{if not ctx.Consts.RepoUnitTypeIssues.UnitGlobalDisabled}}
<a class="item{{if .PageIsIssues}} active{{end}}" href="{{AppSubUrl}}/issues">{{ctx.Locale.Tr "issues"}}</a>
{{end}}
{{if not ctx.Consts.RepoUnitTypePullRequests.UnitGlobalDisabled}}
<a class="item{{if .PageIsPulls}} active{{end}}" href="{{AppSubUrl}}/pulls">{{ctx.Locale.Tr "pull_requests"}}</a>
{{end}}
{{if not (and ctx.Consts.RepoUnitTypeIssues.UnitGlobalDisabled ctx.Consts.RepoUnitTypePullRequests.UnitGlobalDisabled)}}
{{if .ShowMilestonesDashboardPage}}
<a class="item{{if .PageIsMilestonesDashboard}} active{{end}}" href="{{AppSubUrl}}/milestones">{{ctx.Locale.Tr "milestones"}}</a>
{{end}}
{{end}}
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "explore"}}</a>
{{else if .IsLandingPageOrganizations}}
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/organizations">{{ctx.Locale.Tr "explore"}}</a>
{{else}}
<a class="item{{if .PageIsExplore}} active{{end}}" href="{{AppSubUrl}}/explore/repos">{{ctx.Locale.Tr "explore"}}</a>
{{end}}
{{template "custom/extra_links" .}}
{{if not .IsSigned}}
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.com">{{ctx.Locale.Tr "help"}}</a>
{{end}}
</div>
<!-- the full dropdown menus -->
<div class="navbar-right">
{{if and .IsSigned .MustChangePassword}}
<div class="ui dropdown jump item" data-tooltip-content="{{ctx.Locale.Tr "user_profile_and_more"}}">
<span class="text">
{{ctx.AvatarUtils.Avatar .SignedUser 24 "tw-mr-1"}}
<span class="only-mobile">{{.SignedUser.Name}}</span>
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
</span>
<div class="menu user-menu">
<div class="header">
{{ctx.Locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
</div>
<div class="divider"></div>
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout">
{{svg "octicon-sign-out"}}
{{ctx.Locale.Tr "sign_out"}}
</a>
</div><!-- end content avatar menu -->
</div><!-- end dropdown avatar menu -->
{{else if .IsSigned}}
{{template "base/head_navbar_icons" dict "ItemExtraClass" "not-mobile" "PageGlobalData" .PageGlobalData}}
<div class="ui dropdown jump item" data-tooltip-content="{{ctx.Locale.Tr "create_new"}}">
<span class="text">
{{svg "octicon-plus"}}
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
<span class="only-mobile">{{ctx.Locale.Tr "create_new"}}</span>
</span>
<div class="menu">
<a class="item" href="{{AppSubUrl}}/repo/create">
{{svg "octicon-plus"}} {{ctx.Locale.Tr "new_repo"}}
</a>
{{if not .DisableMigrations}}
<a class="item" href="{{AppSubUrl}}/repo/migrate">
{{svg "octicon-repo-push"}} {{ctx.Locale.Tr "new_migrate"}}
</a>
{{end}}
{{if .SignedUser.CanCreateOrganization}}
<a class="item" href="{{AppSubUrl}}/org/create">
{{svg "octicon-organization"}} {{ctx.Locale.Tr "new_org"}}
</a>
{{end}}
</div><!-- end content create new menu -->
</div><!-- end dropdown menu create new -->
<div class="ui dropdown jump item" data-tooltip-content="{{ctx.Locale.Tr "user_profile_and_more"}}">
<span class="text">
{{ctx.AvatarUtils.Avatar .SignedUser 24 "tw-mr-1"}}
<span class="only-mobile">{{.SignedUser.Name}}</span>
<span class="not-mobile">{{svg "octicon-triangle-down"}}</span>
</span>
<div class="menu user-menu">
<div class="header">
{{ctx.Locale.Tr "signed_in_as"}} <strong>{{.SignedUser.Name}}</strong>
</div>
<div class="divider"></div>
<a class="item" href="{{.SignedUser.HomeLink}}">
{{svg "octicon-person"}}
{{ctx.Locale.Tr "your_profile"}}
</a>
{{if not .DisableStars}}
<a class="item" href="{{.SignedUser.HomeLink}}?tab=stars">
{{svg "octicon-star"}}
{{ctx.Locale.Tr "your_starred"}}
</a>
{{end}}
<a class="item" href="{{AppSubUrl}}/notifications/subscriptions">
{{svg "octicon-bell"}}
{{ctx.Locale.Tr "notification.subscriptions"}}
</a>
<a class="{{if .PageIsUserSettings}}active {{end}}item" href="{{AppSubUrl}}/user/settings">
{{svg "octicon-tools"}}
{{ctx.Locale.Tr "your_settings"}}
</a>
<a class="item" target="_blank" rel="noopener noreferrer" href="https://docs.gitea.com">
{{svg "octicon-question"}}
{{ctx.Locale.Tr "help"}}
</a>
{{if .IsAdmin}}
<div class="divider"></div>
<a class="{{if .PageIsAdmin}}active {{end}}item" href="{{AppSubUrl}}/-/admin">
{{svg "octicon-server"}}
{{ctx.Locale.Tr "admin_panel"}}
</a>
{{end}}
<div class="divider"></div>
<a class="item link-action" href data-url="{{AppSubUrl}}/user/logout">
{{svg "octicon-sign-out"}}
{{ctx.Locale.Tr "sign_out"}}
</a>
</div><!-- end content avatar menu -->
</div><!-- end dropdown avatar menu -->
{{else}}
{{if .ShowRegistrationButton}}
<a class="item{{if .PageIsSignUp}} active{{end}}" href="{{AppSubUrl}}/user/sign_up">
{{svg "octicon-person"}}
<span class="tw-ml-1">{{ctx.Locale.Tr "register"}}</span>
</a>
{{end}}
<a class="item{{if .PageIsSignIn}} active{{end}}" rel="nofollow" href="{{AppSubUrl}}/user/login{{if not .PageIsSignIn}}?redirect_to={{.CurrentURL}}{{end}}">
{{svg "octicon-sign-in"}}
<span class="tw-ml-1">{{ctx.Locale.Tr "sign_in"}}</span>
</a>
{{end}}
</div><!-- end full right menu -->
{{$activeStopwatch := and .PageGlobalData (call .PageGlobalData.GetActiveStopwatch)}}
{{if $activeStopwatch}}
<div class="active-stopwatch-popup tippy-target">
<div class="tw-flex tw-items-center tw-gap-2 tw-p-3">
<a class="stopwatch-link tw-flex tw-items-center tw-gap-2 muted" href="{{$activeStopwatch.IssueLink}}">
{{svg "octicon-issue-opened" 16}}
<span class="stopwatch-issue">{{$activeStopwatch.RepoSlug}}#{{$activeStopwatch.IssueIndex}}</span>
</a>
<div class="tw-flex tw-gap-1">
<form class="stopwatch-commit form-fetch-action" method="post" action="{{$activeStopwatch.IssueLink}}/times/stopwatch/stop">
{{.CsrfTokenHtml}}
<button
type="submit"
class="ui button mini compact basic icon tw-mr-0"
data-tooltip-content="{{ctx.Locale.Tr "repo.issues.stop_tracking"}}"
>{{svg "octicon-square-fill"}}</button>
</form>
<form class="stopwatch-cancel form-fetch-action" method="post" action="{{$activeStopwatch.IssueLink}}/times/stopwatch/cancel">
{{.CsrfTokenHtml}}
<button
type="submit"
class="ui button mini compact basic icon tw-mr-0"
data-tooltip-content="{{ctx.Locale.Tr "repo.issues.cancel_tracking"}}"
>{{svg "octicon-trash"}}</button>
</form>
</div>
</div>
</div>
{{end}}
</nav>

View File

@@ -0,0 +1,25 @@
{{- $itemExtraClass := .ItemExtraClass -}}
{{- $data := .PageGlobalData -}}
{{if and $data $data.IsSigned}}{{/* data may not exist, for example: rendering 503 page before the PageGlobalData middleware */}}
{{- $activeStopwatch := call $data.GetActiveStopwatch -}}
{{- $notificationUnreadCount := call $data.GetNotificationUnreadCount -}}
{{if $activeStopwatch}}
<a class="item active-stopwatch {{$itemExtraClass}}" href="{{$activeStopwatch.IssueLink}}" title="{{ctx.Locale.Tr "active_stopwatch"}}" data-seconds="{{$activeStopwatch.Seconds}}">
<div class="tw-relative">
{{svg "octicon-stopwatch"}}
<span class="header-stopwatch-dot"></span>
</div>
</a>
{{end}}
<a class="item {{$itemExtraClass}}" href="{{AppSubUrl}}/notifications" data-tooltip-content="{{ctx.Locale.Tr "notifications"}}">
<div class="tw-relative">
{{svg "octicon-bell"}}
<span class="notification_count{{if not $notificationUnreadCount}} tw-hidden{{end}}">{{$notificationUnreadCount}}</span>
</div>
</a>
{{if $data.IsSiteAdmin}}
<a class="item {{$itemExtraClass}}" href="{{AppSubUrl}}/-/admin" data-tooltip-content="{{ctx.Locale.Tr "admin_panel"}}">
{{svg "octicon-server"}}
</a>
{{end}}
{{end}}

View File

@@ -0,0 +1,81 @@
{{/* Template attributes:
* Commit
* CommitBaseLink
* CommitSignVerification
If you'd like to modify this template, you could test it on the devtest page.
ATTENTION: this template could be re-rendered many times (on the graph and commit list page),
so this template should be kept as small as possible, DO NOT put large components like modal/dialog into it.
*/}}
{{- $commit := $.Commit -}}
{{- $commitBaseLink := $.CommitBaseLink -}}
{{- $verification := $.CommitSignVerification -}}{{- /* asymkey.CommitVerification */ -}}
{{- $extraClass := "" -}}
{{- $verified := false -}}
{{- $signingUser := NIL -}}
{{- $signingEmail := "" -}}
{{- $msgReasonPrefix := "" -}}
{{- $msgReason := "" -}}
{{- $msgSigningKey := "" -}}
{{- if $verification -}}
{{- $signingUser = $verification.SigningUser -}}
{{- $signingEmail = $verification.SigningEmail -}}
{{- $extraClass = print $extraClass " commit-is-signed" -}}
{{- if $verification.Verified -}}
{{- /* reason is "{name} / {key-id}" */ -}}
{{- $msgReason = $verification.Reason -}}
{{- $verified = true -}}
{{- if eq $verification.TrustStatus "trusted" -}}
{{- $extraClass = print $extraClass " sign-trusted" -}}
{{- else if eq $verification.TrustStatus "untrusted" -}}
{{- $extraClass = print $extraClass " sign-untrusted" -}}
{{- $msgReasonPrefix = ctx.Locale.Tr "repo.commits.signed_by_untrusted_user" -}}
{{- else -}}
{{- $extraClass = print $extraClass " sign-unmatched" -}}
{{- $msgReasonPrefix = ctx.Locale.Tr "repo.commits.signed_by_untrusted_user_unmatched" -}}
{{- end -}}
{{- else -}}
{{- if $verification.Warning -}}
{{- $extraClass = print $extraClass " sign-warning" -}}
{{- else -}}
{{- $extraClass = "" -}}{{/* the commit is not signed */}}
{{- end -}}
{{- $msgReason = ctx.Locale.Tr $verification.Reason -}}{{- /* dirty part: it is the translation key ..... */ -}}
{{- end -}}
{{- if $msgReasonPrefix -}}
{{- $msgReason = print $msgReasonPrefix ": " $msgReason -}}
{{- end -}}
{{- if $verification.SigningSSHKey -}}
{{- $msgSigningKey = print (ctx.Locale.Tr "repo.commits.ssh_key_fingerprint") ": " $verification.SigningSSHKey.Fingerprint -}}
{{- else if $verification.SigningKey -}}{{- /* asymkey.GPGKey */ -}}
{{- $msgSigningKey = print (ctx.Locale.Tr "repo.commits.gpg_key_id") ": " $verification.SigningKey.PaddedKeyID -}}
{{- end -}}
{{- end -}}
{{- if $commit -}}
<a {{if $commitBaseLink}}href="{{$commitBaseLink}}/{{$commit.ID}}"{{end}} class="ui label commit-id-short {{$extraClass}}" rel="nofollow">
{{- ShortSha $commit.ID.String -}}
{{- end -}}
{{- if or (not $commit) $extraClass}}{{/* only show the lock icon if there is no commit info (icon only) or the commit is really signed */}}
<span class="ui label commit-sign-badge {{$extraClass}}">
{{- if $verified -}}
{{- if and $signingUser $signingUser.ID -}}
<span data-tooltip-content="{{$msgReason}}">{{svg "gitea-lock"}}</span>
<span data-tooltip-content="{{$msgSigningKey}}">{{ctx.AvatarUtils.Avatar $signingUser 16}}</span>
{{- else -}}
<span data-tooltip-content="{{$msgReason}}">{{svg "gitea-lock-cog"}}</span>
<span data-tooltip-content="{{$msgSigningKey}}">{{ctx.AvatarUtils.AvatarByEmail $signingEmail "" 16}}</span>
{{- end -}}
{{- else -}}
<span data-tooltip-content="{{$msgReason}}">{{svg "gitea-unlock"}}</span>
{{- end -}}
</span>
{{- end -}}
{{- if $commit -}}
</a>
{{- end -}}
{{- /* This template should be kept as small as possible, DO NOT put large components like modal/dialog into it. */ -}}

View File

@@ -0,0 +1,89 @@
<div class="ui attached table segment commit-table">
<table class="ui very basic striped table unstackable" id="commits-table">
<thead>
<tr>
<th class="three wide">{{ctx.Locale.Tr "repo.commits.author"}}</th>
<th class="two wide sha">{{StringUtils.ToUpper $.Repository.ObjectFormatName}}</th>
<th class="eight wide message">{{ctx.Locale.Tr "repo.commits.message"}}</th>
<th class="two wide tw-text-right">{{ctx.Locale.Tr "repo.commits.date"}}</th>
<th class="one wide"></th>
</tr>
</thead>
<tbody class="commit-list">
{{$commitRepoLink := $.RepoLink}}{{if $.CommitRepoLink}}{{$commitRepoLink = $.CommitRepoLink}}{{end}}
{{range .Commits}}
<tr>
<td class="author">
<div class="tw-flex">
{{$userName := .Author.Name}}
{{if .User}}
{{if and .User.FullName DefaultShowFullName}}
{{$userName = .User.FullName}}
{{end}}
{{ctx.AvatarUtils.Avatar .User 28 "tw-mr-2"}}<a class="muted author-wrapper" href="{{.User.HomeLink}}">{{$userName}}</a>
{{else}}
{{ctx.AvatarUtils.AvatarByEmail .Author.Email .Author.Name 28 "tw-mr-2"}}
<span class="author-wrapper">{{$userName}}</span>
{{end}}
</div>
</td>
<td class="sha">
{{$commitBaseLink := ""}}
{{if $.PageIsWiki}}
{{$commitBaseLink = printf "%s/wiki/commit" $commitRepoLink}}
{{else if $.PageIsPullCommits}}
{{$commitBaseLink = printf "%s/pulls/%d/commits" $commitRepoLink $.Issue.Index}}
{{else if $.Reponame}}
{{$commitBaseLink = printf "%s/commit" $commitRepoLink}}
{{end}}
{{template "repo/commit_sign_badge" dict "Commit" . "CommitBaseLink" $commitBaseLink "CommitSignVerification" .Verification}}
</td>
<td class="message">
<span class="message-wrapper">
{{if $.PageIsWiki}}
<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{.Summary | ctx.RenderUtils.RenderEmoji}}</span>
{{else}}
{{$commitLink:= printf "%s/commit/%s" $commitRepoLink (PathEscape .ID.String)}}
<span class="commit-summary {{if gt .ParentCount 1}} grey text{{end}}" title="{{.Summary}}">{{ctx.RenderUtils.RenderCommitMessageLinkSubject .Message $commitLink $.Repository}}</span>
{{end}}
</span>
{{if IsMultilineCommitMessage .Message}}
<button class="ui button ellipsis-button" aria-expanded="false" data-global-click="onRepoEllipsisButtonClick">...</button>
{{end}}
{{template "repo/commit_statuses" dict "Status" .Status "Statuses" .Statuses}}
{{if IsMultilineCommitMessage .Message}}
<pre class="commit-body tw-hidden">{{ctx.RenderUtils.RenderCommitBody .Message $.Repository}}</pre>
{{end}}
{{if $.CommitsTagsMap}}
{{range (index $.CommitsTagsMap .ID.String)}}
{{- template "repo/tag/name" dict "AdditionalClasses" "tw-py-0" "RepoLink" $.Repository.Link "TagName" .TagName "IsRelease" (not .IsTag) -}}
{{end}}
{{end}}
</td>
{{if .Committer}}
<td class="tw-text-right">{{DateUtils.TimeSince .Committer.When}}</td>
{{else}}
<td class="tw-text-right">{{DateUtils.TimeSince .Author.When}}</td>
{{end}}
<td class="tw-text-right tw-py-0">
<button class="btn interact-bg tw-p-2 copy-commit-id" data-tooltip-content="{{ctx.Locale.Tr "copy_hash"}}" data-clipboard-text="{{.ID}}">{{svg "octicon-copy"}}</button>
{{/* at the moment, wiki doesn't support these "view" links like "view at history point" */}}
{{if not $.PageIsWiki}}
{{/* view single file diff */}}
{{if $.FileTreePath}}
<a class="btn interact-bg tw-p-2 view-single-diff" data-tooltip-content="{{ctx.Locale.Tr "repo.commits.view_file_diff"}}"
href="{{$commitRepoLink}}/commit/{{.ID.String}}?files={{$.FileTreePath}}"
>{{svg "octicon-file-diff"}}</a>
{{end}}
{{/* view at history point */}}
{{$viewCommitLink := printf "%s/src/commit/%s" $commitRepoLink (PathEscape .ID.String)}}
{{if $.FileTreePath}}{{$viewCommitLink = printf "%s/%s" $viewCommitLink (PathEscapeSegments $.FileTreePath)}}{{end}}
<a class="btn interact-bg tw-p-2 view-commit-path" data-tooltip-content="{{ctx.Locale.Tr "repo.commits.view_path"}}" href="{{$viewCommitLink}}">{{svg "octicon-file-code"}}</a>
{{end}}
</td>
</tr>
{{end}}
</tbody>
</table>
</div>

View File

@@ -0,0 +1,112 @@
{{$isTreePathRoot := not .TreeNames}}
<div class="repo-view-content-data tw-hidden" data-document-title="{{ctx.RootData.Title}}" data-document-title-common="{{ctx.RootData.PageTitleCommon}}"></div>
{{template "repo/sub_menu" .}}
<div class="repo-button-row">
<div class="repo-button-row-left">
{{if not $isTreePathRoot}}
<button class="repo-view-file-tree-toggle-show ui compact basic button icon not-mobile {{if .UserSettingCodeViewShowFileTree}}tw-hidden{{end}}"
data-global-click="onRepoViewFileTreeToggle" data-toggle-action="show"
data-tooltip-content="{{ctx.Locale.Tr "repo.diff.show_file_tree"}}">
{{svg "octicon-sidebar-collapse"}}
</button>
{{end}}
{{template "repo/branch_dropdown" dict
"Repository" .Repository
"ShowTabBranches" true
"ShowTabTags" true
"CurrentRefType" .RefFullName.RefType
"CurrentRefShortName" .RefFullName.ShortName
"CurrentTreePath" .TreePath
"RefLinkTemplate" "{RepoLink}/src/{RefType}/{RefShortName}/{TreePath}"
"AllowCreateNewRef" .CanCreateBranch
"ShowViewAllRefsEntry" true
}}
{{if and .CanCompareOrPull .RefFullName.IsBranch (not .Repository.IsArchived)}}
{{$cmpBranch := ""}}
{{if ne .Repository.ID .BaseRepo.ID}}
{{$cmpBranch = printf "%s/%s:" (.Repository.OwnerName|PathEscape) (.Repository.Name|PathEscape)}}
{{end}}
{{$cmpBranch = print $cmpBranch (.BranchName|PathEscapeSegments)}}
{{$compareLink := printf "%s/compare/%s...%s" .BaseRepo.Link (.BaseRepo.DefaultBranch|PathEscapeSegments) $cmpBranch}}
<a id="new-pull-request" role="button" class="ui compact basic button" href="{{QueryBuild $compareLink "expand" 1}}"
data-tooltip-content="{{if .PullRequestCtx.Allowed}}{{ctx.Locale.Tr "repo.pulls.compare_changes"}}{{else}}{{ctx.Locale.Tr "action.compare_branch"}}{{end}}">
{{svg "octicon-git-pull-request"}}
</a>
{{end}}
<!-- Show go to file if on home page -->
{{if $isTreePathRoot}}
<a href="{{.Repository.Link}}/find/{{.RefTypeNameSubURL}}" class="ui compact basic button">{{ctx.Locale.Tr "repo.find_file.go_to_file"}}</a>
{{end}}
{{if and .RefFullName.IsBranch (not .IsViewFile)}}
<button class="ui dropdown basic compact jump button repo-add-file" {{if not .Repository.CanEnableEditor}}disabled{{end}}>
{{ctx.Locale.Tr "repo.editor.add_file"}}
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
<div class="menu">
<a class="item" href="{{.RepoLink}}/_new/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
{{ctx.Locale.Tr "repo.editor.new_file"}}
</a>
{{if .RepositoryUploadEnabled}}
<a class="item" href="{{.RepoLink}}/_upload/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
{{ctx.Locale.Tr "repo.editor.upload_file"}}
</a>
{{end}}
<a class="item" href="{{.RepoLink}}/_diffpatch/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">
{{ctx.Locale.Tr "repo.editor.patch"}}
</a>
</div>
</button>
{{end}}
{{if and $isTreePathRoot .Repository.IsTemplate}}
<a role="button" class="ui primary compact button" href="{{AppSubUrl}}/repo/create?template_id={{.Repository.ID}}">
{{ctx.Locale.Tr "repo.use_template"}}
</a>
{{end}}
{{if not $isTreePathRoot}}
{{$treeNameIdxLast := Eval (len .TreeNames) "-" 1}}
<span class="breadcrumb">
<a class="section" href="{{.RepoLink}}/src/{{.RefTypeNameSubURL}}" title="{{.Repository.Name}}">{{StringUtils.EllipsisString .Repository.Name 30}}</a>
{{- range $i, $v := .TreeNames -}}
<span class="breadcrumb-divider">/</span>
{{- if eq $i $treeNameIdxLast -}}
<span class="active section" title="{{$v}}">{{$v}}</span>
<button class="btn interact-fg tw-mx-1" data-clipboard-text="{{$.TreePath}}" data-tooltip-content="{{ctx.Locale.Tr "copy_path"}}">{{svg "octicon-copy" 14}}</button>
{{- else -}}
{{$p := index $.Paths $i}}<span class="section"><a href="{{$.BranchLink}}/{{PathEscapeSegments $p}}" title="{{$v}}">{{$v}}</a></span>
{{- end -}}
{{- end -}}
</span>
{{end}}
</div>
<div class="repo-button-row-right">
<!-- Only show clone panel in repository home page -->
{{if $isTreePathRoot}}
{{template "repo/clone_panel" .}}
{{end}}
{{if and (not $isTreePathRoot) (not .IsViewFile) (not .IsBlame)}}{{/* IsViewDirectory (not home), TODO: split the templates, avoid using "if" tricks */}}
<a class="ui button" href="{{.RepoLink}}/commits/{{.RefTypeNameSubURL}}/{{.TreePath | PathEscapeSegments}}">
{{svg "octicon-history" 16 "tw-mr-2"}}{{ctx.Locale.Tr "repo.file_history"}}
</a>
{{end}}
</div>
</div>
{{if .IsViewFile}}
{{template "repo/view_file" .}}
{{else if .IsBlame}}
{{template "repo/blame" .}}
{{else}}{{/* IsViewDirectory */}}
{{if $isTreePathRoot}}
{{template "repo/code/upstream_diverging_info" .}}
{{end}}
{{template "repo/view_list" .}}
{{if and .ReadmeExist (or .IsMarkup .IsPlainText)}}
{{template "repo/view_file" .}}
{{end}}
{{end}}

View File

@@ -0,0 +1,61 @@
{{/* use grid layout, still use the old ID because there are many other CSS styles depending on this ID */}}
<div id="repo-files-table" {{if .HasFilesWithoutLatestCommit}}hx-indicator="#repo-files-table .repo-file-cell.message" hx-trigger="load" hx-swap="morph" hx-post="{{.LastCommitLoaderURL}}"{{end}}>
<div class="repo-file-line repo-file-last-commit">
{{template "repo/latest_commit" .}}
<div>{{if and .LatestCommit .LatestCommit.Committer}}{{DateUtils.TimeSince .LatestCommit.Committer.When}}{{end}}</div>
</div>
{{$.FileIconPoolHTML}}
{{if .HasParentPath}}
<a class="repo-file-line parent-link silenced" href="{{.BranchLink}}{{if .ParentPath}}{{PathEscapeSegments .ParentPath}}{{end}}">
{{index $.FileIcons ".."}} ..
</a>
{{end}}
{{range $item := .Files}}
<div class="repo-file-item">
{{$entry := $item.Entry}}
{{$commit := $item.Commit}}
{{$submoduleFile := $item.SubmoduleFile}}
<div class="repo-file-cell name muted-links {{if not $commit}}notready{{end}}">
{{index $.FileIcons $entry.Name}}
{{if $entry.IsSubModule}}
{{$submoduleLink := $submoduleFile.SubmoduleWebLinkTree ctx}}
{{if $submoduleLink}}
<a class="entry-name" href="{{$submoduleLink.RepoWebLink}}" title="{{$entry.Name}}">{{$entry.Name}}</a>
@ <a class="text primary" href="{{$submoduleLink.CommitWebLink}}">{{ShortSha $submoduleFile.RefID}}</a>
{{else}}
<span class="entry-name" title="{{$entry.Name}}">{{$entry.Name}}</span>
@ {{ShortSha $submoduleFile.RefID}}
{{end}}
{{else}}
{{if $entry.IsDir}}
{{$subJumpablePathName := $entry.GetSubJumpablePathName}}
<a class="entry-name" href="{{$.TreeLink}}/{{PathEscapeSegments $subJumpablePathName}}" title="{{$subJumpablePathName}}">
{{$subJumpablePathFields := StringUtils.Split $subJumpablePathName "/"}}
{{$subJumpablePathFieldLast := (Eval (len $subJumpablePathFields) "-" 1)}}
{{if eq $subJumpablePathFieldLast 0}}
{{$subJumpablePathName}}
{{else}}
{{$subJumpablePathPrefixes := slice $subJumpablePathFields 0 $subJumpablePathFieldLast}}
<span class="text light-2">{{StringUtils.Join $subJumpablePathPrefixes "/"}}</span>/{{index $subJumpablePathFields $subJumpablePathFieldLast}}
{{end}}
</a>
{{else}}
<a class="entry-name" href="{{$.TreeLink}}/{{PathEscapeSegments $entry.Name}}" title="{{$entry.Name}}">{{$entry.Name}}</a>
{{if $entry.IsLink}}
<a class="entry-symbol-link flex-text-inline" data-tooltip-content title="{{ctx.Locale.Tr "repo.find_file.follow_symlink"}}" href="{{$.TreeLink}}/{{PathEscapeSegments $entry.Name}}?follow_symlink=1">{{svg "octicon-link" 12}}</a>
{{end}}
{{end}}
{{end}}
</div>
<div class="repo-file-cell message loading-icon-2px">
{{if $commit}}
{{$commitLink := printf "%s/commit/%s" $.RepoLink (PathEscape $commit.ID.String)}}
{{ctx.RenderUtils.RenderCommitMessageLinkSubject $commit.Message $commitLink $.Repository}}
{{else}}
{{/* will be loaded again by LastCommitLoaderURL */}}
{{end}}
</div>
<div class="repo-file-cell age">{{if $commit}}{{DateUtils.TimeSince $commit.Committer.When}}{{end}}</div>
</div>
{{end}}
</div>

View File

@@ -0,0 +1,4 @@
[github-theme]
verifed=已验证
partially_verifed=部分验证
unverifed=未验证

View File

@@ -1,23 +1,28 @@
{ {
"name": "gitea-github-theme", "name": "gitea-github-theme",
"version": "1.24.4", "version": "1.25.4.rc",
"description": "A theme to make Gitea look and feel like GitHub",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite build --mode dev", "dev": "vite build --mode dev",
"build": "tsc -b && vite build", "build": "tsgo -b && vite build",
"lint": "eslint .", "lint": "eslint .",
"format": "prettier --write .", "format": "prettier --write .",
"commit": "npm run lint && npm run format && npm run build", "commit": "npm run lint && npm run format && npm run build",
"version": "node scripts/version.cjs" "version": "node scripts/version.cjs",
"tr": "node scripts/translate.cjs",
"tmpl": "node scripts/update_template.cjs",
"release": "npm run build && npm run tr",
"install:clean": "npm cache clean --force && rm -rf node_modules package-lock.json && npm install",
"install:vite8": "npm install --force"
}, },
"devDependencies": { "devDependencies": {
"@babel/preset-typescript": "^7.27.1", "@babel/preset-typescript": "^7.28.4",
"@eslint/js": "^9.29.0", "@eslint/js": "^9.29.0",
"@linaria/core": "^6.3.0", "@linaria/core": "^6.3.0",
"@types/node": "^24.0.3", "@types/node": "^24.0.3",
"@vanilla-extract/css": "^1.17.4", "@typescript/native-preview": "^7.0.0-dev.20251203.1",
"@vanilla-extract/vite-plugin": "^5.0.6", "@vanilla-extract/css": "^1.17.5",
"@vanilla-extract/vite-plugin": "^5.1.3",
"@wyw-in-js/babel-preset": "^0.7.0", "@wyw-in-js/babel-preset": "^0.7.0",
"@wyw-in-js/vite": "^0.7.0", "@wyw-in-js/vite": "^0.7.0",
"dotenv": "^17.0.0", "dotenv": "^17.0.0",
@@ -28,11 +33,9 @@
"prettier": "3.5.3", "prettier": "3.5.3",
"prettier-plugin-organize-imports": "^4.1.0", "prettier-plugin-organize-imports": "^4.1.0",
"sass-embedded": "^1.89.2", "sass-embedded": "^1.89.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.34.1", "typescript-eslint": "^8.34.1",
"typescript-plugin-css-modules": "^5.1.0", "typescript-plugin-css-modules": "^5.1.0",
"typescript-styled-plugin": "^0.18.3", "vite": "^8.0.0-beta.0"
"vite": "^6.3.5"
}, },
"prettier": { "prettier": {
"printWidth": 120, "printWidth": 120,

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 260 KiB

BIN
screenshots/dashboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 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: 602 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: 201 KiB

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: 202 KiB

After

Width:  |  Height:  |  Size: 261 KiB

54
scripts/translate.cjs Normal file
View File

@@ -0,0 +1,54 @@
const fs = require("fs");
const path = require("path");
const child_process = require("child_process");
const dotenv = require("dotenv");
dotenv.config({ quiet: true });
const rootDir = path.join(__dirname, "..");
const pkgPath = path.join(rootDir, "package.json");
const pkg = JSON.parse(fs.readFileSync(pkgPath));
const githubSite = "https://raw.githubusercontent.com";
const giteaRepo = "go-gitea/gitea";
const githubBranchPath = "refs/heads/release";
const githubTagPath = "refs/tags";
const localePath = "options/locale";
const [major, minor, patch, tag = ""] = pkg.version.split(".");
console.log("Version:", pkg.version);
let versionPath = "";
if (tag.includes("rc") || patch.includes("latest")) {
versionPath = `${githubBranchPath}/v${major}.${minor}`;
} else {
versionPath = `${githubTagPath}/v${major}.${minor}.${patch}`;
}
const githubUrl = `${githubSite}/${giteaRepo}/${versionPath}/${localePath}`;
const locales = fs.readdirSync(path.join(rootDir, localePath)).filter(file => file.endsWith(".ini"));
(async () => {
for (const locale of locales) {
const localUrl = `${githubUrl}/${locale}`;
console.log("LocaleUrl:", localUrl);
const themeLocale = fs.readFileSync(path.join(rootDir, localePath, locale), "utf-8");
const response = await fetch(localUrl);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
let content = await response.text();
if (locale.includes("zh-CN")) {
content = content.replaceAll("工单", "议题").replaceAll("合并请求", "拉取请求");
}
fs.mkdirSync(path.join(rootDir, "dist", localePath), { recursive: true });
fs.writeFileSync(path.join(rootDir, "dist", localePath, locale), content + themeLocale);
}
if (process.env.SSH_SERVER && process.env.GITEA_PATH && process.env.SSH_USER) {
const cmd = `scp -r dist/options ${process.env.SSH_USER}@${process.env.SSH_SERVER}:${process.env.GITEA_PATH}`;
console.log("[translate] exec:", cmd);
child_process.execSync(cmd, { stdio: "inherit" });
}
})();

View File

@@ -0,0 +1,54 @@
const fs = require("fs");
const path = require("path");
const rootDir = path.join(__dirname, "..");
const pkgPath = path.join(rootDir, "package.json");
const pkg = JSON.parse(fs.readFileSync(pkgPath));
const githubSite = "https://raw.githubusercontent.com";
const giteaRepo = "go-gitea/gitea";
const githubTagPath = "refs/tags";
const tmplPath = "templates";
const localTmplPath = path.join(rootDir, "gitea", tmplPath);
const [major, minor, patch = ""] = pkg.version.split(".");
console.log("Version:", pkg.version);
const versionPath = `${githubTagPath}/v${major}.${minor}.${patch}`;
const githubUrl = `${githubSite}/${giteaRepo}/${versionPath}/${tmplPath}`;
// 递归读取所有子目录中的 .tmpl 文件
function readTmplFilesRecursively(dir) {
const results = [];
const files = fs.readdirSync(dir);
for (const file of files) {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
// 如果是目录,递归读取
results.push(...readTmplFilesRecursively(filePath));
} else if (file.endsWith(".tmpl")) {
// 如果是 .tmpl 文件,添加到结果中(相对于模板目录的相对路径)
const relativePath = path.relative(localTmplPath, filePath);
results.push(relativePath);
}
}
return results;
}
// 读取所有模板文件
const tmpls = readTmplFilesRecursively(localTmplPath);
(async () => {
for (const tmpl of tmpls) {
const tmplUrl = `${githubUrl}/${tmpl}`;
console.log("TmplUrl:", tmplUrl);
const response = await fetch(tmplUrl);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
let content = await response.text();
fs.writeFileSync(path.join(localTmplPath, tmpl), content);
}
})();

View File

@@ -1,36 +1,6 @@
import { prettylights2Chroma } from "./prettylights"; import { prettylights2Chroma, type prettylightsColor } from "./prettylights";
export const defaultDarkChroma = prettylights2Chroma({ export const lightPrettylights: 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({
syntax: { syntax: {
brackethighlighter: { angle: "#59636e", unmatched: "#82071e" }, brackethighlighter: { angle: "#59636e", unmatched: "#82071e" },
carriage: { return: { bg: "#cf222e", text: "#f6f8fa" } }, carriage: { return: { bg: "#cf222e", text: "#f6f8fa" } },
@@ -58,4 +28,37 @@ export const defaultLightChroma = prettylights2Chroma({
sublimelinterGutterMark: "#818b98", sublimelinterGutterMark: "#818b98",
variable: "#953800", 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);

View File

@@ -5,7 +5,7 @@ import { themeVars } from "src/types/vars";
import { defaultDarkChroma, defaultLightChroma } from "./chroma"; import { defaultDarkChroma, defaultLightChroma } from "./chroma";
import type { Theme } from "./theme"; import type { Theme } from "./theme";
type ThemeColor = { export type ThemeColor = {
/** 用于标识当前是否为暗色主题: `true` 暗色 `false` 亮色 */ /** 用于标识当前是否为暗色主题: `true` 暗色 `false` 亮色 */
isDarkTheme: boolean; isDarkTheme: boolean;
/** 主色调(强调色) */ /** 主色调(强调色) */
@@ -14,38 +14,41 @@ type ThemeColor = {
primaryContrast: string; primaryContrast: string;
/** 副色调(边框色) */ /** 副色调(边框色) */
secondary: string; secondary: string;
/** 色 */ /** 基础颜色 */
red: string; base: {
/** 色 */ /** 色 */
orange: string; red: string;
/** 色 */ /** 色 */
yellow: string; orange: string;
/** 黄绿色/橄榄色 */ /** 黄色 */
olive: string; yellow: string;
/** 绿色 */ /** 黄绿色/橄榄色 */
green: string; olive: string;
/** 绿色/青色(偏绿) */ /** 绿色 */
teal: string; green: string;
/** 蓝绿色/青色(偏) */ /** 蓝绿色/青色(偏绿) */
cyan: string; teal: string;
/** 蓝 */ /** 蓝绿色/青色(偏蓝) */
blue: string; cyan: string;
/** 蓝紫色/紫罗兰色 */ /** 蓝色 */
violet: string; blue: string;
/** 色 */ /** 蓝紫色/紫罗兰色 */
purple: string; violet: string;
/** 粉红色 */ /** 色 */
pink: string; purple: string;
/** 色 */ /** 粉红色 */
brown: string; pink: string;
/** 色 */ /** 色 */
black: string; brown: string;
/** 色 */ /** 色 */
grey: string; black: string;
/** 色 */ /** 色 */
gold: string; grey: string;
/** 色 */ /** 色 */
white: string; gold: string;
/** 白色 */
white: string;
};
/** Action 日志 */ /** Action 日志 */
console: Console; console: Console;
/** 提交代码对比 */ /** 提交代码对比 */
@@ -81,7 +84,7 @@ type ThemeColor = {
* github, * github,
* }) * })
*/ */
export function defineTheme(themeColor: ThemeColor, chroma: Chroma | null = null): Theme { export function defineTheme(themeColor: ThemeColor, chroma?: Chroma): Theme {
const brightDir = themeColor.isDarkTheme ? -1 : 1; const brightDir = themeColor.isDarkTheme ? -1 : 1;
const primary: Primary = { const primary: Primary = {
@@ -161,161 +164,187 @@ export function defineTheme(themeColor: ThemeColor, chroma: Chroma | null = null
const named: Named = { const named: Named = {
red: { red: {
self: themeColor.red, self: themeColor.base.red,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.red, 15) : scaleColorLight(themeColor.red, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.red, 15)
: scaleColorLight(themeColor.base.red, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.red, -10), num1: scaleColorLight(themeColor.base.red, -10),
num2: scaleColorLight(themeColor.red, -20), num2: scaleColorLight(themeColor.base.red, -20),
}, },
badge: { badge: {
self: themeColor.red, self: themeColor.base.red,
bg: rgba(themeColor.red, 0.1), bg: rgba(themeColor.base.red, 0.1),
hover: { hover: {
bg: rgba(themeColor.red, 0.3), bg: rgba(themeColor.base.red, 0.3),
}, },
}, },
}, },
orange: { orange: {
self: themeColor.orange, self: themeColor.base.orange,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.orange, 15) : scaleColorLight(themeColor.orange, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.orange, 15)
: scaleColorLight(themeColor.base.orange, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.orange, -10), num1: scaleColorLight(themeColor.base.orange, -10),
num2: scaleColorLight(themeColor.orange, -20), num2: scaleColorLight(themeColor.base.orange, -20),
}, },
badge: { badge: {
self: themeColor.orange, self: themeColor.base.orange,
bg: rgba(themeColor.orange, 0.1), bg: rgba(themeColor.base.orange, 0.1),
hover: { hover: {
bg: rgba(themeColor.orange, 0.3), bg: rgba(themeColor.base.orange, 0.3),
}, },
}, },
}, },
yellow: { yellow: {
self: themeColor.yellow, self: themeColor.base.yellow,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.yellow, 15) : scaleColorLight(themeColor.yellow, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.yellow, 15)
: scaleColorLight(themeColor.base.yellow, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.yellow, -10), num1: scaleColorLight(themeColor.base.yellow, -10),
num2: scaleColorLight(themeColor.yellow, -20), num2: scaleColorLight(themeColor.base.yellow, -20),
}, },
badge: { badge: {
self: themeColor.yellow, self: themeColor.base.yellow,
bg: rgba(themeColor.yellow, 0.1), bg: rgba(themeColor.base.yellow, 0.1),
hover: { hover: {
bg: rgba(themeColor.yellow, 0.3), bg: rgba(themeColor.base.yellow, 0.3),
}, },
}, },
}, },
olive: { olive: {
self: themeColor.olive, self: themeColor.base.olive,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.olive, 15) : scaleColorLight(themeColor.olive, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.olive, 15)
: scaleColorLight(themeColor.base.olive, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.olive, -10), num1: scaleColorLight(themeColor.base.olive, -10),
num2: scaleColorLight(themeColor.olive, -20), num2: scaleColorLight(themeColor.base.olive, -20),
}, },
}, },
green: { green: {
self: themeColor.green, self: themeColor.base.green,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.green, 15) : scaleColorLight(themeColor.green, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.green, 15)
: scaleColorLight(themeColor.base.green, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.green, -10), num1: scaleColorLight(themeColor.base.green, -10),
num2: scaleColorLight(themeColor.green, -20), num2: scaleColorLight(themeColor.base.green, -20),
}, },
badge: { badge: {
self: themeColor.green, self: themeColor.base.green,
bg: rgba(themeColor.green, 0.1), bg: rgba(themeColor.base.green, 0.1),
hover: { hover: {
bg: rgba(themeColor.green, 0.3), bg: rgba(themeColor.base.green, 0.3),
}, },
}, },
}, },
teal: { teal: {
self: themeColor.teal, self: themeColor.base.teal,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.teal, 15) : scaleColorLight(themeColor.teal, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.teal, 15)
: scaleColorLight(themeColor.base.teal, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.teal, -10), num1: scaleColorLight(themeColor.base.teal, -10),
num2: scaleColorLight(themeColor.teal, -20), num2: scaleColorLight(themeColor.base.teal, -20),
}, },
}, },
blue: { blue: {
self: themeColor.blue, self: themeColor.base.blue,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.blue, 15) : scaleColorLight(themeColor.blue, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.blue, 15)
: scaleColorLight(themeColor.base.blue, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.blue, -10), num1: scaleColorLight(themeColor.base.blue, -10),
num2: scaleColorLight(themeColor.blue, -20), num2: scaleColorLight(themeColor.base.blue, -20),
}, },
}, },
violet: { violet: {
self: themeColor.violet, self: themeColor.base.violet,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.violet, 15) : scaleColorLight(themeColor.violet, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.violet, 15)
: scaleColorLight(themeColor.base.violet, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.violet, -10), num1: scaleColorLight(themeColor.base.violet, -10),
num2: scaleColorLight(themeColor.violet, -20), num2: scaleColorLight(themeColor.base.violet, -20),
}, },
}, },
purple: { purple: {
self: themeColor.purple, self: themeColor.base.purple,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.purple, 15) : scaleColorLight(themeColor.purple, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.purple, 15)
: scaleColorLight(themeColor.base.purple, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.purple, -10), num1: scaleColorLight(themeColor.base.purple, -10),
num2: scaleColorLight(themeColor.purple, -20), num2: scaleColorLight(themeColor.base.purple, -20),
}, },
}, },
pink: { pink: {
self: themeColor.pink, self: themeColor.base.pink,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.pink, 15) : scaleColorLight(themeColor.pink, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.pink, 15)
: scaleColorLight(themeColor.base.pink, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.pink, -10), num1: scaleColorLight(themeColor.base.pink, -10),
num2: scaleColorLight(themeColor.pink, -20), num2: scaleColorLight(themeColor.base.pink, -20),
}, },
}, },
brown: { brown: {
self: themeColor.brown, self: themeColor.base.brown,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.brown, 15) : scaleColorLight(themeColor.brown, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.brown, 15)
: scaleColorLight(themeColor.base.brown, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.brown, -10), num1: scaleColorLight(themeColor.base.brown, -10),
num2: scaleColorLight(themeColor.brown, -20), num2: scaleColorLight(themeColor.base.brown, -20),
}, },
}, },
black: { black: {
self: themeColor.black, self: themeColor.base.black,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.black, 15) : scaleColorLight(themeColor.black, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.black, 15)
: scaleColorLight(themeColor.base.black, 25),
dark: { dark: {
num1: scaleColorLight(themeColor.black, -10), num1: scaleColorLight(themeColor.base.black, -10),
num2: scaleColorLight(themeColor.black, -20), num2: scaleColorLight(themeColor.base.black, -20),
}, },
}, },
grey: { grey: {
self: themeColor.grey, self: themeColor.base.grey,
light: themeColor.isDarkTheme ? scaleColorLight(themeColor.grey, 15) : scaleColorLight(themeColor.grey, 25), light: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.grey, 15)
: scaleColorLight(themeColor.base.grey, 25),
}, },
gold: themeColor.gold, gold: themeColor.base.gold,
white: themeColor.white, white: themeColor.base.white,
}; };
const message: Message = { const message: Message = {
error: { error: {
bg: { bg: {
self: rgba(themeColor.red, 0.1), self: rgba(themeColor.base.red, 0.1),
active: rgba(themeColor.red, 0.5), active: rgba(themeColor.base.red, 0.5),
hover: rgba(themeColor.red, 0.3), hover: rgba(themeColor.base.red, 0.3),
}, },
border: rgba(themeColor.red, 0.4), border: rgba(themeColor.base.red, 0.4),
text: saturate(0.2, themeColor.red), // 饱和度提高 text: saturate(0.2, themeColor.base.red), // 饱和度提高
}, },
success: { success: {
bg: rgba(themeColor.green, 0.1), bg: rgba(themeColor.base.green, 0.1),
border: rgba(themeColor.green, 0.4), border: rgba(themeColor.base.green, 0.4),
text: saturate(0.2, themeColor.green), text: saturate(0.2, themeColor.base.green),
}, },
warning: { warning: {
bg: rgba(themeColor.yellow, 0.1), bg: rgba(themeColor.base.yellow, 0.1),
border: rgba(themeColor.yellow, 0.4), border: rgba(themeColor.base.yellow, 0.4),
text: saturate(0.2, themeColor.yellow), text: saturate(0.2, themeColor.base.yellow),
}, },
info: { info: {
bg: rgba(themeColor.blue, 0.1), bg: rgba(themeColor.base.blue, 0.1),
border: rgba(themeColor.blue, 0.4), border: rgba(themeColor.base.blue, 0.4),
text: saturate(0.2, themeColor.blue), text: saturate(0.2, themeColor.base.blue),
}, },
}; };
@@ -326,7 +355,7 @@ export function defineTheme(themeColor: ThemeColor, chroma: Chroma | null = null
yellow: themeVars.color.yellow.self, yellow: themeVars.color.yellow.self,
blue: themeVars.color.blue.self, blue: themeVars.color.blue.self,
magenta: themeVars.color.pink.self, magenta: themeVars.color.pink.self,
cyan: themeColor.cyan, cyan: themeColor.base.cyan,
white: themeVars.color.console.fg.subtle, white: themeVars.color.console.fg.subtle,
bright: { bright: {
black: themeVars.color.black.light, black: themeVars.color.black.light,
@@ -335,7 +364,9 @@ export function defineTheme(themeColor: ThemeColor, chroma: Chroma | null = null
yellow: themeVars.color.yellow.light, yellow: themeVars.color.yellow.light,
blue: themeVars.color.blue.light, blue: themeVars.color.blue.light,
magenta: themeVars.color.pink.light, magenta: themeVars.color.pink.light,
cyan: themeColor.isDarkTheme ? scaleColorLight(themeColor.cyan, 10) : scaleColorLight(themeColor.cyan, 25), cyan: themeColor.isDarkTheme
? scaleColorLight(themeColor.base.cyan, 10)
: scaleColorLight(themeColor.base.cyan, 25),
white: themeVars.color.console.fg.self, white: themeVars.color.console.fg.self,
}, },
}; };

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

View File

@@ -1,14 +1,15 @@
import { saturate } from "polished"; import { saturate } from "polished";
import type { Console, Diff, Other } from "src"; import type { Console, Diff, Other } from "src";
import { scaleColorLight } from "src/functions"; import { scaleColorLight } from "src/functions";
import type { Chroma, Github } from "src/types"; import type { Github } from "src/types";
import { themeVars } from "src/types/vars"; import { themeVars } from "src/types/vars";
import { defineTheme } from "./color"; import { type ThemeColor } from "./color";
import type { Theme } from "./theme";
export type GithubColor = { export type GithubColor = {
isDarkTheme: boolean; isDarkTheme: boolean;
avatar: { bgColor: string; borderColor: string };
display: { display: {
blue: { fgColor: string };
brown: { fgColor: string }; brown: { fgColor: string };
cyan: { fgColor: string }; cyan: { fgColor: string };
indigo: { fgColor: string }; indigo: { fgColor: string };
@@ -37,12 +38,14 @@ export type GithubColor = {
black: string; black: string;
white: string; white: string;
muted: string; muted: string;
onEmphasis: string;
}; };
bgColor: { bgColor: {
accent: { emphasis: string; muted: string }; accent: { emphasis: string; muted: string };
attention: { muted: string }; attention: { emphasis: string; muted: string };
emphasis: string;
success: { emphasis: string; muted: string }; success: { emphasis: string; muted: string };
danger: { muted: string }; danger: { emphasis: string; muted: string };
done: { emphasis: string }; done: { emphasis: string };
default: string; default: string;
inset: string; inset: string;
@@ -59,15 +62,16 @@ export type GithubColor = {
translucent: string; translucent: string;
}; };
button: { button: {
primary: { fgColor: { rest: string }; bgColor: { hover: string } }; primary: { fgColor: { accent: string; rest: string }; bgColor: { rest: string; hover: string } };
danger: { fgColor: { rest: string; hover: string }; bgColor: { hover: string } }; danger: { fgColor: { rest: string; hover: string }; bgColor: { hover: string } };
star: { iconColor: string };
}; };
control: { control: {
bgColor: { active: string; hover: string; rest: string }; bgColor: { active: string; hover: string; rest: string };
transparent: { bgColor: { active: string; hover: string; selected: string } }; transparent: { bgColor: { active: string; hover: string; selected: string } };
}; };
shadow: { floating: { small: string } }; shadow: { floating: { small: string }; resting: { small: string } };
overlay: { backdrop: { bgColor: string } }; overlay: { backdrop: { bgColor: string }; bgColor: string };
underlineNav: { borderColor: { active: string } }; underlineNav: { borderColor: { active: string } };
contribution: { contribution: {
default: { default: {
@@ -77,7 +81,7 @@ export type GithubColor = {
}; };
}; };
export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | null = null): Theme { export function github2ThemeColor(githubColor: GithubColor): ThemeColor {
const console: Console = { const console: Console = {
fg: { fg: {
self: githubColor.fgColor.default, self: githubColor.fgColor.default,
@@ -88,7 +92,7 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
activeBg: githubColor.control.bgColor.active, activeBg: githubColor.control.bgColor.active,
hoverBg: githubColor.control.transparent.bgColor.hover, hoverBg: githubColor.control.transparent.bgColor.hover,
menu: { menu: {
bg: githubColor.bgColor.inset, bg: githubColor.overlay.bgColor,
border: githubColor.borderColor.muted, border: githubColor.borderColor.muted,
}, },
}; };
@@ -128,6 +132,7 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
}; };
const other: Other = { const other: Other = {
logo: themeVars.color.primary.self,
body: githubColor.bgColor.default, body: githubColor.bgColor.default,
box: { box: {
header: githubColor.bgColor.muted, header: githubColor.bgColor.muted,
@@ -166,7 +171,7 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
opaque: themeVars.color.box.header, opaque: themeVars.color.box.header,
}, },
active: githubColor.control.transparent.bgColor.selected, active: githubColor.control.transparent.bgColor.selected,
menu: githubColor.bgColor.inset, menu: githubColor.overlay.bgColor,
card: themeVars.color.body, card: themeVars.color.body,
markup: { markup: {
tableRow: githubColor.bgColor.muted, tableRow: githubColor.bgColor.muted,
@@ -193,15 +198,15 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
activeBg: githubColor.bgColor.accent.muted, activeBg: githubColor.bgColor.accent.muted,
}, },
tooltip: { tooltip: {
text: githubColor.fgColor.default, text: githubColor.fgColor.onEmphasis,
bg: githubColor.bgColor.default, bg: githubColor.bgColor.emphasis,
}, },
nav: { nav: {
bg: githubColor.bgColor.inset, bg: githubColor.bgColor.muted,
hoverBg: githubColor.control.transparent.bgColor.hover, hoverBg: githubColor.control.transparent.bgColor.hover,
text: themeVars.color.text.self, text: themeVars.color.text.self,
}, },
secondaryNavBg: themeVars.color.nav.bg, secondaryNavBg: themeVars.color.body,
label: { label: {
text: themeVars.color.text.self, text: themeVars.color.text.self,
bg: githubColor.bgColor.neutral.muted, bg: githubColor.bgColor.neutral.muted,
@@ -218,6 +223,10 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
}; };
const github: Github = { const github: Github = {
avatar: {
bgColor: githubColor.avatar.bgColor,
borderColor: githubColor.avatar.borderColor,
},
fgColor: { fgColor: {
accent: githubColor.fgColor.accent, accent: githubColor.fgColor.accent,
success: githubColor.fgColor.success, success: githubColor.fgColor.success,
@@ -231,6 +240,12 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
success: { success: {
emphasis: githubColor.bgColor.success.emphasis, emphasis: githubColor.bgColor.success.emphasis,
}, },
attention: {
emphasis: githubColor.bgColor.attention.emphasis,
},
danger: {
emphasis: githubColor.bgColor.danger.emphasis,
},
done: { done: {
emphasis: githubColor.bgColor.done.emphasis, emphasis: githubColor.bgColor.done.emphasis,
}, },
@@ -257,11 +272,14 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
}, },
primary: { primary: {
fgColor: { fgColor: {
accent: saturate(0.1, scaleColorLight(githubColor.fgColor.success, githubColor.isDarkTheme ? 10 : -10)), accent: saturate(
0.1,
scaleColorLight(githubColor.button.primary.fgColor.accent, githubColor.isDarkTheme ? 10 : -10)
),
rest: githubColor.button.primary.fgColor.rest, rest: githubColor.button.primary.fgColor.rest,
}, },
bgColor: { bgColor: {
rest: themeVars.github.bgColor.success.emphasis, rest: githubColor.button.primary.bgColor.rest,
hover: githubColor.button.primary.bgColor.hover, hover: githubColor.button.primary.bgColor.hover,
}, },
borderColor: { borderColor: {
@@ -282,6 +300,9 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
hover: githubColor.borderColor.translucent, hover: githubColor.borderColor.translucent,
}, },
}, },
star: {
iconColor: githubColor.button.star.iconColor,
},
}, },
control: { control: {
bgColor: { bgColor: {
@@ -297,6 +318,9 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
floating: { 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};`, 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: { underlineNav: {
borderColor: { borderColor: {
@@ -327,12 +351,12 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
}, },
}, },
}; };
return defineTheme( return {
{ isDarkTheme: githubColor.isDarkTheme,
isDarkTheme: githubColor.isDarkTheme, primary: githubColor.fgColor.accent,
primary: githubColor.fgColor.accent, primaryContrast: githubColor.fgColor.default,
primaryContrast: githubColor.fgColor.default, secondary: githubColor.borderColor.default,
secondary: githubColor.borderColor.default, base: {
red: githubColor.fgColor.danger, red: githubColor.fgColor.danger,
orange: githubColor.fgColor.severe, orange: githubColor.fgColor.severe,
yellow: githubColor.fgColor.attention, yellow: githubColor.fgColor.attention,
@@ -340,7 +364,7 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
green: githubColor.fgColor.success, green: githubColor.fgColor.success,
cyan: githubColor.display.cyan.fgColor, cyan: githubColor.display.cyan.fgColor,
teal: githubColor.display.teal.fgColor, teal: githubColor.display.teal.fgColor,
blue: githubColor.fgColor.accent, blue: githubColor.display.blue.fgColor,
violet: githubColor.display.indigo.fgColor, violet: githubColor.display.indigo.fgColor,
purple: githubColor.fgColor.done, purple: githubColor.fgColor.done,
pink: githubColor.fgColor.sponsors, pink: githubColor.fgColor.sponsors,
@@ -349,11 +373,10 @@ export function defineGithubTheme(githubColor: GithubColor, chroma: Chroma | nul
grey: githubColor.fgColor.neutral, grey: githubColor.fgColor.neutral,
gold: githubColor.display.lemon.fgColor, gold: githubColor.display.lemon.fgColor,
white: githubColor.fgColor.white, white: githubColor.fgColor.white,
console,
diff,
other,
github,
}, },
chroma console,
); diff,
other,
github,
};
} }

View File

@@ -73,7 +73,7 @@ export function prettylights2Chroma(prettylights: prettylightsColor): Chroma {
string: { string: {
self: prettylights.syntax.string, self: prettylights.syntax.string,
affix: prettylights.syntax.string, affix: prettylights.syntax.string,
backtick: prettylights.syntax.string, backtick: prettylights.syntax.constant,
char: prettylights.syntax.string, char: prettylights.syntax.string,
delimiter: prettylights.syntax.string, delimiter: prettylights.syntax.string,
doc: prettylights.syntax.comment, doc: prettylights.syntax.comment,

View File

@@ -1,9 +1,18 @@
import { createGlobalTheme, globalKeyframes, globalStyle } from "@vanilla-extract/css"; import { createGlobalTheme, globalStyle } from "@vanilla-extract/css";
import { otherThemeVars, themeVars } from "src/types/vars"; import fs from "node:fs";
import path from "node:path";
import { otherThemeVars, themeInfoVars, themeVars } from "src/types/vars";
import type { MapLeafNodes, WithOptionalLayer } from "./types"; import type { MapLeafNodes, WithOptionalLayer } from "./types";
export type Theme = WithOptionalLayer<MapLeafNodes<typeof themeVars, string>>; export type Theme = WithOptionalLayer<MapLeafNodes<typeof themeVars, string>>;
export const overlayAppear = "overlay-appear";
export const animation = {
animation: overlayAppear,
animationDuration: "80ms",
animationFillMode: "forwards",
animationTimingFunction: "ease-in",
};
export const overlayAppearDown = "overlay-appear-down"; 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 animationDown = `200ms cubic-bezier(0.33, 1, 0.68, 1) 0s 1 normal none running ${overlayAppearDown}`;
export const overlayAppearUp = "overlay-appear-up"; export const overlayAppearUp = "overlay-appear-up";
@@ -32,11 +41,19 @@ const emoji = `
.emoji[aria-label="musical notes"] .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 { export function createTheme(theme: Theme): void {
const isDarkTheme: boolean = JSON.parse(theme.isDarkTheme); const isDarkTheme: boolean = JSON.parse(theme.isDarkTheme);
if (isDarkTheme) { createGlobalTheme(":root", themeInfoVars, { version });
globalStyle(emoji, { filter: "invert(100%) hue-rotate(180deg)" });
}
createGlobalTheme(":root", themeVars, theme); createGlobalTheme(":root", themeVars, theme);
createGlobalTheme(":root", otherThemeVars, { createGlobalTheme(":root", otherThemeVars, {
border: { radius: "6px" }, border: { radius: "6px" },
@@ -53,12 +70,5 @@ export function createTheme(theme: Theme): void {
accentColor: themeVars.color.accent, accentColor: themeVars.color.accent,
colorScheme: isDarkTheme ? "dark" : "light", colorScheme: isDarkTheme ? "dark" : "light",
}); });
globalKeyframes(overlayAppearDown, { if (isDarkTheme) globalStyle(emoji, { filter: "invert(100%) hue-rotate(180deg)" });
"0%": { opacity: 0, transform: "translateY(-8px)" },
"100%": { opacity: 1, transform: "translateY(0)" },
});
globalKeyframes(overlayAppearUp, {
"0%": { opacity: 0, transform: "translateY(8px)" },
"100%": { opacity: 1, transform: "translateY(0)" },
});
} }

View File

@@ -50,6 +50,11 @@ export function themeInput(outDir: string, themeDir: string, mode: string): { [k
return input; 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-"; const prefix = "theme-github-";
/** /**
@@ -82,23 +87,28 @@ export function themePlugin(): Plugin {
const fileName = `${prefix}${value.fileName}`; const fileName = `${prefix}${value.fileName}`;
const originalFileName = value.originalFileNames.pop(); const originalFileName = value.originalFileNames.pop();
const type = value.type; const type = value.type;
const source = `${styles}${value.source.toString()}`; // 合并样式文件和主题信息
const meta = giteaThemeMetaInfo(key.split(".")[0].split("-"));
const source = `${meta}${value.source.toString()}${styles}`;
// 添加主题到输出 // 添加主题到输出
this.emitFile({ name, fileName, source, type, originalFileName }); this.emitFile({ name, fileName, source, type, originalFileName });
// 自动颜色主题 // 自动颜色主题
const isDark = key.endsWith("dark.css"); const isDark = key.endsWith("dark.css");
const darkName = key.replace("light.css", "dark.css"); const darkName = key.replace("light", "dark");
const lightName = key.replace("dark.css", "light.css"); const lightName = darkName.replace("dark", "light");
const autoName = `${prefix}${key.replace("dark.css", "auto.css").replace("light.css", "auto.css")}`;
const findTheme = isDark ? lightName : darkName; const findTheme = isDark ? lightName : darkName;
if (findTheme in bundle) { if (findTheme in bundle) {
const autoName = `${prefix}${darkName.replace("dark", "auto")}`;
const lightContent = `@import "./${prefix}${lightName}" (prefers-color-scheme: light);`; const lightContent = `@import "./${prefix}${lightName}" (prefers-color-scheme: light);`;
const darkContent = `@import "./${prefix}${darkName}" (prefers-color-scheme: dark);`; 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({ this.emitFile({
name: autoName, name: autoName,
fileName: autoName, fileName: autoName,
type: "asset", type: "asset",
source: `${lightContent}\n${darkContent}`, source: `${lightContent}\n${darkContent}\n${metaInfo}`,
}); });
} }
// 删除原始的样式文件, 自动颜色主题因为删除, 永远不会生成两次 // 删除原始的样式文件, 自动颜色主题因为删除, 永远不会生成两次
@@ -111,17 +121,28 @@ export function themePlugin(): Plugin {
const server = process.env.SSH_SERVER; const server = process.env.SSH_SERVER;
const user = process.env.SSH_USER || "root"; const user = process.env.SSH_USER || "root";
const theme_path = process.env.GITEA_THEME_PATH; const theme_path = process.env.GITEA_THEME_PATH;
if (server && theme_path) { const gitea_path = process.env.GITEA_PATH;
const cmd = `scp dist/${prefix}*.css ${user}@${server}:${theme_path}`; if (server) {
console.log("[themePlugin] exec:", cmd);
try { try {
execSync(cmd, { stdio: "inherit" }); if (theme_path) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars const cmd = `scp dist/${prefix}*.css ${user}@${server}:${theme_path}`;
console.log("[themePlugin] exec:", cmd);
execSync(cmd, { stdio: "inherit" });
} else {
console.log("[themePlugin] no GITEA_THEME_PATH, skip upload");
}
if (gitea_path) {
const cmd = `scp -r templates ${user}@${server}:${gitea_path}`;
console.log("[themePlugin] exec:", cmd);
execSync(cmd, { stdio: "inherit" });
} else {
console.log("[themePlugin] no GITEA_TMPL_PATH, skip upload");
}
} catch (_) { } catch (_) {
// continue regardless of error // continue regardless of error
} }
} else { } else {
console.log("[themePlugin] no SSH_SERVER or GITEA_THEME_PATH, skip upload"); console.log("[themePlugin] no SSH_SERVER, skip upload");
} }
console.log("[themePlugin] exec end."); console.log("[themePlugin] exec end.");
}, },

View File

@@ -1,4 +1,5 @@
export { defineTheme } from "./core/color"; export { defaultDarkChroma, defaultLightChroma } from "./core/chroma";
export { defineTheme, type ThemeColor } from "./core/color";
export type { Theme } from "./core/theme"; export type { Theme } from "./core/theme";
export type { Chroma, Console, Diff, Github, Other } from "./types"; export type { Ansi, Chroma, Console, Diff, Github, Message, Named, Other, Primary, Secondary } from "./types";
export { otherThemeVars, themeVars } from "./types/vars"; export { otherThemeVars, themeVars } from "./types/vars";

View File

@@ -1,4 +1,10 @@
export const github = { export const github = {
avatar: {
/** 头像的背景颜色 */
bgColor: null,
/** 头像的边框颜色 */
borderColor: null,
},
/** 用于 color 属性的颜色 */ /** 用于 color 属性的颜色 */
fgColor: { fgColor: {
/** 强调色 /** 强调色
@@ -25,7 +31,6 @@ export const github = {
accent: { accent: {
/** 强调色 /** 强调色
* @diff 折叠/展开按钮的悬停颜色 * @diff 折叠/展开按钮的悬停颜色
* @actions `actionViewLeft` 左侧子作业激活伪元素颜色
* @release `releaseTagMenu` 顶部栏左侧按钮激活背景色 * @release `releaseTagMenu` 顶部栏左侧按钮激活背景色
* @navbar `navbarRight` 头像管理员标识背景颜色 * @navbar `navbarRight` 头像管理员标识背景颜色
* @dropdown `dropdown` emoji 的悬停背景色 * @dropdown `dropdown` emoji 的悬停背景色
@@ -37,6 +42,7 @@ export const github = {
* @repo `repoTopic` 仓库主题标签背景颜色 * @repo `repoTopic` 仓库主题标签背景颜色
* @actions `actions` 分支标签按钮背景颜色 * @actions `actions` 分支标签按钮背景颜色
* @actions `actionViewHeader` 分支标签按钮背景颜色 * @actions `actionViewHeader` 分支标签按钮背景颜色
* @notification `notification` 通知列表悬停时的背景颜色
*/ */
muted: null, muted: null,
}, },
@@ -47,9 +53,22 @@ export const github = {
*/ */
emphasis: null, emphasis: null,
}, },
attention: {
/** 注意的背景颜色
* @issue `prMerge` 头像颜色
*/
emphasis: null,
},
danger: {
/** 危险的背景颜色
* @issue `prMerge` 头像颜色
*/
emphasis: null,
},
done: { done: {
/** 完成的背景颜色 /** 完成的背景颜色
* @issue `babel` 工单已关闭图标背景颜色 * @issue `babel` 工单已关闭图标背景颜色
* @issue `prMerge` 头像颜色
*/ */
emphasis: null, emphasis: null,
}, },
@@ -60,8 +79,10 @@ export const github = {
* @input `input` 输入框被选中时的边框颜色 * @input `input` 输入框被选中时的边框颜色
* @clone `clone` 克隆地址框被选中时的边框颜色 * @clone `clone` 克隆地址框被选中时的边框颜色
* @issue `comment` 评论框被选中时的边框颜色 * @issue `comment` 评论框被选中时的边框颜色
* @actions `actionViewLeft` 左侧子作业激活伪元素颜色
* @menu `verticalMenu` 垂直菜单项激活时左侧的伪元素颜色 * @menu `verticalMenu` 垂直菜单项激活时左侧的伪元素颜色
* @dropdown `selectionDropdown` 选择输入框的内部边框颜色 * @dropdown `selectionDropdown` 选择输入框的内部边框颜色
* @notification `notification` 通知列表悬停时的左边框颜色
*/ */
emphasis: null, emphasis: null,
}, },
@@ -158,6 +179,10 @@ export const github = {
hover: null, hover: null,
}, },
}, },
star: {
/** 已标星的星星颜色 */
iconColor: null,
},
}, },
control: { control: {
bgColor: { bgColor: {
@@ -174,12 +199,15 @@ export const github = {
* @dropdown `dropdown` 下拉框子项的悬停背景颜色 * @dropdown `dropdown` 下拉框子项的悬停背景颜色
* @menu `verticalMenu` 垂直菜单项的悬停背景颜色 * @menu `verticalMenu` 垂直菜单项的悬停背景颜色
* @menu `menu` 菜单项的悬停背景颜色 * @menu `menu` 菜单项的悬停背景颜色
* @menu `secondaryMenu` 二级菜单按钮的悬停背景颜色
* @repo `repoHeader` 仓库标题的悬停背景颜色 * @repo `repoHeader` 仓库标题的悬停背景颜色
* @commit `commit` 提交信息的 Action 按钮的悬停背景颜色 * @commit `commit` 提交信息的 Action 按钮的悬停背景颜色
* @filelist `repoFiles` README 栏的按钮的悬停背景颜色 * @filelist `repoFiles` README 栏的按钮的悬停背景颜色
* @issue `issueSidebar` 操作按钮的悬停背景颜色 * @issue `issueSidebar` 操作按钮的悬停背景颜色
* @issue `issueList` 头部菜单左侧开启关闭菜单的悬停背景颜色 * @issue `issueList` 头部菜单左侧开启关闭菜单的悬停背景颜色
* @dashboard `dashboard` 仓库列表项目的悬停背景颜色 * @dashboard `dashboard` 仓库列表项目的悬停背景颜色
* @notification `notification` 通知列表的按钮悬停背景颜色
* @actions `actions` 列表页运行信息的三点操作按钮悬停背景颜色
*/ */
hover: null, hover: null,
}, },
@@ -190,6 +218,17 @@ export const github = {
/** 悬浮阴影 /** 悬浮阴影
* @tippy `tippyBox` 悬浮框阴影 * @tippy `tippyBox` 悬浮框阴影
* @dropdown `dropdown` 下拉框阴影 * @dropdown `dropdown` 下拉框阴影
* @dashboard `dashboard` 仓库/组织切换按钮和列表边框和阴影
* @heatmap `heatmap` 热力图阴影
* @heatmap `activity` 动态活动阴影
*/
small: null,
},
resting: {
/** 静止阴影
* @button `primaryStyle` 主色调按钮阴影
* @button `redButton` 红色按钮悬浮阴影
* @setting `button` 红色按钮阴影
*/ */
small: null, small: null,
}, },

View File

@@ -8,6 +8,8 @@ export const otherAuto = {
}; };
export const other = { export const other = {
/** 未登录时的介绍首页的 SVG 和链接文字颜色 */
logo: null,
/** 主要背景色 */ /** 主要背景色 */
body: null, body: null,
/** 页面底部状态栏背景色 */ /** 页面底部状态栏背景色 */
@@ -114,7 +116,7 @@ export const other = {
/** 点击后颜色 */ /** 点击后颜色 */
activeBg: "color-reaction-active-bg", activeBg: "color-reaction-active-bg",
}, },
/** 不知道是干啥的 */ /** 鼠标悬浮时的提示文本, 比如提交的具体时间, 任务状态等 */
tooltip: { tooltip: {
text: null, text: null,
bg: null, bg: null,

View File

@@ -33,14 +33,21 @@ const vars = {
const otherVars = { border: { radius: null }, color: { ...color.otherAuto } }; const otherVars = { border: { radius: null }, color: { ...color.otherAuto } };
const customVars = { const customVars = {
branchMenuWidth: "branch-menu-width",
cloneMenuWidth: "clone-menu-width", cloneMenuWidth: "clone-menu-width",
userMenuWidth: "user-menu-width",
explore: { repolistColumns: "explore-repolist-columns", userlistColumns: "explore-userlist-columns" }, explore: { repolistColumns: "explore-repolist-columns", userlistColumns: "explore-userlist-columns" },
userRepolistColumns: "user-repolist-columns", userRepolistColumns: "user-repolist-columns",
org: { repolistColumns: "org-repolist-columns", userlistColumns: "org-userlist-columns" }, org: { repolistColumns: "org-repolist-columns", userlistColumns: "org-userlist-columns" },
}; };
const themeInfo = {
version: null,
};
export const themeVars = createGlobalThemeContract(vars, varMapper()); export const themeVars = createGlobalThemeContract(vars, varMapper());
export const otherThemeVars = createGlobalThemeContract(otherVars, varMapper()); export const otherThemeVars = createGlobalThemeContract(otherVars, varMapper());
export const customThemeVars = createGlobalThemeContract(customVars, varMapper("custom")); export const customThemeVars = createGlobalThemeContract(customVars, varMapper("custom"));
export const themeInfoVars = createGlobalThemeContract(themeInfo, varMapper("theme"));
export { css } from "@linaria/core"; export { css } from "@linaria/core";

View File

@@ -27,7 +27,7 @@ export const actions = css`
margin-bottom: 24px; margin-bottom: 24px;
margin-left: 2px; margin-left: 2px;
} }
// 工作流列表标题栏菜单
.ui.secondary.menu { .ui.secondary.menu {
background-color: ${themeVars.color.box.header}; background-color: ${themeVars.color.box.header};
border: 1px solid ${themeVars.color.light.border}; border: 1px solid ${themeVars.color.light.border};
@@ -36,6 +36,9 @@ export const actions = css`
border-top-right-radius: ${otherThemeVars.border.radius}; border-top-right-radius: ${otherThemeVars.border.radius};
padding: 16px; padding: 16px;
margin-bottom: 0; margin-bottom: 0;
> .ui.dropdown {
color: ${themeVars.color.text.light.num1};
}
} }
.ui.info.message { .ui.info.message {
@@ -58,8 +61,9 @@ export const actions = css`
.run-list-ref { .run-list-ref {
background-color: ${themeVars.github.bgColor.accent.muted}; background-color: ${themeVars.github.bgColor.accent.muted};
color: ${themeVars.github.fgColor.accent}; color: ${themeVars.github.fgColor.accent};
font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace); font-family: var(--fonts-monospace);
font-weight: 400; font-weight: 400;
padding: 0px 6px;
&:hover { &:hover {
background-color: ${themeVars.github.bgColor.accent.muted}; background-color: ${themeVars.github.bgColor.accent.muted};
color: ${themeVars.github.fgColor.accent}; color: ${themeVars.github.fgColor.accent};
@@ -73,22 +77,27 @@ export const actions = css`
.flex-item { .flex-item {
padding: 16px; padding: 16px;
line-height: 18px;
.flex-item-leading { .flex-item-leading {
align-self: flex-start; align-self: flex-start;
margin-top: 2px; margin-top: 2px;
} }
.flex-item-main { .flex-item-main {
gap: 0.5rem; gap: 0.5rem;
} }
.flex-item-trailing { .flex-item-trailing {
justify-content: space-between;
> .ui.label { > .ui.label {
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
margin-left: 32px; }
> .ui.dropdown.jump {
border-radius: ${otherThemeVars.border.radius};
color: ${themeVars.color.text.light.num1};
&:hover {
background-color: ${themeVars.github.control.transparent.bgColor.hover};
}
.menu > .item:hover {
color: ${themeVars.color.text.self} !important;
}
} }
} }
} }
@@ -130,13 +139,21 @@ export const runWorkflow = css`
export const actionViewHeader = css` export const actionViewHeader = css`
.action-view-header { .action-view-header {
.action-commit-summary { .action-commit-summary {
a:hover {
text-decoration: inherit;
}
// 提前哈希
> a.muted:first-of-type {
text-decoration: underline;
}
// 分支标签按钮 // 分支标签按钮
.ui.label { .ui.ui.ui.label {
background-color: ${themeVars.github.bgColor.accent.muted}; background-color: ${themeVars.github.bgColor.accent.muted};
border-radius: ${otherThemeVars.border.radius};
color: ${themeVars.github.fgColor.accent}; color: ${themeVars.github.fgColor.accent};
font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace);
font-weight: 400;
> a { > a {
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
font-weight: 400;
opacity: 1; opacity: 1;
} }
} }
@@ -146,10 +163,10 @@ export const actionViewHeader = css`
// 工作流左侧作业列表 // 工作流左侧作业列表
export const actionViewLeft = css` export const actionViewLeft = css`
.action-view-left { .action-view-left.action-view-left.action-view-left {
margin-right: 28px; margin-right: 28px;
border-top: 1px solid ${themeVars.color.console.border}; border-top: 1px solid ${themeVars.color.console.border};
max-width: 22vw;
&:before { &:before {
content: "Jobs"; content: "Jobs";
color: ${themeVars.color.console.fg.subtle}; color: ${themeVars.color.console.fg.subtle};
@@ -161,33 +178,54 @@ export const actionViewLeft = css`
top: -8px; top: -8px;
left: 15px; left: 15px;
} }
.job-group-section { .job-group-section {
padding-right: 8px; padding-right: 8px;
padding-bottom: 8px; padding-bottom: 8px;
border-bottom: 1px solid ${themeVars.color.console.border}; border-bottom: 1px solid ${themeVars.color.console.border};
.job-brief-list {
.job-brief-item { gap: 4px;
border-radius: ${otherThemeVars.border.radius} !important; // 双重确保覆盖原始样式
padding: 8px; .job-brief-item.job-brief-item {
position: relative; border-radius: ${otherThemeVars.border.radius} !important;
margin-left: 0.5rem; padding: 8px;
position: relative;
&.selected { margin-left: 0.5rem;
&:hover { &:hover {
background-color: ${themeVars.color.console.hoverBg}; background-color: ${themeVars.color.console.hoverBg};
} }
&.selected {
&:after { &:after {
overflow: visible; overflow: visible;
background: ${themeVars.github.bgColor.accent.emphasis}; background: ${themeVars.github.borderColor.accent.emphasis};
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
content: ""; content: "";
height: 24px; height: 24px;
left: calc(0.5rem * -1); left: calc(0.5rem * -1);
position: absolute; position: absolute;
top: calc(50% - 12px); top: calc(50% - 12px);
width: 4px; width: 4px;
}
}
.job-brief-item-right {
svg.job-brief-rerun {
display: none;
color: ${themeVars.color.console.fg.subtle};
&:hover {
color: ${themeVars.color.text.self};
}
}
.step-summary-duration {
color: ${themeVars.color.console.fg.subtle};
font-family: var(--fonts-monospace);
font-size: 12px;
}
}
&:hover {
.job-brief-item-right {
svg.job-brief-rerun {
display: inline-block;
}
}
} }
} }
} }
@@ -200,62 +238,83 @@ export const actionViewRight = css`
.action-view-right { .action-view-right {
/* 提前加载高度和滚动条 */ /* 提前加载高度和滚动条 */
min-height: calc(100vh - 245px); min-height: calc(100vh - 245px);
// 作业详情页标题
.job-info-header { .job-info-header {
padding: 16px 12px 16px 24px; padding: 16px 12px 16px 24px !important;
height: 80px; height: 80px !important;
.job-info-header-left {
.job-info-header-title { .job-info-header-title {
color: ${themeVars.github.fgColor.accent}; color: ${themeVars.github.fgColor.accent} !important;
}
.job-info-header-detail {
margin-top: 8px;
}
} }
.job-info-header-right {
.job-info-header-detail { .ui.dropdown {
margin-top: 8px; > .button {
border: unset;
padding: 7px !important;
}
.menu > .item > i.icon {
margin-right: 2px;
}
}
} }
} }
.job-step-container { .job-step-container {
// 步骤标题 padding: 8px;
.job-step-summary { .job-step-section {
color: ${themeVars.color.console.fg.subtle}; margin: 0 4px 4px;
padding: 8px 10px; // 步骤标题, 双重确保覆盖原始样式
.job-step-summary.job-step-summary {
&.selected {
// 滚动时固定在顶部的高度与 job-info-header 高度相同
top: 80px;
}
&.step-expandable:hover {
color: ${themeVars.color.console.fg.subtle}; color: ${themeVars.color.console.fg.subtle};
} padding: 8px !important;
height: 36px;
.tw-mr-2:not(.svg) svg.svg { &.selected {
margin: 1.5px 6px 0px 2px; // 滚动时固定在顶部的高度与 job-info-header 高度相同
} top: 80px;
/* 绿色步骤状态改为白色 */ }
svg.svg.text.green {
color: ${themeVars.color.console.fg.subtle} !important;
}
&.selected { &.step-expandable:hover {
/* 不被 hover 效果影响 */ color: ${themeVars.color.console.fg.subtle};
color: ${themeVars.color.console.fg.self} !important; }
background-color: ${themeVars.color.console.activeBg} !important;
.tw-mr-2:not(.svg) svg.svg {
margin: 1.5px 6px 0px 2px;
}
/* 绿色步骤状态改为白色 */
svg.svg.text.green { svg.svg.text.green {
color: ${themeVars.color.console.fg.subtle} !important;
}
&.selected {
/* 不被 hover 效果影响 */
color: ${themeVars.color.console.fg.self} !important; color: ${themeVars.color.console.fg.self} !important;
background-color: ${themeVars.color.console.activeBg} !important;
svg.svg.text.green {
color: ${themeVars.color.console.fg.self} !important;
}
}
// 步骤耗时
.step-summary-duration {
font-size: 12px;
font-family: var(--fonts-monospace);
} }
} }
} // 步骤日志
// 步骤日志 .job-step-logs {
.job-step-logs { animation: ${animationDown};
animation: ${animationDown}; /* 日志字体颜色白色 */
/* 日志字体颜色白色 */ .job-log-line {
.job-log-line { color: ${themeVars.color.console.fg.self};
color: ${themeVars.color.console.fg.self}; /* 被 hover 时覆盖 ANSI 颜色 */
/* 被 hover 时覆盖 ANSI 颜色 */ .log-msg:hover * {
.log-msg:hover * { color: ${themeVars.color.console.fg.self} !important;
color: ${themeVars.color.console.fg.self} !important; }
} }
} }
} }

View File

@@ -92,7 +92,7 @@ export const clone = css`
.item { .item {
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
padding: 6px 8px; padding: 6px 8px;
line-height: 1.5; height: 32px;
margin: 0; margin: 0;
svg { svg {
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};

View File

@@ -7,6 +7,9 @@ export const commit = css`
#commits-table.ui.basic.striped.table tbody.commit-list { #commits-table.ui.basic.striped.table tbody.commit-list {
// 作者 // 作者
.author { .author {
img.ui.avatar {
border-radius: 9999px;
}
// 作者名称 // 作者名称
.author-wrapper { .author-wrapper {
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
@@ -26,29 +29,36 @@ export const commit = css`
.message { .message {
// tag 标签 // tag 标签
a.ui.basic.primary.label { a.ui.basic.primary.label {
border-radius: 25px; border-radius: 9999px;
border-width: 1.5px; border-width: 1.5px;
padding: 5px 8px !important; padding: 3px 8px !important;
} }
} }
// 提交信息右侧 // 提交信息右侧
.tw-text-right { .tw-text-right {
// 时间标签
relative-time, relative-time,
// 复制 SHA 按钮 svg {
.btn.copy-commit-id,
// 查看提交路径按钮
.btn.view-commit-path {
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
} }
} }
// 整行悬停色 tr {
tr:hover { // 整行悬停色
background-color: ${themeVars.color.hover.opaque}; &:hover {
} background-color: ${themeVars.color.hover.opaque};
// 偶数行悬停色 }
tr:nth-child(2n):hover { // 偶数行悬停色
background-color: ${themeVars.color.hover.opaque} !important; &:nth-child(2n):hover {
background-color: ${themeVars.color.hover.opaque} !important;
}
// 尾行圆角
&:last-child {
td:first-child {
border-bottom-left-radius: ${otherThemeVars.border.radius};
}
td:last-child {
border-bottom-right-radius: ${otherThemeVars.border.radius};
}
}
} }
} }
} }
@@ -56,11 +66,36 @@ export const commit = css`
export const commitStatus = css` export const commitStatus = css`
.flex-text-inline[data-global-init="initCommitStatuses"] { .flex-text-inline[data-global-init="initCommitStatuses"] {
padding: 6px; padding: 3px;
margin-top: 2px; margin-top: 2px;
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
&:hover { &:hover {
background-color: ${themeVars.github.control.transparent.bgColor.hover}; background-color: ${themeVars.github.control.transparent.bgColor.hover};
} }
svg {
width: 16px;
height: 16px;
min-width: 16px;
min-height: 16px;
}
}
`;
// 提交图
export const commitGraph = css`
.page-content.repository #git-graph-container {
img.ui.avatar {
border-radius: 9999px;
}
// 提交图的 SHA 标签
li .ui.label.commit-id-short {
height: 25px;
// 验证提交 SHA 标签
&.commit-is-signed {
span.ui.label.commit-is-signed {
height: 25px;
}
}
}
} }
`; `;

View File

@@ -1,19 +1,34 @@
import { css, otherThemeVars, themeVars } from "src/types/vars"; import { css, otherThemeVars, themeVars } from "src/types/vars";
import { labelStyle } from "styles/public/label";
export const dashboard = css` export const dashboard = css`
.page-content.dashboard { // 首页仪表板, 避免选中管理员后台的维护管理面板
.page-content.dashboard.feeds {
// 仓库列表的仓库/组织切换按钮 // 仓库列表的仓库/组织切换按钮
.ui.two.item.menu { .ui.two.item.menu {
box-shadow: ${themeVars.github.shadow.floating.small}; background: ${themeVars.color.hover.self};
border: unset; border: 0;
border-radius: 12px; border-radius: 12px;
margin-bottom: 8px; margin-bottom: 8px;
> .item { > .item {
&:first-child { background: unset;
border-radius: 12px 0 0 12px; border-radius: 12px;
padding: 6px 12px !important;
&.active {
background: ${themeVars.color.menu};
box-shadow: ${themeVars.github.shadow.floating.small};
font-weight: 600;
} }
&:last-child { &::before {
border-radius: 0 12px 12px 0; display: none;
}
&:not(.active) {
border-radius: ${otherThemeVars.border.radius};
margin: 6px !important;
width: calc(50% - 12px);
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
} }
} }
} }
@@ -24,6 +39,9 @@ export const dashboard = css`
font-weight: 400; font-weight: 400;
background-color: unset !important; background-color: unset !important;
margin-bottom: 0.25rem; margin-bottom: 0.25rem;
.ui.label {
border-color: #00000000;
}
} }
// 仓库/组织列表 // 仓库/组织列表
.ui.attached.segment { .ui.attached.segment {
@@ -33,6 +51,13 @@ export const dashboard = css`
&.repos-search { &.repos-search {
border-top-left-radius: 12px; border-top-left-radius: 12px;
border-top-right-radius: 12px; border-top-right-radius: 12px;
> .menu.repos-filter {
.ui.circular.label {
border-color: #00000000;
min-height: fit-content;
padding: ${labelStyle.padding} !important;
}
}
} }
&.table { &.table {
&:last-child { &:last-child {
@@ -43,6 +68,8 @@ export const dashboard = css`
padding: 8px; padding: 8px;
li { li {
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
padding: 6px 8px !important;
height: 32px;
&:not(:last-child) { &:not(:last-child) {
border-bottom: 0; border-bottom: 0;
} }
@@ -64,3 +91,66 @@ export const dashboard = css`
} }
} }
`; `;
// 导航栏的工单/PR/里程碑仪表板
export const dashboardIssues = css`
.page-content.dashboard.issues {
.list-header {
background-color: ${themeVars.color.box.header};
border: 1px solid ${themeVars.color.light.border};
border-bottom: 0;
border-top-left-radius: ${otherThemeVars.border.radius};
border-top-right-radius: ${otherThemeVars.border.radius};
height: 54px;
padding: 16px 8px;
.list-header-toggle {
align-items: center;
border: 0;
> .item {
background: unset !important;
border-radius: ${otherThemeVars.border.radius};
color: ${themeVars.color.text.light.num1};
padding: 0px 8px;
height: 30px;
&:before {
display: none;
}
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover} !important;
}
&.active {
color: ${themeVars.color.text.self};
font-weight: 700;
}
}
}
.list-header-filters {
> .item {
border-radius: ${otherThemeVars.border.radius};
color: ${themeVars.color.text.light.num1};
padding: 0px 12px;
height: 32px;
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
}
}
}
}
`;
// 避免手机/平板下菜单错位
export const issueListMobile = css`
@media (max-width: 767.98px) {
.page-content.dashboard.issues .list-header {
height: auto;
}
}
`;
// 修复仪表板下二级面板选择菜单组织的标签间隔
export const fixOrgLabel = css`
.dashboard .secondary-nav .org-visibility .label {
margin-right: 0;
}
`;

View File

@@ -1,15 +1,49 @@
import { css, themeVars } from "src/types/vars"; import { css, otherThemeVars, themeVars } from "src/types/vars";
export const diff = css` export const diff = css`
/* 折叠行多余的颜色 */ // 这里的折叠行和代码行高度与 GitHub 的 release 和 review 的差异对比时的高度一致, 不需要像 commit 中的差异对比那样行高过高
// release 和 review 行高为 20px, commit 行高为 24px
// 折叠行
.tag-code { .tag-code {
// 多余的颜色
background-color: unset; background-color: unset;
/* 折叠行文本 */ height: 28px;
// 展开按钮高度与折叠行一致
.code-expander-buttons {
.code-expander-button {
height: 28px;
}
}
// 双向展开的按钮
&:has(.code-expander-buttons[data-expand-direction="3"]) {
height: 40px;
.code-expander-button {
height: 20px;
}
}
// 展开按钮
.code-expander-button {
color: ${themeVars.color.text.light.num1};
&:hover {
background: ${themeVars.github.bgColor.accent.emphasis};
color: ${themeVars.color.white};
}
}
// 折叠行文本
.code-inner { .code-inner {
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
} }
} }
/* 增加/删除行多余的颜色 */ // 代码行
.lines-num,
.lines-code {
line-height: 20px;
}
// 行号居中
.lines-num {
text-align: center !important;
}
// 增加/删除行多余的颜色
.code-diff-unified { .code-diff-unified {
.del-code, .del-code,
.add-code { .add-code {
@@ -17,28 +51,102 @@ export const diff = css`
border-color: unset; border-color: unset;
} }
} }
/* 增加/删除相关代码背景色圆角 */ // 增加/删除相关代码背景色圆角
.added-code, .added-code,
.removed-code { .removed-code {
border-radius: 0.1875rem; border-radius: 3px;
color: ${themeVars.color.text.self}; color: ${themeVars.color.text.self};
/* 覆盖掉 chroma 的颜色 */ // 覆盖掉 chroma 的颜色
* { * {
color: ${themeVars.color.text.self} !important; color: ${themeVars.color.text.self} !important;
} }
} }
/* 展开/收缩按钮 */ // 差异对比文件盒子
.code-expander-button { .diff-file-box {
color: ${themeVars.color.text.light.num1}; // 差异对比文件头
height: 28px !important; .diff-file-header {
// 文件名
&:hover { .diff-file-name {
background: ${themeVars.github.bgColor.accent.emphasis}; font-weight: 400;
color: ${themeVars.color.white}; .fold-file.btn svg {
min-width: 16px;
min-height: 16px;
height: 16px;
width: 16px;
}
.diff-stats-bar {
height: 8px;
}
> div,
.file-link {
font-size: 12px;
}
}
// 操作按钮
.diff-file-header-actions {
color: ${themeVars.color.text.light.num1};
font-size: 12px;
font-weight: 400;
.diff-header-popup-btn {
border-radius: ${otherThemeVars.border.radius};
padding: 5px !important;
&:hover {
background-color: ${themeVars.github.control.transparent.bgColor.hover};
}
}
}
} }
} }
/* 行号居中 */ // 差异对比文件盒子
.lines-num { .repository .diff-file-box {
text-align: center !important; .code-diff {
// 隐藏多余的空白
// 合并视图的第三列
&.code-diff-unified colgroup col:nth-child(3),
// 拆分视图的第二列和第六列
&.code-diff-split colgroup col:nth-child(2),
&.code-diff-split colgroup col:nth-child(6),
td.lines-escape {
width: 0; // 不要使用 display: none; 否则会影响布局, 无内容时为 0, 有内容时为 20(猜测可能是根据内容宽度自动调整)
/* visibility: hidden; */ // 不要使用 visibility: hidden; 当 escape 有内容时会导致背景颜色丢失, escape 目前用于显示检测 unicode 编码错误的内容
}
// 修复当 escape 有内容时, 宽度不够的问题
&:has(td.lines-escape:not(:empty)) {
// 合并视图的第三列
&.code-diff-unified colgroup col:nth-child(3),
// 拆分视图的第二列和第六列
&.code-diff-split colgroup col:nth-child(2),
&.code-diff-split colgroup col:nth-child(6),
td.lines-escape {
width: 20;
}
}
// Gitea 分列视图下默认 100% 宽度的目的是如果单文件只增加或只删除的情况下, 保持无内容的列的宽度一致, 始终保持左右两边的列宽度一致
// 保持 Gitea 的默认设置, 不对行号宽度做处理
/* &.code-diff-split table {
width: auto;
} */
// 行号宽度
// 40px: 长度 = 9999 行
// 45px: 长度 = 99999 行
// 50px: 长度 = 999999 行
// GitHub 在 commit 中的行宽最小为 40px, 但会动态调整, 在 release 和 review 的差异对比中为 50px
// 这里折中为 45px 会根据代码行数动态调整, 45px 既不会在行数少时显得太宽, 也可以在大多数情况下保持宽度一致
.lines-num {
min-width: 45px;
}
// 合并视图的第四列
&.code-diff-unified colgroup col:nth-child(4),
// 拆分视图的第三列和第七列, -/+ 保持居中的宽度
&.code-diff-split colgroup col:nth-child(3),
&.code-diff-split colgroup col:nth-child(7) {
width: 20;
}
}
// 修复对比视图内容中的圆角和背景溢出
.file-body.file-code {
border-radius: 0 0 ${otherThemeVars.border.radius} ${otherThemeVars.border.radius};
overflow: hidden;
}
} }
`; `;

View File

@@ -4,17 +4,11 @@ export const monaco = css`
.monaco-editor { .monaco-editor {
--vscode-editor-background: ${themeVars.color.body} !important; --vscode-editor-background: ${themeVars.color.body} !important;
--vscode-editorGutter-background: ${themeVars.color.body} !important; --vscode-editorGutter-background: ${themeVars.color.body} !important;
.monaco-mouse-cursor-text {
font-size: 12px !important;
}
// 滚动时固定在顶部的行 // 滚动时固定在顶部的行
.sticky-widget { .sticky-widget {
background: ${themeVars.color.body} !important; background: ${themeVars.color.body} !important;
box-shadow: 0 1px 0 ${themeVars.color.secondary.self} !important; box-shadow: 0 1px 0 ${themeVars.color.secondary.self} !important;
width: 100% !important; width: 100% !important;
.sticky-line-content {
font-size: 12px !important;
}
} }
} }
`; `;

View File

@@ -157,3 +157,33 @@ export const mobileList = css`
} }
} }
`; `;
// 统一无搜索结果时的样式
export const notMatch = css`
// 组织的仓库列表
.page-content.organization.profile > .ui.container > .ui.stackable > .ui.eleven,
// 用户的仓库列表
.page-content.user.profile > .ui.container > .ui.stackable > .ui.twelve,
// 探索的仓库列表
.page-content.explore.repositories > .ui.container,
// 组织的成员列表
.page-content.organization.members >.ui.container,
// 探索的用户和组织列表
.page-content.explore.users >.ui.container {
// 排除用户的公开活动页
> .flex-list:not(#activity-feed) {
&:has(> div:only-child):not(:has(.flex-item-main)) {
grid-template-columns: 1fr;
> div {
border: 1px solid ${themeVars.color.light.border};
border-radius: ${otherThemeVars.border.radius};
font-size: 16px;
font-weight: 500;
padding: 32px;
display: flex;
justify-content: center;
}
}
}
}
`;

View File

@@ -10,7 +10,7 @@ export const branchButton = css`
border: 1px solid ${themeVars.color.light.border}; border: 1px solid ${themeVars.color.light.border};
margin-top: 1px; margin-top: 1px;
margin-left: auto; margin-left: auto;
margin-right: 16px; // gitea 有 RSS 留出足够的空间 margin-right: 20px; // gitea 有 RSS 留出足够的空间
} }
} }
} }
@@ -22,6 +22,7 @@ export const syncFork = css`
.repo-home-filelist > .ui.message { .repo-home-filelist > .ui.message {
background: ${themeVars.color.box.header}; background: ${themeVars.color.box.header};
padding: 8px 8px 8px 16px; padding: 8px 8px 8px 16px;
margin: 16px 0px;
.ui.button { .ui.button {
min-width: 96px; min-width: 96px;
} }
@@ -31,8 +32,13 @@ export const syncFork = css`
// 仓库文件列表 // 仓库文件列表
export const repoFiles = css` export const repoFiles = css`
// 文件列表和提交列表的按钮组
.repo-button-row {
margin: 16px 0;
}
.repository.file.list { .repository.file.list {
#repo-files-table { #repo-files-table {
margin: 16px 0;
// 头部最后一次提交 // 头部最后一次提交
.repo-file-line { .repo-file-line {
padding-right: 16px; padding-right: 16px;
@@ -52,9 +58,11 @@ export const repoFiles = css`
.commit-summary { .commit-summary {
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
} }
img.tw-align-middle { img.ui.avatar {
margin-top: -1px; border-radius: 9999px;
margin-left: 1px; margin-left: 2px;
width: 20px;
height: 20px;
} }
// 作者 // 作者
.author-wrapper { .author-wrapper {
@@ -91,11 +99,17 @@ export const repoFiles = css`
#readme { #readme {
.file-header { .file-header {
background: ${themeVars.color.body}; background: ${themeVars.color.body};
min-height: 48px;
padding: 0px 8px !important;
overflow-x: visible;
svg { svg {
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
} }
.file-header-left { .file-header-left {
padding: 6px 8px !important; padding: 6px 8px !important;
line-height: 1.45;
// 伪元素宽度等于按钮宽度而不是父元素宽度
position: relative;
&:hover { &:hover {
background: ${themeVars.github.control.transparent.bgColor.hover}; background: ${themeVars.github.control.transparent.bgColor.hover};
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
@@ -104,20 +118,30 @@ export const repoFiles = css`
content: ""; content: "";
background: ${themeVars.github.underlineNav.borderColor.active}; background: ${themeVars.github.underlineNav.borderColor.active};
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
bottom: 0; bottom: -8px;
left: 0;
height: 2px; height: 2px;
position: absolute; position: absolute;
left: 12px; width: 100%;
width: 113px;
} }
a.muted:hover { a.muted:hover {
color: inherit; color: inherit;
text-decoration-line: none; text-decoration-line: none;
} }
} }
.file-header-right:hover { .file-header-right {
background: ${themeVars.github.control.transparent.bgColor.hover}; .btn-octicon {
border-radius: ${otherThemeVars.border.radius}; display: inline-flex;
align-items: center;
justify-content: center;
padding: 0px 8px;
border-radius: ${otherThemeVars.border.radius};
height: 28px;
width: 28px;
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
}
} }
} }
} }
@@ -146,69 +170,192 @@ export const repoFilesMobile = css`
// 仓库打开文件时的视图 // 仓库打开文件时的视图
export const repoFileView = css` export const repoFileView = css`
// 隐藏主内容的下内容和页脚, 避免滚动文件树时滚动条遮挡
body > .full.height:has(.repo-view-file-tree-container) {
padding-bottom: 0;
+ .page-footer {
display: none;
}
}
.page-content.repository.file.list { .page-content.repository.file.list {
&:has(.repo-view-file-tree-container) {
// 取消下间隔优化观看体验
.secondary-nav {
margin-bottom: 0 !important;
.ui.tabs.divider {
margin-bottom: 0;
}
}
}
> .ui.container.fluid { > .ui.container.fluid {
max-width: calc(100% - calc(2 * 16px)); max-width: calc(100% - calc(2 * 16px));
} }
.repo-view-container { .repo-view-container {
position: sticky;
top: 0;
// 左侧文件树 // 左侧文件树
.repo-view-file-tree-container { .repo-view-file-tree-container {
height: 100vh; height: 100vh;
// 固定头部
position: sticky; position: sticky;
top: 0; top: 0;
overflow-y: unset;
&:after { &:after {
content: ""; content: "";
position: absolute; position: absolute;
top: -14px; top: 0;
right: 0; right: 0;
width: 1px; width: 1px;
height: calc(100% + 14px); height: 100%;
background: ${themeVars.color.secondary.self}; background: ${themeVars.color.secondary.self};
} }
> .repo-button-row { > .repo-button-row {
height: 32px; align-content: center;
margin: 16px 0; background: ${themeVars.color.body};
font-size: 16px;
height: 64px;
margin: 0;
// 固定头部, 早期父元素有多余的页脚和内容高度导致滚动时无法固定, 修复后也可保留此属性无需删除
position: sticky;
top: 0;
&:after { &:after {
content: ""; content: "";
position: absolute; position: absolute;
top: 32px + 32px; top: 64px;
left: -16px; left: -16px;
width: calc(100% + 16px); width: calc(100% + 16px);
height: 1px; height: 1px;
background: ${themeVars.color.secondary.self}; background: ${themeVars.color.secondary.self};
} }
.ui.compact.icon.button {
border: 0;
}
}
.view-file-tree-items {
margin-right: 0;
padding: 12px 16px 8px 0;
} }
} }
// 右侧文件视图内容 // 右侧文件视图内容
.repo-view-content { .repo-view-content {
padding-bottom: 40px;
.repo-button-row { .repo-button-row {
align-items: center; align-content: center;
background: ${themeVars.color.box.header}; background: ${themeVars.color.box.header};
border: 1px solid ${themeVars.color.secondary.self}; border: 1px solid ${themeVars.color.secondary.self};
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
margin: 16px 0;
height: 46px; height: 46px;
min-height: 46px; min-height: 46px;
padding: 8px; padding: 8px;
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 1; z-index: 1;
.ui.button {
min-height: 32px;
}
// 打开文件树按钮
.repo-view-file-tree-toggle-show {
background: initial;
border-color: #0000;
padding: 0;
min-width: 32px;
}
// 分支选择按钮
.branch-dropdown-button {
padding: 0 12px;
}
// 路径
.repo-path {
gap: 4px;
.section {
&:first-child,
&.active {
font-weight: 600;
}
}
.btn {
svg {
margin-left: 4px;
color: ${themeVars.color.text.light.num1};
}
}
}
} }
.non-diff-file-content { .non-diff-file-content {
// 避免分支菜单遮挡 // 避免分支菜单遮挡
position: relative; position: relative;
z-index: 0; z-index: 0;
h4.file-header { h4.file-header {
padding: 8px 12px !important;
position: sticky; position: sticky;
top: 46px; // 重叠边框线, 避免过粗
top: 45px;
z-index: 1; z-index: 1;
.file-header-left {
color: ${themeVars.color.text.light.num1};
font-size: 12px;
}
.file-header-right {
gap: 0px;
// 按钮组
> .ui.buttons {
margin: 0 8px 0 0 !important; // 完全不知道为什么浏览器最终效果没生效, 只能 !important 了
.ui.mini.button {
min-height: 28px;
height: 28px;
font-size: 12px;
padding: 0 8px;
}
}
// 右侧操作按钮
> .btn-octicon {
display: flex;
align-items: center;
background: ${themeVars.color.button};
border: 1px solid ${themeVars.color.light.border};
border-left-width: 0;
height: 28px;
padding: 0 8px;
svg {
color: ${themeVars.color.text.light.num1};
}
&:first-of-type {
border-left-width: 1px;
border-top-left-radius: ${otherThemeVars.border.radius};
border-bottom-left-radius: ${otherThemeVars.border.radius};
}
&:last-of-type {
border-top-right-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius};
// 与无权限按钮之间的间距
+ .btn-octicon.disabled {
margin-left: 8px;
}
}
&:hover {
background: ${themeVars.color.hover.self};
color: ${themeVars.color.text.light.num1};
}
}
}
} }
} }
// 头部提交信息 // 头部提交信息
.ui.segment#repo-file-commit-box { .ui.segment#repo-file-commit-box {
padding: 8px 12px; padding: 8px 12px;
margin-bottom: 8px !important; margin-bottom: 16px !important;
min-height: 46px;
> .latest-commit { > .latest-commit {
gap: 8px; gap: 8px;
.commit-summary {
color: ${themeVars.color.text.light.num1};
}
> img.ui.avatar {
border-radius: 9999px;
width: 20px;
height: 20px;
}
} }
// 右侧提交时间 // 右侧提交时间
> .age { > .age {
@@ -242,7 +389,8 @@ export const repoFileViewMobile = css`
// 仓库代码布局调整, 侧边栏宽度调整 // 仓库代码布局调整, 侧边栏宽度调整
export const repoGrid = css` export const repoGrid = css`
.repo-grid-filelist-sidebar { .repo-grid-filelist-sidebar {
grid-template-columns: auto 296px; grid-template-columns: auto 312px;
gap: 24px;
} }
@media (max-width: 767.98px) { @media (max-width: 767.98px) {
@@ -261,16 +409,21 @@ export const repoSidebarTop = css`
} }
.flex-item { .flex-item {
padding: 10px 0 0 0; padding: 10px 0 0 0;
// 仓库描述本身
.flex-item-title { .flex-item-title {
margin-top: 2px; margin-top: 10px;
} }
// 仓库描述内容
.flex-item-body { .flex-item-body {
padding: 8px 0 0 0; > .tw-flex:first-child {
margin-top: 16px !important;
gap: 8px !important;
}
.repo-description { .repo-description {
color: ${themeVars.color.text.self}; color: ${themeVars.color.text.self};
} }
#repo-topics { #repo-topics {
margin: 10px 0px !important; margin: 8px 0px !important;
} }
.flex-text-block { .flex-text-block {
font-size: 14px; font-size: 14px;
@@ -305,10 +458,9 @@ export const repoSidebarBottom = css`
padding: 16px 0; padding: 16px 0;
.flex-item { .flex-item {
padding: 16px 0 0 0; padding: 16px 0 0 0;
.flex-item-icon { .flex-item-leading {
svg.svg.octicon-tag { svg.svg.octicon-tag {
color: ${themeVars.color.green.self}; color: ${themeVars.color.green.self};
margin-top: 2px;
} }
} }
.flex-item-header .flex-item-title { .flex-item-header .flex-item-title {

View File

@@ -0,0 +1,43 @@
import { css, themeVars } from "src/types/vars";
export const footer = css`
.page-footer {
background-color: ${themeVars.color.body};
border-top: 0;
color: ${themeVars.color.text.light.num1};
font-size: 12px;
gap: 32px;
justify-content: center;
padding: 16px 0 40px 0;
> .left-links {
gap: 4px;
> a {
color: ${themeVars.color.text.light.num1};
&:hover {
color: ${themeVars.color.primary.self};
}
}
> strong {
font-weight: 400;
}
}
> .right-links {
gap: 16px;
> .ui.dropdown {
font-size: 12px;
&:hover {
color: ${themeVars.color.primary.self};
}
}
> a {
border-left: 0;
color: ${themeVars.color.text.light.num1};
padding-left: 0;
margin-left: 0;
&:hover {
color: ${themeVars.color.primary.self};
}
}
}
}
`;

View File

@@ -1,7 +1,11 @@
import { css, otherThemeVars, themeVars } from "src/types/vars"; import { css, themeVars } from "src/types/vars";
export const heatmap = css` export const heatmap = css`
#user-heatmap { #user-heatmap {
+ .divider:not(.divider-text) {
border-color: #0000;
margin: 8px 0px;
}
.total-contributions { .total-contributions {
left: 25px + 20px; left: 25px + 20px;
bottom: 0 + 12px; bottom: 0 + 12px;
@@ -12,8 +16,8 @@ export const heatmap = css`
} }
.vch__container { .vch__container {
padding: 12px 20px; padding: 12px 20px;
border: 1px solid ${themeVars.color.secondary.self}; box-shadow: ${themeVars.github.shadow.floating.small};
border-radius: ${otherThemeVars.border.radius}; border-radius: 12px;
// 覆盖热力图和图例的背景色 // 覆盖热力图和图例的背景色
.vch__day__square, .vch__day__square,
.vch__legend__wrapper rect { .vch__legend__wrapper rect {
@@ -65,25 +69,85 @@ export const heatmap = css`
// 动态 // 动态
export const activity = css` export const activity = css`
#activity-feed { .activity-heatmap-container + .divider:not(.divider-text) {
.flex-item { border-color: #0000;
}
.flex-list#activity-feed {
border-radius: 12px;
box-shadow: ${themeVars.github.shadow.floating.small};
> .flex-item {
gap: 12px; gap: 12px;
padding: 16px 0; padding: 16px;
&:first-child { > .flex-item-leading {
padding-top: 6px; img {
width: 24px;
height: 24px;
border-radius: 9999px;
}
} }
// 动态的主要内容
> .flex-item-main { > .flex-item-main {
gap: 8px !important; gap: 8px !important;
// 动态的标题
relative-time { > div:not([class]) {
display: flex;
align-items: baseline;
gap: 6px;
flex-wrap: wrap;
> a {
color: ${themeVars.color.text.self};
// 不匹配作者
&:not([title]) {
// 尽量只选中仓库名, 不匹配标签和分支
&:not([href*="tag"]):not([href*="branch"]) {
color: ${themeVars.color.primary.self};
text-decoration: underline;
}
}
}
relative-time {
color: ${themeVars.color.text.light.num1};
font-size: 12px;
}
}
// 动态的描述
> .tw-flex-col {
gap: 0px !important;
> .flex-text-block {
gap: 4px;
font-size: 12px;
color: ${themeVars.color.text.light.num1};
img {
width: 16px;
height: 16px;
border-radius: 9999px;
}
.ui.sha.label {
margin-top: 0;
}
}
}
> .flex-item-body {
gap: 4px;
font-size: 12px;
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
} }
> a {
font-size: 12px;
}
} }
// 动态的右侧 svg 图标 // 动态的右侧 svg 图标
.flex-item-trailing svg { .flex-item-trailing {
height: 20px; align-self: center;
width: 20px; svg {
height: 18px;
width: 18px;
}
} }
} }
> .page.buttons {
border-top: 1px solid ${themeVars.color.secondary.self};
padding: 12px 0px;
}
} }
`; `;

View File

@@ -1,18 +1,23 @@
import "./actions"; import "./actions";
import "./chroma";
import "./clone"; import "./clone";
import "./commit"; import "./commit";
import "./dashboard"; import "./dashboard";
import "./diff"; import "./diff";
import "./editor";
import "./explore"; import "./explore";
import "./filelist"; import "./filelist";
import "./footer";
import "./heatmap"; import "./heatmap";
import "./issue"; import "./issue";
import "./milestones";
import "./navbar";
import "./newrepo"; import "./newrepo";
import "./notification";
import "./org"; import "./org";
import "./packages";
import "./release"; import "./release";
import "./repo"; import "./repo";
import "./setting"; import "./setting";
import "./signin"; import "./signin";
import "./user"; import "./user";
import "./chroma";
import "./editor"

View File

@@ -3,6 +3,9 @@ import { activeItemAfterStyle } from "styles/public/menu";
// 工单&PR 列表 // 工单&PR 列表
export const issueList = css` export const issueList = css`
// 仓库页面的里程碑列表菜单栏
.page-content.repository.milestones,
.page-content.repository.milestone-issue-list,
.page-content.repository.issue-list { .page-content.repository.issue-list {
// 头部筛选菜单栏 // 头部筛选菜单栏
.issue-list-toolbar { .issue-list-toolbar {
@@ -15,6 +18,7 @@ export const issueList = css`
border-top-right-radius: ${otherThemeVars.border.radius}; border-top-right-radius: ${otherThemeVars.border.radius};
height: 48px; height: 48px;
padding: 8px; padding: 8px;
margin-top: 16px;
.issue-list-toolbar-left { .issue-list-toolbar-left {
// 复选框 // 复选框
input { input {
@@ -52,15 +56,30 @@ export const issueList = css`
height: 32px; height: 32px;
} }
} }
img.ui.avatar {
border-radius: 9999px;
}
} }
// Issue 列表 }
// 里程碑详细页面的 Issue 列表
.page-content.repository.milestone-issue-list,
// 顶部仪表板的 Issue 列表
.page-content.dashboard.issues,
// 用户订阅的 Issue 列表
.page-content.user.notification,
// 仓库 Issue 列表
.page-content.repository.issue-list {
.flex-list#issue-list { .flex-list#issue-list {
border: 1px solid ${themeVars.color.light.border}; border: 1px solid ${themeVars.color.light.border};
border-bottom-left-radius: ${otherThemeVars.border.radius}; border-bottom-left-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius}; border-bottom-right-radius: ${otherThemeVars.border.radius};
img.ui.avatar {
border-radius: 9999px;
}
> .flex-item { > .flex-item {
align-items: center; align-items: center;
padding: 0; padding: 0;
min-height: 64px;
&:last-child { &:last-child {
border-bottom-left-radius: ${otherThemeVars.border.radius}; border-bottom-left-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius}; border-bottom-right-radius: ${otherThemeVars.border.radius};
@@ -68,19 +87,16 @@ export const issueList = css`
&:hover { &:hover {
background-color: ${themeVars.color.hover.opaque}; background-color: ${themeVars.color.hover.opaque};
} }
> .flex-item-icon { > .flex-item-leading {
display: flex; align-self: flex-start;
gap: 4px; margin-top: 14px;
margin-left: 8px; margin-left: 16px;
// 复选框 > .flex-text-inline {
input { margin-top: 0px !important;
background: unset; // 复选框
margin-top: 14px; input {
margin-left: 8px; margin-right: 8px !important;
margin-right: 8px !important; }
}
svg {
margin-top: 14px;
} }
} }
> .flex-item-main { > .flex-item-main {
@@ -99,13 +115,75 @@ export const issueList = css`
} }
} }
} }
// 里程碑列表
// [TODO] 暂时排除项目的列表
.page-content.repository.milestones:not(.projects) .milestone-list {
border: 1px solid ${themeVars.color.light.border};
border-bottom-left-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius};
.milestone-card {
padding: 8px 16px 10px 16px;
.milestone-header {
h3 {
font-size: 16px;
font-weight: 500;
}
div span {
font-size: 14px;
font-weight: 600;
}
}
}
.milestone-toolbar {
font-size: 12px;
.group > a {
font-size: 13px;
}
}
}
`; `;
// 避免手机/平板下菜单错位 // 避免手机/平板下菜单错位
export const issueListMobile = css` export const issueListMobile = css`
@media (max-width: 1023.98px) { @media (max-width: 1023.98px) {
.page-content.repository.issue-list .issue-list-toolbar { .page-content.repository.milestones,
height: auto; .page-content.repository.milestone-issue-list,
.page-content.repository.issue-list {
.issue-list-toolbar {
height: auto;
}
}
}
`;
// 置顶 Issue
export const issuePins = css`
#issue-pins {
gap: 12px;
margin-bottom: 16px;
.issue-card {
padding: 16px 12px;
.content {
.issue-card-title {
font-size: 16px;
font-weight: 600;
}
svg {
color: ${themeVars.color.text.light.num1};
height: 100%;
margin-right: 3px;
}
.meta {
font-size: 12px;
padding-top: 4px;
}
}
.issue-card-bottom {
display: none;
}
}
img.ui.avatar {
border-radius: 9999px;
} }
} }
`; `;
@@ -185,7 +263,7 @@ export const prBranch = css`
font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace); font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace);
font-size: 12px; font-size: 12px;
padding: 0 5px; padding: 0 5px;
line-height: 20px; line-height: 18px;
} }
.repository.view.issue .pull-desc code { .repository.view.issue .pull-desc code {
@@ -197,9 +275,17 @@ export const prBranch = css`
} }
`; `;
const botLabelStyle = {
height: "20px",
padding: "0 6px!important",
marginLeft: "4px",
};
// 评论 // 评论
export const comment = css` export const comment = css`
.comment .comment-container { .comment .comment-container {
img.ui.avatar {
border-radius: 9999px;
}
// 去除评论标题左侧指向头像的小箭头 // 去除评论标题左侧指向头像的小箭头
.comment-header, .comment-header,
&:target .comment-header { &:target .comment-header {
@@ -218,6 +304,26 @@ export const comment = css`
.comment-header { .comment-header {
padding: 4px 4px 4px 16px; padding: 4px 4px 4px 16px;
min-height: 38px; min-height: 38px;
.comment-header-left {
// bot 标签
.ui.basic.label {
${botLabelStyle}
}
a:has(relative-time){
text-decoration: underline;
}
// 已编辑按钮
.content-history-menu {
color: ${themeVars.color.text.light.num1} !important;
.menu .item {
font-size: 12px;
.ui.avatar {
height: 20px;
width: 20px;
}
}
}
}
} }
.comment-header-right { .comment-header-right {
> .item, > .item,
@@ -230,16 +336,19 @@ export const comment = css`
height: 20px; height: 20px;
padding: 0 6px; padding: 0 6px;
} }
// 隐藏顶部菜单的表情按钮
// 无法使用此样式, 评论无表情时底部的表情按钮元素不会渲染, 这是一个先有鸡还是先有蛋的问题
// 很蛋疼, 希望 Gitea 早日使用 Github 的样式, 因为 Github 的更合理, 无论是操作的方便程度还是按钮的冗余度
// .ui.dropdown.action.select-reaction {
// display: none;
// }
.context-dropdown { .context-dropdown {
height: 28px;
padding: 0 6px;
border-radius: ${otherThemeVars.border.radius};
&:hover {
background-color: ${themeVars.github.control.transparent.bgColor.hover};
}
a.context-menu { a.context-menu {
display: flex; display: flex;
align-items: center; align-items: center;
&:hover {
color: inherit;
}
} }
// 评论菜单的删除按钮 // 评论菜单的删除按钮
.menu .item.delete-comment { .menu .item.delete-comment {
@@ -257,7 +366,7 @@ export const comment = css`
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: ${themeVars.color.button}; background: ${themeVars.color.button};
border-radius: 25px; border-radius: 9999px;
border: 1px solid ${themeVars.color.light.border}; border: 1px solid ${themeVars.color.light.border};
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
padding: 0px 8px !important; padding: 0px 8px !important;
@@ -268,7 +377,7 @@ export const comment = css`
.bottom-reactions { .bottom-reactions {
.ui.ui.ui.label { .ui.ui.ui.label {
background-color: unset !important; background-color: unset !important;
border-radius: 25px; border-radius: 9999px;
border-color: ${themeVars.color.light.border}; border-color: ${themeVars.color.light.border};
&:hover { &:hover {
background-color: ${themeVars.color.reaction.hoverBg} !important; background-color: ${themeVars.color.reaction.hoverBg} !important;
@@ -293,6 +402,16 @@ export const comment = css`
} }
`; `;
// 评论书写框
export const commentForm = css`
.repository .comment.form .content .segment {
&::before,
&::after {
display: none;
}
}
`;
export const dropdown = css` export const dropdown = css`
.repository { .repository {
// Issue/PR 列表下的所有筛选菜单 // Issue/PR 列表下的所有筛选菜单
@@ -312,8 +431,7 @@ export const prMerge = css`
.repository.view.issue .comment-list .timeline-item.pull-merge-box { .repository.view.issue .comment-list .timeline-item.pull-merge-box {
// 头像 // 头像
.timeline-avatar { .timeline-avatar {
color: ${themeVars.color.text.self} !important; border-radius: 9999px;
border-radius: ${otherThemeVars.border.radius};
width: 40px; width: 40px;
height: 40px; height: 40px;
display: flex; display: flex;
@@ -323,32 +441,67 @@ export const prMerge = css`
width: 24px; width: 24px;
height: 24px; height: 24px;
} }
// 可以合并 // PR 界面的 PR 操作评论
&.green { &.text {
background-color: ${themeVars.github.bgColor.success.emphasis}; color: ${themeVars.color.white} !important;
// 操作评论边框色 border-radius: ${otherThemeVars.border.radius};
// 操作评论边框
+ .content > .ui.attached.segment { + .content > .ui.attached.segment {
border-left-color: ${themeVars.github.bgColor.success.emphasis}; border-width: 1.5px;
border-right-color: ${themeVars.github.bgColor.success.emphasis}; }
&:first-child { &.grey {
border-top-color: ${themeVars.github.bgColor.success.emphasis}; background-color: ${themeVars.color.text.light.num1};
} }
&:last-child { &.green {
border-bottom-color: ${themeVars.github.bgColor.success.emphasis}; background-color: ${themeVars.github.bgColor.success.emphasis};
+ .content > .ui.attached.segment {
border-left-color: ${themeVars.github.bgColor.success.emphasis};
border-right-color: ${themeVars.github.bgColor.success.emphasis};
&:first-child {
border-top-color: ${themeVars.github.bgColor.success.emphasis};
}
&:last-child {
border-bottom-color: ${themeVars.github.bgColor.success.emphasis};
}
} }
} }
} &.purple {
// 已合并 background-color: ${themeVars.github.bgColor.done.emphasis};
&.purple { + .content > .ui.attached.segment {
background-color: ${themeVars.github.bgColor.done.emphasis}; border-left-color: ${themeVars.github.bgColor.done.emphasis};
+ .content > .ui.attached.segment { border-right-color: ${themeVars.github.bgColor.done.emphasis};
border-left-color: ${themeVars.github.bgColor.done.emphasis}; &:first-child {
border-right-color: ${themeVars.github.bgColor.done.emphasis}; border-top-color: ${themeVars.github.bgColor.done.emphasis};
&:first-child { }
border-top-color: ${themeVars.github.bgColor.done.emphasis}; &:last-child {
border-bottom-color: ${themeVars.github.bgColor.done.emphasis};
}
} }
&:last-child { }
border-bottom-color: ${themeVars.github.bgColor.done.emphasis}; &.yellow {
background-color: ${themeVars.github.bgColor.attention.emphasis};
+ .content > .ui.attached.segment {
border-left-color: ${themeVars.github.bgColor.attention.emphasis};
border-right-color: ${themeVars.github.bgColor.attention.emphasis};
&:first-child {
border-top-color: ${themeVars.github.bgColor.attention.emphasis};
}
&:last-child {
border-bottom-color: ${themeVars.github.bgColor.attention.emphasis};
}
}
}
&.red {
background-color: ${themeVars.github.bgColor.danger.emphasis};
+ .content > .ui.attached.segment {
border-left-color: ${themeVars.github.bgColor.danger.emphasis};
border-right-color: ${themeVars.github.bgColor.danger.emphasis};
&:first-child {
border-top-color: ${themeVars.github.bgColor.danger.emphasis};
}
&:last-child {
border-bottom-color: ${themeVars.github.bgColor.danger.emphasis};
}
} }
} }
} }
@@ -392,6 +545,10 @@ export const prMerge = css`
padding: 16px; padding: 16px;
display: grid; display: grid;
gap: 8px; gap: 8px;
&::before,
&::after {
display: none;
}
} }
} }
`; `;
@@ -400,17 +557,35 @@ export const prMerge = css`
export const timeline = css` export const timeline = css`
.repository.view.issue { .repository.view.issue {
.comment-list { .comment-list {
// 时间线本线
.timeline::before {
// 不遮挡归档信息框, 归档信息框背景色有透明度时会漏出线
height: calc(100% - 62px);
}
.timeline-item, .timeline-item,
.timeline-item-group { .timeline-item-group {
padding: 16px 0; padding: 12px 0;
.comment-text-line {
color: ${themeVars.color.text.light.num1};
}
// 事件 // 事件
&.event { &.event {
// 修复覆盖后的位置问题 // 修复覆盖后的位置问题
padding-left: 15px; padding-left: 15px;
.avatar { // 避免锚中批准的头像
.avatar-with-link .avatar {
width: 20px; width: 20px;
height: 20px; height: 20px;
} }
// 批准时间的头像
// 头部居中偏移量(头像高度 - 标准行信息高度) / 2: (40px - 32px) / 2 = 4px
.timeline-avatar {
top: -4px;
}
// bot 标签
.comment-text-line .ui.basic.label {
${botLabelStyle}
}
.badge { .badge {
border: 2px solid ${themeVars.color.body}; border: 2px solid ${themeVars.color.body};
} }
@@ -452,104 +627,203 @@ const sidebarPadding = {
// 侧边栏 // 侧边栏
export const issueSidebar = css` export const issueSidebar = css`
.issue-content { // 工单&创建工单&PR页面侧边栏
gap: 24px; .page-content.repository.issue {
.issue-content-right { .issue-content {
border: 0; img.ui.avatar {
font-size: 12px; border-radius: 9999px;
padding: 0; }
.ui.button { gap: 24px;
// 侧边栏
.issue-content-right {
border: 0;
font-size: 12px; font-size: 12px;
} padding: 0;
.ui.form, .ui.button {
a.fixed-text.muted, font-size: 12px;
span.text, }
// 列表项为空时的文字 .ui.form,
span.item.empty-list, a.fixed-text.muted,
p { span.text,
color: ${themeVars.color.text.light.num1}; // 列表项为空时的文字
font-size: 12px; span.item.empty-list,
} p {
.ui.dropdown.select-branch, color: ${themeVars.color.text.light.num1};
.ui.form, font-size: 12px;
a.fixed-text.muted, }
span.text, // WIP 前缀提示
.ui.watching > div, > a,
.ui.depending > div, .ui.dropdown.select-branch,
.flex-text-block, .ui.form,
.ui.list, a.fixed-text.muted,
p { span.text,
${sidebarPadding}; .ui.watching > div,
} .ui.depending > div,
.issue-sidebar-combo { .flex-text-block,
.ui.dropdown > a.fixed-text.muted { .ui.list,
align-items: center; .toggle-wip,
border-radius: ${otherThemeVars.border.radius}; p {
text-decoration-line: none; ${sidebarPadding};
height: 28px; }
// 允许维护者编辑
> .ui.checkbox {
margin: 4px 8px;
strong {
font-weight: 400;
}
}
.issue-sidebar-combo {
.ui.dropdown > a.fixed-text.muted {
align-items: center;
border-radius: ${otherThemeVars.border.radius};
text-decoration-line: none;
height: 28px;
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
}
.ui.list {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
// 评审人
.ui.relaxed.list {
.item {
// 操作图标按钮
a.muted.icon {
color: ${themeVars.color.text.light.num1};
&:hover {
color: ${themeVars.color.primary.self};
}
}
}
}
// 标签菜单项
.ui.dropdown > .menu > .scrolling.menu > .item:has(.item-secondary-info) {
// 修复标签菜单中描述文本过长没有换行挤掉标签的问题
display: grid !important;
grid-template-columns: auto auto 1fr;
row-gap: 0px; // 去除行间距, 仅当有描述信息时才有间距(.tw-pl-\\\[20px\\\])
// 如果是归档标签则隐藏
&.tw-hidden {
display: none !important;
}
// 默认隐藏多余信息避免标签对齐问题
.item-secondary-info {
display: none;
grid-column: 2 / -1; // 从第2列对齐
color: ${themeVars.color.text.light.num1};
> .tw-pl-\\\[20px\\\] {
// 已经与第二列对齐, 不需要额外的 padding
padding-left: 0px !important;
padding-top: 4px;
// 显示全部描述信息与 Github 保持一致
white-space: normal;
small {
font-size: 12px;
}
}
> .archived-label-hint {
// 与父元素 item 的 padding 对齐 (dropdown.ts .ui.dropdown .menu > .item)
top: 6px;
right: 8px;
}
// 如果有描述信息则显示
&:has(.tw-pl-\\\[20px\\\]) {
display: block;
> .archived-label-hint {
top: 4px; // 有描述信息的归档标签与标签对齐需要更高点
}
}
// 如果有归档标签则显示
&:has(.archived-label-hint > .ui.label) {
display: block;
}
}
}
}
// 时间追踪
> div:not([class]):not([id]) {
> .flex-text-block {
color: ${themeVars.color.text.light.num1};
}
> .ui.buttons {
${sidebarPadding};
.button {
height: 30px;
min-height: 30px;
&:hover {
border-color: ${themeVars.color.light.border};
+ .button {
border-left-color: ${themeVars.color.light.border};
}
}
}
}
}
// 选中日期颜色
.ui.form .due-date {
color: ${themeVars.color.text.self};
}
// 分割线
> .divider {
margin: 12px 0 12px 8px;
width: calc(100% - 16px);
}
// 订阅按钮
.ui.watching .ui.button {
padding: 0px 8px;
height: 30px;
min-height: 30px;
svg {
margin: 0 !important;
}
}
// PIN 按钮
.form-fetch-action.single-button-form .ui.button,
// 底部操作按钮
> .ui.show-modal.button {
border: 0;
background: unset;
font-weight: 400;
${sidebarPadding};
// 好像是浏览器 BUG, 最后不生效, 必须 !important
margin: 0 !important;
justify-content: left;
&:hover { &:hover {
background: ${themeVars.github.control.transparent.bgColor.hover}; background: ${themeVars.github.control.transparent.bgColor.hover};
} }
} }
.ui.list { .ui.show-modal.button[data-modal="#sidebar-delete-issue"] {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
}
// 时间追踪
> div:not([class]):not([id]) > .ui.dropdown.jump > a.fixed-text.muted {
align-items: center;
border-radius: ${otherThemeVars.border.radius};
text-decoration-line: none;
height: 28px;
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
}
// 选中日期颜色
.ui.form .due-date {
color: ${themeVars.color.text.self};
}
.divider {
margin: 12px 0 12px 8px;
width: calc(100% - 16px);
}
// 订阅按钮
.ui.watching .ui.button {
padding: 0px 8px;
height: 28px;
svg {
margin: 0 !important;
}
}
// PIN 按钮
.form-fetch-action.single-button-form .ui.button,
// 底部操作按钮
.ui.show-modal.button {
border: 0;
background: unset;
font-weight: 400;
${sidebarPadding};
// 好像是浏览器 BUG, 最后不生效, 必须 !important
margin: 0 !important;
justify-content: left;
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
}
.ui.show-modal.button[data-modal="#sidebar-delete-issue"] {
color: ${themeVars.color.red.self};
svg {
color: ${themeVars.color.red.self}; color: ${themeVars.color.red.self};
}
&:hover {
background-color: ${themeVars.color.red.badge.bg};
color: ${themeVars.color.red.light};
svg { svg {
color: ${themeVars.color.red.self};
}
&:hover {
background-color: ${themeVars.color.red.badge.bg};
color: ${themeVars.color.red.light}; color: ${themeVars.color.red.light};
svg {
color: ${themeVars.color.red.light};
}
} }
} }
} }
} }
} }
`; `;
// 工单标题
export const issueTitle = css`
.page-content.repository.issue {
.issue-title-header {
.issue-title-meta {
.issue-state-label {
padding: 6px 9px !important;
}
.time-desc {
color: ${themeVars.color.text.light.num1};
}
}
}
}
`;

View File

@@ -0,0 +1,59 @@
import { css, themeVars } from "src/types/vars";
export const milestone = css`
// 里程碑头部
.milestone-header {
gap: 16px;
// 进度条
progress {
height: 5px;
width: 300px;
max-width: 80vw;
}
}
// 里程碑 Issue 列表的进度条
.milestone-progress-big {
height: 8px;
}
// 里程碑 Issue 列表
.page-content.repository.milestone-issue-list {
> .ui.container {
> .flex-text-block:first-child {
margin-bottom: 16px;
> h1 {
font-size: 32px;
font-weight: 600;
line-height: 48px;
word-break: keep-all;
}
+ .tw-flex {
flex-direction: row !important;
align-items: center;
gap: 8px !important;
padding-top: 8px;
padding-bottom: 10px;
font-size: 14px;
color: ${themeVars.color.text.light.num1};
strong {
color: ${themeVars.color.text.self};
}
> .flex-text-block {
gap: 8px !important;
}
}
}
> .divider {
border-top-color: #0000;
}
}
}
`;
// 避免手机/平板下菜单错位
export const milestoneMobile = css`
@media (max-width: 767.98px) {
.page-content.repository.milestone-issue-list > .ui.container > .flex-text-block:first-child + .tw-flex {
flex-direction: column !important;
}
}
`;

188
styles/components/navbar.ts Normal file
View File

@@ -0,0 +1,188 @@
import { fallbackVar } from "src/functions";
import { css, customThemeVars, otherThemeVars, themeVars } from "src/types/vars";
export const navbarRight = css`
#navbar {
border-bottom: 0;
padding: 8px 16px; // 上下内边距 + .navbar-left & .navbar-right 的 min-height = 64px
min-height: 64px;
.navbar-left,
.navbar-right {
min-height: 48px;
}
.navbar-left {
gap: 8px;
> .item {
padding: 4px 8px;
min-height: 20px;
&.active {
font-weight: 600;
}
&#navbar-logo {
// 与下方的用户切换头像对齐
padding-left: 6px;
&:hover {
background: unset;
}
img {
height: 32px;
width: 32px;
}
}
}
}
// 进入用户页面后, 避免注册, 登录和首页等意外覆盖
.navbar-right:has(.user-menu) {
gap: 8px;
// 右侧按钮, 但不包括头像
> .item:not(:last-child) {
align-items: center;
justify-content: center;
gap: 4px;
border: 1px solid ${themeVars.color.light.border};
border-radius: ${otherThemeVars.border.radius};
padding: 0;
height: 32px;
min-width: 32px;
min-height: 32px;
// 纠正内容保证居中
.tw-relative {
height: 16px;
width: 16px;
}
.svg {
color: ${themeVars.color.text.light.num1};
}
// 带下拉菜单的按钮
&.ui.dropdown {
padding: 0 8px;
.text {
display: grid;
grid-auto-flow: column;
align-items: center;
> svg {
margin-right: 4px;
}
// 三角号纠正高度保持居中
.not-mobile {
height: 16px;
}
}
&:hover {
background-color: ${themeVars.color.nav.hoverBg};
}
}
}
.item.ui.dropdown {
// 头像菜单
&:last-child {
padding: 0;
.text {
// 不显示小箭头标识
> .not-mobile {
display: none;
}
// 头像
img {
border-radius: 9999px;
height: 32px;
max-height: 32px;
margin: 0 !important;
}
}
&.active {
background: unset;
}
}
}
// 通知和计时器的圆点
a.item {
.notification_count,
.header-stopwatch-dot {
background-color: ${themeVars.github.bgColor.accent.emphasis};
border-radius: 9999px;
color: ${themeVars.color.white};
font-size: 9px;
font-weight: 600;
top: -15px;
left: 11px;
}
}
}
// 用户菜单
.navbar-right .user-menu {
width: ${fallbackVar(customThemeVars.userMenuWidth, "192px")};
max-width: 320px;
> .header {
font-size: 14px;
font-weight: 400;
margin: 0;
padding: 16px 16px 8px 16px;
strong {
font-weight: 600;
}
}
> .divider {
margin: 8px;
width: calc(100% - 16px);
}
}
}
// 手机下的导航栏
@media (max-width: 767.98px) {
#navbar {
&.navbar-menu-open {
gap: 8px;
}
.navbar-mobile-right {
gap: 8px;
> .item {
align-items: center;
justify-content: center;
border: 1px solid ${themeVars.color.light.border};
border-radius: ${otherThemeVars.border.radius};
padding: 0;
height: 32px;
min-width: 32px;
min-height: 32px;
// 纠正内容保证居中
.tw-relative {
height: 16px;
width: 16px;
}
.svg {
margin: 0;
}
}
}
}
}
`;
// 二级导航栏
export const secondaryNav = css`
.page-content > :first-child.secondary-nav {
margin-bottom: 16px;
// 仪表板界面的二级导航栏用户菜单
> .ui.secondary.stackable.menu {
gap: 0px;
min-height: 48px;
> .item {
// 修复手机下的菜单按钮没有居中的问题
margin-top: auto;
margin-bottom: auto;
> .ui.dropdown > .text {
display: inline-flex;
align-items: center;
gap: 4px;
svg {
margin-right: 4px;
}
}
}
> .right.menu {
gap: 4px;
}
}
}
`;

View File

@@ -0,0 +1,182 @@
import { css, otherThemeVars, themeVars } from "src/types/vars";
// 用户订阅/关注页面
export const notification = css`
.page-content.user.notification {
> .ui.container {
> .ui.attached.segment {
border: 0;
padding: 0;
> .divider {
display: none;
}
// 订阅列表
&:has(#issue-list) {
> .tw-flex {
align-items: center;
align-content: center;
background-color: ${themeVars.color.box.header};
border: 1px solid ${themeVars.color.light.border};
border-bottom: 0;
border-top-left-radius: ${otherThemeVars.border.radius};
border-top-right-radius: ${otherThemeVars.border.radius};
height: 52px;
padding: 8px;
// 左侧菜单
> .tw-flex:first-child > .ui.compact.menu {
align-items: center;
border: 0;
> .item {
background: unset !important;
border-radius: ${otherThemeVars.border.radius};
color: ${themeVars.color.text.light.num1};
padding: 0px 8px;
height: 30px;
&:before {
display: none;
}
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover} !important;
}
&.active {
color: ${themeVars.color.text.self};
font-weight: 700;
}
}
}
// 右侧菜单
> .tw-flex:last-child > .ui.menu {
align-items: center;
> .item {
color: ${themeVars.color.text.light.num1};
}
> .ui.button {
padding: 0 12px;
height: 32px;
}
}
}
}
// 关注列表
> .flex-list:not([id]) {
border: 1px solid ${themeVars.color.light.border};
border-radius: ${otherThemeVars.border.radius};
> .flex-item {
padding: 16px;
> .flex-item-main {
gap: 4px;
> .flex-item-header {
> .flex-item-title {
gap: 12px;
}
> .flex-item-trailing {
color: ${themeVars.color.text.light.num1};
font-size: 12px;
font-weight: 400;
gap: 16px;
.color-icon {
width: 12px;
height: 12px;
margin-right: 0 !important;
}
}
}
> .flex-item-body:last-child {
font-size: 12px;
}
}
}
}
}
// 通知列表
&:has(#notification_table) {
> .flex-text-block:first-child {
background-color: ${themeVars.color.box.header};
border: 1px solid ${themeVars.color.light.border};
border-bottom: 0;
border-top-left-radius: ${otherThemeVars.border.radius};
border-top-right-radius: ${otherThemeVars.border.radius};
height: 52px;
padding: 8px;
margin-bottom: 0 !important;
// 左侧菜单
> .ui.compact.menu {
align-items: center;
border: 0;
> .item {
background: unset !important;
border-radius: ${otherThemeVars.border.radius};
color: ${themeVars.color.text.light.num1};
padding: 0px 8px;
height: 30px;
&:before {
display: none;
}
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover} !important;
}
&.active {
color: ${themeVars.color.text.self};
font-weight: 700;
}
.notifications-unread-count {
margin-left: 4px;
}
}
}
}
// 通知全部确认按钮
.ui.ui.ui.ui.mini.button {
height: 32px;
}
}
// 通知列表
#notification_table {
border-top-left-radius: 0;
border-top-right-radius: 0;
color: ${themeVars.color.text.light.num1};
> .notifications-item {
border-top: 1px solid ${themeVars.color.light.border};
padding: 12px !important;
&:first-child {
border-top: 0;
}
&:last-child {
border-bottom-left-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius};
&:hover {
border-bottom-left-radius: 0;
}
}
&:hover {
background: ${themeVars.github.bgColor.accent.muted};
box-shadow: 2px 0 0 ${themeVars.github.borderColor.accent.emphasis} inset;
color: ${themeVars.color.text.self};
}
> .notifications-link > div {
&:first-child {
font-size: 12px !important;
}
&:last-child {
font-size: 14px !important;
}
}
> .notifications-updated {
font-size: 12px;
}
> .notifications-buttons {
.interact-bg {
background: ${themeVars.github.bgColor.accent.muted} !important;
color: ${themeVars.color.text.light.num1};
padding: 8px !important;
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover} !important;
color: ${themeVars.color.text.self};
}
}
}
}
}
}
}
`;

View File

@@ -2,8 +2,24 @@ import { css, themeVars } from "src/types/vars";
export const org = css` export const org = css`
.page-content.organization { .page-content.organization {
// 组织成员头像
.members .ui.avatar {
border-radius: 9999px;
}
// 组织头像
.org-avatar {
margin: 8px 24px 16px 0px;
}
// 组织信息
#org-info { #org-info {
.ui.header { margin-top: 8px; // 与头像对齐
gap: 8px;
// 组织名称
> .ui.header {
font-size: 24px;
> .org-visibility {
margin-left: 8px;
}
// 组织页面的 RSS 订阅按钮 // 组织页面的 RSS 订阅按钮
.ui.label.button { .ui.label.button {
padding: 4px 16px; padding: 4px 16px;
@@ -16,6 +32,17 @@ export const org = css`
} }
} }
} }
// 组织描述
> .markup {
color: ${themeVars.color.text.light.num1};
}
// 组织信息
> .meta {
font-size: 12px;
svg {
color: ${themeVars.color.text.light.num1};
}
}
} }
} }
`; `;

View File

@@ -0,0 +1,125 @@
import { css, otherThemeVars, themeVars } from "src/types/vars";
// 组织/仓库的软件包列表(包含用户但未测试)
export const packagesList = css`
.page-content.packages {
// 这里必须要用 >, 否则会影响到软件包详细信息页的样式
> .ui.container > div:not([class]) {
border: 1px solid ${themeVars.color.light.border};
border-radius: ${otherThemeVars.border.radius};
margin-top: 16px;
.flex-list {
border-top: 1px solid ${themeVars.color.light.border};
&:first-child {
border-top: 0;
}
.flex-item {
padding: 16px;
.flex-item-main {
.flex-item-title {
gap: 8px;
> a {
min-height: 25px;
}
// 软件包类型的标签
.ui.label {
gap: 4px;
padding: 3px 6px;
min-height: 24.5px;
background-color: unset;
border: 1px solid ${themeVars.color.light.border};
color: ${themeVars.color.primary.self};
}
}
.flex-item-body {
font-size: 12px;
a {
text-decoration: underline;
}
}
}
}
}
}
}
`;
// 软件包详细信息页
export const packagesDetail = css`
.page-content.packages {
.issue-title-header > div {
color: ${themeVars.color.text.light.num1};
}
.packages-content {
.packages-content-left {
width: calc(100% - 304px - 16px);
.ui.top.attached.header {
font-size: 14px;
padding: 16px;
}
.ui.attached.segment {
color: ${themeVars.color.text.light.num1};
padding: 16px;
.ui.table,
.ui.form .field > label {
color: ${themeVars.color.text.light.num1};
}
.ui.form .field > label {
margin-bottom: 8px;
}
.markup {
color: ${themeVars.color.text.self};
pre {
font-size: 12px;
font-weight: 400;
padding: 12px 16px;
}
}
+ .ui.top.attached.header {
margin-top: 24px;
}
}
}
.packages-content-right {
border: 0;
padding: 0px 16px;
width: 304px;
> strong {
font-size: 16px;
}
> .divider {
margin: 16px 0px;
}
// 详情
> .ui.relaxed.list {
margin: 16px 0px;
.item {
color: ${themeVars.color.text.light.num1};
svg {
color: ${themeVars.color.text.self};
}
// 应该只选中版本中的 a 标签
&.tw-flex {
justify-content: space-between;
> a {
border: 1px solid ${themeVars.color.light.border};
border-radius: 9999px;
font-size: 12px;
padding: 0px 6px;
min-height: 20px;
flex: none !important;
&:hover {
text-decoration: none;
}
}
// 不知道什么东西
&::after {
display: none;
}
}
}
}
}
}
}
`;

View File

@@ -19,82 +19,6 @@ export const releaseTagMenu = css`
} }
`; `;
// 标签页样式
export const tags = css`
.page-content.repository.tags {
// 标签的选项取消下划线
.tag-list-row {
.tag-list-row-title {
line-height: 1.5;
}
.download {
color: ${themeVars.color.text.light.num1};
font-size: 12px;
a.muted:hover {
text-decoration: none;
}
}
}
}
`;
// 发布页样式
export const releases = css`
.page-content.repository.releases {
#release-list .release-entry {
// 左侧发布元信息
.meta {
gap: 0.5rem;
padding-top: 24px;
padding-right: 40px;
text-align: left;
min-width: 0;
flex: 0.125;
a.muted {
color: ${themeVars.color.text.light.num1};
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;
}
}
// 分支选择按钮
.ui.button.branch-dropdown-button {
min-height: 20px;
line-height: 20px;
padding: 3px 12px;
font-size: 12px;
}
}
// 右侧发布详细信息
.segment.detail {
.svg {
color: ${themeVars.color.text.light.num1};
}
p.text.grey {
margin: 16px 0;
.time {
color: ${themeVars.color.text.self};
}
}
.markup {
> *:first-child {
margin-top: 16px !important;
}
> *:last-child {
margin-bottom: 16px !important;
}
}
}
}
}
`;
// 顶部右侧按钮组 // 顶部右侧按钮组
export const rightButton = css` export const rightButton = css`
.page-content.repository { .page-content.repository {
@@ -103,6 +27,7 @@ export const rightButton = css`
.ui.small.button { .ui.small.button {
background-color: ${themeVars.color.button}; background-color: ${themeVars.color.button};
border-color: ${themeVars.color.light.border}; border-color: ${themeVars.color.light.border};
box-shadow: none;
color: ${themeVars.color.text.light.self}; color: ${themeVars.color.text.light.self};
padding: 5px 16px; padding: 5px 16px;
min-height: auto; min-height: auto;
@@ -114,3 +39,144 @@ export const rightButton = css`
} }
} }
`; `;
// 标签页样式
export const tags = css`
.page-content.repository.tags {
// 标签的选项取消下划线
.tag-list-row {
.tag-list-row-title {
line-height: 1.5;
}
.muted-links {
color: ${themeVars.color.text.light.num1};
font-size: 12px;
svg {
min-width: 12px;
width: 12px;
}
a:hover {
text-decoration: none;
}
}
}
}
`;
// 发布页样式
export const releases = css`
.page-content.repository.releases {
> .ui.container > .divider {
margin: 16px 0;
}
ul#release-list {
gap: 32px;
margin: 32px 0 16px 0;
.release-entry {
// 左侧发布元信息
.meta {
gap: 0.5rem;
padding-top: 24px;
padding-right: 40px;
text-align: left;
min-width: 0;
flex: 0.125;
a.muted {
color: ${themeVars.color.text.light.num1};
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;
}
}
// 分支选择按钮
.ui.button.branch-dropdown-button {
min-height: 20px;
line-height: 20px;
padding: 3px 12px;
font-size: 12px;
}
}
// 右侧发布详细信息
.segment.detail {
padding: 16px;
img.ui.avatar {
border-radius: 9999px;
}
.svg {
color: ${themeVars.color.text.light.num1};
}
// 标题
.release-list-title {
font-size: 32px;
gap: 8px;
}
// 提交信息
p.text.grey {
display: flex;
gap: 6px;
flex-wrap: wrap;
margin: 24px 0 0 0;
span {
word-break: break-word;
}
.time {
color: ${themeVars.color.text.self};
}
}
// 发布内容
.markup {
> *:first-child {
margin-top: 24px !important;
}
}
// 分割线
.divider {
position: relative;
left: -16px;
width: calc(100% + 32px);
border-top-width: 1px;
margin: 24px 0 16px 0;
}
// 下载列表
.download {
summary {
font-size: 16px;
font-weight: 600;
margin-top: 16px;
&::marker {
font-size: 14px;
}
}
.attachment-list {
margin-top: 16px;
.item {
align-items: center;
line-height: 17px;
padding: 8px 16px;
.flex-text-inline {
gap: 8px;
}
// 只选中左侧文件名称
strong.flex-text-inline:hover {
text-decoration: underline !important;
}
.attachment-right-info {
color: ${themeVars.color.text.light.num1};
.svg {
height: 28px;
}
}
}
}
}
}
}
}
}
`;

View File

@@ -7,14 +7,7 @@ export const repoHeader = css`
.ui.compact.button { .ui.compact.button {
padding: 3px 12px; padding: 3px 12px;
} }
// 仓库图标 // 仓库名称
img.ui.avatar {
height: 32px;
width: 32px;
margin-block-start: 0.5rem;
margin-block-end: 0.5rem;
}
.flex-item { .flex-item {
.flex-item-title { .flex-item-title {
// 间隔线颜色 // 间隔线颜色
@@ -24,10 +17,10 @@ export const repoHeader = css`
display: flex; display: flex;
align-items: center; align-items: center;
color: ${themeVars.color.text.self}; color: ${themeVars.color.text.self};
font-size: 16px; font-size: 18px;
text-decoration: none !important; text-decoration: none !important;
min-width: 3ch; min-width: 3ch;
padding: 4px 6px; padding: 0px 6px;
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
margin-top: 0.5rem; margin-top: 0.5rem;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
@@ -78,10 +71,11 @@ export const repoTopic = css`
.flex-item-main > .label-list .ui.label, .flex-item-main > .label-list .ui.label,
// 仓库文件列表下的 topic 标签 // 仓库文件列表下的 topic 标签
#repo-topics .ui.label.repo-topic { #repo-topics .ui.label.repo-topic {
border-radius: 25px; border-radius: 9999px;
font-size: 12px; font-size: 12px;
font-weight: 500; font-weight: 500;
padding: 5px 10px; padding: 0px 10px;
line-height: 22px;
background-color: ${themeVars.github.bgColor.accent.muted}; background-color: ${themeVars.github.bgColor.accent.muted};
color: ${themeVars.github.fgColor.accent}; color: ${themeVars.github.fgColor.accent};
&:hover { &:hover {

View File

@@ -25,7 +25,7 @@ export const button = css`
color: ${themeVars.color.text.light.self}; color: ${themeVars.color.text.light.self};
background-color: ${themeVars.color.button}; background-color: ${themeVars.color.button};
border-color: ${themeVars.color.light.border}; border-color: ${themeVars.color.light.border};
box-shadow: none;
&:hover { &:hover {
background-color: ${themeVars.color.hover.self}; background-color: ${themeVars.color.hover.self};
} }
@@ -57,12 +57,19 @@ export const button = css`
} }
} }
// 管理员设置界面下的自定义主色调按钮 // 管理员设置界面下的自定义主色调按钮
.admin-setting-content .ui.primary.button { .admin-setting-content {
${tinyStyle} .ui.primary.button {
padding: 5px 16px; ${tinyStyle}
line-height: 22px; padding: 5px 16px;
&:hover { line-height: 22px;
${tinyHoverStyle} &:hover {
${tinyHoverStyle}
}
}
.ui.red.button {
box-shadow: ${themeVars.github.shadow.resting.small};
padding: 5px 16px;
line-height: 22px;
} }
} }
`; `;
@@ -76,3 +83,12 @@ export const label = css`
} }
} }
`; `;
// 修复组织设置界面的组织设置中多余的边框
export const fixOrgSetting = css`
.page-content.organization.settings {
.org-setting-content {
border: 0;
}
}
`;

View File

@@ -3,11 +3,14 @@ import { css } from "src/types/vars";
// 注册/登录界面 // 注册/登录界面
export const signIn = css` export const signIn = css`
.page-content.user.signin { .page-content.user.signin {
.ui.grid > .column { .ui.grid {
width: 384px; justify-content: center;
padding: 16px; > .column {
> .ui.container { width: 384px;
max-width: unset; padding: 16px;
> .ui.container {
max-width: unset;
}
} }
} }
.ui.top.attached.header { .ui.top.attached.header {
@@ -15,6 +18,7 @@ export const signIn = css`
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
background-color: unset !important; background-color: unset !important;
text-align: center;
padding: 16px; padding: 16px;
} }
@@ -36,6 +40,15 @@ export const signIn = css`
.button { .button {
height: 40px; height: 40px;
} }
.divider.divider-text {
margin: 20px 0px;
}
#oauth2-login-navigator-inner {
gap: 8px;
.ui.button svg {
width: 18px;
}
}
} }
.ui.top.attached.header.segment { .ui.top.attached.header.segment {
font-size: 14px; font-size: 14px;

View File

@@ -60,3 +60,16 @@ export const stars = css`
} }
} }
`; `;
// 用户信息卡片
export const profileCard = css`
.page-content.user.profile {
#profile-avatar-card {
#profile-avatar {
img.ui.avatar {
border-radius: 9999px;
}
}
}
}
`;

View File

@@ -6,3 +6,5 @@
import "./public"; import "./public";
// 组件样式 // 组件样式
import "./components"; import "./components";
// 模板专属样式
import "./templates";

View File

@@ -0,0 +1,36 @@
import { overlayAppear, overlayAppearDown, overlayAppearUp } from "src/core/theme";
import { css } from "src/types/vars";
export const keyframe = css`
// 出现动画
@keyframes ${overlayAppear} {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
// 向下出现动画
@keyframes ${overlayAppearDown} {
0% {
opacity: 0;
transform: translateY(-8px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
// 向上出现动画
@keyframes ${overlayAppearUp} {
0% {
opacity: 0;
transform: translateY(8px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
`;

View File

@@ -1,4 +1,4 @@
import { css, themeVars, otherThemeVars } from "src/types/vars"; import { css, otherThemeVars, themeVars } from "src/types/vars";
export const attached = css` export const attached = css`
// 设置右面板的内容 // 设置右面板的内容
@@ -7,6 +7,7 @@ export const attached = css`
.user-setting-content, .user-setting-content,
.org-setting-content, .org-setting-content,
.admin-setting-content, .admin-setting-content,
// 仓库动态页面
// 新建页面内容 // 新建页面内容
.page-content.repository.new-repo, .page-content.repository.new-repo,
.page-content.repository.new.migrate, .page-content.repository.new.migrate,
@@ -18,19 +19,45 @@ export const attached = css`
font-weight: 400; font-weight: 400;
background-color: unset !important; background-color: unset !important;
margin-bottom: 0.25rem; margin-bottom: 0.25rem;
padding-left: 0;
padding-right: 0;
> .ui.right {
right: 0;
}
} }
.ui.attached.segment { .ui.attached.segment {
background-color: unset; background-color: unset;
border-radius: ${otherThemeVars.border.radius} !important; border-top-left-radius: ${otherThemeVars.border.radius} !important;
} border-top-right-radius: ${otherThemeVars.border.radius} !important;
border-bottom-left-radius: 0 !important;
.ui.attached.segment:not(.error) { border-bottom-right-radius: 0 !important;
border: 1px solid ${themeVars.color.light.border} !important; border: 1px solid ${themeVars.color.light.border} !important;
+ .ui.attached.segment {
border-top: 0 !important;
border-top-left-radius: 0 !important;
border-top-right-radius: 0 !important;
}
&:has(+ :not(.ui.attached.segment)),
&:last-child {
border-bottom-left-radius: ${otherThemeVars.border.radius} !important;
border-bottom-right-radius: ${otherThemeVars.border.radius} !important;
}
} }
.ui.attached.segment.error { .ui.attached.segment.error {
border: 1px solid ${themeVars.color.error.border} !important; border: 1px solid ${themeVars.color.error.border} !important;
} }
} }
`; `;
// 仓库活动页面下的边框线修复
export const fixActivity = css`
.page-content.repository.commits .flex-container-main:has(.ui.header.activity-header) {
> .ui.attached.segment {
border-radius: 0;
&:has(+ :not(.ui.attached.segment)) {
border-bottom-left-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius};
}
}
}
`;

14
styles/public/base.ts Normal file
View File

@@ -0,0 +1,14 @@
import { css } from "src/types/vars";
export const body = css`
body {
line-height: 1.5;
}
a {
text-underline-offset: 0.2rem; // 0.2rem 可以始终保持下划线不受 overflow: hidden 的影响
}
// 默认代码块
code:not(.code-inner) {
padding: 0.2em 0.4em;
}
`;

View File

@@ -4,6 +4,7 @@ export const primaryStyle = {
color: themeVars.github.button.primary.fgColor.rest, color: themeVars.github.button.primary.fgColor.rest,
backgroundColor: themeVars.github.button.primary.bgColor.rest, backgroundColor: themeVars.github.button.primary.bgColor.rest,
borderColor: themeVars.github.button.primary.borderColor.rest, borderColor: themeVars.github.button.primary.borderColor.rest,
boxShadow: themeVars.github.shadow.resting.small,
}; };
export const primaryHoverStyle = { export const primaryHoverStyle = {
@@ -27,7 +28,7 @@ export const baseButton = css`
} }
// 主色调按钮保持白色 // 主色调按钮保持白色
.ui.primary.buttons .button svg { .ui.primary.buttons .button svg {
color: ${themeVars.color.text.self}; color: ${themeVars.color.white};
} }
.ui.primary { .ui.primary {
&.button, &.button,
@@ -38,6 +39,14 @@ export const baseButton = css`
${primaryHoverStyle} ${primaryHoverStyle}
} }
} }
// 按钮组整体有阴影
&.buttons {
box-shadow: ${themeVars.github.shadow.resting.small};
.button {
// 按钮组里的按钮无阴影
box-shadow: none;
}
}
} }
// 主色调基本按钮和普通按钮一样 // 主色调基本按钮和普通按钮一样
// 作者的关注按钮 // 作者的关注按钮
@@ -45,6 +54,7 @@ export const baseButton = css`
background-color: ${themeVars.color.button}; background-color: ${themeVars.color.button};
color: ${themeVars.color.text.self}; color: ${themeVars.color.text.self};
border-color: ${themeVars.color.light.border}; border-color: ${themeVars.color.light.border};
box-shadow: none;
&:hover { &:hover {
background-color: ${themeVars.color.hover.self}; background-color: ${themeVars.color.hover.self};
color: ${themeVars.color.text.self}; color: ${themeVars.color.text.self};
@@ -85,17 +95,34 @@ export const redButton = css`
color: ${themeVars.github.button.danger.fgColor.hover}; color: ${themeVars.github.button.danger.fgColor.hover};
background-color: ${themeVars.github.button.danger.bgColor.hover}; background-color: ${themeVars.github.button.danger.bgColor.hover};
border-color: ${themeVars.github.button.danger.borderColor.hover}; border-color: ${themeVars.github.button.danger.borderColor.hover};
box-shadow: ${themeVars.github.shadow.resting.small};
} }
} }
`; `;
// 修复按钮高度 // 修复按钮高度
export const fixButtonHeight = css` export const fixButtonHeight = css`
// 修复一些主色调或者其他小按钮的高度避免过高
.ui.small.buttons .button, .ui.small.buttons .button,
.ui.ui.ui.ui.small.button { .ui.ui.ui.ui.small.button {
min-height: 26px; min-height: 26px;
height: 32px;
} }
.ui.tiny.buttons .button, // 修复仓库页仓库操作按钮高度对齐和修正
.repo-button-row .ui.button {
min-height: 32px;
height: 32px;
}
// 修复因上面小按钮高度导致仓库星标克隆等按钮高度过高
.repo-header {
.ui.ui.ui.ui.small.compact.button,
.ui.labeled.button > .label {
height: 28px;
min-height: 28px;
line-height: 1.5;
}
}
.ui.ui.ui.ui.small.button.compact .ui.tiny.buttons .button,
.ui.ui.ui.ui.tiny.button { .ui.ui.ui.ui.tiny.button {
min-height: 20px; min-height: 20px;
} }
@@ -106,4 +133,9 @@ export const fixButton = css`
.ui.ui.ui.ui.small.button { .ui.ui.ui.ui.small.button {
z-index: 0; z-index: 0;
} }
// 代码复制按钮
.ui.button.code-copy {
padding: 4px 6px;
min-height: 28px;
}
`; `;

View File

@@ -1,5 +1,6 @@
import { animationDown, animationUp } from "src/core/theme"; import { animationDown, animationUp } from "src/core/theme";
import { css, otherThemeVars, themeVars } from "src/types/vars"; import { fallbackVar } from "src/functions";
import { css, customThemeVars, otherThemeVars, themeVars } from "src/types/vars";
import { activeItemAfterStyle } from "styles/public/menu"; import { activeItemAfterStyle } from "styles/public/menu";
export const dropdown = css` export const dropdown = css`
@@ -16,19 +17,27 @@ export const dropdown = css`
> .item:not(.tw-hidden) { > .item:not(.tw-hidden) {
display: flex !important; display: flex !important;
align-items: center; align-items: center;
gap: 0.5rem; align-content: center;
padding: 8px 10px !important; padding: 6px 8px !important;
min-height: 32px;
border-radius: ${otherThemeVars.border.radius} !important; border-radius: ${otherThemeVars.border.radius} !important;
gap: 4px;
&:not(.emoji) { &:not(.emoji) {
margin: 0 0.5rem; margin: 0 8px;
} }
&:not(.emoji):first-of-type { &:not(.emoji):first-of-type {
margin-top: 0.5rem; margin-top: 8px;
// 工单详细页面的标签菜单中的清除选中标签按钮
&.clear-selection {
margin-top: 0px;
}
} }
// 不知道为什么提交差异对比页面操作中的 cherrypick 按钮无法被选中 // 不知道为什么提交差异对比页面操作中的 cherrypick 按钮无法被选中
&.cherry-pick-button, &.cherry-pick-button,
// 下一个 item 是最后一个并且被隐藏时, 目前仅在顶部导航栏工单和 PR 仪表板的菜单中出现
&:has(+ .tw-hidden:last-of-type),
&:not(.emoji):last-of-type { &:not(.emoji):last-of-type {
margin-bottom: 0.5rem; margin-bottom: 8px;
} }
&:hover { &:hover {
background-color: ${themeVars.github.control.transparent.bgColor.hover} !important; background-color: ${themeVars.github.control.transparent.bgColor.hover} !important;
@@ -46,9 +55,35 @@ export const dropdown = css`
${activeItemAfterStyle}; ${activeItemAfterStyle};
} }
} }
svg {
margin-top: 2px;
margin-right: 2px;
}
// 复选框对齐
.ui.checkbox input[type="checkbox"] {
height: 100%;
}
// 修复 Wiki 页面下搜索框中搜索时, 显示隐藏的项目
&.filtered {
display: none !important;
}
}
// 当筛选后, 让菜单提供边距, 因为无法确定保留的是菜单中哪个 item
// 不是所有菜单都提供边距方式, 原因为比如会导致分支菜单中的查看所有分支上间隔缺失, 这种方式单独为 Wiki 菜单做处理
// 有筛选(.filtered)且有筛选结果(.selected)时提供菜单边距, 没结果时提供会导致多余的菜单边框线
&:has(> .item.filtered):has(> .item.selected) {
padding: 8px 0px;
> .item {
&:first-of-type {
margin-top: 0;
}
&:last-of-type {
margin-bottom: 0;
}
}
} }
> .divider { > .divider {
margin: 0.5rem 0; margin: 8px 0;
} }
&:after { &:after {
display: none !important; display: none !important;
@@ -58,16 +93,32 @@ export const dropdown = css`
// 向下弹出的下拉菜单向下偏移 // 向下弹出的下拉菜单向下偏移
.ui.dropdown:not(.upward), .ui.dropdown:not(.upward),
.ui.menu .ui.dropdown:not(.upward) { .ui.menu .ui.dropdown:not(.upward) {
.menu { > .menu {
margin-top: 0.35em !important; margin-top: 4px !important;
} }
} }
// 向上弹出的下拉菜单向上偏移 // 向上弹出的下拉菜单向上偏移
.ui.dropdown.upward, .ui.dropdown.upward,
.ui.menu .ui.dropdown.upward { .ui.menu .ui.dropdown.upward {
.menu { > .menu {
animation: ${animationUp}; animation: ${animationUp};
margin-bottom: 0.35em !important; margin-bottom: 4px !important;
}
}
// 修复 wiki 的页面下拉菜单圆角
.ui.floating.dropdown > .menu {
border-radius: 12px !important;
}
// 修复嵌套菜单的圆角问题, wiki 页面和组织页面的用户下拉菜单
.ui.dropdown .menu {
.scrolling.menu {
border-radius: 0 0 12px 12px !important;
}
// 修复仪表板切换用户按钮菜单下无创建组织按钮时的菜单圆角
&.context-user-switch {
.scrolling.menu:last-child {
border-radius: 0 0 12px 12px !important;
}
} }
} }
// 修复下拉菜单元素溢出问题 // 修复下拉菜单元素溢出问题
@@ -75,7 +126,7 @@ export const dropdown = css`
.user-menu>.item, .user-menu>.item,
// Issue/PR 菜单 // Issue/PR 菜单
.ui.menu .ui.dropdown.item .menu .item { .ui.menu .ui.dropdown.item .menu .item {
width: auto; width: calc(100% - 16px); // 减去上方 item 的 margin 左右边距
} }
// 去掉下拉菜单的边框线 // 去掉下拉菜单的边框线
// 设置里的下拉菜单 // 设置里的下拉菜单
@@ -175,6 +226,19 @@ export const selectionDropdown = css`
border-top-left-radius: ${otherThemeVars.border.radius} !important; border-top-left-radius: ${otherThemeVars.border.radius} !important;
border-top-right-radius: ${otherThemeVars.border.radius} !important; border-top-right-radius: ${otherThemeVars.border.radius} !important;
} }
// 工单标签菜单中的标签换行和颜色
// 标签页面的标签选择框
.page-content.repository.labels .ui.selection.dropdown.active,
// 创建仓库页面的标签选择框
.page-content.repository.new-repo .ui.search.selection.dropdown {
> .menu > .item {
flex-direction: column;
align-items: flex-start;
> i {
color: ${themeVars.color.text.light.num1};
}
}
}
`; `;
export const fixSelectionDropdown = css` export const fixSelectionDropdown = css`
@@ -187,8 +251,38 @@ export const fixSelectionDropdown = css`
// 分支菜单 // 分支菜单
export const branchDropdown = css` export const branchDropdown = css`
.ui.dropdown.branch-selector-dropdown .menu > .item { .ui.dropdown.branch-selector-dropdown > .menu {
animation: ${animationDown}; width: ${fallbackVar(customThemeVars.branchMenuWidth, "320px")};
max-width: 640px;
> .menu > .item {
animation: ${animationDown};
height: 32px;
}
// 分支/标签切换
> .branch-tag-tab {
> .branch-tag-item {
font-weight: 500;
padding: 8px 12px;
height: 32px;
line-height: 1.15;
svg {
display: none;
}
&.active {
background: ${themeVars.color.body};
}
&:hover {
color: inherit;
&:not(.active) {
background: ${themeVars.color.hover.self};
border: 1px solid ${themeVars.color.secondary.self};
border-bottom: 0;
border-top-left-radius: ${otherThemeVars.border.radius};
border-top-right-radius: ${otherThemeVars.border.radius};
}
}
}
}
} }
`; `;

View File

@@ -1,8 +1,11 @@
// organize-imports-ignore // organize-imports-ignore
// tslint:disable:ordered-imports // tslint:disable:ordered-imports
// 组件导入有顺序, 禁止插件优化 // 组件导入有顺序, 禁止插件优化
import "./base"; // 基础样式, 确保在其他样式之前导入
import "./radius"; // 圆角, 此样式为基础样式, 确保在其他样式之前导入 import "./radius"; // 圆角, 此样式为基础样式, 确保在其他样式之前导入
import "./animation"; // 动画效果
import "./transition"; // 过渡效果 import "./transition"; // 过渡效果
import "./table"; // 表格
import "./text"; // 文本或 SVG 的基本颜色 import "./text"; // 文本或 SVG 的基本颜色
import "./button"; // 按钮 import "./button"; // 按钮
import "./dropdown"; // 下拉框 import "./dropdown"; // 下拉框
@@ -11,5 +14,5 @@ import "./label"; // 标签
import "./menu"; // 菜单 import "./menu"; // 菜单
import "./modal"; // 弹窗 import "./modal"; // 弹窗
import "./tippy"; // 提示框 import "./tippy"; // 提示框
import "./navbar"; // 导航栏
import "./attached"; // 附加样式 import "./attached"; // 附加样式
import "./other"; // 其他样式

View File

@@ -35,7 +35,12 @@ export const input = css`
height: 32px; height: 32px;
} }
// 由于输入框高度, 需要输入框在表单中垂直居中 // 由于输入框高度, 需要输入框在表单中垂直居中
.ui.form { // 管理员页面仓库搜索表单
.ui.form#repo-search-form {
align-items: center; align-items: center;
} }
// 下拉菜单的输入框
.ui.dropdown.dropdown .menu > .input {
margin: 12px 10px;
}
`; `;

View File

@@ -1,72 +1,95 @@
import { css, themeVars } from "src/types/vars"; import { css, themeVars } from "src/types/vars";
export const labelStyle = {
padding: "0px 6px",
};
export const label = css` export const label = css`
.ui.label {
border: 1px solid #00000000;
}
/* 所有标签, 但不包括 a 标签 */ /* 所有标签, 但不包括 a 标签 */
/* a 标签比如仓库点星等按钮旁边的数字标签按钮,提交图中的 tag 标签 */ /* a 标签比如仓库点星等按钮旁边的数字标签按钮,提交图中的 tag 标签 */
div, div.label,
span { span.label,
// 包含多个标签的元素, 比如 Issue/PR 详情页中的时间线上的标签
span.labels-list a.label {
&.ui.ui.ui { &.ui.ui.ui {
&.label { border-radius: 9999px;
border-radius: 25px; ${labelStyle}
// 多个标签的组合标签的圆角修复 line-height: 18px;
&.scope-parent { &.mini {
.scope-left { line-height: 16px;
border-top-right-radius: 0; }
border-bottom-right-radius: 0; // 多个标签的组合标签的圆角修复
} &.scope-parent {
.scope-middle { .scope-left {
border-radius: 0; border-top-right-radius: 0;
} border-bottom-right-radius: 0;
.scope-right {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
} }
/* 主色调标签 */ .scope-middle {
&.primary { border-radius: 0;
background-color: unset;
border: 1px solid ${themeVars.color.primary.self};
color: ${themeVars.color.primary.self};
} }
/* 红色标签 */ .scope-right {
&.red { border-top-left-radius: 0;
background-color: unset; border-bottom-left-radius: 0;
border: 1px solid ${themeVars.github.borderColor.done.emphasis};
color: ${themeVars.color.purple.self};
}
/* 橙色标签 */
&.orange {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.attention.emphasis};
color: ${themeVars.color.yellow.self};
}
/* 黄色标签 */
&.yellow {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.attention.emphasis};
color: ${themeVars.color.orange.self};
}
/* 黄绿色标签 */
&.olive {
background-color: unset;
border: 1px solid ${themeVars.color.olive.self};
color: ${themeVars.color.olive.self};
}
/* 绿色标签 */
&.green {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.success.emphasis};
color: ${themeVars.color.green.self};
}
/* 紫色标签 */
&.purple {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.done.emphasis};
color: ${themeVars.color.purple.self};
} }
} }
} }
} }
div,
span {
&.ui.ui.ui.label {
/* 主色调标签 */
&.primary {
background-color: unset;
border: 1px solid ${themeVars.color.primary.self};
color: ${themeVars.color.primary.self};
}
/* 红色标签 */
&.red {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.done.emphasis};
color: ${themeVars.color.purple.self};
}
/* 橙色标签 */
&.orange {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.attention.emphasis};
color: ${themeVars.color.yellow.self};
}
/* 黄色标签 */
&.yellow {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.attention.emphasis};
color: ${themeVars.color.orange.self};
}
/* 黄绿色标签 */
&.olive {
background-color: unset;
border: 1px solid ${themeVars.color.olive.self};
color: ${themeVars.color.olive.self};
}
/* 绿色标签 */
&.green {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.success.emphasis};
color: ${themeVars.color.green.self};
}
/* 紫色标签 */
&.purple {
background-color: unset;
border: 1px solid ${themeVars.github.borderColor.done.emphasis};
color: ${themeVars.color.purple.self};
}
}
}
.ui.small.label {
font-size: 12px;
}
.ui.mini.label {
font-size: 10px;
}
`; `;
// 提交中的 SHA 标签 // 提交中的 SHA 标签
@@ -78,6 +101,8 @@ export const shaLabel = css`
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
font-size: 12px; font-size: 12px;
font-weight: 500; font-weight: 500;
// 仪表盘页的提交 SHA 标签居中对齐
margin-top: 2px;
&:hover { &:hover {
background-color: ${themeVars.color.label.hoverBg}; background-color: ${themeVars.color.label.hoverBg};
} }
@@ -89,14 +114,23 @@ export const shaLabel = css`
background-color: ${themeVars.color.label.hoverBg} !important; background-color: ${themeVars.color.label.hoverBg} !important;
} }
span.ui.label.commit-is-signed { span.ui.label.commit-is-signed {
padding: 3px 5px;
margin-left: 5px; margin-left: 5px;
height: 25px;
}
img.ui.avatar {
border-radius: 9999px;
} }
} }
} }
// 修复带验证的提交 SHA 标签的高度
.ui.label.commit-id-short {
height: 25px;
}
// 验证提交附带的图标 // 验证提交附带的图标
span.ui.label.commit-is-signed { span.ui.label.commit-is-signed {
height: 25px;
min-width: 35px;
justify-content: center;
// 验证信任 // 验证信任
&.sign-trusted { &.sign-trusted {
border: 1.5px solid ${themeVars.color.green.badge.self} !important; border: 1.5px solid ${themeVars.color.green.badge.self} !important;
@@ -129,6 +163,19 @@ export const shaLabel = css`
background-color: ${themeVars.color.red.badge.hover.bg} !important; background-color: ${themeVars.color.red.badge.hover.bg} !important;
} }
} }
span {
display: inline-flex;
align-items: center;
justify-content: center;
}
}
span.ui.label.commit-is-signed,
.ui.label.commit-id-short,
.ui.label.commit-sign-badge {
font-size: 12px;
.ui.avatar {
border-radius: 9999px;
}
} }
`; `;
@@ -173,26 +220,6 @@ export const repoLabel = css`
color: ${themeVars.color.text.light.num1}; color: ${themeVars.color.text.light.num1};
font-size: 12px; font-size: 12px;
font-weight: 500; font-weight: 500;
padding: 3px 6px;
}
}
.org-visibility span.ui.basic.label {
font-size: 14px;
}
`;
// 软件包列表
export const packagesLabel = css`
.page-content {
&.packages {
> .ui.container > div > .flex-list {
// 软件包类型的标签
.ui.label {
background-color: unset;
border: 1px solid ${themeVars.color.light.border};
color: ${themeVars.color.primary.self};
}
}
} }
} }
`; `;

View File

@@ -1,10 +1,11 @@
import { css, otherThemeVars, themeVars } from "src/types/vars"; import { css, otherThemeVars, themeVars } from "src/types/vars";
import { labelStyle } from "./label";
export const activeItemAfterStyle = { export const activeItemAfterStyle = {
backgroundColor: themeVars.github.borderColor.accent.emphasis, backgroundColor: themeVars.github.borderColor.accent.emphasis,
borderRadius: otherThemeVars.border.radius, borderRadius: otherThemeVars.border.radius,
height: "24px", height: "24px",
left: "calc(0.5rem * -1)", left: "-8px",
position: "absolute", position: "absolute",
top: "calc(50% - 12px)", top: "calc(50% - 12px)",
width: "4px", width: "4px",
@@ -139,6 +140,10 @@ export const menu = css`
} }
} }
} }
// 菜单标签样式
.ui.menu .item > .label:not(.floating) {
${labelStyle}
}
`; `;
export const secondaryMenu = css` export const secondaryMenu = css`
@@ -149,11 +154,14 @@ export const secondaryMenu = css`
height: 32px; height: 32px;
font-weight: 500; font-weight: 500;
} }
a.item:hover {
background: ${themeVars.github.control.transparent.bgColor.hover};
}
} }
// 二级导航栏, 比如仓库的导航栏, 仓库列表的导航栏, 探索的类型导航栏 // 二级导航栏, 比如仓库的导航栏, 仓库列表的导航栏, 探索的类型导航栏
.ui.secondary.pointing.menu { .ui.secondary.pointing.menu {
.overflow-menu-items { .overflow-menu-items {
gap: 0.5rem; gap: 4px;
.item { .item {
padding: 5px 8px !important; padding: 5px 8px !important;
margin-block-start: 0.5rem; margin-block-start: 0.5rem;
@@ -192,6 +200,10 @@ export const secondaryMenu = css`
} }
} }
} }
// 修复仓库页面下的二级导航栏的下划线因浏览器 BUG 导致显示的异常问题(导致下划线和分割线重叠变粗)
.page-content.repository .ui.secondary.pointing.menu {
border-bottom: none !important;
}
`; `;
// 分页菜单 // 分页菜单
@@ -201,6 +213,7 @@ export const paginationMenu = css`
background-color: unset; background-color: unset;
border: 0; border: 0;
gap: 4px; gap: 4px;
min-height: fit-content;
.item { .item {
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
min-width: 32px; min-width: 32px;
@@ -236,3 +249,55 @@ export const paginationMenu = css`
} }
} }
`; `;
// 单行双选项菜单
export const smallCompactMenu = css`
// 订阅/关注切换菜单(应只选中订阅/关注页面, 不能选中通知页面)
.page-content.user.notification > .ui.container:has(.flex-list),
// 里程碑/标签切换菜单(里程碑页)
.page-content.repository.milestones .list-header,
// 里程碑/标签切换菜单(新建里程碑页)
.page-content.repository.new.milestone .issue-navbar,
// 里程碑/标签切换菜单(标签页)
.page-content.repository.labels .issue-navbar {
.ui.compact.small.menu.small-menu-items {
background: ${themeVars.color.hover.self} !important;
border: 0;
font-size: 14px;
gap: 8px;
height: 32px;
min-height: 32px !important;
> .item {
background: unset !important;
border: 1px solid ${themeVars.color.hover.self};
border-radius: ${otherThemeVars.border.radius};
padding: 6px 12px !important;
&.active {
background: ${themeVars.color.menu} !important;
border-color: ${themeVars.color.light.border};
font-weight: 600;
}
&::before {
display: none;
}
&:not(.active) {
top: 4px;
padding: 4px 12px !important;
height: calc(100% - 8px);
position: relative;
// 该方案只适用于 2 个 item 的情况
// left / right 数值为 gap 数值的一半
&:first-child {
left: 4px;
}
&:last-child {
right: 4px;
}
&:hover {
background: ${themeVars.github.control.transparent.bgColor.hover} !important;
}
}
}
}
}
`;

View File

@@ -1,104 +0,0 @@
import { css, otherThemeVars, themeVars } from "src/types/vars";
export const navbarRight = css`
#navbar {
// 进入用户页面后, 避免注册, 登录和首页等意外覆盖
.navbar-right:has(.user-menu) {
gap: 8px;
// 右侧按钮, 但不包括头像
> .item:not(:last-child) {
display: grid;
gap: 4px;
grid-auto-columns: max-content;
align-items: center;
align-content: center;
justify-content: center;
border: 1px solid ${themeVars.color.light.border};
border-radius: ${otherThemeVars.border.radius};
padding: unset;
height: 32px;
min-width: 32px;
min-height: 32px;
// 纠正内容保证居中
.tw-relative {
height: 16px;
width: 16px;
}
.svg {
color: ${themeVars.color.text.light.num1};
}
// 带下拉菜单的按钮
&.ui.dropdown {
padding: 0 8px;
.text {
display: grid;
grid-auto-flow: column;
align-items: center;
> svg {
margin-right: 8px;
}
// 三角号纠正高度保持居中
.not-mobile {
height: 16px;
}
}
&:hover {
background-color: ${themeVars.color.nav.hoverBg};
}
}
}
.item.ui.dropdown {
// 头像菜单
&:last-child {
padding-left: 2px; // 调整此选项需同步增减相同的标识的 left
padding-right: 16px;
.text {
// 不显示小箭头标识
> .not-mobile {
display: none;
}
// 头像
img {
border-radius: 25px;
height: 32px;
max-height: 32px;
}
}
}
// 用户头像的管理员标识
.navbar-profile-admin {
background-color: ${themeVars.github.bgColor.accent.emphasis};
border-radius: 25px;
color: ${themeVars.color.white};
font-size: 8px;
font-weight: 600;
padding: 2px 5px;
top: -3px;
left: 22px;
}
}
// 通知和计时器的圆点
a.item {
.notification_count,
.header-stopwatch-dot {
background-color: ${themeVars.github.bgColor.accent.emphasis};
border-radius: 25px;
color: ${themeVars.color.white};
font-size: 8px;
font-weight: 600;
top: -14px;
left: 12px;
}
}
}
}
// 手机下的创建菜单按钮
@media (max-width: 767.98px) {
#navbar .navbar-right:has(.user-menu) > .item:not(:last-child) {
display: none;
}
#navbar.navbar-menu-open .navbar-right:has(.user-menu) > .item:not(:last-child) {
display: grid;
}
}
`;

33
styles/public/other.ts Normal file
View File

@@ -0,0 +1,33 @@
import { css, themeVars } from "src/types/vars";
// 一些列表头, 比如工单的搜索标签里程碑栏
export const listHeader = css`
.list-header {
align-items: center;
align-content: center;
}
`;
export const svg = css`
// 已标星的图标
.octicon-star-fill {
color: ${themeVars.github.button.star.iconColor} !important;
}
// VSCode 图标
.gitea-vscode {
color: #007acc !important;
}
// VSCodium 图标
.gitea-vscodium {
color: #429cf0 !important;
}
`;
export const avatar = css`
img.ui.avatar,
.ui.avatar img,
.ui.avatar svg {
background-color: ${themeVars.github.avatar.bgColor};
box-shadow: 0 0 0 1px ${themeVars.github.avatar.borderColor};
}
`;

8
styles/public/table.ts Normal file
View File

@@ -0,0 +1,8 @@
import { css, themeVars } from "src/types/vars";
export const table = css`
.ui.table > tr > td,
.ui.table > tbody > tr > td {
border-top: 1px solid ${themeVars.color.secondary.alpha.num70};
}
`;

View File

@@ -1,20 +1,24 @@
import { animationDown } from "src/core/theme"; import { animation, animationDown } from "src/core/theme";
import { css, otherThemeVars, themeVars } from "src/types/vars"; import { css, otherThemeVars, themeVars } from "src/types/vars";
// 一些界面内的提示框, 比如克隆按钮, PR信息, Runner信息 等 // 一些界面内的提示框, 比如克隆按钮, PR信息, Runner信息 等
export const tippyBox = css` export const tippyBox = css`
.tippy-box { .tippy-box {
margin-top: -3px; margin-top: -3px;
border-radius: 12px; border-radius: ${otherThemeVars.border.radius};
overflow: hidden; overflow: hidden;
animation: ${animationDown}; animation: ${animationDown};
// 边框线同步 github 样式 // 克隆菜单和PR提示框为 default
&[data-theme="default"], &[data-theme="default"],
// 带标题的提示框 (Runner信息)
&[data-theme="box-with-header"] { &[data-theme="box-with-header"] {
border: unset; border: unset;
box-shadow: ${themeVars.github.shadow.floating.small}; box-shadow: ${themeVars.github.shadow.floating.small};
} }
// 带标题的提示框 (Runner信息) &[data-theme="default"],
&[data-theme="menu"] {
border-radius: 12px;
}
&[data-theme="box-with-header"] { &[data-theme="box-with-header"] {
.tippy-content { .tippy-content {
background-color: ${themeVars.color.menu}; background-color: ${themeVars.color.menu};
@@ -26,14 +30,25 @@ export const tippyBox = css`
// 差异对比中文件路径行右侧的三个点菜单 // 差异对比中文件路径行右侧的三个点菜单
&[data-theme="menu"] { &[data-theme="menu"] {
.tippy-content { .tippy-content {
padding: 0.5rem; padding: 8px;
.item { .item {
border-radius: ${otherThemeVars.border.radius}; border-radius: ${otherThemeVars.border.radius};
padding: 6px 8px;
height: 32px;
&:hover { &:hover {
background-color: ${themeVars.github.control.transparent.bgColor.hover}; background-color: ${themeVars.github.control.transparent.bgColor.hover};
} }
} }
} }
} }
// 专门用于提示信息的提示框, 比如提交的具体时间, 任务状态等
&[data-theme="tooltip"] {
${animation};
.tippy-content {
font-size: 12px;
font-weight: 400;
padding: 4px 8px;
}
}
} }
`; `;

View File

@@ -0,0 +1 @@
import "./repo";

View File

@@ -0,0 +1,41 @@
import { css, otherThemeVars, themeVars } from "src/types/vars";
export const commitSignBadge = css`
a.ui.label.commit-id-short.github-theme-commit-sha {
gap: 8px;
padding: unset;
margin: unset;
height: 26px;
margin: 0 4px;
&.commit-is-signed {
&:hover {
background-color: unset !important;
}
span.ui.label.commit-sign-badge.commit-is-signed {
margin: unset;
}
}
.github-theme-sha {
border-radius: ${otherThemeVars.border.radius};
font-family:
-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji";
font-weight: 500;
padding: 0px 8px;
height: 26px;
min-width: 85px; // 非等宽字体导致不对齐, 目前看到最大长度为 83px
display: flex;
align-items: center;
justify-content: center;
&:hover {
background-color: ${themeVars.color.hover.self};
}
}
}
.ui.label.commit-sign-badge.github-theme-commit-sign-badge {
font-family:
-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji";
font-weight: 500;
}
`;

View File

@@ -0,0 +1,108 @@
import { css, otherThemeVars, themeVars } from "src/types/vars";
const primary = "primary" as const;
const secondary = "secondary" as const;
const metadata = "metadata" as const;
const actions = "actions" as const;
export const commitsList = css`
ul.github-theme-templates-commits-list {
margin: 0;
padding: 0;
list-style: none;
li.github-theme-commit {
border-bottom: 1px solid ${themeVars.color.secondary.self};
padding: 8px 16px;
display: grid;
grid-template-areas: "${primary} ${metadata} ${actions}" "${secondary} ${metadata} ${actions}";
grid-template-rows: repeat(2, auto);
grid-template-columns: minmax(30%, 1fr) minmax(0, max-content) min-content;
&:last-child {
border-bottom: none;
border-bottom-left-radius: ${otherThemeVars.border.radius};
border-bottom-right-radius: ${otherThemeVars.border.radius};
}
&:hover {
background-color: ${themeVars.color.hover.opaque};
}
.message {
grid-area: ${primary};
.commit-summary {
font-size: 16px;
font-weight: 500;
white-space: pre-wrap;
}
.ellipsis-button {
padding: unset;
height: 1.5rem;
min-width: 1.75rem;
background: unset;
border: unset;
vertical-align: bottom;
&:hover {
background: ${themeVars.color.hover.self};
}
}
.commit-body {
font-size: 12px;
font-weight: 400;
color: ${themeVars.color.text.light.num1};
margin: 8px 0;
}
}
.metadata {
grid-area: ${secondary};
font-size: 12px;
color: ${themeVars.color.text.light.num1};
display: flex;
align-items: center;
flex-direction: row;
gap: 4px;
img.ui.avatar {
border-radius: 9999px;
margin-right: 4px;
}
.ui.label svg {
min-width: 12px;
min-height: 12px;
width: 12px;
height: 12px;
}
}
.extra {
grid-area: ${metadata};
display: flex;
align-items: center;
flex-direction: row;
flex-wrap: wrap;
column-gap: 8px;
.github-theme-tag {
border-width: 1.5px;
border-radius: 9999px;
height: 25px;
}
}
.actions {
grid-area: ${actions};
display: flex;
align-items: center;
flex-direction: row;
gap: 4px;
color: ${themeVars.color.text.light.num1};
.github-theme-action {
justify-content: center;
height: 28px;
width: 28px;
}
}
}
}
@media (max-width: 767.98px) {
ul.github-theme-templates-commits-list {
li.github-theme-commit {
grid-template-areas: "${primary} ${primary}" "${metadata} ${actions}" "${secondary} ${actions}";
grid-template-rows: repeat(3, auto);
}
}
}
`;

View File

@@ -0,0 +1,4 @@
import "./commit_sign_badge";
import "./commits_list";
import "./view_content";
import "./view_list";

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