@xingwangzhe/stalux 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/package.json +108 -0
  4. package/scripts/cli.mjs +103 -0
  5. package/src/assets/BiCcCircle.svg +1 -0
  6. package/src/assets/astro.svg +1 -0
  7. package/src/assets/background/README.md +3 -0
  8. package/src/assets/background/pattern-1.min.svg +1 -0
  9. package/src/assets/background/pattern-10.min.svg +1 -0
  10. package/src/assets/background/pattern-11.min.svg +1 -0
  11. package/src/assets/background/pattern-12.min.svg +1 -0
  12. package/src/assets/background/pattern-13.min.svg +1 -0
  13. package/src/assets/background/pattern-14.min.svg +1 -0
  14. package/src/assets/background/pattern-15.min.svg +1 -0
  15. package/src/assets/background/pattern-16.min.svg +1 -0
  16. package/src/assets/background/pattern-17.min.svg +1 -0
  17. package/src/assets/background/pattern-18.min.svg +1 -0
  18. package/src/assets/background/pattern-19.min.svg +1 -0
  19. package/src/assets/background/pattern-2.min.svg +1 -0
  20. package/src/assets/background/pattern-20.min.svg +1 -0
  21. package/src/assets/background/pattern-21.min.svg +1 -0
  22. package/src/assets/background/pattern-22.min.svg +1 -0
  23. package/src/assets/background/pattern-23.min.svg +1 -0
  24. package/src/assets/background/pattern-24.min.svg +1 -0
  25. package/src/assets/background/pattern-25.min.svg +1 -0
  26. package/src/assets/background/pattern-26.min.svg +1 -0
  27. package/src/assets/background/pattern-27.min.svg +1 -0
  28. package/src/assets/background/pattern-28.min.svg +1 -0
  29. package/src/assets/background/pattern-29.min.svg +1 -0
  30. package/src/assets/background/pattern-3.min.svg +1 -0
  31. package/src/assets/background/pattern-30.min.svg +1 -0
  32. package/src/assets/background/pattern-31.min.svg +1 -0
  33. package/src/assets/background/pattern-32.min.svg +1 -0
  34. package/src/assets/background/pattern-33.min.svg +1 -0
  35. package/src/assets/background/pattern-34.min.svg +1 -0
  36. package/src/assets/background/pattern-35.min.svg +1 -0
  37. package/src/assets/background/pattern-36.min.svg +1 -0
  38. package/src/assets/background/pattern-37.min.svg +1 -0
  39. package/src/assets/background/pattern-38.min.svg +1 -0
  40. package/src/assets/background/pattern-39.min.svg +1 -0
  41. package/src/assets/background/pattern-4.min.svg +1 -0
  42. package/src/assets/background/pattern-40.min.svg +1 -0
  43. package/src/assets/background/pattern-41.min.svg +1 -0
  44. package/src/assets/background/pattern-42.min.svg +1 -0
  45. package/src/assets/background/pattern-5.min.svg +1 -0
  46. package/src/assets/background/pattern-6.min.svg +1 -0
  47. package/src/assets/background/pattern-7.min.svg +1 -0
  48. package/src/assets/background/pattern-8.min.svg +1 -0
  49. package/src/assets/background/pattern-9.min.svg +1 -0
  50. package/src/assets/background.svg +1 -0
  51. package/src/assets/cc-icon.svg +4 -0
  52. package/src/assets/fonts/GoogleSansCode-Italic.woff2 +0 -0
  53. package/src/assets/fonts/GoogleSansCode.woff2 +0 -0
  54. package/src/assets/fonts/LXGWWenKai-Regular.ttf +0 -0
  55. package/src/assets/fonts/LXGWWenKai-Regular.woff2 +0 -0
  56. package/src/components/stalux/analytics/clarity.astro +25 -0
  57. package/src/components/stalux/analytics/google.astro +31 -0
  58. package/src/components/stalux/analytics/umami.astro +16 -0
  59. package/src/components/stalux/archives/archivesList.astro +116 -0
  60. package/src/components/stalux/archives/toArchive.astro +14 -0
  61. package/src/components/stalux/categories/categoriesCard.astro +49 -0
  62. package/src/components/stalux/categories/categoriesList.astro +17 -0
  63. package/src/components/stalux/common/author.astro +35 -0
  64. package/src/components/stalux/common/date.astro +59 -0
  65. package/src/components/stalux/common/search.astro +14 -0
  66. package/src/components/stalux/common/textType.astro +16 -0
  67. package/src/components/stalux/common/verCount.astro +10 -0
  68. package/src/components/stalux/footer/FooterBadges.astro +150 -0
  69. package/src/components/stalux/footer/FooterBeian.astro +91 -0
  70. package/src/components/stalux/footer/FooterCopyright.astro +40 -0
  71. package/src/components/stalux/footer/FooterStats.astro +108 -0
  72. package/src/components/stalux/footer/FooterThemeInfo.astro +67 -0
  73. package/src/components/stalux/layout/footer.astro +87 -0
  74. package/src/components/stalux/layout/head.astro +194 -0
  75. package/src/components/stalux/layout/listPage.astro +26 -0
  76. package/src/components/stalux/layout/navs.astro +174 -0
  77. package/src/components/stalux/links/linkCard.astro +50 -0
  78. package/src/components/stalux/links/linkList.astro +20 -0
  79. package/src/components/stalux/links/socialMedia.astro +102 -0
  80. package/src/components/stalux/posts/PhotoSwipeStyle.astro +3 -0
  81. package/src/components/stalux/posts/PostTaxonomy.astro +65 -0
  82. package/src/components/stalux/posts/WalineComment.astro +609 -0
  83. package/src/components/stalux/posts/postAuthor.astro +23 -0
  84. package/src/components/stalux/posts/postCC.astro +52 -0
  85. package/src/components/stalux/posts/postCard.astro +83 -0
  86. package/src/components/stalux/posts/postContent.astro +174 -0
  87. package/src/components/stalux/posts/postLeft.astro +41 -0
  88. package/src/components/stalux/posts/postList.astro +25 -0
  89. package/src/components/stalux/posts/postNavigation.astro +137 -0
  90. package/src/components/stalux/posts/postRight.astro +33 -0
  91. package/src/components/stalux/posts/postToc.astro +88 -0
  92. package/src/components/stalux/posts/randomPost.astro +134 -0
  93. package/src/components/stalux/tags/tagHeader.astro +50 -0
  94. package/src/components/stalux/tags/tagsCloud.astro +100 -0
  95. package/src/components/stalux/words/wordCard.astro +62 -0
  96. package/src/components/stalux/words/wordList.astro +70 -0
  97. package/src/config.ts +58 -0
  98. package/src/i18n/en.json +193 -0
  99. package/src/i18n/zh-CN.json +193 -0
  100. package/src/index.ts +215 -0
  101. package/src/internal/components-plugin.ts +54 -0
  102. package/src/internal/dev-toolbar.ts +33 -0
  103. package/src/internal/override.ts +99 -0
  104. package/src/internal/pagefind.ts +40 -0
  105. package/src/layouts/PostLayout.astro +90 -0
  106. package/src/layouts/Stalux.astro +91 -0
  107. package/src/pages/404.astro +103 -0
  108. package/src/pages/about.astro +59 -0
  109. package/src/pages/about.md.ts +15 -0
  110. package/src/pages/api/post.abbrlink.json.ts +20 -0
  111. package/src/pages/archives.astro +23 -0
  112. package/src/pages/archives.md.ts +24 -0
  113. package/src/pages/atom.xml.ts +29 -0
  114. package/src/pages/categories/[category].astro +35 -0
  115. package/src/pages/categories/[category].md.ts +34 -0
  116. package/src/pages/categories/index.astro +23 -0
  117. package/src/pages/categories/index.md.ts +27 -0
  118. package/src/pages/index.astro +30 -0
  119. package/src/pages/index.md.ts +18 -0
  120. package/src/pages/links.astro +23 -0
  121. package/src/pages/links.md.ts +18 -0
  122. package/src/pages/llms-full.txt.ts +25 -0
  123. package/src/pages/llms.txt.ts +26 -0
  124. package/src/pages/posts/[post].astro +69 -0
  125. package/src/pages/posts/[post].md.ts +109 -0
  126. package/src/pages/rss.xml.ts +29 -0
  127. package/src/pages/tags/[tag].astro +37 -0
  128. package/src/pages/tags/[tag].md.ts +34 -0
  129. package/src/pages/tags/index.astro +23 -0
  130. package/src/pages/tags/index.md.ts +27 -0
  131. package/src/pages/words.astro +24 -0
  132. package/src/pages/words.md.ts +14 -0
  133. package/src/plugins/feature-flags.ts +68 -0
  134. package/src/plugins/satteri-temml.ts +81 -0
  135. package/src/schemas/collections.ts +140 -0
  136. package/src/schemas/config.ts +226 -0
  137. package/src/scripts/background.ts +59 -0
  138. package/src/styles/base/init.css +286 -0
  139. package/src/styles/base/math.css +411 -0
  140. package/src/styles/components/archives/archivesList.module.css +378 -0
  141. package/src/styles/components/archives/toArchive.module.css +3 -0
  142. package/src/styles/components/categories/categoriesCard.module.css +87 -0
  143. package/src/styles/components/categories/categoriesList.module.css +27 -0
  144. package/src/styles/components/common/author.module.css +73 -0
  145. package/src/styles/components/common/date.module.css +15 -0
  146. package/src/styles/components/common/textType.module.css +10 -0
  147. package/src/styles/components/footer/footer.module.css +44 -0
  148. package/src/styles/components/layout/navs.module.css +250 -0
  149. package/src/styles/components/links/linkCard.module.css +99 -0
  150. package/src/styles/components/links/linkList.module.css +67 -0
  151. package/src/styles/components/links/socialLinks.module.css +22 -0
  152. package/src/styles/components/markdown.css +528 -0
  153. package/src/styles/components/posts/postAuthor.module.css +32 -0
  154. package/src/styles/components/posts/postCC.module.css +138 -0
  155. package/src/styles/components/posts/postCard.module.css +156 -0
  156. package/src/styles/components/posts/postCategories.module.css +50 -0
  157. package/src/styles/components/posts/postContent.module.css +230 -0
  158. package/src/styles/components/posts/postLayout.module.css +142 -0
  159. package/src/styles/components/posts/postLeft.module.css +38 -0
  160. package/src/styles/components/posts/postList.module.css +24 -0
  161. package/src/styles/components/posts/postNavigation.module.css +187 -0
  162. package/src/styles/components/posts/postRight.module.css +60 -0
  163. package/src/styles/components/posts/postSidebar.module.css +57 -0
  164. package/src/styles/components/posts/postTags.module.css +51 -0
  165. package/src/styles/components/posts/postTaxonomy.module.css +87 -0
  166. package/src/styles/components/posts/postToc.module.css +74 -0
  167. package/src/styles/components/posts/randomPost.module.css +131 -0
  168. package/src/styles/components/tags/tagHeader.module.css +44 -0
  169. package/src/styles/components/tags/tagsCloud.module.css +124 -0
  170. package/src/styles/components/words/wordCard.module.css +130 -0
  171. package/src/styles/components/words/wordList.module.css +39 -0
  172. package/src/styles/pages/archives.module.css +18 -0
  173. package/src/styles/pages/categories.module.css +13 -0
  174. package/src/styles/pages/home.module.css +51 -0
  175. package/src/styles/pages/listPage.module.css +13 -0
  176. package/src/styles/pages/tags.module.css +12 -0
  177. package/src/styles/pages/words.module.css +13 -0
  178. package/src/styles/shared/animations.css +87 -0
  179. package/src/styles/shared/stagger.css +20 -0
  180. package/src/utils/ai-discovery.ts +547 -0
  181. package/src/utils/badge-generator.ts +68 -0
  182. package/src/utils/cc.ts +46 -0
  183. package/src/utils/collections-stats.ts +48 -0
  184. package/src/utils/config-utils.ts +107 -0
  185. package/src/utils/count-words.ts +20 -0
  186. package/src/utils/dayjs.ts +106 -0
  187. package/src/utils/feed.ts +70 -0
  188. package/src/utils/i18n.ts +64 -0
  189. package/src/utils/lucide-icons.ts +52 -0
  190. package/src/utils/semantic-time.ts +11 -0
  191. package/src/utils/taxonomy.ts +44 -0
  192. package/src/utils/toc-scrollspy.ts +95 -0
  193. package/src/utils/waline.ts +27 -0
  194. package/src/utils/word-count-utils.ts +83 -0
  195. package/template/astro.config.mjs +51 -0
  196. package/template/package.json +27 -0
  197. package/template/public/robots.txt +3 -0
  198. package/template/src/content.config.ts +11 -0
  199. package/template/stalux/about/index.md +14 -0
  200. package/template/stalux/config/ai-discovery.yml +2 -0
  201. package/template/stalux/config/author.yml +4 -0
  202. package/template/stalux/config/comment.yml +5 -0
  203. package/template/stalux/config/footer.yml +13 -0
  204. package/template/stalux/config/head.yml +7 -0
  205. package/template/stalux/config/links.yml +4 -0
  206. package/template/stalux/config/media-links.yml +8 -0
  207. package/template/stalux/config/navs.yml +23 -0
  208. package/template/stalux/config/promote.yml +2 -0
  209. package/template/stalux/config/site.yml +7 -0
  210. package/template/stalux/config/typetexts.yml +5 -0
  211. package/template/stalux/posts/hello-stalux.md +47 -0
  212. package/template/stalux/words/_template.md +12 -0
  213. package/template/stalux/words/einstein-imagination.md +8 -0
  214. package/template/tsconfig.json +9 -0
