@leadertechie/personal-site-kit 0.1.0-alpha.1 → 0.1.0-alpha.11
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/api/__tests__/info.test.d.ts +2 -0
- package/dist/api/__tests__/info.test.d.ts.map +1 -0
- package/dist/api/__tests__/utils.test.d.ts +2 -0
- package/dist/api/__tests__/utils.test.d.ts.map +1 -0
- package/dist/api/content-utils.d.ts +27 -0
- package/dist/api/content-utils.d.ts.map +1 -0
- package/dist/api/handlers/{aboutme.d.ts → about-me.d.ts} +1 -1
- package/dist/api/handlers/about-me.d.ts.map +1 -0
- package/dist/api/handlers/auth-handler.d.ts +2 -0
- package/dist/api/handlers/auth-handler.d.ts.map +1 -0
- package/dist/api/handlers/auth.d.ts +23 -0
- package/dist/api/handlers/auth.d.ts.map +1 -0
- package/dist/api/handlers/content-api.d.ts +0 -1
- package/dist/api/handlers/content-api.d.ts.map +1 -1
- package/dist/api/handlers/content.d.ts.map +1 -1
- package/dist/api/handlers/home.d.ts.map +1 -1
- package/dist/api/handlers/{staticdetails.d.ts → static-details.d.ts} +1 -1
- package/dist/api/handlers/static-details.d.ts.map +1 -0
- package/dist/api/index.d.ts +7 -8
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/website-api.d.ts +10 -0
- package/dist/api/website-api.d.ts.map +1 -0
- package/dist/api.d.ts +2 -0
- package/dist/api.js +19 -589
- package/dist/assets/logo-placeholder.svg +21 -0
- package/dist/chunks/index-B2jGIzSi.js +2695 -0
- package/dist/chunks/index-CGvOrVf8.js +213 -0
- package/dist/chunks/site-store-CGV9c2DI.js +89 -0
- package/dist/chunks/template-Ccxil4s-.js +597 -0
- package/dist/chunks/website-api-DTaVHBO_.js +927 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -352
- package/dist/prerender/__tests__/page-content.test.d.ts +2 -0
- package/dist/prerender/__tests__/page-content.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/template.test.d.ts +2 -0
- package/dist/prerender/__tests__/template.test.d.ts.map +1 -0
- package/dist/prerender/data-fetcher.d.ts +19 -0
- package/dist/prerender/data-fetcher.d.ts.map +1 -0
- package/dist/prerender/index.d.ts +5 -4
- package/dist/prerender/index.d.ts.map +1 -1
- package/dist/prerender/{pageContent.d.ts → page-content.d.ts} +1 -1
- package/dist/prerender/page-content.d.ts.map +1 -0
- package/dist/prerender/page-generators/about.d.ts +16 -0
- package/dist/prerender/page-generators/about.d.ts.map +1 -0
- package/dist/prerender/page-generators/base.d.ts +26 -0
- package/dist/prerender/page-generators/base.d.ts.map +1 -0
- package/dist/prerender/page-generators/blog-detail.d.ts +15 -0
- package/dist/prerender/page-generators/blog-detail.d.ts.map +1 -0
- package/dist/prerender/page-generators/blogs-list.d.ts +17 -0
- package/dist/prerender/page-generators/blogs-list.d.ts.map +1 -0
- package/dist/prerender/page-generators/home.d.ts +19 -0
- package/dist/prerender/page-generators/home.d.ts.map +1 -0
- package/dist/prerender/page-generators/index.d.ts +9 -0
- package/dist/prerender/page-generators/index.d.ts.map +1 -0
- package/dist/prerender/page-generators/not-found.d.ts +14 -0
- package/dist/prerender/page-generators/not-found.d.ts.map +1 -0
- package/dist/prerender/page-generators/stories-list.d.ts +17 -0
- package/dist/prerender/page-generators/stories-list.d.ts.map +1 -0
- package/dist/prerender/page-generators/story-detail.d.ts +15 -0
- package/dist/prerender/page-generators/story-detail.d.ts.map +1 -0
- package/dist/prerender/template.d.ts.map +1 -1
- package/dist/prerender/website-prerender.d.ts +22 -0
- package/dist/prerender/website-prerender.d.ts.map +1 -0
- package/dist/prerender.d.ts +2 -0
- package/dist/prerender.js +164 -151
- package/dist/shared/config/index.d.ts +1 -0
- package/dist/shared/config/index.d.ts.map +1 -1
- package/dist/shared/core/__tests__/theme-toggle.test.d.ts +2 -0
- package/dist/shared/core/__tests__/theme-toggle.test.d.ts.map +1 -0
- package/dist/shared/core/site-store.d.ts +1 -0
- package/dist/shared/core/site-store.d.ts.map +1 -1
- package/dist/shared/index.d.ts +5 -3
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/interfaces/{iFooterLink.d.ts → ifooter-link.d.ts} +1 -1
- package/dist/shared/interfaces/ifooter-link.d.ts.map +1 -0
- package/dist/shared/interfaces/{iRoute.d.ts → iroute.d.ts} +1 -1
- package/dist/shared/interfaces/iroute.d.ts.map +1 -0
- package/dist/shared/{pageContent.d.ts → page-content.d.ts} +4 -3
- package/dist/shared/page-content.d.ts.map +1 -0
- package/dist/shared/router.d.ts +23 -0
- package/dist/shared/router.d.ts.map +1 -0
- package/dist/shared/runtime.d.ts +6 -6
- package/dist/shared/runtime.d.ts.map +1 -1
- package/dist/shared/website-ui.d.ts +32 -0
- package/dist/shared/website-ui.d.ts.map +1 -0
- package/dist/shared.js +13 -8
- package/dist/ui/about-me/api.d.ts.map +1 -0
- package/dist/ui/{aboutme → about-me}/index.d.ts +2 -10
- package/dist/ui/about-me/index.d.ts.map +1 -0
- package/dist/ui/about-me/styles.d.ts.map +1 -0
- package/dist/ui/admin/api.d.ts +16 -0
- package/dist/ui/admin/api.d.ts.map +1 -0
- package/dist/ui/admin/components/AboutMeSection.d.ts +7 -0
- package/dist/ui/admin/components/AboutMeSection.d.ts.map +1 -0
- package/dist/ui/admin/components/AdminSection.d.ts +13 -0
- package/dist/ui/admin/components/AdminSection.d.ts.map +1 -0
- package/dist/ui/admin/components/BlogsSection.d.ts +7 -0
- package/dist/ui/admin/components/BlogsSection.d.ts.map +1 -0
- package/dist/ui/admin/components/HomeSection.d.ts +7 -0
- package/dist/ui/admin/components/HomeSection.d.ts.map +1 -0
- package/dist/ui/admin/components/ImagesSection.d.ts +7 -0
- package/dist/ui/admin/components/ImagesSection.d.ts.map +1 -0
- package/dist/ui/admin/components/LoginForm.d.ts +9 -0
- package/dist/ui/admin/components/LoginForm.d.ts.map +1 -0
- package/dist/ui/admin/components/LogoSection.d.ts +7 -0
- package/dist/ui/admin/components/LogoSection.d.ts.map +1 -0
- package/dist/ui/admin/components/ProfileSection.d.ts +7 -0
- package/dist/ui/admin/components/ProfileSection.d.ts.map +1 -0
- package/dist/ui/admin/components/StaticSection.d.ts +9 -0
- package/dist/ui/admin/components/StaticSection.d.ts.map +1 -0
- package/dist/ui/admin/components/StoriesSection.d.ts +7 -0
- package/dist/ui/admin/components/StoriesSection.d.ts.map +1 -0
- package/dist/ui/admin/components/index.d.ts +11 -0
- package/dist/ui/admin/components/index.d.ts.map +1 -0
- package/dist/ui/admin/index.d.ts +27 -26
- package/dist/ui/admin/index.d.ts.map +1 -1
- package/dist/ui/admin/styles.d.ts.map +1 -1
- package/dist/ui/admin/types.d.ts +24 -0
- package/dist/ui/admin/types.d.ts.map +1 -0
- package/dist/ui/banner/styles.d.ts.map +1 -1
- package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts +2 -0
- package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts.map +1 -0
- package/dist/ui/blog-viewer/index.d.ts +25 -0
- package/dist/ui/blog-viewer/index.d.ts.map +1 -0
- package/dist/ui/blog-viewer/styles.d.ts +2 -0
- package/dist/ui/blog-viewer/styles.d.ts.map +1 -0
- package/dist/ui/footer/index.d.ts +1 -1
- package/dist/ui/footer/index.d.ts.map +1 -1
- package/dist/ui/footer/styles.d.ts.map +1 -1
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts +2 -0
- package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts.map +1 -0
- package/dist/ui/story-viewer/index.d.ts +25 -0
- package/dist/ui/story-viewer/index.d.ts.map +1 -0
- package/dist/ui/story-viewer/styles.d.ts +2 -0
- package/dist/ui/story-viewer/styles.d.ts.map +1 -0
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +17 -818
- package/package.json +31 -12
- package/public/assets/logo-placeholder.svg +21 -0
- package/dist/api/handlers/aboutme.d.ts.map +0 -1
- package/dist/api/handlers/staticdetails.d.ts.map +0 -1
- package/dist/prerender/pageContent.d.ts.map +0 -1
- package/dist/shared/interfaces/iFooterLink.d.ts.map +0 -1
- package/dist/shared/interfaces/iRoute.d.ts.map +0 -1
- package/dist/shared/pageContent.d.ts.map +0 -1
- package/dist/ui/aboutme/api.d.ts.map +0 -1
- package/dist/ui/aboutme/index.d.ts.map +0 -1
- package/dist/ui/aboutme/renderer.d.ts +0 -5
- package/dist/ui/aboutme/renderer.d.ts.map +0 -1
- package/dist/ui/aboutme/styles.d.ts.map +0 -1
- package/src/api/__tests__/info.test.ts +0 -44
- package/src/api/__tests__/utils.test.ts +0 -78
- package/src/api/handlers/aboutme.ts +0 -99
- package/src/api/handlers/content-api.ts +0 -268
- package/src/api/handlers/content.ts +0 -72
- package/src/api/handlers/home.ts +0 -79
- package/src/api/handlers/info.ts +0 -12
- package/src/api/handlers/logo.ts +0 -55
- package/src/api/handlers/staticdetails.ts +0 -48
- package/src/api/index.ts +0 -125
- package/src/api/utils.ts +0 -16
- package/src/prerender/__tests__/pageContent.test.ts +0 -54
- package/src/prerender/__tests__/template.test.ts +0 -54
- package/src/prerender/index.ts +0 -138
- package/src/prerender/pageContent.ts +0 -263
- package/src/prerender/prerender.ts +0 -25
- package/src/prerender/template.ts +0 -65
- package/src/shared/config/api.ts +0 -16
- package/src/shared/config/index.ts +0 -41
- package/src/shared/config/types.ts +0 -16
- package/src/shared/core/__tests__/theme-toggle.test.ts +0 -204
- package/src/shared/core/site-store.ts +0 -38
- package/src/shared/core/theme-toggle.ts +0 -118
- package/src/shared/index.ts +0 -15
- package/src/shared/interfaces/iFooterLink.ts +0 -4
- package/src/shared/interfaces/iRoute.ts +0 -4
- package/src/shared/models/theme-variables.css +0 -25
- package/src/shared/pageContent.ts +0 -209
- package/src/shared/runtime.ts +0 -11
- package/src/shared/template.ts +0 -35
- package/src/styles/markdown.css +0 -129
- package/src/ui/aboutme/api.ts +0 -12
- package/src/ui/aboutme/index.ts +0 -155
- package/src/ui/aboutme/renderer.ts +0 -7
- package/src/ui/aboutme/styles.ts +0 -10
- package/src/ui/admin/index.ts +0 -492
- package/src/ui/admin/styles.ts +0 -317
- package/src/ui/banner/index.ts +0 -38
- package/src/ui/banner/styles.ts +0 -10
- package/src/ui/footer/index.ts +0 -37
- package/src/ui/footer/styles.ts +0 -9
- /package/{src/shared → dist}/styles/markdown.css +0 -0
- /package/{src → dist}/styles/theme.css +0 -0
- /package/dist/ui/{aboutme → about-me}/api.d.ts +0 -0
- /package/dist/ui/{aboutme → about-me}/styles.d.ts +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
class BasePageGenerator {
|
|
2
|
+
generateBanner(routes, siteTitle, logo) {
|
|
3
|
+
const navLinks = routes.map((r) => `<a href="${r.link}" class="nav-link" data-route="${r.link === "/" ? "home" : r.text.toLowerCase()}">${r.text}</a>`).join("");
|
|
4
|
+
return `
|
|
5
|
+
<my-banner header="${siteTitle}" logo="${logo}">
|
|
6
|
+
<theme-toggle slot="theme-switcher"></theme-toggle>
|
|
7
|
+
<nav slot="nav-links">
|
|
8
|
+
${navLinks}
|
|
9
|
+
</nav>
|
|
10
|
+
</my-banner>`;
|
|
11
|
+
}
|
|
12
|
+
generateFooter(footerLinks, copyright) {
|
|
13
|
+
return `
|
|
14
|
+
<my-footer
|
|
15
|
+
copyright="${copyright}"
|
|
16
|
+
footerlinks='${JSON.stringify(footerLinks)}'>
|
|
17
|
+
</my-footer>`;
|
|
18
|
+
}
|
|
19
|
+
generateMeta(title, description, canonicalUrl) {
|
|
20
|
+
}
|
|
21
|
+
wrapContent(banner, mainContent, footer) {
|
|
22
|
+
return `${banner}${mainContent}${footer}`;
|
|
23
|
+
}
|
|
24
|
+
generatePage(pathname, routes, footerLinks, staticDetails, apiUrl, baseUrl, mainContent, title, description) {
|
|
25
|
+
const logo = "/api/logo";
|
|
26
|
+
const banner = this.generateBanner(routes, staticDetails.siteTitle || "My Personal Website", logo);
|
|
27
|
+
const footer = this.generateFooter(footerLinks, staticDetails.copyright || "2026 My Personal Website");
|
|
28
|
+
const canonicalUrl = new URL(pathname, baseUrl).toString();
|
|
29
|
+
const content = this.wrapContent(banner, mainContent, footer);
|
|
30
|
+
return {
|
|
31
|
+
title,
|
|
32
|
+
description,
|
|
33
|
+
canonicalUrl,
|
|
34
|
+
content
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
class HomePageGenerator extends BasePageGenerator {
|
|
39
|
+
generate(data) {
|
|
40
|
+
const { profile, homeContent, latestBlogs, latestStories, staticDetails, ...baseData } = data;
|
|
41
|
+
const name = profile?.name || "User";
|
|
42
|
+
const title = profile?.title || "Professional";
|
|
43
|
+
const homeHtml = homeContent || `<h1>Welcome to ${name}</h1><p>Upload home.md to customize this page.</p>`;
|
|
44
|
+
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("");
|
|
45
|
+
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("");
|
|
46
|
+
const mainContent = `
|
|
47
|
+
<main class="container container-wide column-layout">
|
|
48
|
+
<div class="main-column">
|
|
49
|
+
${homeHtml}
|
|
50
|
+
</div>
|
|
51
|
+
<div class="sidebar-column">
|
|
52
|
+
<h3>Recent Blogs</h3>
|
|
53
|
+
${blogGists || "<p>No blogs yet.</p>"}
|
|
54
|
+
<h3 class="mt-2">Recent Stories</h3>
|
|
55
|
+
${storyGists || "<p>No stories yet.</p>"}
|
|
56
|
+
</div>
|
|
57
|
+
</main>`;
|
|
58
|
+
return this.generatePage(
|
|
59
|
+
baseData.pathname,
|
|
60
|
+
baseData.routes,
|
|
61
|
+
baseData.footerLinks,
|
|
62
|
+
staticDetails,
|
|
63
|
+
baseData.apiUrl,
|
|
64
|
+
baseData.baseUrl,
|
|
65
|
+
mainContent,
|
|
66
|
+
`${name} – ${title}`,
|
|
67
|
+
`Welcome to ${name}'s personal website. Professional portfolio and content.`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
class AboutPageGenerator extends BasePageGenerator {
|
|
72
|
+
generate(data) {
|
|
73
|
+
const { profile, staticDetails, ...baseData } = data;
|
|
74
|
+
const name = profile?.name || "User";
|
|
75
|
+
const mainContent = `
|
|
76
|
+
<main class="container container-narrow">
|
|
77
|
+
<my-aboutme base-url="${baseData.apiUrl}"></my-aboutme>
|
|
78
|
+
</main>`;
|
|
79
|
+
return this.generatePage(
|
|
80
|
+
baseData.pathname,
|
|
81
|
+
baseData.routes,
|
|
82
|
+
baseData.footerLinks,
|
|
83
|
+
staticDetails,
|
|
84
|
+
baseData.apiUrl,
|
|
85
|
+
baseData.baseUrl,
|
|
86
|
+
mainContent,
|
|
87
|
+
`About - ${name}`,
|
|
88
|
+
`Learn more about ${name}'s experience and skills.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
class BlogsListPageGenerator extends BasePageGenerator {
|
|
93
|
+
generate(data) {
|
|
94
|
+
const { latestBlogs, name, staticDetails, ...baseData } = data;
|
|
95
|
+
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("");
|
|
96
|
+
const mainContent = `
|
|
97
|
+
<main class="container container-wide">
|
|
98
|
+
<h1>Blogs</h1>
|
|
99
|
+
<input type="text" placeholder="Search blogs..." class="search-input" />
|
|
100
|
+
<div class="blog-list">
|
|
101
|
+
${blogGists || "<p>No blogs yet.</p>"}
|
|
102
|
+
</div>
|
|
103
|
+
</main>`;
|
|
104
|
+
return this.generatePage(
|
|
105
|
+
baseData.pathname,
|
|
106
|
+
baseData.routes,
|
|
107
|
+
baseData.footerLinks,
|
|
108
|
+
staticDetails,
|
|
109
|
+
baseData.apiUrl,
|
|
110
|
+
baseData.baseUrl,
|
|
111
|
+
mainContent,
|
|
112
|
+
`Blogs – ${name}`,
|
|
113
|
+
"Read the latest blog posts."
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
class StoriesListPageGenerator extends BasePageGenerator {
|
|
118
|
+
generate(data) {
|
|
119
|
+
const { latestStories, name, staticDetails, ...baseData } = data;
|
|
120
|
+
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("");
|
|
121
|
+
const mainContent = `
|
|
122
|
+
<main class="container container-wide">
|
|
123
|
+
<h1>Stories</h1>
|
|
124
|
+
<input type="text" placeholder="Search stories..." class="search-input" />
|
|
125
|
+
<div class="story-list">
|
|
126
|
+
${storyGists || "<p>No stories yet.</p>"}
|
|
127
|
+
</div>
|
|
128
|
+
</main>`;
|
|
129
|
+
return this.generatePage(
|
|
130
|
+
baseData.pathname,
|
|
131
|
+
baseData.routes,
|
|
132
|
+
baseData.footerLinks,
|
|
133
|
+
staticDetails,
|
|
134
|
+
baseData.apiUrl,
|
|
135
|
+
baseData.baseUrl,
|
|
136
|
+
mainContent,
|
|
137
|
+
`Stories – ${name}`,
|
|
138
|
+
"Read the latest stories."
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
class BlogDetailPageGenerator extends BasePageGenerator {
|
|
143
|
+
generate(data) {
|
|
144
|
+
const { slug, staticDetails, ...baseData } = data;
|
|
145
|
+
const mainContent = `
|
|
146
|
+
<main class="container container-narrow">
|
|
147
|
+
<my-blog-viewer slug="${slug}"></my-blog-viewer>
|
|
148
|
+
</main>`;
|
|
149
|
+
return this.generatePage(
|
|
150
|
+
baseData.pathname,
|
|
151
|
+
baseData.routes,
|
|
152
|
+
baseData.footerLinks,
|
|
153
|
+
staticDetails,
|
|
154
|
+
baseData.apiUrl,
|
|
155
|
+
baseData.baseUrl,
|
|
156
|
+
mainContent,
|
|
157
|
+
`Blog: ${slug}`,
|
|
158
|
+
"Blog post"
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
class StoryDetailPageGenerator extends BasePageGenerator {
|
|
163
|
+
generate(data) {
|
|
164
|
+
const { slug, staticDetails, ...baseData } = data;
|
|
165
|
+
const mainContent = `
|
|
166
|
+
<main class="container container-narrow">
|
|
167
|
+
<my-story-viewer slug="${slug}"></my-story-viewer>
|
|
168
|
+
</main>`;
|
|
169
|
+
return this.generatePage(
|
|
170
|
+
baseData.pathname,
|
|
171
|
+
baseData.routes,
|
|
172
|
+
baseData.footerLinks,
|
|
173
|
+
staticDetails,
|
|
174
|
+
baseData.apiUrl,
|
|
175
|
+
baseData.baseUrl,
|
|
176
|
+
mainContent,
|
|
177
|
+
`Story: ${slug}`,
|
|
178
|
+
"Story post"
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
class NotFoundPageGenerator extends BasePageGenerator {
|
|
183
|
+
generate(data) {
|
|
184
|
+
const { staticDetails, ...baseData } = data;
|
|
185
|
+
const mainContent = `
|
|
186
|
+
<main class="container container-narrow text-center">
|
|
187
|
+
<h1>Page Not Found</h1>
|
|
188
|
+
<p>The page you're looking for doesn't exist.</p>
|
|
189
|
+
<p><a href="/">Return to home</a></p>
|
|
190
|
+
</main>`;
|
|
191
|
+
return this.generatePage(
|
|
192
|
+
baseData.pathname,
|
|
193
|
+
baseData.routes,
|
|
194
|
+
baseData.footerLinks,
|
|
195
|
+
staticDetails,
|
|
196
|
+
baseData.apiUrl,
|
|
197
|
+
baseData.baseUrl,
|
|
198
|
+
mainContent,
|
|
199
|
+
"404 Not Found",
|
|
200
|
+
"The page you requested could not be found."
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export {
|
|
205
|
+
AboutPageGenerator,
|
|
206
|
+
BasePageGenerator,
|
|
207
|
+
BlogDetailPageGenerator,
|
|
208
|
+
BlogsListPageGenerator,
|
|
209
|
+
HomePageGenerator,
|
|
210
|
+
NotFoundPageGenerator,
|
|
211
|
+
StoriesListPageGenerator,
|
|
212
|
+
StoryDetailPageGenerator
|
|
213
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const __vite_import_meta_env__ = {};
|
|
2
|
+
const DEFAULT_INFRA = {
|
|
3
|
+
baseUrl: typeof window !== "undefined" ? window.location.origin : "http://localhost:5173",
|
|
4
|
+
apiUrl: typeof window !== "undefined" && (window.__VITE_API_URL__ || __vite_import_meta_env__?.VITE_API_URL) || (typeof window !== "undefined" ? window.location.origin : "http://localhost:8787")
|
|
5
|
+
};
|
|
6
|
+
const DEFAULT_STATIC = {
|
|
7
|
+
siteTitle: "My Personal Website",
|
|
8
|
+
siteDescription: "My Personal Website",
|
|
9
|
+
copyright: "2026 My Personal Website",
|
|
10
|
+
linkedin: "https://linkedin.com/in/yourname",
|
|
11
|
+
github: "https://github.com/yourname",
|
|
12
|
+
email: "yourname@domain.com"
|
|
13
|
+
};
|
|
14
|
+
let activeConfig = { ...DEFAULT_INFRA, ...DEFAULT_STATIC };
|
|
15
|
+
async function initializeConfig(infra) {
|
|
16
|
+
if (infra) {
|
|
17
|
+
if (infra.baseUrl) activeConfig.baseUrl = infra.baseUrl;
|
|
18
|
+
if (infra.apiUrl) activeConfig.apiUrl = infra.apiUrl;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetch(`${activeConfig.apiUrl}/api/static`);
|
|
22
|
+
if (res.ok) {
|
|
23
|
+
const remoteStatic = await res.json().catch(() => ({}));
|
|
24
|
+
const filteredStatic = Object.fromEntries(
|
|
25
|
+
Object.entries(remoteStatic).filter(([_, v]) => v != null && v !== "")
|
|
26
|
+
);
|
|
27
|
+
activeConfig = { ...activeConfig, ...filteredStatic };
|
|
28
|
+
}
|
|
29
|
+
} catch (e) {
|
|
30
|
+
console.warn("Failed to load static details from R2, using defaults.");
|
|
31
|
+
}
|
|
32
|
+
return activeConfig;
|
|
33
|
+
}
|
|
34
|
+
async function refreshConfig() {
|
|
35
|
+
try {
|
|
36
|
+
const res = await fetch(`${activeConfig.apiUrl}/api/static`);
|
|
37
|
+
if (res.ok) {
|
|
38
|
+
const remoteStatic = await res.json().catch(() => ({}));
|
|
39
|
+
activeConfig = { ...activeConfig, ...remoteStatic };
|
|
40
|
+
}
|
|
41
|
+
} catch (e) {
|
|
42
|
+
console.warn("Failed to refresh static details.");
|
|
43
|
+
}
|
|
44
|
+
return activeConfig;
|
|
45
|
+
}
|
|
46
|
+
function getConfig() {
|
|
47
|
+
return activeConfig;
|
|
48
|
+
}
|
|
49
|
+
class SiteStore {
|
|
50
|
+
constructor() {
|
|
51
|
+
this.config = null;
|
|
52
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
53
|
+
}
|
|
54
|
+
static getInstance() {
|
|
55
|
+
if (!SiteStore.instance) {
|
|
56
|
+
SiteStore.instance = new SiteStore();
|
|
57
|
+
}
|
|
58
|
+
return SiteStore.instance;
|
|
59
|
+
}
|
|
60
|
+
async init(infra) {
|
|
61
|
+
this.config = await initializeConfig(infra);
|
|
62
|
+
this.notify();
|
|
63
|
+
return this.config;
|
|
64
|
+
}
|
|
65
|
+
subscribe(listener) {
|
|
66
|
+
this.listeners.add(listener);
|
|
67
|
+
if (this.config) listener(this.config);
|
|
68
|
+
return () => this.listeners.delete(listener);
|
|
69
|
+
}
|
|
70
|
+
notify() {
|
|
71
|
+
if (this.config) {
|
|
72
|
+
this.listeners.forEach((l) => l(this.config));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async refresh() {
|
|
76
|
+
await refreshConfig();
|
|
77
|
+
this.config = getConfig();
|
|
78
|
+
this.notify();
|
|
79
|
+
}
|
|
80
|
+
getConfig() {
|
|
81
|
+
return this.config || getConfig();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
SiteStore as S,
|
|
86
|
+
getConfig as g,
|
|
87
|
+
initializeConfig as i,
|
|
88
|
+
refreshConfig as r
|
|
89
|
+
};
|