@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.
Files changed (198) hide show
  1. package/dist/api/__tests__/info.test.d.ts +2 -0
  2. package/dist/api/__tests__/info.test.d.ts.map +1 -0
  3. package/dist/api/__tests__/utils.test.d.ts +2 -0
  4. package/dist/api/__tests__/utils.test.d.ts.map +1 -0
  5. package/dist/api/content-utils.d.ts +27 -0
  6. package/dist/api/content-utils.d.ts.map +1 -0
  7. package/dist/api/handlers/{aboutme.d.ts → about-me.d.ts} +1 -1
  8. package/dist/api/handlers/about-me.d.ts.map +1 -0
  9. package/dist/api/handlers/auth-handler.d.ts +2 -0
  10. package/dist/api/handlers/auth-handler.d.ts.map +1 -0
  11. package/dist/api/handlers/auth.d.ts +23 -0
  12. package/dist/api/handlers/auth.d.ts.map +1 -0
  13. package/dist/api/handlers/content-api.d.ts +0 -1
  14. package/dist/api/handlers/content-api.d.ts.map +1 -1
  15. package/dist/api/handlers/content.d.ts.map +1 -1
  16. package/dist/api/handlers/home.d.ts.map +1 -1
  17. package/dist/api/handlers/{staticdetails.d.ts → static-details.d.ts} +1 -1
  18. package/dist/api/handlers/static-details.d.ts.map +1 -0
  19. package/dist/api/index.d.ts +7 -8
  20. package/dist/api/index.d.ts.map +1 -1
  21. package/dist/api/website-api.d.ts +10 -0
  22. package/dist/api/website-api.d.ts.map +1 -0
  23. package/dist/api.d.ts +2 -0
  24. package/dist/api.js +19 -589
  25. package/dist/assets/logo-placeholder.svg +21 -0
  26. package/dist/chunks/index-B2jGIzSi.js +2695 -0
  27. package/dist/chunks/index-CGvOrVf8.js +213 -0
  28. package/dist/chunks/site-store-CGV9c2DI.js +89 -0
  29. package/dist/chunks/template-Ccxil4s-.js +597 -0
  30. package/dist/chunks/website-api-DTaVHBO_.js +927 -0
  31. package/dist/index.d.ts +5 -2
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +48 -352
  34. package/dist/prerender/__tests__/page-content.test.d.ts +2 -0
  35. package/dist/prerender/__tests__/page-content.test.d.ts.map +1 -0
  36. package/dist/prerender/__tests__/template.test.d.ts +2 -0
  37. package/dist/prerender/__tests__/template.test.d.ts.map +1 -0
  38. package/dist/prerender/data-fetcher.d.ts +19 -0
  39. package/dist/prerender/data-fetcher.d.ts.map +1 -0
  40. package/dist/prerender/index.d.ts +5 -4
  41. package/dist/prerender/index.d.ts.map +1 -1
  42. package/dist/prerender/{pageContent.d.ts → page-content.d.ts} +1 -1
  43. package/dist/prerender/page-content.d.ts.map +1 -0
  44. package/dist/prerender/page-generators/about.d.ts +16 -0
  45. package/dist/prerender/page-generators/about.d.ts.map +1 -0
  46. package/dist/prerender/page-generators/base.d.ts +26 -0
  47. package/dist/prerender/page-generators/base.d.ts.map +1 -0
  48. package/dist/prerender/page-generators/blog-detail.d.ts +15 -0
  49. package/dist/prerender/page-generators/blog-detail.d.ts.map +1 -0
  50. package/dist/prerender/page-generators/blogs-list.d.ts +17 -0
  51. package/dist/prerender/page-generators/blogs-list.d.ts.map +1 -0
  52. package/dist/prerender/page-generators/home.d.ts +19 -0
  53. package/dist/prerender/page-generators/home.d.ts.map +1 -0
  54. package/dist/prerender/page-generators/index.d.ts +9 -0
  55. package/dist/prerender/page-generators/index.d.ts.map +1 -0
  56. package/dist/prerender/page-generators/not-found.d.ts +14 -0
  57. package/dist/prerender/page-generators/not-found.d.ts.map +1 -0
  58. package/dist/prerender/page-generators/stories-list.d.ts +17 -0
  59. package/dist/prerender/page-generators/stories-list.d.ts.map +1 -0
  60. package/dist/prerender/page-generators/story-detail.d.ts +15 -0
  61. package/dist/prerender/page-generators/story-detail.d.ts.map +1 -0
  62. package/dist/prerender/template.d.ts.map +1 -1
  63. package/dist/prerender/website-prerender.d.ts +22 -0
  64. package/dist/prerender/website-prerender.d.ts.map +1 -0
  65. package/dist/prerender.d.ts +2 -0
  66. package/dist/prerender.js +164 -151
  67. package/dist/shared/config/index.d.ts +1 -0
  68. package/dist/shared/config/index.d.ts.map +1 -1
  69. package/dist/shared/core/__tests__/theme-toggle.test.d.ts +2 -0
  70. package/dist/shared/core/__tests__/theme-toggle.test.d.ts.map +1 -0
  71. package/dist/shared/core/site-store.d.ts +1 -0
  72. package/dist/shared/core/site-store.d.ts.map +1 -1
  73. package/dist/shared/index.d.ts +5 -3
  74. package/dist/shared/index.d.ts.map +1 -1
  75. package/dist/shared/interfaces/{iFooterLink.d.ts → ifooter-link.d.ts} +1 -1
  76. package/dist/shared/interfaces/ifooter-link.d.ts.map +1 -0
  77. package/dist/shared/interfaces/{iRoute.d.ts → iroute.d.ts} +1 -1
  78. package/dist/shared/interfaces/iroute.d.ts.map +1 -0
  79. package/dist/shared/{pageContent.d.ts → page-content.d.ts} +4 -3
  80. package/dist/shared/page-content.d.ts.map +1 -0
  81. package/dist/shared/router.d.ts +23 -0
  82. package/dist/shared/router.d.ts.map +1 -0
  83. package/dist/shared/runtime.d.ts +6 -6
  84. package/dist/shared/runtime.d.ts.map +1 -1
  85. package/dist/shared/website-ui.d.ts +32 -0
  86. package/dist/shared/website-ui.d.ts.map +1 -0
  87. package/dist/shared.js +13 -8
  88. package/dist/ui/about-me/api.d.ts.map +1 -0
  89. package/dist/ui/{aboutme → about-me}/index.d.ts +2 -10
  90. package/dist/ui/about-me/index.d.ts.map +1 -0
  91. package/dist/ui/about-me/styles.d.ts.map +1 -0
  92. package/dist/ui/admin/api.d.ts +16 -0
  93. package/dist/ui/admin/api.d.ts.map +1 -0
  94. package/dist/ui/admin/components/AboutMeSection.d.ts +7 -0
  95. package/dist/ui/admin/components/AboutMeSection.d.ts.map +1 -0
  96. package/dist/ui/admin/components/AdminSection.d.ts +13 -0
  97. package/dist/ui/admin/components/AdminSection.d.ts.map +1 -0
  98. package/dist/ui/admin/components/BlogsSection.d.ts +7 -0
  99. package/dist/ui/admin/components/BlogsSection.d.ts.map +1 -0
  100. package/dist/ui/admin/components/HomeSection.d.ts +7 -0
  101. package/dist/ui/admin/components/HomeSection.d.ts.map +1 -0
  102. package/dist/ui/admin/components/ImagesSection.d.ts +7 -0
  103. package/dist/ui/admin/components/ImagesSection.d.ts.map +1 -0
  104. package/dist/ui/admin/components/LoginForm.d.ts +9 -0
  105. package/dist/ui/admin/components/LoginForm.d.ts.map +1 -0
  106. package/dist/ui/admin/components/LogoSection.d.ts +7 -0
  107. package/dist/ui/admin/components/LogoSection.d.ts.map +1 -0
  108. package/dist/ui/admin/components/ProfileSection.d.ts +7 -0
  109. package/dist/ui/admin/components/ProfileSection.d.ts.map +1 -0
  110. package/dist/ui/admin/components/StaticSection.d.ts +9 -0
  111. package/dist/ui/admin/components/StaticSection.d.ts.map +1 -0
  112. package/dist/ui/admin/components/StoriesSection.d.ts +7 -0
  113. package/dist/ui/admin/components/StoriesSection.d.ts.map +1 -0
  114. package/dist/ui/admin/components/index.d.ts +11 -0
  115. package/dist/ui/admin/components/index.d.ts.map +1 -0
  116. package/dist/ui/admin/index.d.ts +27 -26
  117. package/dist/ui/admin/index.d.ts.map +1 -1
  118. package/dist/ui/admin/styles.d.ts.map +1 -1
  119. package/dist/ui/admin/types.d.ts +24 -0
  120. package/dist/ui/admin/types.d.ts.map +1 -0
  121. package/dist/ui/banner/styles.d.ts.map +1 -1
  122. package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts +2 -0
  123. package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts.map +1 -0
  124. package/dist/ui/blog-viewer/index.d.ts +25 -0
  125. package/dist/ui/blog-viewer/index.d.ts.map +1 -0
  126. package/dist/ui/blog-viewer/styles.d.ts +2 -0
  127. package/dist/ui/blog-viewer/styles.d.ts.map +1 -0
  128. package/dist/ui/footer/index.d.ts +1 -1
  129. package/dist/ui/footer/index.d.ts.map +1 -1
  130. package/dist/ui/footer/styles.d.ts.map +1 -1
  131. package/dist/ui/index.d.ts +7 -0
  132. package/dist/ui/index.d.ts.map +1 -0
  133. package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts +2 -0
  134. package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts.map +1 -0
  135. package/dist/ui/story-viewer/index.d.ts +25 -0
  136. package/dist/ui/story-viewer/index.d.ts.map +1 -0
  137. package/dist/ui/story-viewer/styles.d.ts +2 -0
  138. package/dist/ui/story-viewer/styles.d.ts.map +1 -0
  139. package/dist/ui.d.ts +1 -1
  140. package/dist/ui.js +17 -818
  141. package/package.json +31 -12
  142. package/public/assets/logo-placeholder.svg +21 -0
  143. package/dist/api/handlers/aboutme.d.ts.map +0 -1
  144. package/dist/api/handlers/staticdetails.d.ts.map +0 -1
  145. package/dist/prerender/pageContent.d.ts.map +0 -1
  146. package/dist/shared/interfaces/iFooterLink.d.ts.map +0 -1
  147. package/dist/shared/interfaces/iRoute.d.ts.map +0 -1
  148. package/dist/shared/pageContent.d.ts.map +0 -1
  149. package/dist/ui/aboutme/api.d.ts.map +0 -1
  150. package/dist/ui/aboutme/index.d.ts.map +0 -1
  151. package/dist/ui/aboutme/renderer.d.ts +0 -5
  152. package/dist/ui/aboutme/renderer.d.ts.map +0 -1
  153. package/dist/ui/aboutme/styles.d.ts.map +0 -1
  154. package/src/api/__tests__/info.test.ts +0 -44
  155. package/src/api/__tests__/utils.test.ts +0 -78
  156. package/src/api/handlers/aboutme.ts +0 -99
  157. package/src/api/handlers/content-api.ts +0 -268
  158. package/src/api/handlers/content.ts +0 -72
  159. package/src/api/handlers/home.ts +0 -79
  160. package/src/api/handlers/info.ts +0 -12
  161. package/src/api/handlers/logo.ts +0 -55
  162. package/src/api/handlers/staticdetails.ts +0 -48
  163. package/src/api/index.ts +0 -125
  164. package/src/api/utils.ts +0 -16
  165. package/src/prerender/__tests__/pageContent.test.ts +0 -54
  166. package/src/prerender/__tests__/template.test.ts +0 -54
  167. package/src/prerender/index.ts +0 -138
  168. package/src/prerender/pageContent.ts +0 -263
  169. package/src/prerender/prerender.ts +0 -25
  170. package/src/prerender/template.ts +0 -65
  171. package/src/shared/config/api.ts +0 -16
  172. package/src/shared/config/index.ts +0 -41
  173. package/src/shared/config/types.ts +0 -16
  174. package/src/shared/core/__tests__/theme-toggle.test.ts +0 -204
  175. package/src/shared/core/site-store.ts +0 -38
  176. package/src/shared/core/theme-toggle.ts +0 -118
  177. package/src/shared/index.ts +0 -15
  178. package/src/shared/interfaces/iFooterLink.ts +0 -4
  179. package/src/shared/interfaces/iRoute.ts +0 -4
  180. package/src/shared/models/theme-variables.css +0 -25
  181. package/src/shared/pageContent.ts +0 -209
  182. package/src/shared/runtime.ts +0 -11
  183. package/src/shared/template.ts +0 -35
  184. package/src/styles/markdown.css +0 -129
  185. package/src/ui/aboutme/api.ts +0 -12
  186. package/src/ui/aboutme/index.ts +0 -155
  187. package/src/ui/aboutme/renderer.ts +0 -7
  188. package/src/ui/aboutme/styles.ts +0 -10
  189. package/src/ui/admin/index.ts +0 -492
  190. package/src/ui/admin/styles.ts +0 -317
  191. package/src/ui/banner/index.ts +0 -38
  192. package/src/ui/banner/styles.ts +0 -10
  193. package/src/ui/footer/index.ts +0 -37
  194. package/src/ui/footer/styles.ts +0 -9
  195. /package/{src/shared → dist}/styles/markdown.css +0 -0
  196. /package/{src → dist}/styles/theme.css +0 -0
  197. /package/dist/ui/{aboutme → about-me}/api.d.ts +0 -0
  198. /package/dist/ui/{aboutme → about-me}/styles.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stories-list.d.ts","sourceRoot":"","sources":["../../../src/prerender/page-generators/stories-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,wBAAyB,SAAQ,iBAAiB;IACtD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW;CA0BxD"}