@@ -0,0 +1,187 @@
1
+ /* 文章导航样式 */
2
+
3
+ .postNavigation {
4
+ width: 100%;
5
+ margin: var(--space-lg) 0;
6
+ border-top: var(--border-thin) solid var(--white-20p);
7
+ border-bottom: var(--border-thin) solid var(--white-20p);
8
+ padding-top: var(--space-lg);
9
+ padding-bottom: var(--space-lg);
10
+ }
11
+
12
+ .postNavigationInner {
13
+ display: flex;
14
+ justify-content: space-between;
15
+ gap: var(--space-md);
16
+ }
17
+
18
+ .postNavLink {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--space-sm);
22
+ padding: var(--space-md);
23
+ background: var(--black-10p);
24
+ border-radius: var(--radius-md);
25
+ color: var(--white-90p);
26
+ text-decoration: none;
27
+ transition:
28
+ background-color var(--transition-normal),
29
+ transform var(--transition-normal),
30
+ box-shadow var(--transition-normal),
31
+ color var(--transition-normal);
32
+ border: var(--border-thin) solid var(--white-20p);
33
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
34
+ flex: 1 1 0;
35
+ min-width: 0;
36
+ position: relative;
37
+ box-sizing: border-box;
38
+ }
39
+
40
+ .postNavLink::before {
41
+ content: "";
42
+ position: absolute;
43
+ top: 0;
44
+ left: 0;
45
+ width: 100%;
46
+ height: 100%;
47
+ background: linear-gradient(120deg, transparent, var(--accent-20p), transparent);
48
+ transition: transform var(--transition-slow);
49
+ transform: scaleX(0);
50
+ transform-origin: left;
51
+ pointer-events: none;
52
+ }
53
+
54
+ .postNavLink:hover {
55
+ transform: translateY(-3px);
56
+ box-shadow: 0 8px 16px var(--shadow-dark);
57
+ }
58
+
59
+ .postNavLink:hover::before {
60
+ transform: scaleX(1);
61
+ }
62
+
63
+ .postNavLink.disabled {
64
+ opacity: 0.5;
65
+ pointer-events: none;
66
+ cursor: not-allowed;
67
+ background: var(--black-15p);
68
+ }
69
+
70
+ .postNavLink.prevPost {
71
+ text-align: left;
72
+ margin-left: var(--space-xs);
73
+ }
74
+
75
+ .postNavLink.nextPost {
76
+ text-align: right;
77
+ justify-content: flex-end;
78
+ margin-right: var(--space-xs);
79
+ }
80
+
81
+ .postNavContent {
82
+ display: flex;
83
+ flex-direction: column;
84
+ min-width: 0;
85
+ overflow: hidden;
86
+ }
87
+
88
+ .postNavArrow {
89
+ flex-shrink: 0;
90
+ color: var(--white-70p);
91
+ transition: color var(--transition-normal);
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ }
96
+
97
+ .postNavLabel {
98
+ font-size: var(--font-size-small);
99
+ color: var(--accent-90p);
100
+ margin-bottom: var(--space-xs);
101
+ font-weight: 500;
102
+ }
103
+
104
+ .postNavTitle {
105
+ font-size: var(--font-size-base);
106
+ white-space: nowrap;
107
+ overflow: hidden;
108
+ text-overflow: ellipsis;
109
+ max-width: 100%;
110
+ color: var(--white-90p);
111
+ }
112
+
113
+ /* 响应式样式 */
114
+ @media (max-width: 768px) {
115
+ .postNavigation {
116
+ margin: var(--space-md) 0;
117
+ }
118
+
119
+ .postNavigationInner {
120
+ gap: var(--space-sm);
121
+ }
122
+
123
+ .postNavLink {
124
+ padding: var(--space-sm) var(--space-md);
125
+ flex-direction: column;
126
+ align-items: flex-start;
127
+ min-height: 120px;
128
+ justify-content: center;
129
+ }
130
+
131
+ .postNavLink.nextPost {
132
+ align-items: flex-end;
133
+ }
134
+
135
+ .postNavArrow {
136
+ transform: scale(0.85);
137
+ }
138
+
139
+ .postNavLabel {
140
+ font-size: 0.75rem;
141
+ margin-bottom: var(--space-xs);
142
+ }
143
+
144
+ .postNavTitle {
145
+ font-size: var(--font-size-small);
146
+ white-space: normal;
147
+ max-width: 100%;
148
+ }
149
+ }
150
+
151
+ /* 移动端适配 */
152
+ @media (max-width: 480px) {
153
+ .postNavigation {
154
+ margin: var(--space-md) 0;
155
+ }
156
+
157
+ .postNavigationInner {
158
+ flex-direction: column;
159
+ gap: var(--space-sm);
160
+ }
161
+
162
+ .postNavLink {
163
+ width: 100%;
164
+ padding: var(--space-sm) var(--space-md);
165
+ flex-direction: row;
166
+ align-items: center;
167
+ min-height: 100px;
168
+ justify-content: flex-start;
169
+ gap: var(--space-md);
170
+ }
171
+
172
+ .postNavLink.prevPost,
173
+ .postNavLink.nextPost {
174
+ margin-left: 0;
175
+ margin-right: 0;
176
+ text-align: left;
177
+ align-items: center;
178
+ }
179
+
180
+ .postNavLink.nextPost {
181
+ justify-content: flex-start;
182
+ }
183
+
184
+ .postNavTitle {
185
+ white-space: normal;
186
+ }
187
+ }
@@ -0,0 +1,60 @@
1
+ /* 右侧边栏 - 文章纲要和元数据 */
2
+
3
+ .rightSidebar {
4
+ position: sticky;
5
+ top: 20px;
6
+ width: 100%;
7
+ height: fit-content;
8
+ max-height: calc(100vh - 40px);
9
+ overflow-y: auto;
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--space-lg);
13
+ padding: var(--space-lg) 0;
14
+
15
+ /* 为 scrollIntoView 预留底部空间,确保长目录的激活项不会被裁切 */
16
+ scroll-padding-bottom: 8rem;
17
+
18
+ /* 隐藏滚动条但保留滚动功能 */
19
+ scrollbar-width: none;
20
+ -ms-overflow-style: none;
21
+ }
22
+
23
+ .rightSidebar::-webkit-scrollbar {
24
+ display: none;
25
+ }
26
+
27
+ .sidebarContainer {
28
+ display: flex;
29
+ flex-direction: column;
30
+ background: var(--black-10p);
31
+ border-radius: var(--radius-lg);
32
+ padding: var(--space-md);
33
+ box-shadow: var(--shadow-sidebar);
34
+ transition: all var(--transition-normal) ease;
35
+ }
36
+
37
+ /* 响应式设计 */
38
+
39
+ @media (max-width: 1400px) {
40
+ .rightSidebar {
41
+ width: 240px;
42
+ }
43
+ }
44
+
45
+ @media (max-width: 1200px) {
46
+ .rightSidebar {
47
+ display: none;
48
+ }
49
+ }
50
+
51
+ @media (max-width: 768px) {
52
+ .rightSidebar {
53
+ position: static;
54
+ width: 100%;
55
+ max-height: none;
56
+ top: auto;
57
+ order: 2;
58
+ padding: 1rem 0;
59
+ }
60
+ }
@@ -0,0 +1,57 @@
1
+ /* 通用侧边栏 — 合并自 postLeft.module.css + postRight.module.css */
2
+
3
+ .sidebar {
4
+ position: sticky;
5
+ top: 20px;
6
+ width: 100%;
7
+ height: fit-content;
8
+ max-height: calc(100vh - 40px);
9
+ overflow-y: auto;
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--space-lg);
13
+ padding: var(--space-lg) 0;
14
+
15
+ /* 隐藏滚动条但保留滚动功能 */
16
+ scrollbar-width: none;
17
+ -ms-overflow-style: none;
18
+ }
19
+
20
+ .sidebar::-webkit-scrollbar {
21
+ display: none;
22
+ }
23
+
24
+ /* 右侧边栏需要底部留白让 scrollIntoView 不裁切 */
25
+ .sidebarRight {
26
+ composes: sidebar;
27
+ scroll-padding-bottom: 8rem;
28
+ }
29
+
30
+ .sidebarContainer {
31
+ display: flex;
32
+ flex-direction: column;
33
+ background: var(--black-10p);
34
+ border-radius: var(--radius-lg);
35
+ padding: var(--space-md);
36
+ box-shadow: var(--shadow-sidebar);
37
+ transition: all var(--transition-normal) ease;
38
+ }
39
+
40
+ @media (max-width: 1400px) {
41
+ .sidebarRight {
42
+ width: 240px;
43
+ }
44
+ }
45
+
46
+ @media (max-width: 1200px) {
47
+ .sidebar {
48
+ display: none;
49
+ }
50
+ }
51
+
52
+ @media (max-width: 768px) {
53
+ .sidebar,
54
+ .sidebarRight {
55
+ display: none;
56
+ }
57
+ }
@@ -0,0 +1,51 @@
1
+ .tagsContainer {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--space-xs);
5
+ }
6
+
7
+ .title {
8
+ margin: 0;
9
+ font-size: var(--font-size-base);
10
+ font-weight: 600;
11
+ color: var(--white-90p);
12
+ padding-bottom: var(--space-sm);
13
+ border-bottom: var(--border-thin) solid var(--white-20p);
14
+ }
15
+
16
+ .tagList {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ gap: var(--space-sm);
20
+ }
21
+
22
+ .tag {
23
+ display: inline-block;
24
+ padding: 0.4rem 0.8rem;
25
+ background: var(--white-10p);
26
+ border: none;
27
+ border-radius: var(--radius-full);
28
+ font-size: var(--font-size-smaller);
29
+ text-decoration: none;
30
+ transition:
31
+ color var(--transition-medium),
32
+ transform var(--transition-medium);
33
+ white-space: nowrap;
34
+ transform: translateY(0);
35
+ color: var(--white-85p);
36
+ }
37
+
38
+ .tag:hover {
39
+ transform: translateY(-2px);
40
+ }
41
+
42
+ .tag:active {
43
+ transform: translateY(-1px);
44
+ }
45
+
46
+ .empty {
47
+ color: var(--white-50p);
48
+ font-size: var(--font-size-small);
49
+ text-align: center;
50
+ padding: var(--space-md) 0;
51
+ }
@@ -0,0 +1,87 @@
1
+ /* 文章分类/标签共用样式 — 合并自 postCategories.module.css + postTags.module.css */
2
+
3
+ .container {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--space-xs);
7
+ }
8
+
9
+ .title {
10
+ margin: 0;
11
+ font-size: var(--font-size-base);
12
+ font-weight: 600;
13
+ color: var(--white-90p);
14
+ padding-bottom: var(--space-sm);
15
+ border-bottom: var(--border-thin) solid var(--white-20p);
16
+ }
17
+
18
+ .list {
19
+ display: flex;
20
+ gap: var(--space-sm);
21
+ }
22
+
23
+ /* 分类变体:垂直列 + 左边框 */
24
+ .listColumn {
25
+ composes: list;
26
+ flex-direction: column;
27
+ }
28
+
29
+ .itemColumn {
30
+ display: inline-flex;
31
+ padding: var(--space-sm) var(--space-xs);
32
+ background: var(--white-05p);
33
+ color: var(--white-80p);
34
+ border-left: var(--border-thick) solid var(--accent-60p);
35
+ text-decoration: none;
36
+ transition:
37
+ color var(--transition-medium),
38
+ transform var(--transition-medium);
39
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
40
+ font-size: var(--font-size-small);
41
+ transform: translateX(0);
42
+ }
43
+
44
+ .itemColumn:hover {
45
+ transform: translateX(4px);
46
+ }
47
+
48
+ .itemColumn:active {
49
+ transform: translateX(2px);
50
+ }
51
+
52
+ /* 标签变体:水平换行 + 药丸形状 */
53
+ .listWrap {
54
+ composes: list;
55
+ flex-wrap: wrap;
56
+ }
57
+
58
+ .itemPill {
59
+ display: inline-block;
60
+ padding: 0.4rem 0.8rem;
61
+ background: var(--white-10p);
62
+ border: none;
63
+ border-radius: var(--radius-full);
64
+ font-size: var(--font-size-smaller);
65
+ text-decoration: none;
66
+ transition:
67
+ color var(--transition-medium),
68
+ transform var(--transition-medium);
69
+ white-space: nowrap;
70
+ transform: translateY(0);
71
+ color: var(--white-85p);
72
+ }
73
+
74
+ .itemPill:hover {
75
+ transform: translateY(-2px);
76
+ }
77
+
78
+ .itemPill:active {
79
+ transform: translateY(-1px);
80
+ }
81
+
82
+ .empty {
83
+ color: var(--white-50p);
84
+ font-size: var(--font-size-small);
85
+ text-align: center;
86
+ padding: var(--space-md) 0;
87
+ }
@@ -0,0 +1,74 @@
1
+ .title {
2
+ margin: 0 0 var(--space-xs);
3
+ font-size: var(--font-size-base);
4
+ font-weight: 600;
5
+ color: var(--white-90p);
6
+ padding-bottom: var(--space-sm);
7
+ border-bottom: var(--border-thin) solid var(--white-20p);
8
+ }
9
+
10
+ .list {
11
+ list-style: none;
12
+ margin: 0;
13
+ padding: 0;
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--space-sm);
17
+ }
18
+
19
+ .item {
20
+ display: block;
21
+ padding: var(--space-sm) var(--space-xs);
22
+ color: var(--white-70p);
23
+ text-decoration: none;
24
+ font-size: var(--font-size-small);
25
+ border-left: var(--border-thick) solid transparent;
26
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
27
+ transition:
28
+ color var(--transition-medium),
29
+ background-color var(--transition-medium),
30
+ border-left-color var(--transition-medium),
31
+ transform var(--transition-medium);
32
+ line-height: 1.4;
33
+ word-break: break-word;
34
+ }
35
+
36
+ .item:hover {
37
+ transform: translateX(calc(-1 * var(--space-sm)));
38
+ }
39
+
40
+ .item:active,
41
+ .item.active {
42
+ color: var(--accent-90p);
43
+ background-color: var(--accent-20p);
44
+ border-left-color: var(--accent-80p);
45
+ font-weight: 500;
46
+ }
47
+
48
+ /* 层级缩进 */
49
+ .depth-1 {
50
+ padding-left: var(--space-xs);
51
+ }
52
+
53
+ .depth-2 {
54
+ padding-left: var(--space-lg);
55
+ font-size: var(--font-size-smaller);
56
+ }
57
+
58
+ .depth-3 {
59
+ padding-left: 2.25rem;
60
+ font-size: var(--font-size-tiny);
61
+ }
62
+
63
+ .depth-4,
64
+ .depth-5,
65
+ .depth-6 {
66
+ padding-left: var(--space-2xl);
67
+ font-size: 0.75rem;
68
+ color: var(--white-60p);
69
+ }
70
+
71
+ .empty {
72
+ color: var(--white-60p);
73
+ font-size: var(--font-size-small);
74
+ }
@@ -0,0 +1,131 @@
1
+ .container {
2
+ transition:
3
+ background-color 0.3s ease,
4
+ border-color 0.3s ease;
5
+ }
6
+
7
+ .header {
8
+ display: flex;
9
+ justify-content: space-between;
10
+ align-items: center;
11
+ margin-bottom: 1em;
12
+ padding-bottom: 0.75em;
13
+ border-bottom: 2px solid rgba(0, 0, 0, 0.05);
14
+ }
15
+
16
+ .title {
17
+ margin: 0;
18
+ font-size: 1.1em;
19
+ font-weight: 600;
20
+ color: var(--foreground-60p, #333);
21
+ }
22
+
23
+ .refreshButton {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ width: 2em;
28
+ height: 2em;
29
+ padding: 0;
30
+ border: none;
31
+ border-radius: 0.375em;
32
+ background: transparent;
33
+ color: var(--foreground-60p, #333);
34
+ cursor: pointer;
35
+ transition: color 0.2s ease;
36
+ }
37
+
38
+ .refreshButton:hover {
39
+ color: var(--accent-60p, #0066cc);
40
+ }
41
+
42
+ .refreshButton:active {
43
+ opacity: 0.7;
44
+ }
45
+
46
+ .refreshButton svg {
47
+ width: 1em;
48
+ height: 1em;
49
+ }
50
+
51
+ .refreshButton.rotating svg {
52
+ animation: spin 0.6s linear;
53
+ }
54
+
55
+ @keyframes spin {
56
+ from {
57
+ transform: rotate(0deg);
58
+ }
59
+ to {
60
+ transform: rotate(360deg);
61
+ }
62
+ }
63
+
64
+ .list {
65
+ list-style: none;
66
+ margin: 0;
67
+ padding: 0;
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 0.75em;
71
+ transition: opacity 0.3s ease;
72
+ }
73
+
74
+ .loading,
75
+ .error,
76
+ .noMore {
77
+ padding: 1em;
78
+ text-align: center;
79
+ color: var(--foreground-60p, #666);
80
+ font-size: 0.95em;
81
+ }
82
+
83
+ .error {
84
+ color: var(--accent-60p, #e74c3c);
85
+ }
86
+
87
+ .list > li > a {
88
+ display: block;
89
+ padding: 0.75em 1em;
90
+ border-radius: 0.375em;
91
+ background: transparent;
92
+ color: var(--foreground-60p, #333);
93
+ text-decoration: none;
94
+ transition:
95
+ color 0.2s ease,
96
+ transform 0.2s ease;
97
+ word-break: break-word;
98
+ }
99
+
100
+ .list > li > a:hover {
101
+ transform: translateX(0.25em);
102
+ }
103
+
104
+ .list > li > a:active {
105
+ transform: translateX(0.125em);
106
+ }
107
+
108
+ /* 深色模式适配 */
109
+ @media (prefers-color-scheme: dark) {
110
+ .header {
111
+ border-bottom-color: rgba(255, 255, 255, 0.1);
112
+ }
113
+
114
+ .title {
115
+ color: var(--foreground-60p, #e0e0e0);
116
+ }
117
+
118
+ .refreshButton {
119
+ color: var(--foreground-60p, #e0e0e0);
120
+ }
121
+
122
+ .loading,
123
+ .error,
124
+ .noMore {
125
+ color: var(--foreground-60p, #b0b0b0);
126
+ }
127
+
128
+ .list > li > a {
129
+ color: var(--foreground-60p, #e0e0e0);
130
+ }
131
+ }
@@ -0,0 +1,44 @@
1
+ /* 页面标题部分 */
2
+ .pageHeader {
3
+ margin-bottom: 2.5rem;
4
+ position: relative;
5
+ padding-bottom: 1rem;
6
+ border-bottom: 1px solid var(--white-10p);
7
+ margin: 3em;
8
+ }
9
+
10
+ .pageHeader .pageTitle {
11
+ font-size: 1.8rem;
12
+ margin-bottom: 0.5rem;
13
+ display: flex;
14
+ align-items: center;
15
+ color: var(--white-full);
16
+ }
17
+
18
+ .pageHeader .pageTitle .categoryIcon {
19
+ margin-right: 0.8rem;
20
+ color: var(--accent-80p);
21
+ }
22
+
23
+ .pageHeader .pageTitle .categoryName {
24
+ color: var(--accent-90p);
25
+ font-weight: 500;
26
+ }
27
+
28
+ .pageHeader .pageDescription {
29
+ font-size: 1rem;
30
+ color: var(--white-70p);
31
+ margin-bottom: 0.5rem;
32
+ }
33
+
34
+ .pageHeader .backLink {
35
+ font-size: 0.9rem;
36
+ color: var(--white-60p);
37
+ text-decoration: none;
38
+ display: inline-block;
39
+ transition: all var(--transition-fast) ease;
40
+ }
41
+
42
+ .pageHeader .backLink:hover {
43
+ color: var(--accent-90p);
44
+ }