@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.
- package/README.md +94 -17
- package/dist/api/content-utils.d.ts +27 -0
- package/dist/api/content-utils.d.ts.map +1 -0
- package/dist/api/handlers/about-me.d.ts.map +1 -1
- package/dist/api/handlers/auth-handler.d.ts +2 -0
- package/dist/api/handlers/auth-handler.d.ts.map +1 -0
- package/dist/api/handlers/auth.d.ts +23 -0
- package/dist/api/handlers/auth.d.ts.map +1 -0
- package/dist/api/handlers/content-api.d.ts +0 -1
- package/dist/api/handlers/content-api.d.ts.map +1 -1
- package/dist/api/handlers/content.d.ts.map +1 -1
- package/dist/api/handlers/home.d.ts.map +1 -1
- package/dist/api/handlers/static-details.d.ts +1 -1
- package/dist/api/handlers/static-details.d.ts.map +1 -1
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/website-api.d.ts +1 -1
- package/dist/api/website-api.d.ts.map +1 -1
- package/dist/api.js +17 -2
- package/dist/assets/logo-placeholder.svg +21 -0
- package/dist/chunks/index-C1krnvU3.js +211 -0
- package/dist/chunks/index-DsRjL9Uy.js +2727 -0
- package/dist/chunks/site-store-CGV9c2DI.js +89 -0
- package/dist/chunks/{template-gGTkeOcA.js → template-Lmx7Dxoc.js} +132 -91
- package/dist/chunks/website-api-CFRUPu0X.js +958 -0
- package/dist/index.js +42 -14
- package/dist/prerender/data-fetcher.d.ts +19 -0
- package/dist/prerender/data-fetcher.d.ts.map +1 -0
- package/dist/prerender/page-content.d.ts.map +1 -1
- package/dist/prerender/page-generators/about.d.ts +16 -0
- package/dist/prerender/page-generators/about.d.ts.map +1 -0
- package/dist/prerender/page-generators/base.d.ts +25 -0
- package/dist/prerender/page-generators/base.d.ts.map +1 -0
- package/dist/prerender/page-generators/blog-detail.d.ts +15 -0
- package/dist/prerender/page-generators/blog-detail.d.ts.map +1 -0
- package/dist/prerender/page-generators/blogs-list.d.ts +17 -0
- package/dist/prerender/page-generators/blogs-list.d.ts.map +1 -0
- package/dist/prerender/page-generators/home.d.ts +19 -0
- package/dist/prerender/page-generators/home.d.ts.map +1 -0
- package/dist/prerender/page-generators/index.d.ts +9 -0
- package/dist/prerender/page-generators/index.d.ts.map +1 -0
- package/dist/prerender/page-generators/not-found.d.ts +14 -0
- package/dist/prerender/page-generators/not-found.d.ts.map +1 -0
- package/dist/prerender/page-generators/stories-list.d.ts +17 -0
- package/dist/prerender/page-generators/stories-list.d.ts.map +1 -0
- package/dist/prerender/page-generators/story-detail.d.ts +15 -0
- package/dist/prerender/page-generators/story-detail.d.ts.map +1 -0
- package/dist/prerender/template.d.ts +3 -1
- package/dist/prerender/template.d.ts.map +1 -1
- package/dist/prerender/website-prerender.d.ts +6 -0
- package/dist/prerender/website-prerender.d.ts.map +1 -1
- package/dist/prerender.js +291 -145
- package/dist/shared/config/index.d.ts +1 -0
- package/dist/shared/config/index.d.ts.map +1 -1
- package/dist/shared/core/site-store.d.ts +1 -0
- package/dist/shared/core/site-store.d.ts.map +1 -1
- package/dist/shared/core/theme-toggle.d.ts.map +1 -1
- package/dist/shared/page-content.d.ts.map +1 -1
- package/dist/shared/router.d.ts +9 -3
- package/dist/shared/router.d.ts.map +1 -1
- package/dist/shared/website-ui.d.ts +23 -0
- package/dist/shared/website-ui.d.ts.map +1 -1
- package/dist/shared.js +6 -4
- package/dist/ui/about-me/index.d.ts +2 -10
- package/dist/ui/about-me/index.d.ts.map +1 -1
- package/dist/ui/about-me/styles.d.ts.map +1 -1
- package/dist/ui/admin/api.d.ts +16 -0
- package/dist/ui/admin/api.d.ts.map +1 -0
- package/dist/ui/admin/components/AboutMeSection.d.ts +7 -0
- package/dist/ui/admin/components/AboutMeSection.d.ts.map +1 -0
- package/dist/ui/admin/components/AdminSection.d.ts +13 -0
- package/dist/ui/admin/components/AdminSection.d.ts.map +1 -0
- package/dist/ui/admin/components/BlogsSection.d.ts +7 -0
- package/dist/ui/admin/components/BlogsSection.d.ts.map +1 -0
- package/dist/ui/admin/components/HomeSection.d.ts +7 -0
- package/dist/ui/admin/components/HomeSection.d.ts.map +1 -0
- package/dist/ui/admin/components/ImagesSection.d.ts +7 -0
- package/dist/ui/admin/components/ImagesSection.d.ts.map +1 -0
- package/dist/ui/admin/components/LoginForm.d.ts +9 -0
- package/dist/ui/admin/components/LoginForm.d.ts.map +1 -0
- package/dist/ui/admin/components/LogoSection.d.ts +7 -0
- package/dist/ui/admin/components/LogoSection.d.ts.map +1 -0
- package/dist/ui/admin/components/ProfileSection.d.ts +7 -0
- package/dist/ui/admin/components/ProfileSection.d.ts.map +1 -0
- package/dist/ui/admin/components/StaticSection.d.ts +9 -0
- package/dist/ui/admin/components/StaticSection.d.ts.map +1 -0
- package/dist/ui/admin/components/StoriesSection.d.ts +7 -0
- package/dist/ui/admin/components/StoriesSection.d.ts.map +1 -0
- package/dist/ui/admin/components/index.d.ts +11 -0
- package/dist/ui/admin/components/index.d.ts.map +1 -0
- package/dist/ui/admin/index.d.ts +27 -26
- package/dist/ui/admin/index.d.ts.map +1 -1
- package/dist/ui/admin/styles.d.ts.map +1 -1
- package/dist/ui/admin/types.d.ts +24 -0
- package/dist/ui/admin/types.d.ts.map +1 -0
- package/dist/ui/banner/index.d.ts.map +1 -1
- package/dist/ui/banner/styles.d.ts.map +1 -1
- package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts +2 -0
- package/dist/ui/blog-viewer/__tests__/blogviewer.test.d.ts.map +1 -0
- package/dist/ui/blog-viewer/index.d.ts +25 -0
- package/dist/ui/blog-viewer/index.d.ts.map +1 -0
- package/dist/ui/blog-viewer/styles.d.ts +2 -0
- package/dist/ui/blog-viewer/styles.d.ts.map +1 -0
- package/dist/ui/footer/index.d.ts.map +1 -1
- package/dist/ui/footer/styles.d.ts.map +1 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts +2 -0
- package/dist/ui/story-viewer/__tests__/storyviewer.test.d.ts.map +1 -0
- package/dist/ui/story-viewer/index.d.ts +25 -0
- package/dist/ui/story-viewer/index.d.ts.map +1 -0
- package/dist/ui/story-viewer/styles.d.ts +2 -0
- package/dist/ui/story-viewer/styles.d.ts.map +1 -0
- package/dist/ui.js +15 -3
- package/package.json +37 -13
- package/public/assets/logo-placeholder.svg +21 -0
- package/dist/chunks/index-BqixlS-2.js +0 -1157
- package/dist/chunks/website-api-CVsi-OLc.js +0 -596
- package/dist/ui/about-me/renderer.d.ts +0 -5
- package/dist/ui/about-me/renderer.d.ts.map +0 -1
- package/src/api/__tests__/info.test.ts +0 -44
- package/src/api/__tests__/utils.test.ts +0 -78
- package/src/api/handlers/about-me.ts +0 -99
- package/src/api/handlers/content-api.ts +0 -268
- package/src/api/handlers/content.ts +0 -72
- package/src/api/handlers/home.ts +0 -79
- package/src/api/handlers/info.ts +0 -12
- package/src/api/handlers/logo.ts +0 -55
- package/src/api/handlers/static-details.ts +0 -48
- package/src/api/index.ts +0 -7
- package/src/api/utils.ts +0 -16
- package/src/api/website-api.ts +0 -124
- package/src/index.ts +0 -4
- package/src/prerender/__tests__/page-content.test.ts +0 -54
- package/src/prerender/__tests__/template.test.ts +0 -54
- package/src/prerender/index.ts +0 -7
- package/src/prerender/page-content.ts +0 -263
- package/src/prerender/prerender.ts +0 -25
- package/src/prerender/template.ts +0 -65
- package/src/prerender/website-prerender.ts +0 -152
- package/src/shared/config/api.ts +0 -16
- package/src/shared/config/index.ts +0 -41
- package/src/shared/config/types.ts +0 -16
- package/src/shared/core/__tests__/theme-toggle.test.ts +0 -204
- package/src/shared/core/site-store.ts +0 -38
- package/src/shared/core/theme-toggle.ts +0 -118
- package/src/shared/index.ts +0 -17
- package/src/shared/interfaces/ifooter-link.ts +0 -4
- package/src/shared/interfaces/iroute.ts +0 -4
- package/src/shared/models/theme-variables.css +0 -25
- package/src/shared/page-content.ts +0 -210
- package/src/shared/router.ts +0 -241
- package/src/shared/runtime.ts +0 -11
- package/src/shared/template.ts +0 -35
- package/src/shared/website-ui.ts +0 -92
- package/src/styles/markdown.css +0 -129
- package/src/ui/about-me/api.ts +0 -12
- package/src/ui/about-me/index.ts +0 -155
- package/src/ui/about-me/renderer.ts +0 -7
- package/src/ui/about-me/styles.ts +0 -10
- package/src/ui/admin/index.ts +0 -492
- package/src/ui/admin/styles.ts +0 -317
- package/src/ui/banner/index.ts +0 -38
- package/src/ui/banner/styles.ts +0 -10
- package/src/ui/footer/index.ts +0 -37
- package/src/ui/footer/styles.ts +0 -9
- package/src/ui/index.ts +0 -4
- /package/{src/shared → dist}/styles/markdown.css +0 -0
- /package/{src → dist}/styles/theme.css +0 -0
package/src/styles/markdown.css
DELETED
|
@@ -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
|
-
}
|
package/src/ui/about-me/api.ts
DELETED
|
@@ -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
|
-
}
|
package/src/ui/about-me/index.ts
DELETED
|
@@ -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
|
-
}
|