@@ -0,0 +1,15 @@
1
+ import { BasePageGenerator, StaticDetails } from './base';
2
+ import { IRoute, IFooterLink, PageContent } from '../page-content';
3
+ export interface StoryDetailPageData {
4
+ routes: IRoute[];
5
+ footerLinks: IFooterLink[];
6
+ staticDetails: StaticDetails;
7
+ apiUrl: string;
8
+ baseUrl: string;
9
+ pathname: string;
10
+ slug: string;
11
+ }
12
+ export declare class StoryDetailPageGenerator extends BasePageGenerator {
13
+ generate(data: StoryDetailPageData): PageContent;
14
+ }
15
+ //# sourceMappingURL=story-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-detail.d.ts","sourceRoot":"","sources":["../../../src/prerender/page-generators/story-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,wBAAyB,SAAQ,iBAAiB;IACtD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW;CAoBxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/prerender/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;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyBD,eAAO,MAAM,kBAAkB,GAAU,2EAOtC,aAAa,KAAG,OAAO,CAAC,MAAM,CAyBhC,CAAC"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/prerender/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;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyBD,eAAO,MAAM,kBAAkB,GAAU,2EAOtC,aAAa,KAAG,OAAO,CAAC,MAAM,CA0BhC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { TemplateProps } from './template';
2
+ import { IFooterLink, IRoute } from './page-content';
3
+ export interface PrerenderOptions {
4
+ routes?: IRoute[];
5
+ defaultFooterLinks?: IFooterLink[];
6
+ siteTitle?: string;
7
+ copyright?: string;
8
+ templateRenderer?: (props: TemplateProps) => Promise<string> | string;
9
+ }
10
+ export declare class WebsitePrerender {
11
+ private routes;
12
+ private defaultFooterLinks;
13
+ private footerLinks;
14
+ private siteTitle;
15
+ private copyright;
16
+ private templateRenderer;
17
+ constructor(options?: PrerenderOptions);
18
+ private fetchStaticDetails;
19
+ private fetchAboutMeData;
20
+ fetch(request: Request, env: any, ctx: any): Promise<Response>;
21
+ }
22
+ //# sourceMappingURL=website-prerender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-prerender.d.ts","sourceRoot":"","sources":["../../src/prerender/website-prerender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAuB,MAAM,gBAAgB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CACvE;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAqD;gBAEjE,OAAO,GAAE,gBAAqB;YAkB5B,kBAAkB;YAwBlB,gBAAgB;IAQjB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;CAkF5E"}
@@ -1,4 +1,6 @@
1
+ export * from './prerender/index'
1
2
  export {}
