@xingwangzhe/stalux 1.40.0 → 1.41.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.
package/README.md CHANGED
@@ -18,7 +18,7 @@ Standalone images written as `![Image description](url)` receive a `figure` and
18
18
 
19
19
  Code blocks default to the single `dark-plus` theme, with system color-scheme switching and theme selectors disabled. To opt into another theme or switching behavior, explicitly override `themes`, `useDarkModeMediaQuery`, and `themeCssSelector` through `expressiveCode`. This only changes generated code styles and adds no telemetry.
20
20
 
21
- Route changes use native CSS View Transitions for one visible semantic heading in the incoming page. The policy covers every theme route category: normal effects take 100–180ms, with short 100–120ms fades on mobile. Entering an article, returning to a list, filtering categories or tags, explicit previous/next article controls, and returning home receive hints that follow reading intent. History traversal restores the existing scroll position; offscreen headings remain out of view. Reduced motion, browser-provided history gestures and same-page anchors add no visible VT animation. Standalone HTML keeps native navigation. See the [1.40.0 transition policy](https://github.com/xingwangzhe/stalux/blob/v1.40.0/docs/view-transitions-1.40.0.md).
21
+ Route changes use native CSS View Transitions with CSS animations on the reading and list content; sidebars, navigation, footer and background remain stationary. The policy covers every theme route category: previous/next articles slide horizontally in opposite directions, home and information pages use gentle perspective turns, words use a small rotation, and taxonomy details enter vertically. Desktop and mobile both retain spatial motion: article-to-article switching lasts 260ms, while other route animations take 100–180ms. History traversal uses a shorter, smaller directional slide while Astro restores the reading position. Reduced motion, browser-provided history gestures and same-page anchors add no visible VT animation. Standalone HTML keeps native navigation. See the [1.41.0 transition policy and performance boundaries](https://github.com/xingwangzhe/stalux/blob/v1.41.0/docs/view-transitions-1.41.0.md).
22
22
 
23
23
  The sticky header stays at the top while the body grows with long content; the persisted header and footer stay in place during navigation. Text is immediately clear, and the incoming heading is measured once after Astro swaps the document and restores scrolling. Astro continues to own document/font preparation, history, scrolling and page-script lifecycle. Shared motion state settles when the native transition finishes or is canceled. CSS animation duration is reported separately from total navigation time, which includes networking, layout and browser settlement.
24
24
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xingwangzhe/stalux",
3
- "version": "1.40.0",
3
+ "version": "1.41.0",
4
4
  "description": "A powerful, modern Astro blog theme — use as template or install as plugin",
5
5
  "keywords": [
6
6
  "astro",
@@ -53,7 +53,7 @@ const archiveYears = [...archivesByYearMonth.entries()]
53
53
  }));
54
54
  ---
55
55
 
56
- <section class="stalux-archive-container">
56
+ <section class="stalux-archive-container" data-stalux-motion-content>
57
57
  <div class="stalux-archive-page-header">
58
58
  <div class="stalux-archive-timeline-container">
