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

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 (42) hide show
  1. package/dist/assets/logo-placeholder.svg +21 -0
  2. package/dist/chunks/index-VimKeB5W.js +1927 -0
  3. package/dist/chunks/{template-gGTkeOcA.js → template-MawmknFQ.js} +13 -4
  4. package/dist/index.js +5 -3
  5. package/dist/shared/router.d.ts.map +1 -1
  6. package/dist/shared.js +1 -1
  7. package/dist/ui/about-me/styles.d.ts.map +1 -1
  8. package/dist/ui/admin/styles.d.ts.map +1 -1
  9. package/dist/ui/banner/styles.d.ts.map +1 -1
  10. package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts +2 -0
  11. package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts.map +1 -0
  12. package/dist/ui/blog-viewer/index.d.ts +25 -0
  13. package/dist/ui/blog-viewer/index.d.ts.map +1 -0
  14. package/dist/ui/blog-viewer/styles.d.ts +2 -0
  15. package/dist/ui/blog-viewer/styles.d.ts.map +1 -0
  16. package/dist/ui/footer/styles.d.ts.map +1 -1
  17. package/dist/ui/index.d.ts +2 -0
  18. package/dist/ui/index.d.ts.map +1 -1
  19. package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts +2 -0
  20. package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts.map +1 -0
  21. package/dist/ui/story-viewer/index.d.ts +25 -0
  22. package/dist/ui/story-viewer/index.d.ts.map +1 -0
  23. package/dist/ui/story-viewer/styles.d.ts +2 -0
  24. package/dist/ui/story-viewer/styles.d.ts.map +1 -0
  25. package/dist/ui.js +4 -2
  26. package/package.json +23 -7
  27. package/public/assets/logo-placeholder.svg +21 -0
  28. package/src/shared/config/index.ts +1 -1
  29. package/src/shared/router.ts +12 -3
  30. package/src/ui/about-me/styles.ts +81 -6
  31. package/src/ui/admin/styles.ts +0 -47
  32. package/src/ui/banner/styles.ts +89 -4
  33. package/src/ui/blog-viewer/__tests__/blogviewer.test.ts +7 -0
  34. package/src/ui/blog-viewer/index.ts +124 -0
  35. package/src/ui/blog-viewer/styles.ts +23 -0
  36. package/src/ui/footer/index.ts +1 -1
  37. package/src/ui/footer/styles.ts +43 -2
  38. package/src/ui/index.ts +2 -0
  39. package/src/ui/story-viewer/__tests__/storyviewer.test.ts +7 -0
  40. package/src/ui/story-viewer/index.ts +120 -0
  41. package/src/ui/story-viewer/styles.ts +54 -0
  42. package/dist/chunks/index-BqixlS-2.js +0 -1157
@@ -19,7 +19,7 @@ async function initializeConfig(infra) {
19
19
  try {
20
20
  const res = await fetch(`${activeConfig.apiUrl}/api/static`);
21
21
  if (res.ok) {
22
- const remoteStatic = await res.json();
22
+ const remoteStatic = await res.json().catch(() => ({}));
23
23
  activeConfig = { ...activeConfig, ...remoteStatic };
24
24
  }
25
25
  } catch (e) {
@@ -338,9 +338,18 @@ class Router {
338
338
  fetch(`${this.apiUrl}/api/stories`),
339
339
  fetch(`${this.apiUrl}/api/home`)
340
340
  ]);
341
- if (blogsRes.ok) blogs = (await blogsRes.json()).slice(0, 3);
342
- if (storiesRes.ok) stories = (await storiesRes.json()).slice(0, 3);
343
- if (homeRes.ok) homeContent = (await homeRes.json()).content;
341
+ if (blogsRes.ok) {
342
+ const data = await blogsRes.json().catch(() => []);
343
+ blogs = Array.isArray(data) ? data.slice(0, 3) : [];
344
+ }
345
+ if (storiesRes.ok) {
346
+ const data = await storiesRes.json().catch(() => []);
347
+ stories = Array.isArray(data) ? data.slice(0, 3) : [];
348
+ }
349
+ if (homeRes.ok) {
350
+ const data = await homeRes.json().catch(() => ({}));
351
+ homeContent = data.content || "";
352
+ }
344
353
  } catch (e) {
345
354
  console.error("Failed to fetch home content", e);
346
355
  }
package/dist/index.js CHANGED
@@ -1,14 +1,16 @@
1
1
  import { W } from "./chunks/website-api-CVsi-OLc.js";
2
2
  import { WebsitePrerender } from "./prerender.js";