2
3
  import _default from './prerender/index'
3
4
  export default _default
5
+ export * from './prerender/index'
4
6
  export {}
package/dist/prerender.js CHANGED
@@ -35,6 +35,7 @@ const createHtmlTemplate = async ({
35
35
  <html lang="en" data-theme="light">
36
36
  <head>
37
37
  <meta charset="UTF-8" />
38
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; connect-src 'self' https: http://localhost:* http://127.0.0.1:*; font-src 'self' data: https:;" />
38
39
  <link rel="icon" type="image/svg+xml" href="/api/logo" />
39
40
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
40
41
  <title>${title}</title>
@@ -90,7 +91,7 @@ async function fetchHome(env) {
90
91
  try {
91
92
  const r2 = getLoader(env);
92
93
  if (!r2) return "";
93
- const result = await r2.getRendered("home.md");
94
+ const result = await r2.getRendered("pages/home.md");
94
95
  return result?.content || "";
95
96
  } catch {
96
97
  return "";
@@ -136,9 +137,9 @@ async function fetchLatestStorySummaries(env, count = 3) {
136
137
  return [];
137
138
  }
138
139
  }
139
- const generatePageContent = async (pathname, routes2, footerLinks2, env) => {
140
- const apiUrl = env?.apiUrl;
141
- const baseUrl = env?.baseUrl || "https://www.techieleader.com";
140
+ const generatePageContent = async (pathname, routes, footerLinks, env) => {
141
+ const apiUrl = env?.API_URL || env?.apiUrl;
142
+ const baseUrl = env?.BASE_URL || env?.baseUrl || "https://www.example.com";
142
143
  let staticDetails = {
143
144
  siteTitle: "My Personal Website",
144
145
  copyright: "2026 My Personal Website",
@@ -151,20 +152,6 @@ const generatePageContent = async (pathname, routes2, footerLinks2, env) => {
151
152
  if (res.ok) staticDetails = await res.json();
152
153
  } catch (e) {
153
154
  }
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
155
  let profile = null;
169
156
  let aboutMeContent = "";
170
157
  let homeContent = "";
@@ -180,151 +167,175 @@ const generatePageContent = async (pathname, routes2, footerLinks2, env) => {
180
167
  ]);
181
168
  }
182
169
  const name = profile?.name || "User";
183
- const title = profile?.title || "Professional";
184
- profile?.experience || "some";
185
- const canonicalUrl = new URL(pathname, baseUrl).toString();
170
+ profile?.title || "Professional";
171
+ new URL(pathname, baseUrl).toString();
172
+ const strategies = {
173
+ home: async () => {
174
+ const { HomePageGenerator } = await import("./chunks/index-CGvOrVf8.js");
175
+ const generator = new HomePageGenerator();
176
+ return generator.generate({
177
+ routes,
178
+ footerLinks,
179
+ staticDetails,
180
+ apiUrl,
181
+ baseUrl,
182
+ pathname,
183
+ profile,
184
+ homeContent,
185
+ latestBlogs,
186
+ latestStories
187
+ });
188
+ },
189
+ about: async () => {
190
+ const { AboutPageGenerator } = await import("./chunks/index-CGvOrVf8.js");
191
+ const generator = new AboutPageGenerator();
192
+ return generator.generate({
193
+ routes,
194
+ footerLinks,
195
+ staticDetails,
196
+ apiUrl,
197
+ baseUrl,
198
+ pathname,
199
+ profile
200
+ });
201
+ },
202
+ blogsList: async () => {
203
+ const { BlogsListPageGenerator } = await import("./chunks/index-CGvOrVf8.js");
204
+ const generator = new BlogsListPageGenerator();
205
+ return generator.generate({
206
+ routes,
207
+ footerLinks,
208
+ staticDetails,
209
+ apiUrl,
210
+ baseUrl,
211
+ pathname,
212
+ latestBlogs,
213
+ name
214
+ });
215
+ },
216
+ storiesList: async () => {
217
+ const { StoriesListPageGenerator } = await import("./chunks/index-CGvOrVf8.js");
218
+ const generator = new StoriesListPageGenerator();
219
+ return generator.generate({
220
+ routes,
221
+ footerLinks,
222
+ staticDetails,
223
+ apiUrl,
224
+ baseUrl,
225
+ pathname,
226
+ latestStories,
227
+ name
228
+ });
229
+ },
230
+ blogDetail: async (slug) => {
231
+ const { BlogDetailPageGenerator } = await import("./chunks/index-CGvOrVf8.js");
232
+ const generator = new BlogDetailPageGenerator();
233
+ return generator.generate({
234
+ routes,
235
+ footerLinks,
236
+ staticDetails,
237
+ apiUrl,
238
+ baseUrl,
239
+ pathname,
240
+ slug
241
+ });
242
+ },
243
+ storyDetail: async (slug) => {
244
+ const { StoryDetailPageGenerator } = await import("./chunks/index-CGvOrVf8.js");
245
+ const generator = new StoryDetailPageGenerator();
246
+ return generator.generate({
247
+ routes,
248
+ footerLinks,
249
+ staticDetails,
250
+ apiUrl,
251
+ baseUrl,
252
+ pathname,
253
+ slug
254
+ });
255
+ },
256
+ notFound: async () => {
257
+ const { NotFoundPageGenerator } = await import("./chunks/index-CGvOrVf8.js");
258
+ const generator = new NotFoundPageGenerator();
259
+ return generator.generate({
260
+ routes,
261
+ footerLinks,
262
+ staticDetails,
263
+ apiUrl,
264
+ baseUrl,
265
+ pathname
266
+ });
267
+ }
268
+ };
186
269
  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
- };
270
+ return strategies.home();
210
271
  } 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
- };
272
+ return strategies.about();
223
273
  } 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 };
