@anglefeint/astro-theme 0.1.18 → 0.1.19

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,267 @@
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
+ left: 0;
54
+ right: 0;
55
+ height: 2px;
56
+ background: linear-gradient(
57
+ 90deg,
58
+ transparent,
59
+ rgba(100, 255, 180, 0.6),
60
+ rgba(120, 180, 255, 0.6),
61
+ transparent
62
+ );
63
+ box-shadow: 0 0 12px rgba(100, 255, 180, 0.5);
64
+ animation: ai-scan 0.8s ease-out forwards;
65
+ pointer-events: none;
66
+ z-index: 20;
67
+ }
68
+ @keyframes ai-scan {
69
+ 0% {
70
+ top: 0;
71
+ opacity: 1;
72
+ }
73
+ 100% {
74
+ top: 100vh;
75
+ opacity: 0.2;
76
+ }
77
+ }
78
+ /* 文章区域渐显 */
79
+ .ai-article {
80
+ animation: ai-article-in 0.6s ease-out forwards;
81
+ opacity: 0;
82
+ }
83
+ @keyframes ai-article-in {
84
+ to {
85
+ opacity: 1;
86
+ }
87
+ }
88
+ .ai-title {
89
+ animation: ai-title-in 0.5s ease-out 0.15s forwards;
90
+ opacity: 0;
91
+ }
92
+ @keyframes ai-title-in {
93
+ to {
94
+ opacity: 1;
95
+ }
96
+ }
97
+ .ai-prose-body {
98
+ animation: ai-prose-in 0.6s ease-out 0.35s forwards;
99
+ opacity: 0;
100
+ }
101
+ @keyframes ai-prose-in {
102
+ to {
103
+ opacity: 1;
104
+ }
105
+ }
106
+ /* 标题/正文区光晕 */
107
+ body.ai-page .ai-content .prose .ai-title {
108
+ text-shadow:
109
+ 0 0 20px rgba(132, 214, 255, 0.18),
110
+ 0 0 36px rgba(160, 224, 255, 0.16);
111
+ }
112
+ body.ai-page .ai-content .prose .ai-prose-body {
113
+ box-shadow: inset 0 0 80px rgba(124, 206, 255, 0.035);
114
+ }
115
+ /* GPU 金属边框:铝银质感 */
116
+ body.ai-page .ai-content .prose::before {
117
+ content: "";
118
+ position: absolute;
119
+ inset: -1px;
120
+ border-radius: inherit;
121
+ padding: 1px;
122
+ background: linear-gradient(
123
+ 135deg,
124
+ rgba(200, 210, 225, 0.4) 0%,
125
+ rgba(140, 155, 180, 0.25) 25%,
126
+ rgba(100, 115, 140, 0.2) 50%,
127
+ rgba(140, 155, 180, 0.28) 75%,
128
+ rgba(180, 195, 215, 0.35) 100%
129
+ );
130
+ -webkit-mask:
131
+ linear-gradient(#fff 0 0) content-box,
132
+ linear-gradient(#fff 0 0);
133
+ mask:
134
+ linear-gradient(#fff 0 0) content-box,
135
+ linear-gradient(#fff 0 0);
136
+ -webkit-mask-composite: xor;
137
+ mask-composite: exclude;
138
+ pointer-events: none;
139
+ transition: opacity 0.3s ease;
140
+ }
141
+ body.ai-page .ai-content .prose:hover::before {
142
+ opacity: 1.3;
143
+ }
144
+ /* 链接 hover 光晕/脉冲 */
145
+ body.ai-page .ai-content .prose a {
146
+ text-decoration: none;
147
+ padding: 0 2px;
148
+ border-radius: 2px;
149
+ transition:
150
+ box-shadow 0.25s ease,
151
+ text-shadow 0.25s ease,
152
+ color 0.25s ease;
153
+ }
154
+ body.ai-page .ai-content .prose a:hover {
155
+ box-shadow:
156
+ 0 0 12px rgba(140, 210, 242, 0.4),
157
+ 0 0 24px rgba(132, 214, 255, 0.28);
158
+ text-shadow:
159
+ 0 0 10px rgba(162, 222, 248, 0.56),
160
+ 0 0 20px rgba(138, 214, 255, 0.3);
161
+ color: rgba(190, 236, 255, 0.98);
162
+ }
163
+ /* 代码块:输出窗口风格 */
164
+ body.ai-page .ai-content .prose code {
165
+ background: rgba(10, 18, 30, 0.72);
166
+ border: 1px solid rgba(126, 192, 224, 0.26);
167
+ color: rgba(196, 232, 248, 0.92);
168
+ }
169
+ body.ai-page .ai-content .prose pre {
170
+ background: rgba(8, 12, 22, 0.88);
171
+ border: 1px solid rgba(142, 218, 255, 0.2);
172
+ box-shadow:
173
+ inset 0 0 34px rgba(14, 34, 54, 0.44),
174
+ 0 0 20px rgba(132, 214, 255, 0.08),
175
+ 0 0 0 1px rgba(146, 214, 244, 0.14);
176
+ border-radius: 6px;
177
+ overflow: hidden;
178
+ }
179
+ body.ai-page .ai-content .prose pre code {
180
+ background: transparent;
181
+ border: none;
182
+ color: inherit;
183
+ }
184
+ /* 引用块:输出窗口风格 + 命令提示符 */
185
+ body.ai-page .ai-content .prose blockquote {
186
+ position: relative;
187
+ background: rgba(12, 18, 30, 0.64);
188
+ border: 1px solid rgba(126, 192, 224, 0.22);
189
+ border-left: 3px solid rgba(146, 214, 244, 0.56);
190
+ padding: 1em 1.25em 1em 2.5em;
191
+ border-radius: 4px;
192
+ box-shadow:
193
+ 0 0 16px rgba(136, 206, 238, 0.1),
194
+ inset 0 0 20px rgba(8, 28, 44, 0.26);
195
+ }
196
+ body.ai-page .ai-content .prose blockquote::before {
197
+ content: ">";
198
+ position: absolute;
199
+ left: 0.6em;
200
+ top: 1em;
201
+ color: rgba(156, 220, 246, 0.8);
202
+ font-family: monospace;
203
+ font-weight: bold;
204
+ }
205
+ /* 代码块命令提示符 */
206
+ body.ai-page .ai-content .prose pre {
207
+ position: relative;
208
+ padding-left: 2.5em;
209
+ padding-top: 2.2em;
210
+ }
211
+ body.ai-page .ai-content .prose pre::before {
212
+ content: "● ● ● runtime";
213
+ position: absolute;
214
+ left: 1em;
215
+ top: 0.9em;
216
+ color: rgba(168, 226, 248, 0.72);
217
+ font-family: monospace;
218
+ font-size: 0.72em;
219
+ text-transform: uppercase;
220
+ letter-spacing: 0.12em;
221
+ text-shadow: 0 0 8px rgba(124, 206, 246, 0.28);
222
+ }
223
+ body.ai-page .ai-content .prose pre::after {
224
+ content: "";
225
+ position: absolute;
226
+ inset: 0;
227
+ pointer-events: none;
228
+ background: linear-gradient(
229
+ 110deg,
230
+ rgba(132, 214, 255, 0) 0%,
231
+ rgba(132, 214, 255, 0.18) 48%,
232
+ rgba(132, 214, 255, 0) 100%
233
+ );
234
+ transform: translateX(-130%);
235
+ transition: transform 0.5s ease;
236
+ }
237
+ body.ai-page .ai-content .prose pre:hover::after {
238
+ transform: translateX(130%);
239
+ }
240
+ body.ai-page .ai-content .prose blockquote::after {
241
+ content: "reference";
242
+ position: absolute;
243
+ right: 1em;
244
+ top: 0.9em;
245
+ color: rgba(172, 230, 252, 0.64);
246
+ font-family: ui-monospace, monospace;
247
+ font-size: 0.66em;
248
+ letter-spacing: 0.06em;
249
+ text-transform: uppercase;
250
+ }
251
+ body.ai-page header {
252
+ position: fixed;
253
+ top: 0;
254
+ left: 0;
255
+ right: 0;
256
+ z-index: 11;
257
+ backdrop-filter: blur(3px);
258
+ -webkit-backdrop-filter: blur(3px);
259
+ }
260
+ body.ai-page .ai-content {
261
+ padding-top: calc(3em + 56px);
262
+ }
263
+ @media (max-width: 720px) {
264
+ body.ai-page .ai-content {
265
+ padding-top: calc(1em + 56px);
266
+ }
267
+ }
@@ -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
+ }