@ansidev-oss/vitepress-theme-ansidev 1.3.0 → 1.4.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.
@@ -1,44 +1,66 @@
1
- import { Fragment as e, computed as t, createBlock as n, createElementBlock as r, createElementVNode as i, defineComponent as a, mergeProps as o, normalizeStyle as s, openBlock as c, renderList as l } from "vue";
1
+ import { Fragment as e, computed as t, createBlock as n, createElementBlock as r, createElementVNode as i, defineComponent as a, mergeProps as o, normalizeStyle as s, openBlock as c, renderList as l, unref as u } from "vue";
2
2
  // src/client/plugins/donation/index.ts
3
- var u = {
3
+ var d = {
4
4
  buymeacoffee: {
5
5
  donationBaseUrl: "https://buymeacoffee.com",
6
6
  donationButtonImage: "https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png",
7
7
  donationButtonStyle: {
8
8
  height: "60px !important",
9
9
  width: "217px !important"
10
+ },
11
+ donationButtonSize: {
12
+ width: 545,
13
+ height: 153
10
14
  }
11
15
  },
12
16
  kofi: {
13
17
  donationBaseUrl: "https://ko-fi.com",
14
18
  donationButtonImage: "https://storage.ko-fi.com/cdn/brandasset/kofi_bg_tag_white.png",
15
- donationButtonStyle: { height: "60px !important" }
19
+ donationButtonStyle: { height: "60px !important" },
20
+ donationButtonSize: {
21
+ width: 341,
22
+ height: 129
23
+ }
16
24
  },
17
25
  paypal: {
18
26
  donationBaseUrl: "https://paypal.me",
19
- donationButtonImage: "https://paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif"
27
+ donationButtonImage: "https://paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif",
28
+ donationButtonSize: {
29
+ width: 147,
30
+ height: 47
31
+ }
20
32
  }
21
- }, d = ["href"], f = ["src", "alt"], p = /* @__PURE__ */ a({
33
+ }, f = ["href"], p = [
34
+ "src",
35
+ "alt",
36
+ "width",
37
+ "height"
38
+ ], m = /* @__PURE__ */ a({
22
39
  __name: "DonationButton",
23
40
  props: {
24
41
  donationPlatform: {},
25
42
  donationId: {},
26
43
  donationBaseUrl: {},
27
44
  donationButtonImage: {},
28
- donationButtonStyle: {}
45
+ donationButtonStyle: {},
46
+ donationButtonSize: {}
29
47
  },
30
48
  setup(e) {
31
- let n = e, a = t(() => new URL(n.donationId, n.donationBaseUrl).toString());
49
+ let n = e, a = t(() => new URL(n.donationId, n.donationBaseUrl).toString()), o = n.donationButtonSize;
32
50
  return (t, n) => (c(), r("a", {
33
51
  href: a.value,
34
52
  target: "_blank"
35
53
  }, [i("img", {
36
54
  src: e.donationButtonImage,
37
55
  alt: e.donationPlatform,
38
- style: s(e.donationButtonStyle)
39
- }, null, 12, f)], 8, d));
56
+ style: s(e.donationButtonStyle),
57
+ width: u(o)?.width,
58
+ height: u(o)?.height,
59
+ loading: "lazy",
60
+ decoding: "async"
61
+ }, null, 12, p)], 8, f));
40
62
  }