59
59
  {archiveYears.length > 0 ? (
@@ -7,7 +7,7 @@ import { getCategoryCountList } from "@utils/collections-stats";
7
7
  const categoryList = await getCategoryCountList(Astro.logger);
8
8
  ---
9
9
 
10
- <ul class="stalux-categories">
10
+ <ul class="stalux-categories" data-stalux-motion-content>
11
11
  {categoryList.map((category) => (
12
12
  <li>
13
13
  <CategoriesCard category={category} />
@@ -18,6 +18,7 @@ const { heading, description } = Astro.props;
18
18
  {description && (
19
19
  <div
20
20
  class="stalux-page-description stalux-u-text-center"
21
+ data-stalux-motion-content
21
22
  transition:name="stalux-page-description"
22
23
  transition:animate="none"
23
24
  >
@@ -10,7 +10,7 @@ const linksConfig = getLinksData(configEntries);
10
10
  const links = linksConfig?.sites ?? [];
11
11
  ---
12
12
 
13
- <ul class="stalux-links">
13
+ <ul class="stalux-links" data-stalux-motion-content>
14
14
  {links.map((link) => (
15
15
  <li class="stalux-link-list-item">
16
16
  <LinkCard link={link} />
@@ -11,6 +11,7 @@ const summary = description?.trim();
11
11
  {summary && (
12
12
  <aside
13
13
  class="stalux-article-summary"
14
+ data-stalux-motion-content
14
15
  aria-label={label}
15
16
  transition:name={transitionName}
16
17
  transition:animate="none"
@@ -127,6 +127,7 @@ const mdSourceUrl = exportMd ? `${Astro.url.pathname.replace(/\/$/, "")}.md` : "
127
127
  <!-- Article Body -->
128
128
  <section
129
129
  class="stalux-post-body stalux-prose"
130
+ data-stalux-motion-content
130
131
  data-pagefind-body
131
132
  data-stalux-post-id={props.postId === undefined ? undefined : String(props.postId)}
132
133
  data-pagefind-filter={props.postId === undefined ? undefined : "post[data-stalux-post-id]"}
@@ -11,7 +11,7 @@ const props = Astro.props as Props;
11
11
  const posts = props.posts ?? (await getCollection("posts", ({ data }) => !data.draft));
12
12
  ---
13
13
 
14
- <div data-stalux="postlist" class="stalux-post-list-container">
14
+ <div data-stalux="postlist" class="stalux-post-list-container" data-stalux-motion-content>
15
15
  <ul class="post-list">
16
16
  {posts.map((post, index) => (
17
17
  <li>
@@ -22,7 +22,7 @@ const tagLinks = tagList.map((t) => ({
22
22
  ---
23
23
 
24
24
  <!-- 移动端:SSR 卡片 -->
25
- <div class="stalux-cloud-cards" id="tags-cards">
25
+ <div class="stalux-cloud-cards" id="tags-cards" data-stalux-motion-content>
26
26
  {tagList.length > 0 ? (
27
27
  tagGroups.map((group) => (
28
28
  <div class="stalux-cloud-tag-group">
@@ -47,7 +47,11 @@ const tagLinks = tagList.map((t) => ({
47
47
  </div>
48
48
 
49
49
  <!-- 桌面端:Canvas 标签云 -->
50
- <div class="stalux-cloud-canvas-frame" style={{ "--cloud-density": cloudDensity }}>
50
+ <div
51
+ class="stalux-cloud-canvas-frame"
52
+ style={{ "--cloud-density": cloudDensity }}
53
+ data-stalux-motion-content
54
+ >
51
55
  <div class="stalux-cloud-canvas" id="tags-canvas" data-tags={JSON.stringify(tagLinks)}></div>
52
56
  </div>
53
57
 
@@ -19,7 +19,7 @@ const sorted = [...entries].sort((a, b) => {
19
19
  });
20
20
  ---
21
21
 
22
- <ul class="stalux-word-list-list">
22
+ <ul class="stalux-word-list-list" data-stalux-motion-content>
23
23
  {sorted.map((entry) => {
24
24
  return (
25
25
  <li class="stalux-word-list-item">
@@ -290,77 +290,80 @@ export const styleNames: { classes: Record<string, string>; variables: Record<st
290
290
  "--stalux-site-header-height": "--s1q",
291
291
  "--stalux-site-header-min-height": "--s1r",
292
292
  "--stalux-text-shadow": "--s1s",
293
- "--surface-glass": "--s1t",
294
- "--surface-glass-shadow": "--s1u",
295
- "--tag-bg": "--s1v",
296
- "--tag-bg-hover": "--s1w",
297
- "--tl-line": "--s1x",
298
- "--tl-pad": "--s1y",
299
- "--transition-fast": "--s1z",
300
- "--transition-medium": "--s20",
301
- "--transition-normal": "--s21",
302
- "--transition-slow": "--s22",
303
- "--transition-slower": "--s23",
304
- "--transition-slowest": "--s24",
305
- "--un-rotate": "--s25",
306
- "--un-rotate-x": "--s26",
307
- "--un-rotate-y": "--s27",
308
- "--un-rotate-z": "--s28",
309
- "--un-scale-x": "--s29",
310
- "--un-scale-y": "--s2a",
311
- "--un-scale-z": "--s2b",
312
- "--un-skew-x": "--s2c",
313
- "--un-skew-y": "--s2d",
314
- "--un-translate-x": "--s2e",
315
- "--un-translate-y": "--s2f",
316
- "--un-translate-z": "--s2g",
317
- "--updated-bg": "--s2h",
318
- "--updated-border": "--s2i",
319
- "--white-05p": "--s2j",
320
- "--white-10p": "--s2k",
321
- "--white-15p": "--s2l",
322
- "--white-20p": "--s2m",
323
- "--white-30p": "--s2n",
324
- "--white-50p": "--s2o",
325
- "--white-60p": "--s2p",
326
- "--white-70p": "--s2q",
327
- "--white-75p": "--s2r",
328
- "--white-78p": "--s2s",
329
- "--white-80p": "--s2t",
330
- "--white-85p": "--s2u",
331
- "--white-90p": "--s2v",
332
- "--white-95p": "--s2w",
333
- "--white-full": "--s2x"
293
+ "--stalux-vt-distance": "--s1t",
294
+ "--stalux-vt-duration": "--s1u",
295
+ "--stalux-vt-rx": "--s1v",
296
+ "--stalux-vt-ry": "--s1w",
297
+ "--stalux-vt-rz": "--s1x",
298
+ "--stalux-vt-scale": "--s1y",
299
+ "--stalux-vt-tilt": "--s1z",
300
+ "--stalux-vt-x": "--s20",
301
+ "--stalux-vt-y": "--s21",
302
+ "--surface-glass": "--s22",
303
+ "--surface-glass-shadow": "--s23",
304
+ "--tag-bg": "--s24",
305
+ "--tag-bg-hover": "--s25",
306
+ "--tl-line": "--s26",
307
+ "--tl-pad": "--s27",
308
+ "--transition-fast": "--s28",
309
+ "--transition-medium": "--s29",
310
+ "--transition-normal": "--s2a",
311
+ "--transition-slow": "--s2b",
312
+ "--transition-slower": "--s2c",
313
+ "--transition-slowest": "--s2d",
314
+ "--un-rotate": "--s2e",
315
+ "--un-rotate-x": "--s2f",
316
+ "--un-rotate-y": "--s2g",
317
+ "--un-rotate-z": "--s2h",
318
+ "--un-scale-x": "--s2i",
319
+ "--un-scale-y": "--s2j",
320
+ "--un-scale-z": "--s2k",
321
+ "--un-skew-x": "--s2l",
322
+ "--un-skew-y": "--s2m",
323
+ "--un-translate-x": "--s2n",
324
+ "--un-translate-y": "--s2o",
325
+ "--un-translate-z": "--s2p",
326
+ "--updated-bg": "--s2q",
327
+ "--updated-border": "--s2r",
328
+ "--white-05p": "--s2s",
329
+ "--white-10p": "--s2t",
330
+ "--white-15p": "--s2u",
331
+ "--white-20p": "--s2v",
332
+ "--white-30p": "--s2w",
333
+ "--white-50p": "--s2x",
334
+ "--white-60p": "--s2y",
335
+ "--white-70p": "--s2z",
336
+ "--white-75p": "--s30",
337
+ "--white-78p": "--s31",
338
+ "--white-80p": "--s32",
339
+ "--white-85p": "--s33",
340
+ "--white-90p": "--s34",
341
+ "--white-95p": "--s35",
342
+ "--white-full": "--s36"
334
343
  },
335
344
  "animations": {
336
345
  "fadeInUpComment": "k0",
337
346
  "spin": "k1",
338
347
  "stalux-article-enter": "k2",
339
348
  "stalux-article-enter-back": "k3",
340
- "stalux-cursor-blink": "k4",
341
- "stalux-focus-enter": "k5",
342
- "stalux-focus-fade": "k6",
343
- "stalux-focus-home": "k7",
344
- "stalux-focus-next": "k8",
345
- "stalux-focus-previous": "k9",
346
- "stalux-focus-restore": "ka",
347
- "stalux-focus-up": "kb",
348
- "stalux-link-avatar-spin": "kc",
349
- "stalux-page-enter": "kd",
350
- "stalux-page-enter-back": "ke",
351
- "stalux-page-exit": "kf",
352
- "stalux-random-spin": "kg",
353
- "stalux-sidebar-left-back-in": "kh",
354
- "stalux-sidebar-left-back-out": "ki",
355
- "stalux-sidebar-left-in": "kj",
356
- "stalux-sidebar-left-out": "kk",
357
- "stalux-sidebar-right-back-in": "kl",
358
- "stalux-sidebar-right-back-out": "km",
359
- "stalux-sidebar-right-in": "kn",
360
- "stalux-sidebar-right-out": "ko",
361
- "stalux-social-stalux-social-arrive": "kp",
362
- "stalux-taxonomy-enter": "kq",
363
- "stalux-taxonomy-enter-back": "kr",
364
- "stalux-word-word-glow": "ks"
349
+ "stalux-content-in": "k4",
350
+ "stalux-cursor-blink": "k5",
351
+ "stalux-link-avatar-spin": "k6",
352
+ "stalux-page-enter": "k7",
353
+ "stalux-page-enter-back": "k8",
354
+ "stalux-page-exit": "k9",
355
+ "stalux-random-spin": "ka",
356
+ "stalux-sidebar-left-back-in": "kb",
357
+ "stalux-sidebar-left-back-out": "kc",
358
+ "stalux-sidebar-left-in": "kd",
359
+ "stalux-sidebar-left-out": "ke",
360
+ "stalux-sidebar-right-back-in": "kf",
361
+ "stalux-sidebar-right-back-out": "kg",
362
+ "stalux-sidebar-right-in": "kh",
363
+ "stalux-sidebar-right-out": "ki",
364
+ "stalux-social-stalux-social-arrive": "kj",
365
+ "stalux-taxonomy-enter": "kk",
366
+ "stalux-taxonomy-enter-back": "kl",
367
+ "stalux-word-word-glow": "km"
365
368
  }
366
369
  };
@@ -19,8 +19,8 @@ const { t } = createTranslator(siteConfig.lang || "zh-CN");
19
19
  >
20
20
  <div class="stalux-404-error-content">
21
21
  <h1 data-stalux-motion-focus>404</h1>
22
- <p>{t("page404.pageNotFound")}</p>
23
- <p class="agent-recovery">
22
+ <p data-stalux-motion-content>{t("page404.pageNotFound")}</p>
23
+ <p class="agent-recovery" data-stalux-motion-content>
24
24
  This URL does not exist. Continue at the <a href="/">home page</a>, browse the
25
25
  <a href="/archives/">archive</a>, read <a href="/llms.txt">llms.txt</a>, or inspect
26
26
  the
@@ -29,12 +29,17 @@ const { t } = createTranslator(siteConfig.lang || "zh-CN");
29
29
  </p>
30
30
  <p
31
31
  id="countdown"
32
+ data-stalux-motion-content
32
33
  class="stalux-404-countdown-text"
33
34
  data-countdown-template={t("page404.countdown", { n: "{n}" })}
34
35
  >
35
36
  {t("page404.countdown", { n: 5 })}
36
37
  </p>
37
- <a href="/" class="stalux-404-home-btn home-btn" data-astro-prefetch
38
+ <a
39
+ href="/"
40
+ class="stalux-404-home-btn home-btn"
41
+ data-astro-prefetch
42
+ data-stalux-motion-content
38
43
  >{t("page404.backHome")}</a
39
44
  >
40
45
  </div>
@@ -49,10 +49,12 @@ import { getSiteData } from "@utils/config-utils";
49
49
  mutate data.
50
50
  </p>
51
51
  </section>
52
- <Author />
53
- <TextType />
54
- <DateTime />
55
- <SocialMedia />
56
- <ToArchive />
52
+ <div data-stalux-home-content data-stalux-motion-content>
53
+ <Author />
54
+ <TextType />
55
+ <DateTime />
56
+ <SocialMedia />
57
+ <ToArchive />
58
+ </div>
57
59
  </div>
58
60
  </Stalux>
@@ -53,29 +53,7 @@ function clearNavigationState(): void {
53
53
  delete html.dataset.staluxVtTo;
54
54
  delete html.dataset.staluxVtDirection;
55
55
  delete html.dataset.staluxVtPreset;
56
- clearFocusVisibility();
57
- }
58
-
59
- function clearFocusVisibility(): void {
60
- document
61
- .querySelector("[data-stalux-motion-focus]")
62
- ?.removeAttribute?.("data-stalux-motion-visible");
63
- }
64
-
65
- /** At most one bounded title is considered, never an entire article or list. */
66
- function updateFocusVisibility(): void {
67
- const focus = document.querySelector<HTMLElement>("[data-stalux-motion-focus]");
68
- if (!focus || typeof focus.getBoundingClientRect !== "function") return;
69
- const rect = focus.getBoundingClientRect();
70
- const visible =
71
- rect.width > 0 &&
72
- rect.height > 0 &&
73
- rect.height <= window.innerHeight / 2 &&
74
- rect.bottom > 0 &&
75
- rect.top < window.innerHeight &&
76
- rect.right > 0 &&
77
- rect.left < window.innerWidth;
78
- focus.dataset.staluxMotionVisible = String(visible);
56
+ delete html.dataset.staluxVtPhase;
79
57
  }
80
58
 
81
59
  function preserveHeaderMetrics(nextDocument: Document): void {
@@ -94,15 +72,19 @@ function preserveHeaderMetrics(nextDocument: Document): void {
94
72
  const transitionWindow = window as TransitionWindow;
95
73
  if (!transitionWindow.__STALUX_VT_LISTENER__) {
96
74
  transitionWindow.__STALUX_VT_LISTENER__ = true;
75
+ let pendingNavigation = 0;
76
+ let swappedNavigation = 0;
97
77
 
98
78
  // A current-page link is not a page replacement. Intercept before Astro's
99
79
  // delegated handler, but keep propagation for menu cleanup and click tracking.
80
+ // During preparation, Astro must receive it to cancel an incoming route.
100
81
  // Hash changes, explicit reloads, downloads and modified/new-tab clicks keep
101
82
  // their native behavior.
102
83
  document.addEventListener(
103
84
  "click",
104
85
  (event) => {
105
86
  if (
87
+ pendingNavigation !== 0 ||
106
88
  event.defaultPrevented ||
107
89
  event.button !== 0 ||
108
90
  event.metaKey ||
@@ -148,10 +130,16 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
148
130
  document.addEventListener("astro:before-preparation", (event) => {
149
131
  const navigation = event as unknown as NavigationEvent;
150
132
  const current = ++generation;
133
+ pendingNavigation = current;
134
+ const cancelPreparation = () => {
135
+ if (current !== generation) return;
136
+ pendingNavigation = 0;
137
+ clearNavigationState();
138
+ };
151
139
  motion?.cancel();
152
- // Only the incoming heading animates. Drop any prior marker without
153
- // measuring/capturing a hidden outgoing title or flushing its layout.
154
- clearFocusVisibility();
140
+ clearNavigationState();
141
+ // CSS moves only explicitly marked content, never the root or sidebars.
142
+ // Long article geometry does not need to be measured or captured.
155
143
  preset = getRouteMotionPreset({
156
144
  from: new URL(navigation.from, window.location.href),
157
145
  to: new URL(navigation.to, window.location.href),
@@ -166,25 +154,21 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
166
154
  });
167
155
  pendingBrowserMotion = false;
168
156
  setNavigationState(navigation, preset);
169
- navigation.signal.addEventListener(
170
- "abort",
171
- () => {
172
- if (current === generation) clearNavigationState();
173
- },
174
- { once: true },
175
- );
157
+ navigation.signal.addEventListener("abort", cancelPreparation, { once: true });
158
+ if (navigation.signal.aborted) cancelPreparation();
176
159
  queueMicrotask(() => {
177
- if (event.defaultPrevented && current === generation) clearNavigationState();
160
+ if (event.defaultPrevented) cancelPreparation();
178
161
  });
179
162
  const loader = navigation.loader;
180
163
  navigation.loader = async () => {
181
164
  try {
182
165
  await loader();
183
- if (!event.defaultPrevented) {
166
+ if (event.defaultPrevented) cancelPreparation();
167
+ else {
184
168
  await prepareNavigationFont(navigation.newDocument, navigation.signal);
185
169
  }
186
170
  } catch (error) {
187
- if (current === generation) clearNavigationState();
171
+ cancelPreparation();
188
172
  throw error;
189
173
  }
190
174
  };
@@ -194,16 +178,35 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
194
178
  const navigation = event as unknown as NavigationEvent;
195
179
  if (navigation.signal.aborted) return;
196
180
  const current = generation;
181
+ swappedNavigation = current;
197
182
  preserveHeaderMetrics(navigation.newDocument);
198
183
  // Astro replaces the root attributes during swap. Carry state into the
199
184
  // new document; CSS keyframes read these data-* attributes to pick their
200
185
  // own direction rather than letting Astro's default `fade` pair apply.
201
186
  setNavigationState(navigation, preset, navigation.newDocument.documentElement);
187
+ if (preset !== "none") {
188
+ navigation.newDocument.documentElement.dataset.staluxVtPhase = "prepared";
189
+ }
202
190
  // This release uses CSS/native VT only. Settle the existing installation
203
191
  // gate without starting a second WAAPI effect; analytics/background keep
204
192
  // the same shared ready/finished semantics and their existing listeners.
205
193
  motion = prepareRouteMotion(navigation);
206
194
  motion.start(null, { skip: true });
195
+ // Preparing the incoming content paused prevents a one-frame flash at
196
+ // its final position. Release it with the heading's native animation;
197
+ // page scripts and Astro's scroll restoration keep their normal order.
198
+ void Promise.resolve(navigation.viewTransition?.ready).then(
199
+ () => {
200
+ if (
201
+ current === generation &&
202
+ !navigation.signal.aborted &&
203
+ document.documentElement.dataset.staluxVtPhase === "prepared"
204
+ ) {
205
+ document.documentElement.dataset.staluxVtPhase = "running";
206
+ }
207
+ },
208
+ () => {},
209
+ );
207
210
  const finish = () => {
208
211
  if (current === generation) clearNavigationState();
209
212
  };
@@ -215,10 +218,11 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
215
218
 
216
219
  document.addEventListener("astro:after-swap", () => {
217
220
  setRouteState(window.location.pathname);
218
- if (preset !== "none") updateFocusVisibility();
219
221
  });
220
222
 
221
223
  document.addEventListener("astro:page-load", () => {
224
+ // A previous route's scripts can finish while a newer loader is pending.
225
+ if (swappedNavigation === generation) pendingNavigation = 0;
222
226
  setRouteState(window.location.pathname);
223
227
  });
224
228
 
@@ -1,3 +1,3 @@
1
1
  @layer theme, base, components, utilities;
2
- @layer components{.stalux-404-home-btn{background:var(--black-20p);border:var(--border-thin) solid var(--white-20p);transition:background-color var(--transition-normal), transform var(--transition-normal), box-shadow var(--transition-normal);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);color:var(--white-90p);font-size:var(--font-size-base);text-decoration:none;display:inline-block}.stalux-ai-prompt{clip-path:inset(50%);white-space:pre-wrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stalux-badge-group{border:none}.stalux-badge-group-arrow{font-size:.65rem;transition:transform .2s;display:inline-block}.stalux-badge-group-summary{user-select:none;cursor:pointer;color:var(--white-70p);gap:.4rem;padding:.2rem 0;font-size:.85rem;list-style-type:none;transition:color .2s}.stalux-beian-public-security-beian{color:#ffffffb3;gap:5px;font-size:.9rem;text-decoration:none;transition:color .3s;display:inline-flex}.stalux-card-post-categories,.stalux-card-post-tags{gap:.4rem}.stalux-card-post-category{background:var(--category-bg);color:#fff;border-radius:6px;padding:.18rem .5rem;font-size:.84rem;line-height:1;display:inline-block}.stalux-card-post-description{overflow-wrap:anywhere;color:var(--white-70p);line-height:1.6}.stalux-card-post-meta{gap:.6rem}.stalux-card-post-tag{background:var(--tag-bg);color:#fff;border-radius:9999px;padding:.22rem .7rem;font-size:.85rem;line-height:1;display:inline-block}.stalux-card-post-title{overflow-wrap:anywhere;margin:0;line-height:1.35}.stalux-card-read-more{align-self:flex-start;margin-top:.6rem}.stalux-card-time{gap:.45rem;display:inline-flex}.stalux-copyright{color:var(--white-70p);gap:.3em;font-weight:500}.stalux-footer{backdrop-filter:blur(10px);color:var(--white-full);background-color:#0000001a;margin-top:auto;padding:1.5rem 0;font-size:.9rem}.stalux-footer-content{gap:.8rem;max-width:1200px;margin:0 auto;padding:0 1rem}.stalux-nav-list{transform:scale(var(--nav-scale,1));transform-origin:50%;box-sizing:border-box;gap:2rem;max-width:100%;transition:transform .22s cubic-bezier(.22,.72,.22,1);overflow:visible}.stalux-nav-overlay{pointer-events:none;z-index:999;opacity:0;background:#0009;height:100%;transition:opacity .3s;display:none;position:fixed;top:0;left:0}.stalux-nav-scroll-btn{background:var(--black-30p);backdrop-filter:blur(8px);box-shadow:var(--shadow-md);pointer-events:none;z-index:10;cursor:pointer;width:36px;height:36px;color:var(--white-full);opacity:0;border:none;border-radius:9999px;padding:0;transition:opacity .25s;display:none;position:absolute;top:50%;transform:translateY(-50%)}.stalux-nav-toggle{z-index:998;cursor:pointer;min-width:48px;min-height:48px;color:inherit;background:0 0;border:none;padding:.75rem;display:none}.stalux-post-card{box-sizing:border-box;cursor:pointer;gap:var(--space-lg);border-radius:var(--radius-lg);background-color:var(--card-bg);height:100%;padding:var(--space-lg);box-shadow:var(--card-box-shadow);transition:transform .22s cubic-bezier(.22,.72,.22,1)}.stalux-stats-site-build-time{color:#fffc;margin-top:.5rem;font-size:.9rem}.stalux-stats-stats-separator{color:#ffffff80}.stalux-theme-info{color:var(--white-70p);gap:.3em;font-size:.85rem}.stalux-home-body{min-height:calc(100vh - var(--stalux-site-header-height));padding-bottom:var(--space-3xl);position:relative}.stalux-nav-container{box-sizing:border-box;max-width:100%;position:relative;overflow:hidden}.stalux-author{margin-top:4em}.stalux-card-post-cover{border-radius:var(--radius-md);flex-shrink:0;height:180px;margin-bottom:.5rem;overflow:hidden}.stalux-home-title{color:var(--white-full);text-shadow:var(--stalux-text-shadow);margin-top:1.5em;font-size:4em}.stalux-nav-item{text-shadow:var(--stalux-text-shadow);flex-shrink:0;margin-left:1em;margin-right:1em;font-size:1.3em}.stalux-page-description{color:var(--white-60p);margin-bottom:1.5em;font-size:1.2em}.stalux-page-title{text-shadow:var(--stalux-text-shadow);margin-top:1.5em;font-size:2.5em}.stalux-typewriter{min-height:2em;text-shadow:var(--stalux-text-shadow);margin-top:1.5em;font-size:2.5em}.stalux-404-error-container{min-height:60vh;padding:2rem}.stalux-badge,.stalux-badges-wrapper .stalux-badge{width:auto}.stalux-u-min-w-0{min-width:0}.stalux-u-w-full{width:100%}.stalux-u-flex{display:flex}.stalux-u-flex-col{flex-direction:column}.stalux-u-flex-wrap{flex-wrap:wrap}.stalux-u-items-center{align-items:center}.stalux-u-justify-center{justify-content:center}.stalux-badges,.stalux-badges-wrapper{gap:.5rem}.stalux-beian-beian-info{gap:1rem}.stalux-stats-site-stats{gap:.5rem;font-size:.9rem}.stalux-nav-text{white-space:nowrap;color:var(--white-full)}.stalux-badge-group-items{padding-top:.35rem}.stalux-u-text-center{text-align:center}.stalux-badge-group-hint{color:var(--white-70p);font-size:.7rem}.stalux-badge-group-title{color:var(--white-80p)}#stalux-home-show-post-list{cursor:pointer;text-shadow:var(--stalux-text-shadow);margin-top:3em;font-size:1.5em}.stalux-post-list-container{width:100%;height:auto;margin:5px 0}.stalux-post-list-container ul{flex-wrap:wrap;gap:2rem;margin:3em;padding:0;list-style-type:none;display:flex}.stalux-post-list-container ul>li{flex:min(22rem,100%);min-width:0;margin:0}.stalux-card-post-title a{color:inherit;text-decoration:none}.stalux-post-card>a:first-child{width:100%;min-width:0;display:block}.stalux-card-post-cover img{object-fit:cover;width:100%;max-width:100%;height:100%;transition:transform var(--transition-fast)}.stalux-card-post-date,.stalux-card-post-updated{color:#e8f2ff;border-radius:10px;align-items:center;gap:.35rem;width:fit-content;padding:.28rem .6rem;font-size:.9rem;line-height:1.1;display:inline-flex}.stalux-card-post-date{background:var(--date-bg);border:1px solid var(--date-border);color:#e8f2ff}.stalux-card-post-updated{background:var(--updated-bg);border:1px solid var(--updated-border);color:#fff7de}.stalux-card-post-tags a,.stalux-card-post-categories a{text-decoration:none}.stalux-card-post-tags a:focus-visible .stalux-card-post-tag{background:var(--tag-bg-hover)}.stalux-card-post-categories a:focus-visible .stalux-card-post-category{background:var(--category-bg-hover)}.stalux-social{margin-top:3em}.stalux-social ul{flex-wrap:wrap;justify-content:center;gap:1em;margin:0;padding:0;display:flex}.stalux-social ul li{box-sizing:border-box;text-align:center;background-color:var(--white-15p);border-radius:9999px;justify-content:center;align-items:center;width:2.5em;height:2.5em;font-size:large;display:inline-flex;overflow:hidden}.stalux-social ul a,.stalux-social ul .stalux-social-icon-container,.stalux-social ul .stalux-social-custom-icon{justify-content:center;align-items:center;width:100%;height:100%;line-height:1;display:inline-flex}.stalux-social[data-stalux-social-animate=true] li{animation:.28s cubic-bezier(.2,.8,.2,1) both stalux-social-stalux-social-arrive}.stalux-social[data-stalux-social-animate=true] li:nth-child(2){animation-delay:30ms}.stalux-social[data-stalux-social-animate=true] li:nth-child(3){animation-delay:60ms}.stalux-social[data-stalux-social-animate=true] li:nth-child(4){animation-delay:90ms}.stalux-social[data-stalux-social-animate=true] li:nth-child(5){animation-delay:.12s}.stalux-social[data-stalux-social-animate=true] li:nth-child(6){animation-delay:.15s}.stalux-social[data-stalux-social-animate=true] li:nth-child(n+7){animation-delay:.18s}nav{width:100%;min-width:0;max-width:100%}html{scroll-padding-top:var(--stalux-nav-offset,var(--stalux-site-header-height))}.stalux-site-header{z-index:990;width:100%;min-height:var(--stalux-site-header-min-height);isolation:isolate;justify-content:center;align-items:center;display:flex;position:sticky;top:0}.stalux-nav-scroll-btn[data-visible]{pointer-events:auto;opacity:1}.stalux-nav-scroll-btn[data-side=left]{left:4px}.stalux-nav-scroll-btn[data-side=right]{right:4px}.stalux-nav-scroll-btn svg{stroke:currentColor;stroke-width:2px;fill:none;width:20px;height:20px}.stalux-nav-link,.stalux-nav-link:visited{cursor:pointer;width:100%;color:inherit;min-height:44px;font:inherit;background:0 0;border:none;align-items:center;gap:.5rem;padding:.5rem .75rem;text-decoration:none;display:flex}.stalux-nav-link .nav-icon{stroke:var(--white-full)}.stalux-nav-toggle svg{width:32px;height:32px}.stalux-nav-overlay[data-state=show]{pointer-events:auto;opacity:1;display:block}#stalux-to-archive-archs{margin-top:2em}#stalux-date-date-time{text-shadow:var(--stalux-text-shadow);color:var(--white-full);flex-direction:column;align-items:center;margin-top:2em;display:flex}#stalux-date-date-time #stalux-date-date{min-height:1.25em;margin-bottom:.5em;font-size:2em;line-height:1.25}#stalux-date-date-time #stalux-date-time{font-variant-numeric:tabular-nums;min-height:1.25em;font-size:3em;line-height:1.25}.stalux-author-figure{justify-content:center;align-items:center;display:flex}.stalux-author-figure img{box-shadow:0 0 10px var(--stalux-accent-color);border-radius:9999px;transition:transform .65s ease-in-out}.stalux-author-figure figcaption{text-shadow:var(--stalux-text-shadow);color:var(--white-full);margin-left:1em;font-size:2.5em;font-weight:700}.stalux-author-figure-column figcaption{text-align:center;margin-top:.5em;margin-left:0}.agent-home-summary{clip-path:inset(50%);white-space:normal;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stalux-404-error-content h1{color:var(--white-90p);margin:0;font-size:6rem;font-weight:700}.stalux-404-error-content p{color:var(--white-70p);margin:1rem 0 2rem;font-size:1.5rem}.stalux-404-countdown-text{color:var(--white-50p)!important;margin:-.5rem 0 1.5rem!important;font-size:.95rem!important}.agent-recovery{max-width:42rem;line-height:1.7;margin:0 auto 1.5rem!important;font-size:1rem!important}.agent-recovery a{color:inherit;text-decoration-line:underline}.stalux-theme-info span,.stalux-copyright span{margin:0}.stalux-theme-info a{color:#fffc;margin:0 .2em;text-decoration:none;transition:color .3s}.stalux-beian-beian-info a{color:#ffffffb3;font-size:.9rem;text-decoration:none;transition:color .3s}.stalux-beian-public-security-beian img{width:15px;height:15px;display:inline-block}.stalux-badge-group-summary::-webkit-details-marker,.stalux-badge-group[open] .stalux-badge-group-hint[data-hint=collapsed],.stalux-badge-group:not([open]) .stalux-badge-group-hint[data-hint=expanded]{display:none}.stalux-badge-group[open] .stalux-badge-group-arrow{transform:rotate(90deg)}@media (hover:hover) and (pointer:fine){.stalux-card-post-tags a:hover .stalux-card-post-tag{background:var(--tag-bg-hover)}.stalux-card-post-categories a:hover .stalux-card-post-category{background:var(--category-bg-hover)}.stalux-post-card-shell:hover .stalux-post-card .stalux-card-post-cover img{transform:scale(1.025)}.stalux-post-card-shell:hover .stalux-post-card{box-shadow:var(--card-box-shadow-hover)}.stalux-nav-scroll-btn:hover{background:0 0}.stalux-nav-container:hover .stalux-nav-scroll-btn[data-visible]{opacity:1}.stalux-nav-link:hover .nav-icon,.stalux-nav-link:hover .stalux-nav-text{stroke:var(--stalux-accent-color);color:var(--stalux-accent-color)}.stalux-author-figure>a:hover img{animation:.65s ease-in-out stalux-link-avatar-spin}.stalux-404-home-btn:hover{background:var(--accent-20p);box-shadow:0 4px 12px var(--shadow-dark)}.stalux-theme-info a:hover{color:#fff;text-decoration:none}.stalux-beian-beian-info a:hover,.stalux-beian-public-security-beian:hover{color:#ffffffe6;text-decoration:none}.stalux-badge-group-summary:hover{color:var(--white-70p)}}@media (width>=601px){.stalux-site-nav{isolation:isolate;border-radius:0 0 16px 16px;transition:background-color .18s,box-shadow .18s}.stalux-site-nav[data-scrolled]{backdrop-filter:blur(20px)saturate(140%);box-shadow:0 1px 0 var(--white-10p), 0 8px 24px #0000001f;background:#181818c7}}@media (width<=1100px){.stalux-nav-list{gap:1rem}.stalux-nav-item{margin-left:.6em;margin-right:.6em;font-size:1em}}@media (width<=900px){.stalux-nav-item{margin-left:.25em;margin-right:.25em;font-size:.95em}.stalux-nav-list{gap:.5rem}}@media (width<=768px){.stalux-home-body{box-sizing:border-box;width:100%;max-width:95vw;height:auto;padding:2rem .5rem 1.5rem}.stalux-home-title{word-break:break-all;margin-top:1em;font-size:2em}#stalux-home-show-post-list{margin-top:2em;font-size:1.1em}.stalux-post-list-container ul{margin:1rem}.stalux-footer{padding:1.2rem 0;font-size:.8rem}.stalux-footer-content{gap:.6rem;padding:0 .8rem}.stalux-author{box-sizing:border-box;width:100%;max-width:95vw;margin-top:2em;padding:1em .5em}.stalux-author-figure{gap:.5em;flex-direction:column!important}.stalux-author-figure img{max-width:20vw;max-height:20vw;width:64px!important;height:64px!important}.stalux-author-figure figcaption{text-align:center;word-break:break-all;overflow-wrap:break-word;white-space:normal;max-width:90vw;margin-top:.5em;margin-left:0;font-size:1.5em}.stalux-404-error-content h1{font-size:4rem}.stalux-404-error-content p{font-size:1.2rem}.stalux-badges{gap:.3rem}.stalux-badge{width:auto}}@media (width<=600px){html{--stalux-site-header-min-height:4rem}.stalux-nav-toggle[data-state=open]{visibility:hidden;pointer-events:none}.stalux-nav-toggle[data-scrolled]{backdrop-filter:blur(20px)saturate(140%);box-shadow:0 1px 0 var(--white-10p), 0 8px 24px #0000001f;background:#181818c7;border-radius:12px}.stalux-nav-toggle{display:block;position:fixed;top:.75rem;left:.75rem}.stalux-nav-container{overflow:visible}nav{width:auto}.stalux-nav-list{pointer-events:none;z-index:1000;background:var(--black-20p);backdrop-filter:blur(20px);flex-direction:column;justify-content:flex-start;align-items:flex-start;gap:0;width:min(220px,100vw - 1rem);height:100vh;padding:.5rem 1rem 2rem;position:fixed;top:0;left:0;right:auto;overflow-y:auto;transform:translate(-100%)}.stalux-nav-list[data-state=open]{pointer-events:auto;transform:translate(0)}.stalux-nav-item{border-bottom:1px solid var(--white-10p);flex-shrink:0;width:100%;margin:0;font-size:.9em}.stalux-nav-text{display:inline}.stalux-nav-link{width:100%;min-height:44px;font-size:inherit;padding:.45rem .75rem}.stalux-nav-link .nav-icon{width:18px;height:18px}}@media (width<=480px){.stalux-footer{padding:1rem 0;font-size:.8rem}.stalux-footer-content{gap:.6rem;padding:0 .8rem}}@media (prefers-reduced-motion:reduce){.stalux-social[data-stalux-social-animate=true] li{animation:none}}.stalux-main,.stalux-post-page,.stalux-post-layout>*,.stalux-link-card-content,.stalux-word-list-item,.stalux-word-card{box-sizing:border-box;min-width:0;max-width:100%}.stalux-main{overflow-wrap:anywhere}.stalux-link-shell{min-width:0;max-width:100%;display:block}.stalux-link-card{box-sizing:border-box;width:100%;max-width:100%}.stalux-category-shell{width:100%;min-width:0}.stalux-author-figure>a{flex-shrink:0;display:inline-block}.stalux-author-figure img{display:block}.stalux-post-card-shell,.stalux-category-shell,.stalux-link-shell{position:relative}.stalux-post-card,.stalux-category-card,.stalux-link-card,.stalux-word-card{transition:transform .2s,background-color .2s,border-color .2s,box-shadow .2s}:is(.stalux-post-card-shell,.stalux-category-shell):focus-within>*,.stalux-link-shell:focus-visible>*{box-shadow:var(--card-box-shadow-hover)}:is(button,summary,[role=button]):focus-visible{outline:2px solid var(--stalux-accent-color);outline-offset:3px}@media (prefers-reduced-motion:reduce){.stalux-main *,.stalux-main :before,.stalux-main :after{transition-duration:0s!important;animation:none!important}.stalux-post-card,.stalux-category-card,.stalux-link-card,.stalux-link-card-content,.stalux-card-post-cover img,.stalux-category-icon,.stalux-author-figure img,.stalux-link-card-avatar img{transform:none!important}}@keyframes stalux-social-stalux-social-arrive{0%{opacity:0;transform:translateY(.75rem)rotate(-12deg)}to{opacity:1;transform:translateY(0)rotate(0)}}@keyframes stalux-random-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes stalux-link-avatar-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes stalux-word-word-glow{0%{box-shadow:0 0 30px var(--accent-50p), 0 0 80px var(--accent-30p), var(--shadow-lg);transform:scale(1.02)}to{box-shadow:0 0 20px var(--accent-40p), 0 0 60px var(--accent-20p), var(--shadow-lg);transform:scale(1)}}}@layer utilities{.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visible{visibility:visible}.absolute{position:absolute}.static{position:static}.grid{display:grid}.block{display:block}.inline-block{display:inline-block}.hidden{display:none}.h-full{height:100%}.flex{display:flex}.flex-shrink{flex-shrink:1}.flex-wrap{flex-wrap:wrap}.transform{transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotateZ(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.b,.border{border-width:1px}.text-inherit{color:inherit}.no-underline{text-decoration:none}.outline{outline-style:solid}}@layer theme;@layer base{html,body{color:#fff;width:100%;height:100%;margin:0;& main{flex:1}scrollbar-color:#4a4a4a #2a2a2a;font-family:var(--font-body), "Noto Sans SC", "Noto Sans CJK SC", system-ui, -apple-system, sans-serif;text-rendering:optimizelegibility;line-height:1.25;display:block}body{height:auto;min-height:100%}html{scrollbar-gutter:stable;background-color:var(--stalux-bg-color,#202020)}html[data-clarity-id]{opacity:1!important}a{color:inherit;cursor:pointer;text-decoration-skip-ink:auto;background-color:#0000;text-decoration:none;transition:color .2s,text-shadow .2s;position:relative}.a-none{cursor:pointer;text-decoration-skip-ink:auto;background-color:#0000;color:inherit!important;text-decoration:none!important}.a-none:after{display:none!important}a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):after{content:"";background:linear-gradient(90deg, var(--stalux-accent-color), var(--accent-50p));transform-origin:0;pointer-events:none;width:100%;height:1px;transition:transform .25s cubic-bezier(.25,.9,.2,1);position:absolute;bottom:-2px;left:0;transform:scaleX(0)}a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):focus-visible:after,a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):active:after{transform:scaleX(1)}@media (hover:hover) and (pointer:fine){a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):hover:after{transform:scaleX(1)}}a:active,a:focus-visible{text-decoration:none}@media (hover:hover) and (pointer:fine){a:hover{text-decoration:none}}a:focus{outline:none}a:focus-visible{outline:2px solid var(--stalux-accent-color);outline-offset:2px}ul{margin:0;padding:0;list-style:none}.none{display:none}.stalux-root{color:#fff;min-height:100vh}.stalux-main{min-height:calc(100vh - var(--stalux-site-header-height,3rem))}:root{--stalux-bg-color:#202020;--stalux-bg-filter:none;--stalux-site-header-min-height:3.75rem;--stalux-site-header-height:var(--stalux-site-header-min-height);--stalux-text-shadow:var(--stalux-accent-color) .08rem .08rem .18rem;--stalux-accent-color:#eab308;--stalux-accent-rgb:234 179 8;--surface-glass:var(--black-05p);--surface-glass-shadow:var(--shadow-sidebar);--card-bg:var(--surface-glass);--card-border:#ffffff1a;--card-box-shadow:0 10px 24px #00000014;--card-box-shadow-hover:0 14px 28px #0000001f;--tag-bg:#ffffff1f;--tag-bg-hover:#ffffff2e;--category-bg:#ffffff14;--category-bg-hover:#ffffff24;--date-bg:#42a0ff2e;--date-border:#42a0ff40;--updated-bg:#ffc94733;--updated-border:#ffc9474d;--white-full:#fff;--white-95p:#fffffff2;--white-90p:#ffffffe6;--white-85p:#ffffffd9;--white-80p:#ffffffe6;--white-78p:#ffffffc7;--white-75p:#ffffffbf;--white-70p:#ffffffdb;--white-60p:#fff9;--white-50p:#ffffff80;--white-30p:#ffffff4d;--white-20p:#fff3;--white-15p:#ffffff26;--white-10p:#ffffff1a;--white-05p:#ffffff0d;--black-30p:#0000004d;--black-20p:#0003;--black-15p:#00000026;--black-10p:#0000001a;--black-05p:#0000000d;--accent-90p:rgb(var(--stalux-accent-rgb) / .9);--accent-85p:rgb(var(--stalux-accent-rgb) / .85);--accent-80p:rgb(var(--stalux-accent-rgb) / .8);--accent-70p:rgb(var(--stalux-accent-rgb) / .7);--accent-60p:rgb(var(--stalux-accent-rgb) / .6);--accent-50p:rgb(var(--stalux-accent-rgb) / .5);--accent-40p:rgb(var(--stalux-accent-rgb) / .4);--accent-30p:rgb(var(--stalux-accent-rgb) / .3);--accent-20p:rgb(var(--stalux-accent-rgb) / .2);--transition-fast:.18s ease;--transition-medium:.2s ease;--transition-normal:.25s ease;--transition-slow:.3s ease;--transition-slower:.5s ease;--transition-slowest:.6s ease;--easing-bounce:cubic-bezier(.175, .885, .32, 1.275);--space-2xs:.25rem;--space-xs:.75rem;--space-sm:.5rem;--space-md:1rem;--space-lg:1.5rem;--space-xl:2rem;--space-2xl:3rem;--space-3xl:4rem;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-full:9999px;--shadow-sm:0 2px 5px #0000001a;--shadow-md:0 6px 16px #0003;--shadow-lg:0 8px 20px #0000004d;--shadow-xl:0 12px 26px #00000047;--shadow-sidebar:0 16px 20px -12px #000000d6, 10px 4px 16px -12px #00000094, -10px 4px 16px -12px #00000094;--shadow-raised-hover:0 20px 24px -13px #000000e6, 12px 5px 18px -13px #000000ad, -12px 5px 18px -13px #000000ad;--shadow-dark:#000000c0;--muted-text:#bbb;--font-body:"Noto Sans SC", "Noto Sans CJK SC", system-ui, sans-serif;--font-size-subtitle:1.35rem;--font-size-base:1.1rem;--font-size-small:.95rem;--font-size-smaller:.9rem;--font-size-tiny:.85rem;--border-thin:1px;--border-medium:2px;--border-thick:3px}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#2a2a2a;border-radius:4px}::-webkit-scrollbar-thumb{background:#4a4a4a;border-radius:4px;transition:background .3s ease-out}@media (hover:hover) and (pointer:fine){::-webkit-scrollbar-thumb:hover{background:#5a5a5a}}::-webkit-scrollbar-corner{background:#2a2a2a}.bg-layer{z-index:-10;background-position:50%;background-repeat:repeat;background-size:auto;background-color:var(--stalux-bg-color,transparent);filter:var(--stalux-bg-filter,none);pointer-events:none;opacity:0;forced-color-adjust:none;color-scheme:light only;transition:opacity .65s ease-in-out;position:fixed;inset:0}@media (prefers-reduced-motion:reduce){.bg-layer{transition-duration:0s}}footer{padding:var(--space-lg) var(--space-md);text-align:center;color:var(--muted-text);border-top:1px solid var(--white-10p);backdrop-filter:blur(16px);background:linear-gradient(#0c0e122e,#0c0e12b8)}}@media print{[data-stalux-offscreen-code],[data-stalux-offscreen-svg]{content-visibility:visible!important;contain-intrinsic-block-size:none!important}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.stagger-children>:first-child{animation-delay:.1s}.stagger-children>:nth-child(2){animation-delay:.15s}.stagger-children>:nth-child(3){animation-delay:.2s}.stagger-children>:nth-child(4){animation-delay:.25s}.stagger-children>:nth-child(5){animation-delay:.3s}.stagger-children>:nth-child(n+6){animation-delay:.35s}html,[data-astro-transition-persist],.stalux-main,.stalux-main *,.bg-layer,.bg-layer *,[data-stalux-scroll-sentinel],[data-stalux-back-to-top]{view-transition-name:none!important}html[data-stalux-vt-preset] .stalux-main [data-stalux-motion-focus][data-stalux-motion-visible=true]{view-transition-name:stalux-focus!important}html[data-stalux-vt-preset=none] .stalux-main [data-stalux-motion-focus][data-stalux-motion-visible=true]{view-transition-name:none!important}::view-transition-group(stalux-focus){animation:none}::view-transition-image-pair(stalux-focus){isolation:auto}::view-transition-old(stalux-focus){animation:none;display:none}::view-transition-new(stalux-focus){mix-blend-mode:normal;animation:.12s cubic-bezier(.2,.7,.2,1) both stalux-focus-fade}html[data-stalux-vt-preset=enter]::view-transition-new(stalux-focus){animation:.16s cubic-bezier(.2,.7,.2,1) both stalux-focus-enter}html[data-stalux-vt-preset=up]::view-transition-new(stalux-focus){animation:.14s cubic-bezier(.2,.7,.2,1) both stalux-focus-up}html[data-stalux-vt-preset=taxonomy]::view-transition-new(stalux-focus){animation:.14s cubic-bezier(.2,.7,.2,1) both stalux-focus-fade}html[data-stalux-vt-preset=previous]::view-transition-new(stalux-focus){animation:.16s cubic-bezier(.2,.7,.2,1) both stalux-focus-previous}html[data-stalux-vt-preset=next]::view-transition-new(stalux-focus){animation:.16s cubic-bezier(.2,.7,.2,1) both stalux-focus-next}html[data-stalux-vt-preset=home]::view-transition-new(stalux-focus){animation:.18s cubic-bezier(.2,.7,.2,1) both stalux-focus-home}html[data-stalux-vt-preset=restore]::view-transition-new(stalux-focus){animation:.1s cubic-bezier(.2,.7,.2,1) both stalux-focus-restore}html[data-stalux-vt-preset=error]::view-transition-new(stalux-focus){animation:.1s cubic-bezier(.2,.7,.2,1) both stalux-focus-fade}@keyframes stalux-focus-fade{0%{opacity:.86}to{opacity:1}}@keyframes stalux-focus-enter{0%{opacity:.86;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-focus-up{0%{opacity:.9;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-focus-previous{0%{opacity:.9;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-focus-next{0%{opacity:.9;transform:translate(8px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-focus-home{0%{opacity:.9;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-focus-restore{0%{opacity:.96}to{opacity:1}}@keyframes stalux-page-exit{0%{opacity:1}to{opacity:1}}@keyframes stalux-page-enter{0%{opacity:.9}to{opacity:1}}@keyframes stalux-page-enter-back{0%{opacity:.96}to{opacity:1}}@keyframes stalux-taxonomy-enter{0%{opacity:.9}to{opacity:1}}@keyframes stalux-taxonomy-enter-back{0%{opacity:.96}to{opacity:1}}@keyframes stalux-article-enter{0%{opacity:.9}to{opacity:1}}@keyframes stalux-article-enter-back{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-left-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-left-out{0%{opacity:1}to{opacity:1}}@keyframes stalux-sidebar-left-back-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-left-back-out{0%{opacity:1}to{opacity:1}}@keyframes stalux-sidebar-right-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-right-out{0%{opacity:1}to{opacity:1}}@keyframes stalux-sidebar-right-back-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-right-back-out{0%{opacity:1}to{opacity:1}}[data-stalux-scroll-sentinel]{visibility:hidden;pointer-events:none;width:1px;height:1px;position:absolute;top:240px;left:0}@media (width<=768px){html[data-stalux-vt-preset]::view-transition-new(stalux-focus){animation:.12s cubic-bezier(.2,.7,.2,1) both stalux-focus-fade}html[data-stalux-vt-preset=restore]::view-transition-new(stalux-focus){animation:.1s cubic-bezier(.2,.7,.2,1) both stalux-focus-restore}}@media (prefers-reduced-motion:reduce){html[data-stalux-vt-preset] .stalux-main [data-stalux-motion-focus][data-stalux-motion-visible=true]{view-transition-name:none!important}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){filter:none!important;animation:none!important;transform:none!important}.stalux-main,.stalux-main *,.postLayout *{scroll-behavior:auto!important;transition-duration:1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important}}
2
+ @layer components{.stalux-404-home-btn{background:var(--black-20p);border:var(--border-thin) solid var(--white-20p);transition:background-color var(--transition-normal), transform var(--transition-normal), box-shadow var(--transition-normal);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);color:var(--white-90p);font-size:var(--font-size-base);text-decoration:none;display:inline-block}.stalux-ai-prompt{clip-path:inset(50%);white-space:pre-wrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stalux-badge-group{border:none}.stalux-badge-group-arrow{font-size:.65rem;transition:transform .2s;display:inline-block}.stalux-badge-group-summary{user-select:none;cursor:pointer;color:var(--white-70p);gap:.4rem;padding:.2rem 0;font-size:.85rem;list-style-type:none;transition:color .2s}.stalux-beian-public-security-beian{color:#ffffffb3;gap:5px;font-size:.9rem;text-decoration:none;transition:color .3s;display:inline-flex}.stalux-card-post-categories,.stalux-card-post-tags{gap:.4rem}.stalux-card-post-category{background:var(--category-bg);color:#fff;border-radius:6px;padding:.18rem .5rem;font-size:.84rem;line-height:1;display:inline-block}.stalux-card-post-description{overflow-wrap:anywhere;color:var(--white-70p);line-height:1.6}.stalux-card-post-meta{gap:.6rem}.stalux-card-post-tag{background:var(--tag-bg);color:#fff;border-radius:9999px;padding:.22rem .7rem;font-size:.85rem;line-height:1;display:inline-block}.stalux-card-post-title{overflow-wrap:anywhere;margin:0;line-height:1.35}.stalux-card-read-more{align-self:flex-start;margin-top:.6rem}.stalux-card-time{gap:.45rem;display:inline-flex}.stalux-copyright{color:var(--white-70p);gap:.3em;font-weight:500}.stalux-footer{backdrop-filter:blur(10px);color:var(--white-full);background-color:#0000001a;margin-top:auto;padding:1.5rem 0;font-size:.9rem}.stalux-footer-content{gap:.8rem;max-width:1200px;margin:0 auto;padding:0 1rem}.stalux-nav-list{transform:scale(var(--nav-scale,1));transform-origin:50%;box-sizing:border-box;gap:2rem;max-width:100%;transition:transform .22s cubic-bezier(.22,.72,.22,1);overflow:visible}.stalux-nav-overlay{pointer-events:none;z-index:999;opacity:0;background:#0009;height:100%;transition:opacity .3s;display:none;position:fixed;top:0;left:0}.stalux-nav-scroll-btn{background:var(--black-30p);backdrop-filter:blur(8px);box-shadow:var(--shadow-md);pointer-events:none;z-index:10;cursor:pointer;width:36px;height:36px;color:var(--white-full);opacity:0;border:none;border-radius:9999px;padding:0;transition:opacity .25s;display:none;position:absolute;top:50%;transform:translateY(-50%)}.stalux-nav-toggle{z-index:998;cursor:pointer;min-width:48px;min-height:48px;color:inherit;background:0 0;border:none;padding:.75rem;display:none}.stalux-post-card{box-sizing:border-box;cursor:pointer;gap:var(--space-lg);border-radius:var(--radius-lg);background-color:var(--card-bg);height:100%;padding:var(--space-lg);box-shadow:var(--card-box-shadow);transition:transform .22s cubic-bezier(.22,.72,.22,1)}.stalux-stats-site-build-time{color:#fffc;margin-top:.5rem;font-size:.9rem}.stalux-stats-stats-separator{color:#ffffff80}.stalux-theme-info{color:var(--white-70p);gap:.3em;font-size:.85rem}.stalux-home-body{min-height:calc(100vh - var(--stalux-site-header-height));padding-bottom:var(--space-3xl);position:relative}.stalux-nav-container{box-sizing:border-box;max-width:100%;position:relative;overflow:hidden}.stalux-author{margin-top:4em}.stalux-card-post-cover{border-radius:var(--radius-md);flex-shrink:0;height:180px;margin-bottom:.5rem;overflow:hidden}.stalux-home-title{color:var(--white-full);text-shadow:var(--stalux-text-shadow);margin-top:1.5em;font-size:4em}.stalux-nav-item{text-shadow:var(--stalux-text-shadow);flex-shrink:0;margin-left:1em;margin-right:1em;font-size:1.3em}.stalux-page-description{color:var(--white-60p);margin-bottom:1.5em;font-size:1.2em}.stalux-page-title{text-shadow:var(--stalux-text-shadow);margin-top:1.5em;font-size:2.5em}.stalux-typewriter{min-height:2em;text-shadow:var(--stalux-text-shadow);margin-top:1.5em;font-size:2.5em}.stalux-404-error-container{min-height:60vh;padding:2rem}.stalux-badge,.stalux-badges-wrapper .stalux-badge{width:auto}.stalux-u-min-w-0{min-width:0}.stalux-u-w-full{width:100%}.stalux-u-flex{display:flex}.stalux-u-flex-col{flex-direction:column}.stalux-u-flex-wrap{flex-wrap:wrap}.stalux-u-items-center{align-items:center}.stalux-u-justify-center{justify-content:center}.stalux-badges,.stalux-badges-wrapper{gap:.5rem}.stalux-beian-beian-info{gap:1rem}.stalux-stats-site-stats{gap:.5rem;font-size:.9rem}.stalux-nav-text{white-space:nowrap;color:var(--white-full)}.stalux-badge-group-items{padding-top:.35rem}.stalux-u-text-center{text-align:center}.stalux-badge-group-hint{color:var(--white-70p);font-size:.7rem}.stalux-badge-group-title{color:var(--white-80p)}#stalux-home-show-post-list{cursor:pointer;text-shadow:var(--stalux-text-shadow);margin-top:3em;font-size:1.5em}.stalux-post-list-container{width:100%;height:auto;margin:5px 0}.stalux-post-list-container ul{flex-wrap:wrap;gap:2rem;margin:3em;padding:0;list-style-type:none;display:flex}.stalux-post-list-container ul>li{flex:min(22rem,100%);min-width:0;margin:0}.stalux-card-post-title a{color:inherit;text-decoration:none}.stalux-post-card>a:first-child{width:100%;min-width:0;display:block}.stalux-card-post-cover img{object-fit:cover;width:100%;max-width:100%;height:100%;transition:transform var(--transition-fast)}.stalux-card-post-date,.stalux-card-post-updated{color:#e8f2ff;border-radius:10px;align-items:center;gap:.35rem;width:fit-content;padding:.28rem .6rem;font-size:.9rem;line-height:1.1;display:inline-flex}.stalux-card-post-date{background:var(--date-bg);border:1px solid var(--date-border);color:#e8f2ff}.stalux-card-post-updated{background:var(--updated-bg);border:1px solid var(--updated-border);color:#fff7de}.stalux-card-post-tags a,.stalux-card-post-categories a{text-decoration:none}.stalux-card-post-tags a:focus-visible .stalux-card-post-tag{background:var(--tag-bg-hover)}.stalux-card-post-categories a:focus-visible .stalux-card-post-category{background:var(--category-bg-hover)}.stalux-social{margin-top:3em}.stalux-social ul{flex-wrap:wrap;justify-content:center;gap:1em;margin:0;padding:0;display:flex}.stalux-social ul li{box-sizing:border-box;text-align:center;background-color:var(--white-15p);border-radius:9999px;justify-content:center;align-items:center;width:2.5em;height:2.5em;font-size:large;display:inline-flex;overflow:hidden}.stalux-social ul a,.stalux-social ul .stalux-social-icon-container,.stalux-social ul .stalux-social-custom-icon{justify-content:center;align-items:center;width:100%;height:100%;line-height:1;display:inline-flex}.stalux-social[data-stalux-social-animate=true] li{animation:.28s cubic-bezier(.2,.8,.2,1) both stalux-social-stalux-social-arrive}.stalux-social[data-stalux-social-animate=true] li:nth-child(2){animation-delay:30ms}.stalux-social[data-stalux-social-animate=true] li:nth-child(3){animation-delay:60ms}.stalux-social[data-stalux-social-animate=true] li:nth-child(4){animation-delay:90ms}.stalux-social[data-stalux-social-animate=true] li:nth-child(5){animation-delay:.12s}.stalux-social[data-stalux-social-animate=true] li:nth-child(6){animation-delay:.15s}.stalux-social[data-stalux-social-animate=true] li:nth-child(n+7){animation-delay:.18s}nav{width:100%;min-width:0;max-width:100%}html{scroll-padding-top:var(--stalux-nav-offset,var(--stalux-site-header-height))}.stalux-site-header{z-index:990;width:100%;min-height:var(--stalux-site-header-min-height);isolation:isolate;justify-content:center;align-items:center;display:flex;position:sticky;top:0}.stalux-nav-scroll-btn[data-visible]{pointer-events:auto;opacity:1}.stalux-nav-scroll-btn[data-side=left]{left:4px}.stalux-nav-scroll-btn[data-side=right]{right:4px}.stalux-nav-scroll-btn svg{stroke:currentColor;stroke-width:2px;fill:none;width:20px;height:20px}.stalux-nav-link,.stalux-nav-link:visited{cursor:pointer;width:100%;color:inherit;min-height:44px;font:inherit;background:0 0;border:none;align-items:center;gap:.5rem;padding:.5rem .75rem;text-decoration:none;display:flex}.stalux-nav-link .nav-icon{stroke:var(--white-full)}.stalux-nav-toggle svg{width:32px;height:32px}.stalux-nav-overlay[data-state=show]{pointer-events:auto;opacity:1;display:block}#stalux-to-archive-archs{margin-top:2em}#stalux-date-date-time{text-shadow:var(--stalux-text-shadow);color:var(--white-full);flex-direction:column;align-items:center;margin-top:2em;display:flex}#stalux-date-date-time #stalux-date-date{min-height:1.25em;margin-bottom:.5em;font-size:2em;line-height:1.25}#stalux-date-date-time #stalux-date-time{font-variant-numeric:tabular-nums;min-height:1.25em;font-size:3em;line-height:1.25}.stalux-author-figure{justify-content:center;align-items:center;display:flex}.stalux-author-figure img{box-shadow:0 0 10px var(--stalux-accent-color);border-radius:9999px;transition:transform .65s ease-in-out}.stalux-author-figure figcaption{text-shadow:var(--stalux-text-shadow);color:var(--white-full);margin-left:1em;font-size:2.5em;font-weight:700}.stalux-author-figure-column figcaption{text-align:center;margin-top:.5em;margin-left:0}.agent-home-summary{clip-path:inset(50%);white-space:normal;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stalux-404-error-content h1{color:var(--white-90p);margin:0;font-size:6rem;font-weight:700}.stalux-404-error-content p{color:var(--white-70p);margin:1rem 0 2rem;font-size:1.5rem}.stalux-404-countdown-text{color:var(--white-50p)!important;margin:-.5rem 0 1.5rem!important;font-size:.95rem!important}.agent-recovery{max-width:42rem;line-height:1.7;margin:0 auto 1.5rem!important;font-size:1rem!important}.agent-recovery a{color:inherit;text-decoration-line:underline}.stalux-theme-info span,.stalux-copyright span{margin:0}.stalux-theme-info a{color:#fffc;margin:0 .2em;text-decoration:none;transition:color .3s}.stalux-beian-beian-info a{color:#ffffffb3;font-size:.9rem;text-decoration:none;transition:color .3s}.stalux-beian-public-security-beian img{width:15px;height:15px;display:inline-block}.stalux-badge-group-summary::-webkit-details-marker,.stalux-badge-group[open] .stalux-badge-group-hint[data-hint=collapsed],.stalux-badge-group:not([open]) .stalux-badge-group-hint[data-hint=expanded]{display:none}.stalux-badge-group[open] .stalux-badge-group-arrow{transform:rotate(90deg)}@media (hover:hover) and (pointer:fine){.stalux-card-post-tags a:hover .stalux-card-post-tag{background:var(--tag-bg-hover)}.stalux-card-post-categories a:hover .stalux-card-post-category{background:var(--category-bg-hover)}.stalux-post-card-shell:hover .stalux-post-card .stalux-card-post-cover img{transform:scale(1.025)}.stalux-post-card-shell:hover .stalux-post-card{box-shadow:var(--card-box-shadow-hover)}.stalux-nav-scroll-btn:hover{background:0 0}.stalux-nav-container:hover .stalux-nav-scroll-btn[data-visible]{opacity:1}.stalux-nav-link:hover .nav-icon,.stalux-nav-link:hover .stalux-nav-text{stroke:var(--stalux-accent-color);color:var(--stalux-accent-color)}.stalux-author-figure>a:hover img{animation:.65s ease-in-out stalux-link-avatar-spin}.stalux-404-home-btn:hover{background:var(--accent-20p);box-shadow:0 4px 12px var(--shadow-dark)}.stalux-theme-info a:hover{color:#fff;text-decoration:none}.stalux-beian-beian-info a:hover,.stalux-beian-public-security-beian:hover{color:#ffffffe6;text-decoration:none}.stalux-badge-group-summary:hover{color:var(--white-70p)}}@media (width>=601px){.stalux-site-nav{isolation:isolate;border-radius:0 0 16px 16px;transition:background-color .18s,box-shadow .18s}.stalux-site-nav[data-scrolled]{backdrop-filter:blur(20px)saturate(140%);box-shadow:0 1px 0 var(--white-10p), 0 8px 24px #0000001f;background:#181818c7}}@media (width<=1100px){.stalux-nav-list{gap:1rem}.stalux-nav-item{margin-left:.6em;margin-right:.6em;font-size:1em}}@media (width<=900px){.stalux-nav-item{margin-left:.25em;margin-right:.25em;font-size:.95em}.stalux-nav-list{gap:.5rem}}@media (width<=768px){.stalux-home-body{box-sizing:border-box;width:100%;max-width:95vw;height:auto;padding:2rem .5rem 1.5rem}.stalux-home-title{word-break:break-all;margin-top:1em;font-size:2em}#stalux-home-show-post-list{margin-top:2em;font-size:1.1em}.stalux-post-list-container ul{margin:1rem}.stalux-footer{padding:1.2rem 0;font-size:.8rem}.stalux-footer-content{gap:.6rem;padding:0 .8rem}.stalux-author{box-sizing:border-box;width:100%;max-width:95vw;margin-top:2em;padding:1em .5em}.stalux-author-figure{gap:.5em;flex-direction:column!important}.stalux-author-figure img{max-width:20vw;max-height:20vw;width:64px!important;height:64px!important}.stalux-author-figure figcaption{text-align:center;word-break:break-all;overflow-wrap:break-word;white-space:normal;max-width:90vw;margin-top:.5em;margin-left:0;font-size:1.5em}.stalux-404-error-content h1{font-size:4rem}.stalux-404-error-content p{font-size:1.2rem}.stalux-badges{gap:.3rem}.stalux-badge{width:auto}}@media (width<=600px){html{--stalux-site-header-min-height:4rem}.stalux-nav-toggle[data-state=open]{visibility:hidden;pointer-events:none}.stalux-nav-toggle[data-scrolled]{backdrop-filter:blur(20px)saturate(140%);box-shadow:0 1px 0 var(--white-10p), 0 8px 24px #0000001f;background:#181818c7;border-radius:12px}.stalux-nav-toggle{display:block;position:fixed;top:.75rem;left:.75rem}.stalux-nav-container{overflow:visible}nav{width:auto}.stalux-nav-list{pointer-events:none;z-index:1000;background:var(--black-20p);backdrop-filter:blur(20px);flex-direction:column;justify-content:flex-start;align-items:flex-start;gap:0;width:min(220px,100vw - 1rem);height:100vh;padding:.5rem 1rem 2rem;position:fixed;top:0;left:0;right:auto;overflow-y:auto;transform:translate(-100%)}.stalux-nav-list[data-state=open]{pointer-events:auto;transform:translate(0)}.stalux-nav-item{border-bottom:1px solid var(--white-10p);flex-shrink:0;width:100%;margin:0;font-size:.9em}.stalux-nav-text{display:inline}.stalux-nav-link{width:100%;min-height:44px;font-size:inherit;padding:.45rem .75rem}.stalux-nav-link .nav-icon{width:18px;height:18px}}@media (width<=480px){.stalux-footer{padding:1rem 0;font-size:.8rem}.stalux-footer-content{gap:.6rem;padding:0 .8rem}}@media (prefers-reduced-motion:reduce){.stalux-social[data-stalux-social-animate=true] li{animation:none}}.stalux-main,.stalux-post-page,.stalux-post-layout>*,.stalux-link-card-content,.stalux-word-list-item,.stalux-word-card{box-sizing:border-box;min-width:0;max-width:100%}.stalux-main{overflow-wrap:anywhere}.stalux-link-shell{min-width:0;max-width:100%;display:block}.stalux-link-card{box-sizing:border-box;width:100%;max-width:100%}.stalux-category-shell{width:100%;min-width:0}.stalux-author-figure>a{flex-shrink:0;display:inline-block}.stalux-author-figure img{display:block}.stalux-post-card-shell,.stalux-category-shell,.stalux-link-shell{position:relative}.stalux-post-card,.stalux-category-card,.stalux-link-card,.stalux-word-card{transition:transform .2s,background-color .2s,border-color .2s,box-shadow .2s}:is(.stalux-post-card-shell,.stalux-category-shell):focus-within>*,.stalux-link-shell:focus-visible>*{box-shadow:var(--card-box-shadow-hover)}:is(button,summary,[role=button]):focus-visible{outline:2px solid var(--stalux-accent-color);outline-offset:3px}@media (prefers-reduced-motion:reduce){.stalux-main *,.stalux-main :before,.stalux-main :after{transition-duration:0s!important;animation:none!important}.stalux-post-card,.stalux-category-card,.stalux-link-card,.stalux-link-card-content,.stalux-card-post-cover img,.stalux-category-icon,.stalux-author-figure img,.stalux-link-card-avatar img{transform:none!important}}@keyframes stalux-social-stalux-social-arrive{0%{opacity:0;transform:translateY(.75rem)rotate(-12deg)}to{opacity:1;transform:translateY(0)rotate(0)}}@keyframes stalux-random-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes stalux-link-avatar-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes stalux-word-word-glow{0%{box-shadow:0 0 30px var(--accent-50p), 0 0 80px var(--accent-30p), var(--shadow-lg);transform:scale(1.02)}to{box-shadow:0 0 20px var(--accent-40p), 0 0 60px var(--accent-20p), var(--shadow-lg);transform:scale(1)}}}@layer utilities{.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visible{visibility:visible}.absolute{position:absolute}.static{position:static}.grid{display:grid}.block{display:block}.inline-block{display:inline-block}.hidden{display:none}.h-full{height:100%}.flex{display:flex}.flex-shrink{flex-shrink:1}.flex-wrap{flex-wrap:wrap}.transform{transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotateZ(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.b,.border{border-width:1px}.text-inherit{color:inherit}.no-underline{text-decoration:none}.outline{outline-style:solid}}@layer theme;@layer base{html,body{color:#fff;width:100%;height:100%;margin:0;& main{flex:1}scrollbar-color:#4a4a4a #2a2a2a;font-family:var(--font-body), "Noto Sans SC", "Noto Sans CJK SC", system-ui, -apple-system, sans-serif;text-rendering:optimizelegibility;line-height:1.25;display:block}body{height:auto;min-height:100%}html{scrollbar-gutter:stable;background-color:var(--stalux-bg-color,#202020)}html[data-clarity-id]{opacity:1!important}a{color:inherit;cursor:pointer;text-decoration-skip-ink:auto;background-color:#0000;text-decoration:none;transition:color .2s,text-shadow .2s;position:relative}.a-none{cursor:pointer;text-decoration-skip-ink:auto;background-color:#0000;color:inherit!important;text-decoration:none!important}.a-none:after{display:none!important}a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):after{content:"";background:linear-gradient(90deg, var(--stalux-accent-color), var(--accent-50p));transform-origin:0;pointer-events:none;width:100%;height:1px;transition:transform .25s cubic-bezier(.25,.9,.2,1);position:absolute;bottom:-2px;left:0;transform:scaleX(0)}a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):focus-visible:after,a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):active:after{transform:scaleX(1)}@media (hover:hover) and (pointer:fine){a:not(.a-none):not([data-stalux-card]):not(.stalux-nav-link):hover:after{transform:scaleX(1)}}a:active,a:focus-visible{text-decoration:none}@media (hover:hover) and (pointer:fine){a:hover{text-decoration:none}}a:focus{outline:none}a:focus-visible{outline:2px solid var(--stalux-accent-color);outline-offset:2px}ul{margin:0;padding:0;list-style:none}.none{display:none}.stalux-root{color:#fff;min-height:100vh}.stalux-main{min-height:calc(100vh - var(--stalux-site-header-height,3rem))}:root{--stalux-bg-color:#202020;--stalux-bg-filter:none;--stalux-site-header-min-height:3.75rem;--stalux-site-header-height:var(--stalux-site-header-min-height);--stalux-text-shadow:var(--stalux-accent-color) .08rem .08rem .18rem;--stalux-accent-color:#eab308;--stalux-accent-rgb:234 179 8;--surface-glass:var(--black-05p);--surface-glass-shadow:var(--shadow-sidebar);--card-bg:var(--surface-glass);--card-border:#ffffff1a;--card-box-shadow:0 10px 24px #00000014;--card-box-shadow-hover:0 14px 28px #0000001f;--tag-bg:#ffffff1f;--tag-bg-hover:#ffffff2e;--category-bg:#ffffff14;--category-bg-hover:#ffffff24;--date-bg:#42a0ff2e;--date-border:#42a0ff40;--updated-bg:#ffc94733;--updated-border:#ffc9474d;--white-full:#fff;--white-95p:#fffffff2;--white-90p:#ffffffe6;--white-85p:#ffffffd9;--white-80p:#ffffffe6;--white-78p:#ffffffc7;--white-75p:#ffffffbf;--white-70p:#ffffffdb;--white-60p:#fff9;--white-50p:#ffffff80;--white-30p:#ffffff4d;--white-20p:#fff3;--white-15p:#ffffff26;--white-10p:#ffffff1a;--white-05p:#ffffff0d;--black-30p:#0000004d;--black-20p:#0003;--black-15p:#00000026;--black-10p:#0000001a;--black-05p:#0000000d;--accent-90p:rgb(var(--stalux-accent-rgb) / .9);--accent-85p:rgb(var(--stalux-accent-rgb) / .85);--accent-80p:rgb(var(--stalux-accent-rgb) / .8);--accent-70p:rgb(var(--stalux-accent-rgb) / .7);--accent-60p:rgb(var(--stalux-accent-rgb) / .6);--accent-50p:rgb(var(--stalux-accent-rgb) / .5);--accent-40p:rgb(var(--stalux-accent-rgb) / .4);--accent-30p:rgb(var(--stalux-accent-rgb) / .3);--accent-20p:rgb(var(--stalux-accent-rgb) / .2);--transition-fast:.18s ease;--transition-medium:.2s ease;--transition-normal:.25s ease;--transition-slow:.3s ease;--transition-slower:.5s ease;--transition-slowest:.6s ease;--easing-bounce:cubic-bezier(.175, .885, .32, 1.275);--space-2xs:.25rem;--space-xs:.75rem;--space-sm:.5rem;--space-md:1rem;--space-lg:1.5rem;--space-xl:2rem;--space-2xl:3rem;--space-3xl:4rem;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-full:9999px;--shadow-sm:0 2px 5px #0000001a;--shadow-md:0 6px 16px #0003;--shadow-lg:0 8px 20px #0000004d;--shadow-xl:0 12px 26px #00000047;--shadow-sidebar:0 16px 20px -12px #000000d6, 10px 4px 16px -12px #00000094, -10px 4px 16px -12px #00000094;--shadow-raised-hover:0 20px 24px -13px #000000e6, 12px 5px 18px -13px #000000ad, -12px 5px 18px -13px #000000ad;--shadow-dark:#000000c0;--muted-text:#bbb;--font-body:"Noto Sans SC", "Noto Sans CJK SC", system-ui, sans-serif;--font-size-subtitle:1.35rem;--font-size-base:1.1rem;--font-size-small:.95rem;--font-size-smaller:.9rem;--font-size-tiny:.85rem;--border-thin:1px;--border-medium:2px;--border-thick:3px}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#2a2a2a;border-radius:4px}::-webkit-scrollbar-thumb{background:#4a4a4a;border-radius:4px;transition:background .3s ease-out}@media (hover:hover) and (pointer:fine){::-webkit-scrollbar-thumb:hover{background:#5a5a5a}}::-webkit-scrollbar-corner{background:#2a2a2a}.bg-layer{z-index:-10;background-position:50%;background-repeat:repeat;background-size:auto;background-color:var(--stalux-bg-color,transparent);filter:var(--stalux-bg-filter,none);pointer-events:none;opacity:0;forced-color-adjust:none;color-scheme:light only;transition:opacity .65s ease-in-out;position:fixed;inset:0}@media (prefers-reduced-motion:reduce){.bg-layer{transition-duration:0s}}footer{padding:var(--space-lg) var(--space-md);text-align:center;color:var(--muted-text);border-top:1px solid var(--white-10p);backdrop-filter:blur(16px);background:linear-gradient(#0c0e122e,#0c0e12b8)}}@media print{[data-stalux-offscreen-code],[data-stalux-offscreen-svg]{content-visibility:visible!important;contain-intrinsic-block-size:none!important}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.stagger-children>:first-child{animation-delay:.1s}.stagger-children>:nth-child(2){animation-delay:.15s}.stagger-children>:nth-child(3){animation-delay:.2s}.stagger-children>:nth-child(4){animation-delay:.25s}.stagger-children>:nth-child(5){animation-delay:.3s}.stagger-children>:nth-child(n+6){animation-delay:.35s}html,[data-astro-transition-persist],.stalux-main,.stalux-main *,.bg-layer,.bg-layer *,[data-stalux-scroll-sentinel],[data-stalux-back-to-top]{view-transition-name:none!important}html[data-stalux-vt-preset]{--stalux-vt-duration:.16s;--stalux-vt-distance:clamp(28px, 4vw, 40px);--stalux-vt-tilt:8deg;--stalux-vt-x:var(--stalux-vt-distance);--stalux-vt-y:0px;--stalux-vt-rx:0deg;--stalux-vt-ry:0deg;--stalux-vt-rz:-.35deg;--stalux-vt-scale:1}html[data-stalux-vt-preset]:not([data-stalux-vt-preset=none]) [data-stalux-motion-focus]{view-transition-name:stalux-focus!important}::view-transition{pointer-events:none}::view-transition-group(stalux-focus){animation:none!important}::view-transition-old(stalux-focus){display:none;animation:none!important}::view-transition-new(stalux-focus){mix-blend-mode:normal;transform-origin:50%;backface-visibility:hidden;animation:stalux-content-in var(--stalux-vt-duration,.16s) cubic-bezier(.22, .7, .2, 1) both paused}html[data-stalux-vt-phase=prepared] [data-stalux-motion-content],html[data-stalux-vt-phase=running] [data-stalux-motion-content]{transform-origin:50% min(42vh,400px);backface-visibility:hidden;animation:stalux-content-in var(--stalux-vt-duration,.16s) cubic-bezier(.22, .7, .2, 1) both paused}html[data-stalux-vt-phase=running] [data-stalux-motion-content],html[data-stalux-vt-phase=running]::view-transition-new(stalux-focus){animation-play-state:running}html[data-stalux-vt-phase] .stalux-article{overflow:clip}[data-stalux-home-content]{flex-direction:column;align-items:center;width:100%;display:flex}html[data-stalux-vt-preset=enter]{--stalux-vt-x:calc(var(--stalux-vt-distance) * 1.25);--stalux-vt-rz:0deg}html[data-stalux-vt-preset=article]{--stalux-vt-duration:.26s;--stalux-vt-distance:clamp(36px, 5vw, 56px);--stalux-vt-x:calc(var(--stalux-vt-distance) * 1.25);--stalux-vt-rz:0deg}html[data-stalux-vt-preset=next]{--stalux-vt-duration:.26s;--stalux-vt-distance:clamp(36px, 5vw, 56px);--stalux-vt-x:calc(var(--stalux-vt-distance) * 1.5);--stalux-vt-rz:0deg}html[data-stalux-vt-preset=previous]{--stalux-vt-duration:.26s;--stalux-vt-distance:clamp(36px, 5vw, 56px);--stalux-vt-x:calc(var(--stalux-vt-distance) * -1.5);--stalux-vt-rz:0deg}html[data-stalux-vt-preset=up]{--stalux-vt-duration:.14s;--stalux-vt-x:calc(var(--stalux-vt-distance) * -.75);--stalux-vt-y:-10px;--stalux-vt-rz:0deg}html[data-stalux-vt-preset=taxonomy]{--stalux-vt-duration:.14s;--stalux-vt-x:0px;--stalux-vt-y:18px;--stalux-vt-rx:calc(var(--stalux-vt-tilt) * -.5);--stalux-vt-rz:0deg}html[data-stalux-vt-preset=panel]{--stalux-vt-x:calc(var(--stalux-vt-distance) * .6);--stalux-vt-ry:calc(var(--stalux-vt-tilt) * -1);--stalux-vt-rz:0deg}html[data-stalux-vt-preset=panel][data-stalux-vt-to=links]{--stalux-vt-x:0px;--stalux-vt-y:12px;--stalux-vt-rx:calc(var(--stalux-vt-tilt) * .75);--stalux-vt-ry:0deg}html[data-stalux-vt-preset=panel][data-stalux-vt-to=words]{--stalux-vt-x:0px;--stalux-vt-y:16px;--stalux-vt-ry:0deg;--stalux-vt-rz:-1deg}html[data-stalux-vt-preset=home]{--stalux-vt-duration:.18s;--stalux-vt-x:0px;--stalux-vt-y:20px;--stalux-vt-rx:calc(var(--stalux-vt-tilt) * -.625);--stalux-vt-rz:0deg;--stalux-vt-scale:.985}html[data-stalux-vt-preset=restore]{--stalux-vt-duration:.1s;--stalux-vt-x:12px;--stalux-vt-rz:0deg}html[data-stalux-vt-preset=restore][data-stalux-vt-direction=back],html[data-stalux-vt-preset=restore][data-stalux-vt-direction=backward]{--stalux-vt-x:-12px}html[data-stalux-vt-preset=error]{--stalux-vt-duration:.12s;--stalux-vt-x:0px;--stalux-vt-y:12px;--stalux-vt-rz:-.7deg}@keyframes stalux-content-in{0%{opacity:.25;transform:perspective(1200px) translate3d(var(--stalux-vt-x), var(--stalux-vt-y), 0) rotateX(var(--stalux-vt-rx)) rotateY(var(--stalux-vt-ry)) rotateZ(var(--stalux-vt-rz)) scale(var(--stalux-vt-scale))}55%{opacity:1}to{opacity:1;transform:perspective(1200px)translate(0,0)rotateX(0)rotateY(0)rotate(0)scale(1)}}@keyframes stalux-page-exit{0%{opacity:1}to{opacity:1}}@keyframes stalux-page-enter{0%{opacity:.9}to{opacity:1}}@keyframes stalux-page-enter-back{0%{opacity:.96}to{opacity:1}}@keyframes stalux-taxonomy-enter{0%{opacity:.9}to{opacity:1}}@keyframes stalux-taxonomy-enter-back{0%{opacity:.96}to{opacity:1}}@keyframes stalux-article-enter{0%{opacity:.9}to{opacity:1}}@keyframes stalux-article-enter-back{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-left-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-left-out{0%{opacity:1}to{opacity:1}}@keyframes stalux-sidebar-left-back-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-left-back-out{0%{opacity:1}to{opacity:1}}@keyframes stalux-sidebar-right-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-right-out{0%{opacity:1}to{opacity:1}}@keyframes stalux-sidebar-right-back-in{0%{opacity:.96}to{opacity:1}}@keyframes stalux-sidebar-right-back-out{0%{opacity:1}to{opacity:1}}[data-stalux-scroll-sentinel]{visibility:hidden;pointer-events:none;width:1px;height:1px;position:absolute;top:240px;left:0}@media (width<=768px){html[data-stalux-vt-preset]:not([data-stalux-vt-preset=none]){--stalux-vt-distance:20px;--stalux-vt-tilt:4deg}html[data-stalux-vt-preset=restore]{--stalux-vt-x:8px}html[data-stalux-vt-preset=restore][data-stalux-vt-direction=back],html[data-stalux-vt-preset=restore][data-stalux-vt-direction=backward]{--stalux-vt-x:-8px}}@media (prefers-reduced-motion:reduce){html[data-stalux-vt-preset],html[data-stalux-vt-preset] [data-astro-transition-persist]{view-transition-name:none!important}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){filter:none!important;animation:none!important;transform:none!important}.stalux-main,.stalux-main *,.postLayout *{scroll-behavior:auto!important;transition-duration:1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important}}
3
3
  /*$vite$:1*/
@@ -28,9 +28,8 @@
28
28
  animation-delay: 0.35s;
29
29
  }
30
30
 
31
- /* Route motion captures one visible heading, never a long main/article.
32
- The router owns data-stalux-vt-preset and confirms visibility once per DOM.
33
- Keep literal keyframe references: production CSS removes unreferenced frames. */
31
+ /* Only a bounded heading is captured by native VT. Long article/list content
32
+ stays in the live DOM; sidebars, navigation, footer and backgrounds stay put. */
34
33
  html,
35
34
  [data-astro-transition-persist],
36
35
  .stalux-main,
@@ -42,143 +41,162 @@ html,
42
41
  view-transition-name: none !important;
43
42
  }
44
43
 
45
- html[data-stalux-vt-preset]
46
- .stalux-main
47
- [data-stalux-motion-focus][data-stalux-motion-visible="true"] {
48
- view-transition-name: stalux-focus !important;
44
+ html[data-stalux-vt-preset] {
45
+ --stalux-vt-duration: 160ms;
46
+ --stalux-vt-distance: clamp(28px, 4vw, 40px);
47
+ --stalux-vt-tilt: 8deg;
48
+ --stalux-vt-x: var(--stalux-vt-distance);
49
+ --stalux-vt-y: 0px;
50
+ --stalux-vt-rx: 0deg;
51
+ --stalux-vt-ry: 0deg;
52
+ --stalux-vt-rz: -0.35deg;
53
+ --stalux-vt-scale: 1;
49
54
  }
50
55
 
51
- html[data-stalux-vt-preset="none"]
52
- .stalux-main
53
- [data-stalux-motion-focus][data-stalux-motion-visible="true"] {
54
- view-transition-name: none !important;
56
+ html[data-stalux-vt-preset]:not([data-stalux-vt-preset="none"]) [data-stalux-motion-focus] {
57
+ view-transition-name: stalux-focus !important;
55
58
  }
56
59
 
57
- /* Different headings must not interpolate width, height, position or text size.
58
- Old content stays readable until swap; only the small new heading animates. */
59
- ::view-transition-group(stalux-focus) {
60
- animation: none;
60
+ ::view-transition {
61
+ pointer-events: none;
61
62
  }
62
-
63
- ::view-transition-image-pair(stalux-focus) {
64
- isolation: auto;
63
+ ::view-transition-group(stalux-focus) {
64
+ animation: none !important;
65
65
  }
66
-
67
66
  ::view-transition-old(stalux-focus) {
68
67
  display: none;
69
- animation: none;
68
+ animation: none !important;
70
69
  }
71
-
72
70
  ::view-transition-new(stalux-focus) {
73
71
  mix-blend-mode: normal;
74
- animation: stalux-focus-fade 120ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
75
- }
76
-
77
- html[data-stalux-vt-preset="enter"]::view-transition-new(stalux-focus) {
78
- animation: stalux-focus-enter 160ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
79
- }
80
-
81
- html[data-stalux-vt-preset="up"]::view-transition-new(stalux-focus) {
82
- animation: stalux-focus-up 140ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
83
- }
84
-
85
- html[data-stalux-vt-preset="taxonomy"]::view-transition-new(stalux-focus) {
86
- animation: stalux-focus-fade 140ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
87
- }
88
-
89
- html[data-stalux-vt-preset="previous"]::view-transition-new(stalux-focus) {
90
- animation: stalux-focus-previous 160ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
91
- }
92
-
93
- html[data-stalux-vt-preset="next"]::view-transition-new(stalux-focus) {
94
- animation: stalux-focus-next 160ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
95
- }
96
-
97
- html[data-stalux-vt-preset="home"]::view-transition-new(stalux-focus) {
98
- animation: stalux-focus-home 180ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
99
- }
100
-
101
- html[data-stalux-vt-preset="restore"]::view-transition-new(stalux-focus) {
102
- animation: stalux-focus-restore 100ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
103
- }
104
-
105
- html[data-stalux-vt-preset="error"]::view-transition-new(stalux-focus) {
106
- animation: stalux-focus-fade 100ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
107
- }
108
-
109
- @keyframes stalux-focus-fade {
110
- from {
111
- opacity: 0.86;
112
- }
113
- to {
114
- opacity: 1;
115
- }
116
- }
117
-
118
- @keyframes stalux-focus-enter {
119
- from {
120
- opacity: 0.86;
121
- transform: translateY(6px);
122
- }
123
- to {
124
- opacity: 1;
125
- transform: translateY(0);
126
- }
127
- }
128
-
129
- @keyframes stalux-focus-up {
72
+ transform-origin: 50% 50%;
73
+ backface-visibility: hidden;
74
+ animation: stalux-content-in var(--stalux-vt-duration, 160ms) cubic-bezier(0.22, 0.7, 0.2, 1)
75
+ both paused;
76
+ }
77
+
78
+ /* The incoming document starts paused, before it can be painted. Native ready
79
+ releases both the small heading and live content in the same style update. */
80
+ html[data-stalux-vt-phase="prepared"] [data-stalux-motion-content],
81
+ html[data-stalux-vt-phase="running"] [data-stalux-motion-content] {
82
+ transform-origin: 50% min(42vh, 400px);
83
+ backface-visibility: hidden;
84
+ animation: stalux-content-in var(--stalux-vt-duration, 160ms) cubic-bezier(0.22, 0.7, 0.2, 1)
85
+ both paused;
86
+ }
87
+ html[data-stalux-vt-phase="running"] [data-stalux-motion-content],
88
+ html[data-stalux-vt-phase="running"]::view-transition-new(stalux-focus) {
89
+ animation-play-state: running;
90
+ }
91
+ html[data-stalux-vt-phase] .stalux-article {
92
+ /* Clip a sliding paragraph at its reading card, without a scroll container. */
93
+ overflow: clip;
94
+ }
95
+ [data-stalux-home-content] {
96
+ display: flex;
97
+ flex-direction: column;
98
+ align-items: center;
99
+ width: 100%;
100
+ }
101
+
102
+ /* Reading follows a horizontal page sequence; prev/next articles are siblings
103
+ in that sequence, so they keep a lateral glide. Vertical travel is reserved
104
+ for hierarchical moves (list -> detail, back up to the archive). A slower
105
+ 260ms window keeps the longer sibling travel legible instead of abrupt. */
106
+ html[data-stalux-vt-preset="enter"] {
107
+ --stalux-vt-x: calc(var(--stalux-vt-distance) * 1.25);
108
+ --stalux-vt-rz: 0deg;
109
+ }
110
+ html[data-stalux-vt-preset="article"] {
111
+ --stalux-vt-duration: 260ms;
112
+ --stalux-vt-distance: clamp(36px, 5vw, 56px);
113
+ --stalux-vt-x: calc(var(--stalux-vt-distance) * 1.25);
114
+ --stalux-vt-rz: 0deg;
115
+ }
116
+ html[data-stalux-vt-preset="next"] {
117
+ --stalux-vt-duration: 260ms;
118
+ --stalux-vt-distance: clamp(36px, 5vw, 56px);
119
+ --stalux-vt-x: calc(var(--stalux-vt-distance) * 1.5);
120
+ --stalux-vt-rz: 0deg;
121
+ }
122
+ html[data-stalux-vt-preset="previous"] {
123
+ --stalux-vt-duration: 260ms;
124
+ --stalux-vt-distance: clamp(36px, 5vw, 56px);
125
+ --stalux-vt-x: calc(var(--stalux-vt-distance) * -1.5);
126
+ --stalux-vt-rz: 0deg;
127
+ }
128
+ html[data-stalux-vt-preset="up"] {
129
+ --stalux-vt-duration: 140ms;
130
+ --stalux-vt-x: calc(var(--stalux-vt-distance) * -0.75);
131
+ --stalux-vt-y: -10px;
132
+ --stalux-vt-rz: 0deg;
133
+ }
134
+ html[data-stalux-vt-preset="taxonomy"] {
135
+ --stalux-vt-duration: 140ms;
136
+ --stalux-vt-x: 0px;
137
+ --stalux-vt-y: 18px;
138
+ --stalux-vt-rx: calc(var(--stalux-vt-tilt) * -0.5);
139
+ --stalux-vt-rz: 0deg;
140
+ }
141
+ html[data-stalux-vt-preset="panel"] {
142
+ --stalux-vt-x: calc(var(--stalux-vt-distance) * 0.6);
143
+ --stalux-vt-ry: calc(var(--stalux-vt-tilt) * -1);
144
+ --stalux-vt-rz: 0deg;
145
+ }
146
+ html[data-stalux-vt-preset="panel"][data-stalux-vt-to="links"] {
147
+ --stalux-vt-x: 0px;
148
+ --stalux-vt-y: 12px;
149
+ --stalux-vt-rx: calc(var(--stalux-vt-tilt) * 0.75);
150
+ --stalux-vt-ry: 0deg;
151
+ }
152
+ html[data-stalux-vt-preset="panel"][data-stalux-vt-to="words"] {
153
+ --stalux-vt-x: 0px;
154
+ --stalux-vt-y: 16px;
155
+ --stalux-vt-ry: 0deg;
156
+ --stalux-vt-rz: -1deg;
157
+ }
158
+ html[data-stalux-vt-preset="home"] {
159
+ --stalux-vt-duration: 180ms;
160
+ --stalux-vt-x: 0px;
161
+ --stalux-vt-y: 20px;
162
+ --stalux-vt-rx: calc(var(--stalux-vt-tilt) * -0.625);
163
+ --stalux-vt-rz: 0deg;
164
+ --stalux-vt-scale: 0.985;
165
+ }
166
+ /* History restores the actual reading position. Small mirrored translation
167
+ signals direction without re-playing the page-entry tilt at a deep scroll. */
168
+ html[data-stalux-vt-preset="restore"] {
169
+ --stalux-vt-duration: 100ms;
170
+ --stalux-vt-x: 12px;
171
+ --stalux-vt-rz: 0deg;
172
+ }
173
+ html[data-stalux-vt-preset="restore"][data-stalux-vt-direction="back"],
174
+ html[data-stalux-vt-preset="restore"][data-stalux-vt-direction="backward"] {
175
+ --stalux-vt-x: -12px;
176
+ }
177
+ html[data-stalux-vt-preset="error"] {
178
+ --stalux-vt-duration: 120ms;
179
+ --stalux-vt-x: 0px;
180
+ --stalux-vt-y: 12px;
181
+ --stalux-vt-rz: -0.7deg;
182
+ }
183
+
184
+ @keyframes stalux-content-in {
130
185
  from {
131
- opacity: 0.9;
132
- transform: translateY(-4px);
186
+ opacity: 0.25;
187
+ transform: perspective(1200px) translate3d(var(--stalux-vt-x), var(--stalux-vt-y), 0)
188
+ rotateX(var(--stalux-vt-rx)) rotateY(var(--stalux-vt-ry)) rotateZ(var(--stalux-vt-rz))
189
+ scale(var(--stalux-vt-scale));
133
190
  }
134
- to {
191
+ 55% {
135
192
  opacity: 1;
136
- transform: translateY(0);
137
- }
138
- }
139
-
140
- @keyframes stalux-focus-previous {
141
- from {
142
- opacity: 0.9;
143
- transform: translateX(-8px);
144
- }
145
- to {
146
- opacity: 1;
147
- transform: translateX(0);
148
- }
149
- }
150
-
151
- @keyframes stalux-focus-next {
152
- from {
153
- opacity: 0.9;
154
- transform: translateX(8px);
155
193
  }
156
194
  to {
157
195
  opacity: 1;
158
- transform: translateX(0);
196
+ transform: perspective(1200px) translate3d(0, 0, 0) rotateX(0deg) rotateY(0deg)
197
+ rotateZ(0deg) scale(1);
159
198
  }
160
199
  }
161
-
162
- @keyframes stalux-focus-home {
163
- from {
164
- opacity: 0.9;
165
- transform: translateY(4px);
166
- }
167
- to {
168
- opacity: 1;
169
- transform: translateY(0);
170
- }
171
- }
172
-
173
- @keyframes stalux-focus-restore {
174
- from {
175
- opacity: 0.96;
176
- }
177
- to {
178
- opacity: 1;
179
- }
180
- }
181
-
182
200
  /* Public transition helpers retain their names as opacity-only compatibility
183
201
  frames. Theme layouts no longer use them to move large content/sidebars. */
184
202
  @keyframes stalux-page-exit {
@@ -312,20 +330,24 @@ html[data-stalux-vt-preset="error"]::view-transition-new(stalux-focus) {
312
330
  pointer-events: none;
313
331
  }
314
332
 
315
- /* Small screens get the same deterministic timing with no spatial motion. */
333
+ /* Phone routes keep direction and depth with smaller travel/angles. */
316
334
  @media (max-width: 768px) {
317
- html[data-stalux-vt-preset]::view-transition-new(stalux-focus) {
318
- animation: stalux-focus-fade 120ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
335
+ html[data-stalux-vt-preset]:not([data-stalux-vt-preset="none"]) {
336
+ --stalux-vt-distance: 20px;
337
+ --stalux-vt-tilt: 4deg;
338
+ }
339
+ html[data-stalux-vt-preset="restore"] {
340
+ --stalux-vt-x: 8px;
319
341
  }
320
- html[data-stalux-vt-preset="restore"]::view-transition-new(stalux-focus) {
321
- animation: stalux-focus-restore 100ms cubic-bezier(0.2, 0.7, 0.2, 1) both;
342
+ html[data-stalux-vt-preset="restore"][data-stalux-vt-direction="back"],
343
+ html[data-stalux-vt-preset="restore"][data-stalux-vt-direction="backward"] {
344
+ --stalux-vt-x: -8px;
322
345
  }
323
346
  }
324
347
 
325
348
  @media (prefers-reduced-motion: reduce) {
326
- html[data-stalux-vt-preset]
327
- .stalux-main
328
- [data-stalux-motion-focus][data-stalux-motion-visible="true"] {
349
+ html[data-stalux-vt-preset],
350
+ html[data-stalux-vt-preset] [data-astro-transition-persist] {
329
351
  view-transition-name: none !important;
330
352
  }
331
353
 
@@ -2,7 +2,9 @@ import { getRouteKind, normalizePublicPath } from "./public-routes";
2
2
 
3
3
  export type RouteMotionPreset =
4
4
  | "none"
5
- | "fade"
5
+ | "glide"
6
+ | "article"
7
+ | "panel"
6
8
  | "enter"
7
9
  | "up"
8
10
  | "taxonomy"
@@ -42,14 +44,17 @@ export function getRouteMotionPreset(context: MotionContext): RouteMotionPreset
42
44
  // Both directions restore an existing history entry. A push to a parent
43
45
  // route is not a history traversal, and an article's previous/next is not back.
44
46
  if (context.navigationType === "traverse") return "restore";
45
- if (context.navigationType === "replace") return "fade";
47
+ if (context.navigationType === "replace") return "glide";
46
48
  if (target === "not-found") return "error";
47
- if (source === "not-found") return "fade";
49
+ if (source === "not-found") return "glide";
48
50
  if (target === "home") return "home";
49
51
  if (source === "article" && target === "article") {
50
- return context.intent === "previous" || context.intent === "next" ? context.intent : "fade";
52
+ return context.intent === "previous" || context.intent === "next"
53
+ ? context.intent
54
+ : "article";
51
55
  }
52
56
  if (target === "article") return "enter";
57
+ if (target === "about" || target === "links" || target === "words") return "panel";
53
58
  if (target === "tags-detail" || target === "categories-detail") return "taxonomy";
54
59
  if (
55
60
  (source === "article" &&
@@ -59,5 +64,5 @@ export function getRouteMotionPreset(context: MotionContext): RouteMotionPreset
59
64
  ) {
60
65
  return "up";
61
66
  }
62
- return source === "home" ? "enter" : "fade";
67
+ return source === "home" ? "enter" : "glide";
63
68
  }