274
+ return strategies.blogsList();
236
275
  } 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 };
276
+ return strategies.storiesList();
249
277
  } else if (pathname.startsWith("/blogs/")) {
250
278
  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 };
279
+ return strategies.blogDetail(slug);
258
280
  } else if (pathname.startsWith("/stories/")) {
259
281
  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 };
282
+ return strategies.storyDetail(slug);
267
283
  } 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 };
284
+ return strategies.notFound();
277
285
  }
278
286
  };
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
- ];
287
+ class WebsitePrerender {
288
+ constructor(options = {}) {
289
+ this.routes = options.routes || [
290
+ { link: "/", text: "Home" },
291
+ { link: "/blogs", text: "Blogs" },
292
+ { link: "/stories", text: "Stories" },
293
+ { link: "/about-me", text: "About Me" }
294
+ ];
295
+ this.defaultFooterLinks = options.defaultFooterLinks || [
296
+ { text: "LinkedIn", link: "https://linkedin.com/in/yourname" },
297
+ { text: "GitHub", link: "https://github.com/yourname" },
298
+ { text: "Email", link: "mailto:yourname@domain.com" }
299
+ ];
300
+ this.footerLinks = [...this.defaultFooterLinks];
301
+ this.siteTitle = options.siteTitle || "My Personal Website";
302
+ this.copyright = options.copyright || "2026 My Personal Website";
303
+ this.templateRenderer = options.templateRenderer || createHtmlTemplate;
304
+ }
305
+ async fetchStaticDetails(apiUrl) {
306
+ try {
307
+ const res = await fetch(`${apiUrl}/api/static`);
308
+ if (res.ok) {
309
+ const data = await res.json();
310
+ this.siteTitle = data.siteTitle || this.siteTitle;
311
+ this.copyright = data.copyright || this.copyright;
312
+ const normalizeUrl = (url) => {
313
+ if (!url) return "";
314
+ if (url.startsWith("http://") || url.startsWith("https://")) return url;
315
+ if (url.startsWith("www.")) return `https://${url}`;
316
+ return url;
317
+ };
318
+ this.footerLinks = [
319
+ { text: "LinkedIn", link: normalizeUrl(data.linkedin) || this.defaultFooterLinks[0].link },
320
+ { text: "GitHub", link: normalizeUrl(data.github) || this.defaultFooterLinks[1].link },
321
+ { text: "Email", link: data.email ? `mailto:${data.email}` : this.defaultFooterLinks[2].link }
322
+ ];
323
+ }
324
+ } catch (e) {
311
325
  }
312
- } catch (e) {
313
326
  }
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) {
327
+ async fetchAboutMeData(apiUrl) {
328
+ try {
329
+ const res = await fetch(`${apiUrl}/api/about-me`);
330
+ if (res.ok) return await res.json();
331
+ } catch (e) {
332
+ }
333
+ return null;
320
334
  }
321
- return null;
322
- }
323
- const index = {
324
335
  async fetch(request, env, ctx) {
325
336
  const apiUrl = env?.API_URL || "https://api.example.com";
326
337
  const baseSiteUrl = env?.BASE_SITE_URL || "https://site.example.com";
327
- await fetchStaticDetails(apiUrl);
338
+ await this.fetchStaticDetails(apiUrl);
328
339
  const url = new URL(request.url);
329
340
  if (url.pathname.startsWith("/api/")) {
330
341
  return fetch(`${apiUrl}${url.pathname}${url.search}`);
@@ -379,13 +390,13 @@ const index = {
379
390
  }
380
391
  let hydrationScript = "";
381
392
  if (url.pathname === "/about-me" || url.pathname === "/about-me/") {
382
- const aboutMeData = await fetchAboutMeData(apiUrl);
393
+ const aboutMeData = await this.fetchAboutMeData(apiUrl);
383
394
  if (aboutMeData) {
384
395
  hydrationScript = `<script>window.__HYDRATION_DATA__ = ${JSON.stringify(aboutMeData)};<\/script>`;
385
396
  }
386
397
  }
387
- const pageContent = await generatePageContent(url.pathname, routes, footerLinks, { ...env, apiUrl });
388
- const html = await createHtmlTemplate({ ...pageContent, hydrationData: hydrationScript });
398
+ const pageContent = await generatePageContent(url.pathname, this.routes, this.footerLinks, { ...env, apiUrl, siteTitle: this.siteTitle, copyright: this.copyright });
399
+ const html = await this.templateRenderer({ ...pageContent, hydrationData: hydrationScript });
389
400
  return new Response(html, {
390
401
  headers: {
391
402
  "content-type": "text/html",
@@ -393,7 +404,9 @@ const index = {
393
404
  }
394
405
  });
395
406
  }
396
- };
407
+ }
408
+ const defaultPrerender = new WebsitePrerender();
397
409
  export {
398
- index as default
410
+ WebsitePrerender,
411
+ defaultPrerender as default
399
412
  };
@@ -1,5 +1,6 @@
1
1
  import { InfrastructureConfig, WebsiteConfig } from './types';
2
2
  export * from './types';
3
3
  export declare function initializeConfig(infra?: Partial<InfrastructureConfig>): Promise<WebsiteConfig>;
4
+ export declare function refreshConfig(): Promise<WebsiteConfig>;
4
5
  export declare function getConfig(): WebsiteConfig;
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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,CAsBpG;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,CAW5D;AAED,wBAAgB,SAAS,IAAI,aAAa,CAEzC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=theme-toggle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-toggle.test.d.ts","sourceRoot":"","sources":["../../../../src/shared/core/__tests__/theme-toggle.test.ts"],"names":[],"mappings":""}
@@ -11,6 +11,7 @@ export declare class SiteStore {
11
11
  }): Promise<WebsiteConfig>;
