@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.
Files changed (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/api/handlers/aboutme.d.ts +3 -0
  4. package/dist/api/handlers/aboutme.d.ts.map +1 -0
  5. package/dist/api/handlers/content-api.d.ts +5 -0
  6. package/dist/api/handlers/content-api.d.ts.map +1 -0
  7. package/dist/api/handlers/content.d.ts +2 -0
  8. package/dist/api/handlers/content.d.ts.map +1 -0
  9. package/dist/api/handlers/home.d.ts +3 -0
  10. package/dist/api/handlers/home.d.ts.map +1 -0
  11. package/dist/api/handlers/info.d.ts +2 -0
  12. package/dist/api/handlers/info.d.ts.map +1 -0
  13. package/dist/api/handlers/logo.d.ts +2 -0
  14. package/dist/api/handlers/logo.d.ts.map +1 -0
  15. package/dist/api/handlers/staticdetails.d.ts +2 -0
  16. package/dist/api/handlers/staticdetails.d.ts.map +1 -0
  17. package/dist/api/index.d.ts +9 -0
  18. package/dist/api/index.d.ts.map +1 -0
  19. package/dist/api/utils.d.ts +8 -0
  20. package/dist/api/utils.d.ts.map +1 -0
  21. package/dist/api.d.ts +4 -0
  22. package/dist/api.js +591 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +354 -0
  25. package/dist/prerender/index.d.ts +5 -0
  26. package/dist/prerender/index.d.ts.map +1 -0
  27. package/dist/prerender/pageContent.d.ts +16 -0
  28. package/dist/prerender/pageContent.d.ts.map +1 -0
  29. package/dist/prerender/prerender.d.ts +3 -0
  30. package/dist/prerender/prerender.d.ts.map +1 -0
  31. package/dist/prerender/template.d.ts +10 -0
  32. package/dist/prerender/template.d.ts.map +1 -0
  33. package/dist/prerender.d.ts +4 -0
  34. package/dist/prerender.js +399 -0
  35. package/dist/shared/config/api.d.ts +2 -0
  36. package/dist/shared/config/api.d.ts.map +1 -0
  37. package/dist/shared/config/index.d.ts +5 -0
  38. package/dist/shared/config/index.d.ts.map +1 -0
  39. package/dist/shared/config/types.d.ts +16 -0
  40. package/dist/shared/config/types.d.ts.map +1 -0
  41. package/dist/shared/core/site-store.d.ts +16 -0
  42. package/dist/shared/core/site-store.d.ts.map +1 -0
  43. package/dist/shared/core/theme-toggle.d.ts +13 -0
  44. package/dist/shared/core/theme-toggle.d.ts.map +1 -0
  45. package/dist/shared/index.d.ts +9 -0
  46. package/dist/shared/index.d.ts.map +1 -0
  47. package/dist/shared/interfaces/iFooterLink.d.ts +5 -0
  48. package/dist/shared/interfaces/iFooterLink.d.ts.map +1 -0
  49. package/dist/shared/interfaces/iRoute.d.ts +5 -0
  50. package/dist/shared/interfaces/iRoute.d.ts.map +1 -0
  51. package/dist/shared/pageContent.d.ts +35 -0
  52. package/dist/shared/pageContent.d.ts.map +1 -0
  53. package/dist/shared/runtime.d.ts +7 -0
  54. package/dist/shared/runtime.d.ts.map +1 -0
  55. package/dist/shared/template.d.ts +8 -0
  56. package/dist/shared/template.d.ts.map +1 -0
  57. package/dist/shared.d.ts +2 -0
  58. package/dist/shared.js +10 -0
  59. package/dist/ui/aboutme/api.d.ts +11 -0
  60. package/dist/ui/aboutme/api.d.ts.map +1 -0
  61. package/dist/ui/aboutme/index.d.ts +26 -0
  62. package/dist/ui/aboutme/index.d.ts.map +1 -0
  63. package/dist/ui/aboutme/renderer.d.ts +5 -0
  64. package/dist/ui/aboutme/renderer.d.ts.map +1 -0
  65. package/dist/ui/aboutme/styles.d.ts +2 -0
  66. package/dist/ui/aboutme/styles.d.ts.map +1 -0
  67. package/dist/ui/admin/index.d.ts +42 -0
  68. package/dist/ui/admin/index.d.ts.map +1 -0
  69. package/dist/ui/admin/styles.d.ts +2 -0
  70. package/dist/ui/admin/styles.d.ts.map +1 -0
  71. package/dist/ui/banner/index.d.ts +17 -0
  72. package/dist/ui/banner/index.d.ts.map +1 -0
  73. package/dist/ui/banner/styles.d.ts +2 -0
  74. package/dist/ui/banner/styles.d.ts.map +1 -0
  75. package/dist/ui/footer/index.d.ts +9 -0
  76. package/dist/ui/footer/index.d.ts.map +1 -0
  77. package/dist/ui/footer/styles.d.ts +2 -0
  78. package/dist/ui/footer/styles.d.ts.map +1 -0
  79. package/dist/ui.d.ts +2 -0
  80. package/dist/ui.js +820 -0
  81. package/package.json +41 -0
  82. package/src/api/__tests__/info.test.ts +44 -0
  83. package/src/api/__tests__/utils.test.ts +78 -0
  84. package/src/api/handlers/aboutme.ts +99 -0
  85. package/src/api/handlers/content-api.ts +268 -0
  86. package/src/api/handlers/content.ts +72 -0
  87. package/src/api/handlers/home.ts +79 -0
  88. package/src/api/handlers/info.ts +12 -0
  89. package/src/api/handlers/logo.ts +55 -0
  90. package/src/api/handlers/staticdetails.ts +48 -0
  91. package/src/api/index.ts +125 -0
  92. package/src/api/utils.ts +16 -0
  93. package/src/prerender/__tests__/pageContent.test.ts +54 -0
  94. package/src/prerender/__tests__/template.test.ts +54 -0
  95. package/src/prerender/index.ts +138 -0
  96. package/src/prerender/pageContent.ts +263 -0
  97. package/src/prerender/prerender.ts +25 -0
  98. package/src/prerender/template.ts +65 -0
  99. package/src/shared/config/api.ts +16 -0
  100. package/src/shared/config/index.ts +41 -0
  101. package/src/shared/config/types.ts +16 -0
  102. package/src/shared/core/__tests__/theme-toggle.test.ts +204 -0
  103. package/src/shared/core/site-store.ts +38 -0
  104. package/src/shared/core/theme-toggle.ts +118 -0
  105. package/src/shared/index.ts +15 -0
  106. package/src/shared/interfaces/iFooterLink.ts +4 -0
  107. package/src/shared/interfaces/iRoute.ts +4 -0
  108. package/src/shared/models/theme-variables.css +25 -0
  109. package/src/shared/pageContent.ts +209 -0
  110. package/src/shared/runtime.ts +11 -0
  111. package/src/shared/styles/markdown.css +129 -0
  112. package/src/shared/template.ts +35 -0
  113. package/src/styles/markdown.css +129 -0
  114. package/src/styles/theme.css +432 -0
  115. package/src/ui/aboutme/api.ts +12 -0
  116. package/src/ui/aboutme/index.ts +155 -0
  117. package/src/ui/aboutme/renderer.ts +7 -0
  118. package/src/ui/aboutme/styles.ts +10 -0
  119. package/src/ui/admin/index.ts +492 -0
  120. package/src/ui/admin/styles.ts +317 -0
  121. package/src/ui/banner/index.ts +38 -0
  122. package/src/ui/banner/styles.ts +10 -0
  123. package/src/ui/footer/index.ts +37 -0
  124. package/src/ui/footer/styles.ts +9 -0
@@ -0,0 +1,317 @@
1
+ import { css } from 'lit';
2
+
3
+ export const adminStyles = css`
4
+ :host {
5
+ display: block;
6
+ width: 100%;
7
+ max-width: 100%;
8
+ padding: 20px;
9
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
10
+ color: var(--text-color, #213547);
11
+ background-color: var(--background-color, #fff);
12
+ min-height: 100vh;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ *, *::before, *::after {
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ .container {
21
+ width: 100%;
22
+ max-width: 900px;
23
+ margin: 0 auto;
24
+ padding: 1rem;
25
+ }
26
+
27
+ .login-box {
28
+ border: 1px solid var(--border-color, #e0e0e0);
29
+ padding: 3rem 2.5rem;
30
+ border-radius: 16px;
31
+ width: 100%;
32
+ max-width: 420px;
33
+ margin: 80px auto;
34
+ text-align: center;
35
+ background: var(--card-bg, #fff);
36
+ box-shadow: 0 4px 6px rgba(0,0,0,0.07), 0 10px 20px rgba(0,0,0,0.05);
37
+ }
38
+
39
+ .login-box h2 {
40
+ margin: 0 0 0.5rem 0;
41
+ font-size: 1.75rem;
42
+ font-weight: 600;
43
+ color: var(--text-color, #213547);
44
+ }
45
+
46
+ .login-box p {
47
+ color: var(--secondary-text, #666);
48
+ margin-bottom: 1.5rem;
49
+ }
50
+
51
+ .nav-tabs {
52
+ display: flex;
53
+ gap: 8px;
54
+ margin-bottom: 24px;
55
+ flex-wrap: wrap;
56
+ padding: 0.5rem;
57
+ background: var(--card-bg, #fff);
58
+ border-radius: 12px;
59
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
60
+ width: 100%;
61
+ }
62
+
63
+ .nav-tab {
64
+ padding: 0.6rem 1.25rem;
65
+ border: none;
66
+ border-radius: 8px;
67
+ cursor: pointer;
68
+ background: transparent;
69
+ color: var(--text-color, #213547);
70
+ font-size: 0.95rem;
71
+ font-weight: 500;
72
+ transition: all 0.2s ease;
73
+ }
74
+
75
+ .nav-tab:hover {
76
+ background: var(--nav-link-hover-bg, #f0f0f0);
77
+ color: var(--link-color, #646cff);
78
+ }
79
+
80
+ .nav-tab.active {
81
+ background: var(--link-color, #646cff);
82
+ color: white;
83
+ box-shadow: 0 2px 8px rgba(100, 108, 255, 0.3);
84
+ }
85
+
86
+ .section {
87
+ width: 100%;
88
+ border: none;
89
+ padding: 24px;
90
+ border-radius: 16px;
91
+ background: var(--card-bg, #fff);
92
+ box-shadow: 0 4px 6px rgba(0,0,0,0.07), 0 10px 20px rgba(0,0,0,0.05);
93
+ margin-bottom: 20px;
94
+ min-height: 450px;
95
+ box-sizing: border-box;
96
+ }
97
+
98
+ .section h3 {
99
+ margin: 0 0 0.5rem 0;
100
+ font-size: 1.25rem;
101
+ font-weight: 600;
102
+ color: var(--text-color, #213547);
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 0.5rem;
106
+ }
107
+
108
+ .section h4 {
109
+ margin: 1.5rem 0 0.75rem 0;
110
+ font-size: 1rem;
111
+ font-weight: 600;
112
+ color: var(--text-color, #213547);
113
+ }
114
+
115
+ .file-list {
116
+ margin-top: 20px;
117
+ }
118
+
119
+ .file-item {
120
+ display: flex;
121
+ justify-content: space-between;
122
+ align-items: center;
123
+ padding: 12px 16px;
124
+ border-bottom: 1px solid var(--border-color, #eee);
125
+ border-radius: 8px;
126
+ transition: background 0.15s ease;
127
+ }
128
+
129
+ .file-item:hover {
130
+ background: var(--nav-link-hover-bg, #f8f9fa);
131
+ }
132
+
133
+ .file-item:last-child {
134
+ border-bottom: none;
135
+ }
136
+
137
+ button {
138
+ cursor: pointer;
139
+ padding: 10px 20px;
140
+ border-radius: 8px;
141
+ font-weight: 500;
142
+ font-size: 0.95rem;
143
+ transition: all 0.2s ease;
144
+ border: none;
145
+ }
146
+
147
+ .btn-primary {
148
+ background: var(--link-color, #646cff);
149
+ color: white;
150
+ box-shadow: 0 2px 4px rgba(100, 108, 255, 0.25);
151
+ }
152
+
153
+ .btn-primary:hover {
154
+ background: var(--link-hover-color, #535bf2);
155
+ transform: translateY(-1px);
156
+ box-shadow: 0 4px 8px rgba(100, 108, 255, 0.3);
157
+ }
158
+
159
+ .btn-danger {
160
+ color: #dc3545;
161
+ background: transparent;
162
+ border: 1px solid #dc3545;
163
+ padding: 6px 12px;
164
+ font-size: 0.85rem;
165
+ }
166
+
167
+ .btn-danger:hover {
168
+ background: #dc3545;
169
+ color: white;
170
+ }
171
+
172
+ .btn-secondary {
173
+ background: var(--nav-link-hover-bg, #f0f0f0);
174
+ color: var(--text-color, #333);
175
+ border: none;
176
+ font-size: 0.85rem;
177
+ padding: 8px 16px;
178
+ }
179
+
180
+ .btn-secondary:hover {
181
+ background: #e0e0e0;
182
+ }
183
+
184
+ input[type="text"], input[type="password"], input[type="file"] {
185
+ padding: 12px 14px;
186
+ width: 100%;
187
+ box-sizing: border-box;
188
+ margin-bottom: 12px;
189
+ border: 2px solid var(--border-color, #e0e0e0);
190
+ border-radius: 10px;
191
+ background-color: var(--background-color, #fff);
192
+ color: var(--text-color, #213547);
193
+ font-size: 0.95rem;
194
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
195
+ }
196
+
197
+ input[type="text"]:focus, input[type="password"]:focus {
198
+ outline: none;
199
+ border-color: var(--link-color, #646cff);
200
+ box-shadow: 0 0 0 3px rgba(100, 108, 255, 0.15);
201
+ }
202
+
203
+ input[type="file"] {
204
+ padding: 10px;
205
+ border-style: dashed;
206
+ cursor: pointer;
207
+ }
208
+
209
+ input[type="file"]:hover {
210
+ border-color: var(--link-color, #646cff);
211
+ background: rgba(100, 108, 255, 0.03);
212
+ }
213
+
214
+ .help-text {
215
+ color: var(--secondary-text, #666);
216
+ font-size: 0.9rem;
217
+ margin-bottom: 16px;
218
+ line-height: 1.5;
219
+ }
220
+
221
+ .required-badge {
222
+ background: linear-gradient(135deg, #dc3545, #c82333);
223
+ color: white;
224
+ padding: 4px 10px;
225
+ border-radius: 20px;
226
+ font-size: 0.75rem;
227
+ font-weight: 600;
228
+ margin-left: 8px;
229
+ text-transform: uppercase;
230
+ letter-spacing: 0.5px;
231
+ }
232
+
233
+ .current-file {
234
+ background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
235
+ color: #2e7d32;
236
+ padding: 14px 16px;
237
+ border-radius: 10px;
238
+ margin-bottom: 16px;
239
+ border: 1px solid #a5d6a7;
240
+ display: flex;
241
+ justify-content: space-between;
242
+ align-items: center;
243
+ flex-wrap: wrap;
244
+ gap: 10px;
245
+ }
246
+
247
+ .current-file strong {
248
+ color: #1b5e20;
249
+ }
250
+
251
+ .info-box {
252
+ background: linear-gradient(135deg, #fff8e1, #ffecb3);
253
+ color: #f57c00;
254
+ padding: 14px 16px;
255
+ border-radius: 10px;
256
+ margin-bottom: 16px;
257
+ font-size: 0.9rem;
258
+ border: 1px solid #ffe082;
259
+ }
260
+
261
+ .status-message {
262
+ padding: 12px 16px;
263
+ border-radius: 8px;
264
+ margin-bottom: 16px;
265
+ font-size: 0.9rem;
266
+ background: var(--nav-link-hover-bg, #f5f5f5);
267
+ color: var(--text-color, #333);
268
+ }
269
+
270
+ .status-message.success {
271
+ background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
272
+ color: #2e7d32;
273
+ border: 1px solid #a5d6a7;
274
+ }
275
+
276
+ .status-message.error {
277
+ background: linear-gradient(135deg, #ffebee, #ffcdd2);
278
+ color: #c62828;
279
+ border: 1px solid #ef9a9a;
280
+ }
281
+
282
+ .header {
283
+ display: flex;
284
+ justify-content: space-between;
285
+ align-items: center;
286
+ margin-bottom: 24px;
287
+ padding-bottom: 16px;
288
+ border-bottom: 2px solid var(--border-color, #eee);
289
+ }
290
+
291
+ .header h1 {
292
+ margin: 0;
293
+ font-size: 1.5rem;
294
+ font-weight: 600;
295
+ color: var(--text-color, #213547);
296
+ }
297
+
298
+ .mt-1 { margin-top: 12px; }
299
+ .mb-1 { margin-bottom: 1rem; }
300
+
301
+ @media (max-width: 600px) {
302
+ .container {
303
+ padding: 0.5rem;
304
+ }
305
+ .section {
306
+ padding: 16px;
307
+ }
308
+ .nav-tabs {
309
+ gap: 4px;
310
+ padding: 8px;
311
+ }
312
+ .nav-tab {
313
+ padding: 8px 12px;
314
+ font-size: 0.85rem;
315
+ }
316
+ }
317
+ `;
@@ -0,0 +1,38 @@
1
+ import { LitElement, html, css } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
+
4
+ import { bannerStyles } from './styles';
5
+
6
+ @customElement('my-banner')
7
+ export class MyBanner extends LitElement {
8
+ static styles = bannerStyles;
9
+
10
+ static properties = {
11
+ header: { type: String },
12
+ logo: { type: String },
13
+ };
14
+
15
+ declare header: string;
16
+ declare logo: string;
17
+
18
+ constructor() {
19
+ super();
20
+ this.header = 'My App';
21
+ this.logo = '';
22
+ }
23
+
24
+ render() {
25
+ return html`
26
+ <header class="banner banner-component">
27
+ <div class="header-content">
28
+ ${this.logo ? html`<img src="${this.logo}" alt="Logo" class="logo" />` : ''}
29
+ <h1>${this.header}</h1>
30
+ </div>
31
+ <div class="nav-and-theme">
32
+ <slot name="nav-links"></slot>
33
+ <slot name="theme-switcher"></slot>
34
+ </div>
35
+ </header>
36
+ `;
37
+ }
38
+ }
@@ -0,0 +1,10 @@
1
+ import { css } from 'lit';
2
+
3
+ export const bannerStyles = css`
4
+ .banner {
5
+ padding: 1rem;
6
+ display: flex;
7
+ justify-content: space-between;
8
+ align-items: center;
9
+ }
10
+ `;
@@ -0,0 +1,37 @@
1
+ import { LitElement, html, css } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+
4
+ import { IFooterLink } from '../../shared/interfaces/iFooterLink';
5
+
6
+ import { footerStyles } from './styles';
7
+
8
+ @customElement('my-footer')
9
+ export class FooterComponent extends LitElement {
10
+ static styles = footerStyles;
11
+
12
+ @property({ type: String })
13
+ accessor copyright = '';
14
+
15
+ @property({ type: Array })
16
+ accessor footerLinks: IFooterLink[] = [];
17
+
18
+ render() {
19
+ return html`
20
+ <div class="footer-content">
21
+ <span>&copy; ${this.copyright}</span>
22
+ <span class="links">
23
+ ${this.footerLinks.map(
24
+ (link) => {
25
+ const isExternal = link.link.startsWith('http') || link.link.startsWith('mailto:');
26
+ return html`<a
27
+ href="${link.link}"
28
+ target="${isExternal ? '_blank' : '_self'}"
29
+ rel="${isExternal ? 'noopener noreferrer' : ''}"
30
+ >${link.text}</a>`;
31
+ }
32
+ )}
33
+ </span>
34
+ </div>
35
+ `;
36
+ }
37
+ }
@@ -0,0 +1,9 @@
1
+ import { css } from 'lit';
2
+
3
+ export const footerStyles = css`
4
+ .footer-content {
5
+ padding: 1rem;
6
+ display: flex;
7
+ justify-content: space-between;
8
+ }
9
+ `;