@xingwangzhe/stalux 1.40.1 → 1.41.1

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.1/docs/view-transitions-1.40.1.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.1",
3
+ "version": "1.41.1",
4
4
  "description": "A powerful, modern Astro blog theme — use as template or install as plugin",
5
5
  "keywords": [
6
6
  "astro",
@@ -135,7 +135,7 @@
135
135
  "@types/node": "^26.6.5",
136
136
  "@unocss/astro": "^66.11.0",
137
137
  "@vitest/coverage-v8": "^5.0.4",
138
- "astro": "^7.4.1",
138
+ "astro": "^7.4.2",
139
139
  "knip": "^6.41.0",
140
140
  "typescript": "npm:@typescript/typescript6@6.0.2",
141
141
  "unocss": "^66.11.0",
@@ -143,6 +143,6 @@
143
143
  "vitest": "^5.0.4"
144
144
  },
145
145
  "peerDependencies": {
146
- "astro": "^7.4.1"
146
+ "astro": "^7.4.2"
147
147
  }
148
148
  }
@@ -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 {
@@ -159,9 +137,9 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
159
137
  clearNavigationState();
160
138
  };
161
139
  motion?.cancel();
162
- // Only the incoming heading animates. Drop any prior marker without
163
- // measuring/capturing a hidden outgoing title or flushing its layout.
164
- 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.
165
143
  preset = getRouteMotionPreset({
166
144
  from: new URL(navigation.from, window.location.href),
167
145
  to: new URL(navigation.to, window.location.href),
@@ -206,11 +184,29 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
206
184
  // new document; CSS keyframes read these data-* attributes to pick their
207
185
  // own direction rather than letting Astro's default `fade` pair apply.
208
186
  setNavigationState(navigation, preset, navigation.newDocument.documentElement);
187
+ if (preset !== "none") {
188
+ navigation.newDocument.documentElement.dataset.staluxVtPhase = "prepared";
189
+ }
209
190
  // This release uses CSS/native VT only. Settle the existing installation
210
191
  // gate without starting a second WAAPI effect; analytics/background keep
211
192
  // the same shared ready/finished semantics and their existing listeners.
212
193
  motion = prepareRouteMotion(navigation);
213
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
+ );
214
210
  const finish = () => {
215
211
  if (current === generation) clearNavigationState();
216
212
  };
@@ -222,7 +218,6 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
222
218
 
223
219
  document.addEventListener("astro:after-swap", () => {
224
220
  setRouteState(window.location.pathname);
225
- if (preset !== "none") updateFocusVisibility();
226
221
  });
227
222
 
228
223
  document.addEventListener("astro:page-load", () => {
@@ -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
  }