@leadertechie/personal-site-kit 0.0.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/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/api/handlers/aboutme.d.ts +3 -0
- package/dist/api/handlers/aboutme.d.ts.map +1 -0
- package/dist/api/handlers/content-api.d.ts +5 -0
- package/dist/api/handlers/content-api.d.ts.map +1 -0
- package/dist/api/handlers/content.d.ts +2 -0
- package/dist/api/handlers/content.d.ts.map +1 -0
- package/dist/api/handlers/home.d.ts +3 -0
- package/dist/api/handlers/home.d.ts.map +1 -0
- package/dist/api/handlers/info.d.ts +2 -0
- package/dist/api/handlers/info.d.ts.map +1 -0
- package/dist/api/handlers/logo.d.ts +2 -0
- package/dist/api/handlers/logo.d.ts.map +1 -0
- package/dist/api/handlers/staticdetails.d.ts +2 -0
- package/dist/api/handlers/staticdetails.d.ts.map +1 -0
- package/dist/api/index.d.ts +9 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/utils.d.ts +8 -0
- package/dist/api/utils.d.ts.map +1 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.js +591 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +354 -0
- package/dist/prerender/index.d.ts +5 -0
- package/dist/prerender/index.d.ts.map +1 -0
- package/dist/prerender/pageContent.d.ts +16 -0
- package/dist/prerender/pageContent.d.ts.map +1 -0
- package/dist/prerender/prerender.d.ts +3 -0
- package/dist/prerender/prerender.d.ts.map +1 -0
- package/dist/prerender/template.d.ts +10 -0
- package/dist/prerender/template.d.ts.map +1 -0
- package/dist/prerender.d.ts +4 -0
- package/dist/prerender.js +399 -0
- package/dist/shared/config/api.d.ts +2 -0
- package/dist/shared/config/api.d.ts.map +1 -0
- package/dist/shared/config/index.d.ts +5 -0
- package/dist/shared/config/index.d.ts.map +1 -0
- package/dist/shared/config/types.d.ts +16 -0
- package/dist/shared/config/types.d.ts.map +1 -0
- package/dist/shared/core/site-store.d.ts +16 -0
- package/dist/shared/core/site-store.d.ts.map +1 -0
- package/dist/shared/core/theme-toggle.d.ts +13 -0
- package/dist/shared/core/theme-toggle.d.ts.map +1 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/interfaces/iFooterLink.d.ts +5 -0
- package/dist/shared/interfaces/iFooterLink.d.ts.map +1 -0
- package/dist/shared/interfaces/iRoute.d.ts +5 -0
- package/dist/shared/interfaces/iRoute.d.ts.map +1 -0
- package/dist/shared/pageContent.d.ts +35 -0
- package/dist/shared/pageContent.d.ts.map +1 -0
- package/dist/shared/runtime.d.ts +7 -0
- package/dist/shared/runtime.d.ts.map +1 -0
- package/dist/shared/template.d.ts +8 -0
- package/dist/shared/template.d.ts.map +1 -0
- package/dist/shared.d.ts +2 -0
- package/dist/shared.js +10 -0
- package/dist/ui/aboutme/api.d.ts +11 -0
- package/dist/ui/aboutme/api.d.ts.map +1 -0
- package/dist/ui/aboutme/index.d.ts +26 -0
- package/dist/ui/aboutme/index.d.ts.map +1 -0
- package/dist/ui/aboutme/renderer.d.ts +5 -0
- package/dist/ui/aboutme/renderer.d.ts.map +1 -0
- package/dist/ui/aboutme/styles.d.ts +2 -0
- package/dist/ui/aboutme/styles.d.ts.map +1 -0
- package/dist/ui/admin/index.d.ts +42 -0
- package/dist/ui/admin/index.d.ts.map +1 -0
- package/dist/ui/admin/styles.d.ts +2 -0
- package/dist/ui/admin/styles.d.ts.map +1 -0
- package/dist/ui/banner/index.d.ts +17 -0
- package/dist/ui/banner/index.d.ts.map +1 -0
- package/dist/ui/banner/styles.d.ts +2 -0
- package/dist/ui/banner/styles.d.ts.map +1 -0
- package/dist/ui/footer/index.d.ts +9 -0
- package/dist/ui/footer/index.d.ts.map +1 -0
- package/dist/ui/footer/styles.d.ts +2 -0
- package/dist/ui/footer/styles.d.ts.map +1 -0
- package/dist/ui.d.ts +2 -0
- package/dist/ui.js +820 -0
- package/package.json +41 -0
- package/src/api/__tests__/info.test.ts +44 -0
- package/src/api/__tests__/utils.test.ts +78 -0
- package/src/api/handlers/aboutme.ts +99 -0
- package/src/api/handlers/content-api.ts +268 -0
- package/src/api/handlers/content.ts +72 -0
- package/src/api/handlers/home.ts +79 -0
- package/src/api/handlers/info.ts +12 -0
- package/src/api/handlers/logo.ts +55 -0
- package/src/api/handlers/staticdetails.ts +48 -0
- package/src/api/index.ts +125 -0
- package/src/api/utils.ts +16 -0
- package/src/prerender/__tests__/pageContent.test.ts +54 -0
- package/src/prerender/__tests__/template.test.ts +54 -0
- package/src/prerender/index.ts +138 -0
- package/src/prerender/pageContent.ts +263 -0
- package/src/prerender/prerender.ts +25 -0
- package/src/prerender/template.ts +65 -0
- package/src/shared/config/api.ts +16 -0
- package/src/shared/config/index.ts +41 -0
- package/src/shared/config/types.ts +16 -0
- package/src/shared/core/__tests__/theme-toggle.test.ts +204 -0
- package/src/shared/core/site-store.ts +38 -0
- package/src/shared/core/theme-toggle.ts +118 -0
- package/src/shared/index.ts +15 -0
- package/src/shared/interfaces/iFooterLink.ts +4 -0
- package/src/shared/interfaces/iRoute.ts +4 -0
- package/src/shared/models/theme-variables.css +25 -0
- package/src/shared/pageContent.ts +209 -0
- package/src/shared/runtime.ts +11 -0
- package/src/shared/styles/markdown.css +129 -0
- package/src/shared/template.ts +35 -0
- package/src/styles/markdown.css +129 -0
- package/src/styles/theme.css +432 -0
- package/src/ui/aboutme/api.ts +12 -0
- package/src/ui/aboutme/index.ts +155 -0
- package/src/ui/aboutme/renderer.ts +7 -0
- package/src/ui/aboutme/styles.ts +10 -0
- package/src/ui/admin/index.ts +492 -0
- package/src/ui/admin/styles.ts +317 -0
- package/src/ui/banner/index.ts +38 -0
- package/src/ui/banner/styles.ts +10 -0
- package/src/ui/footer/index.ts +37 -0
- package/src/ui/footer/styles.ts +9 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { R2ContentLoader } from "@leadertechie/r2tohtml";
|
|
2
|
+
async function getAssetPaths(baseSiteUrl) {
|
|
3
|
+
const assetsUrl = `${baseSiteUrl}/cdn-assets.json`;
|
|
4
|
+
try {
|
|
5
|
+
const res = await fetch(assetsUrl);
|
|
6
|
+
if (res.ok) {
|
|
7
|
+
const data = await res.json();
|
|
8
|
+
return { js: data.js, css: data.css };
|
|
9
|
+
}
|
|
10
|
+
} catch (e) {
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const res = await fetch(`${baseSiteUrl}/?t=${Date.now()}`);
|
|
14
|
+
const html = await res.text();
|
|
15
|
+
const jsMatch = html.match(/src="(\/assets\/index-[^"]+\.js)"/);
|
|
16
|
+
const cssMatch = html.match(/href="(\/assets\/index-[^"]+\.css)"/);
|
|
17
|
+
return {
|
|
18
|
+
js: jsMatch ? jsMatch[1] : "/assets/index.js",
|
|
19
|
+
css: cssMatch ? cssMatch[1] : "/assets/index.css"
|
|
20
|
+
};
|
|
21
|
+
} catch (e) {
|
|
22
|
+
}
|
|
23
|
+
return { js: "/assets/index.js", css: "/assets/index.css" };
|
|
24
|
+
}
|
|
25
|
+
const createHtmlTemplate = async ({
|
|
26
|
+
title,
|
|
27
|
+
description,
|
|
28
|
+
canonicalUrl,
|
|
29
|
+
content,
|
|
30
|
+
hydrationData = "",
|
|
31
|
+
baseSiteUrl = ""
|
|
32
|
+
}) => {
|
|
33
|
+
const { js: jsAsset, css: cssAsset } = await getAssetPaths(baseSiteUrl);
|
|
34
|
+
return `<!doctype html>
|
|
35
|
+
<html lang="en" data-theme="light">
|
|
36
|
+
<head>
|
|
37
|
+
<meta charset="UTF-8" />
|
|
38
|
+
<link rel="icon" type="image/svg+xml" href="/api/logo" />
|
|
39
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
40
|
+
<title>${title}</title>
|
|
41
|
+
<meta name="description" content="${description}" />
|
|
42
|
+
<meta property="og:title" content="${title}" />
|
|
43
|
+
<meta property="og:description" content="${description}" />
|
|
44
|
+
<meta property="og:url" content="${canonicalUrl}" />
|
|
45
|
+
<link rel="canonical" href="${canonicalUrl}" />
|
|
46
|
+
<link rel="stylesheet" crossorigin href="${cssAsset}" />
|
|
47
|
+
<script type="module" crossorigin src="${jsAsset}"><\/script>
|
|
48
|
+
</head>
|
|
49
|
+
<body>
|
|
50
|
+
${hydrationData}
|
|
51
|
+
<div id="app">
|
|
52
|
+
${content}
|
|
53
|
+
</div>
|
|
54
|
+
</body>
|
|
55
|
+
</html>`;
|
|
56
|
+
};
|
|
57
|
+
let loader = null;
|
|
58
|
+
function getLoader(env) {
|
|
59
|
+
if (!loader) {
|
|
60
|
+
if (!env?.CONTENT_BUCKET) return null;
|
|
61
|
+
loader = new R2ContentLoader(
|
|
62
|
+
{ bucket: env.CONTENT_BUCKET, cacheTTL: 5 * 60 * 1e3 },
|
|
63
|
+
{ md2html: { imagePathPrefix: "images/", styleOptions: { classPrefix: "md-", addHeadingIds: true } } }
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return loader;
|
|
67
|
+
}
|
|
68
|
+
async function fetchProfile(env) {
|
|
69
|
+
try {
|
|
70
|
+
const r2 = getLoader(env);
|
|
71
|
+
if (!r2) return null;
|
|
72
|
+
const obj = await r2.getObject("profile.json");
|
|
73
|
+
if (!obj) return null;
|
|
74
|
+
return await obj.json();
|
|
75
|
+
} catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function fetchAboutMe(env) {
|
|
80
|
+
try {
|
|
81
|
+
const r2 = getLoader(env);
|
|
82
|
+
if (!r2) return "";
|
|
83
|
+
const result = await r2.getRendered("about-me.md");
|
|
84
|
+
return result?.content || "";
|
|
85
|
+
} catch {
|
|
86
|
+
return "";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function fetchHome(env) {
|
|
90
|
+
try {
|
|
91
|
+
const r2 = getLoader(env);
|
|
92
|
+
if (!r2) return "";
|
|
93
|
+
const result = await r2.getRendered("home.md");
|
|
94
|
+
return result?.content || "";
|
|
95
|
+
} catch {
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function fetchLatestBlogSummaries(env, count = 3) {
|
|
100
|
+
try {
|
|
101
|
+
const r2 = getLoader(env);
|
|
102
|
+
if (!r2) return [];
|
|
103
|
+
const list = await r2.list("blogs/");
|
|
104
|
+
const metas = [];
|
|
105
|
+
for (const obj of list.objects) {
|
|
106
|
+
if (obj.key.endsWith(".json")) {
|
|
107
|
+
try {
|
|
108
|
+
const metaObj = await r2.getObject(obj.key);
|
|
109
|
+
if (metaObj) metas.push(await metaObj.json());
|
|
110
|
+
} catch {
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return metas.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()).slice(0, count);
|
|
115
|
+
} catch {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function fetchLatestStorySummaries(env, count = 3) {
|
|
120
|
+
try {
|
|
121
|
+
const r2 = getLoader(env);
|
|
122
|
+
if (!r2) return [];
|
|
123
|
+
const list = await r2.list("stories/");
|
|
124
|
+
const metas = [];
|
|
125
|
+
for (const obj of list.objects) {
|
|
126
|
+
if (obj.key.endsWith(".json")) {
|
|
127
|
+
try {
|
|
128
|
+
const metaObj = await r2.getObject(obj.key);
|
|
129
|
+
if (metaObj) metas.push(await metaObj.json());
|
|
130
|
+
} catch {
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return metas.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()).slice(0, count);
|
|
135
|
+
} catch {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const generatePageContent = async (pathname, routes2, footerLinks2, env) => {
|
|
140
|
+
const apiUrl = env?.apiUrl;
|
|
141
|
+
const baseUrl = env?.baseUrl || "https://www.techieleader.com";
|
|
142
|
+
let staticDetails = {
|
|
143
|
+
siteTitle: "My Personal Website",
|
|
144
|
+
copyright: "2026 My Personal Website",
|
|
145
|
+
linkedin: "https://linkedin.com/in/yourname",
|
|
146
|
+
github: "https://github.com/yourname",
|
|
147
|
+
email: "yourname@domain.com"
|
|
148
|
+
};
|
|
149
|
+
try {
|
|
150
|
+
const res = await fetch(`${apiUrl}/api/static`);
|
|
151
|
+
if (res.ok) staticDetails = await res.json();
|
|
152
|
+
} catch (e) {
|
|
153
|
+
}
|
|
154
|
+
const logo = "/api/logo";
|
|
155
|
+
const navLinks = routes2.map((r) => `<a href="${r.link}" class="nav-link" data-route="${r.link === "/" ? "home" : r.text.toLowerCase()}">${r.text}</a>`).join("");
|
|
156
|
+
const bannerTemplate = `
|
|
157
|
+
<my-banner header="${staticDetails.siteTitle}" logo="${logo}">
|
|
158
|
+
<theme-toggle slot="theme-switcher"></theme-toggle>
|
|
159
|
+
<nav slot="nav-links">
|
|
160
|
+
${navLinks}
|
|
161
|
+
</nav>
|
|
162
|
+
</my-banner>`;
|
|
163
|
+
const footerTemplate = `
|
|
164
|
+
<my-footer
|
|
165
|
+
copyright="${staticDetails.copyright}"
|
|
166
|
+
footerlinks='${JSON.stringify(footerLinks2)}'>
|
|
167
|
+
</my-footer>`;
|
|
168
|
+
let profile = null;
|
|
169
|
+
let aboutMeContent = "";
|
|
170
|
+
let homeContent = "";
|
|
171
|
+
let latestBlogs = [];
|
|
172
|
+
let latestStories = [];
|
|
173
|
+
if (env?.CONTENT_BUCKET) {
|
|
174
|
+
[profile, aboutMeContent, homeContent, latestBlogs, latestStories] = await Promise.all([
|
|
175
|
+
fetchProfile(env),
|
|
176
|
+
fetchAboutMe(env),
|
|
177
|
+
fetchHome(env),
|
|
178
|
+
fetchLatestBlogSummaries(env, 3),
|
|
179
|
+
fetchLatestStorySummaries(env, 3)
|
|
180
|
+
]);
|
|
181
|
+
}
|
|
182
|
+
const name = profile?.name || "User";
|
|
183
|
+
const title = profile?.title || "Professional";
|
|
184
|
+
profile?.experience || "some";
|
|
185
|
+
const canonicalUrl = new URL(pathname, baseUrl).toString();
|
|
186
|
+
if (pathname === "/" || pathname === "") {
|
|
187
|
+
const homeHtml = homeContent || `<h1>Welcome to ${name}</h1><p>Upload home.md to customize this page.</p>`;
|
|
188
|
+
const blogGists = latestBlogs.map((b) => `<div class="gist-card"><a href="/blogs/${b.slug}"><h4>${b.title}</h4></a><p>${b.summary}</p><small>${b.date}</small></div>`).join("");
|
|
189
|
+
const storyGists = latestStories.map((s) => `<div class="gist-card"><a href="/stories/${s.slug}"><h4>${s.title}</h4></a><p>${s.summary}</p><small>${s.date}</small></div>`).join("");
|
|
190
|
+
const mainContent = `
|
|
191
|
+
${bannerTemplate}
|
|
192
|
+
<main class="container container-wide column-layout">
|
|
193
|
+
<div class="main-column">
|
|
194
|
+
${homeHtml}
|
|
195
|
+
</div>
|
|
196
|
+
<div class="sidebar-column">
|
|
197
|
+
<h3>Recent Blogs</h3>
|
|
198
|
+
${blogGists || "<p>No blogs yet.</p>"}
|
|
199
|
+
<h3 class="mt-2">Recent Stories</h3>
|
|
200
|
+
${storyGists || "<p>No stories yet.</p>"}
|
|
201
|
+
</div>
|
|
202
|
+
</main>
|
|
203
|
+
${footerTemplate}`;
|
|
204
|
+
return {
|
|
205
|
+
title: `${name} – ${title}`,
|
|
206
|
+
description: `Welcome to ${name}'s personal website. Professional portfolio and content.`,
|
|
207
|
+
canonicalUrl,
|
|
208
|
+
content: mainContent
|
|
209
|
+
};
|
|
210
|
+
} else if (pathname === "/about-me") {
|
|
211
|
+
const mainContent = `
|
|
212
|
+
${bannerTemplate}
|
|
213
|
+
<main class="container container-narrow">
|
|
214
|
+
<my-aboutme base-url="${apiUrl}"></my-aboutme>
|
|
215
|
+
</main>
|
|
216
|
+
${footerTemplate}`;
|
|
217
|
+
return {
|
|
218
|
+
title: `About - ${name}`,
|
|
219
|
+
description: `Learn more about ${name}'s experience and skills.`,
|
|
220
|
+
canonicalUrl,
|
|
221
|
+
content: mainContent
|
|
222
|
+
};
|
|
223
|
+
} else if (pathname === "/blogs" || pathname === "/blogs/") {
|
|
224
|
+
const blogGists = latestBlogs.map((b) => `<div class="gist-card"><a href="/blogs/${b.slug}"><h4>${b.title}</h4></a><p>${b.summary}</p><small>${b.date}</small></div>`).join("");
|
|
225
|
+
const mainContent = `
|
|
226
|
+
${bannerTemplate}
|
|
227
|
+
<main class="container container-wide">
|
|
228
|
+
<h1>Blogs</h1>
|
|
229
|
+
<input type="text" placeholder="Search blogs..." class="search-input" />
|
|
230
|
+
<div class="blog-list">
|
|
231
|
+
${blogGists || "<p>No blogs yet.</p>"}
|
|
232
|
+
</div>
|
|
233
|
+
</main>
|
|
234
|
+
${footerTemplate}`;
|
|
235
|
+
return { title: `Blogs – ${name}`, description: "Read the latest blog posts.", canonicalUrl, content: mainContent };
|
|
236
|
+
} else if (pathname === "/stories" || pathname === "/stories/") {
|
|
237
|
+
const storyGists = latestStories.map((s) => `<div class="gist-card"><a href="/stories/${s.slug}"><h4>${s.title}</h4></a><p>${s.summary}</p><small>${s.date}</small></div>`).join("");
|
|
238
|
+
const mainContent = `
|
|
239
|
+
${bannerTemplate}
|
|
240
|
+
<main class="container container-wide">
|
|
241
|
+
<h1>Stories</h1>
|
|
242
|
+
<input type="text" placeholder="Search stories..." class="search-input" />
|
|
243
|
+
<div class="story-list">
|
|
244
|
+
${storyGists || "<p>No stories yet.</p>"}
|
|
245
|
+
</div>
|
|
246
|
+
</main>
|
|
247
|
+
${footerTemplate}`;
|
|
248
|
+
return { title: `Stories – ${name}`, description: "Read the latest stories.", canonicalUrl, content: mainContent };
|
|
249
|
+
} else if (pathname.startsWith("/blogs/")) {
|
|
250
|
+
const slug = pathname.replace("/blogs/", "").replace("/", "");
|
|
251
|
+
const mainContent = `
|
|
252
|
+
${bannerTemplate}
|
|
253
|
+
<main class="container container-narrow">
|
|
254
|
+
<my-blog-viewer slug="${slug}"></my-blog-viewer>
|
|
255
|
+
</main>
|
|
256
|
+
${footerTemplate}`;
|
|
257
|
+
return { title: `Blog: ${slug}`, description: "Blog post", canonicalUrl, content: mainContent };
|
|
258
|
+
} else if (pathname.startsWith("/stories/")) {
|
|
259
|
+
const slug = pathname.replace("/stories/", "").replace("/", "");
|
|
260
|
+
const mainContent = `
|
|
261
|
+
${bannerTemplate}
|
|
262
|
+
<main class="container container-narrow">
|
|
263
|
+
<my-story-viewer slug="${slug}"></my-story-viewer>
|
|
264
|
+
</main>
|
|
265
|
+
${footerTemplate}`;
|
|
266
|
+
return { title: `Story: ${slug}`, description: "Story post", canonicalUrl, content: mainContent };
|
|
267
|
+
} else {
|
|
268
|
+
const mainContent = `
|
|
269
|
+
${bannerTemplate}
|
|
270
|
+
<main class="container container-narrow text-center">
|
|
271
|
+
<h1>Page Not Found</h1>
|
|
272
|
+
<p>The page you're looking for doesn't exist.</p>
|
|
273
|
+
<p><a href="/">Return to home</a></p>
|
|
274
|
+
</main>
|
|
275
|
+
${footerTemplate}`;
|
|
276
|
+
return { title: "404 Not Found", description: "The page you requested could not be found.", canonicalUrl, content: mainContent };
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const routes = [
|
|
280
|
+
{ link: "/", text: "Home" },
|
|
281
|
+
{ link: "/blogs", text: "Blogs" },
|
|
282
|
+
{ link: "/stories", text: "Stories" },
|
|
283
|
+
{ link: "/about-me", text: "About Me" }
|
|
284
|
+
];
|
|
285
|
+
const defaultFooterLinks = [
|
|
286
|
+
{ text: "LinkedIn", link: "https://linkedin.com/in/yourname" },
|
|
287
|
+
{ text: "GitHub", link: "https://github.com/yourname" },
|
|
288
|
+
{ text: "Email", link: "mailto:yourname@domain.com" }
|
|
289
|
+
];
|
|
290
|
+
let footerLinks = defaultFooterLinks;
|
|
291
|
+
let siteTitle = "My Personal Website";
|
|
292
|
+
let copyright = "2026 My Personal Website";
|
|
293
|
+
async function fetchStaticDetails(apiUrl) {
|
|
294
|
+
try {
|
|
295
|
+
const res = await fetch(`${apiUrl}/api/static`);
|
|
296
|
+
if (res.ok) {
|
|
297
|
+
const data = await res.json();
|
|
298
|
+
siteTitle = data.siteTitle || siteTitle;
|
|
299
|
+
copyright = data.copyright || copyright;
|
|
300
|
+
const normalizeUrl = (url) => {
|
|
301
|
+
if (!url) return "";
|
|
302
|
+
if (url.startsWith("http://") || url.startsWith("https://")) return url;
|
|
303
|
+
if (url.startsWith("www.")) return `https://${url}`;
|
|
304
|
+
return url;
|
|
305
|
+
};
|
|
306
|
+
footerLinks = [
|
|
307
|
+
{ text: "LinkedIn", link: normalizeUrl(data.linkedin) || defaultFooterLinks[0].link },
|
|
308
|
+
{ text: "GitHub", link: normalizeUrl(data.github) || defaultFooterLinks[1].link },
|
|
309
|
+
{ text: "Email", link: data.email ? `mailto:${data.email}` : defaultFooterLinks[2].link }
|
|
310
|
+
];
|
|
311
|
+
}
|
|
312
|
+
} catch (e) {
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
async function fetchAboutMeData(apiUrl) {
|
|
316
|
+
try {
|
|
317
|
+
const res = await fetch(`${apiUrl}/api/aboutme`);
|
|
318
|
+
if (res.ok) return await res.json();
|
|
319
|
+
} catch (e) {
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
const index = {
|
|
324
|
+
async fetch(request, env, ctx) {
|
|
325
|
+
const apiUrl = env?.API_URL || "https://api.example.com";
|
|
326
|
+
const baseSiteUrl = env?.BASE_SITE_URL || "https://site.example.com";
|
|
327
|
+
await fetchStaticDetails(apiUrl);
|
|
328
|
+
const url = new URL(request.url);
|
|
329
|
+
if (url.pathname.startsWith("/api/")) {
|
|
330
|
+
return fetch(`${apiUrl}${url.pathname}${url.search}`);
|
|
331
|
+
}
|
|
332
|
+
if (url.pathname.startsWith("/images/")) {
|
|
333
|
+
const imageKey = url.pathname.slice(1);
|
|
334
|
+
try {
|
|
335
|
+
const image = await env.CONTENT_BUCKET.get(imageKey);
|
|
336
|
+
if (image) {
|
|
337
|
+
return new Response(image.body, {
|
|
338
|
+
headers: {
|
|
339
|
+
"content-type": image.httpMetadata?.contentType || "image/jpeg",
|
|
340
|
+
"cache-control": "public, max-age=86400"
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
} catch (e) {
|
|
345
|
+
}
|
|
346
|
+
return new Response("Not found", { status: 404 });
|
|
347
|
+
}
|
|
348
|
+
if (url.pathname.startsWith("/assets/") || url.pathname === "/logo.png" || url.pathname === "/favicon.ico") {
|
|
349
|
+
const path = url.pathname;
|
|
350
|
+
const ext = path.split(".").pop()?.toLowerCase();
|
|
351
|
+
const contentTypes = {
|
|
352
|
+
js: "application/javascript",
|
|
353
|
+
css: "text/css",
|
|
354
|
+
png: "image/png",
|
|
355
|
+
jpg: "image/jpeg",
|
|
356
|
+
jpeg: "image/jpeg",
|
|
357
|
+
gif: "image/gif",
|
|
358
|
+
svg: "image/svg+xml",
|
|
359
|
+
webp: "image/webp",
|
|
360
|
+
ico: "image/x-icon"
|
|
361
|
+
};
|
|
362
|
+
const contentType = contentTypes[ext || ""] || "application/octet-stream";
|
|
363
|
+
const response = await fetch(`${baseSiteUrl}${path}`);
|
|
364
|
+
if (response.ok) {
|
|
365
|
+
return new Response(response.body, {
|
|
366
|
+
headers: {
|
|
367
|
+
"content-type": contentType,
|
|
368
|
+
"cache-control": "public, max-age=31536000"
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
return new Response("Not found", { status: 404 });
|
|
373
|
+
}
|
|
374
|
+
const PRERENDERED_DOMAINS = [
|
|
375
|
+
url.hostname
|
|
376
|
+
];
|
|
377
|
+
if (!PRERENDERED_DOMAINS.includes(url.hostname) && !url.hostname.includes("localhost")) {
|
|
378
|
+
return fetch(request);
|
|
379
|
+
}
|
|
380
|
+
let hydrationScript = "";
|
|
381
|
+
if (url.pathname === "/about-me" || url.pathname === "/about-me/") {
|
|
382
|
+
const aboutMeData = await fetchAboutMeData(apiUrl);
|
|
383
|
+
if (aboutMeData) {
|
|
384
|
+
hydrationScript = `<script>window.__HYDRATION_DATA__ = ${JSON.stringify(aboutMeData)};<\/script>`;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const pageContent = await generatePageContent(url.pathname, routes, footerLinks, { ...env, apiUrl });
|
|
388
|
+
const html = await createHtmlTemplate({ ...pageContent, hydrationData: hydrationScript });
|
|
389
|
+
return new Response(html, {
|
|
390
|
+
headers: {
|
|
391
|
+
"content-type": "text/html",
|
|
392
|
+
"cache-control": "public, max-age=60"
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
export {
|
|
398
|
+
index as default
|
|
399
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/shared/config/api.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,KActB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { InfrastructureConfig, WebsiteConfig } from './types';
|
|
2
|
+
export * from './types';
|
|
3
|
+
export declare function initializeConfig(infra?: Partial<InfrastructureConfig>): Promise<WebsiteConfig>;
|
|
4
|
+
export declare function getConfig(): WebsiteConfig;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAiB,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7E,cAAc,SAAS,CAAC;AAkBxB,wBAAsB,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAgBpG;AAED,wBAAgB,SAAS,IAAI,aAAa,CAEzC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface InfrastructureConfig {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
}
|
|
5
|
+
export interface StaticDetails {
|
|
6
|
+
siteTitle: string;
|
|
7
|
+
siteDescription: string;
|
|
8
|
+
copyright: string;
|
|
9
|
+
linkedin: string;
|
|
10
|
+
github: string;
|
|
11
|
+
email: string;
|
|
12
|
+
twitter?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface WebsiteConfig extends InfrastructureConfig, StaticDetails {
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,oBAAoB,EAAE,aAAa;CAAG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { WebsiteConfig } from '../config';
|
|
2
|
+
export declare class SiteStore {
|
|
3
|
+
private static instance;
|
|
4
|
+
private config;
|
|
5
|
+
private listeners;
|
|
6
|
+
private constructor();
|
|
7
|
+
static getInstance(): SiteStore;
|
|
8
|
+
init(infra?: {
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
apiUrl: string;
|
|
11
|
+
}): Promise<WebsiteConfig>;
|
|
12
|
+
subscribe(listener: (config: WebsiteConfig) => void): () => boolean;
|
|
13
|
+
private notify;
|
|
14
|
+
getConfig(): WebsiteConfig;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=site-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-store.d.ts","sourceRoot":"","sources":["../../../src/shared/core/site-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAA+B,MAAM,WAAW,CAAC;AAEtF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IACnC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,SAAS,CAAmD;IAEpE,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,SAAS;IAOzB,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAMtD,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI;IAMnD,OAAO,CAAC,MAAM;IAMd,SAAS,IAAI,aAAa;CAG3B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ThemeToggle extends HTMLElement {
|
|
2
|
+
constructor();
|
|
3
|
+
connectedCallback(): void;
|
|
4
|
+
disconnectedCallback(): void;
|
|
5
|
+
render(): void;
|
|
6
|
+
applyThemeFromLocalStorage(): void;
|
|
7
|
+
toggleTheme: () => void;
|
|
8
|
+
updateToggleButton(theme: string): void;
|
|
9
|
+
getSunIcon(): string;
|
|
10
|
+
getMoonIcon(): string;
|
|
11
|
+
dispatchThemeChangeEvent(theme: string): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=theme-toggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../../src/shared/core/theme-toggle.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,WAAW;;IAQ1C,iBAAiB;IAIjB,oBAAoB;IAIpB,MAAM;IAkCN,0BAA0B;IAc1B,WAAW,aAOT;IAEF,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAUhC,UAAU,IAAI,MAAM;IAgBpB,WAAW,IAAI,MAAM;IAQrB,wBAAwB,CAAC,KAAK,EAAE,MAAM;CAQvC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './config';
|
|
2
|
+
export * from './core/site-store';
|
|
3
|
+
export * from './interfaces/iRoute';
|
|
4
|
+
export * from './interfaces/iFooterLink';
|
|
5
|
+
export * from './core/theme-toggle';
|
|
6
|
+
export * from './template';
|
|
7
|
+
export * from './pageContent';
|
|
8
|
+
export * from './runtime';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AACA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAGlC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAG9B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iFooterLink.d.ts","sourceRoot":"","sources":["../../../src/shared/interfaces/iFooterLink.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iRoute.d.ts","sourceRoot":"","sources":["../../../src/shared/interfaces/iRoute.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { IFooterLink } from './interfaces/iFooterLink';
|
|
2
|
+
import { IRoute } from './interfaces/iRoute';
|
|
3
|
+
export interface PageContent {
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
canonicalUrl: string;
|
|
7
|
+
content: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ContentMetadata {
|
|
10
|
+
slug: string;
|
|
11
|
+
title: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
summary?: string;
|
|
14
|
+
date: string;
|
|
15
|
+
imageUrl?: string;
|
|
16
|
+
tags?: string[];
|
|
17
|
+
author?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const renderMarkdown: (content: string) => string;
|
|
20
|
+
export declare const generatePageContent: (pathname: string, routes: IRoute[], footerLinks: IFooterLink[], data?: {
|
|
21
|
+
blogs?: ContentMetadata[];
|
|
22
|
+
stories?: ContentMetadata[];
|
|
23
|
+
profile?: any;
|
|
24
|
+
content?: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
date?: string;
|
|
28
|
+
slug?: string;
|
|
29
|
+
siteTitle?: string;
|
|
30
|
+
siteDescription?: string;
|
|
31
|
+
copyright?: string;
|
|
32
|
+
apiUrl?: string;
|
|
33
|
+
baseUrl?: string;
|
|
34
|
+
}) => PageContent;
|
|
35
|
+
//# sourceMappingURL=pageContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageContent.d.ts","sourceRoot":"","sources":["../../src/shared/pageContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAGhD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,UAAU,MAAM,EAChB,QAAQ,MAAM,EAAE,EAChB,aAAa,WAAW,EAAE,EAC1B,OAAO;IACL,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KACA,WA0JF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './interfaces/iRoute';
|
|
2
|
+
export * from './interfaces/iFooterLink';
|
|
3
|
+
export * from './pageContent';
|
|
4
|
+
export type { IRoute } from './interfaces/iRoute';
|
|
5
|
+
export type { IFooterLink } from './interfaces/iFooterLink';
|
|
6
|
+
export { generatePageContent } from './pageContent';
|
|
7
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/shared/runtime.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAG9B,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface TemplateProps {
|
|
2
|
+
title: string;
|
|
3
|
+
description: string;
|
|
4
|
+
canonicalUrl: string;
|
|
5
|
+
content: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const createHtmlTemplate: ({ title, description, canonicalUrl, content }: TemplateProps) => string;
|
|
8
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/shared/template.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,kBAAkB,GAAI,+CAKhC,aAAa,KAAG,MAsBlB,CAAC"}
|
package/dist/shared.d.ts
ADDED
package/dist/shared.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SiteStore, ThemeToggle, createHtmlTemplate, generatePageContent, getConfig, initializeConfig, renderMarkdown } from "./index.js";
|
|
2
|
+
export {
|
|
3
|
+
SiteStore,
|
|
4
|
+
ThemeToggle,
|
|
5
|
+
createHtmlTemplate,
|
|
6
|
+
generatePageContent,
|
|
7
|
+
getConfig,
|
|
8
|
+
initializeConfig,
|
|
9
|
+
renderMarkdown
|
|
10
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface Profile {
|
|
2
|
+
name: string;
|
|
3
|
+
title: string;
|
|
4
|
+
experience: string;
|
|
5
|
+
profileImageUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function fetchAboutMe(url: string): Promise<{
|
|
8
|
+
profile: Profile;
|
|
9
|
+
contentNodes: any[];
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/ui/aboutme/api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,GAAG,EAAE,CAAA;CAAE,CAAC,CAIlG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { ContentNode } from '@leadertechie/md2html';
|
|
3
|
+
import { Profile, fetchAboutMe } from './api';
|
|
4
|
+
import { AboutMeRenderer } from './renderer';
|
|
5
|
+
export declare class MyAboutme extends LitElement {
|
|
6
|
+
static styles: import('lit').CSSResult;
|
|
7
|
+
accessor baseUrl: string;
|
|
8
|
+
accessor profile: Profile | null;
|
|
9
|
+
accessor contentNodes: ContentNode[];
|
|
10
|
+
accessor loading: boolean;
|
|
11
|
+
private renderer;
|
|
12
|
+
/**
|
|
13
|
+
* Injectable fetcher function used to retrieve About Me data.
|
|
14
|
+
* Tests can override this (e.g. componentInstance.fetcher = myMock)
|
|
15
|
+
* to avoid network I/O. By default it uses the stable `fetchAboutMe` helper.
|
|
16
|
+
*/
|
|
17
|
+
fetcher: typeof fetchAboutMe;
|
|
18
|
+
constructor(renderer?: AboutMeRenderer);
|
|
19
|
+
private get apiBaseUrl();
|
|
20
|
+
connectedCallback(): Promise<void>;
|
|
21
|
+
updated(changedProperties: Map<string, any>): void;
|
|
22
|
+
private loadContent;
|
|
23
|
+
private setFallbackContent;
|
|
24
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/aboutme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAIhC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAOrC,qBACa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,MAAM,0BAAiB;IAG9B,QAAQ,CAAC,OAAO,SAAM;IAGtB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAQ;IAGxC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAM;IAG1C,QAAQ,CAAC,OAAO,UAAQ;IAExB,OAAO,CAAC,QAAQ,CAAkB;IAClC;;;;OAIG;IACI,OAAO,sBAAgB;gBAElB,QAAQ,CAAC,EAAE,eAAe;IAKtC,OAAO,KAAK,UAAU,GAErB;IAEK,iBAAiB;IAmBvB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;YAiB7B,WAAW;IAuBzB,OAAO,CAAC,kBAAkB;IAU1B,MAAM;CAoCP"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/ui/aboutme/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,qBAAa,eAAe;IAC1B,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO;CAG7C"}
|