@leadertechie/personal-site-kit 0.1.0-alpha.8 → 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 (93) 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/content-api.d.ts +0 -1
  4. package/dist/api/handlers/content-api.d.ts.map +1 -1
  5. package/dist/api.js +2 -2
  6. package/dist/chunks/{index-CYd_Pe2U.js → index-CnSEOZse.js} +81 -121
  7. package/dist/chunks/{template-D1uGvdWZ.js → template-DWcsZW22.js} +1 -1
  8. package/dist/chunks/{website-api-FLejlWxJ.js → website-api-BEYGOsT3.js} +90 -131
  9. package/dist/index.js +3 -3
  10. package/dist/shared.js +1 -1
  11. package/dist/ui/admin/index.d.ts +8 -0
  12. package/dist/ui/admin/index.d.ts.map +1 -1
  13. package/dist/ui.js +1 -1
  14. package/package.json +4 -4
  15. package/src/api/__tests__/info.test.ts +0 -44
  16. package/src/api/__tests__/utils.test.ts +0 -78
  17. package/src/api/handlers/about-me.ts +0 -109
  18. package/src/api/handlers/auth-handler.ts +0 -204
  19. package/src/api/handlers/auth.ts +0 -157
  20. package/src/api/handlers/content-api.ts +0 -268
  21. package/src/api/handlers/content.ts +0 -139
  22. package/src/api/handlers/home.ts +0 -79
  23. package/src/api/handlers/info.ts +0 -12
  24. package/src/api/handlers/logo.ts +0 -55
  25. package/src/api/handlers/static-details.ts +0 -48
  26. package/src/api/index.ts +0 -9
  27. package/src/api/utils.ts +0 -16
  28. package/src/api/website-api.ts +0 -142
  29. package/src/index.ts +0 -4
  30. package/src/prerender/__tests__/page-content.test.ts +0 -44
  31. package/src/prerender/__tests__/template.test.ts +0 -54
  32. package/src/prerender/data-fetcher.ts +0 -93
  33. package/src/prerender/index.ts +0 -7
  34. package/src/prerender/page-content.ts +0 -266
  35. package/src/prerender/page-generators/about.ts +0 -38
  36. package/src/prerender/page-generators/base.ts +0 -77
  37. package/src/prerender/page-generators/blog-detail.ts +0 -35
  38. package/src/prerender/page-generators/blogs-list.ts +0 -43
  39. package/src/prerender/page-generators/home.ts +0 -54
  40. package/src/prerender/page-generators/index.ts +0 -8
  41. package/src/prerender/page-generators/not-found.ts +0 -36
  42. package/src/prerender/page-generators/stories-list.ts +0 -43
  43. package/src/prerender/page-generators/story-detail.ts +0 -35
  44. package/src/prerender/prerender.ts +0 -25
  45. package/src/prerender/template.ts +0 -65
  46. package/src/prerender/website-prerender.ts +0 -152
  47. package/src/shared/config/api.ts +0 -16
  48. package/src/shared/config/index.ts +0 -43
  49. package/src/shared/config/types.ts +0 -16
  50. package/src/shared/core/__tests__/theme-toggle.test.ts +0 -204
  51. package/src/shared/core/site-store.ts +0 -38
  52. package/src/shared/core/theme-toggle.ts +0 -118
  53. package/src/shared/index.ts +0 -17
  54. package/src/shared/interfaces/ifooter-link.ts +0 -4
  55. package/src/shared/interfaces/iroute.ts +0 -4
  56. package/src/shared/models/theme-variables.css +0 -25
  57. package/src/shared/page-content.ts +0 -210
  58. package/src/shared/router.ts +0 -250
  59. package/src/shared/runtime.ts +0 -11
  60. package/src/shared/template.ts +0 -35
  61. package/src/shared/website-ui.ts +0 -92
  62. package/src/styles/markdown.css +0 -129
  63. package/src/ui/about-me/api.ts +0 -12
  64. package/src/ui/about-me/index.ts +0 -121
  65. package/src/ui/about-me/styles.ts +0 -85
  66. package/src/ui/admin/api.ts +0 -93
  67. package/src/ui/admin/components/AboutMeSection.ts +0 -47
  68. package/src/ui/admin/components/AdminSection.ts +0 -134
  69. package/src/ui/admin/components/BlogsSection.ts +0 -62
  70. package/src/ui/admin/components/HomeSection.ts +0 -47
  71. package/src/ui/admin/components/ImagesSection.ts +0 -54
  72. package/src/ui/admin/components/LoginForm.ts +0 -116
  73. package/src/ui/admin/components/LogoSection.ts +0 -51
  74. package/src/ui/admin/components/ProfileSection.ts +0 -47
  75. package/src/ui/admin/components/StaticSection.ts +0 -67
  76. package/src/ui/admin/components/StoriesSection.ts +0 -62
  77. package/src/ui/admin/components/index.ts +0 -10
  78. package/src/ui/admin/index.ts +0 -413
  79. package/src/ui/admin/styles.ts +0 -270
  80. package/src/ui/admin/types.ts +0 -26
  81. package/src/ui/banner/index.ts +0 -38
  82. package/src/ui/banner/styles.ts +0 -95
  83. package/src/ui/blog-viewer/__tests__/blogviewer.test.ts +0 -7
  84. package/src/ui/blog-viewer/index.ts +0 -127
  85. package/src/ui/blog-viewer/styles.ts +0 -23
  86. package/src/ui/footer/index.ts +0 -37
  87. package/src/ui/footer/styles.ts +0 -50
  88. package/src/ui/index.ts +0 -13
  89. package/src/ui/story-viewer/__tests__/storyviewer.test.ts +0 -7
  90. package/src/ui/story-viewer/index.ts +0 -123
  91. package/src/ui/story-viewer/styles.ts +0 -54
  92. /package/{src/shared → dist}/styles/markdown.css +0 -0
  93. /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,26 +0,0 @@
