@leadertechie/personal-site-kit 0.1.0-alpha.7 → 0.1.0-alpha.9

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 (129) hide show
  1. package/dist/api/content-utils.d.ts +27 -0
  2. package/dist/api/content-utils.d.ts.map +1 -0
  3. package/dist/api/handlers/about-me.d.ts.map +1 -1
  4. package/dist/api/handlers/content-api.d.ts +0 -1
  5. package/dist/api/handlers/content-api.d.ts.map +1 -1
  6. package/dist/api/website-api.d.ts.map +1 -1
  7. package/dist/api.js +2 -2
  8. package/dist/chunks/index-CGvOrVf8.js +213 -0
  9. package/dist/chunks/{index-Bq8WDk9L.js → index-CnSEOZse.js} +1285 -477
  10. package/dist/chunks/{template-Boh_MKY5.js → template-DWcsZW22.js} +8 -7
  11. package/dist/chunks/{website-api-XoeLwo_N.js → website-api-BEYGOsT3.js} +137 -156
  12. package/dist/index.js +19 -9
  13. package/dist/prerender/data-fetcher.d.ts +19 -0
  14. package/dist/prerender/data-fetcher.d.ts.map +1 -0
  15. package/dist/prerender/page-content.d.ts.map +1 -1
  16. package/dist/prerender/page-generators/about.d.ts +16 -0
  17. package/dist/prerender/page-generators/about.d.ts.map +1 -0
  18. package/dist/prerender/page-generators/base.d.ts +26 -0
  19. package/dist/prerender/page-generators/base.d.ts.map +1 -0
  20. package/dist/prerender/page-generators/blog-detail.d.ts +15 -0
  21. package/dist/prerender/page-generators/blog-detail.d.ts.map +1 -0
  22. package/dist/prerender/page-generators/blogs-list.d.ts +17 -0
  23. package/dist/prerender/page-generators/blogs-list.d.ts.map +1 -0
  24. package/dist/prerender/page-generators/home.d.ts +19 -0
  25. package/dist/prerender/page-generators/home.d.ts.map +1 -0
  26. package/dist/prerender/page-generators/index.d.ts +9 -0
  27. package/dist/prerender/page-generators/index.d.ts.map +1 -0
  28. package/dist/prerender/page-generators/not-found.d.ts +14 -0
  29. package/dist/prerender/page-generators/not-found.d.ts.map +1 -0
  30. package/dist/prerender/page-generators/stories-list.d.ts +17 -0
  31. package/dist/prerender/page-generators/stories-list.d.ts.map +1 -0
  32. package/dist/prerender/page-generators/story-detail.d.ts +15 -0
  33. package/dist/prerender/page-generators/story-detail.d.ts.map +1 -0
  34. package/dist/prerender.js +109 -102
  35. package/dist/shared.js +1 -1
  36. package/dist/ui/about-me/index.d.ts +2 -10
  37. package/dist/ui/about-me/index.d.ts.map +1 -1
  38. package/dist/ui/admin/api.d.ts +16 -0
  39. package/dist/ui/admin/api.d.ts.map +1 -0
  40. package/dist/ui/admin/components/AboutMeSection.d.ts +7 -0
  41. package/dist/ui/admin/components/AboutMeSection.d.ts.map +1 -0
  42. package/dist/ui/admin/components/AdminSection.d.ts +13 -0
  43. package/dist/ui/admin/components/AdminSection.d.ts.map +1 -0
  44. package/dist/ui/admin/components/BlogsSection.d.ts +7 -0
  45. package/dist/ui/admin/components/BlogsSection.d.ts.map +1 -0
  46. package/dist/ui/admin/components/HomeSection.d.ts +7 -0
  47. package/dist/ui/admin/components/HomeSection.d.ts.map +1 -0
  48. package/dist/ui/admin/components/ImagesSection.d.ts +7 -0
  49. package/dist/ui/admin/components/ImagesSection.d.ts.map +1 -0
  50. package/dist/ui/admin/components/LoginForm.d.ts +9 -0
  51. package/dist/ui/admin/components/LoginForm.d.ts.map +1 -0
  52. package/dist/ui/admin/components/LogoSection.d.ts +7 -0
  53. package/dist/ui/admin/components/LogoSection.d.ts.map +1 -0
  54. package/dist/ui/admin/components/ProfileSection.d.ts +7 -0
  55. package/dist/ui/admin/components/ProfileSection.d.ts.map +1 -0
  56. package/dist/ui/admin/components/StaticSection.d.ts +13 -0
  57. package/dist/ui/admin/components/StaticSection.d.ts.map +1 -0
  58. package/dist/ui/admin/components/StoriesSection.d.ts +7 -0
  59. package/dist/ui/admin/components/StoriesSection.d.ts.map +1 -0
  60. package/dist/ui/admin/components/index.d.ts +11 -0
  61. package/dist/ui/admin/components/index.d.ts.map +1 -0
  62. package/dist/ui/admin/index.d.ts +18 -26
  63. package/dist/ui/admin/index.d.ts.map +1 -1
  64. package/dist/ui/admin/types.d.ts +24 -0
  65. package/dist/ui/admin/types.d.ts.map +1 -0
  66. package/dist/ui/blog-viewer/index.d.ts.map +1 -1
  67. package/dist/ui/index.d.ts.map +1 -1
  68. package/dist/ui/story-viewer/index.d.ts.map +1 -1
  69. package/dist/ui.js +14 -4
  70. package/package.json +4 -4
  71. package/dist/ui/about-me/renderer.d.ts +0 -6
  72. package/dist/ui/about-me/renderer.d.ts.map +0 -1
  73. package/src/api/__tests__/info.test.ts +0 -44
  74. package/src/api/__tests__/utils.test.ts +0 -78
  75. package/src/api/handlers/about-me.ts +0 -99
  76. package/src/api/handlers/auth-handler.ts +0 -194
  77. package/src/api/handlers/auth.ts +0 -157
  78. package/src/api/handlers/content-api.ts +0 -268
  79. package/src/api/handlers/content.ts +0 -139
  80. package/src/api/handlers/home.ts +0 -79
  81. package/src/api/handlers/info.ts +0 -12
  82. package/src/api/handlers/logo.ts +0 -55
  83. package/src/api/handlers/static-details.ts +0 -48
  84. package/src/api/index.ts +0 -9
  85. package/src/api/utils.ts +0 -16
  86. package/src/api/website-api.ts +0 -138
  87. package/src/index.ts +0 -4
  88. package/src/prerender/__tests__/page-content.test.ts +0 -54
  89. package/src/prerender/__tests__/template.test.ts +0 -54
  90. package/src/prerender/index.ts +0 -7
  91. package/src/prerender/page-content.ts +0 -263
  92. package/src/prerender/prerender.ts +0 -25
  93. package/src/prerender/template.ts +0 -65
  94. package/src/prerender/website-prerender.ts +0 -152
  95. package/src/shared/config/api.ts +0 -16
  96. package/src/shared/config/index.ts +0 -43
  97. package/src/shared/config/types.ts +0 -16
  98. package/src/shared/core/__tests__/theme-toggle.test.ts +0 -204
  99. package/src/shared/core/site-store.ts +0 -38
  100. package/src/shared/core/theme-toggle.ts +0 -118
  101. package/src/shared/index.ts +0 -17
  102. package/src/shared/interfaces/ifooter-link.ts +0 -4
  103. package/src/shared/interfaces/iroute.ts +0 -4
  104. package/src/shared/models/theme-variables.css +0 -25
  105. package/src/shared/page-content.ts +0 -210
  106. package/src/shared/router.ts +0 -250
  107. package/src/shared/runtime.ts +0 -11
  108. package/src/shared/template.ts +0 -35
  109. package/src/shared/website-ui.ts +0 -92
  110. package/src/styles/markdown.css +0 -129
  111. package/src/ui/about-me/api.ts +0 -12
  112. package/src/ui/about-me/index.ts +0 -164
  113. package/src/ui/about-me/renderer.ts +0 -23
  114. package/src/ui/about-me/styles.ts +0 -85
  115. package/src/ui/admin/index.ts +0 -655
  116. package/src/ui/admin/styles.ts +0 -270
  117. package/src/ui/banner/index.ts +0 -38
  118. package/src/ui/banner/styles.ts +0 -95
  119. package/src/ui/blog-viewer/__tests__/blogviewer.test.ts +0 -7
  120. package/src/ui/blog-viewer/index.ts +0 -124
  121. package/src/ui/blog-viewer/styles.ts +0 -23
  122. package/src/ui/footer/index.ts +0 -37
  123. package/src/ui/footer/styles.ts +0 -50
  124. package/src/ui/index.ts +0 -6
  125. package/src/ui/story-viewer/__tests__/storyviewer.test.ts +0 -7
  126. package/src/ui/story-viewer/index.ts +0 -120
  127. package/src/ui/story-viewer/styles.ts +0 -54
  128. /package/{src/shared → dist}/styles/markdown.css +0 -0
  129. /package/{src → dist}/styles/theme.css +0 -0
