@leadertechie/personal-site-kit 0.1.0-alpha.2 → 0.1.0-alpha.21

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 (169) hide show
  1. package/README.md +94 -17
  2. package/dist/api/content-utils.d.ts +27 -0
  3. package/dist/api/content-utils.d.ts.map +1 -0
  4. package/dist/api/handlers/about-me.d.ts.map +1 -1
  5. package/dist/api/handlers/auth-handler.d.ts +2 -0
  6. package/dist/api/handlers/auth-handler.d.ts.map +1 -0
  7. package/dist/api/handlers/auth.d.ts +23 -0
  8. package/dist/api/handlers/auth.d.ts.map +1 -0
  9. package/dist/api/handlers/content-api.d.ts +0 -1
  10. package/dist/api/handlers/content-api.d.ts.map +1 -1
  11. package/dist/api/handlers/content.d.ts.map +1 -1
  12. package/dist/api/handlers/home.d.ts.map +1 -1
  13. package/dist/api/handlers/static-details.d.ts +1 -1
  14. package/dist/api/handlers/static-details.d.ts.map +1 -1
  15. package/dist/api/index.d.ts +2 -0
  16. package/dist/api/index.d.ts.map +1 -1
  17. package/dist/api/website-api.d.ts +1 -1
  18. package/dist/api/website-api.d.ts.map +1 -1
  19. package/dist/api.js +17 -2
  20. package/dist/assets/logo-placeholder.svg +21 -0
  21. package/dist/chunks/index-C1krnvU3.js +211 -0
  22. package/dist/chunks/index-DsRjL9Uy.js +2727 -0
  23. package/dist/chunks/site-store-CGV9c2DI.js +89 -0
  24. package/dist/chunks/{template-gGTkeOcA.js → template-Lmx7Dxoc.js} +132 -91
  25. package/dist/chunks/website-api-CFRUPu0X.js +958 -0
  26. package/dist/index.js +42 -14
  27. package/dist/prerender/data-fetcher.d.ts +19 -0
  28. package/dist/prerender/data-fetcher.d.ts.map +1 -0
  29. package/dist/prerender/page-content.d.ts.map +1 -1
  30. package/dist/prerender/page-generators/about.d.ts +16 -0
  31. package/dist/prerender/page-generators/about.d.ts.map +1 -0
  32. package/dist/prerender/page-generators/base.d.ts +25 -0
  33. package/dist/prerender/page-generators/base.d.ts.map +1 -0
  34. package/dist/prerender/page-generators/blog-detail.d.ts +15 -0
  35. package/dist/prerender/page-generators/blog-detail.d.ts.map +1 -0
  36. package/dist/prerender/page-generators/blogs-list.d.ts +17 -0
  37. package/dist/prerender/page-generators/blogs-list.d.ts.map +1 -0
  38. package/dist/prerender/page-generators/home.d.ts +19 -0
  39. package/dist/prerender/page-generators/home.d.ts.map +1 -0
  40. package/dist/prerender/page-generators/index.d.ts +9 -0
  41. package/dist/prerender/page-generators/index.d.ts.map +1 -0
  42. package/dist/prerender/page-generators/not-found.d.ts +14 -0
  43. package/dist/prerender/page-generators/not-found.d.ts.map +1 -0
  44. package/dist/prerender/page-generators/stories-list.d.ts +17 -0
  45. package/dist/prerender/page-generators/stories-list.d.ts.map +1 -0
  46. package/dist/prerender/page-generators/story-detail.d.ts +15 -0
  47. package/dist/prerender/page-generators/story-detail.d.ts.map +1 -0
  48. package/dist/prerender/template.d.ts +3 -1
  49. package/dist/prerender/template.d.ts.map +1 -1
  50. package/dist/prerender/website-prerender.d.ts +6 -0
  51. package/dist/prerender/website-prerender.d.ts.map +1 -1
  52. package/dist/prerender.js +291 -145
  53. package/dist/shared/config/index.d.ts +1 -0
  54. package/dist/shared/config/index.d.ts.map +1 -1
  55. package/dist/shared/core/site-store.d.ts +1 -0
  56. package/dist/shared/core/site-store.d.ts.map +1 -1
  57. package/dist/shared/core/theme-toggle.d.ts.map +1 -1
  58. package/dist/shared/page-content.d.ts.map +1 -1
  59. package/dist/shared/router.d.ts +9 -3
  60. package/dist/shared/router.d.ts.map +1 -1
  61. package/dist/shared/website-ui.d.ts +23 -0
  62. package/dist/shared/website-ui.d.ts.map +1 -1
  63. package/dist/shared.js +6 -4
  64. package/dist/ui/about-me/index.d.ts +2 -10
  65. package/dist/ui/about-me/index.d.ts.map +1 -1
  66. package/dist/ui/about-me/styles.d.ts.map +1 -1
  67. package/dist/ui/admin/api.d.ts +16 -0
  68. package/dist/ui/admin/api.d.ts.map +1 -0
  69. package/dist/ui/admin/components/AboutMeSection.d.ts +7 -0
  70. package/dist/ui/admin/components/AboutMeSection.d.ts.map +1 -0
  71. package/dist/ui/admin/components/AdminSection.d.ts +13 -0
  72. package/dist/ui/admin/components/AdminSection.d.ts.map +1 -0
  73. package/dist/ui/admin/components/BlogsSection.d.ts +7 -0
  74. package/dist/ui/admin/components/BlogsSection.d.ts.map +1 -0
  75. package/dist/ui/admin/components/HomeSection.d.ts +7 -0
  76. package/dist/ui/admin/components/HomeSection.d.ts.map +1 -0
  77. package/dist/ui/admin/components/ImagesSection.d.ts +7 -0
  78. package/dist/ui/admin/components/ImagesSection.d.ts.map +1 -0
  79. package/dist/ui/admin/components/LoginForm.d.ts +9 -0
  80. package/dist/ui/admin/components/LoginForm.d.ts.map +1 -0
  81. package/dist/ui/admin/components/LogoSection.d.ts +7 -0
  82. package/dist/ui/admin/components/LogoSection.d.ts.map +1 -0
  83. package/dist/ui/admin/components/ProfileSection.d.ts +7 -0
  84. package/dist/ui/admin/components/ProfileSection.d.ts.map +1 -0
  85. package/dist/ui/admin/components/StaticSection.d.ts +9 -0
  86. package/dist/ui/admin/components/StaticSection.d.ts.map +1 -0
  87. package/dist/ui/admin/components/StoriesSection.d.ts +7 -0
  88. package/dist/ui/admin/components/StoriesSection.d.ts.map +1 -0
  89. package/dist/ui/admin/components/index.d.ts +11 -0
  90. package/dist/ui/admin/components/index.d.ts.map +1 -0
  91. package/dist/ui/admin/index.d.ts +27 -26
  92. package/dist/ui/admin/index.d.ts.map +1 -1
  93. package/dist/ui/admin/styles.d.ts.map +1 -1
  94. package/dist/ui/admin/types.d.ts +24 -0
  95. package/dist/ui/admin/types.d.ts.map +1 -0
  96. package/dist/ui/banner/index.d.ts.map +1 -1
  97. package/dist/ui/banner/styles.d.ts.map +1 -1
  98. package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts +2 -0
  99. package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts.map +1 -0
  100. package/dist/ui/blog-viewer/index.d.ts +25 -0
  101. package/dist/ui/blog-viewer/index.d.ts.map +1 -0
  102. package/dist/ui/blog-viewer/styles.d.ts +2 -0
  103. package/dist/ui/blog-viewer/styles.d.ts.map +1 -0
  104. package/dist/ui/footer/index.d.ts.map +1 -1
  105. package/dist/ui/footer/styles.d.ts.map +1 -1
  106. package/dist/ui/index.d.ts +2 -0
  107. package/dist/ui/index.d.ts.map +1 -1
  108. package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts +2 -0
  109. package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts.map +1 -0
  110. package/dist/ui/story-viewer/index.d.ts +25 -0
  111. package/dist/ui/story-viewer/index.d.ts.map +1 -0
  112. package/dist/ui/story-viewer/styles.d.ts +2 -0
  113. package/dist/ui/story-viewer/styles.d.ts.map +1 -0
  114. package/dist/ui.js +15 -3
  115. package/package.json +37 -13
  116. package/public/assets/logo-placeholder.svg +21 -0
  117. package/dist/chunks/index-BqixlS-2.js +0 -1157
  118. package/dist/chunks/website-api-CVsi-OLc.js +0 -596
  119. package/dist/ui/about-me/renderer.d.ts +0 -5
  120. package/dist/ui/about-me/renderer.d.ts.map +0 -1
  121. package/src/api/__tests__/info.test.ts +0 -44
  122. package/src/api/__tests__/utils.test.ts +0 -78
  123. package/src/api/handlers/about-me.ts +0 -99
  124. package/src/api/handlers/content-api.ts +0 -268
  125. package/src/api/handlers/content.ts +0 -72
  126. package/src/api/handlers/home.ts +0 -79
  127. package/src/api/handlers/info.ts +0 -12
  128. package/src/api/handlers/logo.ts +0 -55
  129. package/src/api/handlers/static-details.ts +0 -48
  130. package/src/api/index.ts +0 -7
  131. package/src/api/utils.ts +0 -16
  132. package/src/api/website-api.ts +0 -124
  133. package/src/index.ts +0 -4
  134. package/src/prerender/__tests__/page-content.test.ts +0 -54
  135. package/src/prerender/__tests__/template.test.ts +0 -54
  136. package/src/prerender/index.ts +0 -7
  137. package/src/prerender/page-content.ts +0 -263
  138. package/src/prerender/prerender.ts +0 -25
  139. package/src/prerender/template.ts +0 -65
  140. package/src/prerender/website-prerender.ts +0 -152
  141. package/src/shared/config/api.ts +0 -16
  142. package/src/shared/config/index.ts +0 -41
  143. package/src/shared/config/types.ts +0 -16
  144. package/src/shared/core/__tests__/theme-toggle.test.ts +0 -204
  145. package/src/shared/core/site-store.ts +0 -38
  146. package/src/shared/core/theme-toggle.ts +0 -118
  147. package/src/shared/index.ts +0 -17
  148. package/src/shared/interfaces/ifooter-link.ts +0 -4
  149. package/src/shared/interfaces/iroute.ts +0 -4
  150. package/src/shared/models/theme-variables.css +0 -25
  151. package/src/shared/page-content.ts +0 -210
  152. package/src/shared/router.ts +0 -241
  153. package/src/shared/runtime.ts +0 -11
  154. package/src/shared/template.ts +0 -35
  155. package/src/shared/website-ui.ts +0 -92
  156. package/src/styles/markdown.css +0 -129
  157. package/src/ui/about-me/api.ts +0 -12
  158. package/src/ui/about-me/index.ts +0 -155
  159. package/src/ui/about-me/renderer.ts +0 -7
  160. package/src/ui/about-me/styles.ts +0 -10
  161. package/src/ui/admin/index.ts +0 -492
  162. package/src/ui/admin/styles.ts +0 -317
  163. package/src/ui/banner/index.ts +0 -38
  164. package/src/ui/banner/styles.ts +0 -10
  165. package/src/ui/footer/index.ts +0 -37
  166. package/src/ui/footer/styles.ts +0 -9
  167. package/src/ui/index.ts +0 -4
  168. /package/{src/shared → dist}/styles/markdown.css +0 -0
  169. /package/{src → dist}/styles/theme.css +0 -0