12
12
  subscribe(listener: (config: WebsiteConfig) => void): () => boolean;
13
13
  private notify;
14
+ refresh(): Promise<void>;
14
15
  getConfig(): WebsiteConfig;
15
16
  }
16
17
  //# sourceMappingURL=site-store.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"site-store.d.ts","sourceRoot":"","sources":["../../../src/shared/core/site-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAA8C,MAAM,WAAW,CAAC;AAErG,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;IAMR,OAAO;IAQb,SAAS,IAAI,aAAa;CAG3B"}
@@ -1,9 +1,11 @@
1
1
  export * from './config';
2
2
  export * from './core/site-store';
3
- export * from './interfaces/iRoute';
4
- export * from './interfaces/iFooterLink';
3
+ export * from './website-ui';
4
+ export * from './router';
5
+ export * from './interfaces/iroute';
6
+ export * from './interfaces/ifooter-link';
5
7
  export * from './core/theme-toggle';
6
8
  export * from './template';
7
- export * from './pageContent';
9
+ export * from './page-content';
8
10
  export * from './runtime';
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AACA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AAGzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,WAAW,CAAC"}
@@ -2,4 +2,4 @@ export interface IFooterLink {
2
2
  text: string;
3
3
  link: string;
4
4
  }
5
- //# sourceMappingURL=iFooterLink.d.ts.map
5
+ //# sourceMappingURL=ifooter-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifooter-link.d.ts","sourceRoot":"","sources":["../../../src/shared/interfaces/ifooter-link.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -2,4 +2,4 @@ export interface IRoute {
2
2
  text: string;