@@ -1,270 +0,0 @@
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
- .file-list {
109
- margin-top: 20px;
110
- }
111
-
112
- .file-item {
113
- display: flex;
114
- justify-content: space-between;
115
- align-items: center;
116
- padding: 12px 16px;
117
- border-bottom: 1px solid var(--border-color, #eee);
118
- border-radius: 8px;
119
- transition: background 0.15s ease;
120
- }
121
-
122
- .file-item:hover {
123
- background: var(--nav-link-hover-bg, #f8f9fa);
124
- }
125
-
126
- .file-item:last-child {
127
- border-bottom: none;
128
- }
129
-
130
- button {
131
- cursor: pointer;
132
- padding: 10px 20px;
133
- border-radius: 8px;
134
- font-weight: 500;
135
- font-size: 0.95rem;
136
- transition: all 0.2s ease;
137
- border: none;
138
- }
139
-
140
- .btn-primary {
141
- background: var(--link-color, #646cff);
142
- color: white;
143
- box-shadow: 0 2px 4px rgba(100, 108, 255, 0.25);
144
- }
145
-
146
- .btn-primary:hover {
147
- background: var(--link-hover-color, #535bf2);
148
- transform: translateY(-1px);
149
- box-shadow: 0 4px 8px rgba(100, 108, 255, 0.3);
150
- }
151
-
152
- .btn-danger {
153
- color: #dc3545;
154
- background: transparent;
155
- border: 1px solid #dc3545;
156
- padding: 6px 12px;
157
- font-size: 0.85rem;
158
- }
159
-
160
- .btn-danger:hover {
161
- background: #dc3545;
162
- color: white;
163
- }
164
-
165
- .btn-secondary {
166
- background: var(--nav-link-hover-bg, #f0f0f0);
167
- color: var(--text-color, #333);
168
- border: none;
169
- font-size: 0.85rem;
170
- padding: 8px 16px;
171
- }
172
-
173
- .btn-secondary:hover {
174
- background: #e0e0e0;
175
- }
176
-
177
- input[type="text"], input[type="password"], input[type="file"] {
178
- padding: 12px 14px;
179
- width: 100%;
180
- box-sizing: border-box;
181
- margin-bottom: 12px;
182
- border: 2px solid var(--border-color, #e0e0e0);
183
- border-radius: 10px;
184
- background-color: var(--background-color, #fff);
185
- color: var(--text-color, #213547);
186
- font-size: 0.95rem;
187
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
188
- }
189
-
190
- input[type="text"]:focus, input[type="password"]:focus {
191
- outline: none;
192
- border-color: var(--link-color, #646cff);
193
- box-shadow: 0 0 0 3px rgba(100, 108, 255, 0.15);
194
- }
195
-
196
- input[type="file"] {
197
- padding: 10px;
198
- border-style: dashed;
199
- cursor: pointer;
200
- }
201
-
202
- input[type="file"]:hover {
203
- border-color: var(--link-color, #646cff);
204
- background: rgba(100, 108, 255, 0.03);
205
- }
206
-
207
- .help-text {
208
- color: var(--secondary-text, #666);
209
- font-size: 0.9rem;
210
- margin-bottom: 16px;
211
- line-height: 1.5;
212
- }
213
-
214
- .status-message {
215
- padding: 12px 16px;
216
- border-radius: 8px;
217
- margin-bottom: 16px;
218
- font-size: 0.9rem;
219
- background: var(--nav-link-hover-bg, #f5f5f5);
220
- color: var(--text-color, #333);
221
- }
222
-
223
- .status-message.success {
224
- background: linear-gradient(135deg, #e8f5e9, #c8e6c9);
225
- color: #2e7d32;
226
- border: 1px solid #a5d6a7;
227
- }
228
-
229
- .status-message.error {
230
- background: linear-gradient(135deg, #ffebee, #ffcdd2);
231
- color: #c62828;
232
- border: 1px solid #ef9a9a;
233
- }
234
-
235
- .header {
236
- display: flex;
237
- justify-content: space-between;
238
- align-items: center;
239
- margin-bottom: 24px;
240
- padding-bottom: 16px;
241
- border-bottom: 2px solid var(--border-color, #eee);
242
- }
243
-
244
- .header h1 {
245
- margin: 0;
246
- font-size: 1.5rem;
247
- font-weight: 600;
248
- color: var(--text-color, #213547);
249
- }
250
-
251
- .mt-1 { margin-top: 12px; }
252
- .mb-1 { margin-bottom: 1rem; }
253
-
254
- @media (max-width: 600px) {
255
- .container {
256
- padding: 0.5rem;
257
- }
258
- .section {
259
- padding: 16px;
260
- }
261
- .nav-tabs {
262
- gap: 4px;
263
- padding: 8px;
264
- }
265
- .nav-tab {
266
- padding: 8px 12px;
267
- font-size: 0.85rem;
268
- }
269
- }
270
- `;
@@ -1,38 +0,0 @@
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
- }
@@ -1,95 +0,0 @@
1
- import { css } from 'lit';
2
-
3
- export const bannerStyles = css`
4
- :host {
5
- display: block;
6
- width: 100%;
7
- box-sizing: border-box;
8
- font-family: Arial, sans-serif;
9
- color: var(--text-color);
10
- background-color: var(--background-color);
11
- }
12
-
13
- .banner,
14
- .banner-component {
15
- display: flex;
16
- flex-direction: row;
17
- justify-content: space-between;
18
- align-items: center;
19
- padding: 1rem 2rem;
20
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
21
- transition: background-color 0.3s, color 0.3s;
22
- background-color: var(--background-color);
23
- color: var(--text-color);
24
- }
25
-
26
- .header-content {
27
- display: flex;
28
- align-items: center;
29
- margin-bottom: 0;
30
- margin-right: auto;
31
- }
32
-
33
- .logo {
34
- height: 50px;
35
- margin-right: 1rem;
36
- width: auto;
37
- }
38
-
39
- /* Logo dark mode - invert colors for better contrast */
40
- [data-theme="dark"] .logo {
41
- filter: brightness(0.85) invert(1);
42
- }
43
-
44
- h1 {
45
- margin: 0;
46
- font-size: 1.8em;
47
- font-weight: 600;
48
- color: var(--text-color);
49
- }
50
-
51
- .nav-and-theme {
52
- display: flex;
53
- align-items: center;
54
- gap: 1rem;
55
- }
56
-
57
- nav {
58
- display: flex;
59
- align-items: center;
60
- padding: 0 1rem;
61
- gap: 10px;
62
- }
63
-
64
- nav a {
65
- text-decoration: none;
66
- color: var(--nav-link-color, #333);
67
- padding: 0.5rem 1rem;
68
- border-radius: 5px;
69
- transition: background-color 0.3s ease, color 0.3s ease;
70
- }
71
-
72
- nav a:hover {
73
- background-color: var(--nav-link-hover-bg, #e2e6ea);
74
- text-decoration: none;
75
- }
76
-
77
- @media (max-width: 768px) {
78
- .banner,
79
- .banner-component {
80
- flex-direction: column;
81
- gap: 1rem;
82
- padding: 1rem;
83
- }
84
-
85
- .header-content {
86
- margin-right: 0;
87
- justify-content: center;
88
- }
89
-
90
- nav {
91
- flex-wrap: wrap;
92
- justify-content: center;
93
- }
94
- }
95
- `;
@@ -1,7 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- describe('BlogViewer Package', () => {
4
- it('should have valid exports', () => {
5
- expect(true).toBe(true);
6
- });
7
- });
@@ -1,124 +0,0 @@
1
- import { LitElement, html, css } from 'lit';
2
- import { customElement, property, state } from 'lit/decorators.js';
3
- import { unsafeHTML } from 'lit/directives/unsafe-html.js';
4
- import { MarkdownPipeline, ContentNode } from '@leadertechie/md2html';
5
-
6
- import { blogviewerStyles } from './styles';
7
-
8
- const pipeline = new MarkdownPipeline({
9
- imagePathPrefix: 'images/',
10
- styleOptions: {
11
- classPrefix: 'md-',
12
- addHeadingIds: true
13
- }
14
- });
15
-
16
- interface BlogPost {
17
- title: string;
18
- description: string;
19
- date: string;
20
- tags: string[];
21
- author: string;
22
- imageUrl: string;
23
- content: string;
24
- }
25
-
26
- @customElement('my-blog-viewer')
27
- export class BlogViewer extends LitElement {
28
- static styles = blogviewerStyles;
29
-
30
- @property({ type: String })
31
- accessor slug = '';
32
-
33
- @state()
34
- accessor blogPost: BlogPost | null = null;
35
-
36
- @state()
37
- accessor loading = true;
38
-
39
- @state()
40
- accessor error = '';
41
-
42
- private get apiBaseUrl(): string {
43
- return 'https://api.techieleader.com';
44
- }
45
-
46
- connectedCallback() {
47
- super.connectedCallback();
48
- if (this.slug) {
49
- this.loadBlog();
50
- }
51
- }
52
-
53
- updated(changedProperties: Map<string, unknown>) {
54
- if (changedProperties.has('slug') && this.slug) {
55
- this.loadBlog();
56
- }
57
- }
58
-
59
- loadBlog() {
60
- this.loading = true;
61
- this.error = '';
62
- console.log('[BlogViewer] Loading blog:', this.slug);
63
-
64
- fetch(`${this.apiBaseUrl}/api/blogs/${this.slug}`)
65
- .then(res => {
66
- console.log('[BlogViewer] Response status:', res.status);
67
- if (res.ok) return res.json();
68
- throw new Error('Failed to load blog');
69
- })
70
- .then(blog => {
71
- console.log('[BlogViewer] Found blog:', blog?.title, 'slug:', blog?.slug);
72
- if (blog && blog.content) {
73
- this.blogPost = blog;
74
- } else {
75
- this.error = 'Blog content not found';
76
- }
77
- this.loading = false;
78
- })
79
- .catch(e => {
80
- console.error('[BlogViewer] Failed to load blog:', e);
81
- this.error = 'Failed to load blog';
82
- this.loading = false;
83
- });
84
- }
85
-
86
- render() {
87
- if (this.loading) {
88
- return html`<div class="blog-viewer"><div class="loading">Loading...</div></div>`;
89
- }
90
-
91
- if (this.error) {
92
- return html`<div class="blog-viewer"><div class="error">${this.error}</div></div>`;
93
- }
94
-
95
- if (!this.blogPost) {
96
- return html`<div class="blog-viewer"><div class="error">Blog not found</div></div>`;
97
- }
98
-
99
- const { title, date, tags, content } = this.blogPost;
100
-
101
- return html`
102
- <article class="blog-viewer">
103
- <h1>${title}</h1>
104
- <div class="meta">
105
- <span>${date}</span>
106
- </div>
107
- ${tags?.length ? html`
108
- <div class="tags">
109
- ${tags.map(tag => html`<span class="tag">${tag}</span>`)}
110
- </div>
111
- ` : ''}
112
- <div class="content">
113
- ${unsafeHTML(this.renderMarkdown(content))}
114
- </div>
115
- </article>
116
- `;
117
- }
118
-
119
- renderMarkdown(content: string): string {
120
- if (!content) return '';
121
- const nodes = pipeline.parse(content);
122
- return pipeline.render(nodes);
123
- }
124
- }
@@ -1,23 +0,0 @@
1
- import { css } from 'lit';
2
-
3
- export const blogviewerStyles = css`
4
- :host {
5
- display: block;
6
- }
7
-
8
- .tags {
9
- display: flex;
10
- gap: 0.5rem;
11
- flex-wrap: wrap;
12
- margin-top: 1rem;
13
- }
14
-
15
- .tag {
16
- background: var(--nav-link-hover-bg, #f0f0f0);
17
- color: var(--text-color, #333);
18
- padding: 0.25rem 0.5rem;
19
- border-radius: 4px;
20
- font-size: 0.875rem;
21
- border: 1px solid var(--border-color, transparent);
22
- }
23
- `;
@@ -1,37 +0,0 @@
1
- import { LitElement, html, css } from 'lit';
2
- import { customElement, property } from 'lit/decorators.js';
3
-
4
- import { IFooterLink } from '../../shared/interfaces/ifooter-link';
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
- }
@@ -1,50 +0,0 @@
1
- import { css } from 'lit';
2
-
3
- export const footerStyles = css`
4
- :host {
5
- display: flex;
6
- align-items: center;
7
- justify-content: space-between;
8
- padding: 1rem 2rem;
9
- background: var(--background-color);
10
- color: var(--text-color);
11
- border-top: 1px solid var(--nav-link-hover-bg);
12
- flex-wrap: wrap;
13
- }
14
-
15
- .footer-content {
16
- display: flex;
17
- flex-direction: column;
18
- align-items: flex-start;
19
- }
20
-
21
- .links {
22
- display: flex;
23
- gap: 1rem;
24
- margin-top: 0.5rem;
25
- }
26
-
27
- .links a {
28
- color: inherit;
29
- text-decoration: none;
30
- padding: 0.25rem 0.5rem;
31
- border-radius: 4px;
32
- transition: background-color 0.3s ease;
33
- }
34
-
35
- .links a:hover {
36
- background-color: rgba(0, 0, 0, 0.1);
37
- }
38
-
39
- @media (min-width: 768px) {
40
- .footer-content {
41
- flex-direction: row;
42
- align-items: center;
43
- width: 100%;
44
- justify-content: space-between;
45
- }
46
- .links {
47
- margin-top: 0;
48
- }
49
- }
50
- `;
package/src/ui/index.ts DELETED
@@ -1,6 +0,0 @@
1
- export * from './about-me';
2
- export * from './admin';
3
- export * from './banner';
4
- export * from './footer';
5
- export * from './blog-viewer';
6
- export * from './story-viewer';
@@ -1,7 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- describe('StoryViewer Package', () => {
4
- it('should have valid exports', () => {
5
- expect(true).toBe(true);
6
- });
7
- });