@xingwangzhe/stalux 1.56.0 → 1.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/package.json +4 -12
  2. package/src/components/stalux/archives/archivesList.astro +1 -1
  3. package/src/components/stalux/categories/categoriesCard.astro +1 -1
  4. package/src/components/stalux/posts/PostTaxonomy.astro +1 -1
  5. package/src/components/stalux/posts/postCard.astro +3 -3
  6. package/src/components/stalux/tags/tagHeader.astro +2 -2
  7. package/src/components/stalux/tags/tagsCloud.astro +2 -2
  8. package/src/index.ts +39 -13
  9. package/src/internal/html-output.ts +18 -0
  10. package/src/internal/modern-css.ts +1 -0
  11. package/src/internal/route-hrefs.ts +47 -0
  12. package/src/internal/social-card-data.ts +1 -1
  13. package/src/internal/style-names.generated.ts +87 -94
  14. package/src/internal/swup-options.ts +98 -0
  15. package/src/layouts/Stalux.astro +0 -1
  16. package/src/pages/404.astro +1 -1
  17. package/src/pages/api/posts.json.ts +1 -1
  18. package/src/pages/atom.xml.ts +2 -0
  19. package/src/pages/posts/[post].md.ts +2 -2
  20. package/src/pages/rss.xml.ts +2 -0
  21. package/src/scripts/analytics-runtime.ts +4 -9
  22. package/src/scripts/list-reveal.ts +3 -15
  23. package/src/scripts/module-motion.ts +2 -3
  24. package/src/scripts/navigation-scripts.ts +12 -7
  25. package/src/scripts/route-guards.ts +200 -0
  26. package/src/scripts/swup-internals.d.ts +15 -0
  27. package/src/styles/base.css +0 -8
  28. package/src/styles/generated-prose.css +1 -1
  29. package/src/styles/generated-waline.css +1 -1
  30. package/src/styles/generated.css +1 -1
  31. package/src/styles/integrations.css +14 -16
  32. package/src/styles/math.css +3 -1
  33. package/src/styles/motion.css +1 -22
  34. package/src/utils/accent-color.ts +52 -0
  35. package/src/utils/ai-discovery.ts +1 -1
  36. package/src/utils/feed.ts +1 -1
  37. package/src/utils/public-routes.ts +14 -4
  38. package/src/utils/seo-document.ts +3 -2
  39. package/src/scripts/route-motion.ts +0 -340
  40. package/src/scripts/route-out.ts +0 -63
  41. package/src/scripts/smooth-scroll.ts +0 -139
  42. package/src/scripts/swup-router.ts +0 -580
  43. package/src/scripts/view-transitions.ts +0 -4
  44. package/src/utils/route-motion-policy.ts +0 -72
@@ -25,7 +25,7 @@ const { t } = createTranslator(siteConfig.lang || "zh-CN");
25
25
  <p data-stalux-motion-content>{t("page404.pageNotFound")}</p>
26
26
  <p class="agent-recovery" data-stalux-motion-content>
27
27
  This URL does not exist. Continue at the <a href="/">home page</a>, browse the
28
- <a href="/archives/">archive</a>, read <a href="/llms.txt">llms.txt</a>, or inspect
28
+ <a href="/archives">archive</a>, read <a href="/llms.txt">llms.txt</a>, or inspect
29
29
  the
30
30
  <a href="/sitemap-index.xml">sitemap</a>
31
31
  to find published content.
@@ -29,7 +29,7 @@ export const GET: APIRoute = async ({ logger }) => {
29
29
  categories: post.data.categories ?? [],
30
30
  desc: post.data.desc ?? "",
31
31
  wordCount: descriptions.get(String(post.data.abbrlink))?.wordCount ?? 0,
32
- url: sitePath(`posts/${encodeURIComponent(String(post.data.abbrlink))}/`),
32
+ url: sitePath(`posts/${encodeURIComponent(String(post.data.abbrlink))}`),
33
33
  }));
34
34
 
