@anglefeint/astro-theme 0.1.18 → 0.1.20

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.
@@ -0,0 +1,269 @@
1
+ /* AI prose layer: article typography and content presentation rules. */
2
+ /* GPU 风格:散热鳍片 + PCB 底 + 金属边框 */
3
+ body.ai-page .ai-content .prose {
4
+ position: relative;
5
+ background:
6
+ repeating-linear-gradient(
7
+ 90deg,
8
+ transparent 0,
9
+ transparent 19px,
10
+ rgba(50, 90, 70, 0.03) 19px,
11
+ rgba(50, 90, 70, 0.03) 20px
12
+ ),
13
+ repeating-linear-gradient(
14
+ 180deg,
15
+ transparent 0,
16
+ transparent 2px,
17
+ rgba(55, 65, 80, 0.14) 2px,
18
+ rgba(55, 65, 80, 0.14) 4px
19
+ ),
20
+ linear-gradient(135deg, rgba(14, 18, 24, 0.97) 0%, rgba(10, 14, 20, 0.95) 50%, rgba(6, 10, 16, 0.97) 100%),
21
+ radial-gradient(
22
+ ellipse 80% 50% at 50% 0%,
23
+ rgba(70, 110, 150, 0.06),
24
+ transparent 60%
25
+ );
26
+ backdrop-filter: blur(16px) saturate(1.1);
27
+ -webkit-backdrop-filter: blur(16px) saturate(1.1);
28
+ border-radius: 8px;
29
+ padding: 2em;
30
+ border: 1px solid rgba(140, 155, 175, 0.35);
31
+ box-shadow:
32
+ 0 0 60px rgba(0, 0, 0, 0.5),
33
+ inset 0 1px 0 rgba(200, 210, 225, 0.12),
34
+ inset 0 -1px 0 rgba(40, 50, 65, 0.4),
35
+ inset 0 0 0 1px rgba(100, 120, 150, 0.15);
36
+ animation: ai-breathe 6s ease-in-out infinite;
37
+ }
38
+ /* 呼吸式微动 */
39
+ @keyframes ai-breathe {
40
+ 0%,
41
+ 100% {
42
+ opacity: 1;
43
+ transform: scale(1);
44
+ }
45
+ 50% {
46
+ opacity: 0.98;
47
+ transform: scale(1.001);
48
+ }
49
+ }
50
+ /* 加载扫描线 */
51
+ .ai-load-scan {
52
+ position: fixed;
53
+ top: 0;
54
+ left: 0;
55
+ right: 0;
56
+ height: 2px;
57
+ background: linear-gradient(
58
+ 90deg,
59
+ transparent,
60
+ rgba(100, 255, 180, 0.6),
61
+ rgba(120, 180, 255, 0.6),
62
+ transparent
63
+ );
64
+ box-shadow: 0 0 12px rgba(100, 255, 180, 0.5);
65
+ animation: ai-scan 0.8s ease-out forwards;
66
+ pointer-events: none;
67
+ z-index: 20;
68
+ will-change: transform, opacity;
69
+ }
70
+ @keyframes ai-scan {
71
+ 0% {
72
+ transform: translateY(0);
73
+ opacity: 1;
74
+ }
75
+ 100% {
76
+ transform: translateY(100vh);
77
+ opacity: 0.2;
78
+ }
79
+ }
80
+ /* 文章区域渐显 */
81
+ .ai-article {
82
+ animation: ai-article-in 0.6s ease-out forwards;
83
+ opacity: 0;
84
+ }
85
+ @keyframes ai-article-in {
86
+ to {
87
+ opacity: 1;
88
+ }
89
+ }
90
+ .ai-title {
91
+ animation: ai-title-in 0.5s ease-out 0.15s forwards;
92
+ opacity: 0;
93
+ }
94
+ @keyframes ai-title-in {
95
+ to {
96
+ opacity: 1;
97
+ }
98
+ }
99
+ .ai-prose-body {
100
+ animation: ai-prose-in 0.6s ease-out 0.35s forwards;
101
+ opacity: 0;
102
+ }
103
+ @keyframes ai-prose-in {
104
+ to {
105
+ opacity: 1;
106
+ }
107
+ }
108
+ /* 标题/正文区光晕 */
109
+ body.ai-page .ai-content .prose .ai-title {
110
+ text-shadow:
111
+ 0 0 20px rgba(132, 214, 255, 0.18),
112
+ 0 0 36px rgba(160, 224, 255, 0.16);
113
+ }
114
+ body.ai-page .ai-content .prose .ai-prose-body {
115
+ box-shadow: inset 0 0 80px rgba(124, 206, 255, 0.035);
116
+ }
117
+ /* GPU 金属边框:铝银质感 */
118
+ body.ai-page .ai-content .prose::before {
119
+ content: "";
120
+ position: absolute;
121
+ inset: -1px;
122
+ border-radius: inherit;
123
+ padding: 1px;
124
+ background: linear-gradient(
125
+ 135deg,
126
+ rgba(200, 210, 225, 0.4) 0%,
127
+ rgba(140, 155, 180, 0.25) 25%,
128
+ rgba(100, 115, 140, 0.2) 50%,
129
+ rgba(140, 155, 180, 0.28) 75%,
130
+ rgba(180, 195, 215, 0.35) 100%
131
+ );
132
+ -webkit-mask:
133
+ linear-gradient(#fff 0 0) content-box,
134
+ linear-gradient(#fff 0 0);
135
+ mask:
136
+ linear-gradient(#fff 0 0) content-box,
137
+ linear-gradient(#fff 0 0);
138
+ -webkit-mask-composite: xor;
139
+ mask-composite: exclude;
140
+ pointer-events: none;
141
+ transition: opacity 0.3s ease;
142
+ }
143
+ body.ai-page .ai-content .prose:hover::before {
144
+ opacity: 1.3;
145
+ }
146
+ /* 链接 hover 光晕/脉冲 */
147
+ body.ai-page .ai-content .prose a {
148
+ text-decoration: none;
149
+ padding: 0 2px;
150
+ border-radius: 2px;
151
+ transition:
152
+ box-shadow 0.25s ease,
153
+ text-shadow 0.25s ease,
154
+ color 0.25s ease;
155
+ }
156
+ body.ai-page .ai-content .prose a:hover {
157
+ box-shadow:
158
+ 0 0 12px rgba(140, 210, 242, 0.4),
159
+ 0 0 24px rgba(132, 214, 255, 0.28);
160
+ text-shadow:
161
+ 0 0 10px rgba(162, 222, 248, 0.56),
162
+ 0 0 20px rgba(138, 214, 255, 0.3);
163
+ color: rgba(190, 236, 255, 0.98);
164
+ }
165
+ /* 代码块:输出窗口风格 */
166
+ body.ai-page .ai-content .prose code {
167
+ background: rgba(10, 18, 30, 0.72);
168
+ border: 1px solid rgba(126, 192, 224, 0.26);
169
+ color: rgba(196, 232, 248, 0.92);
170
+ }
171
+ body.ai-page .ai-content .prose pre {
172
+ background: rgba(8, 12, 22, 0.88);
173
+ border: 1px solid rgba(142, 218, 255, 0.2);
174
+ box-shadow:
175
+ inset 0 0 34px rgba(14, 34, 54, 0.44),
176
+ 0 0 20px rgba(132, 214, 255, 0.08),
177
+ 0 0 0 1px rgba(146, 214, 244, 0.14);
178
+ border-radius: 6px;
179
+ overflow: hidden;
180
+ }
181
+ body.ai-page .ai-content .prose pre code {
182
+ background: transparent;
183
+ border: none;
184
+ color: inherit;
185
+ }
186
+ /* 引用块:输出窗口风格 + 命令提示符 */
187
+ body.ai-page .ai-content .prose blockquote {
188
+ position: relative;
189
+ background: rgba(12, 18, 30, 0.64);
190
+ border: 1px solid rgba(126, 192, 224, 0.22);
191
+ border-left: 3px solid rgba(146, 214, 244, 0.56);
192
+ padding: 1em 1.25em 1em 2.5em;
193
+ border-radius: 4px;
194
+ box-shadow:
195
+ 0 0 16px rgba(136, 206, 238, 0.1),
196
+ inset 0 0 20px rgba(8, 28, 44, 0.26);
197
+ }
198
+ body.ai-page .ai-content .prose blockquote::before {
199
+ content: ">";
200
+ position: absolute;
201
+ left: 0.6em;
202
+ top: 1em;
203
+ color: rgba(156, 220, 246, 0.8);
204
+ font-family: monospace;
205
+ font-weight: bold;
206
+ }
207
+ /* 代码块命令提示符 */
208
+ body.ai-page .ai-content .prose pre {
209
+ position: relative;
210
+ padding-left: 2.5em;
211
+ padding-top: 2.2em;
212
+ }
213
+ body.ai-page .ai-content .prose pre::before {
214
+ content: "● ● ● runtime";
215
+ position: absolute;
216
+ left: 1em;
217
+ top: 0.9em;
218
+ color: rgba(168, 226, 248, 0.72);
219
+ font-family: monospace;
220
+ font-size: 0.72em;
221
+ text-transform: uppercase;
222
+ letter-spacing: 0.12em;
223
+ text-shadow: 0 0 8px rgba(124, 206, 246, 0.28);
224
+ }
225
+ body.ai-page .ai-content .prose pre::after {
226
+ content: "";
227
+ position: absolute;
228
+ inset: 0;
229
+ pointer-events: none;
230
+ background: linear-gradient(
231
+ 110deg,
232
+ rgba(132, 214, 255, 0) 0%,
233
+ rgba(132, 214, 255, 0.18) 48%,
234
+ rgba(132, 214, 255, 0) 100%
235
+ );
236
+ transform: translateX(-130%);
237
+ transition: transform 0.5s ease;
238
+ }
239
+ body.ai-page .ai-content .prose pre:hover::after {
240
+ transform: translateX(130%);
241
+ }
242
+ body.ai-page .ai-content .prose blockquote::after {
243
+ content: "reference";
244
+ position: absolute;
245
+ right: 1em;
246
+ top: 0.9em;
247
+ color: rgba(172, 230, 252, 0.64);
248
+ font-family: ui-monospace, monospace;
249
+ font-size: 0.66em;
250
+ letter-spacing: 0.06em;
251
+ text-transform: uppercase;
252
+ }
253
+ body.ai-page header {
254
+ position: fixed;
255
+ top: 0;
256
+ left: 0;
257
+ right: 0;
258
+ z-index: 11;
259
+ backdrop-filter: blur(3px);
260
+ -webkit-backdrop-filter: blur(3px);
261
+ }
262
+ body.ai-page .ai-content {
263
+ padding-top: calc(3em + 56px);
264
+ }
265
+ @media (max-width: 720px) {
266
+ body.ai-page .ai-content {
267
+ padding-top: calc(1em + 56px);
268
+ }
269
+ }
@@ -0,0 +1,106 @@
1
+ /* AI related layer: related-post cards and back-to-blog controls. */
2
+ /* ========== 相关文章 + 返回博客 ========== */
3
+ .ai-related {
4
+ width: 720px;
5
+ max-width: calc(100% - 2em);
6
+ margin: 2.5rem auto 1.5rem;
7
+ }
8
+ .ai-related-title {
9
+ font-size: 0.9em;
10
+ color: rgba(172, 228, 252, 0.88);
11
+ margin-bottom: 1rem;
12
+ font-weight: 500;
13
+ }
14
+ .ai-related-grid {
15
+ display: grid;
16
+ grid-template-columns: repeat(3, 1fr);
17
+ gap: 1rem;
18
+ }
19
+ @media (max-width: 780px) {
20
+ .ai-related-grid {
21
+ grid-template-columns: 1fr;
22
+ }
23
+ }
24
+ .ai-related-card {
25
+ display: block;
26
+ background: rgba(12, 10, 20, 0.7);
27
+ border: 1px solid rgba(126, 192, 224, 0.24);
28
+ border-radius: 6px;
29
+ overflow: hidden;
30
+ text-decoration: none;
31
+ color: inherit;
32
+ transition:
33
+ transform 0.2s ease,
34
+ box-shadow 0.2s ease,
35
+ border-color 0.2s ease;
36
+ }
37
+ .ai-related-card:hover {
38
+ transform: translateY(-3px);
39
+ box-shadow: 0 0 24px rgba(124, 206, 246, 0.2);
40
+ border-color: rgba(172, 228, 255, 0.34);
41
+ }
42
+ .ai-related-img {
43
+ aspect-ratio: 16/9;
44
+ overflow: hidden;
45
+ }
46
+ .ai-related-img img {
47
+ width: 100%;
48
+ height: 100%;
49
+ object-fit: cover;
50
+ }
51
+ .ai-related-placeholder {
52
+ aspect-ratio: 16/9;
53
+ background: linear-gradient(
54
+ 135deg,
55
+ rgba(22, 8, 16, 0.9),
56
+ rgba(14, 24, 42, 0.8)
57
+ );
58
+ border-bottom: 1px solid rgba(126, 192, 224, 0.22);
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ }
63
+ .ai-related-placeholder span {
64
+ font-size: 2em;
65
+ color: rgba(168, 222, 246, 0.62);
66
+ font-weight: 600;
67
+ }
68
+ .ai-related-card-title {
69
+ padding: 0.75rem 1rem 0.25rem;
70
+ font-size: 0.95em;
71
+ margin: 0;
72
+ color: rgba(220, 245, 255, 0.95);
73
+ }
74
+ .ai-related-card-date {
75
+ padding: 0 1rem 0.75rem;
76
+ font-size: 0.75em;
77
+ color: rgba(176, 216, 238, 0.66);
78
+ margin: 0;
79
+ }
80
+ .ai-back-to-blog {
81
+ width: 720px;
82
+ max-width: calc(100% - 2em);
83
+ margin: 0 auto 2.5rem;
84
+ }
85
+ .ai-back-to-blog a {
86
+ display: inline-flex;
87
+ align-items: center;
88
+ gap: 0.5rem;
89
+ font-family: ui-monospace, monospace;
90
+ font-size: 0.9em;
91
+ color: rgba(188, 226, 248, 0.84);
92
+ text-decoration: none;
93
+ padding: 0.5rem 0;
94
+ transition:
95
+ color 0.2s ease,
96
+ text-shadow 0.2s ease;
97
+ }
98
+ .ai-back-to-blog a:hover {
99
+ color: rgba(188, 236, 255, 0.98);
100
+ text-shadow: 0 0 12px rgba(124, 206, 246, 0.3);
101
+ }
102
+ .ai-back-prompt {
103
+ color: rgba(154, 218, 246, 0.78);
104
+ }
105
+
106
+ /* 回到顶部按钮:芯片电路图风格 */
@@ -0,0 +1,49 @@
1
+ /* AI responsive layer: viewport-specific overrides. */
2
+ .ai-back-to-top {
3
+ position: fixed;
4
+ /* 文章宽 720px 居中时,右半边空隙中心 = (100vw - 720px)/2 + 720px + (100vw - 720px)/4 = 75vw + 180px */
5
+ left: calc(75vw + 180px);
6
+ top: 68%;
7
+ transform: translate(-50%, calc(-50% + 8px));
8
+ z-index: 50;
9
+ width: 44px;
10
+ height: 44px;
11
+ padding: 0;
12
+ border: 1px solid rgba(126, 192, 224, 0.44);
13
+ border-radius: 10px;
14
+ background:
15
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 44 44'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop offset='0' stop-color='rgba(80,160,220,0.5)'/%3E%3Cstop offset='1' stop-color='rgba(100,180,240,0.35)'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect x='6' y='6' width='32' height='32' rx='2' fill='none' stroke='url(%23g)' stroke-width='0.8'/%3E%3Cpath d='M6 8 Q6 6 8 6' fill='none' stroke='url(%23g)' stroke-width='0.8'/%3E%3Crect x='18' y='18' width='8' height='8' fill='rgba(124,206,246,0.08)' stroke='rgba(100,180,220,0.5)' stroke-width='0.6'/%3E%3Crect x='10' y='4' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='17' y='4' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='24' y='4' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='31' y='4' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='10' y='38' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='17' y='38' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='24' y='38' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='31' y='38' width='3' height='2' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='4' y='10' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='4' y='17' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='4' y='24' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='4' y='31' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='38' y='10' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='38' y='17' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='38' y='24' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Crect x='38' y='31' width='2' height='3' fill='rgba(100,180,220,0.5)'/%3E%3Cline x1='12' y1='6' x2='12' y2='18' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='19' y1='6' x2='19' y2='18' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='26' y1='6' x2='26' y2='18' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='33' y1='6' x2='33' y2='18' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='6' y1='12' x2='18' y2='12' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='6' y1='19' x2='18' y2='19' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='26' y1='12' x2='38' y2='12' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3Cline x1='26' y1='19' x2='38' y2='19' stroke='rgba(100,180,220,0.35)' stroke-width='0.5'/%3E%3C/svg%3E"),
16
+ linear-gradient(180deg, rgba(12, 22, 36, 0.95), rgba(8, 16, 28, 0.98));
17
+ background-size: 100% 100%, 100% 100%;
18
+ background-position: 0 0, 0 0;
19
+ color: rgba(190, 236, 255, 0.95);
20
+ font-size: 1.35em;
21
+ cursor: pointer;
22
+ opacity: 0;
23
+ transition:
24
+ opacity 0.25s ease,
25
+ transform 0.25s ease,
26
+ border-color 0.2s,
27
+ box-shadow 0.2s;
28
+ backdrop-filter: blur(10px);
29
+ box-shadow: 0 0 20px rgba(124, 206, 246, 0.18);
30
+ }
31
+ .ai-back-to-top.visible {
32
+ opacity: 1;
33
+ transform: translate(-50%, -50%);
34
+ }
35
+ .ai-back-to-top:hover {
36
+ border-color: rgba(162, 222, 248, 0.72);
37
+ box-shadow: 0 0 24px rgba(124, 206, 246, 0.36);
38
+ }
39
+ @media (max-width: 840px) {
40
+ /* 视口较窄时右侧空隙太小,改回贴右 */
41
+ .ai-back-to-top {
42
+ left: auto;
43
+ right: 1rem;
44
+ transform: translateY(calc(-50% + 8px));
45
+ }
46
+ .ai-back-to-top.visible {
47
+ transform: translateY(-50%);
48
+ }
49
+ }
@@ -150,11 +150,11 @@
150
150
  inset 0 1px 0 rgba(220, 242, 255, 0.22);
151
151
  overflow: hidden;
152
152
  backdrop-filter: blur(1.5px);
153
+ transform: translate3d(0, 0, 0);
154
+ will-change: transform, opacity;
153
155
  transition:
154
- width 360ms cubic-bezier(0.23, 1, 0.32, 1),
155
- top 320ms ease,
156
- padding 320ms ease,
157
- border-radius 320ms ease,
156
+ transform 320ms ease,
157
+ opacity 220ms ease,
158
158
  box-shadow 320ms ease,
159
159
  background 320ms ease;
160
160
  }
@@ -243,10 +243,10 @@
243
243
  outline-offset: -2px;
244
244
  }
245
245
  .rq-tv.rq-tv-collapsed {
246
- top: 27vh;
247
246
  width: 34px;
248
247
  padding: 0;
249
248
  border-radius: 6px;
249
+ transform: translate3d(0, 2vh, 0);
250
250
  background: linear-gradient(165deg, rgba(34, 58, 78, 0.9), rgba(10, 19, 30, 0.92));
251
251
  box-shadow:
252
252
  0 10px 20px rgba(4, 10, 18, 0.42),
@@ -338,7 +338,7 @@
338
338
  position: absolute;
339
339
  top: 0;
340
340
  bottom: 0;
341
- left: -35%;
341
+ left: 0;
342
342
  width: 35%;
343
343
  background: linear-gradient(
344
344
  90deg,
@@ -346,11 +346,13 @@
346
346
  rgba(164, 228, 255, 0.88),
347
347
  rgba(132, 214, 255, 0)
348
348
  );
349
+ transform: translateX(-100%);
350
+ will-change: transform;
349
351
  animation: ai-title-flow-run 3.8s linear infinite;
350
352
  }
351
353
  @keyframes ai-title-flow-run {
352
354
  to {
353
- left: 100%;
355
+ transform: translateX(285%);
354
356
  }
355
357
  }
356
358
  .ai-stage-toast {