@xingwangzhe/stalux 1.39.3 → 1.39.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xingwangzhe/stalux",
3
- "version": "1.39.3",
3
+ "version": "1.39.5",
4
4
  "description": "A powerful, modern Astro blog theme — use as template or install as plugin",
5
5
  "keywords": [
6
6
  "astro",
@@ -287,50 +287,52 @@ export const styleNames: { classes: Record<string, string>; variables: Record<st
287
287
  "--stalux-bg-color": "--s1n",
288
288
  "--stalux-bg-filter": "--s1o",
289
289
  "--stalux-nav-offset": "--s1p",
290
- "--stalux-site-header-height": "--s1q",
291
- "--stalux-site-header-min-height": "--s1r",
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"
290
+ "--stalux-side-in-x": "--s1q",
291
+ "--stalux-side-out-x": "--s1r",
292
+ "--stalux-site-header-height": "--s1s",
293
+ "--stalux-site-header-min-height": "--s1t",
294
+ "--stalux-text-shadow": "--s1u",
295
+ "--surface-glass": "--s1v",
296
+ "--surface-glass-shadow": "--s1w",
297
+ "--tag-bg": "--s1x",
298
+ "--tag-bg-hover": "--s1y",
299
+ "--tl-line": "--s1z",
300
+ "--tl-pad": "--s20",
301
+ "--transition-fast": "--s21",
302
+ "--transition-medium": "--s22",
303
+ "--transition-normal": "--s23",
304
+ "--transition-slow": "--s24",
305
+ "--transition-slower": "--s25",
306
+ "--transition-slowest": "--s26",
307
+ "--un-rotate": "--s27",
308
+ "--un-rotate-x": "--s28",
309
+ "--un-rotate-y": "--s29",
310
+ "--un-rotate-z": "--s2a",
311
+ "--un-scale-x": "--s2b",
312
+ "--un-scale-y": "--s2c",
313
+ "--un-scale-z": "--s2d",
314
+ "--un-skew-x": "--s2e",
315
+ "--un-skew-y": "--s2f",
316
+ "--un-translate-x": "--s2g",
317
+ "--un-translate-y": "--s2h",
318
+ "--un-translate-z": "--s2i",
319
+ "--updated-bg": "--s2j",
320
+ "--updated-border": "--s2k",
321
+ "--white-05p": "--s2l",
322
+ "--white-10p": "--s2m",
323
+ "--white-15p": "--s2n",
324
+ "--white-20p": "--s2o",
325
+ "--white-30p": "--s2p",
326
+ "--white-50p": "--s2q",
327
+ "--white-60p": "--s2r",
328
+ "--white-70p": "--s2s",
329
+ "--white-75p": "--s2t",
330
+ "--white-78p": "--s2u",
331
+ "--white-80p": "--s2v",
332
+ "--white-85p": "--s2w",
333
+ "--white-90p": "--s2x",
334
+ "--white-95p": "--s2y",
335
+ "--white-full": "--s2z"
334
336
  },
335
337
  "animations": {
336
338
  "fadeInUpComment": "k0",
@@ -339,21 +341,24 @@ export const styleNames: { classes: Record<string, string>; variables: Record<st
339
341
  "stalux-article-enter-back": "k3",
340
342
  "stalux-cursor-blink": "k4",
341
343
  "stalux-link-avatar-spin": "k5",
342
- "stalux-page-enter": "k6",
343
- "stalux-page-enter-back": "k7",
344
- "stalux-page-exit": "k8",
345
- "stalux-random-spin": "k9",
346
- "stalux-sidebar-left-back-in": "ka",
347
- "stalux-sidebar-left-back-out": "kb",
348
- "stalux-sidebar-left-in": "kc",
349
- "stalux-sidebar-left-out": "kd",
350
- "stalux-sidebar-right-back-in": "ke",
351
- "stalux-sidebar-right-back-out": "kf",
352
- "stalux-sidebar-right-in": "kg",
353
- "stalux-sidebar-right-out": "kh",
354
- "stalux-social-stalux-social-arrive": "ki",
355
- "stalux-taxonomy-enter": "kj",
356
- "stalux-taxonomy-enter-back": "kk",
357
- "stalux-word-word-glow": "kl"
344
+ "stalux-random-spin": "k6",
345
+ "stalux-sidebar-left-back-in": "k7",
346
+ "stalux-sidebar-left-back-out": "k8",
347
+ "stalux-sidebar-left-in": "k9",
348
+ "stalux-sidebar-left-out": "ka",
349
+ "stalux-sidebar-right-back-in": "kb",
350
+ "stalux-sidebar-right-back-out": "kc",
351
+ "stalux-sidebar-right-in": "kd",
352
+ "stalux-sidebar-right-out": "ke",
353
+ "stalux-social-stalux-social-arrive": "kf",
354
+ "stalux-taxonomy-enter": "kg",
355
+ "stalux-taxonomy-enter-back": "kh",
356
+ "stalux-vt-new-back": "ki",
357
+ "stalux-vt-new-fwd": "kj",
358
+ "stalux-vt-old-back": "kk",
359
+ "stalux-vt-old-fwd": "kl",
360
+ "stalux-vt-side-in": "km",
361
+ "stalux-vt-side-out": "kn",
362
+ "stalux-word-word-glow": "ko"
358
363
  }
359
364
  };
@@ -2,7 +2,6 @@
2
2
  import { getCollection } from "astro:content";
3
3
  import Footer from "@components/stalux/layout/footer.astro";
4
4
  import Head from "@components/stalux/layout/head.astro";
5
- import NavigationProgress from "@components/stalux/layout/navigationProgress.astro";
6
5
  import Navs from "@components/stalux/layout/navs.astro";
7
6
  import { getAccentColorStyle } from "@utils/accent-color";
8
7
  import {
@@ -89,7 +88,6 @@ const routeKind = getRouteKind(Astro.url.pathname);
89
88
  data-stalux-umami-id={headConfig?.umami?.id}
90
89
  data-stalux-umami-url={headConfig?.umami?.url}
91
90
  >
92
- <NavigationProgress />
93
91
  <header
94
92
  class="stalux-site-header"
95
93
  data-stalux-font-group="header"
@@ -122,12 +120,7 @@ const routeKind = getRouteKind(Astro.url.pathname);
122
120
  transition:persist="stalux-bg-b"
123
121
  aria-hidden="true"
124
122
  ></div>
125
- <main
126
- class="stalux-main"
127
- data-stalux-route={routeKind}
128
- transition:name="stalux-page"
129
- transition:animate="none"
130
- >
123
+ <main class="stalux-main" data-stalux-route={routeKind} transition:name="stalux-page">
131
124
  <slot />
132
125
  </main>
133
126
  <Footer />
@@ -2,8 +2,6 @@ import { getRouteKind } from "@utils/public-routes";
2
2
  import { installBackToTop } from "./back-to-top";
3
3
  import { createClientLogger } from "./logger";
4
4
  import { prepareNavigationFont } from "./navigation-font";
5
- import { installNavigationProgress } from "./navigation-progress";
6
- import { prepareRouteMotion } from "./route-motion";
7
5
 
8
6
  const logger = createClientLogger("view-transitions");
9
7
 
@@ -42,9 +40,10 @@ function setNavigationState(event: NavigationEvent, html = document.documentElem
42
40
  }
43
41
 
44
42
  function clearNavigationState(): void {
45
- delete document.documentElement.dataset.staluxVtFrom;
46
- delete document.documentElement.dataset.staluxVtTo;
47
- delete document.documentElement.dataset.staluxVtDirection;
43
+ const html = document.documentElement;
44
+ delete html.dataset.staluxVtFrom;
45
+ delete html.dataset.staluxVtTo;
46
+ delete html.dataset.staluxVtDirection;
48
47
  }
49
48
 
50
49
  function preserveHeaderMetrics(nextDocument: Document): void {
@@ -65,9 +64,9 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
65
64
  transitionWindow.__STALUX_VT_LISTENER__ = true;
66
65
 
67
66
  let generation = 0;
68
- let motion: ReturnType<typeof prepareRouteMotion> | undefined;
69
67
  let pendingBrowserMotion = false;
70
- let browserMotion = false;
68
+ let _browserMotion = false;
69
+ let _routeMotionActive = false;
71
70
  window.addEventListener(
72
71
  "popstate",
73
72
  (event) => {
@@ -80,9 +79,8 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
80
79
  document.addEventListener("astro:before-preparation", (event) => {
81
80
  const navigation = event as unknown as NavigationEvent;
82
81
  const current = ++generation;
83
- motion?.cancel();
84
- motion = undefined;
85
- browserMotion = pendingBrowserMotion && navigation.navigationType === "traverse";
82
+ _routeMotionActive = false;
83
+ _browserMotion = pendingBrowserMotion && navigation.navigationType === "traverse";
86
84
  pendingBrowserMotion = false;
87
85
  setNavigationState(navigation);
88
86
  navigation.signal.addEventListener(
@@ -108,32 +106,35 @@ if (!transitionWindow.__STALUX_VT_LISTENER__) {
108
106
  const navigation = event as unknown as NavigationEvent;
109
107
  if (navigation.signal.aborted) return;
110
108
  const current = generation;
111
- motion = prepareRouteMotion(navigation);
112
109
  preserveHeaderMetrics(navigation.newDocument);
113
- // Astro replaces the root attributes during swap. Carry motion state into
114
- // the new document and keep it until the last animation actually settles.
110
+ _routeMotionActive = true;
111
+ // Astro replaces the root attributes during swap. Carry state into the
112
+ // new document; CSS keyframes read these data-* attributes to pick their
113
+ // own direction rather than letting Astro's default `fade` pair apply.
115
114
  setNavigationState(navigation, navigation.newDocument.documentElement);
116
115
  const finish = () => {
117
116
  if (current === generation) clearNavigationState();
118
117
  };
119
- void motion.finished.then(finish, finish);
118
+ // ViewTransition.ready fires when pseudo-elements are painted out; we
119
+ // use it as the handoff boundary so our WAAPI for new content starts
120
+ // *after* the native swap has painted its snapshot.
121
+ const native = navigation.viewTransition;
122
+ Promise.resolve(native?.ready)
123
+ .then(
124
+ () => undefined,
125
+ () => undefined,
126
+ )
127
+ .then(finish);
120
128
  });
121
129
 
122
130
  document.addEventListener("astro:after-swap", () => {
123
131
  setRouteState(window.location.pathname);
124
- // Install the effect before the first new-content paint. The browser
125
- // starts its timeline after the native transition releases rendering.
126
- motion?.start(document.querySelector<HTMLElement>("main[data-stalux-route]"), {
127
- skip: browserMotion,
128
- });
129
132
  });
130
133
 
131
134
  document.addEventListener("astro:page-load", () => {
132
135
  setRouteState(window.location.pathname);
133
136
  });
134
137
 
135
- // Register after the font wrapper so prepared includes its bounded wait.
136
- installNavigationProgress();
137
138
  // Footer button and scroll sentinel persist across soft navigations, so the
138
139
  // BackToTop observer is installed once per document.
139
140
  installBackToTop();
@@ -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}.fixed{position:fixed}.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}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}}@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}@keyframes stalux-page-exit{to{opacity:0}}@keyframes stalux-page-enter{0%{opacity:0;transform:translateY(9px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-page-enter-back{0%{opacity:0;transform:translateY(-9px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-taxonomy-enter{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-taxonomy-enter-back{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-article-enter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-article-enter-back{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-sidebar-left-in{0%{opacity:0;transform:translate(-14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-left-out{to{opacity:0;transform:translate(-10px)}}@keyframes stalux-sidebar-left-back-in{0%{opacity:0;transform:translate(14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-left-back-out{to{opacity:0;transform:translate(10px)}}@keyframes stalux-sidebar-right-in{0%{opacity:0;transform:translate(14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-right-out{to{opacity:0;transform:translate(10px)}}@keyframes stalux-sidebar-right-back-in{0%{opacity:0;transform:translate(-14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-right-back-out{to{opacity:0;transform:translate(-10px)}}html,.stalux-main,.stalux-main *,[data-astro-transition-persist]{view-transition-name:none!important}[data-stalux-scroll-sentinel]{visibility:hidden;pointer-events:none;width:1px;height:1px;position:absolute;top:240px;left:0}@media (prefers-reduced-motion:reduce){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation-duration:1ms!important;animation-delay:0s!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}@keyframes stalux-vt-old-fwd{0%{opacity:1;transform:translate(0,0)}45%{opacity:.5}to{opacity:0;transform:translate(-6%)}}@keyframes stalux-vt-new-fwd{0%{opacity:0;filter:blur(1.2px);transform:translate(6%)scale(.985)}60%{opacity:.9;filter:blur();transform:translate(-.8%)scale(1)}to{opacity:1;filter:blur();transform:translate(0,0)}}@keyframes stalux-vt-old-back{0%{opacity:1;transform:translate(0,0)}45%{opacity:.5}to{opacity:0;transform:translate(6%)}}@keyframes stalux-vt-new-back{0%{opacity:0;filter:blur(1.2px);transform:translate(-6%)scale(.985)}60%{opacity:.9;filter:blur();transform:translate(.8%)scale(1)}to{opacity:1;filter:blur();transform:translate(0,0)}}html[data-astro-transition=forward]::view-transition-old(stalux-page){animation:.38s cubic-bezier(.22,.72,.22,1) both stalux-vt-old-fwd}html[data-astro-transition=forward]::view-transition-new(stalux-page){animation:.46s cubic-bezier(.22,.72,.22,1) both stalux-vt-new-fwd}html[data-astro-transition=back]::view-transition-old(stalux-page){animation:.38s cubic-bezier(.22,.72,.22,1) both stalux-vt-old-back}html[data-astro-transition=back]::view-transition-new(stalux-page){animation:.46s cubic-bezier(.22,.72,.22,1) both stalux-vt-new-back}@keyframes stalux-vt-side-out{to{opacity:0;transform:translate3d(var(--stalux-side-out-x,-14px), 0, 0)}}@keyframes stalux-vt-side-in{0%{opacity:0;transform:translate3d(var(--stalux-side-in-x,14px), 0, 0)}to{opacity:1;transform:translate(0,0)}}html,[data-astro-transition-persist],[data-stalux-site-header],[data-stalux-site-header] *,.bg-layer,.bg-layer *,[data-stalux-scroll-sentinel],[data-stalux-scroll-sentinel] *,[data-stalux-back-to-top],[data-stalux-back-to-top] *{view-transition-name:none!important}[data-stalux-scroll-sentinel]{visibility:hidden;pointer-events:none;width:1px;height:1px;position:absolute;top:240px;left:0}@keyframes stalux-taxonomy-enter{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-taxonomy-enter-back{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-article-enter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-article-enter-back{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}@keyframes stalux-sidebar-left-in{0%{opacity:0;transform:translate(-14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-left-out{to{opacity:0;transform:translate(-10px)}}@keyframes stalux-sidebar-left-back-in{0%{opacity:0;transform:translate(14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-left-back-out{to{opacity:0;transform:translate(10px)}}@keyframes stalux-sidebar-right-in{0%{opacity:0;transform:translate(14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-right-out{to{opacity:0;transform:translate(10px)}}@keyframes stalux-sidebar-right-back-in{0%{opacity:0;transform:translate(-14px)}to{opacity:1;transform:translate(0)}}@keyframes stalux-sidebar-right-back-out{to{opacity:0;transform:translate(-10px)}}@media (prefers-reduced-motion:reduce){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){filter:none!important;animation-duration:1ms!important;animation-delay:0s!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,35 +28,172 @@
28
28
  animation-delay: 0.35s;
29
29
  }
30
30
 
31
- /* Keep route motion on the page shell; named child elements handle continuity. */
32
- @keyframes stalux-page-exit {
33
- to {
31
+ /* =========================================================
32
+ View Transitions:主内容 slide + 淡入 + 新内容 scale+blur 到清晰,
33
+ 与 Astro 默认的纯淡入淡出不同 — 旧内容沿方向快速滑出,新内容对向滑入
34
+ 带轻微 scale 从 0.985 拉回 1,配合 1.2px blur 再还原。
35
+ forwards (direction = "forward" | "push"): 旧内容向左滑出,新内容从右滑入
36
+ backwards (direction = "back" | "traverse"): 镜像方向
37
+ 持久壳层(header、背景、sentinel、back-to-top 按钮)设
38
+ view-transition-name: none 不生成快照、原地即时更新;<main>(stalux-page)
39
+ 及其内部命名元素(标题/侧边栏/文章容器等)保留各自的 VT 组,
40
+ 由方向伪元素规则 + 局部 transition:animate 分层驱动。
41
+ ========================================================= */
42
+
43
+ /* 主内容 View Transition 动画(方向感知:前进/回退镜像)。
44
+ 方向机制:Astro 路由器在 startViewTransition 之前给 <html> 写
45
+ data-astro-transition="forward|back"(router.js:369),整个动画期间保留,
46
+ 直到 viewTransition.finished 才移除(router.js:423)。::view-transition-*
47
+ 伪元素树的 originating element 就是 <html>,因此 html[attr]::view-transition-old(x)
48
+ 可以按方向匹配(popstate 时 router.js:470 按 history index 给出真实方向)。
49
+ ⚠ 约束 1:伪元素规则必须写成**直接引用 keyframes 的完整 animation shorthand** ——
50
+ var() fallback 字符串(`var(--x, keyframesName)`)不会被 Rolldown tree-shake
51
+ 静态追踪,fallback 里的 keyframes 名会被判为"未引用"而裁掉。
52
+ ⚠ 约束 2:::view-transition-old/new() 参数里只能放自定义 transition-name 或 *,
53
+ 不能放属性选择器(legacy 实验语法,lightningcss minify 不支持)。
54
+ ⚠ 约束 3:任意祖先元素(body/div 等)做 originating element 不成立;
55
+ 只有 <html> 复合选择器有效。 */
56
+
57
+ /* forward:进入下一层 —— 旧页向左滑出,新页自右滑入并 scale+blur 收敛 */
58
+ @keyframes stalux-vt-old-fwd {
59
+ 0% {
60
+ opacity: 1;
61
+ transform: translate3d(0, 0, 0);
62
+ }
63
+ 45% {
64
+ opacity: 0.5;
65
+ }
66
+ 100% {
34
67
  opacity: 0;
68
+ transform: translate3d(-6%, 0, 0);
35
69
  }
36
70
  }
37
71
 
38
- @keyframes stalux-page-enter {
39
- from {
72
+ @keyframes stalux-vt-new-fwd {
73
+ 0% {
40
74
  opacity: 0;
41
- transform: translateY(9px);
75
+ transform: translate3d(6%, 0, 0) scale(0.985);
76
+ filter: blur(1.2px);
42
77
  }
43
- to {
78
+ 60% {
79
+ opacity: 0.9;
80
+ transform: translate3d(-0.8%, 0, 0) scale(1);
81
+ filter: blur(0px);
82
+ }
83
+ 100% {
44
84
  opacity: 1;
45
- transform: translateY(0);
85
+ transform: translate3d(0, 0, 0);
86
+ filter: blur(0px);
87
+ }
88
+ }
89
+
90
+ /* back:返回上一层 —— 镜像:旧页向右滑出,新页自左滑入 */
91
+ @keyframes stalux-vt-old-back {
92
+ 0% {
93
+ opacity: 1;
94
+ transform: translate3d(0, 0, 0);
95
+ }
96
+ 45% {
97
+ opacity: 0.5;
98
+ }
99
+ 100% {
100
+ opacity: 0;
101
+ transform: translate3d(6%, 0, 0);
46
102
  }
47
103
  }
48
104
 
49
- @keyframes stalux-page-enter-back {
105
+ @keyframes stalux-vt-new-back {
106
+ 0% {
107
+ opacity: 0;
108
+ transform: translate3d(-6%, 0, 0) scale(0.985);
109
+ filter: blur(1.2px);
110
+ }
111
+ 60% {
112
+ opacity: 0.9;
113
+ transform: translate3d(0.8%, 0, 0) scale(1);
114
+ filter: blur(0px);
115
+ }
116
+ 100% {
117
+ opacity: 1;
118
+ transform: translate3d(0, 0, 0);
119
+ filter: blur(0px);
120
+ }
121
+ }
122
+
123
+ html[data-astro-transition="forward"]::view-transition-old(stalux-page) {
124
+ animation: stalux-vt-old-fwd 380ms cubic-bezier(0.22, 0.72, 0.22, 1) both;
125
+ }
126
+
127
+ html[data-astro-transition="forward"]::view-transition-new(stalux-page) {
128
+ animation: stalux-vt-new-fwd 460ms cubic-bezier(0.22, 0.72, 0.22, 1) both;
129
+ }
130
+
131
+ html[data-astro-transition="back"]::view-transition-old(stalux-page) {
132
+ animation: stalux-vt-old-back 380ms cubic-bezier(0.22, 0.72, 0.22, 1) both;
133
+ }
134
+
135
+ html[data-astro-transition="back"]::view-transition-new(stalux-page) {
136
+ animation: stalux-vt-new-back 460ms cubic-bezier(0.22, 0.72, 0.22, 1) both;
137
+ }
138
+
139
+ /* 侧边栏 — 独立于 root:沿内容方向做 12px 平移 + 淡入淡出,
140
+ 让文章详情页左右栏与主内容分层出现。 */
141
+ @keyframes stalux-vt-side-out {
142
+ to {
143
+ opacity: 0;
144
+ transform: translate3d(var(--stalux-side-out-x, -14px), 0, 0);
145
+ }
146
+ }
147
+
148
+ @keyframes stalux-vt-side-in {
50
149
  from {
51
150
  opacity: 0;
52
- transform: translateY(-9px);
151
+ transform: translate3d(var(--stalux-side-in-x, 14px), 0, 0);
53
152
  }
54
153
  to {
55
154
  opacity: 1;
56
- transform: translateY(0);
155
+ transform: translate3d(0, 0, 0);
57
156
  }
58
157
  }
59
158
 
159
+ /* 持久壳层:header、背景、sentinel、back-to-top 按钮不参与 View Transition 伪元素;
160
+ 直接设 view-transition-name: none 让浏览器为它们各自做即时更新。
161
+ 这避免了原生快照把大体积 header 或整张背景图塞进 pseudo-element 树、
162
+ 也与 view-transitions.ts 里的 .scrollY 优化保持一致 — 不强制 UI 同步。
163
+ ⚠ 注意:html 也必须压制 —— 压掉 root 组后整页快照不存在,
164
+ 只有 stalux-page 与内部命名元素生成各自组,避免整页 fade 叠加。
165
+ ⚠ 不要把 .stalux-main / .stalux-main * 加进来:那会连 stalux-page 组
166
+ 一起压掉,方向伪元素规则将全部失配(1.39.4 曾因此动画全死、路由瞬时切换)。 */
167
+ html,
168
+ [data-astro-transition-persist],
169
+ [data-stalux-site-header],
170
+ [data-stalux-site-header] *,
171
+ .bg-layer,
172
+ .bg-layer *,
173
+ [data-stalux-scroll-sentinel],
174
+ [data-stalux-scroll-sentinel] *,
175
+ [data-stalux-back-to-top],
176
+ [data-stalux-back-to-top] * {
177
+ view-transition-name: none !important;
178
+ }
179
+
180
+ /* BackToTop visibility sentinel */
181
+ [data-stalux-scroll-sentinel] {
182
+ position: absolute;
183
+ top: 240px;
184
+ left: 0;
185
+ width: 1px;
186
+ height: 1px;
187
+ visibility: hidden;
188
+ pointer-events: none;
189
+ }
190
+
191
+ /* =========================================================
192
+ 下面保留的是 Astro transition:animate 用的 web 动画 keyframes,
193
+ 供 getSidebarAnimation("left"|"right") 和分类/文章页内局部
194
+ transition:animate 消费;与 View Transition 伪元素层互不冲突。
195
+ ========================================================= */
196
+
60
197
  @keyframes stalux-taxonomy-enter {
61
198
  from {
62
199
  opacity: 0;
@@ -173,35 +310,16 @@
173
310
  }
174
311
  }
175
312
 
176
- /* The native router keeps document/history semantics; content motion uses a
177
- short Web Animations API effect instead of page-sized snapshot surfaces.
178
- Persisted shell elements remain live and stationary during the swap. */
179
- html,
180
- .stalux-main,
181
- .stalux-main *,
182
- [data-astro-transition-persist] {
183
- view-transition-name: none !important;
184
- }
185
-
186
- /* BackToTop visibility sentinel: lives in document coordinates and is observed
187
- by an IntersectionObserver, so route swaps never force a synchronous scroll
188
- read inside the native transition's update callback. */
189
- [data-stalux-scroll-sentinel] {
190
- position: absolute;
191
- top: 240px;
192
- left: 0;
193
- width: 1px;
194
- height: 1px;
195
- visibility: hidden;
196
- pointer-events: none;
197
- }
198
-
313
+ /* prefers-reduced-motion:关闭 View Transition 伪元素上的所有动画,
314
+ 但保留伪元素本身(浏览器会直接从 old 切到 new,视觉等价于无动画的软导航) */
199
315
  @media (prefers-reduced-motion: reduce) {
200
316
  ::view-transition-group(*),
201
317
  ::view-transition-old(*),
202
318
  ::view-transition-new(*) {
203
319
  animation-duration: 1ms !important;
204
320
  animation-delay: 0ms !important;
321
+ filter: none !important;
322
+ transform: none !important;
205
323
  }
206
324
 
207
325
  .stalux-main,
@@ -1,55 +0,0 @@
1
- <div
2
- data-stalux-navigation-progress
3
- aria-hidden="true"
4
- transition:persist="stalux-navigation-progress"
5
- transition:name="stalux-navigation-progress"
6
- transition:animate="none"
7
- ></div>
8
-
9
- <style is:global>
10
- [data-stalux-navigation-progress] {
11
- position: fixed;
12
- inset: 0 0 auto;
13
- height: 2px;
14
- z-index: 2147483647;
15
- pointer-events: none;
16
- background: var(--stalux-accent-color, #eab308);
17
- transform: scaleX(0);
18
- transform-origin: left;
19
- opacity: 0;
20
- transition:
21
- transform 450ms ease-out,
22
- opacity 120ms ease-out;
23
- }
24
- [data-stalux-navigation-progress][data-stage] {
25
- opacity: 1;
26
- }
27
- [data-stalux-navigation-progress][data-stage="complete"] {
28
- transition:
29
- transform 160ms ease-out,
30
- opacity 120ms ease-out;
31
- }
32
- [data-stalux-navigation-progress]:not([data-stage]) {
33
- transition: opacity 120ms ease-out;
34
- }
35
- ::view-transition-group(stalux-navigation-progress) {
36
- z-index: 2147483647;
37
- }
38
- ::view-transition-old(stalux-navigation-progress) {
39
- display: none;
40
- }
41
- ::view-transition-new(stalux-navigation-progress) {
42
- animation: none;
43
- }
44
- @media (prefers-reduced-motion: reduce) {
45
- [data-stalux-navigation-progress],
46
- [data-stalux-navigation-progress][data-stage] {
47
- transition: none;
48
- }
49
- }
50
- @media print {
51
- [data-stalux-navigation-progress] {
52
- display: none;
53
- }
54
- }
55
- </style>
@@ -1,147 +0,0 @@
1
- import type {
2
- TransitionBeforePreparationEvent,
3
- TransitionBeforeSwapEvent,
4
- } from "astro:transitions/client";
5
- import { prepareRouteMotion } from "./route-motion";
6
-
7
- type Stage = "loading" | "prepared" | "swapped" | "loaded" | "complete";
8
- interface Navigation {
9
- signal: AbortSignal;
10
- stage: Stage;
11
- swapped: boolean;
12
- loaded: boolean;
13
- animated: boolean;
14
- progress: number;
15
- detach: () => void;
16
- }
17
-
18
- /** Real milestones with bounded visual easing while waiting; never a download percentage. */
19
- export function installNavigationProgress(): void {
20
- let active: Navigation | undefined;
21
- let swapping: Navigation | undefined;
22
- let trickleTimer: ReturnType<typeof setTimeout> | undefined;
23
- let hideTimer: ReturnType<typeof setTimeout> | undefined;
24
- const element = () => document.querySelector<HTMLElement>("[data-stalux-navigation-progress]");
25
- const paint = (stage?: Stage, progress = 0) => {
26
- const bar = element();
27
- if (!bar) return;
28
- bar.style.transform = `scaleX(${progress})`;
29
- if (stage) bar.dataset.stage = stage;
30
- else delete bar.dataset.stage;
31
- };
32
- const clear = () => {
33
- clearTimeout(trickleTimer);
34
- trickleTimer = undefined;
35
- swapping = undefined;
36
- clearTimeout(hideTimer);
37
- hideTimer = undefined;
38
- active?.detach();
39
- active = undefined;
40
- paint();
41
- };
42
- const advance = (navigation: Navigation, stage: Stage) => {
43
- if (active !== navigation || navigation.signal.aborted) return;
44
- navigation.stage = stage;
45
- const milestones = {
46
- loading: 0.08,
47
- prepared: 0.65,
48
- swapped: 0.85,
49
- loaded: 0.95,
50
- complete: 1,
51
- };
52
- navigation.progress = Math.max(navigation.progress, milestones[stage]);
53
- paint(stage, navigation.progress);
54
- };
55
- const complete = (navigation: Navigation) => {
56
- if (
57
- active !== navigation ||
58
- navigation.stage === "complete" ||
59
- !navigation.loaded ||
60
- !navigation.animated
61
- )
62
- return;
63
- clearTimeout(trickleTimer);
64
- trickleTimer = undefined;
65
- advance(navigation, "complete");
66
- navigation.detach();
67
- hideTimer = setTimeout(() => {
68
- if (active === navigation) clear();
69
- }, 250);
70
- };
71
-
72
- const trickle = (navigation: Navigation) => {
73
- if (active !== navigation || navigation.signal.aborted || navigation.stage === "complete")
74
- return;
75
- const limits = { loading: 0.6, prepared: 0.8, swapped: 0.92, loaded: 0.98 };
76
- const limit = limits[navigation.stage];
77
- navigation.progress += (limit - navigation.progress) * 0.12;
78
- paint(navigation.stage, navigation.progress);
79
- trickleTimer = setTimeout(() => trickle(navigation), 500);
80
- };
81
-
82
- document.addEventListener("astro:before-preparation", (event) => {
83
- clear();
84
- const preparation = event as TransitionBeforePreparationEvent;
85
- if (preparation.signal.aborted || event.defaultPrevented) return;
86
- const abort = () => {
87
- if (active === navigation) clear();
88
- };
89
- const navigation: Navigation = {
90
- signal: preparation.signal,
91
- stage: "loading",
92
- progress: 0.08,
93
- swapped: false,
94
- loaded: false,
95
- animated: false,
96
- detach: () => preparation.signal.removeEventListener("abort", abort),
97
- };
98
- active = navigation;
99
- preparation.signal.addEventListener("abort", abort, { once: true });
100
- paint("loading", navigation.progress);
101
- trickleTimer = setTimeout(() => trickle(navigation), 500);
102
- const loader = preparation.loader;
103
- preparation.loader = async () => {
104
- try {
105
- await loader();
106
- if (preparation.defaultPrevented) abort();
107
- else advance(navigation, "prepared");
108
- } catch (error) {
109
- abort();
110
- throw error;
111
- }
112
- };
113
- // A later listener may cancel preparation before Astro calls the loader.
114
- queueMicrotask(() => {
115
- if (preparation.defaultPrevented) abort();
116
- });
117
- });
118
- document.addEventListener("astro:before-swap", (event) => {
119
- const swap = event as TransitionBeforeSwapEvent;
120
- const navigation = active;
121
- if (!navigation || navigation.signal !== swap.signal || swap.signal.aborted) return;
122
- swapping = navigation;
123
- const finished = () => {
124
- if (active !== navigation || navigation.signal.aborted) return;
125
- navigation.animated = true;
126
- complete(navigation);
127
- };
128
- // Skipped/rejected animations must not leave a completed navigation stuck.
129
- void prepareRouteMotion(swap).finished.then(finished);
130
- });
131
- document.addEventListener("astro:after-swap", () => {
132
- if (!active || swapping !== active || active.signal.aborted) return;
133
- swapping = undefined;
134
- active.swapped = true;
135
- advance(active, "swapped");
136
- });
137
- document.addEventListener("astro:page-load", () => {
138
- if (!active?.swapped || active.signal.aborted || active.stage === "complete") return;
139
- active.loaded = true;
140
- advance(active, "loaded");
141
- complete(active);
142
- });
143
- window.addEventListener("pagehide", clear);
144
- window.addEventListener("pageshow", (event) => {
145
- if (event.persisted) clear();
146
- });
147
- }