3
3
  link: string;
4
4
  }
5
- //# sourceMappingURL=iRoute.d.ts.map
5
+ //# sourceMappingURL=iroute.d.ts.map
@@ -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"}
@@ -1,5 +1,6 @@
1
- import { IFooterLink } from './interfaces/iFooterLink';
2
- import { IRoute } from './interfaces/iRoute';
1
+ import { IFooterLink } from './interfaces/ifooter-link';
2
+ import { IRoute } from './interfaces/iroute';
3
+ export type { IFooterLink, IRoute };
3
4
  export interface PageContent {
4
5
  title: string;
5
6
  description: string;
@@ -32,4 +33,4 @@ export declare const generatePageContent: (pathname: string, routes: IRoute[], f
32
33
  apiUrl?: string;
33
34
  baseUrl?: string;
34
35
  }) => PageContent;
35
- //# sourceMappingURL=pageContent.d.ts.map
36
+ //# sourceMappingURL=page-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-content.d.ts","sourceRoot":"","sources":["../../src/shared/page-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAGpC,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,23 @@
1
+ import { WebsiteUI } from './website-ui';
2
+ export declare class Router {
3
+ private ui;
4
+ private routes;
5
+ private apiUrl;
6
+ private logo;
7
+ private appElement;
8
+ constructor(ui: WebsiteUI);
9
+ private get config();
10
+ private get siteTitle();
11
+ private get copyright();
12
+ private get footerLinks();
13
+ init(appElementId?: string): void;
14
+ private setupEventListeners;
15
+ navigate(path: string): Promise<void>;
16
+ private setPageMeta;
17
+ private renderHomePage;
18
+ private renderAboutMePage;
19
+ private renderContentListPage;
20
+ private renderContentDetailPage;
21
+ private renderAdminPage;
22
+ }
23
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/shared/router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,MAAM;IAML,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,UAAU,CAA4B;gBAE1B,EAAE,EAAE,SAAS;IAejC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,KAAK,WAAW,GAatB;IAEM,IAAI,CAAC,YAAY,GAAE,MAAc;IAWxC,OAAO,CAAC,mBAAmB;IAmCd,QAAQ,CAAC,IAAI,EAAE,MAAM;IA6BlC,OAAO,CAAC,WAAW;YAgCL,cAAc;IAkC5B,OAAO,CAAC,iBAAiB;YAQX,qBAAqB;YAiBrB,uBAAuB;YAmBvB,eAAe;CAqB9B"}
@@ -1,7 +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';
1
+ export * from './interfaces/iroute';
2
+ export * from './interfaces/ifooter-link';
3
+ export * from './page-content';
4
+ export type { IRoute } from './interfaces/iroute';
5
+ export type { IFooterLink } from './interfaces/ifooter-link';
6
+ export { generatePageContent } from './page-content';
7
7
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/shared/runtime.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAG/B,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { SiteStore } from './core/site-store';
2
+ import { IRoute } from './interfaces/iroute';
3
+ import { Router } from './router';
4
+ export interface UIConfig {
5
+ apiUrl?: string;
6
+ baseUrl?: string;
7
+ routes?: IRoute[];
8
+ appElementId?: string;
9
+ theme?: {
10
+ primaryColor?: string;
11
+ backgroundColor?: string;
12
+ textColor?: string;
13
+ customCss?: string;
14
+ };
15
+ onBootstrap?: (ui: WebsiteUI) => void | Promise<void>;
16
+ }
17
+ export declare class WebsiteUI {
18
+ private static instance;
19
+ private store;
20
+ private config;
21
+ private router;
22
+ private constructor();
23
+ static getInstance(config?: UIConfig): WebsiteUI;
24
+ bootstrap(): Promise<void>;
25
+ private applyTheme;
26
+ private updateFavicon;
27
+ getStore(): SiteStore;
28
+ getConfig(): UIConfig;
29
+ getRouter(): Router;
30
+ }
31
+ export declare const bootstrap: (config?: UIConfig) => Promise<void>;
32
+ //# sourceMappingURL=website-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-ui.d.ts","sourceRoot":"","sources":["../../src/shared/website-ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IACnC,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAuB;IAErC,OAAO;WAKO,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS;IAU1C,SAAS;IAoCtB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;IAad,QAAQ;IAIR,SAAS;IAIT,SAAS;CAGjB;AAED,eAAO,MAAM,SAAS,GAAI,SAAS,QAAQ,kBAA8C,CAAC"}