3
- import { A, F, M, a } from "./chunks/index-BqixlS-2.js";
4
- import { R, S, T, W as W2, b, c, g, a as a2, i, r } from "./chunks/template-gGTkeOcA.js";
3
+ import { A, B, F, M, a, S } from "./chunks/index-VimKeB5W.js";
4
+ import { R, S as S2, T, W as W2, b, c, g, a as a2, i, r } from "./chunks/template-MawmknFQ.js";
5
5
  export {
6
6
  A as AdminPortal,
7
+ B as BlogViewer,
7
8
  F as FooterComponent,
8
9
  M as MyAboutme,
9
10
  a as MyBanner,
10
11
  R as Router,
11
- S as SiteStore,
12
+ S2 as SiteStore,
13
+ S as StoryViewer,
12
14
  T as ThemeToggle,
13
15
  W as WebsiteAPI,
14
16
  WebsitePrerender,
@@ -1 +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;IASL,OAAO,CAAC,EAAE;IARtB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,UAAU,CAA4B;gBAE1B,EAAE,EAAE,SAAS;IA8B1B,IAAI,CAAC,YAAY,GAAE,MAAc;IAWxC,OAAO,CAAC,mBAAmB;IAmCd,QAAQ,CAAC,IAAI,EAAE,MAAM;IA6BlC,OAAO,CAAC,WAAW;YAgCL,cAAc;IAyB5B,OAAO,CAAC,iBAAiB;YAQX,qBAAqB;YAiBrB,uBAAuB;YAmBvB,eAAe;CAqB9B"}
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;IASL,OAAO,CAAC,EAAE;IARtB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,UAAU,CAA4B;gBAE1B,EAAE,EAAE,SAAS;IA8B1B,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"}
package/dist/shared.js CHANGED
@@ -1,4 +1,4 @@
1
- import { R, S, T, W, b, c, g, a, i, r } from "./chunks/template-gGTkeOcA.js";
1
+ import { R, S, T, W, b, c, g, a, i, r } from "./chunks/template-MawmknFQ.js";
2
2
  export {
3
3
  R as Router,
4
4
  S as SiteStore,
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/about-me/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,yBAOzB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/about-me/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,yBAkFzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/admin/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,yBA0TvB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/admin/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,yBA2QvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/banner/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,yBAOxB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/banner/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,yBA4FxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=blogviewer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blogviewer.test.d.ts","sourceRoot":"","sources":["../../../../src/ui/blog-viewer/__tests__/blogviewer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { LitElement } from 'lit';
2
+ interface BlogPost {
3
+ title: string;
4
+ description: string;
5
+ date: string;
6
+ tags: string[];
7
+ author: string;
8
+ imageUrl: string;
9
+ content: string;
10
+ }
11
+ export declare class BlogViewer extends LitElement {
12
+ static styles: import('lit').CSSResult;
13
+ accessor slug: string;
14
+ accessor blogPost: BlogPost | null;
15
+ accessor loading: boolean;
16
+ accessor error: string;
17
+ private get apiBaseUrl();
18
+ connectedCallback(): void;
19
+ updated(changedProperties: Map<string, unknown>): void;
20
+ loadBlog(): void;
21
+ render(): import('lit-html').TemplateResult<1>;
22
+ renderMarkdown(content: string): string;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/blog-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAe5C,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBACa,UAAW,SAAQ,UAAU;IACxC,MAAM,CAAC,MAAM,0BAAoB;IAGjC,QAAQ,CAAC,IAAI,SAAM;IAGnB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAQ;IAG1C,QAAQ,CAAC,OAAO,UAAQ;IAGxB,QAAQ,CAAC,KAAK,SAAM;IAEpB,OAAO,KAAK,UAAU,GAErB;IAED,iBAAiB;IAOjB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAM/C,QAAQ;IA2BR,MAAM;IAiCN,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAKxC"}
@@ -0,0 +1,2 @@
1
+ export declare const blogviewerStyles: import('lit').CSSResult;
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/blog-viewer/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,yBAoB5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/footer/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,yBAMxB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/footer/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,yBA+CxB,CAAC"}
@@ -2,4 +2,6 @@ export * from './about-me';
2
2
  export * from './admin';
3
3
  export * from './banner';
4
4
  export * from './footer';
5
+ export * from './blog-viewer';
6
+ export * from './story-viewer';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storyviewer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyviewer.test.d.ts","sourceRoot":"","sources":["../../../../src/ui/story-viewer/__tests__/storyviewer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { LitElement } from 'lit';
2
+ interface StoryPost {
3
+ title: string;
4
+ description: string;
5
+ date: string;
6
+ tags: string[];
7
+ author: string;
8
+ imageUrl: string;
9
+ content: string;
10
+ }
11
+ export declare class StoryViewer extends LitElement {
12
+ static styles: import('lit').CSSResult;
13
+ accessor slug: string;
14
+ accessor storyPost: StoryPost | null;
15
+ accessor loading: boolean;
16
+ accessor error: string;
17
+ private get apiBaseUrl();
18
+ connectedCallback(): Promise<void>;
19
+ updated(changedProperties: Map<string, any>): void;
20
+ loadStory(): Promise<void>;
21
+ render(): import('lit-html').TemplateResult<1>;
22
+ private renderMarkdown;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/story-viewer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAe5C,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAAqB;IAGlC,QAAQ,CAAC,IAAI,SAAM;IAGnB,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IAG5C,QAAQ,CAAC,OAAO,UAAQ;IAGxB,QAAQ,CAAC,KAAK,SAAM;IAEpB,OAAO,KAAK,UAAU,GAErB;IAEK,iBAAiB;IAOvB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;IAMrC,SAAS;IAuBf,MAAM;IAiCN,OAAO,CAAC,cAAc;CAKvB"}
@@ -0,0 +1,2 @@
1
+ export declare const storyviewerStyles: import('lit').CSSResult;
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/ui/story-viewer/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,yBAmD7B,CAAC"}
package/dist/ui.js CHANGED
@@ -1,7 +1,9 @@
1
- import { A, F, M, a } from "./chunks/index-BqixlS-2.js";
1
+ import { A, B, F, M, a, S } from "./chunks/index-VimKeB5W.js";
2
2
  export {
3
3
  A as AdminPortal,
4
+ B as BlogViewer,
4
5
  F as FooterComponent,
5
6
  M as MyAboutme,
6
- a as MyBanner
7
+ a as MyBanner,
8
+ S as StoryViewer
7
9
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leadertechie/personal-site-kit",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.4",
4
4
  "type": "module",
5
5
  "description": "A high-performance personal website engine for Cloudflare Workers and R2",
6
6
  "repository": {
@@ -12,14 +12,30 @@
12
12
  "files": [
13
13
  "dist",
14
14
  "src",
15
- "README.md"
15
+ "README.md",
16
+ "public"
16
17
  ],
17
18
  "exports": {
18
- ".": "./dist/index.js",
19
- "./shared": "./dist/shared/index.js",
20
- "./ui": "./dist/ui/index.js",
21
- "./api": "./dist/api/index.js",
22
- "./prerender": "./dist/prerender/index.js",
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ },
23
+ "./shared": {
24
+ "types": "./dist/shared.d.ts",
25
+ "import": "./dist/shared.js"
26
+ },
27
+ "./ui": {
28
+ "types": "./dist/ui.d.ts",
29
+ "import": "./dist/ui.js"
30
+ },
31
+ "./api": {
32
+ "types": "./dist/api.d.ts",
33
+ "import": "./dist/api.js"
34
+ },
35
+ "./prerender": {
36
+ "types": "./dist/prerender.d.ts",
37
+ "import": "./dist/prerender.js"
38
+ },
23
39
  "./styles/*": "./src/styles/*"
24
40
  },
25
41
  "scripts": {
@@ -0,0 +1,21 @@
1
+ <svg width="600" height="320" viewBox="0 0 600 320" xmlns="http://www.w3.org/2000/svg">
2
+ <style>
3
+ .text-main {
4
+ fill: light-dark(#4A5568, #E2E8F0);
5
+ font-family: 'Segoe UI', 'Arial Black', sans-serif;
6
+ font-weight: 900;
7
+ font-size: 46px;
8
+ letter-spacing: -0.01em;
9
+ text-anchor: middle;
10
+ }
11
+ </style>
12
+
13
+ <!-- Big circle placeholder -->
14
+ <circle cx="300" cy="160" r="100" fill="none" stroke="light-dark(#A0AEC0, #718096)" stroke-width="2" stroke-dasharray="8 4" opacity="0.5" />
15
+
16
+ <!-- Plus sign in circle -->
17
+ <line x1="300" y1="100" x2="300" y2="220" stroke="light-dark(#A0AEC0, #718096)" stroke-width="2" opacity="0.3" />
18
+ <line x1="240" y1="160" x2="360" y2="160" stroke="light-dark(#A0AEC0, #718096)" stroke-width="2" opacity="0.3" />
19
+
20
+ <text x="300" y="290" class="text-main">YOUR LOGO</text>
21
+ </svg>
@@ -26,7 +26,7 @@ export async function initializeConfig(infra?: Partial<InfrastructureConfig>): P
26
26
  try {
27
27
  const res = await fetch(`${activeConfig.apiUrl}/api/static`);
28
28
  if (res.ok) {
29
- const remoteStatic = await res.json();
29
+ const remoteStatic = await res.json().catch(() => ({}));
30
30
  activeConfig = { ...activeConfig, ...remoteStatic };
31
31
  }
32
32
  } catch (e) {
@@ -159,9 +159,18 @@ export class Router {
159
159
  fetch(`${this.apiUrl}/api/stories`),
160
160
  fetch(`${this.apiUrl}/api/home`)
161
161
  ]);
162
- if (blogsRes.ok) blogs = (await blogsRes.json()).slice(0, 3);
163
- if (storiesRes.ok) stories = (await storiesRes.json()).slice(0, 3);
164
- if (homeRes.ok) homeContent = (await homeRes.json()).content;
162
+ if (blogsRes.ok) {
163
+ const data = await blogsRes.json().catch(() => []);
164
+ blogs = Array.isArray(data) ? data.slice(0, 3) : [];
165
+ }
166
+ if (storiesRes.ok) {
167
+ const data = await storiesRes.json().catch(() => []);
168
+ stories = Array.isArray(data) ? data.slice(0, 3) : [];
169
+ }
170
+ if (homeRes.ok) {
171
+ const data = await homeRes.json().catch(() => ({}));
172
+ homeContent = data.content || '';
173
+ }
165
174
  } catch (e) {
166
175
  console.error('Failed to fetch home content', e);
167
176
  }
@@ -1,10 +1,85 @@
1
1
  import { css } from 'lit';
2
2
 
3
3
  export const aboutmeStyles = css`
4
- .aboutme {
5
- padding: 2rem;
6
- }
7
- .loading {
8
- opacity: 0.7;
9
- }
4
+ :host {
5
+ display: block;
6
+ }
7
+
8
+ .aboutme {
9
+ display: block;
10
+ padding: 20px;
11
+ max-width: 800px;
12
+ margin: 0 auto;
13
+ line-height: 1.6;
14
+ }
15
+
16
+ .aboutme h2 {
17
+ color: var(--link-color);
18
+ margin-bottom: 15px;
19
+ font-size: 2em;
20
+ }
21
+
22
+ .aboutme h3 {
23
+ color: var(--link-color);
24
+ margin-bottom: 10px;
25
+ }
26
+
27
+ .aboutme p {
28
+ margin-bottom: 10px;
29
+ text-align: left;
30
+ }
31
+
32
+ .aboutme ul {
33
+ list-style-type: disc;
34
+ margin-left: 20px;
35
+ text-align: left;
36
+ }
37
+
38
+ .aboutme li {
39
+ margin-bottom: 5px;
40
+ }
41
+
42
+ .aboutme .profile-picture {
43
+ width: 150px;
44
+ height: 150px;
45
+ border-radius: 50%;
46
+ object-fit: cover;
47
+ margin-bottom: 20px;
48
+ border: 3px solid var(--link-color);
49
+ box-shadow:
50
+ 0 0 0 4px var(--link-color),
51
+ 0 8px 16px rgba(0, 0, 0, 0.2),
52
+ 0 12px 24px rgba(0, 0, 0, 0.15);
53
+ }
54
+
55
+ .aboutme .profile-section {
56
+ text-align: center;
57
+ background: var(--card-bg, var(--background-color, #fff));
58
+ border-radius: 16px;
59
+ padding: 2rem;
60
+ box-shadow:
61
+ 0 4px 6px rgba(0, 0, 0, 0.07),
62
+ 0 10px 20px rgba(0, 0, 0, 0.05);
63
+ margin-bottom: 2rem;
64
+ }
65
+
66
+ .aboutme .profile-title {
67
+ color: var(--secondary-text, #666);
68
+ margin-bottom: 0;
69
+ text-align: center;
70
+ }
71
+
72
+ .aboutme h1 {
73
+ margin-bottom: 0.5rem;
74
+ }
75
+
76
+ .aboutme .loading {
77
+ text-align: center;
78
+ padding: 20px;
79
+ color: var(--text-color);
80
+ }
81
+
82
+ .aboutme .content-section {
83
+ font-family: Arial, sans-serif;
84
+ }
10
85
  `;
@@ -105,13 +105,6 @@ export const adminStyles = css`
105
105
  gap: 0.5rem;
106
106
  }
107
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
108
  .file-list {
116
109
  margin-top: 20px;
117
110
  }
@@ -218,46 +211,6 @@ input[type="file"]:hover {
218
211
  line-height: 1.5;
219
212
  }
220
213
 
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
214
  .status-message {
262
215
  padding: 12px 16px;
263
216
  border-radius: 8px;
@@ -1,10 +1,95 @@
1
1
  import { css } from 'lit';
2
2
 
3
3
  export const bannerStyles = css`
4
- .banner {
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;
5
82
  padding: 1rem;
6
- display: flex;
7
- justify-content: space-between;
8
- align-items: center;
9
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
+ }
10
95
  `;
@@ -0,0 +1,7 @@
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
+ });