@@ -1,129 +0,0 @@
1
- /* Markdown Content Styles */
2
-
3
- .md-heading {
4
- margin: 1.5rem 0 0.75rem 0;
5
- font-weight: 600;
6
- line-height: 1.3;
7
- color: var(--text-color, #213547);
8
- }
9
-
10
- .md-heading h1 { font-size: 2rem; }
11
- .md-heading h2 { font-size: 1.5rem; }
12
- .md-heading h3 { font-size: 1.25rem; }
13
- .md-heading h4 { font-size: 1.1rem; }
14
- .md-heading h5, .md-heading h6 { font-size: 1rem; }
15
-
16
- .md-paragraph {
17
- margin: 0 0 1rem 0;
18
- line-height: 1.7;
19
- color: var(--text-color, #213547);
20
- }
21
-
22
- .md-list {
23
- margin: 0 0 1rem 0;
24
- padding-left: 1.5rem;
25
- }
26
-
27
- .md-list-item {
28
- margin-bottom: 0.5rem;
29
- line-height: 1.6;
30
- }
31
-
32
- .md-blockquote {
33
- margin: 1rem 0;
34
- padding: 0.75rem 1rem;
35
- border-left: 4px solid var(--link-color, #646cff);
36
- background: var(--nav-link-hover-bg, #f8f9fa);
37
- border-radius: 0 8px 8px 0;
38
- color: var(--secondary-text, #666);
39
- }
40
-
41
- .md-blockquote .md-paragraph {
42
- margin: 0;
43
- }
44
-
45
- .md-code {
46
- font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', monospace;
47
- font-size: 0.9em;
48
- background: var(--nav-link-hover-bg, #f5f5f5);
49
- padding: 0.2rem 0.4rem;
50
- border-radius: 4px;
51
- }
52
-
53
- .md-image {
54
- max-width: 100%;
55
- height: auto;
56
- border-radius: 8px;
57
- margin: 1rem 0;
58
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
59
- }
60
-
61
- .md-container {
62
- margin: 1rem 0;
63
- }
64
-
65
- .md-container hr {
66
- border: none;
67
- height: 2px;
68
- background: var(--border-color, #eee);
69
- margin: 2rem 0;
70
- border-radius: 1px;
71
- }
72
-
73
- .md-container[tag="hr"] {
74
- margin: 2rem 0;
75
- }
76
-
77
- /* Links within markdown content */
78
- .md-paragraph a,
79
- .md-list-item a {
80
- color: var(--link-color, #646cff);
81
- text-decoration: none;
82
- transition: color 0.2s ease;
83
- }
84
-
85
- .md-paragraph a:hover,
86
- .md-list-item a:hover {
87
- color: var(--link-hover-color, #535bf2);
88
- text-decoration: underline;
89
- }
90
-
91
- /* Strong and emphasis */
92
- .md-paragraph strong,
93
- .md-list-item strong {
94
- font-weight: 600;
95
- color: var(--text-color, #1a1a1a);
96
- }
97
-
98
- .md-paragraph em,
99
- .md-list-item em {
100
- font-style: italic;
101
- }
102
-
103
- /* Tables (if supported) */
104
- .md-container table {
105
- width: 100%;
106
- border-collapse: collapse;
107
- margin: 1rem 0;
108
- }
109
-
110
- .md-container th,
111
- .md-container td {
112
- padding: 0.75rem;
113
- border: 1px solid var(--border-color, #ddd);
114
- text-align: left;
115
- }
116
-
117
- .md-container th {
118
- background: var(--nav-link-hover-bg, #f5f5f5);
119
- font-weight: 600;
120
- }
121
-
122
- /* Dark theme adjustments */
123
- html[data-theme="dark"] .md-code {
124
- background: rgba(255, 255, 255, 0.1);
125
- }
126
-
127
- html[data-theme="dark"] .md-container th {
128
- background: rgba(255, 255, 255, 0.05);
129
- }
@@ -1,12 +0,0 @@
1
- export interface Profile {
2
- name: string;
3
- title: string;
4
- experience: string;
5
- profileImageUrl?: string;
6
- }
7
-
8
- export async function fetchAboutMe(url: string): Promise<{ profile: Profile; contentNodes: any[] }> {
9
- const res = await fetch(`${url}/api/aboutme`);
10
- if (!res.ok) throw new Error('Failed to fetch');
11
- return res.json();
12
- }
@@ -1,155 +0,0 @@
1
- import { LitElement, html, css } from 'lit';
2
- import { customElement, property, state } from 'lit/decorators.js';
3
-
4
- import { ContentNode } from '@leadertechie/md2html';
5
- import { Profile } from './api';
6
-
7
- import { aboutmeStyles } from './styles';
8
-
9
- import { AboutMeRenderer } from './renderer';
10
- import { fetchAboutMe } from './api';
11
-
12
- interface AboutMeData {
13
- profile: Profile;
14
- contentNodes: ContentNode[];
15
- }
16
-
17
- @customElement('my-aboutme')
18
- export class MyAboutme extends LitElement {
19
- static styles = aboutmeStyles;
20
-
21
- @property({ type: String })
22
- accessor baseUrl = '';
23
-
24
- @state()
25
- accessor profile: Profile | null = null;
26
-
27
- @state()
28
- accessor contentNodes: ContentNode[] = [];
29
-
30
- @state()
31
- accessor loading = true;
32
-
33
- private renderer: AboutMeRenderer;
34
- /**
35
- * Injectable fetcher function used to retrieve About Me data.
36
- * Tests can override this (e.g. componentInstance.fetcher = myMock)
37
- * to avoid network I/O. By default it uses the stable `fetchAboutMe` helper.
38
- */
39
- public fetcher = fetchAboutMe;
40
-
41
- constructor(renderer?: AboutMeRenderer) {
42
- super();
43
- this.renderer = renderer || new AboutMeRenderer();
44
- }
45
-
46
- private get apiBaseUrl(): string {
47
- return this.baseUrl || this.getAttribute('base-url') || '';
48
- }
49
-
50
- async connectedCallback() {
51
- super.connectedCallback();
52
-
53
- // If we have initial data from SSR, use it immediately.
54
- if (typeof window !== 'undefined' && (window as any).__HYDRATION_DATA__) {
55
- const hydrationData = (window as any).__HYDRATION_DATA__;
56
- this.profile = hydrationData.profile;
57
- this.contentNodes = hydrationData.contentNodes;
58
- this.loading = false;
59
- return;
60
- }
61
-
62
- // Load content if a baseUrl is provided. In dev/prod, this will be set.
63
- const url = this.apiBaseUrl;
64
- if (url) {
65
- this.loadContent();
66
- }
67
- }
68
-
69
- updated(changedProperties: Map<string, any>) {
70
- super.updated(changedProperties);
71
-
72
- // Only load content from API if we haven't already loaded via hydration data
73
- if (this.loading === false && this.profile && this.contentNodes.length > 0) {
74
- return;
75
- }
76
-
77
- // If baseUrl changed and we have a valid baseUrl, load content
78
- if (changedProperties.has('baseUrl') || changedProperties.has('base-url')) {
79
- const url = this.apiBaseUrl;
80
- if (url) {
81
- this.loadContent();
82
- }
83
- }
84
- }
85
-
86
- private async loadContent() {
87
- try {
88
- this.loading = true;
89
-
90
- // Fetch content from API using the injectable fetcher.
91
- // Use the apiBaseUrl getter to get either property or attribute
92
- const url = this.apiBaseUrl;
93
- const data = await this.fetcher(url);
94
-
95
- this.profile = data.profile;
96
- this.contentNodes = data.contentNodes;
97
- this.loading = false;
98
- // Wait for the render to complete
99
- await this.updateComplete;
100
- } catch (error) {
101
- this.loading = false;
102
- // Set fallback content
103
- this.setFallbackContent();
104
- // Wait for the render to complete
105
- await this.updateComplete;
106
- }
107
- }
108
-
109
- private setFallbackContent() {
110
- this.profile = null; // No profile data
111
- this.contentNodes = [
112
- {
113
- type: 'paragraph',
114
- content: 'Unable to Load Content'
115
- }
116
- ];
117
- }
118
-
119
- render() {
120
- if (this.loading) {
121
- return html`<div class="aboutme"><div class="loading">Loading...</div></div>`;
122
- }
123
-
124
- // If profile is not available, check if fallback content is present.
125
- if (!this.profile) {
126
- if (this.contentNodes && this.contentNodes.length > 0) {
127
- return html`<div class="aboutme">${this.renderer.renderContent(this.contentNodes)}</div>`;
128
- }
129
- return html`<div class="aboutme"><div class="loading">Failed to load content</div></div>`;
130
- }
131
-
132
- // Render profile header + content
133
- const profileImageUrl = this.profile.profileImageUrl
134
- ? (this.profile.profileImageUrl.startsWith('http') || this.profile.profileImageUrl.startsWith('/')
135
- ? this.profile.profileImageUrl
136
- : `images/${this.profile.profileImageUrl}`)
137
- : '';
138
-
139
- return html`
140
- <div class="aboutme">
141
- <div class="profile-section">
142
- ${profileImageUrl ? html`
143
- <img src="${profileImageUrl}" alt="${this.profile.name}"
144
- class="profile-picture">
145
- ` : ''}
146
- <h1>${this.profile.name}</h1>
147
- <p class="profile-title">${this.profile.title} • ${this.profile.experience}</p>
148
- </div>
149
- <div class="content-section">
150
- ${this.renderer.renderContent(this.contentNodes)}
151
- </div>
152
- </div>
153
- `;
154
- }
155
- }
@@ -1,7 +0,0 @@
1
- import { ContentNode } from '@leadertechie/md2html';
2
-
3
- export class AboutMeRenderer {
4
- renderContent(nodes: ContentNode[]): unknown {
5
- return nodes;
6
- }
7
- }
@@ -1,10 +0,0 @@
1
- import { css } from 'lit';
2
-
3
- export const aboutmeStyles = css`
4
- .aboutme {
5
- padding: 2rem;
6
- }
7
- .loading {
8
- opacity: 0.7;
9
- }
10
- `;