41
- }), m = /* @__PURE__ */ a({
63
+ }), h = /* @__PURE__ */ a({
42
64
  __name: "Donation",
43
65
  props: { donation: {} },
44
66
  setup(i) {
@@ -48,7 +70,7 @@ var u = {
48
70
  if (t === "custom") continue;
49
71
  let n = a[t];
50
72
  e[t] = {
51
- ...u[t],
73
+ ...d[t],
52
74
  donationId: n
53
75
  };
54
76
  }
@@ -57,10 +79,10 @@ var u = {
57
79
  ...a.custom
58
80
  };
59
81
  });
60
- return (t, i) => (c(!0), r(e, null, l(s.value, (e, t) => (c(), n(p, o({
82
+ return (t, i) => (c(!0), r(e, null, l(s.value, (e, t) => (c(), n(m, o({
61
83
  key: e?.name,
62
84
  ref_for: !0
63
85
  }, e, { "donation-platform": t }), null, 16, ["donation-platform"]))), 128));
64
86
  }
65
87
  });
66
- export { m as default };
88
+ export { h as default };
@@ -19,7 +19,13 @@ var n = /* @__PURE__ */ e({
19
19
  `, document.head.appendChild(t);
20
20
  }
21
21
  }
22
- return n && t(i), (e, t) => null;
22
+ function a() {
23
+ let e = () => {
24
+ typeof window.requestIdleCallback == "function" ? window.requestIdleCallback(() => i(), { timeout: 5e3 }) : setTimeout(i, 3e3);
25
+ };
26
+ document.readyState === "complete" ? e() : window.addEventListener("load", e, { once: !0 });
27
+ }
28
+ return n && t(a), (e, t) => null;
23
29
  }
24
30
  });
25
31
  export { n as default };
@@ -1,5 +1,5 @@
1
1
  import { Icon as e } from "@iconify/vue";
2
- import t, { useLayout as n } from "vitepress/theme";
2
+ import t, { useLayout as n } from "vitepress/theme-without-fonts";
3
3
  import { useData as r, useRoute as i, useRouter as a } from "vitepress";
4
4
  import { Fragment as o, Text as s, computed as c, createBlock as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createTextVNode as p, createVNode as m, defineAsyncComponent as h, defineComponent as g, effectScope as _, getCurrentInstance as v, getCurrentScope as y, guardReactiveProps as b, h as x, inject as ee, isRef as te, mergeProps as S, normalizeClass as C, normalizeProps as ne, onMounted as re, onScopeDispose as w, onUnmounted as ie, openBlock as T, ref as ae, renderList as oe, renderSlot as se, resolveComponent as ce, shallowRef as le, toDisplayString as E, unref as D, watch as ue, watchEffect as de, withCtx as O } from "vue";
5
5
  // src/client/composables/lang.ts
@@ -29,13 +29,13 @@ var k = () => {
29
29
  __name: "DonationWidget",
30
30
  props: { direction: {} },
31
31
  setup(e) {
32
- let { theme: t } = r(), n = e.direction === "vertical" ? "space-y-4" : "space-x-4", i = t.value.donation ? h(() => import("./Donation-BBPb8v5p.js")) : () => null;
32
+ let { theme: t } = r(), n = e.direction === "vertical" ? "space-y-4" : "space-x-4", i = t.value.donation ? h(() => import("./Donation-BJ2fj2Gs.js")) : () => null;
33
33
  return (e, r) => (T(), d("div", { class: C(["flex flex-wrap py-4 items-center justify-center", D(n)]) }, [m(D(i), { donation: D(t).donation }, null, 8, ["donation"])], 2));
34
34
  }
35
35
  }), ge = { class: "container" }, _e = ["innerHTML"], ve = ["innerHTML"], ye = /*@__PURE__*/ g({
36
36
  __name: "Footer",
37
37
  setup(e) {
38
- let { theme: t, frontmatter: i } = r(), { hasSidebar: a, hasAside: s } = n(), p = c(() => typeof t.value.themeFooter.copyright == "string" ? t.value.themeFooter.copyright.replace(/#\{present\}/g, (/* @__PURE__ */ new Date()).getFullYear().toString()) : t.value.themeFooter.copyright), g = t.value.googleAnalytics ? h(() => import("./GoogleAnalytics-34XEM7eO.js")) : () => null, _ = t.value.swetrix ? h(() => import("./Swetrix-GKEyGNrV.js")) : () => null;
38
+ let { theme: t, frontmatter: i } = r(), { hasSidebar: a, hasAside: s } = n(), p = c(() => typeof t.value.themeFooter.copyright == "string" ? t.value.themeFooter.copyright.replace(/#\{present\}/g, (/* @__PURE__ */ new Date()).getFullYear().toString()) : t.value.themeFooter.copyright), g = t.value.googleAnalytics ? h(() => import("./GoogleAnalytics-DwvjYPU_.js")) : () => null, _ = t.value.swetrix ? h(() => import("./Swetrix-GKEyGNrV.js")) : () => null;
39
39
  return (e, n) => (T(), d(o, null, [
40
40
  D(s) ? u("", !0) : (T(), l(he, {
41
41
  key: 0,
@@ -61,7 +61,7 @@ var k = () => {
61
61
  let n = e.__vccOpts || e;
62
62
  for (let [e, r] of t) n[e] = r;
63
63
  return n;
64
- }, xe = /*#__PURE__*/ be(ye, [["__scopeId", "data-v-84ab49a2"]]), A = typeof window < "u", j, Se;
64
+ }, xe = /*#__PURE__*/ be(ye, [["__scopeId", "data-v-6216a7be"]]), A = typeof window < "u", j, Se;
65
65
  if (process.env.NODE_ENV !== "production") {
66
66
  let e = A && window.performance;
67
67
  e && e.mark && e.measure && e.clearMarks && e.clearMeasures && (j = (t) => {
@@ -3136,7 +3136,7 @@ process.env.NODE_ENV;
3136
3136
  var Ba = (e, t) => {
3137
3137
  let n = e;
3138
3138
  t.value = n[(n.indexOf(t.value) + 1) % n.length];
3139
- }, Va = ["aria-label"], Ha = /*#__PURE__*/ be(/* @__PURE__ */ g({
3139
+ }, Va = ["aria-label"], Ha = ["width", "height"], Ua = "<g fill=\"currentColor\"><path d=\"M4.545 6.714L4.11 8H3l1.862-5h1.284L8 8H6.833l-.435-1.286zm1.634-.736L5.5 3.956h-.049l-.679 2.022z\"/><path d=\"M0 2a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zm7.138 9.995q.289.451.63.846c-.748.575-1.673 1.001-2.768 1.292c.178.217.451.635.555.867c1.125-.359 2.08-.844 2.886-1.494c.777.665 1.739 1.165 2.93 1.472c.133-.254.414-.673.629-.89c-1.125-.253-2.057-.694-2.82-1.284c.681-.747 1.222-1.651 1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6 6 0 0 1-.415-.492a2 2 0 0 1-.94.31\"/></g>", Wa = /*#__PURE__*/ be(/* @__PURE__ */ g({
3140
3140
  __name: "LocaleSwitcher",
3141
3141
  props: { size: {
3142
3142
  type: Number,
@@ -3145,21 +3145,22 @@ var Ba = (e, t) => {
3145
3145
  } },
3146
3146
  setup(e) {
3147
3147
  let { t, availableLocales: n, locale: r } = $(), i = () => Ba(n, r);
3148
- return (n, r) => {
3149
- let a = ce("Icon");
3150
- return T(), d(o, null, [r[0] ||= f("div", { class: "divider" }, null, -1), f("button", {
3151
- "aria-label": D(t)("button.toggle_locale"),
3152
- type: "button",
3153
- class: "VPLocaleSwitcher",
3154
- onClick: i
3155
- }, [m(a, {
3156
- icon: "bi:translate",
3157
- width: e.size,
3158
- height: e.size
3159
- }, null, 8, ["width", "height"])], 8, Va)], 64);
3160
- };
3161
- }
3162
- }), [["__scopeId", "data-v-6a2933ea"]]), Ua = /* @__PURE__ */ g({
3148
+ return (n, r) => (T(), d(o, null, [r[0] ||= f("div", { class: "divider" }, null, -1), f("button", {
3149
+ "aria-label": D(t)("button.toggle_locale"),
3150
+ type: "button",
3151
+ class: "VPLocaleSwitcher",
3152
+ onClick: i
3153
+ }, [(T(), d("svg", {
3154
+ xmlns: "http://www.w3.org/2000/svg",
3155
+ "aria-hidden": "true",
3156
+ role: "img",
3157
+ width: e.size,
3158
+ height: e.size,
3159
+ viewBox: "0 0 16 16",
3160
+ innerHTML: Ua
3161
+ }, null, 8, Ha))], 8, Va)], 64));
3162
+ }
3163
+ }), [["__scopeId", "data-v-871d7d08"]]), Ga = /* @__PURE__ */ g({
3163
3164
  __name: "SharingWidget",
3164
3165
  setup(e) {
3165
3166
  let t = i(), { theme: n, frontmatter: a, page: o } = r(), s = n.value.sharing ? h(() => import("./Sharing-CpagX9oy.js")) : () => null, c = new URL(t.path, n.value.siteURL).href, u = a.value.title || o.value.title;
@@ -3168,7 +3169,7 @@ var Ba = (e, t) => {
3168
3169
  text: D(u)
3169
3170
  }, null, 8, ["url", "text"]));
3170
3171
  }
3171
- }), Wa = { class: "vp-doc" }, Ga = /* @__PURE__ */ g({
3172
+ }), Ka = { class: "vp-doc" }, qa = /* @__PURE__ */ g({
3172
3173
  __name: "Layout",
3173
3174
  setup(e) {
3174
3175
  let { Layout: n } = t, { frontmatter: a, theme: o } = r(), s = i(), c = null;
@@ -3182,15 +3183,15 @@ var Ba = (e, t) => {
3182
3183
  return re(u), ue(() => s.path, (e, t) => {
3183
3184
  e !== t && u();
3184
3185
  }), (e, t) => (T(), l(D(n), null, {
3185
- "doc-before": O(() => [f("div", Wa, [f("h1", null, E(D(a).title), 1)])]),
3186
- "nav-bar-content-after": O(() => [m(Ha)]),
3187
- "aside-outline-after": O(() => [m(Ua)]),
3186
+ "doc-before": O(() => [f("div", Ka, [f("h1", null, E(D(a).title), 1)])]),
3187
+ "nav-bar-content-after": O(() => [m(Wa)]),
3188
+ "aside-outline-after": O(() => [m(Ga)]),
3188
3189
  "aside-ads-before": O(() => [m(he, { direction: "vertical" })]),
3189
3190
  "layout-bottom": O(() => [m(xe)]),
3190
3191
  _: 1
3191
3192
  }));
3192
3193
  }
3193
- }), Ka = ["href"], qa = /* @__PURE__ */ g({
3194
+ }), Ja = ["href"], Ya = /* @__PURE__ */ g({
3194
3195
  __name: "RouterLink",
3195
3196
  props: { to: {
3196
3197
  type: String,
@@ -3202,9 +3203,9 @@ var Ba = (e, t) => {
3202
3203
  return (n, r) => (T(), d("a", S({
3203
3204
  href: e.to,
3204
3205
  onClick: r[0] ||= (n) => D(t).go(e.to)
3205
- }, n.$attrs), [se(n.$slots, "default")], 16, Ka));
3206
+ }, n.$attrs), [se(n.$slots, "default")], 16, Ja));
3206
3207
  }
3207
- }), Ja = ["href"], Ya = ["href"], Xa = /* @__PURE__ */ g({
3208
+ }), Xa = ["href"], Za = ["href"], Qa = /* @__PURE__ */ g({
3208
3209
  __name: "Link",
3209
3210
  props: {
3210
3211
  href: {
@@ -3220,7 +3221,7 @@ var Ba = (e, t) => {
3220
3221
  },
3221
3222
  setup(e) {
3222
3223
  let t = e, n = t.href?.startsWith("/") && !t.disableRouterLink, r = t.href?.startsWith("#");
3223
- return (t, i) => D(n) || D(r) ? (T(), l(qa, S({
3224
+ return (t, i) => D(n) || D(r) ? (T(), l(Ya, S({
3224
3225
  key: 0,
3225
3226
  to: e.href
3226
3227
  }, t.$attrs), {
@@ -3230,14 +3231,14 @@ var Ba = (e, t) => {
3230
3231
  key: 1,
3231
3232
  target: "_self",
3232
3233
  href: e.href
3233
- }, t.$attrs), [se(t.$slots, "default")], 16, Ja)) : (T(), d("a", S({
3234
+ }, t.$attrs), [se(t.$slots, "default")], 16, Xa)) : (T(), d("a", S({
3234
3235
  key: 2,
3235
3236
  target: "_blank",
3236
3237
  rel: "noopener noreferrer",
3237
3238
  href: e.href
3238
- }, t.$attrs), [se(t.$slots, "default")], 16, Ya));
3239
+ }, t.$attrs), [se(t.$slots, "default")], 16, Za));
3239
3240
  }
3240
- }), Za = { class: "inline-flex items-center justify-center w-4 h-4 ms-2 text-xs font-semibold text-gray-900 dark:text-white bg-gray-300 dark:bg-gray-700 p-2.5 rounded" }, Qa = /* @__PURE__ */ g({
3241
+ }), $a = { class: "inline-flex items-center justify-center w-4 h-4 ms-2 text-xs font-semibold text-gray-900 dark:text-white bg-gray-300 dark:bg-gray-700 p-2.5 rounded" }, eo = /* @__PURE__ */ g({
3241
3242
  __name: "TermBadge",
3242
3243
  props: {
3243
3244
  title: {
@@ -3254,16 +3255,16 @@ var Ba = (e, t) => {
3254
3255
  }
3255
3256
  },
3256
3257
  setup(e) {
3257
- return (t, n) => (T(), l(Xa, {
3258
+ return (t, n) => (T(), l(Qa, {
3258
3259
  key: e.title,
3259
3260
  href: e.href,
3260
3261
  class: "inline-flex items-center mt-2 mb-2 mr-2 px-5 py-2.5 text-sm font-medium text-center text-white component-border"
3261
3262
  }, {
3262
- default: O(() => [p(E(e.title) + " ", 1), f("span", Za, E(e.count), 1)]),
3263
+ default: O(() => [p(E(e.title) + " ", 1), f("span", $a, E(e.count), 1)]),
3263
3264
  _: 1
3264
3265
  }, 8, ["href"]));
3265
3266
  }
3266
- }), $a = (e) => e.replace(/#/, "-sharp-").replace(/\./, "-dot-").replace(/-$/, "").toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/đ/g, "d").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, ""), eo = (e) => (t) => $a(t) === e, to = (e) => {
3267
+ }), to = (e) => e.replace(/#/, "-sharp-").replace(/\./, "-dot-").replace(/-$/, "").toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/đ/g, "d").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, ""), no = (e) => (t) => to(t) === e, ro = (e) => {
3267
3268
  let t = e instanceof Date ? e : new Date(e);
3268
3269
  return t.setUTCHours(12), {
3269
3270
  time: +t,
@@ -3271,7 +3272,7 @@ var Ba = (e, t) => {
3271
3272
  month: t.toLocaleDateString("en-US", { month: "short" }),
3272
3273
  year: t.toLocaleDateString("en-US", { year: "numeric" })
3273
3274
  };
3274
- }, no = (e) => {
3275
+ }, io = (e) => {
3275
3276
  switch (e) {
3276
3277
  case "active": return {
3277
3278
  fontSize: "text-sm",
@@ -3296,13 +3297,13 @@ var Ba = (e, t) => {
3296
3297
  };
3297
3298
  default: return {};
3298
3299
  }
3299
- }, ro = (e) => {
3300
+ }, ao = (e) => {
3300
3301
  let t = e.reduce((e, t) => (e[t] = (e[t] || 0) + 1, e), {}), n = Object.entries(t);
3301
3302
  return Object.fromEntries(n.sort(([, e], [, t]) => t - e));
3302
- }, io = { class: "flex flex-wrap pt-4" }, ao = {
3303
+ }, oo = { class: "flex flex-wrap pt-4" }, so = {
3303
3304
  key: 0,
3304
3305
  class: "mt-2 mb-2 mr-5"
3305
- }, oo = /* @__PURE__ */ g({
3306
+ }, co = /* @__PURE__ */ g({
3306
3307
  __name: "ArchivesPage",
3307
3308
  props: { posts: {
3308
3309
  type: Object,
@@ -3310,11 +3311,11 @@ var Ba = (e, t) => {
3310
3311
  default: []
3311
3312
  } },
3312
3313
  setup(e) {
3313
- let t = e, { t: n } = $(), r = c(() => ro(t.posts.flatMap((e) => new Date(e.date).getFullYear().toString()))), i = c(() => Object.keys(r.value).map((e) => Number(e)).reverse());
3314
+ let t = e, { t: n } = $(), r = c(() => ao(t.posts.flatMap((e) => new Date(e.date).getFullYear().toString()))), i = c(() => Object.keys(r.value).map((e) => Number(e)).reverse());
3314
3315
  return (e, t) => {
3315
3316
  let a = ce("Page");
3316
3317
  return T(), l(a, { title: D(n)("archives") }, {
3317
- default: O(() => [f("div", io, [Object.keys(i.value).length === 0 ? (T(), d("div", ao, E(D(n)("no_archive")), 1)) : u("", !0), (T(!0), d(o, null, oe(i.value, (e) => (T(), l(Qa, {
3318
+ default: O(() => [f("div", oo, [Object.keys(i.value).length === 0 ? (T(), d("div", so, E(D(n)("no_archive")), 1)) : u("", !0), (T(!0), d(o, null, oe(i.value, (e) => (T(), l(eo, {
3318
3319
  key: e,
3319
3320
  title: `${e}`,
3320
3321
  count: r.value[e],
@@ -3328,10 +3329,10 @@ var Ba = (e, t) => {
3328
3329
  }, 8, ["title"]);
3329
3330
  };
3330
3331
  }
3331
- }), so = { class: "flex flex-wrap pt-4" }, co = {
3332
+ }), lo = { class: "flex flex-wrap pt-4" }, uo = {
3332
3333
  key: 0,
3333
3334
  class: "mt-2 mb-2 mr-5"
3334
- }, lo = /* @__PURE__ */ g({
3335
+ }, fo = /* @__PURE__ */ g({
3335
3336
  __name: "CategoriesPage",
3336
3337
  props: { posts: {
3337
3338
  type: Object,
@@ -3339,15 +3340,15 @@ var Ba = (e, t) => {
3339
3340
  default: []
3340
3341
  } },
3341
3342
  setup(e) {
3342
- let t = e, { t: n } = $(), r = c(() => ro(t.posts.flatMap((e) => e.categories)));
3343
+ let t = e, { t: n } = $(), r = c(() => ao(t.posts.flatMap((e) => e.categories)));
3343
3344
  return (e, t) => {
3344
3345
  let i = ce("Page");
3345
3346
  return T(), l(i, { title: D(n)("categories") }, {
3346
- default: O(() => [f("div", so, [Object.keys(r.value).length === 0 ? (T(), d("div", co, E(D(n)("no_category")), 1)) : u("", !0), (T(!0), d(o, null, oe(r.value, (e, t) => (T(), l(Qa, {
3347
+ default: O(() => [f("div", lo, [Object.keys(r.value).length === 0 ? (T(), d("div", uo, E(D(n)("no_category")), 1)) : u("", !0), (T(!0), d(o, null, oe(r.value, (e, t) => (T(), l(eo, {
3347
3348
  key: t,
3348
3349
  title: t,
3349
3350
  count: e,
3350
- href: `/categories/${D($a)(t)}`
3351
+ href: `/categories/${D(to)(t)}`
3351
3352
  }, null, 8, [
3352
3353
  "title",
3353
3354
  "count",
@@ -3357,7 +3358,7 @@ var Ba = (e, t) => {
3357
3358
  }, 8, ["title"]);
3358
3359
  };
3359
3360
  }
3360
- }), uo = /* @__PURE__ */ g({
3361
+ }), po = /* @__PURE__ */ g({
3361
3362
  __name: "HomePage",
3362
3363
  props: { posts: {
3363
3364
  type: Object,
@@ -3374,7 +3375,7 @@ var Ba = (e, t) => {
3374
3375
  }, null, 8, ["title", "posts"]);
3375
3376
  };
3376
3377
  }
3377
- }), fo = { class: "main" }, po = { class: "pt-6 pb-8 space-y-2 md:space-y-5" }, mo = { class: "mb-6 text-3xl font-extrabold leading-9 tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl sm:leading-10 md:text-6xl md:leading-14" }, ho = /* @__PURE__ */ g({
3378
+ }), mo = { class: "main" }, ho = { class: "pt-6 pb-8 space-y-2 md:space-y-5" }, go = { class: "mb-6 text-3xl font-extrabold leading-9 tracking-tight text-gray-900 dark:text-gray-100 sm:text-4xl sm:leading-10 md:text-6xl md:leading-14" }, _o = /* @__PURE__ */ g({
3378
3379
  __name: "Page",
3379
3380
  props: { title: {
3380
3381
  type: String,
@@ -3382,9 +3383,9 @@ var Ba = (e, t) => {
3382
3383
  default: ""
3383
3384
  } },
3384
3385
  setup(e) {
3385
- return (t, n) => (T(), d("main", fo, [f("div", po, [f("h1", mo, E(e.title), 1)]), se(t.$slots, "default")]));
3386
+ return (t, n) => (T(), d("main", mo, [f("div", ho, [f("h1", go, E(e.title), 1)]), se(t.$slots, "default")]));
3386
3387
  }
3387
- }), go = /* @__PURE__ */ g({
3388
+ }), vo = /* @__PURE__ */ g({
3388
3389
  __name: "TermLink",
3389
3390
  props: {
3390
3391
  text: {
@@ -3397,44 +3398,45 @@ var Ba = (e, t) => {
3397
3398
  }
3398
3399
  },
3399
3400
  setup(e) {
3400
- let t = e, n = c(() => $a(t.text)), r = c(() => `${t.basePath}${n.value}`);
3401
- return (t, n) => (T(), l(qa, {
3401
+ let t = e, n = c(() => to(t.text)), r = c(() => `${t.basePath}${n.value}`), i = c(() => t.basePath === "/categories/" ? `View all posts in category ${t.text}` : `View all projects using ${t.text}`);
3402
+ return (t, n) => (T(), l(Ya, {
3402
3403
  to: r.value,
3404
+ "aria-label": i.value,
3403
3405
  class: "mr-2 text-sm font-medium uppercase link-alt"
3404
3406
  }, {
3405
3407
  default: O(() => [p(E(e.text), 1)]),
3406
3408
  _: 1
3407
- }, 8, ["to"]));
3409
+ }, 8, ["to", "aria-label"]));
3408
3410
  }
3409
- }), _o = { class: "flex p-4 component-border" }, vo = {
3411
+ }), yo = { class: "flex p-4 component-border" }, bo = {
3410
3412
  class: "text-center",
3411
3413
  style: { "min-width": "80px" }
3412
- }, yo = { class: "text-6xl font-bold" }, bo = { class: "pl-8" }, xo = { class: "flex flex-wrap mb-3" }, So = ["href", "title"], Co = { class: "flex flex-wrap mb-3" }, wo = ["innerHTML"], To = /* @__PURE__ */ g({
3414
+ }, xo = { class: "text-6xl font-bold" }, So = { class: "pl-8" }, Co = { class: "flex flex-wrap mb-3" }, wo = ["href", "title"], To = { class: "flex flex-wrap mb-3" }, Eo = ["innerHTML"], Do = /* @__PURE__ */ g({
3413
3415
  __name: "PostItem",
3414
3416
  props: { post: {
3415
3417
  type: Object,
3416
3418
  required: !0
3417
3419
  } },
3418
3420
  setup(e) {
3419
- let t = e, n = c(() => to(t.post.date));
3420
- return (t, r) => (T(), d("div", _o, [f("div", vo, [f("div", yo, E(n.value?.day), 1), f("div", null, E(n.value?.month) + ", " + E(n.value?.year), 1)]), f("div", bo, [
3421
- f("div", xo, [f("a", {
3421
+ let t = e, n = c(() => ro(t.post.date));
3422
+ return (t, r) => (T(), d("div", yo, [f("div", bo, [f("div", xo, E(n.value?.day), 1), f("div", null, E(n.value?.month) + ", " + E(n.value?.year), 1)]), f("div", So, [
3423
+ f("div", Co, [f("a", {
3422
3424
  class: "text-2xl font-bold leading-8 tracking-tight",
3423
3425
  href: e.post?.url,
3424
3426
  title: e.post.title
3425
- }, E(e.post.title), 9, So)]),
3426
- f("div", Co, [(T(!0), d(o, null, oe(e.post.categories, (e) => (T(), l(go, {
3427
+ }, E(e.post.title), 9, wo)]),
3428
+ f("div", To, [(T(!0), d(o, null, oe(e.post.categories, (e) => (T(), l(vo, {
3427
3429
  key: e,
3428
3430
  text: e,
3429
3431
  basePath: "/categories/"
3430
3432
  }, null, 8, ["text"]))), 128))]),
3431
- f("div", { innerHTML: e.post?.excerpt }, null, 8, wo)
3433
+ f("div", { innerHTML: e.post?.excerpt }, null, 8, Eo)
3432
3434
  ])]));
3433
3435
  }
3434
- }), Eo = {
3436
+ }), Oo = {
3435
3437
  key: 0,
3436
3438
  class: "grid grid-cols-1 lg:grid-cols-2 gap-4 mt-4"
3437
- }, Do = { key: 1 }, Oo = /* @__PURE__ */ g({
3439
+ }, ko = { key: 1 }, Ao = /* @__PURE__ */ g({
3438
3440
  __name: "PostList",
3439
3441
  props: { posts: {
3440
3442
  type: Object,
@@ -3443,12 +3445,12 @@ var Ba = (e, t) => {
3443
3445
  } },
3444
3446
  setup(e) {
3445
3447
  let { t } = $();
3446
- return (n, r) => (T(), d(o, null, [e.posts.length > 0 ? (T(), d("div", Eo, [(T(!0), d(o, null, oe(e.posts, (e) => (T(), l(To, {
3448
+ return (n, r) => (T(), d(o, null, [e.posts.length > 0 ? (T(), d("div", Oo, [(T(!0), d(o, null, oe(e.posts, (e) => (T(), l(Do, {
3447
3449
  key: e?.url,
3448
3450
  post: e
3449
- }, null, 8, ["post"]))), 128))])) : u("", !0), e.posts.length === 0 ? (T(), d("p", Do, E(D(t)("no_post")), 1)) : u("", !0)], 64));
3451
+ }, null, 8, ["post"]))), 128))])) : u("", !0), e.posts.length === 0 ? (T(), d("p", ko, E(D(t)("no_post")), 1)) : u("", !0)], 64));
3450
3452
  }
3451
- }), ko = /* @__PURE__ */ g({
3453
+ }), jo = /* @__PURE__ */ g({
3452
3454
  __name: "PostsPage",
3453
3455
  props: {
3454
3456
  title: {
@@ -3465,12 +3467,12 @@ var Ba = (e, t) => {
3465
3467
  return (t, n) => {
3466
3468
  let r = ce("Page");
3467
3469
  return T(), l(r, { title: e.title }, {
3468
- default: O(() => [m(Oo, { posts: e.posts }, null, 8, ["posts"])]),
3470
+ default: O(() => [m(Ao, { posts: e.posts }, null, 8, ["posts"])]),
3469
3471
  _: 1
3470
3472
  }, 8, ["title"]);
3471
3473
  };
3472
3474
  }
3473
- }), Ao = { class: "sr-only" }, jo = ["datetime"], Mo = /* @__PURE__ */ g({
3475
+ }), Mo = { class: "sr-only" }, No = ["datetime"], Po = /* @__PURE__ */ g({
3474
3476
  __name: "PostDate",
3475
3477
  props: {
3476
3478
  date: [Date, String],
@@ -3500,9 +3502,9 @@ var Ba = (e, t) => {
3500
3502
  string: i(e, r.value)
3501
3503
  };
3502
3504
  });
3503
- return (t, r) => (T(), d("dl", null, [f("dt", Ao, E(D(n)("posted_on")), 1), f("dd", { class: C(["font-medium leading-6", [e.textSize ? `text-${e.textSize}` : "text-base"]]) }, [f("time", { datetime: a.value.iso }, E(a.value.string), 9, jo)], 2)]));
3505
+ return (t, r) => (T(), d("dl", null, [f("dt", Mo, E(D(n)("posted_on")), 1), f("dd", { class: C(["font-medium leading-6", [e.textSize ? `text-${e.textSize}` : "text-base"]]) }, [f("time", { datetime: a.value.iso }, E(a.value.string), 9, No)], 2)]));
3504
3506
  }
3505
- }), No = /* @__PURE__ */ g({
3507
+ }), Fo = /* @__PURE__ */ g({
3506
3508
  __name: "StatusBadge",
3507
3509
  props: {
3508
3510
  backgroundColor: {
@@ -3552,24 +3554,24 @@ var Ba = (e, t) => {
3552
3554
  e.rounded ? "rounded" : ""
3553
3555
  ]]) }, [se(t.$slots, "default")], 2));
3554
3556
  }
3555
- }), Po = { class: "flex flex-col p-4 component-border" }, Fo = { class: "flex flex-row justify-between items-center mb-4" }, Io = ["href"], Lo = { class: "flex flex-row" }, Ro = ["href"], zo = ["href"], Bo = { class: "project-info" }, Vo = ["innerHTML"], Ho = { class: "flex flex-col justify-between" }, Uo = {
3557
+ }), Io = { class: "flex flex-col p-4 component-border" }, Lo = { class: "flex flex-row justify-between items-center mb-4" }, Ro = ["href"], zo = { class: "flex flex-row" }, Bo = ["href"], Vo = ["href"], Ho = { class: "project-info" }, Uo = ["innerHTML"], Wo = { class: "flex flex-col justify-between" }, Go = {
3556
3558
  key: 0,
3557
3559
  class: "mb-3"
3558
- }, Wo = { key: 1 }, Go = { class: "mb-3" }, Ko = { class: "flex flex-wrap mb-3" }, qo = { class: "text-end" }, Jo = ["href", "aria-label"], Yo = /* @__PURE__ */ g({
3560
+ }, Ko = { key: 1 }, qo = { class: "mb-3" }, Jo = { class: "flex flex-wrap mb-3" }, Yo = { class: "text-end" }, Xo = ["href", "aria-label"], Zo = /* @__PURE__ */ g({
3559
3561
  __name: "ProjectCard",
3560
3562
  props: { project: {
3561
3563
  type: Object,
3562
3564
  required: !0
3563
3565
  } },
3564
3566
  setup(e) {
3565
- let t = e, { t: n } = $(), r = c(() => no(t.project.developmentStatus));
3567
+ let t = e, { t: n } = $(), r = c(() => io(t.project.developmentStatus));
3566
3568
  return (t, i) => {
3567
3569
  let a = ce("Icon");
3568
- return T(), d("div", Po, [
3569
- f("div", Fo, [f("a", {
3570
+ return T(), d("div", Io, [
3571
+ f("div", Lo, [f("a", {
3570
3572
  href: e.project.url,
3571
3573
  class: "text-2xl font-bold leading-8 tracking-tight"
3572
- }, E(e.project.title), 9, Io), f("div", Lo, [e.project.showcaseUrl ? (T(), d("a", {
3574
+ }, E(e.project.title), 9, Ro), f("div", zo, [e.project.showcaseUrl ? (T(), d("a", {
3573
3575
  key: 0,
3574
3576
  class: "mx-1 text-gray-500 hover:text-gray-600",
3575
3577
  target: "_blank",
@@ -3578,7 +3580,7 @@ var Ba = (e, t) => {
3578
3580
  }, [i[0] ||= f("span", { class: "sr-only" }, "external-link", -1), m(a, {
3579
3581
  icon: "bi:box-arrow-up-right",
3580
3582
  class: "text-dark dark:text-white ml-2"
3581
- })], 8, Ro)) : u("", !0), e.project.repositoryUrl ? (T(), d("a", {
3583
+ })], 8, Bo)) : u("", !0), e.project.repositoryUrl ? (T(), d("a", {
3582
3584
  key: 1,
3583
3585
  class: "mx-1 text-gray-500 hover:text-gray-600",
3584
3586
  target: "_blank",
@@ -3587,41 +3589,41 @@ var Ba = (e, t) => {
3587
3589
  }, [i[1] ||= f("span", { class: "sr-only" }, "github", -1), m(a, {
3588
3590
  icon: "bi:github",
3589
3591
  class: "text-dark dark:text-white ml-2"
3590
- })], 8, zo)) : u("", !0)])]),
3591
- f("div", Bo, [f("div", { innerHTML: e.project.excerpt }, null, 8, Vo), f("div", Ho, [
3592
- e.project.license ? (T(), d("div", Uo, [p(E(D(n)("license")) + ": ", 1), e.project.licenseUrl ? (T(), l(Xa, {
3592
+ })], 8, Vo)) : u("", !0)])]),
3593
+ f("div", Ho, [f("div", { innerHTML: e.project.excerpt }, null, 8, Uo), f("div", Wo, [
3594
+ e.project.license ? (T(), d("div", Go, [p(E(D(n)("license")) + ": ", 1), e.project.licenseUrl ? (T(), l(Qa, {
3593
3595
  key: 0,
3594
3596
  href: e.project.licenseUrl,
3595
3597
  class: "link-alt"
3596
3598
  }, {
3597
3599
  default: O(() => [p(E(e.project.license), 1)]),
3598
3600
  _: 1
3599
- }, 8, ["href"])) : (T(), d("span", Wo, E(e.project.license), 1))])) : u("", !0),
3600
- f("div", Go, [p(E(D(n)("development_status.title")) + ": ", 1), m(No, ne(b(r.value)), {
3601
+ }, 8, ["href"])) : (T(), d("span", Ko, E(e.project.license), 1))])) : u("", !0),
3602
+ f("div", qo, [p(E(D(n)("development_status.title")) + ": ", 1), m(Fo, ne(b(r.value)), {
3601
3603
  default: O(() => [p(E(t.$t(`development_status.${e.project.developmentStatus}`)), 1)]),
3602
3604
  _: 1
3603
3605
  }, 16)]),
3604
- f("div", Ko, [(T(!0), d(o, null, oe(e.project.techs, (e) => (T(), l(go, {
3606
+ f("div", Jo, [(T(!0), d(o, null, oe(e.project.techs, (e) => (T(), l(vo, {
3605
3607
  key: e,
3606
3608
  text: e,
3607
3609
  basePath: "/projects?tech="
3608
3610
  }, null, 8, ["text"]))), 128))]),
3609
- m(Mo, {
3611
+ m(Po, {
3610
3612
  date: e.project.date,
3611
3613
  "text-size": "sm"
3612
3614
  }, null, 8, ["date"])
3613
3615
  ])]),
3614
- f("div", qo, [f("a", {
3616
+ f("div", Yo, [f("a", {
3615
3617
  href: e.project.url,
3616
3618
  "aria-label": `Read ${e.project.title}`
3617
- }, E(D(n)("button.read_more")) + " → ", 9, Jo)])
3619
+ }, E(D(n)("button.read_more")) + " → ", 9, Xo)])
3618
3620
  ]);
3619
3621
  };
3620
3622
  }
3621
- }), Xo = {
3623
+ }), Qo = {
3622
3624
  key: 0,
3623
3625
  class: "grid grid-cols-1 lg:grid-cols-2 gap-4 mt-4"
3624
- }, Zo = { key: 1 }, Qo = /* @__PURE__ */ g({
3626
+ }, $o = { key: 1 }, es = /* @__PURE__ */ g({
3625
3627
  __name: "ProjectList",
3626
3628
  props: { projects: {
3627
3629
  type: Object,
@@ -3630,12 +3632,12 @@ var Ba = (e, t) => {
3630
3632
  } },
3631
3633
  setup(e) {
3632
3634
  let { t } = $();
3633
- return (n, r) => (T(), d(o, null, [e.projects.length > 0 ? (T(), d("div", Xo, [(T(!0), d(o, null, oe(e.projects, (e) => (T(), l(Yo, {
3635
+ return (n, r) => (T(), d(o, null, [e.projects.length > 0 ? (T(), d("div", Qo, [(T(!0), d(o, null, oe(e.projects, (e) => (T(), l(Zo, {
3634
3636
  key: e?.url,
3635
3637
  project: e
3636
- }, null, 8, ["project"]))), 128))])) : u("", !0), e.projects.length === 0 ? (T(), d("p", Zo, E(D(t)("no_post")), 1)) : u("", !0)], 64));
3638
+ }, null, 8, ["project"]))), 128))])) : u("", !0), e.projects.length === 0 ? (T(), d("p", $o, E(D(t)("no_post")), 1)) : u("", !0)], 64));
3637
3639
  }
3638
- }), $o = ["href"], es = { class: "flex flex-row flex-wrap" }, ts = ["href"], ns = /* @__PURE__ */ g({
3640
+ }), ts = ["href"], ns = { class: "flex flex-row flex-wrap" }, rs = ["href"], is = /* @__PURE__ */ g({
3639
3641
  __name: "ProjectsPage",
3640
3642
  props: {
3641
3643
  projectPage: {
@@ -3654,10 +3656,10 @@ var Ba = (e, t) => {
3654
3656
  }
3655
3657
  },
3656
3658
  setup(e) {
3657
- let t = e, { t: n } = $(), r = t.technology, i = typeof r == "string" && r.length > 0, a = (e) => !i || e.techs.some(eo(r)), s = c(() => t.projects.filter(a)), p = c(() => [...new Set(t.projects.flatMap((e) => e.techs))].map((e) => ({
3659
+ let t = e, { t: n } = $(), r = t.technology, i = typeof r == "string" && r.length > 0, a = (e) => !i || e.techs.some(no(r)), s = c(() => t.projects.filter(a)), p = c(() => [...new Set(t.projects.flatMap((e) => e.techs))].map((e) => ({
3658
3660
  name: e,
3659
- slug: $a(e),
3660
- selected: i && $a(e) === r
3661
+ slug: to(e),
3662
+ selected: i && to(e) === r
3661
3663
  })).sort((e, t) => t.selected === e.selected ? 0 : t.selected ? 1 : -1));
3662
3664
  return (t, r) => {
3663
3665
  let a = ce("Page");
@@ -3665,18 +3667,18 @@ var Ba = (e, t) => {
3665
3667
  default: O(() => [f("div", null, [f("p", null, [r[0] ||= f("span", { class: "mr-2" }, "Technologies", -1), D(i) ? (T(), d("a", {
3666
3668
  key: 0,
3667
3669
  href: e.projectPage
3668
- }, "Reset", 8, $o)) : u("", !0)]), f("p", es, [(T(!0), d(o, null, oe(p.value, (e) => (T(), d("a", {
3670
+ }, "Reset", 8, ts)) : u("", !0)]), f("p", ns, [(T(!0), d(o, null, oe(p.value, (e) => (T(), d("a", {
3669
3671
  class: C(["border rounded-md m-1 p-1", e.selected ? "bg-primary text-white! border-primary" : ""]),
3670
3672
  href: `/projects-by-tech/${e.slug}`
3671
- }, E(e.name), 11, ts))), 256))])]), m(Qo, { projects: s.value }, null, 8, ["projects"])]),
3673
+ }, E(e.name), 11, rs))), 256))])]), m(es, { projects: s.value }, null, 8, ["projects"])]),
3672
3674
  _: 1
3673
3675
  }, 8, ["title"]);
3674
3676
  };
3675
3677
  }
3676
- }), rs = { class: "flex flex-wrap pt-4" }, is = {
3678
+ }), as = { class: "flex flex-wrap pt-4" }, os = {
3677
3679
  key: 0,
3678
3680
  class: "mt-2 mb-2 mr-5"
3679
- }, as = /* @__PURE__ */ g({
3681
+ }, ss = /* @__PURE__ */ g({
3680
3682
  __name: "TagsPage",
3681
3683
  props: { posts: {
3682
3684
  type: Object,
@@ -3684,15 +3686,15 @@ var Ba = (e, t) => {
3684
3686
  default: []
3685
3687
  } },
3686
3688
  setup(e) {
3687
- let t = e, { t: n } = $(), r = c(() => ro(t.posts.flatMap((e) => e.tags)));
3689
+ let t = e, { t: n } = $(), r = c(() => ao(t.posts.flatMap((e) => e.tags)));
3688
3690
  return (e, t) => {
3689
3691
  let i = ce("Page");
3690
3692
  return T(), l(i, { title: D(n)("tags") }, {
3691
- default: O(() => [f("div", rs, [Object.keys(r.value).length === 0 ? (T(), d("div", is, E(D(n)("no_tag")), 1)) : u("", !0), (T(!0), d(o, null, oe(r.value, (e, t) => (T(), l(Qa, {
3693
+ default: O(() => [f("div", as, [Object.keys(r.value).length === 0 ? (T(), d("div", os, E(D(n)("no_tag")), 1)) : u("", !0), (T(!0), d(o, null, oe(r.value, (e, t) => (T(), l(eo, {
3692
3694
  key: t,
3693
3695
  title: t,
3694
3696
  count: e,
3695
- href: `/tags/${D($a)(t)}`
3697
+ href: `/tags/${D(to)(t)}`
3696
3698
  }, null, 8, [
3697
3699
  "title",
3698
3700
  "count",
@@ -3702,7 +3704,7 @@ var Ba = (e, t) => {
3702
3704
  }, 8, ["title"]);
3703
3705
  };
3704
3706
  }
3705
- }), os = Oa({
3707
+ }), cs = Oa({
3706
3708
  legacy: !1,
3707
3709
  locale: "en",
3708
3710
  messages: {
@@ -3757,14 +3759,14 @@ var Ba = (e, t) => {
3757
3759
  }
3758
3760
  }
3759
3761
  }
3760
- }), ss = {
3762
+ }), ls = {
3761
3763
  extends: t,
3762
- Layout: Ga,
3764
+ Layout: qa,
3763
3765
  enhanceApp({ app: t }) {
3764
- t.component("Icon", e), t.component("Page", ho), t.component("PostsPage", ko), t.component("HomePage", uo), t.component("ProjectsPage", ns), t.component("CategoriesPage", lo), t.component("TagsPage", as), t.component("ArchivesPage", oo), t.use(os);
3766
+ t.component("Icon", e), t.component("Page", _o), t.component("PostsPage", jo), t.component("HomePage", po), t.component("ProjectsPage", is), t.component("CategoriesPage", fo), t.component("TagsPage", ss), t.component("ArchivesPage", co), t.use(cs);
3765
3767
  },
3766
3768
  setup() {
3767
- fe(), me(os);
3769
+ fe(), me(cs);
3768
3770
  }
3769
3771
  };
3770
- export { ss as default, pe as matchLocale, fe as useHtmlLang, k as usePageLang, me as usePageLocale, to as usePostDate, no as useProjectStatusStyle, ro as useRank, $a as useSlug, eo as useSlugFilter };
3772
+ export { ls as default, pe as matchLocale, fe as useHtmlLang, k as usePageLang, me as usePageLocale, ro as usePostDate, io as useProjectStatusStyle, ao as useRank, to as useSlug, no as useSlugFilter };
@@ -10,6 +10,14 @@ export declare interface CustomDonationBaseConfig {
10
10
  donationBaseUrl: string;
11
11
  donationButtonImage: string;
12
12
  donationButtonStyle?: Record<string, string>;
13
+ /**
14
+ * Intrinsic image dimensions, used for width/height attributes so the
15
+ * browser can reserve layout space before the image loads.
16
+ */
17
+ donationButtonSize?: {
18
+ width: number;
19
+ height: number;
20
+ };
13
21
  }
14
22
  export declare interface CustomDonationConfig extends CustomDonationBaseConfig {
15
23
  donationId: string;
@@ -1,2 +1,2 @@
1
- .VPFooter[data-v-84ab49a2]{z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);background-color:var(--vp-c-bg);padding:32px 24px;position:relative}.VPFooter.has-sidebar[data-v-84ab49a2]{display:none}.VPFooter[data-v-84ab49a2] a{text-underline-offset:2px;text-decoration-line:underline;transition:none}.VPFooter[data-v-84ab49a2] a:hover{color:var(--vp-c-text-1)}@media (width>=768px){.VPFooter[data-v-84ab49a2]{padding:32px}}.container[data-v-84ab49a2]{max-width:var(--vp-layout-max-width);text-align:center;margin:0 auto}.message[data-v-84ab49a2],.copyright[data-v-84ab49a2]{color:var(--vp-c-text-2);font-size:14px;font-weight:500;line-height:24px}.divider[data-v-6a2933ea]{background-color:var(--vp-c-divider);content:"";width:1px;height:24px;margin-left:16px;margin-right:8px}.VPLocaleSwitcher[data-v-6a2933ea]{width:36px;height:36px;color:var(--vp-c-text-2);justify-content:center;align-items:center;transition:none;display:flex}.VPLocaleSwitcher[data-v-6a2933ea]:hover{color:var(--vp-c-text-1);transition:none}.VPLocaleSwitcher[data-v-6a2933ea]>svg{fill:currentColor;width:20px;height:20px}:root{--vp-z-index-aside:25}.VPDoc.has-aside .aside-container{z-index:var(--vp-z-index-aside)}.medium-zoom--opened .medium-zoom-overlay{z-index:calc(var(--vp-z-index-aside) + 1)}.medium-zoom-image--opened{z-index:calc(var(--vp-z-index-aside) + 2)}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-100:oklch(96.2% .044 156.743);--color-green-800:oklch(44.8% .119 151.328);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--radius-md:.375rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary:#3b82f6;--color-primary-alt:#1d4ed8;--color-primary-alt-dark:#93c5fd;--color-secondary:#ef4444;--color-secondary-dark:#eab308}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-1{margin:var(--spacing)}.mx-1{margin-inline:var(--spacing)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.h-4{height:calc(var(--spacing) * 4)}.w-4{width:calc(var(--spacing) * 4)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.component-border{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-500)}@media (hover:hover){.component-border:hover{border-color:var(--color-secondary)}.component-border:where(.dark,.dark *):hover{border-color:var(--color-secondary-dark)}}.rounded{border-radius:.25rem}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-primary{border-color:var(--color-primary)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-green-100{background-color:var(--color-green-100)}.bg-primary{background-color:var(--color-primary)}.bg-red-100{background-color:var(--color-red-100)}.bg-yellow-100{background-color:var(--color-yellow-100)}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-end{text-align:end}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\/\[32px\]{font-size:var(--text-sm);line-height:32px}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-9{--tw-leading:calc(var(--spacing) * 9);line-height:calc(var(--spacing) * 9)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.link-alt{text-decoration-line:none!important}@media (hover:hover){.link-alt:hover{color:var(--color-secondary)!important}.link-alt:where(.dark,.dark *):hover{color:var(--color-secondary-dark)!important}}.link-alt{color:var(--color-primary-alt)!important}.link-alt:where(.dark,.dark *){color:var(--color-primary-alt-dark)!important}.link{text-decoration-line:none}@media (hover:hover){.link:hover{color:var(--color-secondary)}.link:where(.dark,.dark *):hover{color:var(--color-secondary-dark)}}.text-blue-800{color:var(--color-blue-800)}.text-gray-500{color:var(--color-gray-500)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-800{color:var(--color-green-800)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-white\!{color:var(--color-white)!important}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}}@media (width>=40rem){.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:leading-10{--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10)}}@media (width>=48rem){:where(.md\:space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:leading-14{--tw-leading:calc(var(--spacing) * 14);line-height:calc(var(--spacing) * 14)}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.dark\:bg-blue-800:where(.dark,.dark *){background-color:var(--color-blue-800)}.dark\:bg-gray-700:where(.dark,.dark *){background-color:var(--color-gray-700)}.dark\:bg-green-800:where(.dark,.dark *){background-color:var(--color-green-800)}.dark\:bg-red-800:where(.dark,.dark *){background-color:var(--color-red-800)}.dark\:bg-yellow-800:where(.dark,.dark *){background-color:var(--color-yellow-800)}.dark\:text-blue-100:where(.dark,.dark *){color:var(--color-blue-100)}.dark\:text-gray-100:where(.dark,.dark *){color:var(--color-gray-100)}.dark\:text-gray-200:where(.dark,.dark *){color:var(--color-gray-200)}.dark\:text-green-100:where(.dark,.dark *){color:var(--color-green-100)}.dark\:text-red-100:where(.dark,.dark *){color:var(--color-red-100)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-100:where(.dark,.dark *){color:var(--color-yellow-100)}@media (hover:hover){.dark\:hover\:text-blue-400:where(.dark,.dark *):hover{color:var(--color-blue-400)}}}:root{--vp-c-brand-1:var(--color-primary)}.vp-doc a{text-decoration-line:none}@media (hover:hover){.vp-doc a:hover{color:var(--color-secondary)}.vp-doc a:where(.dark,.dark *):hover{color:var(--color-secondary-dark)}}:root{--vp-font-family-base:"Inter", ui-sans-serif, system-ui, sans-serif;--vp-font-family-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--accent:#644ac9;--accent-soft:#8668e0;--green:#14710a;--vp-c-bg:#fffbeb;--vp-c-bg-alt:#f5f1df;--vp-c-bg-elv:#ece8d3;--vp-c-bg-soft:#f7f3e1;--vp-c-divider:#d9d4bb;--vp-c-gutter:#f5f1df;--vp-c-text-1:#1f1f1f;--vp-c-text-2:#4b4b52;--vp-c-text-3:#6c664b;--vp-c-brand-1:#644ac9;--vp-c-brand-2:#7459d8;--vp-c-brand-3:#644ac9;--vp-c-brand-soft:#644ac91f;--color-primary:#644ac9;--color-primary-alt:#4f39a8;--color-primary-alt-dark:#8668e0;--color-secondary:#3b2a8a;--color-secondary-dark:#3b2a8a;--color-green-100:#d4f2cf;--color-green-800:#14710a}.dark{--accent:#bd93f9;--accent-soft:#d6bcfa;--green:#50fa7b;--color-primary:#9d6ff0;--color-primary-alt:#8a5cd8;--color-primary-alt-dark:#d6bcfa;--color-secondary:#f8f8f2;--color-secondary-dark:#f8f8f2;--color-green-100:#50fa7b;--color-green-800:#1f4d33;--vp-c-bg:#282a36;--vp-c-bg-alt:#21222c;--vp-c-bg-elv:#343746;--vp-c-bg-soft:#2f3241;--vp-c-divider:#44475a;--vp-c-gutter:#21222c;--vp-c-text-1:#f8f8f2;--vp-c-text-2:#b6b8c9;--vp-c-text-3:#8e94b3;--vp-c-brand-1:var(--accent);--vp-c-brand-2:var(--accent);--vp-c-brand-3:#9d6ff0;--vp-c-brand-soft:#bd93f929}body{letter-spacing:-.005em}.VPNav .VPNavBar,.VPNavBar .content-body{-webkit-backdrop-filter:saturate(180%)blur(12px);backdrop-filter:saturate(180%)blur(12px)}.VPNavBar:not(.has-sidebar):not(.home.top){background-color:#fffbebd9}.dark .VPNavBar:not(.has-sidebar):not(.home.top){background-color:#282a36cc}.component-border{background:var(--vp-c-bg-soft);border:1px solid var(--vp-c-divider);border-radius:0;transition:none}.component-border:hover,.component-border:focus-within{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.component-border:hover,.component-border:focus-within{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}}.component-border:hover,.component-border:focus-within{background:linear-gradient(180deg, var(--accent), var(--vp-c-bg-soft))}@supports (color:color-mix(in lab, red, red)){.component-border:hover,.component-border:focus-within{background:linear-gradient(180deg, color-mix(in srgb, var(--accent) 7%, var(--vp-c-bg-soft)), var(--vp-c-bg-soft))}}.component-border:hover,.component-border:focus-within{box-shadow:0 0 0 1px var(--accent), 0 8px 30px -12px var(--accent)}@supports (color:color-mix(in lab, red, red)){.component-border:hover,.component-border:focus-within{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 18%, transparent), 0 8px 30px -12px color-mix(in srgb, var(--accent) 45%, transparent)}}.component-border>.pl-8 a.text-2xl,.component-border a.text-2xl{color:var(--vp-c-text-1);letter-spacing:-.02em;font-weight:600}.component-border a.text-2xl{transition:none}.component-border a.text-2xl:hover{color:var(--accent);text-shadow:0 0 18px var(--accent)}@supports (color:color-mix(in lab, red, red)){.component-border a.text-2xl:hover{text-shadow:0 0 18px color-mix(in srgb, var(--accent) 45%, transparent)}}.component-border a.text-2xl:active{color:var(--accent-soft);text-shadow:none}.component-border .text-6xl{font-family:var(--vp-font-family-mono);color:var(--vp-c-text-1);font-size:2.5rem;font-weight:500;line-height:1}a.link-alt.uppercase,.component-border a.uppercase{border:1px solid var(--vp-c-divider);background:var(--vp-c-bg-elv);letter-spacing:.04em;border-radius:0;margin-bottom:4px;padding:2px 10px;font-size:.7rem;font-weight:500;transition:none;display:inline-block}a.link-alt.uppercase:hover{border-color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab, red, red)){a.link-alt.uppercase:hover{background:color-mix(in srgb, var(--accent) 16%, var(--vp-c-bg-elv))}}a.link-alt.uppercase:active{background:var(--accent)}@supports (color:color-mix(in lab, red, red)){a.link-alt.uppercase:active{background:color-mix(in srgb, var(--accent) 30%, var(--vp-c-bg-elv))}}a.link-alt.uppercase:active{transform:translateY(1px)}a.component-border{border-radius:0}.vp-doc a,.vp-doc a:hover{color:var(--vp-c-brand-1);font-weight:500;text-decoration:none}.vp-doc a:hover{color:var(--vp-c-brand-2)}a,a:hover,.vp-doc a,.vp-doc a:hover,.vp-doc .header-anchor{text-decoration:none!important}.vp-doc h1{letter-spacing:-.03em;font-weight:700}.vp-doc h2{letter-spacing:-.02em;border-top-color:var(--vp-c-divider)}.vp-doc p,.vp-doc li{line-height:1.75}.vp-doc :not(pre)>code{color:var(--green);font-family:var(--vp-font-family-mono);border:1px solid var(--vp-c-divider);border-radius:0;font-size:.85em}.vp-doc div[class*=language-]{border:1px solid var(--vp-c-divider);border-radius:0}a:focus-visible,button:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:0}.home-hero{padding:56px 0 8px}.home-hero h1{letter-spacing:-.04em;margin:0;font-size:clamp(2rem,5vw,3.25rem);font-weight:700;line-height:1.1}.home-hero h1 span{background:linear-gradient(90deg, var(--vp-c-text-1), var(--accent-soft) 70%, var(--accent));color:#0000;-webkit-background-clip:text;background-clip:text}.home-hero p{max-width:36rem;color:var(--vp-c-text-2);margin:16px 0 0;font-size:1.1rem;line-height:1.6}@media (prefers-reduced-motion:reduce){.component-border,a.link-alt.uppercase{transition:none}}[class*=rounded],.VPNavBarSearchButton,.vp-doc [class*=language-],.vp-doc :not(pre)>code,.vp-doc img,.vp-doc table,.custom-block,.VPLocalSearchBox .results .result,.VPSkipLink,.keys,button.copy,.VPSwitch,.VPSwitch .check{border-radius:0!important}p.flex.flex-wrap>a.border.m-1{margin:.25rem;padding:.25rem .875rem;transition:none}p.flex.flex-wrap>a.border.m-1:hover{border-color:var(--accent);background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){p.flex.flex-wrap>a.border.m-1:hover{background-color:color-mix(in srgb, var(--accent) 14%, transparent)}}@media (width<=639px){.component-border.flex:has(>.text-center){flex-direction:column}.component-border>.text-center{text-align:left;align-items:baseline;gap:.5rem;margin-bottom:.5rem;display:flex;min-width:0!important}.component-border>.text-center .text-6xl{font-size:1.75rem}.component-border>.pl-8{padding-left:0}p.flex.flex-wrap:has(>a.border.m-1){-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap;margin-inline:-.25rem;padding-bottom:.25rem;overflow-x:auto}p.flex.flex-wrap:has(>a.border.m-1)::-webkit-scrollbar{display:none}p.flex.flex-wrap>a.border.m-1{white-space:nowrap;flex:none;align-items:center;min-height:2.25rem;display:inline-flex}div.pt-6.pb-8{padding-top:.75rem;padding-bottom:.5rem}div.pt-6.pb-8>h1.mb-6{margin-bottom:.75rem}a.link-alt.uppercase,.component-border a.uppercase{margin-bottom:6px;padding:6px 12px}}div.flex.flex-wrap.py-4.items-center.justify-center:has(>a[href*=ko-fi\.com]){gap:12px}div.flex.flex-wrap.py-4.items-center.justify-center:has(>a[href*=ko-fi\.com])>a{justify-content:center;align-items:center;width:200px;height:56px;display:flex;margin:0!important}div.flex.flex-wrap.py-4.items-center.justify-center:has(>a[href*=ko-fi\.com])>a img{-o-object-fit:contain;object-fit:contain;max-width:100%;max-height:100%}div.flex.flex-wrap.py-4.items-center.justify-center.space-y-4:has(>a[href*=ko-fi\.com]){flex-flow:column}div.flex.flex-wrap.py-4.items-center.justify-center.space-x-4:has(>a[href*=ko-fi\.com]){grid-template-columns:repeat(2,168px);justify-content:center;gap:12px;display:grid}div.flex.flex-wrap.py-4.items-center.justify-center.space-x-4:has(>a[href*=ko-fi\.com])>a{width:168px;height:52px}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}
1
+ .VPFooter[data-v-6216a7be]{z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);background-color:var(--vp-c-bg);padding:32px 24px;position:relative}.VPFooter.has-sidebar[data-v-6216a7be]{display:none}.VPFooter[data-v-6216a7be] a{text-underline-offset:2px;text-decoration-line:underline;transition:none}.VPFooter[data-v-6216a7be] a:hover{color:var(--vp-c-text-1)}@media (width>=768px){.VPFooter[data-v-6216a7be]{padding:32px}}.container[data-v-6216a7be]{max-width:var(--vp-layout-max-width);text-align:center;margin:0 auto}.message[data-v-6216a7be],.copyright[data-v-6216a7be]{color:var(--vp-c-text-2);font-size:14px;font-weight:500;line-height:24px}.divider[data-v-871d7d08]{background-color:var(--vp-c-divider);content:"";width:1px;height:24px;margin-left:16px;margin-right:8px}.VPLocaleSwitcher[data-v-871d7d08]{width:36px;height:36px;color:var(--vp-c-text-2);justify-content:center;align-items:center;transition:none;display:flex}.VPLocaleSwitcher[data-v-871d7d08]:hover{color:var(--vp-c-text-1);transition:none}.VPLocaleSwitcher[data-v-871d7d08]>svg{fill:currentColor;width:20px;height:20px}:root{--vp-z-index-aside:25}.VPDoc.has-aside .aside-container{z-index:var(--vp-z-index-aside)}.medium-zoom--opened .medium-zoom-overlay{z-index:calc(var(--vp-z-index-aside) + 1)}.medium-zoom-image--opened{z-index:calc(var(--vp-z-index-aside) + 2)}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-100:oklch(96.2% .044 156.743);--color-green-800:oklch(44.8% .119 151.328);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--radius-md:.375rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary:#3b82f6;--color-primary-alt:#1d4ed8;--color-primary-alt-dark:#93c5fd;--color-secondary:#ef4444;--color-secondary-dark:#eab308}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-1{margin:var(--spacing)}.mx-1{margin-inline:var(--spacing)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-5{margin-right:calc(var(--spacing) * 5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.h-4{height:calc(var(--spacing) * 4)}.w-4{width:calc(var(--spacing) * 4)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}.component-border{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-500)}@media (hover:hover){.component-border:hover{border-color:var(--color-secondary)}.component-border:where(.dark,.dark *):hover{border-color:var(--color-secondary-dark)}}.rounded{border-radius:.25rem}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-primary{border-color:var(--color-primary)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-green-100{background-color:var(--color-green-100)}.bg-primary{background-color:var(--color-primary)}.bg-red-100{background-color:var(--color-red-100)}.bg-yellow-100{background-color:var(--color-yellow-100)}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-end{text-align:end}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\/\[32px\]{font-size:var(--text-sm);line-height:32px}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-8{--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)}.leading-9{--tw-leading:calc(var(--spacing) * 9);line-height:calc(var(--spacing) * 9)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.link-alt{text-decoration-line:none!important}@media (hover:hover){.link-alt:hover{color:var(--color-secondary)!important}.link-alt:where(.dark,.dark *):hover{color:var(--color-secondary-dark)!important}}.link-alt{color:var(--color-primary-alt)!important}.link-alt:where(.dark,.dark *){color:var(--color-primary-alt-dark)!important}.link{text-decoration-line:none}@media (hover:hover){.link:hover{color:var(--color-secondary)}.link:where(.dark,.dark *):hover{color:var(--color-secondary-dark)}}.text-blue-800{color:var(--color-blue-800)}.text-gray-500{color:var(--color-gray-500)}.text-gray-700{color:var(--color-gray-700)}.text-gray-900{color:var(--color-gray-900)}.text-green-800{color:var(--color-green-800)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-white\!{color:var(--color-white)!important}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}}@media (width>=40rem){.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:leading-10{--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10)}}@media (width>=48rem){:where(.md\:space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:leading-14{--tw-leading:calc(var(--spacing) * 14);line-height:calc(var(--spacing) * 14)}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.dark\:bg-blue-800:where(.dark,.dark *){background-color:var(--color-blue-800)}.dark\:bg-gray-700:where(.dark,.dark *){background-color:var(--color-gray-700)}.dark\:bg-green-800:where(.dark,.dark *){background-color:var(--color-green-800)}.dark\:bg-red-800:where(.dark,.dark *){background-color:var(--color-red-800)}.dark\:bg-yellow-800:where(.dark,.dark *){background-color:var(--color-yellow-800)}.dark\:text-blue-100:where(.dark,.dark *){color:var(--color-blue-100)}.dark\:text-gray-100:where(.dark,.dark *){color:var(--color-gray-100)}.dark\:text-gray-200:where(.dark,.dark *){color:var(--color-gray-200)}.dark\:text-green-100:where(.dark,.dark *){color:var(--color-green-100)}.dark\:text-red-100:where(.dark,.dark *){color:var(--color-red-100)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-100:where(.dark,.dark *){color:var(--color-yellow-100)}@media (hover:hover){.dark\:hover\:text-blue-400:where(.dark,.dark *):hover{color:var(--color-blue-400)}}}:root{--vp-c-brand-1:var(--color-primary)}.vp-doc a{text-decoration-line:none}@media (hover:hover){.vp-doc a:hover{color:var(--color-secondary)}.vp-doc a:where(.dark,.dark *):hover{color:var(--color-secondary-dark)}}:root{--vp-font-family-base:"Inter", ui-sans-serif, system-ui, sans-serif;--vp-font-family-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;--accent:#644ac9;--accent-soft:#8668e0;--green:#14710a;--vp-c-bg:#fffbeb;--vp-c-bg-alt:#f5f1df;--vp-c-bg-elv:#ece8d3;--vp-c-bg-soft:#f7f3e1;--vp-c-divider:#d9d4bb;--vp-c-gutter:#f5f1df;--vp-c-text-1:#1f1f1f;--vp-c-text-2:#4b4b52;--vp-c-text-3:#6c664b;--vp-c-brand-1:#644ac9;--vp-c-brand-2:#7459d8;--vp-c-brand-3:#644ac9;--vp-c-brand-soft:#644ac91f;--color-primary:#644ac9;--color-primary-alt:#4f39a8;--color-primary-alt-dark:#8668e0;--color-secondary:#3b2a8a;--color-secondary-dark:#3b2a8a;--color-green-100:#d4f2cf;--color-green-800:#14710a}.dark{--accent:#bd93f9;--accent-soft:#d6bcfa;--green:#50fa7b;--color-primary:#9d6ff0;--color-primary-alt:#8a5cd8;--color-primary-alt-dark:#d6bcfa;--color-secondary:#f8f8f2;--color-secondary-dark:#f8f8f2;--color-green-100:#50fa7b;--color-green-800:#1f4d33;--vp-c-bg:#282a36;--vp-c-bg-alt:#21222c;--vp-c-bg-elv:#343746;--vp-c-bg-soft:#2f3241;--vp-c-divider:#44475a;--vp-c-gutter:#21222c;--vp-c-text-1:#f8f8f2;--vp-c-text-2:#b6b8c9;--vp-c-text-3:#8e94b3;--vp-c-brand-1:var(--accent);--vp-c-brand-2:var(--accent);--vp-c-brand-3:#9d6ff0;--vp-c-brand-soft:#bd93f929}body{letter-spacing:-.005em}.VPNav .VPNavBar,.VPNavBar .content-body{-webkit-backdrop-filter:saturate(180%)blur(12px);backdrop-filter:saturate(180%)blur(12px)}.VPNavBar:not(.has-sidebar):not(.home.top){background-color:#fffbebd9}.dark .VPNavBar:not(.has-sidebar):not(.home.top){background-color:#282a36cc}.component-border{background:var(--vp-c-bg-soft);border:1px solid var(--vp-c-divider);border-radius:0;transition:none}.component-border:hover,.component-border:focus-within{border-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.component-border:hover,.component-border:focus-within{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}}.component-border:hover,.component-border:focus-within{background:linear-gradient(180deg, var(--accent), var(--vp-c-bg-soft))}@supports (color:color-mix(in lab, red, red)){.component-border:hover,.component-border:focus-within{background:linear-gradient(180deg, color-mix(in srgb, var(--accent) 7%, var(--vp-c-bg-soft)), var(--vp-c-bg-soft))}}.component-border:hover,.component-border:focus-within{box-shadow:0 0 0 1px var(--accent), 0 8px 30px -12px var(--accent)}@supports (color:color-mix(in lab, red, red)){.component-border:hover,.component-border:focus-within{box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 18%, transparent), 0 8px 30px -12px color-mix(in srgb, var(--accent) 45%, transparent)}}.component-border>.pl-8 a.text-2xl,.component-border a.text-2xl{color:var(--vp-c-text-1);letter-spacing:-.02em;font-weight:600}.component-border a.text-2xl{transition:none}.component-border a.text-2xl:hover{color:var(--accent);text-shadow:0 0 18px var(--accent)}@supports (color:color-mix(in lab, red, red)){.component-border a.text-2xl:hover{text-shadow:0 0 18px color-mix(in srgb, var(--accent) 45%, transparent)}}.component-border a.text-2xl:active{color:var(--accent-soft);text-shadow:none}.component-border .text-6xl{font-family:var(--vp-font-family-mono);color:var(--vp-c-text-1);font-size:2.5rem;font-weight:500;line-height:1}a.link-alt.uppercase,.component-border a.uppercase{border:1px solid var(--vp-c-divider);background:var(--vp-c-bg-elv);letter-spacing:.04em;border-radius:0;margin-bottom:4px;padding:2px 10px;font-size:.7rem;font-weight:500;transition:none;display:inline-block}a.link-alt.uppercase:hover{border-color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab, red, red)){a.link-alt.uppercase:hover{background:color-mix(in srgb, var(--accent) 16%, var(--vp-c-bg-elv))}}a.link-alt.uppercase:active{background:var(--accent)}@supports (color:color-mix(in lab, red, red)){a.link-alt.uppercase:active{background:color-mix(in srgb, var(--accent) 30%, var(--vp-c-bg-elv))}}a.link-alt.uppercase:active{transform:translateY(1px)}a.component-border{border-radius:0}.vp-doc a,.vp-doc a:hover{color:var(--vp-c-brand-1);font-weight:500;text-decoration:none}.vp-doc a:hover{color:var(--vp-c-brand-2)}a,a:hover,.vp-doc a,.vp-doc a:hover,.vp-doc .header-anchor{text-decoration:none!important}.vp-doc h1{letter-spacing:-.03em;font-weight:700}.vp-doc h2{letter-spacing:-.02em;border-top-color:var(--vp-c-divider)}.vp-doc p,.vp-doc li{line-height:1.75}.vp-doc :not(pre)>code{color:var(--green);font-family:var(--vp-font-family-mono);border:1px solid var(--vp-c-divider);border-radius:0;font-size:.85em}.vp-doc div[class*=language-]{border:1px solid var(--vp-c-divider);border-radius:0}a:focus-visible,button:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:0}.home-hero{padding:56px 0 8px}.home-hero h1{letter-spacing:-.04em;margin:0;font-size:clamp(2rem,5vw,3.25rem);font-weight:700;line-height:1.1}.home-hero h1 span{background:linear-gradient(90deg, var(--vp-c-text-1), var(--accent-soft) 70%, var(--accent));color:#0000;-webkit-background-clip:text;background-clip:text}.home-hero p{max-width:36rem;color:var(--vp-c-text-2);margin:16px 0 0;font-size:1.1rem;line-height:1.6}@media (prefers-reduced-motion:reduce){.component-border,a.link-alt.uppercase{transition:none}}[class*=rounded],.VPNavBarSearchButton,.vp-doc [class*=language-],.vp-doc :not(pre)>code,.vp-doc img,.vp-doc table,.custom-block,.VPLocalSearchBox .results .result,.VPSkipLink,.keys,button.copy,.VPSwitch,.VPSwitch .check{border-radius:0!important}p.flex.flex-wrap>a.border.m-1{margin:.25rem;padding:.25rem .875rem;transition:none}p.flex.flex-wrap>a.border.m-1:hover{border-color:var(--accent);background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){p.flex.flex-wrap>a.border.m-1:hover{background-color:color-mix(in srgb, var(--accent) 14%, transparent)}}@media (width<=639px){.component-border.flex:has(>.text-center){flex-direction:column}.component-border>.text-center{text-align:left;align-items:baseline;gap:.5rem;margin-bottom:.5rem;display:flex;min-width:0!important}.component-border>.text-center .text-6xl{font-size:1.75rem}.component-border>.pl-8{padding-left:0}p.flex.flex-wrap:has(>a.border.m-1){-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap;margin-inline:-.25rem;padding-bottom:.25rem;overflow-x:auto}p.flex.flex-wrap:has(>a.border.m-1)::-webkit-scrollbar{display:none}p.flex.flex-wrap>a.border.m-1{white-space:nowrap;flex:none;align-items:center;min-height:2.25rem;display:inline-flex}div.pt-6.pb-8{padding-top:.75rem;padding-bottom:.5rem}div.pt-6.pb-8>h1.mb-6{margin-bottom:.75rem}a.link-alt.uppercase,.component-border a.uppercase{margin-bottom:6px;padding:6px 12px}}div.flex.flex-wrap.py-4.items-center.justify-center:has(>a[href*=ko-fi\.com]){gap:12px}div.flex.flex-wrap.py-4.items-center.justify-center:has(>a[href*=ko-fi\.com])>a{justify-content:center;align-items:center;width:200px;height:56px;display:flex;margin:0!important}div.flex.flex-wrap.py-4.items-center.justify-center:has(>a[href*=ko-fi\.com])>a img{-o-object-fit:contain;object-fit:contain;max-width:100%;max-height:100%}div.flex.flex-wrap.py-4.items-center.justify-center.space-y-4:has(>a[href*=ko-fi\.com]){flex-flow:column}div.flex.flex-wrap.py-4.items-center.justify-center.space-x-4:has(>a[href*=ko-fi\.com]){grid-template-columns:repeat(2,168px);justify-content:center;gap:12px;display:grid}div.flex.flex-wrap.py-4.items-center.justify-center.space-x-4:has(>a[href*=ko-fi\.com])>a{width:168px;height:52px}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}
2
2
  /*$vite$:1*/
@@ -13,6 +13,14 @@ declare interface CustomDonationBaseConfig {
13
13
  donationBaseUrl: string;
14
14
  donationButtonImage: string;
15
15
  donationButtonStyle?: Record<string, string>;
16
+ /**
17
+ * Intrinsic image dimensions, used for width/height attributes so the
18
+ * browser can reserve layout space before the image loads.
19
+ */
20
+ donationButtonSize?: {
21
+ width: number;
22
+ height: number;
23
+ };
16
24
  }
17
25
  declare interface CustomDonationConfig extends CustomDonationBaseConfig {
18
26
  donationId: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ansidev-oss/vitepress-theme-ansidev",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "The VitePress theme for ansidev's blog",
5
5
  "type": "module",
6
6
  "main": "dist/node/index.js",
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { useData } from 'vitepress'
3
- import { useLayout } from 'vitepress/theme'
3
+ import { useLayout } from 'vitepress/theme-without-fonts'
4
4
  import { computed, defineAsyncComponent } from 'vue'
5
5
  import DonationWidget from './DonationWidget.vue'
6
6
 
@@ -2,6 +2,12 @@
2
2
  import { useI18n } from 'vue-i18n'
3
3
  import { switchLocale } from '../composables/locale'
4
4
 
5
+ // Inline SVG instead of @iconify/vue's <Icon>: that component renders an
6
+ // empty svg during SSR and fills it in after hydration, which shows up as a
7
+ // late navbar visual change (Speed Index). This renders on the server.
8
+ const translateIconBody =
9
+ '<g fill="currentColor"><path d="M4.545 6.714L4.11 8H3l1.862-5h1.284L8 8H6.833l-.435-1.286zm1.634-.736L5.5 3.956h-.049l-.679 2.022z"/><path d="M0 2a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v3h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2v-3H2a2 2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h7a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zm7.138 9.995q.289.451.63.846c-.748.575-1.673 1.001-2.768 1.292c.178.217.451.635.555.867c1.125-.359 2.08-.844 2.886-1.494c.777.665 1.739 1.165 2.93 1.472c.133-.254.414-.673.629-.89c-1.125-.253-2.057-.694-2.82-1.284c.681-.747 1.222-1.651 1.621-2.757H14V8h-3v1.047h.765c-.318.844-.74 1.546-1.272 2.13a6 6 0 0 1-.415-.492a2 2 0 0 1-.94.31"/></g>'
10
+
5
11
  defineProps({
6
12
  size: {
7
13
  type: Number,
@@ -22,10 +28,17 @@ const toggleLocale = () => switchLocale(availableLocales, locale)
22
28
  class="VPLocaleSwitcher"
23
29
  @click="toggleLocale"
24
30
  >
25
- <Icon icon="bi:translate" :width="size" :height="size" />
31
+ <svg
32
+ xmlns="http://www.w3.org/2000/svg"
33
+ aria-hidden="true"
34
+ role="img"
35
+ :width="size"
36
+ :height="size"
37
+ viewBox="0 0 16 16"
38
+ v-html="translateIconBody"
39
+ ></svg>
26
40
  </button>
27
41
  </template>
28
-
29
42
  <style scoped>
30
43
  .divider {
31
44
  margin-right: 8px;
@@ -16,10 +16,20 @@ const props = defineProps({
16
16
 
17
17
  const slug = computed(() => useSlug(props.text))
18
18
  const link = computed(() => `${props.basePath}${slug.value}`)
19
+ const label = computed(() => {
20
+ if (props.basePath === '/categories/') {
21
+ return `View all posts in category ${props.text}`
22
+ }
23
+ return `View all projects using ${props.text}`
24
+ })
19
25
  </script>
20
26
 
21
27
  <template>
22
- <RouterLink :to="link" class="mr-2 text-sm font-medium uppercase link-alt">
28
+ <RouterLink
29
+ :to="link"
30
+ :aria-label="label"
31
+ class="mr-2 text-sm font-medium uppercase link-alt"
32
+ >
23
33
  {{ text }}
24
34
  </RouterLink>
25
35
  </template>
@@ -1,6 +1,6 @@
1
1
  import { Icon } from '@iconify/vue'
2
2
  import type { Theme } from 'vitepress'
3
- import DefaultTheme from 'vitepress/theme'
3
+ import DefaultTheme from 'vitepress/theme-without-fonts'
4
4
  import { useHtmlLang, usePageLocale } from './composables/lang'
5
5
  import Layout from './layouts/Layout.vue'
6
6
  import ArchivesPage from './pages/ArchivesPage.vue'
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { useData, useRoute } from 'vitepress'
3
- import DefaultTheme from 'vitepress/theme'
3
+ import DefaultTheme from 'vitepress/theme-without-fonts'
4
4
  import { onMounted, watch } from 'vue'
5
5
  import DonationWidget from '../components/DonationWidget.vue'
6
6
  import Footer from '../components/Footer.vue'
@@ -11,6 +11,10 @@ const props = defineProps<DonationButtonProps>()
11
11
  const donationUrl = computed(() =>
12
12
  new URL(props.donationId, props.donationBaseUrl).toString()
13
13
  )
14
+
15
+ // Intrinsic sizes of the platform button images so the browser can reserve
16
+ // space before they load (avoids unsized-image CLS risk).
17
+ const size = props.donationButtonSize
14
18
  </script>
15
19
 
16
20
  <template>
@@ -19,6 +23,10 @@ const donationUrl = computed(() =>
19
23
  :src="donationButtonImage"
20
24
  :alt="donationPlatform"
21
25
  :style="donationButtonStyle"
26
+ :width="size?.width"
27
+ :height="size?.height"
28
+ loading="lazy"
29
+ decoding="async"
22
30
  />
23
31
  </a>
24
32
  </template>
@@ -11,6 +11,11 @@ export declare interface CustomDonationBaseConfig {
11
11
  donationBaseUrl: string
12
12
  donationButtonImage: string
13
13
  donationButtonStyle?: Record<string, string>
14
+ /**
15
+ * Intrinsic image dimensions, used for width/height attributes so the
16
+ * browser can reserve layout space before the image loads.
17
+ */
18
+ donationButtonSize?: { width: number; height: number }
14
19
  }
15
20
 
16
21
  export declare interface CustomDonationConfig extends CustomDonationBaseConfig {
@@ -27,7 +32,8 @@ export const supportedDonationPlatforms: {
27
32
  donationButtonStyle: {
28
33
  height: '60px !important',
29
34
  width: '217px !important'
30
- }
35
+ },
36
+ donationButtonSize: { width: 545, height: 153 }
31
37
  },
32
38
  kofi: {
33
39
  donationBaseUrl: 'https://ko-fi.com',
@@ -35,11 +41,13 @@ export const supportedDonationPlatforms: {
35
41
  'https://storage.ko-fi.com/cdn/brandasset/kofi_bg_tag_white.png',
36
42
  donationButtonStyle: {
37
43
  height: '60px !important'
38
- }
44
+ },
45
+ donationButtonSize: { width: 341, height: 129 }
39
46
  },
40
47
  paypal: {
41
48
  donationBaseUrl: 'https://paypal.me',
42
49
  donationButtonImage:
43
- 'https://paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif'
50
+ 'https://paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif',
51
+ donationButtonSize: { width: 147, height: 47 }
44
52
  }
45
53
  }
@@ -44,8 +44,26 @@ function init() {
44
44
  }
45
45
  }
46
46
 
47
+ function scheduleInit() {
48
+ const start = () => {
49
+ // Defer loading until the browser is idle so analytics never competes
50
+ // with critical rendering / interaction on the initial navigation.
51
+ if (typeof (window as any).requestIdleCallback === 'function') {
52
+ ;(window as any).requestIdleCallback(() => init(), { timeout: 5000 })
53
+ } else {
54
+ setTimeout(init, 3000)
55
+ }
56
+ }
57
+
58
+ if (document.readyState === 'complete') {
59
+ start()
60
+ } else {
61
+ window.addEventListener('load', start, { once: true })
62
+ }
63
+ }
64
+
47
65
  if (googleAnalyticsOptions) {
48
- onMounted(init)
66
+ onMounted(scheduleInit)
49
67
  }
50
68
  </script>
51
69