35
35
  return new Response(JSON.stringify(payload), {
@@ -19,6 +19,8 @@ export const GET: APIRoute = async ({ logger }) => {
19
19
  title: stalux?.title || "Stalux Blog",
20
20
  description: stalux?.description || "A blog powered by Stalux theme",
21
21
  site: stalux.url,
22
+ // 页面路由不带尾斜杠,feed 里的条目链接要与之保持一致
23
+ trailingSlash: false,
22
24
  items,
23
25
  customData: `<language>${langToFeedLanguage(lang)}</language>\n<copyright>${t("rss.copyright")}</copyright>`,
24
26
  xmlns: {
@@ -17,8 +17,8 @@ function generateCCFooter(post: CollectionEntry<"posts">, config: ConfigMap): st
17
17
  const baseUrl = (siteConfig.url as string) || "";
18
18
  const author = (config.get("author")?.name as string) || "";
19
19
  const postUrl = baseUrl
20
- ? `${baseUrl}/posts/${post.data.abbrlink}/`
21
- : `/posts/${post.data.abbrlink}/`;
20
+ ? `${baseUrl}/posts/${post.data.abbrlink}`
21
+ : `/posts/${post.data.abbrlink}`;
22
22
 
23
23
  const lines: string[] = [];
24
24
  lines.push(`**${t("post.author")}**${author}`);
@@ -19,6 +19,8 @@ export const GET: APIRoute = async ({ logger }) => {
19
19
  title: stalux?.title || "Stalux Blog",
20
20
  description: stalux?.description || "A blog powered by Stalux theme",
21
21
  site: stalux.url,
22
+ // 页面路由不带尾斜杠,feed 里的条目链接要与之保持一致
23
+ trailingSlash: false,
22
24
  items,
23
25
  customData: `<language>${langToFeedLanguage(lang)}</language>\n<copyright>${t("rss.copyright")}</copyright>`,
24
26
  xmlns: {
@@ -1,7 +1,6 @@
1
1
  /** Async native SDKs keep live DOM events out of worker proxies during Astro swaps. */
2
2
 
3
3
  import { createClientLogger } from "./logger";
4
- import { prepareRouteMotion, type RouteMotionEvent } from "./route-motion";
5
4
 
6
5
  const logger = createClientLogger("analytics");
7
6
 
@@ -32,7 +31,6 @@ const state = window.__staluxAnalyticsRuntime;
32
31
  state.scripts ??= new Map();
33
32
 
34
33
  type GooglePage = {
35
- ready: Promise<unknown>;
36
34
  payload: {
37
35
  page_location: string;
38
36
  page_path: string;
@@ -41,7 +39,6 @@ type GooglePage = {
41
39
  };
42
40
  };
43
41
  const googlePages: GooglePage[] = [];
44
- let transitionReady: Promise<unknown> = Promise.resolve();
45
42
  let googleScheduled = false;
46
43
  let googleSchedule = 0;
47
44
  let googleTimer: ReturnType<typeof setTimeout> | undefined;
@@ -77,9 +74,9 @@ function scheduleGooglePages(): void {
77
74
  // A burst of visits stays FIFO, with a separate task for each SDK call.
78
75
  scheduleGooglePages();
79
76
  };
80
- // A queued visit can outlive its own transition. Also wait for whichever
81
- // incoming snapshot is current when this task is scheduled.
82
- void Promise.all([page.ready, transitionReady]).then(() => {
77
+ // A queued visit can outlive the page it belongs to; only the paint
78
+ // ordering of the current document matters here.
79
+ void Promise.resolve(page).then(() => {
83
80
  if (schedule !== googleSchedule) return;
84
81
  // Let the routed content paint after native rendering resumes and its own
85
82
  // motion is installed. The timer also covers throttled/background frames.
@@ -336,7 +333,6 @@ function trackGooglePage(): void {
336
333
  // Capture the visit before yielding: another navigation must not replace its
337
334
  // URL, title or virtual referrer while the SDK is waiting for its task.
338
335
  googlePages.push({
339
- ready: transitionReady,
340
336
  payload: {
341
337
  page_location: window.location.href,
342
338
  page_path: window.location.pathname + window.location.search,
@@ -439,11 +435,10 @@ if (state.installed && (!state.native || state.revision !== 4)) {
439
435
  state.native = true;
440
436
  state.revision = 4;
441
437
  state.installed = true;
442
- document.addEventListener("astro:before-swap", (event) => {
438
+ document.addEventListener("astro:before-swap", () => {
443
439
  pendingEarlyView++;
444
440
  earlyViewPending = false;
445
441
  viewedEarly = false;
446
- transitionReady = prepareRouteMotion(event as Event & RouteMotionEvent).ready;
447
442
  // Invalidate an older page's frames, timer and posted task before this
448
443
  // incoming snapshot starts. Its captured visit remains in the FIFO.
449
444
  cancelGoogleSchedule();
@@ -11,10 +11,6 @@ const MAX_ITEMS = 16;
11
11
  const STAGGER_MS = 22;
12
12
  const MAX_DELAY_MS = 200;
13
13
  const DURATION_MS = 190;
14
- // When a route cue is already moving the page body, the sheet waits for it to
15
- // mostly settle before unrolling. Starting both at once makes the rows wipe
16
- // open while the whole page is still semi-transparent, which reads as a smudge.
17
- const ROUTE_LEAD_IN_MS = 75;
18
14
  // Strong ease-out: the row arrives fast and settles softly. The built-in
19
15
  // ease-out is too weak to read at this size.
20
16
  const EASING = "cubic-bezier(0.23, 1, 0.32, 1)";
@@ -59,9 +55,7 @@ function canReveal(): boolean {
59
55
  if (typeof IntersectionObserver !== "function") return false;
60
56
  if (typeof document === "undefined") return false;
61
57
  if (document.hidden) return false;
62
- if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return false;
63
- // Returning to a history entry restores what the reader already saw.
64
- return document.documentElement.dataset.staluxVtPreset !== "restore";
58
+ return !window.matchMedia("(prefers-reduced-motion: reduce)").matches;
65
59
  }
66
60
 
67
61
  function groups(): Element[] {
@@ -102,11 +96,6 @@ function staggerOf(index: number): number {
102
96
  return Math.min(index * STAGGER_MS, MAX_DELAY_MS);
103
97
  }
104
98
 
105
- function leadIn(): number {
106
- // A route cue leaves its preset on the document element while it runs.
107
- return document.documentElement.dataset.staluxVtPreset ? ROUTE_LEAD_IN_MS : 0;
108
- }
109
-
110
99
  /**
111
100
  * Hold every incoming row on the wipe's first frame the moment the router has
112
101
  * its new document, before the browser paints it.
@@ -201,7 +190,6 @@ export function mountListReveal(): (() => void) | undefined {
201
190
  };
202
191
  const reveal = (container: Element) => {
203
192
  if (document.hidden || preference.matches) return;
204
- const lead = leadIn();
205
193
  for (const [index, row] of rows(container).entries()) {
206
194
  if (typeof row.animate !== "function") continue;
207
195
  // Prefer the effect created during the swap: it already owns the
@@ -216,7 +204,7 @@ export function mountListReveal(): (() => void) | undefined {
216
204
  primed?.animation ??
217
205
  row.animate(UNROLL_KEYFRAMES, {
218
206
  duration: DURATION_MS,
219
- delay: lead + staggerOf(index),
207
+ delay: staggerOf(index),
220
208
  easing: EASING,
221
209
  // Hidden during the stagger delay instead of popping in.
222
210
  fill: "backwards",
@@ -224,7 +212,7 @@ export function mountListReveal(): (() => void) | undefined {
224
212
  if (primed) {
225
213
  // The stagger is counted from now, not from the swap.
226
214
  primed.animation.effect?.updateTiming({
227
- delay: lead + primed.stagger,
215
+ delay: primed.stagger,
228
216
  });
229
217
  primed.animation.play();
230
218
  }
@@ -27,13 +27,12 @@ export function mountModuleMotion(): (() => void) | undefined {
27
27
  // so the observer's target needs no assertion.
28
28
  const element = entry.target;
29
29
  observer.unobserve(element);
30
- // The router owns a single bounded lead region. Do not layer an
31
- // observer entry over that motion or make long comments slide.
30
+ // The router owns the swap. Do not layer an observer entry over
31
+ // it or make long comments slide.
32
32
  if (
33
33
  document.hidden ||
34
34
  motionPreference.matches ||
35
35
  document.documentElement.classList.contains("is-changing") ||
36
- document.documentElement.dataset.staluxVtPreset ||
37
36
  // A persisted node kept its identity across the visit; it was
38
37
  // never rebuilt, so re-entering it would be a second cue.
39
38
  element.closest("[data-swup-persist]") ||
@@ -1,4 +1,3 @@
1
- import SwupScriptsPlugin from "@swup/scripts-plugin";
2
1
  import { createClientLogger } from "./logger";
3
2
 
4
3
  const logger = createClientLogger("navigation-scripts");
@@ -28,12 +27,18 @@ const javascript = new Set([
28
27
  ]);
29
28
 
30
29
  /**
31
- * Scripts Plugin owns script recreation. Astro's page-load event additionally
32
- * needs an ordered completion barrier and once-per-session module semantics.
33
- * Disable the plugin's automatic whole-document pass: that would also replay
34
- * analytics SDKs and scripts in retained shells on every navigation.
30
+ * The theme owns script execution instead of the swup scripts plugin: Astro's
31
+ * page-load event needs an ordered completion barrier and once-per-session
32
+ * semantics. The plugin's whole-document pass would also replay analytics SDKs
33
+ * and the scripts of retained shells on every visit.
35
34
  */
36
- export const navigationScripts = new SwupScriptsPlugin({ head: false, body: false });
35
+ function runScript(from: HTMLScriptElement): HTMLScriptElement {
36
+ const script = document.createElement("script");
37
+ for (const { name, value } of from.attributes) script.setAttribute(name, value);
38
+ script.textContent = from.textContent;
39
+ from.replaceWith(script);
40
+ return script;
41
+ }
37
42
 
38
43
  function describeScript(script: HTMLScriptElement, base: string) {
39
44
  const type = (script.getAttribute("type") ?? "").trim().toLowerCase();
@@ -112,7 +117,7 @@ export function prepareNavigationScripts(
112
117
  );
113
118
  if (copy) copy.replaceWith(inert);
114
119
  else (item.head ? document.head : document.body).append(inert);
115
- const script = navigationScripts.runScript(inert);
120
+ const script = runScript(inert);
116
121
  script.async = false;
117
122
  executedNodes.add(script);
118
123
  let observed = script;
@@ -0,0 +1,200 @@
1
+ /**
2
+ * The three correctness guards `@swup/astro` cannot express as options.
3
+ *
4
+ * `@swup/astro` builds and owns the Swup instance, so the theme attaches these
5
+ * as hooks on `window.swup` instead of writing its own `new Swup({...})`:
6
+ *
7
+ * 1. Page scripts run once per session (analytics SDKs must not be replayed)
8
+ * but new pages must still boot their own modules.
9
+ * 2. A superseded visit may be revived by swup's post-abort state reset and
10
+ * would then replace the page the reader is already looking at.
11
+ * 3. The head plugin keeps old stylesheets readable while the incoming sheet
12
+ * loads; whoever put them there has to remove the ones the new page does
13
+ * not use, or a long session grows the head without bound.
14
+ */
15
+ import type Swup from "swup";
16
+ import type { Visit } from "swup";
17
+ import { getRouteKind } from "../utils/public-routes";
18
+ import { installBackToTop } from "./back-to-top";
19
+ import "./navigation-client";
20
+ import { prepareNavigationFont } from "./navigation-font";
21
+ import { prepareNavigationScripts } from "./navigation-scripts";
22
+ import { hydrateShells, markRetainedShells } from "./shell-hydration";
23
+
24
+ const MAIN = "#swup-main";
25
+ const MAX_CACHED_PAGES = 32;
26
+
27
+ /** Theme-authored styles for the page on screen, and the ones it does not share. */
28
+ let authoredStyles: Element[] = [];
29
+ let obsoleteStyles: Element[] = [];
30
+
31
+ const runners = new WeakMap<Visit, () => Promise<void>>();
32
+ const scripts = new WeakMap<Visit, Promise<void>>();
33
+ const controllers = new WeakMap<Visit, AbortController>();
34
+
35
+ let installed = false;
36
+
37
+ /**
38
+ * Swup marks a superseded visit aborted, but its awaited `visit:start` chain
39
+ * still resumes and resets the state to `started`, reviving it. Aborting again
40
+ * at the transition boundary stops the rest of its chain: every hook handler
41
+ * and the default renderer are skipped for a done visit.
42
+ */
43
+ function abortSuperseded(swup: Swup, visit: Visit): void {
44
+ if (visit !== swup.visit) visit.abort();
45
+ }
46
+
47
+ function abortScripts(visit: Visit): void {
48
+ controllers.get(visit)?.abort();
49
+ }
50
+
51
+ function setRoute(visit: Visit): void {
52
+ const route = visit.to.route ?? getRouteKind(visit.to.url);
53
+ document.documentElement.dataset.staluxRoute = route;
54
+ document.querySelector(MAIN)?.setAttribute("data-stalux-route", route);
55
+ }
56
+
57
+ /** Capture what belongs to the outgoing page while it is still on screen. */
58
+ async function prepare(visit: Visit): Promise<void> {
59
+ const next = visit.to.document;
60
+ if (!next) return;
61
+ markRetainedShells();
62
+ const incoming = [...next.head.querySelectorAll("style,link[rel=stylesheet]")];
63
+ obsoleteStyles = authoredStyles.filter(
64
+ (element) => !incoming.some((other) => element.isEqualNode(other)),
65
+ );
66
+ const controller = new AbortController();
67
+ controllers.set(visit, controller);
68
+ // The destination page's body font gets a bounded head start so the first
69
+ // painted frame is already in the right face; a slow font never blocks.
70
+ await prepareNavigationFont(next, controller.signal);
71
+ // Resolved against the target URL: the parsed document has no usable base.
72
+ const baseUrl = new URL(visit.to.url, window.location.origin).href;
73
+ const run = prepareNavigationScripts(next, { baseUrl });
74
+ runners.set(visit, () => {
75
+ const started = run(controller.signal);
76
+ scripts.set(visit, started);
77
+ return started;
78
+ });
79
+ }
80
+
81
+ /** Bring the incoming page's own content and assets online. */
82
+ function settle(visit: Visit): void {
83
+ const next = visit.to.document;
84
+ // A link navigation always lands at the top. Doing it here, before
85
+ // `astro:after-swap` and before any page script runs, keeps every later
86
+ // measurement (shell slots, list reveals) on the final scroll position
87
+ // instead of the one the outgoing page left behind. History entries and
88
+ // hash targets keep whatever position the browser restores.
89
+ if (
90
+ !(visit.history.popstate || visit.to.hash) &&
91
+ (window.scrollY !== 0 || window.scrollX !== 0)
92
+ ) {
93
+ window.scrollTo({ top: 0, left: 0, behavior: "instant" });
94
+ }
95
+ // Kept shells take the incoming lists before any page module mounts.
96
+ hydrateShells(next);
97
+ for (const element of obsoleteStyles) element.remove();
98
+ obsoleteStyles = [];
99
+ // Only styles the incoming page also has stay tracked: anything a live SDK
100
+ // injected is not authored by the theme and must never be pruned.
101
+ const incoming = [...(next?.head.querySelectorAll("style,link[rel=stylesheet]") ?? [])];
102
+ authoredStyles = [...document.head.querySelectorAll("style,link[rel=stylesheet]")].filter(
103
+ (element) => incoming.some((other) => element.isEqualNode(other)),
104
+ );
105
+ setRoute(visit);
106
+ // `@swup/astro` always turns on the route-name plugin's `paths` classes
107
+ // (`from-*` / `to-*` on <html>) when routes are configured, and the plugin
108
+ // only ever removes `from-*`. Clearing both here keeps the document element
109
+ // from collecting one `to-*` class per visited page.
110
+ for (const name of [...document.documentElement.classList]) {
111
+ if (name.startsWith("to-") || name.startsWith("from-")) {
112
+ document.documentElement.classList.remove(name);
113
+ }
114
+ }
115
+ runners.get(visit)?.();
116
+ }
117
+
118
+ function install(swup: Swup): void {
119
+ if (installed) return;
120
+ installed = true;
121
+ authoredStyles = [...document.head.querySelectorAll("style,link[rel=stylesheet]")];
122
+ // The instance's first visit is created with an empty URL, so the current
123
+ // route comes from the document instead.
124
+ document.documentElement.dataset.staluxRoute = getRouteKind(window.location.pathname);
125
+ swup.hooks.before("visit:transition", (visit) => abortSuperseded(swup, visit), {
126
+ priority: -1000,
127
+ });
128
+ // `visit:transition` runs only after the target document has been fetched, so
129
+ // a burst of clicks queues several fetches and the oldest one wins the race:
130
+ // the reader ends up on the second link they clicked, not the last. Retire
131
+ // the previous visit the moment a newer one starts.
132
+ let previous: Visit | undefined;
133
+ swup.hooks.on("visit:start", (visit) => {
134
+ if (previous && previous !== visit && !previous.done) previous.abort();
135
+ previous = visit;
136
+ });
137
+ swup.hooks.on("visit:abort", abortScripts);
138
+ swup.hooks.on("visit:fail", abortScripts);
139
+ swup.hooks.before("content:replace", prepare, { priority: -1000 });
140
+ swup.hooks.on("content:replace", settle, { priority: -1000 });
141
+ // `@swup/astro` dispatches `astro:page-load` from its own `page:view`
142
+ // handler, so the page scripts have to be live before it runs.
143
+ swup.hooks.on(
144
+ "page:view",
145
+ async (visit) => {
146
+ await scripts.get(visit);
147
+ },
148
+ { priority: -1000 },
149
+ );
150
+ // The cache is a session-long map of parsed documents.
151
+ swup.hooks.on("cache:set", () => {
152
+ while (swup.cache.size > MAX_CACHED_PAGES) {
153
+ const oldest = swup.cache.all.keys().next();
154
+ if (oldest.done) break;
155
+ swup.cache.delete(oldest.value);
156
+ }
157
+ });
158
+
159
+ if (import.meta.env.DEV) {
160
+ void import("virtual:stalux-swup-debug")
161
+ .then(({ default: Debug }) => {
162
+ if (Debug) swup.use(new Debug());
163
+ })
164
+ .catch(() => {
165
+ // The debug plugin is an optional devDependency.
166
+ });
167
+ }
168
+ }
169
+
170
+ // Neither of these needs the Swup instance, and both are expected on the very
171
+ // first document: doing them here keeps them off the instance that
172
+ // `@swup/astro` may still be creating.
173
+ installBackToTop();
174
+ // Astro dispatches `astro:page-load` for the first document; the swup
175
+ // integration only dispatches it after a visit.
176
+ const initialLoad = () => document.dispatchEvent(new Event("astro:page-load"));
177
+ if (document.readyState === "loading") {
178
+ document.addEventListener("DOMContentLoaded", initialLoad, { once: true });
179
+ } else queueMicrotask(initialLoad);
180
+
181
+ /**
182
+ * Attach the guards to the instance `@swup/astro` created.
183
+ *
184
+ * The init script is injected by the swup integration and this module by the
185
+ * theme's own, so the evaluation order is not guaranteed. If the instance is
186
+ * not there yet, the first hook event swup dispatches installs the guards.
187
+ */
188
+ export function installRouteGuards(): void {
189
+ if (window.swup) {
190
+ install(window.swup);
191
+ return;
192
+ }
193
+ document.addEventListener(
194
+ "swup:any",
195
+ () => {
196
+ if (window.swup) install(window.swup);
197
+ },
198
+ { once: true },
199
+ );
200
+ }
@@ -28,4 +28,19 @@ declare module "swup" {
28
28
  */
29
29
  abort(): void;
30
30
  }
31
+ /**
32
+ * Added by `@swup/route-name-plugin`, which `@swup/astro` instantiates from
33
+ * its own package. The theme never imports the plugin, so its augmentation
34
+ * has to be restored here for `visit.to.route` to typecheck.
35
+ */
36
+ interface VisitTo {
37
+ route?: string;
38
+ }
39
+ interface Swup {
40
+ /**
41
+ * Added by `@swup/preload-plugin`, enabled through `@swup/astro`; used by
42
+ * `route-prefetch.ts` to warm the main navigation routes.
43
+ */
44
+ preload?: (url: string, options?: { priority?: boolean }) => Promise<unknown>;
45
+ }
31
46
  }
@@ -149,7 +149,6 @@
149
149
 
150
150
  /* 卡片和标签颜色 Token(可在这里统一调整主题色/透明度) */
151
151
  --card-bg: var(--surface-glass);
152
- --card-border: rgb(255 255 255 / 0.1);
153
152
  --card-box-shadow: 0 10px 24px rgb(0 0 0 / 0.08);
154
153
  --card-box-shadow-hover: 0 14px 28px rgb(0 0 0 / 0.12);
155
154
 
@@ -202,10 +201,6 @@
202
201
  --transition-medium: 0.2s ease;
203
202
  --transition-normal: 0.25s ease;
204
203
  --transition-slow: 0.3s ease;
205
- --transition-slower: 0.5s ease;
206
- --transition-slowest: 0.6s ease;
207
-
208
- --easing-bounce: cubic-bezier(0.175, 0.885, 0.32, 1.275);
209
204
 
210
205
  /* 常用间距值 */
211
206
  --space-2xs: 0.25rem;
@@ -231,9 +226,6 @@
231
226
  --shadow-sidebar:
232
227
  0 16px 20px -12px rgb(0 0 0 / 0.84), 10px 4px 16px -12px rgb(0 0 0 / 0.58),
233
228
  -10px 4px 16px -12px rgb(0 0 0 / 0.58);
234
- --shadow-raised-hover:
235
- 0 20px 24px -13px rgb(0 0 0 / 0.9), 12px 5px 18px -13px rgb(0 0 0 / 0.68),
236
- -12px 5px 18px -13px rgb(0 0 0 / 0.68);
237
229
  --shadow-dark: rgb(0 0 0 / 0.753);
238
230
 
239
231
  /* 语义化颜色 */
@@ -1,2 +1,2 @@
1
- @layer theme,base;@layer components{.stalux-prose{font-family:var(--font-body), "Noto Sans SC", "Noto Sans CJK SC", system-ui, -apple-system, sans-serif;font-size:var(--font-size-base);color:var(--white-85p);text-rendering:optimizelegibility;line-height:1.75}.stalux-prose h1,.stalux-prose h2,.stalux-prose h3,.stalux-prose h4,.stalux-prose h5,.stalux-prose h6{color:var(--white-full);margin-top:var(--space-xl);margin-bottom:var(--space-md);font-weight:600;line-height:1.3}.stalux-prose h1{margin-top:2.5rem;margin-bottom:var(--space-lg);border-bottom:3px solid var(--accent-50p);padding-bottom:.6rem;font-size:2.6rem;font-weight:700;line-height:1.25}.stalux-prose h2{border-bottom:2px solid var(--accent-30p);margin-top:2.5rem;padding-bottom:.4rem;font-size:2rem;font-weight:650}.stalux-prose h3{color:var(--white-95p);margin-top:2rem;font-size:1.5rem;line-height:1.4}.stalux-prose h4{color:var(--white-90p);margin-top:1.5rem;margin-bottom:.6rem;font-size:1.25rem;line-height:1.45}.stalux-prose h5{color:var(--white-90p);margin-top:1.5rem;margin-bottom:.5rem;font-size:1.1rem;line-height:1.5}.stalux-prose h6{color:var(--white-80p);margin-top:1.5rem;margin-bottom:.5rem;font-size:1rem;line-height:1.5}.stalux-prose p{margin:0 0 var(--space-lg);line-height:1.75}.stalux-prose .stalux-pagination-content{line-height:inherit;margin:0}.stalux-prose strong{color:#ffd966;font-weight:600}.stalux-prose em{color:var(--white-85p);font-style:italic}.stalux-prose strong em,.stalux-prose em strong{color:#ffd966}.stalux-prose del{color:var(--white-60p)}.stalux-prose mark{color:inherit;background-color:#ffd96640;border-radius:2px;padding:.1em .2em}.stalux-prose kbd{font-family:var(--font-code), "JetBrains Mono", "Fira Code", "Consolas", "Courier New", monospace;background-color:var(--white-10p);border:1px solid var(--white-20p);color:var(--white-85p);border-radius:4px;padding:.15em .4em;font-size:.85em}.stalux-prose sup,.stalux-prose sub{font-size:.8em}.stalux-prose a{color:var(--accent-80p);text-underline-offset:.2em;transition:color var(--transition-fast), text-decoration-color var(--transition-fast);overflow-wrap:anywhere;text-decoration-line:underline;text-decoration-color:#0000;text-decoration-thickness:2px}.stalux-prose a:focus-visible{color:var(--accent-90p);text-decoration-color:var(--accent-60p)}@media (hover:hover) and (pointer:fine){.stalux-prose a:hover{color:var(--accent-90p);text-decoration-color:var(--accent-60p)}}.stalux-prose code{font-family:var(--font-code), "JetBrains Mono", "Fira Code", "Consolas", "Courier New", monospace;color:#ff92d0;background-color:#ff79c626;border:1px solid #ff79c640;border-radius:4px;padding:.2em .4em;font-size:.88em}.stalux-prose pre{background:var(--black-30p);color:var(--white-85p);border-left:4px solid var(--accent-60p);margin:var(--space-xl) 0;font-size:.92em;line-height:1.65;font-family:var(--font-code), "JetBrains Mono", "Fira Code", "Consolas", "Courier New", monospace;box-shadow:var(--shadow-md);border-radius:8px;padding:1.2rem 1.5rem;overflow-x:auto}.stalux-prose pre code{color:inherit;font-size:inherit;background:0 0;border:none;padding:0;font-family:inherit}.expressive-code pre,.expressive-code code{all:revert}.stalux-prose ul,.stalux-prose ol{margin:0 0 var(--space-lg);padding-left:1.75rem}.stalux-prose li{color:var(--white-85p);margin:.4rem 0;line-height:1.75}.stalux-prose ul li{list-style:outside}.stalux-prose ul li ul li{list-style:circle}.stalux-prose ul li ul li ul li{list-style:square}.stalux-prose ol li{list-style:decimal}.stalux-prose ol li ol li{list-style:lower-alpha}.stalux-prose li>ul,.stalux-prose li>ol{margin-top:.3rem;margin-bottom:.3rem}.stalux-prose blockquote{margin:var(--space-xl) 0;border-left:4px solid var(--accent-60p);background:var(--surface-glass);border-top:1px solid var(--white-10p);border-right:1px solid var(--white-10p);border-bottom:1px solid var(--white-10p);color:var(--white-85p);border-radius:12px;padding:1rem 1.5rem;box-shadow:0 4px 16px #0002}.stalux-prose blockquote p{margin:0;line-height:1.7}.stalux-prose blockquote p+p{margin-top:.8rem}.stalux-prose blockquote strong{color:#ffd966}.stalux-prose blockquote code{font-size:.85em}.stalux-prose table{border-collapse:collapse;width:100%;margin:var(--space-xl) 0;box-shadow:var(--shadow-md);border-radius:8px;display:block;overflow:auto hidden}.stalux-prose th,.stalux-prose td{text-align:left;border-bottom:1px solid var(--white-10p);padding:.75rem 1rem;line-height:1.6}.stalux-prose th{white-space:nowrap;background:var(--accent-30p);color:var(--white-full);font-size:.95em;font-weight:600}.stalux-prose td{color:var(--white-85p)}.stalux-prose tr:nth-child(2n) td{background-color:var(--white-05p)}@media (hover:hover) and (pointer:fine){.stalux-prose tr:hover td{background-color:var(--black-10p)}}.stalux-prose table code{font-size:.85em}.stalux-prose img{max-width:100%;height:auto;margin:var(--space-xl) auto;box-shadow:var(--shadow-lg);transition:transform var(--transition-normal), box-shadow var(--transition-normal);border-radius:8px;display:block}@media (hover:hover) and (pointer:fine){.stalux-prose img:hover{box-shadow:var(--shadow-xl);transform:none}}.stalux-prose embed,.stalux-prose video{max-width:100%;height:auto;margin:var(--space-xl) auto;border-radius:8px;display:block}.stalux-prose hr{margin:var(--space-2xl) 0;background:linear-gradient(90deg, transparent, var(--white-15p) 20%, var(--accent-40p) 50%, var(--white-15p) 80%, transparent);border:none;height:1.5px}.stalux-prose details{margin:var(--space-lg) 0;background-color:var(--white-05p);border:1px solid var(--white-10p);transition:border-color var(--transition-fast);border-radius:6px;padding:.8rem 1rem}@media (hover:hover) and (pointer:fine){.stalux-prose details:hover{border-color:var(--white-20p)}}.stalux-prose summary{cursor:pointer;color:var(--white-90p);font-weight:600}.stalux-prose details[open] summary{border-bottom:1px solid var(--white-10p);margin-bottom:.8rem;padding-bottom:.6rem}.stalux-prose figure{text-align:center;margin:var(--space-xl) 0}.stalux-prose figcaption{color:var(--white-70p);margin-top:.5rem;font-size:.9em;font-style:italic}.stalux-prose figure[data-stalux-image]>figcaption{color:var(--muted-text);overflow-wrap:anywhere;font-size:.85rem;font-style:normal;line-height:1.6}.stalux-prose .footnotes{color:var(--white-75p);border-top:1px solid var(--white-15p);margin-top:var(--space-2xl);padding-top:var(--space-lg);font-size:.88em}.stalux-prose .footnotes ol{margin-left:1rem;padding-left:.5rem}.stalux-prose .footnotes li{margin:.5rem 0;line-height:1.6}.stalux-prose .footnotes a{font-size:.9em}@media (width<=1024px){.stalux-prose{font-size:1.05rem}.stalux-prose h1{font-size:2.2rem}.stalux-prose h2{font-size:1.8rem}.stalux-prose h3{font-size:1.35rem}.stalux-prose h4{font-size:1.15rem}.stalux-prose pre{padding:1rem 1.2rem;font-size:.88em}}@media (width<=768px){.stalux-prose{font-size:1rem;line-height:1.7}.stalux-prose h1{margin-top:1.5rem;font-size:1.8rem}.stalux-prose h2{margin-top:1.5rem;font-size:1.4rem}.stalux-prose h3{margin-top:1.25rem;font-size:1.2rem}.stalux-prose h4{margin-top:1rem;font-size:1.1rem}.stalux-prose h5{font-size:1rem}.stalux-prose h6{font-size:.95rem}.stalux-prose p{margin-bottom:var(--space-md)}.stalux-prose pre{margin:var(--space-lg) 0;border-left-width:3px;padding:.8rem 1rem;font-size:.82em}.stalux-prose table{font-size:.85rem}.stalux-prose th,.stalux-prose td{padding:.5rem .7rem}.stalux-prose blockquote{padding:.8rem 1rem;font-size:.9em}.stalux-prose ul,.stalux-prose ol{padding-left:1.5rem}}.stalux-prose,.stalux-prose>*,.stalux-prose div,.stalux-prose .expressive-code,.stalux-prose .expressive-code .frame{box-sizing:border-box;min-width:0;max-width:100%}.stalux-prose{overflow-wrap:anywhere}.stalux-prose a:after{content:none}.stalux-prose a{text-decoration-color:var(--accent-50p);text-decoration-thickness:1px}.stalux-prose a:has(img){text-decoration:none}.stalux-prose pre,.stalux-prose table,.stalux-prose .mermaid,.stalux-prose math{overscroll-behavior-x:contain;max-width:100%;overflow-x:auto}.stalux-prose pre,.stalux-prose pre code{overflow-wrap:normal;word-break:normal}.stalux-prose :is(img,video,iframe,embed,svg,canvas){max-width:100%}.stalux-prose :is(img,video,svg,canvas){height:auto}.stalux-prose iframe{margin:var(--space-xl) auto;border-radius:8px;display:block}.stalux-prose .mermaid svg{max-width:none}.stalux-prose canvas{box-sizing:border-box}.stalux-prose summary{overflow-wrap:anywhere}}@layer utilities;@font-face{font-family:Stalux Math Aux;src:url(/fonts/StaluxMathAux.woff2)format("woff2");font-weight:400;font-style:normal}@font-face{font-family:Latin Modern Math;src:url(/fonts/latinmodern-math.woff2)format("woff2");font-display:swap}math{font-size-adjust:none;text-indent:0;text-transform:none;letter-spacing:normal;word-wrap:normal;font-feature-settings:"dtls" off;font-style:normal;font-weight:400;line-height:normal;font-family:"Latin Modern Math", var(--font-body), math;direction:ltr}math *{border-color:currentColor}math.tml-display{width:100%;display:block}.mathscr{font-family:Stalux Math Aux,serif}mfrac>:nth-child(2),msqrt,mover>:first-child{math-shift:compact}.menclose{padding:.5ex 0;display:inline-block;position:relative}.tml-cancelto{background-color:currentColor;padding:.5ex 0;display:inline-block;position:absolute;top:0;left:0;-webkit-mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><defs><marker id='a' markerHeight='5' markerUnits='strokeWidth' markerWidth='7' orient='auto' refX='7' refY='2.5'><path fill='black' d='m0 0 7 2.5L0 5z'/></marker></defs><line x2='100%25' y1='100%25' stroke='black' stroke-width='.06em' marker-end='url(%23a)' vector-effect='non-scaling-stroke'/></svg>");mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><defs><marker id='a' markerHeight='5' markerUnits='strokeWidth' markerWidth='7' orient='auto' refX='7' refY='2.5'><path fill='black' d='m0 0 7 2.5L0 5z'/></marker></defs><line x2='100%25' y1='100%25' stroke='black' stroke-width='.06em' marker-end='url(%23a)' vector-effect='non-scaling-stroke'/></svg>");-webkit-mask-position:0 0;mask-position:0 0;-webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@-moz-document url-prefix(){math{display:inline}math>mrow{padding:0}mtd,mtable.tml-small mtd{padding-top:0;padding-bottom:0}mtable.tml-jot mtd{padding-top:.2ex;padding-bottom:0}.tml-vec{transform:scale(.75)}.ff-narrow{width:0}.ff-nudge-left{margin-left:-.2em}.ff-squash mtd{height:0;display:block}}@supports not ((-moz-appearance:none)){mo.tml-prime{font-family:Stalux Math Aux,serif}.tml-sml-pad{padding-left:.05em}.tml-med-pad{padding-left:.1em}.tml-lrg-pad{padding-left:.15em}}@supports ((-webkit-backdrop-filter:blur(1px))){.wbk-acc{transform:translateY(.431em)}.wbk-sml{transform:translate(.07em)}.wbk-sml-acc{transform:translate(.07em,.431em)}.wbk-sml-vec{transform:scale(.75)translate(.07em)}.wbk-med{transform:translate(.14em)}.wbk-med-acc{transform:translate(.14em,.431em)}.wbk-med-vec{transform:scale(.75)translate(.14em)}.wbk-lrg{transform:translate(.21em)}.wbk-lrg-acc{transform:translate(.21em,.431em)}.wbk-lrg-vec{transform:scale(.75)translate(.21em)}}@supports (not ((-webkit-backdrop-filter:blur(1px)))) and (not ((-moz-appearance:none))){.chr-sml{transform:translate(.07em)}.chr-sml-vec{transform:scale(.75)translate(.07em)}.chr-med{transform:translate(.14em)}.chr-med-vec{transform:scale(.75)translate(.14em)}.chr-lrg{transform:translate(.21em)}.chr-lrg-vec{transform:scale(.75)translate(.21em)}.tml-shift-left{margin-left:-100%}menclose{padding:.5ex 0;position:relative}.tml-overline{border-top:.065em solid;padding:.1em 0 0}.tml-underline{border-bottom:.065em solid;padding:0 0 .1em}.tml-cancel{background-color:currentColor;width:100%;height:100%;display:inline-block;position:absolute;bottom:0;left:.5px}.upstrike{clip-path:polygon(.05em 100%,0 calc(100% - .05em),calc(100% - .05em) 0,100% .05em)}.downstrike{clip-path:polygon(0 .05em,.05em 0,100% calc(100% - .05em),calc(100% - .05em) 100%)}.sout{clip-path:polygon(0 calc(55% + .0333em),0 calc(55% - .0333em),100% calc(55% - .0333em),100% calc(55% + .0333em))}.tml-xcancel{clip-path:polygon(.05em 0,0 .05em,calc(50% - .05em) 50%,0 calc(100% - .05em),.05em 100%,50% calc(50% + .05em),calc(100% - .05em) 100%,100% calc(100% - .05em),calc(50% + .05em) 50%,100% .05em,calc(100% - .05em) 0%,50% calc(50% - .05em))}.longdiv-top{border-top:.067em solid;padding:.1em .2em .2em .433em}.longdiv-arc{clip-path:inset(0 0 0 .4em);box-sizing:border-box;border:.067em solid;border-radius:70%;width:.7em;position:absolute;top:0;bottom:.1em;left:-.4em;transform:translateY(-.067em)}.menclose{text-align:left;display:inline-block;position:relative}.phasor-bottom{border-bottom:.067em solid;padding:.2em .2em .1em .6em}.phasor-angle{aspect-ratio:.5;clip-path:polygon(.05em 100%,0 calc(100% - .05em),calc(100% - .05em) 0,100% .05em);background-color:currentColor;height:100%;display:inline-block;position:absolute;bottom:-.04em;left:.5px}.tml-fbox{border:1px solid;padding:3pt}.circle-pad{padding:.267em}.textcircle{border:.067em solid;border-radius:50%;position:absolute;inset:0}.actuarial{border-style:solid;border-width:.08em .08em 0 0;margin-right:.03889em;padding:.03889em .03889em 0}.tml-crooked-2{transform:scale(2,1.1)}.tml-crooked-3{transform:scale(3,1.3)}.tml-crooked-4{transform:scale(4,1.4)}.tml-right{text-align:-webkit-right}.tml-left{text-align:-webkit-left}}menclose{-webkit-print-color-adjust:exact;print-color-adjust:exact}.tml-right{text-align:right}.tml-left{text-align:left}.special-fraction{font-family:Times New Roman,Times,STIX TWO,Tinos,serif}math{flex-wrap:wrap;align-items:baseline;display:inline-flex}math>mrow{padding:.5ex 0}mtable.tml-jot mtd{padding-top:.7ex;padding-bottom:.7ex}mtable.tml-small mtd{padding-top:.35ex;padding-bottom:.35ex}.tml-shift-left{margin-left:-200%}.tml-eqn:before{counter-increment:tmlEqnNo;content:"(" counter(tmlEqnNo) ")"}body{counter-reset:tmlEqnNo}
1
+ @layer theme,base;@layer components{.stalux-prose{font-family:var(--font-body), "Noto Sans SC", "Noto Sans CJK SC", system-ui, -apple-system, sans-serif;font-size:var(--font-size-base);color:var(--white-85p);text-rendering:optimizelegibility;line-height:1.75}.stalux-prose h1,.stalux-prose h2,.stalux-prose h3,.stalux-prose h4,.stalux-prose h5,.stalux-prose h6{color:var(--white-full);margin-top:var(--space-xl);margin-bottom:var(--space-md);font-weight:600;line-height:1.3}.stalux-prose h1{margin-top:2.5rem;margin-bottom:var(--space-lg);border-bottom:3px solid var(--accent-50p);padding-bottom:.6rem;font-size:2.6rem;font-weight:700;line-height:1.25}.stalux-prose h2{border-bottom:2px solid var(--accent-30p);margin-top:2.5rem;padding-bottom:.4rem;font-size:2rem;font-weight:650}.stalux-prose h3{color:var(--white-95p);margin-top:2rem;font-size:1.5rem;line-height:1.4}.stalux-prose h4{color:var(--white-90p);margin-top:1.5rem;margin-bottom:.6rem;font-size:1.25rem;line-height:1.45}.stalux-prose h5{color:var(--white-90p);margin-top:1.5rem;margin-bottom:.5rem;font-size:1.1rem;line-height:1.5}.stalux-prose h6{color:var(--white-80p);margin-top:1.5rem;margin-bottom:.5rem;font-size:1rem;line-height:1.5}.stalux-prose p{margin:0 0 var(--space-lg);line-height:1.75}.stalux-prose .stalux-pagination-content{line-height:inherit;margin:0}.stalux-prose strong{color:#ffd966;font-weight:600}.stalux-prose em{color:var(--white-85p);font-style:italic}.stalux-prose strong em,.stalux-prose em strong{color:#ffd966}.stalux-prose del{color:var(--white-60p)}.stalux-prose mark{color:inherit;background-color:#ffd96640;border-radius:2px;padding:.1em .2em}.stalux-prose kbd{font-family:var(--font-code), "JetBrains Mono", "Fira Code", "Consolas", "Courier New", monospace;background-color:var(--white-10p);border:1px solid var(--white-20p);color:var(--white-85p);border-radius:4px;padding:.15em .4em;font-size:.85em}.stalux-prose sup,.stalux-prose sub{font-size:.8em}.stalux-prose a{color:var(--accent-80p);text-underline-offset:.2em;transition:color var(--transition-fast), text-decoration-color var(--transition-fast);overflow-wrap:anywhere;text-decoration-line:underline;text-decoration-color:#0000;text-decoration-thickness:2px}.stalux-prose a:focus-visible{color:var(--accent-90p);text-decoration-color:var(--accent-60p)}@media (hover:hover) and (pointer:fine){.stalux-prose a:hover{color:var(--accent-90p);text-decoration-color:var(--accent-60p)}}.stalux-prose code{font-family:var(--font-code), "JetBrains Mono", "Fira Code", "Consolas", "Courier New", monospace;color:#ff92d0;background-color:#ff79c626;border:1px solid #ff79c640;border-radius:4px;padding:.2em .4em;font-size:.88em}.stalux-prose pre{background:var(--black-30p);color:var(--white-85p);border-left:4px solid var(--accent-60p);margin:var(--space-xl) 0;font-size:.92em;line-height:1.65;font-family:var(--font-code), "JetBrains Mono", "Fira Code", "Consolas", "Courier New", monospace;box-shadow:var(--shadow-md);border-radius:8px;padding:1.2rem 1.5rem;overflow-x:auto}.stalux-prose pre code{color:inherit;font-size:inherit;background:0 0;border:none;padding:0;font-family:inherit}.expressive-code pre,.expressive-code code{all:revert}.stalux-prose ul,.stalux-prose ol{margin:0 0 var(--space-lg);padding-left:1.75rem}.stalux-prose li{color:var(--white-85p);margin:.4rem 0;line-height:1.75}.stalux-prose ul li{list-style:outside}.stalux-prose ul li ul li{list-style:circle}.stalux-prose ul li ul li ul li{list-style:square}.stalux-prose ol li{list-style:decimal}.stalux-prose ol li ol li{list-style:lower-alpha}.stalux-prose li>ul,.stalux-prose li>ol{margin-top:.3rem;margin-bottom:.3rem}.stalux-prose blockquote{margin:var(--space-xl) 0;border-left:4px solid var(--accent-60p);background:var(--surface-glass);border-top:1px solid var(--white-10p);border-right:1px solid var(--white-10p);border-bottom:1px solid var(--white-10p);color:var(--white-85p);border-radius:12px;padding:1rem 1.5rem;box-shadow:0 4px 16px #0002}.stalux-prose blockquote p{margin:0;line-height:1.7}.stalux-prose blockquote p+p{margin-top:.8rem}.stalux-prose blockquote strong{color:#ffd966}.stalux-prose blockquote code{font-size:.85em}.stalux-prose table{border-collapse:collapse;width:100%;margin:var(--space-xl) 0;box-shadow:var(--shadow-md);border-radius:8px;display:block;overflow:auto hidden}.stalux-prose th,.stalux-prose td{text-align:left;border-bottom:1px solid var(--white-10p);padding:.75rem 1rem;line-height:1.6}.stalux-prose th{white-space:nowrap;background:var(--accent-30p);color:var(--white-full);font-size:.95em;font-weight:600}.stalux-prose td{color:var(--white-85p)}.stalux-prose tr:nth-child(2n) td{background-color:var(--white-05p)}@media (hover:hover) and (pointer:fine){.stalux-prose tr:hover td{background-color:var(--black-10p)}}.stalux-prose table code{font-size:.85em}.stalux-prose img{max-width:100%;height:auto;margin:var(--space-xl) auto;box-shadow:var(--shadow-lg);transition:transform var(--transition-normal), box-shadow var(--transition-normal);border-radius:8px;display:block}@media (hover:hover) and (pointer:fine){.stalux-prose img:hover{box-shadow:var(--shadow-xl);transform:none}}.stalux-prose embed,.stalux-prose video{max-width:100%;height:auto;margin:var(--space-xl) auto;border-radius:8px;display:block}.stalux-prose hr{margin:var(--space-2xl) 0;background:linear-gradient(90deg, transparent, var(--white-15p) 20%, var(--accent-40p) 50%, var(--white-15p) 80%, transparent);border:none;height:1.5px}.stalux-prose details{margin:var(--space-lg) 0;background-color:var(--white-05p);border:1px solid var(--white-10p);transition:border-color var(--transition-fast);border-radius:6px;padding:.8rem 1rem}@media (hover:hover) and (pointer:fine){.stalux-prose details:hover{border-color:var(--white-20p)}}.stalux-prose summary{cursor:pointer;color:var(--white-90p);font-weight:600}.stalux-prose details[open] summary{border-bottom:1px solid var(--white-10p);margin-bottom:.8rem;padding-bottom:.6rem}.stalux-prose figure{text-align:center;margin:var(--space-xl) 0}.stalux-prose figcaption{color:var(--white-70p);margin-top:.5rem;font-size:.9em;font-style:italic}.stalux-prose figure[data-stalux-image]>figcaption{color:var(--muted-text);overflow-wrap:anywhere;font-size:.85rem;font-style:normal;line-height:1.6}.stalux-prose .footnotes{color:var(--white-75p);border-top:1px solid var(--white-15p);margin-top:var(--space-2xl);padding-top:var(--space-lg);font-size:.88em}.stalux-prose .footnotes ol{margin-left:1rem;padding-left:.5rem}.stalux-prose .footnotes li{margin:.5rem 0;line-height:1.6}.stalux-prose .footnotes a{font-size:.9em}@media (width<=1024px){.stalux-prose{font-size:1.05rem}.stalux-prose h1{font-size:2.2rem}.stalux-prose h2{font-size:1.8rem}.stalux-prose h3{font-size:1.35rem}.stalux-prose h4{font-size:1.15rem}.stalux-prose pre{padding:1rem 1.2rem;font-size:.88em}}@media (width<=768px){.stalux-prose{font-size:1rem;line-height:1.7}.stalux-prose h1{margin-top:1.5rem;font-size:1.8rem}.stalux-prose h2{margin-top:1.5rem;font-size:1.4rem}.stalux-prose h3{margin-top:1.25rem;font-size:1.2rem}.stalux-prose h4{margin-top:1rem;font-size:1.1rem}.stalux-prose h5{font-size:1rem}.stalux-prose h6{font-size:.95rem}.stalux-prose p{margin-bottom:var(--space-md)}.stalux-prose pre{margin:var(--space-lg) 0;border-left-width:3px;padding:.8rem 1rem;font-size:.82em}.stalux-prose table{font-size:.85rem}.stalux-prose th,.stalux-prose td{padding:.5rem .7rem}.stalux-prose blockquote{padding:.8rem 1rem;font-size:.9em}.stalux-prose ul,.stalux-prose ol{padding-left:1.5rem}}.stalux-prose,.stalux-prose>*,.stalux-prose div,.stalux-prose .expressive-code,.stalux-prose .expressive-code .frame{box-sizing:border-box;min-width:0;max-width:100%}.stalux-prose{overflow-wrap:anywhere}.stalux-prose a:after{content:none}.stalux-prose a{text-decoration-color:var(--accent-50p);text-decoration-thickness:1px}.stalux-prose a:has(img){text-decoration:none}.stalux-prose pre,.stalux-prose table,.stalux-prose .mermaid,.stalux-prose math{overscroll-behavior-x:contain;max-width:100%;overflow-x:auto}.stalux-prose pre,.stalux-prose pre code{overflow-wrap:normal;word-break:normal}.stalux-prose :is(img,video,iframe,embed,svg,canvas){max-width:100%}.stalux-prose :is(img,video,svg,canvas){height:auto}.stalux-prose iframe{margin:var(--space-xl) auto;border-radius:8px;display:block}.stalux-prose .mermaid svg{max-width:none}.stalux-prose canvas{box-sizing:border-box}.stalux-prose summary{overflow-wrap:anywhere}}@layer utilities;@font-face{font-family:Stalux Math Aux;src:url(/fonts/StaluxMathAux.woff2)format("woff2");font-weight:400;font-style:normal}@font-face{font-family:Latin Modern Math;src:url(/fonts/latinmodern-math.woff2)format("woff2");font-display:swap}math{font-size-adjust:none;text-indent:0;text-transform:none;letter-spacing:normal;word-wrap:normal;font-feature-settings:"dtls" off;font-style:normal;font-weight:400;line-height:normal;font-family:"Latin Modern Math", var(--font-body), math;direction:ltr}math *{border-color:currentColor}math.tml-display{width:100%;display:block}.mathscr{font-family:Stalux Math Aux,serif}mfrac>:nth-child(2),msqrt,mover>:first-child{math-shift:compact}.menclose{padding:.5ex 0;display:inline-block;position:relative}.tml-cancelto{background-color:currentColor;padding:.5ex 0;display:inline-block;position:absolute;top:0;left:0;-webkit-mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><defs><marker id='a' markerHeight='5' markerUnits='strokeWidth' markerWidth='7' orient='auto' refX='7' refY='2.5'><path fill='black' d='m0 0 7 2.5L0 5z'/></marker></defs><line x2='100%25' y1='100%25' stroke='black' stroke-width='.06em' marker-end='url(%23a)' vector-effect='non-scaling-stroke'/></svg>");mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><defs><marker id='a' markerHeight='5' markerUnits='strokeWidth' markerWidth='7' orient='auto' refX='7' refY='2.5'><path fill='black' d='m0 0 7 2.5L0 5z'/></marker></defs><line x2='100%25' y1='100%25' stroke='black' stroke-width='.06em' marker-end='url(%23a)' vector-effect='non-scaling-stroke'/></svg>");-webkit-mask-position:0 0;mask-position:0 0;-webkit-mask-size:100% 100%;mask-size:100% 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@supports ((-moz-appearance:none)){math{display:inline}math>mrow{padding:0}mtd,mtable.tml-small mtd{padding-top:0;padding-bottom:0}mtable.tml-jot mtd{padding-top:.2ex;padding-bottom:0}.tml-vec{transform:scale(.75)}.ff-narrow{width:0}.ff-nudge-left{margin-left:-.2em}.ff-squash mtd{height:0;display:block}}@supports not ((-moz-appearance:none)){mo.tml-prime{font-family:Stalux Math Aux,serif}.tml-sml-pad{padding-left:.05em}.tml-med-pad{padding-left:.1em}.tml-lrg-pad{padding-left:.15em}}@supports ((-webkit-backdrop-filter:blur(1px))){.wbk-acc{transform:translateY(.431em)}.wbk-sml{transform:translate(.07em)}.wbk-sml-acc{transform:translate(.07em,.431em)}.wbk-sml-vec{transform:scale(.75)translate(.07em)}.wbk-med{transform:translate(.14em)}.wbk-med-acc{transform:translate(.14em,.431em)}.wbk-med-vec{transform:scale(.75)translate(.14em)}.wbk-lrg{transform:translate(.21em)}.wbk-lrg-acc{transform:translate(.21em,.431em)}.wbk-lrg-vec{transform:scale(.75)translate(.21em)}}@supports (not ((-webkit-backdrop-filter:blur(1px)))) and (not ((-moz-appearance:none))){.chr-sml{transform:translate(.07em)}.chr-sml-vec{transform:scale(.75)translate(.07em)}.chr-med{transform:translate(.14em)}.chr-med-vec{transform:scale(.75)translate(.14em)}.chr-lrg{transform:translate(.21em)}.chr-lrg-vec{transform:scale(.75)translate(.21em)}.tml-shift-left{margin-left:-100%}menclose{padding:.5ex 0;position:relative}.tml-overline{border-top:.065em solid;padding:.1em 0 0}.tml-underline{border-bottom:.065em solid;padding:0 0 .1em}.tml-cancel{background-color:currentColor;width:100%;height:100%;display:inline-block;position:absolute;bottom:0;left:.5px}.upstrike{clip-path:polygon(.05em 100%,0 calc(100% - .05em),calc(100% - .05em) 0,100% .05em)}.downstrike{clip-path:polygon(0 .05em,.05em 0,100% calc(100% - .05em),calc(100% - .05em) 100%)}.sout{clip-path:polygon(0 calc(55% + .0333em),0 calc(55% - .0333em),100% calc(55% - .0333em),100% calc(55% + .0333em))}.tml-xcancel{clip-path:polygon(.05em 0,0 .05em,calc(50% - .05em) 50%,0 calc(100% - .05em),.05em 100%,50% calc(50% + .05em),calc(100% - .05em) 100%,100% calc(100% - .05em),calc(50% + .05em) 50%,100% .05em,calc(100% - .05em) 0%,50% calc(50% - .05em))}.longdiv-top{border-top:.067em solid;padding:.1em .2em .2em .433em}.longdiv-arc{clip-path:inset(0 0 0 .4em);box-sizing:border-box;border:.067em solid;border-radius:70%;width:.7em;position:absolute;top:0;bottom:.1em;left:-.4em;transform:translateY(-.067em)}.menclose{text-align:left;display:inline-block;position:relative}.phasor-bottom{border-bottom:.067em solid;padding:.2em .2em .1em .6em}.phasor-angle{aspect-ratio:.5;clip-path:polygon(.05em 100%,0 calc(100% - .05em),calc(100% - .05em) 0,100% .05em);background-color:currentColor;height:100%;display:inline-block;position:absolute;bottom:-.04em;left:.5px}.tml-fbox{border:1px solid;padding:3pt}.circle-pad{padding:.267em}.textcircle{border:.067em solid;border-radius:50%;position:absolute;inset:0}.actuarial{border-style:solid;border-width:.08em .08em 0 0;margin-right:.03889em;padding:.03889em .03889em 0}.tml-crooked-2{transform:scale(2,1.1)}.tml-crooked-3{transform:scale(3,1.3)}.tml-crooked-4{transform:scale(4,1.4)}.tml-right{text-align:-webkit-right}.tml-left{text-align:-webkit-left}}menclose{-webkit-print-color-adjust:exact;print-color-adjust:exact}.tml-right{text-align:right}.tml-left{text-align:left}.special-fraction{font-family:Times New Roman,Times,STIX TWO,Tinos,serif}math{flex-wrap:wrap;align-items:baseline;display:inline-flex}math>mrow{padding:.5ex 0}mtable.tml-jot mtd{padding-top:.7ex;padding-bottom:.7ex}mtable.tml-small mtd{padding-top:.35ex;padding-bottom:.35ex}.tml-shift-left{margin-left:-200%}.tml-eqn:before{counter-increment:tmlEqnNo;content:"(" counter(tmlEqnNo) ")"}body{counter-reset:tmlEqnNo}
2
2
  /*$vite$:1*/
@@ -1,2 +1,2 @@
1
- .waline-comment-container{--waline-font-family:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;font-family:var(--waline-font-family)}.waline-comment-container :where(input,textarea,button,select){font-family:var(--waline-font-family)}.waline-comment-container :where(pre,code,kbd,samp){font-family:ui-monospace,Cascadia Code,Consolas,monospace}.waline-retry{border:1px solid var(--accent-50p);background:var(--white-05p);min-height:44px;color:inherit;cursor:pointer;border-radius:8px;padding:.6rem 1rem}.waline-retry:focus-visible{outline:2px solid var(--stalux-accent-color);outline-offset:3px}:root{--waline-accent-rgb:var(--stalux-accent-rgb)}.waline-comment-container{border-radius:12px;margin-top:3rem;margin-bottom:1rem;padding:2rem}.waline-comment-title{text-align:center;background:linear-gradient(90deg, var(--white-90p), rgb(var(--waline-accent-rgb) / .9));color:#0000;background-clip:text;margin:0 0 1.5rem;font-size:2rem}.wl-panel{background-color:#1111114d;border:1px solid #ffffff1a;border-radius:12px;margin-bottom:1.5rem;padding:1rem}.wl-editor,.wl-input{border-radius:8px;transition:background-color .2s,border-color .2s,color .2s;color:var(--white-90p)!important;background-color:#11111180!important;border:1px solid #6464644d!important}.wl-editor:focus,.wl-input:focus{outline:none;border-color:rgb(var(--waline-accent-rgb) / .5)!important;box-shadow:0 0 5px rgb(var(--waline-accent-rgb) / .3)!important}.wl-login-nick{height:var(--waline-avatar-size,52px);overflow:hidden;display:block!important}.wl-login-nick:after{display:none}.waline-comment-container img{margin:0!important}.wl-btn{cursor:pointer;border-radius:6px;padding:8px 15px;font-weight:500;transition:background-color .18s,border-color .18s,color .18s;background:rgb(var(--waline-accent-rgb) / .6)!important;color:var(--white-full)!important;border:none!important}@media (hover:hover) and (pointer:fine){.wl-btn:hover{transform:none;background:rgb(var(--waline-accent-rgb) / .7)!important;box-shadow:none!important}}.wl-btn.primary{background:rgb(var(--waline-accent-rgb) / .6)!important}@media (hover:hover) and (pointer:fine){.wl-btn.primary:hover{transform:none;background:rgb(var(--waline-accent-rgb) / .7)!important;box-shadow:none!important}}.wl-header label{color:var(--white-85p);font-weight:500}.wl-card{border-radius:12px;margin-top:1.2rem;padding:1.2rem;transition:background-color .2s,border-color .2s,color .2s;background-color:#1111110d!important;border:1px solid #46464633!important}@media (hover:hover) and (pointer:fine){.wl-card:hover{transform:none;box-shadow:0 10px 24px #00000014;border-color:rgb(var(--waline-accent-rgb) / .3)!important}}.wl-nick{font-weight:600;transition:background-color .18s,border-color .18s,color .18s;color:rgb(var(--waline-accent-rgb) / .95)!important}@media (hover:hover) and (pointer:fine){.wl-nick:hover{color:rgb(var(--waline-accent-rgb) / 1)!important}}.wl-content{color:var(--white-90p);overflow-wrap:anywhere;margin:.8rem 0;line-height:1.7}.wl-reply{opacity:.8;transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-reply:hover{opacity:1;text-decoration:none}}.wl-emoji-popup,.wl-gif-popup{backdrop-filter:blur(10px);border-radius:10px;box-shadow:0 8px 24px #0003;background-color:#191919f2!important;border:1px solid #4646464d!important}.wl-emoji-popup button{border-radius:6px;transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-emoji-popup button:hover{background-color:rgb(var(--waline-accent-rgb) / .2);transform:scale(1.05)}}.wl-reaction{text-align:center;background-color:#1111114d;border:1px solid #46464633;border-radius:12px;margin-bottom:1.5rem;padding:1rem}.wl-reaction-title{color:var(--white-90p);margin-bottom:1rem;font-size:1.1rem}.wl-reaction-list{flex-wrap:wrap;justify-content:center;display:flex}.wl-reaction-item{cursor:pointer;border-radius:8px;margin:5px;transition:background-color .2s,border-color .2s,color .2s;background-color:#1e1e1e80!important;border:1px solid #46464633!important}@media (hover:hover) and (pointer:fine){.wl-reaction-item:hover{transform:none;box-shadow:0 5px 10px #0003;border-color:rgb(var(--waline-accent-rgb) / .3)!important;background-color:#282828cc!important}}.wl-reaction-img{padding:6px}.wl-reaction-img img{transition:transform .3s}@media (hover:hover) and (pointer:fine){.wl-reaction-item:hover .wl-reaction-img img{transform:scale(1.05)}}.wl-reaction-votes{background-color:rgb(var(--waline-accent-rgb) / .7);color:var(--white-full);padding:5px 0;font-size:.8rem}.wl-meta-head{border-bottom:1px solid #4646464d;justify-content:space-between;align-items:center;margin-bottom:1.2rem;padding-bottom:.8rem;display:flex}.wl-count{color:var(--white-90p);font-size:1.1rem;font-weight:500}.wl-sort{gap:1rem;display:flex}.wl-sort li{cursor:pointer;color:var(--white-70p);transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-sort li:hover{color:var(--white-90p)}}.wl-sort li.active{color:rgb(var(--waline-accent-rgb) / 1);font-weight:500}.wl-page{text-align:center;margin-top:1.2rem}.wl-page button{border-radius:6px;margin:0 5px;padding:5px 10px;transition:background-color .18s,border-color .18s,color .18s;color:var(--white-80p)!important;background:#1e1e1e80!important;border:1px solid #4646464d!important}@media (hover:hover) and (pointer:fine){.wl-page button:hover:not(:disabled){transform:none;background:rgb(var(--waline-accent-rgb) / .7)!important;color:var(--white-full)!important}}.wl-page button.active{background:rgb(var(--waline-accent-rgb) / .8)!important;color:var(--white-full)!important}.wl-power{text-align:center;opacity:.6;margin-top:2rem;font-size:.85rem}.wl-power a{color:rgb(var(--waline-accent-rgb) / .9);text-decoration:none;transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-power a:hover{color:rgb(var(--waline-accent-rgb) / 1);text-decoration:underline}}.wl-empty{text-align:center;color:var(--white-60p);padding:2rem 0;font-size:1.1rem}.wl-text-number{color:var(--white-60p);font-size:.9rem}.waline-comment-container ::selection{background:rgb(var(--waline-accent-rgb) / .25);color:inherit;border:none;outline:none}.waline-comment-container ::selection{background:rgb(var(--waline-accent-rgb) / .25);color:inherit;border:none;outline:none}@media (width<=768px){.waline-comment-container{margin-top:2rem;padding:1.5rem}.waline-comment-title{font-size:1.8rem}.wl-panel{padding:.8rem}.wl-header{flex-direction:column}.wl-header-item{width:100%;margin-bottom:.5rem}.wl-card{margin-left:0;padding:.8rem}.wl-children{margin-left:0;padding-left:0}.wl-children .wl-card{border-left:3px solid rgb(var(--waline-accent-rgb) / .4);margin-left:0;padding-left:.8rem}}@media (width<=480px){.waline-comment-container{margin-top:1.5rem;padding:1rem}.waline-comment-title{font-size:1.6rem}.wl-panel{padding:.8rem}.wl-reaction-list{gap:5px}.wl-card{box-sizing:border-box;width:100%;margin-left:0;padding:.75rem}.wl-children{box-sizing:border-box;width:100%;margin-left:0;padding-left:0}.wl-children .wl-card{border-left:3px solid rgb(var(--waline-accent-rgb) / .4);width:100%;margin-left:0;padding-left:.6rem}.wl-children .wl-children .wl-card{border-left:3px solid rgb(var(--waline-accent-rgb) / .3);padding-left:.6rem}.wl-meta-head{flex-direction:column;align-items:flex-start;gap:.5rem}}.waline-comment-container,.waline-comment-container *,.wl-panel,.wl-content{box-sizing:border-box;overflow-wrap:anywhere;min-width:0;max-width:100%}@media (hover:none){.wl-reaction-img img{transform:none}}@media (prefers-reduced-motion:reduce){.waline-comment-container *,.waline-comment-container :before,.waline-comment-container :after{transition:none!important;animation:none!important;transform:none!important}}
1
+ .waline-comment-container{--waline-font-family:system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;font-family:var(--waline-font-family)}.waline-comment-container :where(input,textarea,button,select){font-family:var(--waline-font-family)}.waline-comment-container :where(pre,code,kbd,samp){font-family:ui-monospace,Cascadia Code,Consolas,monospace}.waline-retry{border:1px solid var(--accent-50p);background:var(--white-05p);min-height:44px;color:inherit;cursor:pointer;border-radius:8px;padding:.6rem 1rem}.waline-retry:focus-visible{outline:2px solid var(--stalux-accent-color);outline-offset:3px}:root{--waline-accent-rgb:var(--stalux-accent-rgb)}.waline-comment-container{--waline-theme-color:var(--accent-text);--waline-color:var(--white-90p);--waline-info-color:var(--white-50p);--waline-light-grey:var(--white-70p);--waline-dark-grey:var(--white-70p);border-radius:12px;margin-top:3rem;margin-bottom:1rem;padding:2rem}.waline-comment-title{text-align:center;background:linear-gradient(90deg, var(--white-90p), rgb(var(--waline-accent-rgb) / .9));color:#0000;background-clip:text;margin:0 0 1.5rem;font-size:2rem}.wl-panel{background-color:#1111114d;border:1px solid #ffffff1a;border-radius:12px;margin-bottom:1.5rem;padding:1rem}.wl-editor,.wl-input{border-radius:8px;transition:background-color .2s,border-color .2s,color .2s;color:var(--white-90p)!important;background-color:#11111180!important;border:1px solid #6464644d!important}.wl-editor:focus,.wl-input:focus{outline:none;border-color:rgb(var(--waline-accent-rgb) / .5)!important;box-shadow:0 0 5px rgb(var(--waline-accent-rgb) / .3)!important}.wl-login-nick{height:var(--waline-avatar-size,52px);overflow:hidden;display:block!important}.wl-login-nick:after{display:none}.waline-comment-container img{margin:0!important}.wl-btn{cursor:pointer;border-radius:6px;padding:8px 15px;font-weight:500;transition:background-color .18s,border-color .18s,color .18s;background:rgb(var(--waline-accent-rgb) / .6)!important;color:var(--white-full)!important;border:none!important}@media (hover:hover) and (pointer:fine){.wl-btn:hover{transform:none;background:rgb(var(--waline-accent-rgb) / .7)!important;box-shadow:none!important}}.wl-btn.primary{background:rgb(var(--waline-accent-rgb) / .6)!important}@media (hover:hover) and (pointer:fine){.wl-btn.primary:hover{transform:none;background:rgb(var(--waline-accent-rgb) / .7)!important;box-shadow:none!important}}.wl-header label{color:var(--white-85p);font-weight:500}.wl-card{border-radius:12px;margin-top:1.2rem;padding:1.2rem;transition:background-color .2s,border-color .2s,color .2s;background-color:#1111110d!important;border:1px solid #46464633!important}@media (hover:hover) and (pointer:fine){.wl-card:hover{transform:none;box-shadow:0 10px 24px #00000014;border-color:rgb(var(--waline-accent-rgb) / .3)!important}}.wl-nick{font-weight:600;transition:background-color .18s,border-color .18s,color .18s;color:var(--waline-theme-color)!important}.wl-content{color:var(--white-90p);overflow-wrap:anywhere;margin:.8rem 0;line-height:1.7}.wl-reply{opacity:.8;transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-reply:hover{opacity:1;text-decoration:none}}.wl-emoji-popup,.wl-gif-popup{backdrop-filter:blur(10px);border-radius:10px;box-shadow:0 8px 24px #0003;background-color:#191919f2!important;border:1px solid #4646464d!important}.wl-emoji-popup button{border-radius:6px;transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-emoji-popup button:hover{background-color:rgb(var(--waline-accent-rgb) / .2);transform:scale(1.05)}}.wl-reaction{text-align:center;background-color:#1111114d;border:1px solid #46464633;border-radius:12px;margin-bottom:1.5rem;padding:1rem}.wl-reaction-title{color:var(--white-90p);margin-bottom:1rem;font-size:1.1rem}.wl-reaction-list{flex-wrap:wrap;justify-content:center;display:flex}.wl-reaction-item{cursor:pointer;border-radius:8px;margin:5px;transition:background-color .2s,border-color .2s,color .2s;background-color:#1e1e1e80!important;border:1px solid #46464633!important}@media (hover:hover) and (pointer:fine){.wl-reaction-item:hover{transform:none;box-shadow:0 5px 10px #0003;border-color:rgb(var(--waline-accent-rgb) / .3)!important;background-color:#282828cc!important}}.wl-reaction-img{padding:6px}.wl-reaction-img img{transition:transform .3s}@media (hover:hover) and (pointer:fine){.wl-reaction-item:hover .wl-reaction-img img{transform:scale(1.05)}}.wl-reaction-votes{background-color:rgb(var(--waline-accent-rgb) / .7);color:var(--white-full);padding:5px 0;font-size:.8rem}.wl-meta-head{border-bottom:1px solid #4646464d;justify-content:space-between;align-items:center;margin-bottom:1.2rem;padding-bottom:.8rem;display:flex}.wl-count{color:var(--white-90p);font-size:1.1rem;font-weight:500}.wl-sort{gap:1rem;display:flex}.wl-sort li{cursor:pointer;color:var(--white-70p);transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-sort li:hover{color:var(--white-90p)}}.wl-sort li.active{color:var(--waline-theme-color);font-weight:500}.wl-page{text-align:center;margin-top:1.2rem}.wl-page button{border-radius:6px;margin:0 5px;padding:5px 10px;transition:background-color .18s,border-color .18s,color .18s;color:var(--white-80p)!important;background:#1e1e1e80!important;border:1px solid #4646464d!important}@media (hover:hover) and (pointer:fine){.wl-page button:hover:not(:disabled){transform:none;background:rgb(var(--waline-accent-rgb) / .7)!important;color:var(--white-full)!important}}.wl-page button.active{background:rgb(var(--waline-accent-rgb) / .8)!important;color:var(--white-full)!important}.wl-power{text-align:center;opacity:.6;margin-top:2rem;font-size:.85rem}.wl-power a{color:var(--waline-theme-color);text-decoration:none;transition:background-color .18s,border-color .18s,color .18s}@media (hover:hover) and (pointer:fine){.wl-power a:hover{text-decoration:underline}}.wl-empty{text-align:center;color:var(--white-60p);padding:2rem 0;font-size:1.1rem}.wl-text-number{color:var(--white-60p);font-size:.9rem}.waline-comment-container ::selection{background:rgb(var(--waline-accent-rgb) / .25);color:inherit;border:none;outline:none}@media (width<=768px){.waline-comment-container{margin-top:2rem;padding:1.5rem}.waline-comment-title{font-size:1.8rem}.wl-panel{padding:.8rem}.wl-header{flex-direction:column}.wl-header-item{width:100%;margin-bottom:.5rem}.wl-card{margin-left:0;padding:.8rem}.wl-children{margin-left:0;padding-left:0}.wl-children .wl-card{border-left:3px solid rgb(var(--waline-accent-rgb) / .4);margin-left:0;padding-left:.8rem}}@media (width<=480px){.waline-comment-container{margin-top:1.5rem;padding:1rem}.waline-comment-title{font-size:1.6rem}.wl-panel{padding:.8rem}.wl-reaction-list{gap:5px}.wl-card{box-sizing:border-box;width:100%;margin-left:0;padding:.75rem}.wl-children{box-sizing:border-box;width:100%;margin-left:0;padding-left:0}.wl-children .wl-card{border-left:3px solid rgb(var(--waline-accent-rgb) / .4);width:100%;margin-left:0;padding-left:.6rem}.wl-children .wl-children .wl-card{border-left:3px solid rgb(var(--waline-accent-rgb) / .3);padding-left:.6rem}.wl-meta-head{flex-direction:column;align-items:flex-start;gap:.5rem}}.waline-comment-container,.waline-comment-container *,.wl-panel,.wl-content{box-sizing:border-box;overflow-wrap:anywhere;min-width:0;max-width:100%}@media (hover:none){.wl-reaction-img img{transform:none}}@media (prefers-reduced-motion:reduce){.waline-comment-container *,.waline-comment-container :before,.waline-comment-container :after{transition:none!important;animation:none!important;transform:none!important}}
2
2
  /*$vite$:1*/