@ansidev-oss/vitepress-theme-ansidev 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/{Swetrix-k7SUudua.js → Swetrix-GKEyGNrV.js} +29 -6
- package/dist/client/index.js +54 -54
- package/dist/client/styles.css +1 -1
- package/dist/client/types/index.d.ts +8 -0
- package/dist/node/composables.d.mts +9 -0
- package/dist/node/composables.mjs +33 -1
- package/package.json +20 -22
- package/src/client/components/DonationWidget.vue +9 -3
- package/src/client/components/Footer.vue +11 -4
- package/src/client/components/Link.vue +11 -5
- package/src/client/components/LocaleSwitcher.vue +5 -5
- package/src/client/components/PostDate.test.ts +16 -7
- package/src/client/components/PostDate.vue +16 -7
- package/src/client/components/PostItem.vue +17 -7
- package/src/client/components/PostList.vue +7 -4
- package/src/client/components/ProjectCard.vue +42 -14
- package/src/client/components/ProjectList.vue +12 -5
- package/src/client/components/RouterLink.vue +3 -3
- package/src/client/components/SharingWidget.vue +3 -1
- package/src/client/components/StatusBadge.vue +10 -10
- package/src/client/components/TermBadge.vue +11 -7
- package/src/client/components/TermLink.vue +4 -4
- package/src/client/composables/date.ts +1 -1
- package/src/client/composables/lang.test.ts +6 -2
- package/src/client/composables/lang.ts +12 -5
- package/src/client/composables/locale.ts +4 -1
- package/src/client/composables/project.ts +3 -3
- package/src/client/composables/rank.ts +5 -2
- package/src/client/index.ts +1 -1
- package/src/client/layouts/Layout.vue +2 -2
- package/src/client/pages/ArchivesPage.vue +10 -5
- package/src/client/pages/CategoriesPage.vue +13 -5
- package/src/client/pages/HomePage.vue +3 -3
- package/src/client/pages/Page.vue +13 -11
- package/src/client/pages/PostsPage.vue +4 -4
- package/src/client/pages/ProjectsPage.vue +10 -7
- package/src/client/pages/TagsPage.vue +10 -4
- package/src/client/plugins/donation/components/Donation.vue +5 -3
- package/src/client/plugins/donation/components/DonationButton.vue +3 -1
- package/src/client/plugins/donation/index.ts +11 -8
- package/src/client/plugins/i18n/index.ts +2 -2
- package/src/client/plugins/sharing/components/Sharing.vue +39 -15
- package/src/client/plugins/sharing/components/SharingButton.vue +34 -14
- package/src/client/plugins/sharing/index.ts +3 -1
- package/src/client/styles/base.css +1 -1
- package/src/client/styles/blog.css +38 -14
- package/src/client/styles/index.css +2 -3
- package/src/client/types/index.ts +8 -0
- package/src/node/composables/excerpt.test.ts +88 -0
- package/src/node/composables/excerpt.ts +57 -0
- package/src/node/composables/index.ts +1 -0
- package/src/node/composables/markdown.ts +8 -2
- package/src/node/composables/route.ts +15 -7
- package/src/node/composables/slug.ts +12 -4
- package/src/node/config.ts +20 -14
- package/src/shared/composables/useSlug.ts +2 -1
- package/dist/node/composables/index.d.ts +0 -3
- package/dist/node/composables/markdown.d.ts +0 -2
- package/dist/node/composables/route.d.ts +0 -15
- package/dist/node/composables/slug.d.ts +0 -7
- package/dist/node/composables/types.d.ts +0 -7
- package/dist/node/config.d.ts +0 -45
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as e, onMounted as t } from "vue";
|
|
2
|
-
// ../../node_modules/.pnpm/swetrix@4.
|
|
2
|
+
// ../../node_modules/.pnpm/swetrix@4.8.0/node_modules/swetrix/dist/esnext/utils.js
|
|
3
3
|
var n = (e) => {
|
|
4
4
|
let t = location.search.match(e);
|
|
5
5
|
return t && t[2] || void 0;
|
|
@@ -79,7 +79,26 @@ var n = (e) => {
|
|
|
79
79
|
"touchstart"
|
|
80
80
|
], K = 3e5, q = (e) => typeof TextEncoder < "u" ? new TextEncoder().encode(e).length : typeof Blob < "u" ? new Blob([e]).size : e.length, J = class {
|
|
81
81
|
constructor(e, t) {
|
|
82
|
-
this.projectID = e, this.options = t, this.pageData = null, this.pageViewsOptions = null, this.errorsOptions = null, this.perfStatsCollected = !1, this.activePage = null, this.errorListenerExists = !1, this.cachedData = null, this.rrwebLoader = null, this.sessionReplayActions = null, this.sessionReplayInitPromise = null, this.identifiedProfileId = null, this.lastIdentifySent = null, this.trackPathChange = this.trackPathChange.bind(this), this.heartbeat = this.heartbeat.bind(this), this.captureError = this.captureError.bind(this), this.getSessionReplayPreloadOption() && this.preloadSessionReplay().catch(() => void 0);
|
|
82
|
+
this.projectID = e, this.options = t, this.pageData = null, this.pageViewsOptions = null, this.errorsOptions = null, this.perfStatsCollected = !1, this.activePage = null, this.errorListenerExists = !1, this.cachedData = null, this.rrwebLoader = null, this.sessionReplayActions = null, this.sessionReplayInitPromise = null, this.identifiedProfileId = null, this.lastIdentifySent = null, this.trackPathChange = this.trackPathChange.bind(this), this.heartbeat = this.heartbeat.bind(this), this.captureError = this.captureError.bind(this), this.captureOutboundLink = this.captureOutboundLink.bind(this), this.options?.events?.outboundLinks && this.canTrack() && (document.addEventListener("click", this.captureOutboundLink, !0), document.addEventListener("auxclick", this.captureOutboundLink, !0)), this.getSessionReplayPreloadOption() && this.preloadSessionReplay().catch(() => void 0);
|
|
83
|
+
}
|
|
84
|
+
stopAutoCapture() {
|
|
85
|
+
u() && (document.removeEventListener("click", this.captureOutboundLink, !0), document.removeEventListener("auxclick", this.captureOutboundLink, !0));
|
|
86
|
+
}
|
|
87
|
+
captureOutboundLink(e) {
|
|
88
|
+
if (!this.canTrack() || (e.type === "click" ? e.button !== 0 : e.button !== 1)) return;
|
|
89
|
+
let t = e.composedPath?.() || [e.target], n = t.find((e) => e instanceof Element && e.matches("a[href], area[href]"));
|
|
90
|
+
if (!n || t.some((e) => e instanceof Element && e.hasAttribute("data-swetrix-ignore"))) return;
|
|
91
|
+
let r = this.options?.events?.outboundLinks, i = typeof r == "object" ? r : {};
|
|
92
|
+
try {
|
|
93
|
+
let e = new URL(n.getAttribute("href"), document.baseURI), t = e.hostname.replace(/^www\./, "");
|
|
94
|
+
if (!["http:", "https:"].includes(e.protocol) || t === window.location.hostname.replace(/^www\./, "") || i.ignoreDomains?.some((e) => t === e.toLowerCase().replace(/^www\./, "")) || (e.username = "", e.password = "", i.search || (e.search = ""), i.hash || (e.hash = ""), e.href.length > 2048)) return;
|
|
95
|
+
this.sendRequest("outbound", {
|
|
96
|
+
...this.getEventContext(),
|
|
97
|
+
qs: g()?.slice(0, 2048),
|
|
98
|
+
url: e.href,
|
|
99
|
+
title: document.title?.slice(0, 2048) || void 0
|
|
100
|
+
}).catch(() => void 0);
|
|
101
|
+
} catch {}
|
|
83
102
|
}
|
|
84
103
|
captureError(e) {
|
|
85
104
|
typeof this.errorsOptions?.sampleRate == "number" && this.errorsOptions.sampleRate >= Math.random() || this.submitError({
|
|
@@ -114,9 +133,14 @@ var n = (e) => {
|
|
|
114
133
|
Object.assign(r, n), this.sendRequest("error", r);
|
|
115
134
|
}
|
|
116
135
|
async track(e) {
|
|
117
|
-
|
|
118
|
-
let t = {
|
|
136
|
+
this.canTrack() && await this.sendRequest("custom", {
|
|
119
137
|
...e,
|
|
138
|
+
...this.getEventContext(),
|
|
139
|
+
profileId: e.profileId ?? this.options?.profileId
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
getEventContext() {
|
|
143
|
+
return {
|
|
120
144
|
pid: this.projectID,
|
|
121
145
|
pg: this.activePage || w({
|
|
122
146
|
hash: this.pageViewsOptions?.hash,
|
|
@@ -131,9 +155,8 @@ var n = (e) => {
|
|
|
131
155
|
te: b(),
|
|
132
156
|
co: x(),
|
|
133
157
|
qs: g(),
|
|
134
|
-
profileId:
|
|
158
|
+
profileId: this.options?.profileId
|
|
135
159
|
};
|
|
136
|
-
await this.sendRequest("custom", t);
|
|
137
160
|
}
|
|
138
161
|
trackPageViews(e) {
|
|
139
162
|
if (!this.canTrack()) return E;
|
package/dist/client/index.js
CHANGED
|
@@ -35,7 +35,7 @@ var k = () => {
|
|
|
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-
|
|
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;
|
|
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-
|
|
64
|
+
}, xe = /*#__PURE__*/ be(ye, [["__scopeId", "data-v-84ab49a2"]]), 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) => {
|
|
@@ -3159,7 +3159,7 @@ var Ba = (e, t) => {
|
|
|
3159
3159
|
}, null, 8, ["width", "height"])], 8, Va)], 64);
|
|
3160
3160
|
};
|
|
3161
3161
|
}
|
|
3162
|
-
}), [["__scopeId", "data-v-
|
|
3162
|
+
}), [["__scopeId", "data-v-6a2933ea"]]), Ua = /* @__PURE__ */ g({
|
|
3163
3163
|
__name: "SharingWidget",
|
|
3164
3164
|
setup(e) {
|
|
3165
3165
|
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;
|
|
@@ -3374,7 +3374,7 @@ var Ba = (e, t) => {
|
|
|
3374
3374
|
}, null, 8, ["title", "posts"]);
|
|
3375
3375
|
};
|
|
3376
3376
|
}
|
|
3377
|
-
}), fo = { class: "pt-6 pb-8 space-y-2 md:space-y-5" },
|
|
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
3378
|
__name: "Page",
|
|
3379
3379
|
props: { title: {
|
|
3380
3380
|
type: String,
|
|
@@ -3382,9 +3382,9 @@ var Ba = (e, t) => {
|
|
|
3382
3382
|
default: ""
|
|
3383
3383
|
} },
|
|
3384
3384
|
setup(e) {
|
|
3385
|
-
return (t, n) => (T(), d(
|
|
3385
|
+
return (t, n) => (T(), d("main", fo, [f("div", po, [f("h1", mo, E(e.title), 1)]), se(t.$slots, "default")]));
|
|
3386
3386
|
}
|
|
3387
|
-
}),
|
|
3387
|
+
}), go = /* @__PURE__ */ g({
|
|
3388
3388
|
__name: "TermLink",
|
|
3389
3389
|
props: {
|
|
3390
3390
|
text: {
|
|
@@ -3406,10 +3406,10 @@ var Ba = (e, t) => {
|
|
|
3406
3406
|
_: 1
|
|
3407
3407
|
}, 8, ["to"]));
|
|
3408
3408
|
}
|
|
3409
|
-
}),
|
|
3409
|
+
}), _o = { class: "flex p-4 component-border" }, vo = {
|
|
3410
3410
|
class: "text-center",
|
|
3411
3411
|
style: { "min-width": "80px" }
|
|
3412
|
-
},
|
|
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({
|
|
3413
3413
|
__name: "PostItem",
|
|
3414
3414
|
props: { post: {
|
|
3415
3415
|
type: Object,
|
|
@@ -3417,24 +3417,24 @@ var Ba = (e, t) => {
|
|
|
3417
3417
|
} },
|
|
3418
3418
|
setup(e) {
|
|
3419
3419
|
let t = e, n = c(() => to(t.post.date));
|
|
3420
|
-
return (t, r) => (T(), d("div",
|
|
3421
|
-
f("div",
|
|
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", {
|
|
3422
3422
|
class: "text-2xl font-bold leading-8 tracking-tight",
|
|
3423
3423
|
href: e.post?.url,
|
|
3424
3424
|
title: e.post.title
|
|
3425
|
-
}, E(e.post.title), 9,
|
|
3426
|
-
f("div",
|
|
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
3427
|
key: e,
|
|
3428
3428
|
text: e,
|
|
3429
3429
|
basePath: "/categories/"
|
|
3430
3430
|
}, null, 8, ["text"]))), 128))]),
|
|
3431
|
-
f("
|
|
3431
|
+
f("div", { innerHTML: e.post?.excerpt }, null, 8, wo)
|
|
3432
3432
|
])]));
|
|
3433
3433
|
}
|
|
3434
|
-
}),
|
|
3434
|
+
}), Eo = {
|
|
3435
3435
|
key: 0,
|
|
3436
3436
|
class: "grid grid-cols-1 lg:grid-cols-2 gap-4 mt-4"
|
|
3437
|
-
},
|
|
3437
|
+
}, Do = { key: 1 }, Oo = /* @__PURE__ */ g({
|
|
3438
3438
|
__name: "PostList",
|
|
3439
3439
|
props: { posts: {
|
|
3440
3440
|
type: Object,
|
|
@@ -3443,12 +3443,12 @@ var Ba = (e, t) => {
|
|
|
3443
3443
|
} },
|
|
3444
3444
|
setup(e) {
|
|
3445
3445
|
let { t } = $();
|
|
3446
|
-
return (n, r) => (T(), d(o, null, [e.posts.length > 0 ? (T(), d("div",
|
|
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, {
|
|
3447
3447
|
key: e?.url,
|
|
3448
3448
|
post: e
|
|
3449
|
-
}, null, 8, ["post"]))), 128))])) : u("", !0), e.posts.length === 0 ? (T(), d("p",
|
|
3449
|
+
}, null, 8, ["post"]))), 128))])) : u("", !0), e.posts.length === 0 ? (T(), d("p", Do, E(D(t)("no_post")), 1)) : u("", !0)], 64));
|
|
3450
3450
|
}
|
|
3451
|
-
}),
|
|
3451
|
+
}), ko = /* @__PURE__ */ g({
|
|
3452
3452
|
__name: "PostsPage",
|
|
3453
3453
|
props: {
|
|
3454
3454
|
title: {
|
|
@@ -3465,12 +3465,12 @@ var Ba = (e, t) => {
|
|
|
3465
3465
|
return (t, n) => {
|
|
3466
3466
|
let r = ce("Page");
|
|
3467
3467
|
return T(), l(r, { title: e.title }, {
|
|
3468
|
-
default: O(() => [m(
|
|
3468
|
+
default: O(() => [m(Oo, { posts: e.posts }, null, 8, ["posts"])]),
|
|
3469
3469
|
_: 1
|
|
3470
3470
|
}, 8, ["title"]);
|
|
3471
3471
|
};
|
|
3472
3472
|
}
|
|
3473
|
-
}),
|
|
3473
|
+
}), Ao = { class: "sr-only" }, jo = ["datetime"], Mo = /* @__PURE__ */ g({
|
|
3474
3474
|
__name: "PostDate",
|
|
3475
3475
|
props: {
|
|
3476
3476
|
date: [Date, String],
|
|
@@ -3500,9 +3500,9 @@ var Ba = (e, t) => {
|
|
|
3500
3500
|
string: i(e, r.value)
|
|
3501
3501
|
};
|
|
3502
3502
|
});
|
|
3503
|
-
return (t, r) => (T(), d("dl", null, [f("dt",
|
|
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)]));
|
|
3504
3504
|
}
|
|
3505
|
-
}),
|
|
3505
|
+
}), No = /* @__PURE__ */ g({
|
|
3506
3506
|
__name: "StatusBadge",
|
|
3507
3507
|
props: {
|
|
3508
3508
|
backgroundColor: {
|
|
@@ -3552,10 +3552,10 @@ var Ba = (e, t) => {
|
|
|
3552
3552
|
e.rounded ? "rounded" : ""
|
|
3553
3553
|
]]) }, [se(t.$slots, "default")], 2));
|
|
3554
3554
|
}
|
|
3555
|
-
}),
|
|
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 = {
|
|
3556
3556
|
key: 0,
|
|
3557
3557
|
class: "mb-3"
|
|
3558
|
-
},
|
|
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({
|
|
3559
3559
|
__name: "ProjectCard",
|
|
3560
3560
|
props: { project: {
|
|
3561
3561
|
type: Object,
|
|
@@ -3565,63 +3565,63 @@ var Ba = (e, t) => {
|
|
|
3565
3565
|
let t = e, { t: n } = $(), r = c(() => no(t.project.developmentStatus));
|
|
3566
3566
|
return (t, i) => {
|
|
3567
3567
|
let a = ce("Icon");
|
|
3568
|
-
return T(), d("div",
|
|
3569
|
-
f("div",
|
|
3568
|
+
return T(), d("div", Po, [
|
|
3569
|
+
f("div", Fo, [f("a", {
|
|
3570
3570
|
href: e.project.url,
|
|
3571
3571
|
class: "text-2xl font-bold leading-8 tracking-tight"
|
|
3572
|
-
}, E(e.project.title), 9,
|
|
3572
|
+
}, E(e.project.title), 9, Io), f("div", Lo, [e.project.showcaseUrl ? (T(), d("a", {
|
|
3573
3573
|
key: 0,
|
|
3574
|
-
class: "mx-1 text-gray-500
|
|
3574
|
+
class: "mx-1 text-gray-500 hover:text-gray-600",
|
|
3575
3575
|
target: "_blank",
|
|
3576
3576
|
rel: "noopener noreferrer",
|
|
3577
3577
|
href: e.project.showcaseUrl
|
|
3578
3578
|
}, [i[0] ||= f("span", { class: "sr-only" }, "external-link", -1), m(a, {
|
|
3579
3579
|
icon: "bi:box-arrow-up-right",
|
|
3580
3580
|
class: "text-dark dark:text-white ml-2"
|
|
3581
|
-
})], 8,
|
|
3581
|
+
})], 8, Ro)) : u("", !0), e.project.repositoryUrl ? (T(), d("a", {
|
|
3582
3582
|
key: 1,
|
|
3583
|
-
class: "mx-1 text-gray-500
|
|
3583
|
+
class: "mx-1 text-gray-500 hover:text-gray-600",
|
|
3584
3584
|
target: "_blank",
|
|
3585
3585
|
rel: "noopener noreferrer",
|
|
3586
3586
|
href: e.project.repositoryUrl
|
|
3587
3587
|
}, [i[1] ||= f("span", { class: "sr-only" }, "github", -1), m(a, {
|
|
3588
3588
|
icon: "bi:github",
|
|
3589
3589
|
class: "text-dark dark:text-white ml-2"
|
|
3590
|
-
})], 8,
|
|
3591
|
-
f("div",
|
|
3592
|
-
e.project.license ? (T(), d("div",
|
|
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, {
|
|
3593
3593
|
key: 0,
|
|
3594
3594
|
href: e.project.licenseUrl,
|
|
3595
3595
|
class: "link-alt"
|
|
3596
3596
|
}, {
|
|
3597
3597
|
default: O(() => [p(E(e.project.license), 1)]),
|
|
3598
3598
|
_: 1
|
|
3599
|
-
}, 8, ["href"])) : (T(), d("span",
|
|
3600
|
-
f("div",
|
|
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
3601
|
default: O(() => [p(E(t.$t(`development_status.${e.project.developmentStatus}`)), 1)]),
|
|
3602
3602
|
_: 1
|
|
3603
3603
|
}, 16)]),
|
|
3604
|
-
f("div",
|
|
3604
|
+
f("div", Ko, [(T(!0), d(o, null, oe(e.project.techs, (e) => (T(), l(go, {
|
|
3605
3605
|
key: e,
|
|
3606
3606
|
text: e,
|
|
3607
3607
|
basePath: "/projects?tech="
|
|
3608
3608
|
}, null, 8, ["text"]))), 128))]),
|
|
3609
|
-
m(
|
|
3609
|
+
m(Mo, {
|
|
3610
3610
|
date: e.project.date,
|
|
3611
3611
|
"text-size": "sm"
|
|
3612
3612
|
}, null, 8, ["date"])
|
|
3613
3613
|
])]),
|
|
3614
|
-
f("div",
|
|
3614
|
+
f("div", qo, [f("a", {
|
|
3615
3615
|
href: e.project.url,
|
|
3616
3616
|
"aria-label": `Read ${e.project.title}`
|
|
3617
|
-
}, E(D(n)("button.read_more")) + " → ", 9,
|
|
3617
|
+
}, E(D(n)("button.read_more")) + " → ", 9, Jo)])
|
|
3618
3618
|
]);
|
|
3619
3619
|
};
|
|
3620
3620
|
}
|
|
3621
|
-
}),
|
|
3621
|
+
}), Xo = {
|
|
3622
3622
|
key: 0,
|
|
3623
3623
|
class: "grid grid-cols-1 lg:grid-cols-2 gap-4 mt-4"
|
|
3624
|
-
},
|
|
3624
|
+
}, Zo = { key: 1 }, Qo = /* @__PURE__ */ g({
|
|
3625
3625
|
__name: "ProjectList",
|
|
3626
3626
|
props: { projects: {
|
|
3627
3627
|
type: Object,
|
|
@@ -3630,12 +3630,12 @@ var Ba = (e, t) => {
|
|
|
3630
3630
|
} },
|
|
3631
3631
|
setup(e) {
|
|
3632
3632
|
let { t } = $();
|
|
3633
|
-
return (n, r) => (T(), d(o, null, [e.projects.length > 0 ? (T(), d("div",
|
|
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, {
|
|
3634
3634
|
key: e?.url,
|
|
3635
3635
|
project: e
|
|
3636
|
-
}, null, 8, ["project"]))), 128))])) : u("", !0), e.projects.length === 0 ? (T(), d("p",
|
|
3636
|
+
}, null, 8, ["project"]))), 128))])) : u("", !0), e.projects.length === 0 ? (T(), d("p", Zo, E(D(t)("no_post")), 1)) : u("", !0)], 64));
|
|
3637
3637
|
}
|
|
3638
|
-
}),
|
|
3638
|
+
}), $o = ["href"], es = { class: "flex flex-row flex-wrap" }, ts = ["href"], ns = /* @__PURE__ */ g({
|
|
3639
3639
|
__name: "ProjectsPage",
|
|
3640
3640
|
props: {
|
|
3641
3641
|
projectPage: {
|
|
@@ -3665,18 +3665,18 @@ var Ba = (e, t) => {
|
|
|
3665
3665
|
default: O(() => [f("div", null, [f("p", null, [r[0] ||= f("span", { class: "mr-2" }, "Technologies", -1), D(i) ? (T(), d("a", {
|
|
3666
3666
|
key: 0,
|
|
3667
3667
|
href: e.projectPage
|
|
3668
|
-
}, "Reset", 8,
|
|
3668
|
+
}, "Reset", 8, $o)) : u("", !0)]), f("p", es, [(T(!0), d(o, null, oe(p.value, (e) => (T(), d("a", {
|
|
3669
3669
|
class: C(["border rounded-md m-1 p-1", e.selected ? "bg-primary text-white! border-primary" : ""]),
|
|
3670
3670
|
href: `/projects-by-tech/${e.slug}`
|
|
3671
|
-
}, E(e.name), 11,
|
|
3671
|
+
}, E(e.name), 11, ts))), 256))])]), m(Qo, { projects: s.value }, null, 8, ["projects"])]),
|
|
3672
3672
|
_: 1
|
|
3673
3673
|
}, 8, ["title"]);
|
|
3674
3674
|
};
|
|
3675
3675
|
}
|
|
3676
|
-
}),
|
|
3676
|
+
}), rs = { class: "flex flex-wrap pt-4" }, is = {
|
|
3677
3677
|
key: 0,
|
|
3678
3678
|
class: "mt-2 mb-2 mr-5"
|
|
3679
|
-
},
|
|
3679
|
+
}, as = /* @__PURE__ */ g({
|
|
3680
3680
|
__name: "TagsPage",
|
|
3681
3681
|
props: { posts: {
|
|
3682
3682
|
type: Object,
|
|
@@ -3688,7 +3688,7 @@ var Ba = (e, t) => {
|
|
|
3688
3688
|
return (e, t) => {
|
|
3689
3689
|
let i = ce("Page");
|
|
3690
3690
|
return T(), l(i, { title: D(n)("tags") }, {
|
|
3691
|
-
default: O(() => [f("div",
|
|
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, {
|
|
3692
3692
|
key: t,
|
|
3693
3693
|
title: t,
|
|
3694
3694
|
count: e,
|
|
@@ -3702,7 +3702,7 @@ var Ba = (e, t) => {
|
|
|
3702
3702
|
}, 8, ["title"]);
|
|
3703
3703
|
};
|
|
3704
3704
|
}
|
|
3705
|
-
}),
|
|
3705
|
+
}), os = Oa({
|
|
3706
3706
|
legacy: !1,
|
|
3707
3707
|
locale: "en",
|
|
3708
3708
|
messages: {
|
|
@@ -3757,14 +3757,14 @@ var Ba = (e, t) => {
|
|
|
3757
3757
|
}
|
|
3758
3758
|
}
|
|
3759
3759
|
}
|
|
3760
|
-
}),
|
|
3760
|
+
}), ss = {
|
|
3761
3761
|
extends: t,
|
|
3762
3762
|
Layout: Ga,
|
|
3763
3763
|
enhanceApp({ app: t }) {
|
|
3764
|
-
t.component("Icon", e), t.component("Page",
|
|
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);
|
|
3765
3765
|
},
|
|
3766
3766
|
setup() {
|
|
3767
|
-
fe(), me(
|
|
3767
|
+
fe(), me(os);
|
|
3768
3768
|
}
|
|
3769
3769
|
};
|
|
3770
|
-
export {
|
|
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 };
|
package/dist/client/styles.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";.VPFooter[data-v-1543ace9]{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-1543ace9]{display:none}.VPFooter[data-v-1543ace9] a{text-underline-offset:2px;text-decoration-line:underline;transition:color .25s}.VPFooter[data-v-1543ace9] a:hover{color:var(--vp-c-text-1)}@media (width>=768px){.VPFooter[data-v-1543ace9]{padding:32px}}.container[data-v-1543ace9]{max-width:var(--vp-layout-max-width);text-align:center;margin:0 auto}.message[data-v-1543ace9],.copyright[data-v-1543ace9]{color:var(--vp-c-text-2);font-size:14px;font-weight:500;line-height:24px}.divider[data-v-29bd489e]{background-color:var(--vp-c-divider);content:"";width:1px;height:24px;margin-left:16px;margin-right:8px}.VPLocaleSwitcher[data-v-29bd489e]{width:36px;height:36px;color:var(--vp-c-text-2);justify-content:center;align-items:center;transition:color .5s;display:flex}.VPLocaleSwitcher[data-v-29bd489e]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocaleSwitcher[data-v-29bd489e]>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 components;@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 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)}.flex{display:flex}.grid{display:grid}.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:border-color .2s,box-shadow .2s,background-color .2s}.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:color .15s,text-shadow .15s}.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:border-color .2s;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:border-color .15s,background-color .15s}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-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}
|
|
2
2
|
/*$vite$:1*/
|
|
@@ -34,6 +34,10 @@ export interface Post {
|
|
|
34
34
|
twitter: string;
|
|
35
35
|
url?: string;
|
|
36
36
|
date: Date;
|
|
37
|
+
/**
|
|
38
|
+
* Excerpt rendered as HTML and normalized by the theme's `useExcerptHtml` helper.
|
|
39
|
+
* Undefined when the post contains no excerpt separator.
|
|
40
|
+
*/
|
|
37
41
|
excerpt: string | undefined;
|
|
38
42
|
categories: string[];
|
|
39
43
|
tags: string[];
|
|
@@ -49,6 +53,10 @@ export interface Project {
|
|
|
49
53
|
url: string;
|
|
50
54
|
showcaseUrl: string;
|
|
51
55
|
repositoryUrl: string;
|
|
56
|
+
/**
|
|
57
|
+
* Excerpt rendered as HTML and normalized by the theme's `useExcerptHtml` helper.
|
|
58
|
+
* Undefined when the project contains no excerpt separator.
|
|
59
|
+
*/
|
|
52
60
|
excerpt: string | undefined;
|
|
53
61
|
license: string;
|
|
54
62
|
licenseUrl: string;
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes a post/project excerpt into safe HTML suitable for v-html.
|
|
3
|
+
*
|
|
4
|
+
* Excerpts may originate raw (gray-matter) or pre-rendered (createContentLoader).
|
|
5
|
+
* Raw input is rendered with markdown-it with html disabled, so inline markdown
|
|
6
|
+
* (links, emphasis, inline code) works and source HTML is escaped (no injection).
|
|
7
|
+
* Excess `undefined`/empty input yields undefined.
|
|
8
|
+
*/
|
|
9
|
+
export declare const useExcerptHtml: (excerpt?: string) => string | undefined;
|
|
1
10
|
type Pattern = string | string[];
|
|
2
11
|
type Frontmatter = Record<string, unknown> & {
|
|
3
12
|
date?: string;
|
|
@@ -1,7 +1,39 @@
|
|
|
1
|
+
import MarkdownItLib from "markdown-it";
|
|
1
2
|
import fs from "node:fs";
|
|
2
3
|
import { resolve } from "node:path";
|
|
3
4
|
import { globSync } from "glob";
|
|
4
5
|
import matter from "gray-matter";
|
|
6
|
+
// src/node/composables/excerpt.ts
|
|
7
|
+
const markdown = new MarkdownItLib({
|
|
8
|
+
html: false,
|
|
9
|
+
linkify: true,
|
|
10
|
+
breaks: false
|
|
11
|
+
});
|
|
12
|
+
const BLOCK_HTML_RE = /^<(?:p|div|ul|ol|dl|h[1-6]|blockquote|pre|table)(?:\s[^>]*)?>/;
|
|
13
|
+
const DANGEROUS_ELEMENT_RE = /<(?:script|style|iframe|object|embed)\b[^>]*>[\s\S]*?<\/(?:script|style|iframe|object|embed)>|<(?:script|style|iframe|object|embed)\b[^>]*\/?>(?:<\/(?:script|style|iframe|object|embed)>)?/gi;
|
|
14
|
+
const EVENT_ATTR_RE = /\s+on[a-z]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?/gi;
|
|
15
|
+
const JS_URL_RE = /\s(?:href|src)\s*=\s*("|')\s*javascript:[^"']*\1/gi;
|
|
16
|
+
const sanitizeHtml = (html) => html.replace(DANGEROUS_ELEMENT_RE, "").replace(EVENT_ATTR_RE, "").replace(JS_URL_RE, "");
|
|
17
|
+
const stripSingleParagraphWrapper = (html) => {
|
|
18
|
+
if (!html.startsWith("<p>") || !html.endsWith("</p>")) return html;
|
|
19
|
+
const inner = html.slice(3, -4);
|
|
20
|
+
if (inner.includes("</p>")) return html;
|
|
21
|
+
return inner;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Normalizes a post/project excerpt into safe HTML suitable for v-html.
|
|
25
|
+
*
|
|
26
|
+
* Excerpts may originate raw (gray-matter) or pre-rendered (createContentLoader).
|
|
27
|
+
* Raw input is rendered with markdown-it with html disabled, so inline markdown
|
|
28
|
+
* (links, emphasis, inline code) works and source HTML is escaped (no injection).
|
|
29
|
+
* Excess `undefined`/empty input yields undefined.
|
|
30
|
+
*/
|
|
31
|
+
const useExcerptHtml = (excerpt) => {
|
|
32
|
+
const trimmed = excerpt?.trim();
|
|
33
|
+
if (!trimmed) return void 0;
|
|
34
|
+
const html = BLOCK_HTML_RE.test(trimmed) ? sanitizeHtml(trimmed) : markdown.render(trimmed).trim();
|
|
35
|
+
return stripSingleParagraphWrapper(html).trim() || void 0;
|
|
36
|
+
};
|
|
5
37
|
// src/node/composables/markdown.ts
|
|
6
38
|
const useMarkdownFrontmatter = (pattern, excerptSeparator = "---") => {
|
|
7
39
|
return globSync(pattern, { ignore: ["node_modules/**", ".git/**"] }).map((file) => {
|
|
@@ -43,4 +75,4 @@ const useArchiveRoute = (pattern, excerptSeparator = "---") => {
|
|
|
43
75
|
return useSlugFromMarkdownFrontMatter(pattern, (frontmatter) => new Date(frontmatter.date).getFullYear().toString(), excerptSeparator);
|
|
44
76
|
} };
|
|
45
77
|
};
|
|
46
|
-
export { useArchiveRoute, useMarkdownFrontmatter, useMarkdownFrontmatterRoute, useSlug, useSlugFilter, useSlugFromMarkdownFrontMatter };
|
|
78
|
+
export { useArchiveRoute, useExcerptHtml, useMarkdownFrontmatter, useMarkdownFrontmatterRoute, useSlug, useSlugFilter, useSlugFromMarkdownFrontMatter };
|