1
- export interface ContentItem {
2
- key: string;
3
- size: number;
4
- uploaded?: string;
5
- }
6
-
7
- export interface StaticDetails {
8
- siteTitle?: string;
9
- copyright?: string;
10
- linkedin?: string;
11
- github?: string;
12
- email?: string;
13
- }
14
-
15
- export interface AuthStatus {
16
- configured: boolean;
17
- username: string | null;
18
- }
19
-
20
- export interface AdminSectionProps {
21
- contentList: ContentItem[];
22
- staticDetails: StaticDetails;
23
- onUpload: (key: string, file: File) => Promise<void>;
24
- onDelete: (key: string) => Promise<void>;
25
- onStatusMessage: (message: string) => void;
26
- }
@@ -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,127 +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 this.getAttribute('api-url') ||
44
- (window as any).__VITE_API_URL__ ||
45
- import.meta.env.VITE_API_URL ||
46
- 'https://api.exampledomain.com';
47
- }
48
-
49
- connectedCallback() {
50
- super.connectedCallback();
51
- if (this.slug) {
52
- this.loadBlog();
53
- }
54
- }
55
-
56
- updated(changedProperties: Map<string, unknown>) {
57
- if (changedProperties.has('slug') && this.slug) {
58
- this.loadBlog();
59
- }
60
- }
61
-
62
- loadBlog() {
63
- this.loading = true;
64
- this.error = '';
65
- console.log('[BlogViewer] Loading blog:', this.slug);
66
-
67
- fetch(`${this.apiBaseUrl}/api/blogs/${this.slug}`)
68
- .then(res => {
69
- console.log('[BlogViewer] Response status:', res.status);
70
- if (res.ok) return res.json();
71
- throw new Error('Failed to load blog');
72
- })
73
- .then(blog => {
74
- console.log('[BlogViewer] Found blog:', blog?.title, 'slug:', blog?.slug);
75
- if (blog && blog.content) {
76
- this.blogPost = blog;
77
- } else {
78
- this.error = 'Blog content not found';
79
- }
80
- this.loading = false;
81
- })
82
- .catch(e => {
83
- console.error('[BlogViewer] Failed to load blog:', e);
84
- this.error = 'Failed to load blog';
85
- this.loading = false;
86
- });
87
- }
88
-
89
- render() {
90
- if (this.loading) {
91
- return html`<div class="blog-viewer"><div class="loading">Loading...</div></div>`;
92
- }
93
-
94
- if (this.error) {
95
- return html`<div class="blog-viewer"><div class="error">${this.error}</div></div>`;
96
- }
97
-
98
- if (!this.blogPost) {
99
- return html`<div class="blog-viewer"><div class="error">Blog not found</div></div>`;
100
- }
101
-
102
- const { title, date, tags, content } = this.blogPost;
103
-
104
- return html`
105
- <article class="blog-viewer">
106
- <h1>${title}</h1>
107
- <div class="meta">
108
- <span>${date}</span>
109
- </div>
110
- ${tags?.length ? html`
111
- <div class="tags">
112
- ${tags.map(tag => html`<span class="tag">${tag}</span>`)}
113
- </div>
114
- ` : ''}
115
- <div class="content">
116
- ${unsafeHTML(this.renderMarkdown(content))}
117
- </div>
118
- </article>
119
- `;
120
- }
121
-
122
- renderMarkdown(content: string): string {
123
- if (!content) return '';
124
- const nodes = pipeline.parse(content);
125
- return pipeline.render(nodes);
126
- }
127
- }
@@ -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,13 +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';
7
-
8
- import './about-me';
9
- import './admin';
10
- import './banner';
11
- import './footer';
12
- import './blog-viewer';
13
- import './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
- });